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,571 @@
1
+ import { lstat, readFile, realpath } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parse } from "yaml";
4
+ import { sha256 } from "../../domain/digests.js";
5
+ import { CliAdapterError } from "../cli/output.js";
6
+ import { spawnJson } from "../process/spawn-json.js";
7
+ import { claudeDriverTarget } from "./claude.js";
8
+ import { codexDriverTarget } from "./codex.js";
9
+ import { cursorDriverTarget } from "./cursor.js";
10
+ import { genericDriverTarget } from "./generic.js";
11
+ const currentDriverVersion = 7;
12
+ const maximumDriverBytes = 1048576n;
13
+ const driverDescription = "使用 WSSpecKit 驱动软件交付 Workflow;新任务、已有任务或用户明确要求时调用。";
14
+ const driverFrontMatterKeys = ["description", "name", "wsspeckit-driver-content-digest", "wsspeckit-driver-version"];
15
+ // v1 的中文指导曾在未提升版本号时更新,因此两个历史摘要都必须显式登记。
16
+ const canonicalDriverDigests = {
17
+ codex: {
18
+ 1: [
19
+ "sha256:8804ee37451e7740a488c14291d048b57a21bdd7e2efb1b1beb70a46940030e3",
20
+ "sha256:69b6ad68c123a711095377ffdf64d21225f4bafaab3a414497ffef6c5391773e",
21
+ ],
22
+ 2: ["sha256:69b6ad68c123a711095377ffdf64d21225f4bafaab3a414497ffef6c5391773e"],
23
+ 3: ["sha256:451f3853fbc01766264e07c6b3f376aa64acfa0d7f2c6662916f876496558a8f"],
24
+ 4: ["sha256:417eb92d90b1fcd9f3ea519a80fd7d3b9151d211c90371ff17e2edbb361817aa"],
25
+ 5: ["sha256:2168d90a410d3d250645efb01911d09bc0f72259835fa2800819eba6838b65db"],
26
+ 6: ["sha256:dbee7635c12c75cd3548241e36e919f53afa7f6ca5f93a147d2dc674cc39bb25"],
27
+ 7: ["sha256:cccac8ae5fa0fe9df0b6619afc8566be7964b3ae2a5d65f93002a3def5360039"],
28
+ },
29
+ claude: {
30
+ 1: [
31
+ "sha256:3a592093e530e6e65c46d3d0cbde567fc4674135b250b0bd807e44dcb8ff8fb7",
32
+ "sha256:f7876f2691e037c3d5d9e469275e8f9adb110b6ed39f3ba7eb6f962e5d70cbb1",
33
+ ],
34
+ 2: ["sha256:f7876f2691e037c3d5d9e469275e8f9adb110b6ed39f3ba7eb6f962e5d70cbb1"],
35
+ 3: ["sha256:100a50a8ca4da95b9513aec29cdd70703cccd6bdb89209d1d18850f63ea944cb"],
36
+ 4: ["sha256:4bc3ec83cec6e94858e91d9530de8cd5cb73808e4afaed40696f0acd0238f1a3"],
37
+ 5: ["sha256:bbaf8982709f2a8a38e62fc1d4142725d9a38932385daad0bba70307295e7f62"],
38
+ 6: ["sha256:3d425ec1ad828b1c58768225bc07e5fa00468566d63997ce8b346c9ba0e50c1f"],
39
+ 7: ["sha256:c24cc8db341e713dc68558ebfa89ea7e697375ed607158daf8376b859e2cc2ff"],
40
+ },
41
+ cursor: {
42
+ 1: [
43
+ "sha256:d74438d605600c54633d2262a9558163a3f0d3a5c664983e4a20d4f84708b392",
44
+ "sha256:2c5645323532c603f0e2b037bb3cd2cc1275d31abf0fa01180cc3ee436534a93",
45
+ ],
46
+ 2: ["sha256:2c5645323532c603f0e2b037bb3cd2cc1275d31abf0fa01180cc3ee436534a93"],
47
+ 3: ["sha256:5d16ec26c199a1c552b9ba81d346f87fc26ff508c9204c68501ba01ace39ea98"],
48
+ 4: ["sha256:37dac4a4dfb61cc430cd50fcfd2b57988aa44caf0edbe87e5f5c97c36b153f1e"],
49
+ 5: ["sha256:cb9f9b0b7698c91a8b92443e3818cb5e875392d8f2a97666408ed38967b3d2a7"],
50
+ 6: ["sha256:fde89e7d933eea21e9ef1b9d32f3e8a2b2c5905664cc7f924ad02de4390e73bc"],
51
+ 7: ["sha256:b9bf5f6060ac8d8c7c24aedea265724623e54d76af91c014fc2d8e450ecedb0d"],
52
+ },
53
+ generic: {
54
+ 1: [
55
+ "sha256:a2aeea6a8e14df5fb5477d5ec37eee0a7666f10976e80ac92a8087d1484b94c5",
56
+ "sha256:8248d34a1ac5306701a7d8ac5fbbea175b22ceb932fbcdc3d672a01e31127c25",
57
+ ],
58
+ 2: ["sha256:8248d34a1ac5306701a7d8ac5fbbea175b22ceb932fbcdc3d672a01e31127c25"],
59
+ 3: ["sha256:68f5b5a5c650648987fa230f339e162792a431da53d4b4ca202aff78fcb0cff1"],
60
+ 4: ["sha256:c850774fd9c8338c31c6815a83fe526408b76f9473a3482d99bcee42342e3db6"],
61
+ 5: ["sha256:6a5288b339b5bc2ae41f3b445863b32ad11428d5b6362ba4a97bd025cafdcca9"],
62
+ 6: ["sha256:675dbd85103232c879728b080f648b64701813a540050a1af0d622655f37cde3"],
63
+ 7: ["sha256:b10bf3dee31acfa1364ebd8668659095e433ac572450670e1a22130f00c68d3b"],
64
+ },
65
+ };
66
+ function contract(agent) {
67
+ const actionCases = {
68
+ execute: {
69
+ next: "artifact",
70
+ capture: {
71
+ workPackage: "result.workPackage",
72
+ stepId: "result.workPackage.stepId",
73
+ attemptId: "result.workPackage.attemptId",
74
+ leaseToken: "result.workPackage.lease.token",
75
+ requiredOutputs: "result.workPackage.requiredOutputs",
76
+ },
77
+ initialize: {
78
+ target: "artifactRefs",
79
+ source: "result.workPackage.artifacts",
80
+ filter: { field: "artifactType", equals: "requirement-source", requiredBy: "requiredOutputs" },
81
+ },
82
+ },
83
+ await_approval: { next: "await_approval" },
84
+ blocked: { next: "blocked" },
85
+ completed: { next: "completed" },
86
+ };
87
+ const submitActionCases = {
88
+ ...actionCases,
89
+ await_approval: {
90
+ next: "decide",
91
+ capture: { approval: "result.approval" },
92
+ humanGate: { required: true, approval: "result.approval" },
93
+ },
94
+ };
95
+ const decideActionCases = {
96
+ ...actionCases,
97
+ execute: {
98
+ next: "submit",
99
+ capture: {
100
+ workPackage: "result.workPackage",
101
+ stepId: "result.workPackage.stepId",
102
+ attemptId: "result.workPackage.attemptId",
103
+ leaseToken: "result.workPackage.lease.token",
104
+ requiredOutputs: "result.workPackage.requiredOutputs",
105
+ },
106
+ },
107
+ };
108
+ return {
109
+ kind: "wsspeckit-driver-contract",
110
+ version: 1,
111
+ workflowSelection: {
112
+ feature: "builtin://workflows/feature-delivery",
113
+ documentation: "builtin://workflows/documentation-delivery",
114
+ },
115
+ entrypoints: { new: "start", recovery: "inspect" },
116
+ operations: {
117
+ start: {
118
+ argv: ["wspec", "start", "--prompt", "${prompt}", "--workflow", "${workflowRef}", "--profile", "${profile}", "--provider", agent],
119
+ capture: { workItemId: "result.workItemId", workflowRef: "result.workflowRef" },
120
+ next: "inspect",
121
+ },
122
+ inspect: {
123
+ argv: ["wspec", "inspect", "${workItemId}"],
124
+ capture: { workflowRef: "result.workflowRef" },
125
+ next: "acquire",
126
+ },
127
+ acquire: {
128
+ argv: ["wspec", "acquire", "${workItemId}", "--actor", "${actor}"],
129
+ branch: {
130
+ field: "result.action",
131
+ cases: actionCases,
132
+ },
133
+ },
134
+ artifact: {
135
+ argv: [
136
+ "wspec", "artifact", "create",
137
+ "--work-item", "${workItemId}",
138
+ "--step", "${stepId}",
139
+ "--attempt", "${attemptId}",
140
+ "--lease-token", "${leaseToken}",
141
+ "--artifact-type", "${artifactType}",
142
+ "--output", "${outputId}",
143
+ "--content-file", "${contentFile}",
144
+ ],
145
+ capture: { artifactRef: "result" },
146
+ forEach: {
147
+ source: "requiredOutputs",
148
+ item: "requiredOutput",
149
+ filter: { field: "artifactType", notEquals: "requirement-source" },
150
+ bindings: {
151
+ artifactType: "requiredOutput.artifactType",
152
+ outputId: "requiredOutput.outputId",
153
+ contentFile: ".wsspec/work-items/${workItemId}/drafts/${outputId}.md",
154
+ },
155
+ collect: { target: "artifactRefs", value: "result" },
156
+ },
157
+ next: "submit",
158
+ },
159
+ submit: {
160
+ argv: [
161
+ "wspec", "submit", "${workItemId}",
162
+ "--step", "${stepId}",
163
+ "--attempt", "${attemptId}",
164
+ "--lease", "${leaseToken}",
165
+ "--result", "${resultPath}",
166
+ "--actor", "${actor}",
167
+ ],
168
+ resultBindings: { artifacts: "artifactRefs" },
169
+ branch: { field: "result.action", cases: submitActionCases },
170
+ },
171
+ decide: {
172
+ argv: ["wspec", "decide", "--input", "${decisionPath}", "--actor", "${actor}"],
173
+ branch: { field: "result.action", cases: decideActionCases },
174
+ },
175
+ },
176
+ terminals: {
177
+ await_approval: { stop: true },
178
+ blocked: { stop: true },
179
+ completed: { stop: true },
180
+ },
181
+ };
182
+ }
183
+ function body(agent) {
184
+ return [
185
+ "# WSSpecKit Driver",
186
+ "",
187
+ "## Workflow 决策",
188
+ "",
189
+ "仅当需求明确为纯文档或无代码变更时选择 `builtin://workflows/documentation-delivery`;其余默认选择 `builtin://workflows/feature-delivery`。用户可以在创建前覆盖选择,但创建时必须传递明确的 `workflowRef`;Work Item 创建后不得自动切换 Workflow。",
190
+ "",
191
+ "## 新任务与恢复",
192
+ "",
193
+ `新任务执行 \`wspec start --prompt "<用户需求>" --workflow "<workflowRef>" --profile "<profile>" --provider "${agent}"\`。从 JSON 输出读取 \`result.workItemId\` 和 \`result.workflowRef\`;后续所有命令都使用这个 \`workItemId\`,并确认 \`workflowRef\` 未变化。`,
194
+ "",
195
+ "已有任务或 Host 重启后的恢复固定执行 inspect -> acquire:先运行 `wspec inspect \"<workItemId>\"`,从 `result.workflowRef` 确认原 Workflow,再运行 `wspec acquire \"<workItemId>\" --actor \"<actor>\"`。不要重新 start,也不要按项目当前默认值替换原 `workflowRef`。",
196
+ "",
197
+ "## acquire / submit 循环",
198
+ "",
199
+ "每次 acquire 都读取 `result.action` 并按下列分支处理:",
200
+ "",
201
+ "- `execute`:读取 `result.workPackage.stepId`、`result.workPackage.attemptId`、`result.workPackage.lease.token` 和完整 `requiredOutputs`。先把 Work Package 中系统提供的 `requirement-source` 引用放入 `artifactRefs`;再按 `requiredOutputs` 顺序逐项处理其余输出。每项正文写入 Work Item 自有的 `.wsspec/work-items/<workItemId>/drafts/<outputId>.md`,执行 `wspec artifact create --work-item \"<workItemId>\" --step \"<stepId>\" --attempt \"<attemptId>\" --lease-token \"<leaseToken>\" --artifact-type \"<artifactType>\" --output \"<outputId>\" --content-file \".wsspec/work-items/<workItemId>/drafts/<outputId>.md\"`,并把每次 JSON stdout 的 `result` 追加到 `artifactRefs`。所有必需输出完成后才生成 SubmitResult;submit JSON 的 `artifacts` 只携带累积的 ArtifactRef,正文、`contentFile`、绝对路径和 Lease token 都不得写入 `<resultPath>`。随后执行 `wspec submit \"<workItemId>\" --step \"<stepId>\" --attempt \"<attemptId>\" --lease \"<leaseToken>\" --result \"<resultPath>\" --actor \"<actor>\"`。submit 也返回 `result.action`:若为 `execute`,它已经携带并 claim 新 Work Package,必须从 artifact 循环处理,不得再次 acquire;其余分支按下文停止。不得复用旧 attemptId 或 leaseToken。",
202
+ "- `await_approval`:读取并向用户展示 `result.approval`,停止自动执行;不得代替用户批准。人工决定写入 `<decisionPath>` 后执行 `wspec decide --input \"<decisionPath>\" --actor \"<actor>\"`。若 decide 返回 `execute`,必须捕获其完整 Work Package identity,并使用原样未改的 `<resultPath>` 直接重新 submit,不得再次执行 Artifact authoring;若 Host 会话已中断,再从 inspect / acquire 恢复。",
203
+ "- `blocked`:读取并展示 `result.problems`,停止循环;只有问题被外部解决后才从 inspect / acquire 恢复。",
204
+ "- `completed`:读取 `result.summary`,报告完成并停止,不再 acquire 或 submit。",
205
+ "",
206
+ "以下 fenced JSON 是 Host 和自动验收共同消费的命令/状态机合同;`${...}` 变量必须来自用户选择、Host 身份或前一条命令声明的 capture,不能自行猜测:",
207
+ "",
208
+ "```json",
209
+ JSON.stringify(contract(agent), null, 2),
210
+ "```",
211
+ "",
212
+ "面向用户的说明、文档和交互文案默认使用中文;协议字段、类型名、URI、命令名和错误码保持英文。",
213
+ "",
214
+ "Driver 不得调用模型 API,不得缓存或管理对话、Token、记忆或隐藏推理,不得把 Artifact 正文放入协议 JSON。Artifact 只通过协议中的引用读取,模型上下文由当前 Agent Host 自主管理。",
215
+ "",
216
+ "安装只写入本 Skill 文件,不会启动后台 Runner。Driver 使用 WSSpecKit Application Protocol 驱动当前 Agent,不冒充 Codex、Claude、Cursor 或其他真实 Agent Host。",
217
+ "",
218
+ `手动调用示例:\`wspec start --provider ${agent} --prompt "更新 README" --workflow builtin://workflows/documentation-delivery --profile quick\`。`,
219
+ "",
220
+ ].join("\n");
221
+ }
222
+ function skill(agent) {
223
+ const content = body(agent);
224
+ const digest = sha256(content);
225
+ if (!canonicalDriverDigests[agent][currentDriverVersion].includes(digest)) {
226
+ throw new Error("当前 Driver 正文未登记 canonical 摘要。");
227
+ }
228
+ return [
229
+ "---",
230
+ "name: wsspeckit-driver",
231
+ `wsspeckit-driver-version: ${currentDriverVersion}`,
232
+ `wsspeckit-driver-content-digest: ${digest}`,
233
+ `description: ${driverDescription}`,
234
+ "---",
235
+ "",
236
+ content,
237
+ ].join("\n");
238
+ }
239
+ function conflict(message = "安装目标已存在且不是 WSSpecKit Driver,拒绝覆盖。") {
240
+ throw new CliAdapterError("WSSPEC_SKILL_INSTALL_CONFLICT", message);
241
+ }
242
+ function isMissing(error) {
243
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
244
+ }
245
+ function isWithin(parent, candidate) {
246
+ const relative = path.relative(parent, candidate);
247
+ return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
248
+ }
249
+ async function canonicalDirectory(directory) {
250
+ let canonical;
251
+ try {
252
+ canonical = await realpath(path.resolve(directory));
253
+ }
254
+ catch {
255
+ return conflict("Driver 安装 authority 不存在或不可访问。");
256
+ }
257
+ const info = await lstat(canonical, { bigint: true });
258
+ if (!info.isDirectory())
259
+ return conflict("Driver 安装 authority 必须是普通目录。");
260
+ return canonical;
261
+ }
262
+ async function targetFor(input) {
263
+ if (input.agent !== "generic" && input.target !== undefined)
264
+ throw new CliAdapterError("WSSPEC_ARGUMENT_INVALID", "只有 Generic Driver 支持 --target。");
265
+ const home = await canonicalDirectory(input.home);
266
+ const supplied = genericDriverTarget(input.target);
267
+ const rawHome = path.resolve(input.home);
268
+ const genericTarget = supplied === undefined ? undefined : path.resolve(supplied);
269
+ const normalizedGenericTarget = genericTarget !== undefined && isWithin(rawHome, genericTarget)
270
+ ? path.join(home, path.relative(rawHome, genericTarget))
271
+ : genericTarget;
272
+ const target = input.agent === "codex" ? codexDriverTarget(home)
273
+ : input.agent === "claude" ? claudeDriverTarget(home)
274
+ : input.agent === "cursor" ? cursorDriverTarget(home)
275
+ : normalizedGenericTarget;
276
+ if (target === undefined || target === "")
277
+ throw new CliAdapterError("WSSPEC_ARGUMENT_REQUIRED", "Generic Driver 必须通过 --target 指定安装目录。");
278
+ return path.resolve(target);
279
+ }
280
+ function sameIdentity(left, right) {
281
+ return left.dev === right.dev && left.ino === right.ino;
282
+ }
283
+ function assertDirectory(info) {
284
+ if (!info.isDirectory())
285
+ conflict("Driver 安装路径的每一段都必须是普通目录,禁止 symlink 或其他文件类型。");
286
+ }
287
+ async function assertCanonicalDirectoryChain(directory) {
288
+ const resolved = path.resolve(directory);
289
+ const root = path.parse(resolved).root;
290
+ let current = root;
291
+ let currentInfo = await lstat(current, { bigint: true });
292
+ assertDirectory(currentInfo);
293
+ for (const segment of path.relative(root, resolved).split(path.sep).filter(Boolean)) {
294
+ current = path.join(current, segment);
295
+ const info = await lstat(current, { bigint: true });
296
+ assertDirectory(info);
297
+ if (await realpath(current) !== current)
298
+ conflict("Driver 安装路径必须是 canonical,禁止任何祖先 symlink。");
299
+ currentInfo = info;
300
+ }
301
+ return currentInfo;
302
+ }
303
+ function ownedSkillVersion(content, agent) {
304
+ const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n\r?\n([\s\S]*)$/u.exec(content);
305
+ if (match === null)
306
+ return undefined;
307
+ let frontMatter;
308
+ try {
309
+ frontMatter = parse(match[1]);
310
+ }
311
+ catch {
312
+ return undefined;
313
+ }
314
+ if (frontMatter === null || typeof frontMatter !== "object" || Array.isArray(frontMatter))
315
+ return undefined;
316
+ const source = frontMatter;
317
+ const keys = Object.keys(source).sort();
318
+ const version = source["wsspeckit-driver-version"];
319
+ const digest = source["wsspeckit-driver-content-digest"];
320
+ const owned = source.name === "wsspeckit-driver"
321
+ && source.description === driverDescription
322
+ && keys.length === driverFrontMatterKeys.length
323
+ && keys.every((key, index) => key === driverFrontMatterKeys[index])
324
+ && (version === 1 || version === 2 || version === 3 || version === 4 || version === 5 || version === 6 || version === 7)
325
+ && typeof digest === "string"
326
+ && digest === sha256(match[2])
327
+ && canonicalDriverDigests[agent][version].includes(digest);
328
+ return owned ? version : undefined;
329
+ }
330
+ async function skillIdentity(filename) {
331
+ let info;
332
+ try {
333
+ info = await lstat(filename, { bigint: true });
334
+ }
335
+ catch (error) {
336
+ if (isMissing(error))
337
+ return undefined;
338
+ throw error;
339
+ }
340
+ if (!info.isFile() || info.nlink !== 1n || info.size > maximumDriverBytes)
341
+ conflict("Driver Skill 必须是有界单链接普通文件,禁止 symlink、hardlink 或其他文件类型。");
342
+ return info;
343
+ }
344
+ async function assertOwned(target, agent) {
345
+ const filename = path.join(target, "SKILL.md");
346
+ const before = await skillIdentity(filename);
347
+ if (before === undefined)
348
+ return undefined;
349
+ let existing;
350
+ try {
351
+ existing = await readFile(filename, "utf8");
352
+ }
353
+ catch {
354
+ return conflict();
355
+ }
356
+ const after = await skillIdentity(filename);
357
+ const version = ownedSkillVersion(existing, agent);
358
+ if (after === undefined || !sameIdentity(before, after) || version === undefined)
359
+ return conflict();
360
+ return { content: existing, info: after, version };
361
+ }
362
+ const secureInstallScript = String.raw `
363
+ import base64, hashlib, json, os, stat, sys
364
+
365
+ def result(ok, code=None):
366
+ value = {"ok": ok}
367
+ if code is not None:
368
+ value["code"] = code
369
+ sys.stdout.write(json.dumps(value, separators=(",", ":")))
370
+
371
+ def fail():
372
+ raise RuntimeError("conflict")
373
+
374
+ def request_value(source, key, kind):
375
+ value = source.get(key)
376
+ if not isinstance(value, kind):
377
+ fail()
378
+ return value
379
+
380
+ def open_target(target, expected_dev, expected_ino):
381
+ if not target.startswith("/") or os.path.normpath(target) != target or target == "/" or "\x00" in target:
382
+ fail()
383
+ current = os.open("/", os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW)
384
+ try:
385
+ for segment in [part for part in target.split("/") if part]:
386
+ before = os.stat(segment, dir_fd=current, follow_symlinks=False)
387
+ if not stat.S_ISDIR(before.st_mode):
388
+ fail()
389
+ child = os.open(segment, os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW, dir_fd=current)
390
+ after = os.fstat(child)
391
+ if (before.st_dev, before.st_ino) != (after.st_dev, after.st_ino):
392
+ os.close(child)
393
+ fail()
394
+ os.close(current)
395
+ current = child
396
+ final = os.fstat(current)
397
+ if str(final.st_dev) != expected_dev or str(final.st_ino) != expected_ino:
398
+ fail()
399
+ return current
400
+ except BaseException:
401
+ os.close(current)
402
+ raise
403
+
404
+ def existing_file(directory):
405
+ try:
406
+ before = os.stat("SKILL.md", dir_fd=directory, follow_symlinks=False)
407
+ except FileNotFoundError:
408
+ return None
409
+ if not stat.S_ISREG(before.st_mode) or before.st_nlink != 1 or before.st_size > 1048576:
410
+ fail()
411
+ handle = os.open("SKILL.md", os.O_RDONLY | os.O_NOFOLLOW, dir_fd=directory)
412
+ after = os.fstat(handle)
413
+ if (before.st_dev, before.st_ino, before.st_size) != (after.st_dev, after.st_ino, after.st_size):
414
+ os.close(handle)
415
+ fail()
416
+ return handle
417
+
418
+ def verify(directory, expected_digest, expected_size):
419
+ handle = existing_file(directory)
420
+ if handle is None:
421
+ fail()
422
+ try:
423
+ data = bytearray()
424
+ while True:
425
+ chunk = os.read(handle, 65536)
426
+ if not chunk:
427
+ break
428
+ data.extend(chunk)
429
+ if len(data) > 1048576:
430
+ fail()
431
+ if len(data) != expected_size or hashlib.sha256(data).hexdigest() != expected_digest:
432
+ fail()
433
+ finally:
434
+ os.close(handle)
435
+
436
+ def create(directory, content, dry_run):
437
+ existing = existing_file(directory)
438
+ if existing is not None:
439
+ os.close(existing)
440
+ fail()
441
+ if dry_run:
442
+ return False
443
+ handle = None
444
+ try:
445
+ handle = os.open("SKILL.md", os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_NOFOLLOW, 0o600, dir_fd=directory)
446
+ offset = 0
447
+ while offset < len(content):
448
+ written = os.write(handle, content[offset:])
449
+ if written < 1:
450
+ fail()
451
+ offset += written
452
+ os.fsync(handle)
453
+ os.close(handle)
454
+ handle = None
455
+ os.fsync(directory)
456
+ return True
457
+ except BaseException:
458
+ if handle is not None:
459
+ os.close(handle)
460
+ raise
461
+
462
+ try:
463
+ source = json.load(sys.stdin)
464
+ if not isinstance(source, dict) or set(source) - {"target", "targetDev", "targetIno", "operation", "dryRun", "contentBase64", "expectedDigest", "expectedSize"}:
465
+ fail()
466
+ target = request_value(source, "target", str)
467
+ target_dev = request_value(source, "targetDev", str)
468
+ target_ino = request_value(source, "targetIno", str)
469
+ operation = request_value(source, "operation", str)
470
+ dry_run = request_value(source, "dryRun", bool)
471
+ directory = open_target(target, target_dev, target_ino)
472
+ created = False
473
+ try:
474
+ if operation == "create":
475
+ encoded = request_value(source, "contentBase64", str)
476
+ content = base64.b64decode(encoded, validate=True)
477
+ if len(content) > 1048576:
478
+ fail()
479
+ created = create(directory, content, dry_run)
480
+ if created:
481
+ verify(directory, hashlib.sha256(content).hexdigest(), len(content))
482
+ elif operation == "verify":
483
+ digest = request_value(source, "expectedDigest", str)
484
+ size = request_value(source, "expectedSize", int)
485
+ if dry_run not in (True, False) or len(digest) != 64 or size < 0 or size > 1048576:
486
+ fail()
487
+ verify(directory, digest, size)
488
+ else:
489
+ fail()
490
+ confirmed = open_target(target, target_dev, target_ino)
491
+ os.close(confirmed)
492
+ except BaseException:
493
+ raise
494
+ finally:
495
+ os.close(directory)
496
+ result(True)
497
+ except BaseException:
498
+ result(False, "conflict")
499
+ `;
500
+ function helperSucceeded(value) {
501
+ return value !== null && typeof value === "object" && !Array.isArray(value)
502
+ && Object.keys(value).length === 1 && value.ok === true;
503
+ }
504
+ export async function secureInstallDriverFile(request) {
505
+ if (process.platform !== "darwin")
506
+ conflict("Driver 安全安装当前仅支持 macOS。");
507
+ try {
508
+ const helper = await realpath("/usr/bin/python3");
509
+ const helperInfo = await lstat(helper);
510
+ if (!helperInfo.isFile() || helperInfo.uid !== 0 || (helperInfo.mode & 0o022) !== 0) {
511
+ conflict("Driver 安全安装 helper 不可信。");
512
+ }
513
+ const result = await spawnJson({
514
+ executable: helper,
515
+ argv: ["-I", "-S", "-c", secureInstallScript],
516
+ input: request,
517
+ timeoutMs: 5_000,
518
+ maxStdoutBytes: 256,
519
+ });
520
+ if (!helperSucceeded(result.value))
521
+ conflict("Driver 安全安装未通过文件系统边界校验。");
522
+ }
523
+ catch (error) {
524
+ if (error instanceof CliAdapterError)
525
+ throw error;
526
+ conflict("Driver 安全安装 helper 不可用或执行失败。");
527
+ }
528
+ }
529
+ const defaultDependencies = { secureInstall: secureInstallDriverFile };
530
+ export function createDriverSkillInstaller(overrides = {}) {
531
+ const dependencies = { ...defaultDependencies, ...overrides };
532
+ return async (input) => {
533
+ const target = await targetFor(input);
534
+ let targetInfo;
535
+ try {
536
+ targetInfo = await assertCanonicalDirectoryChain(target);
537
+ }
538
+ catch (error) {
539
+ if (isMissing(error))
540
+ conflict("Driver 安装目标目录必须预先创建。");
541
+ throw error;
542
+ }
543
+ const existing = await assertOwned(target, input.agent);
544
+ if (existing !== undefined && existing.version !== currentDriverVersion) {
545
+ conflict("旧版 Driver 不进行原地升级;请移除旧文件后重新安装。");
546
+ }
547
+ const content = skill(input.agent);
548
+ const request = existing === undefined
549
+ ? {
550
+ target,
551
+ targetDev: targetInfo.dev.toString(),
552
+ targetIno: targetInfo.ino.toString(),
553
+ operation: "create",
554
+ dryRun: input.dryRun === true,
555
+ contentBase64: Buffer.from(content).toString("base64"),
556
+ }
557
+ : {
558
+ target,
559
+ targetDev: targetInfo.dev.toString(),
560
+ targetIno: targetInfo.ino.toString(),
561
+ operation: "verify",
562
+ dryRun: input.dryRun === true,
563
+ expectedDigest: sha256(existing.content).slice("sha256:".length),
564
+ expectedSize: Buffer.byteLength(existing.content),
565
+ };
566
+ await dependencies.secureInstall(request);
567
+ return { agent: input.agent, target, dryRun: input.dryRun === true };
568
+ };
569
+ }
570
+ export const installDriverSkill = createDriverSkillInstaller();
571
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/adapters/skills/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { AgentAction, AcquireInput, StepFailureCode, SubmitResult } from "../protocol/application.js";
2
+ import type { WorkPackage } from "../protocol/work-package.js";
3
+ import type { ExecutorRegistry } from "../registry/executors/registry.js";
4
+ import { type RuntimeProjection } from "../storage/control-plane.js";
5
+ import { type CloseDecision } from "../engine/archive.js";
6
+ import type { ApplicationState } from "./state.js";
7
+ import type { ExternalActionExecutor } from "./external-action.js";
8
+ export interface AcquireDependencies {
9
+ now(): Date;
10
+ executors: ExecutorRegistry;
11
+ home: string;
12
+ provider: import("../registry/skills/types.js").SkillProvider;
13
+ externalExecutor(provider: string, action: import("../engine/external-effects/authorization.js").ExternalActionName): ExternalActionExecutor;
14
+ }
15
+ export interface ApplicationStepResult extends SubmitResult {
16
+ failureCode?: StepFailureCode;
17
+ }
18
+ export interface ApplicationAttemptRecord {
19
+ workPackage: WorkPackage;
20
+ retryCount: number;
21
+ actor?: string;
22
+ stepInstanceId?: string;
23
+ artifactValues?: Record<string, Record<string, unknown>>;
24
+ result?: ApplicationStepResult;
25
+ nextAction?: AgentAction;
26
+ }
27
+ export interface ApplicationSkippedStepRecord {
28
+ stepInstanceId: string;
29
+ skipped: true;
30
+ }
31
+ interface AcquiredMutation {
32
+ action: AgentAction;
33
+ skippedStepIds: string[];
34
+ closeDecision?: CloseDecision;
35
+ reacquired?: {
36
+ stageId: string;
37
+ attemptId: string;
38
+ previousLeaseDigest: string;
39
+ leaseDigest: string;
40
+ };
41
+ }
42
+ export declare class ApplicationAcquireError extends Error {
43
+ readonly code: `WSSPEC_${string}`;
44
+ constructor(code: `WSSPEC_${string}`, message: string);
45
+ }
46
+ export declare function acquireNextLocked(input: {
47
+ state: ApplicationState;
48
+ projection: RuntimeProjection;
49
+ actor: string;
50
+ root: string;
51
+ dependencies: AcquireDependencies;
52
+ }): Promise<{
53
+ projection: RuntimeProjection;
54
+ action: AgentAction;
55
+ skippedStepIds: string[];
56
+ closeDecision?: CloseDecision;
57
+ reacquired?: NonNullable<AcquiredMutation["reacquired"]>;
58
+ }>;
59
+ export declare function acquireApplication(input: AcquireInput, dependencies: AcquireDependencies): Promise<AgentAction>;
60
+ export {};