Skip to content

Commit 10b19e2

Browse files
Merge pull request #124 from ibuildthecloud/distribution
Add tools distribution for node
2 parents c1c0ce2 + 2e7c27f commit 10b19e2

File tree

8 files changed

+359
-12
lines changed

8 files changed

+359
-12
lines changed

pkg/repos/runtimes/default.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package runtimes
33
import (
44
"github.com/gptscript-ai/gptscript/pkg/engine"
55
"github.com/gptscript-ai/gptscript/pkg/repos"
6+
"github.com/gptscript-ai/gptscript/pkg/repos/runtimes/node"
67
"github.com/gptscript-ai/gptscript/pkg/repos/runtimes/python"
78
)
89

@@ -17,6 +18,10 @@ var Runtimes = []repos.Runtime{
1718
&python.Runtime{
1819
Version: "3.10",
1920
},
21+
&node.Runtime{
22+
Version: "21",
23+
Default: true,
24+
},
2025
}
2126

2227
func Default(cacheDir string) engine.RuntimeManager {

pkg/repos/runtimes/env/env.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package env
22

3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
)
8+
39
func execEquals(bin, check string) bool {
410
return bin == check ||
511
bin == check+".exe"
@@ -20,3 +26,15 @@ func Matches(cmd []string, bin string) bool {
2026
}
2127
return false
2228
}
29+
30+
func AppendPath(env []string, binPath string) []string {
31+
var newEnv []string
32+
for _, path := range env {
33+
v, ok := strings.CutPrefix(path, "PATH=")
34+
if ok {
35+
newEnv = append(newEnv, fmt.Sprintf("PATH=%s%s%s",
36+
binPath, string(os.PathListSeparator), v))
37+
}
38+
}
39+
return newEnv
40+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
-----BEGIN PGP SIGNED MESSAGE-----
2+
Hash: SHA256
3+
4+
43a881788549e1b3425eb5f2b92608f438f146e08213de09c5bd5ff841cae7ae node-v20.11.1-aix-ppc64.tar.gz
5+
3f8e77b775372c0b27d2b85ce899d80339691f480e64dde43d4eb01504a58679 node-v20.11.1-arm64.msi
6+
e0065c61f340e85106a99c4b54746c5cee09d59b08c5712f67f99e92aa44995d node-v20.11.1-darwin-arm64.tar.gz
7+
fd771bf3881733bfc0622128918ae6baf2ed1178146538a53c30ac2f7006af5b node-v20.11.1-darwin-arm64.tar.xz
8+
c52e7fb0709dbe63a4cbe08ac8af3479188692937a7bd8e776e0eedfa33bb848 node-v20.11.1-darwin-x64.tar.gz
9+
ed69f1f300beb75fb4cad45d96aacd141c3ddca03b6d77c76b42cb258202363d node-v20.11.1-darwin-x64.tar.xz
10+
0aa42c91b441e945ff43bd3a837759c58b436de57dcd033d02e5cbcd2fba1f87 node-v20.11.1-headers.tar.gz
11+
edce238817acf5adce3123366b55304aff2a1f0849231d1b49f42370e454b6f8 node-v20.11.1-headers.tar.xz
12+
e34ab2fc2726b4abd896bcbff0250e9b2da737cbd9d24267518a802ed0606f3b node-v20.11.1-linux-arm64.tar.gz
13+
c957f29eb4e341903520caf362534f0acd1db7be79c502ae8e283994eed07fe1 node-v20.11.1-linux-arm64.tar.xz
14+
e42791f76ece283c7a4b97fbf716da72c5128c54a9779f10f03ae74a4bcfb8f6 node-v20.11.1-linux-armv7l.tar.gz
15+
28e0120d2d150a8f41717899d33167b8b32053778665583d49ff971bfd188d1b node-v20.11.1-linux-armv7l.tar.xz
16+
9823305ac3a66925a9b61d8032f6bbb4c3e33c28e7f957ebb27e49732feffb23 node-v20.11.1-linux-ppc64le.tar.gz
17+
51343cacf5cdf5c4b5e93e919d19dd373d6ef43d5f2c666eae299f26e31d08b5 node-v20.11.1-linux-ppc64le.tar.xz
18+
4c66b2f247fdd8720853321526d7cda483018fcb32014b75c30f3a54ecacaea7 node-v20.11.1-linux-s390x.tar.gz
19+
b32616b705cd0ddbb230b95c693e3d7a37becc2ced9bcadea8dc824cceed6be0 node-v20.11.1-linux-s390x.tar.xz
20+
bf3a779bef19452da90fb88358ec2c57e0d2f882839b20dc6afc297b6aafc0d7 node-v20.11.1-linux-x64.tar.gz
21+
d8dab549b09672b03356aa2257699f3de3b58c96e74eb26a8b495fbdc9cf6fbe node-v20.11.1-linux-x64.tar.xz
22+
f1cd449fcbeb1b948e8498cb8edd9655fa319d109a7f4c5bd96a9b122b91538a node-v20.11.1-win-arm64.7z
23+
e85461ec124956a2853c4ee6e13c4f4889d63c88beb3d530c1ee0c4b51dc10e7 node-v20.11.1-win-arm64.zip
24+
fb9b5348259988a562a48eed7349e7e716c0bec78d98ad0a336b2993a8b3bf34 node-v20.11.1-win-x64.7z
25+
bc032628d77d206ffa7f133518a6225a9c5d6d9210ead30d67e294ff37044bda node-v20.11.1-win-x64.zip
26+
c2b1863d8979546804a39fc63d0a9bc9c6e49cb2f6c9d1e52844a24629b24765 node-v20.11.1-win-x86.7z
27+
b98e95f78416d1359b647cfa09ba2a48b76d41b56a776df822bf36ffe8e76a2d node-v20.11.1-win-x86.zip
28+
c54f5f7e2416e826fd84e878f28e3b53363ae9c3f60a140af4434b2453b5ae89 node-v20.11.1-x64.msi
29+
63e2aed4dabb96eed6903a3974e006d3c29c218472aac60ae3c3c7de00df13b1 node-v20.11.1-x86.msi
30+
c46019a095a1549d000e85da13f17972a448e0be5854a51786ecccde7278a012 node-v20.11.1.pkg
31+
4af1ba6ea848cc05908b8a62b02fb27684dd52b2a7988ee82b0cfa72deb90b94 node-v20.11.1.tar.gz
32+
77813edbf3f7f16d2d35d3353443dee4e61d5ee84d9e3138c7538a3c0ca5209e node-v20.11.1.tar.xz
33+
a5a9d30a8f7d56e00ccb27c1a7d24c8d0bc96a2689ebba8eb7527698793496f1 win-arm64/node.exe
34+
93529170cebe57c0f4830a4cc6a261b6cc9bcf0cd8b3e88ac4995a5015031d79 win-arm64/node.lib
35+
c14c6e927406b8683cbfb8a67ca4c8fd5093ca7812b5b1627e3d6a53d3674565 win-arm64/node_pdb.7z
36+
68034cd09d8dfaa755d1b280da13e20388cc486ac57b037b3e11dfe2d6b74284 win-arm64/node_pdb.zip
37+
bc585910690318aaebe3c57669cb83ca9d1e5791efd63195e238f54686e6c2ec win-x64/node.exe
38+
53a982d490cb9fcc4b231a8b95147de423b36186bc6f4ba5697b20117fdcbd5d win-x64/node.lib
39+
ccac9f2f5219ed858aeddb306d6493478ba9675c7cbf009e83742437d6752c4f win-x64/node_pdb.7z
40+
bec5da4035c84580843978a59ef9bcc1c0eaca881cf9e1c94e63a1862cf14421 win-x64/node_pdb.zip
41+
3829137e062b1e2eb9947ef05e4b717ae578a8fce1c5c60fe4f6ae7ef2ec0240 win-x86/node.exe
42+
c5321bb65dcecb3989f9b8f6ec56369c16627ca4bade0c78afb6b88f7dde50e4 win-x86/node.lib
43+
20ca60ced1fc21f15ea952b4406aec6bde39d20eab11cf042040628841b2249e win-x86/node_pdb.7z
44+
bef05cebedce5949ae35e87e7d4789c16fa73caf478483fcf92e5dbb9ba5d774 win-x86/node_pdb.zip
45+
-----BEGIN PGP SIGNATURE-----
46+
47+
iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmXM+TcACgkQi+q0389V
48+
XvQl3AwAqqm2uBMDzd+BlR1sG7y/eUtUYPVdwmCh0DeFXPHxuaIbFf0PGMEgcV8u
49+
kn3OBF4pnSCPZNbJYJsLO1S+b/5Vk+Vlkq1WkOxqQHUHmM9GcJUuShadl0YaDNen
50+
WXXMoYKWqMRJ6fQ3tRRh+vbMSXtsLqXT8TMVJq+Qb7a7yj4QRjw/Dd+8uKGGIhBY
51+
U04HWsz33RJLu6AUnhF03eO1N8E1V48JptklDx5ZkY8GYa3F6jQsFld+jhmkZ9tg
52+
4q9NDNijVpj56UsUhLAYD0J9IKS18tvQxNrKmBGUSZjFOByVhbUdLXnSMtW1i1U9
53+
cYhP6Q5wg/fnjqCfQ90TauoJZOblKIL/PHlf6cQGPrrRa1bz3xGyCAIve5KFhLxf
54+
Vfj1ctk2ktzmuNhjAu5G/1VALQUNpiTm4Yz433JpoMMZ3mTHN+fuALOX4TQbdLRz
55+
HKphTz02436348XC9bNz2cvjm74cy9fqwjQ/y84AmxiTJMFPg0XqICg4tu9rd49d
56+
8FJc4TLZ
57+
=r/CD
58+
-----END PGP SIGNATURE-----
59+
60+
-----BEGIN PGP SIGNED MESSAGE-----
61+
Hash: SHA256
62+
63+
c31d5b60c4a284c6855bd468d4aae4436a16b351362b2971d3c0db2a471d3f24 node-v21.7.0-aix-ppc64.tar.gz
64+
7d7dc37aa30b6dbb52d698d01cfed1d99056c82396eadd41a49fc55a873c423d node-v21.7.0-arm64.msi
65+
f48ad51cf3c2814bbf61c8c26efd810e5e22dcac980786fd7ac5b54365233d2c node-v21.7.0-darwin-arm64.tar.gz
66+
0805239d8a7402dae49e0033b7ad8208fed498dbeee9a3194863e52f6f3c6d7f node-v21.7.0-darwin-arm64.tar.xz
67+
3f81adca80b523b413e26f03f855f4a2ae52d9af20f0cda2e259dd26a0608607 node-v21.7.0-darwin-x64.tar.gz
68+
6a755416292854f2be38e74704ccf09edeba247718e9f047f5e1939b0dba17bd node-v21.7.0-darwin-x64.tar.xz
69+
628d9e4f866e3828b77ce812dc99f33d3e7c673d0c499f13eadff6fa6ccb4383 node-v21.7.0-headers.tar.gz
70+
627d6552d2120660a51f74fff0d40573f4a35d8545462250d30592ce0ba4eec7 node-v21.7.0-headers.tar.xz
71+
520a3e5c83a05a782b1f4959f150c2fdc03e2ea056e855ef6bbb74f6ccf7aa7d node-v21.7.0-linux-arm64.tar.gz
72+
73ce1e4e956532e0916fc7014f5b649573bd2b5870fef5cfc26cc42f58358ae7 node-v21.7.0-linux-arm64.tar.xz
73+
723abb32135ad4baa6e9671447a72f5c9a5bfc681fc540b0e4864e965171b6ed node-v21.7.0-linux-armv7l.tar.gz
74+
8a367a3bf667f0bb3abb9e8121326911d47a31886419ad052d5a52d8c6531d9d node-v21.7.0-linux-armv7l.tar.xz
75+
c2290cb35b11ee2b0f0ae34ad3c8372652688ff2dc3d9a89ada46c2b84ea5dda node-v21.7.0-linux-ppc64le.tar.gz
76+
b85348211a4d195de2f850a17cdec77aedc8fc1c402864b2bc3501608e6c9c47 node-v21.7.0-linux-ppc64le.tar.xz
77+
90b8678ed113950613edeae5eaf298cf795c72005fac6ffd9b7fbb90ddd86738 node-v21.7.0-linux-s390x.tar.gz
78+
99a09f4c790f3210a6d26032bf69713ba199cf2e73af43e04b1b1d9bd1c8db76 node-v21.7.0-linux-s390x.tar.xz
79+
0fce039e2b6af00766492127a49f959ae92ed22fede4c49e9a8c2543aadbd6e2 node-v21.7.0-linux-x64.tar.gz
80+
68510c3851133a21c6a6f9940e58c5bc8fed39f1d91a08e34c5070dd0615fef1 node-v21.7.0-linux-x64.tar.xz
81+
d680d5c3d0b2476a97d11b30cbbdaf1d7f92ffd1cc89e5c640782a6b52480666 node-v21.7.0-win-arm64.7z
82+
11b11b9a3f2db7b5076cf16655e05cd63dc3d8843cd4836ecb12e11315f03441 node-v21.7.0-win-arm64.zip
83+
31c8b4721f37e30ca8e2131a4cb848fc7347f67bf87618e82959b58481f17bc4 node-v21.7.0-win-x64.7z
84+
204de88f4073b08ae3dbe4c412b071eee565fc681e163be205d5cc88065f0322 node-v21.7.0-win-x64.zip
85+
b17ef0c5557e61610774cae5beb0f877699ab419c4672e9c6e3bb3da3d571ed1 node-v21.7.0-win-x86.7z
86+
6aba3fe2258d5c0c40a89e81dfe90113a67489f2a67fd05b7f216b63b4c7bb02 node-v21.7.0-win-x86.zip
87+
512945cf8816e1e906143ea2ee6816f8744a3d114ea38f3540c3ebe685fe3e3a node-v21.7.0-x64.msi
88+
4bedb6069c94a71fd6f0b8fbea280468d5ecdcf209eef6da1a45808e8b15cba6 node-v21.7.0-x86.msi
89+
ccac99782e587c6090b6ad82979210fa0c352322636a6cf290d37eb41152d0b5 node-v21.7.0.pkg
90+
26d6b600e1076f132d4175a90ddc1a709263e75d81967300aa1ffbd86103b991 node-v21.7.0.tar.gz
91+
e41eefe1e59624ee7f312c38f8f7dfc11595641acb2293d21176f03d2763e9d4 node-v21.7.0.tar.xz
92+
25511d1e05d7d0b049945c5ef1cf2a4daa5d6ad16692ccd2c1399142a1c57a65 win-arm64/node.exe
93+
7920932f7be355dbf4568492ab7d104fc059f689ba1a46ac0d6568884c8d201a win-arm64/node.lib
94+
40c423a2b126fc5b6858f8617f0f8537fd8f8d2fa73a5c918607f3ccd386f8c9 win-arm64/node_pdb.7z
95+
dec9eaa91a431ea0f3c243605f0556dbe6459df5c04c10df7935d678a6b3fca4 win-arm64/node_pdb.zip
96+
c486fe72a3663379105538e886ef9d2deacad1deaa64b338e570cb086be592d3 win-x64/node.exe
97+
96d09c2055c2f252122c86b65d2aabd5f90b1a075844f24bf8bcdbab05baf53e win-x64/node.lib
98+
08990dd6bcce80710d59ef76cd74ab98b5bed36b0d2584ca3acbc029f92db4fc win-x64/node_pdb.7z
99+
1a27a25c92f6339b3aa77588063cca537af389aee26bfdf1d0ef505d790e63a3 win-x64/node_pdb.zip
100+
4aaa5b3a95ee4ab932a80b9708c31662a9c4a99d19fea7cb1f7b0ff79d8399ed win-x86/node.exe
101+
6e2502e84c3a0e2da643f6399b59381ade5b525f544a5bcabae923188b8f9998 win-x86/node.lib
102+
d0cd5494364039f558c76d4fc7a1db69739149873e10a5200fb9e2a0ab12fe10 win-x86/node_pdb.7z
103+
354031f3f9576733ebeeccbcafcc691c8326427153a48978ff5cd6f2c8ef5d36 win-x86/node_pdb.zip
104+
-----BEGIN PGP SIGNATURE-----
105+
106+
iQGzBAEBCAAdFiEEiQwI24V5Fi/uDfnbi+q0389VXvQFAmXouAIACgkQi+q0389V
107+
XvRp+wv+IPHjBUmVC6YzAxFhRD4GHVUgjckfSbP2jH/acre1mYgm9LJ//7l2GaJy
108+
oEOO85WaHgaKCHCdv9GBc3dDbbt1n9J2IGmBqcdE8e9cRko5qhBoVUvW7p7Ki7ci
109+
nAq5DS3YkpWAocsY/k+LyR0Ky8mW466ARAucTp9kuZmxB2FW53B0bYK57++1qGuo
110+
tr9kJPoGYQB0cUiTSwTaMbOIdl/4CL+a9J7mIrpaDVW5g3PnNy5y1vgDvtuU7Qcn
111+
uEucciBlOn0Ib4mBnky+NX1ThL9WNwLjaivxdioFgc0E4sMwf0CjF3vMUuEvI8qi
112+
PJ5lYndsHI4fdh1SbcgoFNZzTkMZbTr9xcZIGLzLkMX8r+ztLTiFtiLIUSQq0jgm
113+
fqKQghuDN2SVi7WW4KAa7K1285zmV7L27N9mnNWH4ujTqCW73Wdo2XkG/TwM3yEC
114+
5o+YookAV6RHT1X6RPJ8rQaC0BrBgpm/MQH1kvH4vUyF2HRVZ2ZgEYorvKtOwf9D
115+
f7v3IC9J
116+
=/YNz
117+
-----END PGP SIGNATURE-----

pkg/repos/runtimes/node/log.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package node
2+
3+
import "github.com/gptscript-ai/gptscript/pkg/mvl"
4+
5+
var log = mvl.Package()

pkg/repos/runtimes/node/node.go

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package node
2+
3+
import (
4+
"bufio"
5+
"bytes"
6+
"context"
7+
_ "embed"
8+
"errors"
9+
"fmt"
10+
"io/fs"
11+
"os"
12+
"path/filepath"
13+
"runtime"
14+
"strings"
15+
16+
"github.com/gptscript-ai/gptscript/pkg/debugcmd"
17+
"github.com/gptscript-ai/gptscript/pkg/hash"
18+
"github.com/gptscript-ai/gptscript/pkg/repos/download"
19+
runtimeEnv "github.com/gptscript-ai/gptscript/pkg/repos/runtimes/env"
20+
)
21+
22+
//go:embed SHASUMS256.txt.asc
23+
var releasesData []byte
24+
25+
const downloadURL = "https://nodejs.org/dist/%s/"
26+
27+
type Runtime struct {
28+
// version something like "3.12"
29+
Version string
30+
// If true this is the version that will be used for python or python3
31+
Default bool
32+
}
33+
34+
func (r *Runtime) ID() string {
35+
return "node" + r.Version
36+
}
37+
38+
func (r *Runtime) Supports(cmd []string) bool {
39+
for _, testCmd := range []string{"node", "npx", "npm"} {
40+
if r.supports(testCmd, cmd) {
41+
return true
42+
}
43+
}
44+
return false
45+
}
46+
47+
func (r *Runtime) supports(testCmd string, cmd []string) bool {
48+
if runtimeEnv.Matches(cmd, testCmd+r.Version) {
49+
return true
50+
}
51+
if !r.Default {
52+
return false
53+
}
54+
return runtimeEnv.Matches(cmd, testCmd)
55+
}
56+
57+
func (r *Runtime) Setup(ctx context.Context, dataRoot, toolSource string, env []string) ([]string, error) {
58+
binPath, err := r.getRuntime(ctx, dataRoot)
59+
if err != nil {
60+
return nil, err
61+
}
62+
63+
newEnv := runtimeEnv.AppendPath(env, binPath)
64+
if err := r.runNPM(ctx, toolSource, binPath, append(env, newEnv...)); err != nil {
65+
return nil, err
66+
}
67+
68+
return newEnv, nil
69+
}
70+
71+
func osName() string {
72+
if runtime.GOOS == "windows" {
73+
return "win"
74+
}
75+
return runtime.GOOS
76+
}
77+
78+
func arch() string {
79+
if runtime.GOARCH == "amd64" {
80+
return "x64"
81+
}
82+
return runtime.GOARCH
83+
}
84+
85+
func (r *Runtime) getReleaseAndDigest() (string, string, error) {
86+
scanner := bufio.NewScanner(bytes.NewReader(releasesData))
87+
key := osName() + "-" + arch()
88+
for scanner.Scan() {
89+
line := scanner.Text()
90+
if strings.Contains(line, "node-v"+r.Version) && strings.Contains(line, key) {
91+
parts := strings.Split(line, " ")
92+
digest := strings.TrimSpace(parts[0])
93+
file := strings.TrimSpace(parts[1])
94+
version := strings.Split(file, "-")[1]
95+
96+
return fmt.Sprintf(downloadURL, version) + file, digest, nil
97+
}
98+
}
99+
100+
return "", "", fmt.Errorf("failed to find %s release for os=%s arch=%s", r.ID(), osName(), arch())
101+
}
102+
103+
func (r *Runtime) runNPM(ctx context.Context, toolSource, binDir string, env []string) error {
104+
cmd := debugcmd.New(ctx, filepath.Join(binDir, "npm"), "install")
105+
cmd.Env = env
106+
cmd.Dir = toolSource
107+
return cmd.Run()
108+
}
109+
110+
func (r *Runtime) binDir(rel string) (string, error) {
111+
entries, err := os.ReadDir(rel)
112+
if err != nil {
113+
return "", err
114+
}
115+
116+
for _, entry := range entries {
117+
if entry.IsDir() {
118+
return filepath.Join(rel, entry.Name(), "bin"), nil
119+
}
120+
}
121+
122+
return "", fmt.Errorf("failed to find sub dir for node in %s", rel)
123+
}
124+
125+
func (r *Runtime) getRuntime(ctx context.Context, cwd string) (string, error) {
126+
url, sha, err := r.getReleaseAndDigest()
127+
if err != nil {
128+
return "", err
129+
}
130+
131+
target := filepath.Join(cwd, "node", hash.ID(url, sha))
132+
if _, err := os.Stat(target); err == nil {
133+
return r.binDir(target)
134+
} else if !errors.Is(err, fs.ErrNotExist) {
135+
return "", err
136+
}
137+
138+
log.Infof("Downloading Node %s.x", r.Version)
139+
tmp := target + ".download"
140+
defer os.RemoveAll(tmp)
141+
142+
if err := os.MkdirAll(tmp, 0755); err != nil {
143+
return "", err
144+
}
145+
146+
if err := download.Extract(ctx, url, sha, tmp); err != nil {
147+
return "", err
148+
}
149+
150+
if err := os.Rename(tmp, target); err != nil {
151+
return "", err
152+
}
153+
154+
return r.binDir(target)
155+
}

pkg/repos/runtimes/node/node_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package node
2+
3+
import (
4+
"context"
5+
"os"
6+
"strings"
7+
"testing"
8+
9+
"github.com/adrg/xdg"
10+
"github.com/samber/lo"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
var (
16+
testCacheHome = lo.Must(xdg.CacheFile("gptscript-test-cache/runtime"))
17+
)
18+
19+
func TestRuntime(t *testing.T) {
20+
r := Runtime{
21+
Version: "20",
22+
}
23+
24+
s, err := r.Setup(context.Background(), testCacheHome, "testdata", os.Environ())
25+
require.NoError(t, err)
26+
assert.True(t, strings.HasSuffix(s[0], "/bin"), "missing /bin: %s", s)
27+
}
28+
29+
func TestRuntime21(t *testing.T) {
30+
r := Runtime{
31+
Version: "21",
32+
}
33+
34+
s, err := r.Setup(context.Background(), testCacheHome, "testdata", os.Environ())
35+
require.NoError(t, err)
36+
assert.True(t, strings.HasSuffix(s[0], "/bin"), "missing /bin: %s", s)
37+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"name": "gptscript-browser-plugin",
3+
"version": "1.0.0",
4+
"description": "## Project Description",
5+
"main": "index.js",
6+
"directories": {
7+
"example": "examples"
8+
},
9+
"scripts": {
10+
"server": "tsnd --respawn src/server.ts"
11+
},
12+
"keywords": [],
13+
"author": "",
14+
"license": "ISC",
15+
"dependencies": {
16+
"express": "^4.18.2"
17+
}
18+
}

0 commit comments

Comments
 (0)