speccore 6.74.0 → 6.76.0
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/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts +6 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +165 -0
- package/dist/commands/analyze.js.map +1 -1
- package/dist/core/analyze-context-guard.d.ts +84 -0
- package/dist/core/analyze-context-guard.d.ts.map +1 -0
- package/dist/core/analyze-context-guard.js +505 -0
- package/dist/core/analyze-context-guard.js.map +1 -0
- package/dist/core/incremental-analyzer.d.ts +58 -0
- package/dist/core/incremental-analyzer.d.ts.map +1 -0
- package/dist/core/incremental-analyzer.js +458 -0
- package/dist/core/incremental-analyzer.js.map +1 -0
- package/dist/core/module-analyzer.d.ts +62 -0
- package/dist/core/module-analyzer.d.ts.map +1 -0
- package/dist/core/module-analyzer.js +415 -0
- package/dist/core/module-analyzer.js.map +1 -0
- package/dist/core/platform-addition.d.ts +57 -0
- package/dist/core/platform-addition.d.ts.map +1 -0
- package/dist/core/platform-addition.js +340 -0
- package/dist/core/platform-addition.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* platform-addition — 新增端分析引擎(v6.75.0)
|
|
4
|
+
*
|
|
5
|
+
* 核心能力:
|
|
6
|
+
* 1. 单独分析新端(读取源码、建立索引、深入分析)
|
|
7
|
+
* 2. 自动分析新端与已有端的关系(接口调用、数据依赖、功能重叠)
|
|
8
|
+
* 3. 更新全局层文档(FUNCTION_MAP、API_CONTRACT、ARCHITECTURE、INTERACTION_MAP)
|
|
9
|
+
* 4. 检查新端与已有端的接口一致性
|
|
10
|
+
*
|
|
11
|
+
* 使用场景:
|
|
12
|
+
* - 迭代中新增了一个端(如新增 admin-web、小程序端)
|
|
13
|
+
* - 项目后期扩展新平台
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.analyzeNewPlatform = analyzeNewPlatform;
|
|
17
|
+
exports.buildNewPlatformPrompt = buildNewPlatformPrompt;
|
|
18
|
+
const path_1 = require("path");
|
|
19
|
+
const fs_extra_1 = require("fs-extra");
|
|
20
|
+
const spec_paths_1 = require("./spec-paths");
|
|
21
|
+
// ── 核心函数 ──
|
|
22
|
+
/**
|
|
23
|
+
* 执行新增端分析
|
|
24
|
+
* @param iterDir 迭代目录
|
|
25
|
+
* @param newPlatform 新增端名
|
|
26
|
+
*/
|
|
27
|
+
async function analyzeNewPlatform(iterDir, newPlatform) {
|
|
28
|
+
const platforms = await (0, spec_paths_1.parsePlatformList)();
|
|
29
|
+
const platformTypes = await (0, spec_paths_1.parsePlatformTypes)();
|
|
30
|
+
const result = {
|
|
31
|
+
platform: newPlatform,
|
|
32
|
+
platformType: platformTypes.get(newPlatform) || 'unknown',
|
|
33
|
+
isBackend: false,
|
|
34
|
+
existingPlatforms: platforms.filter(p => p !== newPlatform),
|
|
35
|
+
crossPlatformRelations: [],
|
|
36
|
+
globalUpdates: [],
|
|
37
|
+
newPlatformOutputs: [],
|
|
38
|
+
consistencyChecks: [],
|
|
39
|
+
};
|
|
40
|
+
// 判断端类型
|
|
41
|
+
const pt = result.platformType.toLowerCase();
|
|
42
|
+
result.isBackend = pt.includes('service') || pt.includes('java') || pt.includes('node') || pt.includes('go') || pt.includes('python') || pt.includes('后端');
|
|
43
|
+
// 1. 分析新端与已有端的关系
|
|
44
|
+
result.crossPlatformRelations = await analyzeCrossPlatformRelations(iterDir, newPlatform, result.existingPlatforms, result.isBackend);
|
|
45
|
+
// 2. 生成全局文档更新建议
|
|
46
|
+
result.globalUpdates = await buildGlobalUpdates(iterDir, newPlatform, result);
|
|
47
|
+
// 3. 确定新端自身产出
|
|
48
|
+
result.newPlatformOutputs = buildNewPlatformOutputs(newPlatform, result.isBackend);
|
|
49
|
+
// 4. 一致性检查
|
|
50
|
+
result.consistencyChecks = await runConsistencyChecks(iterDir, newPlatform, result);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 生成新增端分析 Prompt
|
|
55
|
+
*/
|
|
56
|
+
function buildNewPlatformPrompt(iterDir, analysis, iteration) {
|
|
57
|
+
let prompt = `\n# 任务: 新增端分析 — ${analysis.platform} (${analysis.platformType})\n\n`;
|
|
58
|
+
prompt += `## 背景\n\n`;
|
|
59
|
+
prompt += `本项目新增了一个端 **${analysis.platform}**(类型: ${analysis.platformType}),需要:\n`;
|
|
60
|
+
prompt += `1. 单独分析该端的源码和架构\n`;
|
|
61
|
+
prompt += `2. 分析该端与已有端(${analysis.existingPlatforms.join(', ')})的关系\n`;
|
|
62
|
+
prompt += `3. 更新全局层文档,纳入新端\n\n`;
|
|
63
|
+
// 已有端信息
|
|
64
|
+
prompt += `## 已有端信息\n\n`;
|
|
65
|
+
prompt += `| 端名 | 类型 | 已有产出 |\n`;
|
|
66
|
+
prompt += `| :--- | :--- | :--- |\n`;
|
|
67
|
+
for (const p of analysis.existingPlatforms) {
|
|
68
|
+
prompt += `| ${p} | ${analysis.existingPlatforms.includes(p) ? '已有' : '新'} | 参见 platforms/${p}/ |\n`;
|
|
69
|
+
}
|
|
70
|
+
prompt += `\n`;
|
|
71
|
+
// 跨端关系
|
|
72
|
+
if (analysis.crossPlatformRelations.length > 0) {
|
|
73
|
+
prompt += `## 已识别的跨端关系\n\n`;
|
|
74
|
+
prompt += `| 关系 | 从端 | 到端 | 说明 |\n`;
|
|
75
|
+
prompt += `| :--- | :--- | :--- | :--- |\n`;
|
|
76
|
+
for (const r of analysis.crossPlatformRelations) {
|
|
77
|
+
const typeLabels = {
|
|
78
|
+
'api-consumer': 'API消费者',
|
|
79
|
+
'api-provider': 'API提供者',
|
|
80
|
+
'shared-data': '共享数据',
|
|
81
|
+
'event-pub': '事件发布',
|
|
82
|
+
'event-sub': '事件订阅',
|
|
83
|
+
'auth-dependency': '认证依赖',
|
|
84
|
+
};
|
|
85
|
+
prompt += `| ${typeLabels[r.relationType] || r.relationType} | ${r.fromPlatform} | ${r.toPlatform} | ${r.description} |\n`;
|
|
86
|
+
}
|
|
87
|
+
prompt += `\n`;
|
|
88
|
+
}
|
|
89
|
+
// 新端分析要求
|
|
90
|
+
prompt += `## 新端分析要求\n\n`;
|
|
91
|
+
if (analysis.isBackend) {
|
|
92
|
+
prompt += `### 后端端分析(${analysis.platform})\n\n`;
|
|
93
|
+
prompt += `1. **源码扫描**:Read ${analysis.platform} 的源码目录,提取:\n`;
|
|
94
|
+
prompt += ` - Controller/Handler 接口列表(路径/方法/参数)\n`;
|
|
95
|
+
prompt += ` - Entity/Model 数据模型(字段/类型/关系)\n`;
|
|
96
|
+
prompt += ` - Service 业务逻辑\n\n`;
|
|
97
|
+
prompt += `2. **API 设计**:\n`;
|
|
98
|
+
prompt += ` - 接口路径必须与已有后端端遵循同一命名规范\n`;
|
|
99
|
+
prompt += ` - 枚举值必须与已有端一致(如状态码、类型值)\n`;
|
|
100
|
+
prompt += ` - 鉴权机制必须与全局认证体系兼容\n\n`;
|
|
101
|
+
prompt += `3. **数据模型**:\n`;
|
|
102
|
+
prompt += ` - 如果与已有端共享实体,字段定义必须完全一致\n`;
|
|
103
|
+
prompt += ` - 如果是新实体,需在全局 ARCHITECTURE.md 中标注\n\n`;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
prompt += `### 前端端分析(${analysis.platform})\n\n`;
|
|
107
|
+
prompt += `1. **源码扫描**:Read ${analysis.platform} 的源码目录,提取:\n`;
|
|
108
|
+
prompt += ` - 页面路由表(路径/组件/权限)\n`;
|
|
109
|
+
prompt += ` - API 调用清单(调用哪些后端接口)\n`;
|
|
110
|
+
prompt += ` - 状态管理设计\n\n`;
|
|
111
|
+
prompt += `2. **前后端对齐**:\n`;
|
|
112
|
+
prompt += ` - 调用的后端接口必须在已有后端端中存在\n`;
|
|
113
|
+
prompt += ` - 字段映射必须与后端 API 响应一致\n`;
|
|
114
|
+
prompt += ` - 状态枚举必须与后端一致\n\n`;
|
|
115
|
+
prompt += `3. **端特性**:\n`;
|
|
116
|
+
const pt = analysis.platformType.toLowerCase();
|
|
117
|
+
if (pt.includes('微信') || pt.includes('公众号')) {
|
|
118
|
+
prompt += ` - 微信 JS-SDK 集成、OAuth 授权、分享、支付\n`;
|
|
119
|
+
}
|
|
120
|
+
else if (pt.includes('小程序')) {
|
|
121
|
+
prompt += ` - 包体积控制、平台 API、页面栈管理\n`;
|
|
122
|
+
}
|
|
123
|
+
else if (pt.includes('h5')) {
|
|
124
|
+
prompt += ` - 响应式布局、触摸交互、弱网处理\n`;
|
|
125
|
+
}
|
|
126
|
+
else if (pt.includes('web') || pt.includes('admin')) {
|
|
127
|
+
prompt += ` - 复杂表单、数据表格、权限 UI\n`;
|
|
128
|
+
}
|
|
129
|
+
prompt += `\n`;
|
|
130
|
+
}
|
|
131
|
+
// 全局文档更新
|
|
132
|
+
prompt += `## 全局文档更新要求\n\n`;
|
|
133
|
+
prompt += `新端分析完成后,必须更新以下全局文档:\n\n`;
|
|
134
|
+
for (const update of analysis.globalUpdates) {
|
|
135
|
+
const actionLabels = { append: '追加', modify: '修改', create: '创建' };
|
|
136
|
+
prompt += `- **${actionLabels[update.action]}** \`${update.file}\`:${update.description}\n`;
|
|
137
|
+
}
|
|
138
|
+
prompt += `\n`;
|
|
139
|
+
// 一致性检查
|
|
140
|
+
if (analysis.consistencyChecks.length > 0) {
|
|
141
|
+
prompt += `## 一致性检查清单\n\n`;
|
|
142
|
+
for (const check of analysis.consistencyChecks) {
|
|
143
|
+
const statusIcon = check.status === 'pass' ? '✅' : check.status === 'fail' ? '❌' : '⚠️';
|
|
144
|
+
prompt += `- ${statusIcon} **${check.category}**: ${check.description}\n`;
|
|
145
|
+
if (check.status !== 'pass') {
|
|
146
|
+
prompt += ` → 建议: ${check.suggestion}\n`;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
prompt += `\n`;
|
|
150
|
+
}
|
|
151
|
+
// 执行步骤
|
|
152
|
+
prompt += `## 执行步骤\n\n`;
|
|
153
|
+
prompt += `### Step 1: 读取已有全局文档\n`;
|
|
154
|
+
prompt += `- Read \`.speccore/GLOBAL/FUNCTION_MAP.md\` → 了解已有功能单元\n`;
|
|
155
|
+
prompt += `- Read \`.speccore/GLOBAL/API_CONTRACT.yaml\` → 了解已有接口契约\n`;
|
|
156
|
+
prompt += `- Read \`.speccore/GLOBAL/ARCHITECTURE.md\` → 了解全局架构\n`;
|
|
157
|
+
prompt += `- Read 已有端的 \`platforms/{端}/_INDEX.md\` → 了解已有端的能力\n\n`;
|
|
158
|
+
prompt += `### Step 2: 读取新端源码\n`;
|
|
159
|
+
prompt += `- Read \`.speccore/CONSTITUTION.md\` → 获取 ${analysis.platform} 的源码路径\n`;
|
|
160
|
+
prompt += `- 扫描 ${analysis.platform} 的源码目录,建立 _INDEX.md\n\n`;
|
|
161
|
+
prompt += `### Step 3: 深入分析新端\n`;
|
|
162
|
+
if (analysis.isBackend) {
|
|
163
|
+
prompt += `- 生成 API_INVENTORY.md、DATA_MODEL.md、BUSINESS_RULES.md、TECH_STACK.md\n`;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
prompt += `- 生成 FEATURES.md、UI_FLOW.md、API_CALL_MAP.md、UI_SPEC.md、TECH_STACK.md\n`;
|
|
167
|
+
}
|
|
168
|
+
prompt += `\n`;
|
|
169
|
+
prompt += `### Step 4: 更新全局文档\n`;
|
|
170
|
+
prompt += `- 在 FUNCTION_MAP.md 中追加新端涉及的功能单元\n`;
|
|
171
|
+
prompt += `- 在 API_CONTRACT.yaml 中追加新端相关的接口契约\n`;
|
|
172
|
+
prompt += `- 在 ARCHITECTURE.md 中更新服务拓扑,加入 ${analysis.platform}\n`;
|
|
173
|
+
prompt += `- 在 INTERACTION_MAP.md 中追加涉及 ${analysis.platform} 的交互时序\n\n`;
|
|
174
|
+
prompt += `## 写入方式\n`;
|
|
175
|
+
prompt += `\`\`\`bash\n`;
|
|
176
|
+
prompt += `# 新端文档\n`;
|
|
177
|
+
if (analysis.isBackend) {
|
|
178
|
+
prompt += `speccore analyze --apply '{"${analysis.platform}/API_INVENTORY.md":"...","${analysis.platform}/DATA_MODEL.md":"...","${analysis.platform}/BUSINESS_RULES.md":"...","${analysis.platform}/TECH_STACK.md":"..."}' -I ${iteration} --global\n`;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
prompt += `speccore analyze --apply '{"${analysis.platform}/FEATURES.md":"...","${analysis.platform}/UI_FLOW.md":"...","${analysis.platform}/API_CALL_MAP.md":"...","${analysis.platform}/UI_SPEC.md":"...","${analysis.platform}/TECH_STACK.md":"..."}' -I ${iteration} --global\n`;
|
|
182
|
+
}
|
|
183
|
+
prompt += `\n# 全局文档更新\n`;
|
|
184
|
+
prompt += `speccore analyze --apply '{"global/FUNCTION_MAP.md":"更新后的内容","global/API_CONTRACT.yaml":"更新后的内容","global/ARCHITECTURE.md":"更新后的内容","global/INTERACTION_MAP.md":"更新后的内容"}' -I ${iteration} --global\n`;
|
|
185
|
+
prompt += `\`\`\`\n`;
|
|
186
|
+
return prompt;
|
|
187
|
+
}
|
|
188
|
+
// ── 内部函数 ──
|
|
189
|
+
/** 分析新端与已有端的关系 */
|
|
190
|
+
async function analyzeCrossPlatformRelations(iterDir, newPlatform, existingPlatforms, isBackend) {
|
|
191
|
+
const relations = [];
|
|
192
|
+
const platformsDir = (0, path_1.join)(iterDir, '..', '.speccore', 'GLOBAL', 'platforms');
|
|
193
|
+
if (isBackend) {
|
|
194
|
+
// 新后端端:检查哪些前端端会调用它
|
|
195
|
+
for (const ep of existingPlatforms) {
|
|
196
|
+
const isFrontend = !(await isBackendPlatform(ep));
|
|
197
|
+
if (isFrontend) {
|
|
198
|
+
const apiCallMapPath = (0, path_1.join)(platformsDir, ep, 'API_CALL_MAP.md');
|
|
199
|
+
if (await (0, fs_extra_1.pathExists)(apiCallMapPath)) {
|
|
200
|
+
const content = await (0, fs_extra_1.readFile)(apiCallMapPath, 'utf-8');
|
|
201
|
+
// 简单检查:前端是否调用了新端的路径(假设新端路径有特定前缀)
|
|
202
|
+
// 实际实现可以更精确
|
|
203
|
+
relations.push({
|
|
204
|
+
fromPlatform: ep,
|
|
205
|
+
toPlatform: newPlatform,
|
|
206
|
+
relationType: 'api-consumer',
|
|
207
|
+
description: `${ep} 可能调用 ${newPlatform} 提供的接口(需进一步确认)`,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// 新前端端:检查它调用哪些已有后端端
|
|
215
|
+
for (const ep of existingPlatforms) {
|
|
216
|
+
const isBack = await isBackendPlatform(ep);
|
|
217
|
+
if (isBack) {
|
|
218
|
+
relations.push({
|
|
219
|
+
fromPlatform: newPlatform,
|
|
220
|
+
toPlatform: ep,
|
|
221
|
+
relationType: 'api-consumer',
|
|
222
|
+
description: `${newPlatform} 需要调用 ${ep} 的后端接口`,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// 认证依赖:所有新端都依赖认证服务(如果有)
|
|
228
|
+
const authPlatform = existingPlatforms.find(p => p.toLowerCase().includes('auth') || p.toLowerCase().includes('user'));
|
|
229
|
+
if (authPlatform) {
|
|
230
|
+
relations.push({
|
|
231
|
+
fromPlatform: newPlatform,
|
|
232
|
+
toPlatform: authPlatform,
|
|
233
|
+
relationType: 'auth-dependency',
|
|
234
|
+
description: `${newPlatform} 的认证依赖 ${authPlatform}`,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
return relations;
|
|
238
|
+
}
|
|
239
|
+
/** 生成全局文档更新建议 */
|
|
240
|
+
async function buildGlobalUpdates(iterDir, newPlatform, analysis) {
|
|
241
|
+
const updates = [];
|
|
242
|
+
updates.push({
|
|
243
|
+
file: 'global/FUNCTION_MAP.md',
|
|
244
|
+
action: 'modify',
|
|
245
|
+
description: `追加 ${newPlatform} 涉及的功能单元和涉及端列`,
|
|
246
|
+
content: `在 FUNCTION_MAP.md 表格中,为每个涉及 ${newPlatform} 的功能单元追加「${newPlatform}」到「涉及端」列`,
|
|
247
|
+
});
|
|
248
|
+
updates.push({
|
|
249
|
+
file: 'global/API_CONTRACT.yaml',
|
|
250
|
+
action: 'modify',
|
|
251
|
+
description: `追加 ${newPlatform} 相关的接口契约定义`,
|
|
252
|
+
content: `在 API_CONTRACT.yaml 中追加 ${newPlatform} 提供或消费的接口`,
|
|
253
|
+
});
|
|
254
|
+
updates.push({
|
|
255
|
+
file: 'global/ARCHITECTURE.md',
|
|
256
|
+
action: 'modify',
|
|
257
|
+
description: `更新服务拓扑图,加入 ${newPlatform}`,
|
|
258
|
+
content: `在 ARCHITECTURE.md 的服务拓扑和数据流图中加入 ${newPlatform}`,
|
|
259
|
+
});
|
|
260
|
+
updates.push({
|
|
261
|
+
file: 'global/INTERACTION_MAP.md',
|
|
262
|
+
action: 'append',
|
|
263
|
+
description: `追加涉及 ${newPlatform} 的交互时序图`,
|
|
264
|
+
content: `为涉及 ${newPlatform} 的功能单元追加 Mermaid sequenceDiagram`,
|
|
265
|
+
});
|
|
266
|
+
return updates;
|
|
267
|
+
}
|
|
268
|
+
/** 构建新端自身产出列表 */
|
|
269
|
+
function buildNewPlatformOutputs(platform, isBackend) {
|
|
270
|
+
if (isBackend) {
|
|
271
|
+
return [
|
|
272
|
+
`platforms/${platform}/_INDEX.md`,
|
|
273
|
+
`platforms/${platform}/API_INVENTORY.md`,
|
|
274
|
+
`platforms/${platform}/DATA_MODEL.md`,
|
|
275
|
+
`platforms/${platform}/BUSINESS_RULES.md`,
|
|
276
|
+
`platforms/${platform}/TECH_STACK.md`,
|
|
277
|
+
];
|
|
278
|
+
}
|
|
279
|
+
return [
|
|
280
|
+
`platforms/${platform}/_INDEX.md`,
|
|
281
|
+
`platforms/${platform}/FEATURES.md`,
|
|
282
|
+
`platforms/${platform}/UI_FLOW.md`,
|
|
283
|
+
`platforms/${platform}/API_CALL_MAP.md`,
|
|
284
|
+
`platforms/${platform}/UI_SPEC.md`,
|
|
285
|
+
`platforms/${platform}/TECH_STACK.md`,
|
|
286
|
+
];
|
|
287
|
+
}
|
|
288
|
+
/** 运行一致性检查 */
|
|
289
|
+
async function runConsistencyChecks(iterDir, newPlatform, analysis) {
|
|
290
|
+
const checks = [];
|
|
291
|
+
const platformsDir = (0, path_1.join)(iterDir, '..', '.speccore', 'GLOBAL', 'platforms');
|
|
292
|
+
// 1. API 路径命名规范
|
|
293
|
+
checks.push({
|
|
294
|
+
category: 'api-path',
|
|
295
|
+
status: 'warning',
|
|
296
|
+
description: `新端 ${newPlatform} 的 API 路径需遵循项目统一规范(如 /api/v1/ 前缀)`,
|
|
297
|
+
suggestion: '在 API_INVENTORY.md 中确认路径前缀与已有端一致',
|
|
298
|
+
});
|
|
299
|
+
// 2. 枚举值一致性
|
|
300
|
+
const apiContractPath = (0, path_1.join)(iterDir, '..', '.speccore', 'GLOBAL', 'API_CONTRACT.yaml');
|
|
301
|
+
if (await (0, fs_extra_1.pathExists)(apiContractPath)) {
|
|
302
|
+
checks.push({
|
|
303
|
+
category: 'enum-value',
|
|
304
|
+
status: 'warning',
|
|
305
|
+
description: `新端使用的枚举值必须与 global/API_CONTRACT.yaml 中定义的一致`,
|
|
306
|
+
suggestion: '对比新端的枚举定义与全局契约',
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
// 3. 数据模型一致性(如果共享实体)
|
|
310
|
+
if (analysis.isBackend) {
|
|
311
|
+
checks.push({
|
|
312
|
+
category: 'data-model',
|
|
313
|
+
status: 'warning',
|
|
314
|
+
description: `新端 ${newPlatform} 的数据模型如果与已有端共享实体,字段定义必须一致`,
|
|
315
|
+
suggestion: '对比 DATA_MODEL.md 与已有后端端的实体定义',
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
// 4. 认证一致性
|
|
319
|
+
checks.push({
|
|
320
|
+
category: 'auth',
|
|
321
|
+
status: 'warning',
|
|
322
|
+
description: `新端的认证机制必须与全局认证体系兼容`,
|
|
323
|
+
suggestion: '确认使用统一的鉴权方式(如 JWT/OAuth2)',
|
|
324
|
+
});
|
|
325
|
+
// 5. 命名规范
|
|
326
|
+
checks.push({
|
|
327
|
+
category: 'naming',
|
|
328
|
+
status: 'warning',
|
|
329
|
+
description: `新端的文件/类/接口命名需遵循项目规范`,
|
|
330
|
+
suggestion: '参考 .speccore/PATTERNS/ 中的命名模式',
|
|
331
|
+
});
|
|
332
|
+
return checks;
|
|
333
|
+
}
|
|
334
|
+
/** 判断端是否为后端 */
|
|
335
|
+
async function isBackendPlatform(platform) {
|
|
336
|
+
const types = await (0, spec_paths_1.parsePlatformTypes)();
|
|
337
|
+
const t = (types.get(platform) || '').toLowerCase();
|
|
338
|
+
return t.includes('service') || t.includes('java') || t.includes('node') || t.includes('go') || t.includes('python') || t.includes('后端');
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=platform-addition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-addition.js","sourceRoot":"","sources":["../../src/core/platform-addition.ts"],"names":[],"mappings":"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"}
|