speccore 8.3.121 → 8.3.127

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 (144) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/about.d.ts.map +1 -1
  4. package/dist/commands/about.js +16 -0
  5. package/dist/commands/about.js.map +1 -1
  6. package/dist/commands/analyze.d.ts +1 -0
  7. package/dist/commands/analyze.d.ts.map +1 -1
  8. package/dist/commands/analyze.js +198 -70
  9. package/dist/commands/analyze.js.map +1 -1
  10. package/dist/commands/change.js +14 -7
  11. package/dist/commands/change.js.map +1 -1
  12. package/dist/commands/context.js +25 -31
  13. package/dist/commands/context.js.map +1 -1
  14. package/dist/commands/deploy.d.ts.map +1 -1
  15. package/dist/commands/deploy.js +6 -1
  16. package/dist/commands/deploy.js.map +1 -1
  17. package/dist/commands/done.js +29 -28
  18. package/dist/commands/done.js.map +1 -1
  19. package/dist/commands/execute.d.ts.map +1 -1
  20. package/dist/commands/execute.js +281 -20
  21. package/dist/commands/execute.js.map +1 -1
  22. package/dist/commands/import.js +1 -1
  23. package/dist/commands/import.js.map +1 -1
  24. package/dist/commands/init.d.ts +1 -0
  25. package/dist/commands/init.d.ts.map +1 -1
  26. package/dist/commands/init.js +513 -28
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/iteration/create.js +1 -1
  29. package/dist/commands/iteration/split.d.ts.map +1 -1
  30. package/dist/commands/iteration/split.js +158 -70
  31. package/dist/commands/iteration/split.js.map +1 -1
  32. package/dist/commands/iteration-from-global.js +1 -2
  33. package/dist/commands/iteration-from-global.js.map +1 -1
  34. package/dist/commands/pattern.js +30 -16
  35. package/dist/commands/pattern.js.map +1 -1
  36. package/dist/commands/pipeline.d.ts.map +1 -1
  37. package/dist/commands/pipeline.js +15 -4
  38. package/dist/commands/pipeline.js.map +1 -1
  39. package/dist/commands/retro.d.ts.map +1 -1
  40. package/dist/commands/retro.js +15 -8
  41. package/dist/commands/retro.js.map +1 -1
  42. package/dist/commands/status-panel.js +1 -1
  43. package/dist/commands/status-panel.js.map +1 -1
  44. package/dist/commands/sync.js +15 -8
  45. package/dist/commands/sync.js.map +1 -1
  46. package/dist/commands/trace.js +27 -24
  47. package/dist/commands/trace.js.map +1 -1
  48. package/dist/commands/update-env-configs.d.ts.map +1 -1
  49. package/dist/commands/update-env-configs.js +33 -5
  50. package/dist/commands/update-env-configs.js.map +1 -1
  51. package/dist/commands/update.d.ts.map +1 -1
  52. package/dist/commands/update.js +35 -0
  53. package/dist/commands/update.js.map +1 -1
  54. package/dist/commands/verify.d.ts +1 -1
  55. package/dist/commands/verify.d.ts.map +1 -1
  56. package/dist/commands/verify.js +25 -0
  57. package/dist/commands/verify.js.map +1 -1
  58. package/dist/core/ai-context-generator.js +35 -22
  59. package/dist/core/ai-context-generator.js.map +1 -1
  60. package/dist/core/ai-impact-analyzer.d.ts.map +1 -1
  61. package/dist/core/ai-impact-analyzer.js +1 -1
  62. package/dist/core/ai-impact-analyzer.js.map +1 -1
  63. package/dist/core/analyze-engine.d.ts +2 -1
  64. package/dist/core/analyze-engine.d.ts.map +1 -1
  65. package/dist/core/analyze-engine.js +217 -53
  66. package/dist/core/analyze-engine.js.map +1 -1
  67. package/dist/core/ask-engine.d.ts.map +1 -1
  68. package/dist/core/ask-engine.js +31 -13
  69. package/dist/core/ask-engine.js.map +1 -1
  70. package/dist/core/change-detection.d.ts.map +1 -1
  71. package/dist/core/change-detection.js +21 -5
  72. package/dist/core/change-detection.js.map +1 -1
  73. package/dist/core/code-scanner.d.ts +12 -3
  74. package/dist/core/code-scanner.d.ts.map +1 -1
  75. package/dist/core/code-scanner.js +376 -10
  76. package/dist/core/code-scanner.js.map +1 -1
  77. package/dist/core/context-builder.d.ts +2 -1
  78. package/dist/core/context-builder.d.ts.map +1 -1
  79. package/dist/core/context-builder.js +104 -25
  80. package/dist/core/context-builder.js.map +1 -1
  81. package/dist/core/deploy/engine.d.ts.map +1 -1
  82. package/dist/core/deploy/engine.js +21 -6
  83. package/dist/core/deploy/engine.js.map +1 -1
  84. package/dist/core/git-integration.d.ts +5 -1
  85. package/dist/core/git-integration.d.ts.map +1 -1
  86. package/dist/core/git-integration.js +52 -15
  87. package/dist/core/git-integration.js.map +1 -1
  88. package/dist/core/knowledge-graph.d.ts +2 -0
  89. package/dist/core/knowledge-graph.d.ts.map +1 -1
  90. package/dist/core/knowledge-graph.js +246 -232
  91. package/dist/core/knowledge-graph.js.map +1 -1
  92. package/dist/core/name-validator.js +1 -1
  93. package/dist/core/name-validator.js.map +1 -1
  94. package/dist/core/pipeline-test.d.ts.map +1 -1
  95. package/dist/core/pipeline-test.js +7 -4
  96. package/dist/core/pipeline-test.js.map +1 -1
  97. package/dist/core/prompt-builder.d.ts +3 -0
  98. package/dist/core/prompt-builder.d.ts.map +1 -1
  99. package/dist/core/prompt-builder.js +629 -77
  100. package/dist/core/prompt-builder.js.map +1 -1
  101. package/dist/core/rag-engine.d.ts +10 -5
  102. package/dist/core/rag-engine.d.ts.map +1 -1
  103. package/dist/core/rag-engine.js +134 -16
  104. package/dist/core/rag-engine.js.map +1 -1
  105. package/dist/core/spec-paths.d.ts +42 -2
  106. package/dist/core/spec-paths.d.ts.map +1 -1
  107. package/dist/core/spec-paths.js +207 -11
  108. package/dist/core/spec-paths.js.map +1 -1
  109. package/dist/core/structured-extractor.d.ts +67 -0
  110. package/dist/core/structured-extractor.d.ts.map +1 -1
  111. package/dist/core/structured-extractor.js +1298 -23
  112. package/dist/core/structured-extractor.js.map +1 -1
  113. package/dist/core/test-config.d.ts +1 -1
  114. package/dist/core/test-config.d.ts.map +1 -1
  115. package/dist/core/test-config.js +85 -65
  116. package/dist/core/test-config.js.map +1 -1
  117. package/dist/core/ui-verify/report-generator.d.ts.map +1 -1
  118. package/dist/core/ui-verify/report-generator.js +7 -3
  119. package/dist/core/ui-verify/report-generator.js.map +1 -1
  120. package/dist/core/ui-verify/smoke-engine.js +7 -1
  121. package/dist/core/ui-verify/smoke-engine.js.map +1 -1
  122. package/dist/core/unified-config.d.ts +43 -3
  123. package/dist/core/unified-config.d.ts.map +1 -1
  124. package/dist/core/unified-config.js +133 -13
  125. package/dist/core/unified-config.js.map +1 -1
  126. package/dist/core/unified-retrieval.d.ts.map +1 -1
  127. package/dist/core/unified-retrieval.js +41 -15
  128. package/dist/core/unified-retrieval.js.map +1 -1
  129. package/dist/core/unit-context-assembler.js +2 -2
  130. package/dist/core/unit-context-assembler.js.map +1 -1
  131. package/dist/core/validator.d.ts.map +1 -1
  132. package/dist/core/validator.js +59 -44
  133. package/dist/core/validator.js.map +1 -1
  134. package/dist/core/verify-engine.d.ts +9 -2
  135. package/dist/core/verify-engine.d.ts.map +1 -1
  136. package/dist/core/verify-engine.js +274 -108
  137. package/dist/core/verify-engine.js.map +1 -1
  138. package/dist/core/verify-report-aggregator.js +9 -20
  139. package/dist/core/verify-report-aggregator.js.map +1 -1
  140. package/dist/utils/synonyms.d.ts +24 -0
  141. package/dist/utils/synonyms.d.ts.map +1 -0
  142. package/dist/utils/synonyms.js +114 -0
  143. package/dist/utils/synonyms.js.map +1 -0
  144. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,gBAAgB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAO,CAAC;AAOvE,yDAAyD;AACzD,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7F;AAED,6BAA6B;AAC7B,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC1F;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrE;AAs3BD,eAAO,MAAM,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EA6BnD,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+HpG;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EACpC,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC,CA6Ff;AAED;;GAEG;AAEH;;;GAGG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHtE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCtE;AAwBD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkKrE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAatE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAarE;AAOD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkIpF;AAwJD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsI/F;AAKD,uBAAuB;AACvB,wBAAgB,sBAAsB,IAAI,MAAM,CAuF/C;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C/G"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,gBAAgB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAO,CAAC;AAOvE,yDAAyD;AACzD,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7F;AAED,6BAA6B;AAC7B,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC1F;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrE;AAq/BD,eAAO,MAAM,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EA6BnD,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+HpG;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EACpC,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC,CA6Ff;AAED;;GAEG;AAEH;;;GAGG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHtE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCtE;AAwBD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwKrE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAatE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAarE;AAOD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkIpF;AAwJD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsI/F;AAKD,uBAAuB;AACvB,wBAAgB,sBAAsB,IAAI,MAAM,CAuF/C;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C/G;AA2CD,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoW/E"}
@@ -49,6 +49,7 @@ exports.syncAgentsMd = syncAgentsMd;
49
49
  exports.checkUpgradeHints = checkUpgradeHints;
50
50
  exports.generateAIRulesContent = generateAIRulesContent;
51
51
  exports.writeUpgradePage = writeUpgradePage;
52
+ exports.generateExampleConfigs = generateExampleConfigs;
52
53
  const fs_extra_1 = require("fs-extra");
53
54
  const path_1 = require("path");
54
55
  const logger_1 = require("../utils/logger");
@@ -327,11 +328,12 @@ async function doInit(projectRoot, options, spinner) {
327
328
  spinner.stop('SpecCore initialized successfully!');
328
329
  logger_1.logger.info('');
329
330
  logger_1.logger.info('Next steps:');
330
- logger_1.logger.info(' 1. Edit .speccore/CONSTITUTION.md to define your tech stack');
331
- logger_1.logger.info(' 2. Edit .speccore/PROJECT/TEAM.md to add team members');
332
- logger_1.logger.info(' 3. Run: speccore analyze --scope global to analyze your codebase');
333
- logger_1.logger.info(' 4. Run: speccore iteration create --name=Q1 to start an iteration');
334
- logger_1.logger.info(' 5. Run: speccore doc2spec -f requirements.docx to import docs');
331
+ logger_1.logger.info(' 1. 👀 View examples: .speccore/examples/config/CONSTITUTION-EXAMPLE.md');
332
+ logger_1.logger.info(' 2. ✏️ Edit .speccore/CONSTITUTION.md to define your tech stack');
333
+ logger_1.logger.info(' 3. 👥 Edit .speccore/PROJECT/TEAM.md to add team members');
334
+ logger_1.logger.info(' 4. 🔬 Run: speccore analyze --scope global to analyze your codebase');
335
+ logger_1.logger.info(' 5. 📁 Run: speccore iteration create --name=Q1 to start an iteration');
336
+ logger_1.logger.info(' 6. 📄 Run: speccore doc2spec -f requirements.docx to import docs');
335
337
  logger_1.logger.info('');
336
338
  logger_1.logger.info('💡 WorkBuddy Integration: .workbuddy/ files created.');
337
339
  logger_1.logger.info(' Reopen this project in WorkBuddy to enable Speccore commands.');
@@ -364,6 +366,40 @@ async function createDefaultFiles(projectRoot, speccoreDir) {
364
366
  > 本文档是 SpecCore 与 AI 的**最高优先级契约**。analyze/split/execute 均据此执行。
365
367
  > AI 读取顺序:CONSTITUTION → context.json → 迭代目录
366
368
 
369
+ ## 字段对照总表
370
+
371
+ > **AI 必读**:以下表格明确 CONSTITUTION.md 各字段与 PROJECT.yaml 的对应关系,以及每个字段的准确语义。请勿混淆。
372
+
373
+ ### 项目信息表字段
374
+
375
+ | CONSTITUTION 列 | PROJECT.yaml 字段 | 语义说明 | 示例 |
376
+ |:---|:---|:---|:---|
377
+ | 工程标识 | \`name\` | 全局唯一技术标识,用于目录名、命令参数 | \`admin-web\`、\`backend-service\` |
378
+ | 工程类型 | \`type\` | AI 据此生成针对性内容 | \`Java服务\`、\`H5移动端\` |
379
+ | 工程名 | \`description\` | 人类可读的业务名称 | \`预订服务\`、\`后台管理\` |
380
+ | 项目名称 | \`project_name\` | 给人和 AI 看的业务名称 | \`食堂后台管理\`、\`商户入驻系统\` |
381
+ | 项目描述 | \`project_desc\` | 工程的详细说明、补充信息 | \`核心业务服务,处理订单全生命周期\` |
382
+ | 工程源码路径 | \`code_path\` | 相对于项目根目录的代码位置 | \`./packages/backend\` |
383
+ | **涉及需求端** | \`requirement_unit\` | **需求文档名称/标识,仅作 AI 参考,不做任何校验** | \`订单系统PRD\`、\`后台管理端需求文档\` |
384
+ | 备注 | \`notes\` | 额外信息、特殊说明、TODO | \`核心业务\`、\`待上架\` |
385
+
386
+ > ⚠️ **特别提醒 AI**:「涉及需求端」的值是**需求文档名**(如"订单系统PRD"),不是技术端标识(如 app/h5/admin)。技术端列表见下方「端列表」。
387
+
388
+ ### Git 配置表字段
389
+
390
+ | CONSTITUTION 列 | PROJECT.yaml 字段 | 语义说明 | 示例 |
391
+ |:---|:---|:---|:---|
392
+ | Git 仓库 | \`git_repo\` | 仓库地址 | \`git@github.com:org/repo.git\` |
393
+ | 默认分支 | \`default_branch\` | 默认分支名 | \`main\`、\`develop\` |
394
+ | 保护分支 | \`protected_branches\` | 禁止直接 push 的分支列表 | \`main,release/*\` |
395
+ | 分支前缀 | \`branch_prefix\` | 功能分支前缀 | \`feature/\`、\`feature/api-\` |
396
+
397
+ ### 公共默认值机制
398
+
399
+ - 「Git 公共配置」章节定义公共默认值
400
+ - 「Git 配置」表中用 \`—\` 表示使用该字段的公共默认值
401
+ - 各工程只写和公共配置不同的字段
402
+
367
403
  ## 端列表(全局权威)
368
404
 
369
405
  > ⚠️ **工程标识是全项目唯一的端标识符**,所有命令(analyze/split/execute)、目录名(020-specs/{端}/)、模板目录(templates/{level}/{端}/)均使用此处声明的端名。
@@ -376,11 +412,11 @@ async function createDefaultFiles(projectRoot, speccoreDir) {
376
412
  | admin | 后台管理端 | Web管理后台 |
377
413
 
378
414
  > **端名规则**:
379
- > - 工程标识 = 工程名,一一对应(一个端 = 一个完整的服務/应用 = 一个 git 仓库)
415
+ > - 工程标识 ≠ 工程名:工程标识是唯一技术标识(如 app/h5/admin),工程名是业务名称(如 "预订服务")
380
416
  > - 全小写、无空格、用短横线分隔(如 order-service)
381
417
  > - 工程类型:AI 据此生成针对性内容(见下方工程类型枚举)
382
418
  > - 此列表是 analyze/split/execute 的唯一端名来源
383
- > - 「对应端」列引用此列表中的工程标识,每行只填一个
419
+ > - 「对应需求端」列引用此列表中的工程标识,每行只填一个
384
420
 
385
421
  > **工程类型枚举**(可自定义):
386
422
  > - 后端:Java服务 / Node服务 / Go服务 / Python服务
@@ -390,26 +426,111 @@ async function createDefaultFiles(projectRoot, speccoreDir) {
390
426
 
391
427
  ## 项目信息
392
428
 
393
- | 工程标识 | 项目名称 | 源码路径 | Git 仓库 | 默认分支 | 对应端 |
394
- | :--- | :--- | :--- | :--- | :--- | :--- |
395
- | ${projectName} | 待填写 | ./ | ${gitUrl || '待配置'} | main | 待填写 |
429
+ | 工程标识 | 工程类型 | 工程名 | 项目名称 | 项目描述 | 工程源码路径 | 涉及需求端 | 备注 |
430
+ | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
431
+ | ${projectName} | 待填写 | 待填写 | 待填写 | 待填写 | ./ | 待填写 | 待填写 |
396
432
 
397
- > ⚠️ **项目名称** 是给人和 AI 看的业务名称(如"食堂后台管理"、"商户入驻系统"),不同于技术上的工程标识。
398
- > AI 会据此理解项目业务范围,在分析/拆分/生成代码时作为上下文参考。
433
+ > **字段说明**:
434
+ > - **工程标识**:全局唯一技术标识(如 app/h5/admin),全小写、无空格、短横线分隔
435
+ > - **工程类型**:AI 据此生成针对性内容(如 Java服务、H5移动端、Web管理后台)
436
+ > - **工程名**:人类可读的业务名称(如 "预订服务"、"后台管理")
437
+ > - **项目名称**:给人和 AI 看的业务名称(如"食堂后台管理"、"商户入驻系统")
438
+ > - **项目描述**:工程的详细说明、补充信息(如"核心业务服务,处理订单全生命周期")
439
+ > - **工程源码路径**:相对于项目根目录的代码位置(如 ./packages/backend)
440
+ > - **涉及需求端**:需求文档名称/标识,仅作参考(如"后台管理端需求文档"、"订单系统PRD")。说明本工程大概会出现在哪些需求文档中
441
+ > - **备注**:额外信息、特殊说明、TODO 等
399
442
 
400
443
  > 多工程示例(每个端 = 一个独立工程):
401
444
  >
402
- > | 工程标识 | 项目名称 | 源码路径 | Git 仓库 | 默认分支 | 对应端 |
445
+ > | 工程标识 | 工程类型 | 工程名 | 项目名称 | 项目描述 | 工程源码路径 | 涉及需求端 | 备注 |
446
+ > | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
447
+ > | admin-web | Web管理后台 | admin | 后台管理端 | 运营后台管理系统 | ./packages/admin | 后台管理端需求文档 | 核心系统 |
448
+ > | h5-app | H5移动端 | h5 | 移动H5端 | 用户端H5页面 | ./packages/h5 | 移动端需求文档 | 高优先级 |
449
+ > | android-app | Android移动端 | android | Android端 | 原生Android APP | ./packages/android | APP端需求文档 | 待上架 |
450
+ > | backend-service | Java服务 | backend | 后台服务 | 订单与支付核心服务 | ./packages/backend | 订单系统PRD | 核心业务 |
451
+ >
452
+ > **关键规则**:
453
+ > - 「涉及需求端」仅作为 AI 参考上下文,说明工程与哪些需求文档相关,不做任何校验
454
+ > - 一一对应:每行一个工程对应一个工程标识(不填多个)
455
+ > - 如果一个服务拆成多个工程,应在「端列表」中分别声明
456
+
457
+ ## Git 公共配置
458
+
459
+ > 公共默认值。各工程在「Git 配置」表中只写与公共配置不同的字段,未填写的字段自动使用此处默认值。
460
+ > 用 \`—\` 表示使用公共默认值。
461
+
462
+ ### 默认配置
463
+
464
+ | 默认分支 | 保护分支 |
465
+ | :--- | :--- |
466
+ | main | main,release/* |
467
+
468
+ ### 分支类型
469
+
470
+ > 定义各种分支类型及其创建源分支。**分支名格式:\`{类型}/{前缀}{任务名}{后缀}\`**
471
+ > - \`{类型}/\` = 类型自带(如 hotfix/、feature/)
472
+ > - \`{前缀}\` = 任务名前的前缀(可选,**包含分隔符**),如 \`api-\`、\`backend_\`、\`v2.\`
473
+ > - \`{任务名}\` = 如 Task-001-修复登录
474
+ > - \`{后缀}\` = 任务名后的后缀(可选,**包含分隔符**),如 \`-urgent\`、\`_review\`
475
+ >
476
+ > ⚠️ **注意**:前缀/后缀的值请包含你想用的分隔符,代码不再自动添加任何符号。
477
+ >
478
+ > 示例 1(\`-\` 分隔):前缀=\`api-\`、后缀=\`-urgent\` → 分支名=\`hotfix/api-Task-001-urgent\`
479
+ > 示例 2(\`_\` 分隔):前缀=\`api_\`、后缀=\`_urgent\` → 分支名=\`hotfix/api_Task-001_urgent\`
480
+ > 示例 3(无分隔):前缀=\`api\`、后缀=\`urgent\` → 分支名=\`hotfix/apiTask-001urgent\`
481
+
482
+ | 类型 | 前缀(可选) | 后缀(可选) | 创建源 | 说明 |
483
+ | :--- | :--- | :--- | :--- | :--- |
484
+ | feature | — | — | develop | 新功能开发 |
485
+ | bugfix | — | — | develop | 修复开发环境 Bug |
486
+ | release | — | — | develop | 版本发布准备 |
487
+ | hotfix | — | — | main | 生产环境紧急修复 |
488
+ | support | — | — | main | 长期支持旧版本 |
489
+
490
+ > **分支类型说明**:
491
+ > - **分支名格式**:\`{类型}/{前缀}{任务名}{后缀}\`,前缀和后缀均可选
492
+ > - **前缀列**:任务名前的前缀(**包含分隔符**),如 \`api-\`、\`backend_\`。不填则无
493
+ > - **后缀列**:任务名后的后缀(**包含分隔符**),如 \`-urgent\`、\`_review\`。不填则无
494
+ > - **feature**:日常功能开发,从 develop 创建,完成后合并回 develop
495
+ > - **bugfix**:修复开发中的 Bug,从 develop 创建,完成后合并回 develop
496
+ > - **release**:准备发布版本,从 develop 创建,完成后合并到 main + develop
497
+ > - **hotfix**:生产环境紧急修复,从 main 创建,完成后合并到 main + develop
498
+ > - **support**:长期支持旧版本,从 main 创建,用于维护历史版本
499
+ > - 可自定义添加其他类型(如 refactor、docs、test 等)
500
+
501
+ ## Git 配置
502
+
503
+ > 按工程标识对应。未配置的字段使用「Git 公共配置」中的默认值。
504
+
505
+ | 工程标识 | Git 仓库 | 默认分支 | 保护分支 | 分支前缀 | 备注 |
506
+ | :--- | :--- | :--- | :--- | :--- | :--- |
507
+ | ${projectName} | ${gitUrl || '待配置'} | — | — | — | 待填写 |
508
+
509
+ > **字段说明**:
510
+ > - **工程标识**:引用「项目信息」表中的工程标识,一一对应
511
+ > - **Git 仓库**:仓库地址(如 git@github.com:org/repo.git、https://...)
512
+ > - **默认分支**:如 main、master、develop。填 \`—\` 表示使用公共默认值
513
+ > - **保护分支**:禁止直接 push,只能通过 PR 合并(支持通配符如 release/*)。填 \`—\` 表示使用公共默认值
514
+ > - **分支前缀**:功能分支前缀(如 feature/、bugfix/、hotfix/)。填 \`—\` 表示使用公共默认值
515
+ > - **备注**:特殊 Git 策略说明
516
+
517
+ > 多工程示例:
518
+ >
519
+ > | 工程标识 | Git 仓库 | 默认分支 | 保护分支 | 分支前缀 | 备注 |
403
520
  > | :--- | :--- | :--- | :--- | :--- | :--- |
404
- > | admin-web | 后台管理端 | ./packages/admin | git@xxx/admin.git | main | admin |
405
- > | h5-app | 移动H5端 | ./packages/h5 | git@xxx/h5.git | main | h5 |
406
- > | android-app | Android端 | ./packages/android | git@xxx/android.git | main | android |
407
- > | backend-service | 后台服务 | ./packages/backend | git@xxx/backend.git | main | backend |
521
+ > | admin-web | git@xxx/admin.git | — | main,release/* | feature/admin- | 前端统一前缀 |
522
+ > | h5-app | git@xxx/h5.git | — | — | feature/h5- | 使用公共默认 |
523
+ > | backend-service | git@xxx/backend.git | develop | develop,release/* | feature/api- | 后端用 develop 分支 |
524
+ >
525
+ > 上例中:
526
+ > - \`admin-web\`:默认分支使用公共 \`main\`,保护分支自定义 \`main,release/*\`
527
+ > - \`h5-app\`:默认分支、保护分支均使用公共默认值,分支前缀自定义 \`feature/h5-\`
528
+ > - \`backend-service\`:默认分支覆盖为 \`develop\`,保护分支覆盖为 \`develop,release/*\`
408
529
  >
409
530
  > **关键规则**:
410
- > - 「对应端」列的值必须引用「端列表」中已声明的端名
411
- > - 一一对应:每行一个工程对应一个端名(不填多个)
412
- > - 如果一个服务拆成多个工程(如 user-service + order-service 都属于 backend),应在「端列表」中分别声明
531
+ > - 工程标识必须和「项目信息」表中的工程标识完全一致
532
+ > - 用 \`—\`( em dash )表示使用该字段的公共默认值
533
+ > - 保护分支支持精确匹配和通配符(如 release/*)
413
534
 
414
535
  ## 技术栈
415
536
 
@@ -438,12 +559,16 @@ async function createDefaultFiles(projectRoot, speccoreDir) {
438
559
  | ... | ... | ... |
439
560
 
440
561
  ## Git 分支策略
441
- - 默认分支: main (可选: master / develop / trunk / release)
442
- - 任务分支: feature/{Task-ID}
443
- - 发布分支: release/{version}
444
- - 保护分支: main, master, release/*, production
445
- > 保护分支上禁止直接 commit 和 push,只能通过 PR 合并
446
- > 支持精确匹配和通配符(如 release/*)
562
+
563
+ > 公共默认策略。各工程可在「Git 配置」表中覆盖。
564
+
565
+ - **默认分支**: main(可选: master / develop / trunk)
566
+ - **任务分支**: {branch_prefix}{Task-ID}(如 feature/Task-001)
567
+ - **发布分支**: release/{version}
568
+ - **热修复分支**: hotfix/{description}
569
+ - **保护分支**: main, master, release/*, production
570
+ - 保护分支上禁止直接 commit 和 push,只能通过 PR 合并
571
+ - 支持精确匹配和通配符(如 release/*)
447
572
  `);
448
573
  } // if CONSTITUTION.md 不存在
449
574
  // PROJECT files
@@ -479,6 +604,8 @@ async function createDefaultFiles(projectRoot, speccoreDir) {
479
604
  // .speccore/PROJECT.yaml — 项目配置(v8.3.25+)
480
605
  const projectName = require('path').basename(projectRoot);
481
606
  await (0, unified_config_1.initProjectConfig)(projectName);
607
+ // v8.3.115+: 生成示例配置文件,供用户仿照修改
608
+ await generateExampleConfigs(projectRoot);
482
609
  // Ask 引擎配置
483
610
  await (0, fs_extra_1.writeFile)((0, path_1.join)(speccoreDir, 'config', 'ask.json'), JSON.stringify({
484
611
  routing: {
@@ -1462,7 +1589,13 @@ Iteration-NNN-name/ ← 迭代目录
1462
1589
  │ │ │ ├── created-at
1463
1590
  │ │ │ ├── estimated-hours ← 预估工时
1464
1591
  │ │ │ ├── feature ← 功能单元名
1465
- │ │ │ └── git-config ← 子任务级 Git 配置
1592
+ │ │ │ └── git-config ← 子任务级 Git 配置(v8.3.114+)
1593
+ │ │ │ 格式示例:
1594
+ │ │ │ 分支类型: hotfix
1595
+ │ │ │ 前缀: api-
1596
+ │ │ │ 后缀: urgent
1597
+ │ │ │ 源分支: main
1598
+ │ │ │ → 分支名: hotfix/api-子任务名-urgent
1466
1599
  │ │ ├── TASK.md ← 子任务追踪
1467
1600
  │ │ ├── TEST.md ← 测试用例
1468
1601
  │ │ ├── RISK.md ← 风险评估
@@ -1917,7 +2050,7 @@ async function checkUpgradeHints(projectRoot, speccoreDir) {
1917
2050
  const projShort = extractField('项目短名');
1918
2051
  const repo = extractField('代码仓库');
1919
2052
  // 替换整个"项目标识"章节为"项目信息"(从 ## 项目标识 到下一个 ## 之间)
1920
- updated = updated.replace(new RegExp('##\\s*\u9879\u76ee\u6807\u8bc6[\\s\\S]*?(?=##\\s|\\Z)'), `## 项目信息\n\n| 工程 | 项目名称 | 源码路径 | Git 仓库 | 默认分支 | 对应端 |\n| :--- | :--- | :--- | :--- | :--- | :--- |\n| ${projShort} | ${projName} | ./ | ${repo} | main | 待填写 |\n`);
2053
+ updated = updated.replace(new RegExp('##\\s*\u9879\u76ee\u6807\u8bc6[\\s\\S]*?(?=##\\s|\\Z)'), `## 项目信息\n\n| 工程标识 | 工程类型 | 工程名 | 项目名称 | 源码路径 | Git 仓库 | 默认分支 | 对应需求端 |\n| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |\n| ${projShort} | 待填写 | 待填写 | ${projName} | ./ | ${repo} | main | 待填写 |\n`);
1921
2054
  migrations.push(`旧版「项目标识」纵向表 → 新版「项目信息」横向表(项目名称: ${projName})`);
1922
2055
  }
1923
2056
  // ── 自动迁移:补充缺失的「保护分支」配置 ──
@@ -2152,4 +2285,356 @@ async function writeSetupGuide(projectRoot, _speccoreDir) {
2152
2285
  await (0, fs_extra_1.writeFile)(outputPath, html);
2153
2286
  return outputPath;
2154
2287
  }
2288
+ // ─────────────────────────────────────────
2289
+ // v8.3.115+: 生成示例配置文件
2290
+ // ─────────────────────────────────────────
2291
+ async function generateExampleConfigs(projectRoot) {
2292
+ const examplesDir = (0, path_1.join)(projectRoot, '.speccore', 'examples');
2293
+ const configDir = (0, path_1.join)(examplesDir, 'config');
2294
+ await (0, fs_extra_1.ensureDir)(configDir);
2295
+ // 示例目录 README
2296
+ const readmeContent = `# SpecCore 示例目录
2297
+
2298
+ > 本目录存放各类配置示例,供用户仿照修改。
2299
+ > 这些文件仅供人类参考,AI 不会读取。
2300
+
2301
+ ## 目录结构
2302
+
2303
+ \`\`\`
2304
+ examples/
2305
+ ├── README.md ← 本文件
2306
+ ├── config/ ← 配置文件示例
2307
+ │ ├── CONSTITUTION-EXAMPLE.md ← CONSTITUTION.md 完整示例(多工程)
2308
+ │ ├── PROJECT-EXAMPLE.yaml ← PROJECT.yaml 完整示例(多工程)
2309
+ │ ├── GIT-CONFIG-EXAMPLE.txt ← 子任务 .meta/git-config 格式示例
2310
+ │ ├── DEPLOY-EXAMPLE.yaml ← 部署配置示例(speccore deploy 使用)
2311
+ │ └── VERIFY-EXAMPLE.yaml ← 测试验证配置示例(speccore verify 使用)
2312
+ └── project/ ← 完整项目示例(预留,未来扩展)
2313
+ \`\`\`
2314
+
2315
+ ## 使用方式
2316
+
2317
+ 1. 查看 \`config/CONSTITUTION-EXAMPLE.md\`,仿照修改你的 \`.speccore/CONSTITUTION.md\`
2318
+ 2. 查看 \`config/PROJECT-EXAMPLE.yaml\`,了解 YAML 结构和字段对应关系
2319
+ 3. 查看 \`config/GIT-CONFIG-EXAMPLE.txt\`,了解子任务级 Git 配置格式
2320
+ 4. 查看 \`config/DEPLOY-EXAMPLE.yaml\`,了解部署配置格式(用于 \`speccore deploy\`)
2321
+ 5. 查看 \`config/VERIFY-EXAMPLE.yaml\`,了解测试验证配置格式(用于 \`speccore verify --config\`)
2322
+ 6. 修改后运行 \`speccore update\` 自动同步到 PROJECT.yaml
2323
+
2324
+ ## 注意事项
2325
+
2326
+ - 示例文件中的值为演示用途,请根据实际项目修改
2327
+ - 示例文件更新随 CLI 版本升级,如需最新示例可重新运行 \`speccore init\`
2328
+ `;
2329
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(examplesDir, 'README.md'), readmeContent);
2330
+ // CONSTITUTION.md 完整示例(多工程)
2331
+ const constitutionExample = `## 字段对照总表
2332
+
2333
+ > **AI 必读**:以下表格明确 CONSTITUTION.md 各字段与 PROJECT.yaml 的对应关系。
2334
+ > 人类只需填写 CONSTITUTION.md,PROJECT.yaml 由 CLI 自动生成/同步。
2335
+
2336
+ ### 项目信息表字段
2337
+
2338
+ | CONSTITUTION 列 | PROJECT.yaml 字段 | 语义说明 | 示例 |
2339
+ |:---|:---|:---|:---|
2340
+ | 工程标识 | \`name\` | 全局唯一技术标识 | \`admin-web\` |
2341
+ | 工程类型 | \`type\` | AI 据此生成针对性内容 | \`Java服务\` |
2342
+ | 工程名 | \`description\` | 人类可读的业务名称 | \`预订服务\` |
2343
+ | 项目名称 | \`project_name\` | 给人和 AI 看的业务名称 | \`食堂后台管理\` |
2344
+ | 项目描述 | \`project_desc\` | 工程的详细说明 | \`核心业务服务...\` |
2345
+ | 工程源码路径 | \`code_path\` | 相对项目根目录 | \`./packages/backend\` |
2346
+ | **涉及需求端** | \`requirement_unit\` | **需求文档名称/标识,仅作 AI 参考** | \`订单系统PRD\` |
2347
+ | 备注 | \`notes\` | 额外信息 | \`核心业务\` |
2348
+
2349
+ ### Git 配置表字段
2350
+
2351
+ | CONSTITUTION 列 | PROJECT.yaml 字段 | 语义说明 | 示例 |
2352
+ |:---|:---|:---|:---|
2353
+ | Git 仓库 | \`git_repo\` | 仓库地址 | \`git@github.com:org/repo.git\` |
2354
+ | 默认分支 | \`default_branch\` | 默认分支名 | \`main\`、\`develop\` |
2355
+ | 保护分支 | \`protected_branches\` | 禁止直接 push 的分支列表 | \`main,release/*\` |
2356
+
2357
+ ### 公共默认值机制
2358
+
2359
+ - 「Git 公共配置」章节定义公共默认值
2360
+ - 「Git 配置」表中用 \`—\` 表示使用该字段的公共默认值
2361
+ - 各工程只写和公共配置不同的字段
2362
+
2363
+ ---
2364
+
2365
+ ## 端列表(全局权威)
2366
+
2367
+ > ⚠️ **工程标识是全项目唯一的端标识符**,所有命令(analyze/split/execute)、目录名(020-specs/{端}/)、模板目录(templates/{level}/{端}/)均使用此处声明的端名。
2368
+
2369
+ | 工程标识 | 描述 | 工程类型 |
2370
+ | :--- | :--- | :--- |
2371
+ | admin-web | 后台管理端 | Web管理后台 |
2372
+ | h5-mobile | 移动 H5 端 | H5移动端 |
2373
+ | miniapp | 小程序端 | 微信小程序 |
2374
+ | backend-api | 后台 API 服务 | Java服务 |
2375
+
2376
+ > **端名规则**:
2377
+ > - 工程标识 ≠ 工程名:工程标识是唯一技术标识(如 admin-web),工程名是业务名称(如 "预订服务")
2378
+ > - 全小写、无空格、用短横线分隔(如 order-service)
2379
+ > - 工程类型:AI 据此生成针对性内容(见下方工程类型枚举)
2380
+ > - 此列表是 analyze/split/execute 的唯一端名来源
2381
+
2382
+ ---
2383
+
2384
+ ## 项目信息
2385
+
2386
+ | 工程标识 | 工程类型 | 工程名 | 项目名称 | 项目描述 | 工程源码路径 | 涉及需求端 | 备注 |
2387
+ | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
2388
+ | admin-web | Web管理后台 | 后台管理 | 运营后台 | 运营人员使用的后台管理系统 | ./packages/admin | 后台管理端需求文档 | 核心系统 |
2389
+ | h5-mobile | H5移动端 | H5商城 | 移动商城 | 用户端H5购物页面 | ./packages/h5 | 移动端需求文档 | 高优先级 |
2390
+ | miniapp | 微信小程序 | 小程序 | 微信小程序 | 微信内嵌小程序商城 | ./packages/miniapp | 小程序端需求文档 | 待上架 |
2391
+ | backend-api | Java服务 | 订单服务 | 订单与支付 | 订单创建、支付、退款核心服务 | ./packages/backend | 订单系统PRD | 核心业务 |
2392
+
2393
+ > **字段说明**:
2394
+ > - **工程标识**:全局唯一技术标识(如 admin-web),全小写、无空格、短横线分隔
2395
+ > - **工程类型**:AI 据此生成针对性内容(如 Java服务、H5移动端、Web管理后台)
2396
+ > - **工程名**:人类可读的业务名称(如 "预订服务"、"后台管理")
2397
+ > - **项目名称**:给人和 AI 看的业务名称(如"食堂后台管理"、"商户入驻系统")
2398
+ > - **项目描述**:工程的详细说明、补充信息(如"核心业务服务,处理订单全生命周期")
2399
+ > - **工程源码路径**:相对于项目根目录的代码位置(如 ./packages/backend)
2400
+ > - **涉及需求端**:需求文档名称/标识,仅作 AI 参考(如"后台管理端需求文档"、"订单系统PRD")。说明本工程大概会出现在哪些需求文档中
2401
+ > - **备注**:额外信息、特殊说明、TODO 等
2402
+
2403
+ ---
2404
+
2405
+ ## Git 公共配置
2406
+
2407
+ > 公共默认值。各工程在「Git 配置」表中只写与公共配置不同的字段,未填写的字段自动使用此处默认值。
2408
+ > 用 \`—\` 表示使用公共默认值。
2409
+
2410
+ ### 默认配置
2411
+
2412
+ | 默认分支 | 保护分支 |
2413
+ | :--- | :--- |
2414
+ | main | main,release/* |
2415
+
2416
+ ### 分支类型
2417
+
2418
+ > 定义各种分支类型及其创建源分支。**分支名格式:\`{类型}/{前缀}-{任务名}-{后缀}\`**
2419
+ > - \`{类型}/\` = 类型自带(如 hotfix/、feature/)
2420
+ > - \`{前缀}\` = 任务名前的前缀(可选)
2421
+ > - \`{任务名}\` = 如 Task-001-修复登录
2422
+ > - \`{后缀}\` = 任务名后的后缀(可选)
2423
+ >
2424
+ > 示例:配置了前缀 \`api-\`、后缀 \`-urgent\`,任务名为 \`Task-001\`,则分支名为 \`hotfix/api-Task-001-urgent\`
2425
+
2426
+ | 类型 | 前缀(可选) | 后缀(可选) | 创建源 | 说明 |
2427
+ | :--- | :--- | :--- | :--- | :--- |
2428
+ | feature | — | — | develop | 新功能开发 |
2429
+ | bugfix | — | — | develop | 修复开发环境 Bug |
2430
+ | release | — | — | develop | 版本发布准备 |
2431
+ | hotfix | — | — | main | 生产环境紧急修复 |
2432
+ | support | — | — | main | 长期支持旧版本 |
2433
+
2434
+ > **分支类型说明**:
2435
+ > - **分支名格式**:\`{类型}/{前缀}-{任务名}-{后缀}\`,前缀和后缀均可选
2436
+ > - **前缀列**:任务名前的前缀(如 \`api-\`、\`backend-\`),不填则无
2437
+ > - **后缀列**:任务名后的后缀(如 \`-urgent\`、\`-review\`),不填则无
2438
+ > - **feature**:日常功能开发,从 develop 创建,完成后合并回 develop
2439
+ > - **bugfix**:修复开发中的 Bug,从 develop 创建,完成后合并回 develop
2440
+ > - **release**:准备发布版本,从 develop 创建,完成后合并到 main + develop
2441
+ > - **hotfix**:生产环境紧急修复,从 main 创建,完成后合并到 main + develop
2442
+ > - **support**:长期支持旧版本,从 main 创建,用于维护历史版本
2443
+ > - 可自定义添加其他类型(如 refactor、docs、test 等)
2444
+
2445
+ ---
2446
+
2447
+ ## Git 配置
2448
+
2449
+ > 按工程标识对应。未配置的字段使用「Git 公共配置」中的默认值。
2450
+ > 用 \`—\` 表示使用公共默认值。
2451
+
2452
+ | 工程标识 | Git 仓库 | 默认分支 | 保护分支 | 分支前缀 | 备注 |
2453
+ | :--- | :--- | :--- | :--- | :--- | :--- |
2454
+ | admin-web | git@github.com:myorg/admin-web.git | — | — | — | 核心系统 |
2455
+ | h5-mobile | git@github.com:myorg/h5-mobile.git | — | — | — | 高优先级 |
2456
+ | miniapp | git@github.com:myorg/miniapp.git | — | — | — | 待上架 |
2457
+ | backend-api | git@github.com:myorg/backend.git | — | — | — | 核心业务 |
2458
+
2459
+ > **字段说明**:
2460
+ > - **工程标识**:引用「项目信息」表中的工程标识,一一对应
2461
+ > - **Git 仓库**:仓库地址(如 git@github.com:org/repo.git、https://...)
2462
+ > - **默认分支**:如 main、master、develop。填 \`—\` 表示使用公共默认值
2463
+ > - **保护分支**:禁止直接 push,只能通过 PR 合并(支持通配符如 release/*)。填 \`—\` 表示使用公共默认值
2464
+ > - **分支前缀**:功能分支前缀(如 feature/)。填 \`—\` 表示使用公共默认值
2465
+ > - **备注**:额外说明
2466
+
2467
+ ---
2468
+
2469
+ > 📌 **使用说明**:
2470
+ > 1. 复制本示例内容到 \`CONSTITUTION.md\`,根据实际项目修改
2471
+ > 2. 修改后运行 \`speccore update\` 自动同步到 PROJECT.yaml
2472
+ > 3. 子任务目录下的 \`.meta/git-config\` 可覆盖全局配置(见目录结构说明)
2473
+ `;
2474
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(configDir, 'CONSTITUTION-EXAMPLE.md'), constitutionExample);
2475
+ // PROJECT.yaml 完整示例(多工程)
2476
+ const projectExample = `# PROJECT.yaml — 项目配置(由 CLI 自动生成,不建议手动编辑)
2477
+ # 如需修改,请编辑 CONSTITUTION.md 后运行 speccore update
2478
+ # ─────────────────────────────────────────────────────────────────────────────
2479
+
2480
+ schema_version: 1
2481
+
2482
+ # ─────────────────────────────────────────────────────────────────────────────
2483
+ # 项目基本信息
2484
+ # ─────────────────────────────────────────────────────────────────────────────
2485
+ project:
2486
+ # 项目名称(全局标识)
2487
+ name: my-project
2488
+
2489
+ # ─────────────────────────────────────────────────────────────────────────────
2490
+ # 端列表(每个端 = 一个独立工程)
2491
+ # ─────────────────────────────────────────────────────────────────────────────
2492
+ # 工程标识:全小写、无空格、短横线分隔,全局唯一
2493
+ # 工程类型:AI 据此生成针对性内容(Java服务/H5移动端/Web管理后台等)
2494
+ # code_path:相对于项目根目录的源码位置
2495
+ # project_name:给人和 AI 看的业务名称
2496
+ # project_desc:工程的详细说明
2497
+ # requirement_unit:需求文档名称/标识,仅作 AI 参考,不做校验
2498
+ # notes:额外信息
2499
+ # ─────────────────────────────────────────────────────────────────────────────
2500
+ platforms:
2501
+ - name: admin-web
2502
+ type: Web管理后台
2503
+ description: 后台管理
2504
+ code_path: ./packages/admin
2505
+ project_name: 运营后台
2506
+ project_desc: 运营人员使用的后台管理系统
2507
+ requirement_unit: 后台管理端需求文档
2508
+ notes: 核心系统
2509
+
2510
+ - name: h5-mobile
2511
+ type: H5移动端
2512
+ description: H5商城
2513
+ code_path: ./packages/h5
2514
+ project_name: 移动商城
2515
+ project_desc: 用户端H5购物页面
2516
+ requirement_unit: 移动端需求文档
2517
+ notes: 高优先级
2518
+
2519
+ - name: miniapp
2520
+ type: 微信小程序
2521
+ description: 小程序
2522
+ code_path: ./packages/miniapp
2523
+ project_name: 微信小程序
2524
+ project_desc: 微信内嵌小程序商城
2525
+ requirement_unit: 小程序端需求文档
2526
+ notes: 待上架
2527
+
2528
+ - name: backend-api
2529
+ type: Java服务
2530
+ description: 订单服务
2531
+ code_path: ./packages/backend
2532
+ project_name: 订单与支付
2533
+ project_desc: 订单创建、支付、退款核心服务
2534
+ requirement_unit: 订单系统PRD
2535
+ notes: 核心业务
2536
+
2537
+ # ─────────────────────────────────────────────────────────────────────────────
2538
+ # Git 配置
2539
+ # ─────────────────────────────────────────────────────────────────────────────
2540
+ # default_base:默认基础分支(PR 合并目标)
2541
+ # branch_prefix:功能分支前缀
2542
+ # protected_branches:受保护分支(禁止直接 push,只能通过 PR 合并)
2543
+ # branch_types:分支类型定义
2544
+ # - 类型名自带前缀(如 hotfix/、feature/)
2545
+ # - prefix:任务名前的前缀(可选),如 api-、backend-
2546
+ # - suffix:任务名后的后缀(可选),如 urgent、review
2547
+ # - source:创建源分支,如 develop、main
2548
+ # ─────────────────────────────────────────────────────────────────────────────
2549
+ git:
2550
+ # 默认基础分支(PR 合并目标)
2551
+ default_base: main
2552
+ # 功能分支前缀
2553
+ branch_prefix: feature/
2554
+ # 受保护分支(禁止直接 push,只能通过 PR 合并)
2555
+ protected_branches:
2556
+ - main
2557
+ - master
2558
+ # 分支类型定义。prefix=任务前前缀, suffix=任务后后缀, 均可选
2559
+ branch_types:
2560
+ feature:
2561
+ source: develop
2562
+ bugfix:
2563
+ source: develop
2564
+ release:
2565
+ source: develop
2566
+ hotfix:
2567
+ source: main
2568
+
2569
+ # ─────────────────────────────────────────────────────────────────────────────
2570
+ # 代码扫描范围
2571
+ # ─────────────────────────────────────────────────────────────────────────────
2572
+ # AI 全局分析时扫描的源码目录
2573
+ # ─────────────────────────────────────────────────────────────────────────────
2574
+ code_scope:
2575
+ - src/
2576
+
2577
+ # ─────────────────────────────────────────────────────────────────────────────
2578
+ # 端级 Git 覆盖示例(如需为某个端单独配置)
2579
+ # ─────────────────────────────────────────────────────────────────────────────
2580
+ # 在 platforms 对应端下增加以下字段:
2581
+ # default_branch: develop # 覆盖全局 git.default_base
2582
+ # branch_prefix: hotfix/ # 覆盖全局 git.branch_prefix
2583
+ # protected_branches: # 覆盖全局 git.protected_branches
2584
+ # - main
2585
+ # branch_types: # 覆盖/扩展全局 git.branch_types
2586
+ # hotfix:
2587
+ # prefix: api-
2588
+ # suffix: urgent
2589
+ # source: main
2590
+ # ─────────────────────────────────────────────────────────────────────────────
2591
+ `;
2592
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(configDir, 'PROJECT-EXAMPLE.yaml'), projectExample);
2593
+ // 子任务 git-config 示例
2594
+ const gitConfigExample = `# 子任务级 Git 配置示例(.meta/git-config)
2595
+ # ─────────────────────────────────────────────────────────────────────────────
2596
+ # 配置优先级:子任务 > 迭代级 > 全局 CONSTITUTION.md > 默认值
2597
+ # 未配置的字段自动从上级继承
2598
+ # ─────────────────────────────────────────────────────────────────────────────
2599
+
2600
+ # 分支类型:覆盖默认 feature(如 hotfix、bugfix、release)
2601
+ 分支类型: hotfix
2602
+
2603
+ # 前缀:任务名前的前缀(可选),如 api-、backend-
2604
+ 前缀: api-
2605
+
2606
+ # 后缀:任务名后的后缀(可选),如 urgent、review
2607
+ 后缀: urgent
2608
+
2609
+ # 源分支:从哪个分支创建(如 main、develop)
2610
+ 源分支: main
2611
+
2612
+ # 分支格式:自定义分支名模板(可选,一般不配置)
2613
+ # 支持变量: {type} {prefix} {taskId} {name} {date} {hash4}
2614
+ # 分支格式: {type}/{prefix}{taskId}
2615
+
2616
+ # 自动拉取:创建分支前是否自动 git pull(true/false)
2617
+ 自动拉取: false
2618
+
2619
+ # 远程名称:远程仓库名称(默认 origin)
2620
+ 远程名称: origin
2621
+ `;
2622
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(configDir, 'GIT-CONFIG-EXAMPLE.txt'), gitConfigExample);
2623
+ // v8.3.122+: 复制部署和测试示例配置文件
2624
+ const templateDir = (0, path_1.join)(__dirname, '..', '..', 'templates');
2625
+ const deployExampleSrc = (0, path_1.join)(templateDir, 'deploy-examples.yaml');
2626
+ const verifyExampleSrc = (0, path_1.join)(templateDir, 'verify-spec-example.yaml');
2627
+ try {
2628
+ if (await (0, fs_extra_1.pathExists)(deployExampleSrc)) {
2629
+ const deployContent = await (0, fs_extra_1.readFile)(deployExampleSrc, 'utf-8');
2630
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(configDir, 'DEPLOY-EXAMPLE.yaml'), deployContent);
2631
+ }
2632
+ if (await (0, fs_extra_1.pathExists)(verifyExampleSrc)) {
2633
+ const verifyContent = await (0, fs_extra_1.readFile)(verifyExampleSrc, 'utf-8');
2634
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(configDir, 'VERIFY-EXAMPLE.yaml'), verifyContent);
2635
+ }
2636
+ }
2637
+ catch { /* 模板文件可选 */ }
2638
+ logger_1.logger.info(' 📋 已生成示例配置: .speccore/examples/');
2639
+ }
2155
2640
  //# sourceMappingURL=init.js.map