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.
- package/README.md +93 -77
- package/dist/cli.js +123 -45
- package/dist/cli.js.map +1 -1
- package/dist/commands/ask.d.ts +4 -5
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +257 -292
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/dashboard.d.ts +12 -0
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +442 -77
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/dev.d.ts +2 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +282 -290
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doc2spec.d.ts +2 -0
- package/dist/commands/doc2spec.d.ts.map +1 -1
- package/dist/commands/doc2spec.js +22 -6
- package/dist/commands/doc2spec.js.map +1 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +39 -0
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.js +15 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/spec2doc.d.ts +11 -0
- package/dist/commands/spec2doc.d.ts.map +1 -0
- package/dist/commands/spec2doc.js +183 -0
- package/dist/commands/spec2doc.js.map +1 -0
- package/dist/commands/status-panel.d.ts +1 -0
- package/dist/commands/status-panel.d.ts.map +1 -1
- package/dist/commands/status-panel.js +97 -3
- package/dist/commands/status-panel.js.map +1 -1
- package/dist/commands/welcome.d.ts +10 -0
- package/dist/commands/welcome.d.ts.map +1 -1
- package/dist/commands/welcome.js +77 -30
- package/dist/commands/welcome.js.map +1 -1
- package/dist/core/ask-engine.d.ts +45 -0
- package/dist/core/ask-engine.d.ts.map +1 -0
- package/dist/core/ask-engine.js +405 -0
- package/dist/core/ask-engine.js.map +1 -0
- package/dist/core/ask-host-ai.d.ts +33 -0
- package/dist/core/ask-host-ai.d.ts.map +1 -0
- package/dist/core/ask-host-ai.js +156 -0
- package/dist/core/ask-host-ai.js.map +1 -0
- package/dist/core/ask-llm.d.ts +12 -0
- package/dist/core/ask-llm.d.ts.map +1 -0
- package/dist/core/ask-llm.js +166 -0
- package/dist/core/ask-llm.js.map +1 -0
- package/dist/core/dev-llm.d.ts +34 -0
- package/dist/core/dev-llm.d.ts.map +1 -0
- package/dist/core/dev-llm.js +209 -0
- package/dist/core/dev-llm.js.map +1 -0
- package/dist/core/help-panel.d.ts +1 -1
- package/dist/core/help-panel.d.ts.map +1 -1
- package/dist/core/help-panel.js +6 -5
- package/dist/core/help-panel.js.map +1 -1
- package/dist/core/intent-recognition.js +3 -3
- package/dist/core/intent-recognition.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ask — SpecCore 万能 AI 入口引擎
|
|
3
|
+
* 四种模式:命令解释(explain) / 任务指引(guide) / 意图匹配(match) / 复杂编排(pipeline)
|
|
4
|
+
*/
|
|
5
|
+
/** ask 模式 */
|
|
6
|
+
export type AskMode = 'explain' | 'guide' | 'match' | 'pipeline';
|
|
7
|
+
/** 命令知识条目 */
|
|
8
|
+
export interface CommandKnowledge {
|
|
9
|
+
name: string;
|
|
10
|
+
aliases: string[];
|
|
11
|
+
description: string;
|
|
12
|
+
usage: string;
|
|
13
|
+
examples: string[];
|
|
14
|
+
related: string[];
|
|
15
|
+
triggers: string[];
|
|
16
|
+
}
|
|
17
|
+
/** Pipeline 步骤 */
|
|
18
|
+
export interface PipelineStep {
|
|
19
|
+
order: number;
|
|
20
|
+
command: string;
|
|
21
|
+
args: string;
|
|
22
|
+
explanation: string;
|
|
23
|
+
dependsOn?: number;
|
|
24
|
+
}
|
|
25
|
+
/** Pipeline 计划 */
|
|
26
|
+
export interface PipelinePlan {
|
|
27
|
+
steps: PipelineStep[];
|
|
28
|
+
input: string;
|
|
29
|
+
confirm: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** Ask 结果 */
|
|
32
|
+
export interface AskResult {
|
|
33
|
+
mode: AskMode;
|
|
34
|
+
summary: string;
|
|
35
|
+
detail: string;
|
|
36
|
+
commands: string[];
|
|
37
|
+
pipeline?: PipelinePlan;
|
|
38
|
+
}
|
|
39
|
+
declare const COMMAND_KB: CommandKnowledge[];
|
|
40
|
+
declare const WORKFLOWS: Record<string, PipelineStep[]>;
|
|
41
|
+
/** 判断问句属于哪种模式 */
|
|
42
|
+
export declare function classifyMode(input: string): AskMode;
|
|
43
|
+
export declare function askEngine(input: string): Promise<AskResult>;
|
|
44
|
+
export { COMMAND_KB, WORKFLOWS };
|
|
45
|
+
//# sourceMappingURL=ask-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-engine.d.ts","sourceRoot":"","sources":["../../src/core/ask-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,aAAa;AACb,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAEjE,aAAa;AACb,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,kBAAkB;AAClB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,kBAAkB;AAClB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,aAAa;AACb,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAMD,QAAA,MAAM,UAAU,EAAE,gBAAgB,EAuCjC,CAAC;AAMF,QAAA,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CA6B7C,CAAC;AAMF,iBAAiB;AACjB,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAyCnD;AA+KD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAqCjE;AAgFD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ask — SpecCore 万能 AI 入口引擎
|
|
4
|
+
* 四种模式:命令解释(explain) / 任务指引(guide) / 意图匹配(match) / 复杂编排(pipeline)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.WORKFLOWS = exports.COMMAND_KB = void 0;
|
|
8
|
+
exports.classifyMode = classifyMode;
|
|
9
|
+
exports.askEngine = askEngine;
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const intent_recognition_1 = require("./intent-recognition");
|
|
12
|
+
const ask_llm_1 = require("./ask-llm");
|
|
13
|
+
const ask_host_ai_1 = require("./ask-host-ai");
|
|
14
|
+
// ============================================================
|
|
15
|
+
// 命令知识库
|
|
16
|
+
// ============================================================
|
|
17
|
+
const COMMAND_KB = [
|
|
18
|
+
{ name: 'init', aliases: ['in'], description: '初始化 SpecCore 项目,创建 .speccore 目录和配置',
|
|
19
|
+
usage: 'speccore init [--interactive] [--name <name>]', examples: ['speccore init', 'speccore init --name my-project'], related: ['dev', 'config'], triggers: ['初始化', 'init', '开始', '新建项目', '创建项目'] },
|
|
20
|
+
{ name: 'doc2spec', aliases: ['d2s'], description: '导入 PRD/Word 文档,AI + Pandoc 双路转换为 SpecCore MD',
|
|
21
|
+
usage: 'speccore doc2spec -f <file> --iter <iteration> [--task <task>] [--no-ai]', examples: ['speccore doc2spec -f PRD.docx --iter Q3', 'speccore doc2spec -f 需求.docx --iter Q2 --task T-01 --no-ai'], related: ['spec2doc', 'analyze'], triggers: ['导入', 'doc2spec', 'word转', '文档转换', 'PRD', '需求文档'] },
|
|
22
|
+
{ name: 'spec2doc', aliases: ['s2d'], description: 'SpecCore MD 导出为 Word/PDF/HTML/PPTX',
|
|
23
|
+
usage: 'speccore spec2doc [-i <iteration>] [-t <task>] [-f <format>] [-o <output>]', examples: ['speccore spec2doc -i Q3 -o 需求.docx', 'speccore spec2doc -t T-01 -f html'], related: ['doc2spec'], triggers: ['导出', 'spec2doc', '生成文档', '导出word', '导出pdf'] },
|
|
24
|
+
{ name: 'dashboard', aliases: ['db', 'sp'], description: '项目仪表盘:期次状态/进度/健康度,--scope global 全量视图',
|
|
25
|
+
usage: 'speccore dashboard [--scope global|iteration] [--export html] [--health] [--lifecycle]', examples: ['speccore dashboard', 'speccore dashboard --scope global --export html'], related: ['analyze', 'health'], triggers: ['看板', '仪表盘', 'dashboard', '进度', '状态', '全局', '全量'] },
|
|
26
|
+
{ name: 'analyze', aliases: ['al'], description: 'AI 统一分析:需求文档+源码→分析报告,--audit 审计模式',
|
|
27
|
+
usage: 'speccore analyze [--task <id>] [--iteration <name>] [--audit]', examples: ['speccore analyze', 'speccore analyze --task T-01 --audit'], related: ['dashboard', 'validate'], triggers: ['分析', 'analyze', '审计', 'audit', '检查'] },
|
|
28
|
+
{ name: 'execute', aliases: ['ex'], description: '执行开发任务:依赖排序+分批+交互引导+计划联动',
|
|
29
|
+
usage: 'speccore execute [--task <id>] [--batch-size <n>] [--auto]', examples: ['speccore execute', 'speccore execute --batch-size 3'], related: ['plan', 'done'], triggers: ['执行', 'execute', '开发', '开始做', '干活'] },
|
|
30
|
+
{ name: 'plan', aliases: ['pl'], description: '生成执行计划+管理历史:创建/交互/列表/详情/取消',
|
|
31
|
+
usage: 'speccore plan [--all] [--task <id>] [--interactive]', examples: ['speccore plan --all', 'speccore plan --interactive'], related: ['execute', 'schedule'], triggers: ['计划', 'plan', '调度', '安排', '规划'] },
|
|
32
|
+
{ name: 'split', aliases: ['sp'], description: '拆分需求为独立 Task:预览→逐一确认/一键创建',
|
|
33
|
+
usage: 'speccore split [-f <file>] [--preview]', examples: ['speccore split -f REQUIREMENT.md', 'speccore split --preview'], related: ['task', 'plan'], triggers: ['拆分', 'split', '分解', '划分', '拆'] },
|
|
34
|
+
{ name: 'pr', aliases: ['mr'], description: '创建 Pull Request:提交预览+文件选择+交互确认',
|
|
35
|
+
usage: 'speccore pr [--task <id>] [--auto]', examples: ['speccore pr', 'speccore pr --task T-01 --auto'], related: ['done', 'execute'], triggers: ['pr', 'pull request', '提交', '合并', 'MR'] },
|
|
36
|
+
{ name: 'validate', aliases: ['vl'], description: '合规验证:检查 Spec 完整性与一致性',
|
|
37
|
+
usage: 'speccore validate [--iteration <name>]', examples: ['speccore validate', 'speccore validate --iteration Q2'], related: ['analyze', 'audit'], triggers: ['验证', 'validate', '检查', '合规', '校验'] },
|
|
38
|
+
{ name: 'sync', aliases: ['sy'], description: '双向同步:代码↔Spec,--global 同步到全局层',
|
|
39
|
+
usage: 'speccore sync [--global] [--iteration <name>]', examples: ['speccore sync', 'speccore sync --global'], related: ['dev'], triggers: ['同步', 'sync', '对齐', '更新'] },
|
|
40
|
+
{ name: 'change', aliases: ['ch'], description: '需求变更:联动更新所有关联 Spec,支持口语化输入',
|
|
41
|
+
usage: 'speccore change "<description>" [--task <id>]', examples: ['speccore change "把登录改成验证码登录"', 'speccore change "加上支付功能" --task T-03'], related: ['analyze'], triggers: ['变更', 'change', '修改', '改', '更新需求'] },
|
|
42
|
+
{ name: 'done', aliases: ['dn'], description: '收尾归档:校验→同步→审计,--all 批量归档',
|
|
43
|
+
usage: 'speccore done [--task <id>] [--all] [--interactive]', examples: ['speccore done --task T-01', 'speccore done --all'], related: ['execute', 'pr'], triggers: ['完成', 'done', '归档', '结束', '做完'] },
|
|
44
|
+
{ name: 'dev', aliases: ['d'], description: '智能级联:--auto 全自动流水线 detect→execute',
|
|
45
|
+
usage: 'speccore dev [--auto] [--from <phase>] [--to <phase>]', examples: ['speccore dev --auto', 'speccore dev --from analyze --to execute'], related: ['execute', 'plan'], triggers: ['dev', '流水线', '自动', '级联'] },
|
|
46
|
+
{ name: 'task', aliases: ['tk'], description: '任务管理:创建/列表/状态。子命令: new, list, status',
|
|
47
|
+
usage: 'speccore task new --name <name> [--id <id>] | speccore task list | speccore task status', examples: ['speccore task new --name "用户登录"', 'speccore task list'], related: ['plan', 'execute'], triggers: ['task', '任务', '创建任务', '新建'] },
|
|
48
|
+
{ name: 'iteration', aliases: ['it'], description: '期次管理:创建/拆分/列表。子命令: create, split, list',
|
|
49
|
+
usage: 'speccore iteration create -n <name> | speccore iteration split | speccore iteration list', examples: ['speccore iteration create -n Q3', 'speccore iteration list'], related: ['task', 'plan'], triggers: ['期次', 'iteration', '迭代', 'sprint'] },
|
|
50
|
+
{ name: 'search', aliases: ['sh'], description: '全文搜索:跨所有 Spec 文件关键词检索',
|
|
51
|
+
usage: 'speccore search <query> [--task <id>] [--iteration <name>]', examples: ['speccore search "登录"', 'speccore search "支付" --iteration Q2'], related: ['track'], triggers: ['搜索', 'search', '查找', '检索', 'grep'] },
|
|
52
|
+
{ name: 'track', aliases: ['trk'], description: '合并 trace + tracker: REQ→Task→Code 全链路追踪',
|
|
53
|
+
usage: 'speccore track [--req <id>] [--task <id>] [--full]', examples: ['speccore track --req REQ-001', 'speccore track --full'], related: ['search', 'analyze'], triggers: ['追踪', 'track', 'trace', '链路', '追溯'] },
|
|
54
|
+
{ name: 'rename', aliases: ['rn'], description: '重命名期次/任务,自动更新所有关联引用',
|
|
55
|
+
usage: 'speccore rename [--iteration <old> <new>] [--task <old> <new>]', examples: ['speccore rename --iteration Q2 Q3', 'speccore rename --task T-01 T-10'], related: ['sync'], triggers: ['重命名', 'rename', '改名', '更名'] },
|
|
56
|
+
];
|
|
57
|
+
exports.COMMAND_KB = COMMAND_KB;
|
|
58
|
+
// ============================================================
|
|
59
|
+
// 任务指引 — 预定义工作流
|
|
60
|
+
// ============================================================
|
|
61
|
+
const WORKFLOWS = {
|
|
62
|
+
'new feature': [
|
|
63
|
+
{ order: 1, command: 'init', args: '', explanation: '初始化项目(如果还没有)', dependsOn: undefined },
|
|
64
|
+
{ order: 2, command: 'doc2spec', args: '-f PRD.docx --iter {iteration}', explanation: '导入 PRD 文档,AI 分析生成需求规格', dependsOn: 1 },
|
|
65
|
+
{ order: 3, command: 'analyze', args: '--iteration {iteration} --audit', explanation: 'AI 分析需求,生成审计报告', dependsOn: 2 },
|
|
66
|
+
{ order: 4, command: 'split', args: '-f REQUIREMENT.md', explanation: '将需求拆分为独立开发任务', dependsOn: 3 },
|
|
67
|
+
{ order: 5, command: 'plan', args: '--all', explanation: '生成任务执行计划,确定优先级和依赖', dependsOn: 4 },
|
|
68
|
+
{ order: 6, command: 'execute', args: '--auto', explanation: '按计划依次执行开发任务', dependsOn: 5 },
|
|
69
|
+
{ order: 7, command: 'pr', args: '--auto', explanation: '代码提交后创建 Pull Request', dependsOn: 6 },
|
|
70
|
+
{ order: 8, command: 'done', args: '--all', explanation: '全部完成后归档收尾', dependsOn: 7 },
|
|
71
|
+
],
|
|
72
|
+
'bugfix': [
|
|
73
|
+
{ order: 1, command: 'task', args: 'new --name "{bug}" --type bugfix', explanation: '创建 Bug 修复任务', dependsOn: undefined },
|
|
74
|
+
{ order: 2, command: 'analyze', args: '--task {task} --audit', explanation: '分析 Bug 影响范围', dependsOn: 1 },
|
|
75
|
+
{ order: 3, command: 'execute', args: '--task {task}', explanation: '执行修复', dependsOn: 2 },
|
|
76
|
+
{ order: 4, command: 'validate', args: '', explanation: '验证修复完整性', dependsOn: 3 },
|
|
77
|
+
{ order: 5, command: 'pr', args: '--task {task}', explanation: '提交修复 PR', dependsOn: 4 },
|
|
78
|
+
{ order: 6, command: 'done', args: '--task {task}', explanation: '归档修复记录', dependsOn: 5 },
|
|
79
|
+
],
|
|
80
|
+
'batch execute': [
|
|
81
|
+
{ order: 1, command: 'plan', args: '--all', explanation: '生成所有待执行任务的计划', dependsOn: undefined },
|
|
82
|
+
{ order: 2, command: 'schedule', args: 'create --at "{time}" --batch-size {batch}', explanation: '创建定时调度,指定执行时间和批次大小', dependsOn: 1 },
|
|
83
|
+
{ order: 3, command: 'execute', args: '--auto --batch-size {batch}', explanation: '按计划分批自动执行', dependsOn: 2 },
|
|
84
|
+
],
|
|
85
|
+
'code review': [
|
|
86
|
+
{ order: 1, command: 'validate', args: '', explanation: '合规检查 Spec 完整性', dependsOn: undefined },
|
|
87
|
+
{ order: 2, command: 'analyze', args: '--audit', explanation: '深度审计分析', dependsOn: 1 },
|
|
88
|
+
{ order: 3, command: 'pr', args: '--auto', explanation: '生成 PR 审查', dependsOn: 2 },
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
exports.WORKFLOWS = WORKFLOWS;
|
|
92
|
+
// ============================================================
|
|
93
|
+
// 引擎核心
|
|
94
|
+
// ============================================================
|
|
95
|
+
/** 判断问句属于哪种模式 */
|
|
96
|
+
function classifyMode(input) {
|
|
97
|
+
const lower = input.toLowerCase();
|
|
98
|
+
// 模式1: 命令解释 — 询问特定命令用法
|
|
99
|
+
const explainPatterns = [
|
|
100
|
+
/(dashboard|dev|init|execute|plan|pr|sync|validate|analyze|split|search|track|rename|doc2spec|spec2doc|ask)\s*(命令|用法|怎么用|是什么|功能|参数|选项)/,
|
|
101
|
+
/怎么用\s*(dashboard|dev|init|execute|plan|pr|sync|validate|analyze|split|search|track)/,
|
|
102
|
+
/(dashboard|dev|init|execute|plan|pr|sync|validate|analyze|split|search|track)\s*有哪些/,
|
|
103
|
+
/解释[一下]?\s*(dashboard|dev|init|execute|plan|pr|sync|validate|analyze|split|search|track)/,
|
|
104
|
+
/(what|how).*use.*(dashboard|dev|init|execute|plan|pr|sync)/i,
|
|
105
|
+
];
|
|
106
|
+
if (explainPatterns.some(p => p.test(lower)))
|
|
107
|
+
return 'explain';
|
|
108
|
+
// 模式4: 复杂编排 — 包含多个动作词 + 时序/数量词
|
|
109
|
+
const pipelineKeywords = ['然后', '再', '接着', '最后', '同时', '之后',
|
|
110
|
+
'then', 'after', 'finally', '同时执行', 'pipeline'];
|
|
111
|
+
const actionWords = ['计划', '执行', '分批', '定时', '安排', '调度',
|
|
112
|
+
'plan', 'execute', 'schedule', 'batch'];
|
|
113
|
+
const hasTiming = /晚.*点|早上.*点|明天|今天|后天|下周|周[一到日]|(\d+)[点时]/i.test(lower);
|
|
114
|
+
const hasBatch = /分批|批次|batch|一批|一组/i.test(lower);
|
|
115
|
+
const actionCount = actionWords.filter(w => lower.includes(w)).length;
|
|
116
|
+
const pipelineCount = pipelineKeywords.filter(w => lower.includes(w)).length;
|
|
117
|
+
if ((actionCount >= 2) || (actionCount >= 1 && (hasTiming || hasBatch)) || pipelineCount >= 2)
|
|
118
|
+
return 'pipeline';
|
|
119
|
+
// 模式2: 任务指引 — 问"怎么做/如何/我想做"
|
|
120
|
+
const guidePatterns = [
|
|
121
|
+
/怎么[做弄搞]/,
|
|
122
|
+
/如何/,
|
|
123
|
+
/步骤/,
|
|
124
|
+
/流程/,
|
|
125
|
+
/从[哪零]开始/,
|
|
126
|
+
/我想[做弄搞]/,
|
|
127
|
+
/帮我[做弄搞]/,
|
|
128
|
+
/how\s+(to|do|can\s+i)/i,
|
|
129
|
+
/什么流程/,
|
|
130
|
+
/需要.*命令/,
|
|
131
|
+
];
|
|
132
|
+
if (guidePatterns.some(p => p.test(lower)))
|
|
133
|
+
return 'guide';
|
|
134
|
+
// 默认:意图匹配
|
|
135
|
+
return 'match';
|
|
136
|
+
}
|
|
137
|
+
/** 匹配命令知识 */
|
|
138
|
+
function matchCommandInKB(input) {
|
|
139
|
+
const lower = input.toLowerCase();
|
|
140
|
+
// 精确匹配命令名
|
|
141
|
+
for (const cmd of COMMAND_KB) {
|
|
142
|
+
if (lower.includes(cmd.name))
|
|
143
|
+
return cmd;
|
|
144
|
+
for (const alias of cmd.aliases) {
|
|
145
|
+
if (lower.includes(alias) && alias.length > 1)
|
|
146
|
+
return cmd;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// 触发词匹配
|
|
150
|
+
let best = null;
|
|
151
|
+
let bestScore = 0;
|
|
152
|
+
for (const cmd of COMMAND_KB) {
|
|
153
|
+
const score = cmd.triggers.filter(t => lower.includes(t)).length;
|
|
154
|
+
if (score > bestScore) {
|
|
155
|
+
bestScore = score;
|
|
156
|
+
best = cmd;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return bestScore > 0 ? best : null;
|
|
160
|
+
}
|
|
161
|
+
/** 模式1: 命令解释 */
|
|
162
|
+
function handleExplain(input) {
|
|
163
|
+
const cmd = matchCommandInKB(input);
|
|
164
|
+
if (!cmd) {
|
|
165
|
+
return { mode: 'explain', summary: '未找到匹配的命令', detail: `没有找到与 "${input}" 相关的命令。请尝试:\n speccore help — 查看所有命令\n speccore ask "dashboard 怎么用"`, commands: [] };
|
|
166
|
+
}
|
|
167
|
+
const detail = [
|
|
168
|
+
`📖 ${cmd.name} ${cmd.aliases.length ? '(' + cmd.aliases.join('/') + ')' : ''}`,
|
|
169
|
+
` 描述: ${cmd.description}`,
|
|
170
|
+
` 用法: ${cmd.usage}`,
|
|
171
|
+
``,
|
|
172
|
+
` 示例:`,
|
|
173
|
+
...cmd.examples.map(e => ` $ ${e}`),
|
|
174
|
+
``,
|
|
175
|
+
` 关联命令: ${cmd.related.join(', ')}`,
|
|
176
|
+
``,
|
|
177
|
+
`💡 更多参数: speccore ${cmd.name} --help`,
|
|
178
|
+
].join('\n');
|
|
179
|
+
return { mode: 'explain', summary: `${cmd.name} 命令详解`, detail, commands: [cmd.name] };
|
|
180
|
+
}
|
|
181
|
+
/** 模式2: 任务指引 */
|
|
182
|
+
function handleGuide(input) {
|
|
183
|
+
// 匹配工作流
|
|
184
|
+
let matchedWorkflow = null;
|
|
185
|
+
let workflowName = '';
|
|
186
|
+
if (/bug|修复|fix|defect/i.test(input)) {
|
|
187
|
+
matchedWorkflow = WORKFLOWS['bugfix'];
|
|
188
|
+
workflowName = 'Bug 修复流程';
|
|
189
|
+
}
|
|
190
|
+
else if (/审查|review|检查代码|code review/i.test(input)) {
|
|
191
|
+
matchedWorkflow = WORKFLOWS['code review'];
|
|
192
|
+
workflowName = '代码审查流程';
|
|
193
|
+
}
|
|
194
|
+
else if (/新功能|feature|登录|注册|支付|创建.*功能|做.*功能/i.test(input)) {
|
|
195
|
+
matchedWorkflow = WORKFLOWS['new feature'];
|
|
196
|
+
workflowName = '新功能开发全流程';
|
|
197
|
+
}
|
|
198
|
+
else if (/批量|分批|batch|队列/i.test(input)) {
|
|
199
|
+
matchedWorkflow = WORKFLOWS['batch execute'];
|
|
200
|
+
workflowName = '批量执行流程';
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// 默认:新功能全流程
|
|
204
|
+
matchedWorkflow = WORKFLOWS['new feature'];
|
|
205
|
+
workflowName = '推荐标准开发流程';
|
|
206
|
+
}
|
|
207
|
+
const steps = matchedWorkflow.map(s => ` ${s.order}. speccore ${s.command}${s.args ? ' ' + s.args : ''}` +
|
|
208
|
+
`\n → ${s.explanation}`).join('\n\n');
|
|
209
|
+
const detail = [
|
|
210
|
+
`🗺️ ${workflowName}`,
|
|
211
|
+
``,
|
|
212
|
+
steps,
|
|
213
|
+
``,
|
|
214
|
+
`---`,
|
|
215
|
+
`执行方式:`,
|
|
216
|
+
` 逐步执行: 按顺序手动执行每一步`,
|
|
217
|
+
` 一键执行: speccore dev --auto(自动检测并推进)`,
|
|
218
|
+
` 编排执行: speccore ask "完整描述你的需求" --pipeline`,
|
|
219
|
+
].join('\n');
|
|
220
|
+
return {
|
|
221
|
+
mode: 'guide',
|
|
222
|
+
summary: `已为你规划「${workflowName}」(${matchedWorkflow.length} 步)`,
|
|
223
|
+
detail,
|
|
224
|
+
commands: matchedWorkflow.map(s => s.command),
|
|
225
|
+
pipeline: { steps: matchedWorkflow, input, confirm: false },
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/** 模式3: 意图匹配(当前 ask 逻辑) */
|
|
229
|
+
async function handleMatch(input) {
|
|
230
|
+
// 优先用 KB 精确匹配
|
|
231
|
+
const kbMatch = matchCommandInKB(input);
|
|
232
|
+
const results = await (0, intent_recognition_1.recognizeIntent)(input);
|
|
233
|
+
const best = results[0];
|
|
234
|
+
// 如果 KB 有匹配且置信度高于意图识别,用 KB
|
|
235
|
+
if (kbMatch && (!best || best.confidence < 70)) {
|
|
236
|
+
return { mode: 'match', summary: `✅ 推荐: ${kbMatch.name}`, detail: `🎯 推荐命令: speccore ${kbMatch.name}\n${kbMatch.description}\n\n用法: ${kbMatch.usage}\n\n示例:\n${kbMatch.examples.map(e => ' $ ' + e).join('\n')}`, commands: [kbMatch.name] };
|
|
237
|
+
}
|
|
238
|
+
if (results.length === 0) {
|
|
239
|
+
if (kbMatch) {
|
|
240
|
+
return { mode: 'match', summary: `建议使用 ${kbMatch.name}`, detail: `💡 推荐命令: speccore ${kbMatch.name}\n${kbMatch.description}\n\n用法: ${kbMatch.usage}`, commands: [kbMatch.name] };
|
|
241
|
+
}
|
|
242
|
+
return { mode: 'match', summary: '未识别到匹配命令', detail: '我无法完全理解你的意图。试试:\n speccore help — 查看命令列表\n 或更详细地描述你想做什么', commands: [] };
|
|
243
|
+
}
|
|
244
|
+
const cmdName = kbMatch?.name || best.command || best.intent;
|
|
245
|
+
return {
|
|
246
|
+
mode: 'match',
|
|
247
|
+
summary: `匹配到: ${best.intent} (${best.confidence}%)`,
|
|
248
|
+
detail: kbMatch ? `🎯 推荐命令: speccore ${kbMatch.name}\n${kbMatch.description}\n\n用法: ${kbMatch.usage}` : `🎯 speccore ${cmdName}`,
|
|
249
|
+
commands: [cmdName],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/** 模式4: 复杂编排 */
|
|
253
|
+
function handlePipeline(input) {
|
|
254
|
+
const lower = input.toLowerCase();
|
|
255
|
+
// 匹配批量执行流程
|
|
256
|
+
if (/计划.*执行|plan.*execute|分批|batch|定时|schedule|晚.*点|早上|几点/.test(lower)) {
|
|
257
|
+
const steps = WORKFLOWS['batch execute'];
|
|
258
|
+
return {
|
|
259
|
+
mode: 'pipeline',
|
|
260
|
+
summary: `已编排「批量执行流程」(${steps.length} 步)`,
|
|
261
|
+
detail: buildPipelineDetail(steps, input),
|
|
262
|
+
commands: steps.map(s => s.command),
|
|
263
|
+
pipeline: { steps, input, confirm: true },
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
// 匹配新功能流程
|
|
267
|
+
if (/功能|feature|开发|新.*模块|做.*个/.test(lower)) {
|
|
268
|
+
const steps = WORKFLOWS['new feature'];
|
|
269
|
+
return {
|
|
270
|
+
mode: 'pipeline',
|
|
271
|
+
summary: `已编排「新功能开发流程」(${steps.length} 步)`,
|
|
272
|
+
detail: buildPipelineDetail(steps, input),
|
|
273
|
+
commands: steps.map(s => s.command),
|
|
274
|
+
pipeline: { steps, input, confirm: true },
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
// 默认返回 guide
|
|
278
|
+
return handleGuide(input);
|
|
279
|
+
}
|
|
280
|
+
function buildPipelineDetail(steps, input) {
|
|
281
|
+
return [
|
|
282
|
+
`📋 执行计划预览 (来源: "${input}")`,
|
|
283
|
+
``,
|
|
284
|
+
...steps.map(s => ` ${s.order}. \x1b[36mspeccore ${s.command}${s.args ? ' ' + s.args : ''}\x1b[0m` +
|
|
285
|
+
(s.dependsOn ? ` ← 依赖步骤 ${s.dependsOn}` : '') +
|
|
286
|
+
`\n ${s.explanation}`),
|
|
287
|
+
``,
|
|
288
|
+
`---`,
|
|
289
|
+
`⚠️ 请确认后执行。输入 y 确认,或修改参数后重试。`,
|
|
290
|
+
].join('\n');
|
|
291
|
+
}
|
|
292
|
+
// ============================================================
|
|
293
|
+
// 统一入口
|
|
294
|
+
// ============================================================
|
|
295
|
+
async function askEngine(input) {
|
|
296
|
+
// ── 第一层: 自有 LLM (OpenAI/Ollama) ──
|
|
297
|
+
try {
|
|
298
|
+
const llmResult = await (0, ask_llm_1.askWithLlm)(input);
|
|
299
|
+
if (llmResult && llmResult.commands.length > 0) {
|
|
300
|
+
logger_1.logger.info(`🧠 自有 LLM: ${modeLabel(llmResult.mode)}`);
|
|
301
|
+
if (!llmResult.detail || llmResult.detail.length < 20) {
|
|
302
|
+
const enriched = enrichWithRules(llmResult, input);
|
|
303
|
+
return enriched;
|
|
304
|
+
}
|
|
305
|
+
return llmResult;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch (e) {
|
|
309
|
+
logger_1.logger.warn(`自有 LLM 不可用: ${e.message}`);
|
|
310
|
+
}
|
|
311
|
+
// ── 第二层: 宿主 AI (WorkBuddy/TRAE/Qoder) ──
|
|
312
|
+
try {
|
|
313
|
+
const hostResult = await (0, ask_host_ai_1.tryHostAi)('ask', input);
|
|
314
|
+
if (hostResult) {
|
|
315
|
+
logger_1.logger.info(`🤖 宿主 AI: ${modeLabel((hostResult.mode || 'match'))}`);
|
|
316
|
+
return hostResult;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch (e) { /* 宿主 AI 不可用,继续 */ }
|
|
320
|
+
// ── 第三层: 规则引擎兜底 ──
|
|
321
|
+
const mode = classifyMode(input);
|
|
322
|
+
logger_1.logger.info(`📐 规则识别: ${modeLabel(mode)}`);
|
|
323
|
+
switch (mode) {
|
|
324
|
+
case 'explain': return handleExplain(input);
|
|
325
|
+
case 'guide': return handleGuide(input);
|
|
326
|
+
case 'pipeline': return handlePipeline(input);
|
|
327
|
+
case 'match':
|
|
328
|
+
default: return handleMatch(input);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/** 用规则引擎补充 LLM 结果的内容 */
|
|
332
|
+
function enrichWithRules(llmResult, input) {
|
|
333
|
+
const mode = llmResult.mode || 'match';
|
|
334
|
+
switch (mode) {
|
|
335
|
+
case 'explain': {
|
|
336
|
+
const cmd = matchCommandInKB(input);
|
|
337
|
+
if (cmd) {
|
|
338
|
+
return { ...llmResult, detail: buildExplainDetail(cmd) };
|
|
339
|
+
}
|
|
340
|
+
return llmResult;
|
|
341
|
+
}
|
|
342
|
+
case 'guide': {
|
|
343
|
+
const wf = matchWorkflow(input);
|
|
344
|
+
if (wf) {
|
|
345
|
+
return { ...llmResult, detail: buildGuideDetail(wf.name, wf.steps), pipeline: wf.steps.length > 0 ? { steps: wf.steps, input, confirm: false } : undefined };
|
|
346
|
+
}
|
|
347
|
+
return llmResult;
|
|
348
|
+
}
|
|
349
|
+
case 'pipeline': {
|
|
350
|
+
const wf = matchWorkflow(input);
|
|
351
|
+
if (wf) {
|
|
352
|
+
return { ...llmResult, detail: buildPipelineDetail(wf.steps, input), pipeline: { steps: wf.steps, input, confirm: true } };
|
|
353
|
+
}
|
|
354
|
+
return llmResult;
|
|
355
|
+
}
|
|
356
|
+
default:
|
|
357
|
+
return llmResult;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
function buildExplainDetail(cmd) {
|
|
361
|
+
return [
|
|
362
|
+
`📖 ${cmd.name} ${cmd.aliases.length ? '(' + cmd.aliases.join('/') + ')' : ''}`,
|
|
363
|
+
` 描述: ${cmd.description}`,
|
|
364
|
+
` 用法: ${cmd.usage}`,
|
|
365
|
+
``,
|
|
366
|
+
` 示例:`,
|
|
367
|
+
...cmd.examples.map(e => ` $ ${e}`),
|
|
368
|
+
``,
|
|
369
|
+
` 关联命令: ${cmd.related.join(', ')}`,
|
|
370
|
+
``,
|
|
371
|
+
`💡 更多参数: speccore ${cmd.name} --help`,
|
|
372
|
+
].join('\n');
|
|
373
|
+
}
|
|
374
|
+
function buildGuideDetail(name, steps) {
|
|
375
|
+
const s = steps.map(s => ` ${s.order}. speccore ${s.command}${s.args ? ' ' + s.args : ''}` +
|
|
376
|
+
`\n → ${s.explanation}`).join('\n\n');
|
|
377
|
+
return [
|
|
378
|
+
`🗺️ ${name}`,
|
|
379
|
+
``,
|
|
380
|
+
s,
|
|
381
|
+
``,
|
|
382
|
+
`---`,
|
|
383
|
+
`执行方式:`,
|
|
384
|
+
` 逐步执行: 按顺序手动执行每一步`,
|
|
385
|
+
` 一键执行: speccore dev --auto(自动检测并推进)`,
|
|
386
|
+
` 编排执行: speccore ask "完整描述你的需求" --pipeline`,
|
|
387
|
+
].join('\n');
|
|
388
|
+
}
|
|
389
|
+
function matchWorkflow(input) {
|
|
390
|
+
const lower = input.toLowerCase();
|
|
391
|
+
if (/bug|修复|fix|defect/i.test(lower))
|
|
392
|
+
return { name: 'Bug 修复流程', steps: WORKFLOWS['bugfix'] };
|
|
393
|
+
if (/审查|review|检查代码|code review/i.test(lower))
|
|
394
|
+
return { name: '代码审查流程', steps: WORKFLOWS['code review'] };
|
|
395
|
+
if (/新功能|feature|登录|注册|支付|创建.*功能|做.*功能/i.test(lower))
|
|
396
|
+
return { name: '新功能开发全流程', steps: WORKFLOWS['new feature'] };
|
|
397
|
+
if (/批量|分批|batch|队列|计划.*执行|定时/i.test(lower))
|
|
398
|
+
return { name: '批量执行流程', steps: WORKFLOWS['batch execute'] };
|
|
399
|
+
return { name: '推荐标准开发流程', steps: WORKFLOWS['new feature'] };
|
|
400
|
+
}
|
|
401
|
+
function modeLabel(mode) {
|
|
402
|
+
const labels = { explain: '📖 命令解释', guide: '🗺️ 任务指引', match: '🎯 意图匹配', pipeline: '⚡ 复杂编排' };
|
|
403
|
+
return labels[mode];
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=ask-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-engine.js","sourceRoot":"","sources":["../../src/core/ask-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ask-host-ai — 宿主 AI 层(WorkBuddy / TRAE / Qoder)
|
|
3
|
+
* 通过文件协议与用户当前使用的 AI 工具通信
|
|
4
|
+
*
|
|
5
|
+
* 协议:
|
|
6
|
+
* 1. CLI 写入 ~/.speccore/.ai-request.json
|
|
7
|
+
* 2. 宿主 AI 检测文件变更,读取后处理
|
|
8
|
+
* 3. 宿主 AI 写入 ~/.speccore/.ai-response.json
|
|
9
|
+
* 4. CLI 轮询读取响应(最多等待 15 秒)
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* 检测当前运行环境中的 AI 工具
|
|
13
|
+
*/
|
|
14
|
+
export type HostAiTool = 'workbuddy' | 'trae' | 'qoder' | 'none';
|
|
15
|
+
export declare function detectHostAi(): HostAiTool;
|
|
16
|
+
/**
|
|
17
|
+
* 通过文件协议发送请求给宿主 AI
|
|
18
|
+
*
|
|
19
|
+
* 宿主 AI(WorkBuddy 等)需要设置文件监听:
|
|
20
|
+
* 监控 ~/.speccore/.ai-request.json 的变更
|
|
21
|
+
* 读取 → 用 AI 处理 → 写入 ~/.speccore/.ai-response.json
|
|
22
|
+
*/
|
|
23
|
+
export declare function askHostAi(type: 'ask' | 'dev' | 'welcome', input: string, context?: Record<string, any>): Promise<any | null>;
|
|
24
|
+
/**
|
|
25
|
+
* WorkBuddy 环境下的特殊处理:
|
|
26
|
+
* 通过 stdout 输出特殊标记,让 WorkBuddy agent 识别并响应
|
|
27
|
+
*
|
|
28
|
+
* 标记格式: <<SPECCORE_ASK>>...<<END_SPECCORE_ASK>>
|
|
29
|
+
* WorkBuddy agent 检测到后,用其 AI 能力处理并输出结果
|
|
30
|
+
*/
|
|
31
|
+
export declare function emitWorkBuddySignal(type: string, input: string, context: Record<string, any>): void;
|
|
32
|
+
export declare function tryHostAi(type: 'ask' | 'dev' | 'welcome', input: string, context?: Record<string, any>): Promise<any | null>;
|
|
33
|
+
//# sourceMappingURL=ask-host-ai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-host-ai.d.ts","sourceRoot":"","sources":["../../src/core/ask-host-ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmCH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjE,wBAAgB,YAAY,IAAI,UAAU,CAezC;AAMD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,EAC/B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAChC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CA+CrB;AAUD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAGnG;AAMD,wBAAsB,SAAS,CAC7B,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,EAC/B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAChC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CA0BrB"}
|