6aspec 3.0.0-dev.3 → 3.0.0-dev.30

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 (107) hide show
  1. package/.6aspec/rules/biz/code.md +56 -97
  2. package/.6aspec/rules/biz/code_implementation_sop.md +7 -0
  3. package/.6aspec/rules/biz/java-build-test.md +28 -0
  4. package/.6aspec/rules/biz/use_case_orchestration_rule.md +63 -0
  5. package/.6aspec/rules/brown/brown_analyze_sop.md +6 -1
  6. package/.6aspec/rules/brown/brown_implement_sop.md +41 -15
  7. package/.6aspec/rules/brown/brown_tasks_sop.md +8 -13
  8. package/.6aspec/rules/brown/subagents/implementer.md +65 -26
  9. package/.6aspec/rules/brown/subagents/spec-compliance-reviewer.md +82 -10
  10. package/.6aspec/rules/common/code-reviewer-agent.md +149 -0
  11. package/.agents/skills/6aspec-brown-analyze/SKILL.md +10 -0
  12. package/.agents/skills/6aspec-brown-analyze/agents/openai.yaml +2 -0
  13. package/.agents/skills/6aspec-brown-archive/SKILL.md +10 -0
  14. package/.agents/skills/6aspec-brown-archive/agents/openai.yaml +6 -0
  15. package/.agents/skills/6aspec-brown-continue/SKILL.md +10 -0
  16. package/.agents/skills/6aspec-brown-continue/agents/openai.yaml +6 -0
  17. package/.agents/skills/6aspec-brown-design/SKILL.md +10 -0
  18. package/.agents/skills/6aspec-brown-design/agents/openai.yaml +2 -0
  19. package/.agents/skills/6aspec-brown-explore/SKILL.md +10 -0
  20. package/.agents/skills/6aspec-brown-explore/agents/openai.yaml +2 -0
  21. package/.agents/skills/6aspec-brown-ff/SKILL.md +10 -0
  22. package/.agents/skills/6aspec-brown-ff/agents/openai.yaml +2 -0
  23. package/.agents/skills/6aspec-brown-implement/SKILL.md +10 -0
  24. package/.agents/skills/6aspec-brown-implement/agents/openai.yaml +2 -0
  25. package/.agents/skills/6aspec-brown-list/SKILL.md +10 -0
  26. package/.agents/skills/6aspec-brown-list/agents/openai.yaml +2 -0
  27. package/.agents/skills/6aspec-brown-new/SKILL.md +10 -0
  28. package/.agents/skills/6aspec-brown-new/agents/openai.yaml +6 -0
  29. package/.agents/skills/6aspec-brown-proposal/SKILL.md +10 -0
  30. package/.agents/skills/6aspec-brown-proposal/agents/openai.yaml +2 -0
  31. package/.agents/skills/6aspec-brown-quick/SKILL.md +10 -0
  32. package/.agents/skills/6aspec-brown-quick/agents/openai.yaml +2 -0
  33. package/{.cursor/commands/6aspec/brown/impact.md → .agents/skills/6aspec-brown-review/SKILL.md} +5 -4
  34. package/.agents/skills/6aspec-brown-review/agents/openai.yaml +2 -0
  35. package/.agents/skills/6aspec-brown-rollback/SKILL.md +10 -0
  36. package/.agents/skills/6aspec-brown-rollback/agents/openai.yaml +6 -0
  37. package/.agents/skills/6aspec-brown-specs/SKILL.md +10 -0
  38. package/.agents/skills/6aspec-brown-specs/agents/openai.yaml +2 -0
  39. package/.agents/skills/6aspec-brown-status/SKILL.md +10 -0
  40. package/.agents/skills/6aspec-brown-status/agents/openai.yaml +7 -0
  41. package/.agents/skills/6aspec-brown-tasks/SKILL.md +10 -0
  42. package/.agents/skills/6aspec-brown-tasks/agents/openai.yaml +2 -0
  43. package/.agents/skills/6aspec-brown-update/SKILL.md +10 -0
  44. package/.agents/skills/6aspec-brown-update/agents/openai.yaml +5 -0
  45. package/.agents/skills/6aspec-brown-verify/SKILL.md +10 -0
  46. package/.agents/skills/6aspec-brown-verify/agents/openai.yaml +5 -0
  47. package/.agents/skills/6aspec-code/SKILL.md +9 -0
  48. package/.agents/skills/6aspec-code/agents/openai.yaml +2 -0
  49. package/.agents/skills/6aspec-review/SKILL.md +66 -0
  50. package/.agents/skills/6aspec-review/agents/openai.yaml +7 -0
  51. package/.claude/agents/{implementer.md → 6aspec-brown-implementer.md} +2 -1
  52. package/.claude/agents/6aspec-brown-spec-compliance-reviewer.md +7 -0
  53. package/.claude/agents/6aspec-code-reviewer.md +7 -0
  54. package/.claude/commands/6aspec/brown/analyze.md +1 -1
  55. package/.claude/commands/6aspec/brown/design.md +1 -1
  56. package/.claude/commands/6aspec/brown/quick.md +1 -1
  57. package/.claude/commands/6aspec/brown/review.md +1 -1
  58. package/.claude/commands/6aspec/brown/specs.md +1 -1
  59. package/.claude/commands/6aspec/brown/tasks.md +1 -1
  60. package/.claude/commands/6aspec/review.md +66 -0
  61. package/.claude/settings.local.json +1 -22
  62. package/.codex/agents/6aspec-brown-implementer.toml +11 -0
  63. package/.codex/agents/6aspec-brown-spec-compliance-reviewer.toml +13 -0
  64. package/.codex/agents/6aspec-code-reviewer.toml +13 -0
  65. package/.cursor/agents/6aspec-brown-implementer.md +7 -0
  66. package/.cursor/agents/6aspec-brown-spec-compliance-reviewer.md +8 -0
  67. package/.cursor/agents/6aspec-code-reviewer.md +8 -0
  68. package/.cursor/commands/6aspec-brown-analyze.md +9 -0
  69. package/.cursor/commands/{6aspec/brown/design.md → 6aspec-brown-design.md} +1 -1
  70. package/.cursor/commands/{6aspec/brown/implement.md → 6aspec-brown-implement.md} +1 -1
  71. package/.cursor/commands/{6aspec/brown/quick.md → 6aspec-brown-quick.md} +1 -1
  72. package/.cursor/commands/{6aspec/brown/review.md → 6aspec-brown-review.md} +1 -1
  73. package/.cursor/commands/{6aspec/brown/specs.md → 6aspec-brown-specs.md} +1 -1
  74. package/.cursor/commands/{6aspec/brown/tasks.md → 6aspec-brown-tasks.md} +1 -1
  75. package/.cursor/commands/6aspec-review.md +66 -0
  76. package/lib/cli.js +47 -11
  77. package/lib/installer.js +74 -23
  78. package/package.json +3 -1
  79. package/.claude/agents/spec-compliance-reviewer.md +0 -6
  80. package/.claude/commands/6aspec/brown/impact.md +0 -11
  81. package/.claude/commands/6aspec/brown/understand.md +0 -11
  82. package/.cursor/commands/6aspec/brown/understand.md +0 -9
  83. /package/.cursor/commands/{6aspec/brown/archive.md → 6aspec-brown-archive.md} +0 -0
  84. /package/.cursor/commands/{6aspec/brown/continue.md → 6aspec-brown-continue.md} +0 -0
  85. /package/.cursor/commands/{6aspec/brown/explore.md → 6aspec-brown-explore.md} +0 -0
  86. /package/.cursor/commands/{6aspec/brown/ff.md → 6aspec-brown-ff.md} +0 -0
  87. /package/.cursor/commands/{6aspec/brown/list.md → 6aspec-brown-list.md} +0 -0
  88. /package/.cursor/commands/{6aspec/brown/new.md → 6aspec-brown-new.md} +0 -0
  89. /package/.cursor/commands/{6aspec/brown/proposal.md → 6aspec-brown-proposal.md} +0 -0
  90. /package/.cursor/commands/{6aspec/brown/rollback.md → 6aspec-brown-rollback.md} +0 -0
  91. /package/.cursor/commands/{6aspec/brown/status.md → 6aspec-brown-status.md} +0 -0
  92. /package/.cursor/commands/{6aspec/brown/update.md → 6aspec-brown-update.md} +0 -0
  93. /package/.cursor/commands/{6aspec/brown/verify.md → 6aspec-brown-verify.md} +0 -0
  94. /package/.cursor/commands/{6aspec/code.md → 6aspec-code.md} +0 -0
  95. /package/.cursor/commands/{6aspec/green/archive.md → 6aspec-green-archive.md} +0 -0
  96. /package/.cursor/commands/{6aspec/green/clarify.md → 6aspec-green-clarify.md} +0 -0
  97. /package/.cursor/commands/{6aspec/green/continue.md → 6aspec-green-continue.md} +0 -0
  98. /package/.cursor/commands/{6aspec/green/design.md → 6aspec-green-design.md} +0 -0
  99. /package/.cursor/commands/{6aspec/green/implement.md → 6aspec-green-implement.md} +0 -0
  100. /package/.cursor/commands/{6aspec/green/import-model-table.md → 6aspec-green-import-model-table.md} +0 -0
  101. /package/.cursor/commands/{6aspec/green/init.md → 6aspec-green-init.md} +0 -0
  102. /package/.cursor/commands/{6aspec/green/model.md → 6aspec-green-model.md} +0 -0
  103. /package/.cursor/commands/{6aspec/green/new.md → 6aspec-green-new.md} +0 -0
  104. /package/.cursor/commands/{6aspec/green/rollback.md → 6aspec-green-rollback.md} +0 -0
  105. /package/.cursor/commands/{6aspec/green/status.md → 6aspec-green-status.md} +0 -0
  106. /package/.cursor/commands/{6aspec/green/tasks.md → 6aspec-green-tasks.md} +0 -0
  107. /package/.cursor/commands/{6aspec/green/visual-logic.md → 6aspec-green-visual-logic.md} +0 -0
package/lib/installer.js CHANGED
@@ -12,11 +12,11 @@ class Installer {
12
12
  // 查找包目录(支持本地开发和 npm 安装)
13
13
  findPackageDir() {
14
14
  // 如果是本地开发,直接使用当前目录
15
- if (fs.existsSync(path.join(__dirname, '../.6aspec')) ||
15
+ if (fs.existsSync(path.join(__dirname, '../.6aspec')) ||
16
16
  fs.existsSync(path.join(__dirname, '../.cursor'))) {
17
17
  return path.join(__dirname, '..');
18
18
  }
19
-
19
+
20
20
  // 如果是 npm 安装,查找 node_modules
21
21
  let current = __dirname;
22
22
  while (current !== path.dirname(current)) {
@@ -27,7 +27,7 @@ class Installer {
27
27
  }
28
28
  current = path.dirname(current);
29
29
  }
30
-
30
+
31
31
  throw new Error('未找到 .6aspec 或 .cursor 目录,请确保包已正确安装');
32
32
  }
33
33
 
@@ -75,7 +75,7 @@ class Installer {
75
75
  if (fs.existsSync(dest)) {
76
76
  this.removeDir(dest);
77
77
  }
78
-
78
+
79
79
  // 重新创建目录并复制
80
80
  fs.mkdirSync(dest, { recursive: true });
81
81
 
@@ -150,7 +150,7 @@ class Installer {
150
150
  // 安装公共配置 (.6aspec)
151
151
  install6aspec() {
152
152
  this.log('开始安装公共配置 (.6aspec)...');
153
-
153
+
154
154
  const sourceDir = path.join(this.packageDir, '.6aspec');
155
155
  const targetDir = path.join(this.targetDir, '.6aspec');
156
156
 
@@ -160,23 +160,23 @@ class Installer {
160
160
  }
161
161
 
162
162
  const targetExists = fs.existsSync(targetDir);
163
-
163
+
164
164
  if (this.mergeMode && targetExists) {
165
165
  // 智能合并模式
166
166
  this.log('使用智能合并模式(保留用户自定义文件)...');
167
-
167
+
168
168
  // 统计用户自定义文件
169
169
  const sourceFiles = new Set(this.getAllFiles(sourceDir, sourceDir));
170
170
  const targetFiles = this.getAllFiles(targetDir, targetDir);
171
171
  const customFiles = targetFiles.filter(f => !sourceFiles.has(f));
172
-
172
+
173
173
  if (customFiles.length > 0) {
174
174
  this.log(`检测到 ${customFiles.length} 个用户自定义文件,将保留`, 'info');
175
175
  }
176
-
176
+
177
177
  const result = this.mergeDir(sourceDir, targetDir);
178
178
  this.log(`更新了 ${result.updated} 个文件,新增了 ${result.added} 个文件`, 'info');
179
-
179
+
180
180
  if (customFiles.length > 0) {
181
181
  this.log(`保留了 ${customFiles.length} 个用户自定义文件`, 'info');
182
182
  }
@@ -188,14 +188,14 @@ class Installer {
188
188
  this.log('复制公共配置文件...');
189
189
  this.copyDir(sourceDir, targetDir);
190
190
  }
191
-
191
+
192
192
  this.log('✓ 公共配置安装完成!', 'success');
193
193
  }
194
194
 
195
195
  // 安装 Cursor 配置
196
196
  installCursor() {
197
197
  this.log('开始安装 Cursor 配置...');
198
-
198
+
199
199
  const sourceDir = path.join(this.packageDir, '.cursor');
200
200
  const targetDir = path.join(this.targetDir, '.cursor');
201
201
 
@@ -204,11 +204,11 @@ class Installer {
204
204
  }
205
205
 
206
206
  const targetExists = fs.existsSync(targetDir);
207
-
207
+
208
208
  if (this.mergeMode && targetExists) {
209
209
  // 智能合并模式
210
210
  this.log('使用智能合并模式(保留用户自定义文件)...');
211
-
211
+
212
212
  // 只复制 commands 目录
213
213
  const commandsSourceDir = path.join(sourceDir, 'commands');
214
214
  if (fs.existsSync(commandsSourceDir)) {
@@ -216,33 +216,48 @@ class Installer {
216
216
  const result = this.mergeDir(commandsSourceDir, commandsTargetDir);
217
217
  this.log(`commands: 更新了 ${result.updated} 个文件,新增了 ${result.added} 个文件`, 'info');
218
218
  }
219
+
220
+ // 复制 agents 目录
221
+ const agentsSourceDir = path.join(sourceDir, 'agents');
222
+ if (fs.existsSync(agentsSourceDir)) {
223
+ const agentsTargetDir = path.join(targetDir, 'agents');
224
+ const result = this.mergeDir(agentsSourceDir, agentsTargetDir);
225
+ this.log(`agents: 更新了 ${result.updated} 个文件,新增了 ${result.added} 个文件`, 'info');
226
+ }
219
227
  } else {
220
228
  // 完全覆盖模式
221
229
  if (targetExists) {
222
230
  this.backupDir(targetDir);
223
231
  }
224
232
  this.log('复制 Cursor 配置文件...');
225
-
233
+
226
234
  // 创建目标目录
227
235
  if (!fs.existsSync(targetDir)) {
228
236
  fs.mkdirSync(targetDir, { recursive: true });
229
237
  }
230
-
238
+
231
239
  // 只复制 commands 目录
232
240
  const commandsSourceDir = path.join(sourceDir, 'commands');
233
241
  if (fs.existsSync(commandsSourceDir)) {
234
242
  const commandsTargetDir = path.join(targetDir, 'commands');
235
243
  this.copyDir(commandsSourceDir, commandsTargetDir);
236
244
  }
245
+
246
+ // 复制 agents 目录
247
+ const agentsSourceDir = path.join(sourceDir, 'agents');
248
+ if (fs.existsSync(agentsSourceDir)) {
249
+ const agentsTargetDir = path.join(targetDir, 'agents');
250
+ this.copyDir(agentsSourceDir, agentsTargetDir);
251
+ }
237
252
  }
238
-
253
+
239
254
  this.log('✓ Cursor 配置安装完成!', 'success');
240
255
  }
241
256
 
242
257
  // 安装 Claude 配置
243
258
  installClaude() {
244
259
  this.log('开始安装 Claude 配置...');
245
-
260
+
246
261
  const sourceDir = path.join(this.packageDir, '.claude');
247
262
  const targetDir = path.join(this.targetDir, '.claude');
248
263
 
@@ -252,7 +267,7 @@ class Installer {
252
267
  }
253
268
 
254
269
  const targetExists = fs.existsSync(targetDir);
255
-
270
+
256
271
  // 创建目标目录结构
257
272
  if (!fs.existsSync(targetDir)) {
258
273
  fs.mkdirSync(targetDir, { recursive: true });
@@ -302,14 +317,46 @@ class Installer {
302
317
  this.copyDir(agentsDir, targetAgentsDir);
303
318
  }
304
319
  }
305
-
320
+
306
321
  this.log('✓ Claude 配置安装完成!', 'success');
307
322
  }
308
323
 
324
+ // 安装 Codex CLI 配置(仅合并,不覆盖删除用户内容)
325
+ installCodex() {
326
+ this.log('开始安装 Codex CLI 配置...');
327
+
328
+ const agentsSourceDir = path.join(this.packageDir, '.agents');
329
+ const codexSourceDir = path.join(this.packageDir, '.codex');
330
+
331
+ const agentsTargetDir = path.join(this.targetDir, '.agents');
332
+ const codexTargetDir = path.join(this.targetDir, '.codex');
333
+
334
+ // 强制 merge 语义:绝不使用 copyDir(copyDir 会先 removeDir(dest))
335
+ if (fs.existsSync(agentsSourceDir)) {
336
+ const result = this.mergeDir(agentsSourceDir, agentsTargetDir);
337
+ if (result.updated > 0 || result.added > 0) {
338
+ this.log(`.agents: 更新了 ${result.updated} 个文件,新增了 ${result.added} 个文件`, 'info');
339
+ }
340
+ } else {
341
+ this.log('未找到 .agents 源目录,跳过', 'warn');
342
+ }
343
+
344
+ if (fs.existsSync(codexSourceDir)) {
345
+ const result = this.mergeDir(codexSourceDir, codexTargetDir);
346
+ if (result.updated > 0 || result.added > 0) {
347
+ this.log(`.codex: 更新了 ${result.updated} 个文件,新增了 ${result.added} 个文件`, 'info');
348
+ }
349
+ } else {
350
+ this.log('未找到 .codex 源目录,跳过', 'warn');
351
+ }
352
+
353
+ this.log('✓ Codex CLI 配置安装完成!', 'success');
354
+ }
355
+
309
356
  // 主安装方法
310
357
  async install(tool = 'cursor', mergeMode = false) {
311
358
  this.mergeMode = mergeMode;
312
-
359
+
313
360
  this.log(`6A-spec 安装工具`);
314
361
  this.log(`目标目录: ${this.targetDir}`);
315
362
  this.log(`工具: ${tool}`);
@@ -322,7 +369,7 @@ class Installer {
322
369
  try {
323
370
  // 无论安装哪个工具,都要先安装公共配置
324
371
  this.install6aspec();
325
-
372
+
326
373
  switch (tool.toLowerCase()) {
327
374
  case 'cursor':
328
375
  this.installCursor();
@@ -330,12 +377,16 @@ class Installer {
330
377
  case 'claude':
331
378
  this.installClaude();
332
379
  break;
380
+ case 'codex':
381
+ this.installCodex();
382
+ break;
333
383
  case 'all':
334
384
  this.installCursor();
335
385
  this.installClaude();
386
+ this.installCodex();
336
387
  break;
337
388
  default:
338
- throw new Error(`未知工具: ${tool}\n支持的工具: cursor, claude, all`);
389
+ throw new Error(`未知工具: ${tool}\n支持的工具: cursor, claude, codex, all`);
339
390
  }
340
391
 
341
392
  this.log('安装完成!', 'success');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "6aspec",
3
- "version": "3.0.0-dev.3",
3
+ "version": "3.0.0-dev.30",
4
4
  "description": "6Aspec - 轻量级 spec 驱动开发框架,支持 Cursor 和 Claude Code",
5
5
  "main": "lib/installer.js",
6
6
  "bin": {
@@ -50,6 +50,8 @@
50
50
  ".cursor/",
51
51
  ".claude/",
52
52
  ".6aspec/",
53
+ ".agents/",
54
+ ".codex/",
53
55
  "README.md"
54
56
  ],
55
57
  "engines": {
@@ -1,6 +0,0 @@
1
- ---
2
- name: spec-compliance-reviewer
3
- description: 检查实现是否符合 TASK 的验收标准和 specs.md 的 AC/Scenario,适用于 TASK 完成后的合规验收
4
- ---
5
-
6
- 读取并严格遵循:`.6aspec/rules/brown/subagents/spec-compliance-reviewer.md`
@@ -1,11 +0,0 @@
1
- ---
2
- name: "6aspec:brown: Impact"
3
- description: Phase 2 - 影响面分析与非功能需求评估
4
- category: Workflow
5
- tags: [workflow, requirement, analysis]
6
- ---
7
-
8
- 1. Immediate response upon activation: brown field requirement workflow - **Impact** has been activated
9
- 2. **Read and strictly follow the brown field constitution**: `.6aspec/rules/brown/brown_constitution.md`
10
- 3. Read file: `.6aspec/rules/brown/brown_impact_sop.md`
11
- 4. Strictly follow the SOP defined in that file
@@ -1,11 +0,0 @@
1
- ---
2
- name: "6aspec:brown: Understand"
3
- description: Phase 1 - 需求理解与现状分析
4
- category: Workflow
5
- tags: [workflow, requirement, analysis]
6
- ---
7
-
8
- 1. Immediate response upon activation: brown field requirement workflow - **Understand** has been activated
9
- 2. **Read and strictly follow the brown field constitution**: `.6aspec/rules/brown/brown_constitution.md`
10
- 3. Read file: `.6aspec/rules/brown/brown_understand_sop.md`
11
- 4. Strictly follow the SOP defined in that file
@@ -1,9 +0,0 @@
1
- ---
2
- description: Phase 1 - 需求理解与现状分析
3
- alwaysApply: false
4
- ---
5
-
6
- 1. Immediate response upon activation: brown field requirement workflow - **Understand** has been activated
7
- 2. **Read and strictly follow the brown field constitution**: `.6aspec/rules/brown/brown_constitution.md`
8
- 3. Read file: `.6aspec/rules/brown/brown_understand_sop.md`
9
- 4. Strictly follow the SOP defined in that file