@taggr/cli 1.0.4 → 1.0.6
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.
- package/README.md +99 -1
- package/dist/commands/check.d.ts +7 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +166 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/ci.d.ts +9 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +63 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +31 -13
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +94 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +152 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.js +37 -4
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/api.d.ts +5 -0
- package/dist/utils/api.d.ts.map +1 -1
- package/dist/utils/api.js +26 -0
- package/dist/utils/api.js.map +1 -1
- package/dist/utils/generator.d.ts +3 -3
- package/dist/utils/generator.d.ts.map +1 -1
- package/dist/utils/generator.js +44 -7
- package/dist/utils/generator.js.map +1 -1
- package/dist/utils/metadata.d.ts +26 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +253 -0
- package/dist/utils/metadata.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,253 @@
|
|
|
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
|
+
// Ensure all required fields are present
|
|
17
|
+
const name = label.name || '';
|
|
18
|
+
const value = label.value !== undefined && label.value !== null ? String(label.value) : '';
|
|
19
|
+
const version = label.version || '1.0.0';
|
|
20
|
+
const data = `${name}:${value}:${version}`;
|
|
21
|
+
return calculateChecksum(data);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Calculate overall checksum for all labels
|
|
25
|
+
*/
|
|
26
|
+
function calculateOverallChecksum(labels) {
|
|
27
|
+
const sortedLabels = [...labels]
|
|
28
|
+
.filter(label => label && label.name) // Filter out invalid labels
|
|
29
|
+
.sort((a, b) => (a.name || '').localeCompare(b.name || ''));
|
|
30
|
+
const data = sortedLabels
|
|
31
|
+
.map(label => {
|
|
32
|
+
const name = label.name || '';
|
|
33
|
+
const value = label.value !== undefined && label.value !== null ? String(label.value) : '';
|
|
34
|
+
const version = label.version || '1.0.0';
|
|
35
|
+
return `${name}:${value}:${version}`;
|
|
36
|
+
})
|
|
37
|
+
.join('|');
|
|
38
|
+
return calculateChecksum(data);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get existing metadata or return null
|
|
42
|
+
*/
|
|
43
|
+
export async function getMetadata() {
|
|
44
|
+
try {
|
|
45
|
+
if (await fs.pathExists(METADATA_FILE)) {
|
|
46
|
+
const content = await fs.readJson(METADATA_FILE);
|
|
47
|
+
// Validate structure
|
|
48
|
+
if (content && typeof content === 'object' && !Array.isArray(content)) {
|
|
49
|
+
// Additional validation: ensure required fields exist
|
|
50
|
+
if (typeof content.syncedAt === 'string' &&
|
|
51
|
+
typeof content.apiUrl === 'string' &&
|
|
52
|
+
content.labels && typeof content.labels === 'object') {
|
|
53
|
+
return content;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.warn(`Warning: Metadata file at ${METADATA_FILE} has invalid structure.`);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
console.warn(`Warning: Metadata file at ${METADATA_FILE} is corrupted.`);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
// If file is corrupted, return null (will trigger re-sync)
|
|
69
|
+
console.warn(`Warning: Could not read metadata file: ${error.message}`);
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Save metadata for synced labels
|
|
75
|
+
*/
|
|
76
|
+
export async function saveMetadata(labels, apiUrl) {
|
|
77
|
+
// Validate inputs
|
|
78
|
+
if (!labels || !Array.isArray(labels)) {
|
|
79
|
+
throw new Error('Labels must be a non-empty array');
|
|
80
|
+
}
|
|
81
|
+
if (!apiUrl || typeof apiUrl !== 'string') {
|
|
82
|
+
throw new Error('API URL must be a non-empty string');
|
|
83
|
+
}
|
|
84
|
+
const now = new Date().toISOString();
|
|
85
|
+
const labelMetadata = {};
|
|
86
|
+
// Create metadata for each label
|
|
87
|
+
for (const label of labels) {
|
|
88
|
+
// Validate label has required properties
|
|
89
|
+
if (!label || !label.name) {
|
|
90
|
+
console.warn(`Warning: Skipping invalid label in metadata: ${JSON.stringify(label)}`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const key = label.name;
|
|
94
|
+
labelMetadata[key] = {
|
|
95
|
+
version: label.version || '1.0.0',
|
|
96
|
+
syncedAt: now,
|
|
97
|
+
checksum: calculateLabelChecksum(label),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const metadata = {
|
|
101
|
+
syncedAt: now,
|
|
102
|
+
apiUrl,
|
|
103
|
+
labels: labelMetadata,
|
|
104
|
+
overallChecksum: calculateOverallChecksum(labels),
|
|
105
|
+
};
|
|
106
|
+
// Ensure output directory exists
|
|
107
|
+
await fs.ensureDir(OUTPUT_DIR);
|
|
108
|
+
// Write metadata file
|
|
109
|
+
await fs.writeJson(METADATA_FILE, metadata, { spaces: 2 });
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Update metadata for a single label
|
|
113
|
+
*/
|
|
114
|
+
export async function updateLabelMetadata(label, apiUrl) {
|
|
115
|
+
// Validate inputs
|
|
116
|
+
if (!label || !label.name) {
|
|
117
|
+
throw new Error('Label must have a name property');
|
|
118
|
+
}
|
|
119
|
+
if (!apiUrl || typeof apiUrl !== 'string') {
|
|
120
|
+
throw new Error('API URL must be a non-empty string');
|
|
121
|
+
}
|
|
122
|
+
const existing = await getMetadata() || {
|
|
123
|
+
syncedAt: new Date().toISOString(),
|
|
124
|
+
apiUrl,
|
|
125
|
+
labels: {},
|
|
126
|
+
overallChecksum: '',
|
|
127
|
+
};
|
|
128
|
+
const now = new Date().toISOString();
|
|
129
|
+
existing.labels[label.name] = {
|
|
130
|
+
version: label.version || '1.0.0',
|
|
131
|
+
syncedAt: now,
|
|
132
|
+
checksum: calculateLabelChecksum(label),
|
|
133
|
+
};
|
|
134
|
+
existing.syncedAt = now;
|
|
135
|
+
existing.apiUrl = apiUrl;
|
|
136
|
+
// Recalculate overall checksum - we need all labels for this
|
|
137
|
+
// For now, we'll update the single label's metadata
|
|
138
|
+
// The overall checksum will be recalculated on next full sync
|
|
139
|
+
await fs.ensureDir(OUTPUT_DIR);
|
|
140
|
+
await fs.writeJson(METADATA_FILE, existing, { spaces: 2 });
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get metadata file path
|
|
144
|
+
*/
|
|
145
|
+
export function getMetadataPath() {
|
|
146
|
+
return path.resolve(METADATA_FILE);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Check if labels.json has been manually edited
|
|
150
|
+
* This compares the actual local file content with what should be there based on metadata
|
|
151
|
+
*/
|
|
152
|
+
export async function detectManualEdits(labels) {
|
|
153
|
+
const metadata = await getMetadata();
|
|
154
|
+
if (!metadata) {
|
|
155
|
+
// No metadata means this might be a fresh install or manually created file
|
|
156
|
+
// If labels.json exists without metadata, it was likely manually created
|
|
157
|
+
const labelsJsonPath = path.join(OUTPUT_DIR, 'labels.json');
|
|
158
|
+
if (await fs.pathExists(labelsJsonPath)) {
|
|
159
|
+
return {
|
|
160
|
+
isEdited: true,
|
|
161
|
+
reason: 'Labels file exists but no sync metadata found. File may have been manually created.',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return { isEdited: false };
|
|
165
|
+
}
|
|
166
|
+
const labelsJsonPath = path.join(OUTPUT_DIR, 'labels.json');
|
|
167
|
+
if (!(await fs.pathExists(labelsJsonPath))) {
|
|
168
|
+
return { isEdited: false };
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
// Read the actual local file
|
|
172
|
+
const currentContent = await fs.readFile(labelsJsonPath, 'utf-8');
|
|
173
|
+
const currentLabelsJson = JSON.parse(currentContent);
|
|
174
|
+
// Build expected labels from metadata and API labels
|
|
175
|
+
const expectedLabelsJson = {};
|
|
176
|
+
const labelMap = new Map();
|
|
177
|
+
for (const label of labels) {
|
|
178
|
+
if (label && label.name) {
|
|
179
|
+
labelMap.set(label.name, label);
|
|
180
|
+
const key = toCamelCase(label.name);
|
|
181
|
+
expectedLabelsJson[key] = String(label.value || '');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Compare local file with expected content
|
|
185
|
+
const differences = [];
|
|
186
|
+
// Check for modified values
|
|
187
|
+
for (const [labelName, labelMeta] of Object.entries(metadata.labels)) {
|
|
188
|
+
if (!labelName)
|
|
189
|
+
continue; // Skip invalid keys
|
|
190
|
+
const label = labelMap.get(labelName);
|
|
191
|
+
if (!label)
|
|
192
|
+
continue;
|
|
193
|
+
const camelKey = toCamelCase(labelName);
|
|
194
|
+
const expectedValue = String(label.value !== undefined && label.value !== null ? label.value : '');
|
|
195
|
+
const actualValue = currentLabelsJson[camelKey];
|
|
196
|
+
// If value in local file doesn't match expected value, it was manually edited
|
|
197
|
+
// But only if the version hasn't changed (version change means cloud update)
|
|
198
|
+
if (actualValue !== undefined && actualValue !== expectedValue && label.version === labelMeta.version) {
|
|
199
|
+
differences.push(`"${labelName}" value changed (expected: "${expectedValue}", found: "${actualValue}")`);
|
|
200
|
+
}
|
|
201
|
+
// Check checksum to detect any other changes
|
|
202
|
+
const expectedChecksum = labelMeta.checksum;
|
|
203
|
+
const actualChecksum = calculateLabelChecksum(label);
|
|
204
|
+
// If checksum doesn't match and version is the same, something was manually edited
|
|
205
|
+
if (expectedChecksum !== actualChecksum && label.version === labelMeta.version) {
|
|
206
|
+
if (!differences.some(d => d.includes(labelName))) {
|
|
207
|
+
differences.push(`"${labelName}" has been modified`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Check for extra labels in local file (manually added)
|
|
212
|
+
for (const [camelKey, value] of Object.entries(currentLabelsJson)) {
|
|
213
|
+
const found = Array.from(labelMap.values()).find(l => toCamelCase(l.name || '') === camelKey);
|
|
214
|
+
if (!found) {
|
|
215
|
+
differences.push(`Extra label "${camelKey}" found in local file (not in cloud)`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Check for missing labels (manually deleted)
|
|
219
|
+
for (const [labelName, labelMeta] of Object.entries(metadata.labels)) {
|
|
220
|
+
const camelKey = toCamelCase(labelName);
|
|
221
|
+
if (currentLabelsJson[camelKey] === undefined) {
|
|
222
|
+
differences.push(`Label "${labelName}" missing from local file (may have been deleted)`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (differences.length > 0) {
|
|
226
|
+
return {
|
|
227
|
+
isEdited: true,
|
|
228
|
+
reason: differences.slice(0, 3).join('; ') + (differences.length > 3 ? ` (and ${differences.length - 3} more)` : ''),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return { isEdited: false };
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
// If we can't read or parse the file, assume it's been manually edited
|
|
235
|
+
return {
|
|
236
|
+
isEdited: true,
|
|
237
|
+
reason: 'Could not verify label integrity - file may be corrupted or manually edited',
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Convert kebab-case to camelCase (helper for detectManualEdits)
|
|
243
|
+
*/
|
|
244
|
+
function toCamelCase(str) {
|
|
245
|
+
if (!str || typeof str !== 'string') {
|
|
246
|
+
return '';
|
|
247
|
+
}
|
|
248
|
+
return str
|
|
249
|
+
.replace(/[^a-zA-Z0-9-]/g, '')
|
|
250
|
+
.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())
|
|
251
|
+
.replace(/^[A-Z]/, (match) => match.toLowerCase());
|
|
252
|
+
}
|
|
253
|
+
//# 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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"}
|