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 +15 -0
- package/README.md +7 -3
- package/bun.lock +70 -94
- package/package.json +12 -8
- package/src/bin/cli.js +20 -12
- package/src/lib/args-parser.js +26 -1
- package/src/lib/docker-utils.js +1 -1
- package/src/lib/log-uploader.js +192 -0
- package/src/lib/output-blocks.js +6 -4
- package/src/lib/usage.js +7 -4
- package/test/args-parser-control.js +7 -1
- package/test/args-parser.js +30 -0
- package/test/fixtures/issue-126-bin/pgrep +4 -0
- package/test/fixtures/issue-126-bin/screen +6 -0
- package/test/output-blocks.js +25 -0
- package/test/status-query.js +143 -1
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
|
-
|
|
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
|
-
$
|
|
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
|
-
|
|
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.
|
|
9
|
-
"lino-objects-codec": "^0.
|
|
8
|
+
"command-stream": "^0.9.4",
|
|
9
|
+
"lino-objects-codec": "^0.4.0",
|
|
10
10
|
},
|
|
11
11
|
"devDependencies": {
|
|
12
|
-
"@changesets/cli": "^2.
|
|
13
|
-
"eslint": "^
|
|
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.
|
|
16
|
+
"eslint-plugin-prettier": "^5.5.5",
|
|
16
17
|
"husky": "^9.1.7",
|
|
17
|
-
"lint-staged": "^
|
|
18
|
-
"prettier": "^3.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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/
|
|
69
|
+
"@eslint/config-helpers": ["@eslint/config-helpers@0.5.5", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w=="],
|
|
68
70
|
|
|
69
|
-
"@eslint/
|
|
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@
|
|
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@
|
|
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.
|
|
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.
|
|
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.
|
|
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@
|
|
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@
|
|
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@
|
|
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.
|
|
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
|
-
"
|
|
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@
|
|
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.
|
|
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@
|
|
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@
|
|
169
|
+
"eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
|
|
182
170
|
|
|
183
|
-
"espree": ["espree@
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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.
|
|
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.
|
|
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@
|
|
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
|
|
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
|
-
"
|
|
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@
|
|
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.
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
413
|
+
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
|
440
414
|
|
|
441
|
-
"
|
|
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.
|
|
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.
|
|
49
|
-
"eslint": "^
|
|
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.
|
|
52
|
+
"eslint-plugin-prettier": "^5.5.5",
|
|
52
53
|
"husky": "^9.1.7",
|
|
53
|
-
"lint-staged": "^
|
|
54
|
-
"prettier": "^3.
|
|
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.
|
|
69
|
-
"lino-objects-codec": "^0.
|
|
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
|
|
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
|
-
|
|
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
|
}
|
package/src/lib/args-parser.js
CHANGED
|
@@ -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
|
|
package/src/lib/docker-utils.js
CHANGED
|
@@ -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
|
+
};
|
package/src/lib/output-blocks.js
CHANGED
|
@@ -425,12 +425,13 @@ function formatAsNestedLinksNotation(obj, indent = 2, depth = 0) {
|
|
|
425
425
|
if (obj.length === 0) {
|
|
426
426
|
return '()';
|
|
427
427
|
}
|
|
428
|
-
const
|
|
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 `${
|
|
432
|
+
return `${itemIndent}${formatted}`;
|
|
432
433
|
});
|
|
433
|
-
return
|
|
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
|
|
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 (
|
|
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 --
|
|
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
|
|
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', () => {
|
package/test/args-parser.js
CHANGED
|
@@ -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']);
|
package/test/output-blocks.js
CHANGED
|
@@ -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', () => {
|
package/test/status-query.js
CHANGED
|
@@ -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(
|
|
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',
|