cc-devflow 1.0.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 (277) hide show
  1. package/.claude/CLAUDE.md +83 -0
  2. package/.claude/agents/architecture-designer.md +443 -0
  3. package/.claude/agents/bug-analyzer.md +382 -0
  4. package/.claude/agents/checklist-agent.md +175 -0
  5. package/.claude/agents/clarify-analyst.md +50 -0
  6. package/.claude/agents/code-reviewer.md +71 -0
  7. package/.claude/agents/codex-analyzer.md +39 -0
  8. package/.claude/agents/compatibility-checker.md +580 -0
  9. package/.claude/agents/consistency-checker.md +532 -0
  10. package/.claude/agents/impact-analyzer.md +441 -0
  11. package/.claude/agents/planner.md +230 -0
  12. package/.claude/agents/prd-writer.md +320 -0
  13. package/.claude/agents/project-guidelines-generator.md +1329 -0
  14. package/.claude/agents/qa-tester.md +313 -0
  15. package/.claude/agents/release-manager.md +295 -0
  16. package/.claude/agents/security-reviewer.md +314 -0
  17. package/.claude/agents/style-guide-generator.md +458 -0
  18. package/.claude/agents/tech-architect.md +516 -0
  19. package/.claude/agents/ui-designer.md +485 -0
  20. package/.claude/commands/code-review-high.md +58 -0
  21. package/.claude/commands/core-architecture.md +429 -0
  22. package/.claude/commands/core-guidelines.md +486 -0
  23. package/.claude/commands/core-roadmap.md +439 -0
  24. package/.claude/commands/core-style.md +293 -0
  25. package/.claude/commands/flow-archive.md +245 -0
  26. package/.claude/commands/flow-checklist.md +260 -0
  27. package/.claude/commands/flow-clarify.md +136 -0
  28. package/.claude/commands/flow-constitution.md +82 -0
  29. package/.claude/commands/flow-dev.md +134 -0
  30. package/.claude/commands/flow-epic.md +150 -0
  31. package/.claude/commands/flow-fix.md +104 -0
  32. package/.claude/commands/flow-ideate.md +214 -0
  33. package/.claude/commands/flow-init.md +313 -0
  34. package/.claude/commands/flow-new.md +394 -0
  35. package/.claude/commands/flow-prd.md +131 -0
  36. package/.claude/commands/flow-qa.md +93 -0
  37. package/.claude/commands/flow-release.md +92 -0
  38. package/.claude/commands/flow-restart.md +98 -0
  39. package/.claude/commands/flow-status.md +64 -0
  40. package/.claude/commands/flow-tech.md +142 -0
  41. package/.claude/commands/flow-ui.md +189 -0
  42. package/.claude/commands/flow-update.md +111 -0
  43. package/.claude/commands/flow-upgrade.md +115 -0
  44. package/.claude/commands/flow-verify.md +96 -0
  45. package/.claude/commands/problem-analyzer.md +60 -0
  46. package/.claude/config/quality-rules.yml +161 -0
  47. package/.claude/docs/SPEC_KIT_CONSTITUTION_ANALYSIS.md +426 -0
  48. package/.claude/docs/design/consistency-conflict-detection-algorithms.md +658 -0
  49. package/.claude/docs/design/intent-driven-input-design.md +380 -0
  50. package/.claude/docs/design/prd-version-management-design.md +437 -0
  51. package/.claude/docs/guides/INIT_TROUBLESHOOTING.md +117 -0
  52. package/.claude/docs/guides/NEW_TROUBLESHOOTING.md +151 -0
  53. package/.claude/docs/guides/ROADMAP_TROUBLESHOOTING.md +188 -0
  54. package/.claude/docs/guides/TASK_COMPLETION_MARKING.md +338 -0
  55. package/.claude/docs/templates/ARCHITECTURE_TEMPLATE.md +633 -0
  56. package/.claude/docs/templates/BACKLOG_TEMPLATE.md +261 -0
  57. package/.claude/docs/templates/CHECKLIST_TEMPLATE.md +52 -0
  58. package/.claude/docs/templates/CLARIFICATION_REPORT_TEMPLATE.md +206 -0
  59. package/.claude/docs/templates/CODE_REVIEW_TEMPLATE.md +71 -0
  60. package/.claude/docs/templates/EPIC_TEMPLATE.md +805 -0
  61. package/.claude/docs/templates/INIT_FLOW_TEMPLATE.md +213 -0
  62. package/.claude/docs/templates/INTENT_CLARIFICATION_TEMPLATE.md +57 -0
  63. package/.claude/docs/templates/NEW_ORCHESTRATION_TEMPLATE.md +148 -0
  64. package/.claude/docs/templates/PRD_TEMPLATE.md +562 -0
  65. package/.claude/docs/templates/RESEARCH_TEMPLATE.md +276 -0
  66. package/.claude/docs/templates/REVIEW-HIGH.md +57 -0
  67. package/.claude/docs/templates/ROADMAP_DIALOGUE_TEMPLATE.md +198 -0
  68. package/.claude/docs/templates/ROADMAP_TEMPLATE.md +310 -0
  69. package/.claude/docs/templates/STYLE_TEMPLATE.md +1266 -0
  70. package/.claude/docs/templates/TASKS_TEMPLATE.md +523 -0
  71. package/.claude/docs/templates/TECH_DESIGN_TEMPLATE.md +1019 -0
  72. package/.claude/docs/templates/UI_PROTOTYPE_TEMPLATE.md +1436 -0
  73. package/.claude/guides/agent-guides/agent-coordination-guide.md +459 -0
  74. package/.claude/guides/project-guidelines-system.md +463 -0
  75. package/.claude/guides/technical-guides/datetime-handling-guide.md +563 -0
  76. package/.claude/guides/technical-guides/git-github-guide.md +642 -0
  77. package/.claude/guides/technical-guides/test-execution-guide.md +618 -0
  78. package/.claude/guides/workflow-guides/bug-fix-orchestrator.md +217 -0
  79. package/.claude/guides/workflow-guides/flow-orchestrator.md +282 -0
  80. package/.claude/hooks/checklist-gate.js +397 -0
  81. package/.claude/hooks/error-handling-reminder.sh +12 -0
  82. package/.claude/hooks/error-handling-reminder.ts +459 -0
  83. package/.claude/hooks/post-tool-use-tracker.sh +280 -0
  84. package/.claude/hooks/pre-tool-use-guardrail.sh +36 -0
  85. package/.claude/hooks/pre-tool-use-guardrail.ts +342 -0
  86. package/.claude/hooks/skill-activation-prompt.sh +36 -0
  87. package/.claude/hooks/skill-activation-prompt.ts +214 -0
  88. package/.claude/hooks/state/skills-used-test-guard.json +3 -0
  89. package/.claude/rules/devflow-conventions.md +305 -0
  90. package/.claude/rules/project-constitution.md +748 -0
  91. package/.claude/schemas/constitution.schema.json +43 -0
  92. package/.claude/scripts/analyze-upgrade-impact.sh +200 -0
  93. package/.claude/scripts/archive-requirement.sh +351 -0
  94. package/.claude/scripts/calculate-checklist-completion.sh +243 -0
  95. package/.claude/scripts/calculate-quarter.sh +206 -0
  96. package/.claude/scripts/check-dependencies.sh +409 -0
  97. package/.claude/scripts/check-prerequisites.sh +232 -0
  98. package/.claude/scripts/check-task-status.sh +264 -0
  99. package/.claude/scripts/checklist-errors.sh +131 -0
  100. package/.claude/scripts/common.sh +570 -0
  101. package/.claude/scripts/consolidate-research.sh +182 -0
  102. package/.claude/scripts/create-requirement.sh +426 -0
  103. package/.claude/scripts/export-contracts.sh +117 -0
  104. package/.claude/scripts/extract-data-model.sh +78 -0
  105. package/.claude/scripts/generate-clarification-questions.sh +377 -0
  106. package/.claude/scripts/generate-clarification-report.sh +463 -0
  107. package/.claude/scripts/generate-quickstart.sh +146 -0
  108. package/.claude/scripts/generate-research-tasks.sh +157 -0
  109. package/.claude/scripts/generate-status-report.sh +523 -0
  110. package/.claude/scripts/generate-tech-analysis.sh +46 -0
  111. package/.claude/scripts/locate-requirement-in-roadmap.sh +233 -0
  112. package/.claude/scripts/manage-constitution.sh +602 -0
  113. package/.claude/scripts/mark-task-complete.sh +198 -0
  114. package/.claude/scripts/populate-research-tasks.sh +259 -0
  115. package/.claude/scripts/recover-workflow.sh +460 -0
  116. package/.claude/scripts/run-clarify-scan.sh +601 -0
  117. package/.claude/scripts/run-high-review.sh +62 -0
  118. package/.claude/scripts/run-problem-analysis.sh +68 -0
  119. package/.claude/scripts/setup-epic.sh +173 -0
  120. package/.claude/scripts/sync-roadmap-progress.sh +300 -0
  121. package/.claude/scripts/sync-task-marks.sh +199 -0
  122. package/.claude/scripts/test-clarify-scan.sh +515 -0
  123. package/.claude/scripts/update-agent-context.sh +806 -0
  124. package/.claude/scripts/validate-constitution.sh +567 -0
  125. package/.claude/scripts/validate-hooks.sh +487 -0
  126. package/.claude/scripts/validate-research.sh +332 -0
  127. package/.claude/scripts/validate-scope-boundary.sh +493 -0
  128. package/.claude/scripts/verify-setup.sh +37 -0
  129. package/.claude/settings.json +76 -0
  130. package/.claude/skills/_reference-implementations/README.md +96 -0
  131. package/.claude/skills/_reference-implementations/backend-express-prisma/SKILL.md +302 -0
  132. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/architecture-overview.md +451 -0
  133. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/async-and-errors.md +307 -0
  134. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/complete-examples.md +638 -0
  135. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/configuration.md +275 -0
  136. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/database-patterns.md +224 -0
  137. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/middleware-guide.md +213 -0
  138. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/routing-and-controllers.md +756 -0
  139. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/sentry-and-monitoring.md +336 -0
  140. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/services-and-repositories.md +789 -0
  141. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/testing-guide.md +235 -0
  142. package/.claude/skills/_reference-implementations/backend-express-prisma/resources/validation-patterns.md +754 -0
  143. package/.claude/skills/_reference-implementations/frontend-react-mui/SKILL.md +399 -0
  144. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/common-patterns.md +331 -0
  145. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/complete-examples.md +872 -0
  146. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/component-patterns.md +502 -0
  147. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/data-fetching.md +767 -0
  148. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/file-organization.md +502 -0
  149. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/loading-and-error-states.md +501 -0
  150. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/performance.md +406 -0
  151. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/routing-guide.md +364 -0
  152. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/styling-guide.md +428 -0
  153. package/.claude/skills/_reference-implementations/frontend-react-mui/resources/typescript-standards.md +418 -0
  154. package/.claude/skills/cc-devflow-orchestrator/SKILL.md +229 -0
  155. package/.claude/skills/constitution-guardian/SKILL.md +306 -0
  156. package/.claude/skills/devflow-constitution-quick-ref/SKILL.md +374 -0
  157. package/.claude/skills/devflow-file-standards/SKILL.md +353 -0
  158. package/.claude/skills/devflow-tdd-enforcer/SKILL.md +192 -0
  159. package/.claude/skills/skill-developer/ADVANCED.md +197 -0
  160. package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
  161. package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
  162. package/.claude/skills/skill-developer/SKILL.md +426 -0
  163. package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
  164. package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
  165. package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
  166. package/.claude/skills/skill-rules.json +213 -0
  167. package/.claude/tests/README.md +300 -0
  168. package/.claude/tests/TODO.md +69 -0
  169. package/.claude/tests/__pycache__/test_analyze_upgrade_impact.cpython-311-pytest-7.2.2.pyc +0 -0
  170. package/.claude/tests/__pycache__/test_consolidate_research.cpython-311-pytest-7.2.2.pyc +0 -0
  171. package/.claude/tests/__pycache__/test_export_contracts.cpython-311-pytest-7.2.2.pyc +0 -0
  172. package/.claude/tests/__pycache__/test_extract_data_model.cpython-311-pytest-7.2.2.pyc +0 -0
  173. package/.claude/tests/__pycache__/test_generate_quickstart.cpython-311-pytest-7.2.2.pyc +0 -0
  174. package/.claude/tests/__pycache__/test_generate_research_tasks.cpython-311-pytest-7.2.2.pyc +0 -0
  175. package/.claude/tests/constitution/run_all_constitution_tests.sh +111 -0
  176. package/.claude/tests/constitution/test_agent_assignment.sh +207 -0
  177. package/.claude/tests/constitution/test_article_coverage.sh +201 -0
  178. package/.claude/tests/constitution/test_template_completeness.sh +150 -0
  179. package/.claude/tests/constitution/test_version_consistency.sh +120 -0
  180. package/.claude/tests/fixtures/spec_delta_full.md +16 -0
  181. package/.claude/tests/fixtures/tasks_progress_sample.md +5 -0
  182. package/.claude/tests/run-all-tests.sh +229 -0
  183. package/.claude/tests/scripts/run.sh +30 -0
  184. package/.claude/tests/scripts/test-framework.sh +128 -0
  185. package/.claude/tests/scripts/test_check_prerequisites.sh +511 -0
  186. package/.claude/tests/scripts/test_check_prerequisites.sh.bak +504 -0
  187. package/.claude/tests/scripts/test_check_prerequisites.sh.bak2 +505 -0
  188. package/.claude/tests/scripts/test_check_prerequisites.sh.bak3 +506 -0
  189. package/.claude/tests/scripts/test_check_prerequisites.sh.bak4 +507 -0
  190. package/.claude/tests/scripts/test_check_prerequisites.sh.bak5 +508 -0
  191. package/.claude/tests/scripts/test_check_task_status.sh +499 -0
  192. package/.claude/tests/scripts/test_common.sh +244 -0
  193. package/.claude/tests/scripts/test_generate_status_report.sh +71 -0
  194. package/.claude/tests/scripts/test_mark_task_complete.sh +441 -0
  195. package/.claude/tests/scripts/test_mark_task_complete.sh.backup +410 -0
  196. package/.claude/tests/scripts/test_recover_workflow.sh +304 -0
  197. package/.claude/tests/scripts/test_setup_epic.sh +437 -0
  198. package/.claude/tests/scripts/test_sync_task_marks.sh +196 -0
  199. package/.claude/tests/scripts/test_validate_constitution.sh +74 -0
  200. package/.claude/tests/scripts/test_validate_research.sh +462 -0
  201. package/.claude/tests/slugify.bats +82 -0
  202. package/.claude/tests/test-framework.sh +732 -0
  203. package/.claude/tests/test_analyze_upgrade_impact.py +34 -0
  204. package/.claude/tests/test_consolidate_research.py +48 -0
  205. package/.claude/tests/test_export_contracts.py +43 -0
  206. package/.claude/tests/test_extract_data_model.py +33 -0
  207. package/.claude/tests/test_generate_quickstart.py +50 -0
  208. package/.claude/tests/test_generate_research_tasks.py +52 -0
  209. package/.claude/tsc-cache/6e64f818-6398-49ca-8623-581a9af85c44/edited-files.log +1 -0
  210. package/.claude/tsc-cache/795ba6e3-b98a-423b-bab2-51aa62812569/affected-repos.txt +1 -0
  211. package/.claude/tsc-cache/795ba6e3-b98a-423b-bab2-51aa62812569/edited-files.log +1 -0
  212. package/.claude/tsc-cache/ae335694-be5a-4ba4-a1a0-b676c09a7906/affected-repos.txt +1 -0
  213. package/.claude/tsc-cache/ae335694-be5a-4ba4-a1a0-b676c09a7906/edited-files.log +1 -0
  214. package/CHANGELOG.md +507 -0
  215. package/LICENSE +21 -0
  216. package/README.md +534 -0
  217. package/README.zh-CN.md +530 -0
  218. package/bin/adapt.js +240 -0
  219. package/bin/cc-devflow-cli.js +185 -0
  220. package/bin/cc-devflow.js +78 -0
  221. package/config/adapters.yml +5 -0
  222. package/config/schema/adapters.schema.json +44 -0
  223. package/docs/CLAUDE.md +26 -0
  224. package/docs/commands/README.md +61 -0
  225. package/docs/commands/README.zh-CN.md +55 -0
  226. package/docs/commands/core-roadmap.md +106 -0
  227. package/docs/commands/core-roadmap.zh-CN.md +102 -0
  228. package/docs/commands/core-style.md +405 -0
  229. package/docs/commands/core-style.zh-CN.md +405 -0
  230. package/docs/commands/flow-init.md +134 -0
  231. package/docs/commands/flow-init.zh-CN.md +163 -0
  232. package/docs/commands/flow-new.md +274 -0
  233. package/docs/commands/flow-new.zh-CN.md +270 -0
  234. package/docs/guides/getting-started.md +204 -0
  235. package/docs/guides/getting-started.zh-CN.md +152 -0
  236. package/lib/adapters/adapter-interface.js +57 -0
  237. package/lib/adapters/claude-adapter.js +74 -0
  238. package/lib/adapters/codex-adapter.js +40 -0
  239. package/lib/adapters/config-validator.js +68 -0
  240. package/lib/adapters/logger.js +42 -0
  241. package/lib/adapters/registry.js +153 -0
  242. package/lib/compiler/CLAUDE.md +92 -0
  243. package/lib/compiler/__tests__/drift.test.js +215 -0
  244. package/lib/compiler/__tests__/errors.test.js +184 -0
  245. package/lib/compiler/__tests__/incremental.test.js +174 -0
  246. package/lib/compiler/__tests__/integration.test.js +174 -0
  247. package/lib/compiler/__tests__/manifest.test.js +233 -0
  248. package/lib/compiler/__tests__/parser.test.js +456 -0
  249. package/lib/compiler/__tests__/schemas.test.js +301 -0
  250. package/lib/compiler/__tests__/skills-registry.test.js +125 -0
  251. package/lib/compiler/__tests__/transformer.test.js +286 -0
  252. package/lib/compiler/emitters/antigravity-emitter.js +171 -0
  253. package/lib/compiler/emitters/base-emitter.js +73 -0
  254. package/lib/compiler/emitters/codex-emitter.js +52 -0
  255. package/lib/compiler/emitters/cursor-emitter.js +31 -0
  256. package/lib/compiler/emitters/index.js +50 -0
  257. package/lib/compiler/emitters/qwen-emitter.js +39 -0
  258. package/lib/compiler/errors.js +119 -0
  259. package/lib/compiler/index.js +256 -0
  260. package/lib/compiler/manifest.js +242 -0
  261. package/lib/compiler/parser.js +258 -0
  262. package/lib/compiler/platforms.js +113 -0
  263. package/lib/compiler/resource-copier.js +320 -0
  264. package/lib/compiler/rules-emitters/__tests__/antigravity-rules-emitter.test.js +191 -0
  265. package/lib/compiler/rules-emitters/__tests__/codex-rules-emitter.test.js +109 -0
  266. package/lib/compiler/rules-emitters/__tests__/cursor-rules-emitter.test.js +123 -0
  267. package/lib/compiler/rules-emitters/__tests__/qwen-rules-emitter.test.js +123 -0
  268. package/lib/compiler/rules-emitters/antigravity-rules-emitter.js +253 -0
  269. package/lib/compiler/rules-emitters/base-rules-emitter.js +83 -0
  270. package/lib/compiler/rules-emitters/codex-rules-emitter.js +116 -0
  271. package/lib/compiler/rules-emitters/cursor-rules-emitter.js +98 -0
  272. package/lib/compiler/rules-emitters/index.js +71 -0
  273. package/lib/compiler/rules-emitters/qwen-rules-emitter.js +70 -0
  274. package/lib/compiler/schemas.js +144 -0
  275. package/lib/compiler/skills-registry.js +225 -0
  276. package/lib/compiler/transformer.js +236 -0
  277. package/package.json +50 -0
@@ -0,0 +1,253 @@
1
+ /**
2
+ * AntigravityRulesEmitter - Antigravity 规则入口文件生成
3
+ *
4
+ * 输出格式: Markdown with YAML frontmatter
5
+ * 输出路径: .agent/rules/rules.md
6
+ * 特殊限制: 单文件最大 12000 字符,超限时分块
7
+ *
8
+ * Reference: REQ-006/research.md#D06 - 12K limit
9
+ */
10
+ const BaseRulesEmitter = require('./base-rules-emitter');
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ const crypto = require('crypto');
14
+
15
+ // ============================================================
16
+ // Constants
17
+ // ============================================================
18
+ const MAX_FILE_CHARS = 12000;
19
+ const REFERENCE_LINK_RESERVE = 50; // 预留引用链接空间
20
+
21
+ class AntigravityRulesEmitter extends BaseRulesEmitter {
22
+ // ----------------------------------------------------------
23
+ // Platform properties
24
+ // ----------------------------------------------------------
25
+ get platform() {
26
+ return 'antigravity';
27
+ }
28
+
29
+ get outputPath() {
30
+ return '.agent/rules/rules.md';
31
+ }
32
+
33
+ // ----------------------------------------------------------
34
+ // format() - 生成 Markdown 格式内容
35
+ // ----------------------------------------------------------
36
+ format(registry, commands) {
37
+ const frontmatter = this.buildFrontmatter(registry);
38
+ const body = this.buildBody(registry, commands);
39
+
40
+ return `---
41
+ ${frontmatter}---
42
+
43
+ ${body}`;
44
+ }
45
+
46
+ // ----------------------------------------------------------
47
+ // buildFrontmatter() - 构建 YAML frontmatter
48
+ // ----------------------------------------------------------
49
+ buildFrontmatter(_registry) {
50
+ const lines = [`description: "CC-DevFlow Rules for Antigravity"`];
51
+
52
+ return lines.join('\n') + '\n';
53
+ }
54
+
55
+ // ----------------------------------------------------------
56
+ // buildBody() - 构建 Markdown 正文
57
+ // ----------------------------------------------------------
58
+ buildBody(registry, commands) {
59
+ const sections = [];
60
+
61
+ // 标题
62
+ sections.push('# CC-DevFlow Rules');
63
+ sections.push('');
64
+
65
+ // 技能章节
66
+ sections.push('## Skills');
67
+ sections.push('');
68
+
69
+ if (registry && registry.skills && registry.skills.length > 0) {
70
+ for (const skill of registry.skills) {
71
+ sections.push(`### ${skill.name}`);
72
+ sections.push('');
73
+ sections.push(`**Type**: ${skill.type || 'utility'}`);
74
+ sections.push(`**Priority**: ${skill.priority || 'medium'}`);
75
+ sections.push('');
76
+ sections.push(skill.description || 'No description');
77
+ sections.push('');
78
+ }
79
+ } else {
80
+ sections.push('No skills registered.');
81
+ sections.push('');
82
+ }
83
+
84
+ // 命令章节
85
+ sections.push('## Commands');
86
+ sections.push('');
87
+
88
+ if (commands && commands.length > 0) {
89
+ for (const cmd of commands) {
90
+ sections.push(`### /${cmd.name}`);
91
+ sections.push('');
92
+ sections.push(cmd.description || 'No description');
93
+ sections.push('');
94
+ }
95
+ } else {
96
+ sections.push('No commands available.');
97
+ sections.push('');
98
+ }
99
+
100
+ return sections.join('\n');
101
+ }
102
+
103
+ // ----------------------------------------------------------
104
+ // emit() - 写入文件,超过 12K 时分块
105
+ // ----------------------------------------------------------
106
+ async emit(registry, commands) {
107
+ const content = this.format(registry, commands);
108
+
109
+ // 检查是否需要分块
110
+ if (content.length <= MAX_FILE_CHARS) {
111
+ // 单文件输出
112
+ return this.emitSingleFile(content);
113
+ }
114
+
115
+ // 分块输出
116
+ return this.emitMultipleFiles(content, registry, commands);
117
+ }
118
+
119
+ // ----------------------------------------------------------
120
+ // emitSingleFile() - 输出单个文件
121
+ // ----------------------------------------------------------
122
+ async emitSingleFile(content) {
123
+ const outputPath = this.outputPath;
124
+ const outputDir = path.dirname(outputPath);
125
+
126
+ await fs.promises.mkdir(outputDir, { recursive: true, mode: 0o755 });
127
+ await fs.promises.writeFile(outputPath, content, {
128
+ encoding: 'utf8',
129
+ mode: 0o644
130
+ });
131
+
132
+ const hash = crypto.createHash('sha256').update(content).digest('hex');
133
+
134
+ return {
135
+ path: outputPath,
136
+ hash,
137
+ size: content.length,
138
+ timestamp: new Date().toISOString()
139
+ };
140
+ }
141
+
142
+ // ----------------------------------------------------------
143
+ // emitMultipleFiles() - 分块输出多个文件
144
+ // ----------------------------------------------------------
145
+ async emitMultipleFiles(content, _registry, _commands) {
146
+ // 分块时预留引用链接空间
147
+ const effectiveMax = MAX_FILE_CHARS - REFERENCE_LINK_RESERVE;
148
+ const chunks = this.smartChunk(content, effectiveMax);
149
+ const results = [];
150
+ const outputDir = path.dirname(this.outputPath);
151
+
152
+ await fs.promises.mkdir(outputDir, { recursive: true, mode: 0o755 });
153
+
154
+ for (let i = 0; i < chunks.length; i++) {
155
+ const partNum = i + 1;
156
+ const partPath = path.join(outputDir, `rules-part${partNum}.md`);
157
+
158
+ // 添加跨 Part 引用
159
+ let partContent = chunks[i];
160
+
161
+ if (i < chunks.length - 1) {
162
+ partContent += `\n\n---\n\n@rules-part${partNum + 1}.md\n`;
163
+ }
164
+
165
+ await fs.promises.writeFile(partPath, partContent, {
166
+ encoding: 'utf8',
167
+ mode: 0o644
168
+ });
169
+
170
+ const hash = crypto.createHash('sha256').update(partContent).digest('hex');
171
+
172
+ results.push({
173
+ path: partPath,
174
+ hash,
175
+ size: partContent.length,
176
+ chars: partContent.length,
177
+ content: partContent,
178
+ timestamp: new Date().toISOString()
179
+ });
180
+ }
181
+
182
+ return results;
183
+ }
184
+
185
+ // ----------------------------------------------------------
186
+ // smartChunk() - 按 ## 标题智能分块
187
+ // ----------------------------------------------------------
188
+ smartChunk(content, maxChars) {
189
+ const chunks = [];
190
+
191
+ // 按 ## 标题分割
192
+ const sections = content.split(/(?=^## )/m);
193
+
194
+ let currentChunk = '';
195
+
196
+ for (const section of sections) {
197
+ // 如果当前块加上新 section 超过限制
198
+ if (currentChunk.length + section.length > maxChars) {
199
+ // 保存当前块(如果非空)
200
+ if (currentChunk.trim()) {
201
+ chunks.push(currentChunk.trim());
202
+ }
203
+
204
+ // 如果单个 section 超过限制,需要进一步分割
205
+ if (section.length > maxChars) {
206
+ const subChunks = this.forceSplit(section, maxChars);
207
+ chunks.push(...subChunks.slice(0, -1));
208
+ currentChunk = subChunks[subChunks.length - 1];
209
+ } else {
210
+ currentChunk = section;
211
+ }
212
+ } else {
213
+ currentChunk += section;
214
+ }
215
+ }
216
+
217
+ // 添加最后一个块
218
+ if (currentChunk.trim()) {
219
+ chunks.push(currentChunk.trim());
220
+ }
221
+
222
+ return chunks;
223
+ }
224
+
225
+ // ----------------------------------------------------------
226
+ // forceSplit() - 强制按字符数分割
227
+ // ----------------------------------------------------------
228
+ forceSplit(content, maxChars) {
229
+ const chunks = [];
230
+ let remaining = content;
231
+
232
+ while (remaining.length > maxChars) {
233
+ // 尝试在换行符处分割
234
+ let splitPoint = remaining.lastIndexOf('\n', maxChars);
235
+
236
+ if (splitPoint < maxChars * 0.5) {
237
+ // 如果找不到合适的换行符,强制分割
238
+ splitPoint = maxChars;
239
+ }
240
+
241
+ chunks.push(remaining.substring(0, splitPoint).trim());
242
+ remaining = remaining.substring(splitPoint).trim();
243
+ }
244
+
245
+ if (remaining) {
246
+ chunks.push(remaining);
247
+ }
248
+
249
+ return chunks;
250
+ }
251
+ }
252
+
253
+ module.exports = { AntigravityRulesEmitter };
@@ -0,0 +1,83 @@
1
+ /**
2
+ * BaseRulesEmitter - 规则入口文件 Emitter 基类
3
+ *
4
+ * 定义 RulesEmitter 接口:
5
+ * - platform: 平台标识符
6
+ * - outputPath: 输出文件路径
7
+ * - format(registry, commands): 格式化规则内容
8
+ * - emit(registry, commands): 写入规则入口文件
9
+ *
10
+ * Reference: REQ-006/TECH_DESIGN.md#RulesEmitter
11
+ */
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const crypto = require('crypto');
15
+
16
+ // ============================================================
17
+ // SECURITY CONFIGURATION
18
+ // ============================================================
19
+ const MAX_OUTPUT_SIZE = 2 * 1024 * 1024; // 2MB limit
20
+
21
+ class BaseRulesEmitter {
22
+ // ----------------------------------------------------------
23
+ // Abstract properties - 子类必须覆盖
24
+ // ----------------------------------------------------------
25
+ get platform() {
26
+ throw new Error('Not implemented: platform');
27
+ }
28
+
29
+ get outputPath() {
30
+ throw new Error('Not implemented: outputPath');
31
+ }
32
+
33
+ // ----------------------------------------------------------
34
+ // format() - 子类必须实现
35
+ // ----------------------------------------------------------
36
+ format(registry, commands) {
37
+ throw new Error('Not implemented: format()');
38
+ }
39
+
40
+ // ----------------------------------------------------------
41
+ // emit() - 写入规则入口文件
42
+ // ----------------------------------------------------------
43
+ async emit(registry, commands) {
44
+ const content = this.format(registry, commands);
45
+ const outputPath = this.outputPath;
46
+
47
+ // 安全检查: 输出大小限制
48
+ if (content.length > MAX_OUTPUT_SIZE) {
49
+ throw new Error(
50
+ `Output too large: ${outputPath} (${content.length} bytes > ${MAX_OUTPUT_SIZE} bytes)`
51
+ );
52
+ }
53
+
54
+ // 创建输出目录
55
+ const outputDir = path.dirname(outputPath);
56
+ await fs.promises.mkdir(outputDir, { recursive: true, mode: 0o755 });
57
+
58
+ // 写入文件
59
+ await fs.promises.writeFile(outputPath, content, {
60
+ encoding: 'utf8',
61
+ mode: 0o644
62
+ });
63
+
64
+ // 计算哈希
65
+ const hash = crypto.createHash('sha256').update(content).digest('hex');
66
+
67
+ return {
68
+ path: outputPath,
69
+ hash,
70
+ size: content.length,
71
+ timestamp: new Date().toISOString()
72
+ };
73
+ }
74
+
75
+ // ----------------------------------------------------------
76
+ // hashContent() - 计算内容哈希
77
+ // ----------------------------------------------------------
78
+ hashContent(content) {
79
+ return crypto.createHash('sha256').update(content).digest('hex');
80
+ }
81
+ }
82
+
83
+ module.exports = BaseRulesEmitter;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * CodexRulesEmitter - Codex 规则入口文件生成
3
+ *
4
+ * 输出格式: SKILL.md (Markdown with YAML frontmatter)
5
+ * 输出路径: .codex/skills/cc-devflow/SKILL.md
6
+ *
7
+ * Reference: REQ-006/TECH_DESIGN.md#CodexSKILL
8
+ */
9
+ const BaseRulesEmitter = require('./base-rules-emitter');
10
+
11
+ class CodexRulesEmitter extends BaseRulesEmitter {
12
+ // ----------------------------------------------------------
13
+ // Platform properties
14
+ // ----------------------------------------------------------
15
+ get platform() {
16
+ return 'codex';
17
+ }
18
+
19
+ get outputPath() {
20
+ return '.codex/skills/cc-devflow/SKILL.md';
21
+ }
22
+
23
+ // ----------------------------------------------------------
24
+ // format() - 生成 SKILL.md 格式内容
25
+ // ----------------------------------------------------------
26
+ format(registry, commands) {
27
+ const frontmatter = this.buildFrontmatter(registry);
28
+ const body = this.buildBody(registry, commands);
29
+
30
+ return `---
31
+ ${frontmatter}---
32
+
33
+ ${body}`;
34
+ }
35
+
36
+ // ----------------------------------------------------------
37
+ // buildFrontmatter() - 构建 YAML frontmatter
38
+ // ----------------------------------------------------------
39
+ buildFrontmatter(_registry) {
40
+ const lines = [
41
+ `name: cc-devflow`,
42
+ `description: CC-DevFlow development workflow system`,
43
+ `type: domain`
44
+ ];
45
+
46
+ return lines.join('\n') + '\n';
47
+ }
48
+
49
+ // ----------------------------------------------------------
50
+ // buildBody() - 构建 Markdown 正文
51
+ // ----------------------------------------------------------
52
+ buildBody(registry, commands) {
53
+ const sections = [];
54
+
55
+ // 标题
56
+ sections.push('# cc-devflow');
57
+ sections.push('');
58
+ sections.push('CC-DevFlow development workflow system for structured requirement management.');
59
+ sections.push('');
60
+
61
+ // 技能章节
62
+ sections.push('## Skills');
63
+ sections.push('');
64
+
65
+ if (registry && registry.skills && registry.skills.length > 0) {
66
+ sections.push('| Name | Description | Type | Enforcement | Priority |');
67
+ sections.push('|------|-------------|------|-------------|----------|');
68
+
69
+ for (const skill of registry.skills) {
70
+ sections.push(
71
+ `| ${skill.name} | ${skill.description || '-'} | ${skill.type} | ${skill.enforcement || 'suggest'} | ${skill.priority || 'medium'} |`
72
+ );
73
+ }
74
+ sections.push('');
75
+ } else {
76
+ sections.push('No skills registered.');
77
+ sections.push('');
78
+ }
79
+
80
+ // 命令章节
81
+ sections.push('## Commands');
82
+ sections.push('');
83
+
84
+ if (commands && commands.length > 0) {
85
+ sections.push('| Command | Description |');
86
+ sections.push('|---------|-------------|');
87
+
88
+ for (const cmd of commands) {
89
+ sections.push(`| /${cmd.name} | ${cmd.description || '-'} |`);
90
+ }
91
+ sections.push('');
92
+ } else {
93
+ sections.push('No commands available.');
94
+ sections.push('');
95
+ }
96
+
97
+ // 使用说明
98
+ sections.push('## Usage');
99
+ sections.push('');
100
+ sections.push('```bash');
101
+ sections.push('# Start a new requirement');
102
+ sections.push('/flow-init "REQ-XXX|Title|URL"');
103
+ sections.push('');
104
+ sections.push('# Generate PRD');
105
+ sections.push('/flow-prd "REQ-XXX"');
106
+ sections.push('');
107
+ sections.push('# Run development workflow');
108
+ sections.push('/flow-dev "REQ-XXX"');
109
+ sections.push('```');
110
+ sections.push('');
111
+
112
+ return sections.join('\n');
113
+ }
114
+ }
115
+
116
+ module.exports = { CodexRulesEmitter };
@@ -0,0 +1,98 @@
1
+ /**
2
+ * CursorRulesEmitter - Cursor IDE 规则入口文件生成
3
+ *
4
+ * 输出格式: MDC (Markdown with YAML frontmatter)
5
+ * 输出路径: .cursor/rules/devflow.mdc
6
+ *
7
+ * Reference: REQ-006/TECH_DESIGN.md#CursorMDC
8
+ */
9
+ const BaseRulesEmitter = require('./base-rules-emitter');
10
+
11
+ class CursorRulesEmitter extends BaseRulesEmitter {
12
+ // ----------------------------------------------------------
13
+ // Platform properties
14
+ // ----------------------------------------------------------
15
+ get platform() {
16
+ return 'cursor';
17
+ }
18
+
19
+ get outputPath() {
20
+ return '.cursor/rules/devflow.mdc';
21
+ }
22
+
23
+ // ----------------------------------------------------------
24
+ // format() - 生成 MDC 格式内容
25
+ // ----------------------------------------------------------
26
+ format(registry, commands) {
27
+ const frontmatter = this.buildFrontmatter(registry);
28
+ const body = this.buildBody(registry, commands);
29
+
30
+ return `---
31
+ ${frontmatter}---
32
+
33
+ ${body}`;
34
+ }
35
+
36
+ // ----------------------------------------------------------
37
+ // buildFrontmatter() - 构建 YAML frontmatter
38
+ // ----------------------------------------------------------
39
+ buildFrontmatter(registry) {
40
+ const lines = [
41
+ `description: "CC-DevFlow Rules"`,
42
+ `globs: ["devflow/**/*", ".claude/**/*"]`,
43
+ `alwaysApply: true`
44
+ ];
45
+
46
+ return lines.join('\n') + '\n';
47
+ }
48
+
49
+ // ----------------------------------------------------------
50
+ // buildBody() - 构建 Markdown 正文
51
+ // ----------------------------------------------------------
52
+ buildBody(registry, commands) {
53
+ const sections = [];
54
+
55
+ // 标题
56
+ sections.push('# CC-DevFlow Rules');
57
+ sections.push('');
58
+
59
+ // 技能章节
60
+ sections.push('## Available Skills');
61
+ sections.push('');
62
+
63
+ if (registry && registry.skills && registry.skills.length > 0) {
64
+ for (const skill of registry.skills) {
65
+ sections.push(`### ${skill.name}`);
66
+ sections.push('');
67
+ sections.push(skill.description || 'No description');
68
+ sections.push('');
69
+
70
+ if (skill.triggers?.prompt?.keywords?.length > 0) {
71
+ sections.push(`**Keywords**: ${skill.triggers.prompt.keywords.join(', ')}`);
72
+ sections.push('');
73
+ }
74
+ }
75
+ } else {
76
+ sections.push('No skills registered.');
77
+ sections.push('');
78
+ }
79
+
80
+ // 命令章节
81
+ sections.push('## Commands');
82
+ sections.push('');
83
+
84
+ if (commands && commands.length > 0) {
85
+ for (const cmd of commands) {
86
+ sections.push(`- \`/${cmd.name}\`: ${cmd.description || 'No description'}`);
87
+ }
88
+ sections.push('');
89
+ } else {
90
+ sections.push('No commands available.');
91
+ sections.push('');
92
+ }
93
+
94
+ return sections.join('\n');
95
+ }
96
+ }
97
+
98
+ module.exports = { CursorRulesEmitter };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Rules Emitters Index
3
+ *
4
+ * 规则入口文件 Emitter 工厂:
5
+ * - getRulesEmitter(platform): 获取对应平台的 emitter
6
+ * - emitAllRules(registry, commands): 为所有平台生成规则文件
7
+ *
8
+ * Reference: TECH_DESIGN.md#RulesEmitter
9
+ */
10
+ const { CursorRulesEmitter } = require('./cursor-rules-emitter');
11
+ const { CodexRulesEmitter } = require('./codex-rules-emitter');
12
+ const { QwenRulesEmitter } = require('./qwen-rules-emitter');
13
+ const { AntigravityRulesEmitter } = require('./antigravity-rules-emitter');
14
+ const { PLATFORMS } = require('../platforms');
15
+
16
+ // ============================================================
17
+ // Emitter Registry
18
+ // ============================================================
19
+ const EMITTER_REGISTRY = {
20
+ cursor: CursorRulesEmitter,
21
+ codex: CodexRulesEmitter,
22
+ qwen: QwenRulesEmitter,
23
+ antigravity: AntigravityRulesEmitter
24
+ };
25
+
26
+ // ============================================================
27
+ // getRulesEmitter - 获取平台 Rules Emitter
28
+ // ============================================================
29
+ function getRulesEmitter(platform) {
30
+ const EmitterClass = EMITTER_REGISTRY[platform];
31
+
32
+ if (!EmitterClass) {
33
+ throw new Error(`Unknown platform: ${platform}`);
34
+ }
35
+
36
+ return new EmitterClass();
37
+ }
38
+
39
+ // ============================================================
40
+ // emitAllRules - 为所有平台生成规则文件
41
+ // ============================================================
42
+ async function emitAllRules(registry, commands, options = {}) {
43
+ const { platforms = PLATFORMS } = options;
44
+ const results = [];
45
+
46
+ for (const platform of platforms) {
47
+ try {
48
+ const emitter = getRulesEmitter(platform);
49
+ const result = await emitter.emit(registry, commands);
50
+
51
+ // 处理多文件输出(Antigravity 分块)
52
+ if (Array.isArray(result)) {
53
+ for (const r of result) {
54
+ results.push({ platform, ...r });
55
+ }
56
+ } else {
57
+ results.push({ platform, ...result });
58
+ }
59
+ } catch (error) {
60
+ results.push({ platform, error: error.message });
61
+ }
62
+ }
63
+
64
+ return results;
65
+ }
66
+
67
+ module.exports = {
68
+ getRulesEmitter,
69
+ emitAllRules,
70
+ EMITTER_REGISTRY
71
+ };
@@ -0,0 +1,70 @@
1
+ /**
2
+ * QwenRulesEmitter - Qwen 规则入口文件生成
3
+ *
4
+ * 输出格式: TOML
5
+ * 输出路径: .qwen/commands/devflow.toml
6
+ *
7
+ * Reference: REQ-006/TECH_DESIGN.md#QwenTOML
8
+ */
9
+ const BaseRulesEmitter = require('./base-rules-emitter');
10
+ const TOML = require('@iarna/toml');
11
+
12
+ class QwenRulesEmitter extends BaseRulesEmitter {
13
+ // ----------------------------------------------------------
14
+ // Platform properties
15
+ // ----------------------------------------------------------
16
+ get platform() {
17
+ return 'qwen';
18
+ }
19
+
20
+ get outputPath() {
21
+ return '.qwen/commands/devflow.toml';
22
+ }
23
+
24
+ // ----------------------------------------------------------
25
+ // format() - 生成 TOML 格式内容
26
+ // ----------------------------------------------------------
27
+ format(registry, commands) {
28
+ const tomlObj = this.buildTomlObject(registry, commands);
29
+ return TOML.stringify(tomlObj);
30
+ }
31
+
32
+ // ----------------------------------------------------------
33
+ // buildTomlObject() - 构建 TOML 对象
34
+ // ----------------------------------------------------------
35
+ buildTomlObject(registry, commands) {
36
+ const obj = {
37
+ skill: {
38
+ name: 'cc-devflow',
39
+ description: 'CC-DevFlow development workflow system',
40
+ version: '1.0.0'
41
+ },
42
+ skills: {},
43
+ commands: {}
44
+ };
45
+
46
+ // 添加技能
47
+ if (registry && registry.skills && registry.skills.length > 0) {
48
+ for (const skill of registry.skills) {
49
+ obj.skills[skill.name] = {
50
+ description: skill.description || '',
51
+ type: skill.type || 'utility',
52
+ priority: skill.priority || 'medium'
53
+ };
54
+ }
55
+ }
56
+
57
+ // 添加命令
58
+ if (commands && commands.length > 0) {
59
+ for (const cmd of commands) {
60
+ obj.commands[cmd.name] = {
61
+ description: cmd.description || ''
62
+ };
63
+ }
64
+ }
65
+
66
+ return obj;
67
+ }
68
+ }
69
+
70
+ module.exports = { QwenRulesEmitter };