helloagents 2.3.8 → 3.0.1-beta.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.
Files changed (90) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +21 -0
  3. package/.codex-plugin/plugin.json +46 -0
  4. package/README.md +488 -638
  5. package/README_CN.md +770 -0
  6. package/assets/dogdoing/complete.wav +0 -0
  7. package/assets/dogdoing/confirm.wav +0 -0
  8. package/assets/dogdoing/error.wav +0 -0
  9. package/assets/dogdoing/idle.wav +0 -0
  10. package/assets/dogdoing/warning.wav +0 -0
  11. package/assets/icons/icon-large.png +0 -0
  12. package/assets/icons/icon.png +0 -0
  13. package/assets/sounds/complete.wav +0 -0
  14. package/assets/sounds/confirm.wav +0 -0
  15. package/assets/sounds/error.wav +0 -0
  16. package/assets/sounds/idle.wav +0 -0
  17. package/assets/sounds/warning.wav +0 -0
  18. package/bootstrap-lite.md +199 -0
  19. package/bootstrap.md +296 -0
  20. package/cli.mjs +453 -0
  21. package/gemini-extension.json +8 -0
  22. package/hooks/hooks-claude.json +88 -0
  23. package/hooks/hooks.json +76 -0
  24. package/package.json +36 -6
  25. package/scripts/cli-codex.mjs +445 -0
  26. package/scripts/cli-config.mjs +37 -0
  27. package/scripts/cli-hosts.mjs +75 -0
  28. package/scripts/cli-messages.mjs +92 -0
  29. package/scripts/cli-toml.mjs +251 -0
  30. package/scripts/cli-utils.mjs +139 -0
  31. package/scripts/guard.mjs +217 -0
  32. package/scripts/notify-context.mjs +123 -0
  33. package/scripts/notify-events.mjs +11 -0
  34. package/scripts/notify-shared.mjs +47 -0
  35. package/scripts/notify-ui.mjs +92 -0
  36. package/scripts/notify.mjs +219 -0
  37. package/scripts/ralph-loop.mjs +246 -0
  38. package/skills/_meta/SKILL.md +19 -0
  39. package/skills/commands/auto/SKILL.md +91 -0
  40. package/skills/commands/clean/SKILL.md +21 -0
  41. package/skills/commands/commit/SKILL.md +26 -0
  42. package/skills/commands/design/SKILL.md +108 -0
  43. package/skills/commands/help/SKILL.md +45 -0
  44. package/skills/commands/init/SKILL.md +60 -0
  45. package/skills/commands/loop/SKILL.md +98 -0
  46. package/skills/commands/prd/SKILL.md +151 -0
  47. package/skills/commands/review/SKILL.md +16 -0
  48. package/skills/commands/test/SKILL.md +16 -0
  49. package/skills/commands/verify/SKILL.md +21 -0
  50. package/skills/hello-api/SKILL.md +40 -0
  51. package/skills/hello-arch/SKILL.md +38 -0
  52. package/skills/hello-data/SKILL.md +39 -0
  53. package/skills/hello-debug/SKILL.md +58 -0
  54. package/skills/hello-errors/SKILL.md +39 -0
  55. package/skills/hello-perf/SKILL.md +40 -0
  56. package/skills/hello-reflect/SKILL.md +34 -0
  57. package/skills/hello-review/SKILL.md +33 -0
  58. package/skills/hello-security/SKILL.md +40 -0
  59. package/skills/hello-subagent/SKILL.md +32 -0
  60. package/skills/hello-test/SKILL.md +55 -0
  61. package/skills/hello-ui/SKILL.md +197 -0
  62. package/skills/hello-verify/SKILL.md +132 -0
  63. package/skills/hello-write/SKILL.md +33 -0
  64. package/skills/helloagents/SKILL.md +107 -0
  65. package/templates/CHANGELOG.md +5 -0
  66. package/templates/DESIGN.md +19 -0
  67. package/templates/STATE.md +19 -0
  68. package/templates/archive/_index.md +4 -0
  69. package/templates/context.md +19 -0
  70. package/templates/guidelines.md +15 -0
  71. package/templates/modules/module.md +13 -0
  72. package/templates/plans/decisions.md +10 -0
  73. package/templates/plans/design.md +14 -0
  74. package/templates/plans/prd/00-overview.md +23 -0
  75. package/templates/plans/prd/01-user-stories.md +19 -0
  76. package/templates/plans/prd/02-functional.md +30 -0
  77. package/templates/plans/prd/03-ui-design.md +31 -0
  78. package/templates/plans/prd/04-technical.md +25 -0
  79. package/templates/plans/prd/05-nonfunctional.md +28 -0
  80. package/templates/plans/prd/06-i18n-l10n.md +23 -0
  81. package/templates/plans/prd/07-accessibility.md +20 -0
  82. package/templates/plans/prd/08-content.md +20 -0
  83. package/templates/plans/prd/09-testing.md +22 -0
  84. package/templates/plans/prd/10-deployment.md +23 -0
  85. package/templates/plans/prd/11-legal-privacy.md +18 -0
  86. package/templates/plans/prd/12-timeline.md +21 -0
  87. package/templates/plans/requirements.md +18 -0
  88. package/templates/plans/tasks.md +10 -0
  89. package/templates/verify.yaml +9 -0
  90. package/bin/cli.mjs +0 -106
@@ -0,0 +1,246 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * HelloAGENTS Ralph Loop — Quality verification gate
4
+ * Runs on SubagentStop (Claude Code) and Stop (Codex CLI).
5
+ * Auto-detects lint/test commands and blocks if they fail.
6
+ */
7
+ import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { execSync } from 'node:child_process';
10
+ import { homedir } from 'node:os';
11
+
12
+ const CONFIG_FILE = join(homedir(), '.helloagents', 'helloagents.json');
13
+ const CMD_TIMEOUT = 60_000; // 60s
14
+
15
+ // Hook event name: read from env or infer from CLI mode + --gemini flag.
16
+ // Claude: SubagentStop/Stop, Gemini: AfterAgent/SessionEnd.
17
+ const IS_SUBAGENT = (process.argv[2] || '') === 'subagent';
18
+ const IS_GEMINI = process.argv.includes('--gemini');
19
+ const HOOK_EVENT = process.env.HELLOAGENTS_HOOK_EVENT
20
+ || (IS_SUBAGENT ? (IS_GEMINI ? 'AfterAgent' : 'SubagentStop') : (IS_GEMINI ? 'SessionEnd' : 'Stop'));
21
+
22
+ // ── Settings ──────────────────────────────────────────────────────────
23
+ function readSettings() {
24
+ try { return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8')); } catch {}
25
+ return {};
26
+ }
27
+
28
+ // ── Detect verification commands ──────────────────────────────────────
29
+ function loadVerifyYaml(cwd) {
30
+ const f = join(cwd, '.helloagents', 'verify.yaml');
31
+ if (!existsSync(f)) return null;
32
+ try {
33
+ const content = readFileSync(f, 'utf-8');
34
+ const cmds = [];
35
+ let inCmds = false;
36
+ for (const line of content.split('\n')) {
37
+ const s = line.trim();
38
+ if (s.startsWith('commands:')) { inCmds = true; continue; }
39
+ if (inCmds) {
40
+ if (s.startsWith('- ') && !s.startsWith('# ')) {
41
+ const cmd = s.slice(2).trim().replace(/^["']|["']$/g, '');
42
+ if (cmd && !cmd.startsWith('#')) cmds.push(cmd);
43
+ } else if (s && !s.startsWith('#')) break;
44
+ }
45
+ }
46
+ return cmds.length ? cmds : null;
47
+ } catch { return null; }
48
+ }
49
+
50
+ function detectFromPackageJson(cwd) {
51
+ const f = join(cwd, 'package.json');
52
+ if (!existsSync(f)) return [];
53
+ try {
54
+ const scripts = JSON.parse(readFileSync(f, 'utf-8')).scripts || {};
55
+ return ['lint', 'typecheck', 'type-check', 'test', 'build']
56
+ .filter(k => k in scripts)
57
+ .map(k => `npm run ${k}`);
58
+ } catch { return []; }
59
+ }
60
+
61
+ function detectFromPyproject(cwd) {
62
+ const f = join(cwd, 'pyproject.toml');
63
+ if (!existsSync(f)) return [];
64
+ try {
65
+ const content = readFileSync(f, 'utf-8');
66
+ const cmds = [];
67
+ if (content.includes('[tool.ruff')) cmds.push('ruff check .');
68
+ if (content.includes('[tool.mypy')) cmds.push('mypy .');
69
+ if (content.includes('[tool.pytest')) cmds.push('pytest --tb=short -q');
70
+ return cmds;
71
+ } catch { return []; }
72
+ }
73
+
74
+ function detectCommands(cwd) {
75
+ const yaml = loadVerifyYaml(cwd);
76
+ if (yaml?.length) return yaml;
77
+ const pkg = detectFromPackageJson(cwd);
78
+ if (pkg.length) return pkg;
79
+ return detectFromPyproject(cwd);
80
+ }
81
+
82
+ // ── Circuit Breaker (consecutive failure tracking) ───────────────────
83
+ const BREAKER_FILE_NAME = '.ralph-breaker.json';
84
+
85
+ function getBreakerPath(cwd) {
86
+ return join(cwd, '.helloagents', BREAKER_FILE_NAME);
87
+ }
88
+
89
+ function readBreaker(cwd) {
90
+ try {
91
+ return JSON.parse(readFileSync(getBreakerPath(cwd), 'utf-8'));
92
+ } catch {
93
+ return { consecutive_failures: 0, last_failure: null };
94
+ }
95
+ }
96
+
97
+ function writeBreaker(cwd, state) {
98
+ const dir = join(cwd, '.helloagents');
99
+ try { mkdirSync(dir, { recursive: true }); } catch {}
100
+ writeFileSync(getBreakerPath(cwd), JSON.stringify(state, null, 2));
101
+ }
102
+
103
+ function resetBreaker(cwd) {
104
+ writeBreaker(cwd, { consecutive_failures: 0, last_failure: null });
105
+ }
106
+
107
+ // ── Progress Detection (git diff check) ──────────────────────────────
108
+
109
+ function hasGitChanges(cwd) {
110
+ try {
111
+ const diff = execSync('git diff --stat HEAD', {
112
+ cwd, encoding: 'utf-8', timeout: 10_000, stdio: ['pipe', 'pipe', 'pipe'],
113
+ }).trim();
114
+ if (diff) return true;
115
+ // Also check staged changes
116
+ const staged = execSync('git diff --stat --cached', {
117
+ cwd, encoding: 'utf-8', timeout: 10_000, stdio: ['pipe', 'pipe', 'pipe'],
118
+ }).trim();
119
+ return !!staged;
120
+ } catch {
121
+ return true; // If git fails, assume changes exist (don't block on git errors)
122
+ }
123
+ }
124
+
125
+ // ── Run verification ──────────────────────────────────────────────────
126
+ const SHELL_OPERATORS = /[;&|`$(){}\n\r]/;
127
+
128
+ function runVerify(commands, cwd) {
129
+ const failures = [];
130
+ for (const cmd of commands) {
131
+ if (SHELL_OPERATORS.test(cmd)) {
132
+ failures.push({ cmd, output: 'Blocked: shell operators not allowed in verify commands' });
133
+ continue;
134
+ }
135
+ try {
136
+ execSync(cmd, { cwd, encoding: 'utf-8', timeout: CMD_TIMEOUT, stdio: ['pipe', 'pipe', 'pipe'] });
137
+ } catch (err) {
138
+ // ENOENT = command or dependency not installed, skip instead of failing
139
+ if (err.code === 'ENOENT' || (err.stderr && /ENOENT|not found|command not found/i.test(err.stderr))) {
140
+ continue;
141
+ }
142
+ let output = ((err.stdout || '') + (err.stderr || '')).trim();
143
+ if (output.length > 1000) output = output.slice(0, 1000) + '\n...(truncated)';
144
+ failures.push({ cmd, output: output || `exit code ${err.status}` });
145
+ }
146
+ }
147
+ return failures;
148
+ }
149
+
150
+ // ── Result Handlers ──────────────────────────────────────────────────
151
+
152
+ function handleSuccess(cwd, isSubagent) {
153
+ resetBreaker(cwd);
154
+
155
+ if (isSubagent) {
156
+ process.stdout.write(JSON.stringify({
157
+ hookSpecificOutput: {
158
+ hookEventName: HOOK_EVENT,
159
+ additionalContext: '子代理快速验证通过(lint/typecheck)。请控制器审查变更后继续。',
160
+ },
161
+ suppressOutput: true,
162
+ }));
163
+ return;
164
+ }
165
+
166
+ // Progress detection: warn if claiming done but no git changes
167
+ if (!hasGitChanges(cwd)) {
168
+ process.stdout.write(JSON.stringify({
169
+ hookSpecificOutput: {
170
+ hookEventName: HOOK_EVENT,
171
+ additionalContext: '⚠️ [Ralph Loop] 验证通过但未检测到代码变更(git diff 为空)。如果确实完成了编码任务,请确认变更已保存。',
172
+ },
173
+ suppressOutput: true,
174
+ }));
175
+ } else {
176
+ process.stdout.write(JSON.stringify({ suppressOutput: true }));
177
+ }
178
+ }
179
+
180
+ function handleFailure(failures, cwd) {
181
+ const breaker = readBreaker(cwd);
182
+ breaker.consecutive_failures += 1;
183
+ breaker.last_failure = new Date().toISOString();
184
+ writeBreaker(cwd, breaker);
185
+
186
+ const breakerWarning = breaker.consecutive_failures >= 3
187
+ ? `\n\n⚠️ [断路器] 已连续 ${breaker.consecutive_failures} 次验证失败。当前修复思路可能有误,建议:\n 1. 重新分析根因,不要继续在同一方向上硬修\n 2. 检查是否存在架构层面的问题\n 3. 考虑回退到上一个正常状态重新开始`
188
+ : '';
189
+
190
+ const details = failures.map(f => `\u2717 ${f.cmd}\n${f.output}`).join('\n\n');
191
+ process.stdout.write(JSON.stringify({
192
+ decision: 'block',
193
+ reason: `[Ralph Loop] Verification failed:\n\n${details}\n\nFix the issues above before completing.${breakerWarning}`,
194
+ suppressOutput: true,
195
+ }));
196
+ }
197
+
198
+ /** Filter commands to fast checks only for subagent mode. Returns null if no fast commands found. */
199
+ function filterSubagentCommands(commands) {
200
+ const fast = commands.filter(cmd =>
201
+ /lint|typecheck|type-check|ruff check|mypy|eslint|tsc/.test(cmd)
202
+ );
203
+ if (fast.length === 0) {
204
+ process.stdout.write(JSON.stringify({
205
+ hookSpecificOutput: {
206
+ hookEventName: HOOK_EVENT,
207
+ additionalContext: '子代理完成。未找到快速验证命令,请控制器手动审查变更。',
208
+ },
209
+ suppressOutput: true,
210
+ }));
211
+ return null;
212
+ }
213
+ return fast;
214
+ }
215
+
216
+ // ── Main ──────────────────────────────────────────────────────────────
217
+ async function main() {
218
+ const settings = readSettings();
219
+ if (settings.ralph_loop_enabled === false) {
220
+ process.stdout.write(JSON.stringify({ suppressOutput: true }));
221
+ return;
222
+ }
223
+
224
+ let data = {};
225
+ try { data = JSON.parse(readFileSync(0, 'utf-8')); } catch {}
226
+ const cwd = data.cwd || process.cwd();
227
+
228
+ let commands = detectCommands(cwd);
229
+ if (!commands?.length) {
230
+ process.stdout.write(JSON.stringify({ suppressOutput: true }));
231
+ return;
232
+ }
233
+
234
+ if (IS_SUBAGENT) {
235
+ commands = filterSubagentCommands(commands);
236
+ if (!commands) return;
237
+ }
238
+
239
+ const failures = runVerify(commands, cwd);
240
+ if (failures.length === 0) handleSuccess(cwd, IS_SUBAGENT);
241
+ else handleFailure(failures, cwd);
242
+ }
243
+
244
+ main().catch(() => {
245
+ process.stdout.write(JSON.stringify({ suppressOutput: true }));
246
+ });
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: helloagents-meta
3
+ description: HelloAGENTS 技能系统规范
4
+ policy:
5
+ allow_implicit_invocation: false
6
+ ---
7
+
8
+ ## Skill 系统
9
+ Skills 是带 YAML frontmatter 的 Markdown 文件。
10
+ - helloagents: 检查清单驱动的质量门控(每次对话自动加载)
11
+ - hello-*: 质量技能(根据任务自动激活,提供实现标准和交付检查清单)
12
+ - commands/*: 用户通过 ~command 调用
13
+
14
+ Skills 按需加载,不预加载。
15
+
16
+ ## Frontmatter 字段
17
+ - name: 技能名称(必填)
18
+ - description: 技能描述,用于元数据层判断是否相关(必填)
19
+ - policy.allow_implicit_invocation: 是否允许隐式激活(false = 仅显式调用)。缺省时默认 true(hello-* 质量技能根据任务自动激活)。commands/* 必须显式设为 false(仅通过 ~command 调用)
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: ~auto
3
+ description: ~design 的全自动版本 — AI 自主完成需求分析、方案设计和执行,流程与 ~design 一致(~auto 命令)
4
+ policy:
5
+ allow_implicit_invocation: false
6
+ ---
7
+ Trigger: ~auto <任务描述>
8
+
9
+ ~auto 是 ~design 的全自动版本。区别仅在于:需求分析和方案探索由 AI 自主决策(不确定的关键决策点仍向用户确认)。简单任务可跳过方案设计直接执行。
10
+
11
+ 本 skill 自包含,不依赖再读取 `~design` 的 command skill。只有在本 skill 明确要求时,才继续读取对应的 hello-* 技能。
12
+
13
+ ## 铁律
14
+ - 在确认方案之前,禁止编写实现代码、创建实现文件或执行实现操作;仅当任务被判定为简单任务时,才可跳过方案设计直接进入执行
15
+ - 需求分析阶段不读取实现类技能(hello-ui/hello-test/hello-verify 等),需求明确后再按需读取
16
+ - 不因为 `~auto` 与 `~design` 相似,就额外读取 `~design` 的 SKILL.md
17
+
18
+ ## 流程
19
+
20
+ ### 1. 上下文收集(ORIENT)
21
+
22
+ 已有项目:
23
+ - 读取 .helloagents/context.md 获取项目上下文和模块索引
24
+ - 读取 .helloagents/guidelines.md 获取项目约定
25
+ - 扫描相关代码文件理解现有架构
26
+
27
+ 全新项目(无 .helloagents/ 目录):
28
+ - 跳过,直接进入需求分析
29
+
30
+ ### 2. 需求分析(CLARIFY,AI 自主判断)
31
+
32
+ 快速评估任务复杂度:
33
+ 1. 影响范围(单文件 vs 多文件)
34
+ 2. 是否涉及架构决策
35
+ 3. 复杂度信号:文件数 / 跨模块数 / 新增依赖 / 数据库变更
36
+
37
+ 简单任务(单文件修改/明确修复)→ 跳过方案设计,直接进入当前已加载 bootstrap 中定义的统一执行流程。
38
+
39
+ 复杂任务 → AI 自主分析三个方向(目的、约束、成功标准),不确定的关键决策点仍向用户确认。
40
+ 涉及视觉/交互/体验的决策:必须体现当前前沿设计水准。若当前已加载 bootstrap 含审美/体验规则则遵循其要求;否则至少给出具体、可执行、非泛化的视觉特征,不确定时主动搜索查阅最新设计案例和技术能力。
41
+
42
+ 大项目检测:如果任务涉及多个独立子系统,先分解为子项目,每个子项目走独立的设计→计划→实施循环。
43
+
44
+ **假设模式**(已有代码库,优先使用):
45
+ - 基于代码证据自主判断目的、约束和成功标准
46
+ - 不确定的关键决策点仍向用户确认
47
+
48
+ **委托模式**(全新项目,对应 ~design 交互模式的自动化版本):
49
+ - 基于任务描述自主推断目的、约束和成功标准
50
+ - 不确定的关键决策点仍向用户确认
51
+
52
+ ### 3. 方案探索(PLAN)
53
+
54
+ 基于需求分析结果,评估 2-3 个可行方案,自主选择最佳方案(与 ~design 一致,但由 AI 决策)。
55
+ 涉及 UI 的方案:此时读取 hello-ui SKILL.md 获取设计规范。
56
+
57
+ ### 4. 方案细化
58
+
59
+ 自主完成完整方案细化:
60
+ - 架构与文件结构
61
+ - 涉及 UI 时:按 hello-ui 的设计思维规范展开
62
+ - 数据流与错误处理
63
+ - 测试策略
64
+
65
+ ### 5. 写入方案包
66
+
67
+ 复杂任务将确认的方案写入本地项目:
68
+ - 全新项目(无 .helloagents/ 目录):先创建 .helloagents/ 和 STATE.md(按 templates/STATE.md 格式)。这是方案包写入的前置操作,不受 kb_create_mode 开关控制
69
+ - 创建 .helloagents/plans/YYYYMMDDHHMM_{feature}/
70
+ - 按 templates/plans/ 的模板格式写入 requirements.md、design.md、tasks.md
71
+ - 涉及 UI 的项目:生成或更新 .helloagents/DESIGN.md
72
+ - 重写 .helloagents/STATE.md(正在做什么、关键上下文含需求摘要和方案决策、下一步设为第一个待执行任务)
73
+
74
+ ### 6. 执行决策
75
+
76
+ 展示方案摘要后,仅在是否进入执行仍构成阻塞决策时才询问用户:
77
+ - 开始执行 → 重写 STATE.md(下一步设为第一个任务的具体动作)
78
+ - 修改方案 → 回到方案细化
79
+ - 暂不执行,保留方案 → 重写 STATE.md(下一步设为“方案已确认;执行需用户明确启动”)
80
+
81
+ 如果用户已对当前方案或继续执行作出明确同意,视为执行授权成立,直接进入执行,不再追加确认环节。
82
+ 简单任务跳过方案设计时,直接进入执行,无需额外确认。
83
+
84
+ ### 7. 执行
85
+
86
+ 按 tasks.md 逐项完成,每项进入当前已加载 bootstrap 中定义的统一执行流程,完成后同步重写 STATE.md。
87
+ 任务状态标记仅写入 tasks.md、验收清单或验证结果;普通说明、方案解释、状态汇报不用 [√] / [-] / [ ]。
88
+ 所有任务完成后进入当前已加载 bootstrap 中定义的 VALIDATE 阶段。
89
+ 可并行的任务标记后用子代理并行执行(不同子代理不改同一文件)。
90
+ 执行过程中遇到阻塞(依赖缺失、指令不清、验证反复失败)→ 立即停下询问用户,不猜测。
91
+ 执行过程中遇到高风险操作(删除文件/修改配置/数据库变更)→ 暂停确认。
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: ~clean
3
+ description: 清理临时文件、缓存和归档已完成方案包(~clean 命令)
4
+ policy:
5
+ allow_implicit_invocation: false
6
+ ---
7
+ Trigger: ~clean
8
+
9
+ ## 流程
10
+
11
+ 1. 扫描 .helloagents/plans/ 下的方案包
12
+ 2. 判定完成状态:tasks.md 中所有任务已标记 [√](该标记仅用于任务列表/验收清单)或 STATE.md "正在做什么"表明已完成
13
+ 3. 已完成的方案包 → 将整个 plans/{feature}/ 目录归档到 .helloagents/archive/YYYY-MM/
14
+ 4. 更新 .helloagents/archive/_index.md(按 templates/archive/_index.md 格式追加一行)
15
+ 5. 清理临时文件:.helloagents/loop-results.tsv、.helloagents/.ralph-breaker.json
16
+ 6. 重写 STATE.md(清空已归档的方案路径;这是强制更新,但不要求为仅执行 `~clean` 的场景首次创建)
17
+ 7. 输出清理摘要(归档了几个方案包、清理了哪些文件)
18
+
19
+ ## 不删除
20
+ 流程状态:STATE.md、DESIGN.md
21
+ 知识沉淀:context.md、guidelines.md、verify.yaml、CHANGELOG.md、modules/
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: ~commit
3
+ description: 规范化 Git 提交 + 知识库同步(~commit 命令)
4
+ policy:
5
+ allow_implicit_invocation: false
6
+ ---
7
+ Trigger: ~commit [message]
8
+
9
+ ## 流程
10
+
11
+ 1. 检查 staged changes(git diff --staged)
12
+ 2. 如果没有 staged changes,提示用户先 git add
13
+ 3. 生成 conventional commit message(如未提供)
14
+ - 格式: type(scope): description
15
+ - type: feat|fix|refactor|docs|test|chore|style|perf
16
+ 4. 优先使用当前上下文中已注入的“当前用户设置”获取 `commit_attribution`;只有上下文不存在时才读取 `~/.helloagents/helloagents.json`:
17
+ - ""(空,默认)→ 不添加归属
18
+ - 有内容(如 "Co-Authored-By: HelloAGENTS")→ 添加该内容到 commit message
19
+ 5. 执行 git commit
20
+
21
+ ## 知识库同步
22
+ 提交后,优先使用当前上下文中已注入的“当前用户设置”获取 `kb_create_mode`;只有上下文不存在时才读取 `~/.helloagents/helloagents.json`:
23
+ - 0 = 跳过
24
+ - 1 = 编码任务自动同步(默认)
25
+ - 2 = 始终同步
26
+ 同步内容(仅知识库文件,规则同当前已加载 bootstrap 的 VALIDATE 阶段中的知识库同步)。
@@ -0,0 +1,108 @@
1
+ ---
2
+ name: ~design
3
+ description: 深度设计工作流 — 交互式需求挖掘、方案设计和执行(~design 命令)
4
+ policy:
5
+ allow_implicit_invocation: false
6
+ ---
7
+ Trigger: ~design [description]
8
+
9
+ ~design 覆盖统一执行流程的 ORIENT、CLARIFY 和 PLAN 阶段(上下文收集+深度需求挖掘+方案设计),执行阶段进入统一执行流程。
10
+
11
+ ## 铁律
12
+ - 在用户确认方案之前,禁止编写任何实现代码、创建任何文件、或执行任何实现操作。
13
+ - "这个太简单不需要设计" → 简单项目设计也简单,跳过设计的项目返工更多。
14
+ - 需求挖掘阶段不读取实现类技能(hello-ui/hello-test/hello-verify 等),需求明确后再按需读取。
15
+
16
+ ## 流程
17
+
18
+ ### 1. 上下文收集(ORIENT)
19
+
20
+ 已有项目:
21
+ - 读取 .helloagents/context.md 获取项目上下文和模块索引
22
+ - 读取 .helloagents/guidelines.md 获取项目约定
23
+ - 扫描相关代码文件理解现有架构
24
+
25
+ 全新项目(无 .helloagents/ 目录):
26
+ - 跳过,直接进入需求挖掘
27
+
28
+ ### 2. 需求挖掘(CLARIFY,交互式,核心阶段)
29
+
30
+ 目标:通过自然对话理解用户想要什么,聚焦三个方向——目的(为什么做、给谁用)、约束(平台、技术、时间)、成功标准(做到什么程度算完成)。
31
+
32
+ 根据项目类型选择挖掘模式:
33
+
34
+ **假设模式**(已有代码库的项目,优先使用):
35
+ a. 先读取 5-15 个相关代码文件,理解现有架构和模式
36
+ b. 基于代码证据形成假设列表,每个假设标注置信度(高/中/低)
37
+ c. 向用户展示假设,请求确认/修正(通常 2-4 轮即可完成)
38
+ d. 低置信度假设必须明确询问,高置信度假设可批量确认
39
+
40
+ **交互模式**(全新项目,或假设模式信息不足时):
41
+ a. 理解用户的初始描述,识别已知和缺失信息
42
+ b. 每次只问一个问题,偏好选择题,根据回答动态决定下一个问题
43
+ c. 只问影响整体方向的决策,实现细节由 AI 自主决策
44
+ d. 每个问题给出推荐选择和理由,让用户快速决策
45
+ e. 每确认一个决策点就总结已确认内容
46
+ f. 当目的、约束、成功标准都已明确,输出完整需求摘要,请用户确认
47
+
48
+ 选项质量要求:
49
+ - 涉及视觉/交互/体验的问题时,选项必须体现当前前沿设计水准;若当前已加载 bootstrap 含审美/体验规则则遵循其要求,否则至少给出具体、可执行、非泛化的视觉特征
50
+ - 不确定当前前沿趋势时,主动搜索查阅最新设计案例和技术能力后再给出选项
51
+ - 每个选项必须包含具体的视觉特征描述,不接受泛化标签
52
+
53
+ 大项目检测:如果任务描述涉及多个独立子系统,先帮用户分解为子项目,每个子项目走独立的设计→计划→实施循环。
54
+
55
+ 用户说"就这样"或"开始设计"时,进入下一阶段。
56
+
57
+ ### 3. 方案探索(PLAN)
58
+
59
+ 基于已确认的完整需求,提出 2-3 个可行方案:
60
+ - 每个方案简要描述架构思路和关键取舍
61
+ - 标注推荐方案及推荐理由
62
+ - 让用户选择或提出自己的想法
63
+
64
+ 涉及 UI 的方案:此时读取 hello-ui SKILL.md 获取设计规范。
65
+
66
+ ### 4. 方案细化
67
+
68
+ 用户选定方案后,一次性展示完整设计(按复杂度缩放篇幅:简单项目几段话,复杂项目详细展开):
69
+ - 架构与文件结构
70
+ - 涉及 UI 时:按 hello-ui 的设计思维规范展开
71
+ - 数据流与错误处理
72
+ - 测试策略
73
+
74
+ 展示完成后集中收敛反馈;仅在方案仍未确认时收集一次性修改意见,不逐段停顿。
75
+
76
+ ### 5. 写入方案包
77
+
78
+ 将确认的方案写入本地项目:
79
+ - 全新项目(无 .helloagents/ 目录):先创建 .helloagents/ 和 STATE.md(按 templates/STATE.md 格式)。这是方案包写入的前置操作,不受 kb_create_mode 开关控制(方案包是流程状态,不是知识沉淀)
80
+ - 创建 .helloagents/plans/YYYYMMDDHHMM_{feature}/
81
+ - 按 templates/plans/ 的模板格式写入 requirements.md、design.md、tasks.md
82
+ - 涉及 UI 的项目:生成或更新 .helloagents/DESIGN.md
83
+ - 重写 .helloagents/STATE.md(正在做什么、关键上下文含已确认的需求摘要、下一步设为"处理方案反馈或进入执行决策"、方案路径)
84
+
85
+ 知识库的完整创建和方案包归档由当前已加载 bootstrap 中的 VALIDATE 规则统一管理。
86
+
87
+ ### 6. 执行决策
88
+
89
+ 展示方案摘要后,仅在是否进入执行仍构成阻塞决策时才询问用户:
90
+ - 开始执行 → 重写 STATE.md(正在做什么、关键上下文、下一步设为第一个任务的具体动作)
91
+ - 修改方案
92
+ - 暂不执行,保留方案 → 重写 STATE.md(下一步设为"方案已确认;执行需用户明确启动")
93
+
94
+ 如果用户已对当前方案或继续执行作出明确同意,视为执行授权成立,直接进入执行,不再追加确认环节。
95
+
96
+ ### 7. 执行
97
+
98
+ 按 tasks.md 逐项完成,每项进入当前已加载 bootstrap 中定义的统一执行流程,完成后同步重写 STATE.md。任务状态标记仅写入 tasks.md、验收清单或验证结果;普通说明、方案解释、状态汇报不用 [√] / [-] / [ ]。
99
+ 所有任务完成后进入当前已加载 bootstrap 中定义的 VALIDATE 阶段。
100
+ 可并行的任务标记后用子代理并行执行(不同子代理不改同一文件)。
101
+ 执行过程中遇到阻塞(依赖缺失、指令不清、验证反复失败)→ 立即停下询问用户,不猜测。
102
+ 执行过程中遇到高风险操作(删除文件/修改配置/数据库变更)→ 暂停确认。
103
+
104
+ 任务分解原则:
105
+ - 每个任务是一个原子操作(单一关注点,可独立完成和验证)
106
+ - 每个任务包含:具体文件路径、预期变更、验证方式
107
+ - 每个任务独立可验证
108
+ - 任务之间有明确的依赖顺序
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: ~help
3
+ description: 显示 HelloAGENTS 可用命令和当前设置(~help 命令)
4
+ policy:
5
+ allow_implicit_invocation: false
6
+ ---
7
+ Trigger: ~help
8
+
9
+ ## 显示内容
10
+
11
+ ### 可用命令
12
+ | 命令 | 说明 |
13
+ |------|------|
14
+ | ~auto | 全自动执行:AI 自主分析需求、设计方案并执行 |
15
+ | ~design | 深度设计:交互式需求挖掘 + 方案设计 + 方案包 |
16
+ | ~prd | 完整 PRD:头脑风暴式逐维度挖掘,生成现代产品需求文档 |
17
+ | ~loop | 自主迭代优化:设定目标和指标,循环修改-验证-保留/回滚 |
18
+ | ~init | 初始化项目知识库和配置 |
19
+ | ~test | 为指定模块或最近变更编写完整测试 |
20
+ | ~verify | 运行所有验证命令并报告结果 |
21
+ | ~review | 代码审查 |
22
+ | ~commit | 规范化提交 + 知识库同步 |
23
+ | ~clean | 清理临时文件和归档方案包 |
24
+ | ~help | 显示此帮助 |
25
+
26
+ ### 自动激活技能
27
+ 适用条件:以下技能仅在全局模式,或当前项目已通过 `~init` 激活后自动激活:
28
+ 排除条件:纯标准模式未激活项目不会自动触发。
29
+
30
+ 编码时:hello-ui, hello-api, hello-data, hello-security, hello-errors, hello-perf, hello-arch, hello-test
31
+ 特定场景:hello-debug, hello-subagent, hello-write, hello-review
32
+ 完成时:hello-verify, hello-reflect
33
+
34
+ ### 当前设置
35
+ 适用条件:优先使用当前上下文中已注入的“当前用户设置”显示;仅在上下文不存在该信息时,才尝试读取 `~/.helloagents/helloagents.json`。
36
+ 排除条件:如果当前 CLI 存在工作区限制导致家目录不可读,则明确说明“无法直接读取配置文件,以下按已注入设置或默认值展示”,不要改用无关工具或伪造已读取结果。
37
+ | 配置项 | 默认值 | 作用 | 适用 CLI |
38
+ |--------|-------|------|---------|
39
+ | output_language | "" | 空=跟随用户语言/填写则指定(如 zh-CN、en) | Claude Code + Gemini CLI + Codex CLI |
40
+ | output_format | true | true=适用条件:仅主代理在流式结束后的最终收尾回复可使用 HelloAGENTS 格式;排除条件:所有流式/中间输出及所有子代理输出保持自然;false=自然输出 | Claude Code + Gemini CLI + Codex CLI |
41
+ | notify_level | 0 | 0=关闭/1=桌面通知/2=声音/3=两者 | Claude Code + Gemini CLI + Codex CLI |
42
+ | ralph_loop_enabled | true | 自动验证循环(任务完成时触发 lint/test/build) | Claude Code + Gemini CLI + Codex CLI |
43
+ | guard_enabled | true | 阻断危险命令与写入后的安全扫描 | Claude Code + Gemini CLI + Codex CLI |
44
+ | kb_create_mode | 1 | 0=关闭/1=编码自动/2=始终 | Claude Code + Gemini CLI + Codex CLI |
45
+ | commit_attribution | "" | 空=不添加/填写内容则添加到 commit message | Claude Code + Gemini CLI + Codex CLI |
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: ~init
3
+ description: 初始化项目知识库和配置(~init 命令)
4
+ policy:
5
+ allow_implicit_invocation: false
6
+ ---
7
+ Trigger: ~init
8
+
9
+ ~init 是用户显式命令,创建完整知识库,不受 kb_create_mode 限制。
10
+
11
+ ## 流程
12
+
13
+ ### 阶段 1:环境搭建(必做)
14
+
15
+ 1. 创建 `.helloagents/` 目录 + STATE.md(按 templates/STATE.md 格式,初始为空闲)
16
+ 2. 定位插件根目录:优先读取当前会话中注入的“当前 HelloAGENTS 包根目录”;若上下文未提供,再根据当前已加载载体和规则反推,禁止猜测其他目录
17
+ 3. 创建 `skills/helloagents` symlink → `{插件根目录}/`
18
+ 4. 读取 `{插件根目录}/bootstrap.md`,用 `<!-- HELLOAGENTS_START -->` / `<!-- HELLOAGENTS_END -->` 标记包裹后写入:
19
+ - `AGENTS.md`(项目根目录,Codex 读取)
20
+ - `CLAUDE.md`(项目根目录,Claude Code 读取)
21
+ - `.gemini/GEMINI.md`(Gemini CLI 读取,需先创建 .gemini/ 目录)
22
+ 注意:如果文件已存在且包含标记,替换标记内的内容;如果文件已存在但无标记,追加到末尾;如果文件不存在,创建新文件
23
+ 5. 追加 `.gitignore`(如果对应行不存在):
24
+ ```
25
+ .helloagents/
26
+ skills/helloagents
27
+ AGENTS.md
28
+ CLAUDE.md
29
+ .gemini/GEMINI.md
30
+ ```
31
+
32
+ ### 阶段 2:知识库创建(条件性)
33
+
34
+ 检查项目是否有实际代码文件(非空项目):
35
+ - 有代码文件 → 执行完整知识库创建(下方流程)
36
+ - 空项目 → 跳过,告知用户"项目为空,知识库将在后续开发中创建"
37
+
38
+ 知识库创建流程(与原 ~init 一致):
39
+ 1. 按 templates/ 目录的模板格式,分析项目代码库后生成:
40
+ - context.md — 按 templates/context.md 格式,填入项目概述、技术栈、架构、目录结构、模块链接
41
+ - guidelines.md — 按 templates/guidelines.md 格式,从现有代码推断编码约定
42
+ - verify.yaml — 验证命令(从 package.json/pyproject.toml 检测)
43
+ - CHANGELOG.md — 按 templates/CHANGELOG.md 格式,初始版本
44
+ - DESIGN.md — 如果项目包含 UI 代码,按 templates/DESIGN.md 格式提取设计系统
45
+ 2. 创建 modules/ 目录,按 templates/modules/module.md 格式为主要模块生成文档
46
+ 3. 不覆盖已存在的文件
47
+
48
+ ## verify.yaml 格式
49
+ ```yaml
50
+ commands:
51
+ - npm run lint
52
+ - npm run test
53
+ ```
54
+
55
+ ## 幂等性
56
+ 重复执行 ~init 是安全的:
57
+ - 已存在的 .helloagents/ 文件不覆盖
58
+ - symlink 刷新(删除旧的重建)
59
+ - AGENTS.md/CLAUDE.md/GEMINI.md 中标记内容替换更新
60
+ - .gitignore 只追加缺失行