@share-crm/sharedev-cli 0.0.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.
@@ -0,0 +1,15 @@
1
+ /*!
2
+ * mime-db
3
+ * Copyright(c) 2014 Jonathan Ong
4
+ * Copyright(c) 2015-2022 Douglas Christopher Wilson
5
+ * MIT Licensed
6
+ */
7
+
8
+ /*!
9
+ * mime-types
10
+ * Copyright(c) 2014 Jonathan Ong
11
+ * Copyright(c) 2015 Douglas Christopher Wilson
12
+ * MIT Licensed
13
+ */
14
+
15
+ /*! Axios v1.13.6 Copyright (c) 2026 Matt Zabriskie and contributors */
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@share-crm/sharedev-cli",
3
+ "version": "0.0.1",
4
+ "private": false,
5
+ "description": "sharedev command line tool",
6
+ "type": "module",
7
+ "main": "dist/sharedev.js",
8
+ "bin": {
9
+ "sharedev": "./bin/cli.mjs"
10
+ },
11
+ "author": {
12
+ "name": "sharecrm-npm"
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "bin",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc --noEmit && webpack --config build/webpack/webpack.prod.cjs",
21
+ "dev": "tsc --noEmit --watch & webpack --config build/webpack/webpack.dev.cjs --watch",
22
+ "dev2": "node src/cli.ts",
23
+ "typecheck": "tsc --noEmit",
24
+ "prettier": "prettier --write ./src/**/*.ts",
25
+ "publish": "npm publish --registry=http://registry-npm.firstshare.cn/"
26
+ },
27
+ "dependencies": {
28
+ "@clack/prompts": "^1.1.0",
29
+ "@mariozechner/pi-coding-agent": "^0.62.0",
30
+ "axios": "^1.11.0",
31
+ "chalk": "^5.6.2",
32
+ "commander": "^14.0.1",
33
+ "fast-xml-parser": "^5.2.5",
34
+ "extract-zip": "^2.0.1",
35
+ "fs-extra": "^11.3.2",
36
+ "ora": "^9.3.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/extract-zip": "^2.0.3",
40
+ "@types/fs-extra": "^11.0.4",
41
+ "@types/node": "^24.3.0",
42
+ "ts-loader": "^9.5.4",
43
+ "typescript": "^5.9.2",
44
+ "webpack": "^5.101.3",
45
+ "webpack-cli": "^6.0.1",
46
+ "webpack-merge": "^6.0.1"
47
+ },
48
+ "packageManager": "pnpm@10.17.0"
49
+ }
package/readme.md ADDED
@@ -0,0 +1,324 @@
1
+ # sharedev CLI 技术方案
2
+
3
+ ## 项目概览
4
+
5
+ `sharedev` 是一个基于 Node.js 的命令行工具,用于 APL 函数、PWC 组件和开发元数据的本地开发工作流。
6
+
7
+ - 命令入口:`sharedev`
8
+ - 业务命名空间:`apl`、`pwc`
9
+ - 构建工具:webpack + TypeScript
10
+ - 运行时:Node.js 18+
11
+
12
+ ---
13
+
14
+ ## 命令设计
15
+
16
+ ### 命令树
17
+
18
+ ```
19
+ sharedev
20
+ ├── init # 项目初始化,生成目录、git 仓库、.gitignore 和 .sharedev/settings.json
21
+ ├── apl
22
+ │ ├── list # 列出远端 APL 函数摘要
23
+ │ ├── info <apiName> # 查询 APL 函数详情
24
+ │ ├── pull [apiName] # 拉取单个或全部 APL 函数到本地
25
+ │ ├── diff [apiName] # 对比本地与快照/远端版本
26
+ │ ├── push [apiName] # 提交单个或全部本地变更到远端
27
+ │ ├── reset [apiName] # 回滚本地文件到远端最新或指定版本
28
+ │ ├── compile [apiName] # 编译检测本地源码
29
+ │ ├── analyze [apiName] # 静态分析本地源码
30
+ │ ├── debug [apiName] # 运行函数调试
31
+ │ └── create # 创建函数/类并写入本地源码
32
+ ├── pwc
33
+ │ ├── pull <apiName> # 拉取组件/插件到本地
34
+ │ ├── push <apiName> # 提交本地变更
35
+ │ ├── publish <apiName> # 发布
36
+ │ ├── dev <apiName> # 本地开发模式(待规划)
37
+ │ └── create # 创建组件(预留)
38
+ ├── dev-metadata
39
+ │ ├── search [query] # 搜索对象元数据
40
+ │ ├── info [apiName] # 查询对象详情
41
+ │ ├── download [apiName] # 下载单个对象元数据 markdown
42
+ │ ├── download --all # 批量下载对象元数据 markdown
43
+ │ └── namespace # 下载运行时命名空间元数据
44
+ └── skill # 预留
45
+ ├── init # 下载 skill 到平台目录
46
+ ├── pull/push/list/unset # 预留命令位
47
+ ```
48
+
49
+ ### 全局参数
50
+
51
+ - `--version` / `-v`:输出版本号
52
+ - `--help` / `-h`:显示帮助信息
53
+
54
+ ---
55
+
56
+ ## APL 功能方案
57
+
58
+ ### 本地工作区模型
59
+
60
+ ```text
61
+ <settingsParent>/
62
+ ├── package/
63
+ │ ├── fx/custom/apl/script/ # package_name 为空时的默认目录
64
+ │ │ └── <apiName>.<type>.groovy
65
+ │ └── <package_name as path>/ # package_name 中的 . 会被替换为 /
66
+ │ └── <apiName>.<type>.groovy
67
+ └── .sharedev/
68
+ └── apl/
69
+ └── .sharedev/
70
+ ├── snapshot.json # 已拉取/已提交版本的源码快照
71
+ ├── versions.json # 版本信息
72
+ └── metadata.json # 绑定对象、参数等元信息
73
+ ```
74
+
75
+ ### 当前已实现命令
76
+
77
+ - `apl list`
78
+ - 拉取远端函数列表
79
+ - 仅保留 `lang === 0` 且 `is_control !== true` 的 Groovy 函数
80
+ - 输出 `apiName/functionName/packageName/version`
81
+ - `apl info <apiName> [--bind <bindingObjectApiName>]`
82
+ - 查询单个函数详情
83
+ - 终端输出摘要和参数列表
84
+ - `apl pull <apiName>` / `apl pull --all`
85
+ - 单个或批量拉取远端源码
86
+ - 写入本地 `.groovy` 文件
87
+ - 同步更新 snapshot / versions / metadata
88
+ - `apl diff <apiName> [--remote latest|<version>]`
89
+ - 默认对比本地文件和 snapshot
90
+ - 支持对比远端 latest 或指定版本
91
+ - 输出 unified diff 和增删行统计
92
+ - `apl push [apiName] --remark <comment> [--force]`
93
+ - `apiName` 存在时只提交单个函数;省略时提交所有已跟踪且有本地变更的函数
94
+ - 提交前执行远端版本冲突检查、analyze、compile
95
+ - 成功后回写本地源码和 snapshot
96
+ - `apl reset <apiName> [--remote latest|<version>]`
97
+ - 使用远端 latest 或指定版本覆盖本地文件
98
+ - 同步更新 snapshot
99
+ - `apl analyze <apiName>`
100
+ - 基于本地源码和远端元信息执行静态分析
101
+ - 输出 JSON 结果
102
+ - `apl compile <apiName>`
103
+ - 基于本地源码和远端元信息执行编译检查
104
+ - `apl debug <apiName> [--data-id <id>] [--param <name=value>]...`
105
+ - 读取本地源码进行调试
106
+ - 绑定对象 data id 和函数参数支持 CLI 传参,也支持交互补齐
107
+ - 输出调试摘要和原始结果
108
+ - `apl create`
109
+ - 支持创建 `function` / `class`
110
+ - 支持通过命令参数或交互输入补齐 apiName、functionName、namespace、package、returnType、bind、remark、templateId
111
+ - 先在远端创建,再将生成后的源码写入本地并写入 snapshot
112
+
113
+ ### 主要流程
114
+
115
+ **pull**:按单个或批量方式获取远端函数详情 → 写入本地 `.groovy` 文件 → 记录 snapshot / versions / metadata
116
+
117
+ **push**:读取本地 tracked 文件 → 与 snapshot 比较变更 → 校验远端版本冲突 → analyze / compile → 提交更新 → 更新本地源码和 snapshot
118
+
119
+ **diff**:按 `apiName` 定位本地 tracked 文件 → 基于 snapshot 或远端版本生成 unified diff
120
+
121
+ **reset**:获取远端 latest 或指定版本 → 覆盖本地源码并更新 snapshot
122
+
123
+ **compile / analyze**:读取本地 tracked 源码并拼接远端元信息 → 调用远端编译或分析接口
124
+
125
+ **debug**:CLI 参数优先,缺失时通过交互补齐绑定对象 data id 和函数参数 → 构造 payload 调用远端调试接口
126
+
127
+ **create**:先加载 namespace / returnType / binding object 元数据 → 构造模板 → 远端创建 → 本地写入源码和 snapshot
128
+
129
+ ### 模块职责
130
+
131
+ | 模块 | 职责 |
132
+ |------|------|
133
+ | `apl.service.ts` | 远端接口封装:列表、详情、版本查询、create、push、compile、analyze、debug |
134
+ | `apl.workspace.ts` | 本地源码路径解析、tracked 文件发现、snapshot / metadata 管理 |
135
+ | `apl.command.ts` | CLI 参数校验、交互补齐、命令编排、diff 输出 |
136
+
137
+ ---
138
+
139
+ ## Dev Metadata 功能方案
140
+
141
+ ### 本地输出模型
142
+
143
+ ```text
144
+ <settingsDir>/docs/dev-metadata/
145
+ ├── objects/
146
+ │ ├── objects.md # 全量对象索引(download --all 时生成)
147
+ │ └── <apiName>.md # 单个对象详情文档
148
+ └── namespaces/
149
+ └── namespaces.json # 运行时命名空间原始结果
150
+ ```
151
+
152
+ 说明:
153
+ - 未显式传 `--output` 时,输出目录默认位于 `.sharedev/docs/dev-metadata/`
154
+ - 传入 `--output` 时,相对路径基于命令执行时的 `workingDir/cwd` 解析
155
+
156
+ ### 当前已实现命令
157
+
158
+ - `dev-metadata search [query]`
159
+ - 调用对象列表接口
160
+ - 本地按 `api_name / display_name / display_name_r` 过滤和排序
161
+ - 输出标准化 JSON 摘要
162
+ - `dev-metadata info [apiName]`
163
+ - 先按 apiName 直接查询详情
164
+ - 直查失败时回退到列表搜索候选项
165
+ - 候选项多于 1 个时,交互选择目标对象
166
+ - 输出对象摘要、字段列表和 layout 摘要
167
+ - `dev-metadata download <apiName>`
168
+ - 下载单个对象详情并写成 markdown
169
+ - `dev-metadata download --all`
170
+ - 拉取对象列表并逐个下载详情
171
+ - 输出每个对象的 markdown 文件
172
+ - 同时生成 `objects.md` 索引
173
+ - `dev-metadata namespace [--output <dir>]`
174
+ - 调用运行时 namespace 接口
175
+ - 以原始 JSON 形式写入 `namespaces.json`
176
+
177
+ ### 主要流程
178
+
179
+ **search**:拉取对象列表 → 本地过滤 / 排序 → 输出 JSON 摘要
180
+
181
+ **info**:优先直查对象详情 → 失败时回退候选搜索与交互选择 → 输出终端可读摘要
182
+
183
+ **download**:拉取对象详情 → 渲染 markdown → 写入对象文档目录
184
+
185
+ **download --all**:拉取对象列表 → 逐个请求详情并落盘 → 生成对象索引
186
+
187
+ **namespace**:调用运行时 namespace 元数据接口 → 原样写入 JSON 文件
188
+
189
+ ### 模块职责
190
+
191
+ | 模块 | 职责 |
192
+ |------|------|
193
+ | `dev-metadata.service.ts` | 对象列表、对象详情、运行时 namespace 接口封装,以及搜索过滤 / 排序 |
194
+ | `dev-metadata.workspace.ts` | 输出目录解析、对象 markdown 渲染、索引和 namespace 文件写入 |
195
+ | `dev-metadata.command.ts` | search / info / download / namespace 命令编排与交互 |
196
+
197
+ ---
198
+
199
+ ## PWC 功能方案
200
+
201
+ ### 本地目录模型
202
+
203
+ ```
204
+ <workspace>/
205
+ ├── pwc-components/<apiName>/ # type=component 时
206
+ │ ├── mateXml.xml
207
+ │ ├── source/
208
+ │ ├── static/
209
+ │ ├── fileTree/
210
+ │ └── .sharedev-meta.json
211
+ └── pwc-plugins/<apiName>/ # type=plugin 时
212
+ ├── mateXml.xml
213
+ ├── source/
214
+ ├── static/
215
+ ├── fileTree/
216
+ └── .sharedev-meta.json
217
+ ```
218
+
219
+ ### 主要流程
220
+
221
+ **pull**:按 `apiName` 拉取完整数据 → 写入 `mateXml.xml`、source、static、fileTree → 生成 `.sharedev-meta.json`
222
+
223
+ **push**:扫描本地文件 → 排除 `mateXml.xml` → 按类型组装 sourceFiles/images/fileTree → 调用 `updateCodeSource`
224
+
225
+ **publish**:复用 push 逻辑
226
+
227
+ ### 模块职责
228
+
229
+ | 模块 | 职责 |
230
+ |------|------|
231
+ | `pwc.service.ts` | 远端接口封装:fetchCode、downloadFile、uploadFile、updateCodeSource |
232
+ | `pwc.workspace.ts` | 本地目录初始化、mateXml 读写、entryFileName 解析 |
233
+ | `pwc.publish.ts` | 文件装配、类型归类、发布编排 |
234
+
235
+ ---
236
+
237
+ ## 配置方案
238
+
239
+ 配置文件固定为 `.sharedev/settings.json`,内容:
240
+
241
+ ```json
242
+ {
243
+ "certificate": "<token>",
244
+ "domain": "https://www.fxiaoke.com/"
245
+ }
246
+ ```
247
+
248
+ `config.ts` 提供:
249
+
250
+ - `findSettings()`:从当前工作目录向上查找配置文件
251
+ - `loadSettings()`:读取并校验配置
252
+ - `getSettings()`:单例式配置访问
253
+
254
+ 配置文件缺失时立即报错退出,不发请求。
255
+
256
+ ---
257
+
258
+ ## 公共基础服务
259
+
260
+ ### loggerService (`src/core/logger.ts`)
261
+
262
+ 统一管理所有终端输出,基于 `chalk`:
263
+
264
+ | 方法 | 用途 |
265
+ |------|------|
266
+ | `info/success/warn/error(message)` | 带 `[sharedev]` 前缀的可读日志 |
267
+ | `debug(message)` | 仅在 `--verbose` 下输出 |
268
+ | `printJson(data)` | 输出纯 JSON(供 list/analyze/debug 等命令) |
269
+ | `printRaw(text)` | 不加前缀原样输出(用于 diff) |
270
+ | `startLoading(message)` | 启动 loading |
271
+ | `updateLoading(message)` | 更新 loading 文案 |
272
+ | `stopLoading()` | 停止 loading |
273
+
274
+ 退化策略:非 TTY 或 `--verbose` 下,loading 退化为稳定文本,避免控制字符污染日志。
275
+
276
+ ### requestService (`src/core/request.ts`)
277
+
278
+ 基于 `axios` 封装,统一注入 `domain` 和 `certificate`,提供 `get/post/request` 方法。
279
+
280
+ ---
281
+
282
+ ## 构建方案
283
+
284
+ - 源码入口:`src/cli.ts`
285
+ - webpack 配置:`build/webpack/webpack.{common,dev,prod}.cjs`
286
+ - 构建产物:`dist/sharedev.js`
287
+ - 发布入口:`bin/cli.mjs`(加载 `dist/sharedev.js`,含 shebang)
288
+
289
+ 第三方依赖(axios、chalk、commander、ora、@clack/prompts 等)全部打入 bundle,不依赖外部 node_modules。
290
+
291
+ ---
292
+
293
+ ## 实施计划
294
+
295
+ ### 第一期(最小可用)
296
+
297
+ 1. 项目骨架:package.json、tsconfig、webpack 构建配置
298
+ 2. CLI 入口:`sharedev apl`、`sharedev pwc` 命令注册
299
+ 3. `.sharedev/settings.json` 查找与校验
300
+ 4. loggerService 和 requestService 基础实现
301
+ 5. APL pull / push 基础能力
302
+ 6. PWC pull / push 基础能力
303
+
304
+ ### 第二期
305
+
306
+ 1. APL diff / reset / compile / analyze / debug
307
+ 2. APL 批量 push
308
+ 3. PWC publish
309
+ 4. dev-metadata search / info / download / namespace
310
+
311
+ ### 第三期
312
+
313
+ 1. APL / PWC create 的更多模板与能力
314
+ 2. watch 模式
315
+ 3. 更完整的冲突处理
316
+
317
+ ---
318
+
319
+ ## 风险与注意事项
320
+
321
+ 1. **VS Code 扩展能力不可直接迁移**:CLI 中用 Node 文件系统 API、终端交互、本地快照替代 VS Code API
322
+ 2. **配置是前置条件**:`.sharedev/settings.json` 缺失时不能继续执行,不能带空配置发请求
323
+ 3. **不要暴露 certificate**:`certificate` 字段不能明文打印到日志
324
+ 4. **APL 和 PWC 抽象层次不同**:APL 是单文件函数,PWC 是多目录组件,工作区模型不共用