@taggr/cli 1.0.3 → 1.0.5

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/README.md +100 -2
  2. package/dist/commands/check.d.ts +7 -0
  3. package/dist/commands/check.d.ts.map +1 -0
  4. package/dist/commands/check.js +162 -0
  5. package/dist/commands/check.js.map +1 -0
  6. package/dist/commands/ci.d.ts +9 -0
  7. package/dist/commands/ci.d.ts.map +1 -0
  8. package/dist/commands/ci.js +63 -0
  9. package/dist/commands/ci.js.map +1 -0
  10. package/dist/commands/list.d.ts.map +1 -1
  11. package/dist/commands/list.js +6 -3
  12. package/dist/commands/list.js.map +1 -1
  13. package/dist/commands/login.d.ts.map +1 -1
  14. package/dist/commands/login.js +17 -4
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/pull.d.ts.map +1 -1
  17. package/dist/commands/pull.js +32 -7
  18. package/dist/commands/pull.js.map +1 -1
  19. package/dist/commands/status.d.ts +2 -0
  20. package/dist/commands/status.d.ts.map +1 -0
  21. package/dist/commands/status.js +66 -0
  22. package/dist/commands/status.js.map +1 -0
  23. package/dist/commands/watch.d.ts +6 -0
  24. package/dist/commands/watch.d.ts.map +1 -0
  25. package/dist/commands/watch.js +138 -0
  26. package/dist/commands/watch.js.map +1 -0
  27. package/dist/commands/whoami.d.ts.map +1 -1
  28. package/dist/commands/whoami.js +20 -4
  29. package/dist/commands/whoami.js.map +1 -1
  30. package/dist/index.js +38 -5
  31. package/dist/index.js.map +1 -1
  32. package/dist/types.d.ts +11 -0
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/utils/api.d.ts +5 -0
  35. package/dist/utils/api.d.ts.map +1 -1
  36. package/dist/utils/api.js +82 -6
  37. package/dist/utils/api.js.map +1 -1
  38. package/dist/utils/config.d.ts.map +1 -1
  39. package/dist/utils/config.js +15 -5
  40. package/dist/utils/config.js.map +1 -1
  41. package/dist/utils/generator.d.ts +3 -3
  42. package/dist/utils/generator.d.ts.map +1 -1
  43. package/dist/utils/generator.js +103 -18
  44. package/dist/utils/generator.js.map +1 -1
  45. package/dist/utils/metadata.d.ts +25 -0
  46. package/dist/utils/metadata.d.ts.map +1 -0
  47. package/dist/utils/metadata.js +157 -0
  48. package/dist/utils/metadata.js.map +1 -0
  49. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACrD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,uEAAuE;AACvE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,kCAAkC,CAAC;AAExF;;GAEG;AACH,KAAK,UAAU,eAAe;IAC5B,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,eAAe,EAAE,CAAC;QAExB,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC9C,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;gBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,eAAe;aACzC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAA4B;IAC3D,MAAM,eAAe,EAAE,CAAC;IAExB,MAAM,cAAc,GAAG,MAAM,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACpF,MAAM,SAAS,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAEnD,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,OAAO,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACrD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,uEAAuE;AACvE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,gCAAgC,CAAC;AAEtF;;GAEG;AACH,KAAK,UAAU,eAAe;IAC5B,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,eAAe,EAAE,CAAC;QAExB,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAE9C,4BAA4B;YAC5B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,OAAO;oBACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;oBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,eAAe;iBACzC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,2CAA2C;gBAC3C,OAAO,CAAC,IAAI,CAAC,2BAA2B,WAAW,oCAAoC,CAAC,CAAC;gBACzF,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6CAA6C;QAC7C,OAAO,CAAC,IAAI,CAAC,0CAA0C,WAAW,uBAAuB,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAA4B;IAC3D,MAAM,eAAe,EAAE,CAAC;IAExB,MAAM,cAAc,GAAG,MAAM,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACpF,MAAM,SAAS,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAEnD,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,OAAO,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -2,15 +2,15 @@ import type { Label } from '../types.js';
2
2
  /**
3
3
  * Write a single label to labels.json (fetches all and rewrites)
4
4
  */
5
- export declare function writeLabelFile(label: Label): Promise<string>;
5
+ export declare function writeLabelFile(label: Label, apiUrl?: string): Promise<string>;
6
6
  /**
7
7
  * Write all labels to labels.json and labels.d.ts
8
8
  */
9
- export declare function writeAllLabels(labels: Label[]): Promise<string[]>;
9
+ export declare function writeAllLabels(labels: Label[], apiUrl?: string): Promise<string[]>;
10
10
  /**
11
11
  * Update labels files (alias for writeAllLabels)
12
12
  */
13
- export declare function updateIndexFile(labels: Label[]): Promise<void>;
13
+ export declare function updateIndexFile(labels: Label[], apiUrl?: string): Promise<void>;
14
14
  /**
15
15
  * Get the output directory path
16
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/utils/generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAiDzC;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAiClE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAevE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/utils/generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AA0FzC;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DnF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BxF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErF;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
@@ -1,11 +1,19 @@
1
1
  import fs from 'fs-extra';
2
2
  import path from 'path';
3
+ import { saveMetadata, updateLabelMetadata } from './metadata.js';
3
4
  const OUTPUT_DIR = './taggr';
4
5
  /**
5
6
  * Convert kebab-case to camelCase
6
7
  */
7
8
  function toCamelCase(str) {
8
- return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
9
+ if (!str || typeof str !== 'string') {
10
+ return 'label';
11
+ }
12
+ // Remove any invalid characters and convert to camelCase
13
+ return str
14
+ .replace(/[^a-zA-Z0-9-]/g, '') // Remove invalid characters
15
+ .replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())
16
+ .replace(/^[A-Z]/, (match) => match.toLowerCase()); // Ensure first letter is lowercase
9
17
  }
10
18
  /**
11
19
  * Generate labels.json content
@@ -13,20 +21,47 @@ function toCamelCase(str) {
13
21
  function generateLabelsJson(labels) {
14
22
  const labelsObj = {};
15
23
  for (const label of labels) {
24
+ // Validate label has required properties
25
+ if (!label || !label.name || label.value === undefined) {
26
+ console.warn(`Warning: Skipping invalid label: ${JSON.stringify(label)}`);
27
+ continue;
28
+ }
16
29
  const key = toCamelCase(label.name);
17
- labelsObj[key] = label.value;
30
+ labelsObj[key] = String(label.value); // Ensure value is a string
18
31
  }
19
32
  return JSON.stringify(labelsObj, null, 2);
20
33
  }
21
34
  /**
22
- * Generate labels.d.ts for TypeScript/JS autocomplete
35
+ * Generate labels.d.ts for TypeScript/JS autocomplete with enhanced metadata
23
36
  */
24
37
  function generateLabelsDts(labels) {
25
38
  const properties = labels
26
- .map(label => ` ${toCamelCase(label.name)}: string;`)
27
- .join('\n');
39
+ .filter(label => label && label.name) // Filter out invalid labels
40
+ .map(label => {
41
+ const key = toCamelCase(label.name);
42
+ const description = label.description || '';
43
+ const category = label.category || 'general';
44
+ const tags = label.tags && label.tags.length > 0 ? label.tags.join(', ') : '';
45
+ const version = label.version || '1.0.0';
46
+ // Build JSDoc comment
47
+ let jsdoc = ` /**\n`;
48
+ if (description) {
49
+ jsdoc += ` * ${description.replace(/\n/g, '\n * ')}\n`;
50
+ }
51
+ jsdoc += ` * @version ${version}\n`;
52
+ jsdoc += ` * @category ${category}\n`;
53
+ if (tags) {
54
+ jsdoc += ` * @tags ${tags}\n`;
55
+ }
56
+ jsdoc += ` */\n`;
57
+ return `${jsdoc} ${key}: string;`;
58
+ })
59
+ .join('\n\n');
28
60
  return `// Generated by Taggr CLI - DO NOT EDIT
29
61
  // Last updated: ${new Date().toISOString()}
62
+ //
63
+ // This file provides TypeScript type definitions and autocomplete
64
+ // for your Taggr labels. Each label includes version, category, and tag information.
30
65
 
31
66
  declare const labels: {
32
67
  ${properties}
@@ -39,26 +74,53 @@ export default labels;
39
74
  * Ensure output directory exists
40
75
  */
41
76
  async function ensureOutputDir() {
42
- await fs.ensureDir(OUTPUT_DIR);
77
+ try {
78
+ await fs.ensureDir(OUTPUT_DIR);
79
+ }
80
+ catch (error) {
81
+ throw new Error(`Failed to create output directory "${OUTPUT_DIR}": ${error.message}`);
82
+ }
43
83
  }
44
84
  /**
45
85
  * Write a single label to labels.json (fetches all and rewrites)
46
86
  */
47
- export async function writeLabelFile(label) {
87
+ export async function writeLabelFile(label, apiUrl) {
48
88
  await ensureOutputDir();
49
89
  const jsonPath = path.join(OUTPUT_DIR, 'labels.json');
50
90
  const dtsPath = path.join(OUTPUT_DIR, 'labels.d.ts');
51
91
  // Read existing labels if file exists
52
92
  let existingLabels = {};
53
93
  if (await fs.pathExists(jsonPath)) {
54
- const content = await fs.readFile(jsonPath, 'utf-8');
55
- existingLabels = JSON.parse(content);
94
+ try {
95
+ const content = await fs.readFile(jsonPath, 'utf-8');
96
+ const parsed = JSON.parse(content);
97
+ // Validate that parsed content is an object
98
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
99
+ existingLabels = parsed;
100
+ }
101
+ else {
102
+ // If file is corrupted (not an object), start fresh
103
+ console.warn(`Warning: ${jsonPath} contains invalid data. Starting fresh.`);
104
+ }
105
+ }
106
+ catch (error) {
107
+ // If JSON parsing fails, start fresh
108
+ console.warn(`Warning: Could not parse ${jsonPath}. Starting fresh.`);
109
+ }
110
+ }
111
+ // Validate and add/update the label
112
+ if (!label || !label.name || label.value === undefined) {
113
+ throw new Error(`Invalid label: missing required properties (name, value)`);
56
114
  }
57
- // Add/update the label
58
115
  const key = toCamelCase(label.name);
59
- existingLabels[key] = label.value;
116
+ existingLabels[key] = String(label.value); // Ensure value is a string
60
117
  // Write JSON
61
- await fs.writeFile(jsonPath, JSON.stringify(existingLabels, null, 2), 'utf-8');
118
+ try {
119
+ await fs.writeFile(jsonPath, JSON.stringify(existingLabels, null, 2), 'utf-8');
120
+ }
121
+ catch (error) {
122
+ throw new Error(`Failed to write ${jsonPath}: ${error.message}`);
123
+ }
62
124
  // Generate d.ts from current keys
63
125
  const dtsContent = `// Generated by Taggr CLI - DO NOT EDIT
64
126
  // Last updated: ${new Date().toISOString()}
@@ -69,29 +131,52 @@ ${Object.keys(existingLabels).map(k => ` ${k}: string;`).join('\n')}
69
131
 
70
132
  export default labels;
71
133
  `;
72
- await fs.writeFile(dtsPath, dtsContent, 'utf-8');
134
+ try {
135
+ await fs.writeFile(dtsPath, dtsContent, 'utf-8');
136
+ }
137
+ catch (error) {
138
+ throw new Error(`Failed to write ${dtsPath}: ${error.message}`);
139
+ }
140
+ // Update metadata for this label if apiUrl is provided
141
+ if (apiUrl) {
142
+ await updateLabelMetadata(label, apiUrl);
143
+ }
73
144
  return jsonPath;
74
145
  }
75
146
  /**
76
147
  * Write all labels to labels.json and labels.d.ts
77
148
  */
78
- export async function writeAllLabels(labels) {
149
+ export async function writeAllLabels(labels, apiUrl) {
79
150
  await ensureOutputDir();
80
151
  const jsonPath = path.join(OUTPUT_DIR, 'labels.json');
81
152
  const dtsPath = path.join(OUTPUT_DIR, 'labels.d.ts');
82
153
  // Write JSON
83
154
  const jsonContent = generateLabelsJson(labels);
84
- await fs.writeFile(jsonPath, jsonContent, 'utf-8');
155
+ try {
156
+ await fs.writeFile(jsonPath, jsonContent, 'utf-8');
157
+ }
158
+ catch (error) {
159
+ throw new Error(`Failed to write ${jsonPath}: ${error.message}`);
160
+ }
85
161
  // Write TypeScript declarations
86
162
  const dtsContent = generateLabelsDts(labels);
87
- await fs.writeFile(dtsPath, dtsContent, 'utf-8');
163
+ try {
164
+ await fs.writeFile(dtsPath, dtsContent, 'utf-8');
165
+ }
166
+ catch (error) {
167
+ throw new Error(`Failed to write ${dtsPath}: ${error.message}`);
168
+ }
169
+ // Save metadata if apiUrl is provided
170
+ if (apiUrl) {
171
+ await saveMetadata(labels, apiUrl);
172
+ }
88
173
  return [jsonPath, dtsPath];
89
174
  }
90
175
  /**
91
176
  * Update labels files (alias for writeAllLabels)
92
177
  */
93
- export async function updateIndexFile(labels) {
94
- await writeAllLabels(labels);
178
+ export async function updateIndexFile(labels, apiUrl) {
179
+ await writeAllLabels(labels, apiUrl);
95
180
  }
96
181
  /**
97
182
  * Get the output directory path
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/utils/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/utils/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Label, TaggrMetadata } from '../types.js';
2
+ /**
3
+ * Get existing metadata or return null
4
+ */
5
+ export declare function getMetadata(): Promise<TaggrMetadata | null>;
6
+ /**
7
+ * Save metadata for synced labels
8
+ */
9
+ export declare function saveMetadata(labels: Label[], apiUrl: string): Promise<void>;
10
+ /**
11
+ * Update metadata for a single label
12
+ */
13
+ export declare function updateLabelMetadata(label: Label, apiUrl: string): Promise<void>;
14
+ /**
15
+ * Get metadata file path
16
+ */
17
+ export declare function getMetadataPath(): string;
18
+ /**
19
+ * Check if labels.json has been manually edited
20
+ */
21
+ export declare function detectManualEdits(labels: Label[]): Promise<{
22
+ isEdited: boolean;
23
+ reason?: string;
24
+ }>;
25
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AA+BvE;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAajE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,KAAK,EAAE,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,KAAK,EAAE,GACd,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyDjD"}
@@ -0,0 +1,157 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import crypto from 'crypto';
4
+ const OUTPUT_DIR = './taggr';
5
+ const METADATA_FILE = path.join(OUTPUT_DIR, '.taggr.json');
6
+ /**
7
+ * Calculate SHA256 checksum of a string
8
+ */
9
+ function calculateChecksum(data) {
10
+ return crypto.createHash('sha256').update(data).digest('hex');
11
+ }
12
+ /**
13
+ * Calculate checksum for a label value
14
+ */
15
+ function calculateLabelChecksum(label) {
16
+ const data = `${label.name}:${label.value}:${label.version}`;
17
+ return calculateChecksum(data);
18
+ }
19
+ /**
20
+ * Calculate overall checksum for all labels
21
+ */
22
+ function calculateOverallChecksum(labels) {
23
+ const sortedLabels = [...labels].sort((a, b) => a.name.localeCompare(b.name));
24
+ const data = sortedLabels
25
+ .map(label => `${label.name}:${label.value}:${label.version}`)
26
+ .join('|');
27
+ return calculateChecksum(data);
28
+ }
29
+ /**
30
+ * Get existing metadata or return null
31
+ */
32
+ export async function getMetadata() {
33
+ try {
34
+ if (await fs.pathExists(METADATA_FILE)) {
35
+ const content = await fs.readJson(METADATA_FILE);
36
+ // Validate structure
37
+ if (content && typeof content === 'object' && !Array.isArray(content)) {
38
+ return content;
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ catch (error) {
44
+ return null;
45
+ }
46
+ }
47
+ /**
48
+ * Save metadata for synced labels
49
+ */
50
+ export async function saveMetadata(labels, apiUrl) {
51
+ const now = new Date().toISOString();
52
+ const labelMetadata = {};
53
+ // Create metadata for each label
54
+ for (const label of labels) {
55
+ const key = label.name;
56
+ labelMetadata[key] = {
57
+ version: label.version,
58
+ syncedAt: now,
59
+ checksum: calculateLabelChecksum(label),
60
+ };
61
+ }
62
+ const metadata = {
63
+ syncedAt: now,
64
+ apiUrl,
65
+ labels: labelMetadata,
66
+ overallChecksum: calculateOverallChecksum(labels),
67
+ };
68
+ // Ensure output directory exists
69
+ await fs.ensureDir(OUTPUT_DIR);
70
+ // Write metadata file
71
+ await fs.writeJson(METADATA_FILE, metadata, { spaces: 2 });
72
+ }
73
+ /**
74
+ * Update metadata for a single label
75
+ */
76
+ export async function updateLabelMetadata(label, apiUrl) {
77
+ const existing = await getMetadata() || {
78
+ syncedAt: new Date().toISOString(),
79
+ apiUrl,
80
+ labels: {},
81
+ overallChecksum: '',
82
+ };
83
+ const now = new Date().toISOString();
84
+ existing.labels[label.name] = {
85
+ version: label.version,
86
+ syncedAt: now,
87
+ checksum: calculateLabelChecksum(label),
88
+ };
89
+ existing.syncedAt = now;
90
+ existing.apiUrl = apiUrl;
91
+ // Recalculate overall checksum - we need all labels for this
92
+ // For now, we'll update the single label's metadata
93
+ // The overall checksum will be recalculated on next full sync
94
+ await fs.ensureDir(OUTPUT_DIR);
95
+ await fs.writeJson(METADATA_FILE, existing, { spaces: 2 });
96
+ }
97
+ /**
98
+ * Get metadata file path
99
+ */
100
+ export function getMetadataPath() {
101
+ return path.resolve(METADATA_FILE);
102
+ }
103
+ /**
104
+ * Check if labels.json has been manually edited
105
+ */
106
+ export async function detectManualEdits(labels) {
107
+ const metadata = await getMetadata();
108
+ if (!metadata) {
109
+ // No metadata means this might be a fresh install or manually created file
110
+ return { isEdited: false };
111
+ }
112
+ const labelsJsonPath = path.join(OUTPUT_DIR, 'labels.json');
113
+ if (!(await fs.pathExists(labelsJsonPath))) {
114
+ return { isEdited: false };
115
+ }
116
+ try {
117
+ const currentContent = await fs.readFile(labelsJsonPath, 'utf-8');
118
+ const currentLabels = JSON.parse(currentContent);
119
+ // Check if any label in metadata is missing or changed
120
+ for (const [labelName, labelMeta] of Object.entries(metadata.labels)) {
121
+ const currentLabel = labels.find(l => l.name === labelName);
122
+ if (!currentLabel) {
123
+ // Label exists in metadata but not in current labels
124
+ // This could mean it was deleted manually
125
+ continue;
126
+ }
127
+ // Check if version changed (but this is expected on sync)
128
+ // We'll check checksum instead
129
+ const expectedChecksum = labelMeta.checksum;
130
+ const actualChecksum = calculateLabelChecksum(currentLabel);
131
+ // If checksum doesn't match and it's not a version update, it was manually edited
132
+ if (expectedChecksum !== actualChecksum && currentLabel.version === labelMeta.version) {
133
+ return {
134
+ isEdited: true,
135
+ reason: `Label "${labelName}" has been manually modified`,
136
+ };
137
+ }
138
+ }
139
+ // Check overall checksum
140
+ const expectedOverall = metadata.overallChecksum;
141
+ const actualOverall = calculateOverallChecksum(labels);
142
+ if (expectedOverall && expectedOverall !== actualOverall) {
143
+ // This could be due to new labels or removed labels, not necessarily manual edits
144
+ // We'll be lenient here and only flag if we're sure
145
+ return { isEdited: false };
146
+ }
147
+ return { isEdited: false };
148
+ }
149
+ catch (error) {
150
+ // If we can't read or parse the file, assume it's been manually edited
151
+ return {
152
+ isEdited: true,
153
+ reason: 'Could not verify label integrity',
154
+ };
155
+ }
156
+ }
157
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taggr/cli",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "CLI tool for Taggr - Pull and manage your labels locally",
5
5
  "main": "dist/index.js",
6
6
  "bin": {