start-command 0.27.1 → 0.28.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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # start-command
2
2
 
3
+ ## 0.28.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 38d1fe4: Add `--upload-log <id>` to upload a stored execution log with `gh-upload-log`, installing the uploader on demand when it is missing.
8
+
9
+ ## 0.27.2
10
+
11
+ ### Patch Changes
12
+
13
+ - Keep JavaScript CLI usage text in sync with Docker default-image behavior and
14
+ the checked documentation examples.
15
+
16
+ Fix Links Notation indentation for nested process ID arrays in status output and update JavaScript dependencies.
17
+
3
18
  ## 0.27.1
4
19
 
5
20
  ### Patch Changes
package/README.md CHANGED
@@ -11,21 +11,25 @@ JavaScript/Bun implementation of the [`start-command`](../README.md) CLI (`$`).
11
11
 
12
12
  ```bash
13
13
  bun install -g start-command
14
- # or, via npm:
14
+
15
+ # Also available from npm registries:
15
16
  npm install -g start-command
16
17
  ```
17
18
 
18
19
  ## Usage
19
20
 
20
21
  ```bash
22
+ $ echo "Hello World"
21
23
  $ ls -la
22
- $ npm test
24
+ $ bun test
23
25
  $ git status
24
26
  $ --list
25
27
  ```
26
28
 
27
29
  See the project-wide [README](../README.md), [docs/USAGE.md](../docs/USAGE.md),
28
- and [docs/PIPES.md](../docs/PIPES.md) for the full user-facing guide.
30
+ [docs/PIPES.md](../docs/PIPES.md), and
31
+ [docs/EXAMPLES.md](../docs/EXAMPLES.md) for the full user-facing guide and
32
+ checked examples.
29
33
 
30
34
  ## Development
31
35
 
package/bun.lock CHANGED
@@ -5,38 +5,42 @@
5
5
  "": {
6
6
  "name": "start-command",
7
7
  "dependencies": {
8
- "command-stream": "^0.8.3",
9
- "lino-objects-codec": "^0.1.1",
8
+ "command-stream": "^0.9.4",
9
+ "lino-objects-codec": "^0.4.0",
10
10
  },
11
11
  "devDependencies": {
12
- "@changesets/cli": "^2.29.7",
13
- "eslint": "^9.38.0",
12
+ "@changesets/cli": "^2.31.0",
13
+ "@eslint/js": "^10.0.1",
14
+ "eslint": "^10.3.0",
14
15
  "eslint-config-prettier": "^10.1.8",
15
- "eslint-plugin-prettier": "^5.5.4",
16
+ "eslint-plugin-prettier": "^5.5.5",
16
17
  "husky": "^9.1.7",
17
- "lint-staged": "^16.2.6",
18
- "prettier": "^3.6.2",
18
+ "lint-staged": "^17.0.4",
19
+ "prettier": "^3.8.3",
19
20
  },
20
21
  },
21
22
  },
23
+ "overrides": {
24
+ "flatted": "^3.4.2",
25
+ },
22
26
  "packages": {
23
27
  "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="],
24
28
 
25
- "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.0.14", "", { "dependencies": { "@changesets/config": "^3.1.2", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA=="],
29
+ "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.1", "", { "dependencies": { "@changesets/config": "^3.1.4", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA=="],
26
30
 
27
- "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="],
31
+ "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.10", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A=="],
28
32
 
29
33
  "@changesets/changelog-git": ["@changesets/changelog-git@0.2.1", "", { "dependencies": { "@changesets/types": "^6.1.0" } }, "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q=="],
30
34
 
31
- "@changesets/cli": ["@changesets/cli@2.29.8", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.14", "@changesets/assemble-release-plan": "^6.0.9", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.2", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.14", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA=="],
35
+ "@changesets/cli": ["@changesets/cli@2.31.0", "", { "dependencies": { "@changesets/apply-release-plan": "^7.1.1", "@changesets/assemble-release-plan": "^6.0.10", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.4", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/get-release-plan": "^4.0.16", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg=="],
32
36
 
33
- "@changesets/config": ["@changesets/config@3.1.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/logger": "^0.1.1", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog=="],
37
+ "@changesets/config": ["@changesets/config@3.1.4", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.4", "@changesets/logger": "^0.1.1", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q=="],
34
38
 
35
39
  "@changesets/errors": ["@changesets/errors@0.2.0", "", { "dependencies": { "extendable-error": "^0.1.5" } }, "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow=="],
36
40
 
37
- "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ=="],
41
+ "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.4", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg=="],
38
42
 
39
- "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.14", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.9", "@changesets/config": "^3.1.2", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.6", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g=="],
43
+ "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.16", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.10", "@changesets/config": "^3.1.4", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.7", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g=="],
40
44
 
41
45
  "@changesets/get-version-range-type": ["@changesets/get-version-range-type@0.4.0", "", {}, "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ=="],
42
46
 
@@ -44,11 +48,11 @@
44
48
 
45
49
  "@changesets/logger": ["@changesets/logger@0.1.1", "", { "dependencies": { "picocolors": "^1.1.0" } }, "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg=="],
46
50
 
47
- "@changesets/parse": ["@changesets/parse@0.4.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA=="],
51
+ "@changesets/parse": ["@changesets/parse@0.4.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A=="],
48
52
 
49
53
  "@changesets/pre": ["@changesets/pre@2.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1" } }, "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug=="],
50
54
 
51
- "@changesets/read": ["@changesets/read@0.6.6", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.2", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg=="],
55
+ "@changesets/read": ["@changesets/read@0.6.7", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.3", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA=="],
52
56
 
53
57
  "@changesets/should-skip-package": ["@changesets/should-skip-package@0.1.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw=="],
54
58
 
@@ -60,19 +64,17 @@
60
64
 
61
65
  "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
62
66
 
63
- "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="],
64
-
65
- "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="],
67
+ "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="],
66
68
 
67
- "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="],
69
+ "@eslint/config-helpers": ["@eslint/config-helpers@0.5.5", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w=="],
68
70
 
69
- "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="],
71
+ "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="],
70
72
 
71
- "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="],
73
+ "@eslint/js": ["@eslint/js@10.0.1", "", { "peerDependencies": { "eslint": "^10.0.0" }, "optionalPeers": ["eslint"] }, "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA=="],
72
74
 
73
- "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="],
75
+ "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="],
74
76
 
75
- "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="],
77
+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.1", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ=="],
76
78
 
77
79
  "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
78
80
 
@@ -96,17 +98,19 @@
96
98
 
97
99
  "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="],
98
100
 
101
+ "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="],
102
+
99
103
  "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
100
104
 
101
105
  "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
102
106
 
103
107
  "@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="],
104
108
 
105
- "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
109
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
106
110
 
107
111
  "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
108
112
 
109
- "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
113
+ "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
110
114
 
111
115
  "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="],
112
116
 
@@ -114,43 +118,27 @@
114
118
 
115
119
  "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
116
120
 
117
- "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
121
+ "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
118
122
 
119
123
  "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
120
124
 
121
125
  "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
122
126
 
123
- "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
127
+ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
124
128
 
125
129
  "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="],
126
130
 
127
- "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
131
+ "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="],
128
132
 
129
133
  "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
130
134
 
131
- "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
132
-
133
- "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
134
-
135
135
  "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="],
136
136
 
137
- "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="],
138
-
139
137
  "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
140
138
 
141
- "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="],
142
-
143
- "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
144
-
145
- "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
139
+ "cli-truncate": ["cli-truncate@5.2.0", "", { "dependencies": { "slice-ansi": "^8.0.0", "string-width": "^8.2.0" } }, "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw=="],
146
140
 
147
- "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="],
148
-
149
- "command-stream": ["command-stream@0.8.3", "", {}, "sha512-vwNf5AWLhD4awaYSIyjHEu7JrAMTu8BaJg1LIpE4HqTXFYtgzSTN/j1VnwHDTNz8sAG7zvZgtKYm9lmi4+0Z7Q=="],
150
-
151
- "commander": ["commander@14.0.2", "", {}, "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ=="],
152
-
153
- "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
141
+ "command-stream": ["command-stream@0.9.4", "", {}, "sha512-fFIUmpl7xtFv9QSNfuoowOG4xo6ATPZnO7/ANlyctgSVLDqBJRSQTv6xpJnAfudwBOVzuTqwVqr12JhxOj7ebQ=="],
154
142
 
155
143
  "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
156
144
 
@@ -170,21 +158,21 @@
170
158
 
171
159
  "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
172
160
 
173
- "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="],
161
+ "eslint": ["eslint@10.3.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.5.5", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw=="],
174
162
 
175
163
  "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="],
176
164
 
177
- "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.4", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg=="],
165
+ "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.5", "", { "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.11.12" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw=="],
178
166
 
179
- "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
167
+ "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="],
180
168
 
181
- "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
169
+ "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
182
170
 
183
- "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
171
+ "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="],
184
172
 
185
173
  "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
186
174
 
187
- "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
175
+ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
188
176
 
189
177
  "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
190
178
 
@@ -192,7 +180,7 @@
192
180
 
193
181
  "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
194
182
 
195
- "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
183
+ "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="],
196
184
 
197
185
  "extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="],
198
186
 
@@ -216,22 +204,18 @@
216
204
 
217
205
  "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
218
206
 
219
- "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
207
+ "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="],
220
208
 
221
209
  "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="],
222
210
 
223
- "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
211
+ "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="],
224
212
 
225
213
  "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
226
214
 
227
- "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
228
-
229
215
  "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
230
216
 
231
217
  "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
232
218
 
233
- "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
234
-
235
219
  "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="],
236
220
 
237
221
  "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="],
@@ -240,8 +224,6 @@
240
224
 
241
225
  "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
242
226
 
243
- "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
244
-
245
227
  "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
246
228
 
247
229
  "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
@@ -274,16 +256,14 @@
274
256
 
275
257
  "links-notation": ["links-notation@0.11.2", "", {}, "sha512-VPyELWBXpaCCiNPVeZhMbG7RuvOQR51nhqELK+s/rbSzKYhSs+tyiSOdQ7z8I7Kh3PLABF3bZETtWSFwx3vFfg=="],
276
258
 
277
- "lino-objects-codec": ["lino-objects-codec@0.1.1", "", { "dependencies": { "links-notation": "^0.11.0" } }, "sha512-URX1MAhHyVga5EkpUqDTMkX1D+HYBW3spgKh6vCneQnzOMLn09XooQOuBy0apbfwlqY5qHt2fpvRdT75dBn2Qw=="],
259
+ "lino-objects-codec": ["lino-objects-codec@0.4.0", "", { "dependencies": { "links-notation": "^0.11.0" } }, "sha512-LFSI8rrjyVp8raEsaoFNxnY9oS2SCz0UTYbeZXms+iHF1hGWuLk57kcKCk4KXnFf+/Z7kKz52oYYtII6JrpbBQ=="],
278
260
 
279
- "lint-staged": ["lint-staged@16.2.7", "", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="],
261
+ "lint-staged": ["lint-staged@17.0.4", "", { "dependencies": { "listr2": "^10.2.1", "picomatch": "^4.0.4", "string-argv": "^0.3.2", "tinyexec": "^1.1.2" }, "optionalDependencies": { "yaml": "^2.8.4" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-+rU9lSUyVOZ/hDUmRLVGzyS2v73cDdQjX+XQz1AaOdIE4RysLq0HoPW2HrrgeNCLklkhi904VBU1bmgWLHVnkA=="],
280
262
 
281
- "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="],
263
+ "listr2": ["listr2@10.2.1", "", { "dependencies": { "cli-truncate": "^5.2.0", "eventemitter3": "^5.0.4", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^10.0.0" } }, "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q=="],
282
264
 
283
265
  "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
284
266
 
285
- "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
286
-
287
267
  "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="],
288
268
 
289
269
  "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="],
@@ -294,14 +274,12 @@
294
274
 
295
275
  "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
296
276
 
297
- "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
277
+ "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
298
278
 
299
279
  "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
300
280
 
301
281
  "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
302
282
 
303
- "nano-spawn": ["nano-spawn@2.0.0", "", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="],
304
-
305
283
  "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
306
284
 
307
285
  "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
@@ -312,7 +290,7 @@
312
290
 
313
291
  "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="],
314
292
 
315
- "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
293
+ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
316
294
 
317
295
  "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
318
296
 
@@ -322,8 +300,6 @@
322
300
 
323
301
  "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="],
324
302
 
325
- "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
326
-
327
303
  "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
328
304
 
329
305
  "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
@@ -332,17 +308,15 @@
332
308
 
333
309
  "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
334
310
 
335
- "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
336
-
337
- "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="],
311
+ "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
338
312
 
339
313
  "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="],
340
314
 
341
315
  "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
342
316
 
343
- "prettier": ["prettier@3.7.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA=="],
317
+ "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="],
344
318
 
345
- "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="],
319
+ "prettier-linter-helpers": ["prettier-linter-helpers@1.0.1", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg=="],
346
320
 
347
321
  "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
348
322
 
@@ -374,7 +348,7 @@
374
348
 
375
349
  "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
376
350
 
377
- "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="],
351
+ "slice-ansi": ["slice-ansi@8.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" } }, "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg=="],
378
352
 
379
353
  "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="],
380
354
 
@@ -382,20 +356,18 @@
382
356
 
383
357
  "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="],
384
358
 
385
- "string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="],
359
+ "string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="],
386
360
 
387
361
  "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
388
362
 
389
363
  "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
390
364
 
391
- "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
392
-
393
- "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
394
-
395
- "synckit": ["synckit@0.11.11", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="],
365
+ "synckit": ["synckit@0.11.12", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ=="],
396
366
 
397
367
  "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="],
398
368
 
369
+ "tinyexec": ["tinyexec@1.1.2", "", {}, "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA=="],
370
+
399
371
  "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
400
372
 
401
373
  "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
@@ -408,9 +380,9 @@
408
380
 
409
381
  "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
410
382
 
411
- "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
383
+ "wrap-ansi": ["wrap-ansi@10.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "string-width": "^8.2.0", "strip-ansi": "^7.1.2" } }, "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ=="],
412
384
 
413
- "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="],
385
+ "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
414
386
 
415
387
  "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
416
388
 
@@ -430,28 +402,28 @@
430
402
 
431
403
  "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
432
404
 
433
- "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
405
+ "is-fullwidth-code-point/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
406
+
407
+ "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="],
434
408
 
435
409
  "log-update/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
436
410
 
437
- "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
411
+ "log-update/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
438
412
 
439
- "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
413
+ "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
440
414
 
441
- "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
415
+ "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
442
416
 
443
417
  "string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
444
418
 
445
- "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
446
-
447
- "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
448
-
449
419
  "wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
450
420
 
451
421
  "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
452
422
 
453
423
  "log-update/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
454
424
 
425
+ "log-update/wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
426
+
455
427
  "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
456
428
 
457
429
  "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
@@ -459,5 +431,9 @@
459
431
  "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
460
432
 
461
433
  "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
434
+
435
+ "log-update/wrap-ansi/string-width/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
436
+
437
+ "@manypkg/find-root/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
462
438
  }
463
439
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "start-command",
3
- "version": "0.27.1",
3
+ "version": "0.28.0",
4
4
  "description": "Gamification of coding, execute any command with ability to auto-report issues on GitHub",
5
5
  "main": "src/bin/cli.js",
6
6
  "exports": {
@@ -45,13 +45,14 @@
45
45
  },
46
46
  "homepage": "https://github.com/link-foundation/start#readme",
47
47
  "devDependencies": {
48
- "@changesets/cli": "^2.29.7",
49
- "eslint": "^9.38.0",
48
+ "@changesets/cli": "^2.31.0",
49
+ "@eslint/js": "^10.0.1",
50
+ "eslint": "^10.3.0",
50
51
  "eslint-config-prettier": "^10.1.8",
51
- "eslint-plugin-prettier": "^5.5.4",
52
+ "eslint-plugin-prettier": "^5.5.5",
52
53
  "husky": "^9.1.7",
53
- "lint-staged": "^16.2.6",
54
- "prettier": "^3.6.2"
54
+ "lint-staged": "^17.0.4",
55
+ "prettier": "^3.8.3"
55
56
  },
56
57
  "lint-staged": {
57
58
  "*.{js,mjs,cjs}": [
@@ -65,7 +66,10 @@
65
66
  ]
66
67
  },
67
68
  "dependencies": {
68
- "command-stream": "^0.8.3",
69
- "lino-objects-codec": "^0.1.1"
69
+ "command-stream": "^0.9.4",
70
+ "lino-objects-codec": "^0.4.0"
71
+ },
72
+ "overrides": {
73
+ "flatted": "^3.4.2"
70
74
  }
71
75
  }
package/src/bin/cli.js CHANGED
@@ -33,6 +33,7 @@ const { handleFailure } = require('../lib/failure-handler');
33
33
  const { ExecutionStore, ExecutionRecord } = require('../lib/execution-store');
34
34
  const { queryStatus, listExecutions } = require('../lib/status-formatter');
35
35
  const { ControlAction, controlExecution } = require('../lib/execution-control');
36
+ const { uploadExecutionLog } = require('../lib/log-uploader');
36
37
  const { printVersion } = require('../lib/version');
37
38
  const { createStartBlock, createFinishBlock } = require('../lib/output-blocks');
38
39
  const { runWithBunSpawn, runWithNodeSpawn } = require('../lib/spawn-helpers');
@@ -201,6 +202,12 @@ if (wrapperOptions.list) {
201
202
  process.exit(0);
202
203
  }
203
204
 
205
+ // Handle --upload-log flag
206
+ if (wrapperOptions.uploadLog) {
207
+ const exitCode = handleUploadLogQuery(wrapperOptions.uploadLog);
208
+ process.exit(exitCode);
209
+ }
210
+
204
211
  // Handle --stop flag
205
212
  if (wrapperOptions.stop !== null && wrapperOptions.stop !== undefined) {
206
213
  handleControlQuery(wrapperOptions.stop, ControlAction.STOP);
@@ -300,6 +307,16 @@ function handleListQuery(outputFormat) {
300
307
  }
301
308
  }
302
309
 
310
+ function handleUploadLogQuery(identifier) {
311
+ const result = uploadExecutionLog(getExecutionStore(), identifier);
312
+ if (result.success) {
313
+ return result.exitCode || 0;
314
+ }
315
+
316
+ console.error(`Error: ${result.error}`);
317
+ return result.exitCode || 1;
318
+ }
319
+
303
320
  function handleControlQuery(identifier, action) {
304
321
  const result = controlExecution(getExecutionStore(), identifier, action);
305
322
  if (result.success) {
@@ -890,7 +907,7 @@ async function runDirectWithCommandStream(
890
907
  // Using raw() to avoid auto-escaping that might interfere with complex shell commands
891
908
  const $cmd = $({ mirror: true, capture: true });
892
909
 
893
- let exitCode = 0;
910
+ let exitCode;
894
911
  try {
895
912
  writeLogFile(logFilePath, logContent);
896
913
  // Use raw() to pass the command without auto-escaping
@@ -905,34 +922,25 @@ async function runDirectWithCommandStream(
905
922
 
906
923
  // Collect output for log
907
924
  if (result.stdout) {
908
- logContent += result.stdout;
909
925
  appendLogFile(logFilePath, result.stdout);
910
926
  }
911
927
  if (result.stderr) {
912
- logContent += result.stderr;
913
928
  appendLogFile(logFilePath, result.stderr);
914
929
  }
915
930
  } catch (err) {
916
931
  exitCode = err.code || 1;
917
932
  const errorMessage = `Error executing command: ${err.message}`;
918
- logContent += `\n${errorMessage}\n`;
919
933
  appendLogFile(logFilePath, `\n${errorMessage}\n`);
920
934
  console.error(`\n${errorMessage}`);
921
935
  }
922
936
 
923
937
  const endTime = getTimestamp();
924
938
 
925
- // Log footer
926
- logContent += `\n${'='.repeat(50)}\n`;
927
- logContent += `Finished: ${endTime}\n`;
928
- logContent += `Exit Code: ${exitCode}\n`;
939
+ const logFooter = `\n${'='.repeat(50)}\nFinished: ${endTime}\nExit Code: ${exitCode}\n`;
929
940
 
930
941
  // Write log file
931
942
  try {
932
- appendLogFile(
933
- logFilePath,
934
- `\n${'='.repeat(50)}\nFinished: ${endTime}\nExit Code: ${exitCode}\n`
935
- );
943
+ appendLogFile(logFilePath, logFooter);
936
944
  } catch (err) {
937
945
  console.error(`\nWarning: Could not save log file: ${err.message}`);
938
946
  }
@@ -21,6 +21,7 @@
21
21
  * --verbose Enable verbose/debug output (sets START_VERBOSE=1)
22
22
  * --status <uuid> Show status of a previous command execution by UUID
23
23
  * --list List all tracked command executions
24
+ * --upload-log <uuid-or-session> Upload the stored log for a tracked execution
24
25
  * --output-format <format> Output format for status/list (links-notation, json, text)
25
26
  * --stop <uuid-or-session-name> Send CTRL+C/SIGINT to a detached execution
26
27
  * --terminate <uuid-or-session-name> Terminate a detached execution immediately
@@ -177,6 +178,7 @@ function parseArgs(args) {
177
178
  useCommandStream: false, // Use command-stream library for command execution
178
179
  status: null, // UUID to show status for
179
180
  list: false, // List all tracked execution records
181
+ uploadLog: null, // UUID/session name whose stored log should be uploaded
180
182
  outputFormat: null, // Output format for status/list (links-notation, json, text)
181
183
  stop: null, // UUID/session name to stop gracefully
182
184
  terminate: null, // UUID/session name to terminate immediately
@@ -450,6 +452,28 @@ function parseOption(args, index, options) {
450
452
  return 1;
451
453
  }
452
454
 
455
+ // --upload-log <uuid-or-session-name>
456
+ if (arg === '--upload-log') {
457
+ if (index + 1 < args.length && !args[index + 1].startsWith('-')) {
458
+ options.uploadLog = args[index + 1];
459
+ return 2;
460
+ } else {
461
+ throw new Error(`Option ${arg} requires a UUID or session name argument`);
462
+ }
463
+ }
464
+
465
+ // --upload-log=<value>
466
+ if (arg.startsWith('--upload-log=')) {
467
+ const value = arg.slice('--upload-log='.length);
468
+ if (!value) {
469
+ throw new Error(
470
+ `Option --upload-log requires a UUID or session name argument`
471
+ );
472
+ }
473
+ options.uploadLog = value;
474
+ return 1;
475
+ }
476
+
453
477
  // --stop <uuid-or-session-name>
454
478
  if (arg === '--stop') {
455
479
  if (index + 1 < args.length && !args[index + 1].startsWith('-')) {
@@ -724,6 +748,7 @@ function validateOptions(options) {
724
748
  const queryModes = [
725
749
  hasValue(options.status),
726
750
  options.list,
751
+ hasValue(options.uploadLog),
727
752
  hasValue(options.stop),
728
753
  hasValue(options.terminate),
729
754
  options.cleanup,
@@ -731,7 +756,7 @@ function validateOptions(options) {
731
756
 
732
757
  if (queryModes > 1) {
733
758
  throw new Error(
734
- 'Cannot combine --status, --list, --stop, --terminate, or --cleanup in the same invocation'
759
+ 'Cannot combine --status, --list, --upload-log, --stop, --terminate, or --cleanup in the same invocation'
735
760
  );
736
761
  }
737
762
 
@@ -120,7 +120,7 @@ function dockerPullImage(image) {
120
120
  console.log();
121
121
 
122
122
  let output = '';
123
- let success = false;
123
+ let success;
124
124
 
125
125
  try {
126
126
  // Run docker pull with inherited stdio for real-time output
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Helpers for uploading stored execution logs with gh-upload-log.
3
+ */
4
+
5
+ const fs = require('fs');
6
+ const os = require('os');
7
+ const path = require('path');
8
+ const { spawnSync } = require('child_process');
9
+
10
+ function isExecutable(filePath) {
11
+ try {
12
+ fs.accessSync(filePath, fs.constants.X_OK);
13
+ return true;
14
+ } catch {
15
+ return false;
16
+ }
17
+ }
18
+
19
+ function isCommandFile(filePath) {
20
+ if (process.platform === 'win32') {
21
+ return fs.existsSync(filePath);
22
+ }
23
+
24
+ return isExecutable(filePath);
25
+ }
26
+
27
+ function getPathCommandNames(commandName) {
28
+ if (process.platform !== 'win32' || path.extname(commandName)) {
29
+ return [commandName];
30
+ }
31
+
32
+ const extensions = (process.env.PATHEXT || '.COM;.EXE;.BAT;.CMD')
33
+ .split(';')
34
+ .filter(Boolean);
35
+
36
+ return [commandName, ...extensions.map((ext) => `${commandName}${ext}`)];
37
+ }
38
+
39
+ function resolveCommandFromPath(commandName) {
40
+ const pathValue = process.env.PATH || '';
41
+ for (const pathEntry of pathValue.split(path.delimiter)) {
42
+ if (!pathEntry) {
43
+ continue;
44
+ }
45
+
46
+ const directory = pathEntry.replace(/^"|"$/g, '');
47
+ for (const candidateName of getPathCommandNames(commandName)) {
48
+ const candidate = path.join(directory, candidateName);
49
+ if (isCommandFile(candidate)) {
50
+ return candidate;
51
+ }
52
+ }
53
+ }
54
+
55
+ return null;
56
+ }
57
+
58
+ function resolveCommand(commandName) {
59
+ const isWindows = process.platform === 'win32';
60
+ const lookupCommand = isWindows ? 'where' : 'which';
61
+ const pathMatch = resolveCommandFromPath(commandName);
62
+ if (pathMatch) {
63
+ return pathMatch;
64
+ }
65
+
66
+ try {
67
+ const result = spawnSync(lookupCommand, [commandName], {
68
+ encoding: 'utf8',
69
+ stdio: ['ignore', 'pipe', 'ignore'],
70
+ });
71
+ if (result.status === 0 && result.stdout.trim()) {
72
+ return result.stdout.trim().split(/\r?\n/)[0];
73
+ }
74
+ } catch {
75
+ // Fall through to common locations.
76
+ }
77
+
78
+ if (!isWindows && commandName === 'gh-upload-log') {
79
+ const bunGlobalPath = path.join(os.homedir(), '.bun', 'bin', commandName);
80
+ if (isExecutable(bunGlobalPath)) {
81
+ return bunGlobalPath;
82
+ }
83
+ }
84
+
85
+ return null;
86
+ }
87
+
88
+ function shouldRunThroughShell(command) {
89
+ return process.platform === 'win32' && /\.(cmd|bat)$/i.test(command);
90
+ }
91
+
92
+ function runCommand(command, args, options = {}) {
93
+ return spawnSync(command, args, {
94
+ ...options,
95
+ shell: shouldRunThroughShell(command),
96
+ });
97
+ }
98
+
99
+ function runInstall(command, displayName, args) {
100
+ console.log(
101
+ `gh-upload-log not found; installing with: ${displayName} ${args.join(' ')}`
102
+ );
103
+ const result = runCommand(command, args, { stdio: 'inherit' });
104
+ return result.status === 0;
105
+ }
106
+
107
+ function ensureGhUploadLogAvailable() {
108
+ const existing = resolveCommand('gh-upload-log');
109
+ if (existing) {
110
+ return { success: true, command: existing };
111
+ }
112
+
113
+ const installers = [
114
+ ['bun', ['install', '-g', 'gh-upload-log']],
115
+ ['npm', ['install', '-g', 'gh-upload-log']],
116
+ ];
117
+
118
+ for (const [command, args] of installers) {
119
+ const installer = resolveCommand(command);
120
+ if (!installer) {
121
+ continue;
122
+ }
123
+ if (runInstall(installer, command, args)) {
124
+ const installed = resolveCommand('gh-upload-log');
125
+ if (installed) {
126
+ return { success: true, command: installed };
127
+ }
128
+ }
129
+ }
130
+
131
+ return {
132
+ success: false,
133
+ error:
134
+ 'gh-upload-log is not installed and automatic installation did not make it available on PATH.',
135
+ };
136
+ }
137
+
138
+ function uploadLogPath(logPath) {
139
+ if (!logPath) {
140
+ return {
141
+ success: false,
142
+ error: 'Execution record does not have a log path.',
143
+ };
144
+ }
145
+ if (!fs.existsSync(logPath)) {
146
+ return { success: false, error: `Log file not found: ${logPath}` };
147
+ }
148
+
149
+ const availability = ensureGhUploadLogAvailable();
150
+ if (!availability.success) {
151
+ return availability;
152
+ }
153
+
154
+ const result = runCommand(availability.command, [logPath], {
155
+ stdio: 'inherit',
156
+ });
157
+
158
+ const exitCode =
159
+ result.status !== null && result.status !== undefined ? result.status : 1;
160
+ if (exitCode !== 0) {
161
+ return {
162
+ success: false,
163
+ exitCode,
164
+ error: `gh-upload-log exited with code ${exitCode}`,
165
+ };
166
+ }
167
+
168
+ return { success: true, exitCode: 0 };
169
+ }
170
+
171
+ function uploadExecutionLog(store, identifier) {
172
+ if (!store) {
173
+ return { success: false, error: 'Execution tracking is disabled.' };
174
+ }
175
+
176
+ const record = store.get(identifier);
177
+ if (!record) {
178
+ return {
179
+ success: false,
180
+ error: `No execution found with UUID or session name: ${identifier}`,
181
+ };
182
+ }
183
+
184
+ return uploadLogPath(record.logPath);
185
+ }
186
+
187
+ module.exports = {
188
+ ensureGhUploadLogAvailable,
189
+ resolveCommand,
190
+ uploadExecutionLog,
191
+ uploadLogPath,
192
+ };
@@ -425,12 +425,13 @@ function formatAsNestedLinksNotation(obj, indent = 2, depth = 0) {
425
425
  if (obj.length === 0) {
426
426
  return '()';
427
427
  }
428
- const indentStr = ' '.repeat(indent * (depth + 1));
428
+ const blockIndent = ' '.repeat(indent * depth);
429
+ const itemIndent = ' '.repeat(indent * (depth + 1));
429
430
  const items = obj.map((item) => {
430
431
  const formatted = formatAsNestedLinksNotation(item, indent, depth + 1);
431
- return `${indentStr}${formatted}`;
432
+ return `${itemIndent}${formatted}`;
432
433
  });
433
- return `(\n${items.join('\n')}\n${' '.repeat(indent * depth)})`;
434
+ return `${blockIndent}(\n${items.join('\n')}\n${blockIndent})`;
434
435
  }
435
436
 
436
437
  // Format objects
@@ -444,7 +445,8 @@ function formatAsNestedLinksNotation(obj, indent = 2, depth = 0) {
444
445
  .filter(([, value]) => value !== null && value !== undefined)
445
446
  .map(([key, value]) => {
446
447
  if (typeof value === 'object') {
447
- const nested = formatAsNestedLinksNotation(value, indent, depth + 1);
448
+ const nestedDepth = Array.isArray(value) ? depth + 2 : depth + 1;
449
+ const nested = formatAsNestedLinksNotation(value, indent, nestedDepth);
448
450
  return `${indentStr}${key}\n${nested}`;
449
451
  }
450
452
  const formattedValue = escapeForLinksNotation(value);
package/src/lib/usage.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /** Print usage information */
2
2
  function printUsage() {
3
- console.log(`Usage: $ [options] [--] <command> | $ --status <uuid> [--output-format <fmt>] | $ --list [--output-format <fmt>] | $ --stop <id> | $ --terminate <id>
3
+ console.log(`Usage: $ [options] [--] <command> | $ --status <uuid> [--output-format <fmt>] | $ --list [--output-format <fmt>] | $ --upload-log <id> | $ --stop <id> | $ --terminate <id>
4
4
 
5
5
  Options:
6
6
  --isolated, -i <env> Run in isolated environment (screen, tmux, docker, ssh)
@@ -9,7 +9,7 @@ Options:
9
9
  --session, -s <name> Session name for isolation
10
10
  --session-id <uuid> Session UUID for tracking (auto-generated if not provided)
11
11
  --session-name <uuid> Alias for --session-id
12
- --image <image> Docker image (required for docker isolation)
12
+ --image <image> Docker image (optional, defaults to OS-matched image)
13
13
  --endpoint <endpoint> SSH endpoint (required for ssh isolation, e.g., user@host)
14
14
  --isolated-user, -u [name] Create isolated user with same permissions
15
15
  --keep-user Keep isolated user after command completes
@@ -19,6 +19,7 @@ Options:
19
19
  --use-command-stream Use command-stream library for execution (experimental)
20
20
  --status <id> Show status of execution by UUID or session name (--output-format: links-notation|json|text)
21
21
  --list List all tracked executions (--output-format: links-notation|json|text)
22
+ --upload-log <id> Upload the stored log for an execution UUID or session name
22
23
  --stop <id> Send CTRL+C/SIGINT to a detached isolated execution
23
24
  --terminate <id> Terminate a detached isolated execution immediately
24
25
  --cleanup Clean up stale "executing" records (crashed/killed processes)
@@ -30,7 +31,8 @@ Examples:
30
31
  $ bun test
31
32
  $ --isolated tmux -- bun start
32
33
  $ -i screen -d bun start
33
- $ --isolated docker --image oven/bun:latest -- bun install
34
+ $ --isolated docker -- echo "hi" # uses OS-matched default image
35
+ $ --isolated docker --image ghcr.io/link-foundation/box-js:latest -- bun --version
34
36
  $ --isolated ssh --endpoint user@remote.server -- ls -la
35
37
  $ --isolated-user -- npm test # Create isolated user
36
38
  $ -u myuser -- npm start # Custom username
@@ -38,6 +40,7 @@ Examples:
38
40
  $ --isolated-user --keep-user -- npm start
39
41
  $ --list # List stored execution records
40
42
  $ --list --output-format json # List stored records as JSON
43
+ $ --upload-log my-screen-session # Upload stored execution log
41
44
  $ --stop my-screen-session # Ask detached execution to stop gracefully
42
45
  $ --terminate my-screen-session # Terminate detached execution immediately
43
46
  $ --use-command-stream echo "Hello" # Use command-stream library`);
@@ -59,7 +62,7 @@ Examples:
59
62
  ' - Auto-reports failures for NPM packages (when gh is available)'
60
63
  );
61
64
  console.log(' - Natural language command aliases (via substitutions.lino)');
62
- console.log(' - Process isolation via screen, tmux, or docker');
65
+ console.log(' - Process isolation via screen, tmux, docker, or ssh');
63
66
  console.log('');
64
67
  console.log('Alias examples:');
65
68
  console.log(' $ install lodash npm package -> npm install lodash');
@@ -54,7 +54,13 @@ describe('control options', () => {
54
54
  it('should reject combining query and control modes', () => {
55
55
  assert.throws(() => {
56
56
  parseArgs(['--status', 'uuid-here', '--stop', 'my-session']);
57
- }, /Cannot combine --status, --list, --stop, --terminate, or --cleanup/);
57
+ }, /Cannot combine --status, --list, --upload-log, --stop, --terminate, or --cleanup/);
58
+ });
59
+
60
+ it('should reject combining upload-log with control modes', () => {
61
+ assert.throws(() => {
62
+ parseArgs(['--upload-log', 'uuid-here', '--terminate', 'my-session']);
63
+ }, /Cannot combine --status, --list, --upload-log, --stop, --terminate, or --cleanup/);
58
64
  });
59
65
 
60
66
  it('should reject output-format with control modes', () => {
@@ -832,6 +832,36 @@ describe('status option', () => {
832
832
  });
833
833
  });
834
834
 
835
+ describe('upload-log option', () => {
836
+ it('should parse --upload-log with UUID or session name', () => {
837
+ const result = parseArgs(['--upload-log', 'my-session']);
838
+ assert.strictEqual(result.wrapperOptions.uploadLog, 'my-session');
839
+ assert.strictEqual(result.command, '');
840
+ });
841
+
842
+ it('should parse --upload-log=value format', () => {
843
+ const result = parseArgs(['--upload-log=my-session']);
844
+ assert.strictEqual(result.wrapperOptions.uploadLog, 'my-session');
845
+ });
846
+
847
+ it('should throw error for missing --upload-log argument', () => {
848
+ assert.throws(() => {
849
+ parseArgs(['--upload-log']);
850
+ }, /requires a UUID or session name argument/);
851
+ });
852
+
853
+ it('should throw error for empty --upload-log=value argument', () => {
854
+ assert.throws(() => {
855
+ parseArgs(['--upload-log=']);
856
+ }, /requires a UUID or session name argument/);
857
+ });
858
+
859
+ it('should default uploadLog to null', () => {
860
+ const result = parseArgs(['echo', 'hello']);
861
+ assert.strictEqual(result.wrapperOptions.uploadLog, null);
862
+ });
863
+ });
864
+
835
865
  describe('list option', () => {
836
866
  it('should parse --list flag', () => {
837
867
  const result = parseArgs(['--list']);
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env sh
2
+ if [ "$1" = "-P" ] && [ "$2" = "667120" ]; then
3
+ printf '667121\n667122\n'
4
+ fi
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env sh
2
+ cat <<'EOF'
3
+ There is a screen on:
4
+ 667120.issue-126-screen (Detached)
5
+ 1 Socket in /run/screen/S-box.
6
+ EOF
@@ -402,6 +402,31 @@ describe('output-blocks module', () => {
402
402
  it('should handle null', () => {
403
403
  expect(formatAsNestedLinksNotation(null)).toBe('null');
404
404
  });
405
+
406
+ it('should indent nested arrays under their parent key', () => {
407
+ const obj = {
408
+ processIds: {
409
+ wrapperPid: 667105,
410
+ screenPid: 667120,
411
+ commandPids: [667121, 667122],
412
+ },
413
+ };
414
+
415
+ const result = formatAsNestedLinksNotation(obj);
416
+
417
+ expect(result).toContain(
418
+ [
419
+ ' processIds',
420
+ ' wrapperPid 667105',
421
+ ' screenPid 667120',
422
+ ' commandPids',
423
+ ' (',
424
+ ' 667121',
425
+ ' 667122',
426
+ ' )',
427
+ ].join('\n')
428
+ );
429
+ });
405
430
  });
406
431
 
407
432
  describe('Virtual Command API', () => {
@@ -32,7 +32,7 @@ function cleanupTestDir() {
32
32
 
33
33
  // Helper to run CLI command
34
34
  function runCli(args, env = {}) {
35
- const result = spawnSync('bun', [CLI_PATH, ...args], {
35
+ const result = spawnSync(process.execPath, [CLI_PATH, ...args], {
36
36
  encoding: 'utf8',
37
37
  env: {
38
38
  ...process.env,
@@ -48,6 +48,26 @@ function runCli(args, env = {}) {
48
48
  };
49
49
  }
50
50
 
51
+ function createExecutable(filePath, content) {
52
+ fs.writeFileSync(filePath, content, 'utf8');
53
+ fs.chmodSync(filePath, 0o755);
54
+ }
55
+
56
+ function createFakeUploader(fakeBin, outputPrefix) {
57
+ if (process.platform === 'win32') {
58
+ createExecutable(
59
+ path.join(fakeBin, 'gh-upload-log.cmd'),
60
+ `@echo off\r\necho ${outputPrefix}: %1\r\n`
61
+ );
62
+ return;
63
+ }
64
+
65
+ createExecutable(
66
+ path.join(fakeBin, 'gh-upload-log'),
67
+ `#!/bin/sh\necho "${outputPrefix}: $1"\n`
68
+ );
69
+ }
70
+
51
71
  describe('--status query functionality', () => {
52
72
  let store;
53
73
  let testRecord;
@@ -241,6 +261,88 @@ describe('--status query functionality', () => {
241
261
  });
242
262
  });
243
263
 
264
+ describe('--upload-log functionality', () => {
265
+ it('should run gh-upload-log with the stored execution log path', () => {
266
+ const fakeBin = fs.mkdtempSync(path.join(os.tmpdir(), 'upload-log-bin-'));
267
+ const logPath = path.join(TEST_APP_FOLDER, 'command.log');
268
+ fs.writeFileSync(logPath, 'captured command output\n', 'utf8');
269
+ createFakeUploader(fakeBin, 'fake uploader received');
270
+
271
+ testRecord.logPath = logPath;
272
+ store.save(testRecord);
273
+
274
+ const result = runCli(['--upload-log', testRecord.uuid], {
275
+ PATH: fakeBin,
276
+ HOME: fakeBin,
277
+ });
278
+
279
+ expect(result.exitCode).toBe(0);
280
+ expect(result.stdout).toContain(`fake uploader received: ${logPath}`);
281
+ expect(result.stderr).toBe('');
282
+
283
+ fs.rmSync(fakeBin, { recursive: true, force: true });
284
+ });
285
+
286
+ it('should install gh-upload-log when it is missing before uploading', () => {
287
+ if (process.platform === 'win32') {
288
+ console.log(' Skipping: shell fixture uses POSIX scripts');
289
+ return;
290
+ }
291
+
292
+ const fakeBin = fs.mkdtempSync(
293
+ path.join(os.tmpdir(), 'upload-log-install-bin-')
294
+ );
295
+ const installMarker = path.join(fakeBin, 'install.log');
296
+ const logPath = path.join(TEST_APP_FOLDER, 'install-command.log');
297
+ fs.writeFileSync(logPath, 'captured command output\n', 'utf8');
298
+
299
+ createExecutable(
300
+ path.join(fakeBin, 'bun'),
301
+ [
302
+ '#!/bin/sh',
303
+ `echo "$@" > "${installMarker}"`,
304
+ `cat > "${path.join(fakeBin, 'gh-upload-log')}" <<'SCRIPT'`,
305
+ '#!/bin/sh',
306
+ 'echo "installed uploader received: $1"',
307
+ 'SCRIPT',
308
+ `chmod +x "${path.join(fakeBin, 'gh-upload-log')}"`,
309
+ 'exit 0',
310
+ '',
311
+ ].join('\n')
312
+ );
313
+
314
+ testRecord.logPath = logPath;
315
+ store.save(testRecord);
316
+
317
+ const result = runCli(['--upload-log', testRecord.uuid], {
318
+ PATH: `${fakeBin}${path.delimiter}/usr/bin${path.delimiter}/bin`,
319
+ HOME: fakeBin,
320
+ });
321
+
322
+ expect(result.exitCode).toBe(0);
323
+ expect(fs.readFileSync(installMarker, 'utf8').trim()).toBe(
324
+ 'install -g gh-upload-log'
325
+ );
326
+ expect(result.stdout).toContain('gh-upload-log not found');
327
+ expect(result.stdout).toContain(
328
+ `installed uploader received: ${logPath}`
329
+ );
330
+
331
+ fs.rmSync(fakeBin, { recursive: true, force: true });
332
+ });
333
+
334
+ it('should show an error when the stored log file is missing', () => {
335
+ testRecord.logPath = path.join(TEST_APP_FOLDER, 'missing.log');
336
+ store.save(testRecord);
337
+
338
+ const result = runCli(['--upload-log', testRecord.uuid]);
339
+
340
+ expect(result.exitCode).toBe(1);
341
+ expect(result.stderr).toContain('Log file not found');
342
+ expect(result.stderr).toContain(testRecord.logPath);
343
+ });
344
+ });
345
+
244
346
  describe('executing status', () => {
245
347
  it('should show executing status for ongoing commands', () => {
246
348
  // Create an executing (not completed) record
@@ -328,6 +430,46 @@ describe('--status query functionality', () => {
328
430
  );
329
431
  });
330
432
 
433
+ it('should indent nested process ID arrays in links-notation', () => {
434
+ if (process.platform === 'win32') {
435
+ console.log(
436
+ ' Skipping: POSIX screen/pgrep process tree fixture is not available on Windows'
437
+ );
438
+ return;
439
+ }
440
+
441
+ const executingRecord = new ExecutionRecord({
442
+ command: 'sleep 100',
443
+ pid: 667105,
444
+ logPath: '/tmp/executing.log',
445
+ options: {
446
+ isolated: 'screen',
447
+ isolationMode: 'detached',
448
+ sessionName: 'issue-126-screen',
449
+ },
450
+ });
451
+ store.save(executingRecord);
452
+
453
+ const result = runCli(['--status', executingRecord.uuid], {
454
+ PATH: `${path.join(__dirname, 'fixtures', 'issue-126-bin')}${path.delimiter}${process.env.PATH}`,
455
+ });
456
+
457
+ expect(result.exitCode).toBe(0);
458
+ expect(result.stdout).toContain(
459
+ [
460
+ ' processIds',
461
+ ' wrapperPid 667105',
462
+ ' screenPid 667120',
463
+ ' commandPids',
464
+ ' (',
465
+ ' 667121',
466
+ ' 667122',
467
+ ' )',
468
+ ].join('\n')
469
+ );
470
+ expect(result.stdout).not.toContain('\n(\n');
471
+ });
472
+
331
473
  it('should include Current Time in text format for executing commands', () => {
332
474
  const executingRecord = new ExecutionRecord({
333
475
  command: 'sleep 100',