@fantasticit/sumi 0.8.0 → 0.9.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 (81) hide show
  1. package/README.md +18 -18
  2. package/dist/adapters.d.ts +1 -0
  3. package/dist/adapters.js +13 -2
  4. package/dist/adapters.js.map +1 -1
  5. package/dist/trace.d.ts +16 -0
  6. package/dist/trace.js +30 -0
  7. package/dist/trace.js.map +1 -0
  8. package/dist/visualize-page.d.ts +1 -1
  9. package/dist/visualize-page.js +2 -2
  10. package/dist/visualize.js +52 -8
  11. package/dist/visualize.js.map +1 -1
  12. package/node_modules/@sumi/create/dist/bin.d.ts +2 -0
  13. package/node_modules/@sumi/create/dist/bin.js +52 -0
  14. package/node_modules/@sumi/create/dist/bin.js.map +1 -0
  15. package/node_modules/@sumi/create/package.json +1 -1
  16. package/node_modules/@sumi/create/template/control/flows/check.flow.yaml +16 -0
  17. package/node_modules/@sumi/create/template/control/rubrics/behavior.yaml +17 -0
  18. package/node_modules/@sumi/create/template/control/rubrics/omission.yaml +13 -0
  19. package/node_modules/@sumi/kernel/package.json +2 -2
  20. package/node_modules/@sumi/plugin-sdk/README.md +1 -1
  21. package/node_modules/@sumi/plugin-sdk/dist/protocol.d.ts +2 -0
  22. package/node_modules/@sumi/plugin-sdk/dist/protocol.js.map +1 -1
  23. package/node_modules/@sumi/plugin-sdk/dist/trace.d.ts +1 -1
  24. package/node_modules/@sumi/plugin-sdk/dist/trace.js +15 -5
  25. package/node_modules/@sumi/plugin-sdk/dist/trace.js.map +1 -1
  26. package/node_modules/@sumi/plugin-sdk/dist/validate.js +2 -1
  27. package/node_modules/@sumi/plugin-sdk/dist/validate.js.map +1 -1
  28. package/node_modules/@sumi/plugin-sdk/package.json +1 -1
  29. package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js +107 -15
  30. package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js.map +1 -1
  31. package/node_modules/@sumi/plugins-core/dist/tool-batches.d.ts +11 -0
  32. package/node_modules/@sumi/plugins-core/dist/tool-batches.js +41 -0
  33. package/node_modules/@sumi/plugins-core/dist/tool-batches.js.map +1 -0
  34. package/node_modules/@sumi/plugins-core/package.json +2 -2
  35. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js +1 -0
  36. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js.map +1 -1
  37. package/node_modules/@sumi/plugins-governance/dist/hooks.d.ts +2 -0
  38. package/node_modules/@sumi/plugins-governance/dist/hooks.js +4 -0
  39. package/node_modules/@sumi/plugins-governance/dist/hooks.js.map +1 -0
  40. package/node_modules/@sumi/plugins-governance/dist/pr-report-sections.js +3 -1
  41. package/node_modules/@sumi/plugins-governance/dist/pr-report-sections.js.map +1 -1
  42. package/node_modules/@sumi/plugins-governance/package.json +2 -2
  43. package/node_modules/@sumi/plugins-openspec/package.json +4 -4
  44. package/node_modules/@sumi/plugins-precedent/package.json +3 -3
  45. package/node_modules/@sumi/plugins-review/README.md +18 -11
  46. package/node_modules/@sumi/plugins-review/dist/commands/host-model-hook.js +4 -1
  47. package/node_modules/@sumi/plugins-review/dist/commands/host-model-hook.js.map +1 -1
  48. package/node_modules/@sumi/plugins-review/dist/commands/model-recheck.js +25 -10
  49. package/node_modules/@sumi/plugins-review/dist/commands/model-recheck.js.map +1 -1
  50. package/node_modules/@sumi/plugins-review/dist/commands/submit.js +8 -1
  51. package/node_modules/@sumi/plugins-review/dist/commands/submit.js.map +1 -1
  52. package/node_modules/@sumi/plugins-review/dist/model-execution.d.ts +2 -1
  53. package/node_modules/@sumi/plugins-review/dist/model-execution.js +49 -18
  54. package/node_modules/@sumi/plugins-review/dist/model-execution.js.map +1 -1
  55. package/node_modules/@sumi/plugins-review/dist/model-independence.d.ts +2 -1
  56. package/node_modules/@sumi/plugins-review/dist/model-independence.js +13 -4
  57. package/node_modules/@sumi/plugins-review/dist/model-independence.js.map +1 -1
  58. package/node_modules/@sumi/plugins-review/dist/plugins/independent-recheck.js +33 -13
  59. package/node_modules/@sumi/plugins-review/dist/plugins/independent-recheck.js.map +1 -1
  60. package/node_modules/@sumi/plugins-review/dist/plugins/rubric.js +80 -6
  61. package/node_modules/@sumi/plugins-review/dist/plugins/rubric.js.map +1 -1
  62. package/node_modules/@sumi/plugins-review/dist/plugins/validation.d.ts +1 -0
  63. package/node_modules/@sumi/plugins-review/dist/plugins/validation.js +35 -0
  64. package/node_modules/@sumi/plugins-review/dist/plugins/validation.js.map +1 -0
  65. package/node_modules/@sumi/plugins-review/dist/recheck.d.ts +9 -5
  66. package/node_modules/@sumi/plugins-review/dist/recheck.js +30 -6
  67. package/node_modules/@sumi/plugins-review/dist/recheck.js.map +1 -1
  68. package/node_modules/@sumi/plugins-review/dist/review-evidence.d.ts +3 -0
  69. package/node_modules/@sumi/plugins-review/dist/review-evidence.js +58 -0
  70. package/node_modules/@sumi/plugins-review/dist/review-evidence.js.map +1 -0
  71. package/node_modules/@sumi/plugins-review/dist/review.d.ts +51 -1
  72. package/node_modules/@sumi/plugins-review/dist/review.js +142 -7
  73. package/node_modules/@sumi/plugins-review/dist/review.js.map +1 -1
  74. package/node_modules/@sumi/plugins-review/dist/submission.js +41 -3
  75. package/node_modules/@sumi/plugins-review/dist/submission.js.map +1 -1
  76. package/node_modules/@sumi/plugins-review/dist/validation-receipt.d.ts +8 -0
  77. package/node_modules/@sumi/plugins-review/dist/validation-receipt.js +110 -0
  78. package/node_modules/@sumi/plugins-review/dist/validation-receipt.js.map +1 -0
  79. package/node_modules/@sumi/plugins-review/package.json +4 -4
  80. package/node_modules/@sumi/plugins-review/sumi-plugins.yaml +7 -1
  81. package/package.json +10 -10
@@ -1,8 +1,9 @@
1
1
  import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
- import { join } from 'node:path';
2
+ import { dirname, join } from 'node:path';
3
3
  import { digestOfBlobs, fileBlobs, isReviewResult, loadRubric, requestKey, ticketsDir, validateReviewResult, writeAccepted, writeCoverage, impactRequestItems, } from './review.js';
4
4
  import { impactScope } from '@sumi/plugins-precedent';
5
5
  import { readImpact } from '@sumi/plugins-precedent';
6
+ import { loadPriorReview, loadValidation } from './review-evidence.js';
6
7
  function readObject(path, what) {
7
8
  let value;
8
9
  try {
@@ -38,6 +39,23 @@ export function prepareSubmission(root, runId, stepId, ticketId, requireResultFi
38
39
  throw new Error('评审请求的键与 ticket 不一致,请求可能被改写,请重新运行流程');
39
40
  if (requestKey(request) !== request.key)
40
41
  throw new Error('评审请求键与请求内容不符(条目范围或摘要被改写),请重新运行流程');
42
+ if (!ticket.stepId.split('/').every((part) => /^[a-zA-Z0-9_-]+$/.test(part)))
43
+ throw new Error('步骤 ID 无效');
44
+ let runDir = dirname(ticket.requestPath);
45
+ for (const _ of ticket.stepId.split('/'))
46
+ runDir = dirname(runDir);
47
+ if (request.validation) {
48
+ if (!request.validationStep)
49
+ throw new Error('关键验证来源步骤缺失');
50
+ const current = loadValidation(runDir, request.validationStep);
51
+ if (JSON.stringify(current) !== JSON.stringify(request.validation))
52
+ throw new Error('关键验证回执已变化,请重新运行评审');
53
+ }
54
+ if (request.priorReview) {
55
+ const current = loadPriorReview(root, runDir, request.priorReview.stepId);
56
+ if (JSON.stringify(current) !== JSON.stringify(request.priorReview))
57
+ throw new Error('首轮评审结果已变化,请重新运行漏检审查');
58
+ }
41
59
  if (request.impact) {
42
60
  const currentScope = impactScope(root, request.base, request.impact.scope.files.map((f) => f.path));
43
61
  const current = currentScope ? readImpact(root, currentScope) : null;
@@ -65,12 +83,32 @@ export function acceptSubmission(prepared, value) {
65
83
  if (!isReviewResult(value))
66
84
  throw new Error('结果格式不合法:verdicts 每一项都须是含字符串 item、verdict 为 pass 或 fail 的对象');
67
85
  writeAccepted(root, request.key, value);
68
- if (!request.impact)
86
+ if (!request.impact) {
87
+ let runDir = dirname(ticket.requestPath);
88
+ for (const _ of ticket.stepId.split('/'))
89
+ runDir = dirname(runDir);
90
+ const testScopes = {};
91
+ for (const entry of request.validation ?? []) {
92
+ if (entry.step !== 'core/test-affected')
93
+ continue;
94
+ try {
95
+ testScopes[entry.step] = readFileSync(join(runDir, entry.step, 'execution-scope.json'), 'utf8');
96
+ }
97
+ catch {
98
+ /* 缺少证据时覆盖查找不会复用。 */
99
+ }
100
+ }
69
101
  writeCoverage(root, request.key, {
70
102
  rubricDigest: request.rubricDigest,
71
- items: request.items.map((i) => ({ id: i.id, files: i.files })),
103
+ items: request.items.map((i) => ({ id: i.id, files: i.files, ...(i.areas ? { areas: i.areas } : {}) })),
72
104
  blobs: Object.fromEntries(blobs),
105
+ ...(request.requireEvidence ? { requireEvidence: true } : {}),
106
+ ...(request.validationStep ? { validationStep: request.validationStep } : {}),
107
+ ...(request.validation ? { validation: request.validation } : {}),
108
+ ...(Object.keys(testScopes).length ? { testScopes } : {}),
109
+ ...(request.priorReview ? { priorReview: request.priorReview } : {}),
73
110
  });
111
+ }
74
112
  writeFileSync(ticketPath, JSON.stringify({ ...ticket, used: true }, null, 2));
75
113
  return value;
76
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"submission.js","sourceRoot":"","sources":["../src/submission.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submission.js","sourceRoot":"","sources":["../src/submission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface StepValidation {
2
+ state: string;
3
+ summary: string;
4
+ executionDigest?: string;
5
+ sourceDigest?: string;
6
+ }
7
+ /** 从同一次运行的步骤回执和实际证据重建验证状态;派发和提交共用。 */
8
+ export declare function stepValidation(runDir: string, step: string): StepValidation;
@@ -0,0 +1,110 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { lstatSync, readdirSync, readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ const digest = (value) => createHash('sha256').update(value).digest('hex');
5
+ function evidenceDigest(runDir, step, name) {
6
+ try {
7
+ const output = readFileSync(join(runDir, step, name));
8
+ return digest(output);
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ function testScopeDigest(runDir, step) {
15
+ try {
16
+ const scope = readFileSync(join(runDir, step, 'execution-scope.json'), 'utf8');
17
+ const rows = JSON.parse(scope);
18
+ if (!Array.isArray(rows) ||
19
+ !rows.every((row) => row &&
20
+ typeof row.label === 'string' &&
21
+ typeof row.file === 'string' &&
22
+ Array.isArray(row.tests) &&
23
+ row.tests.every((test) => test && typeof test.name === 'string' && typeof test.status === 'string')) ||
24
+ !rows.some((row) => row.tests.some((test) => test.status === 'passed')))
25
+ return null;
26
+ return digest(scope);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ function stepEvidenceDigest(runDir, step) {
33
+ const base = join(runDir, step);
34
+ const files = [];
35
+ let hasContent = false;
36
+ const visit = (dir, prefix) => {
37
+ for (const name of readdirSync(dir)) {
38
+ if (!prefix && name === 'result.json')
39
+ continue;
40
+ const path = join(dir, name);
41
+ const rel = prefix ? `${prefix}/${name}` : name;
42
+ const stat = lstatSync(path);
43
+ if (stat.isDirectory()) {
44
+ if (!visit(path, rel))
45
+ return false;
46
+ }
47
+ else if (stat.isFile()) {
48
+ const content = readFileSync(path);
49
+ if (content.length)
50
+ hasContent = true;
51
+ files.push({ path: rel, digest: digest(content) });
52
+ }
53
+ else {
54
+ return false;
55
+ }
56
+ }
57
+ return true;
58
+ };
59
+ try {
60
+ if (!visit(base, '') || !hasContent)
61
+ return null;
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ files.sort((a, b) => a.path.localeCompare(b.path));
67
+ return digest(JSON.stringify(files));
68
+ }
69
+ /** 从同一次运行的步骤回执和实际证据重建验证状态;派发和提交共用。 */
70
+ export function stepValidation(runDir, step) {
71
+ try {
72
+ const value = JSON.parse(readFileSync(join(runDir, step, 'result.json'), 'utf8'));
73
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
74
+ const record = value;
75
+ if (record.id === step && typeof record.state === 'string') {
76
+ const summary = typeof record.summary === 'string' ? record.summary : '';
77
+ if (step === 'core/test-affected' && record.use !== step)
78
+ return { state: 'not-executed', summary: '受影响测试步骤 ID 与实际插件不一致' };
79
+ if (record.use === 'core/test-affected' && record.state === 'pass') {
80
+ const metrics = Array.isArray(record.metrics) ? record.metrics : [];
81
+ const count = (name) => {
82
+ const entry = metrics.find((metric) => typeof metric === 'object' && metric !== null && metric.name === name);
83
+ return typeof entry?.value === 'number' && Number.isInteger(entry.value) && entry.value >= 0 ? entry.value : null;
84
+ };
85
+ if (count('test-runs-executed') === null || count('test-runs-executed') < 1)
86
+ return { state: 'not-executed', summary: '受影响测试步骤未执行并通过任何测试运行' };
87
+ if (count('test-runs-unverified') !== 0)
88
+ return { state: 'not-executed', summary: '受影响测试包含无法核实测试用例的项目脚本' };
89
+ const executionDigest = testScopeDigest(runDir, step);
90
+ const sourceDigest = stepEvidenceDigest(runDir, step);
91
+ return executionDigest && sourceDigest
92
+ ? { state: record.state, summary, executionDigest, sourceDigest }
93
+ : { state: 'not-executed', summary: '受影响测试缺少结构化测试用例范围回执' };
94
+ }
95
+ if (record.state === 'pass') {
96
+ const executionDigest = record.use === 'core/exec' ? evidenceDigest(runDir, step, 'output.log') : stepEvidenceDigest(runDir, step);
97
+ if (!executionDigest)
98
+ return { state: 'not-executed', summary: `${step} 缺少可核对的完整执行证据` };
99
+ return { state: record.state, summary, executionDigest };
100
+ }
101
+ return { state: record.state, summary };
102
+ }
103
+ }
104
+ }
105
+ catch {
106
+ // 未生成回执属于未验证,不把测试文件存在当作执行证据。
107
+ }
108
+ return { state: 'not-executed', summary: '本次流程没有执行回执' };
109
+ }
110
+ //# sourceMappingURL=validation-receipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-receipt.js","sourceRoot":"","sources":["../src/validation-receipt.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sumi/plugins-review",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "评审插件",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,11 +13,11 @@
13
13
  "./package.json": "./package.json"
14
14
  },
15
15
  "dependencies": {
16
- "@sumi/plugin-sdk": "0.8.0",
16
+ "@sumi/plugin-sdk": "0.9.0",
17
17
  "yaml": "2.9.1",
18
18
  "picomatch": "4.0.7",
19
- "@sumi/plugins-governance": "0.8.0",
20
- "@sumi/plugins-precedent": "0.8.0"
19
+ "@sumi/plugins-governance": "0.9.0",
20
+ "@sumi/plugins-precedent": "0.9.0"
21
21
  },
22
22
  "files": [
23
23
  "dist",
@@ -1,5 +1,11 @@
1
1
  # 评审插件:按结构化准则派发独立代理评审。每个准则在流程中作为一个 review/rubric 步骤实例(with.rubric)。
2
2
  plugins:
3
+ - id: review/validation
4
+ version: 0.1.0
5
+ kind: check
6
+ command: [node, ./dist/plugins/validation.js]
7
+ timeout: 60
8
+ description: 核对项目声明的关键验证是否在本次流程实际通过
3
9
  - id: review/rubric
4
10
  version: 0.1.0
5
11
  kind: check
@@ -14,7 +20,7 @@ plugins:
14
20
  - { name: context-rubrics, argv: [node, ./dist/commands/context.js], description: 列出给定路径上适用的评审条目 }
15
21
  hooks:
16
22
  agent:
17
- beforeTool: { command: host-model-hook, tools: all, failure: open }
23
+ beforeTool: { command: host-model-hook, tools: all, failure: open, cursor: true }
18
24
  sessionStart: host-model-hook
19
25
  modelSwitch: host-model-hook
20
26
  - id: review/independent-recheck
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fantasticit/sumi",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "sumi 命令行",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,14 +13,14 @@
13
13
  "./package.json": "./package.json"
14
14
  },
15
15
  "dependencies": {
16
- "@sumi/create": "0.8.0",
17
- "@sumi/kernel": "0.8.0",
18
- "@sumi/plugin-sdk": "0.8.0",
19
- "@sumi/plugins-core": "0.8.0",
20
- "@sumi/plugins-governance": "0.8.0",
21
- "@sumi/plugins-openspec": "0.8.0",
22
- "@sumi/plugins-precedent": "0.8.0",
23
- "@sumi/plugins-review": "0.8.0",
16
+ "@sumi/create": "0.9.0",
17
+ "@sumi/kernel": "0.9.0",
18
+ "@sumi/plugin-sdk": "0.9.0",
19
+ "@sumi/plugins-core": "0.9.0",
20
+ "@sumi/plugins-governance": "0.9.0",
21
+ "@sumi/plugins-openspec": "0.9.0",
22
+ "@sumi/plugins-precedent": "0.9.0",
23
+ "@sumi/plugins-review": "0.9.0",
24
24
  "tar": "7.5.22",
25
25
  "yaml": "2.9.1"
26
26
  },
@@ -42,5 +42,5 @@
42
42
  "tar",
43
43
  "yaml"
44
44
  ],
45
- "sumiBuild": "sha256:577d3cfecb19058348796e3c85a9966f79796fead2344e08b2495af7bcff3cb9"
45
+ "sumiBuild": "sha256:7d1906902c729dedaac4c633ffdd3944121bf807a30a24a2d446b9b85c1bf271"
46
46
  }