speccore 8.3.182 → 8.3.188
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/spec-analyze/SKILL.md +2 -169
- package/.agents/skills/spec-ask/SKILL.md +2 -177
- package/.agents/skills/spec-change/SKILL.md +2 -214
- package/.agents/skills/spec-dashboard/SKILL.md +1 -76
- package/.agents/skills/spec-deploy/SKILL.md +2 -298
- package/.agents/skills/spec-doc2spec/SKILL.md +2 -116
- package/.agents/skills/spec-done/SKILL.md +2 -203
- package/.agents/skills/spec-execute/SKILL.md +2 -178
- package/.agents/skills/spec-help/SKILL.md +1 -75
- package/.agents/skills/spec-iteration-create/SKILL.md +2 -123
- package/.agents/skills/spec-plan/SKILL.md +2 -117
- package/.agents/skills/spec-pr/SKILL.md +2 -203
- package/.agents/skills/spec-run/SKILL.md +16 -0
- package/.agents/skills/spec-spec2doc/SKILL.md +2 -121
- package/.agents/skills/spec-split/SKILL.md +2 -208
- package/.agents/skills/spec-task-create/SKILL.md +2 -151
- package/.agents/skills/spec-verify/SKILL.md +2 -214
- package/.agents/skills/spec-welcome/SKILL.md +1 -67
- package/.agents/skills/speccore-router/SKILL.md +14 -2
- package/README.en.md +9 -9
- package/README.md +2 -1
- package/dist/cli.js +24 -25
- package/dist/cli.js.map +1 -1
- package/dist/commands/about.js +1 -1
- package/dist/commands/about.js.map +1 -1
- package/dist/commands/analyze.d.ts +1 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +38 -5
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/ask.js +6 -6
- package/dist/commands/ask.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 +102 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.js +28 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/execute.js +3 -3
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +31 -52
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/iteration/split.d.ts.map +1 -1
- package/dist/commands/iteration/split.js +12 -39
- package/dist/commands/iteration/split.js.map +1 -1
- package/dist/commands/knowledge.d.ts +0 -12
- package/dist/commands/knowledge.d.ts.map +1 -1
- package/dist/commands/knowledge.js +0 -80
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/refresh.d.ts.map +1 -1
- package/dist/commands/refresh.js +10 -0
- package/dist/commands/refresh.js.map +1 -1
- package/dist/commands/search.d.ts +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +38 -0
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +13 -3
- package/dist/commands/update.js.map +1 -1
- package/dist/core/agent-adapter.d.ts +6 -0
- package/dist/core/agent-adapter.d.ts.map +1 -1
- package/dist/core/agent-adapter.js +56 -172
- package/dist/core/agent-adapter.js.map +1 -1
- package/dist/core/agents/defaults/code-generator.md +64 -0
- package/dist/core/agents/defaults/code-reviewer.md +5 -0
- package/dist/core/agents/defaults/compiler.md +7 -0
- package/dist/core/agents/defaults/compliance-checker.md +2 -0
- package/dist/core/agents/defaults/dependency-analyst.md +5 -0
- package/dist/core/agents/defaults/doc-sync-agent.md +5 -0
- package/dist/core/agents/defaults/effort-estimator.md +28 -0
- package/dist/core/agents/defaults/global-analyzer.md +66 -0
- package/dist/core/agents/defaults/impact-analyst.md +5 -0
- package/dist/core/agents/defaults/interaction-designer.md +5 -0
- package/dist/core/agents/defaults/performance-expert.md +2 -0
- package/dist/core/agents/defaults/product-analyst-backend.md +6 -0
- package/dist/core/agents/defaults/product-analyst-frontend.md +6 -0
- package/dist/core/agents/defaults/product-analyst.md +5 -0
- package/dist/core/agents/defaults/regression-tester.md +5 -0
- package/dist/core/agents/defaults/requirement-analyzer.md +72 -0
- package/dist/core/agents/defaults/risk-assessor.md +5 -0
- package/dist/core/agents/defaults/schedule-planner.md +5 -0
- package/dist/core/agents/defaults/security-reviewer-finance.md +6 -0
- package/dist/core/agents/defaults/security-reviewer.md +7 -0
- package/dist/core/agents/defaults/task-decomposer.md +5 -0
- package/dist/core/agents/defaults/test-engineer.md +2 -0
- package/dist/core/agents/defaults/test-reviewer.md +5 -0
- package/dist/core/agents/engine/agent-loader.d.ts.map +1 -1
- package/dist/core/agents/engine/agent-loader.js +76 -6
- package/dist/core/agents/engine/agent-loader.js.map +1 -1
- package/dist/core/agents/engine/types.d.ts +5 -0
- package/dist/core/agents/engine/types.d.ts.map +1 -1
- package/dist/core/analyze-engine.d.ts.map +1 -1
- package/dist/core/analyze-engine.js +73 -82
- package/dist/core/analyze-engine.js.map +1 -1
- package/dist/core/ask-engine.d.ts +0 -58
- package/dist/core/ask-engine.d.ts.map +1 -1
- package/dist/core/ask-engine.js +63 -361
- package/dist/core/ask-engine.js.map +1 -1
- package/dist/core/business-rules.d.ts +36 -0
- package/dist/core/business-rules.d.ts.map +1 -0
- package/dist/core/business-rules.js +109 -0
- package/dist/core/business-rules.js.map +1 -0
- package/dist/core/change-impact-global.d.ts.map +1 -1
- package/dist/core/change-impact-global.js +4 -3
- package/dist/core/change-impact-global.js.map +1 -1
- package/dist/core/code-scanner.d.ts +1 -0
- package/dist/core/code-scanner.d.ts.map +1 -1
- package/dist/core/code-scanner.js +32 -3
- package/dist/core/code-scanner.js.map +1 -1
- package/dist/core/content-delivery.d.ts +59 -0
- package/dist/core/content-delivery.d.ts.map +1 -0
- package/dist/core/content-delivery.js +219 -0
- package/dist/core/content-delivery.js.map +1 -0
- package/dist/core/global-artifacts.d.ts.map +1 -1
- package/dist/core/global-artifacts.js +262 -19
- package/dist/core/global-artifacts.js.map +1 -1
- package/dist/core/global-retrieval.d.ts +38 -0
- package/dist/core/global-retrieval.d.ts.map +1 -0
- package/dist/core/global-retrieval.js +100 -0
- package/dist/core/global-retrieval.js.map +1 -0
- package/dist/core/html-prototype.d.ts +22 -0
- package/dist/core/html-prototype.d.ts.map +1 -0
- package/dist/core/html-prototype.js +103 -0
- package/dist/core/html-prototype.js.map +1 -0
- package/dist/core/multi-lang-parser.d.ts +43 -0
- package/dist/core/multi-lang-parser.d.ts.map +1 -0
- package/dist/core/multi-lang-parser.js +317 -0
- package/dist/core/multi-lang-parser.js.map +1 -0
- package/dist/core/pipeline-engine.js +16 -16
- package/dist/core/pipeline-engine.js.map +1 -1
- package/dist/core/platform-inference.d.ts +35 -0
- package/dist/core/platform-inference.d.ts.map +1 -0
- package/dist/core/platform-inference.js +205 -0
- package/dist/core/platform-inference.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +1 -1
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +62 -63
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/refresh-scheduler.d.ts +50 -0
- package/dist/core/refresh-scheduler.d.ts.map +1 -0
- package/dist/core/refresh-scheduler.js +139 -0
- package/dist/core/refresh-scheduler.js.map +1 -0
- package/dist/core/reverse-requirement.d.ts +54 -0
- package/dist/core/reverse-requirement.d.ts.map +1 -0
- package/dist/core/reverse-requirement.js +277 -0
- package/dist/core/reverse-requirement.js.map +1 -0
- package/dist/core/schemas/task.schema.d.ts +2 -2
- package/dist/core/spec-skeleton.d.ts.map +1 -1
- package/dist/core/spec-skeleton.js +123 -0
- package/dist/core/spec-skeleton.js.map +1 -1
- package/dist/core/unified-config.d.ts +14 -0
- package/dist/core/unified-config.d.ts.map +1 -1
- package/dist/core/unified-config.js +94 -10
- package/dist/core/unified-config.js.map +1 -1
- package/dist/core/unified-retrieval.d.ts.map +1 -1
- package/dist/core/unified-retrieval.js +34 -8
- package/dist/core/unified-retrieval.js.map +1 -1
- package/dist/utils/task-utils.d.ts +4 -0
- package/dist/utils/task-utils.d.ts.map +1 -1
- package/dist/utils/task-utils.js +18 -0
- package/dist/utils/task-utils.js.map +1 -1
- package/package.json +5 -3
- package/vendor/tree-sitter/tree-sitter-go.wasm +0 -0
- package/vendor/tree-sitter/tree-sitter-java.wasm +0 -0
- package/vendor/tree-sitter/tree-sitter-python.wasm +0 -0
- package/vendor/tree-sitter/tree-sitter-rust.wasm +0 -0
- package/.agents/agents/README.md +0 -79
- package/.agents/agents/spec-analyzer.md +0 -41
- package/.agents/agents/spec-architect.md +0 -57
- package/.agents/agents/spec-change-detector.md +0 -55
- package/.agents/agents/spec-clarifier.md +0 -83
- package/.agents/agents/spec-executor.md +0 -41
- package/.agents/agents/spec-gatekeeper.md +0 -84
- package/.agents/agents/spec-global-analyzer.md +0 -111
- package/.agents/agents/spec-knowledge-curator.md +0 -54
- package/.agents/agents/spec-reviewer.md +0 -46
- package/.agents/agents/spec-security-auditor.md +0 -56
- package/.agents/agents/spec-tester.md +0 -120
- package/.agents/skills/spec-analyze/references/analysis-report.md +0 -9
- package/.agents/skills/spec-execute/references/code-output.md +0 -13
- package/.agents/skills/spec-plan/references/plan-template.md +0 -29
- package/.agents/skills/spec-task-create/references/requirement-template.md +0 -23
- package/dist/commands/bugfix.d.ts +0 -17
- package/dist/commands/bugfix.d.ts.map +0 -1
- package/dist/commands/bugfix.js +0 -301
- package/dist/commands/bugfix.js.map +0 -1
- package/dist/commands/help-quick.d.ts +0 -3
- package/dist/commands/help-quick.d.ts.map +0 -1
- package/dist/commands/help-quick.js +0 -66
- package/dist/commands/help-quick.js.map +0 -1
- package/dist/commands/index-update.d.ts +0 -8
- package/dist/commands/index-update.d.ts.map +0 -1
- package/dist/commands/index-update.js +0 -180
- package/dist/commands/index-update.js.map +0 -1
- package/dist/commands/schedule.d.ts +0 -26
- package/dist/commands/schedule.d.ts.map +0 -1
- package/dist/commands/schedule.js +0 -182
- package/dist/commands/schedule.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -11
- package/dist/commands/watch.d.ts.map +0 -1
- package/dist/commands/watch.js +0 -166
- package/dist/commands/watch.js.map +0 -1
- package/dist/core/ai-markdown.d.ts +0 -5
- package/dist/core/ai-markdown.d.ts.map +0 -1
- package/dist/core/ai-markdown.js +0 -29
- package/dist/core/ai-markdown.js.map +0 -1
- package/dist/core/schedule-engine.d.ts +0 -25
- package/dist/core/schedule-engine.d.ts.map +0 -1
- package/dist/core/schedule-engine.js +0 -281
- package/dist/core/schedule-engine.js.map +0 -1
- package/dist/core/schedule-store.d.ts +0 -119
- package/dist/core/schedule-store.d.ts.map +0 -1
- package/dist/core/schedule-store.js +0 -216
- package/dist/core/schedule-store.js.map +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* refresh-scheduler.ts — 知识底座统一刷新调度
|
|
4
|
+
*
|
|
5
|
+
* 收拢三类刷新对象(RAG 索引 / 知识图谱 / 代码索引)到统一入口,
|
|
6
|
+
* 提供 stale 判定(过期才刷)+ force(强制全量)+ 按 scope 分文件。
|
|
7
|
+
*
|
|
8
|
+
* 刷新对象:
|
|
9
|
+
* RAG 索引 — task→rag-index.json / iteration→rag-index-{iter}.json / global→rag-index-global.json
|
|
10
|
+
* 知识图谱 — knowledge-graph.json(比较 generated 时间 vs 迭代文件 mtime)
|
|
11
|
+
* 代码索引 — .speccore/cache/code-structure.json(mtime 精确判断)
|
|
12
|
+
*
|
|
13
|
+
* 调用时机:分析/变更/检索关键命令前、sync 后;可独立作为 hook 入口。
|
|
14
|
+
*
|
|
15
|
+
* v8.3.184+
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.refreshKnowledgeBase = refreshKnowledgeBase;
|
|
19
|
+
const path_1 = require("path");
|
|
20
|
+
const fs_extra_1 = require("fs-extra");
|
|
21
|
+
const logger_1 = require("../utils/logger");
|
|
22
|
+
const rag_engine_1 = require("./rag-engine");
|
|
23
|
+
const knowledge_graph_1 = require("./knowledge-graph");
|
|
24
|
+
const code_scanner_1 = require("./code-scanner");
|
|
25
|
+
/**
|
|
26
|
+
* 统一刷新知识底座(RAG + 知识图谱 + 代码索引)
|
|
27
|
+
* 返回每类的刷新状态,供调用方决定后续动作。
|
|
28
|
+
*/
|
|
29
|
+
async function refreshKnowledgeBase(options = {}) {
|
|
30
|
+
const cwd = options.cwd || process.cwd();
|
|
31
|
+
const targets = options.targets || { rag: true, graph: true, codeIndex: true };
|
|
32
|
+
const silent = options.silent === true;
|
|
33
|
+
const info = (msg) => { if (!silent)
|
|
34
|
+
logger_1.logger.info(msg); };
|
|
35
|
+
const report = {
|
|
36
|
+
rag: { refreshed: false, changes: 0 },
|
|
37
|
+
graph: { refreshed: false, wasStale: false },
|
|
38
|
+
codeIndex: { refreshed: false, files: 0 },
|
|
39
|
+
totalRefreshed: 0,
|
|
40
|
+
};
|
|
41
|
+
// ── 1. RAG 索引(按 scope 分文件)──
|
|
42
|
+
if (targets.rag) {
|
|
43
|
+
try {
|
|
44
|
+
const r = await refreshRagByScope(cwd, options);
|
|
45
|
+
report.rag = r;
|
|
46
|
+
if (r.refreshed)
|
|
47
|
+
report.totalRefreshed++;
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
logger_1.logger.debug('RAG 索引刷新失败(非关键):', e);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// ── 2. 知识图谱 ──
|
|
54
|
+
if (targets.graph) {
|
|
55
|
+
try {
|
|
56
|
+
const stale = options.force ? true : await (0, knowledge_graph_1.isGraphStale)(cwd, options.iteration);
|
|
57
|
+
if (stale || options.force) {
|
|
58
|
+
info(' 🔄 刷新知识图谱...');
|
|
59
|
+
await (0, knowledge_graph_1.refreshKnowledgeGraph)(cwd, options.iteration);
|
|
60
|
+
report.graph = { refreshed: true, wasStale: stale };
|
|
61
|
+
report.totalRefreshed++;
|
|
62
|
+
info(' ✅ 知识图谱已刷新');
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
report.graph = { refreshed: false, wasStale: false };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
logger_1.logger.debug('知识图谱刷新失败(非关键):', e);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// ── 3. 代码索引 ──
|
|
73
|
+
if (targets.codeIndex) {
|
|
74
|
+
try {
|
|
75
|
+
const codeIndexScope = await (0, code_scanner_1.resolveIterationScope)(options.iteration);
|
|
76
|
+
const stale = options.force ? true : await (0, code_scanner_1.isIndexStale)(codeIndexScope);
|
|
77
|
+
if (stale || options.force) {
|
|
78
|
+
info(' 🔄 刷新代码索引...');
|
|
79
|
+
const files = await (0, code_scanner_1.buildCodeIndex)(codeIndexScope, true);
|
|
80
|
+
report.codeIndex = { refreshed: true, files };
|
|
81
|
+
report.totalRefreshed++;
|
|
82
|
+
info(' ✅ 代码索引已刷新');
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
report.codeIndex = { refreshed: false, files: 0 };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
logger_1.logger.debug('代码索引刷新失败(非关键):', e);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return report;
|
|
93
|
+
}
|
|
94
|
+
/** RAG 按 scope 分文件刷新(复用 runAnalysis 的既有策略) */
|
|
95
|
+
async function refreshRagByScope(cwd, options) {
|
|
96
|
+
const { iteration, scope, taskId } = options;
|
|
97
|
+
if (scope === 'task' && taskId && iteration) {
|
|
98
|
+
const taskDir = (0, path_1.join)(`Iteration-${iteration}`, '030-tasks', taskId);
|
|
99
|
+
if (await (0, fs_extra_1.pathExists)(taskDir)) {
|
|
100
|
+
const { staleFiles, newFiles } = await (0, rag_engine_1.checkRagIndexFreshness)(cwd);
|
|
101
|
+
await (0, rag_engine_1.refreshRagIndex)(cwd, taskDir, iteration);
|
|
102
|
+
return { refreshed: true, changes: staleFiles.length + newFiles.length };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (scope === 'iteration' && iteration) {
|
|
106
|
+
const specsDir = (0, path_1.join)(`Iteration-${iteration}`, '020-specs');
|
|
107
|
+
const reqDir = (0, path_1.join)(`Iteration-${iteration}`, '010-requirements');
|
|
108
|
+
const dirs = [];
|
|
109
|
+
if (await (0, fs_extra_1.pathExists)(specsDir))
|
|
110
|
+
dirs.push(specsDir);
|
|
111
|
+
if (await (0, fs_extra_1.pathExists)(reqDir))
|
|
112
|
+
dirs.push(reqDir);
|
|
113
|
+
if (dirs.length > 0) {
|
|
114
|
+
const ragScope = `${iteration}_iteration_all`;
|
|
115
|
+
const fileName = `rag-index-${iteration}.json`;
|
|
116
|
+
await (0, rag_engine_1.indexDirectoryDocuments)(cwd, dirs, ragScope, fileName);
|
|
117
|
+
return { refreshed: true, changes: dirs.length };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else if (scope === 'global') {
|
|
121
|
+
const globalDir = (0, path_1.join)(cwd, '.speccore', 'GLOBAL');
|
|
122
|
+
const fallbackDir = (0, path_1.join)(cwd, '.speccore');
|
|
123
|
+
const targetDir = await (0, fs_extra_1.pathExists)(globalDir) ? globalDir : fallbackDir;
|
|
124
|
+
const dirs = [targetDir];
|
|
125
|
+
const rulesDir = (0, path_1.join)(cwd, '.speccore', 'RULES');
|
|
126
|
+
const skillsDir = (0, path_1.join)(cwd, '.speccore', 'SKILLS');
|
|
127
|
+
const patternsDir = (0, path_1.join)(cwd, '.speccore', 'PATTERNS');
|
|
128
|
+
if (await (0, fs_extra_1.pathExists)(rulesDir))
|
|
129
|
+
dirs.push(rulesDir);
|
|
130
|
+
if (await (0, fs_extra_1.pathExists)(skillsDir))
|
|
131
|
+
dirs.push(skillsDir);
|
|
132
|
+
if (await (0, fs_extra_1.pathExists)(patternsDir))
|
|
133
|
+
dirs.push(patternsDir);
|
|
134
|
+
await (0, rag_engine_1.indexDirectoryDocuments)(cwd, dirs, 'GLOBAL_all_global_all', 'rag-index-global.json');
|
|
135
|
+
return { refreshed: true, changes: dirs.length };
|
|
136
|
+
}
|
|
137
|
+
return { refreshed: false, changes: 0 };
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=refresh-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-scheduler.js","sourceRoot":"","sources":["../../src/core/refresh-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* reverse-requirement.ts — 从源码反推需求(两跳 IR → UR 渐进抽象)
|
|
3
|
+
*
|
|
4
|
+
* 方法论对齐 UserTrace:源码不是直接跳到用户需求,而是分两跳——
|
|
5
|
+
* 第一跳(源码 → 中间需求 IR):按技术模块切分,每个模块产出一份「实现级」IR;
|
|
6
|
+
* 第二跳(IR → 用户需求 UR):合并所有 IR,抽象出「用户级」需求 + EARS 验收标准。
|
|
7
|
+
*
|
|
8
|
+
* 架构边界(SpecCore 哲学):
|
|
9
|
+
* - CLI 只做「确定性」分层:扫描分组、依赖排序、tree-sitter 摘要、骨架生成。
|
|
10
|
+
* - 宿主 AI 做「语义」抽象:IR 的业务语义填充、功能单元划分、EARS 验收标准撰写。
|
|
11
|
+
* - 所有产物标 status: candidate(候选),澄清后才成 Spec。
|
|
12
|
+
*
|
|
13
|
+
* 复用能力:
|
|
14
|
+
* - code-scanner 的 CodeIndex(modules 分组 + endpoints 端识别 + CodeFile 符号/API)
|
|
15
|
+
* - multi-lang-parser 的 tree-sitter 结构化摘要(summarizeCode / summarizeSources)
|
|
16
|
+
*
|
|
17
|
+
* v8.3.184+
|
|
18
|
+
*/
|
|
19
|
+
export interface ReverseRequirementOptions {
|
|
20
|
+
/** 源码目录(可选,缺省用 code-index 的默认扫描范围) */
|
|
21
|
+
sources?: string[];
|
|
22
|
+
/** 分析深度 quick/normal/deep,影响读文件数与摘要粒度 */
|
|
23
|
+
depth?: string;
|
|
24
|
+
/** 输出根目录,默认 .speccore/GLOBAL/requirements */
|
|
25
|
+
outputDir?: string;
|
|
26
|
+
/** 只反推指定端(frontend/backend/mobile/cli/shared),缺省全端 */
|
|
27
|
+
platforms?: string[];
|
|
28
|
+
/** 最多反推的模块数(防止超大工程爆量),默认 30 */
|
|
29
|
+
maxModules?: number;
|
|
30
|
+
}
|
|
31
|
+
/** 一个技术模块的中间需求(IR)——第一跳产物 */
|
|
32
|
+
export interface IRModule {
|
|
33
|
+
/** 唯一 id:{endpoint}/{module} */
|
|
34
|
+
id: string;
|
|
35
|
+
endpoint: string;
|
|
36
|
+
module: string;
|
|
37
|
+
files: string[];
|
|
38
|
+
symbols: string[];
|
|
39
|
+
apis: string[];
|
|
40
|
+
imports: string[];
|
|
41
|
+
/** tree-sitter 结构化摘要 */
|
|
42
|
+
summary: string;
|
|
43
|
+
lines: number;
|
|
44
|
+
}
|
|
45
|
+
export interface ReverseResult {
|
|
46
|
+
outputDir: string;
|
|
47
|
+
irDir: string;
|
|
48
|
+
irCount: number;
|
|
49
|
+
modules: IRModule[];
|
|
50
|
+
/** 两跳执行 prompt 路径(宿主 AI 据此完成语义抽象) */
|
|
51
|
+
promptPath: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function reverseRequirementsFromCode(options: ReverseRequirementOptions): Promise<ReverseResult>;
|
|
54
|
+
//# sourceMappingURL=reverse-requirement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse-requirement.d.ts","sourceRoot":"","sources":["../../src/core/reverse-requirement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAgBH,MAAM,WAAW,yBAAyB;IACxC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,6BAA6B;AAC7B,MAAM,WAAW,QAAQ;IACvB,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB;AAqOD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAuCxB"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* reverse-requirement.ts — 从源码反推需求(两跳 IR → UR 渐进抽象)
|
|
4
|
+
*
|
|
5
|
+
* 方法论对齐 UserTrace:源码不是直接跳到用户需求,而是分两跳——
|
|
6
|
+
* 第一跳(源码 → 中间需求 IR):按技术模块切分,每个模块产出一份「实现级」IR;
|
|
7
|
+
* 第二跳(IR → 用户需求 UR):合并所有 IR,抽象出「用户级」需求 + EARS 验收标准。
|
|
8
|
+
*
|
|
9
|
+
* 架构边界(SpecCore 哲学):
|
|
10
|
+
* - CLI 只做「确定性」分层:扫描分组、依赖排序、tree-sitter 摘要、骨架生成。
|
|
11
|
+
* - 宿主 AI 做「语义」抽象:IR 的业务语义填充、功能单元划分、EARS 验收标准撰写。
|
|
12
|
+
* - 所有产物标 status: candidate(候选),澄清后才成 Spec。
|
|
13
|
+
*
|
|
14
|
+
* 复用能力:
|
|
15
|
+
* - code-scanner 的 CodeIndex(modules 分组 + endpoints 端识别 + CodeFile 符号/API)
|
|
16
|
+
* - multi-lang-parser 的 tree-sitter 结构化摘要(summarizeCode / summarizeSources)
|
|
17
|
+
*
|
|
18
|
+
* v8.3.184+
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.reverseRequirementsFromCode = reverseRequirementsFromCode;
|
|
22
|
+
const path_1 = require("path");
|
|
23
|
+
const fs_extra_1 = require("fs-extra");
|
|
24
|
+
const code_scanner_1 = require("./code-scanner");
|
|
25
|
+
const multi_lang_parser_1 = require("./multi-lang-parser");
|
|
26
|
+
const logger_1 = require("../utils/logger");
|
|
27
|
+
// ── 阶段 1:扫描 + 分组(CLI 确定性,零 Token)──
|
|
28
|
+
async function scanAndGroup(options) {
|
|
29
|
+
// 确保索引最新(复用 code-scanner)
|
|
30
|
+
await (0, code_scanner_1.buildCodeIndex)(options.sources?.join(',') || undefined, true);
|
|
31
|
+
const index = await (0, code_scanner_1.loadFullIndex)();
|
|
32
|
+
if (!index || !index.modules || index.modules.length === 0) {
|
|
33
|
+
throw new Error('代码索引为空,无法反推需求。请确认源码目录存在且包含可解析的代码文件。');
|
|
34
|
+
}
|
|
35
|
+
const platformFilter = new Set(options.platforms?.filter(Boolean) || []);
|
|
36
|
+
const maxModules = options.maxModules || 30;
|
|
37
|
+
// 按「依赖深度」做分层排序(简单拓扑):被依赖多的模块先分析(底层优先)
|
|
38
|
+
const sortedModules = sortModulesByDependencies(index.modules);
|
|
39
|
+
const result = [];
|
|
40
|
+
for (const m of sortedModules) {
|
|
41
|
+
if (result.length >= maxModules)
|
|
42
|
+
break;
|
|
43
|
+
if (platformFilter.size > 0 && !platformFilter.has(m.endpoint))
|
|
44
|
+
continue;
|
|
45
|
+
// 该模块的所有代码文件
|
|
46
|
+
const files = index.files.filter(f => f.module === m.name && f.endpoint === m.endpoint);
|
|
47
|
+
// 模块无代码文件(可能只有配置)则跳过
|
|
48
|
+
if (files.length === 0)
|
|
49
|
+
continue;
|
|
50
|
+
const symbols = dedupe(files.flatMap(f => f.exports));
|
|
51
|
+
const apis = dedupe(files.flatMap(f => f.apiDetails || []));
|
|
52
|
+
const imports = dedupe(m.dependencies || []);
|
|
53
|
+
const lines = files.reduce((a, f) => a + f.lines, 0);
|
|
54
|
+
// 读文件内容,生成 tree-sitter 摘要
|
|
55
|
+
const contents = {};
|
|
56
|
+
for (const f of files.slice(0, 8)) {
|
|
57
|
+
try {
|
|
58
|
+
const fullPath = (0, path_1.join)(process.cwd(), f.path);
|
|
59
|
+
if (await (0, fs_extra_1.pathExists)(fullPath)) {
|
|
60
|
+
contents[f.path] = await (0, fs_extra_1.readFile)(fullPath, 'utf-8');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch { /* 忽略不可读文件 */ }
|
|
64
|
+
}
|
|
65
|
+
let summary = '';
|
|
66
|
+
for (const f of files.slice(0, 8)) {
|
|
67
|
+
if (!contents[f.path])
|
|
68
|
+
continue;
|
|
69
|
+
const lang = f.language;
|
|
70
|
+
const s = (0, multi_lang_parser_1.isTreeSitterLang)(lang)
|
|
71
|
+
? await (0, multi_lang_parser_1.summarizeCode)(contents[f.path], lang)
|
|
72
|
+
: null;
|
|
73
|
+
if (s)
|
|
74
|
+
summary += `\n${s}\n`;
|
|
75
|
+
}
|
|
76
|
+
result.push({
|
|
77
|
+
id: `${m.endpoint}/${m.name}`,
|
|
78
|
+
endpoint: m.endpoint,
|
|
79
|
+
module: m.name,
|
|
80
|
+
files: files.map(f => f.path),
|
|
81
|
+
symbols,
|
|
82
|
+
apis,
|
|
83
|
+
imports,
|
|
84
|
+
summary: summary.trim(),
|
|
85
|
+
lines,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return { index, modules: result };
|
|
89
|
+
}
|
|
90
|
+
/** 简单拓扑分层:按「被依赖次数」降序(底层模块先分析),无环时安全 */
|
|
91
|
+
function sortModulesByDependencies(modules) {
|
|
92
|
+
const depCount = new Map();
|
|
93
|
+
for (const m of modules) {
|
|
94
|
+
for (const d of m.dependencies || []) {
|
|
95
|
+
depCount.set(d, (depCount.get(d) || 0) + 1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return [...modules].sort((a, b) => {
|
|
99
|
+
const da = depCount.get(a.name) || 0;
|
|
100
|
+
const db = depCount.get(b.name) || 0;
|
|
101
|
+
return db - da; // 被依赖多的排前面
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function dedupe(arr) {
|
|
105
|
+
return [...new Set(arr)];
|
|
106
|
+
}
|
|
107
|
+
// ── 阶段 3:第一跳 —— 逐模块 IR 骨架 ──
|
|
108
|
+
function buildIRSkeleton(m) {
|
|
109
|
+
const lines = [];
|
|
110
|
+
lines.push(`# IR: ${m.module}(${m.endpoint})`);
|
|
111
|
+
lines.push('');
|
|
112
|
+
lines.push(`> 状态: candidate | 层级: 实现级中间需求 | 模块 id: \`${m.id}\``);
|
|
113
|
+
lines.push('');
|
|
114
|
+
lines.push(`## 代码事实(CLI 提取,确定)`);
|
|
115
|
+
lines.push('');
|
|
116
|
+
lines.push(`- 端: \`${m.endpoint}\``);
|
|
117
|
+
lines.push(`- 文件: ${m.files.length} 个(${m.lines} 行)`);
|
|
118
|
+
lines.push(`- 符号: ${m.symbols.length ? m.symbols.slice(0, 15).map(s => '`' + s + '`').join(', ') : '_无_'} `);
|
|
119
|
+
lines.push(`- API: ${m.apis.length ? m.apis.slice(0, 15).map(a => '`' + a + '`').join(', ') : '_无_'} `);
|
|
120
|
+
if (m.imports.length) {
|
|
121
|
+
lines.push(`- 依赖模块: ${m.imports.slice(0, 10).map(d => '`' + d + '`').join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
lines.push('');
|
|
124
|
+
lines.push(`## 源码结构摘要(tree-sitter 提取)`);
|
|
125
|
+
lines.push('');
|
|
126
|
+
if (m.summary) {
|
|
127
|
+
lines.push('```text');
|
|
128
|
+
lines.push(m.summary);
|
|
129
|
+
lines.push('```');
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
lines.push('> _无可解析摘要(文件可能为空或非代码)_');
|
|
133
|
+
}
|
|
134
|
+
lines.push('');
|
|
135
|
+
lines.push(`## 业务语义(宿主 AI 填写)`);
|
|
136
|
+
lines.push('');
|
|
137
|
+
lines.push(`> ⚠️ 以下由宿主 AI 基于「代码事实 + 结构摘要」做语义抽象,勿编造代码中不存在的逻辑。`);
|
|
138
|
+
lines.push('');
|
|
139
|
+
lines.push(`### 模块职责`);
|
|
140
|
+
lines.push('');
|
|
141
|
+
lines.push(`_AI 填写:这个模块在业务上做什么?_`);
|
|
142
|
+
lines.push('');
|
|
143
|
+
lines.push(`### 关键业务规则`);
|
|
144
|
+
lines.push('');
|
|
145
|
+
lines.push(`- _AI 填写:从代码逻辑中抽象出的规则(如「密码错误 5 次锁定」)_`);
|
|
146
|
+
lines.push('');
|
|
147
|
+
lines.push(`### 输入 / 输出`);
|
|
148
|
+
lines.push('');
|
|
149
|
+
lines.push(`| 项 | 说明 |`);
|
|
150
|
+
lines.push(`| :--- | :--- |`);
|
|
151
|
+
lines.push(`| 输入 | _AI 填写_ |`);
|
|
152
|
+
lines.push(`| 输出 | _AI 填写_ |`);
|
|
153
|
+
lines.push('');
|
|
154
|
+
lines.push(`### 异常与边界`);
|
|
155
|
+
lines.push('');
|
|
156
|
+
lines.push(`- _AI 填写_`);
|
|
157
|
+
lines.push('');
|
|
158
|
+
lines.push(`## 文件清单`);
|
|
159
|
+
lines.push('');
|
|
160
|
+
m.files.forEach(f => lines.push(`- \`${f}\``));
|
|
161
|
+
lines.push('');
|
|
162
|
+
return lines.join('\n');
|
|
163
|
+
}
|
|
164
|
+
// ── 阶段 4:第二跳 —— 合成 UR 骨架 + EARS ──
|
|
165
|
+
function buildURSkeleton(modules) {
|
|
166
|
+
const lines = [];
|
|
167
|
+
lines.push(`# 用户需求(UR)—— 从源码反推`);
|
|
168
|
+
lines.push('');
|
|
169
|
+
lines.push(`> 状态: candidate | 层级: 用户级需求 | 反推时间: ${new Date().toISOString().split('T')[0]}`);
|
|
170
|
+
lines.push(`> 说明: 本文件由 CLI 从 ${modules.length} 个技术模块的 IR 合成骨架,功能单元划分与 EARS 验收标准由宿主 AI 完成。`);
|
|
171
|
+
lines.push('');
|
|
172
|
+
lines.push(`## 功能单元清单(宿主 AI 抽象)`);
|
|
173
|
+
lines.push('');
|
|
174
|
+
lines.push(`> 把下面 ${modules.length} 个技术模块按业务语义合并为「功能单元」(一个功能单元可对应多个技术模块,如「用户认证」对应 auth 后端模块 + login 前端模块)。`);
|
|
175
|
+
lines.push('');
|
|
176
|
+
lines.push(`| 功能单元 | 涉及技术模块 | 涉及端 |`);
|
|
177
|
+
lines.push(`| :--- | :--- | :--- |`);
|
|
178
|
+
lines.push(`| _AI 填写_ | _AI 填写_ | _AI 填写_ |`);
|
|
179
|
+
lines.push('');
|
|
180
|
+
lines.push(`## 端覆盖矩阵(CLI 确定)`);
|
|
181
|
+
lines.push('');
|
|
182
|
+
const endpoints = dedupe(modules.map(m => m.endpoint));
|
|
183
|
+
lines.push(`| 端 | 模块数 | 模块清单 |`);
|
|
184
|
+
lines.push(`| :--- | :--- | :--- |`);
|
|
185
|
+
for (const ep of endpoints) {
|
|
186
|
+
const ms = modules.filter(m => m.endpoint === ep);
|
|
187
|
+
lines.push(`| \`${ep}\` | ${ms.length} | ${ms.map(m => m.module).join(', ')} |`);
|
|
188
|
+
}
|
|
189
|
+
lines.push('');
|
|
190
|
+
lines.push(`## 验收标准(EARS 格式,宿主 AI 撰写)`);
|
|
191
|
+
lines.push('');
|
|
192
|
+
lines.push(`> 每个功能单元至少 3 条验收标准,采用 EARS 模板:`);
|
|
193
|
+
lines.push(`> 当 [触发条件] 时,系统应 [期望行为],以便 [用户价值]。`);
|
|
194
|
+
lines.push('');
|
|
195
|
+
lines.push(`### _功能单元名_`);
|
|
196
|
+
lines.push('');
|
|
197
|
+
lines.push(`- **AC-01**:当 _触发条件_ 时,系统应 _期望行为_,以便 _用户价值_。`);
|
|
198
|
+
lines.push(`- **AC-02**:当 _异常条件_ 时,系统应 _容错行为_,以便 _用户价值_。`);
|
|
199
|
+
lines.push('');
|
|
200
|
+
lines.push(`## 待确认项(人工确认)`);
|
|
201
|
+
lines.push('');
|
|
202
|
+
lines.push(`- [ ] 功能单元边界是否正确(有无遗漏/重复/需拆分合并)`);
|
|
203
|
+
lines.push(`- [ ] 端覆盖矩阵是否正确`);
|
|
204
|
+
lines.push(`- [ ] 验收标准是否与代码实现一致、可测试`);
|
|
205
|
+
lines.push(`- [ ] 是否有代码中未体现、但业务上存在的规则需补充`);
|
|
206
|
+
lines.push('');
|
|
207
|
+
return lines.join('\n');
|
|
208
|
+
}
|
|
209
|
+
// ── 阶段 5:两跳执行 prompt(宿主 AI 据此完成语义抽象)──
|
|
210
|
+
function buildReversePrompt(outputDir, irDir, modules) {
|
|
211
|
+
const lines = [];
|
|
212
|
+
lines.push(`# 源码反推需求 · 两跳执行指引`);
|
|
213
|
+
lines.push('');
|
|
214
|
+
lines.push(`> 目标:从源码恢复「候选需求」(status: candidate),澄清后才成为 Spec。`);
|
|
215
|
+
lines.push('');
|
|
216
|
+
lines.push(`## 第一跳:逐模块填充 IR`);
|
|
217
|
+
lines.push('');
|
|
218
|
+
lines.push(`目录:\`${irDir}\`(共 ${modules.length} 个 IR)`);
|
|
219
|
+
lines.push('');
|
|
220
|
+
lines.push(`对每个 IR 文件,只做「业务语义抽象」:`);
|
|
221
|
+
lines.push(`1. 读该 IR 的「代码事实 + 源码结构摘要」(CLI 已提取,勿重读源码);`);
|
|
222
|
+
lines.push(`2. 填写「模块职责 / 关键业务规则 / 输入输出 / 异常边界」;`);
|
|
223
|
+
lines.push(`3. 禁止编造代码中不存在的逻辑;不确定处标注 \`待确认\`。`);
|
|
224
|
+
lines.push('');
|
|
225
|
+
lines.push(`## 第二跳:合成 UR`);
|
|
226
|
+
lines.push('');
|
|
227
|
+
lines.push(`1. 读完所有 IR 后,按业务语义把技术模块合并为「功能单元」;`);
|
|
228
|
+
lines.push(`2. 在 \`${outputDir}/REQUIREMENT.md\` 填写功能单元清单 + EARS 验收标准;`);
|
|
229
|
+
lines.push(`3. 端覆盖矩阵已由 CLI 确定,勿改动。`);
|
|
230
|
+
lines.push('');
|
|
231
|
+
lines.push(`## 约束`);
|
|
232
|
+
lines.push('');
|
|
233
|
+
lines.push(`- 产出物一律标 \`status: candidate\`;`);
|
|
234
|
+
lines.push(`- 需求只从前端反推「用户能做什么」,后端只产出「技术约束」(接口/数据模型/规则);`);
|
|
235
|
+
lines.push(`- 验收标准必须 EARS 格式、无歧义、可测试。`);
|
|
236
|
+
lines.push('');
|
|
237
|
+
return lines.join('\n');
|
|
238
|
+
}
|
|
239
|
+
// ── 主函数 ──
|
|
240
|
+
async function reverseRequirementsFromCode(options) {
|
|
241
|
+
const outputDir = options.outputDir || (0, path_1.join)('.speccore', 'GLOBAL', 'requirements');
|
|
242
|
+
const irDir = (0, path_1.join)(outputDir, '_ir');
|
|
243
|
+
await (0, fs_extra_1.ensureDir)(irDir);
|
|
244
|
+
logger_1.logger.info(' 🔍 反推需求:扫描源码并分组...');
|
|
245
|
+
const { modules } = await scanAndGroup(options);
|
|
246
|
+
if (modules.length === 0) {
|
|
247
|
+
throw new Error('未找到可反推的代码模块。请确认源码目录或 --platforms 过滤条件。');
|
|
248
|
+
}
|
|
249
|
+
logger_1.logger.info(` 📦 识别到 ${modules.length} 个技术模块(按端分组 + 依赖排序)`);
|
|
250
|
+
// 第一跳:逐模块 IR 骨架
|
|
251
|
+
logger_1.logger.info(' 🧩 第一跳:生成逐模块 IR 骨架...');
|
|
252
|
+
for (const m of modules) {
|
|
253
|
+
const irPath = (0, path_1.join)(irDir, `${sanitize(m.id)}.md`);
|
|
254
|
+
await (0, fs_extra_1.writeFile)(irPath, buildIRSkeleton(m));
|
|
255
|
+
}
|
|
256
|
+
// 第二跳:合成 UR 骨架
|
|
257
|
+
logger_1.logger.info(' 🧬 第二跳:合成 UR 骨架 + EARS 模板...');
|
|
258
|
+
const urPath = (0, path_1.join)(outputDir, 'REQUIREMENT.md');
|
|
259
|
+
await (0, fs_extra_1.writeFile)(urPath, buildURSkeleton(modules));
|
|
260
|
+
// 两跳执行 prompt
|
|
261
|
+
const promptPath = (0, path_1.join)(outputDir, 'REVERSE_PROMPT.md');
|
|
262
|
+
await (0, fs_extra_1.writeFile)(promptPath, buildReversePrompt(outputDir, irDir, modules));
|
|
263
|
+
logger_1.logger.info(` ✅ IR: ${modules.length} 个 → ${irDir}`);
|
|
264
|
+
logger_1.logger.info(` ✅ UR 骨架: ${urPath}`);
|
|
265
|
+
logger_1.logger.info(` ✅ 两跳指引: ${promptPath}`);
|
|
266
|
+
return {
|
|
267
|
+
outputDir,
|
|
268
|
+
irDir,
|
|
269
|
+
irCount: modules.length,
|
|
270
|
+
modules,
|
|
271
|
+
promptPath,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
function sanitize(id) {
|
|
275
|
+
return id.replace(/[^a-zA-Z0-9_-]/g, '-');
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=reverse-requirement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse-requirement.js","sourceRoot":"","sources":["../../src/core/reverse-requirement.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,8 +20,8 @@ export declare const TaskTypeSchema: z.ZodEnum<{
|
|
|
20
20
|
}>;
|
|
21
21
|
export declare const PlatformSchema: z.ZodEnum<{
|
|
22
22
|
h5: "h5";
|
|
23
|
-
miniapp: "miniapp";
|
|
24
23
|
web: "web";
|
|
24
|
+
miniapp: "miniapp";
|
|
25
25
|
tablet: "tablet";
|
|
26
26
|
tv: "tv";
|
|
27
27
|
}>;
|
|
@@ -76,8 +76,8 @@ export declare const TaskSchema: z.ZodObject<{
|
|
|
76
76
|
dependencies: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
77
77
|
platforms: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
78
78
|
h5: "h5";
|
|
79
|
-
miniapp: "miniapp";
|
|
80
79
|
web: "web";
|
|
80
|
+
miniapp: "miniapp";
|
|
81
81
|
tablet: "tablet";
|
|
82
82
|
tv: "tv";
|
|
83
83
|
}>>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-skeleton.d.ts","sourceRoot":"","sources":["../../src/core/spec-skeleton.ts"],"names":[],"mappings":"AAkBA,4BAA4B;AAC5B,eAAO,MAAM,eAAe,2BAA2B,CAAC;AAWxD,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW;IACX,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,qBAAqB;IACrB,YAAY,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS;IACT,UAAU,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"spec-skeleton.d.ts","sourceRoot":"","sources":["../../src/core/spec-skeleton.ts"],"names":[],"mappings":"AAkBA,4BAA4B;AAC5B,eAAO,MAAM,eAAe,2BAA2B,CAAC;AAWxD,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW;IACX,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,qBAAqB;IACrB,YAAY,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS;IACT,UAAU,EAAE,MAAM,CAAC;CACpB;AA6gBD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CA6N3F,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CA0B7E;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsH7D;AAMD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,EACjB,SAAS,GAAE,MAAW,GACrB,aAAa,EAAE,CA+BjB;AAED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,EACjB,SAAS,GAAE,MAAW,GACrB,aAAa,EAAE,CAiDjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EAAE,GAClB,aAAa,EAAE,CAgBjB;AAMD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EAAE,GACvB,OAAO,CAAC,cAAc,CAAC,CAsBzB;AAMD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EAAE,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqBnD;AAMD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EAAE,GACvB,OAAO,CAAC,cAAc,CAAC,CAmBzB;AAMD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,EAAE,EACxB,OAAO,EAAE,MAAM,GACd,MAAM,CAyFR"}
|