devcontour-harness 0.0.0-stage → 0.1.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +183 -2
  3. package/docs/architecture.md +473 -0
  4. package/docs/compatibility-versions.md +56 -0
  5. package/docs/compatibility.md +192 -0
  6. package/docs/connectors.md +323 -0
  7. package/docs/contracts.md +603 -0
  8. package/docs/integrations/hindsight.md +148 -0
  9. package/docs/quickstart.md +182 -0
  10. package/docs/release-notes/0.1.0-alpha.6.md +238 -0
  11. package/docs/review-probes.md +120 -0
  12. package/docs/review-protocol.md +251 -0
  13. package/docs/toolchains.md +167 -0
  14. package/docs/turbo-starter.md +269 -0
  15. package/docs/upgrade.md +202 -0
  16. package/examples/README.md +27 -0
  17. package/examples/external-connector/README.md +19 -0
  18. package/examples/external-connector/connector.mjs +55 -0
  19. package/examples/files-only/README.md +28 -0
  20. package/examples/files-only/context/norms/rules.md +4 -0
  21. package/examples/files-only/graph.json +23 -0
  22. package/examples/files-only/policy.json +30 -0
  23. package/examples/one-vendor/README.md +19 -0
  24. package/examples/one-vendor/policy.json +27 -0
  25. package/examples/single-task/README.md +18 -0
  26. package/examples/single-task/graph.json +27 -0
  27. package/examples/single-task/policy-same-vendor.json +55 -0
  28. package/examples/single-task/policy.json +52 -0
  29. package/examples/single-task/src/.gitkeep +0 -0
  30. package/examples/single-task/test/run.js +19 -0
  31. package/examples/toolchains/README.md +32 -0
  32. package/examples/toolchains/go/bad/label/label.go +9 -0
  33. package/examples/toolchains/go/good/label/label.go +9 -0
  34. package/examples/toolchains/go/policy.json +79 -0
  35. package/examples/toolchains/go/repo/REQUIREMENTS.md +9 -0
  36. package/examples/toolchains/go/repo/_gitignore +1 -0
  37. package/examples/toolchains/go/repo/go.mod +5 -0
  38. package/examples/toolchains/go/repo/go.sum +2 -0
  39. package/examples/toolchains/go/repo/label/label.go +9 -0
  40. package/examples/toolchains/go/repo/label/label_test.go +27 -0
  41. package/examples/toolchains/go/repo/label/version.go +9 -0
  42. package/examples/toolchains/go/task.json +25 -0
  43. package/examples/toolchains/mixed-go/bad/backend/label/label.go +9 -0
  44. package/examples/toolchains/mixed-go/bad/frontend/src/label.js +4 -0
  45. package/examples/toolchains/mixed-go/good/backend/label/label.go +9 -0
  46. package/examples/toolchains/mixed-go/good/frontend/src/label.js +4 -0
  47. package/examples/toolchains/mixed-go/policy.json +126 -0
  48. package/examples/toolchains/mixed-go/repo/REQUIREMENTS.md +9 -0
  49. package/examples/toolchains/mixed-go/repo/_gitignore +6 -0
  50. package/examples/toolchains/mixed-go/repo/backend/go.mod +3 -0
  51. package/examples/toolchains/mixed-go/repo/backend/label/label.go +9 -0
  52. package/examples/toolchains/mixed-go/repo/backend/label/label_test.go +30 -0
  53. package/examples/toolchains/mixed-go/repo/contract/check.mjs +17 -0
  54. package/examples/toolchains/mixed-go/repo/contract/label.json +9 -0
  55. package/examples/toolchains/mixed-go/repo/frontend/package.json +15 -0
  56. package/examples/toolchains/mixed-go/repo/frontend/pnpm-lock.yaml +22 -0
  57. package/examples/toolchains/mixed-go/repo/frontend/src/label.js +4 -0
  58. package/examples/toolchains/mixed-go/repo/frontend/test/label.test.js +11 -0
  59. package/examples/toolchains/mixed-go/task.json +25 -0
  60. package/examples/toolchains/mixed-python/bad/backend/src/fx_backend/__init__.py +6 -0
  61. package/examples/toolchains/mixed-python/bad/frontend/src/label.js +4 -0
  62. package/examples/toolchains/mixed-python/good/backend/src/fx_backend/__init__.py +6 -0
  63. package/examples/toolchains/mixed-python/good/frontend/src/label.js +4 -0
  64. package/examples/toolchains/mixed-python/policy.json +121 -0
  65. package/examples/toolchains/mixed-python/repo/REQUIREMENTS.md +9 -0
  66. package/examples/toolchains/mixed-python/repo/_gitignore +6 -0
  67. package/examples/toolchains/mixed-python/repo/backend/.python-version +1 -0
  68. package/examples/toolchains/mixed-python/repo/backend/pyproject.toml +19 -0
  69. package/examples/toolchains/mixed-python/repo/backend/src/fx_backend/__init__.py +6 -0
  70. package/examples/toolchains/mixed-python/repo/backend/tests/test_label.py +11 -0
  71. package/examples/toolchains/mixed-python/repo/backend/uv.lock +108 -0
  72. package/examples/toolchains/mixed-python/repo/contract/check.mjs +17 -0
  73. package/examples/toolchains/mixed-python/repo/contract/label.json +9 -0
  74. package/examples/toolchains/mixed-python/repo/frontend/package.json +15 -0
  75. package/examples/toolchains/mixed-python/repo/frontend/pnpm-lock.yaml +22 -0
  76. package/examples/toolchains/mixed-python/repo/frontend/src/label.js +4 -0
  77. package/examples/toolchains/mixed-python/repo/frontend/test/label.test.js +11 -0
  78. package/examples/toolchains/mixed-python/task.json +25 -0
  79. package/examples/toolchains/npm/bad/src/label.js +4 -0
  80. package/examples/toolchains/npm/good/src/label.js +4 -0
  81. package/examples/toolchains/npm/policy.json +82 -0
  82. package/examples/toolchains/npm/repo/REQUIREMENTS.md +9 -0
  83. package/examples/toolchains/npm/repo/_gitignore +4 -0
  84. package/examples/toolchains/npm/repo/package-lock.json +22 -0
  85. package/examples/toolchains/npm/repo/package.json +13 -0
  86. package/examples/toolchains/npm/repo/src/label.js +4 -0
  87. package/examples/toolchains/npm/repo/test/label.test.js +13 -0
  88. package/examples/toolchains/npm/task.json +25 -0
  89. package/examples/toolchains/pnpm/bad/packages/label/src/label.js +4 -0
  90. package/examples/toolchains/pnpm/good/packages/label/src/label.js +4 -0
  91. package/examples/toolchains/pnpm/policy.json +85 -0
  92. package/examples/toolchains/pnpm/repo/REQUIREMENTS.md +9 -0
  93. package/examples/toolchains/pnpm/repo/_gitignore +4 -0
  94. package/examples/toolchains/pnpm/repo/package.json +10 -0
  95. package/examples/toolchains/pnpm/repo/packages/checker/check.mjs +5 -0
  96. package/examples/toolchains/pnpm/repo/packages/checker/package.json +9 -0
  97. package/examples/toolchains/pnpm/repo/packages/label/package.json +14 -0
  98. package/examples/toolchains/pnpm/repo/packages/label/src/label.js +4 -0
  99. package/examples/toolchains/pnpm/repo/packages/label/test/label.test.js +13 -0
  100. package/examples/toolchains/pnpm/repo/pnpm-lock.yaml +29 -0
  101. package/examples/toolchains/pnpm/repo/pnpm-workspace.yaml +2 -0
  102. package/examples/toolchains/pnpm/task.json +25 -0
  103. package/examples/toolchains/python/bad/src/fx_label/__init__.py +6 -0
  104. package/examples/toolchains/python/good/src/fx_label/__init__.py +6 -0
  105. package/examples/toolchains/python/policy.json +80 -0
  106. package/examples/toolchains/python/repo/.python-version +1 -0
  107. package/examples/toolchains/python/repo/REQUIREMENTS.md +9 -0
  108. package/examples/toolchains/python/repo/_gitignore +5 -0
  109. package/examples/toolchains/python/repo/pyproject.toml +19 -0
  110. package/examples/toolchains/python/repo/src/fx_label/__init__.py +6 -0
  111. package/examples/toolchains/python/repo/tests/test_label.py +13 -0
  112. package/examples/toolchains/python/repo/uv.lock +108 -0
  113. package/examples/toolchains/python/task.json +25 -0
  114. package/examples/toolchains/turbo/bad/packages/label/src/label.js +4 -0
  115. package/examples/toolchains/turbo/good/packages/label/src/label.js +4 -0
  116. package/examples/toolchains/turbo/policy.json +110 -0
  117. package/examples/toolchains/turbo/repo/REQUIREMENTS.md +9 -0
  118. package/examples/toolchains/turbo/repo/_gitignore +4 -0
  119. package/examples/toolchains/turbo/repo/package.json +13 -0
  120. package/examples/toolchains/turbo/repo/packages/checker/check.mjs +5 -0
  121. package/examples/toolchains/turbo/repo/packages/checker/package.json +9 -0
  122. package/examples/toolchains/turbo/repo/packages/label/package.json +14 -0
  123. package/examples/toolchains/turbo/repo/packages/label/src/label.js +4 -0
  124. package/examples/toolchains/turbo/repo/packages/label/test/label.test.js +13 -0
  125. package/examples/toolchains/turbo/repo/pnpm-lock.yaml +94 -0
  126. package/examples/toolchains/turbo/repo/pnpm-workspace.yaml +2 -0
  127. package/examples/toolchains/turbo/repo/turbo.json +7 -0
  128. package/examples/toolchains/turbo/task.json +25 -0
  129. package/examples/turbo-starter/README.md +16 -0
  130. package/examples/turbo-starter/changes/issued-at-consumer-only.patch +12 -0
  131. package/examples/turbo-starter/changes/issued-at.patch +130 -0
  132. package/examples/turbo-starter/cleanup.mjs +58 -0
  133. package/examples/turbo-starter/graph.json +32 -0
  134. package/examples/turbo-starter/harness/acceptance/db-isolation.test.mjs +97 -0
  135. package/examples/turbo-starter/harness/acceptance/env-probe.test.mjs +75 -0
  136. package/examples/turbo-starter/harness/acceptance/generation.test.mjs +54 -0
  137. package/examples/turbo-starter/harness/acceptance/issued-at.test.mjs +43 -0
  138. package/examples/turbo-starter/harness/acceptance/lifecycle-probe.test.mjs +47 -0
  139. package/examples/turbo-starter/harness/compose-bridge.mjs +593 -0
  140. package/examples/turbo-starter/harness/compose.acceptance.yml +23 -0
  141. package/examples/turbo-starter/harness/env/backend.env.template +7 -0
  142. package/examples/turbo-starter/harness/env/compose.env.template +6 -0
  143. package/examples/turbo-starter/policy.json +109 -0
  144. package/examples/turbo-starter/policy.lifecycle.json +114 -0
  145. package/examples/turbo-starter/setup.mjs +352 -0
  146. package/examples/two-vendors/policy.json +30 -0
  147. package/lib/agents/cli-adapter.d.ts +48 -0
  148. package/lib/agents/cli-adapter.js +386 -0
  149. package/lib/agents/inspect.d.ts +6 -0
  150. package/lib/agents/inspect.js +46 -0
  151. package/lib/agents/probe-server.d.ts +2 -0
  152. package/lib/agents/probe-server.js +13 -0
  153. package/lib/agents/review-probe.d.ts +295 -0
  154. package/lib/agents/review-probe.js +872 -0
  155. package/lib/agents/runtime-events.d.ts +11 -0
  156. package/lib/agents/runtime-events.js +21 -0
  157. package/lib/agents/schemas.d.ts +217 -0
  158. package/lib/agents/schemas.js +124 -0
  159. package/lib/agents/usage.d.ts +8 -0
  160. package/lib/agents/usage.js +83 -0
  161. package/lib/cli.d.ts +2 -0
  162. package/lib/cli.js +491 -0
  163. package/lib/connectors/files.d.ts +108 -0
  164. package/lib/connectors/files.js +133 -0
  165. package/lib/contracts/checks.d.ts +307 -0
  166. package/lib/contracts/checks.js +181 -0
  167. package/lib/contracts/cli.d.ts +3895 -0
  168. package/lib/contracts/cli.js +664 -0
  169. package/lib/contracts/context.d.ts +135 -0
  170. package/lib/contracts/context.js +129 -0
  171. package/lib/contracts/digest.d.ts +9 -0
  172. package/lib/contracts/digest.js +22 -0
  173. package/lib/contracts/errors.d.ts +81 -0
  174. package/lib/contracts/errors.js +70 -0
  175. package/lib/contracts/events.d.ts +827 -0
  176. package/lib/contracts/events.js +258 -0
  177. package/lib/contracts/execution.d.ts +3216 -0
  178. package/lib/contracts/execution.js +872 -0
  179. package/lib/contracts/failure.d.ts +67 -0
  180. package/lib/contracts/failure.js +127 -0
  181. package/lib/contracts/index.d.ts +18 -0
  182. package/lib/contracts/index.js +18 -0
  183. package/lib/contracts/policy.d.ts +1080 -0
  184. package/lib/contracts/policy.js +544 -0
  185. package/lib/contracts/ports.d.ts +417 -0
  186. package/lib/contracts/ports.js +1 -0
  187. package/lib/contracts/primitives.d.ts +63 -0
  188. package/lib/contracts/primitives.js +73 -0
  189. package/lib/contracts/profiles.d.ts +336 -0
  190. package/lib/contracts/profiles.js +109 -0
  191. package/lib/contracts/published.d.ts +3237 -0
  192. package/lib/contracts/published.js +34 -0
  193. package/lib/contracts/result.d.ts +1280 -0
  194. package/lib/contracts/result.js +311 -0
  195. package/lib/contracts/review.d.ts +441 -0
  196. package/lib/contracts/review.js +477 -0
  197. package/lib/contracts/toolchain.d.ts +96 -0
  198. package/lib/contracts/toolchain.js +89 -0
  199. package/lib/contracts/version.d.ts +17 -0
  200. package/lib/contracts/version.js +17 -0
  201. package/lib/contracts/work.d.ts +173 -0
  202. package/lib/contracts/work.js +178 -0
  203. package/lib/control/base-move.d.ts +44 -0
  204. package/lib/control/base-move.js +90 -0
  205. package/lib/control/doctor.d.ts +50 -0
  206. package/lib/control/doctor.js +113 -0
  207. package/lib/control/harness.d.ts +1125 -0
  208. package/lib/control/harness.js +741 -0
  209. package/lib/control/provenance.d.ts +17 -0
  210. package/lib/control/provenance.js +25 -0
  211. package/lib/control/recovery.d.ts +237 -0
  212. package/lib/control/recovery.js +236 -0
  213. package/lib/control/review.d.ts +62 -0
  214. package/lib/control/review.js +178 -0
  215. package/lib/control/workflow.d.ts +247 -0
  216. package/lib/control/workflow.js +259 -0
  217. package/lib/engine/budget.d.ts +345 -0
  218. package/lib/engine/budget.js +278 -0
  219. package/lib/engine/classify.d.ts +8 -0
  220. package/lib/engine/classify.js +32 -0
  221. package/lib/engine/engine.d.ts +1527 -0
  222. package/lib/engine/engine.js +2259 -0
  223. package/lib/engine/failure.d.ts +1 -0
  224. package/lib/engine/failure.js +3 -0
  225. package/lib/engine/joint-runner.d.ts +257 -0
  226. package/lib/engine/joint-runner.js +254 -0
  227. package/lib/engine/measured.d.ts +15 -0
  228. package/lib/engine/measured.js +82 -0
  229. package/lib/engine/prompt.d.ts +66 -0
  230. package/lib/engine/prompt.js +131 -0
  231. package/lib/engine/property-recovery.d.ts +50 -0
  232. package/lib/engine/property-recovery.js +171 -0
  233. package/lib/engine/repair.d.ts +33 -0
  234. package/lib/engine/repair.js +82 -0
  235. package/lib/engine/result.d.ts +9 -0
  236. package/lib/engine/result.js +218 -0
  237. package/lib/engine/reuse.d.ts +80 -0
  238. package/lib/engine/reuse.js +102 -0
  239. package/lib/engine/runner.d.ts +360 -0
  240. package/lib/engine/runner.js +1836 -0
  241. package/lib/engine/standalone.d.ts +6 -0
  242. package/lib/engine/standalone.js +48 -0
  243. package/lib/engine/usage.d.ts +87 -0
  244. package/lib/engine/usage.js +165 -0
  245. package/lib/environment/isolation.d.ts +110 -0
  246. package/lib/environment/isolation.js +238 -0
  247. package/lib/environment/lifecycle.d.ts +40 -0
  248. package/lib/environment/lifecycle.js +197 -0
  249. package/lib/environment/live-calls.d.ts +14 -0
  250. package/lib/environment/live-calls.js +73 -0
  251. package/lib/environment/os-tools.d.ts +16 -0
  252. package/lib/environment/os-tools.js +35 -0
  253. package/lib/environment/process.d.ts +32 -0
  254. package/lib/environment/process.js +369 -0
  255. package/lib/environment/redaction.d.ts +22 -0
  256. package/lib/environment/redaction.js +102 -0
  257. package/lib/environment/resources.d.ts +31 -0
  258. package/lib/environment/resources.js +120 -0
  259. package/lib/index.d.ts +65 -0
  260. package/lib/index.js +67 -0
  261. package/lib/integrations/connector/commands.d.ts +358 -0
  262. package/lib/integrations/connector/commands.js +428 -0
  263. package/lib/integrations/connector/config.d.ts +215 -0
  264. package/lib/integrations/connector/config.js +214 -0
  265. package/lib/integrations/connector/delivery.d.ts +107 -0
  266. package/lib/integrations/connector/delivery.js +591 -0
  267. package/lib/integrations/connector/fake.d.ts +291 -0
  268. package/lib/integrations/connector/fake.js +786 -0
  269. package/lib/integrations/connector/history.d.ts +124 -0
  270. package/lib/integrations/connector/history.js +497 -0
  271. package/lib/integrations/connector/index.d.ts +16 -0
  272. package/lib/integrations/connector/index.js +16 -0
  273. package/lib/integrations/connector/redact.d.ts +19 -0
  274. package/lib/integrations/connector/redact.js +91 -0
  275. package/lib/integrations/connector/registry.d.ts +15 -0
  276. package/lib/integrations/connector/registry.js +43 -0
  277. package/lib/integrations/connector/snapshot.d.ts +131 -0
  278. package/lib/integrations/connector/snapshot.js +422 -0
  279. package/lib/integrations/connector/source.d.ts +37 -0
  280. package/lib/integrations/connector/source.js +73 -0
  281. package/lib/integrations/connector/steps.d.ts +71 -0
  282. package/lib/integrations/connector/steps.js +188 -0
  283. package/lib/integrations/connector/store.d.ts +140 -0
  284. package/lib/integrations/connector/store.js +277 -0
  285. package/lib/integrations/connector/summary.d.ts +38 -0
  286. package/lib/integrations/connector/summary.js +59 -0
  287. package/lib/integrations/connector/testing-worker.d.ts +1 -0
  288. package/lib/integrations/connector/testing-worker.js +81 -0
  289. package/lib/integrations/connector/testing.d.ts +205 -0
  290. package/lib/integrations/connector/testing.js +1615 -0
  291. package/lib/integrations/connector/transport.d.ts +240 -0
  292. package/lib/integrations/connector/transport.js +28 -0
  293. package/lib/integrations/memory/context.d.ts +120 -0
  294. package/lib/integrations/memory/context.js +239 -0
  295. package/lib/integrations/memory/index.d.ts +8 -0
  296. package/lib/integrations/memory/index.js +8 -0
  297. package/lib/integrations/memory/provider.d.ts +79 -0
  298. package/lib/integrations/memory/provider.js +22 -0
  299. package/lib/integrations/memory/sink.d.ts +56 -0
  300. package/lib/integrations/memory/sink.js +116 -0
  301. package/lib/integrations/memory/testing.d.ts +44 -0
  302. package/lib/integrations/memory/testing.js +61 -0
  303. package/lib/integrations/relay-v1/index.d.ts +122 -0
  304. package/lib/integrations/relay-v1/index.js +860 -0
  305. package/lib/integrations/relay-v2/index.d.ts +145 -0
  306. package/lib/integrations/relay-v2/index.js +752 -0
  307. package/lib/integrations/relay-v2/process.d.ts +32 -0
  308. package/lib/integrations/relay-v2/process.js +112 -0
  309. package/lib/integrations/relay-v2/protocol.d.ts +172 -0
  310. package/lib/integrations/relay-v2/protocol.js +142 -0
  311. package/lib/package.d.ts +2 -0
  312. package/lib/package.js +3 -0
  313. package/lib/profiles/resolve.d.ts +190 -0
  314. package/lib/profiles/resolve.js +273 -0
  315. package/lib/storage/document.d.ts +1234 -0
  316. package/lib/storage/document.js +80 -0
  317. package/lib/storage/sqlite.d.ts +35 -0
  318. package/lib/storage/sqlite.js +260 -0
  319. package/lib/testing/index.d.ts +5 -0
  320. package/lib/testing/index.js +5 -0
  321. package/lib/testing/store-contract.d.ts +8 -0
  322. package/lib/testing/store-contract.js +167 -0
  323. package/lib/toolchains/index.d.ts +9 -0
  324. package/lib/toolchains/index.js +9 -0
  325. package/lib/toolchains/inspect.d.ts +105 -0
  326. package/lib/toolchains/inspect.js +831 -0
  327. package/lib/toolchains/manifests.d.ts +67 -0
  328. package/lib/toolchains/manifests.js +238 -0
  329. package/lib/toolchains/probe.d.ts +28 -0
  330. package/lib/toolchains/probe.js +54 -0
  331. package/lib/toolchains/recipes.d.ts +33 -0
  332. package/lib/toolchains/recipes.js +51 -0
  333. package/lib/validate.d.ts +36 -0
  334. package/lib/validate.js +175 -0
  335. package/lib/verification/acceptance.d.ts +284 -0
  336. package/lib/verification/acceptance.js +670 -0
  337. package/lib/verification/checks.d.ts +72 -0
  338. package/lib/verification/checks.js +190 -0
  339. package/lib/verification/confirm.d.ts +125 -0
  340. package/lib/verification/confirm.js +411 -0
  341. package/lib/verification/corpus.d.ts +1303 -0
  342. package/lib/verification/corpus.js +744 -0
  343. package/lib/verification/dependencies.d.ts +66 -0
  344. package/lib/verification/dependencies.js +144 -0
  345. package/lib/verification/gates.d.ts +160 -0
  346. package/lib/verification/gates.js +600 -0
  347. package/lib/verification/joint.d.ts +63 -0
  348. package/lib/verification/joint.js +121 -0
  349. package/lib/verification/proof.d.ts +54 -0
  350. package/lib/verification/proof.js +96 -0
  351. package/lib/verification/property.d.ts +86 -0
  352. package/lib/verification/property.js +214 -0
  353. package/lib/verification/requirements.d.ts +25 -0
  354. package/lib/verification/requirements.js +69 -0
  355. package/lib/verification/self-check.d.ts +29 -0
  356. package/lib/verification/self-check.js +99 -0
  357. package/lib/verification/spike.d.ts +79 -0
  358. package/lib/verification/spike.js +124 -0
  359. package/package.json +100 -4
  360. package/profiles/expo-mobile.json +15 -0
  361. package/profiles/go-api.json +15 -0
  362. package/profiles/go-gotestsum.json +21 -0
  363. package/profiles/mobile-maestro.json +29 -0
  364. package/profiles/nest-api.json +26 -0
  365. package/profiles/next-product.json +72 -0
  366. package/profiles/node-checks.json +77 -0
  367. package/profiles/npm-ci.json +22 -0
  368. package/profiles/pnpm-frozen.json +24 -0
  369. package/profiles/python-api.json +32 -0
  370. package/profiles/python-uv.json +26 -0
  371. package/profiles/react-native.json +50 -0
  372. package/profiles/react-vite-admin.json +71 -0
  373. package/schemas/context-snapshot.schema.json +231 -0
  374. package/schemas/contract-document.schema.json +385 -0
  375. package/schemas/execution-document.schema.json +3695 -0
  376. package/schemas/execution-policy.schema.json +2196 -0
  377. package/schemas/joint-verification.schema.json +617 -0
  378. package/schemas/result-envelope.schema.json +1652 -0
  379. package/schemas/review-record.schema.json +177 -0
  380. package/schemas/run-event.schema.json +2458 -0
  381. package/schemas/run-result.schema.json +1570 -0
  382. package/schemas/stack-profile.schema.json +535 -0
  383. package/schemas/work-graph.schema.json +381 -0
  384. package/schemas/work-order.schema.json +256 -0
  385. package/skills/harness/SKILL.md +64 -0
  386. package/templates/AGENTS.md +13 -0
  387. package/templates/controller-mode/AGENTS.controller.md +58 -0
  388. package/templates/controller-mode/README.md +44 -0
  389. package/templates/graph.json +22 -0
  390. package/templates/policy.json +28 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Один вызов Relay-2 CLI: argv-массив без shell, ограниченные вывод и время,
3
+ * завершение всей группы процессов при таймауте, отмене или переполнении.
4
+ * Результат возвращается только после `close`: дочерний процесс к этому
5
+ * моменту завершён и собран (нет зомби), pipes закрыты.
6
+ */
7
+ export interface CliRun {
8
+ /** Процесс так и не стартовал (нет binary, нет прав): запрос не ушёл. */
9
+ spawnError?: NodeJS.ErrnoException;
10
+ /** Процесс стартовал (запрос мог дойти до backend). */
11
+ started: boolean;
12
+ code: number | null;
13
+ signal: NodeJS.Signals | null;
14
+ stdout: string;
15
+ stderr: string;
16
+ timedOut: boolean;
17
+ aborted: boolean;
18
+ /** Суммарный вывод превысил лимит; процесс остановлен. */
19
+ oversized: boolean;
20
+ durationMs: number;
21
+ pid?: number;
22
+ }
23
+ export interface CliRunOptions {
24
+ cwd: string;
25
+ env: Record<string, string>;
26
+ timeoutMs: number;
27
+ maxOutputBytes: number;
28
+ /** Пауза между SIGTERM и SIGKILL группе. */
29
+ killGraceMs: number;
30
+ signal?: AbortSignal;
31
+ }
32
+ export declare function runCli(file: string, args: string[], options: CliRunOptions): Promise<CliRun>;
@@ -0,0 +1,112 @@
1
+ import { spawn } from 'node:child_process';
2
+ export function runCli(file, args, options) {
3
+ const startedAt = Date.now();
4
+ if (options.signal?.aborted)
5
+ return Promise.resolve({
6
+ started: false,
7
+ code: null,
8
+ signal: null,
9
+ stdout: '',
10
+ stderr: '',
11
+ timedOut: false,
12
+ aborted: true,
13
+ oversized: false,
14
+ durationMs: 0,
15
+ });
16
+ return new Promise((resolve) => {
17
+ const posix = process.platform !== 'win32';
18
+ const child = spawn(file, args, {
19
+ cwd: options.cwd,
20
+ env: options.env,
21
+ shell: false,
22
+ // Своя группа: сигнал `-pid` достаёт и потомков binary.
23
+ detached: posix,
24
+ stdio: ['ignore', 'pipe', 'pipe'],
25
+ windowsHide: true,
26
+ });
27
+ const out = [];
28
+ const err = [];
29
+ let bytes = 0;
30
+ let timedOut = false;
31
+ let aborted = false;
32
+ let oversized = false;
33
+ let stopping = false;
34
+ let spawnError;
35
+ let killTimer;
36
+ const signalGroup = (sig) => {
37
+ try {
38
+ if (child.pid && posix)
39
+ process.kill(-child.pid, sig);
40
+ else
41
+ child.kill(sig);
42
+ }
43
+ catch {
44
+ /* Группа уже завершилась. */
45
+ }
46
+ };
47
+ const stop = () => {
48
+ if (stopping)
49
+ return;
50
+ stopping = true;
51
+ signalGroup('SIGTERM');
52
+ killTimer = setTimeout(() => signalGroup('SIGKILL'), options.killGraceMs);
53
+ };
54
+ const take = (chunks) => (d) => {
55
+ if (oversized)
56
+ return;
57
+ bytes += d.length;
58
+ if (bytes > options.maxOutputBytes) {
59
+ oversized = true;
60
+ stop();
61
+ return;
62
+ }
63
+ chunks.push(d);
64
+ };
65
+ child.stdout.on('data', take(out));
66
+ child.stderr.on('data', take(err));
67
+ const onAbort = () => {
68
+ aborted = true;
69
+ stop();
70
+ };
71
+ options.signal?.addEventListener('abort', onAbort, { once: true });
72
+ const timer = setTimeout(() => {
73
+ timedOut = true;
74
+ stop();
75
+ }, options.timeoutMs);
76
+ let done = false;
77
+ child.once('error', (e) => {
78
+ // `error` без pid — процесс не стартовал (ENOENT/EACCES): запрос не ушёл.
79
+ if (child.pid)
80
+ return;
81
+ spawnError = e;
82
+ finish(null, null);
83
+ });
84
+ child.once('close', (code, sig) => finish(code, sig));
85
+ const finish = (code, sig) => {
86
+ if (done)
87
+ return;
88
+ done = true;
89
+ clearTimeout(timer);
90
+ options.signal?.removeEventListener('abort', onAbort);
91
+ // Лидер группы вышел; оставшиеся потомки (если были) получают SIGKILL
92
+ // сразу, а не по таймеру.
93
+ if (stopping || code !== 0)
94
+ signalGroup('SIGKILL');
95
+ if (killTimer)
96
+ clearTimeout(killTimer);
97
+ resolve({
98
+ ...(spawnError ? { spawnError } : {}),
99
+ started: Boolean(child.pid) && !spawnError,
100
+ code,
101
+ signal: sig,
102
+ stdout: Buffer.concat(out).toString('utf8'),
103
+ stderr: Buffer.concat(err).toString('utf8'),
104
+ timedOut,
105
+ aborted,
106
+ oversized,
107
+ durationMs: Date.now() - startedAt,
108
+ ...(child.pid ? { pid: child.pid } : {}),
109
+ });
110
+ };
111
+ });
112
+ }
@@ -0,0 +1,172 @@
1
+ import { z } from 'zod';
2
+ import type { TransportErrorKind } from '../connector/transport.ts';
3
+ /**
4
+ * Договор вывода Relay-2 CLI (`--format json`), проверенный на сборке
5
+ * a3ee804: успех — одна JSON-строка `{ok:true,data,meta?}` в stdout и exit 0;
6
+ * отказ — `{ok:false,error:{code,message,details?}}` в stderr и ненулевой exit.
7
+ * Схемы проверяют только поля, которые читает адаптер; лишние поля допустимы.
8
+ */
9
+ export declare const successSchema: z.ZodObject<{
10
+ ok: z.ZodLiteral<true>;
11
+ data: z.ZodUnknown;
12
+ meta: z.ZodOptional<z.ZodUnknown>;
13
+ }, z.core.$strip>;
14
+ export declare const failureSchema: z.ZodObject<{
15
+ ok: z.ZodLiteral<false>;
16
+ error: z.ZodObject<{
17
+ code: z.ZodString;
18
+ message: z.ZodString;
19
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
20
+ }, z.core.$strip>;
21
+ }, z.core.$strip>;
22
+ export declare const columnSchema: z.ZodEnum<{
23
+ ready: "ready";
24
+ review: "review";
25
+ cancelled: "cancelled";
26
+ done: "done";
27
+ "in-progress": "in-progress";
28
+ inbox: "inbox";
29
+ }>;
30
+ export declare const criterionSchema: z.ZodObject<{
31
+ id: z.ZodString;
32
+ title: z.ZodString;
33
+ summary: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string | null | undefined>>;
34
+ description: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string | null | undefined>>;
35
+ completed: z.ZodBoolean;
36
+ }, z.core.$strip>;
37
+ export declare const commentSchema: z.ZodObject<{
38
+ id: z.ZodString;
39
+ title: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string | null | undefined>>;
40
+ body: z.ZodString;
41
+ createdAt: z.ZodString;
42
+ createdBy: z.ZodString;
43
+ }, z.core.$strip>;
44
+ export declare const taskSchema: z.ZodObject<{
45
+ id: z.ZodString;
46
+ kind: z.ZodLiteral<string>;
47
+ key: z.ZodString;
48
+ revision: z.ZodNumber;
49
+ createdAt: z.ZodOptional<z.ZodString>;
50
+ createdBy: z.ZodOptional<z.ZodString>;
51
+ data: z.ZodObject<{
52
+ title: z.ZodString;
53
+ description: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string | null | undefined>>;
54
+ column: z.ZodEnum<{
55
+ ready: "ready";
56
+ review: "review";
57
+ cancelled: "cancelled";
58
+ done: "done";
59
+ "in-progress": "in-progress";
60
+ inbox: "inbox";
61
+ }>;
62
+ parentId: z.ZodNullable<z.ZodString>;
63
+ dependencies: z.ZodArray<z.ZodString>;
64
+ acceptanceCriteria: z.ZodArray<z.ZodObject<{
65
+ id: z.ZodString;
66
+ title: z.ZodString;
67
+ summary: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string | null | undefined>>;
68
+ description: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string | null | undefined>>;
69
+ completed: z.ZodBoolean;
70
+ }, z.core.$strip>>;
71
+ comments: z.ZodOptional<z.ZodArray<z.ZodObject<{
72
+ id: z.ZodString;
73
+ title: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string | null | undefined>>;
74
+ body: z.ZodString;
75
+ createdAt: z.ZodString;
76
+ createdBy: z.ZodString;
77
+ }, z.core.$strip>>>;
78
+ }, z.core.$strip>;
79
+ }, z.core.$strip>;
80
+ export declare const progressSchema: z.ZodObject<{
81
+ completed: z.ZodBoolean;
82
+ canComplete: z.ZodBoolean;
83
+ blockers: z.ZodArray<z.ZodString>;
84
+ }, z.core.$strip>;
85
+ export declare const documentSchema: z.ZodObject<{
86
+ id: z.ZodString;
87
+ kind: z.ZodLiteral<string>;
88
+ key: z.ZodString;
89
+ revision: z.ZodNumber;
90
+ createdAt: z.ZodOptional<z.ZodString>;
91
+ createdBy: z.ZodOptional<z.ZodString>;
92
+ data: z.ZodObject<{
93
+ name: z.ZodString;
94
+ body: z.ZodString;
95
+ }, z.core.$strip>;
96
+ }, z.core.$strip>;
97
+ export declare const sessionSchema: z.ZodObject<{
98
+ id: z.ZodString;
99
+ kind: z.ZodLiteral<string>;
100
+ key: z.ZodString;
101
+ revision: z.ZodNumber;
102
+ createdAt: z.ZodOptional<z.ZodString>;
103
+ createdBy: z.ZodOptional<z.ZodString>;
104
+ data: z.ZodObject<{
105
+ title: z.ZodString;
106
+ description: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string | null | undefined>>;
107
+ status: z.ZodEnum<{
108
+ open: "open";
109
+ cancelled: "cancelled";
110
+ pending: "pending";
111
+ completed: "completed";
112
+ paused: "paused";
113
+ }>;
114
+ currentRunId: z.ZodNullable<z.ZodString>;
115
+ parentSessionId: z.ZodNullable<z.ZodString>;
116
+ result: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string | null | undefined>>;
117
+ }, z.core.$strip>;
118
+ }, z.core.$strip>;
119
+ export declare const checkpointSchema: z.ZodObject<{
120
+ id: z.ZodString;
121
+ kind: z.ZodLiteral<string>;
122
+ key: z.ZodString;
123
+ revision: z.ZodNumber;
124
+ createdAt: z.ZodOptional<z.ZodString>;
125
+ createdBy: z.ZodOptional<z.ZodString>;
126
+ data: z.ZodObject<{
127
+ kind: z.ZodEnum<{
128
+ result: "result";
129
+ cancel: "cancel";
130
+ intent: "intent";
131
+ progress: "progress";
132
+ }>;
133
+ sessionId: z.ZodString;
134
+ runId: z.ZodString;
135
+ intentId: z.ZodNullable<z.ZodString>;
136
+ title: z.ZodString;
137
+ body: z.ZodString;
138
+ }, z.core.$strip>;
139
+ }, z.core.$strip>;
140
+ export declare const storageStatusSchema: z.ZodObject<{
141
+ projectId: z.ZodString;
142
+ databasePath: z.ZodString;
143
+ generation: z.ZodNumber;
144
+ }, z.core.$strip>;
145
+ export declare const projectSchema: z.ZodObject<{
146
+ id: z.ZodString;
147
+ kind: z.ZodLiteral<string>;
148
+ key: z.ZodString;
149
+ revision: z.ZodNumber;
150
+ createdAt: z.ZodOptional<z.ZodString>;
151
+ createdBy: z.ZodOptional<z.ZodString>;
152
+ data: z.ZodObject<{
153
+ name: z.ZodString;
154
+ }, z.core.$strip>;
155
+ }, z.core.$strip>;
156
+ export declare const doctorSchema: z.ZodObject<{
157
+ projectId: z.ZodString;
158
+ generation: z.ZodNumber;
159
+ valid: z.ZodBoolean;
160
+ issues: z.ZodArray<z.ZodUnknown>;
161
+ }, z.core.$strip>;
162
+ export declare const pageMetaSchema: z.ZodObject<{
163
+ page: z.ZodObject<{
164
+ nextCursor: z.ZodNullable<z.ZodString>;
165
+ consistency: z.ZodOptional<z.ZodString>;
166
+ }, z.core.$strip>;
167
+ }, z.core.$strip>;
168
+ export declare const itemsSchema: z.ZodObject<{
169
+ items: z.ZodArray<z.ZodUnknown>;
170
+ }, z.core.$strip>;
171
+ /** Стабильный код Relay-2 → класс отказа транспорта. Exit code — только грубый класс. */
172
+ export declare function classifyCode(code: string, exit: number | null, mutation: boolean): TransportErrorKind;
@@ -0,0 +1,142 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Договор вывода Relay-2 CLI (`--format json`), проверенный на сборке
4
+ * a3ee804: успех — одна JSON-строка `{ok:true,data,meta?}` в stdout и exit 0;
5
+ * отказ — `{ok:false,error:{code,message,details?}}` в stderr и ненулевой exit.
6
+ * Схемы проверяют только поля, которые читает адаптер; лишние поля допустимы.
7
+ */
8
+ export const successSchema = z.object({
9
+ ok: z.literal(true),
10
+ data: z.unknown(),
11
+ meta: z.unknown().optional(),
12
+ });
13
+ export const failureSchema = z.object({
14
+ ok: z.literal(false),
15
+ error: z.object({
16
+ code: z.string().min(1),
17
+ message: z.string(),
18
+ details: z.record(z.string(), z.unknown()).optional(),
19
+ }),
20
+ });
21
+ const nullableText = z
22
+ .string()
23
+ .nullable()
24
+ .optional()
25
+ .transform((v) => v ?? '');
26
+ export const columnSchema = z.enum([
27
+ 'inbox',
28
+ 'ready',
29
+ 'in-progress',
30
+ 'review',
31
+ 'done',
32
+ 'cancelled',
33
+ ]);
34
+ /** Общий envelope записи: `{id, kind, key, revision, …, data}`. */
35
+ const envelope = (kind, data) => z.object({
36
+ id: z.string().min(1),
37
+ kind: z.literal(kind),
38
+ key: z.string().min(1),
39
+ revision: z.number().int().positive(),
40
+ createdAt: z.string().optional(),
41
+ createdBy: z.string().optional(),
42
+ data,
43
+ });
44
+ export const criterionSchema = z.object({
45
+ id: z.string().min(1),
46
+ title: z.string(),
47
+ summary: nullableText,
48
+ description: nullableText,
49
+ completed: z.boolean(),
50
+ });
51
+ export const commentSchema = z.object({
52
+ id: z.string().min(1),
53
+ title: nullableText,
54
+ body: z.string(),
55
+ createdAt: z.string(),
56
+ createdBy: z.string(),
57
+ });
58
+ export const taskSchema = envelope('task', z.object({
59
+ title: z.string(),
60
+ description: nullableText,
61
+ column: columnSchema,
62
+ parentId: z.string().nullable(),
63
+ dependencies: z.array(z.string()),
64
+ acceptanceCriteria: z.array(criterionSchema),
65
+ comments: z.array(commentSchema).optional(),
66
+ }));
67
+ export const progressSchema = z.object({
68
+ completed: z.boolean(),
69
+ canComplete: z.boolean(),
70
+ blockers: z.array(z.string()),
71
+ });
72
+ export const documentSchema = envelope('document', z.object({ name: z.string(), body: z.string() }));
73
+ export const sessionSchema = envelope('work-session', z.object({
74
+ title: z.string(),
75
+ description: nullableText,
76
+ status: z.enum(['pending', 'open', 'paused', 'completed', 'cancelled']),
77
+ currentRunId: z.string().nullable(),
78
+ parentSessionId: z.string().nullable(),
79
+ result: nullableText,
80
+ }));
81
+ export const checkpointSchema = envelope('work-checkpoint', z.object({
82
+ kind: z.enum(['intent', 'progress', 'result', 'cancel']),
83
+ sessionId: z.string().min(1),
84
+ runId: z.string().min(1),
85
+ intentId: z.string().nullable(),
86
+ title: z.string(),
87
+ body: z.string(),
88
+ }));
89
+ export const storageStatusSchema = z.object({
90
+ projectId: z.string().min(1),
91
+ databasePath: z.string().min(1),
92
+ generation: z.number().int().nonnegative(),
93
+ });
94
+ export const projectSchema = envelope('project', z.object({ name: z.string() }));
95
+ export const doctorSchema = z.object({
96
+ projectId: z.string().min(1),
97
+ generation: z.number().int().nonnegative(),
98
+ valid: z.boolean(),
99
+ issues: z.array(z.unknown()),
100
+ });
101
+ export const pageMetaSchema = z.object({
102
+ page: z.object({
103
+ nextCursor: z.string().min(1).nullable(),
104
+ consistency: z.string().optional(),
105
+ }),
106
+ });
107
+ export const itemsSchema = z.object({ items: z.array(z.unknown()) });
108
+ /** Стабильный код Relay-2 → класс отказа транспорта. Exit code — только грубый класс. */
109
+ export function classifyCode(code, exit, mutation) {
110
+ switch (code) {
111
+ case 'REVISION_CONFLICT':
112
+ case 'SNAPSHOT_CONFLICT':
113
+ case 'CONFLICT':
114
+ case 'STORAGE_BUSY':
115
+ return 'conflict';
116
+ case 'TASK_INCOMPLETE':
117
+ case 'TASK_DONE':
118
+ case 'TASK_CYCLE':
119
+ case 'ACTOR_REQUIRED':
120
+ case 'CONFLICTING_OPTIONS':
121
+ case 'PROJECT_REQUIRED':
122
+ case 'WORKSPACE_REQUIRED':
123
+ case 'INVALID_CONFIG':
124
+ return 'refused';
125
+ case 'NOT_FOUND':
126
+ case 'PROJECT_NOT_FOUND':
127
+ case 'CONFIG_NOT_FOUND':
128
+ return 'not-found';
129
+ }
130
+ if (code.startsWith('INVALID_') || code === 'VALIDATION_ERROR')
131
+ return 'refused';
132
+ // Неизвестный код: класс по exit. 2 — вход, 3 — нет записи, 4 — состояние;
133
+ // все три — проверенный отказ до записи. Иное (1, сигнал) — сбой backend:
134
+ // для мутации исход неизвестен.
135
+ if (exit === 2)
136
+ return 'refused';
137
+ if (exit === 3)
138
+ return 'not-found';
139
+ if (exit === 4)
140
+ return 'conflict';
141
+ return mutation ? 'uncertain' : 'unavailable';
142
+ }
@@ -0,0 +1,2 @@
1
+ /** Версия пакета читается из его собственного package.json, а не из cwd. */
2
+ export declare const HARNESS_VERSION: string;
package/lib/package.js ADDED
@@ -0,0 +1,3 @@
1
+ import { readFileSync } from 'node:fs';
2
+ /** Версия пакета читается из его собственного package.json, а не из cwd. */
3
+ export const HARNESS_VERSION = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
@@ -0,0 +1,190 @@
1
+ import { z } from 'zod';
2
+ import { repositoryPolicySchema, type ProfilePin, type ResolvedProfile } from '../contracts/index.ts';
3
+ /** Встроенные профили пакета: `profiles/<id>.json` рядом с `lib/`. */
4
+ export declare const builtinProfilesRoot: string;
5
+ export interface ResolveProfileOptions {
6
+ /** Корень репозитория, внутри которого лежат локальные профили (`./file.json`). */
7
+ repository?: string;
8
+ /** ID репозитория в политике; записывается в источник локального профиля. */
9
+ repositoryId?: string;
10
+ /** Каталог встроенных профилей; по умолчанию — профили пакета. */
11
+ builtinRoot?: string;
12
+ }
13
+ /** ID встроенных профилей пакета. */
14
+ export declare function builtinProfiles(root?: string): string[];
15
+ /**
16
+ * Разрешение профиля: встроенный ID или относительный `./file.json` внутри
17
+ * репозитория, слои `extends` в глубину, без циклов и не больше 32 файлов.
18
+ * Только чтение манифестов — ни одна команда проекта не исполняется.
19
+ *
20
+ * Слои складываются: gates, подготовка, возможности, защищённые и
21
+ * генерируемые пути — объединением; окружение и lifecycle — только из одного
22
+ * слоя (иначе конфликт); параллельность — наименьшая, время попытки —
23
+ * наибольшее; роли и инструкции стека — по ID, надстройка уточняет базу.
24
+ * Итоговый профиль обязан иметь test gate с JUnit: зелёный выход без отчёта
25
+ * ничего не доказывает. Файлы локальных слоёв становятся защищёнными путями.
26
+ */
27
+ export declare function resolveProfile(ref: string, options?: ResolveProfileOptions): ResolvedProfile;
28
+ export declare const profilePin: (p: ResolvedProfile) => ProfilePin;
29
+ type RepositoryInput = z.input<typeof repositoryPolicySchema>;
30
+ /**
31
+ * Описание репозитория политики из профиля. Явные значения `own` сильнее
32
+ * профиля и ничего не дополняют молча: `shadowed` называет поля, которые
33
+ * профиль задаёт иначе, а `own` переопределяет, — иначе обновлённый профиль с
34
+ * новым gate «применялся бы», не доходя до политики.
35
+ */
36
+ export declare function repositoryFromProfile(profile: ResolvedProfile, own: Pick<RepositoryInput, 'id' | 'path' | 'targetRef'> & Partial<RepositoryInput>): {
37
+ repository: {
38
+ id: string;
39
+ path: string;
40
+ kind: "product" | "library";
41
+ targetRef: string;
42
+ dependsOn: string[];
43
+ gates: ({
44
+ kind: "test";
45
+ report: {
46
+ type: "junit";
47
+ path: string;
48
+ };
49
+ id: string;
50
+ command: string[];
51
+ timeoutMs: number;
52
+ property?: {
53
+ path?: string | undefined;
54
+ } | undefined;
55
+ dependsOn?: string[] | undefined;
56
+ cwd?: string | undefined;
57
+ resources?: string[] | undefined;
58
+ } | {
59
+ kind: "check";
60
+ id: string;
61
+ command: string[];
62
+ timeoutMs: number;
63
+ report?: {
64
+ type: "junit";
65
+ path: string;
66
+ } | undefined;
67
+ property?: {
68
+ path?: string | undefined;
69
+ } | undefined;
70
+ dependsOn?: string[] | undefined;
71
+ cwd?: string | undefined;
72
+ resources?: string[] | undefined;
73
+ })[];
74
+ protectedPaths: string[];
75
+ generatedPaths: string[];
76
+ prepare: {
77
+ id: string;
78
+ command: string[];
79
+ timeoutMs: number;
80
+ }[];
81
+ dependencyBuild: {
82
+ id: string;
83
+ command: string[];
84
+ timeoutMs: number;
85
+ }[];
86
+ dependencyArtifacts: string[];
87
+ preflight: {
88
+ id: string;
89
+ command: string[];
90
+ timeoutMs: number;
91
+ }[];
92
+ roles?: Record<string, {
93
+ writer: {
94
+ runtime: "codex" | "claude" | "fixture";
95
+ model?: string | undefined;
96
+ effort?: "low" | "medium" | "high" | "xhigh" | undefined;
97
+ toolProfile?: string | undefined;
98
+ };
99
+ requiresContract: boolean;
100
+ writePaths?: string[] | undefined;
101
+ review?: {
102
+ reviewer: {
103
+ runtime: "codex" | "claude" | "fixture";
104
+ model?: string | undefined;
105
+ effort?: "low" | "medium" | "high" | "xhigh" | undefined;
106
+ toolProfile?: string | undefined;
107
+ };
108
+ vendor: "different-vendor" | "same-vendor-allowed";
109
+ alternates?: {
110
+ runtime: "codex" | "claude" | "fixture";
111
+ model?: string | undefined;
112
+ effort?: "low" | "medium" | "high" | "xhigh" | undefined;
113
+ toolProfile?: string | undefined;
114
+ }[] | undefined;
115
+ } | undefined;
116
+ }> | undefined;
117
+ review?: {
118
+ reviewer: {
119
+ runtime: "codex" | "claude" | "fixture";
120
+ model?: string | undefined;
121
+ effort?: "low" | "medium" | "high" | "xhigh" | undefined;
122
+ toolProfile?: string | undefined;
123
+ };
124
+ vendor: "different-vendor" | "same-vendor-allowed";
125
+ alternates?: {
126
+ runtime: "codex" | "claude" | "fixture";
127
+ model?: string | undefined;
128
+ effort?: "low" | "medium" | "high" | "xhigh" | undefined;
129
+ toolProfile?: string | undefined;
130
+ }[] | undefined;
131
+ } | undefined;
132
+ gateGroups?: Record<string, string[]> | undefined;
133
+ environment?: {
134
+ inherit: string[];
135
+ values: Record<string, string>;
136
+ secrets: Record<string, string>;
137
+ } | undefined;
138
+ lifecycle?: {
139
+ setup: {
140
+ id: string;
141
+ command: string[];
142
+ timeoutMs: number;
143
+ }[];
144
+ ready: {
145
+ id: string;
146
+ command: string[];
147
+ timeoutMs: number;
148
+ }[];
149
+ teardown: {
150
+ id: string;
151
+ command: string[];
152
+ timeoutMs: number;
153
+ }[];
154
+ } | undefined;
155
+ toolchain?: {
156
+ tools: Record<string, string>;
157
+ packageManagers: Record<string, "npm" | "pnpm">;
158
+ } | undefined;
159
+ };
160
+ shadowed: ("gates" | "prepare" | "protectedPaths" | "generatedPaths" | "environment" | "lifecycle" | "toolchain")[];
161
+ };
162
+ /** Роли профиля в форме политики: writer, область записи и правило ревью кода роли. */
163
+ export declare function profileRoles(profile: ResolvedProfile): {
164
+ [k: string]: {
165
+ writer: {
166
+ runtime: "codex" | "claude" | "fixture";
167
+ model?: string | undefined;
168
+ effort?: "low" | "medium" | "high" | "xhigh" | undefined;
169
+ toolProfile?: string | undefined;
170
+ };
171
+ requiresContract: boolean;
172
+ writePaths?: string[] | undefined;
173
+ review?: {
174
+ reviewer: {
175
+ runtime: "codex" | "claude" | "fixture";
176
+ model?: string | undefined;
177
+ effort?: "low" | "medium" | "high" | "xhigh" | undefined;
178
+ toolProfile?: string | undefined;
179
+ };
180
+ vendor: "different-vendor" | "same-vendor-allowed";
181
+ alternates?: {
182
+ runtime: "codex" | "claude" | "fixture";
183
+ model?: string | undefined;
184
+ effort?: "low" | "medium" | "high" | "xhigh" | undefined;
185
+ toolProfile?: string | undefined;
186
+ }[] | undefined;
187
+ } | undefined;
188
+ };
189
+ };
190
+ export {};