@butterbase/cli 0.3.5 → 0.4.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.
Files changed (64) hide show
  1. package/README.md +407 -407
  2. package/dist/bin/butterbase.js +89 -0
  3. package/dist/bin/butterbase.js.map +1 -1
  4. package/dist/src/commands/clone.d.ts +9 -0
  5. package/dist/src/commands/clone.d.ts.map +1 -0
  6. package/dist/src/commands/clone.js +131 -0
  7. package/dist/src/commands/clone.js.map +1 -0
  8. package/dist/src/commands/init.js +1 -1
  9. package/dist/src/commands/plugin.js +2 -2
  10. package/dist/src/commands/plugin.js.map +1 -1
  11. package/dist/src/commands/repo.d.ts +28 -0
  12. package/dist/src/commands/repo.d.ts.map +1 -0
  13. package/dist/src/commands/repo.js +440 -0
  14. package/dist/src/commands/repo.js.map +1 -0
  15. package/dist/src/commands/templates.d.ts +9 -0
  16. package/dist/src/commands/templates.d.ts.map +1 -0
  17. package/dist/src/commands/templates.js +74 -0
  18. package/dist/src/commands/templates.js.map +1 -0
  19. package/dist/src/commands/visibility.d.ts +7 -0
  20. package/dist/src/commands/visibility.d.ts.map +1 -0
  21. package/dist/src/commands/visibility.js +32 -0
  22. package/dist/src/commands/visibility.js.map +1 -0
  23. package/dist/src/lib/api-client.d.ts +4 -0
  24. package/dist/src/lib/api-client.d.ts.map +1 -1
  25. package/dist/src/lib/api-client.js +3 -0
  26. package/dist/src/lib/api-client.js.map +1 -1
  27. package/dist/src/lib/config.d.ts +8 -0
  28. package/dist/src/lib/config.d.ts.map +1 -1
  29. package/dist/src/lib/config.js +21 -0
  30. package/dist/src/lib/config.js.map +1 -1
  31. package/dist/src/lib/repo-api.d.ts +123 -0
  32. package/dist/src/lib/repo-api.d.ts.map +1 -0
  33. package/dist/src/lib/repo-api.js +75 -0
  34. package/dist/src/lib/repo-api.js.map +1 -0
  35. package/dist/src/lib/repo-ignore.d.ts +17 -0
  36. package/dist/src/lib/repo-ignore.d.ts.map +1 -0
  37. package/dist/src/lib/repo-ignore.js +44 -0
  38. package/dist/src/lib/repo-ignore.js.map +1 -0
  39. package/dist/src/lib/repo-manifest.d.ts +12 -0
  40. package/dist/src/lib/repo-manifest.d.ts.map +1 -0
  41. package/dist/src/lib/repo-manifest.js +25 -0
  42. package/dist/src/lib/repo-manifest.js.map +1 -0
  43. package/dist/src/lib/repo-paths.d.ts +14 -0
  44. package/dist/src/lib/repo-paths.d.ts.map +1 -0
  45. package/dist/src/lib/repo-paths.js +41 -0
  46. package/dist/src/lib/repo-paths.js.map +1 -0
  47. package/dist/src/lib/repo-walk.d.ts +14 -0
  48. package/dist/src/lib/repo-walk.d.ts.map +1 -0
  49. package/dist/src/lib/repo-walk.js +36 -0
  50. package/dist/src/lib/repo-walk.js.map +1 -0
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/package.json +55 -54
  53. package/templates/react-vite/.env.example +2 -2
  54. package/templates/react-vite/.mcp.json +10 -10
  55. package/templates/react-vite/README.md +38 -38
  56. package/templates/react-vite/index.html +13 -13
  57. package/templates/react-vite/package.json +25 -25
  58. package/templates/react-vite/src/App.css +33 -33
  59. package/templates/react-vite/src/App.tsx +77 -77
  60. package/templates/react-vite/src/index.css +8 -8
  61. package/templates/react-vite/src/lib.ts +6 -6
  62. package/templates/react-vite/src/main.tsx +10 -10
  63. package/templates/react-vite/tsconfig.json +21 -21
  64. package/templates/react-vite/vite.config.ts +6 -6
@@ -0,0 +1,440 @@
1
+ // submodules/butterbase-oss/packages/cli/src/commands/repo.ts
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import prompts from 'prompts';
5
+ import fs from 'fs-extra';
6
+ import path from 'path';
7
+ import { createHash } from 'crypto';
8
+ import { loadProjectConfig, saveProjectConfig, getBoundAppId, setPinnedSnapshotId, getPinnedSnapshotId } from '../lib/config.js';
9
+ import { repoApi, uploadBlob, downloadBlob } from '../lib/repo-api.js';
10
+ import { loadIgnoreRules } from '../lib/repo-ignore.js';
11
+ import { walkRepo } from '../lib/repo-walk.js';
12
+ import { buildManifest } from '../lib/repo-manifest.js';
13
+ async function requireBoundApp(opts) {
14
+ if (opts.app)
15
+ return opts.app;
16
+ const bound = await getBoundAppId();
17
+ if (!bound) {
18
+ console.log(chalk.red('✗ no app bound to this folder. Run `butterbase repo init <app_id>` first.'));
19
+ process.exit(1);
20
+ }
21
+ return bound;
22
+ }
23
+ export async function repoInitCommand(appId, opts) {
24
+ const projectPath = path.resolve(process.cwd(), '.butterbase/config.json');
25
+ const existing = await loadProjectConfig();
26
+ if (existing && !opts.force) {
27
+ console.log(chalk.red(`✗ .butterbase/config.json already exists (currentApp=${existing.currentApp ?? '?'}). Use --force to overwrite.`));
28
+ process.exit(1);
29
+ }
30
+ await saveProjectConfig({ ...(existing ?? {}), currentApp: appId });
31
+ // Seed a .butterbaseignore if it doesn't exist. Users can delete or edit; we just give
32
+ // them a starting point.
33
+ if (!opts.noIgnore) {
34
+ const ignorePath = path.join(process.cwd(), '.butterbaseignore');
35
+ if (!(await fs.pathExists(ignorePath))) {
36
+ await fs.writeFile(ignorePath, [
37
+ '# Patterns here ADD to the defaults (.git/, node_modules/, dist/, .next/, .turbo/, .DS_Store, .butterbase/).',
38
+ '# .gitignore patterns also apply. Use `!path` to un-ignore.',
39
+ '',
40
+ '# Examples:',
41
+ '# secrets/',
42
+ '# *.local',
43
+ '',
44
+ ].join('\n'), 'utf8');
45
+ }
46
+ }
47
+ console.log(chalk.green(`✓ bound ${path.relative(process.cwd(), projectPath)} → app ${appId}`));
48
+ }
49
+ export async function repoWipeCommand(opts) {
50
+ const appId = await requireBoundApp(opts);
51
+ if (!opts.yes) {
52
+ const { ok } = await prompts({
53
+ type: 'text',
54
+ name: 'ok',
55
+ message: `Type the app id "${appId}" to wipe its repo (cannot be undone)`,
56
+ });
57
+ if (ok !== appId) {
58
+ console.log(chalk.yellow('aborted'));
59
+ return;
60
+ }
61
+ }
62
+ const spinner = ora('Wiping repo…').start();
63
+ try {
64
+ const res = await repoApi.wipe(appId);
65
+ spinner.succeed(`Repo wiped for ${res.app_id}`);
66
+ await setPinnedSnapshotId(null);
67
+ }
68
+ catch (e) {
69
+ spinner.fail(e.message);
70
+ process.exit(1);
71
+ }
72
+ }
73
+ export async function repoLogCommand(opts) {
74
+ const appId = await requireBoundApp(opts);
75
+ const { snapshots } = await repoApi.listSnapshots(appId);
76
+ if (opts.json) {
77
+ console.log(JSON.stringify({ snapshots }, null, 2));
78
+ return;
79
+ }
80
+ if (snapshots.length === 0) {
81
+ console.log(chalk.gray('(no snapshots yet — run `butterbase repo push`)'));
82
+ return;
83
+ }
84
+ for (const s of snapshots) {
85
+ console.log(`${chalk.cyan(s.snapshot_id.slice(0, 12))} ${s.created_at}`);
86
+ }
87
+ }
88
+ export async function repoPushCommand(opts) {
89
+ const appId = await requireBoundApp(opts);
90
+ const root = process.cwd();
91
+ const walkSpin = ora('Walking project tree…').start();
92
+ const ig = await loadIgnoreRules(root);
93
+ const walked = [];
94
+ for await (const f of walkRepo(root, ig))
95
+ walked.push(f);
96
+ walkSpin.succeed(`Walked ${walked.length} files`);
97
+ if (walked.length === 0) {
98
+ console.log(chalk.yellow('✗ nothing to push — every file is ignored or the folder is empty'));
99
+ process.exit(1);
100
+ }
101
+ const hashSpin = ora('Hashing files…').start();
102
+ let files;
103
+ try {
104
+ files = await buildManifest(walked);
105
+ }
106
+ catch (e) {
107
+ hashSpin.fail(e.message);
108
+ process.exit(1);
109
+ return;
110
+ }
111
+ const totalBytes = files.reduce((n, f) => n + f.size, 0);
112
+ hashSpin.succeed(`Hashed ${files.length} files (${formatBytes(totalBytes)})`);
113
+ if (opts.dryRun) {
114
+ if (opts.json) {
115
+ console.log(JSON.stringify({ files, total_bytes: totalBytes, file_count: files.length }, null, 2));
116
+ }
117
+ else {
118
+ for (const f of files)
119
+ console.log(`${f.sha256.slice(0, 12)} ${formatBytes(f.size).padStart(8)} ${f.path}`);
120
+ console.log(chalk.gray(`-- ${files.length} files, ${formatBytes(totalBytes)} total`));
121
+ }
122
+ return;
123
+ }
124
+ // Lookup table absPath by sha256 — picking any one path per sha is fine since
125
+ // content-addressed blobs are by sha, not by path.
126
+ const absBySha = new Map();
127
+ for (let i = 0; i < walked.length; i++)
128
+ absBySha.set(files[i].sha256, walked[i].absPath);
129
+ // Upload missing blobs serially. (Parallelization can come later — see Task 7 notes.)
130
+ const uploadMissing = async (missing, label) => {
131
+ for (let i = 0; i < missing.length; i++) {
132
+ const m = missing[i];
133
+ const abs = absBySha.get(m.sha256);
134
+ if (!abs) {
135
+ console.log(chalk.red(`✗ server asked for blob ${m.sha256} that isn't in our manifest`));
136
+ process.exit(1);
137
+ }
138
+ const upSpin = ora(`${label} ${i + 1}/${missing.length} ${m.sha256.slice(0, 12)}…`).start();
139
+ try {
140
+ const buf = await fs.readFile(abs);
141
+ await uploadBlob(m.uploadUrl, buf);
142
+ upSpin.succeed();
143
+ }
144
+ catch (e) {
145
+ upSpin.fail(e.message);
146
+ process.exit(1);
147
+ }
148
+ }
149
+ };
150
+ const prepSpin = ora('Preparing snapshot…').start();
151
+ let prep;
152
+ try {
153
+ prep = await repoApi.prepare(appId, opts.message === undefined ? { files } : { files, message: opts.message });
154
+ }
155
+ catch (e) {
156
+ prepSpin.fail(e.message);
157
+ process.exit(1);
158
+ return;
159
+ }
160
+ prepSpin.succeed(`Snapshot id ${prep.snapshot_id.slice(0, 12)} — ${prep.missing_blobs.length} new blobs to upload`);
161
+ await uploadMissing(prep.missing_blobs, 'Uploading');
162
+ const requestBody = opts.message === undefined ? { files } : { files, message: opts.message };
163
+ const commitSpin = ora('Committing snapshot…').start();
164
+ let commitRes;
165
+ try {
166
+ commitRes = await repoApi.commit(appId, requestBody);
167
+ }
168
+ catch (e) {
169
+ const status = e?.status;
170
+ const details = e?.details;
171
+ const recoverable = status === 409 && (details?.missing_shas?.length || details?.size_mismatches?.length);
172
+ if (!recoverable) {
173
+ commitSpin.fail(e.message);
174
+ process.exit(1);
175
+ return;
176
+ }
177
+ // Retry path: re-prepare to get fresh presigned URLs for whatever the server still wants.
178
+ const stillMissing = new Set([
179
+ ...(details?.missing_shas ?? []),
180
+ ...(details?.size_mismatches?.map(s => s.sha256) ?? []),
181
+ ]);
182
+ commitSpin.warn(`Commit returned 409 for ${stillMissing.size} blob(s). Re-uploading and retrying once…`);
183
+ let reprep;
184
+ try {
185
+ reprep = await repoApi.prepare(appId, requestBody);
186
+ }
187
+ catch (e2) {
188
+ console.log(chalk.red(`✗ re-prepare failed: ${e2.message}`));
189
+ process.exit(1);
190
+ return;
191
+ }
192
+ await uploadMissing(reprep.missing_blobs, 'Re-uploading');
193
+ try {
194
+ commitRes = await repoApi.commit(appId, requestBody);
195
+ }
196
+ catch (e2) {
197
+ console.log(chalk.red(`✗ commit still failing after retry: ${e2.message}`));
198
+ process.exit(1);
199
+ return;
200
+ }
201
+ }
202
+ commitSpin.succeed(`Committed ${commitRes.snapshot_id.slice(0, 12)} (${commitRes.file_count} files, ${formatBytes(commitRes.total_bytes)})`);
203
+ await setPinnedSnapshotId(commitRes.snapshot_id);
204
+ if (opts.json) {
205
+ console.log(JSON.stringify({ snapshot_id: commitRes.snapshot_id, total_bytes: commitRes.total_bytes, file_count: commitRes.file_count }, null, 2));
206
+ }
207
+ }
208
+ function formatBytes(n) {
209
+ if (n < 1024)
210
+ return `${n} B`;
211
+ if (n < 1024 * 1024)
212
+ return `${(n / 1024).toFixed(1)} KB`;
213
+ return `${(n / 1024 / 1024).toFixed(2)} MB`;
214
+ }
215
+ async function sha256File(absPath) {
216
+ try {
217
+ const buf = await fs.readFile(absPath);
218
+ return createHash('sha256').update(buf).digest('hex');
219
+ }
220
+ catch (e) {
221
+ if (e?.code === 'ENOENT')
222
+ return null;
223
+ throw e;
224
+ }
225
+ }
226
+ export async function repoPullCommand(opts) {
227
+ const appId = await requireBoundApp(opts);
228
+ const root = process.cwd();
229
+ const pinned = await getPinnedSnapshotId();
230
+ const latestSpin = ora('Fetching latest snapshot…').start();
231
+ let latest;
232
+ try {
233
+ latest = await repoApi.getLatest(appId);
234
+ }
235
+ catch (e) {
236
+ latestSpin.fail(e.message);
237
+ process.exit(1);
238
+ return;
239
+ }
240
+ latestSpin.succeed(`Remote latest: ${latest.snapshot_id.slice(0, 12)}`);
241
+ if (pinned === latest.snapshot_id) {
242
+ console.log(chalk.gray('Already up to date.'));
243
+ return;
244
+ }
245
+ // Build the set of paths in the new manifest for quick lookup, plus path → expected sha.
246
+ const wantedSha = new Map();
247
+ for (const f of latest.manifest.files)
248
+ wantedSha.set(f.path, f.sha256);
249
+ // Fetch the pinned manifest so we can reason about "files locally but not in latest".
250
+ // If pinned was pruned (404) or pinned is null, we can only safely delete on --force.
251
+ let pinnedManifestFiles = null;
252
+ if (pinned) {
253
+ try {
254
+ const p = await repoApi.getSnapshot(appId, pinned);
255
+ pinnedManifestFiles = p.manifest.files;
256
+ }
257
+ catch {
258
+ console.log(chalk.yellow(`⚠ pinned snapshot ${pinned.slice(0, 12)} no longer on server (pruned). Local untracked deletions will require --force.`));
259
+ }
260
+ }
261
+ const pinnedSha = new Map();
262
+ if (pinnedManifestFiles)
263
+ for (const f of pinnedManifestFiles)
264
+ pinnedSha.set(f.path, f.sha256);
265
+ // 1. Decide downloads (latest has it; local sha doesn't match).
266
+ const toDownload = [];
267
+ for (const f of latest.manifest.files) {
268
+ const localSha = await sha256File(path.join(root, f.path));
269
+ if (localSha !== f.sha256)
270
+ toDownload.push(f);
271
+ }
272
+ // 2. Decide deletions (local has it; latest doesn't).
273
+ const ig = await loadIgnoreRules(root);
274
+ const localFiles = [];
275
+ for await (const f of walkRepo(root, ig))
276
+ localFiles.push(f.relPath);
277
+ const toDelete = [];
278
+ const conflicts = [];
279
+ for (const lp of localFiles) {
280
+ if (wantedSha.has(lp))
281
+ continue;
282
+ const localSha = await sha256File(path.join(root, lp));
283
+ if (localSha === null)
284
+ continue;
285
+ const expectedPinned = pinnedSha.get(lp);
286
+ if (expectedPinned === undefined || expectedPinned === localSha) {
287
+ // Either we never knew about it (pinned doesn't include it — shouldn't happen for tracked files,
288
+ // but be permissive) or the user hasn't touched it since the pinned snapshot.
289
+ toDelete.push(lp);
290
+ }
291
+ else {
292
+ conflicts.push(lp);
293
+ }
294
+ }
295
+ if (conflicts.length > 0 && !opts.force) {
296
+ console.log(chalk.red(`✗ ${conflicts.length} local file(s) deleted on the remote but modified locally:`));
297
+ for (const p of conflicts)
298
+ console.log(` ${p}`);
299
+ console.log(chalk.gray('Re-run with --force to drop local changes for those files.'));
300
+ process.exit(1);
301
+ }
302
+ // With --force, the conflicts also get deleted.
303
+ if (opts.force)
304
+ for (const p of conflicts)
305
+ toDelete.push(p);
306
+ if (toDownload.length === 0 && toDelete.length === 0) {
307
+ // No file changes — just bump the pin and done.
308
+ await setPinnedSnapshotId(latest.snapshot_id);
309
+ console.log(chalk.gray('Nothing to change locally; pin updated.'));
310
+ return;
311
+ }
312
+ // Apply downloads.
313
+ for (let i = 0; i < toDownload.length; i++) {
314
+ const f = toDownload[i];
315
+ const dlSpin = ora(`Fetching ${i + 1}/${toDownload.length} ${f.path}`).start();
316
+ try {
317
+ const url = await repoApi.getBlobUrl(appId, f.sha256);
318
+ const buf = await downloadBlob(url.downloadUrl);
319
+ await fs.ensureDir(path.dirname(path.join(root, f.path)));
320
+ await fs.writeFile(path.join(root, f.path), buf);
321
+ dlSpin.succeed();
322
+ }
323
+ catch (e) {
324
+ dlSpin.fail(e.message);
325
+ process.exit(1);
326
+ }
327
+ }
328
+ // Apply deletes.
329
+ for (const p of toDelete) {
330
+ await fs.remove(path.join(root, p));
331
+ console.log(chalk.gray(` deleted ${p}`));
332
+ }
333
+ await setPinnedSnapshotId(latest.snapshot_id);
334
+ if (opts.json) {
335
+ console.log(JSON.stringify({
336
+ snapshot_id: latest.snapshot_id,
337
+ downloaded: toDownload.map(f => f.path),
338
+ deleted: toDelete,
339
+ }, null, 2));
340
+ }
341
+ else {
342
+ console.log(chalk.green(`✓ pulled snapshot ${latest.snapshot_id.slice(0, 12)} — ${toDownload.length} downloaded, ${toDelete.length} deleted`));
343
+ }
344
+ }
345
+ export async function repoStatusCommand(opts) {
346
+ const appId = await requireBoundApp(opts);
347
+ const root = process.cwd();
348
+ const pinned = await getPinnedSnapshotId();
349
+ let remoteLatest = null;
350
+ let remoteFiles = null; // path → { sha256, size }
351
+ try {
352
+ const latest = await repoApi.getLatest(appId);
353
+ remoteLatest = latest.snapshot_id;
354
+ remoteFiles = new Map(latest.manifest.files.map(f => [f.path, { sha256: f.sha256, size: f.size }]));
355
+ }
356
+ catch (e) {
357
+ // 404 = no snapshots yet. Anything else: surface.
358
+ const msg = String(e.message ?? '');
359
+ if (!msg.includes('404') && !/not found/i.test(msg))
360
+ throw e;
361
+ }
362
+ let pinnedFiles = null;
363
+ if (pinned) {
364
+ try {
365
+ const p = await repoApi.getSnapshot(appId, pinned);
366
+ pinnedFiles = new Map(p.manifest.files.map(f => [f.path, { sha256: f.sha256, size: f.size }]));
367
+ }
368
+ catch { /* pruned */ }
369
+ }
370
+ const ig = await loadIgnoreRules(root);
371
+ const baseline = pinnedFiles ?? remoteFiles ?? new Map();
372
+ const local = [];
373
+ for await (const f of walkRepo(root, ig)) {
374
+ const base = baseline.get(f.relPath);
375
+ if (base !== undefined && base.size !== f.size) {
376
+ // Sizes differ — definitively modified. Skip the read+hash.
377
+ local.push({ path: f.relPath, sha256: '__size_mismatch__' });
378
+ }
379
+ else {
380
+ const buf = await fs.readFile(f.absPath);
381
+ local.push({ path: f.relPath, sha256: createHash('sha256').update(buf).digest('hex') });
382
+ }
383
+ }
384
+ const localBy = new Map(local.map(f => [f.path, f.sha256]));
385
+ // Diff against pinned (or remote if no pin).
386
+ const files = [];
387
+ for (const f of local) {
388
+ const base = baseline.get(f.path);
389
+ if (base === undefined) {
390
+ files.push({ path: f.path, state: 'untracked' });
391
+ }
392
+ else if (base.sha256 !== f.sha256) {
393
+ files.push({ path: f.path, state: 'modified' });
394
+ }
395
+ else {
396
+ files.push({ path: f.path, state: 'unchanged' });
397
+ }
398
+ }
399
+ for (const [p] of baseline) {
400
+ if (!localBy.has(p))
401
+ files.push({ path: p, state: 'deleted' });
402
+ }
403
+ // Anything in remote that isn't in pinned or local → new since pin.
404
+ if (remoteFiles && pinnedFiles) {
405
+ for (const [p] of remoteFiles) {
406
+ if (!pinnedFiles.has(p) && !localBy.has(p))
407
+ files.push({ path: p, state: 'new' });
408
+ }
409
+ }
410
+ if (opts.json) {
411
+ console.log(JSON.stringify({
412
+ app_id: appId,
413
+ pinned_snapshot_id: pinned,
414
+ remote_latest_snapshot_id: remoteLatest,
415
+ files: files.filter(f => f.state !== 'unchanged'),
416
+ }, null, 2));
417
+ return;
418
+ }
419
+ console.log(`${chalk.bold('app')} ${appId}`);
420
+ console.log(`${chalk.bold('pinned')} ${pinned ? pinned.slice(0, 12) : chalk.gray('(none)')}`);
421
+ console.log(`${chalk.bold('remote')} ${remoteLatest ? remoteLatest.slice(0, 12) : chalk.gray('(no snapshots)')}`);
422
+ if (pinned && remoteLatest && pinned !== remoteLatest) {
423
+ console.log(chalk.yellow('⚠ pin is behind remote — run `butterbase repo pull`'));
424
+ }
425
+ console.log();
426
+ let printed = 0;
427
+ for (const f of files) {
428
+ if (f.state === 'unchanged')
429
+ continue;
430
+ printed++;
431
+ const tag = f.state === 'modified' ? chalk.yellow('M') :
432
+ f.state === 'untracked' ? chalk.cyan('?') :
433
+ f.state === 'deleted' ? chalk.red('D') :
434
+ chalk.green('N');
435
+ console.log(` ${tag} ${f.path}`);
436
+ }
437
+ if (printed === 0)
438
+ console.log(chalk.green('working tree clean'));
439
+ }
440
+ //# sourceMappingURL=repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../../src/commands/repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function templatesCommand(opts: {
2
+ q?: string;
3
+ sort?: string;
4
+ region?: string;
5
+ limit?: number;
6
+ offset?: number;
7
+ json?: boolean;
8
+ }): Promise<void>;
9
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/commands/templates.ts"],"names":[],"mappings":"AAaA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEhB"}
@@ -0,0 +1,74 @@
1
+ import chalk from 'chalk';
2
+ import { cloneApi } from '../lib/repo-api.js';
3
+ const VALID_SORT = new Set(['recent', 'popular']);
4
+ function truncate(s, max) {
5
+ return s.length > max ? s.slice(0, max - 1) + '…' : s;
6
+ }
7
+ function pad(s, width) {
8
+ return s.padEnd(width);
9
+ }
10
+ export async function templatesCommand(opts) {
11
+ if (opts.sort && !VALID_SORT.has(opts.sort)) {
12
+ console.error(`error: --sort must be 'recent' or 'popular', got '${opts.sort}'`);
13
+ process.exit(1);
14
+ return;
15
+ }
16
+ let result;
17
+ try {
18
+ result = await cloneApi.listTemplates({
19
+ q: opts.q,
20
+ sort: opts.sort,
21
+ region: opts.region,
22
+ limit: opts.limit,
23
+ offset: opts.offset,
24
+ });
25
+ }
26
+ catch (e) {
27
+ console.error(`error: ${e.message}`);
28
+ process.exit(1);
29
+ return;
30
+ }
31
+ if (opts.json) {
32
+ console.log(JSON.stringify(result, null, 2));
33
+ return;
34
+ }
35
+ if (!result.items.length) {
36
+ console.log(chalk.gray('No templates found.'));
37
+ return;
38
+ }
39
+ // Compute column widths.
40
+ const COL_APP_ID = Math.max(6, ...result.items.map(r => r.app_id.length));
41
+ const COL_NAME = Math.max(4, ...result.items.map(r => Math.min(r.name.length, 24)));
42
+ const COL_OWNER = Math.max(5, ...result.items.map(r => Math.min((r.owner_display_name ?? 'anonymous').length, 24)));
43
+ const COL_REGION = Math.max(6, ...result.items.map(r => r.region.length));
44
+ const COL_CLONES = 6;
45
+ const COL_TABLES = 6;
46
+ const COL_FUNCS = 9;
47
+ const header = [
48
+ pad('APP_ID', COL_APP_ID),
49
+ pad('NAME', COL_NAME),
50
+ pad('OWNER', COL_OWNER),
51
+ pad('REGION', COL_REGION),
52
+ pad('CLONES', COL_CLONES),
53
+ pad('TABLES', COL_TABLES),
54
+ pad('FUNCTIONS', COL_FUNCS),
55
+ ].join(' ');
56
+ console.log(chalk.dim(header));
57
+ for (const item of result.items) {
58
+ const ownerCell = item.owner_display_name
59
+ ? pad(truncate(item.owner_display_name, 24), COL_OWNER)
60
+ : chalk.dim(pad('anonymous', COL_OWNER));
61
+ const row = [
62
+ pad(item.app_id, COL_APP_ID),
63
+ pad(truncate(item.name, 24), COL_NAME),
64
+ ownerCell,
65
+ pad(item.region, COL_REGION),
66
+ pad(String(item.fork_count), COL_CLONES),
67
+ pad(String(item.schema_summary.table_count), COL_TABLES),
68
+ pad(String(item.schema_summary.function_count), COL_FUNCS),
69
+ ].join(' ');
70
+ console.log(row);
71
+ }
72
+ console.log(chalk.gray('Clone with: butterbase clone <APP_ID> [target_dir]'));
73
+ }
74
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/commands/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function visibilityCommand(mode: 'public' | 'private', opts: {
2
+ app?: string;
3
+ listed?: boolean;
4
+ unlisted?: boolean;
5
+ json?: boolean;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=visibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../../../src/commands/visibility.ts"],"names":[],"mappings":"AAKA,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,iBAyB7E"}
@@ -0,0 +1,32 @@
1
+ // submodules/butterbase-oss/packages/cli/src/commands/visibility.ts
2
+ import chalk from 'chalk';
3
+ import { setAppVisibility } from '../lib/api-client.js';
4
+ import { getCurrentAppId } from '../lib/config.js';
5
+ export async function visibilityCommand(mode, opts) {
6
+ const appId = opts.app ?? (await getCurrentAppId());
7
+ if (!appId) {
8
+ console.log(chalk.red('✗ no app — use `butterbase apps use <id>` or --app'));
9
+ process.exit(1);
10
+ }
11
+ if (mode !== 'public' && mode !== 'private') {
12
+ console.log(chalk.red(`✗ visibility must be "public" or "private" (got ${mode})`));
13
+ process.exit(1);
14
+ }
15
+ if (opts.listed && opts.unlisted) {
16
+ console.log(chalk.red('✗ --listed and --unlisted are mutually exclusive'));
17
+ process.exit(1);
18
+ }
19
+ const body = { visibility: mode };
20
+ if (opts.listed)
21
+ body.listed = true;
22
+ if (opts.unlisted)
23
+ body.listed = false;
24
+ const res = await setAppVisibility(appId, body);
25
+ if (opts.json) {
26
+ console.log(JSON.stringify(res, null, 2));
27
+ }
28
+ else {
29
+ console.log(chalk.green(`✓ ${appId} is now ${mode}${body.listed === false ? ' (unlisted)' : ''}`));
30
+ }
31
+ }
32
+ //# sourceMappingURL=visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility.js","sourceRoot":"","sources":["../../../src/commands/visibility.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAA0B,EAC1B,IAA4E;IAE5E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,IAAI,GAAG,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAA2D,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC1F,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACpC,IAAI,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IAEvC,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,KAAM,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACrG,CAAC;AACH,CAAC"}
@@ -275,4 +275,8 @@ export declare function cancelSubscription(appId: string): Promise<any>;
275
275
  export declare function purchase(appId: string, body: Record<string, unknown>): Promise<any>;
276
276
  export declare function listOrders(appId: string): Promise<any>;
277
277
  export declare function getOrder(appId: string, orderId: string): Promise<any>;
278
+ export declare function setAppVisibility(appId: string, body: {
279
+ visibility: 'public' | 'private';
280
+ listed?: boolean;
281
+ }): Promise<unknown>;
278
282
  //# sourceMappingURL=api-client.d.ts.map