base_parts_ai 1.0.35 → 1.0.37

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/.eslintrc.js CHANGED
@@ -118,10 +118,7 @@ module.exports = {
118
118
  "no-implicit-globals": "error",
119
119
  "no-implied-eval": "error",
120
120
  "no-inline-comments": "off",
121
- "no-inner-declarations": [
122
- "error",
123
- "functions"
124
- ],
121
+ "no-inner-declarations": "off",
125
122
  "no-invalid-this": "off",
126
123
  "no-iterator": "error",
127
124
  "no-label-var": "error",
package/bin/jcc.js CHANGED
@@ -1,7 +1,3 @@
1
- #!/usr/bin/env node
2
-
3
- var jutils = require('base_parts');
4
- var jlog = jutils.jlog(__filename);
5
1
 
6
2
  var fs = require('fs');
7
3
  var os = require('os');
@@ -11,10 +7,6 @@ var { Command } = require('commander');
11
7
  var program = new Command();
12
8
 
13
9
 
14
- // 关闭日志输出
15
- jlog.setEnable(false, "*");
16
-
17
-
18
10
  /**
19
11
  * 获取配置文件
20
12
  * @param {string} cmd 命令行
@@ -9,6 +9,7 @@ var fs = require('fs');
9
9
  var path = require('path');
10
10
  var http = require('http');
11
11
  var { execSync } = require('child_process');
12
+ var { select } = require('@inquirer/prompts');
12
13
 
13
14
  // ============================================================
14
15
  // AI 渠道列表(运行时由 fetchConfig 从服务端拉取填充)
@@ -52,20 +53,30 @@ function fetchConfig(buildCfg) {
52
53
  var currentVer = '';
53
54
  try { currentVer = require('../package.json').version; } catch (e) { }
54
55
  var newVer = result.data.newVer || '';
55
- if (newVer && newVer !== currentVer) {
56
+ // 比较语义化版本号,仅当服务端版本大于当前版本时才升级
57
+ function semverGt(a, b) {
58
+ var pa = a.split('.').map(Number);
59
+ var pb = b.split('.').map(Number);
60
+ for (var i = 0; i < 3; i++) {
61
+ if ((pa[i] || 0) > (pb[i] || 0)) return true;
62
+ if ((pa[i] || 0) < (pb[i] || 0)) return false;
63
+ }
64
+ return false;
65
+ }
66
+ if (newVer && semverGt(newVer, currentVer)) {
56
67
  console.log('[fetchConfig] 检测到新版本 jcc: ' + newVer + '(当前 ' + currentVer + ')');
57
- // select 上下选,默认高亮"立即升级"
58
- var { select } = require('@inquirer/prompts');
59
- var confirmed = await select({
60
- message: '是否立即升级?',
61
- default: 'yes',
62
- choices: [
63
- { name: '立即升级', value: 'yes' },
64
- { name: '跳过', value: 'no' },
65
- ],
66
- });
68
+ var confirmed = "yes"
69
+ // confirmed = await select({
70
+ // message: '是否立即升级?',
71
+ // default: 'yes',
72
+ // choices: [
73
+ // { name: '立即升级', value: 'yes' },
74
+ // { name: '跳过', value: 'no' },
75
+ // ],
76
+ // });
67
77
  if (confirmed === 'yes') {
68
78
  console.log('[fetchConfig] 正在升级...');
79
+ // 用 select 上下选,默认高亮"立即升级"
69
80
  try {
70
81
  var tgzUrl = 'https://jdwfiles.oss-cn-hangzhou.aliyuncs.com/npm_pkg/base_parts_ai-' + newVer + '.tgz';
71
82
  execSync('npm install -g ' + tgzUrl + ' --force', { stdio: 'inherit' });
package/lib/setapi.js CHANGED
@@ -104,36 +104,28 @@ module.exports = async function (cmd, buildCfg) {
104
104
  console.log(' BASE_URL: ' + settings.env.ANTHROPIC_BASE_URL);
105
105
  console.log(' Token: ' + utils.maskKey(settings.env.ANTHROPIC_AUTH_TOKEN));
106
106
  } else {
107
- // 查询该渠道是否有缓存的 Key
107
+ // 查询该渠道是否有缓存的 Key,作为输入框默认值(方便用户确认或修改)
108
108
  var savedKey = (jccJson.keys && jccJson.keys[selected.id]) || '';
109
- if (savedKey) {
110
- // 已有缓存 Key,直接切换
111
- settings.env.ANTHROPIC_AUTH_TOKEN = savedKey;
112
- utils.writeJsonFile(buildCfg.claudeSettingsPath, settings);
113
- console.log('✅ 已切换到渠道: ' + selected.name);
114
- console.log(' Key: ' + utils.maskKey(savedKey));
115
- } else {
116
- // 无缓存 Key,提示用户输入
117
- // console.log('⚠️ 渠道 [' + selected.name + '] 尚未设置 Key,请输入:');
118
- var newKey = await input({
119
- message: '请输入 ANTHROPIC_AUTH_TOKEN:',
120
- validate: function (v) {
121
- return v.trim().length > 0 ? true : 'Key 不能为空';
122
- },
123
- });
124
- newKey = newKey.trim();
125
-
126
- // 写入 settings.json
127
- settings.env.ANTHROPIC_AUTH_TOKEN = newKey;
128
- utils.writeJsonFile(buildCfg.claudeSettingsPath, settings);
129
-
130
- // 缓存到 jcc.json
131
- if (!jccJson.keys) { jccJson.keys = {}; }
132
- jccJson.keys[selected.id] = newKey;
133
- utils.writeJsonFile(buildCfg.jccJsonPath, jccJson);
134
-
135
- console.log('✅ 已切换到渠道: ' + selected.name + ',Key 已保存到本地缓存。');
136
- }
109
+ var newKey = await input({
110
+ message: '请输入 ANTHROPIC_AUTH_TOKEN:',
111
+ default: savedKey,
112
+ validate: function (v) {
113
+ return v.trim().length > 0 ? true : 'Key 不能为空';
114
+ },
115
+ });
116
+ newKey = newKey.trim();
117
+
118
+ // 写入 settings.json
119
+ settings.env.ANTHROPIC_AUTH_TOKEN = newKey;
120
+ utils.writeJsonFile(buildCfg.claudeSettingsPath, settings);
121
+
122
+ // 缓存到 jcc.json
123
+ if (!jccJson.keys) { jccJson.keys = {}; }
124
+ jccJson.keys[selected.id] = newKey;
125
+ utils.writeJsonFile(buildCfg.jccJsonPath, jccJson);
126
+
127
+ console.log('✅ 已切换到渠道: ' + selected.name + ',Key 已保存到本地缓存。');
128
+ console.log(' Key: ' + utils.maskKey(newKey));
137
129
  }
138
130
 
139
131
  // 从 ccVersionList 对象中确定目标版本号
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "base_parts_ai",
3
- "version": "1.0.35",
3
+ "version": "1.0.37",
4
4
  "description": "jaskle base_parts_ai",
5
5
  "main": "./main.js",
6
6
  "registry": true,
7
7
  "directories": {},
8
8
  "scripts": {
9
- "test": "node ./test_jcc.js"
9
+ "test": "node ./test_jcc.js",
10
+ "postinstall": "node -e \"console.log('\\x1b[1;96m\\n ╔══════════════════════════════════════════╗\\n ║ \\x1b[1;93m安装完成!输入以下命令开始配置:\\x1b[1;96m\\n ║ \\x1b[1;92mjcc\\x1b[1;97m 配置或安装 ClaudeCode\\x1b[1;96m \\n ╚══════════════════════════════════════════╝\\x1b[0m\\n')\""
10
11
  },
11
12
  "bin": {
12
13
  "jcc": "./bin/jcc.js"
@@ -17,11 +18,9 @@
17
18
  "author": "jaskle",
18
19
  "license": "ISC",
19
20
  "dependencies": {
20
- "base_parts": "^2.*",
21
- "commander": "^14.0.3",
22
- "inquirer": "^13.3.2"
21
+ "commander": "https://jdwfiles.oss-cn-hangzhou.aliyuncs.com/npm_pkg/commander-14.0.3.tgz",
22
+ "inquirer": "https://jdwfiles.oss-cn-hangzhou.aliyuncs.com/npm_pkg/inquirer-13.3.2.tgz"
23
23
  },
24
24
  "devDependencies": {
25
- "base_parts_types": "^2.*"
26
25
  }
27
26
  }
package/lib/build_japp.js DELETED
@@ -1,187 +0,0 @@
1
- let glob = require("glob")
2
- let archiver = require('archiver');
3
- let jutils = require('base_parts');
4
-
5
- let fs = require('fs');
6
- let os = require('os');
7
- let path = require('path');
8
- var AdmZip = require('adm-zip');
9
-
10
- module.exports = async (cmd, buildCfg) => {
11
- return new Promise((resolve, reject) => {
12
- (async () => {
13
- // 待删除列表
14
- var deleteList = [];
15
-
16
- // 读取sh脚本
17
- var shDataStr = fs.readFileSync(buildCfg.rootPath + "/jbuild_data/repair.sh", "utf8");
18
-
19
- // 建立压缩文件
20
- console.log(`build file to ${buildCfg.outpath}`);
21
- let output = fs.createWriteStream(buildCfg.outpath);
22
- let archive = archiver('zip', {
23
- zlib: { level: 9 }
24
- });
25
- output.on('close', function () {
26
- // 清理
27
- for (const iterator of deleteList) {
28
- fs.unlinkSync(iterator);
29
- }
30
-
31
- // 完成
32
- console.log(archive.pointer() + ' total bytes');
33
- console.log(`build success:${buildCfg.outpath}`);
34
- resolve();
35
- });
36
- output.on('end', function () {
37
- });
38
- archive.on('warning', function (err) {
39
- if (err.code === 'ENOENT') {
40
- } else {
41
- reject(err);
42
- }
43
- });
44
- archive.on('error', function (err) {
45
- reject(err);
46
- });
47
- archive.pipe(output);
48
-
49
- // 添加应用
50
- if (!cmd.noapp) {
51
-
52
- // 修改版本号
53
- try {
54
- console.log(`change dist ver ...`);
55
- var repFile = `${buildCfg.rootPath}\\dist\\index.html`;
56
- var indexStr = fs.readFileSync(repFile, "utf8");
57
- indexStr = indexStr.replace(/#J_APPNAME#/g, buildCfg.appName);
58
- indexStr = indexStr.replace(/#J_DATE#/g, buildCfg.dateStr);
59
-
60
- // 读取H5版本
61
- try {
62
- var bInfoStr = fs.readFileSync(`${buildCfg.rootPath}/jbuild_data/info.txt`, "utf8");
63
- var bInfoObj = JSON.parse(bInfoStr);
64
- if (bInfoObj.version) {
65
- indexStr = indexStr.replace(/#J_H5_VER#/g, bInfoObj.version);
66
- }
67
- } catch (error) {
68
- console.log(`no h5Ver!`);
69
- }
70
-
71
- // 保存
72
- fs.writeFileSync(repFile, indexStr);
73
- } catch (error) {
74
- }
75
-
76
- // 添加用户文件
77
- let pathSub = "dist";
78
- console.log(`scaning ${pathSub} ...`);
79
- let fileList = glob(`${pathSub}/**/*`, {
80
- dot: true,
81
- sync: true,
82
- nodir: true,
83
- cwd: buildCfg.rootPath,
84
- ignore: []
85
- });
86
- if (fileList.length === 0) {
87
- console.error("no dist files!");
88
- return;
89
- }
90
- console.log(`add [${fileList.length}] files ...`);
91
- for (let index = 0; index < fileList.length; index++) {
92
- let element = fileList[index].substr(pathSub.length + 1);
93
-
94
- // 添加文件
95
- archive.file(`${buildCfg.rootPath}/${pathSub}/${element}`, { name: "update_a20/h5app/" + element });
96
- }
97
- // 清空应用目录
98
- shDataStr = shDataStr.replace(/#del_app#/g, "");
99
- // 复制应用文件
100
- shDataStr = shDataStr.replace(/#copy_app#/g, "");
101
- }
102
-
103
- // 添加框架二进制
104
- if (!cmd.nobin) {
105
- let pathSub = "jbuild_data/bin";
106
- console.log(`scaning ${pathSub} ...`);
107
- let fileList = glob(`${pathSub}/**/*`, {
108
- dot: true,
109
- sync: true,
110
- nodir: true,
111
- cwd: buildCfg.rootPath,
112
- ignore: []
113
- });
114
- console.log(`add [${fileList.length}] files ...`);
115
- for (let index = 0; index < fileList.length; index++) {
116
- let element = fileList[index].substr(pathSub.length + 1);
117
-
118
- // 添加文件
119
- archive.file(`${buildCfg.rootPath}/${pathSub}/${element}`, { name: "update_a20/app/bin/" + element });
120
- }
121
-
122
- // 添加框架apk
123
- archive.file(`${buildCfg.rootPath}/jbuild_data/app-debug.apk`, { name: "update_a20/app/app-debug.apk" });
124
-
125
- // 清空模型文件
126
- shDataStr = shDataStr.replace(/#del_bin#/g, "");
127
- }
128
-
129
- // 添加后台服务
130
- if (!cmd.noweb) {
131
- console.log(`add device_webapi files ...`);
132
- // 载入zip
133
- var myZip = new AdmZip(`${buildCfg.rootPath}/jbuild_data/device_webapi.zip`);
134
-
135
- // 循环添加
136
- var zipEntries = myZip.getEntries();
137
- zipEntries.forEach(function (zipEntry) {
138
- let tmpFile = path.resolve(`${buildCfg.rootPath}/jbuild_data/${zipEntry.entryName}.tmp`);
139
- fs.writeFileSync(tmpFile, zipEntry.getData());
140
- deleteList.push(tmpFile);
141
- archive.file(tmpFile, { name: "update_a20/" + zipEntry.entryName });
142
- });
143
-
144
- // 复制web
145
- shDataStr = shDataStr.replace(/#copy_web#/g, "");
146
- }
147
-
148
- // 恢复出厂设置
149
- if (cmd.reset) {
150
- shDataStr = shDataStr.replace(/#rest#/g, "");
151
- }
152
-
153
- // 添加sh
154
- try {
155
- let tmpFile = path.resolve(`${buildCfg.rootPath}/jbuild_data/repair.sh.tmp`);
156
- fs.writeFileSync(tmpFile, shDataStr);
157
- deleteList.push(tmpFile);
158
- archive.file(tmpFile, { name: "update_a20/repair.sh" });
159
- } catch (error) {
160
- }
161
-
162
- // 添加设备信息
163
- try {
164
- var pkgInfo = os.networkInterfaces();
165
- pkgInfo.buildTime = jutils.getNowDate();
166
-
167
- let tmpFile = path.resolve(`${buildCfg.rootPath}/jbuild_data/build_info.txt`);
168
- fs.writeFileSync(tmpFile, JSON.stringify(pkgInfo, null, 4));
169
- deleteList.push(tmpFile);
170
- archive.file(tmpFile, { name: "update_a20/build_info.txt" });
171
- } catch (error) {
172
- }
173
-
174
- // 开始压缩
175
- archive.finalize();
176
- })().catch((err) => {
177
- console.error(err.message);
178
- console.error("build error,please run [jh5 update] first.");
179
- try {
180
- jutils.jfile_utils.deleteFile(buildCfg.outpath);
181
- } catch (error) {
182
- }
183
- });
184
- });
185
-
186
- }
187
-