@andyqiu/codeforge 0.6.0 → 0.6.2
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/codeforge.mjs +45 -29
- package/dist/index.js +1 -1
- package/install.mjs +8 -5
- package/package.json +1 -1
package/bin/codeforge.mjs
CHANGED
|
@@ -95,20 +95,42 @@ function parseArgs(argv) {
|
|
|
95
95
|
// ────────────────────────────────────────────────────────────────────
|
|
96
96
|
// opencode installer:薄壳,统一调 install.mjs(Node ESM 跨平台)
|
|
97
97
|
// ADR:unify-install-to-node-mjs
|
|
98
|
+
// 自举兼容:优先找 install.mjs(v0.6+),fallback 到 install.sh(v0.5 过渡期)
|
|
99
|
+
// 用于 upgrade 命令:旧版 CLI 调新包时,新包里只有 install.mjs
|
|
98
100
|
// ────────────────────────────────────────────────────────────────────
|
|
101
|
+
function resolveInstallerScript() {
|
|
102
|
+
const mjsScript = path.join(REPO_ROOT, "install.mjs")
|
|
103
|
+
if (existsSync(mjsScript)) return { script: mjsScript, useNode: true }
|
|
104
|
+
const shScript = path.join(REPO_ROOT, "install.sh")
|
|
105
|
+
if (existsSync(shScript)) return { script: shScript, useNode: false }
|
|
106
|
+
return null
|
|
107
|
+
}
|
|
108
|
+
|
|
99
109
|
function installOpencode({ scope, dryRun, extraArgs, quiet = false, verbose = false }) {
|
|
100
|
-
const
|
|
101
|
-
if (!
|
|
102
|
-
err(`installer 脚本不存在:${
|
|
110
|
+
const resolved = resolveInstallerScript()
|
|
111
|
+
if (!resolved) {
|
|
112
|
+
err(`installer 脚本不存在:${path.join(REPO_ROOT, "install.mjs")}`)
|
|
103
113
|
return 2
|
|
104
114
|
}
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
if (
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
115
|
+
const { script, useNode } = resolved
|
|
116
|
+
let cmd, args
|
|
117
|
+
if (useNode) {
|
|
118
|
+
cmd = process.execPath
|
|
119
|
+
args = [script]
|
|
120
|
+
if (scope === "global") args.push("--global")
|
|
121
|
+
if (dryRun) args.push("--dry-run")
|
|
122
|
+
if (verbose) args.push("--verbose")
|
|
123
|
+
if (extraArgs) args.push(...extraArgs)
|
|
124
|
+
} else {
|
|
125
|
+
// fallback:旧版包里只有 install.sh(v0.5 过渡期)
|
|
126
|
+
cmd = "bash"
|
|
127
|
+
args = [script]
|
|
128
|
+
if (scope === "global") args.push("--global")
|
|
129
|
+
if (dryRun) args.push("--dry-run")
|
|
130
|
+
if (extraArgs) args.push(...extraArgs)
|
|
131
|
+
}
|
|
132
|
+
if (!quiet) log(`opencode: ${useNode ? "node" : "bash"} ${args.join(" ")}`)
|
|
133
|
+
const r = spawnSync(cmd, args, { stdio: quiet ? "pipe" : "inherit", cwd: REPO_ROOT })
|
|
112
134
|
if (quiet && r.status !== 0) {
|
|
113
135
|
if (r.stderr) process.stderr.write(r.stderr)
|
|
114
136
|
if (r.stdout) process.stderr.write(r.stdout)
|
|
@@ -117,11 +139,21 @@ function installOpencode({ scope, dryRun, extraArgs, quiet = false, verbose = fa
|
|
|
117
139
|
}
|
|
118
140
|
|
|
119
141
|
function uninstallOpencode({ scope }) {
|
|
120
|
-
const
|
|
142
|
+
const resolved = resolveInstallerScript()
|
|
143
|
+
if (!resolved) {
|
|
144
|
+
err(`installer 脚本不存在:${path.join(REPO_ROOT, "install.mjs")}`)
|
|
145
|
+
return 2
|
|
146
|
+
}
|
|
147
|
+
const { script, useNode } = resolved
|
|
148
|
+
if (!useNode && process.platform === "win32") {
|
|
149
|
+
err("Windows 下旧版 install.sh 不支持,请重新安装:npm install -g @andyqiu/codeforge")
|
|
150
|
+
return 2
|
|
151
|
+
}
|
|
152
|
+
const cmd = useNode ? process.execPath : "bash"
|
|
121
153
|
const args = [script, "--uninstall"]
|
|
122
154
|
if (scope === "global") args.push("--global")
|
|
123
|
-
log(`opencode uninstall: node ${args.join(" ")}`)
|
|
124
|
-
const r = spawnSync(
|
|
155
|
+
log(`opencode uninstall: ${useNode ? "node" : "bash"} ${args.join(" ")}`)
|
|
156
|
+
const r = spawnSync(cmd, args, { stdio: "inherit", cwd: REPO_ROOT })
|
|
125
157
|
return r.status ?? 1
|
|
126
158
|
}
|
|
127
159
|
|
|
@@ -146,12 +178,6 @@ function cmdInstall(args) {
|
|
|
146
178
|
if (args.flags["enable-legacy-tools"]) extraArgs.push("--enable-legacy-tools")
|
|
147
179
|
if (args.flags["skip-build"] || autoSkipBuild) extraArgs.push("--skip-build")
|
|
148
180
|
|
|
149
|
-
log(`CodeForge installer v${getVersion()}`)
|
|
150
|
-
log(` scope : ${scope}`)
|
|
151
|
-
log(` source : ${fromNpm ? "npm (prebuilt)" : "git clone (will build)"}`)
|
|
152
|
-
log(` dry-run : ${dryRun}`)
|
|
153
|
-
hr()
|
|
154
|
-
|
|
155
181
|
// npm 场景:dist/index.js 必须已经被 prepack 打好;找不到就直接报错并提示
|
|
156
182
|
if (fromNpm && !dryRun) {
|
|
157
183
|
const distEntry = path.join(REPO_ROOT, "dist", "index.js")
|
|
@@ -164,12 +190,10 @@ function cmdInstall(args) {
|
|
|
164
190
|
}
|
|
165
191
|
|
|
166
192
|
const code = installOpencode({ scope, dryRun, extraArgs, verbose })
|
|
167
|
-
hr()
|
|
168
193
|
if (code !== 0) {
|
|
169
194
|
err(`opencode 安装失败 (exit=${code})`)
|
|
170
195
|
return 1
|
|
171
196
|
}
|
|
172
|
-
ok(`opencode 安装完成`)
|
|
173
197
|
return 0
|
|
174
198
|
}
|
|
175
199
|
|
|
@@ -178,12 +202,7 @@ function cmdInstall(args) {
|
|
|
178
202
|
// ────────────────────────────────────────────────────────────────────
|
|
179
203
|
function cmdUninstall(args) {
|
|
180
204
|
const scope = "global"
|
|
181
|
-
log(`CodeForge uninstaller`)
|
|
182
|
-
log(` scope : ${scope}`)
|
|
183
|
-
hr()
|
|
184
205
|
uninstallOpencode({ scope })
|
|
185
|
-
hr()
|
|
186
|
-
ok("卸载流程完成")
|
|
187
206
|
return 0
|
|
188
207
|
}
|
|
189
208
|
|
|
@@ -324,9 +343,6 @@ async function cmdUpgrade(args) {
|
|
|
324
343
|
log(`当前版本:${currentVersion} → 最新版本:${latestVersion}`)
|
|
325
344
|
}
|
|
326
345
|
|
|
327
|
-
hr()
|
|
328
|
-
log(`正在升级...`)
|
|
329
|
-
|
|
330
346
|
const npmCmd = "npm"
|
|
331
347
|
// 有明确版本号时用精确版本,绕过 @latest dist-tag 缓存
|
|
332
348
|
const installTarget = latestVersion
|
package/dist/index.js
CHANGED
|
@@ -19759,7 +19759,7 @@ import * as zlib from "node:zlib";
|
|
|
19759
19759
|
// lib/version-injected.ts
|
|
19760
19760
|
function getInjectedVersion() {
|
|
19761
19761
|
try {
|
|
19762
|
-
const v = "0.6.
|
|
19762
|
+
const v = "0.6.2";
|
|
19763
19763
|
if (typeof v === "string" && /^\d+\.\d+\.\d+/.test(v)) {
|
|
19764
19764
|
return v;
|
|
19765
19765
|
}
|
package/install.mjs
CHANGED
|
@@ -155,7 +155,10 @@ function shouldCopyMd(base) {
|
|
|
155
155
|
// B. 路径 / 常量(照搬两脚本并集)
|
|
156
156
|
// ────────────────────────────────────────────────────────────────────
|
|
157
157
|
function xdgConfigHome() {
|
|
158
|
-
|
|
158
|
+
if (process.env.XDG_CONFIG_HOME) return process.env.XDG_CONFIG_HOME
|
|
159
|
+
// Windows:opencode 默认用 %APPDATA%\opencode(与 XDG 不同)
|
|
160
|
+
if (IS_WIN && process.env.APPDATA) return process.env.APPDATA
|
|
161
|
+
return path.join(os.homedir(), ".config")
|
|
159
162
|
}
|
|
160
163
|
|
|
161
164
|
function resolvePaths({ mode }) {
|
|
@@ -452,7 +455,7 @@ function installMdDirs({ targetRoot }) {
|
|
|
452
455
|
const srcPath = path.join(SOURCE_ROOT, srcName)
|
|
453
456
|
const dstPath = path.join(targetRoot, dstName)
|
|
454
457
|
if (!fs.existsSync(srcPath) || !fs.statSync(srcPath).isDirectory()) {
|
|
455
|
-
|
|
458
|
+
vlog(`源目录不存在,跳过: ${srcPath}`)
|
|
456
459
|
continue
|
|
457
460
|
}
|
|
458
461
|
if (fs.existsSync(dstPath) || isSymlink(dstPath)) rmrf(dstPath)
|
|
@@ -487,7 +490,7 @@ function installCopyDirs({ targetRoot }) {
|
|
|
487
490
|
const srcPath = path.join(SOURCE_ROOT, srcName)
|
|
488
491
|
const dstPath = path.join(targetRoot, dstName)
|
|
489
492
|
if (!fs.existsSync(srcPath) || !fs.statSync(srcPath).isDirectory()) {
|
|
490
|
-
|
|
493
|
+
vlog(`源目录不存在,跳过: ${srcPath}`)
|
|
491
494
|
continue
|
|
492
495
|
}
|
|
493
496
|
ensureDir(dstPath)
|
|
@@ -500,7 +503,7 @@ function installSkills({ targetRoot }) {
|
|
|
500
503
|
const skillsSrc = path.join(SOURCE_ROOT, "skills")
|
|
501
504
|
const skillsDst = path.join(targetRoot, "skills")
|
|
502
505
|
if (!fs.existsSync(skillsSrc) || !fs.statSync(skillsSrc).isDirectory()) {
|
|
503
|
-
|
|
506
|
+
vlog(`skills/ 目录不存在,跳过(发布包未含 skills)`)
|
|
504
507
|
return
|
|
505
508
|
}
|
|
506
509
|
ensureDir(skillsDst)
|
|
@@ -525,7 +528,7 @@ function installAssets({ targetRoot }) {
|
|
|
525
528
|
const assetsSrc = path.join(SOURCE_ROOT, "assets")
|
|
526
529
|
const assetsDst = path.join(targetRoot, "assets")
|
|
527
530
|
if (!fs.existsSync(assetsSrc) || !fs.statSync(assetsSrc).isDirectory()) {
|
|
528
|
-
|
|
531
|
+
vlog(`assets/ 目录不存在,跳过(发布包未含 assets)`)
|
|
529
532
|
return
|
|
530
533
|
}
|
|
531
534
|
ensureDir(assetsDst)
|