alex-c-line 1.26.1 → 1.27.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License Copyright (c) 2026 alextheman231
2
+
3
+ Permission is hereby granted, free
4
+ of charge, to any person obtaining a copy of this software and associated
5
+ documentation files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use, copy, modify, merge,
7
+ publish, distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to the
9
+ following conditions:
10
+
11
+ The above copyright notice and this permission notice
12
+ (including the next paragraph) shall be included in all copies or substantial
13
+ portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
16
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
18
+ EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # alex-c-line
2
+
3
+ ![npm version](https://img.shields.io/npm/v/alex-c-line)
4
+ ![npm downloads](https://img.shields.io/npm/dm/alex-c-line)
5
+ ![npm license](https://img.shields.io/npm/l/alex-c-line)
6
+
7
+ [![CI](https://github.com/alextheman231/alex-c-line/actions/workflows/ci.yml/badge.svg)](https://github.com/alextheman231/alex-c-line/actions/workflows/ci.yml)
8
+ [![Publish to NPM Registry and GitHub Releases](https://github.com/alextheman231/alex-c-line/actions/workflows/publish.yml/badge.svg)](https://github.com/alextheman231/alex-c-line/actions/workflows/publish.yml)
9
+
10
+ <img src="./artwork/alex-c-line.png" alt="alex-c-line artwork" width=250 height=250>
11
+
12
+ This is my command-line tool, which serves as a developer toolkit that can be used in any repository to streamline the developer workflow. It provides a flexible configuration system so you can customise its behaviour to match your workflow.
13
+
14
+ `alex-c-line` is designed to be developer-first, opinionated where it matters, and safe by default, especially when mutating repository state.
15
+
16
+ ## Installation
17
+
18
+ To install the command-line tool, you can do this locally per working repository using the following command:
19
+
20
+ ```bash
21
+ npm install alex-c-line
22
+ ```
23
+
24
+ `npm` may be replaced with your package manager of choice.
25
+
26
+ Alternatively, you can install it globally for usage all throughout your system, in any working repository. This will allow you to then use `alex-c-line` in repositories that may not even necessarily support it directly, so you can still feel the benefits of some of the more context-agnostic commands.
27
+
28
+ ```bash
29
+ npm install -g alex-c-line
30
+ ```
31
+
32
+ ## Quick start
33
+
34
+ You can use any command by typing out `alex-c-line` in the terminal, followed by the command you want to run. For example:
35
+
36
+ ```bash
37
+ alex-c-line say-hello
38
+ ```
39
+
40
+ Some commands may even take extra arguments. For example:
41
+
42
+ ```bash
43
+ alex-c-line increment-version v1.2.3 major
44
+ ```
45
+
46
+ Flags may also be passed through in the following way.
47
+
48
+ ```bash
49
+ alex-c-line increment-version v1.2.3 major --no-prefix
50
+ ```
51
+
52
+ Note that for `use-local-package` specifically, you will need to add `--` before the local `alex-c-line` arguments to ensure that all flags get passed through correctly. Example:
53
+
54
+ ```bash
55
+ alex-c-line use-local-package alex-c-line -- increment-version v1.2.3 major --no-prefix
56
+ ```
57
+
58
+ ## Configs
59
+
60
+ Some commands also support usage of the config system. For example, `pre-commit-2` supports the `alex-c-line.config.js` file, and `use-local-package` supports the more user-specific `.alex-c-line.private.config.js` file. `alex-c-line.config.js` is intended for shared configurations per repository, whereas `.alex-c-line.private.config.js` are for configurations specific to the user's usage.
61
+
62
+ The `configs` subpath provides some helper functions and types that may be helpful when constructing these configs. Namely, `defineAlexCLineConfig` can be used as a type helper, so that you get better type hints in the editor.
63
+
64
+ ```javascript
65
+ import { defineAlexCLineConfig } from "alex-c-line/configs";
66
+
67
+ export default defineAlexCLineConfig({
68
+ createPullRequestTemplate: {
69
+ category: "general",
70
+ projectType: "package",
71
+ },
72
+ preCommit: {
73
+ packageManager: "pnpm",
74
+ steps: ["build", "format", "lint", "test"],
75
+ },
76
+ })
77
+ ```
78
+
79
+ Alternatively, you can create a TypeScript file, then build it to a pure JavaScript file, and the benefit of that is that you'd be able to use the types directly instead, which may be better as it even takes a type argument for the pre-commit steps.
80
+
81
+ ```typescript
82
+ import type { AlexCLineConfig } from "alex-c-line/configs";
83
+
84
+ import { scripts } from "./package.json" with { type: "json" };
85
+
86
+ const alexCLineConfig: AlexCLineConfig<keyof typeof scripts> = {
87
+ createPullRequestTemplate: {
88
+ category: "general",
89
+ projectType: "package",
90
+ },
91
+ preCommit: {
92
+ packageManager: "pnpm",
93
+ steps: ["build", "format", "lint", "test"],
94
+ },
95
+ };
96
+
97
+ export default alexCLineConfig;
98
+ ```
99
+
100
+ Note, however, that we do not support directly running config files with TypeScript just yet. This may be planned in the near future, but for now, building the pure TypeScript file to pure JavaScript and using that as the config file is the best bet as of now.
101
+
102
+ Private configs can be treated in the same way, except the type would be `AlexCLinePrivateConfig`, and the function `defineAlexCLinePrivateConfig`. Please also note that if you create a private config in a shared repository, it MUST be added to `.gitignore` so that it stays user-specific and does not get included in version control.
103
+
104
+ ## Documentation
105
+
106
+ A full documentation site is coming soon. In the meantime, you may run `alex-c-line --help` for more information about how to use all commands.
package/dist/index.cjs CHANGED
@@ -98,12 +98,12 @@ function centerLine(text, width) {
98
98
  //#endregion
99
99
  //#region src/utility/miscellaneous/createAlexCLineArtwork.ts
100
100
  async function createAlexCLineArtwork(options) {
101
- const { includeColors = true } = options ?? {};
101
+ const { includeColors = true, subtitleColor = chalk.default.green, subtitleText = "say my name and I'll assist ✓" } = options ?? {};
102
102
  const title = await (0, figlet.default)("alex-c-line");
103
- const subtitle = centerLine("say my name and I'll assist ✓", Math.max(...title.split("\n").map((line) => {
103
+ const subtitle = centerLine(subtitleText, Math.max(...title.split("\n").map((line) => {
104
104
  return line.length;
105
105
  })));
106
- return (0, boxen.default)(includeColors ? [chalk.default.yellow(title), chalk.default.green(subtitle)].join("\n") : [title, subtitle].join("\n"), {
106
+ return (0, boxen.default)(includeColors ? [chalk.default.yellow(title), subtitleColor(subtitle)].join("\n") : [title, subtitle].join("\n"), {
107
107
  padding: {
108
108
  top: 1,
109
109
  bottom: 1,
@@ -1250,32 +1250,207 @@ function setReleaseStatus2(program) {
1250
1250
  }
1251
1251
 
1252
1252
  //#endregion
1253
- //#region src/utility/cache/createAlexCLineCache.ts
1254
- async function createAlexCLineCache(cacheContents) {
1253
+ //#region package.json
1254
+ var name = "alex-c-line";
1255
+ var version = "1.27.0";
1256
+ var description = "Command-line tool with commands to streamline the developer workflow.";
1257
+ var package_default = {
1258
+ name,
1259
+ version,
1260
+ description,
1261
+ repository: {
1262
+ "type": "git",
1263
+ "url": "git+https://github.com/alextheman231/alex-c-line.git"
1264
+ },
1265
+ license: "MIT",
1266
+ author: "alextheman",
1267
+ type: "module",
1268
+ exports: {
1269
+ "./configs": {
1270
+ "types": "./dist/configs/index.d.ts",
1271
+ "require": "./dist/configs/index.cjs",
1272
+ "import": "./dist/configs/index.js",
1273
+ "default": "./dist/configs/index.js"
1274
+ },
1275
+ "./configs/internal": {
1276
+ "types": "./dist/configs/internal/index.d.ts",
1277
+ "require": "./dist/configs/internal/index.cjs",
1278
+ "import": "./dist/configs/internal/index.js",
1279
+ "default": "./dist/configs/internal/index.js"
1280
+ }
1281
+ },
1282
+ main: "dist/index.js",
1283
+ module: "dist/index.cjs",
1284
+ types: "dist/index.d.ts",
1285
+ bin: { "alex-c-line": "dist/index.js" },
1286
+ files: ["dist", "templates"],
1287
+ scripts: {
1288
+ "build": "tsdown",
1289
+ "command": "bash -c 'pnpm run build && echo && echo \"Command output:\" && node dist/index.js $@' --",
1290
+ "create-local-package": "pnpm run build && rm -f alex-c-line-*.tgz && pnpm pack",
1291
+ "create-release-note": "bash -c 'git pull origin main && pnpm run command create-release-note-2 $@' --",
1292
+ "format": "pnpm run format-prettier && pnpm run format-eslint",
1293
+ "format-eslint": "eslint --fix --suppress-all \"package.json\" \"src/**/*.ts\" \"tests/**/*.ts\" && rm -f eslint-suppressions.json",
1294
+ "format-prettier": "pnpm run format-prettier-typescript && pnpm run format-prettier-javascript && pnpm run format-prettier-yml",
1295
+ "format-prettier-javascript": "prettier --write \"./**/*.js\"",
1296
+ "format-prettier-typescript": "prettier --write --parser typescript \"./**/*.ts\"",
1297
+ "format-prettier-yml": "prettier --write \"./**/*.{yml,yaml}\"",
1298
+ "lint": "pnpm run lint-tsc && pnpm run lint-eslint && pnpm run lint-prettier",
1299
+ "lint-eslint": "eslint \"package.json\" \"src/**/*.ts\" \"tests/**/*.ts\"",
1300
+ "lint-prettier": "pnpm run lint-prettier-typescript && pnpm run lint-prettier-javascript && pnpm run lint-prettier-yml",
1301
+ "lint-prettier-javascript": "prettier --check \"./**.js\"",
1302
+ "lint-prettier-typescript": "prettier --check --parser typescript \"./**/*.ts\"",
1303
+ "lint-prettier-yml": "prettier --check \"./**/*.{yml,yaml}\"",
1304
+ "lint-tsc": "tsc --noEmit",
1305
+ "pre-commit": "pnpm run command pre-commit-2",
1306
+ "prepare": "husky",
1307
+ "prepare-live-eslint-plugin": "pnpm uninstall @alextheman/eslint-plugin && pnpm install --save-dev @alextheman/eslint-plugin",
1308
+ "prepare-live-utility": "pnpm uninstall @alextheman/utility && pnpm install @alextheman/utility",
1309
+ "prepare-local-eslint-plugin": "dotenv -e .env -- sh -c 'ESLINT_PLUGIN_PATH=${LOCAL_ESLINT_PLUGIN_PATH:-../eslint-plugin}; pnpm --prefix \"$ESLINT_PLUGIN_PATH\" run build && pnpm uninstall @alextheman/eslint-plugin && pnpm install --save-dev file:\"$ESLINT_PLUGIN_PATH\"'",
1310
+ "prepare-local-utility": "dotenv -e .env -- sh -c 'UTILITY_PATH=${LOCAL_UTILITY_PATH:-../utility}; pnpm --prefix \"$UTILITY_PATH\" run build && pnpm uninstall @alextheman/utility && pnpm install file:\"$UTILITY_PATH\"'",
1311
+ "test": "vitest run",
1312
+ "test-watch": "vitest",
1313
+ "update-dependencies": "pnpm update --latest && pnpm update",
1314
+ "use-live-eslint-plugin": "pnpm run prepare-live-eslint-plugin && pnpm run lint",
1315
+ "use-live-utility": "pnpm run prepare-live-utility",
1316
+ "use-local-eslint-plugin": "pnpm run prepare-local-eslint-plugin && pnpm run lint",
1317
+ "use-local-utility": "pnpm run prepare-local-utility"
1318
+ },
1319
+ dependencies: {
1320
+ "@alextheman/utility": "^4.16.2",
1321
+ "@inquirer/prompts": "^8.2.0",
1322
+ "boxen": "^8.0.1",
1323
+ "canvas": "^3.2.1",
1324
+ "chalk": "^5.6.2",
1325
+ "commander": "^14.0.3",
1326
+ "dotenv": "^17.3.1",
1327
+ "dotenv-stringify": "^3.0.1",
1328
+ "execa": "^9.6.1",
1329
+ "figlet": "^1.10.0",
1330
+ "gray-matter": "^4.0.3",
1331
+ "libsodium-wrappers": "^0.8.2",
1332
+ "supports-color": "^10.2.2",
1333
+ "update-notifier": "^7.3.1",
1334
+ "zod": "^4.3.6"
1335
+ },
1336
+ devDependencies: {
1337
+ "@alextheman/eslint-plugin": "^5.7.0",
1338
+ "@commander-js/extra-typings": "^14.0.0",
1339
+ "@types/eslint": "^9.6.1",
1340
+ "@types/node": "^25.2.3",
1341
+ "@types/update-notifier": "^6.0.8",
1342
+ "dotenv-cli": "^11.0.0",
1343
+ "eslint": "^10.0.0",
1344
+ "husky": "^9.1.7",
1345
+ "prettier": "^3.8.1",
1346
+ "tempy": "^3.2.0",
1347
+ "ts-node": "^10.9.2",
1348
+ "tsdown": "^0.20.3",
1349
+ "typescript": "^5.9.3",
1350
+ "vite-tsconfig-paths": "^6.1.1",
1351
+ "vitest": "^4.0.18"
1352
+ },
1353
+ packageManager: "pnpm@10.29.3+sha512.498e1fb4cca5aa06c1dcf2611e6fafc50972ffe7189998c409e90de74566444298ffe43e6cd2acdc775ba1aa7cc5e092a8b7054c811ba8c5770f84693d33d2dc",
1354
+ engines: { "node": ">=22.0.0" },
1355
+ pnpm: { "onlyBuiltDependencies": [
1356
+ "canvas",
1357
+ "core-js",
1358
+ "esbuild",
1359
+ "fsevents",
1360
+ "unrs-resolver"
1361
+ ] }
1362
+ };
1363
+
1364
+ //#endregion
1365
+ //#region src/commands/update/checkUpdate.ts
1366
+ async function checkUpdate(program) {
1367
+ const currentVersion = new _alextheman_utility.VersionNumber(version);
1368
+ const { stdout: npmViewResult } = await execa.execa`npm view alex-c-line version`;
1369
+ const latestVersion = new _alextheman_utility.VersionNumber(npmViewResult.trim());
1370
+ if (!_alextheman_utility.VersionNumber.isEqual(currentVersion, latestVersion)) {
1371
+ const message = _alextheman_utility.normaliseIndents`
1372
+ A new update of \`alex-c-line\` is available!
1373
+ ${currentVersion.toString()} → ${latestVersion.toString()}
1374
+ Run \`npm install -g alex-c-line@latest\` to update.
1375
+ `;
1376
+ const width = Math.max(...message.split("\n").map((line) => {
1377
+ return line.length;
1378
+ }));
1379
+ const messageWithArtwork = await createAlexCLineArtwork({
1380
+ includeColors: Boolean(supports_color.default.stdout),
1381
+ subtitleColor: chalk.default.white,
1382
+ subtitleText: message.split("\n").map((line) => {
1383
+ return centerLine(line, width);
1384
+ }).join("\n")
1385
+ });
1386
+ if (program) program.error(messageWithArtwork, {
1387
+ exitCode: 2,
1388
+ code: "OUTDATED_VERSION"
1389
+ });
1390
+ else console.info(messageWithArtwork);
1391
+ } else console.info(`alex-c-line is up to date (${currentVersion}).`);
1392
+ }
1393
+
1394
+ //#endregion
1395
+ //#region src/utility/errors/convertDataErrorToProgramError.ts
1396
+ function convertDataErrorToProgramError(dataError, programError, options) {
1397
+ programError(dataError.message, {
1398
+ exitCode: options?.exitCode ?? 1,
1399
+ code: dataError.code
1400
+ });
1401
+ }
1402
+
1403
+ //#endregion
1404
+ //#region src/utility/miscellaneous/parseZodSchemaForProgram.ts
1405
+ function parseZodSchemaForProgram(programError, schema, data) {
1406
+ try {
1407
+ return (0, _alextheman_utility.parseZodSchema)(schema, data);
1408
+ } catch (error) {
1409
+ if (_alextheman_utility.DataError.check(error)) convertDataErrorToProgramError(error, programError);
1410
+ throw error;
1411
+ }
1412
+ }
1413
+
1414
+ //#endregion
1415
+ //#region src/commands/update/index.ts
1416
+ const optionsSchema = zod.default.object({ check: zod.default.boolean().optional() });
1417
+ function update(program) {
1418
+ program.command("update").description("Handle updates of the currently installed alex-c-line").option("--check", "Check for available updates").action(async (rawOptions) => {
1419
+ if (parseZodSchemaForProgram(program.error, optionsSchema, rawOptions).check) await checkUpdate(program);
1420
+ else console.info("Unsupported option. Expected `--check`.");
1421
+ });
1422
+ }
1423
+
1424
+ //#endregion
1425
+ //#region src/cache/project/createAlexCLineProjectCache.ts
1426
+ async function createAlexCLineProjectCache(cacheContents) {
1255
1427
  const cacheFilePath = node_path.default.join(process.cwd(), ".alex-c-line", "cache.json");
1256
1428
  await (0, node_fs_promises.mkdir)(node_path.default.dirname(cacheFilePath), { recursive: true });
1257
1429
  await (0, node_fs_promises.writeFile)(cacheFilePath, JSON.stringify(cacheContents, void 0, 2));
1258
1430
  }
1259
1431
 
1260
1432
  //#endregion
1261
- //#region src/utility/cache/parseAlexCLineCache.ts
1262
- const alexCLineCacheSchema = zod.default.object({ useLocalPackage: zod.default.object({ dependencies: zod.default.record(zod.default.string(), zod.default.object({
1433
+ //#region src/cache/project/types/AlexCLineProjectCache.ts
1434
+ const alexCLineProjectCacheSchema = zod.default.object({ useLocalPackage: zod.default.object({ dependencies: zod.default.record(zod.default.string(), zod.default.object({
1263
1435
  currentVersion: zod.default.string(),
1264
1436
  previousVersion: zod.default.union([zod.default.instanceof(_alextheman_utility.VersionNumber), zod.default.string()]).transform((value) => {
1265
1437
  return value instanceof _alextheman_utility.VersionNumber ? value.toString({ omitPrefix: true }) : value;
1266
1438
  }),
1267
1439
  dependencyGroup: zod.default.enum(DependencyGroup)
1268
1440
  })) }).partial() }).partial();
1269
- function parseAlexCLineCache(data) {
1270
- return (0, _alextheman_utility.parseZodSchema)(alexCLineCacheSchema, data);
1441
+
1442
+ //#endregion
1443
+ //#region src/cache/project/parseAlexCLineCache.ts
1444
+ function parseAlexCLineProjectCache(data) {
1445
+ return (0, _alextheman_utility.parseZodSchema)(alexCLineProjectCacheSchema, data);
1271
1446
  }
1272
1447
 
1273
1448
  //#endregion
1274
- //#region src/utility/cache/loadAlexCLineCache.ts
1275
- async function loadAlexCLineCache(cachePath = node_path.default.join(".alex-c-line", "cache.json")) {
1449
+ //#region src/cache/project/loadAlexCLineProjectCache.ts
1450
+ async function loadAlexCLineProjectCache(cachePath = node_path.default.join(".alex-c-line", "cache.json")) {
1276
1451
  const fullCachePath = node_path.default.join(process.cwd(), cachePath);
1277
1452
  try {
1278
- return parseAlexCLineCache(JSON.parse(await (0, node_fs_promises.readFile)(fullCachePath, "utf-8")));
1453
+ return parseAlexCLineProjectCache(JSON.parse(await (0, node_fs_promises.readFile)(fullCachePath, "utf-8")));
1279
1454
  } catch (error) {
1280
1455
  if (error instanceof Error && "code" in error && error.code === "ENOENT") return null;
1281
1456
  throw error;
@@ -1417,7 +1592,7 @@ function useLocalPackage(program) {
1417
1592
  code: "LOCAL_ALEX_C_LINE_ERROR"
1418
1593
  });
1419
1594
  } else {
1420
- const cacheContents = await loadAlexCLineCache();
1595
+ const cacheContents = await loadAlexCLineProjectCache();
1421
1596
  if (!reverse) {
1422
1597
  if (prepareScript) await (0, execa.execa)({ cwd: localPackagePath })`${packageManager} run ${prepareScript}`;
1423
1598
  if (!keepOldTarballs) await removeAllTarballs(localPackagePath, packageName);
@@ -1446,7 +1621,7 @@ function useLocalPackage(program) {
1446
1621
  dependencyGroup,
1447
1622
  currentVersion: getDependenciesFromGroup(await getPackageJsonContents(process.cwd()) ?? {}, dependencyGroup)[packageName]
1448
1623
  };
1449
- await createAlexCLineCache({
1624
+ await createAlexCLineProjectCache({
1450
1625
  ...cacheContents ?? {},
1451
1626
  useLocalPackage: {
1452
1627
  ...cacheContents?.useLocalPackage,
@@ -1456,7 +1631,7 @@ function useLocalPackage(program) {
1456
1631
  }
1457
1632
  }
1458
1633
  });
1459
- } else await createAlexCLineCache({
1634
+ } else await createAlexCLineProjectCache({
1460
1635
  ...cacheContents ?? {},
1461
1636
  useLocalPackage: {
1462
1637
  ...cacheContents?.useLocalPackage,
@@ -1546,6 +1721,7 @@ function createCommands(program) {
1546
1721
  sayHello,
1547
1722
  setReleaseStatus,
1548
1723
  setReleaseStatus2,
1724
+ update,
1549
1725
  useLocalPackage
1550
1726
  });
1551
1727
  }
@@ -1573,118 +1749,6 @@ function formatError(error) {
1573
1749
  throw error;
1574
1750
  }
1575
1751
 
1576
- //#endregion
1577
- //#region package.json
1578
- var name = "alex-c-line";
1579
- var version = "1.26.1";
1580
- var description = "Command-line tool with commands to streamline the developer workflow.";
1581
- var package_default = {
1582
- name,
1583
- version,
1584
- description,
1585
- repository: {
1586
- "type": "git",
1587
- "url": "git+https://github.com/alextheman231/alex-c-line.git"
1588
- },
1589
- license: "ISC",
1590
- author: "alextheman",
1591
- type: "module",
1592
- exports: {
1593
- "./configs": {
1594
- "types": "./dist/configs/index.d.ts",
1595
- "require": "./dist/configs/index.cjs",
1596
- "import": "./dist/configs/index.js",
1597
- "default": "./dist/configs/index.js"
1598
- },
1599
- "./configs/internal": {
1600
- "types": "./dist/configs/internal/index.d.ts",
1601
- "require": "./dist/configs/internal/index.cjs",
1602
- "import": "./dist/configs/internal/index.js",
1603
- "default": "./dist/configs/internal/index.js"
1604
- }
1605
- },
1606
- main: "dist/index.js",
1607
- module: "dist/index.cjs",
1608
- types: "dist/index.d.ts",
1609
- bin: { "alex-c-line": "dist/index.js" },
1610
- files: ["dist", "templates"],
1611
- scripts: {
1612
- "build": "tsdown",
1613
- "command": "bash -c 'pnpm run build && echo && echo \"Command output:\" && node dist/index.js $@' --",
1614
- "create-local-package": "pnpm run build && rm -f alex-c-line-*.tgz && pnpm pack",
1615
- "create-release-note": "bash -c 'git pull origin main && pnpm run command create-release-note-2 $@' --",
1616
- "format": "pnpm run format-prettier && pnpm run format-eslint",
1617
- "format-eslint": "eslint --fix --suppress-all \"package.json\" \"src/**/*.ts\" \"tests/**/*.ts\" && rm -f eslint-suppressions.json",
1618
- "format-prettier": "pnpm run format-prettier-typescript && pnpm run format-prettier-javascript && pnpm run format-prettier-yml",
1619
- "format-prettier-javascript": "prettier --write \"./**/*.js\"",
1620
- "format-prettier-typescript": "prettier --write --parser typescript \"./**/*.ts\"",
1621
- "format-prettier-yml": "prettier --write \"./**/*.{yml,yaml}\"",
1622
- "lint": "pnpm run lint-tsc && pnpm run lint-eslint && pnpm run lint-prettier",
1623
- "lint-eslint": "eslint \"package.json\" \"src/**/*.ts\" \"tests/**/*.ts\"",
1624
- "lint-prettier": "pnpm run lint-prettier-typescript && pnpm run lint-prettier-javascript && pnpm run lint-prettier-yml",
1625
- "lint-prettier-javascript": "prettier --check \"./**.js\"",
1626
- "lint-prettier-typescript": "prettier --check --parser typescript \"./**/*.ts\"",
1627
- "lint-prettier-yml": "prettier --check \"./**/*.{yml,yaml}\"",
1628
- "lint-tsc": "tsc --noEmit",
1629
- "pre-commit": "pnpm run command pre-commit-2",
1630
- "prepare": "husky",
1631
- "prepare-live-eslint-plugin": "pnpm uninstall @alextheman/eslint-plugin && pnpm install --save-dev @alextheman/eslint-plugin",
1632
- "prepare-live-utility": "pnpm uninstall @alextheman/utility && pnpm install @alextheman/utility",
1633
- "prepare-local-eslint-plugin": "dotenv -e .env -- sh -c 'ESLINT_PLUGIN_PATH=${LOCAL_ESLINT_PLUGIN_PATH:-../eslint-plugin}; pnpm --prefix \"$ESLINT_PLUGIN_PATH\" run build && pnpm uninstall @alextheman/eslint-plugin && pnpm install --save-dev file:\"$ESLINT_PLUGIN_PATH\"'",
1634
- "prepare-local-utility": "dotenv -e .env -- sh -c 'UTILITY_PATH=${LOCAL_UTILITY_PATH:-../utility}; pnpm --prefix \"$UTILITY_PATH\" run build && pnpm uninstall @alextheman/utility && pnpm install file:\"$UTILITY_PATH\"'",
1635
- "test": "vitest run",
1636
- "test-watch": "vitest",
1637
- "update-dependencies": "pnpm update --latest && pnpm update",
1638
- "use-live-eslint-plugin": "pnpm run prepare-live-eslint-plugin && pnpm run lint",
1639
- "use-live-utility": "pnpm run prepare-live-utility",
1640
- "use-local-eslint-plugin": "pnpm run prepare-local-eslint-plugin && pnpm run lint",
1641
- "use-local-utility": "pnpm run prepare-local-utility"
1642
- },
1643
- dependencies: {
1644
- "@alextheman/utility": "^4.15.0",
1645
- "@inquirer/prompts": "^8.2.0",
1646
- "boxen": "^8.0.1",
1647
- "canvas": "^3.2.1",
1648
- "chalk": "^5.6.2",
1649
- "commander": "^14.0.3",
1650
- "dotenv": "^17.2.4",
1651
- "dotenv-stringify": "^3.0.1",
1652
- "execa": "^9.6.1",
1653
- "figlet": "^1.10.0",
1654
- "gray-matter": "^4.0.3",
1655
- "libsodium-wrappers": "^0.8.2",
1656
- "supports-color": "^10.2.2",
1657
- "update-notifier": "^7.3.1",
1658
- "zod": "^4.3.6"
1659
- },
1660
- devDependencies: {
1661
- "@alextheman/eslint-plugin": "^5.6.2",
1662
- "@commander-js/extra-typings": "^14.0.0",
1663
- "@types/eslint": "^9.6.1",
1664
- "@types/node": "^25.2.1",
1665
- "@types/update-notifier": "^6.0.8",
1666
- "dotenv-cli": "^11.0.0",
1667
- "eslint": "^10.0.0",
1668
- "husky": "^9.1.7",
1669
- "prettier": "^3.8.1",
1670
- "tempy": "^3.2.0",
1671
- "ts-node": "^10.9.2",
1672
- "tsdown": "^0.20.3",
1673
- "typescript": "^5.9.3",
1674
- "vite-tsconfig-paths": "^6.0.5",
1675
- "vitest": "^4.0.18"
1676
- },
1677
- packageManager: "pnpm@10.29.2+sha512.bef43fa759d91fd2da4b319a5a0d13ef7a45bb985a3d7342058470f9d2051a3ba8674e629672654686ef9443ad13a82da2beb9eeb3e0221c87b8154fff9d74b8",
1678
- engines: { "node": ">=22.0.0" },
1679
- pnpm: { "onlyBuiltDependencies": [
1680
- "canvas",
1681
- "core-js",
1682
- "esbuild",
1683
- "fsevents",
1684
- "unrs-resolver"
1685
- ] }
1686
- };
1687
-
1688
1752
  //#endregion
1689
1753
  //#region src/index.ts
1690
1754
  (async () => {
package/dist/index.js CHANGED
@@ -60,12 +60,12 @@ function centerLine(text, width) {
60
60
  //#endregion
61
61
  //#region src/utility/miscellaneous/createAlexCLineArtwork.ts
62
62
  async function createAlexCLineArtwork(options) {
63
- const { includeColors = true } = options ?? {};
63
+ const { includeColors = true, subtitleColor = chalk.green, subtitleText = "say my name and I'll assist ✓" } = options ?? {};
64
64
  const title = await figlet("alex-c-line");
65
- const subtitle = centerLine("say my name and I'll assist ✓", Math.max(...title.split("\n").map((line) => {
65
+ const subtitle = centerLine(subtitleText, Math.max(...title.split("\n").map((line) => {
66
66
  return line.length;
67
67
  })));
68
- return boxen(includeColors ? [chalk.yellow(title), chalk.green(subtitle)].join("\n") : [title, subtitle].join("\n"), {
68
+ return boxen(includeColors ? [chalk.yellow(title), subtitleColor(subtitle)].join("\n") : [title, subtitle].join("\n"), {
69
69
  padding: {
70
70
  top: 1,
71
71
  bottom: 1,
@@ -1212,32 +1212,207 @@ function setReleaseStatus2(program) {
1212
1212
  }
1213
1213
 
1214
1214
  //#endregion
1215
- //#region src/utility/cache/createAlexCLineCache.ts
1216
- async function createAlexCLineCache(cacheContents) {
1215
+ //#region package.json
1216
+ var name = "alex-c-line";
1217
+ var version = "1.27.0";
1218
+ var description = "Command-line tool with commands to streamline the developer workflow.";
1219
+ var package_default = {
1220
+ name,
1221
+ version,
1222
+ description,
1223
+ repository: {
1224
+ "type": "git",
1225
+ "url": "git+https://github.com/alextheman231/alex-c-line.git"
1226
+ },
1227
+ license: "MIT",
1228
+ author: "alextheman",
1229
+ type: "module",
1230
+ exports: {
1231
+ "./configs": {
1232
+ "types": "./dist/configs/index.d.ts",
1233
+ "require": "./dist/configs/index.cjs",
1234
+ "import": "./dist/configs/index.js",
1235
+ "default": "./dist/configs/index.js"
1236
+ },
1237
+ "./configs/internal": {
1238
+ "types": "./dist/configs/internal/index.d.ts",
1239
+ "require": "./dist/configs/internal/index.cjs",
1240
+ "import": "./dist/configs/internal/index.js",
1241
+ "default": "./dist/configs/internal/index.js"
1242
+ }
1243
+ },
1244
+ main: "dist/index.js",
1245
+ module: "dist/index.cjs",
1246
+ types: "dist/index.d.ts",
1247
+ bin: { "alex-c-line": "dist/index.js" },
1248
+ files: ["dist", "templates"],
1249
+ scripts: {
1250
+ "build": "tsdown",
1251
+ "command": "bash -c 'pnpm run build && echo && echo \"Command output:\" && node dist/index.js $@' --",
1252
+ "create-local-package": "pnpm run build && rm -f alex-c-line-*.tgz && pnpm pack",
1253
+ "create-release-note": "bash -c 'git pull origin main && pnpm run command create-release-note-2 $@' --",
1254
+ "format": "pnpm run format-prettier && pnpm run format-eslint",
1255
+ "format-eslint": "eslint --fix --suppress-all \"package.json\" \"src/**/*.ts\" \"tests/**/*.ts\" && rm -f eslint-suppressions.json",
1256
+ "format-prettier": "pnpm run format-prettier-typescript && pnpm run format-prettier-javascript && pnpm run format-prettier-yml",
1257
+ "format-prettier-javascript": "prettier --write \"./**/*.js\"",
1258
+ "format-prettier-typescript": "prettier --write --parser typescript \"./**/*.ts\"",
1259
+ "format-prettier-yml": "prettier --write \"./**/*.{yml,yaml}\"",
1260
+ "lint": "pnpm run lint-tsc && pnpm run lint-eslint && pnpm run lint-prettier",
1261
+ "lint-eslint": "eslint \"package.json\" \"src/**/*.ts\" \"tests/**/*.ts\"",
1262
+ "lint-prettier": "pnpm run lint-prettier-typescript && pnpm run lint-prettier-javascript && pnpm run lint-prettier-yml",
1263
+ "lint-prettier-javascript": "prettier --check \"./**.js\"",
1264
+ "lint-prettier-typescript": "prettier --check --parser typescript \"./**/*.ts\"",
1265
+ "lint-prettier-yml": "prettier --check \"./**/*.{yml,yaml}\"",
1266
+ "lint-tsc": "tsc --noEmit",
1267
+ "pre-commit": "pnpm run command pre-commit-2",
1268
+ "prepare": "husky",
1269
+ "prepare-live-eslint-plugin": "pnpm uninstall @alextheman/eslint-plugin && pnpm install --save-dev @alextheman/eslint-plugin",
1270
+ "prepare-live-utility": "pnpm uninstall @alextheman/utility && pnpm install @alextheman/utility",
1271
+ "prepare-local-eslint-plugin": "dotenv -e .env -- sh -c 'ESLINT_PLUGIN_PATH=${LOCAL_ESLINT_PLUGIN_PATH:-../eslint-plugin}; pnpm --prefix \"$ESLINT_PLUGIN_PATH\" run build && pnpm uninstall @alextheman/eslint-plugin && pnpm install --save-dev file:\"$ESLINT_PLUGIN_PATH\"'",
1272
+ "prepare-local-utility": "dotenv -e .env -- sh -c 'UTILITY_PATH=${LOCAL_UTILITY_PATH:-../utility}; pnpm --prefix \"$UTILITY_PATH\" run build && pnpm uninstall @alextheman/utility && pnpm install file:\"$UTILITY_PATH\"'",
1273
+ "test": "vitest run",
1274
+ "test-watch": "vitest",
1275
+ "update-dependencies": "pnpm update --latest && pnpm update",
1276
+ "use-live-eslint-plugin": "pnpm run prepare-live-eslint-plugin && pnpm run lint",
1277
+ "use-live-utility": "pnpm run prepare-live-utility",
1278
+ "use-local-eslint-plugin": "pnpm run prepare-local-eslint-plugin && pnpm run lint",
1279
+ "use-local-utility": "pnpm run prepare-local-utility"
1280
+ },
1281
+ dependencies: {
1282
+ "@alextheman/utility": "^4.16.2",
1283
+ "@inquirer/prompts": "^8.2.0",
1284
+ "boxen": "^8.0.1",
1285
+ "canvas": "^3.2.1",
1286
+ "chalk": "^5.6.2",
1287
+ "commander": "^14.0.3",
1288
+ "dotenv": "^17.3.1",
1289
+ "dotenv-stringify": "^3.0.1",
1290
+ "execa": "^9.6.1",
1291
+ "figlet": "^1.10.0",
1292
+ "gray-matter": "^4.0.3",
1293
+ "libsodium-wrappers": "^0.8.2",
1294
+ "supports-color": "^10.2.2",
1295
+ "update-notifier": "^7.3.1",
1296
+ "zod": "^4.3.6"
1297
+ },
1298
+ devDependencies: {
1299
+ "@alextheman/eslint-plugin": "^5.7.0",
1300
+ "@commander-js/extra-typings": "^14.0.0",
1301
+ "@types/eslint": "^9.6.1",
1302
+ "@types/node": "^25.2.3",
1303
+ "@types/update-notifier": "^6.0.8",
1304
+ "dotenv-cli": "^11.0.0",
1305
+ "eslint": "^10.0.0",
1306
+ "husky": "^9.1.7",
1307
+ "prettier": "^3.8.1",
1308
+ "tempy": "^3.2.0",
1309
+ "ts-node": "^10.9.2",
1310
+ "tsdown": "^0.20.3",
1311
+ "typescript": "^5.9.3",
1312
+ "vite-tsconfig-paths": "^6.1.1",
1313
+ "vitest": "^4.0.18"
1314
+ },
1315
+ packageManager: "pnpm@10.29.3+sha512.498e1fb4cca5aa06c1dcf2611e6fafc50972ffe7189998c409e90de74566444298ffe43e6cd2acdc775ba1aa7cc5e092a8b7054c811ba8c5770f84693d33d2dc",
1316
+ engines: { "node": ">=22.0.0" },
1317
+ pnpm: { "onlyBuiltDependencies": [
1318
+ "canvas",
1319
+ "core-js",
1320
+ "esbuild",
1321
+ "fsevents",
1322
+ "unrs-resolver"
1323
+ ] }
1324
+ };
1325
+
1326
+ //#endregion
1327
+ //#region src/commands/update/checkUpdate.ts
1328
+ async function checkUpdate(program) {
1329
+ const currentVersion = new VersionNumber(version);
1330
+ const { stdout: npmViewResult } = await execa`npm view alex-c-line version`;
1331
+ const latestVersion = new VersionNumber(npmViewResult.trim());
1332
+ if (!VersionNumber.isEqual(currentVersion, latestVersion)) {
1333
+ const message = normaliseIndents`
1334
+ A new update of \`alex-c-line\` is available!
1335
+ ${currentVersion.toString()} → ${latestVersion.toString()}
1336
+ Run \`npm install -g alex-c-line@latest\` to update.
1337
+ `;
1338
+ const width = Math.max(...message.split("\n").map((line) => {
1339
+ return line.length;
1340
+ }));
1341
+ const messageWithArtwork = await createAlexCLineArtwork({
1342
+ includeColors: Boolean(supportsColor.stdout),
1343
+ subtitleColor: chalk.white,
1344
+ subtitleText: message.split("\n").map((line) => {
1345
+ return centerLine(line, width);
1346
+ }).join("\n")
1347
+ });
1348
+ if (program) program.error(messageWithArtwork, {
1349
+ exitCode: 2,
1350
+ code: "OUTDATED_VERSION"
1351
+ });
1352
+ else console.info(messageWithArtwork);
1353
+ } else console.info(`alex-c-line is up to date (${currentVersion}).`);
1354
+ }
1355
+
1356
+ //#endregion
1357
+ //#region src/utility/errors/convertDataErrorToProgramError.ts
1358
+ function convertDataErrorToProgramError(dataError, programError, options) {
1359
+ programError(dataError.message, {
1360
+ exitCode: options?.exitCode ?? 1,
1361
+ code: dataError.code
1362
+ });
1363
+ }
1364
+
1365
+ //#endregion
1366
+ //#region src/utility/miscellaneous/parseZodSchemaForProgram.ts
1367
+ function parseZodSchemaForProgram(programError, schema, data) {
1368
+ try {
1369
+ return parseZodSchema(schema, data);
1370
+ } catch (error) {
1371
+ if (DataError.check(error)) convertDataErrorToProgramError(error, programError);
1372
+ throw error;
1373
+ }
1374
+ }
1375
+
1376
+ //#endregion
1377
+ //#region src/commands/update/index.ts
1378
+ const optionsSchema = z.object({ check: z.boolean().optional() });
1379
+ function update(program) {
1380
+ program.command("update").description("Handle updates of the currently installed alex-c-line").option("--check", "Check for available updates").action(async (rawOptions) => {
1381
+ if (parseZodSchemaForProgram(program.error, optionsSchema, rawOptions).check) await checkUpdate(program);
1382
+ else console.info("Unsupported option. Expected `--check`.");
1383
+ });
1384
+ }
1385
+
1386
+ //#endregion
1387
+ //#region src/cache/project/createAlexCLineProjectCache.ts
1388
+ async function createAlexCLineProjectCache(cacheContents) {
1217
1389
  const cacheFilePath = path.join(process.cwd(), ".alex-c-line", "cache.json");
1218
1390
  await mkdir(path.dirname(cacheFilePath), { recursive: true });
1219
1391
  await writeFile(cacheFilePath, JSON.stringify(cacheContents, void 0, 2));
1220
1392
  }
1221
1393
 
1222
1394
  //#endregion
1223
- //#region src/utility/cache/parseAlexCLineCache.ts
1224
- const alexCLineCacheSchema = z.object({ useLocalPackage: z.object({ dependencies: z.record(z.string(), z.object({
1395
+ //#region src/cache/project/types/AlexCLineProjectCache.ts
1396
+ const alexCLineProjectCacheSchema = z.object({ useLocalPackage: z.object({ dependencies: z.record(z.string(), z.object({
1225
1397
  currentVersion: z.string(),
1226
1398
  previousVersion: z.union([z.instanceof(VersionNumber), z.string()]).transform((value) => {
1227
1399
  return value instanceof VersionNumber ? value.toString({ omitPrefix: true }) : value;
1228
1400
  }),
1229
1401
  dependencyGroup: z.enum(DependencyGroup)
1230
1402
  })) }).partial() }).partial();
1231
- function parseAlexCLineCache(data) {
1232
- return parseZodSchema(alexCLineCacheSchema, data);
1403
+
1404
+ //#endregion
1405
+ //#region src/cache/project/parseAlexCLineCache.ts
1406
+ function parseAlexCLineProjectCache(data) {
1407
+ return parseZodSchema(alexCLineProjectCacheSchema, data);
1233
1408
  }
1234
1409
 
1235
1410
  //#endregion
1236
- //#region src/utility/cache/loadAlexCLineCache.ts
1237
- async function loadAlexCLineCache(cachePath = path.join(".alex-c-line", "cache.json")) {
1411
+ //#region src/cache/project/loadAlexCLineProjectCache.ts
1412
+ async function loadAlexCLineProjectCache(cachePath = path.join(".alex-c-line", "cache.json")) {
1238
1413
  const fullCachePath = path.join(process.cwd(), cachePath);
1239
1414
  try {
1240
- return parseAlexCLineCache(JSON.parse(await readFile(fullCachePath, "utf-8")));
1415
+ return parseAlexCLineProjectCache(JSON.parse(await readFile(fullCachePath, "utf-8")));
1241
1416
  } catch (error) {
1242
1417
  if (error instanceof Error && "code" in error && error.code === "ENOENT") return null;
1243
1418
  throw error;
@@ -1379,7 +1554,7 @@ function useLocalPackage(program) {
1379
1554
  code: "LOCAL_ALEX_C_LINE_ERROR"
1380
1555
  });
1381
1556
  } else {
1382
- const cacheContents = await loadAlexCLineCache();
1557
+ const cacheContents = await loadAlexCLineProjectCache();
1383
1558
  if (!reverse) {
1384
1559
  if (prepareScript) await execa({ cwd: localPackagePath })`${packageManager} run ${prepareScript}`;
1385
1560
  if (!keepOldTarballs) await removeAllTarballs(localPackagePath, packageName);
@@ -1408,7 +1583,7 @@ function useLocalPackage(program) {
1408
1583
  dependencyGroup,
1409
1584
  currentVersion: getDependenciesFromGroup(await getPackageJsonContents(process.cwd()) ?? {}, dependencyGroup)[packageName]
1410
1585
  };
1411
- await createAlexCLineCache({
1586
+ await createAlexCLineProjectCache({
1412
1587
  ...cacheContents ?? {},
1413
1588
  useLocalPackage: {
1414
1589
  ...cacheContents?.useLocalPackage,
@@ -1418,7 +1593,7 @@ function useLocalPackage(program) {
1418
1593
  }
1419
1594
  }
1420
1595
  });
1421
- } else await createAlexCLineCache({
1596
+ } else await createAlexCLineProjectCache({
1422
1597
  ...cacheContents ?? {},
1423
1598
  useLocalPackage: {
1424
1599
  ...cacheContents?.useLocalPackage,
@@ -1508,6 +1683,7 @@ function createCommands(program) {
1508
1683
  sayHello,
1509
1684
  setReleaseStatus,
1510
1685
  setReleaseStatus2,
1686
+ update,
1511
1687
  useLocalPackage
1512
1688
  });
1513
1689
  }
@@ -1535,118 +1711,6 @@ function formatError(error) {
1535
1711
  throw error;
1536
1712
  }
1537
1713
 
1538
- //#endregion
1539
- //#region package.json
1540
- var name = "alex-c-line";
1541
- var version = "1.26.1";
1542
- var description = "Command-line tool with commands to streamline the developer workflow.";
1543
- var package_default = {
1544
- name,
1545
- version,
1546
- description,
1547
- repository: {
1548
- "type": "git",
1549
- "url": "git+https://github.com/alextheman231/alex-c-line.git"
1550
- },
1551
- license: "ISC",
1552
- author: "alextheman",
1553
- type: "module",
1554
- exports: {
1555
- "./configs": {
1556
- "types": "./dist/configs/index.d.ts",
1557
- "require": "./dist/configs/index.cjs",
1558
- "import": "./dist/configs/index.js",
1559
- "default": "./dist/configs/index.js"
1560
- },
1561
- "./configs/internal": {
1562
- "types": "./dist/configs/internal/index.d.ts",
1563
- "require": "./dist/configs/internal/index.cjs",
1564
- "import": "./dist/configs/internal/index.js",
1565
- "default": "./dist/configs/internal/index.js"
1566
- }
1567
- },
1568
- main: "dist/index.js",
1569
- module: "dist/index.cjs",
1570
- types: "dist/index.d.ts",
1571
- bin: { "alex-c-line": "dist/index.js" },
1572
- files: ["dist", "templates"],
1573
- scripts: {
1574
- "build": "tsdown",
1575
- "command": "bash -c 'pnpm run build && echo && echo \"Command output:\" && node dist/index.js $@' --",
1576
- "create-local-package": "pnpm run build && rm -f alex-c-line-*.tgz && pnpm pack",
1577
- "create-release-note": "bash -c 'git pull origin main && pnpm run command create-release-note-2 $@' --",
1578
- "format": "pnpm run format-prettier && pnpm run format-eslint",
1579
- "format-eslint": "eslint --fix --suppress-all \"package.json\" \"src/**/*.ts\" \"tests/**/*.ts\" && rm -f eslint-suppressions.json",
1580
- "format-prettier": "pnpm run format-prettier-typescript && pnpm run format-prettier-javascript && pnpm run format-prettier-yml",
1581
- "format-prettier-javascript": "prettier --write \"./**/*.js\"",
1582
- "format-prettier-typescript": "prettier --write --parser typescript \"./**/*.ts\"",
1583
- "format-prettier-yml": "prettier --write \"./**/*.{yml,yaml}\"",
1584
- "lint": "pnpm run lint-tsc && pnpm run lint-eslint && pnpm run lint-prettier",
1585
- "lint-eslint": "eslint \"package.json\" \"src/**/*.ts\" \"tests/**/*.ts\"",
1586
- "lint-prettier": "pnpm run lint-prettier-typescript && pnpm run lint-prettier-javascript && pnpm run lint-prettier-yml",
1587
- "lint-prettier-javascript": "prettier --check \"./**.js\"",
1588
- "lint-prettier-typescript": "prettier --check --parser typescript \"./**/*.ts\"",
1589
- "lint-prettier-yml": "prettier --check \"./**/*.{yml,yaml}\"",
1590
- "lint-tsc": "tsc --noEmit",
1591
- "pre-commit": "pnpm run command pre-commit-2",
1592
- "prepare": "husky",
1593
- "prepare-live-eslint-plugin": "pnpm uninstall @alextheman/eslint-plugin && pnpm install --save-dev @alextheman/eslint-plugin",
1594
- "prepare-live-utility": "pnpm uninstall @alextheman/utility && pnpm install @alextheman/utility",
1595
- "prepare-local-eslint-plugin": "dotenv -e .env -- sh -c 'ESLINT_PLUGIN_PATH=${LOCAL_ESLINT_PLUGIN_PATH:-../eslint-plugin}; pnpm --prefix \"$ESLINT_PLUGIN_PATH\" run build && pnpm uninstall @alextheman/eslint-plugin && pnpm install --save-dev file:\"$ESLINT_PLUGIN_PATH\"'",
1596
- "prepare-local-utility": "dotenv -e .env -- sh -c 'UTILITY_PATH=${LOCAL_UTILITY_PATH:-../utility}; pnpm --prefix \"$UTILITY_PATH\" run build && pnpm uninstall @alextheman/utility && pnpm install file:\"$UTILITY_PATH\"'",
1597
- "test": "vitest run",
1598
- "test-watch": "vitest",
1599
- "update-dependencies": "pnpm update --latest && pnpm update",
1600
- "use-live-eslint-plugin": "pnpm run prepare-live-eslint-plugin && pnpm run lint",
1601
- "use-live-utility": "pnpm run prepare-live-utility",
1602
- "use-local-eslint-plugin": "pnpm run prepare-local-eslint-plugin && pnpm run lint",
1603
- "use-local-utility": "pnpm run prepare-local-utility"
1604
- },
1605
- dependencies: {
1606
- "@alextheman/utility": "^4.15.0",
1607
- "@inquirer/prompts": "^8.2.0",
1608
- "boxen": "^8.0.1",
1609
- "canvas": "^3.2.1",
1610
- "chalk": "^5.6.2",
1611
- "commander": "^14.0.3",
1612
- "dotenv": "^17.2.4",
1613
- "dotenv-stringify": "^3.0.1",
1614
- "execa": "^9.6.1",
1615
- "figlet": "^1.10.0",
1616
- "gray-matter": "^4.0.3",
1617
- "libsodium-wrappers": "^0.8.2",
1618
- "supports-color": "^10.2.2",
1619
- "update-notifier": "^7.3.1",
1620
- "zod": "^4.3.6"
1621
- },
1622
- devDependencies: {
1623
- "@alextheman/eslint-plugin": "^5.6.2",
1624
- "@commander-js/extra-typings": "^14.0.0",
1625
- "@types/eslint": "^9.6.1",
1626
- "@types/node": "^25.2.1",
1627
- "@types/update-notifier": "^6.0.8",
1628
- "dotenv-cli": "^11.0.0",
1629
- "eslint": "^10.0.0",
1630
- "husky": "^9.1.7",
1631
- "prettier": "^3.8.1",
1632
- "tempy": "^3.2.0",
1633
- "ts-node": "^10.9.2",
1634
- "tsdown": "^0.20.3",
1635
- "typescript": "^5.9.3",
1636
- "vite-tsconfig-paths": "^6.0.5",
1637
- "vitest": "^4.0.18"
1638
- },
1639
- packageManager: "pnpm@10.29.2+sha512.bef43fa759d91fd2da4b319a5a0d13ef7a45bb985a3d7342058470f9d2051a3ba8674e629672654686ef9443ad13a82da2beb9eeb3e0221c87b8154fff9d74b8",
1640
- engines: { "node": ">=22.0.0" },
1641
- pnpm: { "onlyBuiltDependencies": [
1642
- "canvas",
1643
- "core-js",
1644
- "esbuild",
1645
- "fsevents",
1646
- "unrs-resolver"
1647
- ] }
1648
- };
1649
-
1650
1714
  //#endregion
1651
1715
  //#region src/index.ts
1652
1716
  (async () => {
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "alex-c-line",
3
- "version": "1.26.1",
3
+ "version": "1.27.0",
4
4
  "description": "Command-line tool with commands to streamline the developer workflow.",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/alextheman231/alex-c-line.git"
8
8
  },
9
- "license": "ISC",
9
+ "license": "MIT",
10
10
  "author": "alextheman",
11
11
  "type": "module",
12
12
  "exports": {
@@ -34,13 +34,13 @@
34
34
  "templates"
35
35
  ],
36
36
  "dependencies": {
37
- "@alextheman/utility": "^4.15.0",
37
+ "@alextheman/utility": "^4.16.2",
38
38
  "@inquirer/prompts": "^8.2.0",
39
39
  "boxen": "^8.0.1",
40
40
  "canvas": "^3.2.1",
41
41
  "chalk": "^5.6.2",
42
42
  "commander": "^14.0.3",
43
- "dotenv": "^17.2.4",
43
+ "dotenv": "^17.3.1",
44
44
  "dotenv-stringify": "^3.0.1",
45
45
  "execa": "^9.6.1",
46
46
  "figlet": "^1.10.0",
@@ -51,10 +51,10 @@
51
51
  "zod": "^4.3.6"
52
52
  },
53
53
  "devDependencies": {
54
- "@alextheman/eslint-plugin": "^5.6.2",
54
+ "@alextheman/eslint-plugin": "^5.7.0",
55
55
  "@commander-js/extra-typings": "^14.0.0",
56
56
  "@types/eslint": "^9.6.1",
57
- "@types/node": "^25.2.1",
57
+ "@types/node": "^25.2.3",
58
58
  "@types/update-notifier": "^6.0.8",
59
59
  "dotenv-cli": "^11.0.0",
60
60
  "eslint": "^10.0.0",
@@ -64,7 +64,7 @@
64
64
  "ts-node": "^10.9.2",
65
65
  "tsdown": "^0.20.3",
66
66
  "typescript": "^5.9.3",
67
- "vite-tsconfig-paths": "^6.0.5",
67
+ "vite-tsconfig-paths": "^6.1.1",
68
68
  "vitest": "^4.0.18"
69
69
  },
70
70
  "engines": {