@ohos-cpf/3rdloop 0.0.1 → 0.0.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/README.md CHANGED
@@ -1,12 +1,53 @@
1
1
  # @ohos-cpf/3rdloop
2
2
 
3
- 3rdLibraryLoop 三方库自动化检视命令行工具(嵌入式模式)。
3
+ 三方库自动化检视命令行工具:基于 3rdLibraryLoop 核心引擎,从终端完整跑一遍"任务拆解 → 编排执行 → 准出审核"的大循环。
4
4
 
5
- `3rdloop` CLI 直接复用 3rdLibraryLoop 的**核心引擎**(LoopEngine / Brain / Orchestrator /
6
- FlexRunner / TestCheck / Knowledge),无需启动 HTTP 服务,即可从终端完整跑一遍
7
- "任务拆解 → 编排执行 → 准出审核"的大循环。
5
+ ![npm version](https://img.shields.io/npm/v/@ohos-cpf/3rdloop)
6
+ ![downloads](https://img.shields.io/npm/dm/@ohos-cpf/3rdloop)
7
+ ![license](https://img.shields.io/npm/l/@ohos-cpf/3rdloop)
8
8
 
9
- ## 快速开始
9
+ ## 功能特性
10
+
11
+ - **嵌入式核心引擎**:直接复用 3rdLibraryLoop 的 LoopEngine / Brain / Orchestrator / FlexRunner / TestCheck / Knowledge,无需启动 HTTP 服务
12
+ - **完整大循环**:任务拆解 → 编排执行 → 准出审核,多轮次自动重规划直到通过
13
+ - **任务生命周期管理**:提交 / 等待 / 查询进度 / 中止 / 列表 / 读结果
14
+ - **单步与固定编排**:`step` 单步执行(FlexRunner 直连)、`orch` 多步骤依赖编排、`workflows` 预置固定工作流一键执行
15
+ - **命令行配置**:`config` 子命令管理 `.env` 配置项(默认 `~/.3lib/.env`,跨项目全局生效)
16
+ - **自更新**:`update` 一键更新到 npm latest,尊重用户镜像源
17
+
18
+
19
+
20
+ ## 安装
21
+
22
+ ```bash
23
+ npm i -g @ohos-cpf/3rdloop
24
+ ```
25
+
26
+ 需要 Node.js >= 22。查看版本与环境自检:
27
+
28
+ ```bash
29
+ 3rdloop version
30
+ 3rdloop doctor
31
+ ```
32
+
33
+
34
+
35
+ ## 使用
36
+
37
+
38
+
39
+ ### 前置条件
40
+
41
+ - **Node.js** >= 22
42
+ - **opencode CLI**:`3rdloop` 会自动拉起 `opencode serve`(在项目上一级目录运行),退出时清理进程树;已存在则复用
43
+ - **LLM 凭据**:以下任一层配置即可
44
+ - 项目级:仓库 `Server/.env`
45
+ - 用户级:`~/.3lib/.env`
46
+ - 系统环境变量:`setx DASHSCOPE_API_KEY "sk-xxx"`
47
+
48
+
49
+
50
+ ### 快速开始
10
51
 
11
52
  ```bash
12
53
  # 环境自检
@@ -26,400 +67,179 @@ FlexRunner / TestCheck / Knowledge),无需启动 HTTP 服务,即可从终
26
67
  3rdloop result <taskId> --json
27
68
  ```
28
69
 
29
- ## 命令一览
30
-
31
- | 命令 | 说明 |
32
- |------|------|
33
- | `3rdloop run <desc>` | 提交任务并阻塞到准出终态(默认行为) |
34
- | `3rdloop submit <desc>` | 提交任务,打印 taskId 后进程内继续执行 |
35
- | `3rdloop wait <taskId> [--timeout 30m]` | 等待任务到终态 |
36
- | `3rdloop progress <taskId> [--watch]` | 查询进度;`--watch` 持续轮询到终态 |
37
- | `3rdloop abort <taskId>` | 中止任务 |
38
- | `3rdloop list [--status st] [--limit N] [--older-than 7d]` | 列出任务 |
39
- | `3rdloop result <taskId> [--raw]` | 读取最终结果 |
40
- | `3rdloop step run <desc> [--task-id id] [--step-id N] [--input-report p] [--max-retries N] [--loop N] [--task-dir p] [--specified-skill <SKILL name\|目录名>]` | 单步执行(FlexRunner 直连,不经拆解/编排/审核) |
41
- | `3rdloop step status <taskId> [--step-id N]` | 查询单步状态/产物/会话 |
42
- | `3rdloop step result <taskId> [--step-id N]` | 读取该步 result.md 内容 |
43
- | `3rdloop orch run <task-def.json>` | 加载任务定义 + 启动编排,阻塞到终态 |
44
- | `3rdloop orch load <task-def.json>` | 仅加载任务定义(落盘 orchestration.json) |
45
- | `3rdloop orch start <taskId>` | 从磁盘恢复 LOADED 状态并启动编排,阻塞到终态 |
46
- | `3rdloop orch progress <taskId> [--loop N]` | 查询编排进度 |
47
- | `3rdloop orch abort|pause|resume <taskId>` | 终止/暂停/恢复编排 |
48
- | `3rdloop orch tasks` | 列出编排任务 |
49
- | `3rdloop workflows` | 列出已注册的固定编排工作流 |
50
- | `3rd3rdloop run <工作流名> [--flag <值> ...]` | 以固定编排执行工作流(阻塞到终态) |
51
- | `3rdloop run pr-check --pr-url <URL> [--library-type <arkts\|flutter\|rn\|tpccplus>]` | PR 代码检视(等价前端 PR 检视面板,taskId 带 `codecheck_` 前缀) |
52
- | `3rdloop doctor` | 环境自检(Node/opencode/.env/SKILL/数据目录) |
53
- | `3rdloop version` | 版本信息 |
54
-
55
- ## 全局选项
56
-
57
- | 选项 | 说明 |
58
- |------|------|
59
- | `--json` | 结构化输出到 **stdout**(进度/日志走 stderr,脚本可安全解析 stdout) |
60
- | `-v, --verbose` | 详细模式 |
61
- | `--quiet` | 仅输出最终结果 |
62
- | `--data-dir <p>` | 数据目录覆盖(默认 `<项目根同级>/db`,如 `D:\code\3rdLibraryLoop` → `D:\code\db`) |
63
- | `--project <n>` | 项目名覆盖(默认取 git 仓库根名) |
64
- | `--skill-dir <p>` | SKILL 目录覆盖 |
65
- | `-h, --help` | 帮助 |
66
-
67
- ## 退出码
68
-
69
- | 码 | 含义 |
70
- |----|------|
71
- | 0 | 通过 / 成功 |
72
- | 1 | 错误(参数 / 环境 / 任务不存在) |
73
- | 2 | 任务执行失败(终态 `failed` / `error` / 未通过) |
74
- | 3 | `wait` 超时 |
75
- | 130 | Ctrl+C(SIGINT) |
76
- | 143 | SIGTERM |
77
-
78
- ## 单步执行(FlexRunner)
79
-
80
- `3rdloop step` 直接复用通用单步执行器 **FlexRunner**(不经 Brain 拆解 / Orchestrator
81
- 编排 / TestCheck 审核),适合"只跑一个步骤"的精确控制场景:
82
70
 
83
- ```bash
84
- # 阻塞执行单个步骤(成功退出码 0,失败 2)
85
- 3rdloop step run "为 libcurl 的 HTTP 请求生成 ArkTS demo" \
86
- --task-id step_demo_001 --step-id 1 --max-retries 2
87
71
 
88
- # 带输入报告 / 指定产物目录 / 指定大循环轮次
89
- 3rdloop step run "根据检视报告修复 XTS 用例" \
90
- --task-id step_fix_001 --input-report output/report.md --loop 1
72
+ ### 命令一览
91
73
 
92
- # 固定执行某个 SKILL(跳过 SkillSelector 匹配,直接使用该 SKILL)
93
- 3rdloop step run "为 FastBle 生成 XTS 代码" \
94
- --task-id step_skill_001 --specified-skill arkts-library-xts-code
95
74
 
96
- # 查询步骤状态或读取最终产物
97
- 3rdloop step status step_demo_001
98
- 3rdloop step result step_demo_001 --json
99
- ```
75
+ | 命令 | 说明 |
76
+ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- |
77
+ | `3rdloop run <desc>` | 提交任务并阻塞到准出终态(默认行为) |
78
+ | `3rdloop submit <desc>` | 提交任务,打印 taskId 后进程内继续执行 |
79
+ | `3rdloop wait <taskId> [--timeout 30m]` | 等待任务到终态 |
80
+ | `3rdloop progress <taskId> [--watch]` | 查询进度;`--watch` 持续轮询到终态 |
81
+ | `3rdloop abort <taskId>` | 中止任务 |
82
+ | `3rdloop list [--status st] [--limit N] [--older-than 7d]` | 列出任务 |
83
+ | `3rdloop result <taskId> [--raw]` | 读取最终结果 |
84
+ | `3rdloop step run <desc> [--task-id id] [--step-id N] [--input-report p] [--max-retries N] [--loop N] [--task-dir p] [--specified-skill <SKILL name|目录名>]` | 单步执行(FlexRunner 直连,不经拆解/编排/审核) |
85
+ | `3rdloop step status <taskId> [--step-id N]` | 查询单步状态/产物/会话 |
86
+ | `3rdloop step result <taskId> [--step-id N]` | 读取该步 result.md 内容 |
87
+ | `3rdloop orch run <task-def.json>` | 加载任务定义 + 启动编排,阻塞到终态 |
88
+ | `3rdloop orch load <task-def.json>` | 仅加载任务定义(落盘 orchestration.json,进程退出后仍可 start) |
89
+ | `3rdloop orch start <taskId>` | 从磁盘恢复 LOADED 状态并启动编排,阻塞到终态 |
90
+ | `3rdloop orch progress <taskId> [--loop N]` | 查询编排进度 |
91
+ | `3rdloop orch abort|pause|resume <taskId>` | 终止/暂停/恢复编排 |
92
+ | `3rdloop orch tasks` | 列出编排任务 |
93
+ | `3rdloop workflows` | 列出已注册的固定编排工作流 |
94
+ | `3rdloop run <工作流名> [--flag <值> ...]` | 以固定编排执行工作流(阻塞到终态) |
95
+ | `3rdloop run pr-check --pr-url <URL> [--library-type <arkts|flutter|rn|tpccplus>]` | PR 代码检视 |
96
+ | `3rdloop run pr-push [--workspace-dir <p>] [--upstream-url <URL>] [--base-branch <b>] [--changelog <auto|true|false>] [--dry-run <true|false>]` | 三方库自动提 PR(fork 工作区修改 → 源仓库 Issue/PR + 触发 CI) |
97
+ | `3rdloop config list|get|set|unset` | 命令配置 `.env` 配置项(默认读写 `~/.3lib/.env`) |
98
+ | `3rdloop update [--check] [--yes] [--force] [--registry <url>]` | 自更新到 npm 最新版(尊重用户镜像源) |
99
+ | `3rdloop doctor` | 环境自检(Node/opencode/.env/SKILL/数据目录) |
100
+ | `3rdloop version` | 版本信息 |
100
101
 
101
- ### 参数
102
-
103
- | 参数 | 说明 |
104
- |------|------|
105
- | `--task-id <id>` | 任务 ID(**必填**,step 命令不自动生成) |
106
- | `--step-id <N>` | 步骤编号(默认 `1`) |
107
- | `--input-report <p>` | 输入报告/上下文文件路径(可选) |
108
- | `--max-retries <N>` | 最多重试次数(默认 `3`) |
109
- | `--loop <N>` | 大循环轮次编号(默认 `0`) |
110
- | `--task-dir <p>` | 产物目录(默认 `<data-dir>/task/<taskId>`) |
111
- | `--specified-skill <name>` | 固定执行的 SKILL name 或目录名(在 skill 目录内解析);传入后跳过 SkillSelector 匹配直接执行该 SKILL |
112
-
113
- ### 行为与差异
114
-
115
- - **产物**:写入 taskDir 下 `stepId{n}_loop{L}_result_{R}.md`
116
- (`R` 为第几次重试),并同时生成
117
- `stepId{n}_loop{L}_Summary_{R}.md` 经验总结与步骤记录
118
- `stepid_{stepId}_loop{L}.json`。
119
- - **loop.json**:写精简状态(`isSingleExecution: true`),因此
120
- `3rdloop list` / `3rdloop progress <taskId>` / `3rdloop result <taskId>` 都能看到该任务。
121
- - **与 `3rdloop run` 的差异**:`run` 走完整大循环(拆解→编排→审核→可重规划,
122
- 自动生成 taskId);`step` 只执行一步,适合把已拆好的任务按步骤手动串联。
123
- - **中断**:Ctrl+C 会对 FlexRunner 调用 `controlExecution('abort')` 终止当前步骤
124
- 并清理 opencode 子进程,退出码 130。
125
- - **多次执行同一 taskId**:不会归档旧任务(与 `run` 的自动归档不同),
126
- 每次 `step run` 在相同 loop 编号下会覆盖同名产物,建议不同尝试用不同 `--loop`。
127
-
128
- ## 编排执行(Orchestrator)
129
-
130
- `3rdloop orch` 对应 HTTP 层 `POST /api/orchestrator/load` 与 `/api/orchestrator/start`
131
- 接口,直接复用 **Orchestrator** 核心类做多步骤依赖编排(不经 Brain 拆解 /
132
- TestCheck 审核)。适合已经把任务拆成步骤、且步骤之间存在 `nextStepId` /
133
- `failStepId` / `dependId` 依赖关系的场景。
134
102
 
135
- ```bash
136
- # ① 加载任务定义 + 启动编排并阻塞到终态(推荐入口)
137
- 3rdloop orch run task-def-demo.json
103
+ 更多进阶用法(`step` 参数细节、`orch` 任务定义格式、工作流注册),见仓库 `cli/README_DEVELOP.md` 或 `3rdloop <子命令> --help`。
138
104
 
139
- # ② 仅加载任务定义(落盘 orchestration.json,进程退出后仍可 start)
140
- 3rdloop orch load task-def-demo.json
105
+ ### 退出码
141
106
 
142
- # ③ 从磁盘恢复 LOADED 状态并启动(跨进程)
143
- 3rdloop orch start task_xxx
144
107
 
145
- # 查询 / 控制 / 列表
146
- 3rdloop orch progress task_xxx --loop 0
147
- 3rdloop orch abort task_xxx
148
- 3rdloop orch pause task_xxx # 恢复:3rdloop orch resume task_xxx
149
- 3rdloop orch tasks
150
- ```
108
+ | 码 | 含义 |
109
+ | --- | ----------------------------------- |
110
+ | 0 | 通过 / 成功 |
111
+ | 1 | 错误(参数 / 环境 / 任务不存在) |
112
+ | 2 | 任务执行失败(终态 `failed` / `error` / 未通过) |
113
+ | 3 | `wait` 超时 |
114
+ | 130 | Ctrl+C(SIGINT) |
115
+ | 143 | SIGTERM |
151
116
 
152
- ### 任务定义 JSON(task-def.json)
153
-
154
- 格式与 `Orchestrator.loadTask` 对齐:
155
-
156
- ```json
157
- {
158
- "taskId": "task_xxx",
159
- "taskDir": "",
160
- "skillDirectory": "",
161
- "loopCount": 0,
162
- "steps": [
163
- { "stepId": 1, "taskDescription": "分析三方库接口", "dependId": 0, "nextStepId": 2, "failStepId": 0, "maxRetries": 3 },
164
- { "stepId": 2, "taskDescription": "生成 demo 场景", "dependId": 1, "nextStepId": 0, "failStepId": 1, "maxRetries": 3 }
165
- ]
166
- }
167
- ```
168
117
 
169
- 字段说明:
170
-
171
- | 字段 | 说明 |
172
- |------|------|
173
- | `taskId` | 任务 ID(必填) |
174
- | `taskDir` | 产物目录(可选,默认 `<data-dir>/task/<taskId>`) |
175
- | `skillDirectory` | SKILL 目录(可选,默认 CLI 解析的 skill-dir) |
176
- | `loopCount` | 大循环轮次(默认 `0`,用于区分各轮产物文件) |
177
- | `steps[].stepId` | 步骤唯一 ID(必填) |
178
- | `steps[].taskDescription` | 步骤任务描述(必填) |
179
- | `steps[].dependId` | 前置依赖(`0`=入口;支持数组做 fan-in 聚合) |
180
- | `steps[].nextStepId` | 成功后下一步(`0`=结束) |
181
- | `steps[].failStepId` | 失败后修复步骤(`0`=失败即终止) |
182
- | `steps[].maxRetries` | 最大重试次数(默认 `3`) |
183
- | `steps[].specifiedSkill` | 固定执行的 SKILL name 或目录名(可选,在 `skillDirectory` 内解析);传入后该步骤跳过 SkillSelector 匹配直接执行该 SKILL |
184
-
185
- ### 语义与限制
186
-
187
- - **load 可跨进程**:`3rdloop orch load` 会立即落盘 `orchestration.json`
188
- (状态 `loaded`),之后任何终端/进程都能 `3rdloop orch start <taskId>` 恢复并启动。
189
- - **start 仅接受 LOADED**:任务处于 `completed`/`failed`/`running` 等状态时
190
- 拒绝启动(与 HTTP `controller.start` 校验一致)。
191
- - **progress 读磁盘**:`3rdloop orch progress` 直接读 `orchestration.json` /
192
- `orchestration_loop{N}.json`,不依赖内存实例,历史轮次可用 `--loop N`。
193
- - **loop.json**:编排结束后写精简状态(`isOrchestration: true`),因此
194
- `3rdloop list` / `3rdloop result` 也能看到编排任务。
195
- - **中断**:Ctrl+C 会对 Orchestrator 调用 `abort()` 并清理 opencode 子进程,
196
- 退出码 130。
197
- - **跨进程控制限制**:`abort`/`pause`/`resume` 优先作用于**当前进程内**正在
198
- 运行的编排实例;无法中断另一进程的运行中任务(v1 与 `3rdloop run` 语义一致)。
199
-
200
- ## 工作流机制(固定编排)
201
-
202
- 工作流是将"固定步骤编排"封装为带参数的 CLI 命令入口:`3rd3rdloop run <工作流名>` 会在运行时
203
- 把参数构造为具参 taskDef,并复用 `3rdloop orch` 链路(`orchLoad` + `orchStart`)阻塞执行到终态。
204
- 适合把一组固定的 SKILL 串联(如 `pr push`、`code check` 等)沉淀为可复用命令。
205
-
206
- ### 使用
207
118
 
208
- ```bash
209
- # 查看已注册工作流
210
- 3rdloop workflows
211
119
 
212
- # 查看某个工作流的参数说明
213
- 3rd3rdloop run <工作流名> --help
120
+ ## 配置
214
121
 
215
- # 正式执行(阻塞到终态;退出码 0=通过 / 2=任务失败)
216
- 3rd3rdloop run <工作流名> --flag1 <值> --flag2 <值>
217
122
 
218
- # dry-run:只构造并打印/落盘 taskDef,不触碰引擎(调试新工作流用)
219
- 3rd3rdloop run <工作流名> --flag1 <值> --print-taskdef
220
- ```
221
123
 
222
- - `3rdloop run submit` 同样支持工作流名(命中时走工作流,未命中保持原任务描述语义)
223
- - 产物落默认 `<数据目录>/task/{taskId}/`;`--print-taskdef` 会额外写
224
- `task-def.dry.json` 供人工核对
225
- - 退出码:`0` 通过 / `1` 参数或环境错误 / `2` 任务执行失败 / `130` Ctrl+C / `143` SIGTERM
124
+ ### 数据目录(中间产物)
226
125
 
227
- ### 已注册工作流
126
+ 任务中间产物默认落在用户级统一目录,跨平台一致、不随执行目录或 npm 卸载变化:
228
127
 
229
- - **`pr-check` —— PR 代码检视**(等价封装前端 `Web/public/js/codecheck.js` 的 PR 检视面板):
128
+ > 默认 `~/.3lib/3rdloop/db`
129
+ >
130
+ > - Windows: `C:\Users\<用户>\.3lib\3rdloop\db`
131
+ > - macOS / Linux: `~/.3lib/3rdloop/db`
230
132
 
231
- ```bash
232
- # 按库类型检视 PR(arkts 为默认,不传 --library-type 即可)
233
- 3rdloop run pr-check --pr-url https://gitcode.com/owner/repo/pulls/123 --library-type rn
133
+ 任务写入 `<数据目录>/task/{taskId}/`。可用 `--data-dir` flag 或 `3LIB_DATA_DIR` 覆盖(如团队共享目录)。
234
134
 
235
- # dry-run:核对构造出的 taskDef 与前端是否等价(不触碰引擎)
236
- 3rdloop run pr-check --pr-url https://gitcode.com/owner/repo/pulls/123 --print-taskdef
237
- ```
135
+ ### 环境变量
136
+
137
+ CLI 自身配置(`3LIB_*` 前缀):
238
138
 
239
- 与前端协同的两个约定:
240
-
241
- - **taskId 前缀 `codecheck_`**:格式 `codecheck_{owner}_{repo}_{prNum}_{ts36}`,与前端
242
- `codecheck.js` 一致。前端 PR 检视历史页按 `taskIdPrefix=codecheck_` 过滤,故 CLI 提交的
243
- 检视任务在前端历史页同样可见。
244
- - **SKILL 映射**:`arkts→arkts-code-check`(默认) / `flutter→flutter-code-check` /
245
- `rn→rn-code-check` / `tpccplus→tpc-cpp-check`,与前端 `_CC_SKILL_MAP` 同构;单步骤
246
- `specifiedSkill` 固定绑定,`maxRetries: 3`,`title` 格式 `PR检视|{libraryType}|{prUrl}`
247
- (供前端历史恢复解析)。
248
- - **参数校验**:`--pr-url` 必填;`--library-type` 非法值(非上述四种)在 dry-run 阶段即报错退出。
249
-
250
- ### 如何新增一个工作流
251
-
252
- 在 `cli/workflows/` 目录下新增一个 `.js`/`.mjs` 文件,默认导出一个工作流声明对象 **即可自动注册**,
253
- 无需改动任何分发代码:
254
-
255
- ```js
256
- export default {
257
- name: 'demo prep', // 工作流名,支持多词(空格分隔,分发时最长匹配)
258
- description: '示例:构造一个占位固定编排(仅演示注册约定)',
259
- params: [ // CLI flags schema(驱动参数校验 / --help)
260
- { flag: 'workspace-dir', required: true, describe: '本地工作区 git 仓库根目录' },
261
- { flag: 'report-name', required: false, describe: '输出报告名(默认 check-report.md)' },
262
- ],
263
- // params: { 'workspace-dir': <值>, ... } → 返回与 Orchestrator.loadTask 对齐的 taskDef
264
- buildTaskDef(params) {
265
- return {
266
- taskId: '', // 缺省时 CLI 自动生成(generateTaskId())
267
- title: 'Demo 固定编排',
268
- skillDirectory: '',
269
- loopCount: 0,
270
- steps: [{
271
- stepId: 1,
272
- taskDescription: `分析工作区修改并输出 ${params['report-name'] || 'check-report.md'} 报告`,
273
- dependId: 0, nextStepId: 0, failStepId: 0, maxRetries: 3,
274
- inputReport: '',
275
- }],
276
- };
277
- },
278
- };
279
- ```
280
139
 
281
- 约定与细节:
140
+ | 变量 | 作用 | 默认值 |
141
+ | ------------------ | --------------------------------- | -------------------- |
142
+ | `3LIB_DATA_DIR` | 数据目录覆盖(等效 `--data-dir`) | `~/.3lib/3rdloop/db` |
143
+ | `3LIB_ROOT` | 项目根覆盖(须为系统环境变量,`.env` 文件不生效) | 自动探测 |
144
+ | `3LIB_HOME` | 用户 3lib 主目录(含日志 `logs/`,须为系统环境变量) | `~/.3lib` |
145
+ | `3LIB_SKILL_DIR` | SKILL 目录覆盖(等效 `--skill-dir`) | 默认按发布/开发状态自动解析 |
146
+ | `3LIB_TASK_PREFIX` | taskId 前缀(审计用) | 空 |
282
147
 
283
- - **自动注册**:`cli/lib/workflows.js` 启动时扫描 `cli/workflows/*.mjs|*.js`,每文件默认导出一个工作流。
284
- 加载失败 / name 缺失 / 重名的工作流会被跳过并输出警告(不阻断其余工作流)。
285
- - **多词名最长匹配**:`3rdloop run pr push ...` 会先试完整 `pr push`,未注册再退 `pr`。
286
- - **steps 格式**:与 `3rdloop orch run <task-def.json>` 的 [taskDef 格式](#编排执行orchestrator) 完全一致
287
- (stepId / taskDescription / dependId / nextStepId / failStepId / maxRetries / specifiedSkill / inputReport)。
288
- - **specifiedSkill 建议**:与核心引擎约定一致——步骤职责能匹配某可用 SKILL 时,把它写入
289
- `specifiedSkill`(值为 SKILL name 或目录名),执行层将跳过 SkillSelector 自动匹配。
290
- - **只读环境注入**:`buildTaskDef(params, { dataDir })` 第二参携带运行时环境(数据目录等),
291
- 需要落盘相对路径时使用。
292
148
 
293
- ### 职责边界
149
+ LLM 凭据变量(`DASHSCOPE_API_KEY` / `LLM_MODEL` 等):按上面的 `.env` 加载链任选一层配置即可。
294
150
 
295
- - 工作流注册表只负责"参数 → taskDef"。**业务工作流(如 `pr push`)与所需 SKILL 由其他项目
296
- 开发者按上述约定注册与维护**,CLI 核心不预置任何业务工作流。
297
- - 新增业务 SKILL 请放在 `Server/Skills/` 下(沿用既有 SKILL 约定),工作流文件中以
298
- `specifiedSkill` 引用即可。
151
+ ### 命令行配置(3rdloop config)
299
152
 
300
- ## 环境约定
153
+ `config` 子命令对 `.env` 配置项做命令式管理,默认读写用户级 `~/.3lib/.env`(跨项目全局生效),无需手改 `.env` 文件:
301
154
 
302
- - **`.env`** 加载链:系统环境变量 > `~/.3lib/.env`(用户级) > 项目根 `Server/.env`。
303
- - **数据目录**:`<项目根同级>/db`(如 `D:\code\3rdLibraryLoop` → `D:\code\db`),与核心引擎默认 workspace 级数据库一致;任务写入 `<数据目录>/task/{taskId}/`。
304
- - **opencode**:`3rdloop` 会自动拉起 `opencode serve`(需在项目**上一级**目录运行),
305
- 退出时负责清理进程树。若已存在运行中的 opencode 服务则直接复用。
155
+ ```bash
156
+ # 查看当前生效的数据目录
157
+ 3rdloop config get 3LIB_DATA_DIR
306
158
 
307
- ## 环境变量
159
+ # 将任务产物统一存到团队共享目录(全局生效,无需每次带 --data-dir)
160
+ 3rdloop config set 3LIB_DATA_DIR "D:\code\team\shared-db"
308
161
 
309
- CLI 自身配置(`3LIB_*` 前缀):
162
+ # 查看全部配置项及当前生效值(密钥类脱敏)
163
+ 3rdloop config list
310
164
 
311
- | 变量 | 作用 | 默认值 |
312
- |------|------|--------|
313
- | `3LIB_DATA_DIR` | 数据目录覆盖(等效 `--data-dir`) | `<项目根同级>/db` |
314
- | `3LIB_ROOT` | 项目根覆盖(须为系统环境变量,`.env` 文件不生效) | 自动探测 |
315
- | `3LIB_HOME` | 用户 3lib 主目录(含日志 `logs/`,须为系统环境变量) | `~/.3lib` |
316
- | `3LIB_SKILL_DIR` | SKILL 目录覆盖(等效 `--skill-dir`) | `vendor/Server/Skills` |
317
- | `3LIB_TASK_PREFIX` | taskId 前缀(审计用) | 空 |
318
-
319
- Windows 设置方式:
320
-
321
- ```powershell
322
- # 当前终端临时生效
323
- $env:3LIB_DATA_DIR = "D:\code\tmp\db"
324
- # 用户级永久生效(需重开终端)
325
- setx 3LIB_DATA_DIR "D:\code\tmp\db"
326
- # 或写入 C:\Users\<用户>\.3lib\.env
165
+ # 恢复默认
166
+ 3rdloop config unset 3LIB_DATA_DIR
327
167
  ```
328
168
 
329
- > **注意**:提交用的 `--data-dir` / `3LIB_DATA_DIR` 必须与 `wait`/`progress`/`list`/`result` 一致,
330
- > 否则会出现"任务不存在"。跨终端统一最简单的方式是 `setx 3LIB_DATA_DIR` 一人设全局。
169
+ - 读取优先级:**系统环境变量 >** `~/.3lib/.env`**(用户级) > 项目根** `Server/.env` **> 内置默认值**
170
+ - `config` 内置白名单与值校验,未知键 `set` 会报错;`DASHSCOPE_API_KEY` / `GIT_TOKEN` 等密钥在 `get`/`list` 中脱敏显示
171
+ - `3LIB_ROOT` / `3LIB_HOME` 为系统环境变量专用,`config set` 会拒绝,请用 `setx` / `export`
172
+ - `--data-dir` / `--skill-dir` 命令行 flag 仍是最高的单次覆盖
331
173
 
332
- LLM 凭据变量(`DASHSCOPE_API_KEY` / `LLM_MODEL` 等):按 `.env` 加载链任选一层配置即可。
333
174
 
334
- ## 场景一:新用户接入
335
175
 
336
- ### 前置条件
176
+ ### 环境加载细节
337
177
 
338
- - Node.js >= 22
339
- - opencode CLI(`opencode serve` 可运行)
340
- - LLM 凭据(一个 `.env` 即可)
178
+ - `.env` **加载链**:系统环境变量 > `~/.3lib/.env` > 项目根 `Server/.env`
179
+ - **opencode**:自动拉起 `opencode serve`(项目上一级目录),退出时清理进程树;已存在则复用
180
+ - **任务数据隔离**:CLI 任务数据默认与 Web 前端(读取仓库根 `db/`)分离,CLI 提交的任务不会出现在前端任务列表
341
181
 
342
- ### 接入步骤
343
182
 
344
- ```bash
345
- # ① 安装 CLI(正式发布后)
346
- npm i -g @ohos-cpf/3rdloop
347
183
 
348
- # 开发期替代:与后端共用仓库时用 npm link(直引 Server/ 源码,无需生成 vendor)
349
- cd cli && npm install && npm link
184
+ ## API
350
185
 
351
- # 环境自检,缺什么看什么
352
- 3rdloop doctor
186
+ `3rdloop` 是纯命令行工具,无编程 API。对脚本使用方,输出契约如下:
353
187
 
354
- # 配置 LLM 凭据(三选一)
355
- # A. 项目级:在仓库 Server/.env 填 key(推荐,跟仓库走)
356
- # B. 用户级:C:\Users\<用户>\.3lib\.env
357
- # C. 系统环境变量:setx DASHSCOPE_API_KEY "sk-xxx"
188
+ - **stdout**:只放 `--json` 结构化数据或最终结果(脚本可安全解析)
189
+ - **stderr**:进度日志 / 诊断信息
190
+ - **退出码**:见 [退出码](#退出码)
358
191
 
359
- # ④ 跑一个最小任务验证
360
- 3rdloop run "冒烟:分析一个三方库的鸿蒙化可行性" --max-loops 1
361
- ```
362
192
 
363
- 数据目录默认在仓库根同级 `<项目根同级>/db`(与核心引擎默认一致,团队同机共享任务数据);如需每用户隔离,用 `--data-dir` 或 `3LIB_DATA_DIR` 覆盖。
364
193
 
365
- ## 场景二:后端更新与软链
194
+ ### 全局选项
366
195
 
367
- ### 开发期(仓库内共享):零副本,直引源码
368
196
 
369
- CLI 在**开发期不生成 `cli/vendor/`**,直接引用仓库 `Server/` 源码:
370
- - 引擎模块回退:`cli/vendor/Server` 不存在时,加载 `../Server`(`runner.js: resolveVendorServer`)。
371
- - SKILL 目录回退:`vendor/Server/Skills` 不存在时,用仓库 `Server/Skills`(`config.js: resolveSkillDir`)。
197
+ | 选项 | 说明 |
198
+ | ----------------- | -------------------------------- |
199
+ | `--json` | 结构化输出到 **stdout**(进度/日志走 stderr) |
200
+ | `-v, --verbose` | 详细模式 |
201
+ | `--quiet` | 仅输出最终结果 |
202
+ | `--data-dir <p>` | 数据目录覆盖(默认 `~/.3lib/3rdloop/db`) |
203
+ | `--project <n>` | 项目名覆盖(默认取 git 仓库根名) |
204
+ | `--skill-dir <p>` | SKILL 目录覆盖 |
205
+ | `-h, --help` | 帮助 |
372
206
 
373
- 后端代码改完立即可用,无需任何复制步骤:
374
207
 
375
- ```bash
376
- cd cli
377
208
 
378
- # ① npm link 后全局 3rdloop 与本地一致(直引 Server/ 源码)
379
- npm link
380
209
 
381
- # ② 校验 Server/ 源码引入的外部依赖都在 package.json 声明
382
- # 后端新增第三方库时会在这一步暴露,然后 npm install <新依赖> 补上
383
- npm run verify-deps
210
+ ## 自更新
384
211
 
385
- # ③ 回归冒烟
386
- npm test
212
+ ```bash
213
+ # 检查 + 交互确认后更新到 latest
214
+ 3rdloop update
387
215
 
388
- # 确认当前用的引擎来源(vendor 缺失时显示源码回退)
389
- 3rdloop doctor
216
+ # 仅检查是否有新版本,不执行更新(适合 CI / 提醒)
217
+ 3rdloop update --check
218
+
219
+ # 跳过交互确认直接更新(非 TTY 场景或自动化)
220
+ 3rdloop update --yes
221
+
222
+ # 覆盖 npm registry(默认尊重用户 npm 镜像配置,如 npmmirror)
223
+ 3rdloop update --registry https://registry.npmjs.org/
390
224
  ```
391
225
 
392
- ### 发布期(打包给他人):临时生成 vendor + 自动清理
226
+ - `npm link` 开发方式安装(连接到仓库源码)时,`update` 默认跳过并提示用 `git pull` 更新源码,加 `--force` 可强制替换为 registry 正式包
227
+ - 更新只替换程序文件,**数据目录** `~/.3lib/3rdloop/db` **与** `~/.3lib/.env` **配置不受影响**
393
228
 
394
- 发布 tarball 必须自包含引擎(npm `files` 只能打包包内文件),所以发布时才把
395
- `Server/` 快照复制进 `cli/vendor/`,打包完成后自动删除本地副本:
396
229
 
397
- ```bash
398
- cd cli
399
- npm version patch # 0.1.0 → 0.1.1
400
- npm publish # prepack 自动复制 vendor → 打包 → postpack 自动清理
401
- ```
402
230
 
403
- `npm pack` / `npm publish` 的全自动流程:
231
+ ## 更新日志
404
232
 
405
- | 阶段 | 钩子 | 动作 |
406
- |------|------|------|
407
- | 打包前 | `prepack` | 复制 `Server/` → `cli/vendor/Server/`,写 VERSION,扫描敏感文件 |
408
- | 打包中 | — | tarball 包含完整 vendor(自包含引擎) |
409
- | 打包后 | `postpack` | 删除本地 `cli/vendor/`,工作区回归仅一份源码 |
233
+ [CHANGELOG.md](./CHANGELOG.md)(计划中,待补)
410
234
 
411
- > **不要**手工改动 `cli/vendor/Server/` —— 它是发布期临时生成物,不入库
412
- > (`.gitignore` 已忽略),下次 `npm pack/publish` 会重新生成并自动清理。
413
- > `npm run verify-deps` 同样双模式:有 vendor 扫 vendor,否则回退扫 `Server/` 源码。
235
+ ## 贡献
414
236
 
415
- ## 开发者
237
+ 欢迎提交 Issue 和 PR,详见 [CONTRIBUTING.md](./CONTRIBUTING.md)(计划中,待补)
416
238
 
417
- ```bash
418
- cd cli
419
- npm install
420
- npm link # 直引仓库 Server/ 源码,无需 prepack
421
- node bin/3rdloop.mjs doctor
422
- ```
239
+ ## 维护者
240
+
241
+ [@junxiaoliu927](https://gitcode.com/Sincerelyurs/3rdLibraryLoop)
242
+
243
+ ## 许可证
423
244
 
424
- 发布前检查:`npm run verify-deps`(有 vendor 扫 vendor,否则回退扫 `Server/` 源码)
425
- 校验引擎代码的依赖声明完整性。
245
+ [MIT](./LICENSE) © 2026 junxiaoliu927