helloloop 0.6.1 → 0.7.0

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helloloop",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "HelloLoop 的 Claude Code 原生插件元数据,用于多 CLI 宿主分发。",
5
5
  "author": {
6
6
  "name": "HelloLoop"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helloloop",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "面向 Codex CLI、Claude Code、Gemini CLI 的多宿主开发工作流插件,Codex 路径为首发与参考实现。",
5
5
  "author": {
6
6
  "name": "HelloLoop"
@@ -16,8 +16,8 @@
16
16
  "skills": "./skills/",
17
17
  "interface": {
18
18
  "displayName": "HelloLoop",
19
- "shortDescription": "基于 backlog 的持续仓库开发与验证循环",
20
- "longDescription": "HelloLoop 把基于 backlog 的持续开发能力封装为官方 Codex 插件 bundle。显式调用 helloloop skill 时,默认优先进入 npx helloloop 主 CLI 流程:支持 npx helloloop、npx helloloop <PATH>、npx helloloop codex|claude|gemini ...,先分析、再展示确认单、确认后自动接续推进;运行中按无人值守自动恢复持续推进主线。",
19
+ "shortDescription": "显式调用后按 backlog 持续开发与验证",
20
+ "longDescription": "HelloLoop 把基于 backlog 的持续开发能力封装为官方 Codex 插件 bundle。只有在用户显式调用 helloloop skill,或明确要求使用 HelloLoop 时才应介入;进入后默认优先走 npx helloloop 主 CLI 流程:支持 npx helloloop、npx helloloop <PATH>、npx helloloop codex|claude|gemini ...,先分析、再展示确认单、确认后自动接续推进;运行中按无人值守自动恢复持续推进主线。",
21
21
  "developerName": "HelloLoop",
22
22
  "category": "Coding",
23
23
  "capabilities": [
@@ -25,7 +25,7 @@
25
25
  "Write"
26
26
  ],
27
27
  "defaultPrompt": [
28
- "使用 HelloLoop 时,优先执行 npx helloloop 或 npx helloloop <PATH>;如果用户明确指定执行引擎,也允许使用 npx helloloop codex|claude|gemini ...。启动前确认一次,启动后按无人值守自动恢复与主线续跑执行,不要在对话里手工模拟流程。"
28
+ "只有当用户显式调用 $helloloop / #helloloop / helloloop:helloloop,或明确要求使用 HelloLoop 时,才进入 npx helloloop 主 CLI 流程;普通 Codex 会话不要自动接管。进入后优先执行 npx helloloop 或 npx helloloop <PATH>;如果用户明确指定执行引擎,也允许使用 npx helloloop codex|claude|gemini ...。启动前确认一次,启动后按无人值守自动恢复与主线续跑执行,不要在对话里手工模拟流程。"
29
29
  ],
30
30
  "brandColor": "#0F766E"
31
31
  }
package/README.md CHANGED
@@ -18,6 +18,7 @@
18
18
 
19
19
  这意味着:
20
20
 
21
+ - 三宿主都只在用户显式调用 `helloloop` 时介入;普通会话不会被 HelloLoop 自动接管
21
22
  - 无论在终端还是在 `Codex` / `Claude` / `Gemini` 宿主内,只要用户未明确指定引擎,`HelloLoop` 都会先询问本轮执行引擎
22
23
  - 当前宿主、项目历史、用户历史只作为推荐依据,不会自动替你选中引擎
23
24
  - 如果你已经显式指定,或已经在首轮确认中明确选定了引擎,本轮就固定按该引擎执行
@@ -27,9 +28,9 @@
27
28
 
28
29
  | 宿主 | 安装方式 | 原生入口 | 说明 |
29
30
  | --- | --- | --- | --- |
30
- | `Codex CLI` | `helloloop install` / `helloloop install --host codex` | `$helloloop` / `npx helloloop` | Codex 原生插件 + CLI |
31
- | `Claude Code` | `helloloop install --host claude` | `/helloloop` | Claude 原生 marketplace / plugin |
32
- | `Gemini CLI` | `helloloop install --host gemini` | `/helloloop` | Gemini 原生 extension |
31
+ | `Codex CLI` | `helloloop install` / `helloloop install --host codex` | `$helloloop` / `npx helloloop` | 仅在显式调用时进入 HelloLoop |
32
+ | `Claude Code` | `helloloop install --host claude` | `/helloloop` | 仅在显式调用时进入 HelloLoop |
33
+ | `Gemini CLI` | `helloloop install --host gemini` | `/helloloop` | 仅在显式调用时进入 HelloLoop |
33
34
 
34
35
  ## 最短使用方式
35
36
 
@@ -62,7 +63,7 @@ npx helloloop gemini <PATH> 接续完成剩余开发
62
63
  - 首参只有第一个裸词会被解释为引擎;如果你真要把 `claude` 当目录名,请写成 `./claude`、`.\claude` 或绝对路径
63
64
  - 命令后的自然语言如果明确提到 `codex`、`claude`、`gemini`,也会纳入意图判断
64
65
  - 当前宿主、项目历史、用户历史不会触发自动选中,只会影响“推荐项”
65
- - `已安装` 不等于 `可继续执行`;如果当前引擎在运行中遇到 429、5xx、网络抖动、流中断、长时间卡死等问题,`HelloLoop` 会先按无人值守策略做同引擎自动恢复,不会中途停下来询问
66
+ - `已安装` 不等于 `可继续执行`;如果当前引擎在运行中遇到 400、鉴权、欠费、429、5xx、网络抖动、流中断、长时间卡死等问题,`HelloLoop` 会先按无人值守策略做同引擎“健康探测 + 条件恢复”,不会中途停下来询问
66
67
 
67
68
  ## 默认工作流
68
69
 
@@ -89,25 +90,59 @@ npx helloloop gemini <PATH> 接续完成剩余开发
89
90
 
90
91
  `HelloLoop` 的设计目标不是“跑一轮停一轮”,而是启动前确认一次,启动后持续无人值守推进。
91
92
 
92
- 因此运行中的默认策略是:
93
+ - 因此运行中的默认策略是:
93
94
 
94
95
  - 普通运行故障不再中途提问:不会因为 429、5xx、网络抖动、结果流中断、短时空输出就停下来问用户
95
96
  - 同引擎优先恢复:默认不会自动切换引擎,也不会偷偷改用别的 CLI
97
+ - 先探测、后续跑:重试前会先做最小健康探测;只有探测通过后,才会恢复主线任务,而不是盲目把完整任务再跑一遍
96
98
  - 保留主线上下文恢复:同引擎恢复时会生成恢复记录与恢复 prompt,要求新一轮执行直接基于当前仓库状态继续,而不是从头另起一套
97
99
  - 定时心跳检查:运行中会持续写入心跳与恢复状态,用于判断当前阶段是否还在正常推进
98
- - 先预警再终止:默认每 60 秒刷新一次心跳;若长时间没有可见进展,先标记为疑似卡住;达到更长的自动恢复阈值后,才会终止当前进程并做同引擎恢复
99
- - 硬错误直接停止:如果识别为 400 请求错误、登录/鉴权/订阅问题、本地 CLI 缺失或权限错误,不会盲目重试
100
+ - 最终停止会告警:如果自动恢复额度真正用尽,且已配置全局邮箱,`HelloLoop` 会把错误类型与具体内容发到指定邮箱
100
101
 
101
102
  默认恢复节奏:
102
103
 
103
104
  - 心跳间隔:60 秒
104
105
  - 疑似卡住预警:15 分钟无可见进展
105
- - 自动恢复阈值:45 分钟无可见进展
106
- - 同阶段最多自动恢复:4
107
- - 恢复等待:2 分钟 5 分钟 15 分钟 30 分钟
106
+ - 自动终止阈值:45 分钟无可见进展
107
+ - 硬阻塞:每 15 分钟探测 1 次,共 5 次;仍失败则暂停等待人工介入
108
+ - 软阻塞:先每 15 分钟探测 5 次,再 30 分钟 2 次,再按 60 / 90 / 120 / 150 / 180 分钟各探测 1 次;仍失败则暂停等待人工介入
108
109
 
109
110
  如果你明确指定或确认了本轮引擎,`HelloLoop` 在自动恢复阶段也会继续锁定该引擎,不会擅自切换。
110
111
 
112
+ ## 全局告警配置
113
+
114
+ 如果希望在“自动恢复彻底停止”后收到邮件告警,可在:
115
+
116
+ ```text
117
+ ~/.helloloop/settings.json
118
+ ```
119
+
120
+ 中配置邮件通知,例如:
121
+
122
+ ```json
123
+ {
124
+ "notifications": {
125
+ "email": {
126
+ "enabled": true,
127
+ "to": ["you@example.com"],
128
+ "from": "helloloop@example.com",
129
+ "smtp": {
130
+ "host": "smtp.example.com",
131
+ "port": 465,
132
+ "secure": true,
133
+ "username": "helloloop@example.com",
134
+ "passwordEnv": "HELLOLOOP_SMTP_PASSWORD"
135
+ }
136
+ }
137
+ }
138
+ }
139
+ ```
140
+
141
+ 说明:
142
+
143
+ - 建议把 SMTP 密码放在环境变量里,不要明文写进配置文件
144
+ - 邮件只在“本轮不再继续自动重试”时发送,不会每次失败都刷屏
145
+
111
146
  ## 自动发现与交互逻辑
112
147
 
113
148
  ### 1. 只输入 `npx helloloop`
@@ -253,7 +288,7 @@ npx helloloop install --host all --force
253
288
 
254
289
  说明:
255
290
 
256
- - `--force` 会清理当前宿主里旧分支 / 旧版本残留的 `helloloop` 安装目录后再重装
291
+ - `--force` 会清理当前宿主里已有安装残留的 `helloloop` 目录后再重装
257
292
  - `Codex` 会刷新插件目录和 marketplace 条目
258
293
  - `Claude` 会刷新 marketplace、缓存插件目录,以及 `settings.json` / `known_marketplaces.json` / `installed_plugins.json` 中的 `helloloop` 条目
259
294
  - `Gemini` 会刷新 `extensions/helloloop/`,不会动同目录下其他扩展
@@ -301,6 +336,7 @@ npx helloloop
301
336
  ```
302
337
 
303
338
  如果你在 `Codex` 中直接使用 `$helloloop` 或 `npx helloloop`,但没有明确指定引擎,`HelloLoop` 仍会先让你确认本轮引擎;`Codex` 只会作为推荐项,不会被自动选中。
339
+ 未显式调用 `$helloloop`、`helloloop:helloloop` 或 `npx helloloop` 时,普通 `Codex` 会话不会被 HelloLoop 自动接管。
304
340
 
305
341
  ### Claude Code / Gemini CLI
306
342
 
@@ -309,6 +345,7 @@ npx helloloop
309
345
  ```
310
346
 
311
347
  它们会按各自 CLI 的原生 agent 逻辑执行,但共享同一套 `.helloloop/` 工作流规范。
348
+ 只有在你显式调用 `/helloloop` 时,它们才会进入 HelloLoop 工作流;普通 Claude / Gemini 会话不会被自动接管。
312
349
 
313
350
  ## 常用命令
314
351
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helloloop",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "HelloLoop 的 Claude Code 原生插件。",
5
5
  "author": {
6
6
  "name": "HelloLoop"
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: 根据开发文档分析当前进度、生成确认单,并在确认后继续接续开发
2
+ description: 仅在用户显式调用 `/helloloop` 后,根据开发文档分析当前进度、生成确认单,并在确认后继续接续开发
3
3
  argument-hint: [PATH]
4
4
  ---
5
5
 
@@ -7,8 +7,9 @@ argument-hint: [PATH]
7
7
 
8
8
  规则如下:
9
9
 
10
- 1. 将当前代码视为事实源,将开发文档视为目标源。
11
- 2. 如果用户在命令后提供了 `$ARGUMENTS`,必须同时保留其中的显式路径和自然语言补充要求,不要依赖固定关键词硬编码决策。
10
+ 1. 只有当用户显式调用 `/helloloop`,或明确要求“使用 HelloLoop / 走 HelloLoop 流程”时,才进入当前工作流;不要接管普通 Claude 会话。
11
+ 2. 将当前代码视为事实源,将开发文档视为目标源。
12
+ 3. 如果用户在命令后提供了 `$ARGUMENTS`,必须同时保留其中的显式路径和自然语言补充要求,不要依赖固定关键词硬编码决策。
12
13
  3. 自动识别目标仓库与开发文档,并先分析“当前代码做到哪里了”“与文档目标是否存在偏差”“当前项目与文档目标是否匹配”。
13
14
  4. 当前宿主是 `Claude`;如果用户未明确指定执行引擎,必须先确认本轮引擎,`Claude` 只可作为推荐项,不允许自动选中;如果用户明确要求改用 `Codex` 或 `Gemini`,必须先确认,不允许静默切换。
14
15
  5. 如果当前目录没有明确开发文档,先展示顶层文档文件、顶层目录和疑似项目目录,再询问用户开发文档路径。
@@ -32,7 +33,7 @@ argument-hint: [PATH]
32
33
  - 自动执行停止条件
33
34
  11. 未经用户确认,不要开始正式修改代码。
34
35
  12. 用户确认后,使用当前确认的执行引擎原生工具持续推进 backlog;每个任务完成后还要再做任务完成复核,backlog 清空后还要再做主线终态复核,直到开发文档的最终目标完成,且相关测试、验证、验收都已通过;遇到硬阻塞或需要用户补充关键信息时再停下。
35
- 13. 如果当前引擎在运行中遇到 429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎自动恢复,不要中途停下来询问用户;只有明确硬阻塞时才停止。
36
+ 13. 如果当前引擎在运行中遇到 400、鉴权、余额、429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎“健康探测 + 条件恢复”,不要中途停下来询问用户,也不要自动切换引擎;只有自动恢复额度真正用尽时才停止。
36
37
  14. 用户需求明确且当前任务可直接完成时,必须一次性完成本轮应交付的全部工作;禁止做一半后用“如果你要”“是否继续”之类的话术停下,也禁止用“希望这对你有帮助”等套话收尾。
37
38
  15. 始终优先使用安全 shell 与原生文件工具;在 Windows 上避免危险的嵌套命令、路径拼接删除和 `cmd` 风格破坏性命令。
38
39
  16. 不要调用外部 `npx helloloop` 来替代这个原生工作流;你现在就在 HelloLoop 的 Claude Code 原生模式中。
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: helloloop
3
- description: 当用户希望 Claude Code 按开发文档先分析当前进度,再展示确认单,并在确认后持续接续开发时使用。
3
+ description: 仅当用户显式调用 `/helloloop`,或明确要求使用 HelloLoop 时,Claude Code 才按开发文档先分析当前进度,再展示确认单,并在确认后持续接续开发。
4
4
  ---
5
5
 
6
6
  # HelloLoop for Claude Code
@@ -9,6 +9,7 @@ description: 当用户希望 Claude Code 按开发文档先分析当前进度,
9
9
 
10
10
  ## 默认流程
11
11
 
12
+ 0. 仅在用户显式调用 `/helloloop`,或明确要求使用 HelloLoop 时才介入;不要接管普通 Claude 会话
12
13
  1. 自动识别目标仓库与开发文档
13
14
  2. 如果用户未明确指定执行引擎,先确认本轮引擎;`Claude` 只作为推荐项,不自动选中;如果用户明确要求改用 `Codex` / `Gemini`,先确认再切换
14
15
  3. 分析当前代码与文档目标之间的真实进度和偏差
@@ -18,11 +19,12 @@ description: 当用户希望 Claude Code 按开发文档先分析当前进度,
18
19
 
19
20
  ## 关键规则
20
21
 
22
+ - 未显式调用 `helloloop` 且用户也没有明确要求使用 HelloLoop 时,不允许接管普通 Claude 会话。
21
23
  - 如果缺少目标仓库或开发文档,必须停下来询问用户。
22
24
  - 如果当前目录没有明确开发文档,应先展示顶层文档文件、顶层目录和疑似项目目录,再询问文档路径。
23
25
  - 项目路径对外只有一个概念;如果用户提供的项目路径不存在,直接按新项目路径处理,不要再追问“新项目路径”。
24
26
  - 如果当前项目与开发文档目标明显冲突,必须先确认是继续现有项目、清理后重建,还是取消。
25
- - 如果当前引擎在运行中遇到 429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎自动恢复,不要中途停下来询问用户。
27
+ - 如果当前引擎在运行中遇到 400、鉴权、余额、429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎“健康探测 + 条件恢复”,不要中途停下来询问用户,也不要自动切换引擎。
26
28
  - 只有识别为 400 请求错误、登录/鉴权/订阅问题、本地 CLI 缺失或权限错误等硬阻塞时,才允许结束本轮自动执行。
27
29
  - 不允许跳过执行确认单直接开始正式开发。
28
30
  - 不允许把开发文档整体压成一个大任务;需要输出足够细的 backlog。
@@ -8,6 +8,7 @@
8
8
 
9
9
  ## 默认流程
10
10
 
11
+ 0. 仅在用户显式调用 `/helloloop`,或明确要求使用 HelloLoop 时才介入;不要接管普通 Gemini 会话
11
12
  1. 自动识别项目仓库与开发文档
12
13
  2. 如果用户未明确指定执行引擎,先确认本轮引擎;`Gemini` 只作为推荐项,不自动选中;如果用户明确要求改用 `Codex` / `Claude`,先确认再切换
13
14
  3. 如果当前目录没有明确开发文档,先展示顶层文档文件、顶层目录和疑似项目目录,再询问文档路径
@@ -20,12 +21,13 @@
20
21
 
21
22
  ## 强制规则
22
23
 
24
+ - 未显式调用 `helloloop` 且用户也没有明确要求使用 HelloLoop 时,不允许接管普通 Gemini 会话。
23
25
  - 代码是事实源,开发文档是目标源。
24
26
  - 开发前必须先输出执行确认单。
25
27
  - 如果无法识别目标仓库或开发文档,必须停下来询问用户。
26
28
  - 不要单独追问“新项目路径”;项目路径只需要用户给一次。
27
29
  - 如果识别到偏差修正任务,优先收口偏差,再推进后续 backlog。
28
- - 如果当前引擎在运行中遇到 429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎自动恢复,不要中途停下来询问用户。
30
+ - 如果当前引擎在运行中遇到 400、鉴权、余额、429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎“健康探测 + 条件恢复”,不要中途停下来询问用户,也不要自动切换引擎。
29
31
  - 只有识别为 400 请求错误、登录/鉴权/订阅问题、本地 CLI 缺失或权限错误等硬阻塞时,才允许结束本轮自动执行。
30
32
  - 不允许因为执行引擎一句“已完成”就直接结束;必须经过任务复核和主线终态复核。
31
33
  - 用户需求明确且当前任务可直接完成时,必须一次性完成本轮应交付的全部工作;禁止做一半后用“如果你要”“是否继续”之类的话术停下,也禁止用客套套话收尾。
@@ -1,11 +1,12 @@
1
- description = "根据开发文档分析当前进度、生成确认单,并在确认后继续接续开发"
1
+ description = "仅在用户显式调用 `/helloloop` 后,根据开发文档分析当前进度、生成确认单,并在确认后继续接续开发"
2
2
  prompt = """
3
3
  你现在正在执行 HelloLoop 的 Gemini CLI 原生工作流。
4
4
 
5
5
  执行要求:
6
6
 
7
- 1. 自动识别目标仓库与开发文档;如果用户在命令后提供了参数,必须同时保留其中的显式路径和自然语言补充要求,不要靠固定关键词硬编码判断。
8
- 2. 当前宿主是 `Gemini`;如果用户未明确指定执行引擎,必须先确认本轮引擎,`Gemini` 只可作为推荐项,不允许自动选中;如果用户明确要求改用 `Codex` 或 `Claude`,必须先确认,不允许静默切换。
7
+ 1. 只有当用户显式调用 `/helloloop`,或明确要求“使用 HelloLoop / 走 HelloLoop 流程”时,才进入当前工作流;不要接管普通 Gemini 会话。
8
+ 2. 自动识别目标仓库与开发文档;如果用户在命令后提供了参数,必须同时保留其中的显式路径和自然语言补充要求,不要靠固定关键词硬编码判断。
9
+ 3. 当前宿主是 `Gemini`;如果用户未明确指定执行引擎,必须先确认本轮引擎,`Gemini` 只可作为推荐项,不允许自动选中;如果用户明确要求改用 `Codex` 或 `Claude`,必须先确认,不允许静默切换。
9
10
  3. 如果当前目录没有明确开发文档,应先展示顶层文档文件、顶层目录和疑似项目目录,再询问用户开发文档路径。
10
11
  4. 项目路径对外只有一个概念;如果用户给出的项目路径不存在,直接按新项目路径处理,不要再单独追问“新项目路径”。
11
12
  5. 分析当前代码与开发文档之间的真实进度和偏差,并判断当前项目目录与开发文档目标是否匹配。
@@ -28,7 +29,7 @@ prompt = """
28
29
  8. 如果当前项目目录已存在,但分析认为它与开发文档目标明显冲突,必须先明确提示用户,并确认是继续现有项目、还是清理后按文档重建。
29
30
  9. 用户未确认前,不要开始正式修改代码。
30
31
  10. 用户确认后,继续用当前确认的执行引擎原生工具推进 backlog;每个任务完成后还要再做任务完成复核,backlog 清空后还要再做主线终态复核,直到开发文档的最终目标完成,且相关测试、验证、验收都已通过;遇到硬阻塞或需要用户补充关键信息时再停下。
31
- 11. 如果当前引擎在运行中遇到 429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎自动恢复,不要中途停下来询问用户;只有明确硬阻塞时才停止。
32
+ 11. 如果当前引擎在运行中遇到 400、鉴权、余额、429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎“健康探测 + 条件恢复”,不要中途停下来询问用户,也不要自动切换引擎;只有自动恢复额度真正用尽时才停止。
32
33
  12. 如果用户给了开发文档但找不到项目仓库,或给了项目路径但找不到开发文档,必须停下来询问。
33
34
  13. 用户需求明确且当前任务可直接完成时,必须一次性完成本轮应交付的全部工作;禁止做一半后用“如果你要”“是否继续”之类的话术停下,也禁止用“希望这对你有帮助”等套话收尾。
34
35
  14. Windows 上优先用安全的文件与 shell 操作;禁止危险删除、硬重置、强推和其他破坏性命令。
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helloloop",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "HelloLoop 的 Gemini CLI 原生扩展,用于按开发文档接续推进项目开发。",
5
5
  "contextFileName": "GEMINI.md",
6
6
  "excludeTools": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helloloop",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "面向 Codex CLI、Claude Code、Gemini CLI 的多宿主开发工作流插件",
5
5
  "author": "HelloLoop",
6
6
  "license": "Apache-2.0",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: helloloop
3
- description: 当用户希望 Codex 先分析仓库当前进度、生成确认单,再自动按 backlog 持续接续开发时使用。
3
+ description: 仅当用户显式调用 `$helloloop` / `#helloloop` / `helloloop:helloloop`,或明确要求使用 HelloLoop 按开发文档持续接续开发时使用。
4
4
  ---
5
5
 
6
6
  # HelloLoop
@@ -9,6 +9,7 @@ description: 当用户希望 Codex 先分析仓库当前进度、生成确认单
9
9
 
10
10
  ## 强制入口规则
11
11
 
12
+ - 未显式调用 `helloloop`,且用户也没有明确要求“使用 HelloLoop / 使用 helloloop 插件 / 走 HelloLoop 流程”时,不允许接管普通 Codex 会话。
12
13
  - 用户显式调用 `$helloloop` / `#helloloop` / `helloloop:helloloop` 时,默认必须优先执行 `npx helloloop` 或 `npx helloloop <PATH>`;如果用户又明确指定了执行引擎,也允许使用 `npx helloloop codex|claude|gemini ...`。
13
14
  - 用户没有明确指定执行引擎时,不允许由 skill 自行补成 `codex` / `claude` / `gemini`;必须让 `HelloLoop` 先完成引擎确认。
14
15
  - 不允许在对话里手工模拟 `HelloLoop` 的分析、确认单、backlog 编排和自动续跑流程来代替 CLI。
@@ -74,8 +75,8 @@ description: 当用户希望 Codex 先分析仓库当前进度、生成确认单
74
75
  - 每个任务在执行引擎声称“完成”后,还必须再过一层任务完成复核;如果只是部分完成,继续当前主线任务,不直接结束。
75
76
  - 用户需求明确且当前任务可直接完成时,必须一次性完成本轮应交付的全部工作;禁止做一半后用“如果你要”“是否继续”之类的话术停下,也禁止用客套套话收尾。
76
77
  - 真正的代码分析与实现由本轮选中的 `codex` / `claude` / `gemini` CLI 原生完成。
77
- - 如果当前引擎在运行中遇到 429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎自动恢复,不要中途停下来询问用户。
78
- - 只有识别为 400 请求错误、登录/鉴权/订阅问题、本地 CLI 缺失或权限错误等硬阻塞时,才允许结束本轮自动执行。
78
+ - 如果当前引擎在运行中遇到 400、鉴权、余额、429、5xx、网络抖动、流中断或长时间卡死,必须优先按无人值守策略做同引擎“健康探测 + 条件恢复”,不要中途停下来询问用户,也不要自动切换引擎。
79
+ - 只有当硬阻塞或软阻塞的自动恢复额度真正用尽时,才允许结束本轮自动执行;若用户已在 `~/.helloloop/settings.json` 配置邮箱通知,则结束前发送告警邮件。
79
80
  - `$helloloop` 的职责是把用户请求路由到主 CLI 流程,而不是在对话里手工复刻一套平行流程。
80
81
 
81
82
  ## 核心命令
package/src/config.mjs CHANGED
@@ -20,15 +20,13 @@ const defaultPolicy = {
20
20
  stopOnHighRisk: true,
21
21
  runtimeRecovery: {
22
22
  enabled: true,
23
- allowEngineSwitch: false,
24
23
  heartbeatIntervalSeconds: 60,
25
24
  stallWarningSeconds: 900,
26
25
  maxIdleSeconds: 2700,
27
26
  killGraceSeconds: 10,
28
- maxPhaseRecoveries: 4,
29
- retryDelaysSeconds: [120, 300, 900, 1800],
30
- retryOnUnknownFailure: true,
31
- maxUnknownRecoveries: 1,
27
+ healthProbeTimeoutSeconds: 120,
28
+ hardRetryDelaysSeconds: [900, 900, 900, 900, 900],
29
+ softRetryDelaysSeconds: [900, 900, 900, 900, 900, 1800, 1800, 3600, 5400, 7200, 9000, 10800],
32
30
  },
33
31
  codex: {
34
32
  model: "",
@@ -84,9 +82,12 @@ export function loadPolicy(context) {
84
82
  policy.runtimeRecovery = {
85
83
  ...defaultPolicy.runtimeRecovery,
86
84
  ...(policy.runtimeRecovery || {}),
87
- retryDelaysSeconds: Array.isArray(policy?.runtimeRecovery?.retryDelaysSeconds)
88
- ? policy.runtimeRecovery.retryDelaysSeconds
89
- : defaultPolicy.runtimeRecovery.retryDelaysSeconds,
85
+ hardRetryDelaysSeconds: Array.isArray(policy?.runtimeRecovery?.hardRetryDelaysSeconds)
86
+ ? policy.runtimeRecovery.hardRetryDelaysSeconds
87
+ : defaultPolicy.runtimeRecovery.hardRetryDelaysSeconds,
88
+ softRetryDelaysSeconds: Array.isArray(policy?.runtimeRecovery?.softRetryDelaysSeconds)
89
+ ? policy.runtimeRecovery.softRetryDelaysSeconds
90
+ : defaultPolicy.runtimeRecovery.softRetryDelaysSeconds,
90
91
  };
91
92
  return policy;
92
93
  }
package/src/discovery.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ import os from "node:os";
1
2
  import path from "node:path";
2
3
 
3
4
  import { expandDocumentEntries } from "./doc_loader.mjs";
@@ -49,6 +50,11 @@ const DOCS_SOURCE_META = {
49
50
  repo_docs: { label: "仓库 docs 目录", confidence: "medium" },
50
51
  };
51
52
 
53
+ function isImplicitHomeDirectory(targetPath) {
54
+ return Boolean(targetPath)
55
+ && path.resolve(targetPath) === path.resolve(os.homedir());
56
+ }
57
+
52
58
  function pushBasis(basis, message) {
53
59
  if (message && !basis.includes(message)) {
54
60
  basis.push(message);
@@ -127,6 +133,10 @@ export function discoverWorkspace(options = {}) {
127
133
  const explicitRepoRoot = options.repoRoot ? resolveAbsolute(options.repoRoot, cwd) : "";
128
134
  const explicitDocsPath = options.docsPath ? resolveAbsolute(options.docsPath, cwd) : "";
129
135
  const explicitInputPath = options.inputPath ? resolveAbsolute(options.inputPath, cwd) : "";
136
+ const treatCwdAsHomeWorkspace = !explicitRepoRoot
137
+ && !explicitDocsPath
138
+ && !explicitInputPath
139
+ && isImplicitHomeDirectory(cwd);
130
140
 
131
141
  if (explicitRepoRoot && !pathExists(explicitRepoRoot)) {
132
142
  if (!allowNewRepoRoot) {
@@ -196,13 +206,15 @@ export function discoverWorkspace(options = {}) {
196
206
  }
197
207
 
198
208
  if (!repoRoot && !docsEntries.length) {
199
- const cwdRepoRoot = findRepoRootFromPath(cwd);
209
+ const cwdRepoRoot = treatCwdAsHomeWorkspace ? "" : findRepoRootFromPath(cwd);
200
210
  if (cwdRepoRoot) {
201
211
  repoRoot = cwdRepoRoot;
202
212
  repoSource = "cwd_repo";
203
213
  pushBasis(repoBasis, "当前终端目录已经位于一个项目仓库内。");
204
214
  } else {
205
- const cwdClassified = classifyExplicitPath(cwd);
215
+ const cwdClassified = treatCwdAsHomeWorkspace
216
+ ? { kind: "workspace", absolutePath: cwd }
217
+ : classifyExplicitPath(cwd);
206
218
  if (cwdClassified.kind === "docs") {
207
219
  docsEntries = [cwdClassified.absolutePath];
208
220
  docsSource = "cwd_docs";
@@ -373,6 +385,13 @@ export function resolveRepoRoot(options = {}) {
373
385
  return { ok: false, message: renderMissingRepoMessage([classified.absolutePath], inferred.candidates) };
374
386
  }
375
387
 
388
+ if (!explicitRepoRoot && !explicitInputPath && isImplicitHomeDirectory(cwd)) {
389
+ return {
390
+ ok: false,
391
+ message: "当前目录看起来是用户主目录;HelloLoop 不会把主目录自动当作项目仓库。请切到项目目录,或传入一个项目路径/开发文档路径。",
392
+ };
393
+ }
394
+
376
395
  const repoRoot = findRepoRootFromPath(cwd);
377
396
  if (repoRoot) {
378
397
  return { ok: true, repoRoot };