@genspark/gencode 1.19.3-gencode.3-beta.3 → 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 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 using --ignore-scripts during installation, or when using a" >&2
4
- echo "package manager like pnpm that does not run postinstall scripts by default." >&2
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": "1.19.3-gencode.3-beta.3",
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-windows-x64": "1.19.3-gencode.3-beta.3",
43
- "@genspark/gencode-darwin-x64-baseline": "1.19.3-gencode.3-beta.3",
44
- "@genspark/gencode-linux-x64-baseline": "1.19.3-gencode.3-beta.3",
45
- "@genspark/gencode-linux-x64-musl": "1.19.3-gencode.3-beta.3",
46
- "@genspark/gencode-windows-x64-baseline": "1.19.3-gencode.3-beta.3",
47
- "@genspark/gencode-windows-arm64": "1.19.3-gencode.3-beta.3",
48
- "@genspark/gencode-darwin-x64": "1.19.3-gencode.3-beta.3",
49
- "@genspark/gencode-linux-x64": "1.19.3-gencode.3-beta.3",
50
- "@genspark/gencode-linux-x64-baseline-musl": "1.19.3-gencode.3-beta.3",
51
- "@genspark/gencode-darwin-arm64": "1.19.3-gencode.3-beta.3",
52
- "@genspark/gencode-linux-arm64-musl": "1.19.3-gencode.3-beta.3",
53
- "@genspark/gencode-linux-arm64": "1.19.3-gencode.3-beta.3"
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 __dirname = path.dirname(fileURLToPath(import.meta.url))
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(__dirname, "package.json"), "utf8"))
13
-
14
- const platformMap = {
15
- darwin: "darwin",
16
- linux: "linux",
17
- win32: "windows",
18
- }
19
- const archMap = {
20
- x64: "x64",
21
- arm64: "arm64",
22
- arm: "arm",
23
- }
24
-
25
- const platform = platformMap[os.platform()] ?? os.platform()
26
- const arch = archMap[os.arch()] ?? os.arch()
27
- // Genspark fork: the wrapper is `@genspark/gencode` with bin `gencode`; the
28
- // platform packages are `<wrapper name>-<platform>-<arch>[-baseline][-musl]`.
29
- // Read both from this package.json instead of hardcoding upstream's names.
30
- const cli = Object.keys(packageJson.bin ?? {})[0] ?? "gencode"
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
- if (result.status !== 0) return false
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 command =
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", 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
- if (platform === "linux") {
104
- if (isMusl()) {
105
- if (arch === "x64")
106
- return baseline
107
- ? [`${base}-baseline-musl`, `${base}-musl`, `${base}-baseline`, base]
108
- : [`${base}-musl`, `${base}-baseline-musl`, base, `${base}-baseline`]
109
- return [`${base}-musl`, base]
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
- if (arch === "x64") return baseline ? [`${base}-baseline`, base] : [base, `${base}-baseline`]
120
- return [base]
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 packageJsonPath = require.resolve(`${name}/package.json`)
125
- const binaryPath = path.join(path.dirname(packageJsonPath), "bin", sourceBinary)
126
- if (!fs.existsSync(binaryPath)) throw new Error(`Binary not found at ${binaryPath}`)
127
- return binaryPath
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 version = packageJson.optionalDependencies?.[name]
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
- "npm",
138
- ["install", "--ignore-scripts", "--no-save", "--loglevel=error", "--prefix", temp, `${name}@${version}`],
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
- const packageDir = path.join(temp, "node_modules", name)
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
- const result = childProcess.spawnSync(targetBinary, ["--version"], {
164
- encoding: "utf8",
165
- stdio: "ignore",
166
- windowsHide: true,
167
- })
168
- return result.status === 0
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
- for (const name of packageNames()) {
173
+ const names = packageNames()
174
+ for (const name of names) {
173
175
  try {
174
- copyBinary(resolveBinary(name), targetBinary)
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
- `It seems your package manager failed to install the right ${cli} CLI package. Try manually installing ${packageNames()
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.