@godv61/dsh-task-engine 0.29.2 → 0.29.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.adaptive-test.mjs +302 -149
  2. package/.codex-project-test.mjs +18 -18
  3. package/.evidence-test.mjs +16 -3
  4. package/.hook-test.mjs +19 -19
  5. package/.resource-test.mjs +19 -2
  6. package/.roundtrip-test.mjs +8 -3
  7. package/.sonar-credential-test.mjs +38 -0
  8. package/.sonarlint-local-test.mjs +65 -0
  9. package/.workflow-test.mjs +29 -12
  10. package/README.md +22 -22
  11. package/docs/CHANGELOG.md +33 -14
  12. package/docs/README.md +6 -6
  13. package/docs/adaptive-workflows.md +85 -71
  14. package/docs/configuration.md +4 -4
  15. package/docs/faq.md +21 -11
  16. package/docs/getting-started.md +9 -9
  17. package/docs/manual-legacy.html +1 -1
  18. package/docs/manual.html +124 -116
  19. package/docs/roadmap.md +7 -7
  20. package/hooks/commit-msg +1 -1
  21. package/lib/adaptive.js +1 -1
  22. package/lib/adaptive.js.map +1 -1
  23. package/lib/client.js +337 -20
  24. package/lib/client.js.map +2 -2
  25. package/lib/controller.d.ts +35 -0
  26. package/lib/controller.js +68 -0
  27. package/lib/controller.js.map +1 -1
  28. package/lib/dev-task.d.ts +2 -0
  29. package/lib/dev-task.js +261 -31
  30. package/lib/dev-task.js.map +1 -1
  31. package/lib/engine.d.ts +1 -1
  32. package/lib/hook.js +3 -3
  33. package/lib/hook.js.map +1 -1
  34. package/lib/project-init.d.ts +4 -0
  35. package/lib/project-init.js +21 -2
  36. package/lib/project-init.js.map +1 -1
  37. package/lib/skill-audit.js +9 -1
  38. package/lib/skill-audit.js.map +1 -1
  39. package/lib/sonar-credential.d.ts +17 -0
  40. package/lib/sonar-credential.js +17 -0
  41. package/lib/sonar-credential.js.map +1 -0
  42. package/lib/sonar-report.d.ts +4 -0
  43. package/lib/sonar-report.js +40 -0
  44. package/lib/sonar-report.js.map +1 -0
  45. package/lib/sonar.d.ts +23 -2
  46. package/lib/sonar.js +55 -4
  47. package/lib/sonar.js.map +1 -1
  48. package/lib/sonarlint-local.d.ts +15 -0
  49. package/lib/sonarlint-local.js +307 -0
  50. package/lib/sonarlint-local.js.map +1 -0
  51. package/package.json +9 -7
  52. package/preset/enable.mjs +2 -2
  53. package/preset/persona.md +4 -4
  54. package/scripts/verify-dsh-compat.mjs +14 -14
  55. package/scripts/verify-package.mjs +7 -7
  56. package/skills/architecture-design/SKILL.md +11 -11
  57. package/skills/code-development/SKILL.md +11 -11
  58. package/skills/code-review/SKILL.md +11 -11
  59. package/skills/eng-delivery/SKILL.md +6 -4
  60. package/skills/requirements-analysis/SKILL.md +11 -11
  61. package/skills/task-orchestration/SKILL.md +11 -11
  62. package/skills/test-validation/SKILL.md +11 -11
@@ -0,0 +1,307 @@
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
+ /** Compare the current working tree with a reference; an untracked file is wholly new. */
50
+ export async function changedLines(root, reference, taskPaths) {
51
+ if (!/^[A-Za-z0-9._/-]+$/u.test(reference) || reference.startsWith('-'))
52
+ throw new Error('invalid Sonar reference branch');
53
+ const [diff, untracked] = await Promise.all([
54
+ run('git', ['-c', 'core.quotepath=false', 'diff', '--no-ext-diff', '--no-color', '--unified=0', reference, '--'], { cwd: root, maxBuffer: 20 * 1024 * 1024 }),
55
+ run('git', ['ls-files', '--others', '--exclude-standard', '-z'], { cwd: root, maxBuffer: 5 * 1024 * 1024 }),
56
+ ]);
57
+ const files = new Map();
58
+ let current;
59
+ let newFile = false;
60
+ for (const line of diff.stdout.split(/\r?\n/u)) {
61
+ if (line.startsWith('--- /dev/null'))
62
+ newFile = true;
63
+ else if (line.startsWith('--- a/'))
64
+ newFile = false;
65
+ else if (line.startsWith('+++ b/')) {
66
+ current = line.slice(6).trim();
67
+ if (current && isAuditSource(current))
68
+ files.set(current, files.get(current) ?? { path: current, lines: new Set(), newFile });
69
+ else
70
+ current = undefined;
71
+ }
72
+ else if (line.startsWith('+++ /dev/null'))
73
+ current = undefined;
74
+ else if (current && line.startsWith('@@ ')) {
75
+ const hunk = /^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/u.exec(line);
76
+ if (!hunk)
77
+ throw new Error(`cannot parse Git diff hunk for ${current}`);
78
+ const first = Number(hunk[1]);
79
+ const count = hunk[2] === undefined ? 1 : Number(hunk[2]);
80
+ for (let n = first; n < first + count; n++)
81
+ files.get(current).lines.add(n);
82
+ }
83
+ }
84
+ for (const path of untracked.stdout.split('\0').filter(Boolean)) {
85
+ if (!isAuditSource(path))
86
+ continue;
87
+ const absolute = resolve(root, path);
88
+ if (relative(resolve(root), absolute).startsWith('..'))
89
+ throw new Error('untracked path escaped the project root');
90
+ const lines = readFileSync(absolute, 'utf8').split(/\r?\n/u).length;
91
+ files.set(path, { path, lines: new Set(Array.from({ length: lines }, (_, index) => index + 1)), newFile: true });
92
+ }
93
+ const scoped = taskPaths === undefined ? undefined : new Set(taskPaths.map(path => path.replaceAll('\\', '/')
94
+ .replace(/^\.\//u, '').toLowerCase()));
95
+ return [...files.values()].filter(file => file.lines.size
96
+ && (scoped === undefined || scoped.has(file.path.replaceAll('\\', '/').toLowerCase())));
97
+ }
98
+ /** The engine can be installed independently; environment paths point to its Java runtime and SonarLint JARs. */
99
+ function enginePaths() {
100
+ const java = process.env.DSH_SONARLINT_JAVA;
101
+ const lib = process.env.DSH_SONARLINT_LIB;
102
+ const plugins = process.env.DSH_SONARLINT_PLUGINS?.split(sep === '\\' ? ';' : ':').filter(Boolean) ?? [];
103
+ if (!java || !lib || !plugins.length || !existsSync(java) || !existsSync(lib) || plugins.some(path => !existsSync(path))) {
104
+ throw new Error('本地 Sonar 审核需要 DSH_SONARLINT_JAVA、DSH_SONARLINT_LIB 和 DSH_SONARLINT_PLUGINS;请先安装 SonarLint 后台组件并配置路径');
105
+ }
106
+ return { java, lib, plugins };
107
+ }
108
+ /** Analyze only changed supported files with the project's synchronized Quality Profile. */
109
+ export async function inspectLocalRules(policy, token, root, scopeHash, signal, taskPaths) {
110
+ if (!token)
111
+ throw new Error('本地规则审核需要当前项目 SonarQube Token');
112
+ if (!policy.reference_branch)
113
+ throw new Error('本地规则审核需要新代码参考分支');
114
+ const changes = (await changedLines(root, policy.reference_branch, taskPaths))
115
+ .filter(file => isIncludedAuditPath(file.path, policy.include_paths));
116
+ const unsupported = changes.filter(file => !localLanguage(file.path));
117
+ const profilesUrl = new URL(`${policy.host_url.replace(/\/$/u, '')}/api/qualityprofiles/search`);
118
+ profilesUrl.searchParams.set('project', policy.project_key);
119
+ const profilesResponse = await fetch(profilesUrl, { headers: { Authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(15_000) });
120
+ if (!profilesResponse.ok)
121
+ throw new Error(`SonarQube 项目规则配置查询失败(HTTP ${profilesResponse.status})`);
122
+ const profileData = await profilesResponse.json();
123
+ if (!Array.isArray(profileData.profiles))
124
+ throw new Error('SonarQube 未返回项目规则配置');
125
+ const uncovered = uncoveredLocalFiles(unsupported.map(file => file.path), profileData.profiles);
126
+ const branchUrl = new URL(`${policy.host_url.replace(/\/$/u, '')}/api/project_branches/list`);
127
+ branchUrl.searchParams.set('project', policy.project_key);
128
+ const branchResponse = await fetch(branchUrl, { headers: { Authorization: `Bearer ${token}` }, signal: AbortSignal.timeout(15_000) });
129
+ if (!branchResponse.ok)
130
+ throw new Error(`SonarQube 项目分支查询失败(HTTP ${branchResponse.status})`);
131
+ const branchData = await branchResponse.json();
132
+ const serverMain = branchData.branches?.find(branch => branch.isMain === true)?.name;
133
+ if (!serverMain)
134
+ throw new Error('SonarQube 未返回项目主分支,无法同步本地规则');
135
+ const paths = enginePaths();
136
+ const supported = changes.filter(change => localLanguage(change.path));
137
+ const files = supported.map(change => {
138
+ const absolute = resolve(root, change.path);
139
+ if (relative(resolve(root), absolute).startsWith('..'))
140
+ throw new Error('changed path escaped the project root');
141
+ return { uri: pathToFileURL(absolute).href, ideRelativePath: change.path.replaceAll('\\', '/'),
142
+ configScopeId: 'project', isTest: /(^|[\\/])test[\\/]/iu.test(change.path), charset: 'UTF-8',
143
+ fsPath: absolute, content: readFileSync(absolute, 'utf8'), detectedLanguage: localLanguage(change.path), isUserDefined: true };
144
+ });
145
+ const fileLines = new Map(supported.map((change, index) => [files[index].uri, change.lines]));
146
+ const newFiles = new Set(files.filter((_, index) => supported[index]?.newFile).map(file => file.uri));
147
+ const cacheKey = `${resolve(root).toLowerCase()}\0${policy.host_url}\0${policy.project_key}`;
148
+ const stateDir = join(homedir(), '.dsh', 'sonarlint-cache', createHash('sha256').update(cacheKey).digest('hex').slice(0, 24));
149
+ mkdirSync(stateDir, { recursive: true });
150
+ const workDir = mkdtempSync(join(tmpdir(), 'dsh-sonarlint-'));
151
+ const child = spawn(paths.java, ['-cp', join(paths.lib, '*'),
152
+ 'org.sonarsource.sonarlint.core.backend.cli.SonarLintServerCli'], { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true });
153
+ let buffer = Buffer.alloc(0);
154
+ let id = 1;
155
+ let settled = false;
156
+ const pending = new Map();
157
+ const messages = [];
158
+ let ready = () => { };
159
+ const readiness = new Promise(resolveReady => { ready = resolveReady; });
160
+ let rejectExit = () => { };
161
+ const exited = new Promise((_, reject) => { rejectExit = reject; });
162
+ void exited.catch(() => { });
163
+ const write = (message) => {
164
+ const payload = Buffer.from(JSON.stringify(message));
165
+ child.stdin.write(`Content-Length: ${payload.length}\r\n\r\n`);
166
+ child.stdin.write(payload);
167
+ };
168
+ const request = (method, params, timeout = 120_000) => {
169
+ const current = id++;
170
+ return new Promise((accept, reject) => {
171
+ const timer = setTimeout(() => { pending.delete(current); reject(new Error(`${method} timed out`)); }, timeout);
172
+ pending.set(current, { resolve: accept, reject, timer });
173
+ write({ jsonrpc: '2.0', id: current, method, params });
174
+ });
175
+ };
176
+ const notify = (method, params) => write({ jsonrpc: '2.0', method, params });
177
+ child.stderr.on('data', chunk => {
178
+ const line = String(chunk).replaceAll(token, '[redacted]').slice(0, 500);
179
+ if (messages.length < 8)
180
+ messages.push(line);
181
+ });
182
+ child.stdout.on('data', chunk => {
183
+ buffer = Buffer.concat([buffer, chunk]);
184
+ while (true) {
185
+ const split = buffer.indexOf('\r\n\r\n');
186
+ if (split < 0)
187
+ break;
188
+ const length = Number(/Content-Length:\s*(\d+)/iu.exec(buffer.subarray(0, split).toString())?.[1]);
189
+ if (!Number.isFinite(length) || buffer.length < split + 4 + length)
190
+ break;
191
+ const message = JSON.parse(buffer.subarray(split + 4, split + 4 + length).toString());
192
+ buffer = buffer.subarray(split + 4 + length);
193
+ if (message.id !== undefined && message.method === undefined) {
194
+ const task = pending.get(message.id);
195
+ pending.delete(message.id);
196
+ if (task) {
197
+ clearTimeout(task.timer);
198
+ if (message.error)
199
+ task.reject(new Error(message.error.message ?? 'SonarLint RPC failed'));
200
+ else
201
+ task.resolve(message.result);
202
+ }
203
+ }
204
+ else {
205
+ if (message.method === 'didChangeAnalysisReadiness' && message.params?.areReadyForAnalysis === true)
206
+ ready();
207
+ if (message.method === 'log' && ['ERROR', 'WARN'].includes(message.params?.level) && messages.length < 8) {
208
+ messages.push(String(message.params?.message ?? '').replaceAll(token, '[redacted]').slice(0, 500));
209
+ }
210
+ if (message.id !== undefined) {
211
+ const result = message.method === 'getBaseDir' ? { baseDir: root }
212
+ : message.method === 'getInferredAnalysisProperties' ? { properties: {} }
213
+ : message.method === 'getFileExclusions' ? { fileExclusionPatterns: [] }
214
+ : message.method === 'listFiles' ? { files }
215
+ : message.method === 'getCredentials' ? { credentials: { token } }
216
+ : message.method === 'selectProxies' ? { proxies: [] }
217
+ : message.method === 'checkServerTrusted' ? { trusted: false }
218
+ : message.method === 'matchSonarProjectBranch' ? { branchName: serverMain } : null;
219
+ write({ jsonrpc: '2.0', id: message.id, result });
220
+ }
221
+ }
222
+ }
223
+ });
224
+ const failChild = (error) => {
225
+ if (!settled) {
226
+ rejectExit(error);
227
+ for (const task of pending.values()) {
228
+ clearTimeout(task.timer);
229
+ task.reject(error);
230
+ }
231
+ }
232
+ };
233
+ child.on('error', error => failChild(new Error(`SonarLint could not start: ${error.message}`)));
234
+ child.stdin.on('error', error => failChild(new Error(`SonarLint input failed: ${error.message}`)));
235
+ child.on('exit', code => failChild(new Error(`SonarLint exited ${code}: ${messages.join('; ')}`)));
236
+ const onAbort = () => child.kill();
237
+ signal?.addEventListener('abort', onAbort, { once: true });
238
+ try {
239
+ await request('initialize', {
240
+ clientConstantInfo: { name: 'DSH', userAgent: 'dsh-task-engine' },
241
+ telemetryConstantAttributes: { productKey: 'dsh', productName: 'DSH', productVersion: '0', ideVersion: '0', additionalAttributes: {} },
242
+ httpConfiguration: { sslConfiguration: {} }, backendCapabilities: ['FULL_SYNCHRONIZATION'],
243
+ storageRoot: stateDir, workDir, embeddedPluginPaths: paths.plugins, connectedModeEmbeddedPluginPathsByKey: {},
244
+ enabledLanguagesInStandaloneMode: ['JAVA'], extraEnabledLanguagesInConnectedMode: ['JS', 'TS', 'CSS', 'HTML', 'XML'], disabledPluginKeysForAnalysis: [],
245
+ sonarQubeConnections: [{ connectionId: 'project', serverUrl: policy.host_url, disableNotifications: true }], sonarCloudConnections: [],
246
+ standaloneRuleConfigByKey: {}, isFocusOnNewCode: false, automaticAnalysisEnabled: false,
247
+ languageSpecificRequirements: { omnisharpDownloadEnabled: false }, logLevel: 'WARN',
248
+ }, 30_000);
249
+ notify('configuration/didAddConfigurationScopes', { addedScopes: [{ id: 'project', bindable: true, name: 'Project',
250
+ binding: { connectionId: 'project', sonarProjectKey: policy.project_key, bindingSuggestionDisabled: true } }] });
251
+ let readyTimer;
252
+ try {
253
+ await Promise.race([readiness, exited, new Promise((_, reject) => {
254
+ readyTimer = setTimeout(() => reject(new Error(`SonarLint 项目规则同步超时:${messages.join('; ')}`)), 120_000);
255
+ })]);
256
+ }
257
+ finally {
258
+ if (readyTimer)
259
+ clearTimeout(readyTimer);
260
+ }
261
+ if (files.length) {
262
+ notify('file/didUpdateFileSystem', { addedFiles: files, changedFiles: [], removedFiles: [] });
263
+ const status = await request('file/getFilesStatus', { fileUrisByConfigScopeId: { project: files.map(file => file.uri) } });
264
+ const excluded = files.filter(file => status.fileStatuses?.[file.uri]?.excluded);
265
+ if (excluded.length)
266
+ throw new Error(`SonarLint 排除了新增代码:${excluded.map(file => file.ideRelativePath).join(', ')}`);
267
+ }
268
+ const response = files.length ? await request('analysis/analyzeFilesAndTrack', {
269
+ configurationScopeId: 'project', analysisId: randomUUID(), filesToAnalyze: files.map(file => file.uri),
270
+ extraProperties: {}, shouldFetchServerIssues: false,
271
+ }) : { rawIssues: [], failedAnalysisFiles: [] };
272
+ if (response.failedAnalysisFiles?.length)
273
+ throw new Error(`SonarLint 无法分析:${response.failedAnalysisFiles.join(', ')}`);
274
+ const rawFindings = (response.rawIssues ?? []).flatMap((issue) => {
275
+ const uri = issue.fileUri ?? issue.uri ?? files[0]?.uri;
276
+ const line = issue.textRange?.startLine ?? issue.primaryLocation?.textRange?.startLine;
277
+ if (typeof uri !== 'string' || (typeof line !== 'number' && !newFiles.has(uri))
278
+ || (typeof line === 'number' && !fileLines.get(uri)?.has(line)))
279
+ return [];
280
+ const path = files.find(file => file.uri === uri)?.ideRelativePath ?? uri;
281
+ const identity = `${path}\0${line ?? 'file'}\0${issue.ruleKey}\0${issue.primaryMessage}`;
282
+ return [{ key: `local-${createHash('sha256').update(identity).digest('hex').slice(0, 20)}`,
283
+ rule: String(issue.ruleKey ?? ''), message: String(issue.primaryMessage ?? ''),
284
+ severity: String(issue.severity ?? 'UNKNOWN'), file: path,
285
+ ...(typeof line === 'number' ? { line } : {}) }];
286
+ });
287
+ const findings = [...new Map(rawFindings.map(finding => [finding.key, finding])).values()];
288
+ const blocking = findings.filter(isBlockingFinding);
289
+ return { ce_task_id: 'local', analysis_id: randomUUID(), gate: blocking.length || uncovered.length ? 'ERROR' : 'OK',
290
+ checked_at: new Date().toISOString(), scope_hash: scopeHash, findings, blocking,
291
+ ...(uncovered.length ? { uncovered_files: uncovered } : {}),
292
+ target: policy.reference_branch, scanned_files: supported.map(file => file.path) };
293
+ }
294
+ finally {
295
+ settled = true;
296
+ signal?.removeEventListener('abort', onAbort);
297
+ child.stdin.end();
298
+ setTimeout(() => child.kill(), 2000).unref();
299
+ const resolvedWorkDir = resolve(workDir);
300
+ const relativeWorkDir = relative(resolve(tmpdir()), resolvedWorkDir);
301
+ if (relativeWorkDir && relativeWorkDir !== '..' && !relativeWorkDir.startsWith(`..${sep}`)
302
+ && !relativeWorkDir.startsWith(sep) && relativeWorkDir.startsWith('dsh-sonarlint-')) {
303
+ rmSync(resolvedWorkDir, { recursive: true, force: true });
304
+ }
305
+ }
306
+ }
307
+ //# sourceMappingURL=sonarlint-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonarlint-local.js","sourceRoot":"","sources":["../src/sonarlint-local.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@godv61/dsh-task-engine",
3
- "version": "0.29.2",
3
+ "version": "0.29.8",
4
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.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -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,19 +74,19 @@
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"
79
81
  },
80
- "peerDependencies": {
81
- "@deepseek-ai/cordis": "^4.0.2",
82
+ "peerDependencies": {
83
+ "@deepseek-ai/cordis": "^4.0.2",
82
84
  "@deepseek-ai/dsh-llm": "^0.1.2-rc.1 || ^0.1.3-alpha.1 || ^0.1.6-alpha.2 || ^0.1.7-alpha.1 || ^0.2.0-rc.2",
83
85
  "@deepseek-ai/dsh-tools": "^0.1.2-rc.1 || ^0.1.3-alpha.1 || ^0.1.6-alpha.2 || ^0.1.7-alpha.1 || ^0.2.0-rc.2",
84
86
  "@deepseek-ai/dsh-typert-protocol": "^0.1.2-rc.1 || ^0.1.3-alpha.1 || ^0.1.6-alpha.2 || ^0.1.7-alpha.1 || ^0.2.0-rc.2"
85
87
  },
86
- "devDependencies": {
87
- "@deepseek-ai/cordis": "^4.0.4",
88
+ "devDependencies": {
89
+ "@deepseek-ai/cordis": "^4.0.4",
88
90
  "@deepseek-ai/dsh-agent-default-model": "^0.2.0-rc.2",
89
91
  "@deepseek-ai/dsh-fs": "^0.2.0-rc.2",
90
92
  "@deepseek-ai/dsh-llm": "^0.2.0-rc.2",
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,15 @@ 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()))
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
48
  check('no bundled business rules ship', !listing.some(line => line.startsWith('rules/')))
49
49
 
50
50
  // 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']) {
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']) {
52
52
  check(`tarball contains ${required}`, listing.includes(required))
53
53
  }
54
54
  check('tarball excludes src sources', !listing.some(line => line.startsWith('src/')))
@@ -118,7 +118,7 @@ try {
118
118
  // Resource package behavior from the installed artifact, including the commit
119
119
  // hook running for real inside throwaway repositories.
120
120
  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' })
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' })
122
122
  check('in-package resource, workflow and hook behavior', /# fail 0/u.test(out))
123
123
  } catch (error) { check('in-package resource, workflow and hook behavior', false, String(error.stderr ?? error)) }
124
124
 
@@ -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
+ 交接给任务编排:可按先后顺序实施的结构、受影响范围、必须保持的接口契约。迁移或回退演练只在任务实际涉及相应风险时提出。
@@ -1,11 +1,11 @@
1
- ---
2
- name: code-development
3
- description: 按验收条件和有序任务清单实现代码,并遵守绑定的项目规则。
4
- whenToUse: 自适应任务进入代码开发元技能时。
5
- ---
6
-
7
- # 代码开发元技能
8
-
9
- 先读取当前阶段绑定的项目地图、领域编码技能和规则。按任务先后顺序修改代码,遵守已有接口和技术栈约束。每个实施项完成时记录结果及对应审核;不要为了分发给多个开发者而拆项。发现需求或方案发生变化时使用 `revise` 回到相应阶段。
10
-
11
- 交接给测试:变更文件、实现要点、验收场景及已知限制。SonarQube 若启用,在代码审核阶段运行,不在每次编辑时触发。
1
+ ---
2
+ name: code-development
3
+ description: 按验收条件和有序任务清单实现代码,并遵守绑定的项目规则。
4
+ whenToUse: 自适应任务进入代码开发元技能时。
5
+ ---
6
+
7
+ # 代码开发元技能
8
+
9
+ 先读取当前阶段绑定的项目地图、领域编码技能和规则。按任务先后顺序修改代码,遵守已有接口和技术栈约束。每个实施项完成时记录结果及对应审核;不要为了分发给多个开发者而拆项。发现需求或方案发生变化时使用 `revise` 回到相应阶段。
10
+
11
+ 交接给测试:变更文件、实现要点、验收场景及已知限制。SonarQube 若启用,在代码审核阶段运行,不在每次编辑时触发。
@@ -1,11 +1,11 @@
1
- ---
2
- name: code-review
3
- description: 审核需求符合性、代码质量与可选的 SonarQube 结果,推动失败项修复。
4
- whenToUse: 自适应任务进入代码审核元技能时。
5
- ---
6
-
7
- # 代码审核元技能
8
-
9
- 对照需求、任务产物、变更和测试回执审核。项目若启用 SonarQube,在本阶段读取本次分支或合并请求的新代码分析与质量门禁结果;有阻断问题时记录、修复、重新测试和复审,不能只填一个通过结论。使用 `dev_task review` 记录结果。
10
-
11
- 对可复用的失败案例提出项目 Rule 候选,包含触发场景、错误与正确示例、对应 Sonar 规则;经审阅后挂到相应代码开发 Skill。不要把单次误报或整个 Quality Profile 原样写成规则。
1
+ ---
2
+ name: code-review
3
+ description: 审核需求符合性、代码质量与可选的 SonarQube 结果,推动失败项修复。
4
+ whenToUse: 自适应任务进入代码审核元技能时。
5
+ ---
6
+
7
+ # 代码审核元技能
8
+
9
+ 对照需求、任务产物、变更和测试回执审核。项目若启用 SonarQube,在本阶段读取本次分支或合并请求的新代码分析与质量门禁结果;有阻断问题时记录、修复、重新测试和复审,不能只填一个通过结论。使用 `dev_task review` 记录结果。
10
+
11
+ 对可复用的失败案例提出项目 Rule 候选,包含触发场景、错误与正确示例、对应 Sonar 规则;经审阅后挂到相应代码开发 Skill。不要把单次误报或整个 Quality Profile 原样写成规则。
@@ -6,13 +6,15 @@ whenToUse: 在启用工程化交付会话预设后,开始或继续开发任务
6
6
 
7
7
  # 工程任务编排
8
8
 
9
- 新需求先按改动范围、实现依赖和架构影响选择 `low`、`medium`、`high` 或 `ultra`,调用 `dev_task assess` 查看相应阶段与有效技能来源。创建时提供 `complexity` 和具体的 `complexity_reason`。低档为局部明确修改;中档先形成需求与验收;高档增加按实现先后顺序的任务编排;超高档适用于完整新模块或大范围重构,增加架构设计。风险等级独立选择。没有 `complexity` 的旧调用继续使用 `.dsh/eng.json`。
10
-
11
- 自适应任务的当前元技能及附加技能都以 `status.bindings` 为准,用 `dev_task load_skill` 和准确的 `source:name` 加载;项目同名 Skill 覆盖用户与内置 Skill,Rule 由生效 Skill 自身的 `profile.json` 持有。当前任务的流程在创建时冻结,其他会话的任务可选择不同档次。
9
+ 首次为项目执行 `init_project` 时,`<项目名>-project-map` 必须概述整个仓库的模块职责、依赖与通用代码入口,可被后续不同需求复用。当前需求的具体页面、接口调用链和验收条件写入任务产物;若确需长期保存领域地图,另建明确命名的领域 Skill,不把它们塞进项目总地图。`inspect` 只提供目录和清单证据,`propose/apply` 的正文由模型拟定,应用前逐项检查范围。
10
+
11
+ 新需求先按改动范围、实现依赖和架构影响选择 `low`、`medium`、`high` 或 `ultra`,调用 `dev_task assess` 查看相应阶段与有效技能来源。创建时提供 `complexity` 和具体的 `complexity_reason`。低档为局部明确修改;中档先形成需求与验收;高档增加按实现先后顺序的任务编排;超高档适用于完整新模块或大范围重构,增加架构设计。风险等级独立选择。没有 `complexity` 的旧调用继续使用 `.dsh/eng.json`。
12
+
13
+ 自适应任务的当前元技能及附加技能都以 `status.bindings` 为准,用 `dev_task load_skill` 和准确的 `source:name` 加载;项目同名 Skill 覆盖用户与内置 Skill,Rule 由生效 Skill 自身的 `profile.json` 持有。当前任务的流程在创建时冻结,其他会话的任务可选择不同档次。
12
14
 
13
15
  `dev_task` 是任务状态、阶段流转与门禁的唯一事实来源。流程预设决定阶段图与守卫;项目配置决定阶段使用哪些技能、每个技能遵守哪些规则,以及产物字段和提交文本。没有绑定时仅执行状态机,不自行补充技能或规则。
14
16
 
15
- 1. 先调用 `dev_task`(operation=status)查找当前工作区和分支的任务;有多个候选时让使用者明确目标。没有任务时评估复杂度,调用 `assess`,然后按实际需求调用 `create`;已有任务从返回的 `stage` 继续。
17
+ 1. 先调用 `dev_task`(operation=status)查找当前工作区和分支的任务;有多个候选时让使用者明确目标。没有任务时评估复杂度,调用 `assess`,然后按实际需求调用 `create`;已有任务从返回的 `stage` 继续。
16
18
  2. 读取 `status.bindings`、`skill_obligations`、`artifact_requirements`、`legal_next` 和 `commit`。只加载当前及即将进入的终态实际绑定的技能,遵守本次交互读取的最新规则正文;没有绑定时不自行补上技能或规则。
17
19
  3. 技能要求的证据以其配置和 `status.skill_obligations` 为准:仅对 `command_receipts_required` 列出的技能通过带真实命令的 `skill_result` 记录;`manual` 通过人工审批记录;`artifact`、`review` 与 `none` 按对应阶段操作或无需额外回执处理。不要把所有技能都当成命令型技能。技能加载成功不等于要求的证据已经完成。
18
20
  4. 需要记录产物时,只使用 `artifact_requirements` 给出的 id 与字段。按当前流程要求完成确认、实施项、验证和审核,再调用 `advance`;被拒绝时按返回的阻塞原因修正,不改任务文件绕过门禁。
@@ -1,11 +1,11 @@
1
- ---
2
- name: requirements-analysis
3
- description: 澄清需求目标、边界和可验收结果,形成后续设计与开发的输入。
4
- whenToUse: 自适应任务进入需求分析元技能时。
5
- ---
6
-
7
- # 需求分析元技能
8
-
9
- 读取用户需求与项目现状,区分已确认事实、推断和待澄清问题。给出目标、范围、非目标及可验证的验收条件。只对影响实现的缺口提问;能够依据现有上下文确定的内容直接写明依据。使用 `dev_task record` 写入当前阶段 `requirement` 产物,其字段以任务快照为准。
10
-
11
- 交接给下一元技能:明确的验收条件、受影响的业务路径和仍未解决的约束。不要把实现步骤伪装成需求。
1
+ ---
2
+ name: requirements-analysis
3
+ description: 澄清需求目标、边界和可验收结果,形成后续设计与开发的输入。
4
+ whenToUse: 自适应任务进入需求分析元技能时。
5
+ ---
6
+
7
+ # 需求分析元技能
8
+
9
+ 读取用户需求与项目现状,区分已确认事实、推断和待澄清问题。给出目标、范围、非目标及可验证的验收条件。只对影响实现的缺口提问;能够依据现有上下文确定的内容直接写明依据。使用 `dev_task record` 写入当前阶段 `requirement` 产物,其字段以任务快照为准。
10
+
11
+ 交接给下一元技能:明确的验收条件、受影响的业务路径和仍未解决的约束。不要把实现步骤伪装成需求。