@genspark/gencode 1.19.3-gencode.3-beta.2 → 2.2.0-gencode.1-alpha.1
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/bin/gencode.exe +2 -7
- package/package.json +13 -33
- package/postinstall.mjs +99 -99
- package/LICENSE-opencode +0 -21
- package/README.md +0 -129
package/bin/gencode.exe
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
echo "Error: @genspark/gencode's postinstall script was not run." >&2
|
|
2
2
|
echo "" >&2
|
|
3
|
-
echo "This occurs when
|
|
4
|
-
echo "
|
|
5
|
-
echo "" >&2
|
|
6
|
-
echo "To fix this, run the postinstall script manually:" >&2
|
|
7
|
-
echo " cd node_modules/@genspark/gencode && node postinstall.mjs" >&2
|
|
8
|
-
echo "" >&2
|
|
9
|
-
echo "Or reinstall @genspark/gencode without the --ignore-scripts flag." >&2
|
|
3
|
+
echo "This occurs when installation scripts are disabled." >&2
|
|
4
|
+
echo "Run the package postinstall script or reinstall with scripts enabled." >&2
|
|
10
5
|
exit 1
|
package/package.json
CHANGED
|
@@ -1,34 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genspark/gencode",
|
|
3
|
-
"description": "GenCode — Genspark's AI coding agent for the terminal: an interactive TUI and headless CLI that read your codebase, plan and edit files, run commands and tests, and explain the result with the models in your Genspark plan.",
|
|
4
|
-
"keywords": [
|
|
5
|
-
"gencode",
|
|
6
|
-
"genspark",
|
|
7
|
-
"ai",
|
|
8
|
-
"ai-agent",
|
|
9
|
-
"coding-agent",
|
|
10
|
-
"coding-assistant",
|
|
11
|
-
"cli",
|
|
12
|
-
"tui",
|
|
13
|
-
"terminal",
|
|
14
|
-
"developer-tools",
|
|
15
|
-
"llm",
|
|
16
|
-
"code-generation",
|
|
17
|
-
"agent"
|
|
18
|
-
],
|
|
19
3
|
"bin": {
|
|
20
4
|
"gencode": "./bin/gencode.exe"
|
|
21
5
|
},
|
|
22
6
|
"scripts": {
|
|
23
7
|
"postinstall": "node ./postinstall.mjs"
|
|
24
8
|
},
|
|
25
|
-
"version": "
|
|
9
|
+
"version": "2.2.0-gencode.1-alpha.1",
|
|
26
10
|
"license": "UNLICENSED",
|
|
27
|
-
"author": "Genspark",
|
|
28
11
|
"homepage": "https://www.genspark.ai",
|
|
29
|
-
"engines": {
|
|
30
|
-
"node": ">=18"
|
|
31
|
-
},
|
|
32
12
|
"os": [
|
|
33
13
|
"darwin",
|
|
34
14
|
"linux",
|
|
@@ -39,17 +19,17 @@
|
|
|
39
19
|
"x64"
|
|
40
20
|
],
|
|
41
21
|
"optionalDependencies": {
|
|
42
|
-
"@genspark/gencode-
|
|
43
|
-
"@genspark/gencode-
|
|
44
|
-
"@genspark/gencode-
|
|
45
|
-
"@genspark/gencode-
|
|
46
|
-
"@genspark/gencode-
|
|
47
|
-
"@genspark/gencode-
|
|
48
|
-
"@genspark/gencode-
|
|
49
|
-
"@genspark/gencode-linux-x64": "
|
|
50
|
-
"@genspark/gencode-
|
|
51
|
-
"@genspark/gencode-
|
|
52
|
-
"@genspark/gencode-
|
|
53
|
-
"@genspark/gencode-linux-
|
|
22
|
+
"@genspark/gencode-darwin-arm64": "2.2.0-gencode.1-alpha.1",
|
|
23
|
+
"@genspark/gencode-linux-arm64": "2.2.0-gencode.1-alpha.1",
|
|
24
|
+
"@genspark/gencode-darwin-x64": "2.2.0-gencode.1-alpha.1",
|
|
25
|
+
"@genspark/gencode-darwin-x64-baseline": "2.2.0-gencode.1-alpha.1",
|
|
26
|
+
"@genspark/gencode-linux-x64-baseline": "2.2.0-gencode.1-alpha.1",
|
|
27
|
+
"@genspark/gencode-linux-x64-musl": "2.2.0-gencode.1-alpha.1",
|
|
28
|
+
"@genspark/gencode-linux-arm64-musl": "2.2.0-gencode.1-alpha.1",
|
|
29
|
+
"@genspark/gencode-linux-x64-baseline-musl": "2.2.0-gencode.1-alpha.1",
|
|
30
|
+
"@genspark/gencode-windows-x64": "2.2.0-gencode.1-alpha.1",
|
|
31
|
+
"@genspark/gencode-windows-arm64": "2.2.0-gencode.1-alpha.1",
|
|
32
|
+
"@genspark/gencode-windows-x64-baseline": "2.2.0-gencode.1-alpha.1",
|
|
33
|
+
"@genspark/gencode-linux-x64": "2.2.0-gencode.1-alpha.1"
|
|
54
34
|
}
|
|
55
35
|
}
|
package/postinstall.mjs
CHANGED
|
@@ -1,40 +1,36 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import childProcess from "child_process"
|
|
4
|
-
import fs from "fs"
|
|
5
|
-
import os from "os"
|
|
6
|
-
import path from "path"
|
|
7
|
-
import { createRequire } from "module"
|
|
8
|
-
import { fileURLToPath } from "url"
|
|
9
|
-
|
|
10
|
-
const
|
|
3
|
+
import childProcess from "node:child_process"
|
|
4
|
+
import fs from "node:fs"
|
|
5
|
+
import os from "node:os"
|
|
6
|
+
import path from "node:path"
|
|
7
|
+
import { createRequire } from "node:module"
|
|
8
|
+
import { fileURLToPath } from "node:url"
|
|
9
|
+
|
|
10
|
+
const directory = path.dirname(fileURLToPath(import.meta.url))
|
|
11
11
|
const require = createRequire(import.meta.url)
|
|
12
|
-
const packageJson = JSON.parse(fs.readFileSync(path.join(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const base = `${packageJson.name}-${platform}-${arch}`
|
|
32
|
-
const sourceBinary = platform === "windows" ? `${cli}.exe` : cli
|
|
33
|
-
const targetBinary = path.join(__dirname, "bin", `${cli}.exe`)
|
|
12
|
+
const packageJson = JSON.parse(fs.readFileSync(path.join(directory, "package.json"), "utf8"))
|
|
13
|
+
const command = Object.keys(packageJson.bin ?? {})[0]
|
|
14
|
+
if (!command) throw new Error("GenCode package does not declare a binary")
|
|
15
|
+
const sourceCommand = packageJson.opencodeSourceBinary ?? command
|
|
16
|
+
|
|
17
|
+
const platform = { darwin: "darwin", linux: "linux", win32: "windows" }[os.platform()] ?? os.platform()
|
|
18
|
+
const nodeArch = { x64: "x64", arm64: "arm64", arm: "arm" }[os.arch()] ?? os.arch()
|
|
19
|
+
// x64 Node runs emulated on Windows ARM64, but PROCESSOR_IDENTIFIER still names the host CPU.
|
|
20
|
+
const arch =
|
|
21
|
+
platform === "windows" && nodeArch === "x64" && process.env.PROCESSOR_IDENTIFIER?.startsWith("ARM")
|
|
22
|
+
? "arm64"
|
|
23
|
+
: nodeArch
|
|
24
|
+
// Windows cannot spawn npm's .cmd shim directly, so reuse the npm CLI that runs this script.
|
|
25
|
+
const npm = process.env.npm_execpath?.endsWith("npm-cli.js") ? [process.execPath, process.env.npm_execpath] : ["npm"]
|
|
26
|
+
const sourceBinary = platform === "windows" ? `${sourceCommand}.exe` : sourceCommand
|
|
27
|
+
const targetBinary = path.resolve(directory, packageJson.bin[command])
|
|
28
|
+
const dependencies = packageJson.optionalDependencies ?? {}
|
|
29
|
+
const base = Object.keys(dependencies).find((name) => name.endsWith(`-${platform}-${arch}`))
|
|
30
|
+
if (!base) throw new Error(`GenCode does not provide a binary for ${platform}-${arch}`)
|
|
34
31
|
|
|
35
32
|
function supportsAvx2() {
|
|
36
33
|
if (arch !== "x64") return false
|
|
37
|
-
|
|
38
34
|
if (platform === "linux") {
|
|
39
35
|
try {
|
|
40
36
|
return /(^|\s)avx2(\s|$)/i.test(fs.readFileSync("/proc/cpuinfo", "utf8"))
|
|
@@ -42,27 +38,23 @@ function supportsAvx2() {
|
|
|
42
38
|
return false
|
|
43
39
|
}
|
|
44
40
|
}
|
|
45
|
-
|
|
46
41
|
if (platform === "darwin") {
|
|
47
42
|
try {
|
|
48
43
|
const result = childProcess.spawnSync("sysctl", ["-n", "hw.optional.avx2_0"], {
|
|
49
44
|
encoding: "utf8",
|
|
50
45
|
timeout: 1500,
|
|
51
46
|
})
|
|
52
|
-
|
|
53
|
-
return (result.stdout || "").trim() === "1"
|
|
47
|
+
return result.status === 0 && (result.stdout || "").trim() === "1"
|
|
54
48
|
} catch {
|
|
55
49
|
return false
|
|
56
50
|
}
|
|
57
51
|
}
|
|
58
|
-
|
|
59
52
|
if (platform === "windows") {
|
|
60
|
-
const
|
|
53
|
+
const script =
|
|
61
54
|
'(Add-Type -MemberDefinition "[DllImport(""kernel32.dll"")] public static extern bool IsProcessorFeaturePresent(int ProcessorFeature);" -Name Kernel32 -Namespace Win32 -PassThru)::IsProcessorFeaturePresent(40)'
|
|
62
|
-
|
|
63
55
|
for (const executable of ["powershell.exe", "pwsh.exe", "pwsh", "powershell"]) {
|
|
64
56
|
try {
|
|
65
|
-
const result = childProcess.spawnSync(executable, ["-NoProfile", "-NonInteractive", "-Command",
|
|
57
|
+
const result = childProcess.spawnSync(executable, ["-NoProfile", "-NonInteractive", "-Command", script], {
|
|
66
58
|
encoding: "utf8",
|
|
67
59
|
timeout: 3000,
|
|
68
60
|
windowsHide: true,
|
|
@@ -76,20 +68,13 @@ function supportsAvx2() {
|
|
|
76
68
|
}
|
|
77
69
|
}
|
|
78
70
|
}
|
|
79
|
-
|
|
80
71
|
return false
|
|
81
72
|
}
|
|
82
73
|
|
|
83
74
|
function isMusl() {
|
|
84
75
|
if (platform !== "linux") return false
|
|
85
|
-
|
|
86
76
|
try {
|
|
87
77
|
if (fs.existsSync("/etc/alpine-release")) return true
|
|
88
|
-
} catch {
|
|
89
|
-
// Ignore filesystem probes that are blocked by the host.
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
try {
|
|
93
78
|
const result = childProcess.spawnSync("ldd", ["--version"], { encoding: "utf8" })
|
|
94
79
|
return `${result.stdout || ""}${result.stderr || ""}`.toLowerCase().includes("musl")
|
|
95
80
|
} catch {
|
|
@@ -99,79 +84,96 @@ function isMusl() {
|
|
|
99
84
|
|
|
100
85
|
function packageNames() {
|
|
101
86
|
const baseline = arch === "x64" && !supportsAvx2()
|
|
87
|
+
const names =
|
|
88
|
+
platform === "linux"
|
|
89
|
+
? isMusl()
|
|
90
|
+
? arch === "x64"
|
|
91
|
+
? baseline
|
|
92
|
+
? [`${base}-baseline-musl`, `${base}-musl`, `${base}-baseline`, base]
|
|
93
|
+
: [`${base}-musl`, `${base}-baseline-musl`, base, `${base}-baseline`]
|
|
94
|
+
: [`${base}-musl`, base]
|
|
95
|
+
: arch === "x64"
|
|
96
|
+
? baseline
|
|
97
|
+
? [`${base}-baseline`, base, `${base}-baseline-musl`, `${base}-musl`]
|
|
98
|
+
: [base, `${base}-baseline`, `${base}-musl`, `${base}-baseline-musl`]
|
|
99
|
+
: [base, `${base}-musl`]
|
|
100
|
+
: arch === "x64"
|
|
101
|
+
? baseline
|
|
102
|
+
? [`${base}-baseline`, base]
|
|
103
|
+
: [base, `${base}-baseline`]
|
|
104
|
+
: [base]
|
|
105
|
+
// Windows 11 on ARM64 can still run the x64 binary under emulation when the native one fails.
|
|
106
|
+
const x64 = base.replace(/-arm64$/, "-x64")
|
|
107
|
+
const emulated = platform === "windows" && arch === "arm64" ? [`${x64}-baseline`, x64] : []
|
|
108
|
+
return [...names, ...emulated].filter((name) => dependencies[name])
|
|
109
|
+
}
|
|
102
110
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (arch === "x64")
|
|
113
|
-
return baseline
|
|
114
|
-
? [`${base}-baseline`, base, `${base}-baseline-musl`, `${base}-musl`]
|
|
115
|
-
: [base, `${base}-baseline`, `${base}-musl`, `${base}-baseline-musl`]
|
|
116
|
-
return [base, `${base}-musl`]
|
|
111
|
+
function copyBinary(source) {
|
|
112
|
+
if (!fs.existsSync(source)) throw new Error(`Binary not found at ${source}`)
|
|
113
|
+
fs.mkdirSync(path.dirname(targetBinary), { recursive: true })
|
|
114
|
+
if (fs.existsSync(targetBinary)) {
|
|
115
|
+
try {
|
|
116
|
+
fs.unlinkSync(targetBinary)
|
|
117
|
+
} catch {}
|
|
117
118
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
try {
|
|
120
|
+
fs.linkSync(source, targetBinary)
|
|
121
|
+
} catch {
|
|
122
|
+
fs.copyFileSync(source, targetBinary)
|
|
123
|
+
}
|
|
124
|
+
fs.chmodSync(targetBinary, 0o755)
|
|
121
125
|
}
|
|
122
126
|
|
|
123
127
|
function resolveBinary(name) {
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
+
const packagePath = require.resolve(`${name}/package.json`)
|
|
129
|
+
// Package managers keep an older platform package when the matching version is not yet on the registry,
|
|
130
|
+
// which would silently install the previous release under the new launcher.
|
|
131
|
+
const version = JSON.parse(fs.readFileSync(packagePath, "utf8")).version
|
|
132
|
+
if (version !== dependencies[name]) throw new Error(`${name} is ${version}, expected ${dependencies[name]}`)
|
|
133
|
+
return path.join(path.dirname(packagePath), "bin", sourceBinary)
|
|
128
134
|
}
|
|
129
135
|
|
|
130
136
|
function installPackage(name) {
|
|
131
|
-
const
|
|
132
|
-
if (!version) return
|
|
133
|
-
|
|
134
|
-
const temp = fs.mkdtempSync(path.join(os.tmpdir(), `${cli}-install-`))
|
|
137
|
+
const temp = fs.mkdtempSync(path.join(os.tmpdir(), "gencode-install-"))
|
|
135
138
|
try {
|
|
136
139
|
const result = childProcess.spawnSync(
|
|
137
|
-
|
|
138
|
-
[
|
|
140
|
+
npm[0],
|
|
141
|
+
[
|
|
142
|
+
...npm.slice(1),
|
|
143
|
+
"install",
|
|
144
|
+
"--ignore-scripts",
|
|
145
|
+
"--no-save",
|
|
146
|
+
"--loglevel=error",
|
|
147
|
+
// npm rejects a package built for another CPU, such as arm64 under emulated x64 Node, unless forced.
|
|
148
|
+
...(name.includes(`-${platform}-${nodeArch}`) ? [] : ["--force"]),
|
|
149
|
+
"--prefix",
|
|
150
|
+
temp,
|
|
151
|
+
`${name}@${dependencies[name]}`,
|
|
152
|
+
],
|
|
139
153
|
{ stdio: "inherit", windowsHide: true },
|
|
140
154
|
)
|
|
141
|
-
if (result.status !== 0) return
|
|
142
|
-
|
|
143
|
-
copyBinary(path.join(packageDir, "bin", sourceBinary), targetBinary)
|
|
155
|
+
if (result.status !== 0) return false
|
|
156
|
+
copyBinary(path.join(temp, "node_modules", name, "bin", sourceBinary))
|
|
144
157
|
return true
|
|
145
158
|
} finally {
|
|
146
159
|
fs.rmSync(temp, { recursive: true, force: true })
|
|
147
160
|
}
|
|
148
161
|
}
|
|
149
162
|
|
|
150
|
-
function copyBinary(source, target) {
|
|
151
|
-
if (!fs.existsSync(source)) throw new Error(`Binary not found at ${source}`)
|
|
152
|
-
fs.mkdirSync(path.dirname(target), { recursive: true })
|
|
153
|
-
if (fs.existsSync(target)) fs.unlinkSync(target)
|
|
154
|
-
try {
|
|
155
|
-
fs.linkSync(source, target)
|
|
156
|
-
} catch {
|
|
157
|
-
fs.copyFileSync(source, target)
|
|
158
|
-
}
|
|
159
|
-
fs.chmodSync(target, 0o755)
|
|
160
|
-
}
|
|
161
|
-
|
|
162
163
|
function verifyBinary() {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
164
|
+
return (
|
|
165
|
+
childProcess.spawnSync(targetBinary, ["--version"], {
|
|
166
|
+
stdio: "ignore",
|
|
167
|
+
windowsHide: true,
|
|
168
|
+
}).status === 0
|
|
169
|
+
)
|
|
169
170
|
}
|
|
170
171
|
|
|
171
172
|
function main() {
|
|
172
|
-
|
|
173
|
+
const names = packageNames()
|
|
174
|
+
for (const name of names) {
|
|
173
175
|
try {
|
|
174
|
-
copyBinary(resolveBinary(name)
|
|
176
|
+
copyBinary(resolveBinary(name))
|
|
175
177
|
if (verifyBinary()) return
|
|
176
178
|
} catch {
|
|
177
179
|
if (installPackage(name) && verifyBinary()) return
|
|
@@ -179,15 +181,13 @@ function main() {
|
|
|
179
181
|
}
|
|
180
182
|
|
|
181
183
|
throw new Error(
|
|
182
|
-
`
|
|
183
|
-
.map((name) => JSON.stringify(name))
|
|
184
|
-
.join(" or ")}.`,
|
|
184
|
+
`Failed to install GenCode. Try manually installing ${names.map((name) => JSON.stringify(name)).join(" or ")}.`,
|
|
185
185
|
)
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
try {
|
|
189
189
|
main()
|
|
190
190
|
} catch (error) {
|
|
191
|
-
console.error(error.message)
|
|
191
|
+
console.error(error instanceof Error ? error.message : String(error))
|
|
192
192
|
process.exit(1)
|
|
193
193
|
}
|
package/LICENSE-opencode
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 opencode
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
package/README.md
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# GenCode
|
|
2
|
-
|
|
3
|
-
GenCode is Genspark's AI coding agent for the terminal. Point it at a project and
|
|
4
|
-
it reads the code, plans changes, edits files, runs commands and tests, and
|
|
5
|
-
explains what it did — powered by the models included in your Genspark plan. It
|
|
6
|
-
ships as an interactive TUI and a scriptable CLI.
|
|
7
|
-
|
|
8
|
-
GenCode is built on the open source [opencode](https://github.com/anomalyco/opencode)
|
|
9
|
-
project and retains its MIT notice (see `LICENSE-opencode`) for the derived code.
|
|
10
|
-
GenCode itself is a proprietary Genspark product and is not affiliated with or
|
|
11
|
-
endorsed by the opencode project.
|
|
12
|
-
|
|
13
|
-
## Requirements
|
|
14
|
-
|
|
15
|
-
- A **Genspark account** — GenCode signs in with it and runs on the models your
|
|
16
|
-
Genspark plan includes. Sign up or manage your plan at
|
|
17
|
-
[www.genspark.ai](https://www.genspark.ai).
|
|
18
|
-
- Node.js 18+ to run the installer (`postinstall`). The CLI itself is a
|
|
19
|
-
self-contained binary and needs no Node.js at runtime.
|
|
20
|
-
- macOS (arm64, x64), Linux glibc and musl (arm64, x64), and Windows (arm64, x64).
|
|
21
|
-
|
|
22
|
-
## Install
|
|
23
|
-
|
|
24
|
-
```sh
|
|
25
|
-
npm install -g @genspark/gencode
|
|
26
|
-
# or
|
|
27
|
-
bun add -g @genspark/gencode
|
|
28
|
-
pnpm add -g @genspark/gencode
|
|
29
|
-
yarn global add @genspark/gencode
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Verify the install:
|
|
33
|
-
|
|
34
|
-
```sh
|
|
35
|
-
gencode --version
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Sign in
|
|
39
|
-
|
|
40
|
-
```sh
|
|
41
|
-
gencode login
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
This opens the Genspark sign-in page in your browser. Approve the request and the
|
|
45
|
-
CLI is ready. `gencode auth login` and picking **Genspark** is equivalent. If you
|
|
46
|
-
already use the [Genspark CLI](https://www.npmjs.com/package/@genspark/cli)
|
|
47
|
-
(`gsk login`), GenCode reuses that sign-in automatically. No Genspark account yet?
|
|
48
|
-
Create one at [www.genspark.ai](https://www.genspark.ai).
|
|
49
|
-
|
|
50
|
-
The same environment variables apply:
|
|
51
|
-
|
|
52
|
-
| Variable | Purpose |
|
|
53
|
-
| -------------- | ----------------------------------------------------- |
|
|
54
|
-
| `GSK_API_KEY` | Use this Genspark API key instead of a stored sign-in |
|
|
55
|
-
| `GSK_BASE_URL` | Genspark host, default `https://www.genspark.ai` |
|
|
56
|
-
| `GSK_CONFIG` | Path to a `gsk` config file to read the sign-in from |
|
|
57
|
-
|
|
58
|
-
Sign out with `gencode auth logout`.
|
|
59
|
-
|
|
60
|
-
## Use
|
|
61
|
-
|
|
62
|
-
```sh
|
|
63
|
-
cd your-project
|
|
64
|
-
gencode # interactive TUI
|
|
65
|
-
gencode run "explain this repo" # one-shot answer, then exit
|
|
66
|
-
gencode run -m genspark-llm-proxy/claude-opus-5 "add tests for src/auth.ts"
|
|
67
|
-
gencode --continue # resume the most recent session
|
|
68
|
-
gencode models # list the models your plan includes
|
|
69
|
-
gencode serve # headless server on http://127.0.0.1:4196
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Inside the TUI, `Tab` switches between the **build** agent (full access) and the
|
|
73
|
-
**plan** agent (read-only, asks before running commands); `/connect` manages
|
|
74
|
-
providers and `/help` lists the rest. The model choice is remembered per project.
|
|
75
|
-
|
|
76
|
-
Models come from your Genspark account rather than a list baked into the CLI:
|
|
77
|
-
whatever Genspark enables for you appears in `gencode models` and the model
|
|
78
|
-
picker, with reasoning-effort variants where the model supports them. Spend is
|
|
79
|
-
shown in Genspark credits per step.
|
|
80
|
-
|
|
81
|
-
## Configure
|
|
82
|
-
|
|
83
|
-
GenCode reads the same configuration format as opencode, from its own locations:
|
|
84
|
-
|
|
85
|
-
| Scope | Location |
|
|
86
|
-
| ------------------ | --------------------------------------------------------------------------------------------------------------------------- |
|
|
87
|
-
| Global | `~/.config/gencode/opencode.json` (or `.jsonc`), plus `agent/`, `command/`, `skill/`, `AGENTS.md` next to it |
|
|
88
|
-
| Project (yours) | `~/.local/share/gencode/projects/<key>/opencode.json` (or `.jsonc`) — per-checkout settings that stay out of the repository |
|
|
89
|
-
| Project resources | `.opencode/{agent,command,skill}/` in the repository, shared with opencode on purpose |
|
|
90
|
-
| Data, cache, state | `~/.local/share/gencode`, `~/.cache/gencode`, `~/.local/state/gencode` |
|
|
91
|
-
|
|
92
|
-
Genspark providers are added for you, so you rarely need a `provider` block.
|
|
93
|
-
Everything else — agents, custom commands, skills, MCP servers, permissions and
|
|
94
|
-
keybinds — works as described in the [opencode docs](https://opencode.ai/docs).
|
|
95
|
-
`OPENCODE_*` environment variables apply to GenCode unchanged.
|
|
96
|
-
|
|
97
|
-
## Upgrading
|
|
98
|
-
|
|
99
|
-
```sh
|
|
100
|
-
gencode upgrade # or: npm i -g @genspark/gencode@latest
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
The TUI checks for updates at startup and every six hours. By default it only
|
|
104
|
-
notifies; use `/update` to install after confirmation, remind you tomorrow, or
|
|
105
|
-
skip that version. Set global `autoupdate: false` or
|
|
106
|
-
`OPENCODE_DISABLE_AUTOUPDATE=1` to disable automatic checks — manual `gencode
|
|
107
|
-
upgrade` still works.
|
|
108
|
-
|
|
109
|
-
## Coexisting with opencode
|
|
110
|
-
|
|
111
|
-
GenCode and opencode can be installed at the same time. They use different
|
|
112
|
-
commands (`gencode` / `opencode`), packages, configuration, data and cache
|
|
113
|
-
directories, default server ports (`4196` / `4096`) and mDNS names. Only the
|
|
114
|
-
project-level `.opencode/` directory is shared, so the agents, commands and
|
|
115
|
-
skills you keep in a repository work with both.
|
|
116
|
-
|
|
117
|
-
## Uninstall
|
|
118
|
-
|
|
119
|
-
```sh
|
|
120
|
-
gencode uninstall # --keep-config / --keep-data to preserve state
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## License
|
|
124
|
-
|
|
125
|
-
GenCode is a proprietary Genspark product. It is a fork of the open source
|
|
126
|
-
[opencode](https://github.com/anomalyco/opencode) project, and the MIT license
|
|
127
|
-
text that covers the derived code is included in
|
|
128
|
-
[`LICENSE-opencode`](./LICENSE-opencode). GenCode is not affiliated with or
|
|
129
|
-
endorsed by the opencode project. "opencode" is a trademark of its owners.
|