@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 +160 -340
- package/lib/cli.js +43 -2
- package/lib/config-cmd.js +452 -0
- package/lib/config.js +13 -12
- package/lib/queries.js +1 -1
- package/lib/update.js +280 -0
- package/lib/workflow.js +19 -1
- package/package.json +1 -1
- package/vendor/Server/Brain/SkillExecutor.js +2 -2
- package/vendor/Server/CLI/cli.js +40 -8
- package/vendor/Server/CLI/deveco-code/index.js +71 -0
- package/vendor/Server/CLI/deveco-code.js +5 -0
- package/vendor/Server/CLI/opencode/index.js +16 -2
- package/vendor/Server/FlexRunner/FlexRunner.js +2 -2
- package/vendor/Server/Knowledge/KnowledgeImporter.js +1 -1
- package/vendor/Server/LoopEngine/LoopEngine.js +1 -1
- package/vendor/Server/Routes/server.js +5 -4
- package/vendor/Server/Skills/acceptance-check/SKILL.md +18 -1
- package/vendor/Server/Skills/acceptance-check/references/PHASE2_EVIDENCE_VERIFICATION.md +70 -0
- package/vendor/Server/Skills/arkts-code-check/SKILL.md +9 -2
- package/vendor/Server/Skills/arkts-code-check/references/CODE_CHECK_GUIDE.md +51 -0
- package/vendor/Server/Skills/arkts-code-check/references/PHASE1_INFO_COLLECTION.md +13 -2
- package/vendor/Server/TestCheck/TestCheck.js +2 -2
- package/vendor/VERSION +3 -3
- package/workflows/pr-push.mjs +193 -0
package/README.md
CHANGED
|
@@ -1,12 +1,53 @@
|
|
|
1
1
|
# @ohos-cpf/3rdloop
|
|
2
2
|
|
|
3
|
-
3rdLibraryLoop
|
|
3
|
+
三方库自动化检视命令行工具:基于 3rdLibraryLoop 核心引擎,从终端完整跑一遍"任务拆解 → 编排执行 → 准出审核"的大循环。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
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
|
-
|
|
98
|
-
3rdloop
|
|
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
|
-
|
|
136
|
-
# ① 加载任务定义 + 启动编排并阻塞到终态(推荐入口)
|
|
137
|
-
3rdloop orch run task-def-demo.json
|
|
103
|
+
更多进阶用法(`step` 参数细节、`orch` 任务定义格式、工作流注册),见仓库 `cli/README_DEVELOP.md` 或 `3rdloop <子命令> --help`。
|
|
138
104
|
|
|
139
|
-
|
|
140
|
-
3rdloop orch load task-def-demo.json
|
|
105
|
+
### 退出码
|
|
141
106
|
|
|
142
|
-
# ③ 从磁盘恢复 LOADED 状态并启动(跨进程)
|
|
143
|
-
3rdloop orch start task_xxx
|
|
144
107
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
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
|
-
|
|
128
|
+
> 默认 `~/.3lib/3rdloop/db`
|
|
129
|
+
>
|
|
130
|
+
> - Windows: `C:\Users\<用户>\.3lib\3rdloop\db`
|
|
131
|
+
> - macOS / Linux: `~/.3lib/3rdloop/db`
|
|
230
132
|
|
|
231
|
-
|
|
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
|
-
|
|
236
|
-
|
|
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
|
-
|
|
296
|
-
开发者按上述约定注册与维护**,CLI 核心不预置任何业务工作流。
|
|
297
|
-
- 新增业务 SKILL 请放在 `Server/Skills/` 下(沿用既有 SKILL 约定),工作流文件中以
|
|
298
|
-
`specifiedSkill` 引用即可。
|
|
151
|
+
### 命令行配置(3rdloop config)
|
|
299
152
|
|
|
300
|
-
|
|
153
|
+
`config` 子命令对 `.env` 配置项做命令式管理,默认读写用户级 `~/.3lib/.env`(跨项目全局生效),无需手改 `.env` 文件:
|
|
301
154
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
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
|
-
|
|
330
|
-
|
|
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
|
-
-
|
|
339
|
-
- opencode
|
|
340
|
-
-
|
|
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
|
-
|
|
349
|
-
cd cli && npm install && npm link
|
|
184
|
+
## API
|
|
350
185
|
|
|
351
|
-
|
|
352
|
-
3rdloop doctor
|
|
186
|
+
`3rdloop` 是纯命令行工具,无编程 API。对脚本使用方,输出契约如下:
|
|
353
187
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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
|
-
|
|
382
|
-
# 后端新增第三方库时会在这一步暴露,然后 npm install <新依赖> 补上
|
|
383
|
-
npm run verify-deps
|
|
210
|
+
## 自更新
|
|
384
211
|
|
|
385
|
-
|
|
386
|
-
|
|
212
|
+
```bash
|
|
213
|
+
# 检查 + 交互确认后更新到 latest
|
|
214
|
+
3rdloop update
|
|
387
215
|
|
|
388
|
-
#
|
|
389
|
-
3rdloop
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
```
|
|
239
|
+
## 维护者
|
|
240
|
+
|
|
241
|
+
[@junxiaoliu927](https://gitcode.com/Sincerelyurs/3rdLibraryLoop)
|
|
242
|
+
|
|
243
|
+
## 许可证
|
|
423
244
|
|
|
424
|
-
|
|
425
|
-
校验引擎代码的依赖声明完整性。
|
|
245
|
+
[MIT](./LICENSE) © 2026 junxiaoliu927
|