@aperant/framework 0.8.1 → 0.8.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 (308) hide show
  1. package/CHANGELOG.md +443 -1
  2. package/agents/apt-planner.md +39 -7
  3. package/dist/cli/commands/adr.mjs +1 -1
  4. package/dist/cli/commands/audit-branch-current.d.mts +25 -0
  5. package/dist/cli/commands/audit-branch-current.d.mts.map +1 -0
  6. package/dist/cli/commands/audit-branch-current.mjs +252 -0
  7. package/dist/cli/commands/audit-branch-current.mjs.map +1 -0
  8. package/dist/cli/commands/audit.d.mts.map +1 -1
  9. package/dist/cli/commands/audit.mjs +13 -2
  10. package/dist/cli/commands/audit.mjs.map +1 -1
  11. package/dist/cli/commands/check-version.d.mts.map +1 -1
  12. package/dist/cli/commands/check-version.mjs +19 -1
  13. package/dist/cli/commands/check-version.mjs.map +1 -1
  14. package/dist/cli/commands/context.mjs +3 -3
  15. package/dist/cli/commands/context.mjs.map +1 -1
  16. package/dist/cli/commands/coverage-check.d.mts.map +1 -1
  17. package/dist/cli/commands/coverage-check.mjs +74 -7
  18. package/dist/cli/commands/coverage-check.mjs.map +1 -1
  19. package/dist/cli/commands/detect-runtime.d.mts +6 -0
  20. package/dist/cli/commands/detect-runtime.d.mts.map +1 -0
  21. package/dist/cli/commands/detect-runtime.mjs +142 -0
  22. package/dist/cli/commands/detect-runtime.mjs.map +1 -0
  23. package/dist/cli/commands/driver-doctor.d.mts +29 -0
  24. package/dist/cli/commands/driver-doctor.d.mts.map +1 -0
  25. package/dist/cli/commands/driver-doctor.mjs +291 -0
  26. package/dist/cli/commands/driver-doctor.mjs.map +1 -0
  27. package/dist/cli/commands/gate.mjs +14 -0
  28. package/dist/cli/commands/gate.mjs.map +1 -1
  29. package/dist/cli/commands/init.d.mts.map +1 -1
  30. package/dist/cli/commands/init.mjs +9 -6
  31. package/dist/cli/commands/init.mjs.map +1 -1
  32. package/dist/cli/commands/install-from-source.d.mts +2 -0
  33. package/dist/cli/commands/install-from-source.d.mts.map +1 -0
  34. package/dist/cli/commands/install-from-source.mjs +2 -0
  35. package/dist/cli/commands/install-from-source.mjs.map +1 -0
  36. package/dist/cli/commands/modes.mjs +1 -1
  37. package/dist/cli/commands/route.d.mts.map +1 -1
  38. package/dist/cli/commands/route.mjs +38 -1
  39. package/dist/cli/commands/route.mjs.map +1 -1
  40. package/dist/cli/commands/triage.mjs +1 -1
  41. package/dist/cli/config/load.d.mts.map +1 -1
  42. package/dist/cli/config/load.mjs +9 -3
  43. package/dist/cli/config/load.mjs.map +1 -1
  44. package/dist/cli/coordination/auto-emit-artifact-ready.mjs +1 -1
  45. package/dist/cli/coordination/event-schema.d.mts.map +1 -1
  46. package/dist/cli/coordination/event-schema.mjs +18 -0
  47. package/dist/cli/coordination/event-schema.mjs.map +1 -1
  48. package/dist/cli/coverage-check/user-outcomes.d.mts +84 -0
  49. package/dist/cli/coverage-check/user-outcomes.d.mts.map +1 -0
  50. package/dist/cli/coverage-check/user-outcomes.mjs +265 -0
  51. package/dist/cli/coverage-check/user-outcomes.mjs.map +1 -0
  52. package/dist/cli/dispatch.d.mts.map +1 -1
  53. package/dist/cli/dispatch.mjs +18 -1
  54. package/dist/cli/dispatch.mjs.map +1 -1
  55. package/dist/cli/gate/context.d.mts +1 -0
  56. package/dist/cli/gate/context.d.mts.map +1 -1
  57. package/dist/cli/gate/context.mjs +14 -1
  58. package/dist/cli/gate/context.mjs.map +1 -1
  59. package/dist/cli/gate/gates/consistency-check.d.mts +1 -0
  60. package/dist/cli/gate/gates/consistency-check.d.mts.map +1 -1
  61. package/dist/cli/gate/gates/consistency-check.mjs +1 -0
  62. package/dist/cli/gate/gates/consistency-check.mjs.map +1 -1
  63. package/dist/cli/gate/gates/review-clean.d.mts +1 -0
  64. package/dist/cli/gate/gates/review-clean.d.mts.map +1 -1
  65. package/dist/cli/gate/gates/review-clean.mjs +1 -0
  66. package/dist/cli/gate/gates/review-clean.mjs.map +1 -1
  67. package/dist/cli/gate/gates/verify-approved.d.mts +1 -0
  68. package/dist/cli/gate/gates/verify-approved.d.mts.map +1 -1
  69. package/dist/cli/gate/gates/verify-approved.mjs +1 -0
  70. package/dist/cli/gate/gates/verify-approved.mjs.map +1 -1
  71. package/dist/cli/gate/registry.d.mts.map +1 -1
  72. package/dist/cli/gate/registry.mjs +9 -1
  73. package/dist/cli/gate/registry.mjs.map +1 -1
  74. package/dist/cli/host/detect.mjs +1 -1
  75. package/dist/cli/host/detect.mjs.map +1 -1
  76. package/dist/cli/install/find-workspace-framework-version.d.mts +16 -0
  77. package/dist/cli/install/find-workspace-framework-version.d.mts.map +1 -0
  78. package/dist/cli/install/find-workspace-framework-version.mjs +85 -0
  79. package/dist/cli/install/find-workspace-framework-version.mjs.map +1 -0
  80. package/dist/cli/install/install-from-source.d.mts +10 -0
  81. package/dist/cli/install/install-from-source.d.mts.map +1 -0
  82. package/dist/cli/install/install-from-source.mjs +271 -0
  83. package/dist/cli/install/install-from-source.mjs.map +1 -0
  84. package/dist/cli/install/install-kernel.d.mts.map +1 -1
  85. package/dist/cli/install/install-kernel.mjs +24 -0
  86. package/dist/cli/install/install-kernel.mjs.map +1 -1
  87. package/dist/cli/install/legacy-paths.d.mts +33 -11
  88. package/dist/cli/install/legacy-paths.d.mts.map +1 -1
  89. package/dist/cli/install/legacy-paths.mjs +163 -39
  90. package/dist/cli/install/legacy-paths.mjs.map +1 -1
  91. package/dist/cli/install/runtime-detect.mjs +1 -1
  92. package/dist/cli/install/runtime-detect.mjs.map +1 -1
  93. package/dist/cli/install/runtime-migrate.d.mts +34 -14
  94. package/dist/cli/install/runtime-migrate.d.mts.map +1 -1
  95. package/dist/cli/install/runtime-migrate.mjs +63 -30
  96. package/dist/cli/install/runtime-migrate.mjs.map +1 -1
  97. package/dist/cli/install/transforms/codex.d.mts.map +1 -1
  98. package/dist/cli/install/transforms/codex.mjs +28 -17
  99. package/dist/cli/install/transforms/codex.mjs.map +1 -1
  100. package/dist/cli/skill-author/contract.mjs +2 -2
  101. package/dist/cli/skill-author/contract.mjs.map +1 -1
  102. package/dist/cli/verify-proof/audit.d.mts +34 -0
  103. package/dist/cli/verify-proof/audit.d.mts.map +1 -0
  104. package/dist/cli/verify-proof/audit.mjs +53 -0
  105. package/dist/cli/verify-proof/audit.mjs.map +1 -0
  106. package/dist/cli/verify-proof/exec.d.mts +20 -0
  107. package/dist/cli/verify-proof/exec.d.mts.map +1 -0
  108. package/dist/cli/verify-proof/exec.mjs +74 -0
  109. package/dist/cli/verify-proof/exec.mjs.map +1 -0
  110. package/dist/cli/verify-proof/idl/index.d.mts +2 -0
  111. package/dist/cli/verify-proof/idl/index.d.mts.map +1 -0
  112. package/dist/cli/verify-proof/idl/index.mjs +13 -0
  113. package/dist/cli/verify-proof/idl/index.mjs.map +1 -0
  114. package/dist/cli/verify-proof/idl/types.d.ts +10 -0
  115. package/dist/cli/verify-proof/idl/types.d.ts.map +1 -0
  116. package/dist/cli/verify-proof/idl/types.js +10 -0
  117. package/dist/cli/verify-proof/idl/types.js.map +1 -0
  118. package/dist/cli/verify-proof/manifest-validator.d.mts +19 -0
  119. package/dist/cli/verify-proof/manifest-validator.d.mts.map +1 -0
  120. package/dist/cli/verify-proof/manifest-validator.mjs +182 -0
  121. package/dist/cli/verify-proof/manifest-validator.mjs.map +1 -0
  122. package/dist/cli/verify-proof/resolver.d.mts +105 -0
  123. package/dist/cli/verify-proof/resolver.d.mts.map +1 -0
  124. package/dist/cli/verify-proof/resolver.mjs +320 -0
  125. package/dist/cli/verify-proof/resolver.mjs.map +1 -0
  126. package/dist/cli/verify-proof/runtime-detect.d.mts +30 -0
  127. package/dist/cli/verify-proof/runtime-detect.d.mts.map +1 -0
  128. package/dist/cli/verify-proof/runtime-detect.mjs +209 -0
  129. package/dist/cli/verify-proof/runtime-detect.mjs.map +1 -0
  130. package/dist/cli/verify-proof/trust.d.mts +70 -0
  131. package/dist/cli/verify-proof/trust.d.mts.map +1 -0
  132. package/dist/cli/verify-proof/trust.mjs +174 -0
  133. package/dist/cli/verify-proof/trust.mjs.map +1 -0
  134. package/dist/driver-sdk/conformance.d.ts +41 -0
  135. package/dist/driver-sdk/conformance.d.ts.map +1 -0
  136. package/dist/driver-sdk/conformance.js +123 -0
  137. package/dist/driver-sdk/conformance.js.map +1 -0
  138. package/dist/driver-sdk/errors.d.ts +75 -0
  139. package/dist/driver-sdk/errors.d.ts.map +1 -0
  140. package/dist/driver-sdk/errors.js +80 -0
  141. package/dist/driver-sdk/errors.js.map +1 -0
  142. package/dist/driver-sdk/idl.d.ts +221 -0
  143. package/dist/driver-sdk/idl.d.ts.map +1 -0
  144. package/dist/driver-sdk/idl.js +140 -0
  145. package/dist/driver-sdk/idl.js.map +1 -0
  146. package/dist/driver-sdk/index.d.ts +28 -0
  147. package/dist/driver-sdk/index.d.ts.map +1 -0
  148. package/dist/driver-sdk/index.js +28 -0
  149. package/dist/driver-sdk/index.js.map +1 -0
  150. package/dist/driver-sdk/manifest.d.ts +93 -0
  151. package/dist/driver-sdk/manifest.d.ts.map +1 -0
  152. package/dist/driver-sdk/manifest.js +12 -0
  153. package/dist/driver-sdk/manifest.js.map +1 -0
  154. package/dist/driver-sdk/retry.d.ts +33 -0
  155. package/dist/driver-sdk/retry.d.ts.map +1 -0
  156. package/dist/driver-sdk/retry.js +50 -0
  157. package/dist/driver-sdk/retry.js.map +1 -0
  158. package/dist/plugin/.claude-plugin/plugin.json +4 -1
  159. package/dist/plugin/agents/apt-planner.md +39 -7
  160. package/dist/plugin/skills/apt/SKILL.md +75 -6
  161. package/dist/plugin/skills/apt-caveman/SKILL.md +64 -0
  162. package/dist/plugin/skills/apt-debug/SKILL.md +36 -4
  163. package/dist/plugin/skills/apt-debug/appendices/diagnose-discipline.md +2 -11
  164. package/dist/plugin/skills/apt-discuss/SKILL.md +4 -4
  165. package/dist/plugin/skills/apt-discuss/appendices/grill-discipline.md +2 -11
  166. package/dist/plugin/skills/apt-discuss/appendices/zoom-out-helper.md +0 -8
  167. package/dist/plugin/skills/apt-execute/SKILL.md +27 -4
  168. package/dist/plugin/skills/apt-execute/appendices/tdd-mode.md +2 -10
  169. package/dist/plugin/skills/apt-fan-out/SKILL.md +36 -1
  170. package/dist/plugin/skills/apt-handoff/SKILL.md +228 -0
  171. package/dist/plugin/skills/apt-improve/DEEPENING.md +0 -8
  172. package/dist/plugin/skills/apt-improve/INTERFACE-DESIGN.md +0 -8
  173. package/dist/plugin/skills/apt-improve/LANGUAGE.md +0 -8
  174. package/dist/plugin/skills/apt-improve/SKILL.md +4 -4
  175. package/dist/plugin/skills/apt-plan/SKILL.md +73 -5
  176. package/dist/plugin/skills/apt-plan/adapters/conductor.md +1 -1
  177. package/dist/plugin/skills/apt-pr-review/SKILL.md +1 -1
  178. package/dist/plugin/skills/apt-prototype/LOGIC.md +0 -8
  179. package/dist/plugin/skills/apt-prototype/SKILL.md +4 -4
  180. package/dist/plugin/skills/apt-prototype/UI.md +0 -8
  181. package/dist/plugin/skills/apt-quick/SKILL.md +31 -1
  182. package/dist/plugin/skills/apt-research/SKILL.md +526 -0
  183. package/dist/plugin/skills/apt-research/appendices/budget-loop.md +397 -0
  184. package/dist/plugin/skills/apt-research/appendices/claim-graph-schema.md +206 -0
  185. package/dist/plugin/skills/apt-research/appendices/domain-tools.md +236 -0
  186. package/dist/plugin/skills/apt-resume/SKILL.md +54 -31
  187. package/dist/plugin/skills/apt-run/SKILL.md +114 -16
  188. package/dist/plugin/skills/apt-setup/SKILL.md +97 -8
  189. package/dist/plugin/skills/apt-ship/SKILL.md +165 -9
  190. package/dist/plugin/skills/apt-spar/SKILL.md +84 -23
  191. package/dist/plugin/skills/apt-triage/AGENT-BRIEF.md +0 -8
  192. package/dist/plugin/skills/apt-triage/OUT-OF-SCOPE.md +0 -7
  193. package/dist/plugin/skills/apt-triage/SKILL.md +2 -2
  194. package/dist/plugin/skills/apt-update/SKILL.md +74 -17
  195. package/dist/plugin/skills/apt-verify-proof/SKILL.md +87 -1
  196. package/dist/plugin/skills/apt-zoom-out/SKILL.md +3 -3
  197. package/dist/schemas/quick-task.d.ts +17 -17
  198. package/dist/schemas/quick-task.d.ts.map +1 -1
  199. package/dist/schemas/quick-task.js +2 -2
  200. package/dist/schemas/quick-task.js.map +1 -1
  201. package/dist/types/config.d.ts +33 -0
  202. package/dist/types/config.d.ts.map +1 -1
  203. package/dist/types/state.d.ts +1 -1
  204. package/dist/types/state.d.ts.map +1 -1
  205. package/dist/types/task-record.d.ts +1 -1
  206. package/dist/types/task-record.d.ts.map +1 -1
  207. package/drivers/.gitkeep +0 -0
  208. package/drivers/api/README.md +40 -0
  209. package/drivers/api/driver.mjs +59 -0
  210. package/drivers/api/manifest.json +26 -0
  211. package/drivers/browser/README.md +105 -0
  212. package/drivers/browser/driver.mjs +134 -0
  213. package/drivers/browser/manifest.json +35 -0
  214. package/drivers/cli/README.md +44 -0
  215. package/drivers/cli/driver.mjs +62 -0
  216. package/drivers/cli/manifest.json +28 -0
  217. package/drivers/electron/README.md +64 -0
  218. package/drivers/electron/driver.mjs +87 -0
  219. package/drivers/electron/manifest.json +37 -0
  220. package/package.json +138 -133
  221. package/prompts/planner.md +1 -1
  222. package/prompts/spec_writer.md +1 -1
  223. package/skills/apt/SKILL.md +75 -6
  224. package/skills/apt-caveman/SKILL.md +64 -0
  225. package/skills/apt-debug/SKILL.md +36 -4
  226. package/skills/apt-debug/appendices/diagnose-discipline.md +2 -11
  227. package/skills/apt-discuss/SKILL.md +4 -4
  228. package/skills/apt-discuss/appendices/grill-discipline.md +2 -11
  229. package/skills/apt-discuss/appendices/zoom-out-helper.md +0 -8
  230. package/skills/apt-execute/SKILL.md +27 -4
  231. package/skills/apt-execute/appendices/tdd-mode.md +2 -10
  232. package/skills/apt-fan-out/SKILL.md +36 -1
  233. package/skills/apt-handoff/SKILL.md +228 -0
  234. package/skills/apt-improve/DEEPENING.md +0 -8
  235. package/skills/apt-improve/INTERFACE-DESIGN.md +0 -8
  236. package/skills/apt-improve/LANGUAGE.md +0 -8
  237. package/skills/apt-improve/SKILL.md +4 -4
  238. package/skills/apt-plan/SKILL.md +73 -5
  239. package/skills/apt-plan/adapters/conductor.md +1 -1
  240. package/skills/apt-planner.md +17 -1
  241. package/skills/apt-pr-review/SKILL.md +1 -1
  242. package/skills/apt-prototype/LOGIC.md +0 -8
  243. package/skills/apt-prototype/SKILL.md +4 -4
  244. package/skills/apt-prototype/UI.md +0 -8
  245. package/skills/apt-quick/SKILL.md +31 -1
  246. package/skills/apt-research/SKILL.md +526 -0
  247. package/skills/apt-research/appendices/budget-loop.md +397 -0
  248. package/skills/apt-research/appendices/claim-graph-schema.md +206 -0
  249. package/skills/apt-research/appendices/domain-tools.md +236 -0
  250. package/skills/apt-resume/SKILL.md +54 -31
  251. package/skills/apt-run/SKILL.md +114 -16
  252. package/skills/apt-setup/SKILL.md +97 -8
  253. package/skills/apt-ship/SKILL.md +165 -9
  254. package/skills/apt-spar/SKILL.md +84 -23
  255. package/skills/apt-triage/AGENT-BRIEF.md +0 -8
  256. package/skills/apt-triage/OUT-OF-SCOPE.md +0 -7
  257. package/skills/apt-triage/SKILL.md +2 -2
  258. package/skills/apt-update/SKILL.md +74 -17
  259. package/skills/apt-verify-proof/SKILL.md +87 -1
  260. package/skills/apt-zoom-out/SKILL.md +3 -3
  261. package/src/cli/commands/adr.mjs +1 -1
  262. package/src/cli/commands/audit-branch-current.mjs +250 -0
  263. package/src/cli/commands/audit.mjs +13 -2
  264. package/src/cli/commands/check-version.mjs +20 -1
  265. package/src/cli/commands/context.mjs +3 -3
  266. package/src/cli/commands/coverage-check.mjs +126 -44
  267. package/src/cli/commands/detect-runtime.mjs +143 -0
  268. package/src/cli/commands/driver-doctor.mjs +294 -0
  269. package/src/cli/commands/gate.mjs +15 -0
  270. package/src/cli/commands/init.mjs +9 -6
  271. package/src/cli/commands/install-from-source.mjs +1 -0
  272. package/src/cli/commands/modes.mjs +1 -1
  273. package/src/cli/commands/route.mjs +42 -1
  274. package/src/cli/commands/triage.mjs +1 -1
  275. package/src/cli/config/load.mjs +9 -3
  276. package/src/cli/coordination/auto-emit-artifact-ready.mjs +1 -1
  277. package/src/cli/coordination/event-schema.mjs +19 -0
  278. package/src/cli/coverage-check/user-outcomes.mjs +273 -0
  279. package/src/cli/dispatch.mjs +17 -1
  280. package/src/cli/gate/context.mjs +20 -1
  281. package/src/cli/gate/gates/consistency-check.mjs +1 -0
  282. package/src/cli/gate/gates/review-clean.mjs +1 -0
  283. package/src/cli/gate/gates/verify-approved.mjs +1 -0
  284. package/src/cli/gate/registry.mjs +11 -1
  285. package/src/cli/host/detect.mjs +1 -1
  286. package/src/cli/install/find-workspace-framework-version.mjs +88 -0
  287. package/src/cli/install/install-from-source.mjs +276 -0
  288. package/src/cli/install/install-kernel.mjs +24 -0
  289. package/src/cli/install/legacy-paths.mjs +164 -39
  290. package/src/cli/install/runtime-detect.mjs +1 -1
  291. package/src/cli/install/runtime-migrate.mjs +63 -30
  292. package/src/cli/install/transforms/codex.mjs +26 -17
  293. package/src/cli/skill-author/contract.mjs +2 -2
  294. package/src/cli/verify-proof/.gitkeep +0 -0
  295. package/src/cli/verify-proof/audit.mjs +55 -0
  296. package/src/cli/verify-proof/exec.mjs +74 -0
  297. package/src/cli/verify-proof/idl/index.mjs +23 -0
  298. package/src/cli/verify-proof/idl/types.ts +42 -0
  299. package/src/cli/verify-proof/manifest-schema.json +212 -0
  300. package/src/cli/verify-proof/manifest-validator.mjs +184 -0
  301. package/src/cli/verify-proof/resolver.mjs +330 -0
  302. package/src/cli/verify-proof/runtime-detect.mjs +211 -0
  303. package/src/cli/verify-proof/trust.mjs +187 -0
  304. package/templates/adr-format.md +0 -8
  305. package/templates/aperant-claude-md-appendix.md +1 -1
  306. package/templates/context-format.md +1 -9
  307. package/templates/proof-verification.md +51 -8
  308. package/workflows/verify-proof.md +130 -19
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Score a single driver against the project's runtime + required capabilities.
3
+ *
4
+ * @param {DriverManifest & {locality?: 'bundled'|'user'|'registry'}} manifest
5
+ * @param {RuntimeCapabilities} runtime
6
+ * @param {string[]} required
7
+ * @returns {{score: number[], reason?: string}}
8
+ */
9
+ export function scoreDriver(manifest: DriverManifest & {
10
+ locality?: "bundled" | "user" | "registry";
11
+ }, runtime: RuntimeCapabilities, required: string[]): {
12
+ score: number[];
13
+ reason?: string;
14
+ };
15
+ /**
16
+ * Resolve the best driver for a given (runtime, drivers, override, required)
17
+ * tuple.
18
+ *
19
+ * @param {Object} opts
20
+ * @param {DriverManifest[]} opts.drivers — manifests of every discovered driver.
21
+ * @param {RuntimeCapabilities} opts.runtime — project's runtime capabilities.
22
+ * @param {string[]} opts.required_capabilities — IDL verbs the test needs.
23
+ * @param {string[]} [opts.required_stability] — accepted stability values; default ['ga'].
24
+ * @param {string[]} [opts.override] — config.json:verification.runtimes[]: explicit driverId precedence.
25
+ * @returns {{selected: DriverManifest, fallback_attempts: Array<{driver_id: string, reason: string}>}}
26
+ * @throws {UnsatisfiedRequiredCapabilityError} when no driver satisfies a REQUIRED capability.
27
+ */
28
+ export function resolveDriver(opts: {
29
+ drivers: DriverManifest[];
30
+ runtime: RuntimeCapabilities;
31
+ required_capabilities: string[];
32
+ required_stability?: string[] | undefined;
33
+ override?: string[] | undefined;
34
+ }): {
35
+ selected: DriverManifest;
36
+ fallback_attempts: Array<{
37
+ driver_id: string;
38
+ reason: string;
39
+ }>;
40
+ };
41
+ /**
42
+ * Map a User Outcomes surface tag to the runtime-capability flag a driver
43
+ * must carry (via `matchesRuntime`) to be eligible for that surface.
44
+ *
45
+ * Closed surface set: `electron | web | cli | api | electron+web`.
46
+ * `electron+web` is NOT a single flag — it's a cross-surface tag the
47
+ * workflow runner expands into two single-surface dispatches.
48
+ *
49
+ * @param {('electron'|'web'|'cli'|'api')} surface
50
+ * @returns {('is_electron'|'is_web_frontend'|'has_node')}
51
+ */
52
+ export function surfaceToRequiredFlag(surface: ("electron" | "web" | "cli" | "api")): ("is_electron" | "is_web_frontend" | "has_node");
53
+ /**
54
+ * Resolve a driver per outcome surface tag, NOT per verify-proof run
55
+ * (per spec §ID-03). For each input outcome the function returns one
56
+ * `{outcome_id, surface, driver}` entry; for `[electron+web]` outcomes
57
+ * it returns TWO entries (electron + web) sharing the same outcome_id.
58
+ *
59
+ * The `outcome_id` field on each returned entry is the positional ID
60
+ * produced by `parseUserOutcomes` (e.g. `O1`, `O2`). The resolver does
61
+ * NOT rewrite or regenerate IDs — they pass through verbatim so the
62
+ * workflow runner can correlate proof artifacts to spec lines.
63
+ *
64
+ * Each per-surface dispatch synthesizes a runtime-capabilities view
65
+ * that ONLY claims the surface's required flag (e.g. `is_electron`
66
+ * alone for an electron-surface outcome, even when the project also
67
+ * carries `is_web_frontend`). This forces the existing scoring to
68
+ * pick the per-surface driver — without it, a project with BOTH
69
+ * electron AND web capabilities would always select the highest-
70
+ * priority bundled driver (currently `browser`) for every outcome.
71
+ *
72
+ * Delegates to the existing `resolveDriver()` for the actual scoring
73
+ * — the scoring code stays in one place.
74
+ *
75
+ * @param {Object} opts
76
+ * @param {DriverManifest[]} opts.drivers
77
+ * @param {RuntimeCapabilities} opts.runtime
78
+ * @param {Array<{id: string, surface: 'electron'|'web'|'cli'|'api'|'electron+web'}>} opts.outcomes
79
+ * @param {string[]} [opts.override]
80
+ * @param {string[]} [opts.required_stability]
81
+ * @param {string[]} [opts.required_capabilities] — defaults to ['screenshot']
82
+ * @returns {Array<{outcome_id: string, surface: string, driver: DriverManifest, fallback_attempts: Array<{driver_id: string, reason: string}>}>}
83
+ */
84
+ export function resolveDriversForOutcomes(opts: {
85
+ drivers: DriverManifest[];
86
+ runtime: RuntimeCapabilities;
87
+ outcomes: Array<{
88
+ id: string;
89
+ surface: "electron" | "web" | "cli" | "api" | "electron+web";
90
+ }>;
91
+ override?: string[] | undefined;
92
+ required_stability?: string[] | undefined;
93
+ required_capabilities?: string[] | undefined;
94
+ }): Array<{
95
+ outcome_id: string;
96
+ surface: string;
97
+ driver: DriverManifest;
98
+ fallback_attempts: Array<{
99
+ driver_id: string;
100
+ reason: string;
101
+ }>;
102
+ }>;
103
+ export type DriverManifest = import("@aperant/framework/driver-sdk").DriverManifest;
104
+ export type RuntimeCapabilities = import("./runtime-detect.mjs").RuntimeCapabilities;
105
+ //# sourceMappingURL=resolver.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.mts","sourceRoot":"","sources":["../../../src/cli/verify-proof/resolver.mjs"],"names":[],"mappings":"AA0CA;;;;;;;GAOG;AACH,sCALW,cAAc,GAAG;IAAC,QAAQ,CAAC,EAAE,SAAS,GAAC,MAAM,GAAC,UAAU,CAAA;CAAC,WACzD,mBAAmB,YACnB,MAAM,EAAE,GACN;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAC,CAU9C;AA0CD;;;;;;;;;;;;GAYG;AACH,oCARG;IAA+B,OAAO,EAA9B,cAAc,EAAE;IACU,OAAO,EAAjC,mBAAmB;IACJ,qBAAqB,EAApC,MAAM,EAAE;IACQ,kBAAkB;IAClB,QAAQ;CAChC,GAAU;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,iBAAiB,EAAE,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC,CAAA;CAAC,CAqFrG;AAED;;;;;;;;;;GAUG;AACH,+CAHW,CAAC,UAAU,GAAC,KAAK,GAAC,KAAK,GAAC,KAAK,CAAC,GAC5B,CAAC,aAAa,GAAC,iBAAiB,GAAC,UAAU,CAAC,CAcxD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,gDARG;IAA+B,OAAO,EAA9B,cAAc,EAAE;IACU,OAAO,EAAjC,mBAAmB;IAC6D,QAAQ,EAAxF,KAAK,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,UAAU,GAAC,KAAK,GAAC,KAAK,GAAC,KAAK,GAAC,cAAc,CAAA;KAAC,CAAC;IACzD,QAAQ;IACR,kBAAkB;IAClB,qBAAqB;CAC7C,GAAU,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,iBAAiB,EAAE,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC,CAAA;CAAC,CAAC,CA2C/I;6BAnQY,OAAO,+BAA+B,EAAE,cAAc;kCACtD,OAAO,sBAAsB,EAAE,mBAAmB"}
@@ -0,0 +1,320 @@
1
+ /**
2
+ * resolver.mjs — driver selection + fallback chain.
3
+ *
4
+ * Given a project's runtime capabilities, the discovered drivers, and the
5
+ * test's required IDL capabilities, return the best driver — or throw
6
+ * UnsatisfiedRequiredCapabilityError if no driver in the chain satisfies
7
+ * a REQUIRED capability (ID-02 fail-closed).
8
+ *
9
+ * Scoring (ID-02, ordered high → low):
10
+ * 1. capability_coverage — how many required capabilities the driver has
11
+ * 2. compatibility — does the runtime match the manifest.targets?
12
+ * 3. stability — ga > beta > experimental
13
+ * 4. priority — higher wins (manifest.priority)
14
+ * 5. locality — bundled (packages/framework/drivers/) > user-installed
15
+ * (.aperant/drivers/) > registry (.aperant/registry-cache/)
16
+ *
17
+ * Ties are broken by the next dimension; if every dimension is equal the
18
+ * driver with the lexicographically smaller driverId wins (deterministic).
19
+ *
20
+ * v0.8.6 — `resolveDriversForOutcomes(opts)` adds per-outcome driver
21
+ * dispatch for cross-surface specs (per spec §ID-03). It accepts the
22
+ * positional `outcomes[]` produced by `parseUserOutcomes` and returns
23
+ * `Array<{outcome_id, surface, driver}>` — one entry per
24
+ * (outcome, surface) pair. For `[electron+web]` outcomes it emits TWO
25
+ * entries with the same outcome_id and different drivers. The
26
+ * outcome_id field is passed through verbatim from parser → resolver
27
+ * → workflow runner with no name rewriting (the positional-ID
28
+ * contract).
29
+ *
30
+ * Existing `resolveDriver()` and `scoreDriver()` exports are unchanged.
31
+ */
32
+ import { UnsatisfiedRequiredCapabilityError } from '@aperant/framework/driver-sdk';
33
+ /**
34
+ * @typedef {import('@aperant/framework/driver-sdk').DriverManifest} DriverManifest
35
+ * @typedef {import('./runtime-detect.mjs').RuntimeCapabilities} RuntimeCapabilities
36
+ */
37
+ const STABILITY_RANK = { ga: 3, beta: 2, experimental: 1 };
38
+ const LOCALITY_RANK = { bundled: 3, user: 2, registry: 1 };
39
+ /**
40
+ * Score a single driver against the project's runtime + required capabilities.
41
+ *
42
+ * @param {DriverManifest & {locality?: 'bundled'|'user'|'registry'}} manifest
43
+ * @param {RuntimeCapabilities} runtime
44
+ * @param {string[]} required
45
+ * @returns {{score: number[], reason?: string}}
46
+ */
47
+ export function scoreDriver(manifest, runtime, required) {
48
+ const caps = new Set(manifest.capabilities ?? []);
49
+ const coverage = required.filter((c) => caps.has(c)).length;
50
+ const compatibility = matchesRuntime(manifest, runtime) ? 1 : 0;
51
+ const stability = STABILITY_RANK[manifest.stability] ?? 0;
52
+ const priority = manifest.priority ?? 0;
53
+ const locality = LOCALITY_RANK[manifest.locality ?? 'bundled'] ?? 0;
54
+ return { score: [coverage, compatibility, stability, priority, locality] };
55
+ }
56
+ /**
57
+ * Whether a manifest's targets[] mentions a runtime the project has.
58
+ *
59
+ * @param {DriverManifest} manifest
60
+ * @param {RuntimeCapabilities} runtime
61
+ * @returns {boolean}
62
+ */
63
+ function matchesRuntime(manifest, runtime) {
64
+ const targets = manifest.targets ?? [];
65
+ for (const t of targets) {
66
+ // Strip any version range suffix (e.g. "electron@>=25" → "electron").
67
+ const stripped = String(t).split('@')[0].toLowerCase();
68
+ if (stripped === 'electron' && runtime.is_electron)
69
+ return true;
70
+ if (stripped === 'tauri' && runtime.is_tauri)
71
+ return true;
72
+ if ((stripped === 'browser' || stripped === 'web') && runtime.is_web_frontend)
73
+ return true;
74
+ if (stripped === 'next' && runtime.is_nextjs)
75
+ return true;
76
+ if (stripped === 'nuxt' && runtime.is_nuxt)
77
+ return true;
78
+ if (stripped === 'expo' && runtime.is_expo)
79
+ return true;
80
+ if (stripped === 'react-native' && runtime.is_react_native)
81
+ return true;
82
+ if (stripped === 'node' && runtime.has_node)
83
+ return true;
84
+ if (stripped === 'cli' && runtime.has_node)
85
+ return true;
86
+ if (stripped === 'api' && runtime.has_node)
87
+ return true;
88
+ if (stripped === 'fake')
89
+ return true; // fixture-only — always matches
90
+ }
91
+ return false;
92
+ }
93
+ /**
94
+ * Compare two driver-score tuples lexicographically.
95
+ * @param {number[]} a
96
+ * @param {number[]} b
97
+ * @returns {number}
98
+ */
99
+ function compareScores(a, b) {
100
+ for (let i = 0; i < Math.min(a.length, b.length); i++) {
101
+ if (a[i] !== b[i])
102
+ return b[i] - a[i]; // higher wins
103
+ }
104
+ return 0;
105
+ }
106
+ /**
107
+ * Resolve the best driver for a given (runtime, drivers, override, required)
108
+ * tuple.
109
+ *
110
+ * @param {Object} opts
111
+ * @param {DriverManifest[]} opts.drivers — manifests of every discovered driver.
112
+ * @param {RuntimeCapabilities} opts.runtime — project's runtime capabilities.
113
+ * @param {string[]} opts.required_capabilities — IDL verbs the test needs.
114
+ * @param {string[]} [opts.required_stability] — accepted stability values; default ['ga'].
115
+ * @param {string[]} [opts.override] — config.json:verification.runtimes[]: explicit driverId precedence.
116
+ * @returns {{selected: DriverManifest, fallback_attempts: Array<{driver_id: string, reason: string}>}}
117
+ * @throws {UnsatisfiedRequiredCapabilityError} when no driver satisfies a REQUIRED capability.
118
+ */
119
+ export function resolveDriver(opts) {
120
+ const drivers = opts.drivers ?? [];
121
+ const runtime = opts.runtime;
122
+ const required = opts.required_capabilities ?? [];
123
+ const stabilityFilter = new Set(opts.required_stability ?? ['ga']);
124
+ const override = opts.override ?? [];
125
+ const fallback = [];
126
+ // Apply override precedence first (config-listed driverIds come first).
127
+ const overrideOrdered = [];
128
+ const overrideSet = new Set(override);
129
+ for (const id of override) {
130
+ const d = drivers.find((m) => m.driverId === id);
131
+ if (d)
132
+ overrideOrdered.push(d);
133
+ }
134
+ const remaining = drivers.filter((m) => !overrideSet.has(m.driverId));
135
+ const ordered = [...overrideOrdered, ...remaining];
136
+ // Filter by stability; rejected drivers go into fallback_attempts.
137
+ const stableOnly = [];
138
+ for (const d of ordered) {
139
+ if (!stabilityFilter.has(d.stability)) {
140
+ fallback.push({
141
+ driver_id: d.driverId,
142
+ reason: `stability ${d.stability} not in allowed set [${[...stabilityFilter].join(', ')}]`,
143
+ });
144
+ continue;
145
+ }
146
+ stableOnly.push(d);
147
+ }
148
+ // Override is hard precedence (per opts.override docstring "explicit
149
+ // driverId precedence"): when set, try override-listed drivers in
150
+ // override order — the first one that satisfies every required
151
+ // capability wins, regardless of compatibility/priority/stability
152
+ // ranking. Non-matching override entries land in fallback. Only when
153
+ // every override entry misses a required cap do we fall through to
154
+ // score-based pick on the remaining drivers.
155
+ const overrideListed = stableOnly.filter((m) => overrideSet.has(m.driverId));
156
+ for (const candidate of overrideListed) {
157
+ const caps = new Set(candidate.capabilities ?? []);
158
+ const missing = required.filter((c) => !caps.has(c));
159
+ if (missing.length === 0) {
160
+ return { selected: candidate, fallback_attempts: fallback };
161
+ }
162
+ fallback.push({
163
+ driver_id: candidate.driverId,
164
+ reason: `override-listed but missing required capabilities: ${missing.join(', ')}`,
165
+ });
166
+ }
167
+ // Score every non-override survivor against required capabilities.
168
+ const nonOverride = stableOnly.filter((m) => !overrideSet.has(m.driverId));
169
+ const scored = nonOverride.map((m) => ({ manifest: m, ...scoreDriver(m, runtime, required) }));
170
+ // Sort highest-first, tie-break on driverId for determinism.
171
+ scored.sort((a, b) => {
172
+ const cmp = compareScores(a.score, b.score);
173
+ if (cmp !== 0)
174
+ return cmp;
175
+ return a.manifest.driverId.localeCompare(b.manifest.driverId);
176
+ });
177
+ // Pick the top scorer that covers EVERY required capability. Others go into fallback.
178
+ for (const candidate of scored) {
179
+ const caps = new Set(candidate.manifest.capabilities ?? []);
180
+ const missing = required.filter((c) => !caps.has(c));
181
+ if (missing.length === 0) {
182
+ return { selected: candidate.manifest, fallback_attempts: fallback };
183
+ }
184
+ fallback.push({
185
+ driver_id: candidate.manifest.driverId,
186
+ reason: `missing required capabilities: ${missing.join(', ')}`,
187
+ });
188
+ }
189
+ // Exhausted the chain — fail closed (ID-02).
190
+ throw new UnsatisfiedRequiredCapabilityError(`No driver in the chain satisfies every required capability: [${required.join(', ')}]`, required[0], fallback);
191
+ }
192
+ /**
193
+ * Map a User Outcomes surface tag to the runtime-capability flag a driver
194
+ * must carry (via `matchesRuntime`) to be eligible for that surface.
195
+ *
196
+ * Closed surface set: `electron | web | cli | api | electron+web`.
197
+ * `electron+web` is NOT a single flag — it's a cross-surface tag the
198
+ * workflow runner expands into two single-surface dispatches.
199
+ *
200
+ * @param {('electron'|'web'|'cli'|'api')} surface
201
+ * @returns {('is_electron'|'is_web_frontend'|'has_node')}
202
+ */
203
+ export function surfaceToRequiredFlag(surface) {
204
+ switch (surface) {
205
+ case 'electron':
206
+ return 'is_electron';
207
+ case 'web':
208
+ return 'is_web_frontend';
209
+ case 'cli':
210
+ case 'api':
211
+ return 'has_node';
212
+ default:
213
+ throw new Error(`surfaceToRequiredFlag: unknown surface "${surface}"`);
214
+ }
215
+ }
216
+ /**
217
+ * Resolve a driver per outcome surface tag, NOT per verify-proof run
218
+ * (per spec §ID-03). For each input outcome the function returns one
219
+ * `{outcome_id, surface, driver}` entry; for `[electron+web]` outcomes
220
+ * it returns TWO entries (electron + web) sharing the same outcome_id.
221
+ *
222
+ * The `outcome_id` field on each returned entry is the positional ID
223
+ * produced by `parseUserOutcomes` (e.g. `O1`, `O2`). The resolver does
224
+ * NOT rewrite or regenerate IDs — they pass through verbatim so the
225
+ * workflow runner can correlate proof artifacts to spec lines.
226
+ *
227
+ * Each per-surface dispatch synthesizes a runtime-capabilities view
228
+ * that ONLY claims the surface's required flag (e.g. `is_electron`
229
+ * alone for an electron-surface outcome, even when the project also
230
+ * carries `is_web_frontend`). This forces the existing scoring to
231
+ * pick the per-surface driver — without it, a project with BOTH
232
+ * electron AND web capabilities would always select the highest-
233
+ * priority bundled driver (currently `browser`) for every outcome.
234
+ *
235
+ * Delegates to the existing `resolveDriver()` for the actual scoring
236
+ * — the scoring code stays in one place.
237
+ *
238
+ * @param {Object} opts
239
+ * @param {DriverManifest[]} opts.drivers
240
+ * @param {RuntimeCapabilities} opts.runtime
241
+ * @param {Array<{id: string, surface: 'electron'|'web'|'cli'|'api'|'electron+web'}>} opts.outcomes
242
+ * @param {string[]} [opts.override]
243
+ * @param {string[]} [opts.required_stability]
244
+ * @param {string[]} [opts.required_capabilities] — defaults to ['screenshot']
245
+ * @returns {Array<{outcome_id: string, surface: string, driver: DriverManifest, fallback_attempts: Array<{driver_id: string, reason: string}>}>}
246
+ */
247
+ export function resolveDriversForOutcomes(opts) {
248
+ const drivers = opts.drivers ?? [];
249
+ const runtime = opts.runtime;
250
+ const outcomes = opts.outcomes ?? [];
251
+ const required = opts.required_capabilities ?? ['screenshot'];
252
+ const override = opts.override;
253
+ const stability = opts.required_stability;
254
+ /** @type {Array<{outcome_id: string, surface: string, driver: DriverManifest, fallback_attempts: Array<{driver_id: string, reason: string}>}>} */
255
+ const results = [];
256
+ for (const outcome of outcomes) {
257
+ const surfacesToDispatch = outcome.surface === 'electron+web' ? ['electron', 'web'] : [outcome.surface];
258
+ for (const surface of surfacesToDispatch) {
259
+ const flag = surfaceToRequiredFlag(/** @type {'electron'|'web'|'cli'|'api'} */ (surface));
260
+ // Synthesize a per-surface runtime view: only the surface's
261
+ // required flag is on; every other flag is masked off so the
262
+ // scoring prefers per-surface drivers (otherwise, on a
263
+ // multi-runtime project, the highest-priority bundled driver
264
+ // always wins). `has_node` stays on for cli/api since multiple
265
+ // drivers may target node.
266
+ const surfaceRuntime = maskRuntimeForSurface(runtime, flag);
267
+ const resolved = resolveDriver({
268
+ drivers,
269
+ runtime: surfaceRuntime,
270
+ required_capabilities: required,
271
+ ...(override ? { override } : {}),
272
+ ...(stability ? { required_stability: stability } : {}),
273
+ });
274
+ results.push({
275
+ outcome_id: outcome.id,
276
+ surface,
277
+ driver: resolved.selected,
278
+ fallback_attempts: resolved.fallback_attempts,
279
+ });
280
+ }
281
+ }
282
+ return results;
283
+ }
284
+ /**
285
+ * Return a copy of `runtime` with every flag false EXCEPT the one named
286
+ * by `flag`. Used to scope the resolver's compatibility check to a
287
+ * single surface during per-outcome dispatch.
288
+ *
289
+ * @param {RuntimeCapabilities} runtime
290
+ * @param {string} flag — one of: is_electron | is_web_frontend | has_node
291
+ * @returns {RuntimeCapabilities}
292
+ */
293
+ function maskRuntimeForSurface(runtime, flag) {
294
+ /** @type {RuntimeCapabilities} */
295
+ const masked = {
296
+ is_electron: false,
297
+ is_tauri: false,
298
+ is_nextjs: false,
299
+ is_nuxt: false,
300
+ is_web_frontend: false,
301
+ is_expo: false,
302
+ is_react_native: false,
303
+ has_node: false,
304
+ };
305
+ // Only flip the surface's flag on if the project actually carries it
306
+ // (otherwise the resolver should genuinely fail — fail-closed).
307
+ if (flag === 'is_electron' && runtime.is_electron)
308
+ masked.is_electron = true;
309
+ if (flag === 'is_web_frontend' && runtime.is_web_frontend) {
310
+ masked.is_web_frontend = true;
311
+ // Carry the framework hint too (Next.js / Nuxt) so drivers that
312
+ // target browser via those frameworks still match.
313
+ masked.is_nextjs = runtime.is_nextjs;
314
+ masked.is_nuxt = runtime.is_nuxt;
315
+ }
316
+ if (flag === 'has_node')
317
+ masked.has_node = runtime.has_node;
318
+ return masked;
319
+ }
320
+ //# sourceMappingURL=resolver.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.mjs","sourceRoot":"","sources":["../../../src/cli/verify-proof/resolver.mjs"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Detect runtime capabilities from a parsed package.json object.
3
+ *
4
+ * @param {Record<string, unknown> | null} packageJson
5
+ * @returns {RuntimeCapabilities}
6
+ */
7
+ export function detectFromPackageJson(packageJson: Record<string, unknown> | null): RuntimeCapabilities;
8
+ /**
9
+ * Load and detect capabilities from a project directory's package.json.
10
+ * v0.8.6 — also walks `monorepo_globs` (default `['apps/*']`) and
11
+ * OR-merges each match's capabilities with the root.
12
+ *
13
+ * @param {string} projectDir
14
+ * @param {{monorepo_globs?: string[]}} [opts]
15
+ * @returns {RuntimeCapabilities}
16
+ */
17
+ export function loadRuntimeCapabilities(projectDir: string, opts?: {
18
+ monorepo_globs?: string[];
19
+ }): RuntimeCapabilities;
20
+ export type RuntimeCapabilities = {
21
+ is_electron: boolean;
22
+ is_tauri: boolean;
23
+ is_nextjs: boolean;
24
+ is_nuxt: boolean;
25
+ is_web_frontend: boolean;
26
+ is_expo: boolean;
27
+ is_react_native: boolean;
28
+ has_node: boolean;
29
+ };
30
+ //# sourceMappingURL=runtime-detect.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-detect.d.mts","sourceRoot":"","sources":["../../../src/cli/verify-proof/runtime-detect.mjs"],"names":[],"mappings":"AAiDA;;;;;GAKG;AACH,mDAHW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC5B,mBAAmB,CAwD/B;AAED;;;;;;;;GAQG;AACH,oDAJW,MAAM,SACN;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAC,GACzB,mBAAmB,CAkC/B;;iBA/Ha,OAAO;cACP,OAAO;eACP,OAAO;aACP,OAAO;qBACP,OAAO;aACP,OAAO;qBACP,OAAO;cACP,OAAO"}