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,46 @@
1
+ export interface NormalizedRequirementSource {
2
+ type: "user.prompt" | "local.file" | "github.issue" | "gitlab.issue" | "feishu.document";
3
+ stableId: string;
4
+ canonicalUrl?: string;
5
+ title: string;
6
+ body: string;
7
+ updatedAt?: string;
8
+ metadata: Record<string, string | string[]>;
9
+ }
10
+ export interface SourceArtifact extends NormalizedRequirementSource {
11
+ version: 1;
12
+ artifactType: "requirement-source";
13
+ schemaVersion: 1;
14
+ artifactId: string;
15
+ contentDigest: string;
16
+ }
17
+ export interface SourceArtifactReference {
18
+ artifactType: "requirement-source";
19
+ schemaVersion: 1;
20
+ artifactId: string;
21
+ path: string;
22
+ revision: 1;
23
+ contentHash: string;
24
+ mediaType: "application/json";
25
+ }
26
+ export type CaptureRequirementSource = {
27
+ type: "user.prompt";
28
+ text: string;
29
+ } | {
30
+ type: "local.file";
31
+ path: string;
32
+ } | NormalizedRequirementSource;
33
+ export interface CaptureRequirementInput {
34
+ repositoryRoot: string;
35
+ artifactRoot: string;
36
+ workItemId: string;
37
+ source: CaptureRequirementSource;
38
+ }
39
+ export declare class SourceArtifactError extends Error {
40
+ readonly code: `WSSPEC_${string}`;
41
+ constructor(code: `WSSPEC_${string}`, message: string);
42
+ }
43
+ export declare function requirementTitle(body: string): string;
44
+ export declare function sourceArtifactReference(workItemId: string, artifact: SourceArtifact): SourceArtifactReference;
45
+ export declare function captureRequirement(input: CaptureRequirementInput): Promise<SourceArtifact>;
46
+ export declare function verifySourceArtifact(artifactRoot: string, workItemId: string, reference: SourceArtifactReference): Promise<SourceArtifact>;
@@ -0,0 +1,513 @@
1
+ import { constants } from "node:fs";
2
+ import { link, lstat, mkdir, open, realpath, unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { domainToUnicode } from "node:url";
5
+ import * as canonicalizeModule from "canonicalize";
6
+ import { sha256 } from "../../domain/digests.js";
7
+ import { validate } from "../../schemas/index.js";
8
+ import { canonicalRequirementText, LocalRequirementError, readLocalRequirementFile, } from "./local-requirement.js";
9
+ import { credentialLikeField, credentialLikeValue, inspectDecodedCredentialSurface } from "./secret-detector.js";
10
+ const canonicalize = canonicalizeModule.default;
11
+ const workItemIdPattern = /^WSS-[A-Za-z0-9-]+$/u;
12
+ const artifactIdPattern = /^source-([a-f0-9]{64})$/u;
13
+ const metadataKeyPattern = /^[a-z][a-zA-Z0-9]{0,63}$/u;
14
+ const prototypeKeys = new Set(["__proto__", "constructor", "prototype"]);
15
+ const metadataAllowlist = {
16
+ "user.prompt": new Set(),
17
+ "local.file": new Set(),
18
+ "github.issue": new Set(["assignees", "author", "labels", "repository", "state"]),
19
+ "gitlab.issue": new Set(["assignees", "author", "labels", "repository", "state"]),
20
+ "feishu.document": new Set(["owner", "revision", "space"]),
21
+ };
22
+ export class SourceArtifactError extends Error {
23
+ code;
24
+ constructor(code, message) {
25
+ super(`${code}: ${message}`);
26
+ this.code = code;
27
+ this.name = "SourceArtifactError";
28
+ }
29
+ }
30
+ function fail(code, message) {
31
+ throw new SourceArtifactError(code, message);
32
+ }
33
+ function normalizedScalar(value, label, maximum) {
34
+ if (typeof value !== "string" || value === "" || Buffer.byteLength(value, "utf8") > maximum * 4) {
35
+ return fail("WSSPEC_SOURCE_INVALID", `${label} 缺失或超过上限。`);
36
+ }
37
+ const normalized = (value.startsWith("\ufeff") ? value.slice(1) : value).replace(/\r\n?/gu, "\n").normalize("NFC").trim();
38
+ if (normalized === "" || [...normalized].length > maximum
39
+ || /[\u0000-\u001f\u007f-\u009f]/u.test(normalized)) {
40
+ return fail("WSSPEC_SOURCE_INVALID", `${label} 不是有效的有界单行文本。`);
41
+ }
42
+ return normalized;
43
+ }
44
+ export function requirementTitle(body) {
45
+ const line = body.split("\n").find((candidate) => candidate.trim() !== "")?.trim() ?? "Requirement";
46
+ const withoutHeading = line.replace(/^#{1,6}\s+/u, "").trim();
47
+ return [...withoutHeading].slice(0, 512).join("") || "Requirement";
48
+ }
49
+ const maximumUrlSurfaceBytes = 8_192;
50
+ const maximumUrlDecodeRounds = 4;
51
+ function inspectDecodedUrlSurface(surface) {
52
+ const result = inspectDecodedCredentialSurface(surface, {
53
+ detectCredentialKeys: true,
54
+ maximumBytes: maximumUrlSurfaceBytes,
55
+ maximumDecodeRounds: maximumUrlDecodeRounds,
56
+ });
57
+ if (result.ok)
58
+ return result.value;
59
+ if (result.reason === "too-large")
60
+ return fail("WSSPEC_SOURCE_INVALID", "canonicalUrl 解码表面超过上限。");
61
+ if (result.reason === "credential")
62
+ return fail("WSSPEC_SOURCE_INVALID", "canonicalUrl 不能包含凭据样式内容。");
63
+ if (result.reason === "invalid-encoding")
64
+ return fail("WSSPEC_SOURCE_INVALID", "canonicalUrl 包含不合法编码。");
65
+ return fail("WSSPEC_SOURCE_METADATA_INVALID", "canonicalUrl 编码嵌套超过上限。");
66
+ }
67
+ function normalizedUrl(value) {
68
+ const source = normalizedScalar(value, "canonicalUrl", 2048);
69
+ inspectDecodedUrlSurface(source);
70
+ let parsed;
71
+ try {
72
+ parsed = new URL(source);
73
+ }
74
+ catch {
75
+ return fail("WSSPEC_SOURCE_INVALID", "canonicalUrl 必须是合法 URL。");
76
+ }
77
+ if (!["https:", "http:"].includes(parsed.protocol))
78
+ return fail("WSSPEC_SOURCE_INVALID", "canonicalUrl 只允许 HTTP(S) URL。");
79
+ const rawQuerySurfaces = parsed.search.slice(1).split("&").flatMap((entry) => {
80
+ if (entry === "")
81
+ return [];
82
+ const separator = entry.indexOf("=");
83
+ return separator < 0
84
+ ? [entry]
85
+ : [entry.slice(0, separator), entry.slice(separator + 1)];
86
+ });
87
+ const surfaces = [
88
+ parsed.username,
89
+ parsed.password,
90
+ parsed.hostname,
91
+ domainToUnicode(parsed.hostname),
92
+ ...parsed.pathname.split("/"),
93
+ ...rawQuerySurfaces,
94
+ ...[...parsed.searchParams.entries()].flatMap(([key, item]) => [key, item]),
95
+ parsed.hash.slice(1),
96
+ ];
97
+ for (const surface of surfaces)
98
+ inspectDecodedUrlSurface(surface);
99
+ if (parsed.username !== "" || parsed.password !== "")
100
+ return fail("WSSPEC_SOURCE_INVALID", "canonicalUrl 不能包含凭据样式内容。");
101
+ return parsed.toString();
102
+ }
103
+ function metadataRecord(type, value) {
104
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
105
+ return fail("WSSPEC_SOURCE_METADATA_INVALID", "metadata 必须是对象。");
106
+ }
107
+ const prototype = Object.getPrototypeOf(value);
108
+ if (prototype !== Object.prototype && prototype !== null) {
109
+ return fail("WSSPEC_SOURCE_METADATA_INVALID", "metadata 不能继承自定义 prototype。");
110
+ }
111
+ const descriptors = Object.getOwnPropertyDescriptors(value);
112
+ const keys = Object.keys(descriptors).sort();
113
+ if (keys.length > 16 || Reflect.ownKeys(value).some((key) => typeof key !== "string" || !keys.includes(key))) {
114
+ return fail("WSSPEC_SOURCE_METADATA_INVALID", "metadata 字段数量或属性类型不合法。");
115
+ }
116
+ const result = {};
117
+ let aggregateBytes = 0;
118
+ for (const key of keys) {
119
+ const descriptor = descriptors[key];
120
+ if (!descriptor.enumerable || !("value" in descriptor) || prototypeKeys.has(key)
121
+ || credentialLikeField(key) || !metadataKeyPattern.test(key)
122
+ || !metadataAllowlist[type].has(key)) {
123
+ return fail("WSSPEC_SOURCE_METADATA_INVALID", "metadata 包含不允许的字段。");
124
+ }
125
+ const values = Array.isArray(descriptor.value) ? descriptor.value : [descriptor.value];
126
+ if (values.length === 0 || values.length > 32 || values.some((item) => typeof item !== "string")) {
127
+ return fail("WSSPEC_SOURCE_METADATA_INVALID", "metadata 数组不合法。");
128
+ }
129
+ const normalized = values.map((item) => {
130
+ let current;
131
+ try {
132
+ current = normalizedScalar(item, "metadata value", 256);
133
+ }
134
+ catch {
135
+ return fail("WSSPEC_SOURCE_METADATA_INVALID", "metadata 值不合法。");
136
+ }
137
+ if (credentialLikeValue(current))
138
+ return fail("WSSPEC_SOURCE_METADATA_INVALID", "metadata 包含凭据样式内容。");
139
+ aggregateBytes += Buffer.byteLength(key, "utf8") + Buffer.byteLength(current, "utf8");
140
+ return current;
141
+ });
142
+ if (aggregateBytes > 16_384)
143
+ return fail("WSSPEC_SOURCE_METADATA_INVALID", "metadata 总大小超过上限。");
144
+ result[key] = Array.isArray(descriptor.value) ? normalized : normalized[0];
145
+ }
146
+ return result;
147
+ }
148
+ function normalizeProvider(source) {
149
+ if (!Object.hasOwn(metadataAllowlist, source.type))
150
+ return fail("WSSPEC_SOURCE_TYPE_UNSUPPORTED", "不支持该需求来源类型。");
151
+ const body = canonicalRequirementText(source.body);
152
+ let updatedAt;
153
+ if (source.updatedAt !== undefined) {
154
+ const value = normalizedScalar(source.updatedAt, "updatedAt", 64);
155
+ const timestamp = Date.parse(value);
156
+ if (!Number.isFinite(timestamp))
157
+ return fail("WSSPEC_SOURCE_INVALID", "updatedAt 必须是合法时间。");
158
+ updatedAt = new Date(timestamp).toISOString();
159
+ }
160
+ return {
161
+ type: source.type,
162
+ stableId: normalizedScalar(source.stableId, "stableId", 512),
163
+ ...(source.canonicalUrl === undefined ? {} : { canonicalUrl: normalizedUrl(source.canonicalUrl) }),
164
+ title: normalizedScalar(source.title, "title", 512),
165
+ body,
166
+ ...(updatedAt === undefined ? {} : { updatedAt }),
167
+ metadata: metadataRecord(source.type, source.metadata),
168
+ };
169
+ }
170
+ function artifactDigest(artifact) {
171
+ const encoded = canonicalize(artifact);
172
+ if (encoded === undefined)
173
+ return fail("WSSPEC_SOURCE_INVALID", "需求来源无法规范化为 JSON。");
174
+ return sha256(encoded);
175
+ }
176
+ function artifactFromSource(source) {
177
+ const unsigned = {
178
+ version: 1,
179
+ artifactType: "requirement-source",
180
+ schemaVersion: 1,
181
+ ...source,
182
+ contentDigest: sha256(source.body),
183
+ };
184
+ const digest = artifactDigest(unsigned);
185
+ return validate("builtin.source-artifact.v1", {
186
+ ...unsigned,
187
+ artifactId: `source-${digest.slice("sha256:".length)}`,
188
+ });
189
+ }
190
+ function referencePath(workItemId, artifactId) {
191
+ if (!workItemIdPattern.test(workItemId))
192
+ return fail("WSSPEC_SOURCE_INVALID", "Work Item ID 不合法。");
193
+ const match = artifactIdPattern.exec(artifactId);
194
+ if (match === null)
195
+ return fail("WSSPEC_SOURCE_INVALID", "Source Artifact ID 不合法。");
196
+ return `.wsspec/work-items/${workItemId}/source/${match[1]}.json`;
197
+ }
198
+ export function sourceArtifactReference(workItemId, artifact) {
199
+ const match = artifactIdPattern.exec(artifact.artifactId);
200
+ if (match === null)
201
+ return fail("WSSPEC_SOURCE_INVALID", "Source Artifact ID 不合法。");
202
+ return {
203
+ artifactType: "requirement-source",
204
+ schemaVersion: 1,
205
+ artifactId: artifact.artifactId,
206
+ path: referencePath(workItemId, artifact.artifactId),
207
+ revision: 1,
208
+ contentHash: `sha256:${match[1]}`,
209
+ mediaType: "application/json",
210
+ };
211
+ }
212
+ function sameDirectoryIdentity(left, right) {
213
+ return left.dev === right.dev && left.ino === right.ino;
214
+ }
215
+ function sameFileIdentity(left, right) {
216
+ return sameDirectoryIdentity(left, right)
217
+ && left.size === right.size
218
+ && left.mtimeNs === right.mtimeNs
219
+ && left.ctimeNs === right.ctimeNs
220
+ && left.nlink === right.nlink;
221
+ }
222
+ function assertSafeDirectory(target) {
223
+ const uid = process.getuid?.();
224
+ if (uid === undefined || !target.isDirectory() || target.uid !== BigInt(uid) || (target.mode & 18n) !== 0n) {
225
+ fail("WSSPEC_SOURCE_PATH_INVALID", "Artifact 目录必须由当前用户拥有且不可被组或其他用户写入。");
226
+ }
227
+ }
228
+ async function authenticateArtifactRoot(repositoryRoot, artifactRoot) {
229
+ let supplied;
230
+ try {
231
+ supplied = await lstat(artifactRoot, { bigint: true });
232
+ }
233
+ catch {
234
+ return fail("WSSPEC_SOURCE_PATH_INVALID", "Artifact 根目录不存在或不可验证。");
235
+ }
236
+ if (supplied.isSymbolicLink())
237
+ return fail("WSSPEC_SOURCE_PATH_INVALID", "Artifact 根目录不能是符号链接。");
238
+ assertSafeDirectory(supplied);
239
+ const root = await realpath(artifactRoot);
240
+ const canonical = await lstat(root, { bigint: true });
241
+ assertSafeDirectory(canonical);
242
+ if (!sameDirectoryIdentity(supplied, canonical))
243
+ return fail("WSSPEC_SOURCE_PATH_INVALID", "Artifact 根目录身份不稳定。");
244
+ if (repositoryRoot !== undefined) {
245
+ const repository = await realpath(repositoryRoot);
246
+ const relative = path.relative(repository, root);
247
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
248
+ return fail("WSSPEC_SOURCE_PATH_INVALID", "Artifact 根目录必须位于当前仓库或 worktree 内。");
249
+ }
250
+ }
251
+ return { root, identity: canonical };
252
+ }
253
+ async function ensureArtifactDirectory(repositoryRoot, artifactRoot, relativeDirectory) {
254
+ const authenticated = await authenticateArtifactRoot(repositoryRoot, artifactRoot);
255
+ let current = authenticated.root;
256
+ for (const part of relativeDirectory.split("/")) {
257
+ current = path.join(current, part);
258
+ let target;
259
+ try {
260
+ target = await lstat(current, { bigint: true });
261
+ if (target.isSymbolicLink())
262
+ return fail("WSSPEC_SOURCE_PATH_INVALID", "Artifact 目录包含符号链接。");
263
+ assertSafeDirectory(target);
264
+ }
265
+ catch (error) {
266
+ if (error instanceof SourceArtifactError)
267
+ throw error;
268
+ if (error.code !== "ENOENT")
269
+ throw error;
270
+ try {
271
+ await mkdir(current, { mode: 0o700 });
272
+ }
273
+ catch (mkdirError) {
274
+ if (mkdirError.code !== "EEXIST")
275
+ throw mkdirError;
276
+ }
277
+ target = await lstat(current, { bigint: true });
278
+ if (target.isSymbolicLink())
279
+ return fail("WSSPEC_SOURCE_PATH_INVALID", "并发创建的 Artifact 目录不安全。");
280
+ assertSafeDirectory(target);
281
+ }
282
+ const canonical = await realpath(current);
283
+ const rechecked = await lstat(current, { bigint: true });
284
+ if (canonical !== current || !sameDirectoryIdentity(target, rechecked)) {
285
+ return fail("WSSPEC_SOURCE_PATH_INVALID", "Artifact 目录在创建或验证期间被替换。");
286
+ }
287
+ assertSafeDirectory(rechecked);
288
+ }
289
+ const rootAfter = await lstat(authenticated.root, { bigint: true });
290
+ if (!sameDirectoryIdentity(authenticated.identity, rootAfter)) {
291
+ return fail("WSSPEC_SOURCE_PATH_INVALID", "Artifact 根目录在创建期间被替换。");
292
+ }
293
+ assertSafeDirectory(rootAfter);
294
+ return current;
295
+ }
296
+ async function readExistingBytes(filename, maximum) {
297
+ let pathBefore;
298
+ try {
299
+ pathBefore = await lstat(filename, { bigint: true });
300
+ }
301
+ catch {
302
+ return fail("WSSPEC_SOURCE_ARTIFACT_CONFLICT", "同摘要 Artifact 不可读取或已变化。");
303
+ }
304
+ if (!pathBefore.isFile() || pathBefore.nlink !== 1n || pathBefore.size > BigInt(maximum)) {
305
+ return fail("WSSPEC_SOURCE_ARTIFACT_CONFLICT", "同摘要 Artifact 必须是单链接普通文件。");
306
+ }
307
+ let handle;
308
+ try {
309
+ handle = await open(filename, constants.O_RDONLY | constants.O_NOFOLLOW);
310
+ }
311
+ catch {
312
+ return fail("WSSPEC_SOURCE_ARTIFACT_CONFLICT", "同摘要 Artifact 不是可验证的普通文件。");
313
+ }
314
+ try {
315
+ const before = await handle.stat({ bigint: true });
316
+ if (!before.isFile() || before.nlink !== 1n || before.size > BigInt(maximum)
317
+ || !sameFileIdentity(pathBefore, before))
318
+ return fail("WSSPEC_SOURCE_ARTIFACT_CONFLICT", "同摘要 Artifact 不合法。");
319
+ const bytes = await handle.readFile();
320
+ const after = await handle.stat({ bigint: true });
321
+ let pathAfter;
322
+ try {
323
+ pathAfter = await lstat(filename, { bigint: true });
324
+ }
325
+ catch {
326
+ return fail("WSSPEC_SOURCE_ARTIFACT_CONFLICT", "同摘要 Artifact 在读取期间消失。");
327
+ }
328
+ if (after.nlink !== 1n || !sameFileIdentity(before, after) || !sameFileIdentity(after, pathAfter)
329
+ || BigInt(bytes.length) !== before.size) {
330
+ return fail("WSSPEC_SOURCE_ARTIFACT_CONFLICT", "同摘要 Artifact 在读取期间发生变化。");
331
+ }
332
+ return bytes;
333
+ }
334
+ finally {
335
+ await handle.close();
336
+ }
337
+ }
338
+ async function readSettledExistingBytes(filename, maximum) {
339
+ for (let attempt = 0; attempt < 20; attempt += 1) {
340
+ try {
341
+ const target = await lstat(filename, { bigint: true });
342
+ if (target.nlink !== 2n)
343
+ break;
344
+ }
345
+ catch {
346
+ break;
347
+ }
348
+ await new Promise((resolve) => setTimeout(resolve, 1));
349
+ }
350
+ return readExistingBytes(filename, maximum);
351
+ }
352
+ async function writeNoClobber(filename, bytes) {
353
+ const temporary = path.join(path.dirname(filename), `.${path.basename(filename)}.${crypto.randomUUID()}.tmp`);
354
+ const handle = await open(temporary, "wx", 0o600);
355
+ try {
356
+ try {
357
+ await handle.writeFile(bytes);
358
+ await handle.sync();
359
+ }
360
+ finally {
361
+ await handle.close();
362
+ }
363
+ try {
364
+ await link(temporary, filename);
365
+ }
366
+ catch (error) {
367
+ if (error.code !== "EEXIST")
368
+ throw error;
369
+ const existing = await readSettledExistingBytes(filename, bytes.length + 1);
370
+ if (!existing.equals(bytes))
371
+ return fail("WSSPEC_SOURCE_ARTIFACT_CONFLICT", "同摘要 Artifact 的现有字节不一致,拒绝覆盖。");
372
+ return;
373
+ }
374
+ await unlink(temporary);
375
+ const written = await readExistingBytes(filename, bytes.length + 1);
376
+ if (!written.equals(bytes))
377
+ return fail("WSSPEC_SOURCE_ARTIFACT_CONFLICT", "新建 Artifact 的最终字节不一致。");
378
+ const directory = await open(path.dirname(filename), constants.O_RDONLY);
379
+ try {
380
+ await directory.sync();
381
+ }
382
+ finally {
383
+ await directory.close();
384
+ }
385
+ }
386
+ finally {
387
+ await handle.close().catch(() => undefined);
388
+ await unlink(temporary).catch(() => undefined);
389
+ }
390
+ }
391
+ async function normalizedInput(input) {
392
+ const source = input.source;
393
+ try {
394
+ if (source.type === "user.prompt" && "text" in source) {
395
+ const body = canonicalRequirementText(source.text);
396
+ return { type: "user.prompt", stableId: sha256(body), title: requirementTitle(body), body, metadata: {} };
397
+ }
398
+ if (source.type === "local.file" && "path" in source) {
399
+ const captured = await readLocalRequirementFile(input.repositoryRoot, source.path);
400
+ return { type: "local.file", stableId: captured.path, title: requirementTitle(captured.text), body: captured.text, metadata: {} };
401
+ }
402
+ return normalizeProvider(source);
403
+ }
404
+ catch (error) {
405
+ if (error instanceof SourceArtifactError)
406
+ throw error;
407
+ if (error instanceof LocalRequirementError)
408
+ throw new SourceArtifactError(error.code, error.message.slice(error.code.length + 2));
409
+ throw error;
410
+ }
411
+ }
412
+ export async function captureRequirement(input) {
413
+ const source = await normalizedInput(input);
414
+ const artifact = artifactFromSource(source);
415
+ const encoded = canonicalize(artifact);
416
+ if (encoded === undefined)
417
+ return fail("WSSPEC_SOURCE_INVALID", "Source Artifact 无法规范化。");
418
+ const reference = sourceArtifactReference(input.workItemId, artifact);
419
+ const relativeDirectory = path.posix.dirname(reference.path);
420
+ const directory = await ensureArtifactDirectory(input.repositoryRoot, input.artifactRoot, relativeDirectory);
421
+ await writeNoClobber(path.join(directory, path.posix.basename(reference.path)), Buffer.from(`${encoded}\n`, "utf8"));
422
+ return artifact;
423
+ }
424
+ function strictArtifact(value) {
425
+ if (value === null || typeof value !== "object" || Array.isArray(value))
426
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact Schema 不合法。");
427
+ const source = value;
428
+ const optional = ["canonicalUrl", "updatedAt"].filter((key) => Object.hasOwn(source, key));
429
+ const expected = ["artifactId", "artifactType", "body", "contentDigest", "metadata", "schemaVersion", "stableId", "title", "type", "version", ...optional].sort();
430
+ if (Object.keys(source).sort().join("\0") !== expected.join("\0")
431
+ || source.version !== 1 || source.schemaVersion !== 1 || source.artifactType !== "requirement-source"
432
+ || typeof source.artifactId !== "string" || typeof source.contentDigest !== "string") {
433
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact Schema 不合法。");
434
+ }
435
+ try {
436
+ validate("builtin.source-artifact.v1", value);
437
+ }
438
+ catch {
439
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact Schema 不合法。");
440
+ }
441
+ let normalized;
442
+ try {
443
+ normalized = normalizeProvider({
444
+ type: source.type,
445
+ stableId: source.stableId,
446
+ ...(source.canonicalUrl === undefined ? {} : { canonicalUrl: source.canonicalUrl }),
447
+ title: source.title,
448
+ body: source.body,
449
+ ...(source.updatedAt === undefined ? {} : { updatedAt: source.updatedAt }),
450
+ metadata: source.metadata,
451
+ });
452
+ }
453
+ catch {
454
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact 字段不合法。");
455
+ }
456
+ const rebuilt = artifactFromSource(normalized);
457
+ if (canonicalize(rebuilt) !== canonicalize(value))
458
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact 摘要或规范值不一致。");
459
+ return rebuilt;
460
+ }
461
+ export async function verifySourceArtifact(artifactRoot, workItemId, reference) {
462
+ const expectedPath = referencePath(workItemId, reference.artifactId);
463
+ const match = artifactIdPattern.exec(reference.artifactId);
464
+ if (reference.artifactType !== "requirement-source" || reference.schemaVersion !== 1 || reference.revision !== 1
465
+ || reference.mediaType !== "application/json" || reference.path !== expectedPath
466
+ || match === null || reference.contentHash !== `sha256:${match[1]}`) {
467
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact 引用不合法。");
468
+ }
469
+ const root = (await authenticateArtifactRoot(undefined, artifactRoot)).root;
470
+ const filename = path.join(root, reference.path);
471
+ const relative = path.relative(root, filename);
472
+ if (relative.startsWith("..") || path.isAbsolute(relative))
473
+ return fail("WSSPEC_SOURCE_PATH_INVALID", "Source Artifact 越出允许边界。");
474
+ let canonicalFilename;
475
+ try {
476
+ canonicalFilename = await realpath(filename);
477
+ }
478
+ catch {
479
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact 不存在或无法解析真实路径。");
480
+ }
481
+ if (canonicalFilename !== filename)
482
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact 路径包含符号链接。");
483
+ let bytes;
484
+ try {
485
+ bytes = await readExistingBytes(filename, 1_200_000);
486
+ }
487
+ catch (error) {
488
+ if (error instanceof SourceArtifactError)
489
+ throw new SourceArtifactError("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact 不可读取或已变化。");
490
+ throw error;
491
+ }
492
+ let text;
493
+ try {
494
+ text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
495
+ }
496
+ catch {
497
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact 不是 UTF-8 JSON。");
498
+ }
499
+ let parsed;
500
+ try {
501
+ parsed = JSON.parse(text);
502
+ }
503
+ catch {
504
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact 不是合法 JSON。");
505
+ }
506
+ const artifact = strictArtifact(parsed);
507
+ const encoded = canonicalize(artifact);
508
+ if (artifact.artifactId !== reference.artifactId || encoded === undefined || text !== `${encoded}\n`) {
509
+ return fail("WSSPEC_SOURCE_SNAPSHOT_CHANGED", "Source Artifact 磁盘字节或摘要已变化。");
510
+ }
511
+ return artifact;
512
+ }
513
+ //# sourceMappingURL=requirement-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement-source.js","sourceRoot":"","sources":["../../../src/registry/connectors/requirement-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { RequirementSourceInput } from "../../protocol/application.js";
2
+ import type { NormalizedRequirementSource } from "./requirement-source.js";
3
+ import type { LarkIdentity } from "./feishu-document.js";
4
+ export interface BuiltinConnectorRuntime {
5
+ executables: {
6
+ git: string;
7
+ gh: string;
8
+ glab: string;
9
+ "lark-cli": string;
10
+ };
11
+ environments?: {
12
+ github?: Readonly<Partial<Record<"HOME" | "XDG_CONFIG_HOME" | "GH_CONFIG_DIR", string | undefined>>>;
13
+ gitlab?: Readonly<Partial<Record<"HOME" | "XDG_CONFIG_HOME" | "GLAB_CONFIG_DIR", string | undefined>>>;
14
+ feishu?: Readonly<Partial<Record<"HOME" | "XDG_CONFIG_HOME" | "LARK_CONFIG_DIR", string | undefined>>>;
15
+ };
16
+ larkIdentity?: LarkIdentity;
17
+ }
18
+ export declare function createDefaultBuiltinConnectorRuntime(home: string): BuiltinConnectorRuntime;
19
+ export declare class ConnectorRuntimeError extends Error {
20
+ readonly code: `WSSPEC_${string}`;
21
+ constructor(code: `WSSPEC_${string}`, message: string);
22
+ }
23
+ export type ExternalNormalizedRequirementSource = Omit<NormalizedRequirementSource, "type"> & {
24
+ type: "github.issue" | "gitlab.issue" | "feishu.document";
25
+ };
26
+ export interface BuiltinKnowledgeTargetInput {
27
+ provider: "feishu";
28
+ document: string;
29
+ }
30
+ export interface NormalizedBuiltinKnowledgeTarget {
31
+ provider: "feishu";
32
+ stableId: string;
33
+ canonicalUrl: string;
34
+ }
35
+ export declare function captureBuiltinConnectorSource(source: Extract<RequirementSourceInput, {
36
+ type: "issue";
37
+ }>, runtime: BuiltinConnectorRuntime): Promise<ExternalNormalizedRequirementSource>;
38
+ export declare function normalizeBuiltinKnowledgeTarget(target: BuiltinKnowledgeTargetInput, runtime: BuiltinConnectorRuntime): Promise<NormalizedBuiltinKnowledgeTarget>;