@godv61/dsh-task-engine 0.29.3 → 0.30.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.
Files changed (85) hide show
  1. package/.adaptive-test.mjs +380 -185
  2. package/.codex-project-test.mjs +18 -18
  3. package/.evidence-test.mjs +14 -1
  4. package/.hook-test.mjs +19 -19
  5. package/.resource-test.mjs +17 -0
  6. package/.roundtrip-test.mjs +8 -3
  7. package/.sonar-credential-test.mjs +38 -0
  8. package/.sonarlint-local-test.mjs +71 -0
  9. package/.workflow-test.mjs +56 -9
  10. package/README.md +35 -112
  11. package/docs/development.md +45 -53
  12. package/docs/manual.html +140 -84
  13. package/hooks/commit-msg +19 -1
  14. package/lib/adaptive.js +1 -1
  15. package/lib/adaptive.js.map +1 -1
  16. package/lib/client.js +297 -9
  17. package/lib/client.js.map +1 -1
  18. package/lib/controller.d.ts +44 -0
  19. package/lib/controller.js +73 -0
  20. package/lib/controller.js.map +1 -1
  21. package/lib/dev-task.d.ts +2 -0
  22. package/lib/dev-task.js +342 -42
  23. package/lib/dev-task.js.map +1 -1
  24. package/lib/engine.d.ts +5 -1
  25. package/lib/engine.js +6 -0
  26. package/lib/engine.js.map +1 -1
  27. package/lib/hook.js +3 -3
  28. package/lib/hook.js.map +1 -1
  29. package/lib/project-init.d.ts +4 -0
  30. package/lib/project-init.js +21 -2
  31. package/lib/project-init.js.map +1 -1
  32. package/lib/skill-audit.js +9 -1
  33. package/lib/skill-audit.js.map +1 -1
  34. package/lib/sonar-credential.d.ts +17 -0
  35. package/lib/sonar-credential.js +17 -0
  36. package/lib/sonar-credential.js.map +1 -0
  37. package/lib/sonar-report.d.ts +4 -0
  38. package/lib/sonar-report.js +53 -0
  39. package/lib/sonar-report.js.map +1 -0
  40. package/lib/sonar.d.ts +35 -2
  41. package/lib/sonar.js +63 -4
  42. package/lib/sonar.js.map +1 -1
  43. package/lib/sonarlint-local.d.ts +17 -0
  44. package/lib/sonarlint-local.js +317 -0
  45. package/lib/sonarlint-local.js.map +1 -0
  46. package/lib/verification-tests.d.ts +10 -0
  47. package/lib/verification-tests.js +15 -0
  48. package/lib/verification-tests.js.map +1 -0
  49. package/package.json +6 -4
  50. package/preset/enable.mjs +2 -2
  51. package/preset/persona.md +4 -4
  52. package/scripts/verify-dsh-compat.mjs +14 -14
  53. package/scripts/verify-package.mjs +10 -8
  54. package/skills/architecture-design/SKILL.md +11 -11
  55. package/skills/code-development/SKILL.md +11 -11
  56. package/skills/code-review/SKILL.md +12 -10
  57. package/skills/eng-delivery/SKILL.md +10 -7
  58. package/skills/requirements-analysis/SKILL.md +11 -11
  59. package/skills/task-orchestration/SKILL.md +11 -11
  60. package/skills/test-validation/SKILL.md +11 -9
  61. package/docs/BRIEF-FOR-REVIEW.md +0 -163
  62. package/docs/CHANGELOG.md +0 -407
  63. package/docs/README.md +0 -42
  64. package/docs/adaptive-workflows.md +0 -76
  65. package/docs/assets/workflow-banner.svg +0 -29
  66. package/docs/configuration.md +0 -80
  67. package/docs/faq.md +0 -59
  68. package/docs/getting-started.md +0 -55
  69. package/docs/listing/godv61__dsh-task-engine.yml +0 -6
  70. package/docs/listing/submission.md +0 -84
  71. package/docs/manual-legacy.html +0 -380
  72. package/docs/releases/0.23.0.md +0 -32
  73. package/docs/releases/0.23.1.md +0 -58
  74. package/docs/releases/0.23.2.md +0 -21
  75. package/docs/resource-install.md +0 -64
  76. package/docs/roadmap.md +0 -33
  77. package/docs/testing/0.23.0//346/265/213/350/257/225/346/211/247/350/241/214/350/256/260/345/275/225.md +0 -189
  78. package/docs/testing/0.23.0//346/265/213/350/257/225/346/212/245/345/221/212.md +0 -42
  79. package/docs/testing/0.23.1//346/265/213/350/257/225/346/212/245/345/221/212.md +0 -34
  80. package/docs/testing/0.23.1//350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/230/216/347/273/206.md +0 -41
  81. package/docs/testing/0.23.2/R02/344/270/232/345/212/241/346/265/213/350/257/225/346/230/216/347/273/206.md +0 -56
  82. package/docs/testing/0.23.2/R03/344/270/232/345/212/241/346/265/213/350/257/225/346/230/216/347/273/206.md +0 -38
  83. package/docs/testing/0.23.2//346/265/213/350/257/225/346/212/245/345/221/212.md +0 -65
  84. package/docs/testing/0.23.2//350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/230/216/347/273/206.md +0 -43
  85. package/docs/workflow-regression.md +0 -36
package/lib/sonar.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sonar.js","sourceRoot":"","sources":["../src/sonar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sonar.js","sourceRoot":"","sources":["../src/sonar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { SonarAudit, SonarPolicy } from './sonar.ts';
2
+ export declare function uncoveredLocalFiles(paths: string[], profiles: {
3
+ language?: string;
4
+ activeRuleCount?: number;
5
+ }[]): string[];
6
+ /** A declared task scope must include every changed file selected for this project's local audit. */
7
+ export declare function missingLocalAuditScope(paths: string[], taskPaths: string[]): string[];
8
+ interface ChangedFile {
9
+ path: string;
10
+ lines: Set<number>;
11
+ newFile: boolean;
12
+ }
13
+ /** Compare the current working tree with a reference; an untracked file is wholly new. */
14
+ export declare function changedLines(root: string, reference: string, taskPaths?: string[]): Promise<ChangedFile[]>;
15
+ /** Analyze only changed supported files with the project's synchronized Quality Profile. */
16
+ export declare function inspectLocalRules(policy: SonarPolicy, token: string, root: string, scopeHash: string, signal?: AbortSignal, taskPaths?: string[]): Promise<SonarAudit>;
17
+ export {};
@@ -0,0 +1,317 @@
1
+ /** Local SonarQube for IDE engine. It reads server rules and source files; it never runs a scanner or uploads an analysis. */
2
+ import { spawn, execFile } from 'node:child_process';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
5
+ import { homedir, tmpdir } from 'node:os';
6
+ import { join, relative, resolve, sep } from 'node:path';
7
+ import { pathToFileURL } from 'node:url';
8
+ import { promisify } from 'node:util';
9
+ import { isBlockingFinding, isIncludedAuditPath } from "./sonar.js";
10
+ const run = promisify(execFile);
11
+ const SUPPORTED_FILE = /\.(?:java|js|jsx|ts|tsx|vue|css|scss|html|jsp|xml|json|ya?ml|sql|properties|py|go|kt|kts|cs|c|cc|cpp|h|hpp|php|rb|sh|scala|groovy)$/iu;
12
+ function isAuditSource(path) {
13
+ const parts = path.replaceAll('\\', '/').split('/');
14
+ if (parts.some(part => ['.dsh', '.git', 'node_modules', 'target', 'dist', 'build'].includes(part)))
15
+ return false;
16
+ return SUPPORTED_FILE.test(path);
17
+ }
18
+ function localLanguage(path) {
19
+ if (/\.java$/iu.test(path))
20
+ return 'JAVA';
21
+ if (/\.(?:js|jsx|vue)$/iu.test(path))
22
+ return 'JS';
23
+ if (/\.(?:ts|tsx)$/iu.test(path))
24
+ return 'TS';
25
+ if (/\.(?:css|scss)$/iu.test(path))
26
+ return 'CSS';
27
+ if (/\.html?$/iu.test(path))
28
+ return 'HTML';
29
+ if (/\.xml$/iu.test(path))
30
+ return 'XML';
31
+ return undefined;
32
+ }
33
+ /** Languages which the server can assign to changed files that this local engine cannot analyze. */
34
+ function serverLanguages(path) {
35
+ const extension = /\.([^.\\/]+)$/u.exec(path)?.[1]?.toLowerCase();
36
+ const languages = {
37
+ sql: ['sql', 'plsql', 'tsql'], json: ['json'], yaml: ['yaml'], yml: ['yaml'],
38
+ properties: ['properties'], py: ['py'], go: ['go'], kt: ['kotlin'], kts: ['kotlin'],
39
+ cs: ['cs'], c: ['c'], cc: ['cpp'], cpp: ['cpp'], h: ['c', 'cpp'], hpp: ['cpp'],
40
+ php: ['php'], rb: ['ruby'], sh: ['shell'], scala: ['scala'], groovy: ['groovy'],
41
+ };
42
+ return extension ? (languages[extension] ?? []) : [];
43
+ }
44
+ export function uncoveredLocalFiles(paths, profiles) {
45
+ const active = new Set(profiles.filter(profile => Number(profile.activeRuleCount) > 0)
46
+ .map(profile => profile.language?.toLowerCase()).filter((language) => !!language));
47
+ return paths.filter(path => serverLanguages(path).some(language => active.has(language)));
48
+ }
49
+ /** A declared task scope must include every changed file selected for this project's local audit. */
50
+ export function missingLocalAuditScope(paths, taskPaths) {
51
+ const declared = new Set(taskPaths.map(path => path.replaceAll('\\', '/').replace(/^\.\//u, '').toLowerCase()));
52
+ return paths.filter(path => !declared.has(path.replaceAll('\\', '/').replace(/^\.\//u, '').toLowerCase()));
53
+ }
54
+ /** Compare the current working tree with a reference; an untracked file is wholly new. */
55
+ export async function changedLines(root, reference, taskPaths) {
56
+ if (!/^[A-Za-z0-9._/-]+$/u.test(reference) || reference.startsWith('-'))
57
+ throw new Error('invalid Sonar reference branch');
58
+ const [diff, untracked] = await Promise.all([
59
+ run('git', ['-c', 'core.quotepath=false', 'diff', '--no-ext-diff', '--no-color', '--unified=0', reference, '--'], { cwd: root, maxBuffer: 20 * 1024 * 1024 }),
60
+ run('git', ['ls-files', '--others', '--exclude-standard', '-z'], { cwd: root, maxBuffer: 5 * 1024 * 1024 }),
61
+ ]);
62
+ const files = new Map();
63
+ let current;
64
+ let newFile = false;
65
+ for (const line of diff.stdout.split(/\r?\n/u)) {
66
+ if (line.startsWith('--- /dev/null'))
67
+ newFile = true;
68
+ else if (line.startsWith('--- a/'))
69
+ newFile = false;
70
+ else if (line.startsWith('+++ b/')) {
71
+ current = line.slice(6).trim();
72
+ if (current && isAuditSource(current))
73
+ files.set(current, files.get(current) ?? { path: current, lines: new Set(), newFile });
74
+ else
75
+ current = undefined;
76
+ }
77
+ else if (line.startsWith('+++ /dev/null'))
78
+ current = undefined;
79
+ else if (current && line.startsWith('@@ ')) {
80
+ const hunk = /^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/u.exec(line);
81
+ if (!hunk)
82
+ throw new Error(`cannot parse Git diff hunk for ${current}`);
83
+ const first = Number(hunk[1]);
84
+ const count = hunk[2] === undefined ? 1 : Number(hunk[2]);
85
+ for (let n = first; n < first + count; n++)
86
+ files.get(current).lines.add(n);
87
+ }
88
+ }
89
+ for (const path of untracked.stdout.split('\0').filter(Boolean)) {
90
+ if (!isAuditSource(path))
91
+ continue;
92
+ const absolute = resolve(root, path);
93
+ if (relative(resolve(root), absolute).startsWith('..'))
94
+ throw new Error('untracked path escaped the project root');
95
+ const lines = readFileSync(absolute, 'utf8').split(/\r?\n/u).length;
96
+ files.set(path, { path, lines: new Set(Array.from({ length: lines }, (_, index) => index + 1)), newFile: true });
97
+ }
98
+ const scoped = taskPaths === undefined ? undefined : new Set(taskPaths.map(path => path.replaceAll('\\', '/')
99
+ .replace(/^\.\//u, '').toLowerCase()));
100
+ return [...files.values()].filter(file => file.lines.size
101
+ && (scoped === undefined || scoped.has(file.path.replaceAll('\\', '/').toLowerCase())));
102
+ }
103
+ /** The engine can be installed independently; environment paths point to its Java runtime and SonarLint JARs. */
104
+ function enginePaths() {
105
+ const java = process.env.DSH_SONARLINT_JAVA;
106
+ const lib = process.env.DSH_SONARLINT_LIB;
107
+ const plugins = process.env.DSH_SONARLINT_PLUGINS?.split(sep === '\\' ? ';' : ':').filter(Boolean) ?? [];
108
+ if (!java || !lib || !plugins.length || !existsSync(java) || !existsSync(lib) || plugins.some(path => !existsSync(path))) {
109
+ throw new Error('本地 Sonar 审核需要 DSH_SONARLINT_JAVA、DSH_SONARLINT_LIB 和 DSH_SONARLINT_PLUGINS;请先安装 SonarLint 后台组件并配置路径');
110
+ }
111
+ return { java, lib, plugins };
112
+ }
113
+ /** Analyze only changed supported files with the project's synchronized Quality Profile. */
114
+ export async function inspectLocalRules(policy, token, root, scopeHash, signal, taskPaths) {
115
+ if (!token)
116
+ throw new Error('本地规则审核需要当前项目 SonarQube Token');
117
+ if (!policy.reference_branch)
118
+ throw new Error('本地规则审核需要新代码参考分支');
119
+ const changes = (await changedLines(root, policy.reference_branch))
120
+ .filter(file => isIncludedAuditPath(file.path, policy.include_paths));
121
+ if (taskPaths !== undefined) {
122
+ const missing = missingLocalAuditScope(changes.map(file => file.path), taskPaths);
123
+ if (missing.length)
124
+ throw new Error(`本地规则审核范围漏登 ${missing.length} 个新增代码文件;先用 dev_task scope 补齐后重试:${missing.join(', ')}`);
125
+ }
126
+ const unsupported = changes.filter(file => !localLanguage(file.path));
127
+ const profilesUrl = new URL(`${policy.host_url.replace(/\/$/u, '')}/api/qualityprofiles/search`);
128
+ profilesUrl.searchParams.set('project', policy.project_key);
129
+ const profilesResponse = await fetch(profilesUrl, { headers: { Authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(15_000) });
130
+ if (!profilesResponse.ok)
131
+ throw new Error(`SonarQube 项目规则配置查询失败(HTTP ${profilesResponse.status})`);
132
+ const profileData = await profilesResponse.json();
133
+ if (!Array.isArray(profileData.profiles))
134
+ throw new Error('SonarQube 未返回项目规则配置');
135
+ const uncovered = uncoveredLocalFiles(unsupported.map(file => file.path), profileData.profiles);
136
+ const branchUrl = new URL(`${policy.host_url.replace(/\/$/u, '')}/api/project_branches/list`);
137
+ branchUrl.searchParams.set('project', policy.project_key);
138
+ const branchResponse = await fetch(branchUrl, { headers: { Authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(15_000) });
139
+ if (!branchResponse.ok)
140
+ throw new Error(`SonarQube 项目分支查询失败(HTTP ${branchResponse.status})`);
141
+ const branchData = await branchResponse.json();
142
+ const serverMain = branchData.branches?.find(branch => branch.isMain === true)?.name;
143
+ if (!serverMain)
144
+ throw new Error('SonarQube 未返回项目主分支,无法同步本地规则');
145
+ const paths = enginePaths();
146
+ const supported = changes.filter(change => localLanguage(change.path));
147
+ const files = supported.map(change => {
148
+ const absolute = resolve(root, change.path);
149
+ if (relative(resolve(root), absolute).startsWith('..'))
150
+ throw new Error('changed path escaped the project root');
151
+ return { uri: pathToFileURL(absolute).href, ideRelativePath: change.path.replaceAll('\\', '/'),
152
+ configScopeId: 'project', isTest: /(^|[\\/])test[\\/]/iu.test(change.path), charset: 'UTF-8',
153
+ fsPath: absolute, content: readFileSync(absolute, 'utf8'), detectedLanguage: localLanguage(change.path), isUserDefined: true };
154
+ });
155
+ const fileLines = new Map(supported.map((change, index) => [files[index].uri, change.lines]));
156
+ const newFiles = new Set(files.filter((_, index) => supported[index]?.newFile).map(file => file.uri));
157
+ const cacheKey = `${resolve(root).toLowerCase()}\0${policy.host_url}\0${policy.project_key}`;
158
+ const stateDir = join(homedir(), '.dsh', 'sonarlint-cache', createHash('sha256').update(cacheKey).digest('hex').slice(0, 24));
159
+ mkdirSync(stateDir, { recursive: true });
160
+ const workDir = mkdtempSync(join(tmpdir(), 'dsh-sonarlint-'));
161
+ const child = spawn(paths.java, ['-cp', join(paths.lib, '*'),
162
+ 'org.sonarsource.sonarlint.core.backend.cli.SonarLintServerCli'], { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true });
163
+ let buffer = Buffer.alloc(0);
164
+ let id = 1;
165
+ let settled = false;
166
+ const pending = new Map();
167
+ const messages = [];
168
+ let ready = () => { };
169
+ const readiness = new Promise(resolveReady => { ready = resolveReady; });
170
+ let rejectExit = () => { };
171
+ const exited = new Promise((_, reject) => { rejectExit = reject; });
172
+ void exited.catch(() => { });
173
+ const write = (message) => {
174
+ const payload = Buffer.from(JSON.stringify(message));
175
+ child.stdin.write(`Content-Length: ${payload.length}\r\n\r\n`);
176
+ child.stdin.write(payload);
177
+ };
178
+ const request = (method, params, timeout = 120_000) => {
179
+ const current = id++;
180
+ return new Promise((accept, reject) => {
181
+ const timer = setTimeout(() => { pending.delete(current); reject(new Error(`${method} timed out`)); }, timeout);
182
+ pending.set(current, { resolve: accept, reject, timer });
183
+ write({ jsonrpc: '2.0', id: current, method, params });
184
+ });
185
+ };
186
+ const notify = (method, params) => write({ jsonrpc: '2.0', method, params });
187
+ child.stderr.on('data', chunk => {
188
+ const line = String(chunk).replaceAll(token, '[redacted]').slice(0, 500);
189
+ if (messages.length < 8)
190
+ messages.push(line);
191
+ });
192
+ child.stdout.on('data', chunk => {
193
+ buffer = Buffer.concat([buffer, chunk]);
194
+ while (true) {
195
+ const split = buffer.indexOf('\r\n\r\n');
196
+ if (split < 0)
197
+ break;
198
+ const length = Number(/Content-Length:\s*(\d+)/iu.exec(buffer.subarray(0, split).toString())?.[1]);
199
+ if (!Number.isFinite(length) || buffer.length < split + 4 + length)
200
+ break;
201
+ const message = JSON.parse(buffer.subarray(split + 4, split + 4 + length).toString());
202
+ buffer = buffer.subarray(split + 4 + length);
203
+ if (message.id !== undefined && message.method === undefined) {
204
+ const task = pending.get(message.id);
205
+ pending.delete(message.id);
206
+ if (task) {
207
+ clearTimeout(task.timer);
208
+ if (message.error)
209
+ task.reject(new Error(message.error.message ?? 'SonarLint RPC failed'));
210
+ else
211
+ task.resolve(message.result);
212
+ }
213
+ }
214
+ else {
215
+ if (message.method === 'didChangeAnalysisReadiness' && message.params?.areReadyForAnalysis === true)
216
+ ready();
217
+ if (message.method === 'log' && ['ERROR', 'WARN'].includes(message.params?.level) && messages.length < 8) {
218
+ messages.push(String(message.params?.message ?? '').replaceAll(token, '[redacted]').slice(0, 500));
219
+ }
220
+ if (message.id !== undefined) {
221
+ const result = message.method === 'getBaseDir' ? { baseDir: root }
222
+ : message.method === 'getInferredAnalysisProperties' ? { properties: {} }
223
+ : message.method === 'getFileExclusions' ? { fileExclusionPatterns: [] }
224
+ : message.method === 'listFiles' ? { files }
225
+ : message.method === 'getCredentials' ? { credentials: { token } }
226
+ : message.method === 'selectProxies' ? { proxies: [] }
227
+ : message.method === 'checkServerTrusted' ? { trusted: false }
228
+ : message.method === 'matchSonarProjectBranch' ? { branchName: serverMain } : null;
229
+ write({ jsonrpc: '2.0', id: message.id, result });
230
+ }
231
+ }
232
+ }
233
+ });
234
+ const failChild = (error) => {
235
+ if (!settled) {
236
+ rejectExit(error);
237
+ for (const task of pending.values()) {
238
+ clearTimeout(task.timer);
239
+ task.reject(error);
240
+ }
241
+ }
242
+ };
243
+ child.on('error', error => failChild(new Error(`SonarLint could not start: ${error.message}`)));
244
+ child.stdin.on('error', error => failChild(new Error(`SonarLint input failed: ${error.message}`)));
245
+ child.on('exit', code => failChild(new Error(`SonarLint exited ${code}: ${messages.join('; ')}`)));
246
+ const onAbort = () => child.kill();
247
+ signal?.addEventListener('abort', onAbort, { once: true });
248
+ try {
249
+ await request('initialize', {
250
+ clientConstantInfo: { name: 'DSH', userAgent: 'dsh-task-engine' },
251
+ telemetryConstantAttributes: { productKey: 'dsh', productName: 'DSH', productVersion: '0', ideVersion: '0', additionalAttributes: {} },
252
+ httpConfiguration: { sslConfiguration: {} }, backendCapabilities: ['FULL_SYNCHRONIZATION'],
253
+ storageRoot: stateDir, workDir, embeddedPluginPaths: paths.plugins, connectedModeEmbeddedPluginPathsByKey: {},
254
+ enabledLanguagesInStandaloneMode: ['JAVA'], extraEnabledLanguagesInConnectedMode: ['JS', 'TS', 'CSS', 'HTML', 'XML'], disabledPluginKeysForAnalysis: [],
255
+ sonarQubeConnections: [{ connectionId: 'project', serverUrl: policy.host_url, disableNotifications: true }], sonarCloudConnections: [],
256
+ standaloneRuleConfigByKey: {}, isFocusOnNewCode: false, automaticAnalysisEnabled: false,
257
+ languageSpecificRequirements: { omnisharpDownloadEnabled: false }, logLevel: 'WARN',
258
+ }, 30_000);
259
+ notify('configuration/didAddConfigurationScopes', { addedScopes: [{ id: 'project', bindable: true, name: 'Project',
260
+ binding: { connectionId: 'project', sonarProjectKey: policy.project_key, bindingSuggestionDisabled: true } }] });
261
+ let readyTimer;
262
+ try {
263
+ await Promise.race([readiness, exited, new Promise((_, reject) => {
264
+ readyTimer = setTimeout(() => reject(new Error(`SonarLint 项目规则同步超时:${messages.join('; ')}`)), 120_000);
265
+ })]);
266
+ }
267
+ finally {
268
+ if (readyTimer)
269
+ clearTimeout(readyTimer);
270
+ }
271
+ if (files.length) {
272
+ notify('file/didUpdateFileSystem', { addedFiles: files, changedFiles: [], removedFiles: [] });
273
+ const status = await request('file/getFilesStatus', { fileUrisByConfigScopeId: { project: files.map(file => file.uri) } });
274
+ const excluded = files.filter(file => status.fileStatuses?.[file.uri]?.excluded);
275
+ if (excluded.length)
276
+ throw new Error(`SonarLint 排除了新增代码:${excluded.map(file => file.ideRelativePath).join(', ')}`);
277
+ }
278
+ const response = files.length ? await request('analysis/analyzeFilesAndTrack', {
279
+ configurationScopeId: 'project', analysisId: randomUUID(), filesToAnalyze: files.map(file => file.uri),
280
+ extraProperties: {}, shouldFetchServerIssues: false,
281
+ }) : { rawIssues: [], failedAnalysisFiles: [] };
282
+ if (response.failedAnalysisFiles?.length)
283
+ throw new Error(`SonarLint 无法分析:${response.failedAnalysisFiles.join(', ')}`);
284
+ const rawFindings = (response.rawIssues ?? []).flatMap((issue) => {
285
+ const uri = issue.fileUri ?? issue.uri ?? files[0]?.uri;
286
+ const line = issue.textRange?.startLine ?? issue.primaryLocation?.textRange?.startLine;
287
+ if (typeof uri !== 'string' || (typeof line !== 'number' && !newFiles.has(uri))
288
+ || (typeof line === 'number' && !fileLines.get(uri)?.has(line)))
289
+ return [];
290
+ const path = files.find(file => file.uri === uri)?.ideRelativePath ?? uri;
291
+ const identity = `${path}\0${line ?? 'file'}\0${issue.ruleKey}\0${issue.primaryMessage}`;
292
+ return [{ key: `local-${createHash('sha256').update(identity).digest('hex').slice(0, 20)}`,
293
+ rule: String(issue.ruleKey ?? ''), message: String(issue.primaryMessage ?? ''),
294
+ severity: String(issue.severity ?? 'UNKNOWN'), file: path,
295
+ ...(typeof line === 'number' ? { line } : {}) }];
296
+ });
297
+ const findings = [...new Map(rawFindings.map(finding => [finding.key, finding])).values()];
298
+ const blocking = findings.filter(isBlockingFinding);
299
+ return { ce_task_id: 'local', analysis_id: randomUUID(), gate: blocking.length || uncovered.length ? 'ERROR' : 'OK',
300
+ checked_at: new Date().toISOString(), scope_hash: scopeHash, findings, blocking,
301
+ ...(uncovered.length ? { uncovered_files: uncovered } : {}),
302
+ target: policy.reference_branch, scanned_files: supported.map(file => file.path) };
303
+ }
304
+ finally {
305
+ settled = true;
306
+ signal?.removeEventListener('abort', onAbort);
307
+ child.stdin.end();
308
+ setTimeout(() => child.kill(), 2000).unref();
309
+ const resolvedWorkDir = resolve(workDir);
310
+ const relativeWorkDir = relative(resolve(tmpdir()), resolvedWorkDir);
311
+ if (relativeWorkDir && relativeWorkDir !== '..' && !relativeWorkDir.startsWith(`..${sep}`)
312
+ && !relativeWorkDir.startsWith(sep) && relativeWorkDir.startsWith('dsh-sonarlint-')) {
313
+ rmSync(resolvedWorkDir, { recursive: true, force: true });
314
+ }
315
+ }
316
+ }
317
+ //# sourceMappingURL=sonarlint-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonarlint-local.js","sourceRoot":"","sources":["../src/sonarlint-local.ts"],"names":[],"mappings":"AAAA,8HAA8H;AAC9H,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEnE,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC/B,MAAM,cAAc,GAAG,uIAAuI,CAAA;AAC9J,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAChH,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAClC,CAAC;AACD,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAA;IACzC,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACjD,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IAChD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAA;IAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IACvC,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,oGAAoG;AACpG,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAA;IACjE,MAAM,SAAS,GAA6B;QAC1C,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC;QAC5E,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;QACnF,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC;QAC9E,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC;KAChF,CAAA;IACD,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAe,EAAE,QAA2D;IAC9G,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;SACnF,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAsB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;IACxG,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC3F,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,sBAAsB,CAAC,KAAe,EAAE,SAAmB;IACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC/G,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;AAC5G,CAAC;AAID,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,SAAiB,EAAE,SAAoB;IACtF,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAC1H,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1C,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,EAC9G,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QAC7C,GAAG,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;KAC5G,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAA;IAC5C,IAAI,OAA2B,CAAA;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,OAAO,GAAG,IAAI,CAAA;aAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,GAAG,KAAK,CAAA;aAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAC9B,IAAI,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EACtD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;;gBAChE,OAAO,GAAG,SAAS,CAAA;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,OAAO,GAAG,SAAS,CAAA;aAC3D,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,0CAA0C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClE,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAA;YACvE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YACxF,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE;gBAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC9E,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE,SAAQ;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACpC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QAClH,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAA;QACnE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAClH,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;SAC1G,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;WACpD,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAA;AAC3F,CAAC;AAID,iHAAiH;AACjH,SAAS,WAAW;IAClB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IACxG,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACzH,MAAM,IAAI,KAAK,CAAC,qGAAqG,CAAC,CAAA;IACxH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAA;AAC/B,CAAC;AAID,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAmB,EAAE,KAAa,EAAE,IAAY,EACtF,SAAiB,EAAE,MAAoB,EAAE,SAAoB;IAC7D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAC3D,IAAI,CAAC,MAAM,CAAC,gBAAgB;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;SAChE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAA;IACvE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAA;QACjF,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,CAAC,MAAM,oCAAoC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3H,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACrE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,6BAA6B,CAAC,CAAA;IAChG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IAC3D,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACzI,IAAI,CAAC,gBAAgB,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAA;IAClG,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAsE,CAAA;IACrH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IAChF,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;IAC/F,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,4BAA4B,CAAC,CAAA;IAC7F,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IACzD,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACrI,IAAI,CAAC,cAAc,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,cAAc,CAAC,MAAM,GAAG,CAAC,CAAA;IAC5F,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,EAA0D,CAAA;IACtG,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,IAAI,CAAA;IACpF,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAG,WAAW,EAAE,CAAA;IAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IACtE,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAChH,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;YAC5F,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO;YAC5F,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,gBAAgB,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAA;IAClI,CAAC,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC9F,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACrG,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,WAAW,EAAE,CAAA;IAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IAC7H,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;QAC1D,+DAA+D,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3H,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC5B,IAAI,EAAE,GAAG,CAAC,CAAA;IACV,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAA;IAC7C,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,KAAK,GAAe,GAAG,EAAE,GAAE,CAAC,CAAA;IAChC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAO,YAAY,CAAC,EAAE,GAAG,KAAK,GAAG,YAAY,CAAA,CAAC,CAAC,CAAC,CAAA;IAC7E,IAAI,UAAU,GAA2B,GAAG,EAAE,GAAE,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,UAAU,GAAG,MAAM,CAAA,CAAC,CAAC,CAAC,CAAA;IACzE,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC3B,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAE,EAAE;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;QACpD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,MAAM,UAAU,CAAC,CAAA;QAC9D,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,MAAe,EAAE,OAAO,GAAG,OAAO,EAAgB,EAAE;QACnF,MAAM,OAAO,GAAG,EAAE,EAAE,CAAA;QACpB,OAAO,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,CAAA,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAC9G,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;YACxD,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,MAAe,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7F,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACxE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;QAC9B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;QACvC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACxC,IAAI,KAAK,GAAG,CAAC;gBAAE,MAAK;YACpB,MAAM,MAAM,GAAG,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAClG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,GAAG,MAAM;gBAAE,MAAK;YACzE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAEnF,CAAA;YACD,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;YAC5C,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;gBAChE,IAAI,IAAI,EAAE,CAAC;oBACT,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBACxB,IAAI,OAAO,CAAC,KAAK;wBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,sBAAsB,CAAC,CAAC,CAAA;;wBACrF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACnC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,OAAO,CAAC,MAAM,KAAK,4BAA4B,IAAI,OAAO,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI;oBAAE,KAAK,EAAE,CAAA;gBAC5G,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;gBACpG,CAAC;gBACD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;wBAChE,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,+BAA+B,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;4BACvE,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,mBAAmB,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,EAAE,EAAE;gCACtE,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;oCAC1C,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE;wCAChE,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;4CACpD,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,oBAAoB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;gDAC5D,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,yBAAyB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;oBAChG,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,CAAC,KAAY,EAAE,EAAE;QACjC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,KAAK,CAAC,CAAA;YACjB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAAC,CAAC;QACvF,CAAC;IACH,CAAC,CAAA;IACD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IAC/F,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IAClG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,oBAAoB,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAClG,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IAClC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,YAAY,EAAE;YAC1B,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE;YACjE,2BAA2B,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,EAAE;YACtI,iBAAiB,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,mBAAmB,EAAE,CAAC,sBAAsB,CAAC;YAC1F,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAC,OAAO,EAAE,qCAAqC,EAAE,EAAE;YAC7G,gCAAgC,EAAE,CAAC,MAAM,CAAC,EAAE,oCAAoC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,6BAA6B,EAAE,EAAE;YACvJ,oBAAoB,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,qBAAqB,EAAE,EAAE;YACtI,yBAAyB,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK;YACvF,4BAA4B,EAAE,EAAE,wBAAwB,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM;SACpF,EAAE,MAAM,CAAC,CAAA;QACV,MAAM,CAAC,yCAAyC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS;oBAChH,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,yBAAyB,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;QAClH,IAAI,UAAqD,CAAA;QACzD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;oBAC/D,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;gBACxG,CAAC,CAAC,CAAC,CAAC,CAAA;QACN,CAAC;gBAAS,CAAC;YAAC,IAAI,UAAU;gBAAE,YAAY,CAAC,UAAU,CAAC,CAAA;QAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,0BAA0B,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAA;YAC7F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,qBAAqB,EAAE,EAAE,uBAAuB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;YAC1H,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;YAChF,IAAI,QAAQ,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACpH,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,+BAA+B,EAAE;YAC7E,oBAAoB,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;YACtG,eAAe,EAAE,EAAE,EAAE,uBAAuB,EAAE,KAAK;SACpD,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAA;QAC/C,IAAI,QAAQ,CAAC,mBAAmB,EAAE,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtH,MAAM,WAAW,GAAmB,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE;YACpF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAA;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,SAAS,IAAI,KAAK,CAAC,eAAe,EAAE,SAAS,EAAE,SAAS,CAAA;YACtF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;mBAC1E,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAA;YAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,eAAe,IAAI,GAAG,CAAA;YACzE,MAAM,QAAQ,GAAG,GAAG,IAAI,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,cAAc,EAAE,CAAA;YACxF,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;oBACxF,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;oBAC9E,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI;oBACzD,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1F,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;QACnD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACjH,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ;YAC/E,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,MAAM,EAAE,MAAM,CAAC,gBAAgB,EAAE,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;IACtF,CAAC;YAAS,CAAC;QACT,OAAO,GAAG,IAAI,CAAA;QACd,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC7C,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;QACjB,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAA;QAC5C,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,eAAe,CAAC,CAAA;QACpE,IAAI,eAAe,IAAI,eAAe,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;eACrF,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACtF,MAAM,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Detect whether a Maven verification actually ran at least one Surefire/Failsafe test. */
2
+ export declare function mavenTestEvidence(command: string, output: string): {
3
+ count: number | null;
4
+ } | null;
5
+ /** Re-evaluate stored receipts so older zero-test passes cannot cross a current gate. */
6
+ export declare function receiptHasRequiredTests(receipt: {
7
+ command: string;
8
+ stdout: string;
9
+ stderr: string;
10
+ }): boolean;
@@ -0,0 +1,15 @@
1
+ /** Detect whether a Maven verification actually ran at least one Surefire/Failsafe test. */
2
+ export function mavenTestEvidence(command, output) {
3
+ const maven = /(?:^|[\s;&|])(?:[^\s]*[\\/])?(?:mvn|mvn\.cmd|mvnw|mvnw\.cmd)(?=\s|$)/iu.test(command);
4
+ const testGoal = /(?:^|\s)(?:test|verify|package|install)(?=\s|$)/iu.test(command);
5
+ if (!maven || !testGoal)
6
+ return null;
7
+ const counts = [...output.matchAll(/Tests run:\s*(\d+)\s*,\s*Failures:/giu)].map(match => Number(match[1]));
8
+ return { count: counts.length ? Math.max(...counts) : null };
9
+ }
10
+ /** Re-evaluate stored receipts so older zero-test passes cannot cross a current gate. */
11
+ export function receiptHasRequiredTests(receipt) {
12
+ const evidence = mavenTestEvidence(receipt.command, `${receipt.stdout}\n${receipt.stderr}`);
13
+ return evidence === null || (evidence.count ?? 0) > 0;
14
+ }
15
+ //# sourceMappingURL=verification-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-tests.js","sourceRoot":"","sources":["../src/verification-tests.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAc;IAC/D,MAAM,KAAK,GAAG,wEAAwE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpG,MAAM,QAAQ,GAAG,mDAAmD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAClF,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IACpC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3G,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AAC9D,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,uBAAuB,CAAC,OAA4D;IAClG,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3F,OAAO,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;AACvD,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@godv61/dsh-task-engine",
3
- "version": "0.29.3",
4
- "description": "Task-scoped engineering workflows for DeepSeek Harness: four complexity grades, meta skills with project Skill/Rule bindings, repository init, and optional review-time SonarQube quality gates. Legacy project flows remain compatible.",
3
+ "version": "0.30.0",
4
+ "description": "Task-scoped engineering workflows for DeepSeek Harness: four complexity grades, project Skill/Rule initialization, verified tests, and optional review-time SonarQube checks.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -51,7 +51,9 @@
51
51
  ".roundtrip-test.mjs",
52
52
  ".filter-test.mjs",
53
53
  ".codex-project-test.mjs",
54
- ".adaptive-test.mjs"
54
+ ".adaptive-test.mjs",
55
+ ".sonar-credential-test.mjs",
56
+ ".sonarlint-local-test.mjs"
55
57
  ],
56
58
  "license": "MIT",
57
59
  "publishConfig": {
@@ -72,7 +74,7 @@
72
74
  "scripts": {
73
75
  "build": "tsc -p tsconfig.json && node build-client.mjs && node build-hook.mjs",
74
76
  "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit",
75
- "test": "node .p0-test.mjs && node .acceptance.mjs && node .hook-consistency.mjs && node --test .resource-test.mjs .workflow-test.mjs .hook-test.mjs .preset-test.mjs .assessment-batch1.mjs .e2e-presets.mjs .revision-test.mjs .freeze-test.mjs .enforce-test.mjs .evidence-test.mjs .roundtrip-test.mjs .filter-test.mjs .codex-project-test.mjs .adaptive-test.mjs",
77
+ "test": "node .p0-test.mjs && node .acceptance.mjs && node .hook-consistency.mjs && node --test .resource-test.mjs .workflow-test.mjs .hook-test.mjs .preset-test.mjs .assessment-batch1.mjs .e2e-presets.mjs .revision-test.mjs .freeze-test.mjs .enforce-test.mjs .evidence-test.mjs .roundtrip-test.mjs .filter-test.mjs .codex-project-test.mjs .adaptive-test.mjs .sonar-credential-test.mjs .sonarlint-local-test.mjs",
76
78
  "verify:package": "node scripts/verify-package.mjs",
77
79
  "verify:dsh": "node scripts/verify-dsh-compat.mjs",
78
80
  "prepare": "npm run build"
package/preset/enable.mjs CHANGED
@@ -77,7 +77,7 @@ async function main() {
77
77
  await writeFile(
78
78
  join(target, 'preset.yml'),
79
79
  'name: 工程化开发引擎\n'
80
- + 'description: 按需求复杂度选择任务级流程,使用元技能、项目规则与 dev_task 门禁推进开发。\n',
80
+ + 'description: 按需求复杂度选择任务级流程,使用元技能、项目规则与 dev_task 门禁推进开发。\n',
81
81
  'utf8',
82
82
  )
83
83
 
@@ -85,4 +85,4 @@ async function main() {
85
85
  console.log('新建会话时选择「工程化开发引擎」即可激活流程。')
86
86
  }
87
87
 
88
- await main()
88
+ await main()
package/preset/persona.md CHANGED
@@ -1,7 +1,7 @@
1
1
  You are an engineering-delivery coding agent, powered by the {{model}} model, running on DeepSeek Harness. Your working directory is {{cwd}}.
2
2
 
3
- 本仓库使用 `dev_task` 管理工程任务。任何开发类请求开始前,先加载 `eng-delivery` 并读取当前分支的任务状态。新需求先分析复杂度(低 / 中 / 高 / 超高),调用 `assess` 预览,创建任务时传入 `complexity` 和可核查的 `complexity_reason`。复杂度决定本任务的元技能顺序,风险等级单独判断;不要把复杂度当成团队人员分工。
4
-
5
- `.dsh/meta.json` 只挂载元技能的附加项目技能;同名技能按项目级、用户级、内置级解析,任务创建时冻结实际来源。已有任务继续使用原快照;没有传入 `complexity` 的旧调用仍按 `.dsh/eng.json` 兼容执行。
3
+ 本仓库使用 `dev_task` 管理工程任务。任何开发类请求开始前,先加载 `eng-delivery` 并读取当前分支的任务状态。新需求先分析复杂度(低 / 中 / 高 / 超高),调用 `assess` 预览,创建任务时传入 `complexity` 和可核查的 `complexity_reason`。复杂度决定本任务的元技能顺序,风险等级单独判断;不要把复杂度当成团队人员分工。
6
4
 
7
- 阶段流转、确认、验证、评审、任务完成及受控提交通过 `dev_task`;它拒绝时按返回的条件修正,不绕过。按 `source:name` 使用 `load_skill` 读取当前绑定的技能和规则。SonarQube 只有在项目启用时于代码审核阶段检查,不在开发过程中反复扫描。远程操作或发布由用户明确决定。
5
+ `.dsh/meta.json` 只挂载元技能的附加项目技能;同名技能按项目级、用户级、内置级解析,任务创建时冻结实际来源。已有任务继续使用原快照;没有传入 `complexity` 的旧调用仍按 `.dsh/eng.json` 兼容执行。
6
+
7
+ 阶段流转、确认、验证、评审、任务完成及受控提交通过 `dev_task`;它拒绝时按返回的条件修正,不绕过。按 `source:name` 使用 `load_skill` 读取当前绑定的技能和规则。SonarQube 只有在项目启用时于代码审核阶段检查,不在开发过程中反复扫描。远程操作或发布由用户明确决定。
@@ -67,19 +67,19 @@ console.log(` contract: ${wantsCreate ? 'create() factory' : wantsSchema ? '
67
67
 
68
68
  // 2. Our descriptors must satisfy it. Import the built contribution and inspect
69
69
  // every strict codec exactly as the DSH registry would.
70
- const pluginRoot = fileURLToPath(new URL('..', import.meta.url))
71
- const controllerSource = readFileSync(join(pluginRoot, 'src', 'controller.ts'), 'utf8')
72
- const remoteSource = readFileSync(join(pluginRoot, 'src', 'client', 'remote.ts'), 'utf8')
73
- const exposedMethods = [...controllerSource.matchAll(/@Remote\s+async\s+(\w+)\s*\(/gu)].map(match => match[1])
74
- const declaredMethods = new Set([...remoteSource.matchAll(/method:\s*'(\w+)'/gu)].map(match => match[1]))
75
- // previewResource/importResource share a descriptor factory in remote.ts.
76
- for (const match of remoteSource.matchAll(/\(\['(\w+)',\s*'(\w+)'\]\s+as const\)\.map\(method/gu)) {
77
- declaredMethods.add(match[1])
78
- declaredMethods.add(match[2])
79
- }
80
- check('every host Remote method has a browser descriptor', exposedMethods.every(method => declaredMethods.has(method)),
81
- exposedMethods.filter(method => !declaredMethods.has(method)).join(', ') || `${exposedMethods.length} methods`)
82
- const clientBundle = join(pluginRoot, 'lib', 'client.js')
70
+ const pluginRoot = fileURLToPath(new URL('..', import.meta.url))
71
+ const controllerSource = readFileSync(join(pluginRoot, 'src', 'controller.ts'), 'utf8')
72
+ const remoteSource = readFileSync(join(pluginRoot, 'src', 'client', 'remote.ts'), 'utf8')
73
+ const exposedMethods = [...controllerSource.matchAll(/@Remote\s+async\s+(\w+)\s*\(/gu)].map(match => match[1])
74
+ const declaredMethods = new Set([...remoteSource.matchAll(/method:\s*'(\w+)'/gu)].map(match => match[1]))
75
+ // previewResource/importResource share a descriptor factory in remote.ts.
76
+ for (const match of remoteSource.matchAll(/\(\['(\w+)',\s*'(\w+)'\]\s+as const\)\.map\(method/gu)) {
77
+ declaredMethods.add(match[1])
78
+ declaredMethods.add(match[2])
79
+ }
80
+ check('every host Remote method has a browser descriptor', exposedMethods.every(method => declaredMethods.has(method)),
81
+ exposedMethods.filter(method => !declaredMethods.has(method)).join(', ') || `${exposedMethods.length} methods`)
82
+ const clientBundle = join(pluginRoot, 'lib', 'client.js')
83
83
  if (!existsSync(clientBundle)) {
84
84
  check('built client bundle exists', false, 'run `npm run build` first')
85
85
  process.exit(1)
@@ -153,4 +153,4 @@ if (problems.length > 0) {
153
153
  console.error('and add the version to peerDependencies before releasing.')
154
154
  process.exit(1)
155
155
  }
156
- console.log('\nDSH compatibility verified')
156
+ console.log('\nDSH compatibility verified')
@@ -40,15 +40,17 @@ const pkgDir = join(tmp, 'package')
40
40
  const listing = execSync(`tar -tzf "${tgzPath}"`, { encoding: 'utf8' })
41
41
  .trim().split(/\r?\n/u).map(line => line.replace(/^package\//u, ''))
42
42
  check('extract', existsSync(join(pkgDir, 'package.json')))
43
- const bundledSkills = ['architecture-design', 'code-development', 'code-review', 'eng-delivery',
44
- 'requirements-analysis', 'task-orchestration', 'test-validation']
45
- check('orchestration and six meta Skills ship',
46
- JSON.stringify(listing.filter(line => /^skills\/[^/]+\/SKILL\.md$/u.test(line)).sort())
47
- === JSON.stringify(bundledSkills.map(name => `skills/${name}/SKILL.md`).sort()))
48
- check('no bundled business rules ship', !listing.some(line => line.startsWith('rules/')))
43
+ const bundledSkills = ['architecture-design', 'code-development', 'code-review', 'eng-delivery',
44
+ 'requirements-analysis', 'task-orchestration', 'test-validation']
45
+ check('orchestration and six meta Skills ship',
46
+ JSON.stringify(listing.filter(line => /^skills\/[^/]+\/SKILL\.md$/u.test(line)).sort())
47
+ === JSON.stringify(bundledSkills.map(name => `skills/${name}/SKILL.md`).sort()))
48
+ check('no bundled business rules ship', !listing.some(line => line.startsWith('rules/')))
49
+ check('only current documentation ships', JSON.stringify(listing.filter(line => line.startsWith('docs/')).sort())
50
+ === JSON.stringify(['docs/development.md', 'docs/manual.html']))
49
51
 
50
52
  // 3. files whitelist sanity
51
- for (const required of ['hooks/commit-msg', 'lib/index.js', 'lib/client.js', 'lib/client.d.ts', 'preset/enable.mjs', 'README.md', '.p0-test.mjs', '.acceptance.mjs', '.hook-consistency.mjs', '.resource-test.mjs', '.workflow-test.mjs', '.hook-test.mjs', '.preset-test.mjs', '.assessment-batch1.mjs', '.e2e-presets.mjs', '.revision-test.mjs', '.freeze-test.mjs', '.enforce-test.mjs', '.evidence-test.mjs', '.roundtrip-test.mjs', '.filter-test.mjs', '.adaptive-test.mjs']) {
53
+ for (const required of ['hooks/commit-msg', 'lib/index.js', 'lib/client.js', 'lib/client.d.ts', 'preset/enable.mjs', 'README.md', '.p0-test.mjs', '.acceptance.mjs', '.hook-consistency.mjs', '.resource-test.mjs', '.workflow-test.mjs', '.hook-test.mjs', '.preset-test.mjs', '.assessment-batch1.mjs', '.e2e-presets.mjs', '.revision-test.mjs', '.freeze-test.mjs', '.enforce-test.mjs', '.evidence-test.mjs', '.roundtrip-test.mjs', '.filter-test.mjs', '.adaptive-test.mjs']) {
52
54
  check(`tarball contains ${required}`, listing.includes(required))
53
55
  }
54
56
  check('tarball excludes src sources', !listing.some(line => line.startsWith('src/')))
@@ -118,7 +120,7 @@ try {
118
120
  // Resource package behavior from the installed artifact, including the commit
119
121
  // hook running for real inside throwaway repositories.
120
122
  try {
121
- const out = execSync('node --test --test-reporter=tap .resource-test.mjs .workflow-test.mjs .hook-test.mjs .preset-test.mjs .adaptive-test.mjs', { cwd: installedDir, encoding: 'utf8', stdio: 'pipe' })
123
+ const out = execSync('node --test --test-reporter=tap .resource-test.mjs .workflow-test.mjs .hook-test.mjs .preset-test.mjs .adaptive-test.mjs', { cwd: installedDir, encoding: 'utf8', stdio: 'pipe' })
122
124
  check('in-package resource, workflow and hook behavior', /# fail 0/u.test(out))
123
125
  } catch (error) { check('in-package resource, workflow and hook behavior', false, String(error.stderr ?? error)) }
124
126
 
@@ -1,11 +1,11 @@
1
- ---
2
- name: architecture-design
3
- description: 为新模块或大范围重构确定边界、接口、兼容点和关键取舍。
4
- whenToUse: 超高复杂度任务进入架构设计元技能时。
5
- ---
6
-
7
- # 架构设计元技能
8
-
9
- 基于需求产物和实际代码库,说明模块边界、关键数据流、接口与依赖变化、兼容性和主要取舍。优先延续项目现有架构;偏离时说明理由。使用 `dev_task record` 写入当前阶段 `architecture` 产物。
10
-
11
- 交接给任务编排:可按先后顺序实施的结构、受影响范围、必须保持的接口契约。迁移或回退演练只在任务实际涉及相应风险时提出。
1
+ ---
2
+ name: architecture-design
3
+ description: 为新模块或大范围重构确定边界、接口、兼容点和关键取舍。
4
+ whenToUse: 超高复杂度任务进入架构设计元技能时。
5
+ ---
6
+
7
+ # 架构设计元技能
8
+
9
+ 基于需求产物和实际代码库,说明模块边界、关键数据流、接口与依赖变化、兼容性和主要取舍。优先延续项目现有架构;偏离时说明理由。使用 `dev_task record` 写入当前阶段 `architecture` 产物。
10
+
11
+ 交接给任务编排:可按先后顺序实施的结构、受影响范围、必须保持的接口契约。迁移或回退演练只在任务实际涉及相应风险时提出。