ws-spec-kit 0.1.0-beta.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 (353) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +79 -0
  3. package/dist/adapters/cli/output.d.ts +15 -0
  4. package/dist/adapters/cli/output.js +21 -0
  5. package/dist/adapters/cli/output.js.map +1 -0
  6. package/dist/adapters/cli/workflow.d.ts +25 -0
  7. package/dist/adapters/cli/workflow.js +131 -0
  8. package/dist/adapters/cli/workflow.js.map +1 -0
  9. package/dist/adapters/connectors/git-native.d.ts +23 -0
  10. package/dist/adapters/connectors/git-native.js +521 -0
  11. package/dist/adapters/connectors/git-native.js.map +1 -0
  12. package/dist/adapters/connectors/github-cli.d.ts +23 -0
  13. package/dist/adapters/connectors/github-cli.js +213 -0
  14. package/dist/adapters/connectors/github-cli.js.map +1 -0
  15. package/dist/adapters/connectors/gitlab-cli.d.ts +23 -0
  16. package/dist/adapters/connectors/gitlab-cli.js +199 -0
  17. package/dist/adapters/connectors/gitlab-cli.js.map +1 -0
  18. package/dist/adapters/connectors/lark-cli.d.ts +24 -0
  19. package/dist/adapters/connectors/lark-cli.js +296 -0
  20. package/dist/adapters/connectors/lark-cli.js.map +1 -0
  21. package/dist/adapters/process/redaction.d.ts +2 -0
  22. package/dist/adapters/process/redaction.js +51 -0
  23. package/dist/adapters/process/redaction.js.map +1 -0
  24. package/dist/adapters/process/spawn-json.d.ts +37 -0
  25. package/dist/adapters/process/spawn-json.js +312 -0
  26. package/dist/adapters/process/spawn-json.js.map +1 -0
  27. package/dist/adapters/skills/claude.d.ts +1 -0
  28. package/dist/adapters/skills/claude.js +3 -0
  29. package/dist/adapters/skills/claude.js.map +1 -0
  30. package/dist/adapters/skills/codex.d.ts +1 -0
  31. package/dist/adapters/skills/codex.js +3 -0
  32. package/dist/adapters/skills/codex.js.map +1 -0
  33. package/dist/adapters/skills/cursor.d.ts +1 -0
  34. package/dist/adapters/skills/cursor.js +3 -0
  35. package/dist/adapters/skills/cursor.js.map +1 -0
  36. package/dist/adapters/skills/generic.d.ts +1 -0
  37. package/dist/adapters/skills/generic.js +2 -0
  38. package/dist/adapters/skills/generic.js.map +1 -0
  39. package/dist/adapters/skills/install.d.ts +28 -0
  40. package/dist/adapters/skills/install.js +571 -0
  41. package/dist/adapters/skills/install.js.map +1 -0
  42. package/dist/application/acquire.d.ts +60 -0
  43. package/dist/application/acquire.js +964 -0
  44. package/dist/application/acquire.js.map +1 -0
  45. package/dist/application/application.d.ts +21 -0
  46. package/dist/application/application.js +31 -0
  47. package/dist/application/application.js.map +1 -0
  48. package/dist/application/artifact-reader.d.ts +1 -0
  49. package/dist/application/artifact-reader.js +150 -0
  50. package/dist/application/artifact-reader.js.map +1 -0
  51. package/dist/application/artifact-writer.d.ts +1 -0
  52. package/dist/application/artifact-writer.js +268 -0
  53. package/dist/application/artifact-writer.js.map +1 -0
  54. package/dist/application/artifact.d.ts +28 -0
  55. package/dist/application/artifact.js +523 -0
  56. package/dist/application/artifact.js.map +1 -0
  57. package/dist/application/decide.d.ts +12 -0
  58. package/dist/application/decide.js +168 -0
  59. package/dist/application/decide.js.map +1 -0
  60. package/dist/application/doctor-connectors.d.ts +34 -0
  61. package/dist/application/doctor-connectors.js +99 -0
  62. package/dist/application/doctor-connectors.js.map +1 -0
  63. package/dist/application/external-action.d.ts +164 -0
  64. package/dist/application/external-action.js +670 -0
  65. package/dist/application/external-action.js.map +1 -0
  66. package/dist/application/initial-stages.d.ts +3 -0
  67. package/dist/application/initial-stages.js +7 -0
  68. package/dist/application/initial-stages.js.map +1 -0
  69. package/dist/application/inspect.d.ts +2 -0
  70. package/dist/application/inspect.js +31 -0
  71. package/dist/application/inspect.js.map +1 -0
  72. package/dist/application/profile.d.ts +32 -0
  73. package/dist/application/profile.js +70 -0
  74. package/dist/application/profile.js.map +1 -0
  75. package/dist/application/snapshot.d.ts +75 -0
  76. package/dist/application/snapshot.js +338 -0
  77. package/dist/application/snapshot.js.map +1 -0
  78. package/dist/application/start.d.ts +43 -0
  79. package/dist/application/start.js +360 -0
  80. package/dist/application/start.js.map +1 -0
  81. package/dist/application/state.d.ts +17 -0
  82. package/dist/application/state.js +94 -0
  83. package/dist/application/state.js.map +1 -0
  84. package/dist/application/submit.d.ts +18 -0
  85. package/dist/application/submit.js +1090 -0
  86. package/dist/application/submit.js.map +1 -0
  87. package/dist/cli/commands/core.d.ts +2 -0
  88. package/dist/cli/commands/core.js +205 -0
  89. package/dist/cli/commands/core.js.map +1 -0
  90. package/dist/cli/commands/public-contract.d.ts +12 -0
  91. package/dist/cli/commands/public-contract.js +47 -0
  92. package/dist/cli/commands/public-contract.js.map +1 -0
  93. package/dist/cli/main.d.ts +2 -0
  94. package/dist/cli/main.js +23 -0
  95. package/dist/cli/main.js.map +1 -0
  96. package/dist/domain/artifacts.d.ts +52 -0
  97. package/dist/domain/artifacts.js +241 -0
  98. package/dist/domain/artifacts.js.map +1 -0
  99. package/dist/domain/digests.d.ts +11 -0
  100. package/dist/domain/digests.js +106 -0
  101. package/dist/domain/digests.js.map +1 -0
  102. package/dist/domain/external-receipt.d.ts +48 -0
  103. package/dist/domain/external-receipt.js +138 -0
  104. package/dist/domain/external-receipt.js.map +1 -0
  105. package/dist/domain/ids.d.ts +7 -0
  106. package/dist/domain/ids.js +5 -0
  107. package/dist/domain/ids.js.map +1 -0
  108. package/dist/domain/repository-path.d.ts +3 -0
  109. package/dist/domain/repository-path.js +87 -0
  110. package/dist/domain/repository-path.js.map +1 -0
  111. package/dist/domain/states.d.ts +38 -0
  112. package/dist/domain/states.js +69 -0
  113. package/dist/domain/states.js.map +1 -0
  114. package/dist/domain/work-package-identity.d.ts +2 -0
  115. package/dist/domain/work-package-identity.js +10 -0
  116. package/dist/domain/work-package-identity.js.map +1 -0
  117. package/dist/domain/workflow.d.ts +58 -0
  118. package/dist/domain/workflow.js +2 -0
  119. package/dist/domain/workflow.js.map +1 -0
  120. package/dist/engine/actor-roles.d.ts +15 -0
  121. package/dist/engine/actor-roles.js +53 -0
  122. package/dist/engine/actor-roles.js.map +1 -0
  123. package/dist/engine/approvals.d.ts +44 -0
  124. package/dist/engine/approvals.js +239 -0
  125. package/dist/engine/approvals.js.map +1 -0
  126. package/dist/engine/archive.d.ts +24 -0
  127. package/dist/engine/archive.js +442 -0
  128. package/dist/engine/archive.js.map +1 -0
  129. package/dist/engine/compiler.d.ts +25 -0
  130. package/dist/engine/compiler.js +828 -0
  131. package/dist/engine/compiler.js.map +1 -0
  132. package/dist/engine/control/condition.d.ts +10 -0
  133. package/dist/engine/control/condition.js +49 -0
  134. package/dist/engine/control/condition.js.map +1 -0
  135. package/dist/engine/control/loop.d.ts +23 -0
  136. package/dist/engine/control/loop.js +96 -0
  137. package/dist/engine/control/loop.js.map +1 -0
  138. package/dist/engine/control/retry.d.ts +15 -0
  139. package/dist/engine/control/retry.js +54 -0
  140. package/dist/engine/control/retry.js.map +1 -0
  141. package/dist/engine/docs-integrity.d.ts +13 -0
  142. package/dist/engine/docs-integrity.js +34 -0
  143. package/dist/engine/docs-integrity.js.map +1 -0
  144. package/dist/engine/expressions/ast.d.ts +18 -0
  145. package/dist/engine/expressions/ast.js +9 -0
  146. package/dist/engine/expressions/ast.js.map +1 -0
  147. package/dist/engine/expressions/evaluate.d.ts +7 -0
  148. package/dist/engine/expressions/evaluate.js +47 -0
  149. package/dist/engine/expressions/evaluate.js.map +1 -0
  150. package/dist/engine/expressions/parser.d.ts +2 -0
  151. package/dist/engine/expressions/parser.js +173 -0
  152. package/dist/engine/expressions/parser.js.map +1 -0
  153. package/dist/engine/external-effects/authorization.d.ts +146 -0
  154. package/dist/engine/external-effects/authorization.js +222 -0
  155. package/dist/engine/external-effects/authorization.js.map +1 -0
  156. package/dist/engine/external-effects/idempotency.d.ts +14 -0
  157. package/dist/engine/external-effects/idempotency.js +26 -0
  158. package/dist/engine/external-effects/idempotency.js.map +1 -0
  159. package/dist/engine/external-effects/reconciliation.d.ts +11 -0
  160. package/dist/engine/external-effects/reconciliation.js +18 -0
  161. package/dist/engine/external-effects/reconciliation.js.map +1 -0
  162. package/dist/engine/results.d.ts +14 -0
  163. package/dist/engine/results.js +88 -0
  164. package/dist/engine/results.js.map +1 -0
  165. package/dist/engine/scheduler.d.ts +60 -0
  166. package/dist/engine/scheduler.js +225 -0
  167. package/dist/engine/scheduler.js.map +1 -0
  168. package/dist/engine/tdd/green-gate.d.ts +6 -0
  169. package/dist/engine/tdd/green-gate.js +72 -0
  170. package/dist/engine/tdd/green-gate.js.map +1 -0
  171. package/dist/engine/tdd/red-gate.d.ts +30 -0
  172. package/dist/engine/tdd/red-gate.js +531 -0
  173. package/dist/engine/tdd/red-gate.js.map +1 -0
  174. package/dist/engine/tdd/types.d.ts +89 -0
  175. package/dist/engine/tdd/types.js +38 -0
  176. package/dist/engine/tdd/types.js.map +1 -0
  177. package/dist/engine/verification.d.ts +56 -0
  178. package/dist/engine/verification.js +196 -0
  179. package/dist/engine/verification.js.map +1 -0
  180. package/dist/policy/profile.d.ts +24 -0
  181. package/dist/policy/profile.js +23 -0
  182. package/dist/policy/profile.js.map +1 -0
  183. package/dist/policy/risk.d.ts +33 -0
  184. package/dist/policy/risk.js +138 -0
  185. package/dist/policy/risk.js.map +1 -0
  186. package/dist/protocol/application.d.ts +196 -0
  187. package/dist/protocol/application.js +2 -0
  188. package/dist/protocol/application.js.map +1 -0
  189. package/dist/protocol/public-contract.d.ts +81 -0
  190. package/dist/protocol/public-contract.js +231 -0
  191. package/dist/protocol/public-contract.js.map +1 -0
  192. package/dist/protocol/work-package.d.ts +55 -0
  193. package/dist/protocol/work-package.js +2 -0
  194. package/dist/protocol/work-package.js.map +1 -0
  195. package/dist/registry/connectors/external-executor.d.ts +4 -0
  196. package/dist/registry/connectors/external-executor.js +249 -0
  197. package/dist/registry/connectors/external-executor.js.map +1 -0
  198. package/dist/registry/connectors/feishu-document.d.ts +21 -0
  199. package/dist/registry/connectors/feishu-document.js +197 -0
  200. package/dist/registry/connectors/feishu-document.js.map +1 -0
  201. package/dist/registry/connectors/git-commit.d.ts +32 -0
  202. package/dist/registry/connectors/git-commit.js +122 -0
  203. package/dist/registry/connectors/git-commit.js.map +1 -0
  204. package/dist/registry/connectors/issue.d.ts +68 -0
  205. package/dist/registry/connectors/issue.js +301 -0
  206. package/dist/registry/connectors/issue.js.map +1 -0
  207. package/dist/registry/connectors/knowledge-publish.d.ts +30 -0
  208. package/dist/registry/connectors/knowledge-publish.js +157 -0
  209. package/dist/registry/connectors/knowledge-publish.js.map +1 -0
  210. package/dist/registry/connectors/local-requirement.d.ts +19 -0
  211. package/dist/registry/connectors/local-requirement.js +177 -0
  212. package/dist/registry/connectors/local-requirement.js.map +1 -0
  213. package/dist/registry/connectors/manifest.d.ts +6 -0
  214. package/dist/registry/connectors/manifest.js +164 -0
  215. package/dist/registry/connectors/manifest.js.map +1 -0
  216. package/dist/registry/connectors/registry.d.ts +11 -0
  217. package/dist/registry/connectors/registry.js +34 -0
  218. package/dist/registry/connectors/registry.js.map +1 -0
  219. package/dist/registry/connectors/requirement-source.d.ts +46 -0
  220. package/dist/registry/connectors/requirement-source.js +513 -0
  221. package/dist/registry/connectors/requirement-source.js.map +1 -0
  222. package/dist/registry/connectors/runtime.d.ts +38 -0
  223. package/dist/registry/connectors/runtime.js +127 -0
  224. package/dist/registry/connectors/runtime.js.map +1 -0
  225. package/dist/registry/connectors/secret-detector.d.ts +19 -0
  226. package/dist/registry/connectors/secret-detector.js +85 -0
  227. package/dist/registry/connectors/secret-detector.js.map +1 -0
  228. package/dist/registry/connectors/semver.d.ts +8 -0
  229. package/dist/registry/connectors/semver.js +57 -0
  230. package/dist/registry/connectors/semver.js.map +1 -0
  231. package/dist/registry/connectors/types.d.ts +45 -0
  232. package/dist/registry/connectors/types.js +2 -0
  233. package/dist/registry/connectors/types.js.map +1 -0
  234. package/dist/registry/executors/registry.d.ts +15 -0
  235. package/dist/registry/executors/registry.js +68 -0
  236. package/dist/registry/executors/registry.js.map +1 -0
  237. package/dist/registry/executors/types.d.ts +19 -0
  238. package/dist/registry/executors/types.js +2 -0
  239. package/dist/registry/executors/types.js.map +1 -0
  240. package/dist/registry/skills/lock.d.ts +3 -0
  241. package/dist/registry/skills/lock.js +278 -0
  242. package/dist/registry/skills/lock.js.map +1 -0
  243. package/dist/registry/skills/resolver.d.ts +16 -0
  244. package/dist/registry/skills/resolver.js +353 -0
  245. package/dist/registry/skills/resolver.js.map +1 -0
  246. package/dist/registry/skills/types.d.ts +75 -0
  247. package/dist/registry/skills/types.js +9 -0
  248. package/dist/registry/skills/types.js.map +1 -0
  249. package/dist/resources/catalog.d.ts +20 -0
  250. package/dist/resources/catalog.js +111 -0
  251. package/dist/resources/catalog.js.map +1 -0
  252. package/dist/schemas/definitions.d.ts +5 -0
  253. package/dist/schemas/definitions.js +958 -0
  254. package/dist/schemas/definitions.js.map +1 -0
  255. package/dist/schemas/generate.d.ts +1 -0
  256. package/dist/schemas/generate.js +26 -0
  257. package/dist/schemas/generate.js.map +1 -0
  258. package/dist/schemas/index.d.ts +11 -0
  259. package/dist/schemas/index.js +54 -0
  260. package/dist/schemas/index.js.map +1 -0
  261. package/dist/storage/control-plane.d.ts +136 -0
  262. package/dist/storage/control-plane.js +688 -0
  263. package/dist/storage/control-plane.js.map +1 -0
  264. package/dist/storage/events.d.ts +36 -0
  265. package/dist/storage/events.js +185 -0
  266. package/dist/storage/events.js.map +1 -0
  267. package/dist/storage/external-action-payload.d.ts +33 -0
  268. package/dist/storage/external-action-payload.js +190 -0
  269. package/dist/storage/external-action-payload.js.map +1 -0
  270. package/dist/storage/files.d.ts +13 -0
  271. package/dist/storage/files.js +45 -0
  272. package/dist/storage/files.js.map +1 -0
  273. package/dist/storage/git.d.ts +4 -0
  274. package/dist/storage/git.js +21 -0
  275. package/dist/storage/git.js.map +1 -0
  276. package/dist/storage/project-config.d.ts +11 -0
  277. package/dist/storage/project-config.js +60 -0
  278. package/dist/storage/project-config.js.map +1 -0
  279. package/dist/storage/repository.d.ts +14 -0
  280. package/dist/storage/repository.js +151 -0
  281. package/dist/storage/repository.js.map +1 -0
  282. package/dist/storage/work-items.d.ts +77 -0
  283. package/dist/storage/work-items.js +373 -0
  284. package/dist/storage/work-items.js.map +1 -0
  285. package/dist/storage/workflow-trust.d.ts +38 -0
  286. package/dist/storage/workflow-trust.js +310 -0
  287. package/dist/storage/workflow-trust.js.map +1 -0
  288. package/dist/workflow-package/loader.d.ts +12 -0
  289. package/dist/workflow-package/loader.js +249 -0
  290. package/dist/workflow-package/loader.js.map +1 -0
  291. package/dist/workflow-package/lock.d.ts +6 -0
  292. package/dist/workflow-package/lock.js +12 -0
  293. package/dist/workflow-package/lock.js.map +1 -0
  294. package/dist/workflow-package/path-boundary.d.ts +5 -0
  295. package/dist/workflow-package/path-boundary.js +38 -0
  296. package/dist/workflow-package/path-boundary.js.map +1 -0
  297. package/dist/workflow-package/trust.d.ts +27 -0
  298. package/dist/workflow-package/trust.js +61 -0
  299. package/dist/workflow-package/trust.js.map +1 -0
  300. package/dist/workflow-package/types.d.ts +176 -0
  301. package/dist/workflow-package/types.js +9 -0
  302. package/dist/workflow-package/types.js.map +1 -0
  303. package/dist/workflow-package/workflow-v1.d.ts +3 -0
  304. package/dist/workflow-package/workflow-v1.js +274 -0
  305. package/dist/workflow-package/workflow-v1.js.map +1 -0
  306. package/package.json +40 -0
  307. package/resources/catalog.yaml +37 -0
  308. package/resources/connectors/github-cli.yaml +24 -0
  309. package/resources/connectors/gitlab-cli.yaml +24 -0
  310. package/resources/connectors/lark-cli.yaml +28 -0
  311. package/resources/skills/bug-fixing/SKILL.md +16 -0
  312. package/resources/skills/code-review/SKILL.md +16 -0
  313. package/resources/skills/documentation-editing/SKILL.md +16 -0
  314. package/resources/skills/documentation-exploration/SKILL.md +16 -0
  315. package/resources/skills/documentation-review/SKILL.md +16 -0
  316. package/resources/skills/requirement-exploration/SKILL.md +16 -0
  317. package/resources/skills/solution-design/SKILL.md +16 -0
  318. package/resources/skills/task-planning/SKILL.md +16 -0
  319. package/resources/skills/tdd-implementation/SKILL.md +16 -0
  320. package/resources/workflows/documentation-delivery/manifest.yaml +8 -0
  321. package/resources/workflows/documentation-delivery/profiles/governed.yaml +23 -0
  322. package/resources/workflows/documentation-delivery/profiles/quick.yaml +23 -0
  323. package/resources/workflows/documentation-delivery/profiles/standard.yaml +21 -0
  324. package/resources/workflows/documentation-delivery/workflow.yaml +109 -0
  325. package/resources/workflows/feature-delivery/manifest.yaml +8 -0
  326. package/resources/workflows/feature-delivery/profiles/governed.yaml +27 -0
  327. package/resources/workflows/feature-delivery/profiles/quick.yaml +25 -0
  328. package/resources/workflows/feature-delivery/profiles/standard.yaml +26 -0
  329. package/resources/workflows/feature-delivery/workflow.yaml +150 -0
  330. package/schemas/builtin-agent-action-v1.schema.json +509 -0
  331. package/schemas/builtin-application-acquire-input-v1.schema.json +25 -0
  332. package/schemas/builtin-application-artifact-create-input-v1.schema.json +49 -0
  333. package/schemas/builtin-application-decision-input-v1.schema.json +284 -0
  334. package/schemas/builtin-application-inspect-input-v1.schema.json +20 -0
  335. package/schemas/builtin-application-project-config-snapshot-v1.schema.json +289 -0
  336. package/schemas/builtin-application-project-config-v1.schema.json +293 -0
  337. package/schemas/builtin-application-start-input-v1.schema.json +92 -0
  338. package/schemas/builtin-application-submit-input-v1.schema.json +145 -0
  339. package/schemas/builtin-artifact-v1.schema.json +48 -0
  340. package/schemas/builtin-evidence-v1.schema.json +65 -0
  341. package/schemas/builtin-external-action-grant-v1.schema.json +298 -0
  342. package/schemas/builtin-external-action-request-v1.schema.json +288 -0
  343. package/schemas/builtin-external-binding-v1.schema.json +59 -0
  344. package/schemas/builtin-external-receipt-v1.schema.json +109 -0
  345. package/schemas/builtin-external-write-receipt-v1.schema.json +253 -0
  346. package/schemas/builtin-source-artifact-v1.schema.json +293 -0
  347. package/schemas/builtin-submit-result-v1.schema.json +111 -0
  348. package/schemas/builtin-tdd-cycle-evidence-v1.schema.json +119 -0
  349. package/schemas/builtin-tdd-node-test-report-v1.schema.json +103 -0
  350. package/schemas/builtin-tdd-trusted-evidence-v1.schema.json +184 -0
  351. package/schemas/builtin-work-item-v1.schema.json +201 -0
  352. package/schemas/builtin-work-package-v1.schema.json +254 -0
  353. package/schemas/builtin-workflow-selection-v1.schema.json +40 -0
@@ -0,0 +1,373 @@
1
+ import { access, lstat, mkdir, open, readFile, readdir, realpath, rmdir, unlink } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { parse, stringify } from "yaml";
5
+ import { computeWorkspaceTreeDigest, sha256 } from "../domain/digests.js";
6
+ import { captureRequirement, requirementTitle, sourceArtifactReference, } from "../registry/connectors/requirement-source.js";
7
+ import { validate } from "../schemas/index.js";
8
+ import { writeFileAtomic } from "./files.js";
9
+ import { runGit } from "./git.js";
10
+ import { portableProjectConfigText } from "./project-config.js";
11
+ import { loadRepository } from "./repository.js";
12
+ export class WorkItemError extends Error {
13
+ code;
14
+ constructor(code, message) {
15
+ super(message);
16
+ this.code = code;
17
+ this.name = "WorkItemError";
18
+ }
19
+ }
20
+ const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
21
+ const publicSchemas = path.join(packageRoot, "schemas");
22
+ const workItemIdPattern = /^WSS-[A-Za-z0-9-]+$/;
23
+ const creationOwner = Symbol("wsspec.creationOwner");
24
+ async function exists(target) {
25
+ try {
26
+ await access(target);
27
+ return true;
28
+ }
29
+ catch (error) {
30
+ if (error.code === "ENOENT")
31
+ return false;
32
+ throw error;
33
+ }
34
+ }
35
+ async function branchExists(root, branch) {
36
+ try {
37
+ await runGit(root, ["show-ref", "--verify", `refs/heads/${branch}`]);
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ function repositoryRelativePath(root, configuredPath) {
45
+ if (path.isAbsolute(configuredPath)) {
46
+ throw new WorkItemError("WSSPEC_CONTROL_PLANE_INVALID", "M1 worktree root 必须是仓库相对路径。");
47
+ }
48
+ const absolute = path.resolve(root, configuredPath);
49
+ const relative = path.relative(root, absolute);
50
+ if (relative.startsWith("..") || path.isAbsolute(relative) || relative === "") {
51
+ throw new WorkItemError("WSSPEC_CONTROL_PLANE_INVALID", "worktree 路径越出仓库允许边界。");
52
+ }
53
+ return { absolute, relative: relative.split(path.sep).join("/") };
54
+ }
55
+ async function assertRealPathContained(root, target) {
56
+ const [realRoot, realTarget] = await Promise.all([realpath(root), realpath(target)]);
57
+ const relative = path.relative(realRoot, realTarget);
58
+ if (relative.startsWith("..") || path.isAbsolute(relative) || relative === "") {
59
+ throw new WorkItemError("WSSPEC_CONTROL_PLANE_INVALID", "worktree 根目录的真实路径越出仓库允许边界。");
60
+ }
61
+ }
62
+ function requirementCaptureSource(input) {
63
+ const source = input.source;
64
+ if (input.capturedSource === undefined) {
65
+ if (source.type === "issue") {
66
+ throw new WorkItemError("WSSPEC_SOURCE_SNAPSHOT_INVALID", "外部需求来源必须先经过 Connector 捕获。 ");
67
+ }
68
+ return source.type === "prompt"
69
+ ? { type: "user.prompt", text: source.content }
70
+ : { type: "local.file", path: source.path };
71
+ }
72
+ const captured = input.capturedSource;
73
+ if (source.type === "issue") {
74
+ if (captured.type === "prompt" || captured.type === "file") {
75
+ throw new WorkItemError("WSSPEC_SOURCE_SNAPSHOT_INVALID", "外部预捕获来源与 Work Item 输入不一致。 ");
76
+ }
77
+ const expectedProvider = captured.type === "github.issue" ? ["github", "github-cli"]
78
+ : captured.type === "gitlab.issue" ? ["gitlab", "gitlab-cli"]
79
+ : ["feishu", "lark-cli"];
80
+ if (!expectedProvider.includes(source.provider)) {
81
+ throw new WorkItemError("WSSPEC_SOURCE_SNAPSHOT_INVALID", "外部预捕获来源 Provider 不一致。 ");
82
+ }
83
+ return captured;
84
+ }
85
+ if (captured.type !== "prompt" && captured.type !== "file") {
86
+ throw new WorkItemError("WSSPEC_SOURCE_SNAPSHOT_INVALID", "本地预捕获来源与 Work Item 输入不一致。 ");
87
+ }
88
+ if (captured.type !== source.type || captured.origin === "" || captured.text.trim() === "" || sha256(captured.text) !== captured.contentDigest) {
89
+ throw new WorkItemError("WSSPEC_SOURCE_SNAPSHOT_INVALID", "预捕获需求来源与 Work Item 输入不一致。");
90
+ }
91
+ return {
92
+ type: captured.type === "prompt" ? "user.prompt" : "local.file",
93
+ stableId: captured.type === "prompt" ? captured.contentDigest : captured.origin,
94
+ title: requirementTitle(captured.text),
95
+ body: captured.text,
96
+ metadata: {},
97
+ };
98
+ }
99
+ async function readProjectContracts(root, application) {
100
+ if (application !== undefined) {
101
+ return {
102
+ workflowText: application.workflowText,
103
+ configText: application.configText,
104
+ config: { git: { worktrees: { root: application.worktreeRoot ?? ".worktrees", branchPrefix: application.branchPrefix ?? "wspec/" } } },
105
+ };
106
+ }
107
+ const workflowText = await readFile(path.join(root, ".wsspec", "workflow.yaml"), "utf8");
108
+ const configText = await readFile(path.join(root, ".wsspec", "config.yaml"), "utf8");
109
+ validate("builtin.workflow-selection.v1", parse(workflowText));
110
+ const config = validate("builtin.application-project-config.v1", parse(configText));
111
+ const git = config.git;
112
+ return {
113
+ workflowText,
114
+ configText,
115
+ config: { git: { worktrees: { root: git?.worktrees?.root ?? ".worktrees", branchPrefix: git?.worktrees?.branchPrefix ?? "wspec/" } } },
116
+ };
117
+ }
118
+ async function snapshotSchemas(target) {
119
+ const names = (await readdir(publicSchemas)).filter((name) => name.endsWith(".schema.json")).sort();
120
+ const contents = [];
121
+ await mkdir(target, { recursive: true });
122
+ for (const name of names) {
123
+ const content = await readFile(path.join(publicSchemas, name), "utf8");
124
+ contents.push(`${name}\0${content}`);
125
+ await writeFileAtomic(path.join(target, name), content);
126
+ }
127
+ return sha256(contents.join("\0"));
128
+ }
129
+ async function writeFileExclusive(target, content) {
130
+ await mkdir(path.dirname(target), { recursive: true });
131
+ const handle = await open(target, "wx", 0o600);
132
+ try {
133
+ await handle.writeFile(content, "utf8");
134
+ await handle.sync();
135
+ }
136
+ finally {
137
+ await handle.close();
138
+ }
139
+ }
140
+ async function removeOwnedApplicationControlPlane(input) {
141
+ const controlPlane = path.join(input.workItemRoot, "control-plane");
142
+ let target;
143
+ try {
144
+ target = await lstat(controlPlane);
145
+ }
146
+ catch (error) {
147
+ if (error.code === "ENOENT")
148
+ return;
149
+ throw error;
150
+ }
151
+ if (!target.isDirectory())
152
+ return;
153
+ const anchorPath = path.join(controlPlane, "application-anchor.json");
154
+ let anchor;
155
+ try {
156
+ anchor = JSON.parse(await readFile(anchorPath, "utf8"));
157
+ }
158
+ catch {
159
+ return;
160
+ }
161
+ if (anchor.version !== 1 || anchor.workItemId !== input.workItemId || anchor.ownerToken !== input.ownerToken)
162
+ return;
163
+ const runtimePath = path.join(controlPlane, "runtime.json");
164
+ try {
165
+ const runtime = JSON.parse(await readFile(runtimePath, "utf8"));
166
+ if (runtime.repositoryId === input.repositoryId && runtime.workItemId === input.workItemId)
167
+ await unlink(runtimePath);
168
+ }
169
+ catch (error) {
170
+ if (error.code !== "ENOENT" && !(error instanceof SyntaxError))
171
+ throw error;
172
+ }
173
+ await unlink(anchorPath);
174
+ await rmdir(controlPlane).catch((error) => {
175
+ if (!["ENOENT", "ENOTEMPTY", "EEXIST"].includes(error.code ?? ""))
176
+ throw error;
177
+ });
178
+ }
179
+ export async function createWorkItem(input) {
180
+ if (!workItemIdPattern.test(input.workItemId) || input.title.trim() === "") {
181
+ throw new WorkItemError("WSSPEC_WORK_ITEM_INVALID", "Work Item ID 或标题不合法。");
182
+ }
183
+ const identity = await loadRepository(input.root);
184
+ const root = identity.repositoryRoot;
185
+ const { workflowText, configText, config } = await readProjectContracts(root, input.application);
186
+ const portableConfigText = portableProjectConfigText(parse(configText));
187
+ const worktreeRoot = repositoryRelativePath(root, config.git.worktrees.root);
188
+ const branch = `${config.git.worktrees.branchPrefix}${input.workItemId}`;
189
+ const worktree = path.join(worktreeRoot.absolute, input.workItemId);
190
+ const worktreeRelative = `${worktreeRoot.relative}/${input.workItemId}`;
191
+ const locator = path.join(identity.commonDir, "wsspec", "work-items", input.workItemId, "locator.json");
192
+ if ((await exists(worktree)) || (await exists(locator)) || (await branchExists(root, branch))) {
193
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ID_CONFLICT", `Work Item 目标已存在:${input.workItemId}`);
194
+ }
195
+ await mkdir(worktreeRoot.absolute, { recursive: true });
196
+ await assertRealPathContained(root, worktreeRoot.absolute);
197
+ const createdAt = input.createdAt ?? new Date().toISOString();
198
+ const baselineRevision = await runGit(root, ["rev-parse", "HEAD"]);
199
+ const ownerToken = crypto.randomUUID();
200
+ await runGit(root, ["worktree", "add", "-b", branch, worktree, baselineRevision]);
201
+ try {
202
+ const baselineTreeDigest = await computeWorkspaceTreeDigest(worktree);
203
+ const itemRoot = path.join(worktree, ".wsspec", "work-items", input.workItemId);
204
+ const snapshotRoot = path.join(itemRoot, "snapshot");
205
+ await writeFileAtomic(path.join(snapshotRoot, "workflow.yaml"), workflowText);
206
+ await writeFileAtomic(path.join(snapshotRoot, "config.yaml"), portableConfigText);
207
+ const schemaDigest = await snapshotSchemas(path.join(snapshotRoot, "schemas"));
208
+ const source = await captureRequirement({
209
+ repositoryRoot: root,
210
+ artifactRoot: worktree,
211
+ workItemId: input.workItemId,
212
+ source: requirementCaptureSource(input),
213
+ });
214
+ const sourceReference = sourceArtifactReference(input.workItemId, source);
215
+ const itemRelativeSource = path.posix.relative(`.wsspec/work-items/${input.workItemId}`, sourceReference.path);
216
+ const workItem = {
217
+ version: 1,
218
+ workItemId: input.workItemId,
219
+ repositoryId: identity.repositoryId,
220
+ title: input.title,
221
+ createdAt,
222
+ status: "active",
223
+ execution: {
224
+ worktree: worktreeRelative,
225
+ branch,
226
+ baselineRevision,
227
+ baselineTreeDigest,
228
+ workflowDigest: sha256(workflowText),
229
+ configDigest: sha256(portableConfigText),
230
+ schemaDigest,
231
+ },
232
+ source: {
233
+ type: source.type,
234
+ artifactId: source.artifactId,
235
+ snapshot: itemRelativeSource,
236
+ contentDigest: source.contentDigest,
237
+ artifactDigest: sourceReference.contentHash,
238
+ },
239
+ bindings: { issue: null, knowledge: null },
240
+ };
241
+ validate("builtin.work-item.v1", workItem);
242
+ await writeFileAtomic(path.join(itemRoot, "work-item.yaml"), stringify(workItem, { lineWidth: 0 }));
243
+ await writeFileExclusive(locator, `${JSON.stringify({
244
+ version: 1,
245
+ repositoryId: identity.repositoryId,
246
+ workItemId: input.workItemId,
247
+ worktree: worktreeRelative,
248
+ ownerToken,
249
+ snapshot: `.wsspec/work-items/${input.workItemId}/snapshot`,
250
+ }, null, 2)}\n`);
251
+ Object.defineProperty(workItem, creationOwner, { value: ownerToken });
252
+ return workItem;
253
+ }
254
+ catch (error) {
255
+ try {
256
+ await rollbackWorktreeResources({
257
+ identity,
258
+ workItemId: input.workItemId,
259
+ worktree: worktreeRelative,
260
+ branch,
261
+ baselineRevision,
262
+ ownerToken,
263
+ locatorMode: "creating",
264
+ });
265
+ }
266
+ catch {
267
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_FAILED", "Work Item 创建失败且无法安全回滚。");
268
+ }
269
+ throw error;
270
+ }
271
+ }
272
+ async function rollbackWorktreeResources(input) {
273
+ if (!workItemIdPattern.test(input.workItemId)) {
274
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_REFUSED", "回滚目标与当前仓库身份不一致。");
275
+ }
276
+ const expectedWorktree = path.resolve(input.identity.repositoryRoot, input.worktree);
277
+ const [realRoot, realWorktree] = await Promise.all([realpath(input.identity.repositoryRoot), realpath(expectedWorktree)]);
278
+ const relative = path.relative(realRoot, realWorktree);
279
+ if (relative.startsWith("..") || path.isAbsolute(relative) || relative === "") {
280
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_REFUSED", "回滚 worktree 越出仓库边界。");
281
+ }
282
+ const workItemRoot = path.join(input.identity.commonDir, "wsspec", "work-items", input.workItemId);
283
+ const locatorPath = path.join(workItemRoot, "locator.json");
284
+ const expectedLocator = {
285
+ repositoryId: input.identity.repositoryId,
286
+ workItemId: input.workItemId,
287
+ worktree: input.worktree,
288
+ ownerToken: input.ownerToken,
289
+ };
290
+ const locatorOwnership = async () => {
291
+ let target;
292
+ try {
293
+ target = await lstat(locatorPath);
294
+ }
295
+ catch (error) {
296
+ if (error.code === "ENOENT")
297
+ return "absent";
298
+ throw error;
299
+ }
300
+ if (!target.isFile())
301
+ return "foreign";
302
+ let locator;
303
+ try {
304
+ locator = JSON.parse(await readFile(locatorPath, "utf8"));
305
+ }
306
+ catch {
307
+ return "foreign";
308
+ }
309
+ return locator.repositoryId !== expectedLocator.repositoryId
310
+ || locator.workItemId !== expectedLocator.workItemId
311
+ || locator.worktree !== expectedLocator.worktree
312
+ || locator.ownerToken !== expectedLocator.ownerToken
313
+ ? "foreign"
314
+ : "owned";
315
+ };
316
+ const initialLocator = await locatorOwnership();
317
+ if (input.locatorMode === "published" && initialLocator !== "owned") {
318
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_REFUSED", "回滚 locator 与本次创建身份不一致。");
319
+ }
320
+ const worktrees = await runGit(input.identity.repositoryRoot, ["worktree", "list", "--porcelain"]);
321
+ const registered = worktrees.split(/\n\n/u).find((entry) => entry.split("\n")[0] === `worktree ${realWorktree}`);
322
+ if (registered === undefined || !registered.split("\n").includes(`branch refs/heads/${input.branch}`)) {
323
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_REFUSED", "回滚 worktree 与预期 branch 绑定不一致。");
324
+ }
325
+ const branchRef = `refs/heads/${input.branch}`;
326
+ if (await runGit(input.identity.repositoryRoot, ["rev-parse", branchRef]) !== input.baselineRevision) {
327
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_REFUSED", "回滚 branch 已产生新 revision,拒绝删除。");
328
+ }
329
+ await runGit(input.identity.repositoryRoot, ["worktree", "remove", "--force", realWorktree]);
330
+ if (await runGit(input.identity.repositoryRoot, ["rev-parse", branchRef]) !== input.baselineRevision) {
331
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_REFUSED", "回滚 branch 在 worktree 移除期间发生变化,拒绝删除。");
332
+ }
333
+ const finalLocator = await locatorOwnership();
334
+ if (input.locatorMode === "published" && finalLocator !== "owned") {
335
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_REFUSED", "回滚期间 locator 已变化,拒绝继续删除 branch。");
336
+ }
337
+ await runGit(input.identity.repositoryRoot, ["branch", "-D", "--", input.branch]);
338
+ if (finalLocator === "owned")
339
+ await unlink(locatorPath);
340
+ await removeOwnedApplicationControlPlane({
341
+ workItemRoot,
342
+ repositoryId: input.identity.repositoryId,
343
+ workItemId: input.workItemId,
344
+ ownerToken: input.ownerToken,
345
+ });
346
+ await rmdir(workItemRoot).catch((error) => {
347
+ if (!["ENOENT", "ENOTEMPTY", "EEXIST"].includes(error.code ?? ""))
348
+ throw error;
349
+ });
350
+ }
351
+ export function creationOwnerForWorkItem(item) {
352
+ const ownerToken = item[creationOwner];
353
+ if (ownerToken === undefined)
354
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_REFUSED", "Work Item 缺少本次创建 owner 身份。");
355
+ return ownerToken;
356
+ }
357
+ export async function rollbackCreatedWorkItem(input) {
358
+ const identity = await loadRepository(input.root);
359
+ if (input.item.repositoryId !== identity.repositoryId) {
360
+ throw new WorkItemError("WSSPEC_WORK_ITEM_ROLLBACK_REFUSED", "回滚目标与当前仓库身份不一致。");
361
+ }
362
+ const ownerToken = creationOwnerForWorkItem(input.item);
363
+ await rollbackWorktreeResources({
364
+ identity,
365
+ workItemId: input.item.workItemId,
366
+ worktree: input.item.execution.worktree,
367
+ branch: input.item.execution.branch,
368
+ baselineRevision: input.item.execution.baselineRevision,
369
+ ownerToken,
370
+ locatorMode: "published",
371
+ });
372
+ }
373
+ //# sourceMappingURL=work-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-items.js","sourceRoot":"","sources":["../../src/storage/work-items.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { WorkflowTrustRecord } from "../workflow-package/types.js";
2
+ export declare class WorkflowTrustStoreError extends Error {
3
+ readonly code: `WSSPEC_${string}`;
4
+ constructor(code: `WSSPEC_${string}`, message: string);
5
+ }
6
+ export interface WorkflowTrustRequestedEvent {
7
+ event: "requested";
8
+ requestId: string;
9
+ packageRef: string;
10
+ packageDigest: string;
11
+ capabilityDigest: string;
12
+ actor: string;
13
+ channel: "interactive";
14
+ createdAt: string;
15
+ expiresAt: string;
16
+ }
17
+ export interface WorkflowTrustDecidedEvent {
18
+ event: "decided";
19
+ requestId: string;
20
+ decision: "trusted" | "rejected";
21
+ actor: string;
22
+ decidedAt: string;
23
+ }
24
+ export declare function workflowTrustPath(root: string): Promise<string>;
25
+ export declare function readWorkflowTrustRecords(root: string): Promise<WorkflowTrustRecord[]>;
26
+ export declare function readWorkflowTrustRequest(root: string, requestId: string): Promise<WorkflowTrustRequestedEvent | undefined>;
27
+ export declare function recoverStaleWorkflowTrustLock(root: string): Promise<boolean>;
28
+ export declare function createWorkflowTrustRequest(root: string, request: WorkflowTrustRequestedEvent): Promise<void>;
29
+ export interface DecideWorkflowTrustRequestInput {
30
+ requestId: string;
31
+ packageRef: string;
32
+ packageDigest: string;
33
+ capabilityDigest: string;
34
+ decision: "trusted" | "rejected";
35
+ actor: string;
36
+ decidedAt: string;
37
+ }
38
+ export declare function decideWorkflowTrustRequest(root: string, input: DecideWorkflowTrustRequestInput): Promise<WorkflowTrustRecord>;