github-labels-template 0.7.0-staging.63849e1 → 0.8.0-patch.30e7740

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 (2) hide show
  1. package/dist/index.js +163 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/index.ts
4
- import { defineCommand as defineCommand7, runMain } from "citty";
4
+ import { defineCommand as defineCommand8, runMain } from "citty";
5
5
 
6
6
  // src/commands/apply.ts
7
7
  import { defineCommand } from "citty";
@@ -1230,13 +1230,17 @@ var check_default = defineCommand6({
1230
1230
  }
1231
1231
  });
1232
1232
 
1233
+ // src/commands/update.ts
1234
+ import { defineCommand as defineCommand7 } from "citty";
1235
+ import { execSync } from "child_process";
1236
+
1233
1237
  // src/ui/banner.ts
1234
1238
  import figlet from "figlet";
1235
1239
  import pc8 from "picocolors";
1236
1240
  // package.json
1237
1241
  var package_default = {
1238
1242
  name: "github-labels-template",
1239
- version: "0.7.0-staging.63849e1",
1243
+ version: "0.8.0-patch.30e7740",
1240
1244
  description: "A CLI tool to apply a curated GitHub labels template to any repository using gh CLI.",
1241
1245
  type: "module",
1242
1246
  bin: {
@@ -1300,6 +1304,19 @@ function getVersion() {
1300
1304
  function getAuthor() {
1301
1305
  return package_default.author ?? "unknown";
1302
1306
  }
1307
+ function showUpdateBanner(latestVersion) {
1308
+ const current = getVersion();
1309
+ const inner1 = ` Update available: v${current} → v${latestVersion} `;
1310
+ const inner2 = ` Run ${pc8.bold("ghlt update")} to upgrade. `;
1311
+ const visibleLen = (s) => s.replace(/\x1b\[[0-9;]*m/g, "").length;
1312
+ const width = Math.max(visibleLen(inner1), visibleLen(inner2));
1313
+ const line = "─".repeat(width);
1314
+ console.log(pc8.yellow(`┌${line}┐`));
1315
+ console.log(pc8.yellow("│") + pc8.bold(` Update available: v${current} → v${latestVersion} `) + " ".repeat(width - visibleLen(inner1)) + pc8.yellow("│"));
1316
+ console.log(pc8.yellow("│") + ` Run ${pc8.bold("ghlt update")} to upgrade. ` + " ".repeat(width - visibleLen(inner2)) + pc8.yellow("│"));
1317
+ console.log(pc8.yellow(`└${line}┘`));
1318
+ console.log();
1319
+ }
1303
1320
  function showBanner(minimal = false) {
1304
1321
  console.log(pc8.cyan(`
1305
1322
  ` + LOGO));
@@ -1314,10 +1331,151 @@ function showBanner(minimal = false) {
1314
1331
  console.log();
1315
1332
  }
1316
1333
 
1334
+ // src/utils/updater.ts
1335
+ import { existsSync as existsSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2, mkdirSync } from "fs";
1336
+ import { join } from "path";
1337
+ import { homedir } from "os";
1338
+ var CACHE_DIR = join(homedir(), ".ghlt");
1339
+ var CACHE_FILE = join(CACHE_DIR, "update-check.json");
1340
+ var CACHE_TTL_MS = 24 * 60 * 60 * 1000;
1341
+ var REGISTRY_URL = "https://registry.npmjs.org/github-labels-template/latest";
1342
+ function isNewerVersion(latest, current) {
1343
+ const parse = (v) => v.replace(/^v/, "").split(".").map(Number);
1344
+ const [lMaj, lMin, lPatch] = parse(latest);
1345
+ const [cMaj, cMin, cPatch] = parse(current);
1346
+ if (lMaj !== cMaj)
1347
+ return lMaj > cMaj;
1348
+ if (lMin !== cMin)
1349
+ return lMin > cMin;
1350
+ return lPatch > cPatch;
1351
+ }
1352
+ function readCache(cacheFile = CACHE_FILE) {
1353
+ try {
1354
+ if (!existsSync2(cacheFile))
1355
+ return null;
1356
+ const raw = readFileSync2(cacheFile, "utf-8");
1357
+ return JSON.parse(raw);
1358
+ } catch {
1359
+ return null;
1360
+ }
1361
+ }
1362
+ function writeCache(data, cacheFile = CACHE_FILE) {
1363
+ try {
1364
+ const dir = join(cacheFile, "..");
1365
+ if (!existsSync2(dir))
1366
+ mkdirSync(dir, { recursive: true });
1367
+ writeFileSync2(cacheFile, JSON.stringify(data), "utf-8");
1368
+ } catch {}
1369
+ }
1370
+ async function fetchLatestVersion() {
1371
+ try {
1372
+ const res = await fetch(REGISTRY_URL);
1373
+ if (!res.ok)
1374
+ return null;
1375
+ const data = await res.json();
1376
+ return data.version ?? null;
1377
+ } catch {
1378
+ return null;
1379
+ }
1380
+ }
1381
+ function refreshCacheInBackground(cacheFile = CACHE_FILE) {
1382
+ fetchLatestVersion().then((version) => {
1383
+ if (version) {
1384
+ writeCache({ lastChecked: Date.now(), latestVersion: version }, cacheFile);
1385
+ }
1386
+ }).catch(() => {});
1387
+ }
1388
+ function checkForUpdate(cacheFile = CACHE_FILE) {
1389
+ if (process.env.CI === "true" || process.env.CI === "1")
1390
+ return null;
1391
+ if (process.env.NO_UPDATE_NOTIFIER)
1392
+ return null;
1393
+ if (process.argv.includes("--no-update-notifier"))
1394
+ return null;
1395
+ const cache = readCache(cacheFile);
1396
+ const now = Date.now();
1397
+ const isStale = !cache || now - cache.lastChecked > CACHE_TTL_MS;
1398
+ if (isStale) {
1399
+ refreshCacheInBackground(cacheFile);
1400
+ }
1401
+ if (cache?.latestVersion && isNewerVersion(cache.latestVersion, getVersion())) {
1402
+ return cache.latestVersion;
1403
+ }
1404
+ return null;
1405
+ }
1406
+
1407
+ // src/commands/update.ts
1408
+ function detectPackageManager() {
1409
+ try {
1410
+ execSync("bun --version", { stdio: "ignore" });
1411
+ return "bun";
1412
+ } catch {
1413
+ return "npm";
1414
+ }
1415
+ }
1416
+ function getUpdateCommand(pm) {
1417
+ if (pm === "bun")
1418
+ return "bun add -g github-labels-template";
1419
+ return "npm install -g github-labels-template";
1420
+ }
1421
+ var update_default = defineCommand7({
1422
+ meta: {
1423
+ name: "update",
1424
+ description: "Update ghlt to the latest published version"
1425
+ },
1426
+ args: {
1427
+ check: {
1428
+ type: "boolean",
1429
+ default: false,
1430
+ description: "Only check if an update is available without installing"
1431
+ },
1432
+ "dry-run": {
1433
+ type: "boolean",
1434
+ default: false,
1435
+ description: "Alias for --check — report availability without updating"
1436
+ }
1437
+ },
1438
+ async run({ args }) {
1439
+ const current = getVersion();
1440
+ info(`Current version: v${current}`);
1441
+ const latest = await fetchLatestVersion();
1442
+ if (!latest) {
1443
+ error("Could not fetch the latest version. Check your internet connection.");
1444
+ process.exit(1);
1445
+ }
1446
+ info(`Latest version: v${latest}`);
1447
+ writeCache({ lastChecked: Date.now(), latestVersion: latest });
1448
+ if (!isNewerVersion(latest, current)) {
1449
+ success("Already on the latest version.");
1450
+ return;
1451
+ }
1452
+ if (args.check || args["dry-run"]) {
1453
+ info(`Update available: v${current} → v${latest}`);
1454
+ info(`Run 'ghlt update' to upgrade.`);
1455
+ return;
1456
+ }
1457
+ info("Updating ghlt...");
1458
+ try {
1459
+ const pm = detectPackageManager();
1460
+ const cmd = getUpdateCommand(pm);
1461
+ execSync(cmd, { stdio: "inherit" });
1462
+ success(`ghlt updated to v${latest}`);
1463
+ } catch {
1464
+ error("Update failed. Try running the update command manually:");
1465
+ console.log(` npm install -g github-labels-template`);
1466
+ process.exit(1);
1467
+ }
1468
+ }
1469
+ });
1470
+
1317
1471
  // src/index.ts
1318
1472
  var isHelp = process.argv.includes("--help") || process.argv.includes("-h");
1319
1473
  showBanner(isHelp);
1320
- var main = defineCommand7({
1474
+ var availableUpdate = checkForUpdate();
1475
+ if (availableUpdate) {
1476
+ showUpdateBanner(availableUpdate);
1477
+ }
1478
+ var main = defineCommand8({
1321
1479
  meta: {
1322
1480
  name: "ghlt",
1323
1481
  version: getVersion(),
@@ -1336,7 +1494,8 @@ var main = defineCommand7({
1336
1494
  migrate: migrate_default,
1337
1495
  generate: generate_default,
1338
1496
  list: list_default,
1339
- check: check_default
1497
+ check: check_default,
1498
+ update: update_default
1340
1499
  },
1341
1500
  run({ args }) {
1342
1501
  if (args.version) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-labels-template",
3
- "version": "0.7.0-staging.63849e1",
3
+ "version": "0.8.0-patch.30e7740",
4
4
  "description": "A CLI tool to apply a curated GitHub labels template to any repository using gh CLI.",
5
5
  "type": "module",
6
6
  "bin": {