speccore 8.3.182 → 8.3.188

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 (214) hide show
  1. package/.agents/skills/spec-analyze/SKILL.md +2 -169
  2. package/.agents/skills/spec-ask/SKILL.md +2 -177
  3. package/.agents/skills/spec-change/SKILL.md +2 -214
  4. package/.agents/skills/spec-dashboard/SKILL.md +1 -76
  5. package/.agents/skills/spec-deploy/SKILL.md +2 -298
  6. package/.agents/skills/spec-doc2spec/SKILL.md +2 -116
  7. package/.agents/skills/spec-done/SKILL.md +2 -203
  8. package/.agents/skills/spec-execute/SKILL.md +2 -178
  9. package/.agents/skills/spec-help/SKILL.md +1 -75
  10. package/.agents/skills/spec-iteration-create/SKILL.md +2 -123
  11. package/.agents/skills/spec-plan/SKILL.md +2 -117
  12. package/.agents/skills/spec-pr/SKILL.md +2 -203
  13. package/.agents/skills/spec-run/SKILL.md +16 -0
  14. package/.agents/skills/spec-spec2doc/SKILL.md +2 -121
  15. package/.agents/skills/spec-split/SKILL.md +2 -208
  16. package/.agents/skills/spec-task-create/SKILL.md +2 -151
  17. package/.agents/skills/spec-verify/SKILL.md +2 -214
  18. package/.agents/skills/spec-welcome/SKILL.md +1 -67
  19. package/.agents/skills/speccore-router/SKILL.md +14 -2
  20. package/README.en.md +9 -9
  21. package/README.md +2 -1
  22. package/dist/cli.js +24 -25
  23. package/dist/cli.js.map +1 -1
  24. package/dist/commands/about.js +1 -1
  25. package/dist/commands/about.js.map +1 -1
  26. package/dist/commands/analyze.d.ts +1 -0
  27. package/dist/commands/analyze.d.ts.map +1 -1
  28. package/dist/commands/analyze.js +38 -5
  29. package/dist/commands/analyze.js.map +1 -1
  30. package/dist/commands/ask.js +6 -6
  31. package/dist/commands/ask.js.map +1 -1
  32. package/dist/commands/dev.d.ts +2 -0
  33. package/dist/commands/dev.d.ts.map +1 -1
  34. package/dist/commands/dev.js +102 -1
  35. package/dist/commands/dev.js.map +1 -1
  36. package/dist/commands/doctor.js +28 -0
  37. package/dist/commands/doctor.js.map +1 -1
  38. package/dist/commands/execute.js +3 -3
  39. package/dist/commands/execute.js.map +1 -1
  40. package/dist/commands/init.d.ts.map +1 -1
  41. package/dist/commands/init.js +31 -52
  42. package/dist/commands/init.js.map +1 -1
  43. package/dist/commands/iteration/split.d.ts.map +1 -1
  44. package/dist/commands/iteration/split.js +12 -39
  45. package/dist/commands/iteration/split.js.map +1 -1
  46. package/dist/commands/knowledge.d.ts +0 -12
  47. package/dist/commands/knowledge.d.ts.map +1 -1
  48. package/dist/commands/knowledge.js +0 -80
  49. package/dist/commands/knowledge.js.map +1 -1
  50. package/dist/commands/refresh.d.ts.map +1 -1
  51. package/dist/commands/refresh.js +10 -0
  52. package/dist/commands/refresh.js.map +1 -1
  53. package/dist/commands/search.d.ts +1 -0
  54. package/dist/commands/search.d.ts.map +1 -1
  55. package/dist/commands/search.js +38 -0
  56. package/dist/commands/search.js.map +1 -1
  57. package/dist/commands/update.d.ts.map +1 -1
  58. package/dist/commands/update.js +13 -3
  59. package/dist/commands/update.js.map +1 -1
  60. package/dist/core/agent-adapter.d.ts +6 -0
  61. package/dist/core/agent-adapter.d.ts.map +1 -1
  62. package/dist/core/agent-adapter.js +56 -172
  63. package/dist/core/agent-adapter.js.map +1 -1
  64. package/dist/core/agents/defaults/code-generator.md +64 -0
  65. package/dist/core/agents/defaults/code-reviewer.md +5 -0
  66. package/dist/core/agents/defaults/compiler.md +7 -0
  67. package/dist/core/agents/defaults/compliance-checker.md +2 -0
  68. package/dist/core/agents/defaults/dependency-analyst.md +5 -0
  69. package/dist/core/agents/defaults/doc-sync-agent.md +5 -0
  70. package/dist/core/agents/defaults/effort-estimator.md +28 -0
  71. package/dist/core/agents/defaults/global-analyzer.md +66 -0
  72. package/dist/core/agents/defaults/impact-analyst.md +5 -0
  73. package/dist/core/agents/defaults/interaction-designer.md +5 -0
  74. package/dist/core/agents/defaults/performance-expert.md +2 -0
  75. package/dist/core/agents/defaults/product-analyst-backend.md +6 -0
  76. package/dist/core/agents/defaults/product-analyst-frontend.md +6 -0
  77. package/dist/core/agents/defaults/product-analyst.md +5 -0
  78. package/dist/core/agents/defaults/regression-tester.md +5 -0
  79. package/dist/core/agents/defaults/requirement-analyzer.md +72 -0
  80. package/dist/core/agents/defaults/risk-assessor.md +5 -0
  81. package/dist/core/agents/defaults/schedule-planner.md +5 -0
  82. package/dist/core/agents/defaults/security-reviewer-finance.md +6 -0
  83. package/dist/core/agents/defaults/security-reviewer.md +7 -0
  84. package/dist/core/agents/defaults/task-decomposer.md +5 -0
  85. package/dist/core/agents/defaults/test-engineer.md +2 -0
  86. package/dist/core/agents/defaults/test-reviewer.md +5 -0
  87. package/dist/core/agents/engine/agent-loader.d.ts.map +1 -1
  88. package/dist/core/agents/engine/agent-loader.js +76 -6
  89. package/dist/core/agents/engine/agent-loader.js.map +1 -1
  90. package/dist/core/agents/engine/types.d.ts +5 -0
  91. package/dist/core/agents/engine/types.d.ts.map +1 -1
  92. package/dist/core/analyze-engine.d.ts.map +1 -1
  93. package/dist/core/analyze-engine.js +73 -82
  94. package/dist/core/analyze-engine.js.map +1 -1
  95. package/dist/core/ask-engine.d.ts +0 -58
  96. package/dist/core/ask-engine.d.ts.map +1 -1
  97. package/dist/core/ask-engine.js +63 -361
  98. package/dist/core/ask-engine.js.map +1 -1
  99. package/dist/core/business-rules.d.ts +36 -0
  100. package/dist/core/business-rules.d.ts.map +1 -0
  101. package/dist/core/business-rules.js +109 -0
  102. package/dist/core/business-rules.js.map +1 -0
  103. package/dist/core/change-impact-global.d.ts.map +1 -1
  104. package/dist/core/change-impact-global.js +4 -3
  105. package/dist/core/change-impact-global.js.map +1 -1
  106. package/dist/core/code-scanner.d.ts +1 -0
  107. package/dist/core/code-scanner.d.ts.map +1 -1
  108. package/dist/core/code-scanner.js +32 -3
  109. package/dist/core/code-scanner.js.map +1 -1
  110. package/dist/core/content-delivery.d.ts +59 -0
  111. package/dist/core/content-delivery.d.ts.map +1 -0
  112. package/dist/core/content-delivery.js +219 -0
  113. package/dist/core/content-delivery.js.map +1 -0
  114. package/dist/core/global-artifacts.d.ts.map +1 -1
  115. package/dist/core/global-artifacts.js +262 -19
  116. package/dist/core/global-artifacts.js.map +1 -1
  117. package/dist/core/global-retrieval.d.ts +38 -0
  118. package/dist/core/global-retrieval.d.ts.map +1 -0
  119. package/dist/core/global-retrieval.js +100 -0
  120. package/dist/core/global-retrieval.js.map +1 -0
  121. package/dist/core/html-prototype.d.ts +22 -0
  122. package/dist/core/html-prototype.d.ts.map +1 -0
  123. package/dist/core/html-prototype.js +103 -0
  124. package/dist/core/html-prototype.js.map +1 -0
  125. package/dist/core/multi-lang-parser.d.ts +43 -0
  126. package/dist/core/multi-lang-parser.d.ts.map +1 -0
  127. package/dist/core/multi-lang-parser.js +317 -0
  128. package/dist/core/multi-lang-parser.js.map +1 -0
  129. package/dist/core/pipeline-engine.js +16 -16
  130. package/dist/core/pipeline-engine.js.map +1 -1
  131. package/dist/core/platform-inference.d.ts +35 -0
  132. package/dist/core/platform-inference.d.ts.map +1 -0
  133. package/dist/core/platform-inference.js +205 -0
  134. package/dist/core/platform-inference.js.map +1 -0
  135. package/dist/core/prompt-builder.d.ts +1 -1
  136. package/dist/core/prompt-builder.d.ts.map +1 -1
  137. package/dist/core/prompt-builder.js +62 -63
  138. package/dist/core/prompt-builder.js.map +1 -1
  139. package/dist/core/refresh-scheduler.d.ts +50 -0
  140. package/dist/core/refresh-scheduler.d.ts.map +1 -0
  141. package/dist/core/refresh-scheduler.js +139 -0
  142. package/dist/core/refresh-scheduler.js.map +1 -0
  143. package/dist/core/reverse-requirement.d.ts +54 -0
  144. package/dist/core/reverse-requirement.d.ts.map +1 -0
  145. package/dist/core/reverse-requirement.js +277 -0
  146. package/dist/core/reverse-requirement.js.map +1 -0
  147. package/dist/core/schemas/task.schema.d.ts +2 -2
  148. package/dist/core/spec-skeleton.d.ts.map +1 -1
  149. package/dist/core/spec-skeleton.js +123 -0
  150. package/dist/core/spec-skeleton.js.map +1 -1
  151. package/dist/core/unified-config.d.ts +14 -0
  152. package/dist/core/unified-config.d.ts.map +1 -1
  153. package/dist/core/unified-config.js +94 -10
  154. package/dist/core/unified-config.js.map +1 -1
  155. package/dist/core/unified-retrieval.d.ts.map +1 -1
  156. package/dist/core/unified-retrieval.js +34 -8
  157. package/dist/core/unified-retrieval.js.map +1 -1
  158. package/dist/utils/task-utils.d.ts +4 -0
  159. package/dist/utils/task-utils.d.ts.map +1 -1
  160. package/dist/utils/task-utils.js +18 -0
  161. package/dist/utils/task-utils.js.map +1 -1
  162. package/package.json +5 -3
  163. package/vendor/tree-sitter/tree-sitter-go.wasm +0 -0
  164. package/vendor/tree-sitter/tree-sitter-java.wasm +0 -0
  165. package/vendor/tree-sitter/tree-sitter-python.wasm +0 -0
  166. package/vendor/tree-sitter/tree-sitter-rust.wasm +0 -0
  167. package/.agents/agents/README.md +0 -79
  168. package/.agents/agents/spec-analyzer.md +0 -41
  169. package/.agents/agents/spec-architect.md +0 -57
  170. package/.agents/agents/spec-change-detector.md +0 -55
  171. package/.agents/agents/spec-clarifier.md +0 -83
  172. package/.agents/agents/spec-executor.md +0 -41
  173. package/.agents/agents/spec-gatekeeper.md +0 -84
  174. package/.agents/agents/spec-global-analyzer.md +0 -111
  175. package/.agents/agents/spec-knowledge-curator.md +0 -54
  176. package/.agents/agents/spec-reviewer.md +0 -46
  177. package/.agents/agents/spec-security-auditor.md +0 -56
  178. package/.agents/agents/spec-tester.md +0 -120
  179. package/.agents/skills/spec-analyze/references/analysis-report.md +0 -9
  180. package/.agents/skills/spec-execute/references/code-output.md +0 -13
  181. package/.agents/skills/spec-plan/references/plan-template.md +0 -29
  182. package/.agents/skills/spec-task-create/references/requirement-template.md +0 -23
  183. package/dist/commands/bugfix.d.ts +0 -17
  184. package/dist/commands/bugfix.d.ts.map +0 -1
  185. package/dist/commands/bugfix.js +0 -301
  186. package/dist/commands/bugfix.js.map +0 -1
  187. package/dist/commands/help-quick.d.ts +0 -3
  188. package/dist/commands/help-quick.d.ts.map +0 -1
  189. package/dist/commands/help-quick.js +0 -66
  190. package/dist/commands/help-quick.js.map +0 -1
  191. package/dist/commands/index-update.d.ts +0 -8
  192. package/dist/commands/index-update.d.ts.map +0 -1
  193. package/dist/commands/index-update.js +0 -180
  194. package/dist/commands/index-update.js.map +0 -1
  195. package/dist/commands/schedule.d.ts +0 -26
  196. package/dist/commands/schedule.d.ts.map +0 -1
  197. package/dist/commands/schedule.js +0 -182
  198. package/dist/commands/schedule.js.map +0 -1
  199. package/dist/commands/watch.d.ts +0 -11
  200. package/dist/commands/watch.d.ts.map +0 -1
  201. package/dist/commands/watch.js +0 -166
  202. package/dist/commands/watch.js.map +0 -1
  203. package/dist/core/ai-markdown.d.ts +0 -5
  204. package/dist/core/ai-markdown.d.ts.map +0 -1
  205. package/dist/core/ai-markdown.js +0 -29
  206. package/dist/core/ai-markdown.js.map +0 -1
  207. package/dist/core/schedule-engine.d.ts +0 -25
  208. package/dist/core/schedule-engine.d.ts.map +0 -1
  209. package/dist/core/schedule-engine.js +0 -281
  210. package/dist/core/schedule-engine.js.map +0 -1
  211. package/dist/core/schedule-store.d.ts +0 -119
  212. package/dist/core/schedule-store.d.ts.map +0 -1
  213. package/dist/core/schedule-store.js +0 -216
  214. package/dist/core/schedule-store.js.map +0 -1
@@ -52,64 +52,6 @@ declare const COMMAND_KB: CommandKnowledge[];
52
52
  declare const WORKFLOWS: Record<string, PipelineStep[]>;
53
53
  /** 判断问句属于哪种模式 */
54
54
  export declare function classifyMode(input: string): AskMode;
55
- /**
56
- * 理解用户意图并自我检查
57
- * 返回结构化分析:AI理解了什么?命令匹配度?是否有遗漏?
58
- */
59
- export interface IntentUnderstanding {
60
- /** AI 理解的用户意图摘要 */
61
- what: string;
62
- /** 匹配到的命令列表 */
63
- commands: string[];
64
- /** 置信度 (0-100) */
65
- confidence: number;
66
- /** 是否有分歧/不确定的地方 */
67
- gaps: string[];
68
- /** 是否应该进入确认流程 */
69
- needsConfirm: boolean;
70
- /** 来源:llm/host/rules */
71
- source: string;
72
- }
73
- export declare function understandIntent(input: string): Promise<IntentUnderstanding & {
74
- result: AskResult;
75
- }>;
76
- /**
77
- * 🧠 SynthesizeIntent — 智能意图合成层
78
- *
79
- * 理解 → 参数提取 → 上下文补全 → 命令匹配 → 自检纠错 → 仅模糊点时确认
80
- *
81
- * 核心原则:
82
- * - AI 能自己推断的,不打扰用户
83
- * - 缺了参数但能从上下文补的,自动补上并告诉用户
84
- * - 只有真正歧义的才和用户确认
85
- */
86
- export interface SynthesizedIntent {
87
- /** AI 理解 */
88
- what: string;
89
- /** 来源 */
90
- source: string;
91
- /** 最终理解的结果(含理解说明) */
92
- result: AskResult;
93
- /** AI 自动补充的内容 */
94
- autoFilled: {
95
- field: string;
96
- value: string;
97
- reason: string;
98
- }[];
99
- /** 无法确定、需要用户澄清的问题 */
100
- questions: string[];
101
- /** 是否需要用户确认 */
102
- needsConfirm: boolean;
103
- /** 置信度 0-100 */
104
- confidence: number;
105
- /** 最终将执行的完整命令列表 */
106
- finalCommands: {
107
- command: string;
108
- args: string;
109
- explanation: string;
110
- }[];
111
- }
112
- export declare function synthesizeIntent(input: string): Promise<SynthesizedIntent>;
113
55
  export declare function askEngine(input: string, options?: AskEngineOptions): Promise<AskResult>;
114
56
  /** 从用户输入中提取时间 → YYYY-MM-DD HH:mm:ss */
115
57
  export declare function extractTime(input: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"ask-engine.d.ts","sourceRoot":"","sources":["../../src/core/ask-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ask-engine.d.ts","sourceRoot":"","sources":["../../src/core/ask-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,aAAa;AACb,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;AAE/E,aAAa;AACb,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,kBAAkB;AAClB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kBAAkB;AAClB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,aAAa;AACb,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACjE;AAED,eAAe;AACf,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD,QAAA,MAAM,UAAU,EAAE,gBAAgB,EA0EjC,CAAC;AA2FF,QAAA,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAgD7C,CAAC;AAMF,iBAAiB;AACjB,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CA0CnD;AAkuBD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAqJ7F;AA4OD,uCAAuC;AACvC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA4BjD;AAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC"}
@@ -3,44 +3,9 @@
3
3
  * ask — SpecCore 万能 AI 入口引擎
4
4
  * 四种模式:命令解释(explain) / 任务指引(guide) / 意图匹配(match) / 复杂编排(pipeline)
5
5
  */
6
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
- if (k2 === undefined) k2 = k;
8
- var desc = Object.getOwnPropertyDescriptor(m, k);
9
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
- desc = { enumerable: true, get: function() { return m[k]; } };
11
- }
12
- Object.defineProperty(o, k2, desc);
13
- }) : (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- o[k2] = m[k];
16
- }));
17
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
- Object.defineProperty(o, "default", { enumerable: true, value: v });
19
- }) : function(o, v) {
20
- o["default"] = v;
21
- });
22
- var __importStar = (this && this.__importStar) || (function () {
23
- var ownKeys = function(o) {
24
- ownKeys = Object.getOwnPropertyNames || function (o) {
25
- var ar = [];
26
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
- return ar;
28
- };
29
- return ownKeys(o);
30
- };
31
- return function (mod) {
32
- if (mod && mod.__esModule) return mod;
33
- var result = {};
34
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
- __setModuleDefault(result, mod);
36
- return result;
37
- };
38
- })();
39
6
  Object.defineProperty(exports, "__esModule", { value: true });
40
7
  exports.WORKFLOWS = exports.COMMAND_KB = void 0;
41
8
  exports.classifyMode = classifyMode;
42
- exports.understandIntent = understandIntent;
43
- exports.synthesizeIntent = synthesizeIntent;
44
9
  exports.askEngine = askEngine;
45
10
  exports.extractTime = extractTime;
46
11
  const logger_1 = require("../utils/logger");
@@ -61,7 +26,7 @@ const COMMAND_KB = [
61
26
  usage: 'speccore doc2spec -f <file> --iter <iteration> [--task <task>] [--no-ai] [--classify [--prompt] [--response <json>]]', examples: ['speccore doc2spec -f PRD.docx --iter Q3', 'speccore doc2spec -f 需求.docx --iter Q2 --task T-01 --no-ai', 'speccore doc2spec --classify --prompt -I Q3', 'speccore doc2spec --classify -I Q3'], related: ['spec2doc', 'analyze'], triggers: ['导入', 'doc2spec', 'word转', '文档转换', 'PRD', '需求文档', '智能分类', 'classify', '分类文档', '提取需求'] },
62
27
  { name: 'spec2doc', aliases: ['s2d'], description: 'SpecCore MD 导出为 Word/PDF/HTML/PPTX',
63
28
  usage: 'speccore spec2doc [-i <iteration>] [-t <task>] [-f <format>] [-o <output>]', examples: ['speccore spec2doc -i Q3 -o 需求.docx', 'speccore spec2doc -t T-01 -f html'], related: ['doc2spec'], triggers: ['导出', 'spec2doc', '生成文档', '导出word', '导出pdf'] },
64
- { name: 'dashboard', aliases: ['db', 'sp'], description: '项目仪表盘:迭代状态/进度/健康度,--scope global 全量视图',
29
+ { name: 'dashboard', aliases: ['db'], description: '项目仪表盘:迭代状态/进度/健康度,--scope global 全量视图',
65
30
  usage: 'speccore dashboard [--scope global|iteration] [--export html] [--health] [--lifecycle]', examples: ['speccore dashboard', 'speccore dashboard --scope global --export html'], related: ['analyze', 'health'], triggers: ['看板', '仪表盘', 'dashboard', '进度', '状态'] },
66
31
  { name: 'analyze', aliases: ['al'], description: '统一分析:需求文档+源码→分析报告。支持 --full 三阶段合成,--deep 单文档深度分析(字数/图表翻倍),--iterative 迭代式生成(大纲→逐节填充),--filter 按需分析指定模块,--with-code 注入代码结构化数据,--phase 单阶段合成,--feature 局部分析功能模块,--doc 局部分析类型文档,--sync 任务分析后局部回写 020-specs/,--no-source 跳过源码,--supplement 追加源码',
67
32
  usage: 'speccore analyze [--task <id>] [--iteration <name>] [--full] [--deep <doc>] [--iterative] [--filter <keywords>] [--with-code] [--phase <n>] [--feature <module>] [--doc <type/slug>] [--no-source] [--source-scope <dirs>] [--supplement] [--sync] [--scope global] [--dev-guide]', examples: ['speccore analyze', 'speccore analyze --full -i Q2', 'speccore analyze --deep ARCHITECTURE.md --iterative', 'speccore analyze --filter "订单,支付" --with-code', 'speccore analyze --phase 1 -i Q2', 'speccore analyze --feature 支付模块', 'speccore analyze --doc bugs/login-timeout', 'speccore analyze --with-code', 'speccore analyze --supplement --source-scope src/core', 'speccore analyze --task Task-001 --apply "..." --sync'], related: ['dashboard', 'validate', 'code-index', 'refresh', 'synthesize'], triggers: ['分析', 'analyze', '审计', 'audit', '检查', '结合源码', '连代码', '带代码', '源码分析', '迭代分析', '分析迭代', '倒推需求', '反推', '从代码生成', '分析代码', '不读源码', '不读代码', '跳过源码', '指定目录分析', '只扫描', '补充分析', '追加分析', '补充源码', '追加源码', '遗漏', '没分析到', '没覆盖', '漏掉', '再分析', '多读几个', '局部分析', '单个模块', '单独分析', 'bug分析', '重构分析', '局部回写', '回写spec', '同步spec', '合成需求', '合并需求', '需求合成', '智能合成', '需求合并', '多端合成', '全量分析', '跨端综合', '全量合成', '开发指南', '生成开发指南', '带开发指南', '深度分析', '深入分析', '详细分析', '迭代生成', '逐节分析', '大纲分析', '按需分析', '只分析', '过滤分析', '聚焦分析'] },
@@ -88,6 +53,8 @@ const COMMAND_KB = [
88
53
  usage: 'speccore done [--task <id>] [--all] [--interactive]', examples: ['speccore done --task T-01', 'speccore done --all'], related: ['execute', 'pr'], triggers: ['完成', 'done', '归档', '结束', '做完'] },
89
54
  { name: 'dev', aliases: ['d'], description: '智能级联:--auto 全自动流水线 detect→execute',
90
55
  usage: 'speccore dev [--auto] [--from <phase>] [--to <phase>]', examples: ['speccore dev --auto', 'speccore dev --from analyze --to execute'], related: ['execute', 'plan'], triggers: ['dev', '流水线', '自动', '级联'] },
56
+ { name: 'run', aliases: ['r'], description: '端到端流水线:一句话需求→澄清→分析→拆分→执行→验证→部署(默认三闸口,--demo 放宽 A/B)',
57
+ usage: 'speccore run [需求描述] [--from <phase>] [--to <phase>] [--demo]', examples: ['speccore run "做用户积分功能"', 'speccore run --demo "做演示页面"', 'speccore run --from split'], related: ['dev', 'clarify', 'execute'], triggers: ['run', '跑一遍', '端到端', '全流程', '一键开发', '自动开发', '从头到尾', '完整流程'] },
91
58
  { name: 'task', aliases: ['tk'], description: '任务管理:创建/列表/状态。子命令: new, list, status',
92
59
  usage: 'speccore task new --name <name> [--id <id>] | speccore task list | speccore task status', examples: ['speccore task new --name "用户登录"', 'speccore task list'], related: ['plan', 'execute'], triggers: ['task', '任务列表', '查看任务', '列出任务'] },
93
60
  { name: 'iteration', aliases: ['it'], description: '迭代管理:创建时自动生成唯一编码(Iteration-001-功能名),支持拆分/列表',
@@ -203,63 +170,63 @@ const SYNONYM_MAP = {
203
170
  // ============================================================
204
171
  // v8.3.165+: 命令 → 默认 subagent 角色映射
205
172
  const STEP_SUBAGENT_MAP = {
206
- analyze: 'spec-analyzer',
173
+ analyze: 'requirement-analyzer',
207
174
  split: 'task-decomposer',
208
175
  plan: 'schedule-planner',
209
- execute: 'spec-executor',
210
- pr: 'spec-reviewer',
211
- validate: 'spec-reviewer',
176
+ execute: 'code-generator',
177
+ pr: 'code-reviewer',
178
+ validate: 'code-reviewer',
212
179
  change: 'impact-analyst',
213
- verify: 'spec-tester',
214
- 'code-index': 'spec-global-analyzer',
180
+ verify: 'test-engineer',
181
+ 'code-index': 'global-analyzer',
215
182
  };
216
183
  const WORKFLOWS = {
217
184
  'new feature': [
218
185
  { order: 1, command: 'init', args: '', explanation: '初始化项目(如果还没有)', dependsOn: undefined },
219
186
  { order: 2, command: 'doc2spec', args: '-f PRD.docx --iter {iteration}', explanation: '导入 PRD 文档,AI 分析生成需求规格', dependsOn: 1 },
220
- { order: 3, command: 'analyze', args: '--iteration {iteration} --audit', explanation: 'AI 分析需求,生成审计报告', dependsOn: 2, subagent: 'spec-analyzer' },
187
+ { order: 3, command: 'analyze', args: '--iteration {iteration} --audit', explanation: 'AI 分析需求,生成审计报告', dependsOn: 2, subagent: 'requirement-analyzer' },
221
188
  { order: 4, command: 'split', args: '-f REQUIREMENT.md', explanation: '将需求拆分为独立开发任务', dependsOn: 3, subagent: 'task-decomposer' },
222
189
  { order: 5, command: 'plan', args: '--all', explanation: '生成任务执行计划,确定优先级和依赖', dependsOn: 4, subagent: 'schedule-planner' },
223
- { order: 6, command: 'execute', args: '--auto', explanation: '按计划依次执行开发任务', dependsOn: 5, subagent: 'spec-executor' },
224
- { order: 7, command: 'pr', args: '--auto', explanation: '代码提交后创建 Pull Request', dependsOn: 6, subagent: 'spec-reviewer' },
190
+ { order: 6, command: 'execute', args: '--auto', explanation: '按计划依次执行开发任务', dependsOn: 5, subagent: 'code-generator' },
191
+ { order: 7, command: 'pr', args: '--auto', explanation: '代码提交后创建 Pull Request', dependsOn: 6, subagent: 'code-reviewer' },
225
192
  { order: 8, command: 'done', args: '--all', explanation: '全部完成后归档收尾', dependsOn: 7 },
226
193
  ],
227
194
  'bugfix': [
228
195
  { order: 1, command: 'task', args: 'new --name "{bug}" --type bugfix', explanation: '创建 Bug 修复任务', dependsOn: undefined },
229
- { order: 2, command: 'analyze', args: '--prompt --task {task}', explanation: '分析 Bug 根因和影响范围', dependsOn: 1, subagent: 'spec-analyzer' },
196
+ { order: 2, command: 'analyze', args: '--prompt --task {task}', explanation: '分析 Bug 根因和影响范围', dependsOn: 1, subagent: 'requirement-analyzer' },
230
197
  { order: 3, command: 'plan', args: '--prompt --task {task}', explanation: '生成修复方案和排程', dependsOn: 2, subagent: 'schedule-planner' },
231
- { order: 4, command: 'execute', args: '--prompt --task {task}', explanation: '按方案执行修复', dependsOn: 3, subagent: 'spec-executor' },
232
- { order: 5, command: 'validate', args: '', explanation: '验证修复完整性', dependsOn: 4, subagent: 'spec-reviewer' },
233
- { order: 6, command: 'pr', args: '--task {task}', explanation: '提交修复 PR', dependsOn: 5, subagent: 'spec-reviewer' },
198
+ { order: 4, command: 'execute', args: '--prompt --task {task}', explanation: '按方案执行修复', dependsOn: 3, subagent: 'code-generator' },
199
+ { order: 5, command: 'validate', args: '', explanation: '验证修复完整性', dependsOn: 4, subagent: 'code-reviewer' },
200
+ { order: 6, command: 'pr', args: '--task {task}', explanation: '提交修复 PR', dependsOn: 5, subagent: 'code-reviewer' },
234
201
  { order: 7, command: 'done', args: '--task {task}', explanation: '归档修复记录', dependsOn: 6 },
235
202
  ],
236
203
  'batch execute': [
237
204
  { order: 1, command: 'plan', args: '--select', explanation: '列出所有可执行任务(编号 + CLI命令),用户多选', dependsOn: undefined, subagent: 'schedule-planner' },
238
205
  ],
239
206
  'code review': [
240
- { order: 1, command: 'validate', args: '', explanation: '合规检查 Spec 完整性', dependsOn: undefined, subagent: 'spec-reviewer' },
241
- { order: 2, command: 'analyze', args: '--audit', explanation: '深度审计分析', dependsOn: 1, subagent: 'spec-analyzer' },
242
- { order: 3, command: 'pr', args: '--auto', explanation: '生成 PR 审查', dependsOn: 2, subagent: 'spec-reviewer' },
207
+ { order: 1, command: 'validate', args: '', explanation: '合规检查 Spec 完整性', dependsOn: undefined, subagent: 'code-reviewer' },
208
+ { order: 2, command: 'analyze', args: '--audit', explanation: '深度审计分析', dependsOn: 1, subagent: 'requirement-analyzer' },
209
+ { order: 3, command: 'pr', args: '--auto', explanation: '生成 PR 审查', dependsOn: 2, subagent: 'code-reviewer' },
243
210
  ],
244
211
  // v8.3.160+: 常见复合意图工作流
245
212
  // v8.3.165+: 各步骤配置 subagent 角色
246
213
  'analyze-split': [
247
- { order: 1, command: 'analyze', args: '--iteration {iteration}', explanation: 'AI 分析需求,生成各端规格文档', dependsOn: undefined, subagent: 'spec-analyzer' },
214
+ { order: 1, command: 'analyze', args: '--iteration {iteration}', explanation: 'AI 分析需求,生成各端规格文档', dependsOn: undefined, subagent: 'requirement-analyzer' },
248
215
  { order: 2, command: 'split', args: '--iteration {iteration}', explanation: '将分析结果拆分为独立开发任务', dependsOn: 1, subagent: 'task-decomposer' },
249
216
  ],
250
217
  'analyze-split-plan': [
251
- { order: 1, command: 'analyze', args: '--iteration {iteration}', explanation: 'AI 分析需求,生成各端规格文档', dependsOn: undefined, subagent: 'spec-analyzer' },
218
+ { order: 1, command: 'analyze', args: '--iteration {iteration}', explanation: 'AI 分析需求,生成各端规格文档', dependsOn: undefined, subagent: 'requirement-analyzer' },
252
219
  { order: 2, command: 'split', args: '--iteration {iteration}', explanation: '将分析结果拆分为独立开发任务', dependsOn: 1, subagent: 'task-decomposer' },
253
220
  { order: 3, command: 'plan', args: '--all', explanation: '生成任务执行计划,确定优先级和依赖', dependsOn: 2, subagent: 'schedule-planner' },
254
221
  ],
255
222
  'plan-execute': [
256
223
  { order: 1, command: 'plan', args: '--all', explanation: '生成任务执行计划,确定优先级和依赖', dependsOn: undefined, subagent: 'schedule-planner' },
257
- { order: 2, command: 'execute', args: '--auto', explanation: '按计划依次执行开发任务', dependsOn: 1, subagent: 'spec-executor' },
224
+ { order: 2, command: 'execute', args: '--auto', explanation: '按计划依次执行开发任务', dependsOn: 1, subagent: 'code-generator' },
258
225
  ],
259
226
  'analyze-plan-execute': [
260
- { order: 1, command: 'analyze', args: '--iteration {iteration}', explanation: 'AI 分析需求,生成各端规格文档', dependsOn: undefined, subagent: 'spec-analyzer' },
227
+ { order: 1, command: 'analyze', args: '--iteration {iteration}', explanation: 'AI 分析需求,生成各端规格文档', dependsOn: undefined, subagent: 'requirement-analyzer' },
261
228
  { order: 2, command: 'plan', args: '--all', explanation: '生成任务执行计划,确定优先级和依赖', dependsOn: 1, subagent: 'schedule-planner' },
262
- { order: 3, command: 'execute', args: '--auto', explanation: '按计划依次执行开发任务', dependsOn: 2, subagent: 'spec-executor' },
229
+ { order: 3, command: 'execute', args: '--auto', explanation: '按计划依次执行开发任务', dependsOn: 2, subagent: 'code-generator' },
263
230
  ],
264
231
  };
265
232
  exports.WORKFLOWS = WORKFLOWS;
@@ -309,27 +276,45 @@ function classifyMode(input) {
309
276
  // 默认:意图匹配
310
277
  return 'match';
311
278
  }
279
+ /** 最近一次 KB 匹配类型(供置信度诚实赋值:触发词匹配不能伪装成精确匹配) */
280
+ let lastKbMatchType = null;
281
+ /** 单词边界匹配:word 作为独立 token 出现,避免短 alias 误匹配包含它的词(如 "split" 误匹配 "sp"/"pl") */
282
+ function wordMatch(text, word) {
283
+ try {
284
+ const escaped = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
285
+ return new RegExp(`(^|[^a-z0-9])${escaped}($|[^a-z0-9])`, 'i').test(text);
286
+ }
287
+ catch {
288
+ return text.includes(word);
289
+ }
290
+ }
312
291
  /** 匹配命令知识(精确匹配 → 同义词表 → 触发词 三层降级) */
313
292
  function matchCommandInKB(input) {
314
293
  const lower = input.toLowerCase();
315
- // 精确匹配命令名
294
+ // 精确匹配命令名(单词边界,最可靠)
316
295
  for (const cmd of COMMAND_KB) {
317
- if (lower.includes(cmd.name))
296
+ if (wordMatch(lower, cmd.name)) {
297
+ lastKbMatchType = 'name';
318
298
  return cmd;
299
+ }
319
300
  for (const alias of cmd.aliases) {
320
- if (lower.includes(alias) && alias.length > 1)
301
+ if (alias.length > 1 && wordMatch(lower, alias)) {
302
+ lastKbMatchType = 'alias';
321
303
  return cmd;
304
+ }
322
305
  }
323
306
  }
324
307
  // 同义词表优先于触发词:同义词表是显式映射,更准确
325
308
  for (const [syn, cmdName] of Object.entries(SYNONYM_MAP)) {
326
309
  if (lower.includes(syn)) {
327
310
  const found = COMMAND_KB.find(c => c.name === cmdName);
328
- if (found)
311
+ if (found) {
312
+ lastKbMatchType = 'synonym';
329
313
  return found;
314
+ }
330
315
  }
331
316
  }
332
- // 触发词匹配兆底
317
+ // 触发词匹配(最不可靠,需诚实声明低置信度)
333
318
  let best = null;
334
319
  let bestScore = 0;
335
320
  for (const cmd of COMMAND_KB) {
@@ -339,8 +324,11 @@ function matchCommandInKB(input) {
339
324
  best = cmd;
340
325
  }
341
326
  }
342
- if (bestScore > 0)
327
+ if (bestScore > 0 && best) {
328
+ lastKbMatchType = 'trigger';
343
329
  return best;
330
+ }
331
+ lastKbMatchType = null;
344
332
  return null;
345
333
  }
346
334
  /** 模式1: 命令解释 */
@@ -1030,300 +1018,9 @@ function buildPipelineDetail(steps, input) {
1030
1018
  `⚠️ 请确认后执行。`,
1031
1019
  ].join('\n');
1032
1020
  }
1033
- async function understandIntent(input) {
1034
- const result = await askEngine(input);
1035
- const gaps = [];
1036
- let confidence = 0;
1037
- let source = 'rules';
1038
- // 1. 命令验证:检查返回的命令是否都在 KB 中
1039
- const validCommands = new Set(COMMAND_KB.map(c => c.name));
1040
- const unknownCmds = result.commands.filter(c => !validCommands.has(c));
1041
- if (unknownCmds.length > 0) {
1042
- gaps.push(`未知命令: ${unknownCmds.join(', ')}`);
1043
- confidence -= 20;
1044
- }
1045
- // 2. 来源可信度
1046
- if (result.detail?.length > 100)
1047
- confidence += 30; // 有详细解释
1048
- if (result.commands.length > 0)
1049
- confidence += 30; // 有命令
1050
- if (result.mode === 'pipeline')
1051
- confidence += 20; // 流程模式
1052
- if (result.mode === 'match')
1053
- confidence += 10; // 直接匹配
1054
- if (result.mode === 'ambiguous') {
1055
- confidence -= 30;
1056
- gaps.push('意图不明确');
1057
- }
1058
- if (result.mode === 'explain')
1059
- confidence += 15; // 帮助模式
1060
- // 3. LLM 来源加分
1061
- if (result._source === 'llm') {
1062
- confidence += 25;
1063
- source = 'llm';
1064
- }
1065
- else if (result._source === 'host') {
1066
- confidence += 15;
1067
- source = 'host';
1068
- }
1069
- else {
1070
- confidence += 5;
1071
- source = 'rules';
1072
- }
1073
- // 4. 命令覆盖率检查:是否有关联命令被遗漏?
1074
- if (result.commands.length > 0) {
1075
- const primary = result.commands[0];
1076
- const kbEntry = COMMAND_KB.find(c => c.name === primary);
1077
- if (kbEntry?.related) {
1078
- const related = kbEntry.related.filter(r => !result.commands.includes(r));
1079
- if (related.length > 0) {
1080
- gaps.push(`建议补充: ${related.join(', ')}(通常与 ${primary} 配合使用)`);
1081
- }
1082
- }
1083
- }
1084
- // 5. 多步骤检查:如果输入含多步骤但只有一个命令
1085
- if (/然后|再|之后|接着|最后|同时|并且/.test(input) && result.commands.length === 1) {
1086
- gaps.push('用户描述了多个步骤但只匹配到一个命令,可能遗漏');
1087
- confidence -= 15;
1088
- }
1089
- confidence = Math.max(0, Math.min(100, confidence));
1090
- const needsConfirm = confidence < 80 || gaps.length > 0 || (result.pipeline?.confirm !== false);
1091
- return {
1092
- what: result.summary || `匹配到 ${result.commands.join(' → ')}`,
1093
- commands: result.commands,
1094
- confidence,
1095
- gaps,
1096
- needsConfirm,
1097
- source,
1098
- result,
1099
- };
1100
- }
1101
- async function synthesizeIntent(input) {
1102
- const { result, commands, confidence: baseConf, gaps, source } = await understandIntent(input);
1103
- const autoFilled = [];
1104
- const questions = [];
1105
- let confidence = baseConf;
1106
- // ═══ 1. 参数提取 ═══
1107
- // 从输入中提取所有可识别参数
1108
- const parsed = {};
1109
- // 时间
1110
- const timeVal = extractTime(input);
1111
- if (timeVal && timeVal !== new Date().toISOString().slice(0, 19).replace('T', ' ')) {
1112
- parsed.time = timeVal;
1113
- }
1114
- // 任务类型
1115
- const typeMap = {
1116
- 'bug': 'bugfix', '缺陷': 'bugfix', '修复': 'bugfix', 'review': 'review',
1117
- '审查': 'review', '代码审查': 'review', '测试': 'test', 'test': 'test',
1118
- '安全': 'security', 'security': 'security', '文档': 'docs', 'docs': 'docs',
1119
- '重构': 'refactor', 'refactor': 'refactor', '部署': 'deploy', 'deploy': 'deploy',
1120
- '性能': 'performance', 'performance': 'performance',
1121
- };
1122
- for (const [kw, type] of Object.entries(typeMap)) {
1123
- if (input.includes(kw)) {
1124
- parsed.type = type;
1125
- break;
1126
- }
1127
- }
1128
- // 优先级
1129
- if (/高优|紧急|urgent|critical/.test(input))
1130
- parsed.priority = 'high';
1131
- else if (/低优|low/.test(input))
1132
- parsed.priority = 'low';
1133
- // 批次
1134
- const batchMatch = input.match(/(\d+)\s*(?:批次|个|任务)/);
1135
- if (batchMatch)
1136
- parsed.batch = batchMatch[1];
1137
- // 平台:先尝试提取输入中的任意端名(支持自定义端名),再 fallback 到常见硬编码
1138
- const platformMatch = input.match(/(?:平台|端|platform)\s*[:=]?\s*([a-zA-Z0-9\-_]+)/i);
1139
- if (platformMatch) {
1140
- parsed.platform = platformMatch[1];
1141
- }
1142
- else if (/后端|backend/.test(input)) {
1143
- parsed.platform = 'backend';
1144
- }
1145
- else if (/前端|frontend/.test(input)) {
1146
- parsed.platform = 'frontend';
1147
- }
1148
- else if (/小程序|miniapp/.test(input)) {
1149
- parsed.platform = 'miniapp';
1150
- }
1151
- // 任务名
1152
- const nameMatch = input.match(/(?:创建|新建|做一个?)\s*(?:一个?\s*)?["""]([^"]+)["'']/);
1153
- if (!nameMatch) {
1154
- const alt = input.match(/(?:创建|新建|做一个?)\s*(?:一个?\s*)?(\S{2,20}(?:功能|任务|模块|页面))/);
1155
- if (alt)
1156
- parsed.name = alt[1];
1157
- }
1158
- else
1159
- parsed.name = nameMatch[1];
1160
- // v7.2.0+: 分析深度参数提取
1161
- // --deep: 深度分析(指定文档名或泛化表述)
1162
- // v8.3.79+: 支持路径前缀,如 overview/ARCHITECTURE.md 或 020-specs/overview/ARCHITECTURE.md
1163
- const deepDocMatch = input.match(/(?:深度分析|深入分析|详细分析|深度生成)\s*(?:文档?)?\s*([a-zA-Z0-9_\-\/]+\.md|[A-Z_\-]+)/i);
1164
- if (deepDocMatch) {
1165
- parsed.deep = deepDocMatch[1];
1166
- }
1167
- else if (/深度|深入|详细|逐节|慢慢|一步一步/.test(input)) {
1168
- parsed.deep = 'auto'; // 用户表达了深度意愿但未指定文档,后续由 analyze 逻辑决定
1169
- }
1170
- // --iterative: 迭代式生成
1171
- if (/迭代|逐节|分节|分段|大纲|先大纲|确认后再|一步一步/.test(input)) {
1172
- parsed.iterative = 'true';
1173
- }
1174
- // --filter: 按需分析关键词
1175
- const filterMatch = input.match(/(?:只分析|仅分析|过滤|只看|限定|聚焦|针对)\s*(?:模块?)?\s*["""]?([^""",,;;]+)["""]?/);
1176
- if (filterMatch) {
1177
- parsed.filter = filterMatch[1].replace(/[\s|]+/g, ',').trim();
1178
- }
1179
- else if (/只[看要]?(?:订单|支付|用户|登录|认证|权限|消息|通知|搜索|配置|监控|日志|统计|报表|报表|导入|导出|审批|工作流|定时|调度|缓存|队列|文件|图片|视频|音频|地图|定位|推送|邮件|短信|微信|支付宝|银行卡|优惠券|积分|会员|商品|库存|购物车|结算|退款|售后|客服|评价|收藏|关注|订阅|分享|邀请|注册|注销|修改密码|重置密码|绑定|解绑|实名|认证|授权|委托|代理|分销|团购|秒杀|预售|拍卖|抽奖|签到|打卡|排行|等级|勋章|成就|任务|活动|运营|广告|banner|弹窗|引导|教程|帮助|反馈|投诉|举报|禁言|封号|解封|白名单|黑名单|灰度|AB测试|埋点|性能|安全|备份|恢复|迁移|升级|降级|回滚|扩容|缩容|集群|负载均衡|网关|代理|CDN|DNS|SSL|HTTPS|OAuth|JWT|SSO|LDAP|AD|RBAC|ACL|审计|加密|解密|签名|验签|哈希|压缩|解压|编码|解码|序列化|反序列化|模板|引擎|解析器|编译器|解释器|虚拟机|容器|镜像|编排|调度|服务发现|配置中心|注册中心|熔断|限流|降级|重试|超时|幂等|事务|锁|并发|并行|异步|同步|阻塞|非阻塞|轮询|长连接|WebSocket|SSE|MQTT|gRPC|GraphQL|REST|RPC|SOAP|消息队列|事件总线|发布订阅|观察者|责任链|策略|工厂|单例|代理|装饰器|适配器|桥接|组合|享元|外观|模板方法|访问者|中介者|备忘录|迭代器|命令|解释器|状态|备忘录|访问者|中介者|迭代器|命令|解释器|状态)/i.test(input)) {
1180
- // 如果输入中包含明显的业务模块关键词但没有显式"只分析",也尝试提取作为 filter
1181
- const bizMatch = input.match(/(?:订单|支付|用户|登录|认证|权限|消息|通知|搜索|配置|监控|日志|统计|报表|导入|导出|审批|工作流|定时|调度|缓存|队列|文件|图片|视频|音频|地图|定位|推送|邮件|短信|微信|支付宝|银行卡|优惠券|积分|会员|商品|库存|购物车|结算|退款|售后|客服|评价|收藏|关注|订阅|分享|邀请|注册|注销|修改密码|重置密码|绑定|解绑|实名|授权|委托|代理|分销|团购|秒杀|预售|拍卖|抽奖|签到|打卡|排行|等级|勋章|成就|任务|活动|运营|广告|banner|弹窗|引导|教程|帮助|反馈|投诉|举报|禁言|封号|解封|白名单|黑名单|灰度|AB测试|埋点|性能|安全|备份|恢复|迁移|升级|降级|回滚|扩容|缩容|集群|负载均衡|网关|代理|CDN|DNS|SSL|HTTPS|OAuth|JWT|SSO|LDAP|AD|RBAC|ACL|审计|加密|解密|签名|验签|哈希|压缩|解压|编码|解码|序列化|反序列化|模板|引擎|解析器|编译器|解释器|虚拟机|容器|镜像|编排|调度|服务发现|配置中心|注册中心|熔断|限流|降级|重试|超时|幂等|事务|锁|并发|并行|异步|同步|阻塞|非阻塞|轮询|长连接|WebSocket|SSE|MQTT|gRPC|GraphQL|REST|RPC|SOAP|消息队列|事件总线|发布订阅|观察者|责任链|策略|工厂|单例|代理|装饰器|适配器|桥接|组合|享元|外观|模板方法|访问者|中介者|备忘录|迭代器|命令|解释器|状态)/i);
1182
- if (bizMatch)
1183
- parsed.filter = bizMatch[0];
1184
- }
1185
- // --with-code: 关联代码分析
1186
- if (/代码|源码|结构化|AST|接口|实体|组件|路由|带代码|连代码/.test(input)) {
1187
- parsed.withCode = 'true';
1188
- }
1189
- // --scope global: 全局分析
1190
- if (/全局|全量|整体|项目级|架构级|跨端/.test(input) && !parsed.iteration) {
1191
- parsed.scope = 'global';
1192
- }
1193
- // ═══ 2. 上下文补全 ═══
1194
- try {
1195
- const { getDefaultIteration } = await Promise.resolve().then(() => __importStar(require('./context')));
1196
- const iter = await getDefaultIteration();
1197
- if (iter && !parsed.iteration) {
1198
- parsed.iteration = iter;
1199
- autoFilled.push({ field: 'iteration', value: iter, reason: '从当前上下文自动补全迭代' });
1200
- confidence += 5;
1201
- }
1202
- }
1203
- catch { }
1204
- // 批次默认值
1205
- if (!parsed.batch && commands.includes('execute')) {
1206
- parsed.batch = '5';
1207
- autoFilled.push({ field: 'batch', value: '5', reason: '默认批次大小' });
1208
- }
1209
- // ═══ 3. 命令增强(自动补充缺失步骤) ═══
1210
- const finalCommands = [];
1211
- for (const cmd of commands) {
1212
- let args = '';
1213
- let explanation = '';
1214
- switch (cmd) {
1215
- case 'plan':
1216
- args = parsed.iteration ? `-I ${parsed.iteration}` : '--all';
1217
- explanation = '生成执行计划';
1218
- break;
1219
- case 'task':
1220
- args = 'new';
1221
- if (parsed.name)
1222
- args += ` -n "${parsed.name}"`;
1223
- if (parsed.type) {
1224
- args += ` --type ${parsed.type}`;
1225
- autoFilled.push({ field: 'type', value: parsed.type, reason: '从输入中识别任务类型' });
1226
- }
1227
- if (parsed.priority)
1228
- args += ` --priority ${parsed.priority}`;
1229
- explanation = parsed.name ? `创建任务: ${parsed.name}` : '创建任务';
1230
- break;
1231
- case 'execute':
1232
- args = parsed.iteration ? `-I ${parsed.iteration}` : '';
1233
- if (parsed.batch)
1234
- args += ` --batch-size ${parsed.batch}`;
1235
- args += ' --auto --force';
1236
- explanation = '自动执行任务';
1237
- break;
1238
- case 'analyze':
1239
- args = parsed.iteration ? `-I ${parsed.iteration}` : '';
1240
- if (parsed.scope === 'global') {
1241
- args += ' --scope global';
1242
- }
1243
- if (parsed.deep && parsed.deep !== 'auto') {
1244
- args += ` --deep ${parsed.deep}`;
1245
- autoFilled.push({ field: 'deep', value: parsed.deep, reason: '从输入中识别深度分析目标文档' });
1246
- }
1247
- else if (parsed.deep === 'auto') {
1248
- args += ' --deep';
1249
- autoFilled.push({ field: 'deep', value: 'true', reason: '用户表达深度分析意愿' });
1250
- }
1251
- if (parsed.iterative) {
1252
- args += ' --iterative';
1253
- autoFilled.push({ field: 'iterative', value: 'true', reason: '用户要求迭代式生成' });
1254
- }
1255
- if (parsed.filter) {
1256
- args += ` --filter "${parsed.filter}"`;
1257
- autoFilled.push({ field: 'filter', value: parsed.filter, reason: '从输入中提取过滤关键词' });
1258
- }
1259
- if (parsed.withCode) {
1260
- args += ' --with-code';
1261
- autoFilled.push({ field: 'withCode', value: 'true', reason: '用户要求关联代码分析' });
1262
- }
1263
- if (parsed.type)
1264
- args += ` --type ${parsed.type}`;
1265
- explanation = parsed.deep ? `深度分析(${parsed.deep === 'auto' ? '全文档' : parsed.deep})` : (parsed.filter ? `按需分析(${parsed.filter})` : '分析');
1266
- break;
1267
- case 'validate':
1268
- args = parsed.iteration ? `--iteration=${parsed.iteration}` : '';
1269
- explanation = '合规检查';
1270
- break;
1271
- case 'clarify':
1272
- // v8.3.0+: 需求澄清
1273
- if (parsed.name || parsed.desc) {
1274
- args += ` "${parsed.name || parsed.desc}"`;
1275
- }
1276
- if (parsed.iteration) {
1277
- args += ` --to ${parsed.iteration}`;
1278
- }
1279
- else {
1280
- args += ' --local';
1281
- autoFilled.push({ field: 'local', value: 'true', reason: '未指定迭代,默认使用临时工作区' });
1282
- }
1283
- explanation = '需求专业化整理';
1284
- break;
1285
- default:
1286
- explanation = '执行命令';
1287
- }
1288
- finalCommands.push({ command: cmd, args, explanation });
1289
- }
1290
- // ═══ 4. 自检:补全后还有遗漏吗? ═══
1291
- // 有任务名但没 type → 可继续(类型默认 feature)
1292
- if (parsed.name && !parsed.type) {
1293
- // 不追问,类型默认即可
1294
- }
1295
- // ═══ 5. 是否真需要确认? ═══
1296
- // 只有这些情况才需要:
1297
- // a) AI 理解不清楚(gaps 非空)
1298
- // b) 置信度低于阈值
1299
- // c) 参数严重缺失(如无任务名就创建任务)
1300
- // 否则 AI 自主补全后直接执行
1301
- const isProblematic = gaps.length > 0 || confidence < 60;
1302
- // 关键参数缺失 → 提问
1303
- if (commands.includes('task') && !parsed.name && !parsed.type) {
1304
- questions.push('请描述你要创建的任务类型和名称(如:创建一个登录功能的bug修复任务)');
1305
- }
1306
- const finalConf = confidence + autoFilled.length * 5; // 自动补全加分
1307
- const needsConfirm = isProblematic || questions.length > 0 || (result.pipeline?.confirm !== false);
1308
- // 给 pipeline 结果填充 auto-fill 后的参数
1309
- if (result.pipeline) {
1310
- for (const step of result.pipeline.steps) {
1311
- const fc = finalCommands.find(c => c.command === step.command);
1312
- if (fc)
1313
- step.args = fc.args;
1314
- }
1315
- }
1316
- return {
1317
- what: result.summary || finalCommands.map(c => `${c.command} ${c.args}`).join(' → '),
1318
- source,
1319
- result,
1320
- autoFilled,
1321
- questions,
1322
- needsConfirm,
1323
- confidence: Math.min(100, finalConf),
1324
- finalCommands,
1325
- };
1326
- }
1021
+ // ============================================================
1022
+ // 统一入口
1023
+ // ============================================================
1327
1024
  async function askEngine(input, options) {
1328
1025
  const isExplicit = options?.explicit || false;
1329
1026
  // ═══════════════════════════════════════════════════════════
@@ -1398,12 +1095,17 @@ async function askEngine(input, options) {
1398
1095
  // 知识图谱语义增强:如果本地引擎匹配到需要 task 的命令但缺少参数,尝试从图谱补全
1399
1096
  localResult = await enrichWithKG(localResult, input);
1400
1097
  // 计算本地置信度(explain/guide/pipeline 视为高置信度)
1401
- // KB 匹配成功(含同义词表)给予较高基础分,避免误路由到宿主 AI
1098
+ // v8.3.184+ degrade to honesty:按匹配层级诚实赋值,触发词匹配不得伪装成精确匹配
1402
1099
  const hasKbMatch = localResult.commands.length > 0 && localResult.mode === 'match' && !localResult.summary.includes('未识别');
1403
- const fallbackConfidence = localResult.autoExec ? 85 : (mode === 'explain' || mode === 'pipeline') ? 90 : hasKbMatch ? 75 : 55;
1404
- // 同义词表匹配时,用 max() 确保置信度不低于 75(高分区),避免触发不必要的 AI 调用
1100
+ const kbMatchConf = lastKbMatchType === 'name' || lastKbMatchType === 'alias' ? 90 // 精确匹配命令名
1101
+ : lastKbMatchType === 'synonym' ? 80 // 同义词表(显式映射)
1102
+ : lastKbMatchType === 'trigger' ? 60 // 触发词(是猜的,需确认)
1103
+ : 55;
1104
+ const fallbackConfidence = localResult.autoExec ? 85 : (mode === 'explain' || mode === 'pipeline') ? 90 : hasKbMatch ? kbMatchConf : 55;
1405
1105
  const localConfidence = hasKbMatch
1406
- ? Math.max(localCandidates[0]?.confidence || 0, fallbackConfidence)
1106
+ ? (lastKbMatchType === 'trigger'
1107
+ ? 60 // 触发词匹配:诚实封顶 60,走中分区(宿主 AI 双路确认),不被意图识别虚高分抬升
1108
+ : Math.max(localCandidates[0]?.confidence || 0, fallbackConfidence))
1407
1109
  : (localCandidates[0]?.confidence || fallbackConfidence);
1408
1110
  // --rules / forceHostAi 强制所有请求走 AI
1409
1111
  const forceHostAi = input.includes('--rules') || config.rules.forceHostAi;