@taggr/cli 1.0.4 → 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.
- 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 +162 -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 +18 -3
- 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 +66 -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 +138 -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 +20 -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 +37 -7
- package/dist/utils/generator.js.map +1 -1
- package/dist/utils/metadata.d.ts +25 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +157 -0
- package/dist/utils/metadata.js.map +1 -0
- package/package.json +1 -1
|
@@ -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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"}
|