ws-spec-kit 0.1.0-beta.4 → 0.1.0-beta.6

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 (49) hide show
  1. package/dist/adapters/skills/install.js +20 -4
  2. package/dist/adapters/skills/install.js.map +1 -1
  3. package/dist/application/decide.js +11 -2
  4. package/dist/application/decide.js.map +1 -1
  5. package/dist/application/inspect.js +2 -0
  6. package/dist/application/inspect.js.map +1 -1
  7. package/dist/application/testing-config.d.ts +12 -0
  8. package/dist/application/testing-config.js +85 -0
  9. package/dist/application/testing-config.js.map +1 -0
  10. package/dist/cli/commands/core.js +16 -1
  11. package/dist/cli/commands/core.js.map +1 -1
  12. package/dist/cli/commands/public-contract.js +7 -2
  13. package/dist/cli/commands/public-contract.js.map +1 -1
  14. package/dist/engine/approvals.d.ts +2 -0
  15. package/dist/engine/approvals.js +36 -8
  16. package/dist/engine/approvals.js.map +1 -1
  17. package/dist/engine/tdd/red-gate.js +45 -12
  18. package/dist/engine/tdd/red-gate.js.map +1 -1
  19. package/dist/engine/tdd/runner-digest.d.ts +1 -0
  20. package/dist/engine/tdd/runner-digest.js +64 -0
  21. package/dist/engine/tdd/runner-digest.js.map +1 -0
  22. package/dist/engine/tdd/types.d.ts +1 -1
  23. package/dist/engine/tdd/vitest-reporter.d.ts +1 -0
  24. package/dist/engine/tdd/vitest-reporter.js +50 -0
  25. package/dist/engine/tdd/vitest-reporter.js.map +1 -0
  26. package/dist/engine/verification.d.ts +1 -1
  27. package/dist/engine/verification.js +5 -3
  28. package/dist/engine/verification.js.map +1 -1
  29. package/dist/protocol/application.d.ts +7 -0
  30. package/dist/protocol/public-contract.d.ts +9 -6
  31. package/dist/protocol/public-contract.js +8 -5
  32. package/dist/protocol/public-contract.js.map +1 -1
  33. package/dist/schemas/definitions.js +8 -1
  34. package/dist/schemas/definitions.js.map +1 -1
  35. package/dist/storage/control-plane.d.ts +4 -0
  36. package/dist/storage/control-plane.js.map +1 -1
  37. package/dist/storage/repository.d.ts +1 -1
  38. package/dist/storage/repository.js +13 -2
  39. package/dist/storage/repository.js.map +1 -1
  40. package/dist/storage/testing-config-migration.d.ts +8 -0
  41. package/dist/storage/testing-config-migration.js +19 -0
  42. package/dist/storage/testing-config-migration.js.map +1 -0
  43. package/dist/storage/testing-config.d.ts +1 -0
  44. package/dist/storage/testing-config.js +76 -0
  45. package/dist/storage/testing-config.js.map +1 -0
  46. package/package.json +3 -2
  47. package/schemas/builtin-application-decision-input-v2.schema.json +18 -0
  48. package/schemas/builtin-application-project-config-snapshot-v1.schema.json +4 -1
  49. package/schemas/builtin-application-project-config-v1.schema.json +4 -1
@@ -0,0 +1,76 @@
1
+ import { lstat, readFile, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { defaultProductPaths, defaultTestAssetPaths, testPathRules } from "../engine/tdd/types.js";
4
+ async function directory(root, relative) {
5
+ try {
6
+ return (await lstat(path.join(root, relative))).isDirectory();
7
+ }
8
+ catch (error) {
9
+ if (error.code === "ENOENT")
10
+ return false;
11
+ throw error;
12
+ }
13
+ }
14
+ export async function suggestTestingConfig(root, testRoot) {
15
+ const packages = ["."];
16
+ for (const base of ["apps", "packages"]) {
17
+ if (await directory(root, base))
18
+ for (const name of (await readdir(path.join(root, base))).sort()) {
19
+ if (await directory(root, `${base}/${name}`))
20
+ packages.push(`${base}/${name}`);
21
+ }
22
+ }
23
+ const candidates = [];
24
+ const simple = new Set();
25
+ const dependencies = new Set();
26
+ let installedVitest = false;
27
+ for (const relative of packages) {
28
+ try {
29
+ const manifest = JSON.parse(await readFile(path.join(root, relative, "package.json"), "utf8"));
30
+ if (manifest.devDependencies?.vitest || manifest.dependencies?.vitest) {
31
+ installedVitest = true;
32
+ dependencies.add(relative);
33
+ }
34
+ if (/\bvitest\b/u.test(manifest.scripts?.test ?? ""))
35
+ candidates.push(relative);
36
+ if (/^vitest(?: run)?$/u.test(manifest.scripts?.test ?? ""))
37
+ simple.add(relative);
38
+ }
39
+ catch (error) {
40
+ if (error.code !== "ENOENT")
41
+ throw error;
42
+ }
43
+ }
44
+ const selected = testRoot ?? candidates[0];
45
+ if ((testRoot === undefined && candidates.length > 1) || (installedVitest && candidates.length === 0)
46
+ || (selected !== undefined && (!candidates.includes(selected) || !simple.has(selected)))) {
47
+ throw Object.assign(new Error("无法唯一确定 Vitest 测试范围,请显式配置 Test Gate 后重新 init。"), { code: "WSSPEC_TDD_GATE_CONFIGURATION_INVALID" });
48
+ }
49
+ const products = [];
50
+ for (const name of ["src", "apps", "packages"])
51
+ if (await directory(root, name))
52
+ products.push(`${name}/**`);
53
+ const runnerRoot = selected !== undefined && dependencies.has(selected) ? selected : ".";
54
+ let runner = path.posix.join(runnerRoot, "node_modules/vitest/vitest.mjs");
55
+ if (selected !== undefined) {
56
+ for (const candidate of [...new Set([path.posix.join(selected, "node_modules/vitest/vitest.mjs"), "node_modules/vitest/vitest.mjs"])]) {
57
+ try {
58
+ await readFile(path.join(root, candidate));
59
+ runner = candidate;
60
+ break;
61
+ }
62
+ catch (error) {
63
+ if (error.code !== "ENOENT")
64
+ throw error;
65
+ }
66
+ }
67
+ }
68
+ const command = selected === undefined ? ["node", "--test"]
69
+ : ["node", runner, "run", ...(selected === "." ? [] : ["--root", selected])];
70
+ return {
71
+ version: 1,
72
+ testing: { pathRules: [...testPathRules], testAssetPaths: [...defaultTestAssetPaths], productPaths: products.length ? products : [...defaultProductPaths] },
73
+ quality: { gates: { test: { command, cwd: "worktree", timeoutSeconds: selected === undefined ? 60 : 120, required: true, evidence: "trusted", inheritEnv: [], env: {}, reporter: { type: selected === undefined ? "node-test" : "vitest", version: 1 } } } },
74
+ };
75
+ }
76
+ //# sourceMappingURL=testing-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-config.js","sourceRoot":"","sources":["../../src/storage/testing-config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ws-spec-kit",
3
- "version": "0.1.0-beta.4",
3
+ "version": "0.1.0-beta.6",
4
4
  "description": "由 Agent Skill 驱动的可定制软件交付工作流引擎",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -35,6 +35,7 @@
35
35
  "devDependencies": {
36
36
  "@types/node": "^22.20.1",
37
37
  "tsx": "^4.23.12",
38
- "typescript": "^5.9.3"
38
+ "typescript": "^5.9.3",
39
+ "vitest": "4.1.10"
39
40
  }
40
41
  }
@@ -40,6 +40,24 @@
40
40
  "actor": {
41
41
  "type": "string",
42
42
  "minLength": 1
43
+ },
44
+ "confirmation": {
45
+ "type": "object",
46
+ "additionalProperties": false,
47
+ "required": [
48
+ "source",
49
+ "userMessage"
50
+ ],
51
+ "properties": {
52
+ "source": {
53
+ "const": "conversation"
54
+ },
55
+ "userMessage": {
56
+ "type": "string",
57
+ "minLength": 1,
58
+ "maxLength": 8192
59
+ }
60
+ }
43
61
  }
44
62
  }
45
63
  },
@@ -151,7 +151,10 @@
151
151
  ],
152
152
  "properties": {
153
153
  "type": {
154
- "const": "node-test"
154
+ "enum": [
155
+ "node-test",
156
+ "vitest"
157
+ ]
155
158
  },
156
159
  "version": {
157
160
  "const": 1
@@ -151,7 +151,10 @@
151
151
  ],
152
152
  "properties": {
153
153
  "type": {
154
- "const": "node-test"
154
+ "enum": [
155
+ "node-test",
156
+ "vitest"
157
+ ]
155
158
  },
156
159
  "version": {
157
160
  "const": 1