product-spec-mcp 0.3.29 → 0.3.31

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 (2) hide show
  1. package/dist/index.cjs +601 -327
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -21147,6 +21147,60 @@ var TechnicalProfileSchema = external_exports.object({
21147
21147
  )
21148
21148
  });
21149
21149
 
21150
+ // src/schemas/pmIntentDecision.schema.ts
21151
+ var PmIntentDecisionSchema = external_exports.object({
21152
+ needType: external_exports.enum([
21153
+ "static_display",
21154
+ "personal_local_tool",
21155
+ "multi_user_collaboration",
21156
+ "content_marketing_site",
21157
+ "data_visualization_site",
21158
+ "transaction_workflow",
21159
+ "content_knowledge",
21160
+ "ai_automation",
21161
+ "unknown"
21162
+ ]),
21163
+ usageScope: external_exports.enum(["self", "fixed_group", "public_audience", "unknown"]),
21164
+ maintenanceMode: external_exports.enum([
21165
+ "agent_assisted",
21166
+ "manual_files",
21167
+ "web_admin",
21168
+ "visitor_submission",
21169
+ "runtime_collaboration",
21170
+ "unknown"
21171
+ ]),
21172
+ accessTopology: external_exports.enum(["single_device", "lan_only", "internet_ip", "public_domain", "unknown"]),
21173
+ technicalShape: external_exports.enum([
21174
+ "static_page",
21175
+ "local_storage_tool",
21176
+ "local_json_import_export",
21177
+ "static_json_data_page",
21178
+ "light_backend_json_sqlite",
21179
+ "full_backend_saas",
21180
+ "unknown"
21181
+ ]),
21182
+ recommendedDeployment: external_exports.enum([
21183
+ "static_only",
21184
+ "local_browser_only",
21185
+ "static_hosting_with_agent_updates",
21186
+ "local_lan_server_sqlite",
21187
+ "cheap_vps_sqlite_by_ip",
21188
+ "vps_domain_https",
21189
+ "unknown"
21190
+ ]),
21191
+ route: external_exports.enum(["spec_compile", "spec_interrogate", "architecture_decide"]),
21192
+ confidence: external_exports.enum(["high", "medium", "low"]),
21193
+ strongSignals: external_exports.array(external_exports.string()),
21194
+ weakSignals: external_exports.array(external_exports.string()),
21195
+ coreObjects: external_exports.array(external_exports.string()),
21196
+ states: external_exports.array(external_exports.string()),
21197
+ actions: external_exports.array(external_exports.string()),
21198
+ mustNotUse: external_exports.array(external_exports.string()),
21199
+ boundaryQuestionIds: external_exports.array(external_exports.string()),
21200
+ defaultAssumptions: external_exports.array(external_exports.string()),
21201
+ source: external_exports.enum(["local_rule", "online_llm", "merged"])
21202
+ });
21203
+
21150
21204
  // src/schemas/outputs/specInterrogate.output.ts
21151
21205
  var SpecInterrogateOutputSchema = external_exports.object({
21152
21206
  readiness: external_exports.object({
@@ -21180,7 +21234,8 @@ var SpecInterrogateOutputSchema = external_exports.object({
21180
21234
  suggestedNextTool: external_exports.enum(["spec_compile", "spec_interrogate"]),
21181
21235
  reason: external_exports.string()
21182
21236
  }),
21183
- technicalProfile: TechnicalProfileSchema.optional()
21237
+ technicalProfile: TechnicalProfileSchema.optional(),
21238
+ pmIntentDecision: PmIntentDecisionSchema.optional()
21184
21239
  });
21185
21240
 
21186
21241
  // src/core/contextSignals.ts
@@ -23315,7 +23370,7 @@ ${acceptance.platform}
23315
23370
  }
23316
23371
 
23317
23372
  // src/core/structuredResultBuilder.ts
23318
- function buildInterrogateStructuredOutput(readiness, clarification, technicalProfile) {
23373
+ function buildInterrogateStructuredOutput(readiness, clarification, technicalProfile, pmIntentDecision) {
23319
23374
  const canProceed = readiness.status !== "Not Ready";
23320
23375
  return {
23321
23376
  readiness: {
@@ -23333,7 +23388,8 @@ function buildInterrogateStructuredOutput(readiness, clarification, technicalPro
23333
23388
  suggestedNextTool: canProceed ? "spec_compile" : "spec_interrogate",
23334
23389
  reason: canProceed ? readiness.status === "Build Ready" ? "\u4FE1\u606F\u5145\u8DB3\uFF0C\u53EF\u4EE5\u751F\u6210\u6B63\u5F0F\u89C4\u683C" : "\u4FE1\u606F\u90E8\u5206\u5B8C\u6574\uFF0C\u53EF\u4EE5\u751F\u6210\u8349\u6848" : "\u4FE1\u606F\u4E0D\u8DB3\uFF0C\u9700\u8981\u5148\u56DE\u7B54\u8FFD\u95EE"
23335
23390
  },
23336
- technicalProfile
23391
+ technicalProfile,
23392
+ pmIntentDecision
23337
23393
  };
23338
23394
  }
23339
23395
  function buildCompileStructuredOutput(mode, readiness, spec, confirmation, clarification) {
@@ -23483,97 +23539,542 @@ function buildDebugGuideStructuredOutput(guide) {
23483
23539
  };
23484
23540
  }
23485
23541
 
23486
- // src/tools/specInterrogate.ts
23487
- function registerSpecInterrogate(server) {
23488
- const handler = async (input) => {
23489
- const readiness = calculateReadiness(input.raw_idea, input.known_context);
23490
- const clarification = generateClarification(
23491
- input.raw_idea,
23492
- readiness,
23493
- input.scenario,
23494
- input.target_platform,
23495
- input.strictness,
23496
- input.known_context
23497
- );
23498
- const markdown = formatInterrogateResult(readiness, clarification);
23499
- const structuredContent = buildInterrogateStructuredOutput(readiness, clarification);
23542
+ // src/core/pmIntentGate.ts
23543
+ function decidePmIntent(rawText, context = {}) {
23544
+ const text = `${rawText} ${JSON.stringify(context)}`;
23545
+ const strongSignals = collectSignals(text, strongSignalMap);
23546
+ const weakSignals = collectSignals(text, weakSignalMap);
23547
+ const usageScope = decideUsageScope(text);
23548
+ const preliminaryNeedType = decideNeedType(text, strongSignals);
23549
+ const maintenanceMode = decideMaintenanceMode(text, preliminaryNeedType);
23550
+ const accessTopology = decideAccessTopology(text, usageScope, maintenanceMode);
23551
+ const needType = preliminaryNeedType;
23552
+ const technicalShape = decideTechnicalShape(text, needType, maintenanceMode);
23553
+ const recommendedDeployment = decideRecommendedDeployment(needType, technicalShape, maintenanceMode, accessTopology);
23554
+ const route = decideRoute(needType, technicalShape, maintenanceMode);
23555
+ const confidence = decideConfidence(needType, strongSignals, weakSignals);
23556
+ return enforceHardRules({
23557
+ needType,
23558
+ usageScope,
23559
+ maintenanceMode,
23560
+ accessTopology,
23561
+ technicalShape,
23562
+ recommendedDeployment,
23563
+ route,
23564
+ confidence,
23565
+ strongSignals,
23566
+ weakSignals,
23567
+ coreObjects: extractCoreObjects(text, needType),
23568
+ states: extractStates(text, needType),
23569
+ actions: extractActions(text, needType),
23570
+ mustNotUse: buildMustNotUse(needType, maintenanceMode),
23571
+ boundaryQuestionIds: buildBoundaryQuestionIds(needType, maintenanceMode, accessTopology),
23572
+ defaultAssumptions: buildDefaultAssumptions(needType, usageScope, maintenanceMode, accessTopology, recommendedDeployment),
23573
+ source: "local_rule"
23574
+ });
23575
+ }
23576
+ function decideNeedType(text, strongSignals) {
23577
+ if (hasAny2(text, ["AI", "ai", "LLM", "llm", "GPT", "gpt", "\u5927\u6A21\u578B", "\u6A21\u578B\u63A5\u53E3", "API Key", "DeepSeek", "OpenAI"]) && !isNegated(text, ["AI", "\u6A21\u578B"])) {
23578
+ return "ai_automation";
23579
+ }
23580
+ if (hasAny2(text, ["\u652F\u4ED8", "\u8BA2\u5355", "\u552E\u5356", "\u8D2D\u4E70", "\u62A5\u540D", "\u9884\u7EA6", "\u6536\u6B3E", "\u5BFC\u51FA Excel", "\u5BFC\u51FA"])) {
23581
+ return "transaction_workflow";
23582
+ }
23583
+ if (hasAny2(text, ["\u591A\u4EBA", "\u5BA4\u53CB", "\u5BB6\u4EBA\u5171\u7528", "\u5171\u7528", "\u5171\u4EAB", "\u534F\u4F5C", "\u76F8\u4E92\u5B89\u6392", "\u8BA4\u9886", "\u5206\u914D\u4EFB\u52A1", "\u56E2\u961F\u5F85\u529E"])) {
23584
+ return "multi_user_collaboration";
23585
+ }
23586
+ if (hasAny2(text, ["xlsx", "XLSX", "Excel", "csv", "CSV", "\u56FE\u8868", "\u6570\u636E\u6E32\u67D3", "\u53EF\u89C6\u5316", "\u4EEA\u8868\u76D8"]) && hasAny2(text, ["\u6587\u4EF6", "\u6570\u636E", "\u6E32\u67D3", "\u56FE\u8868", "\u4E0A\u4F20", "\u63D0\u4F9B"])) {
23587
+ return "data_visualization_site";
23588
+ }
23589
+ if (hasAny2(text, ["\u5065\u8EAB\u623F", "\u9910\u5385", "\u5496\u5561\u5E97", "\u5DE5\u4F5C\u5BA4", "\u95E8\u5E97", "\u672C\u5730\u670D\u52A1", "GEO", "geo", "SEO", "seo", "\u4FC3\u9500", "\u6559\u7EC3", "Q&A", "FAQ", "\u7167\u7247", "\u7528\u6237\u53CD\u9988"])) {
23590
+ return "content_marketing_site";
23591
+ }
23592
+ if (hasAny2(text, ["\u77E5\u8BC6\u5E93", "\u6587\u6863\u7BA1\u7406", "\u8D44\u6599\u5E93", "\u56E2\u961F\u6587\u6863"])) {
23593
+ return "content_knowledge";
23594
+ }
23595
+ if (hasAny2(text, ["\u836F\u54C1", "\u98DF\u6750", "\u8BFB\u4E66", "\u8BA2\u9605", "\u690D\u7269", "\u88C5\u5907", "\u6E05\u5355", "\u8BB0\u5F55", "\u63D0\u9192", "\u5E93\u5B58", "\u4FDD\u8D28\u671F"]) && !strongSignals.includes("\u591A\u4EBA")) {
23596
+ return "personal_local_tool";
23597
+ }
23598
+ if (hasAny2(text, ["\u4F5C\u54C1\u96C6", "\u4E2A\u4EBA\u4E3B\u9875", "\u5B98\u7F51", "\u4ECB\u7ECD\u9875", "\u516C\u53F8\u4ECB\u7ECD", "\u8054\u7CFB\u65B9\u5F0F"]) && !hasAny2(text, ["\u63D0\u4EA4", "\u4E0A\u4F20", "\u7F16\u8F91", "\u7EF4\u62A4", "\u6570\u636E", "\u4EFB\u52A1", "\u8BA4\u9886"])) {
23599
+ return "static_display";
23600
+ }
23601
+ return "unknown";
23602
+ }
23603
+ function decideUsageScope(text) {
23604
+ if (hasAny2(text, ["\u516C\u5F00", "\u8BBF\u5BA2", "\u5BA2\u6237", "\u7528\u6237", "\u4F1A\u5458", "\u5B98\u7F51", "\u7F51\u7AD9", "\u95E8\u5E97", "\u5065\u8EAB\u623F", "\u9910\u5385", "\u5DE5\u4F5C\u5BA4"])) return "public_audience";
23605
+ if (hasAny2(text, ["\u591A\u4EBA", "\u5BA4\u53CB", "\u5BB6\u4EBA", "\u5BB6\u5EAD", "\u540C\u4E8B", "\u56E2\u961F", "\u5171\u7528", "\u5171\u4EAB"])) return "fixed_group";
23606
+ if (hasAny2(text, ["\u81EA\u5DF1", "\u81EA\u7528", "\u4E2A\u4EBA", "\u6211\u7528", "\u6211\u81EA\u5DF1"])) return "self";
23607
+ return "unknown";
23608
+ }
23609
+ function decideMaintenanceMode(text, needType) {
23610
+ if (hasAny2(text, ["\u8BBF\u5BA2\u63D0\u4EA4", "\u7528\u6237\u63D0\u4EA4", "\u5728\u7EBF\u63D0\u4EA4", "\u63D0\u4EA4\u53CD\u9988", "\u63D0\u4EA4\u8BC4\u8BBA", "\u9884\u7EA6\u4F53\u9A8C", "\u62A5\u540D"])) return "visitor_submission";
23611
+ if (hasAny2(text, ["\u8BA4\u9886", "\u76F8\u4E92\u5B89\u6392", "\u534F\u4F5C", "\u5206\u914D\u4EFB\u52A1", "\u591A\u4EBA\u4EFB\u52A1", "\u5171\u4EAB\u4EFB\u52A1"])) return "runtime_collaboration";
23612
+ if (hasAny2(text, ["\u540E\u53F0", "\u7BA1\u7406\u540E\u53F0", "\u7F51\u9875\u91CC\u7F16\u8F91", "\u7F51\u9875\u4E0A\u4F20", "\u4E0A\u4F20\u6309\u94AE", "\u767B\u5F55\u540E\u7F16\u8F91", "CMS", "cms"])) return "web_admin";
23613
+ if (hasAny2(text, ["data.json", "markdown", "Markdown", "md \u6587\u4EF6", "\u624B\u52A8\u6539\u6587\u4EF6"])) return "manual_files";
23614
+ if (hasAny2(text, ["Agent", "agent", "\u6BCF\u6B21\u6211\u63D0\u4F9B", "\u6211\u63D0\u4F9B\u65B0\u7684", "\u4F20\u5F88\u591A", "\u4E0D\u5B9A\u671F\u7EF4\u62A4", "\u91CD\u65B0\u90E8\u7F72"])) return "agent_assisted";
23615
+ if (needType === "content_marketing_site" || needType === "data_visualization_site" || needType === "static_display") return "agent_assisted";
23616
+ return "unknown";
23617
+ }
23618
+ function decideAccessTopology(text, usageScope, maintenanceMode) {
23619
+ if (hasAny2(text, ["\u540C\u4E00 Wi-Fi", "\u540C\u4E00\u4E2A Wi-Fi", "\u5C40\u57DF\u7F51", "\u5185\u7F51", "\u5BB6\u91CC\u7F51\u7EDC"])) return "lan_only";
23620
+ if (hasAny2(text, ["\u5916\u51FA", "\u516C\u7F51 IP", "\u516C\u7F51ip", "IP \u5730\u5740", "\u670D\u52A1\u5668", "VPS", "vps"])) return "internet_ip";
23621
+ if (hasAny2(text, ["\u57DF\u540D", "HTTPS", "https", "\u5907\u6848", "\u516C\u5F00\u7F51\u7AD9", "\u5B98\u7F51"])) return "public_domain";
23622
+ if (usageScope === "self" && maintenanceMode !== "runtime_collaboration") return "single_device";
23623
+ if (usageScope === "public_audience") return "public_domain";
23624
+ return "unknown";
23625
+ }
23626
+ function decideTechnicalShape(text, needType, maintenanceMode) {
23627
+ if (needType === "ai_automation") return "full_backend_saas";
23628
+ if (needType === "transaction_workflow") return hasAny2(text, ["\u652F\u4ED8", "\u8BA2\u5355", "\u6536\u8D39"]) ? "full_backend_saas" : "light_backend_json_sqlite";
23629
+ if (needType === "multi_user_collaboration") return "light_backend_json_sqlite";
23630
+ if (needType === "content_marketing_site") {
23631
+ return maintenanceMode === "web_admin" || maintenanceMode === "visitor_submission" ? "light_backend_json_sqlite" : "static_json_data_page";
23632
+ }
23633
+ if (needType === "data_visualization_site") {
23634
+ return maintenanceMode === "web_admin" || maintenanceMode === "visitor_submission" ? "light_backend_json_sqlite" : "static_json_data_page";
23635
+ }
23636
+ if (needType === "content_knowledge") {
23637
+ return maintenanceMode === "agent_assisted" || maintenanceMode === "manual_files" ? "static_json_data_page" : "light_backend_json_sqlite";
23638
+ }
23639
+ if (needType === "personal_local_tool") return "local_storage_tool";
23640
+ if (needType === "static_display") return "static_page";
23641
+ return "unknown";
23642
+ }
23643
+ function decideRecommendedDeployment(needType, technicalShape, maintenanceMode, accessTopology) {
23644
+ if (technicalShape === "static_page") return "static_only";
23645
+ if (technicalShape === "local_storage_tool" || technicalShape === "local_json_import_export") return "local_browser_only";
23646
+ if (maintenanceMode === "agent_assisted" && ["content_marketing_site", "data_visualization_site", "content_knowledge"].includes(needType)) {
23647
+ return "static_hosting_with_agent_updates";
23648
+ }
23649
+ if (accessTopology === "lan_only") return "local_lan_server_sqlite";
23650
+ if (accessTopology === "internet_ip") return "cheap_vps_sqlite_by_ip";
23651
+ if (accessTopology === "public_domain") return "vps_domain_https";
23652
+ if (technicalShape === "light_backend_json_sqlite") return "unknown";
23653
+ return "unknown";
23654
+ }
23655
+ function decideRoute(needType, technicalShape, maintenanceMode) {
23656
+ if (needType === "personal_local_tool") return "spec_compile";
23657
+ if (["static_page", "static_json_data_page"].includes(technicalShape) && maintenanceMode === "agent_assisted") return "spec_compile";
23658
+ return "spec_interrogate";
23659
+ }
23660
+ function decideConfidence(needType, strongSignals, weakSignals) {
23661
+ if (needType === "unknown") return "low";
23662
+ if (strongSignals.length >= 2) return "high";
23663
+ if (strongSignals.length === 1 || weakSignals.length >= 2) return "medium";
23664
+ return "medium";
23665
+ }
23666
+ function enforceHardRules(decision) {
23667
+ const hasRuntimeCollaboration = decision.needType === "multi_user_collaboration" || decision.maintenanceMode === "runtime_collaboration" || decision.strongSignals.some((signal) => ["\u591A\u4EBA", "\u5171\u4EAB", "\u534F\u4F5C", "\u8BA4\u9886", "\u76F8\u4E92\u5B89\u6392"].includes(signal));
23668
+ if (hasRuntimeCollaboration && decision.technicalShape !== "light_backend_json_sqlite") {
23500
23669
  return {
23501
- content: [{ type: "text", text: markdown }],
23502
- structuredContent
23670
+ ...decision,
23671
+ needType: "multi_user_collaboration",
23672
+ maintenanceMode: "runtime_collaboration",
23673
+ technicalShape: "light_backend_json_sqlite",
23674
+ recommendedDeployment: recommendedDeploymentForCollaboration(decision.accessTopology),
23675
+ route: "spec_interrogate",
23676
+ mustNotUse: Array.from(/* @__PURE__ */ new Set([...decision.mustNotUse, "static_display", "local_storage_only"]))
23503
23677
  };
23504
- };
23505
- server.registerTool(
23506
- "spec_interrogate",
23507
- {
23508
- title: "\u9700\u6C42\u8FFD\u95EE",
23509
- description: "\u5206\u6790\u7528\u6237\u7684\u539F\u59CB idea \u6216\u9875\u9762\u4FEE\u6539\u9700\u6C42\uFF0C\u5224\u65AD\u4FE1\u606F\u662F\u5426\u8DB3\u591F\u8FDB\u5165\u5F00\u53D1\u9636\u6BB5\u3002\u5F53\u4FE1\u606F\u7F3A\u5931\u8F83\u591A\u65F6\uFF0C\u8F93\u51FA\u8FFD\u95EE\u95EE\u9898\u6E05\u5355\u3002",
23510
- inputSchema: SpecInterrogateInputSchema.shape,
23511
- outputSchema: SpecInterrogateOutputSchema.shape
23512
- },
23513
- handler
23514
- );
23678
+ }
23679
+ return decision;
23515
23680
  }
23516
-
23517
- // src/schemas/specCompile.schema.ts
23518
- var SpecCompileInputSchema = external_exports.object({
23519
- raw_idea: external_exports.string().describe("\u7528\u6237\u539F\u59CB\u60F3\u6CD5"),
23520
- answers: external_exports.record(external_exports.string(), external_exports.any()).optional().describe("\u7528\u6237\u5BF9\u8FFD\u95EE\u7684\u56DE\u7B54"),
23521
- allow_assumptions: external_exports.boolean().optional().default(true).describe("\u662F\u5426\u5141\u8BB8\u4F7F\u7528\u9ED8\u8BA4\u5047\u8BBE"),
23522
- min_readiness_score: external_exports.number().optional().default(70).describe("\u6700\u4F4E\u53EF\u63A5\u53D7\u7684 readiness \u5206\u6570")
23523
- });
23524
-
23525
- // src/schemas/pmIntentDecision.schema.ts
23526
- var PmIntentDecisionSchema = external_exports.object({
23527
- needType: external_exports.enum([
23528
- "static_display",
23529
- "personal_local_tool",
23530
- "multi_user_collaboration",
23531
- "content_marketing_site",
23532
- "data_visualization_site",
23533
- "transaction_workflow",
23534
- "content_knowledge",
23535
- "ai_automation",
23536
- "unknown"
23537
- ]),
23538
- usageScope: external_exports.enum(["self", "fixed_group", "public_audience", "unknown"]),
23539
- maintenanceMode: external_exports.enum([
23540
- "agent_assisted",
23541
- "manual_files",
23542
- "web_admin",
23543
- "visitor_submission",
23544
- "runtime_collaboration",
23545
- "unknown"
23546
- ]),
23547
- accessTopology: external_exports.enum(["single_device", "lan_only", "internet_ip", "public_domain", "unknown"]),
23548
- technicalShape: external_exports.enum([
23549
- "static_page",
23550
- "local_storage_tool",
23551
- "local_json_import_export",
23552
- "static_json_data_page",
23553
- "light_backend_json_sqlite",
23554
- "full_backend_saas",
23555
- "unknown"
23556
- ]),
23557
- recommendedDeployment: external_exports.enum([
23558
- "static_only",
23559
- "local_browser_only",
23560
- "static_hosting_with_agent_updates",
23561
- "local_lan_server_sqlite",
23562
- "cheap_vps_sqlite_by_ip",
23563
- "vps_domain_https",
23564
- "unknown"
23565
- ]),
23566
- route: external_exports.enum(["spec_compile", "spec_interrogate", "architecture_decide"]),
23567
- confidence: external_exports.enum(["high", "medium", "low"]),
23568
- strongSignals: external_exports.array(external_exports.string()),
23569
- weakSignals: external_exports.array(external_exports.string()),
23570
- coreObjects: external_exports.array(external_exports.string()),
23571
- states: external_exports.array(external_exports.string()),
23572
- actions: external_exports.array(external_exports.string()),
23573
- mustNotUse: external_exports.array(external_exports.string()),
23574
- boundaryQuestionIds: external_exports.array(external_exports.string()),
23575
- defaultAssumptions: external_exports.array(external_exports.string()),
23576
- source: external_exports.enum(["local_rule", "online_llm", "merged"])
23681
+ function recommendedDeploymentForCollaboration(accessTopology) {
23682
+ if (accessTopology === "lan_only") return "local_lan_server_sqlite";
23683
+ if (accessTopology === "internet_ip") return "cheap_vps_sqlite_by_ip";
23684
+ if (accessTopology === "public_domain") return "vps_domain_https";
23685
+ return "unknown";
23686
+ }
23687
+ function buildMustNotUse(needType, maintenanceMode) {
23688
+ const items = [];
23689
+ if (needType === "multi_user_collaboration") items.push("static_display", "local_storage_only");
23690
+ if (needType === "content_marketing_site" || needType === "data_visualization_site") items.push("admin_backend_by_default", "database_by_default");
23691
+ if (maintenanceMode === "agent_assisted") items.push("web_admin_cms_by_default");
23692
+ if (needType === "transaction_workflow") items.push("local_storage_only");
23693
+ if (needType === "ai_automation") items.push("frontend_api_key");
23694
+ return Array.from(new Set(items));
23695
+ }
23696
+ function buildBoundaryQuestionIds(needType, maintenanceMode, accessTopology) {
23697
+ if (needType === "multi_user_collaboration") {
23698
+ return ["access_topology", "public_ip_acceptance", "claim_rule", "time_conflict_rule"];
23699
+ }
23700
+ if (needType === "content_marketing_site") {
23701
+ return ["maintenance_mode", "geo_goal", "visitor_submission", "image_volume"];
23702
+ }
23703
+ if (needType === "data_visualization_site") {
23704
+ return ["data_update_mode", "audience_scope", "history_versions"];
23705
+ }
23706
+ if (needType === "content_knowledge") {
23707
+ return maintenanceMode === "agent_assisted" ? ["maintenance_mode", "visibility_scope"] : ["editor_roles", "permission_rule", "version_history"];
23708
+ }
23709
+ if (needType === "unknown") return ["usage_scope", "maintenance_mode", "data_flow"];
23710
+ if (accessTopology === "unknown" && needType !== "personal_local_tool") return ["access_topology"];
23711
+ return [];
23712
+ }
23713
+ function buildDefaultAssumptions(needType, usageScope, maintenanceMode, accessTopology, deployment) {
23714
+ const items = [`\u4F7F\u7528\u8303\u56F4\uFF1A${usageScope}`, `\u7EF4\u62A4\u65B9\u5F0F\uFF1A${maintenanceMode}`, `\u8BBF\u95EE\u65B9\u5F0F\uFF1A${accessTopology}`, `\u63A8\u8350\u90E8\u7F72\uFF1A${deployment}`];
23715
+ if (needType === "content_marketing_site" || needType === "data_visualization_site") {
23716
+ items.push("\u5185\u5BB9\u6216\u6570\u636E\u7ECF\u5E38\u66F4\u65B0\u65F6\uFF0CMVP \u9ED8\u8BA4\u4F18\u5148\u7531 Agent \u66F4\u65B0\u5185\u5BB9\u6587\u4EF6\u5E76\u91CD\u65B0\u90E8\u7F72\uFF0C\u4E0D\u9ED8\u8BA4\u5EFA\u8BBE\u7F51\u9875\u540E\u53F0\u3002");
23717
+ }
23718
+ if (needType === "multi_user_collaboration") {
23719
+ items.push("\u591A\u4EBA\u534F\u4F5C\u5148\u786E\u8BA4\u5C40\u57DF\u7F51\u662F\u5426\u8DB3\u591F\uFF1B\u4E0D\u76F4\u63A5\u9ED8\u8BA4\u516C\u7F51\u670D\u52A1\u5668\u3001\u57DF\u540D\u6216\u5907\u6848\u3002");
23720
+ }
23721
+ return items;
23722
+ }
23723
+ function extractCoreObjects(text, needType) {
23724
+ if (needType === "multi_user_collaboration") return ["\u7528\u6237", "\u4EFB\u52A1", "\u65E5\u7A0B\u9879"];
23725
+ if (needType === "content_marketing_site") return ["Q&A", "\u7167\u7247", "\u7528\u6237\u53CD\u9988", "\u4FC3\u9500\u6D3B\u52A8", "\u6559\u7EC3\u4FE1\u606F"].filter((item) => text.includes(item.replace("\u4FE1\u606F", "")) || item === "Q&A");
23726
+ if (needType === "data_visualization_site") return ["xlsx \u6587\u4EF6", "\u6570\u636E\u8868", "\u56FE\u8868\u914D\u7F6E", "\u6E32\u67D3\u7ED3\u679C"];
23727
+ if (needType === "personal_local_tool") {
23728
+ if (text.includes("\u836F")) return ["\u836F\u54C1"];
23729
+ if (text.includes("\u98DF\u6750")) return ["\u98DF\u6750"];
23730
+ return ["\u8BB0\u5F55"];
23731
+ }
23732
+ return [];
23733
+ }
23734
+ function extractStates(text, needType) {
23735
+ const states = [];
23736
+ if (needType === "multi_user_collaboration") states.push("\u5F85\u8BA4\u9886", "\u5DF2\u8BA4\u9886", "\u5DF2\u5B8C\u6210", "\u53D6\u6D88");
23737
+ if (hasAny2(text, ["\u8FC7\u671F", "\u4E34\u671F", "\u5230\u671F"])) states.push("\u6B63\u5E38", "\u4E34\u671F", "\u5DF2\u8FC7\u671F");
23738
+ return Array.from(new Set(states));
23739
+ }
23740
+ function extractActions(text, needType) {
23741
+ if (needType === "multi_user_collaboration") return ["\u5B89\u6392\u4EFB\u52A1", "\u8BA4\u9886\u4EFB\u52A1", "\u67E5\u770B\u65E5\u7A0B\u51B2\u7A81"];
23742
+ if (needType === "content_marketing_site") return ["\u66F4\u65B0\u5185\u5BB9", "\u53D1\u5E03\u4FC3\u9500", "\u7EF4\u62A4\u56FE\u7247\u548C FAQ"];
23743
+ if (needType === "data_visualization_site") return ["\u89E3\u6790 xlsx", "\u66F4\u65B0\u56FE\u8868\u6570\u636E", "\u6E32\u67D3\u7ED3\u679C"];
23744
+ return [];
23745
+ }
23746
+ var strongSignalMap = {
23747
+ \u591A\u4EBA: ["\u591A\u4EBA", "\u5BA4\u53CB", "\u5BB6\u4EBA\u5171\u7528", "\u5171\u7528", "\u5171\u4EAB"],
23748
+ \u534F\u4F5C: ["\u534F\u4F5C", "\u76F8\u4E92\u5B89\u6392", "\u8BA4\u9886", "\u5206\u914D\u4EFB\u52A1"],
23749
+ \u6743\u9650: ["\u6743\u9650", "\u767B\u5F55", "\u540E\u53F0", "\u7BA1\u7406\u5458", "\u5BA1\u6279", "\u5BA1\u6838"],
23750
+ \u516C\u5F00\u63D0\u4EA4: ["\u8BBF\u5BA2\u63D0\u4EA4", "\u7528\u6237\u63D0\u4EA4", "\u5728\u7EBF\u63D0\u4EA4", "\u63D0\u4EA4\u53CD\u9988"],
23751
+ \u4EA4\u6613: ["\u652F\u4ED8", "\u8BA2\u5355", "\u552E\u5356", "\u8D2D\u4E70", "\u62A5\u540D", "\u9884\u7EA6"],
23752
+ AI: ["AI", "ai", "API Key", "\u6A21\u578B\u63A5\u53E3", "\u5927\u6A21\u578B"]
23753
+ };
23754
+ var weakSignalMap = {
23755
+ \u5C55\u793A: ["\u5C55\u793A", "\u7F51\u7AD9", "\u9875\u9762"],
23756
+ \u89C6\u89C9: ["\u9875\u9762\u9AD8\u7EA7", "\u597D\u770B", "\u7F8E\u89C2"],
23757
+ \u7BA1\u7406: ["\u7BA1\u7406", "\u7EF4\u62A4", "\u5185\u5BB9\u591A"],
23758
+ \u5217\u8868: ["\u5217\u8868", "\u67E5\u770B", "\u7B5B\u9009", "\u65E5\u7A0B", "\u72B6\u6001"]
23759
+ };
23760
+ function collectSignals(text, map) {
23761
+ return Object.entries(map).filter(([, signals]) => hasAny2(text, signals)).map(([label]) => label);
23762
+ }
23763
+ function hasAny2(text, signals) {
23764
+ return signals.some((signal) => text.includes(signal));
23765
+ }
23766
+ function isNegated(text, signals) {
23767
+ return signals.some((signal) => new RegExp(`(\u4E0D\u63A5|\u4E0D\u505A|\u4E0D\u7528|\u65E0\u9700|\u4E0D\u9700\u8981|\u6682\u4E0D|\u5148\u4E0D).{0,8}${signal}`, "i").test(text));
23768
+ }
23769
+
23770
+ // src/core/pmGateClarification.ts
23771
+ function shouldUsePmGateClarification(decision) {
23772
+ return [
23773
+ "personal_local_tool",
23774
+ "multi_user_collaboration",
23775
+ "content_marketing_site",
23776
+ "data_visualization_site"
23777
+ ].includes(decision.needType);
23778
+ }
23779
+ function buildPmGateClarification(decision) {
23780
+ const questions = questionsForDecision(decision);
23781
+ return {
23782
+ missingFields: questions.map((question) => question.field),
23783
+ questions,
23784
+ defaultAssumptions: Object.fromEntries(questions.map((question) => [question.field, question.defaultAssumption]))
23785
+ };
23786
+ }
23787
+ function buildPmGateReadiness(decision, readiness) {
23788
+ const draftReadyNeed = decision.needType === "personal_local_tool" || decision.needType === "content_marketing_site" || decision.needType === "data_visualization_site";
23789
+ if (!draftReadyNeed) return readiness;
23790
+ return {
23791
+ ...readiness,
23792
+ score: Math.max(readiness.score, 64),
23793
+ status: "Draft Ready"
23794
+ };
23795
+ }
23796
+ function formatPmGateInterrogateResult(decision, readiness, clarification) {
23797
+ const canDraft = readiness.status !== "Not Ready";
23798
+ const nextStep = decision.needType === "personal_local_tool" ? "\u53EF\u4EE5\u6309\u9ED8\u8BA4\u5047\u8BBE\u76F4\u63A5\u8FDB\u5165 spec_compile \u751F\u6210 MVP \u8349\u6848\uFF1B\u5982\u679C\u8981\u95EE\u7528\u6237\uFF0C\u6700\u591A\u53EA\u95EE\u4E00\u53E5\uFF1A\u662F\u5426\u6309\u6D4F\u89C8\u5668\u672C\u5730\u4FDD\u5B58\u3001\u4E0D\u767B\u5F55\u4E0D\u505A\u540E\u53F0\u3001\u9875\u9762\u5185\u63D0\u9192\u7EE7\u7EED\uFF1F" : canDraft ? "\u53EF\u4EE5\u6309\u9ED8\u8BA4\u5047\u8BBE\u751F\u6210\u8349\u6848\uFF0C\u540C\u65F6\u53EA\u786E\u8BA4\u4F1A\u6539\u53D8\u67B6\u6784\u7684\u8FB9\u754C\u95EE\u9898\u3002" : "\u5148\u786E\u8BA4\u4F1A\u6539\u53D8\u67B6\u6784\u7684\u8FB9\u754C\u95EE\u9898\uFF0C\u518D\u8FDB\u5165 spec_compile\u3002";
23799
+ return `# PM Gate \u5224\u65AD\uFF1A${needTypeTitle(decision.needType)}
23800
+
23801
+ - **\u9700\u6C42\u95E8:** ${decision.needType}
23802
+ - **\u4F7F\u7528\u8303\u56F4:** ${decision.usageScope}
23803
+ - **\u7EF4\u62A4\u65B9\u5F0F:** ${decision.maintenanceMode}
23804
+ - **\u8BBF\u95EE\u65B9\u5F0F:** ${decision.accessTopology}
23805
+ - **\u6280\u672F\u5F62\u6001:** ${decision.technicalShape}
23806
+ - **\u63A8\u8350\u90E8\u7F72:** ${decision.recommendedDeployment}
23807
+ - **\u5F3A\u4FE1\u53F7:** ${decision.strongSignals.join("\u3001") || "\u65E0"}
23808
+ - **\u5F31\u4FE1\u53F7:** ${decision.weakSignals.join("\u3001") || "\u65E0"}
23809
+ - **\u4E0D\u8981\u9ED8\u8BA4\u4F7F\u7528:** ${decision.mustNotUse.join("\u3001") || "\u65E0"}
23810
+
23811
+ ${decision.defaultAssumptions.map((item) => `- ${item}`).join("\n")}
23812
+
23813
+ > \u5148\u786E\u8BA4\u4F7F\u7528\u8303\u56F4\u3001\u7EF4\u62A4\u65B9\u5F0F\u548C\u8BBF\u95EE\u8FB9\u754C\uFF1B\u4E0D\u8981\u5957\u7528\u65E0\u5173 domain \u6A21\u677F\u3002
23814
+
23815
+ ## \u53EF\u6267\u884C\u72B6\u6001
23816
+
23817
+ - **Score:** ${readiness.score} / 100
23818
+ - **\u72B6\u6001:** ${readiness.status}
23819
+ - **\u4E0B\u4E00\u6B65:** ${nextStep}
23820
+
23821
+ ## \u8FB9\u754C\u95EE\u9898
23822
+
23823
+ ${clarification.questions.map(formatQuestion).join("\n\n")}
23824
+
23825
+ ## \u9ED8\u8BA4\u5047\u8BBE
23826
+
23827
+ ${Object.entries(clarification.defaultAssumptions).map(([field, value]) => `- **${field}:** ${value}`).join("\n")}`;
23828
+ }
23829
+ function formatQuestion(question) {
23830
+ return `### ${question.question}
23831
+ - **\u4E3E\u4E2A\u4F8B\u5B50:** ${question.example || "\u6309\u7528\u6237\u539F\u8BDD\u8865\u5145\u5373\u53EF\u3002"}
23832
+ - **\u4E3A\u4EC0\u4E48\u8981\u95EE:** ${question.whyImportant}
23833
+ - **\u63A8\u8350\u9009\u9879:** ${question.options.join(" / ")}
23834
+ - **\u9ED8\u8BA4\u5047\u8BBE:** \u5982\u679C\u4E0D\u56DE\u7B54\uFF0C\u9ED8\u8BA4\u4E3A\u300C${question.defaultAssumption}\u300D`;
23835
+ }
23836
+ function questionsForDecision(decision) {
23837
+ switch (decision.needType) {
23838
+ case "personal_local_tool":
23839
+ return personalLocalToolQuestions();
23840
+ case "multi_user_collaboration":
23841
+ return multiUserCollaborationQuestions();
23842
+ case "content_marketing_site":
23843
+ return contentMarketingQuestions();
23844
+ case "data_visualization_site":
23845
+ return dataVisualizationQuestions();
23846
+ default:
23847
+ return [];
23848
+ }
23849
+ }
23850
+ function personalLocalToolQuestions() {
23851
+ return [
23852
+ {
23853
+ field: "record_fields",
23854
+ question: "\u6BCF\u6761\u8BB0\u5F55\u8981\u4FDD\u5B58\u54EA\u4E9B\u4FE1\u606F\uFF1F",
23855
+ example: "\u6BD4\u5982\u836F\u54C1\u540D\u3001\u5206\u7C7B\u3001\u6570\u91CF\u3001\u5355\u4F4D\u3001\u6709\u6548\u671F\u3001\u5B58\u653E\u4F4D\u7F6E\u3001\u72B6\u6001\u3001\u5907\u6CE8\u3002",
23856
+ whyImportant: "\u51B3\u5B9A\u8868\u5355\u5B57\u6BB5\u3001\u5217\u8868\u5217\u548C\u63D0\u9192\u8BA1\u7B97\uFF0C\u4E0D\u9700\u8981\u56E0\u6B64\u5347\u7EA7\u5230\u540E\u53F0\u3002",
23857
+ options: ["\u540D\u79F0 + \u65E5\u671F + \u72B6\u6001 + \u5907\u6CE8", "\u518D\u52A0\u6570\u91CF/\u5355\u4F4D/\u5206\u7C7B/\u4F4D\u7F6E", "\u6211\u4F1A\u81EA\u5B9A\u4E49\u5B57\u6BB5"],
23858
+ defaultAssumption: "\u540D\u79F0\u3001\u65E5\u671F\u3001\u72B6\u6001\u3001\u5907\u6CE8\uFF1B\u836F\u54C1\u7C7B\u9ED8\u8BA4\u518D\u52A0\u6570\u91CF\u3001\u5206\u7C7B\u548C\u5B58\u653E\u4F4D\u7F6E",
23859
+ priority: "P0"
23860
+ },
23861
+ {
23862
+ field: "data_storage",
23863
+ question: "\u6570\u636E\u4FDD\u5B58\u5728\u54EA\u91CC\uFF1F",
23864
+ example: "\u6BD4\u5982\u6D4F\u89C8\u5668 localStorage\uFF0C\u672C\u673A JSON \u5907\u4EFD\uFF0C\u6216\u4EE5\u540E\u518D\u8003\u8651\u591A\u4EBA\u540C\u6B65\u3002",
23865
+ whyImportant: "\u4E2A\u4EBA\u6216\u5BB6\u5EAD\u81EA\u7528\u5DE5\u5177\u9ED8\u8BA4\u4E0D\u9700\u8981\u670D\u52A1\u5668\u6570\u636E\u5E93\u3002",
23866
+ options: ["\u6D4F\u89C8\u5668 localStorage", "JSON/CSV \u5BFC\u5165\u5BFC\u51FA\u5907\u4EFD", "\u4EE5\u540E\u518D\u8003\u8651\u591A\u4EBA\u540C\u6B65"],
23867
+ defaultAssumption: "\u6D4F\u89C8\u5668 localStorage\uFF0C\u652F\u6301 JSON \u5BFC\u5165\u5BFC\u51FA\u5907\u4EFD",
23868
+ priority: "P0"
23869
+ },
23870
+ {
23871
+ field: "operations",
23872
+ question: "\u7B2C\u4E00\u7248\u9700\u8981\u54EA\u4E9B\u64CD\u4F5C\uFF1F",
23873
+ example: "\u6BD4\u5982\u65B0\u589E\u3001\u7F16\u8F91\u3001\u5220\u9664\u3001\u641C\u7D22\u7B5B\u9009\u3001\u4E34\u671F/\u8FC7\u671F\u72B6\u6001\u5217\u8868\u3002",
23874
+ whyImportant: "\u9501\u5B9A MVP\uFF0C\u4E0D\u628A\u6E05\u5355\u5DE5\u5177\u6269\u6210\u540E\u53F0\u7CFB\u7EDF\u3002",
23875
+ options: ["\u65B0\u589E/\u7F16\u8F91/\u5220\u9664 + \u641C\u7D22\u7B5B\u9009", "\u518D\u52A0\u4E34\u671F/\u8FC7\u671F\u63D0\u9192", "\u518D\u52A0\u7EDF\u8BA1\u548C\u5BFC\u5165\u5BFC\u51FA"],
23876
+ defaultAssumption: "\u65B0\u589E/\u7F16\u8F91/\u5220\u9664 + \u641C\u7D22\u7B5B\u9009 + \u9875\u9762\u5185\u4E34\u671F/\u8FC7\u671F\u63D0\u9192",
23877
+ priority: "P0"
23878
+ },
23879
+ {
23880
+ field: "account_scope",
23881
+ question: "\u9700\u8981\u767B\u5F55\u3001\u540E\u53F0\u6216\u7BA1\u7406\u5458\u5417\uFF1F",
23882
+ example: "\u6BD4\u5982\u5B8C\u5168\u4E0D\u7528\u767B\u5F55\uFF0C\u5BB6\u5EAD\u7535\u8111\u672C\u5730\u7528\uFF1B\u6216\u4EE5\u540E\u518D\u505A\u591A\u4EBA\u8D26\u53F7\u3002",
23883
+ whyImportant: "\u51B3\u5B9A\u662F\u5426\u5F15\u5165\u540E\u7AEF\u3001\u9274\u6743\u548C\u670D\u52A1\u5668\u6210\u672C\u3002",
23884
+ options: ["\u4E0D\u9700\u8981\uFF0C\u6D4F\u89C8\u5668\u672C\u5730\u7528", "\u53EA\u52A0\u672C\u5730\u8BBF\u95EE\u5BC6\u7801", "\u9700\u8981\u591A\u4EBA\u8D26\u53F7/\u540E\u53F0"],
23885
+ defaultAssumption: "\u4E0D\u9700\u8981\u767B\u5F55\u3001\u540E\u53F0\u6216\u7BA1\u7406\u5458",
23886
+ priority: "P0"
23887
+ }
23888
+ ];
23889
+ }
23890
+ function multiUserCollaborationQuestions() {
23891
+ return [
23892
+ {
23893
+ field: "access_topology",
23894
+ question: "\u4F60\u4EEC\u53EA\u5728\u540C\u4E00 Wi-Fi/\u5C40\u57DF\u7F51\u4F7F\u7528\uFF0C\u8FD8\u662F\u5916\u51FA\u4E5F\u8981\u8BBF\u95EE\uFF1F",
23895
+ example: "\u6BD4\u5982\u5BBF\u820D\u540C\u4E00 Wi-Fi \u5185\u7528\uFF0C\u6216\u4EBA\u5728\u5916\u9762\u4E5F\u8981\u7528\u624B\u673A\u6253\u5F00\u3002",
23896
+ whyImportant: "\u5148\u51B3\u5B9A\u672C\u5730\u5C40\u57DF\u7F51\u670D\u52A1\u3001\u4F4E\u4EF7 VPS\uFF0C\u8FD8\u662F\u57DF\u540D + HTTPS\u3002",
23897
+ options: ["\u53EA\u5728\u540C\u4E00 Wi-Fi/\u5C40\u57DF\u7F51", "\u5916\u51FA\u4E5F\u8981\u8BBF\u95EE", "\u8981\u6B63\u5F0F\u57DF\u540D + HTTPS"],
23898
+ defaultAssumption: "\u5148\u786E\u8BA4\u8BBF\u95EE\u8303\u56F4\uFF0C\u4E0D\u76F4\u63A5\u9ED8\u8BA4\u516C\u7F51\u670D\u52A1\u5668",
23899
+ priority: "P0"
23900
+ },
23901
+ {
23902
+ field: "public_ip_acceptance",
23903
+ question: "\u5982\u679C\u5916\u51FA\u4E5F\u8981\u8BBF\u95EE\uFF0C\u80FD\u5426\u63A5\u53D7\u5148\u7528\u51E0\u5341\u5143/\u5E74\u7684\u516C\u7F51 VPS + IP \u5730\u5740\uFF1F",
23904
+ example: "\u6BD4\u5982\u5148\u901A\u8FC7 http://\u670D\u52A1\u5668IP \u6253\u5F00\uFF0C\u8DD1\u901A\u540E\u518D\u8003\u8651\u57DF\u540D\u548C\u5907\u6848\u3002",
23905
+ whyImportant: "\u56FA\u5B9A\u5C0F\u56E2\u961F MVP \u53EF\u4EE5\u5148\u907F\u5F00\u57DF\u540D\u3001\u8BC1\u4E66\u3001\u5907\u6848\u548C\u590D\u6742\u8FD0\u7EF4\u3002",
23906
+ options: ["\u80FD\u63A5\u53D7 IP \u8BBF\u95EE", "\u5FC5\u987B\u57DF\u540D + HTTPS", "\u5148\u53EA\u505A\u5C40\u57DF\u7F51"],
23907
+ defaultAssumption: "\u56FA\u5B9A\u5C0F\u7EC4\u5916\u51FA\u8BBF\u95EE\u65F6\uFF0C\u9ED8\u8BA4\u4F4E\u4EF7 VPS + SQLite + IP \u5730\u5740",
23908
+ priority: "P0"
23909
+ },
23910
+ {
23911
+ field: "claim_rule",
23912
+ question: "\u522B\u4EBA\u5B89\u6392\u7ED9\u6211\u7684\u4EFB\u52A1\uFF0C\u5FC5\u987B\u6211\u8BA4\u9886\u540E\u624D\u8FDB\u5165\u65E5\u7A0B\u5417\uFF1F",
23913
+ example: "\u6BD4\u5982\u5BA4\u53CB\u5B89\u6392\u540E\u5148\u663E\u793A\u5F85\u8BA4\u9886\uFF0C\u81EA\u5DF1\u7ED9\u81EA\u5DF1\u7684\u4EFB\u52A1\u76F4\u63A5\u751F\u6548\u3002",
23914
+ whyImportant: "\u51B3\u5B9A\u4EFB\u52A1\u72B6\u6001\u673A\u548C\u901A\u77E5/\u63D0\u9192\u903B\u8F91\u3002",
23915
+ options: ["\u5FC5\u987B\u8BA4\u9886\u540E\u751F\u6548", "\u521B\u5EFA\u540E\u8FDB\u5165\u5BF9\u65B9\u65E5\u7A0B\u4F46\u6807\u5F85\u786E\u8BA4", "\u521B\u5EFA\u540E\u76F4\u63A5\u751F\u6548"],
23916
+ defaultAssumption: "\u522B\u4EBA\u5B89\u6392\u7684\u4EFB\u52A1\u9700\u8981\u8BA4\u9886\uFF1B\u81EA\u5DF1\u5B89\u6392\u7ED9\u81EA\u5DF1\u7684\u4EFB\u52A1\u76F4\u63A5\u751F\u6548",
23917
+ priority: "P0"
23918
+ },
23919
+ {
23920
+ field: "time_conflict_rule",
23921
+ question: "\u540C\u4E00\u65F6\u95F4\u591A\u4E2A\u4EFB\u52A1\u51B2\u7A81\u65F6\uFF0C\u662F\u5E76\u6392\u5C55\u793A\u9AD8\u4EAE\uFF0C\u8FD8\u662F\u76F4\u63A5\u963B\u6B62\u5B89\u6392\uFF1F",
23922
+ example: "\u6BD4\u5982\u540C\u4E00\u5C0F\u65F6\u4E24\u4E2A\u4EFB\u52A1\u90FD\u663E\u793A\u5728\u65E5\u7A0B\u683C\u5B50\u91CC\uFF0C\u5E76\u7528\u7EA2\u8272\u63D0\u793A\u51B2\u7A81\u3002",
23923
+ whyImportant: "\u51B3\u5B9A\u65E5\u7A0B\u89C6\u56FE\u4EA4\u4E92\uFF0C\u662F\u63D0\u9192\u578B\u8FD8\u662F\u62E6\u622A\u578B\u3002",
23924
+ options: ["\u5E76\u6392\u5C55\u793A + \u9AD8\u4EAE\u51B2\u7A81", "\u963B\u6B62\u5B89\u6392", "\u53EA\u63D0\u793A\u4F46\u5141\u8BB8\u4FDD\u5B58"],
23925
+ defaultAssumption: "\u5E76\u6392\u5C55\u793A\u5E76\u9AD8\u4EAE\u51B2\u7A81\uFF0C\u4E0D\u9ED8\u8BA4\u963B\u6B62\u5B89\u6392",
23926
+ priority: "P1"
23927
+ }
23928
+ ];
23929
+ }
23930
+ function contentMarketingQuestions() {
23931
+ return [
23932
+ {
23933
+ field: "maintenance_mode",
23934
+ question: "\u5185\u5BB9\u66F4\u65B0\u662F\u4EA4\u7ED9 Agent \u6539\u6587\u4EF6\u5E76\u91CD\u65B0\u90E8\u7F72\uFF0C\u8FD8\u662F\u9700\u8981\u4F60\u5728\u7F51\u9875\u540E\u53F0\u81EA\u5DF1\u7F16\u8F91\uFF1F",
23935
+ example: "\u6BD4\u5982\u4F60\u628A\u65B0\u7167\u7247\u548C\u4FC3\u9500\u6587\u6848\u53D1\u7ED9 Agent\uFF1B\u6216\u7F51\u9875\u91CC\u767B\u5F55\u540E\u4E0A\u4F20\u56FE\u7247\u3002",
23936
+ whyImportant: "\u5185\u5BB9\u7ECF\u5E38\u6539\u4E0D\u7B49\u4E8E\u5FC5\u987B\u505A\u540E\u53F0\u3002",
23937
+ options: ["Agent \u4EE3\u7EF4\u62A4\u5E76\u91CD\u65B0\u90E8\u7F72", "\u6211\u624B\u52A8\u6539 Markdown/data.json", "\u7F51\u9875\u540E\u53F0\u7F16\u8F91\u548C\u4E0A\u4F20"],
23938
+ defaultAssumption: "\u5148\u6309 Agent \u4EE3\u7EF4\u62A4\u5185\u5BB9\u6587\u4EF6\u5E76\u91CD\u65B0\u90E8\u7F72",
23939
+ priority: "P0"
23940
+ },
23941
+ {
23942
+ field: "visitor_submission",
23943
+ question: "\u8BBF\u5BA2\u9700\u8981\u5728\u7F51\u7AD9\u4E0A\u63D0\u4EA4\u53CD\u9988\u3001\u9884\u7EA6\u6216\u62A5\u540D\u5417\uFF1F",
23944
+ example: "\u6BD4\u5982\u7528\u6237\u8BC4\u4EF7\u53EA\u662F\u4F60\u6574\u7406\u540E\u5C55\u793A\uFF0C\u8FD8\u662F\u8BBF\u5BA2\u80FD\u76F4\u63A5\u63D0\u4EA4\u8868\u5355\u3002",
23945
+ whyImportant: "\u8BBF\u5BA2\u63D0\u4EA4\u4F1A\u89E6\u53D1\u540E\u7AEF\u3001\u5BA1\u6838\u3001\u9632\u5783\u573E\u548C\u901A\u77E5\u3002",
23946
+ options: ["\u4E0D\u9700\u8981\u8BBF\u5BA2\u63D0\u4EA4", "\u53EA\u5C55\u793A\u4F60\u6574\u7406\u7684\u53CD\u9988", "\u9700\u8981\u8BBF\u5BA2\u5728\u7EBF\u63D0\u4EA4"],
23947
+ defaultAssumption: "\u4E0D\u505A\u8BBF\u5BA2\u63D0\u4EA4\uFF0C\u53EA\u5C55\u793A\u7EF4\u62A4\u540E\u7684\u5185\u5BB9",
23948
+ priority: "P0"
23949
+ },
23950
+ {
23951
+ field: "geo_goal",
23952
+ question: "GEO/SEO \u91CD\u70B9\u670D\u52A1\u54EA\u4E2A\u672C\u5730\u66DD\u5149\u76EE\u6807\uFF1F",
23953
+ example: "\u6BD4\u5982\u9644\u8FD1\u5065\u8EAB\u623F\u641C\u7D22\u3001\u79C1\u6559\u5173\u952E\u8BCD\u3001\u56E2\u8BFE\u4FC3\u9500\u3001\u54C1\u724C\u95EE\u7B54\u3002",
23954
+ whyImportant: "\u51B3\u5B9A\u9875\u9762\u7ED3\u6784\u3001FAQ\u3001schema \u548C\u5185\u5BB9\u680F\u76EE\u4F18\u5148\u7EA7\u3002",
23955
+ options: ["\u672C\u5730\u641C\u7D22\u66DD\u5149", "\u95EE\u7B54\u5185\u5BB9\u8986\u76D6", "\u4FC3\u9500\u6D3B\u52A8\u8F6C\u5316"],
23956
+ defaultAssumption: "\u672C\u5730\u670D\u52A1\u5B98\u7F51 + FAQ + \u6559\u7EC3/\u8BFE\u7A0B/\u4FC3\u9500\u7ED3\u6784\u5316\u5185\u5BB9",
23957
+ priority: "P1"
23958
+ }
23959
+ ];
23960
+ }
23961
+ function dataVisualizationQuestions() {
23962
+ return [
23963
+ {
23964
+ field: "data_update_mode",
23965
+ question: "\u65B0 xlsx \u662F\u4EA4\u7ED9 Agent \u66F4\u65B0\u7F51\u7AD9\uFF0C\u8FD8\u662F\u7F51\u7AD9\u91CC\u8981\u6709\u4E0A\u4F20\u6309\u94AE\uFF1F",
23966
+ example: "\u6BD4\u5982\u6BCF\u6B21\u628A Excel \u53D1\u7ED9 Agent \u91CD\u65B0\u751F\u6210 data.json\uFF0C\u6216\u7528\u6237\u5728\u7F51\u9875\u91CC\u4E0A\u4F20\u3002",
23967
+ whyImportant: "Agent \u66F4\u65B0\u53EF\u4EE5\u4FDD\u6301\u9759\u6001\u7AD9\uFF1B\u7F51\u9875\u4E0A\u4F20\u624D\u9700\u8981\u66F4\u591A\u8FD0\u884C\u65F6\u903B\u8F91\u3002",
23968
+ options: ["\u4EA4\u7ED9 Agent \u66F4\u65B0\u5E76\u91CD\u65B0\u90E8\u7F72", "\u6D4F\u89C8\u5668\u5185\u4E0A\u4F20\u89E3\u6790", "\u540E\u7AEF\u7EDF\u4E00\u4E0A\u4F20\u4FDD\u5B58"],
23969
+ defaultAssumption: "Agent \u89E3\u6790 xlsx \u751F\u6210 data.json/chart config\uFF0C\u518D\u91CD\u65B0\u90E8\u7F72\u9759\u6001\u56FE\u8868\u7AD9",
23970
+ priority: "P0"
23971
+ },
23972
+ {
23973
+ field: "audience_scope",
23974
+ question: "\u56FE\u8868\u53EA\u7ED9\u81EA\u5DF1\u770B\uFF0C\u8FD8\u662F\u516C\u5F00\u7ED9\u522B\u4EBA\u770B\uFF1F",
23975
+ example: "\u6BD4\u5982\u672C\u5730\u6253\u5F00\u67E5\u770B\uFF0C\u6216\u90E8\u7F72\u5230\u516C\u5F00\u7F51\u5740\u7ED9\u5BA2\u6237/\u56E2\u961F\u770B\u3002",
23976
+ whyImportant: "\u51B3\u5B9A\u90E8\u7F72\u3001\u6743\u9650\u548C\u662F\u5426\u9700\u8981\u7EDF\u4E00\u5728\u7EBF\u6570\u636E\u6E90\u3002",
23977
+ options: ["\u53EA\u7ED9\u81EA\u5DF1\u770B", "\u516C\u5F00\u53EA\u8BFB\u5C55\u793A", "\u56FA\u5B9A\u56E2\u961F\u53EF\u8BBF\u95EE"],
23978
+ defaultAssumption: "\u9ED8\u8BA4\u9759\u6001\u53EA\u8BFB\u5C55\u793A\uFF0C\u4E0D\u9ED8\u8BA4\u767B\u5F55\u548C\u540E\u53F0",
23979
+ priority: "P0"
23980
+ },
23981
+ {
23982
+ field: "history_versions",
23983
+ question: "\u9700\u8981\u4FDD\u7559\u5386\u53F2\u7248\u672C\uFF0C\u8FD8\u662F\u53EA\u5C55\u793A\u6700\u65B0\u7ED3\u679C\uFF1F",
23984
+ example: "\u6BD4\u5982\u53EA\u66FF\u6362\u6700\u65B0\u6570\u636E\uFF0C\u6216\u4FDD\u7559\u6BCF\u6708 Excel \u5BF9\u6BD4\u8D8B\u52BF\u3002",
23985
+ whyImportant: "\u51B3\u5B9A\u6570\u636E\u6587\u4EF6\u7ED3\u6784\u548C\u662F\u5426\u9700\u8981\u7248\u672C\u7BA1\u7406\u3002",
23986
+ options: ["\u53EA\u5C55\u793A\u6700\u65B0", "\u4FDD\u7559\u5386\u53F2\u7248\u672C", "\u540E\u7EED\u518D\u52A0"],
23987
+ defaultAssumption: "MVP \u53EA\u5C55\u793A\u6700\u65B0\u7ED3\u679C",
23988
+ priority: "P1"
23989
+ }
23990
+ ];
23991
+ }
23992
+ function needTypeTitle(needType) {
23993
+ const titles = {
23994
+ static_display: "\u9759\u6001\u5C55\u793A\u7F51\u7AD9",
23995
+ personal_local_tool: "\u4E2A\u4EBA\u672C\u5730\u5DE5\u5177",
23996
+ multi_user_collaboration: "\u591A\u4EBA\u534F\u4F5C\u5DE5\u5177",
23997
+ content_marketing_site: "\u5185\u5BB9\u8425\u9500\u7F51\u7AD9",
23998
+ data_visualization_site: "\u6570\u636E\u56FE\u8868\u7F51\u7AD9",
23999
+ transaction_workflow: "\u4EA4\u6613/\u5C65\u7EA6\u6D41\u7A0B",
24000
+ content_knowledge: "\u5185\u5BB9/\u77E5\u8BC6\u7BA1\u7406",
24001
+ ai_automation: "AI \u81EA\u52A8\u5316\u4EA7\u54C1",
24002
+ unknown: "\u4EA7\u54C1\u5F00\u53D1"
24003
+ };
24004
+ return titles[needType];
24005
+ }
24006
+
24007
+ // src/tools/specInterrogate.ts
24008
+ function registerSpecInterrogate(server) {
24009
+ const handler = async (input) => {
24010
+ const readiness = calculateReadiness(input.raw_idea, input.known_context);
24011
+ const technicalProfile = buildTechnicalProfile(input.raw_idea, input.known_context || {});
24012
+ const pmIntentDecision = decidePmIntent(input.raw_idea, input.known_context || {});
24013
+ const usePmGate = input.scenario !== "modify_ui" && shouldUsePmGateClarification(pmIntentDecision);
24014
+ const effectiveReadiness = usePmGate ? buildPmGateReadiness(pmIntentDecision, readiness) : readiness;
24015
+ const clarification = usePmGate ? buildPmGateClarification(pmIntentDecision) : generateClarification(
24016
+ input.raw_idea,
24017
+ effectiveReadiness,
24018
+ input.scenario,
24019
+ input.target_platform,
24020
+ input.strictness,
24021
+ input.known_context
24022
+ );
24023
+ const markdown = usePmGate ? formatPmGateInterrogateResult(pmIntentDecision, effectiveReadiness, clarification) : formatInterrogateResult(effectiveReadiness, clarification);
24024
+ const structuredContent = buildInterrogateStructuredOutput(
24025
+ effectiveReadiness,
24026
+ clarification,
24027
+ technicalProfile,
24028
+ usePmGate ? pmIntentDecision : void 0
24029
+ );
24030
+ return {
24031
+ content: [{ type: "text", text: markdown }],
24032
+ structuredContent
24033
+ };
24034
+ };
24035
+ server.registerTool(
24036
+ "spec_interrogate",
24037
+ {
24038
+ title: "\u9700\u6C42\u8FFD\u95EE",
24039
+ description: "\u5206\u6790\u7528\u6237\u7684\u539F\u59CB idea \u6216\u9875\u9762\u4FEE\u6539\u9700\u6C42\uFF0C\u5224\u65AD\u4FE1\u606F\u662F\u5426\u8DB3\u591F\u8FDB\u5165\u5F00\u53D1\u9636\u6BB5\u3002\u5F53\u4FE1\u606F\u7F3A\u5931\u8F83\u591A\u65F6\uFF0C\u8F93\u51FA\u8FFD\u95EE\u95EE\u9898\u6E05\u5355\u3002",
24040
+ inputSchema: SpecInterrogateInputSchema.shape,
24041
+ outputSchema: SpecInterrogateOutputSchema.shape
24042
+ },
24043
+ handler
24044
+ );
24045
+ }
24046
+
24047
+ // src/schemas/coercion.ts
24048
+ var looseBoolean = external_exports.preprocess((value) => {
24049
+ if (typeof value !== "string") return value;
24050
+ const normalized = value.trim().toLowerCase();
24051
+ if (normalized === "true") return true;
24052
+ if (normalized === "false") return false;
24053
+ return value;
24054
+ }, external_exports.boolean());
24055
+ var looseNumber = external_exports.preprocess((value) => {
24056
+ if (typeof value !== "string") return value;
24057
+ const normalized = value.trim();
24058
+ if (normalized === "") return value;
24059
+ const parsed = Number(normalized);
24060
+ return Number.isFinite(parsed) ? parsed : value;
24061
+ }, external_exports.number());
24062
+ function looseStringArray(description) {
24063
+ return external_exports.preprocess((value) => {
24064
+ if (Array.isArray(value)) return value;
24065
+ if (value && typeof value === "object" && "item" in value && Array.isArray(value.item)) {
24066
+ return value.item;
24067
+ }
24068
+ return value;
24069
+ }, external_exports.array(external_exports.string())).describe(description);
24070
+ }
24071
+
24072
+ // src/schemas/specCompile.schema.ts
24073
+ var SpecCompileInputSchema = external_exports.object({
24074
+ raw_idea: external_exports.string().describe("\u7528\u6237\u539F\u59CB\u60F3\u6CD5"),
24075
+ answers: external_exports.record(external_exports.string(), external_exports.any()).optional().describe("\u7528\u6237\u5BF9\u8FFD\u95EE\u7684\u56DE\u7B54"),
24076
+ allow_assumptions: external_exports.union([external_exports.boolean(), looseBoolean]).optional().default(true).describe("\u662F\u5426\u5141\u8BB8\u4F7F\u7528\u9ED8\u8BA4\u5047\u8BBE"),
24077
+ min_readiness_score: external_exports.union([external_exports.number(), looseNumber]).optional().default(70).describe("\u6700\u4F4E\u53EF\u63A5\u53D7\u7684 readiness \u5206\u6570")
23577
24078
  });
23578
24079
 
23579
24080
  // src/schemas/outputs/specCompile.output.ts
@@ -23701,234 +24202,6 @@ function addIf(items, label, condition) {
23701
24202
  if (condition) items.push(label);
23702
24203
  }
23703
24204
 
23704
- // src/core/pmIntentGate.ts
23705
- function decidePmIntent(rawText, context = {}) {
23706
- const text = `${rawText} ${JSON.stringify(context)}`;
23707
- const strongSignals = collectSignals(text, strongSignalMap);
23708
- const weakSignals = collectSignals(text, weakSignalMap);
23709
- const usageScope = decideUsageScope(text);
23710
- const preliminaryNeedType = decideNeedType(text, strongSignals);
23711
- const maintenanceMode = decideMaintenanceMode(text, preliminaryNeedType);
23712
- const accessTopology = decideAccessTopology(text, usageScope, maintenanceMode);
23713
- const needType = preliminaryNeedType;
23714
- const technicalShape = decideTechnicalShape(text, needType, maintenanceMode);
23715
- const recommendedDeployment = decideRecommendedDeployment(needType, technicalShape, maintenanceMode, accessTopology);
23716
- const route = decideRoute(needType, technicalShape, maintenanceMode);
23717
- const confidence = decideConfidence(needType, strongSignals, weakSignals);
23718
- return enforceHardRules({
23719
- needType,
23720
- usageScope,
23721
- maintenanceMode,
23722
- accessTopology,
23723
- technicalShape,
23724
- recommendedDeployment,
23725
- route,
23726
- confidence,
23727
- strongSignals,
23728
- weakSignals,
23729
- coreObjects: extractCoreObjects(text, needType),
23730
- states: extractStates(text, needType),
23731
- actions: extractActions(text, needType),
23732
- mustNotUse: buildMustNotUse(needType, maintenanceMode),
23733
- boundaryQuestionIds: buildBoundaryQuestionIds(needType, maintenanceMode, accessTopology),
23734
- defaultAssumptions: buildDefaultAssumptions(needType, usageScope, maintenanceMode, accessTopology, recommendedDeployment),
23735
- source: "local_rule"
23736
- });
23737
- }
23738
- function decideNeedType(text, strongSignals) {
23739
- if (hasAny2(text, ["AI", "ai", "LLM", "llm", "GPT", "gpt", "\u5927\u6A21\u578B", "\u6A21\u578B\u63A5\u53E3", "API Key", "DeepSeek", "OpenAI"]) && !isNegated(text, ["AI", "\u6A21\u578B"])) {
23740
- return "ai_automation";
23741
- }
23742
- if (hasAny2(text, ["\u652F\u4ED8", "\u8BA2\u5355", "\u552E\u5356", "\u8D2D\u4E70", "\u62A5\u540D", "\u9884\u7EA6", "\u6536\u6B3E", "\u5BFC\u51FA Excel", "\u5BFC\u51FA"])) {
23743
- return "transaction_workflow";
23744
- }
23745
- if (hasAny2(text, ["\u591A\u4EBA", "\u5BA4\u53CB", "\u5BB6\u4EBA\u5171\u7528", "\u5171\u7528", "\u5171\u4EAB", "\u534F\u4F5C", "\u76F8\u4E92\u5B89\u6392", "\u8BA4\u9886", "\u5206\u914D\u4EFB\u52A1", "\u56E2\u961F\u5F85\u529E"])) {
23746
- return "multi_user_collaboration";
23747
- }
23748
- if (hasAny2(text, ["xlsx", "XLSX", "Excel", "csv", "CSV", "\u56FE\u8868", "\u6570\u636E\u6E32\u67D3", "\u53EF\u89C6\u5316", "\u4EEA\u8868\u76D8"]) && hasAny2(text, ["\u6587\u4EF6", "\u6570\u636E", "\u6E32\u67D3", "\u56FE\u8868", "\u4E0A\u4F20", "\u63D0\u4F9B"])) {
23749
- return "data_visualization_site";
23750
- }
23751
- if (hasAny2(text, ["\u5065\u8EAB\u623F", "\u9910\u5385", "\u5496\u5561\u5E97", "\u5DE5\u4F5C\u5BA4", "\u95E8\u5E97", "\u672C\u5730\u670D\u52A1", "GEO", "geo", "SEO", "seo", "\u4FC3\u9500", "\u6559\u7EC3", "Q&A", "FAQ", "\u7167\u7247", "\u7528\u6237\u53CD\u9988"])) {
23752
- return "content_marketing_site";
23753
- }
23754
- if (hasAny2(text, ["\u77E5\u8BC6\u5E93", "\u6587\u6863\u7BA1\u7406", "\u8D44\u6599\u5E93", "\u56E2\u961F\u6587\u6863"])) {
23755
- return "content_knowledge";
23756
- }
23757
- if (hasAny2(text, ["\u836F\u54C1", "\u98DF\u6750", "\u8BFB\u4E66", "\u8BA2\u9605", "\u690D\u7269", "\u88C5\u5907", "\u6E05\u5355", "\u8BB0\u5F55", "\u63D0\u9192", "\u5E93\u5B58", "\u4FDD\u8D28\u671F"]) && !strongSignals.includes("\u591A\u4EBA")) {
23758
- return "personal_local_tool";
23759
- }
23760
- if (hasAny2(text, ["\u4F5C\u54C1\u96C6", "\u4E2A\u4EBA\u4E3B\u9875", "\u5B98\u7F51", "\u4ECB\u7ECD\u9875", "\u516C\u53F8\u4ECB\u7ECD", "\u8054\u7CFB\u65B9\u5F0F"]) && !hasAny2(text, ["\u63D0\u4EA4", "\u4E0A\u4F20", "\u7F16\u8F91", "\u7EF4\u62A4", "\u6570\u636E", "\u4EFB\u52A1", "\u8BA4\u9886"])) {
23761
- return "static_display";
23762
- }
23763
- return "unknown";
23764
- }
23765
- function decideUsageScope(text) {
23766
- if (hasAny2(text, ["\u516C\u5F00", "\u8BBF\u5BA2", "\u5BA2\u6237", "\u7528\u6237", "\u4F1A\u5458", "\u5B98\u7F51", "\u7F51\u7AD9", "\u95E8\u5E97", "\u5065\u8EAB\u623F", "\u9910\u5385", "\u5DE5\u4F5C\u5BA4"])) return "public_audience";
23767
- if (hasAny2(text, ["\u591A\u4EBA", "\u5BA4\u53CB", "\u5BB6\u4EBA", "\u5BB6\u5EAD", "\u540C\u4E8B", "\u56E2\u961F", "\u5171\u7528", "\u5171\u4EAB"])) return "fixed_group";
23768
- if (hasAny2(text, ["\u81EA\u5DF1", "\u81EA\u7528", "\u4E2A\u4EBA", "\u6211\u7528", "\u6211\u81EA\u5DF1"])) return "self";
23769
- return "unknown";
23770
- }
23771
- function decideMaintenanceMode(text, needType) {
23772
- if (hasAny2(text, ["\u8BBF\u5BA2\u63D0\u4EA4", "\u7528\u6237\u63D0\u4EA4", "\u5728\u7EBF\u63D0\u4EA4", "\u63D0\u4EA4\u53CD\u9988", "\u63D0\u4EA4\u8BC4\u8BBA", "\u9884\u7EA6\u4F53\u9A8C", "\u62A5\u540D"])) return "visitor_submission";
23773
- if (hasAny2(text, ["\u8BA4\u9886", "\u76F8\u4E92\u5B89\u6392", "\u534F\u4F5C", "\u5206\u914D\u4EFB\u52A1", "\u591A\u4EBA\u4EFB\u52A1", "\u5171\u4EAB\u4EFB\u52A1"])) return "runtime_collaboration";
23774
- if (hasAny2(text, ["\u540E\u53F0", "\u7BA1\u7406\u540E\u53F0", "\u7F51\u9875\u91CC\u7F16\u8F91", "\u7F51\u9875\u4E0A\u4F20", "\u4E0A\u4F20\u6309\u94AE", "\u767B\u5F55\u540E\u7F16\u8F91", "CMS", "cms"])) return "web_admin";
23775
- if (hasAny2(text, ["data.json", "markdown", "Markdown", "md \u6587\u4EF6", "\u624B\u52A8\u6539\u6587\u4EF6"])) return "manual_files";
23776
- if (hasAny2(text, ["Agent", "agent", "\u6BCF\u6B21\u6211\u63D0\u4F9B", "\u6211\u63D0\u4F9B\u65B0\u7684", "\u4F20\u5F88\u591A", "\u4E0D\u5B9A\u671F\u7EF4\u62A4", "\u91CD\u65B0\u90E8\u7F72"])) return "agent_assisted";
23777
- if (needType === "content_marketing_site" || needType === "data_visualization_site" || needType === "static_display") return "agent_assisted";
23778
- return "unknown";
23779
- }
23780
- function decideAccessTopology(text, usageScope, maintenanceMode) {
23781
- if (hasAny2(text, ["\u540C\u4E00 Wi-Fi", "\u540C\u4E00\u4E2A Wi-Fi", "\u5C40\u57DF\u7F51", "\u5185\u7F51", "\u5BB6\u91CC\u7F51\u7EDC"])) return "lan_only";
23782
- if (hasAny2(text, ["\u5916\u51FA", "\u516C\u7F51 IP", "\u516C\u7F51ip", "IP \u5730\u5740", "\u670D\u52A1\u5668", "VPS", "vps"])) return "internet_ip";
23783
- if (hasAny2(text, ["\u57DF\u540D", "HTTPS", "https", "\u5907\u6848", "\u516C\u5F00\u7F51\u7AD9", "\u5B98\u7F51"])) return "public_domain";
23784
- if (usageScope === "self" && maintenanceMode !== "runtime_collaboration") return "single_device";
23785
- if (usageScope === "public_audience") return "public_domain";
23786
- return "unknown";
23787
- }
23788
- function decideTechnicalShape(text, needType, maintenanceMode) {
23789
- if (needType === "ai_automation") return "full_backend_saas";
23790
- if (needType === "transaction_workflow") return hasAny2(text, ["\u652F\u4ED8", "\u8BA2\u5355", "\u6536\u8D39"]) ? "full_backend_saas" : "light_backend_json_sqlite";
23791
- if (needType === "multi_user_collaboration") return "light_backend_json_sqlite";
23792
- if (needType === "content_marketing_site") {
23793
- return maintenanceMode === "web_admin" || maintenanceMode === "visitor_submission" ? "light_backend_json_sqlite" : "static_json_data_page";
23794
- }
23795
- if (needType === "data_visualization_site") {
23796
- return maintenanceMode === "web_admin" || maintenanceMode === "visitor_submission" ? "light_backend_json_sqlite" : "static_json_data_page";
23797
- }
23798
- if (needType === "content_knowledge") {
23799
- return maintenanceMode === "agent_assisted" || maintenanceMode === "manual_files" ? "static_json_data_page" : "light_backend_json_sqlite";
23800
- }
23801
- if (needType === "personal_local_tool") return "local_storage_tool";
23802
- if (needType === "static_display") return "static_page";
23803
- return "unknown";
23804
- }
23805
- function decideRecommendedDeployment(needType, technicalShape, maintenanceMode, accessTopology) {
23806
- if (technicalShape === "static_page") return "static_only";
23807
- if (technicalShape === "local_storage_tool" || technicalShape === "local_json_import_export") return "local_browser_only";
23808
- if (maintenanceMode === "agent_assisted" && ["content_marketing_site", "data_visualization_site", "content_knowledge"].includes(needType)) {
23809
- return "static_hosting_with_agent_updates";
23810
- }
23811
- if (accessTopology === "lan_only") return "local_lan_server_sqlite";
23812
- if (accessTopology === "internet_ip") return "cheap_vps_sqlite_by_ip";
23813
- if (accessTopology === "public_domain") return "vps_domain_https";
23814
- if (technicalShape === "light_backend_json_sqlite") return "unknown";
23815
- return "unknown";
23816
- }
23817
- function decideRoute(needType, technicalShape, maintenanceMode) {
23818
- if (needType === "personal_local_tool") return "spec_compile";
23819
- if (["static_page", "static_json_data_page"].includes(technicalShape) && maintenanceMode === "agent_assisted") return "spec_compile";
23820
- return "spec_interrogate";
23821
- }
23822
- function decideConfidence(needType, strongSignals, weakSignals) {
23823
- if (needType === "unknown") return "low";
23824
- if (strongSignals.length >= 2) return "high";
23825
- if (strongSignals.length === 1 || weakSignals.length >= 2) return "medium";
23826
- return "medium";
23827
- }
23828
- function enforceHardRules(decision) {
23829
- const hasRuntimeCollaboration = decision.needType === "multi_user_collaboration" || decision.maintenanceMode === "runtime_collaboration" || decision.strongSignals.some((signal) => ["\u591A\u4EBA", "\u5171\u4EAB", "\u534F\u4F5C", "\u8BA4\u9886", "\u76F8\u4E92\u5B89\u6392"].includes(signal));
23830
- if (hasRuntimeCollaboration && decision.technicalShape !== "light_backend_json_sqlite") {
23831
- return {
23832
- ...decision,
23833
- needType: "multi_user_collaboration",
23834
- maintenanceMode: "runtime_collaboration",
23835
- technicalShape: "light_backend_json_sqlite",
23836
- recommendedDeployment: recommendedDeploymentForCollaboration(decision.accessTopology),
23837
- route: "spec_interrogate",
23838
- mustNotUse: Array.from(/* @__PURE__ */ new Set([...decision.mustNotUse, "static_display", "local_storage_only"]))
23839
- };
23840
- }
23841
- return decision;
23842
- }
23843
- function recommendedDeploymentForCollaboration(accessTopology) {
23844
- if (accessTopology === "lan_only") return "local_lan_server_sqlite";
23845
- if (accessTopology === "internet_ip") return "cheap_vps_sqlite_by_ip";
23846
- if (accessTopology === "public_domain") return "vps_domain_https";
23847
- return "unknown";
23848
- }
23849
- function buildMustNotUse(needType, maintenanceMode) {
23850
- const items = [];
23851
- if (needType === "multi_user_collaboration") items.push("static_display", "local_storage_only");
23852
- if (needType === "content_marketing_site" || needType === "data_visualization_site") items.push("admin_backend_by_default", "database_by_default");
23853
- if (maintenanceMode === "agent_assisted") items.push("web_admin_cms_by_default");
23854
- if (needType === "transaction_workflow") items.push("local_storage_only");
23855
- if (needType === "ai_automation") items.push("frontend_api_key");
23856
- return Array.from(new Set(items));
23857
- }
23858
- function buildBoundaryQuestionIds(needType, maintenanceMode, accessTopology) {
23859
- if (needType === "multi_user_collaboration") {
23860
- return ["access_topology", "public_ip_acceptance", "claim_rule", "time_conflict_rule"];
23861
- }
23862
- if (needType === "content_marketing_site") {
23863
- return ["maintenance_mode", "geo_goal", "visitor_submission", "image_volume"];
23864
- }
23865
- if (needType === "data_visualization_site") {
23866
- return ["data_update_mode", "audience_scope", "history_versions"];
23867
- }
23868
- if (needType === "content_knowledge") {
23869
- return maintenanceMode === "agent_assisted" ? ["maintenance_mode", "visibility_scope"] : ["editor_roles", "permission_rule", "version_history"];
23870
- }
23871
- if (needType === "unknown") return ["usage_scope", "maintenance_mode", "data_flow"];
23872
- if (accessTopology === "unknown" && needType !== "personal_local_tool") return ["access_topology"];
23873
- return [];
23874
- }
23875
- function buildDefaultAssumptions(needType, usageScope, maintenanceMode, accessTopology, deployment) {
23876
- const items = [`\u4F7F\u7528\u8303\u56F4\uFF1A${usageScope}`, `\u7EF4\u62A4\u65B9\u5F0F\uFF1A${maintenanceMode}`, `\u8BBF\u95EE\u65B9\u5F0F\uFF1A${accessTopology}`, `\u63A8\u8350\u90E8\u7F72\uFF1A${deployment}`];
23877
- if (needType === "content_marketing_site" || needType === "data_visualization_site") {
23878
- items.push("\u5185\u5BB9\u6216\u6570\u636E\u7ECF\u5E38\u66F4\u65B0\u65F6\uFF0CMVP \u9ED8\u8BA4\u4F18\u5148\u7531 Agent \u66F4\u65B0\u5185\u5BB9\u6587\u4EF6\u5E76\u91CD\u65B0\u90E8\u7F72\uFF0C\u4E0D\u9ED8\u8BA4\u5EFA\u8BBE\u7F51\u9875\u540E\u53F0\u3002");
23879
- }
23880
- if (needType === "multi_user_collaboration") {
23881
- items.push("\u591A\u4EBA\u534F\u4F5C\u5148\u786E\u8BA4\u5C40\u57DF\u7F51\u662F\u5426\u8DB3\u591F\uFF1B\u4E0D\u76F4\u63A5\u9ED8\u8BA4\u516C\u7F51\u670D\u52A1\u5668\u3001\u57DF\u540D\u6216\u5907\u6848\u3002");
23882
- }
23883
- return items;
23884
- }
23885
- function extractCoreObjects(text, needType) {
23886
- if (needType === "multi_user_collaboration") return ["\u7528\u6237", "\u4EFB\u52A1", "\u65E5\u7A0B\u9879"];
23887
- if (needType === "content_marketing_site") return ["Q&A", "\u7167\u7247", "\u7528\u6237\u53CD\u9988", "\u4FC3\u9500\u6D3B\u52A8", "\u6559\u7EC3\u4FE1\u606F"].filter((item) => text.includes(item.replace("\u4FE1\u606F", "")) || item === "Q&A");
23888
- if (needType === "data_visualization_site") return ["xlsx \u6587\u4EF6", "\u6570\u636E\u8868", "\u56FE\u8868\u914D\u7F6E", "\u6E32\u67D3\u7ED3\u679C"];
23889
- if (needType === "personal_local_tool") {
23890
- if (text.includes("\u836F")) return ["\u836F\u54C1"];
23891
- if (text.includes("\u98DF\u6750")) return ["\u98DF\u6750"];
23892
- return ["\u8BB0\u5F55"];
23893
- }
23894
- return [];
23895
- }
23896
- function extractStates(text, needType) {
23897
- const states = [];
23898
- if (needType === "multi_user_collaboration") states.push("\u5F85\u8BA4\u9886", "\u5DF2\u8BA4\u9886", "\u5DF2\u5B8C\u6210", "\u53D6\u6D88");
23899
- if (hasAny2(text, ["\u8FC7\u671F", "\u4E34\u671F", "\u5230\u671F"])) states.push("\u6B63\u5E38", "\u4E34\u671F", "\u5DF2\u8FC7\u671F");
23900
- return Array.from(new Set(states));
23901
- }
23902
- function extractActions(text, needType) {
23903
- if (needType === "multi_user_collaboration") return ["\u5B89\u6392\u4EFB\u52A1", "\u8BA4\u9886\u4EFB\u52A1", "\u67E5\u770B\u65E5\u7A0B\u51B2\u7A81"];
23904
- if (needType === "content_marketing_site") return ["\u66F4\u65B0\u5185\u5BB9", "\u53D1\u5E03\u4FC3\u9500", "\u7EF4\u62A4\u56FE\u7247\u548C FAQ"];
23905
- if (needType === "data_visualization_site") return ["\u89E3\u6790 xlsx", "\u66F4\u65B0\u56FE\u8868\u6570\u636E", "\u6E32\u67D3\u7ED3\u679C"];
23906
- return [];
23907
- }
23908
- var strongSignalMap = {
23909
- \u591A\u4EBA: ["\u591A\u4EBA", "\u5BA4\u53CB", "\u5BB6\u4EBA\u5171\u7528", "\u5171\u7528", "\u5171\u4EAB"],
23910
- \u534F\u4F5C: ["\u534F\u4F5C", "\u76F8\u4E92\u5B89\u6392", "\u8BA4\u9886", "\u5206\u914D\u4EFB\u52A1"],
23911
- \u6743\u9650: ["\u6743\u9650", "\u767B\u5F55", "\u540E\u53F0", "\u7BA1\u7406\u5458", "\u5BA1\u6279", "\u5BA1\u6838"],
23912
- \u516C\u5F00\u63D0\u4EA4: ["\u8BBF\u5BA2\u63D0\u4EA4", "\u7528\u6237\u63D0\u4EA4", "\u5728\u7EBF\u63D0\u4EA4", "\u63D0\u4EA4\u53CD\u9988"],
23913
- \u4EA4\u6613: ["\u652F\u4ED8", "\u8BA2\u5355", "\u552E\u5356", "\u8D2D\u4E70", "\u62A5\u540D", "\u9884\u7EA6"],
23914
- AI: ["AI", "ai", "API Key", "\u6A21\u578B\u63A5\u53E3", "\u5927\u6A21\u578B"]
23915
- };
23916
- var weakSignalMap = {
23917
- \u5C55\u793A: ["\u5C55\u793A", "\u7F51\u7AD9", "\u9875\u9762"],
23918
- \u89C6\u89C9: ["\u9875\u9762\u9AD8\u7EA7", "\u597D\u770B", "\u7F8E\u89C2"],
23919
- \u7BA1\u7406: ["\u7BA1\u7406", "\u7EF4\u62A4", "\u5185\u5BB9\u591A"],
23920
- \u5217\u8868: ["\u5217\u8868", "\u67E5\u770B", "\u7B5B\u9009", "\u65E5\u7A0B", "\u72B6\u6001"]
23921
- };
23922
- function collectSignals(text, map) {
23923
- return Object.entries(map).filter(([, signals]) => hasAny2(text, signals)).map(([label]) => label);
23924
- }
23925
- function hasAny2(text, signals) {
23926
- return signals.some((signal) => text.includes(signal));
23927
- }
23928
- function isNegated(text, signals) {
23929
- return signals.some((signal) => new RegExp(`(\u4E0D\u63A5|\u4E0D\u505A|\u4E0D\u7528|\u65E0\u9700|\u4E0D\u9700\u8981|\u6682\u4E0D|\u5148\u4E0D).{0,8}${signal}`, "i").test(text));
23930
- }
23931
-
23932
24205
  // src/core/promptBuilder.ts
23933
24206
  function buildSpec(rawIdea, context, readiness) {
23934
24207
  const assumptions = [];
@@ -25555,8 +25828,8 @@ function registerSpecCompile(server) {
25555
25828
  var ArchitectureDecideInputSchema = external_exports.object({
25556
25829
  product_type: external_exports.string().describe("\u4EA7\u54C1\u7C7B\u578B\u63CF\u8FF0"),
25557
25830
  platform: external_exports.enum(["web", "mini_program", "app", "backend"]).describe("\u76EE\u6807\u5E73\u53F0"),
25558
- features: external_exports.array(external_exports.string()).describe("\u529F\u80FD\u5217\u8868"),
25559
- commercial_intent: external_exports.boolean().optional().default(false).describe("\u662F\u5426\u6709\u5546\u4E1A\u5316\u610F\u56FE"),
25831
+ features: looseStringArray("\u529F\u80FD\u5217\u8868"),
25832
+ commercial_intent: external_exports.union([external_exports.boolean(), looseBoolean]).optional().default(false).describe("\u662F\u5426\u6709\u5546\u4E1A\u5316\u610F\u56FE"),
25560
25833
  expected_users: external_exports.enum(["individual", "small_team", "enterprise", "massive"]).optional().default("individual").describe("\u9884\u671F\u7528\u6237\u89C4\u6A21")
25561
25834
  });
25562
25835
 
@@ -26631,11 +26904,11 @@ function registerDebugGuide(server) {
26631
26904
  // src/schemas/acceptanceGenerate.schema.ts
26632
26905
  var AcceptanceGenerateInputSchema = external_exports.object({
26633
26906
  product_type: external_exports.string().describe("\u4EA7\u54C1\u7C7B\u578B"),
26634
- features: external_exports.array(external_exports.string()).describe("\u529F\u80FD\u5217\u8868"),
26907
+ features: looseStringArray("\u529F\u80FD\u5217\u8868"),
26635
26908
  platform: external_exports.enum(["web", "mini_program", "app", "backend"]).describe("\u76EE\u6807\u5E73\u53F0"),
26636
- has_backend: external_exports.boolean().optional().default(false).describe("\u662F\u5426\u6709\u540E\u7AEF"),
26637
- has_payment: external_exports.boolean().optional().default(false).describe("\u662F\u5426\u6D89\u53CA\u652F\u4ED8"),
26638
- has_auth: external_exports.boolean().optional().default(false).describe("\u662F\u5426\u6D89\u53CA\u9274\u6743")
26909
+ has_backend: external_exports.union([external_exports.boolean(), looseBoolean]).optional().default(false).describe("\u662F\u5426\u6709\u540E\u7AEF"),
26910
+ has_payment: external_exports.union([external_exports.boolean(), looseBoolean]).optional().default(false).describe("\u662F\u5426\u6D89\u53CA\u652F\u4ED8"),
26911
+ has_auth: external_exports.union([external_exports.boolean(), looseBoolean]).optional().default(false).describe("\u662F\u5426\u6D89\u53CA\u9274\u6743")
26639
26912
  });
26640
26913
 
26641
26914
  // src/schemas/outputs/acceptanceGenerate.output.ts
@@ -27579,7 +27852,7 @@ var ProductSpecAssistInputSchema = external_exports.object({
27579
27852
  known_context: external_exports.record(external_exports.string(), external_exports.unknown()).optional().describe("\u5DF2\u6709\u4E0A\u4E0B\u6587"),
27580
27853
  preferred_platform: external_exports.enum(["web", "mini_program", "app", "backend", "unknown"]).optional().default("unknown").describe("\u7528\u6237\u5DF2\u77E5\u5E73\u53F0"),
27581
27854
  strictness: external_exports.enum(["light", "normal", "grill"]).optional().default("normal").describe("\u8FFD\u95EE\u5F3A\u5EA6"),
27582
- auto_execute: external_exports.boolean().optional().default(true).describe("\u662F\u5426\u5141\u8BB8\u81EA\u52A8\u8C03\u7528\u5BF9\u5E94 engine")
27855
+ auto_execute: external_exports.union([external_exports.boolean(), looseBoolean]).optional().default(true).describe("\u662F\u5426\u5141\u8BB8\u81EA\u52A8\u8C03\u7528\u5BF9\u5E94 engine")
27583
27856
  });
27584
27857
 
27585
27858
  // src/schemas/outputs/productSpecAssist.output.ts
@@ -28107,6 +28380,7 @@ function handleBuildProduct(message, knownContext, strictness, autoExecute, rout
28107
28380
  quickQuestions,
28108
28381
  agentGuidance: [
28109
28382
  "\u9762\u5411\u5C0F\u767D\u672C\u5730\u5DE5\u5177\u65F6\uFF0C\u4E0D\u8981\u628A quickQuestions \u539F\u6837\u629B\u7ED9\u7528\u6237\uFF0C\u4E5F\u4E0D\u8981\u8981\u6C42\u7528\u6237\u56DE\u7B54\u7C7B\u4F3C\u201CB + a\u201D\u7684\u7ED3\u6784\u5316\u9009\u9879\uFF1B\u5DF2\u751F\u6210 MVP \u8349\u6848\uFF0C\u6700\u591A\u95EE\u4E00\u53E5\u81EA\u7136\u8BED\u8A00\u786E\u8BA4\u3002\u9875\u9762\u9AD8\u7EA7\u611F\u53EA\u5F71\u54CD UI\uFF0C\u4E0D\u8981\u56E0\u6B64\u7EA0\u504F\u6210\u540E\u7AEF\u3001\u767B\u5F55\u3001\u591A\u7AEF\u540C\u6B65\u6216\u670D\u52A1\u5668\u6570\u636E\u5E93\u3002",
28383
+ "\u5F53\u524D nextAction \u662F confirm_spec\uFF0C\u8868\u793A\u8349\u6848\u5DF2\u7ECF\u751F\u6210\uFF1B\u4E0D\u8981\u518D\u8C03\u7528 spec_interrogate\u3001spec_compile \u6216 architecture_decide \u6765\u91CD\u590D\u8FFD\u95EE\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u4FEE\u6539\u89C4\u683C\u3002",
28110
28384
  "\u4E0D\u8981\u628A\u7528\u6237\u7AEF\u767B\u5F55\u548C\u540E\u53F0\u7BA1\u7406\u5458\u767B\u5F55\u5408\u5E76\u6210\u540C\u4E00\u4E2A\u5B57\u6BB5\u3002",
28111
28385
  "\u5982\u679C\u7528\u6237\u53EA\u9700\u8981\u5BFC\u51FA\uFF0C\u4E0D\u8981\u64C5\u81EA\u6269\u5C55\u6210\u5B8C\u6574\u540E\u53F0\u7BA1\u7406\u7CFB\u7EDF\u3002",
28112
28386
  "\u672A\u547D\u4E2D\u7A33\u5B9A domain pack \u65F6\uFF0C\u5E94\u4F7F\u7528 generic MVP \u8349\u6848\uFF0C\u4E0D\u8981\u5957\u7528\u62A5\u540D\u3001\u7535\u5546\u3001\u9884\u7EA6\u3001\u5185\u5BB9\u793E\u533A\u3001\u5DE5\u5355\u3001\u77E5\u8BC6\u5E93\u6216 CRM \u6A21\u677F\u3002"
@@ -29695,7 +29969,7 @@ function registerProductSpecAssist(server) {
29695
29969
  function createServer() {
29696
29970
  const server = new McpServer({
29697
29971
  name: "product-spec-mcp",
29698
- version: "0.3.29"
29972
+ version: "0.3.31"
29699
29973
  });
29700
29974
  registerSpecInterrogate(server);
29701
29975
  registerSpecCompile(server);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "product-spec-mcp",
3
- "version": "0.3.29",
3
+ "version": "0.3.31",
4
4
  "description": "MCP Server for product specification - requirement interrogation, architecture decision, UI translation, debug guidance, and acceptance generation",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.cjs",