@udondan/avanti 0.4.0 → 0.6.0
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 +130 -5
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +45 -2
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +100 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +67 -19
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/reset.d.ts +3 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +106 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/revert.d.ts +3 -0
- package/dist/commands/revert.d.ts.map +1 -0
- package/dist/commands/revert.js +153 -0
- package/dist/commands/revert.js.map +1 -0
- package/dist/diff.d.ts +1 -0
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +10 -1
- package/dist/diff.js.map +1 -1
- package/dist/fetch.d.ts +3 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +37 -0
- package/dist/fetch.js.map +1 -0
- package/dist/history.d.ts +64 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +316 -0
- package/dist/history.js.map +1 -0
- package/dist/processors/json.d.ts.map +1 -1
- package/dist/processors/json.js +8 -5
- package/dist/processors/json.js.map +1 -1
- package/dist/prompt.d.ts +2 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +42 -0
- package/dist/prompt.js.map +1 -0
- package/dist/sources/github.d.ts +1 -1
- package/dist/sources/github.d.ts.map +1 -1
- package/dist/sources/github.js +124 -20
- package/dist/sources/github.js.map +1 -1
- package/dist/sources/gitlab.d.ts +1 -1
- package/dist/sources/gitlab.d.ts.map +1 -1
- package/dist/sources/gitlab.js +136 -48
- package/dist/sources/gitlab.js.map +1 -1
- package/dist/sources/http.d.ts.map +1 -1
- package/dist/sources/http.js +5 -24
- package/dist/sources/http.js.map +1 -1
- package/dist/sources/index.js +4 -4
- package/dist/sources/index.js.map +1 -1
- package/dist/writer.d.ts +1 -1
- package/dist/writer.d.ts.map +1 -1
- package/dist/writer.js +10 -1
- package/dist/writer.js.map +1 -1
- package/package.json +6 -1
- package/.prettierignore +0 -2
- package/CHANGELOG.md +0 -46
- package/eslint.config.mjs +0 -25
- package/prettier.config.mjs +0 -5
package/dist/history.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.HistoryManager = void 0;
|
|
27
|
+
const crypto = __importStar(require("crypto"));
|
|
28
|
+
const fs = __importStar(require("fs"));
|
|
29
|
+
const os = __importStar(require("os"));
|
|
30
|
+
const path = __importStar(require("path"));
|
|
31
|
+
function defaultBaseDir() {
|
|
32
|
+
return (process.env.AVANTI_HISTORY_DIR ??
|
|
33
|
+
path.join(os.homedir(), '.config', 'avanti'));
|
|
34
|
+
}
|
|
35
|
+
function sha256(input) {
|
|
36
|
+
return crypto.createHash('sha256').update(input).digest('hex');
|
|
37
|
+
}
|
|
38
|
+
function uuid() {
|
|
39
|
+
return crypto.randomUUID();
|
|
40
|
+
}
|
|
41
|
+
class HistoryManager {
|
|
42
|
+
baseDir;
|
|
43
|
+
projectSlug;
|
|
44
|
+
projectDir;
|
|
45
|
+
filesDir;
|
|
46
|
+
indexPath;
|
|
47
|
+
pullsLogPath;
|
|
48
|
+
configFile;
|
|
49
|
+
workingDir;
|
|
50
|
+
constructor(configFile, workingDir) {
|
|
51
|
+
this.configFile = configFile;
|
|
52
|
+
this.workingDir = workingDir;
|
|
53
|
+
this.baseDir = defaultBaseDir();
|
|
54
|
+
this.projectSlug = sha256(`${configFile}|${workingDir}`);
|
|
55
|
+
this.projectDir = path.join(this.baseDir, 'projects', this.projectSlug);
|
|
56
|
+
this.filesDir = path.join(this.projectDir, 'files');
|
|
57
|
+
this.indexPath = path.join(this.filesDir, 'index.json');
|
|
58
|
+
this.pullsLogPath = path.join(this.projectDir, 'pulls.jsonl');
|
|
59
|
+
}
|
|
60
|
+
ensureStorageDir() {
|
|
61
|
+
try {
|
|
62
|
+
fs.mkdirSync(this.filesDir, { recursive: true });
|
|
63
|
+
const metaPath = path.join(this.projectDir, 'meta.json');
|
|
64
|
+
if (!fs.existsSync(metaPath)) {
|
|
65
|
+
fs.writeFileSync(metaPath, JSON.stringify({ configFile: this.configFile, workingDir: this.workingDir }, null, 2), 'utf8');
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
console.warn(`Warning: could not initialise history storage at ${this.baseDir}: ${err.message}`);
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
openPullSession() {
|
|
75
|
+
return uuid();
|
|
76
|
+
}
|
|
77
|
+
stageFileVersion(pullId, targetPath, newContent, isNew) {
|
|
78
|
+
const slug = sha256(targetPath);
|
|
79
|
+
const fileDir = path.join(this.filesDir, slug);
|
|
80
|
+
fs.mkdirSync(fileDir, { recursive: true });
|
|
81
|
+
const metaPath = path.join(fileDir, 'meta.json');
|
|
82
|
+
let meta;
|
|
83
|
+
if (fs.existsSync(metaPath)) {
|
|
84
|
+
meta = JSON.parse(fs.readFileSync(metaPath, 'utf8'));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const existedBeforeAvanti = !isNew && fs.existsSync(targetPath);
|
|
88
|
+
if (existedBeforeAvanti) {
|
|
89
|
+
const originalContent = fs.readFileSync(targetPath, 'utf8');
|
|
90
|
+
fs.writeFileSync(path.join(fileDir, 'v0'), originalContent, 'utf8');
|
|
91
|
+
}
|
|
92
|
+
meta = {
|
|
93
|
+
absolutePath: targetPath,
|
|
94
|
+
slug,
|
|
95
|
+
firstSeenAt: new Date().toISOString(),
|
|
96
|
+
existedBeforeAvanti,
|
|
97
|
+
currentVersion: 0,
|
|
98
|
+
};
|
|
99
|
+
fs.writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf8');
|
|
100
|
+
const index = this.readIndex();
|
|
101
|
+
index[targetPath] = slug;
|
|
102
|
+
this.writeIndex(index);
|
|
103
|
+
}
|
|
104
|
+
const nextVersion = meta.currentVersion + 1;
|
|
105
|
+
fs.writeFileSync(path.join(fileDir, `v${nextVersion}`), newContent, 'utf8');
|
|
106
|
+
const fileRef = {
|
|
107
|
+
absolutePath: targetPath,
|
|
108
|
+
slug,
|
|
109
|
+
version: nextVersion,
|
|
110
|
+
wasNew: isNew,
|
|
111
|
+
};
|
|
112
|
+
return { version: nextVersion, fileRef };
|
|
113
|
+
}
|
|
114
|
+
closePullSession(pullId, configFile, fileRefs) {
|
|
115
|
+
for (const ref of fileRefs) {
|
|
116
|
+
const metaPath = path.join(this.filesDir, ref.slug, 'meta.json');
|
|
117
|
+
if (fs.existsSync(metaPath)) {
|
|
118
|
+
const meta = JSON.parse(fs.readFileSync(metaPath, 'utf8'));
|
|
119
|
+
meta.currentVersion = ref.version;
|
|
120
|
+
fs.writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf8');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const entry = {
|
|
124
|
+
pullId,
|
|
125
|
+
timestamp: new Date().toISOString(),
|
|
126
|
+
configFile,
|
|
127
|
+
files: fileRefs,
|
|
128
|
+
};
|
|
129
|
+
fs.appendFileSync(this.pullsLogPath, JSON.stringify(entry) + '\n', 'utf8');
|
|
130
|
+
}
|
|
131
|
+
listPulls() {
|
|
132
|
+
try {
|
|
133
|
+
if (!fs.existsSync(this.pullsLogPath))
|
|
134
|
+
return [];
|
|
135
|
+
const lines = fs
|
|
136
|
+
.readFileSync(this.pullsLogPath, 'utf8')
|
|
137
|
+
.split('\n')
|
|
138
|
+
.filter(Boolean);
|
|
139
|
+
const entries = [];
|
|
140
|
+
for (const line of lines) {
|
|
141
|
+
try {
|
|
142
|
+
entries.push(JSON.parse(line));
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// skip corrupt lines
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return entries.reverse();
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
getFileHistory(absolutePath) {
|
|
155
|
+
try {
|
|
156
|
+
const index = this.readIndex();
|
|
157
|
+
const slug = index[absolutePath];
|
|
158
|
+
if (!slug)
|
|
159
|
+
return null;
|
|
160
|
+
const meta = this.readMeta(slug);
|
|
161
|
+
if (!meta)
|
|
162
|
+
return null;
|
|
163
|
+
const pulls = this.listPulls().slice().reverse(); // chronological order for version lookup
|
|
164
|
+
const versionMap = new Map();
|
|
165
|
+
for (const pull of pulls) {
|
|
166
|
+
for (const ref of pull.files) {
|
|
167
|
+
if (ref.absolutePath === absolutePath) {
|
|
168
|
+
versionMap.set(ref.version, {
|
|
169
|
+
pulledAt: pull.timestamp,
|
|
170
|
+
pullId: pull.pullId,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const versions = [];
|
|
176
|
+
if (meta.existedBeforeAvanti) {
|
|
177
|
+
versions.push({
|
|
178
|
+
version: 0,
|
|
179
|
+
isOriginal: true,
|
|
180
|
+
pulledAt: null,
|
|
181
|
+
pullId: null,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
for (let v = 1; v <= meta.currentVersion; v++) {
|
|
185
|
+
const info = versionMap.get(v);
|
|
186
|
+
versions.push({
|
|
187
|
+
version: v,
|
|
188
|
+
isOriginal: false,
|
|
189
|
+
pulledAt: info?.pulledAt ?? null,
|
|
190
|
+
pullId: info?.pullId ?? null,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
absolutePath,
|
|
195
|
+
existedBeforeAvanti: meta.existedBeforeAvanti,
|
|
196
|
+
currentVersion: meta.currentVersion,
|
|
197
|
+
versions,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
readVersion(absolutePath, version) {
|
|
205
|
+
try {
|
|
206
|
+
const index = this.readIndex();
|
|
207
|
+
const slug = index[absolutePath];
|
|
208
|
+
if (!slug)
|
|
209
|
+
return null;
|
|
210
|
+
const versionPath = path.join(this.filesDir, slug, `v${version}`);
|
|
211
|
+
if (!fs.existsSync(versionPath))
|
|
212
|
+
return null;
|
|
213
|
+
return fs.readFileSync(versionPath, 'utf8');
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
getFileMeta(absolutePath) {
|
|
220
|
+
try {
|
|
221
|
+
const index = this.readIndex();
|
|
222
|
+
const slug = index[absolutePath];
|
|
223
|
+
if (!slug)
|
|
224
|
+
return null;
|
|
225
|
+
return this.readMeta(slug);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
getFilesAtPull(pullId) {
|
|
232
|
+
const result = new Map();
|
|
233
|
+
const pulls = this.listPulls().slice().reverse(); // chronological
|
|
234
|
+
// Build state snapshot: for each file, find highest version at or before the target pull
|
|
235
|
+
let found = false;
|
|
236
|
+
const snapshot = new Map(); // absolutePath → version at target pull
|
|
237
|
+
for (const pull of pulls) {
|
|
238
|
+
for (const ref of pull.files) {
|
|
239
|
+
if (!snapshot.has(ref.absolutePath)) {
|
|
240
|
+
// Only record if we haven't passed the target pull yet or are at it
|
|
241
|
+
if (!found) {
|
|
242
|
+
snapshot.set(ref.absolutePath, ref.version);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (pull.pullId === pullId) {
|
|
247
|
+
// Record files written IN this pull (overwrite any tentative earlier values)
|
|
248
|
+
for (const ref of pull.files) {
|
|
249
|
+
snapshot.set(ref.absolutePath, ref.version);
|
|
250
|
+
}
|
|
251
|
+
found = true;
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (!found)
|
|
256
|
+
return result;
|
|
257
|
+
for (const [absolutePath, version] of snapshot) {
|
|
258
|
+
const meta = this.getFileMeta(absolutePath);
|
|
259
|
+
result.set(absolutePath, {
|
|
260
|
+
version,
|
|
261
|
+
existedBeforeAvanti: meta?.existedBeforeAvanti ?? false,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
listTrackedFiles() {
|
|
267
|
+
try {
|
|
268
|
+
const index = this.readIndex();
|
|
269
|
+
const metas = [];
|
|
270
|
+
for (const slug of Object.values(index)) {
|
|
271
|
+
const meta = this.readMeta(slug);
|
|
272
|
+
if (meta)
|
|
273
|
+
metas.push(meta);
|
|
274
|
+
}
|
|
275
|
+
return metas;
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
return [];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
getLastPullFiles() {
|
|
282
|
+
const pulls = this.listPulls();
|
|
283
|
+
if (pulls.length === 0)
|
|
284
|
+
return [];
|
|
285
|
+
return pulls[0].files; // listPulls returns newest first
|
|
286
|
+
}
|
|
287
|
+
hasHistory() {
|
|
288
|
+
return fs.existsSync(this.pullsLogPath);
|
|
289
|
+
}
|
|
290
|
+
readIndex() {
|
|
291
|
+
try {
|
|
292
|
+
if (!fs.existsSync(this.indexPath))
|
|
293
|
+
return {};
|
|
294
|
+
return JSON.parse(fs.readFileSync(this.indexPath, 'utf8'));
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
return {};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
writeIndex(index) {
|
|
301
|
+
fs.writeFileSync(this.indexPath, JSON.stringify(index, null, 2), 'utf8');
|
|
302
|
+
}
|
|
303
|
+
readMeta(slug) {
|
|
304
|
+
try {
|
|
305
|
+
const metaPath = path.join(this.filesDir, slug, 'meta.json');
|
|
306
|
+
if (!fs.existsSync(metaPath))
|
|
307
|
+
return null;
|
|
308
|
+
return JSON.parse(fs.readFileSync(metaPath, 'utf8'));
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
exports.HistoryManager = HistoryManager;
|
|
316
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/processors/json.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/processors/json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAiE5C,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,GAAE,gBAAqB,GAC1B,MAAM,CA0BR;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQlD"}
|
package/dist/processors/json.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.formatJson = exports.mergeJson = void 0;
|
|
4
|
+
const comment_json_1 = require("comment-json");
|
|
4
5
|
function isPlainObject(v) {
|
|
5
6
|
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
6
7
|
}
|
|
@@ -27,14 +28,16 @@ function mergeValues(path, a, b, opts) {
|
|
|
27
28
|
return b;
|
|
28
29
|
}
|
|
29
30
|
function deepMerge(a, b, opts, basePath) {
|
|
30
|
-
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
+
const result = (0, comment_json_1.assign)({}, a);
|
|
31
33
|
for (const [key, bVal] of Object.entries(b)) {
|
|
32
34
|
const childPath = basePath ? `${basePath}.${key}` : key;
|
|
33
35
|
if (key in result) {
|
|
34
36
|
result[key] = mergeValues(childPath, result[key], bVal, opts);
|
|
35
37
|
}
|
|
36
38
|
else {
|
|
37
|
-
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
|
+
(0, comment_json_1.assign)(result, b, [key]);
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
return result;
|
|
@@ -49,7 +52,7 @@ function mergeJson(parts, opts = {}) {
|
|
|
49
52
|
return 'null';
|
|
50
53
|
const parsed = parts.map((p, i) => {
|
|
51
54
|
try {
|
|
52
|
-
return
|
|
55
|
+
return (0, comment_json_1.parse)(p);
|
|
53
56
|
}
|
|
54
57
|
catch (e) {
|
|
55
58
|
throw new Error(`[source ${i}]: invalid JSON: ${e.message}`, { cause: e });
|
|
@@ -59,12 +62,12 @@ function mergeJson(parts, opts = {}) {
|
|
|
59
62
|
for (let i = 1; i < parsed.length; i++) {
|
|
60
63
|
result = mergeValues('', result, parsed[i], resolved);
|
|
61
64
|
}
|
|
62
|
-
return
|
|
65
|
+
return (0, comment_json_1.stringify)(result, null, 2);
|
|
63
66
|
}
|
|
64
67
|
exports.mergeJson = mergeJson;
|
|
65
68
|
function formatJson(content) {
|
|
66
69
|
try {
|
|
67
|
-
return
|
|
70
|
+
return (0, comment_json_1.stringify)((0, comment_json_1.parse)(content), null, 2);
|
|
68
71
|
}
|
|
69
72
|
catch (e) {
|
|
70
73
|
throw new Error(`invalid JSON: ${e.message}`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/processors/json.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/processors/json.ts"],"names":[],"mappings":"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"}
|
package/dist/prompt.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAEA,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAchE"}
|
package/dist/prompt.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.confirm = void 0;
|
|
27
|
+
const readline = __importStar(require("readline"));
|
|
28
|
+
async function confirm(question) {
|
|
29
|
+
const rl = readline.createInterface({
|
|
30
|
+
input: process.stdin,
|
|
31
|
+
output: process.stdout,
|
|
32
|
+
});
|
|
33
|
+
return new Promise((resolve) => {
|
|
34
|
+
rl.question(question, (answer) => {
|
|
35
|
+
rl.close();
|
|
36
|
+
resolve(answer.trim().toLowerCase() === 'y' ||
|
|
37
|
+
answer.trim().toLowerCase() === 'yes');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
exports.confirm = confirm;
|
|
42
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAqC;AAE9B,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CACL,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG;gBACjC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CACxC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAdD,0BAcC"}
|
package/dist/sources/github.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export interface GitHubResult {
|
|
2
2
|
files: Map<string, string>;
|
|
3
3
|
}
|
|
4
|
-
export declare function fetchGitHub(repo: string, file: string, ref: string | undefined): GitHubResult
|
|
4
|
+
export declare function fetchGitHub(repo: string, file: string, ref: string | undefined): Promise<GitHubResult>;
|
|
5
5
|
//# sourceMappingURL=github.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/sources/github.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/sources/github.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAgOD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
|
package/dist/sources/github.js
CHANGED
|
@@ -26,22 +26,50 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
26
26
|
exports.fetchGitHub = void 0;
|
|
27
27
|
const child_process_1 = require("child_process");
|
|
28
28
|
const path = __importStar(require("path"));
|
|
29
|
+
const fetch_1 = require("../fetch");
|
|
30
|
+
function getApiBase() {
|
|
31
|
+
const host = process.env.GITHUB_HOST;
|
|
32
|
+
return host ? `https://${host}/api/v3` : 'https://api.github.com';
|
|
33
|
+
}
|
|
34
|
+
function apiHeaders() {
|
|
35
|
+
const headers = {
|
|
36
|
+
Accept: 'application/vnd.github+json',
|
|
37
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
38
|
+
'User-Agent': 'scync',
|
|
39
|
+
};
|
|
40
|
+
const token = process.env.GITHUB_TOKEN;
|
|
41
|
+
if (token)
|
|
42
|
+
headers.Authorization = `Bearer ${token}`;
|
|
43
|
+
return headers;
|
|
44
|
+
}
|
|
45
|
+
function shouldFallback(status) {
|
|
46
|
+
return status === 401 || status === 403 || status === 404;
|
|
47
|
+
}
|
|
48
|
+
function isGhAvailable() {
|
|
49
|
+
return !(0, child_process_1.spawnSync)('gh', ['--version'], { encoding: 'utf8' }).error;
|
|
50
|
+
}
|
|
29
51
|
function ghRun(args) {
|
|
30
52
|
const result = (0, child_process_1.spawnSync)('gh', args, { encoding: 'utf8' });
|
|
31
|
-
if (result.error)
|
|
32
|
-
|
|
33
|
-
if (msg.includes('ENOENT')) {
|
|
34
|
-
throw new Error('gh CLI not found. Install it from https://cli.github.com');
|
|
35
|
-
}
|
|
36
|
-
throw new Error(`gh error: ${msg}`);
|
|
37
|
-
}
|
|
53
|
+
if (result.error)
|
|
54
|
+
throw new Error(`gh error: ${result.error.message}`);
|
|
38
55
|
return {
|
|
39
56
|
stdout: result.stdout ?? '',
|
|
40
57
|
stderr: result.stderr ?? '',
|
|
41
58
|
status: result.status,
|
|
42
59
|
};
|
|
43
60
|
}
|
|
44
|
-
function detectPathType(repo, filePath, ref) {
|
|
61
|
+
async function detectPathType(repo, filePath, ref) {
|
|
62
|
+
const res = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/contents/${filePath}?ref=${encodeURIComponent(ref)}`, { headers: apiHeaders() });
|
|
63
|
+
if (res.ok) {
|
|
64
|
+
const data = await res.json();
|
|
65
|
+
return Array.isArray(data) ? 'directory' : 'file';
|
|
66
|
+
}
|
|
67
|
+
if (shouldFallback(res.status) && isGhAvailable()) {
|
|
68
|
+
return detectPathTypeViaCli(repo, filePath, ref);
|
|
69
|
+
}
|
|
70
|
+
throw new Error(`Failed to stat ${filePath} in ${repo}@${ref}: HTTP ${res.status}`);
|
|
71
|
+
}
|
|
72
|
+
function detectPathTypeViaCli(repo, filePath, ref) {
|
|
45
73
|
const res = ghRun([
|
|
46
74
|
'api',
|
|
47
75
|
`repos/${repo}/contents/${filePath}?ref=${encodeURIComponent(ref)}`,
|
|
@@ -53,7 +81,18 @@ function detectPathType(repo, filePath, ref) {
|
|
|
53
81
|
}
|
|
54
82
|
return res.stdout.trim();
|
|
55
83
|
}
|
|
56
|
-
function fetchFile(repo, filePath, ref) {
|
|
84
|
+
async function fetchFile(repo, filePath, ref) {
|
|
85
|
+
const res = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/contents/${filePath}?ref=${encodeURIComponent(ref)}`, { headers: apiHeaders() });
|
|
86
|
+
if (!res.ok) {
|
|
87
|
+
if (shouldFallback(res.status) && isGhAvailable()) {
|
|
88
|
+
return fetchFileViaCli(repo, filePath, ref);
|
|
89
|
+
}
|
|
90
|
+
throw new Error(`Failed to fetch ${filePath} from ${repo}@${ref}: HTTP ${res.status}`);
|
|
91
|
+
}
|
|
92
|
+
const data = (await res.json());
|
|
93
|
+
return Buffer.from(data.content.replace(/\n/g, ''), 'base64').toString('utf8');
|
|
94
|
+
}
|
|
95
|
+
function fetchFileViaCli(repo, filePath, ref) {
|
|
57
96
|
const res = ghRun([
|
|
58
97
|
'api',
|
|
59
98
|
`repos/${repo}/contents/${filePath}?ref=${encodeURIComponent(ref)}`,
|
|
@@ -66,7 +105,21 @@ function fetchFile(repo, filePath, ref) {
|
|
|
66
105
|
const b64 = res.stdout.trim().replace(/\\n/g, '').replace(/\n/g, '');
|
|
67
106
|
return Buffer.from(b64, 'base64').toString('utf8');
|
|
68
107
|
}
|
|
69
|
-
function listTree(repo, dirPath, ref) {
|
|
108
|
+
async function listTree(repo, dirPath, ref) {
|
|
109
|
+
const res = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/git/trees/${encodeURIComponent(ref)}?recursive=1`, { headers: apiHeaders() });
|
|
110
|
+
if (!res.ok) {
|
|
111
|
+
if (shouldFallback(res.status) && isGhAvailable()) {
|
|
112
|
+
return listTreeViaCli(repo, dirPath, ref);
|
|
113
|
+
}
|
|
114
|
+
throw new Error(`Failed to list tree ${dirPath} in ${repo}@${ref}: HTTP ${res.status}`);
|
|
115
|
+
}
|
|
116
|
+
const data = (await res.json());
|
|
117
|
+
const prefix = `${dirPath}/`;
|
|
118
|
+
return data.tree
|
|
119
|
+
.filter((item) => item.type === 'blob' && item.path.startsWith(prefix))
|
|
120
|
+
.map((item) => item.path);
|
|
121
|
+
}
|
|
122
|
+
function listTreeViaCli(repo, dirPath, ref) {
|
|
70
123
|
const res = ghRun([
|
|
71
124
|
'api',
|
|
72
125
|
`repos/${repo}/git/trees/${encodeURIComponent(ref)}?recursive=1`,
|
|
@@ -78,24 +131,75 @@ function listTree(repo, dirPath, ref) {
|
|
|
78
131
|
}
|
|
79
132
|
return res.stdout.trim().split('\n').filter(Boolean);
|
|
80
133
|
}
|
|
81
|
-
function
|
|
82
|
-
|
|
134
|
+
async function resolveRef(repo, ref) {
|
|
135
|
+
if (ref !== '$latest')
|
|
136
|
+
return ref ?? 'HEAD';
|
|
137
|
+
// Try latest release first
|
|
138
|
+
const relRes = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/releases/latest`, {
|
|
139
|
+
headers: apiHeaders(),
|
|
140
|
+
});
|
|
141
|
+
if (relRes.ok) {
|
|
142
|
+
const rel = (await relRes.json());
|
|
143
|
+
return rel.tag_name;
|
|
144
|
+
}
|
|
145
|
+
// No releases (404) — fall back to most recent tag
|
|
146
|
+
if (relRes.status === 404) {
|
|
147
|
+
const tagRes = await (0, fetch_1.fetchWithRetry)(`${getApiBase()}/repos/${repo}/tags?per_page=1`, { headers: apiHeaders() });
|
|
148
|
+
if (tagRes.ok) {
|
|
149
|
+
const tags = (await tagRes.json());
|
|
150
|
+
if (tags.length)
|
|
151
|
+
return tags[0].name;
|
|
152
|
+
throw new Error(`No releases or tags found for ${repo}`);
|
|
153
|
+
}
|
|
154
|
+
if (shouldFallback(tagRes.status) && isGhAvailable()) {
|
|
155
|
+
return resolveRefViaCli(repo);
|
|
156
|
+
}
|
|
157
|
+
throw new Error(`Failed to resolve $latest for ${repo}: HTTP ${tagRes.status}`);
|
|
158
|
+
}
|
|
159
|
+
if (shouldFallback(relRes.status) && isGhAvailable()) {
|
|
160
|
+
return resolveRefViaCli(repo);
|
|
161
|
+
}
|
|
162
|
+
throw new Error(`Failed to resolve $latest for ${repo}: HTTP ${relRes.status}`);
|
|
163
|
+
}
|
|
164
|
+
function resolveRefViaCli(repo) {
|
|
165
|
+
const res = ghRun([
|
|
166
|
+
'api',
|
|
167
|
+
`repos/${repo}/releases/latest`,
|
|
168
|
+
'--jq',
|
|
169
|
+
'.tag_name',
|
|
170
|
+
]);
|
|
171
|
+
if (res.status === 0 && res.stdout.trim())
|
|
172
|
+
return res.stdout.trim();
|
|
173
|
+
// Fall back to most recent tag
|
|
174
|
+
const tagRes = ghRun([
|
|
175
|
+
'api',
|
|
176
|
+
`repos/${repo}/tags?per_page=1`,
|
|
177
|
+
'--jq',
|
|
178
|
+
'.[0].name',
|
|
179
|
+
]);
|
|
180
|
+
if (tagRes.status !== 0 || !tagRes.stdout.trim()) {
|
|
181
|
+
throw new Error(`No releases or tags found for ${repo}`);
|
|
182
|
+
}
|
|
183
|
+
return tagRes.stdout.trim();
|
|
184
|
+
}
|
|
185
|
+
async function fetchGitHub(repo, file, ref) {
|
|
186
|
+
const resolvedRef = await resolveRef(repo, ref);
|
|
83
187
|
const normalizedPath = file.replace(/\/$/, '');
|
|
84
188
|
const isDirectory = file.endsWith('/') ||
|
|
85
|
-
detectPathType(repo, normalizedPath, resolvedRef) === 'directory';
|
|
189
|
+
(await detectPathType(repo, normalizedPath, resolvedRef)) === 'directory';
|
|
86
190
|
if (!isDirectory) {
|
|
87
|
-
const content = fetchFile(repo, normalizedPath, resolvedRef);
|
|
191
|
+
const content = await fetchFile(repo, normalizedPath, resolvedRef);
|
|
88
192
|
return { files: new Map([[path.basename(normalizedPath), content]]) };
|
|
89
193
|
}
|
|
90
|
-
const paths = listTree(repo, normalizedPath, resolvedRef);
|
|
194
|
+
const paths = await listTree(repo, normalizedPath, resolvedRef);
|
|
91
195
|
if (!paths.length) {
|
|
92
196
|
throw new Error(`Failed to fetch ${file} from ${repo}@${resolvedRef} (not a file or empty directory)`);
|
|
93
197
|
}
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return { files };
|
|
198
|
+
const entries = await Promise.all(paths.map(async (p) => [
|
|
199
|
+
path.relative(normalizedPath, p),
|
|
200
|
+
await fetchFile(repo, p, resolvedRef),
|
|
201
|
+
]));
|
|
202
|
+
return { files: new Map(entries) };
|
|
99
203
|
}
|
|
100
204
|
exports.fetchGitHub = fetchGitHub;
|
|
101
205
|
//# sourceMappingURL=github.js.map
|