speccore 5.25.2 → 5.26.2

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 (62) hide show
  1. package/README.md +93 -77
  2. package/dist/cli.js +123 -45
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/ask.d.ts +4 -5
  5. package/dist/commands/ask.d.ts.map +1 -1
  6. package/dist/commands/ask.js +257 -292
  7. package/dist/commands/ask.js.map +1 -1
  8. package/dist/commands/dashboard.d.ts +12 -0
  9. package/dist/commands/dashboard.d.ts.map +1 -1
  10. package/dist/commands/dashboard.js +442 -77
  11. package/dist/commands/dashboard.js.map +1 -1
  12. package/dist/commands/dev.d.ts +2 -0
  13. package/dist/commands/dev.d.ts.map +1 -1
  14. package/dist/commands/dev.js +282 -290
  15. package/dist/commands/dev.js.map +1 -1
  16. package/dist/commands/doc2spec.d.ts +2 -0
  17. package/dist/commands/doc2spec.d.ts.map +1 -1
  18. package/dist/commands/doc2spec.js +22 -6
  19. package/dist/commands/doc2spec.js.map +1 -1
  20. package/dist/commands/help.d.ts.map +1 -1
  21. package/dist/commands/help.js +39 -0
  22. package/dist/commands/help.js.map +1 -1
  23. package/dist/commands/init.js +15 -5
  24. package/dist/commands/init.js.map +1 -1
  25. package/dist/commands/spec2doc.d.ts +11 -0
  26. package/dist/commands/spec2doc.d.ts.map +1 -0
  27. package/dist/commands/spec2doc.js +183 -0
  28. package/dist/commands/spec2doc.js.map +1 -0
  29. package/dist/commands/status-panel.d.ts +1 -0
  30. package/dist/commands/status-panel.d.ts.map +1 -1
  31. package/dist/commands/status-panel.js +97 -3
  32. package/dist/commands/status-panel.js.map +1 -1
  33. package/dist/commands/welcome.d.ts +10 -0
  34. package/dist/commands/welcome.d.ts.map +1 -1
  35. package/dist/commands/welcome.js +77 -30
  36. package/dist/commands/welcome.js.map +1 -1
  37. package/dist/core/ask-engine.d.ts +45 -0
  38. package/dist/core/ask-engine.d.ts.map +1 -0
  39. package/dist/core/ask-engine.js +405 -0
  40. package/dist/core/ask-engine.js.map +1 -0
  41. package/dist/core/ask-host-ai.d.ts +33 -0
  42. package/dist/core/ask-host-ai.d.ts.map +1 -0
  43. package/dist/core/ask-host-ai.js +156 -0
  44. package/dist/core/ask-host-ai.js.map +1 -0
  45. package/dist/core/ask-llm.d.ts +12 -0
  46. package/dist/core/ask-llm.d.ts.map +1 -0
  47. package/dist/core/ask-llm.js +166 -0
  48. package/dist/core/ask-llm.js.map +1 -0
  49. package/dist/core/dev-llm.d.ts +34 -0
  50. package/dist/core/dev-llm.d.ts.map +1 -0
  51. package/dist/core/dev-llm.js +209 -0
  52. package/dist/core/dev-llm.js.map +1 -0
  53. package/dist/core/help-panel.d.ts +1 -1
  54. package/dist/core/help-panel.d.ts.map +1 -1
  55. package/dist/core/help-panel.js +6 -5
  56. package/dist/core/help-panel.js.map +1 -1
  57. package/dist/core/intent-recognition.js +3 -3
  58. package/dist/core/intent-recognition.js.map +1 -1
  59. package/dist/utils/logger.d.ts.map +1 -1
  60. package/dist/utils/logger.js +5 -2
  61. package/dist/utils/logger.js.map +1 -1
  62. package/package.json +1 -1
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * ask-host-ai — 宿主 AI 层(WorkBuddy / TRAE / Qoder)
4
+ * 通过文件协议与用户当前使用的 AI 工具通信
5
+ *
6
+ * 协议:
7
+ * 1. CLI 写入 ~/.speccore/.ai-request.json
8
+ * 2. 宿主 AI 检测文件变更,读取后处理
9
+ * 3. 宿主 AI 写入 ~/.speccore/.ai-response.json
10
+ * 4. CLI 轮询读取响应(最多等待 15 秒)
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.detectHostAi = detectHostAi;
14
+ exports.askHostAi = askHostAi;
15
+ exports.emitWorkBuddySignal = emitWorkBuddySignal;
16
+ exports.tryHostAi = tryHostAi;
17
+ const fs_extra_1 = require("fs-extra");
18
+ const os_1 = require("os");
19
+ const path_1 = require("path");
20
+ const logger_1 = require("../utils/logger");
21
+ const REQUEST_FILE = (0, path_1.join)((0, os_1.homedir)(), '.speccore', '.ai-request.json');
22
+ const RESPONSE_FILE = (0, path_1.join)((0, os_1.homedir)(), '.speccore', '.ai-response.json');
23
+ const POLL_INTERVAL = 300; // 300ms
24
+ const MAX_WAIT = 15000; // 15s timeout
25
+ function detectHostAi() {
26
+ // WorkBuddy: 检查会话文件
27
+ if (process.env.WORKBUDDY_SESSION || process.env.CLAUDE_CODE_SESSION) {
28
+ return 'workbuddy';
29
+ }
30
+ // TRAE
31
+ if (process.env.TRAE_SESSION || process.env.TENCENT_AI_CODING) {
32
+ return 'trae';
33
+ }
34
+ // Qoder: 检查 .qoder 目录
35
+ const { pathExistsSync } = require('fs-extra');
36
+ if (pathExistsSync((0, path_1.join)(process.cwd(), '.qoder'))) {
37
+ return 'qoder';
38
+ }
39
+ return 'none';
40
+ }
41
+ // ============================================================
42
+ // 文件协议通信
43
+ // ============================================================
44
+ /**
45
+ * 通过文件协议发送请求给宿主 AI
46
+ *
47
+ * 宿主 AI(WorkBuddy 等)需要设置文件监听:
48
+ * 监控 ~/.speccore/.ai-request.json 的变更
49
+ * 读取 → 用 AI 处理 → 写入 ~/.speccore/.ai-response.json
50
+ */
51
+ async function askHostAi(type, input, context = {}) {
52
+ const tool = detectHostAi();
53
+ if (tool === 'none')
54
+ return null;
55
+ const id = `${type}-${Date.now()}`;
56
+ const request = { id, type, input, context, timestamp: Date.now() };
57
+ try {
58
+ // 1. 清理旧文件
59
+ try {
60
+ await (0, fs_extra_1.unlink)(REQUEST_FILE);
61
+ }
62
+ catch { }
63
+ try {
64
+ await (0, fs_extra_1.unlink)(RESPONSE_FILE);
65
+ }
66
+ catch { }
67
+ // 2. 写入请求
68
+ await (0, fs_extra_1.writeFile)(REQUEST_FILE, JSON.stringify(request, null, 2));
69
+ // 3. 轮询等待响应
70
+ const startTime = Date.now();
71
+ while (Date.now() - startTime < MAX_WAIT) {
72
+ await sleep(POLL_INTERVAL);
73
+ if (await (0, fs_extra_1.pathExists)(RESPONSE_FILE)) {
74
+ const raw = await (0, fs_extra_1.readFile)(RESPONSE_FILE, 'utf-8');
75
+ try {
76
+ const response = JSON.parse(raw);
77
+ if (response.id === id) {
78
+ logger_1.logger.info(`✅ ${tool.toUpperCase()} AI 响应成功`);
79
+ // 清理
80
+ try {
81
+ await (0, fs_extra_1.unlink)(REQUEST_FILE);
82
+ }
83
+ catch { }
84
+ try {
85
+ await (0, fs_extra_1.unlink)(RESPONSE_FILE);
86
+ }
87
+ catch { }
88
+ return response.result;
89
+ }
90
+ }
91
+ catch {
92
+ // JSON 可能还没写完,继续等待
93
+ }
94
+ }
95
+ }
96
+ logger_1.logger.warn(`⏱ ${tool.toUpperCase()} AI 响应超时 (${MAX_WAIT}ms)`);
97
+ }
98
+ catch (e) {
99
+ logger_1.logger.warn(`${tool} AI 通信失败: ${e.message}`);
100
+ }
101
+ // 清理残留文件
102
+ try {
103
+ await (0, fs_extra_1.unlink)(REQUEST_FILE);
104
+ }
105
+ catch { }
106
+ try {
107
+ await (0, fs_extra_1.unlink)(RESPONSE_FILE);
108
+ }
109
+ catch { }
110
+ return null;
111
+ }
112
+ function sleep(ms) {
113
+ return new Promise(resolve => setTimeout(resolve, ms));
114
+ }
115
+ // ============================================================
116
+ // WorkBuddy 专有 — 利用当前对话上下文
117
+ // ============================================================
118
+ /**
119
+ * WorkBuddy 环境下的特殊处理:
120
+ * 通过 stdout 输出特殊标记,让 WorkBuddy agent 识别并响应
121
+ *
122
+ * 标记格式: <<SPECCORE_ASK>>...<<END_SPECCORE_ASK>>
123
+ * WorkBuddy agent 检测到后,用其 AI 能力处理并输出结果
124
+ */
125
+ function emitWorkBuddySignal(type, input, context) {
126
+ const payload = JSON.stringify({ type, input, context, timestamp: Date.now() });
127
+ console.log(`\n<<SPECCORE_AI_REQUEST>>${payload}<<END_SPECCORE_AI_REQUEST>>\n`);
128
+ }
129
+ // ============================================================
130
+ // 统一入口
131
+ // ============================================================
132
+ async function tryHostAi(type, input, context = {}) {
133
+ // 先检测
134
+ const tool = detectHostAi();
135
+ if (tool === 'none')
136
+ return null;
137
+ logger_1.logger.info(`🤖 检测到 ${tool.toUpperCase()} 环境,尝试宿主 AI 增强...`);
138
+ // WorkBuddy: 两种方式
139
+ if (tool === 'workbuddy') {
140
+ // 方式1: 文件协议(agent 需要配置监听)
141
+ const fileResult = await askHostAi(type, input, context);
142
+ if (fileResult)
143
+ return fileResult;
144
+ // 方式2: stdout 标记(agent 从输出流捕获)
145
+ // 注: 仅在非 TTY 模式下有效(AI 调用模式)
146
+ if (!process.stdout.isTTY) {
147
+ emitWorkBuddySignal(type, input, context);
148
+ }
149
+ }
150
+ // TRAE/Qoder: 仅文件协议
151
+ if (tool === 'trae' || tool === 'qoder') {
152
+ return askHostAi(type, input, context);
153
+ }
154
+ return null;
155
+ }
156
+ //# sourceMappingURL=ask-host-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-host-ai.js","sourceRoot":"","sources":["../../src/core/ask-host-ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ask-llm — LLM 增强意图引擎
3
+ * 将 18 条命令知识库 + 4 种工作流注入 prompt,让 LLM 理解并输出结构化结果
4
+ * 规则引擎为 fallback,LLM 优先
5
+ */
6
+ import { AskResult } from './ask-engine';
7
+ /**
8
+ * 尝试用 LLM 解析意图
9
+ * 成功返回结构化结果,失败返回 null(降级到规则引擎)
10
+ */
11
+ export declare function askWithLlm(input: string): Promise<AskResult | null>;
12
+ //# sourceMappingURL=ask-llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-llm.d.ts","sourceRoot":"","sources":["../../src/core/ask-llm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAuC,SAAS,EAAgB,MAAM,cAAc,CAAC;AAkE5F;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA4BzE"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ /**
3
+ * ask-llm — LLM 增强意图引擎
4
+ * 将 18 条命令知识库 + 4 种工作流注入 prompt,让 LLM 理解并输出结构化结果
5
+ * 规则引擎为 fallback,LLM 优先
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.askWithLlm = askWithLlm;
9
+ const logger_1 = require("../utils/logger");
10
+ const ask_engine_1 = require("./ask-engine");
11
+ // ============================================================
12
+ // Prompt 构建
13
+ // ============================================================
14
+ function buildSystemPrompt() {
15
+ const cmdList = ask_engine_1.COMMAND_KB.map(c => `- **${c.name}** (${c.aliases.join('/')}): ${c.description}\n 用法: \`${c.usage}\`\n 触发词: ${c.triggers.slice(0, 4).join(', ')}`).join('\n');
16
+ const workflowList = Object.entries(ask_engine_1.WORKFLOWS).map(([name, steps]) => `### ${name}\n${steps.map(s => `${s.order}. speccore ${s.command} ${s.args} — ${s.explanation}`).join('\n')}`).join('\n\n');
17
+ return `你是 SpecCore CLI 的 AI 助手。你了解以下命令和工作流,可以根据用户的自然语言输入,返回结构化的 JSON 响应。
18
+
19
+ ## 可用命令
20
+ ${cmdList}
21
+
22
+ ## 预定义工作流
23
+ ${workflowList}
24
+
25
+ ## 你的任务
26
+ 根据用户输入,判断模式并返回 JSON。不要解释,只返回 JSON。
27
+
28
+ ### 输出格式
29
+ {
30
+ "mode": "explain|guide|match|pipeline",
31
+ "summary": "简短摘要",
32
+ "detail": "详细解释(Markdown)",
33
+ "commands": ["匹配的命令名"],
34
+ "pipeline": null 或 {
35
+ "steps": [{"order": 1, "command": "命令", "args": "参数", "explanation": "说明", "dependsOn": null}]
36
+ }
37
+ }
38
+
39
+ ### 模式说明
40
+ - explain: 用户问某个命令的用法 → 返回该命令的详细说明
41
+ - guide: 用户问怎么做/步骤 → 匹配最合适的工作流
42
+ - match: 用户描述想做某事 → 匹配单个最合适的命令
43
+ - pipeline: 用户描述多步骤操作(含时间/批次/顺序) → 返回多步执行计划
44
+
45
+ ### 参数提取规则
46
+ - 时间: "晚8点" → "--at 20:00", "明早8点" → "--at 08:00"
47
+ - 批次: "3个一批" → "--batch-size 3", "分5批" → "--batch-size 5"
48
+ - 期次: 如果有提到 Q1/Q2/Q3 等 → "--iteration Q1"
49
+ - 任务: 如果提到任务名/ID → "--task <id>"`;
50
+ }
51
+ function buildUserPrompt(input) {
52
+ return `用户输入: "${input}"\n\n请分析并返回 JSON:`;
53
+ }
54
+ /**
55
+ * 尝试用 LLM 解析意图
56
+ * 成功返回结构化结果,失败返回 null(降级到规则引擎)
57
+ */
58
+ async function askWithLlm(input) {
59
+ try {
60
+ const systemPrompt = buildSystemPrompt();
61
+ const userPrompt = buildUserPrompt(input);
62
+ // 使用 WorkBuddy 内置 LLM(通过子进程调用当前 AI)
63
+ const response = await callLlm(systemPrompt, userPrompt);
64
+ if (!response)
65
+ return null;
66
+ const parsed = parseLlmResponse(response);
67
+ if (!parsed)
68
+ return null;
69
+ // 验证 commands 是否在 KB 中
70
+ const validCommands = parsed.commands.filter(c => ask_engine_1.COMMAND_KB.some(kb => kb.name === c || kb.aliases.includes(c)));
71
+ return {
72
+ mode: (parsed.mode || 'match'),
73
+ summary: parsed.summary,
74
+ detail: parsed.detail,
75
+ commands: validCommands.length > 0 ? validCommands : [],
76
+ pipeline: parsed.pipeline || undefined,
77
+ };
78
+ }
79
+ catch (e) {
80
+ logger_1.logger.warn(`LLM 增强失败,降级到规则引擎: ${e.message}`);
81
+ return null;
82
+ }
83
+ }
84
+ /**
85
+ * 调用 LLM
86
+ * 优先使用环境变量 SPECCORE_LLM_ENDPOINT,否则尝试 OpenAI 兼容接口
87
+ */
88
+ async function callLlm(systemPrompt, userPrompt) {
89
+ // 方案1: OpenAI 兼容接口
90
+ const endpoint = process.env.SPECCORE_LLM_ENDPOINT || 'https://api.openai.com/v1/chat/completions';
91
+ const apiKey = process.env.SPECCORE_LLM_KEY || process.env.OPENAI_API_KEY;
92
+ if (!apiKey) {
93
+ // 本地无 API Key → 尝试用 WorkBuddy 的 LLM(通过文件通信)
94
+ return callViaWorkBuddy(systemPrompt, userPrompt);
95
+ }
96
+ try {
97
+ const res = await fetch(endpoint, {
98
+ method: 'POST',
99
+ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` },
100
+ body: JSON.stringify({
101
+ model: process.env.SPECCORE_LLM_MODEL || 'gpt-4o-mini',
102
+ messages: [
103
+ { role: 'system', content: systemPrompt },
104
+ { role: 'user', content: userPrompt },
105
+ ],
106
+ temperature: 0.1,
107
+ max_tokens: 1000,
108
+ }),
109
+ });
110
+ const data = await res.json();
111
+ return data?.choices?.[0]?.message?.content || null;
112
+ }
113
+ catch {
114
+ return callViaWorkBuddy(systemPrompt, userPrompt);
115
+ }
116
+ }
117
+ /**
118
+ * 通过 WorkBuddy 的 LLM 通信
119
+ * 写入 prompt 到临时文件,WorkBuddy 的 AI 助手读取并返回
120
+ */
121
+ async function callViaWorkBuddy(systemPrompt, userPrompt) {
122
+ // 在 WorkBuddy 环境中,当前 AI 直接处理
123
+ // 使用一个标记来检测是否能直接回答
124
+ const combined = `${systemPrompt}\n\n${userPrompt}`;
125
+ try {
126
+ // 尝试通过 HTTP 调用(如果有本地 LLM 服务)
127
+ const localRes = await fetch('http://localhost:11434/api/generate', {
128
+ method: 'POST',
129
+ headers: { 'Content-Type': 'application/json' },
130
+ body: JSON.stringify({
131
+ model: 'qwen2.5:7b',
132
+ prompt: combined,
133
+ stream: false,
134
+ options: { temperature: 0.1, num_predict: 500 },
135
+ }),
136
+ signal: AbortSignal.timeout(5000),
137
+ });
138
+ if (localRes.ok) {
139
+ const data = await localRes.json();
140
+ return data?.response || null;
141
+ }
142
+ }
143
+ catch { }
144
+ return null;
145
+ }
146
+ /**
147
+ * 解析 LLM 返回的 JSON
148
+ */
149
+ function parseLlmResponse(text) {
150
+ try {
151
+ // 尝试直接解析
152
+ return JSON.parse(text);
153
+ }
154
+ catch {
155
+ // 尝试提取 JSON 块
156
+ const match = text.match(/\{[\s\S]*\}/);
157
+ if (match) {
158
+ try {
159
+ return JSON.parse(match[0]);
160
+ }
161
+ catch { }
162
+ }
163
+ }
164
+ return null;
165
+ }
166
+ //# sourceMappingURL=ask-llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-llm.js","sourceRoot":"","sources":["../../src/core/ask-llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * dev-llm — Dev Pipeline LLM 引导引擎
3
+ * 理解用户对开发流程的选择/跳过/调整意图,返回结构化执行计划
4
+ * 规则引擎为 fallback,LLM 优先
5
+ */
6
+ export interface DevPhase {
7
+ name: string;
8
+ key: string;
9
+ icon: string;
10
+ cmd: string;
11
+ done: boolean;
12
+ description: string;
13
+ args: string;
14
+ }
15
+ export interface DevPipelineState {
16
+ iteration: string;
17
+ phases: DevPhase[];
18
+ currentIdx: number;
19
+ currentPhase: DevPhase;
20
+ }
21
+ export interface DevActionResult {
22
+ action: 'next' | 'skip-to' | 'start-from' | 'restart' | 'auto-all' | 'jump-to';
23
+ targetPhase: string;
24
+ commands: Array<{
25
+ order: number;
26
+ command: string;
27
+ args: string;
28
+ explanation: string;
29
+ }>;
30
+ summary: string;
31
+ }
32
+ export declare function devRuleEngine(state: DevPipelineState, userInput: string): DevActionResult;
33
+ export declare function devAiGuide(state: DevPipelineState, userInput: string): Promise<DevActionResult>;
34
+ //# sourceMappingURL=dev-llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-llm.d.ts","sourceRoot":"","sources":["../../src/core/dev-llm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,QAAQ,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvF,OAAO,EAAE,MAAM,CAAC;CACjB;AA2HD,wBAAgB,aAAa,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,CA4DzF;AAMD,wBAAsB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqBrG"}
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ /**
3
+ * dev-llm — Dev Pipeline LLM 引导引擎
4
+ * 理解用户对开发流程的选择/跳过/调整意图,返回结构化执行计划
5
+ * 规则引擎为 fallback,LLM 优先
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.devRuleEngine = devRuleEngine;
9
+ exports.devAiGuide = devAiGuide;
10
+ const logger_1 = require("../utils/logger");
11
+ // ============================================================
12
+ // 系统 Prompt — Dev Pipeline
13
+ // ============================================================
14
+ function buildDevSystemPrompt(state) {
15
+ const phaseList = state.phases.map((p, i) => {
16
+ const marker = i === state.currentIdx ? '◀ 当前' : p.done ? '✅ 已完成' : '⏳ 待执行';
17
+ return ` ${i + 1}. ${p.icon} ${p.name} (speccore ${p.cmd}) — ${marker}`;
18
+ }).join('\n');
19
+ return `你是 SpecCore CLI 的 Pipeline 引导助手。当前项目状态:
20
+
21
+ ## 期次
22
+ ${state.iteration || '未设置'}
23
+
24
+ ## Pipeline 阶段
25
+ ${phaseList}
26
+
27
+ ## 你的任务
28
+ 分析用户意图,判断他们要做什么,返回 JSON:
29
+ {
30
+ "action": "next|skip-to|start-from|restart|auto-all|jump-to",
31
+ "targetPhase": "阶段 key (init/doc/analyze/split/execute/pr/done)",
32
+ "commands": [{"order":1,"command":"命令","args":"参数","explanation":"说明"}],
33
+ "summary": "简短摘要"
34
+ }
35
+
36
+ ## Action 说明
37
+ - next: 执行当前下一步 → 返回 1 条命令
38
+ - skip-to: 跳过中间阶段 / 直接跳到某阶段
39
+ - start-from: 从指定阶段开始执行(含该阶段)
40
+ - restart: 全部重新开始
41
+ - auto-all: 一键自动执行所有未完成阶段
42
+ - jump-to: 跳转到特定阶段
43
+
44
+ ## 参数规则
45
+ - 有期次时自动加 --iteration=${state.iteration}
46
+ - 用户说"跳过分析" → skip-to split
47
+ - 用户说"从拆分开始" → start-from split
48
+ - 用户说"直接做 PR" → jump-to pr
49
+ - 用户说"一键搞定" / "全部自动" → auto-all`;
50
+ }
51
+ function buildDevUserPrompt(input, state) {
52
+ const ctx = state.currentPhase
53
+ ? `当前停在"${state.currentPhase.name}"阶段`
54
+ : '项目未初始化';
55
+ return `用户意图: "${input}"\n上下文: ${ctx}\n\n返回 JSON:`;
56
+ }
57
+ // ============================================================
58
+ // LLM 调用(复用 ask-llm 的三层策略)
59
+ // ============================================================
60
+ async function callDevLlm(systemPrompt, userPrompt) {
61
+ // 策略1: OpenAI 兼容接口
62
+ const endpoint = process.env.SPECCORE_LLM_ENDPOINT || 'https://api.openai.com/v1/chat/completions';
63
+ const apiKey = process.env.SPECCORE_LLM_KEY || process.env.OPENAI_API_KEY;
64
+ if (apiKey) {
65
+ try {
66
+ const res = await fetch(endpoint, {
67
+ method: 'POST',
68
+ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` },
69
+ body: JSON.stringify({
70
+ model: process.env.SPECCORE_LLM_MODEL || 'gpt-4o-mini',
71
+ messages: [
72
+ { role: 'system', content: systemPrompt },
73
+ { role: 'user', content: userPrompt },
74
+ ],
75
+ temperature: 0.1,
76
+ max_tokens: 600,
77
+ }),
78
+ signal: AbortSignal.timeout(8000),
79
+ });
80
+ if (!res.ok)
81
+ throw new Error(`HTTP ${res.status}`);
82
+ const data = await res.json();
83
+ return data?.choices?.[0]?.message?.content || null;
84
+ }
85
+ catch {
86
+ // fall through to Ollama
87
+ }
88
+ }
89
+ // 策略2: Ollama 本地
90
+ try {
91
+ const ollamaRes = await fetch('http://localhost:11434/api/generate', {
92
+ method: 'POST',
93
+ headers: { 'Content-Type': 'application/json' },
94
+ body: JSON.stringify({
95
+ model: 'qwen2.5:7b',
96
+ prompt: systemPrompt + '\n\n' + userPrompt,
97
+ stream: false,
98
+ options: { temperature: 0.1, num_predict: 400 },
99
+ }),
100
+ signal: AbortSignal.timeout(5000),
101
+ });
102
+ if (ollamaRes.ok) {
103
+ const data = await ollamaRes.json();
104
+ return data?.response || null;
105
+ }
106
+ }
107
+ catch { }
108
+ return null;
109
+ }
110
+ function parseDevResponse(text) {
111
+ try {
112
+ return JSON.parse(text);
113
+ }
114
+ catch {
115
+ const match = text.match(/\{[\s\S]*\}/);
116
+ if (match) {
117
+ try {
118
+ return JSON.parse(match[0]);
119
+ }
120
+ catch { }
121
+ }
122
+ }
123
+ return null;
124
+ }
125
+ // ============================================================
126
+ // 规则引擎 Fallback
127
+ // ============================================================
128
+ function devRuleEngine(state, userInput) {
129
+ const lower = userInput.toLowerCase();
130
+ const iterArg = state.iteration ? ` --iteration=${state.iteration}` : '';
131
+ const cur = state.currentPhase;
132
+ // next — 默认
133
+ const nextAction = {
134
+ action: 'next',
135
+ targetPhase: cur.key,
136
+ commands: [{ order: 1, command: cur.cmd, args: iterArg, explanation: `执行「${cur.name}」阶段` }],
137
+ summary: `开始执行 ${cur.name}`,
138
+ };
139
+ // auto-all
140
+ if (/一键|全部|自动|auto|搞定|all/i.test(lower)) {
141
+ const pending = state.phases.filter(p => !p.done);
142
+ return {
143
+ action: 'auto-all',
144
+ targetPhase: 'auto',
145
+ commands: pending.map((p, i) => ({
146
+ order: i + 1,
147
+ command: p.cmd,
148
+ args: p.args || (iterArg || ''),
149
+ explanation: p.description || p.name,
150
+ })),
151
+ summary: `一键执行全部 ${pending.length} 个未完成阶段`,
152
+ };
153
+ }
154
+ // skip-to / jump-to
155
+ for (const p of state.phases) {
156
+ if (lower.includes(p.key) || lower.includes(p.name.toLowerCase())) {
157
+ const isBefore = state.phases.findIndex(ph => ph.key === p.key) < state.currentIdx;
158
+ if (isBefore) {
159
+ // 已过的阶段,restart from there
160
+ const fromIdx = state.phases.findIndex(ph => ph.key === p.key);
161
+ const cmds = state.phases.slice(fromIdx).map((ph, i) => ({
162
+ order: i + 1, command: ph.cmd, args: ph.args || (iterArg || ''), explanation: ph.description || ph.name,
163
+ }));
164
+ return { action: 'restart', targetPhase: p.key, commands: cmds, summary: `从「${p.name}」重新开始` };
165
+ }
166
+ return {
167
+ action: 'jump-to', targetPhase: p.key,
168
+ commands: [{ order: 1, command: p.cmd, args: p.args || (iterArg || ''), explanation: p.description || p.name }],
169
+ summary: `直接跳转到「${p.name}」`,
170
+ };
171
+ }
172
+ }
173
+ // skip — 跳过当前
174
+ if (/跳过|skip/i.test(lower) && state.currentIdx + 1 < state.phases.length) {
175
+ const next = state.phases[state.currentIdx + 1];
176
+ return {
177
+ action: 'skip-to', targetPhase: next.key,
178
+ commands: [{ order: 1, command: next.cmd, args: next.args || (iterArg || ''), explanation: next.description || next.name }],
179
+ summary: `跳过「${cur.name}」→ ${next.name}`,
180
+ };
181
+ }
182
+ return nextAction;
183
+ }
184
+ // ============================================================
185
+ // 统一入口
186
+ // ============================================================
187
+ async function devAiGuide(state, userInput) {
188
+ // ── 第一层: LLM ──
189
+ try {
190
+ const systemPrompt = buildDevSystemPrompt(state);
191
+ const userPrompt = buildDevUserPrompt(userInput, state);
192
+ const raw = await callDevLlm(systemPrompt, userPrompt);
193
+ if (raw) {
194
+ const parsed = parseDevResponse(raw);
195
+ if (parsed && parsed.commands.length > 0) {
196
+ logger_1.logger.info('🧠 AI 引导: ' + parsed.summary);
197
+ return parsed;
198
+ }
199
+ }
200
+ }
201
+ catch (e) {
202
+ logger_1.logger.warn('LLM 引导降级: ' + (e.message || e));
203
+ }
204
+ // ── 第二层: 规则引擎 ──
205
+ const result = devRuleEngine(state, userInput);
206
+ logger_1.logger.info('📐 规则引导: ' + result.summary);
207
+ return result;
208
+ }
209
+ //# sourceMappingURL=dev-llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-llm.js","sourceRoot":"","sources":["../../src/core/dev-llm.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const HELP_PANEL = "\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \uD83E\uDDE0 = \u534F\u4F5C\u5F0F\uFF08\u652F\u6301 --interactive\uFF09 \u26A1 = \u5355\u6B21\u6267\u884C \u2502\n\u2502 init \u2192 iteration create \u2192 doc2spec \u2192 analyze \u2192 split \u2502\n\u2502 \u2192 plan \u2192 execute \u2192 pr \u2192 done \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83D\uDCE5 \u8D44\u4EA7\u63A5\u5165 \u2502\n\u2502 \uD83D\uDE80 init \u26A1 \u521D\u59CB\u5316\u9879\u76EE \u2502\n\u2502 \uD83D\uDCC5 iteration \u26A1 \u671F\u6B21\u7BA1\u7406 \u2502\n\u2502 \uD83D\uDCDD doc2spec \u26A1 \u5BFC\u5165\u9700\u6C42\u6587\u6863 \u2502\n\u2502 \uD83D\uDCE6 task new \u26A1 \u521B\u5EFA\u4EFB\u52A1\uFF08\u652F\u6301\u6279\u91CF/\u8C03\u5EA6\uFF09 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83E\uDD1D \u534F\u4F5C\u51B3\u7B56 \u2502\n\u2502 \uD83D\uDD0D analyze \uD83E\uDDE0 \u9700\u6C42\u5206\u6790+\u4EE3\u7801\u5BA1\u67E5\uFF08--interactive\uFF09 \u2502\n\u2502 \uD83D\uDCCA split \uD83E\uDDE0 \u62C6\u5206\u4E3ATask\uFF08--interactive\uFF09 \u2502\n\u2502 \uD83D\uDCCB plan \uD83E\uDDE0 \u6267\u884C\u8BA1\u5212\uFF08--interactive\uFF09 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83D\uDE80 \u6267\u884C\u4EA4\u4ED8 \u2502\n\u2502 \uD83D\uDCBB execute \u26A1 \u81EA\u52A8\u6392\u5E8F+\u5206\u6279\u6267\u884C \u2502\n\u2502 \uD83D\uDD00 pr \uD83E\uDDE0 \u521B\u5EFAPR\uFF08--interactive\uFF09 \u2502\n\u2502 \u2705 done \uD83E\uDDE0 \u6536\u5C3E\u5F52\u6863\uFF08--interactive\uFF09 \u2502\n\u2502 \uD83D\uDD04 change \uD83E\uDDE0 \u9700\u6C42\u53D8\u66F4\uFF08--interactive\uFF09 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83D\uDCCA \u6CBB\u7406 + \u8C03\u5EA6 \u2502\n\u2502 \u2705 validate \u26A1 \u5408\u89C4\u6821\u9A8C \u2502\n\u2502 \u23F0 schedule \u26A1 \u5B9A\u65F6\u8C03\u5EA6\uFF08create/list/daemon\uFF09 \u2502\n\u2502 \uD83D\uDDD1 rename \u26A1 \u91CD\u547D\u540D Task/\u671F\u6B21 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83D\uDCA1 \u667A\u80FD\u5165\u53E3 \u2502\n\u2502 speccore \u81EA\u9002\u5E94\u9762\u677F\uFF08\u68C0\u6D4B\u9636\u6BB5 \u2192 \u63D0\u793A\u4E0B\u4E00\u6B65\uFF09 \u2502\n\u2502 speccore ask \"...\" \u81EA\u7136\u8BED\u8A00\u610F\u56FE\u8BC6\u522B \u2502\n| speccore dev \u667A\u80FD\u7EA7\u8054\uFF1A\u81EA\u52A8\u68C0\u6D4B\u5E76\u6267\u884C\u4E0B\u4E00\u6B65 \u2502\n\u2502 speccore status-panel \u53EF\u89C6\u5316\u770B\u677F \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n";
1
+ export declare const HELP_PANEL = "\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 \uD83E\uDDE0 = \u534F\u4F5C\u5F0F\uFF08\u652F\u6301 --interactive\uFF09 \u26A1 = \u5355\u6B21\u6267\u884C \u2502\n\u2502 \u6838\u5FC3\u6D41\u6C34\u7EBF: init \u2192 doc2spec \u2192 analyze \u2192 split \u2502\n\u2502 \u2192 plan \u2192 execute \u2192 pr \u2192 done \u2192 spec2doc \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83D\uDCE5 \u8D44\u4EA7\u63A5\u5165 \u2502\n\u2502 \uD83D\uDE80 init \u26A1 \u521D\u59CB\u5316\u9879\u76EE \u2502\n\u2502 \uD83D\uDCC5 iteration \u26A1 \u671F\u6B21\u7BA1\u7406 \u2502\n\u2502 \uD83D\uDCDD doc2spec \u26A1 \u5BFC\u5165 PRD \u2192 Spec MD\uFF08AI \u7CBE\u70BC\u63A8\u8350\uFF09 \u2502\n\u2502 \uD83D\uDCE4 spec2doc \u26A1 Spec MD \u2192 Word/PDF\uFF08AI \u6392\u7248\u63A8\u8350\uFF09 \u2502\n\u2502 \uD83D\uDCE6 task new \u26A1 \u521B\u5EFA\u4EFB\u52A1\uFF08\u652F\u6301\u6279\u91CF/\u8C03\u5EA6\uFF09 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83E\uDD1D \u534F\u4F5C\u51B3\u7B56 \u2502\n\u2502 \uD83D\uDD0D analyze \uD83E\uDDE0 \u9700\u6C42\u5206\u6790+\u4EE3\u7801\u5BA1\u67E5\uFF08--interactive\uFF09 \u2502\n\u2502 \uD83D\uDCCA split \uD83E\uDDE0 \u62C6\u5206\u4E3ATask\uFF08--interactive\uFF09 \u2502\n\u2502 \uD83D\uDCCB plan \uD83E\uDDE0 \u6267\u884C\u8BA1\u5212\uFF08--interactive\uFF09 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83D\uDE80 \u6267\u884C\u4EA4\u4ED8 \u2502\n\u2502 \uD83D\uDCBB execute \u26A1 \u81EA\u52A8\u6392\u5E8F+\u5206\u6279\u6267\u884C \u2502\n\u2502 \uD83D\uDD00 pr \uD83E\uDDE0 \u521B\u5EFAPR\uFF08--interactive\uFF09 \u2502\n\u2502 \u2705 done \uD83E\uDDE0 \u6536\u5C3E\u5F52\u6863\uFF08--interactive\uFF09 \u2502\n\u2502 \uD83D\uDD04 change \uD83E\uDDE0 \u9700\u6C42\u53D8\u66F4\uFF08--interactive\uFF09 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83D\uDCCA \u6CBB\u7406 + \u8C03\u5EA6 \u2502\n\u2502 \u2705 validate \u26A1 \u5408\u89C4\u6821\u9A8C \u2502\n\u2502 \u23F0 schedule \u26A1 \u5B9A\u65F6\u8C03\u5EA6\uFF08create/list/daemon\uFF09 \u2502\n\u2502 \uD83D\uDDD1 rename \u26A1 \u91CD\u547D\u540D Task/\u671F\u6B21 \u2502\n\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \uD83D\uDCA1 \u667A\u80FD\u5165\u53E3 \u2502\n\u2502 speccore \u81EA\u9002\u5E94\u9762\u677F\uFF08\u68C0\u6D4B\u9636\u6BB5 \u2192 \u63D0\u793A\u4E0B\u4E00\u6B65\uFF09 \u2502\n\u2502 speccore ask \"...\" \u81EA\u7136\u8BED\u8A00\u610F\u56FE\u8BC6\u522B \u2502\n\u2502 speccore dev \u667A\u80FD\u7EA7\u8054\uFF1A\u81EA\u52A8\u68C0\u6D4B\u5E76\u6267\u884C\u4E0B\u4E00\u6B65 \u2502\n\u2502 speccore dashboard \u53EF\u89C6\u5316\u4EEA\u8868\u76D8\uFF08\u671F\u6B21/\u5168\u5C40\uFF09 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n";
2
2
  //# sourceMappingURL=help-panel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"help-panel.d.ts","sourceRoot":"","sources":["../../src/core/help-panel.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,wlLAkCtB,CAAC"}
1
+ {"version":3,"file":"help-panel.d.ts","sourceRoot":"","sources":["../../src/core/help-panel.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,wxLAmCtB,CAAC"}