opendevbrowser 0.0.34 → 0.0.35

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 (283) hide show
  1. package/README.md +1 -1
  2. package/dist/{accessibility-snapshot-VCBXK47S.js → accessibility-snapshot-TAFPVLZN.js} +8 -8
  3. package/dist/{active-window-7EUN36LZ.js → active-window-MHFMC6NQ.js} +8 -8
  4. package/dist/{annotate-VLBK7YB6.js → annotate-5ZFRFQ4B.js} +7 -7
  5. package/dist/{attr-JNANQKM6.js → attr-MBF2UCRF.js} +7 -7
  6. package/dist/browser/browser-manager.d.ts +6 -1
  7. package/dist/browser/browser-manager.d.ts.map +1 -1
  8. package/dist/browser/manager-types.d.ts +48 -0
  9. package/dist/browser/manager-types.d.ts.map +1 -1
  10. package/dist/browser/ops-browser-manager.d.ts +2 -1
  11. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  12. package/dist/{canvas-V5LO4JVL.js → canvas-CAMD22YU.js} +7 -7
  13. package/dist/{capture-desktop-FKVDWTVG.js → capture-desktop-TMZSFA5R.js} +8 -8
  14. package/dist/{capture-window-QVPM2DN2.js → capture-window-NZDKD2AE.js} +8 -8
  15. package/dist/{check-V3CWZ56S.js → check-MO33GTQ4.js} +7 -7
  16. package/dist/{checked-Q27Q6YZN.js → checked-3HDF5X2M.js} +7 -7
  17. package/dist/{chunk-VX47SJZM.js → chunk-32ZSOZND.js} +2 -2
  18. package/dist/{chunk-XRDCSHKZ.js → chunk-AHQC4A6P.js} +744 -14
  19. package/dist/chunk-AHQC4A6P.js.map +1 -0
  20. package/dist/{chunk-IBIHDGTZ.js → chunk-B5XIJQXO.js} +32 -4
  21. package/dist/chunk-B5XIJQXO.js.map +1 -0
  22. package/dist/{chunk-OJAUKABV.js → chunk-BHZLEFXW.js} +2 -2
  23. package/dist/{chunk-VY47VKXU.js → chunk-FJZY3Z3X.js} +2 -2
  24. package/dist/{chunk-GC2FWISX.js → chunk-HM4CO3EW.js} +20 -16
  25. package/dist/chunk-HM4CO3EW.js.map +1 -0
  26. package/dist/{chunk-Z3HIX2SE.js → chunk-UEAXTWGT.js} +2 -2
  27. package/dist/{chunk-ZGCTC5YM.js → chunk-UVD34RA2.js} +33 -1
  28. package/dist/chunk-UVD34RA2.js.map +1 -0
  29. package/dist/{chunk-5FDXH4CS.js → chunk-WTWSBEBW.js} +5659 -419
  30. package/dist/chunk-WTWSBEBW.js.map +1 -0
  31. package/dist/{chunk-NX2XYJP5.js → chunk-XSSPNVMS.js} +3 -3
  32. package/dist/{chunk-NX2XYJP5.js.map → chunk-XSSPNVMS.js.map} +1 -1
  33. package/dist/{chunk-QXJDJDSZ.js → chunk-Z3ADLR7I.js} +667 -8
  34. package/dist/chunk-Z3ADLR7I.js.map +1 -0
  35. package/dist/cli/commands/inspiredesign.d.ts +12 -1
  36. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  37. package/dist/cli/daemon-commands.d.ts.map +1 -1
  38. package/dist/cli/help.d.ts.map +1 -1
  39. package/dist/cli/index.js +76 -76
  40. package/dist/cli/index.js.map +1 -1
  41. package/dist/cli/utils/workflow-message.d.ts.map +1 -1
  42. package/dist/{click-EQDRSLR3.js → click-SWZPJO2U.js} +7 -7
  43. package/dist/{clone-component-SISUXTJS.js → clone-component-YTB46YU4.js} +7 -7
  44. package/dist/{clone-page-MLDPCBOY.js → clone-page-5FMPHQ3A.js} +7 -7
  45. package/dist/{close-7J7EV237.js → close-22SNMDX3.js} +7 -7
  46. package/dist/{close-2LQMJVOA.js → close-ORQZCZ2E.js} +7 -7
  47. package/dist/{connect-JFRSIW5M.js → connect-EWYITNQU.js} +7 -7
  48. package/dist/{console-poll-NSVVUNEC.js → console-poll-LJR6ZTDK.js} +7 -7
  49. package/dist/{cookie-import-B7IQTGTN.js → cookie-import-PTAIWPEC.js} +7 -7
  50. package/dist/{cookie-list-YHG7JCZZ.js → cookie-list-76C35B5B.js} +7 -7
  51. package/dist/{daemon-ENU4FOV4.js → daemon-UKJMDLCB.js} +6 -6
  52. package/dist/daemon-fingerprint.json +1 -1
  53. package/dist/{debug-trace-snapshot-KLGU2AWY.js → debug-trace-snapshot-PQ5FJART.js} +7 -7
  54. package/dist/{dialog-MUVQIERS.js → dialog-WLJDWJV4.js} +7 -7
  55. package/dist/{disconnect-KELQJ45J.js → disconnect-FNB4JC2U.js} +7 -7
  56. package/dist/{enabled-SF6UU5HG.js → enabled-PYMCOQPC.js} +7 -7
  57. package/dist/{goto-AZQWXYPG.js → goto-UNTEW4VI.js} +7 -7
  58. package/dist/guidance/context.d.ts +10 -0
  59. package/dist/guidance/context.d.ts.map +1 -1
  60. package/dist/guidance/readiness.d.ts.map +1 -1
  61. package/dist/guidance/recipes/generic.d.ts.map +1 -1
  62. package/dist/guidance/recipes/pinterest.d.ts.map +1 -1
  63. package/dist/guidance/types.d.ts +4 -0
  64. package/dist/guidance/types.d.ts.map +1 -1
  65. package/dist/{help-B44IBHXL.js → help-QOLCIB3P.js} +8 -7
  66. package/dist/{help-B44IBHXL.js.map → help-QOLCIB3P.js.map} +1 -1
  67. package/dist/{hover-MQRAKKVU.js → hover-ZWY4YOM4.js} +7 -7
  68. package/dist/{html-PLRTU2WS.js → html-M46YBFT3.js} +7 -7
  69. package/dist/index.js +43 -18
  70. package/dist/index.js.map +1 -1
  71. package/dist/{inspector-IY4GBIT6.js → inspector-6YAOI74U.js} +8 -8
  72. package/dist/{inspector-audit-7MQCRJHD.js → inspector-audit-PF64X6SJ.js} +9 -9
  73. package/dist/{inspector-plan-ZAUDHBET.js → inspector-plan-IUGTQV3Q.js} +9 -9
  74. package/dist/inspiredesign/capture-mode.d.ts +8 -0
  75. package/dist/inspiredesign/capture-mode.d.ts.map +1 -1
  76. package/dist/inspiredesign/capture.d.ts +36 -1
  77. package/dist/inspiredesign/capture.d.ts.map +1 -1
  78. package/dist/inspiredesign/contract.d.ts +24 -0
  79. package/dist/inspiredesign/contract.d.ts.map +1 -1
  80. package/dist/inspiredesign/handoff.d.ts +6 -2
  81. package/dist/inspiredesign/handoff.d.ts.map +1 -1
  82. package/dist/inspiredesign/media-analysis/analyzer.d.ts +13 -0
  83. package/dist/inspiredesign/media-analysis/analyzer.d.ts.map +1 -0
  84. package/dist/inspiredesign/media-analysis/design-guidance.d.ts +11 -0
  85. package/dist/inspiredesign/media-analysis/design-guidance.d.ts.map +1 -0
  86. package/dist/inspiredesign/media-analysis/ffmpeg.d.ts +21 -0
  87. package/dist/inspiredesign/media-analysis/ffmpeg.d.ts.map +1 -0
  88. package/dist/inspiredesign/media-analysis/ffprobe.d.ts +8 -0
  89. package/dist/inspiredesign/media-analysis/ffprobe.d.ts.map +1 -0
  90. package/dist/inspiredesign/media-analysis/index.d.ts +10 -0
  91. package/dist/inspiredesign/media-analysis/index.d.ts.map +1 -0
  92. package/dist/inspiredesign/media-analysis/persist.d.ts +6 -0
  93. package/dist/inspiredesign/media-analysis/persist.d.ts.map +1 -0
  94. package/dist/inspiredesign/media-analysis/pixel.d.ts +9 -0
  95. package/dist/inspiredesign/media-analysis/pixel.d.ts.map +1 -0
  96. package/dist/inspiredesign/media-analysis/types.d.ts +163 -0
  97. package/dist/inspiredesign/media-analysis/types.d.ts.map +1 -0
  98. package/dist/inspiredesign/media-analysis/typography-structure.d.ts +3 -0
  99. package/dist/inspiredesign/media-analysis/typography-structure.d.ts.map +1 -0
  100. package/dist/inspiredesign/meta-prompt.d.ts.map +1 -1
  101. package/dist/inspiredesign/motion-evidence.d.ts +73 -0
  102. package/dist/inspiredesign/motion-evidence.d.ts.map +1 -0
  103. package/dist/inspiredesign/pinterest-media-classification.d.ts +27 -0
  104. package/dist/inspiredesign/pinterest-media-classification.d.ts.map +1 -0
  105. package/dist/inspiredesign/pinterest-pin-media-evidence.d.ts +151 -0
  106. package/dist/inspiredesign/pinterest-pin-media-evidence.d.ts.map +1 -0
  107. package/dist/inspiredesign/product-readiness.d.ts +97 -0
  108. package/dist/inspiredesign/product-readiness.d.ts.map +1 -0
  109. package/dist/inspiredesign/reference-pattern-board.d.ts +27 -2
  110. package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
  111. package/dist/inspiredesign/visual-evidence.d.ts +5 -0
  112. package/dist/inspiredesign/visual-evidence.d.ts.map +1 -1
  113. package/dist/{inspiredesign-VHPEO3UK.js → inspiredesign-GZIEXETS.js} +29 -12
  114. package/dist/inspiredesign-GZIEXETS.js.map +1 -0
  115. package/dist/{launch-OCTWPTV5.js → launch-I7WNLWLY.js} +7 -7
  116. package/dist/{list-HUSYADUS.js → list-BAECFJI7.js} +7 -7
  117. package/dist/{list-JWKAMAUA.js → list-BCF4HZ2K.js} +7 -7
  118. package/dist/{macro-resolve-WOXMPZDQ.js → macro-resolve-4GNZYHHW.js} +8 -8
  119. package/dist/{network-poll-WHB62OEF.js → network-poll-DCZ5ZNLP.js} +7 -7
  120. package/dist/{new-IKZBYBNK.js → new-6KZYJTJG.js} +7 -7
  121. package/dist/{open-UA2VI6ZP.js → open-JPGEAJHJ.js} +7 -7
  122. package/dist/opendevbrowser.js +43 -18
  123. package/dist/opendevbrowser.js.map +1 -1
  124. package/dist/{perf-DICS3VKH.js → perf-5X367PRP.js} +7 -7
  125. package/dist/{pointer-down-2XPRZFJC.js → pointer-down-5OAUDDNR.js} +7 -7
  126. package/dist/{pointer-drag-7NY4BOLH.js → pointer-drag-LIW5PY5P.js} +7 -7
  127. package/dist/{pointer-move-FWEXMH37.js → pointer-move-7AMURLJD.js} +7 -7
  128. package/dist/{pointer-up-VU2OHK5D.js → pointer-up-EY652YWL.js} +7 -7
  129. package/dist/{press-W7IZ3FCX.js → press-UIAE5XEF.js} +7 -7
  130. package/dist/{product-video-XCZ6CHR5.js → product-video-B6TLS7VC.js} +9 -9
  131. package/dist/providers/browser-native-discovery.d.ts.map +1 -1
  132. package/dist/providers/renderer.d.ts +10 -1
  133. package/dist/providers/renderer.d.ts.map +1 -1
  134. package/dist/providers/workflows.d.ts +53 -2
  135. package/dist/providers/workflows.d.ts.map +1 -1
  136. package/dist/{providers-XCNSU3T6.js → providers-AERTX6X4.js} +5 -3
  137. package/dist/public-surface/generated-manifest.d.ts +2 -2
  138. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  139. package/dist/public-surface/source.d.ts +2 -2
  140. package/dist/public-surface/source.d.ts.map +1 -1
  141. package/dist/{research-AYCKHOWK.js → research-AJH6ECYW.js} +9 -9
  142. package/dist/{review-PP2UNSMJ.js → review-RN6XF2YB.js} +7 -7
  143. package/dist/{review-desktop-3JOJFUEJ.js → review-desktop-UJOUS7K2.js} +7 -7
  144. package/dist/{rpc-7EPTJQQ6.js → rpc-VS5Y5FUT.js} +7 -7
  145. package/dist/{run-P6UJS3D4.js → run-EVRIQW7S.js} +5 -5
  146. package/dist/{screencast-start-ZZYNH2HT.js → screencast-start-U6J4FYU4.js} +7 -7
  147. package/dist/{screencast-stop-Y6ADFOFA.js → screencast-stop-EQUPRGMP.js} +7 -7
  148. package/dist/{screenshot-CJB7PMAF.js → screenshot-BENYGC36.js} +7 -7
  149. package/dist/{scroll-BP5MA4ZT.js → scroll-3OALQLX2.js} +7 -7
  150. package/dist/{scroll-into-view-O3RDWLM2.js → scroll-into-view-SNZKBIVB.js} +7 -7
  151. package/dist/{select-QLCNRI36.js → select-JDZDDC3Y.js} +7 -7
  152. package/dist/{serve-OO2MQWGL.js → serve-LOC6ESJ4.js} +6 -6
  153. package/dist/{shopping-UYHCYPAH.js → shopping-267OAYGM.js} +9 -9
  154. package/dist/{snapshot-SXYZ3CMC.js → snapshot-ASYI5UFR.js} +7 -7
  155. package/dist/{status-AL2AHVA5.js → status-47CI4LJX.js} +7 -7
  156. package/dist/{status-QQW7REK4.js → status-N4O6DJTF.js} +8 -8
  157. package/dist/{status-capabilities-AVHJYQQQ.js → status-capabilities-C777JZG4.js} +8 -8
  158. package/dist/{text-B6Z47EOA.js → text-MS2653MW.js} +7 -7
  159. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  160. package/dist/{type-LR3F3SQY.js → type-UMPSDACC.js} +7 -7
  161. package/dist/{uncheck-5PJEHR7J.js → uncheck-2OZ56D42.js} +7 -7
  162. package/dist/{upload-HQ3QN2OW.js → upload-CD7PRH54.js} +7 -7
  163. package/dist/{use-KFZLMRUH.js → use-MO67AGG7.js} +7 -7
  164. package/dist/{value-TKUFUK5I.js → value-4GI2LRUY.js} +7 -7
  165. package/dist/{visible-P5Z2N2QR.js → visible-VSUFGRFZ.js} +7 -7
  166. package/dist/{wait-BYSHJPSC.js → wait-OQYMFENT.js} +7 -7
  167. package/dist/{windows-6GTD25EU.js → windows-75W2JCW7.js} +8 -8
  168. package/extension/manifest.json +1 -1
  169. package/package.json +1 -1
  170. package/skills/opendevbrowser-best-practices/SKILL.md +41 -30
  171. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +12 -8
  172. package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +1 -0
  173. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +19 -0
  174. package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +23 -13
  175. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +3 -1
  176. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +62 -21
  177. package/skills/opendevbrowser-best-practices/scripts/resolve-odb-cli.sh +28 -0
  178. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +15 -0
  179. package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +13 -0
  180. package/skills/opendevbrowser-design-agent/SKILL.md +2 -0
  181. package/skills/opendevbrowser-design-agent/artifacts/design-workflows.md +15 -13
  182. package/skills/opendevbrowser-design-agent/artifacts/isolated-preview-validation.md +1 -1
  183. package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +14 -7
  184. package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +1 -0
  185. package/skills/opendevbrowser-design-agent/scripts/design-workflow.sh +10 -7
  186. package/skills/opendevbrowser-motion-design/SKILL.md +1 -1
  187. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +5 -4
  188. package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +1 -0
  189. package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +1 -0
  190. package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +1 -0
  191. package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +4 -0
  192. package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +1 -0
  193. package/skills/opendevbrowser-research/SKILL.md +1 -0
  194. package/skills/opendevbrowser-research/scripts/render-output.sh +1 -0
  195. package/skills/opendevbrowser-research/scripts/run-research.sh +1 -0
  196. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +4 -0
  197. package/skills/opendevbrowser-research/scripts/write-artifacts.sh +1 -0
  198. package/skills/opendevbrowser-shopping/SKILL.md +1 -0
  199. package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +1 -0
  200. package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +1 -0
  201. package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +1 -0
  202. package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +4 -0
  203. package/dist/chunk-5FDXH4CS.js.map +0 -1
  204. package/dist/chunk-GC2FWISX.js.map +0 -1
  205. package/dist/chunk-IBIHDGTZ.js.map +0 -1
  206. package/dist/chunk-QXJDJDSZ.js.map +0 -1
  207. package/dist/chunk-XRDCSHKZ.js.map +0 -1
  208. package/dist/chunk-ZGCTC5YM.js.map +0 -1
  209. package/dist/inspiredesign-VHPEO3UK.js.map +0 -1
  210. /package/dist/{accessibility-snapshot-VCBXK47S.js.map → accessibility-snapshot-TAFPVLZN.js.map} +0 -0
  211. /package/dist/{active-window-7EUN36LZ.js.map → active-window-MHFMC6NQ.js.map} +0 -0
  212. /package/dist/{annotate-VLBK7YB6.js.map → annotate-5ZFRFQ4B.js.map} +0 -0
  213. /package/dist/{attr-JNANQKM6.js.map → attr-MBF2UCRF.js.map} +0 -0
  214. /package/dist/{canvas-V5LO4JVL.js.map → canvas-CAMD22YU.js.map} +0 -0
  215. /package/dist/{capture-desktop-FKVDWTVG.js.map → capture-desktop-TMZSFA5R.js.map} +0 -0
  216. /package/dist/{capture-window-QVPM2DN2.js.map → capture-window-NZDKD2AE.js.map} +0 -0
  217. /package/dist/{check-V3CWZ56S.js.map → check-MO33GTQ4.js.map} +0 -0
  218. /package/dist/{checked-Q27Q6YZN.js.map → checked-3HDF5X2M.js.map} +0 -0
  219. /package/dist/{chunk-VX47SJZM.js.map → chunk-32ZSOZND.js.map} +0 -0
  220. /package/dist/{chunk-OJAUKABV.js.map → chunk-BHZLEFXW.js.map} +0 -0
  221. /package/dist/{chunk-VY47VKXU.js.map → chunk-FJZY3Z3X.js.map} +0 -0
  222. /package/dist/{chunk-Z3HIX2SE.js.map → chunk-UEAXTWGT.js.map} +0 -0
  223. /package/dist/{click-EQDRSLR3.js.map → click-SWZPJO2U.js.map} +0 -0
  224. /package/dist/{clone-component-SISUXTJS.js.map → clone-component-YTB46YU4.js.map} +0 -0
  225. /package/dist/{clone-page-MLDPCBOY.js.map → clone-page-5FMPHQ3A.js.map} +0 -0
  226. /package/dist/{close-7J7EV237.js.map → close-22SNMDX3.js.map} +0 -0
  227. /package/dist/{close-2LQMJVOA.js.map → close-ORQZCZ2E.js.map} +0 -0
  228. /package/dist/{connect-JFRSIW5M.js.map → connect-EWYITNQU.js.map} +0 -0
  229. /package/dist/{console-poll-NSVVUNEC.js.map → console-poll-LJR6ZTDK.js.map} +0 -0
  230. /package/dist/{cookie-import-B7IQTGTN.js.map → cookie-import-PTAIWPEC.js.map} +0 -0
  231. /package/dist/{cookie-list-YHG7JCZZ.js.map → cookie-list-76C35B5B.js.map} +0 -0
  232. /package/dist/{daemon-ENU4FOV4.js.map → daemon-UKJMDLCB.js.map} +0 -0
  233. /package/dist/{debug-trace-snapshot-KLGU2AWY.js.map → debug-trace-snapshot-PQ5FJART.js.map} +0 -0
  234. /package/dist/{dialog-MUVQIERS.js.map → dialog-WLJDWJV4.js.map} +0 -0
  235. /package/dist/{disconnect-KELQJ45J.js.map → disconnect-FNB4JC2U.js.map} +0 -0
  236. /package/dist/{enabled-SF6UU5HG.js.map → enabled-PYMCOQPC.js.map} +0 -0
  237. /package/dist/{goto-AZQWXYPG.js.map → goto-UNTEW4VI.js.map} +0 -0
  238. /package/dist/{hover-MQRAKKVU.js.map → hover-ZWY4YOM4.js.map} +0 -0
  239. /package/dist/{html-PLRTU2WS.js.map → html-M46YBFT3.js.map} +0 -0
  240. /package/dist/{inspector-IY4GBIT6.js.map → inspector-6YAOI74U.js.map} +0 -0
  241. /package/dist/{inspector-audit-7MQCRJHD.js.map → inspector-audit-PF64X6SJ.js.map} +0 -0
  242. /package/dist/{inspector-plan-ZAUDHBET.js.map → inspector-plan-IUGTQV3Q.js.map} +0 -0
  243. /package/dist/{launch-OCTWPTV5.js.map → launch-I7WNLWLY.js.map} +0 -0
  244. /package/dist/{list-HUSYADUS.js.map → list-BAECFJI7.js.map} +0 -0
  245. /package/dist/{list-JWKAMAUA.js.map → list-BCF4HZ2K.js.map} +0 -0
  246. /package/dist/{macro-resolve-WOXMPZDQ.js.map → macro-resolve-4GNZYHHW.js.map} +0 -0
  247. /package/dist/{network-poll-WHB62OEF.js.map → network-poll-DCZ5ZNLP.js.map} +0 -0
  248. /package/dist/{new-IKZBYBNK.js.map → new-6KZYJTJG.js.map} +0 -0
  249. /package/dist/{open-UA2VI6ZP.js.map → open-JPGEAJHJ.js.map} +0 -0
  250. /package/dist/{perf-DICS3VKH.js.map → perf-5X367PRP.js.map} +0 -0
  251. /package/dist/{pointer-down-2XPRZFJC.js.map → pointer-down-5OAUDDNR.js.map} +0 -0
  252. /package/dist/{pointer-drag-7NY4BOLH.js.map → pointer-drag-LIW5PY5P.js.map} +0 -0
  253. /package/dist/{pointer-move-FWEXMH37.js.map → pointer-move-7AMURLJD.js.map} +0 -0
  254. /package/dist/{pointer-up-VU2OHK5D.js.map → pointer-up-EY652YWL.js.map} +0 -0
  255. /package/dist/{press-W7IZ3FCX.js.map → press-UIAE5XEF.js.map} +0 -0
  256. /package/dist/{product-video-XCZ6CHR5.js.map → product-video-B6TLS7VC.js.map} +0 -0
  257. /package/dist/{providers-XCNSU3T6.js.map → providers-AERTX6X4.js.map} +0 -0
  258. /package/dist/{research-AYCKHOWK.js.map → research-AJH6ECYW.js.map} +0 -0
  259. /package/dist/{review-PP2UNSMJ.js.map → review-RN6XF2YB.js.map} +0 -0
  260. /package/dist/{review-desktop-3JOJFUEJ.js.map → review-desktop-UJOUS7K2.js.map} +0 -0
  261. /package/dist/{rpc-7EPTJQQ6.js.map → rpc-VS5Y5FUT.js.map} +0 -0
  262. /package/dist/{run-P6UJS3D4.js.map → run-EVRIQW7S.js.map} +0 -0
  263. /package/dist/{screencast-start-ZZYNH2HT.js.map → screencast-start-U6J4FYU4.js.map} +0 -0
  264. /package/dist/{screencast-stop-Y6ADFOFA.js.map → screencast-stop-EQUPRGMP.js.map} +0 -0
  265. /package/dist/{screenshot-CJB7PMAF.js.map → screenshot-BENYGC36.js.map} +0 -0
  266. /package/dist/{scroll-BP5MA4ZT.js.map → scroll-3OALQLX2.js.map} +0 -0
  267. /package/dist/{scroll-into-view-O3RDWLM2.js.map → scroll-into-view-SNZKBIVB.js.map} +0 -0
  268. /package/dist/{select-QLCNRI36.js.map → select-JDZDDC3Y.js.map} +0 -0
  269. /package/dist/{serve-OO2MQWGL.js.map → serve-LOC6ESJ4.js.map} +0 -0
  270. /package/dist/{shopping-UYHCYPAH.js.map → shopping-267OAYGM.js.map} +0 -0
  271. /package/dist/{snapshot-SXYZ3CMC.js.map → snapshot-ASYI5UFR.js.map} +0 -0
  272. /package/dist/{status-AL2AHVA5.js.map → status-47CI4LJX.js.map} +0 -0
  273. /package/dist/{status-QQW7REK4.js.map → status-N4O6DJTF.js.map} +0 -0
  274. /package/dist/{status-capabilities-AVHJYQQQ.js.map → status-capabilities-C777JZG4.js.map} +0 -0
  275. /package/dist/{text-B6Z47EOA.js.map → text-MS2653MW.js.map} +0 -0
  276. /package/dist/{type-LR3F3SQY.js.map → type-UMPSDACC.js.map} +0 -0
  277. /package/dist/{uncheck-5PJEHR7J.js.map → uncheck-2OZ56D42.js.map} +0 -0
  278. /package/dist/{upload-HQ3QN2OW.js.map → upload-CD7PRH54.js.map} +0 -0
  279. /package/dist/{use-KFZLMRUH.js.map → use-MO67AGG7.js.map} +0 -0
  280. /package/dist/{value-TKUFUK5I.js.map → value-4GI2LRUY.js.map} +0 -0
  281. /package/dist/{visible-P5Z2N2QR.js.map → visible-VSUFGRFZ.js.map} +0 -0
  282. /package/dist/{wait-BYSHJPSC.js.map → wait-OQYMFENT.js.map} +0 -0
  283. /package/dist/{windows-6GTD25EU.js.map → windows-75W2JCW7.js.map} +0 -0
@@ -3,6 +3,7 @@
3
3
  "expectedCounts": {
4
4
  "cliCommands": 77,
5
5
  "tools": 70,
6
+ "cliToolPairs": 67,
6
7
  "opsCommands": 59,
7
8
  "canvasCommands": 35
8
9
  },
@@ -34,7 +35,8 @@
34
35
  "Mode semantics documented",
35
36
  "Generated help first-contact owners documented",
36
37
  "Onboarding metadata owner documented",
37
- "First-run onboarding proof owner documented"
38
+ "First-run onboarding proof owner documented",
39
+ "Hardcoded public-surface counts documented and validator-covered"
38
40
  ],
39
41
  "firstContactOwners": [
40
42
  "src/cli/help.ts",
@@ -26,6 +26,30 @@ $CLI_PREFIX status --daemon --output-format json
26
26
  EOF
27
27
  }
28
28
 
29
+ print_extension_readiness() {
30
+ cat <<EOF
31
+ # Extension readiness preflight:
32
+ $CLI_PREFIX status --daemon --output-format json
33
+ # Continue only when data.fingerprintCurrent === true, data.relay.extensionConnected === true, and data.relay.extensionHandshakeComplete === true.
34
+ # Treat data.relay.opsConnected, data.relay.canvasConnected, and data.relay.cdpConnected as diagnostic or lane-specific presence fields.
35
+ EOF
36
+ }
37
+
38
+ print_pinterest_multi_pin_harvest_guidance() {
39
+ cat <<EOF
40
+ # Multi-pin Pinterest harvest agent pattern. This is guidance over inspiredesign harvest, not a standalone product workflow.
41
+ # 1. Run the query discovery command above with --query and --provider social/pinterest.
42
+ # 2. Read meta.discovery.acceptedUrls from the JSON output or artifact metadata.
43
+ # 3. Keep only canonical https://www.pinterest.com/pin/<id>/ URLs.
44
+ # 4. Run one canonical harvest per selected pin:
45
+ $CLI_PREFIX inspiredesign harvest --brief "Premium digital photography studio landing page" --provider social/pinterest --url "https://www.pinterest.com/pin/<pin-id>/" --max-references 1 --visual-evidence required --browser-mode extension --use-cookies --cookie-policy required --challenge-automation-mode browser_with_helper --mode json --output-format json --output-dir "artifacts/pinterest-harvest/<pin-id>"
46
+ # 5. Extension-mode canonical harvest opens the exact canonical pin in the extension before byte-backed pin-media extraction.
47
+ # 6. Trust only outputs with nextStepGuidance.readiness=ready, non-empty ranked-references.json, and pin-media-index.json, screenshot-index.json, or motion-evidence.json authority.
48
+ # 7. Use media-analysis.json for deterministic design facts from trusted saved pin media only. It is not readiness authority, and pin-media-index.json remains the only pin-media readiness authority.
49
+ # 8. Do not claim readable text extraction, exact copy, font families, OCR, model vision, Tesseract, OpenCV, Sharp, browser canvas analysis, new dependencies, or raw mediaAnalysis in canvas-plan.request.json.
50
+ EOF
51
+ }
52
+
29
53
  print_help() {
30
54
  cat <<'EOF'
31
55
  OpenDevBrowser workflow router
@@ -84,11 +108,17 @@ EOF
84
108
  print_daemon_preflight
85
109
  cat <<EOF
86
110
  # Pair with opendevbrowser-design-agent when the contract will flow into implementation or /canvas work.
87
- $CLI_PREFIX inspiredesign run --brief "Design a premium docs workspace" --url "https://example.com/reference-a" --url "https://example.com/reference-b" --capture-mode off --include-prototype-guidance --mode json --output-format json
111
+ # When --output-dir is omitted, inspect .opendevbrowser/inspiredesign/<runId> for workflow artifacts.
112
+ # URL-backed inspiredesign run forces deep capture for DOM/layout diagnostics; do not disable capture for URL-backed runs.
113
+ $CLI_PREFIX inspiredesign run --brief "Design a premium docs workspace" --url "https://example.com/reference-a" --url "https://example.com/reference-b" --include-prototype-guidance --mode json --output-format json
114
+ EOF
115
+ print_extension_readiness
116
+ cat <<EOF
88
117
  $CLI_PREFIX inspiredesign harvest --brief "Premium digital photography studio landing page" --query "Pinterest premium digital photography studio landing page cinematic parallax portfolio" --provider social/pinterest --max-references 5 --visual-evidence required --browser-mode extension --use-cookies --cookie-policy required --challenge-automation-mode browser_with_helper --mode json --output-format json
89
118
  # Inspect nextStepGuidance.readiness and doNotProceedIf before Canvas continuation. For non-ready evidence, follow recovery-first guidance.
90
- # Review visual-evidence.json, screenshot-index.json, ranked-references.json, and meta-prompt.md before design or Canvas work.
119
+ # Review visual-evidence.json, screenshot-index.json, motion-evidence.json, pin-media-evidence.json, pin-media-index.json, media-analysis.json, ranked-references.json, and meta-prompt.md before design or Canvas work.
91
120
  EOF
121
+ print_pinterest_multi_pin_harvest_guidance
92
122
  ;;
93
123
  parallel-multipage-safe)
94
124
  cat <<'EOF'
@@ -134,14 +164,14 @@ EOF
134
164
  cat <<EOF
135
165
  cat skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json
136
166
  cat skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json
137
- $CLI_PREFIX canvas --command canvas.session.open --params '{"requestId":"req_open_01","browserSessionId":"<browser-session-id>","documentId":null,"repoPath":null,"mode":"dual-track"}'
167
+ $CLI_PREFIX canvas --command canvas.session.open --params '{"requestId":"req_open_01","browserSessionId":"<browser-session-id>","documentId":null,"repoPath":null,"mode":"dual-track"}' --output-format json
138
168
  # Read handshake before any mutation. Inspect planStatus, preflightState, generationPlanRequirements.allowedValues, generationPlanIssues, and guidance.recommendedNextCommands.
139
- $CLI_PREFIX canvas --command canvas.plan.set --params-file skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json
169
+ $CLI_PREFIX canvas --command canvas.plan.set --params-file skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json --output-format json
140
170
  # Replace placeholders in the plan file with canvasSessionId, leaseId, and documentId from the open response.
141
171
  # If canvas.plan.set succeeds with planStatus=accepted or preflightState=plan_accepted, follow the returned guidance into canvas.document.patch.
142
172
  # If canvas.plan.set returns generation_plan_invalid, read guidance.nextStepGuidance, guidance.paramsExamples, guidance.fieldExamples, guidance.validationChecks, and guidance.doNotProceedIf, then repair the params file and retry.
143
173
  # Optional diagnostics after generation_plan_invalid:
144
- # $CLI_PREFIX canvas --command canvas.plan.get --params '{"requestId":"req_plan_get_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>"}'
174
+ # $CLI_PREFIX canvas --command canvas.plan.get --params '{"requestId":"req_plan_get_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>"}' --output-format json
145
175
  # or re-read with canvas.capabilities.get to inspect generationPlanIssues before resubmitting canvas.plan.set.
146
176
  EOF
147
177
  ;;
@@ -151,10 +181,10 @@ EOF
151
181
  cat skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md
152
182
  cat skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json
153
183
  cat skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json
154
- $CLI_PREFIX canvas --command canvas.feedback.poll --params '{"requestId":"req_feedback_01","canvasSessionId":"<canvas-session-id>","documentId":"<document-id>","targetId":"<target-id>","afterCursor":null}'
184
+ $CLI_PREFIX canvas --command canvas.feedback.poll --params '{"requestId":"req_feedback_01","canvasSessionId":"<canvas-session-id>","documentId":"<document-id>","targetId":"<target-id>","afterCursor":null}' --output-format json
155
185
  # Verify every feedback item is target-attributed and uses approved categories. If feedback returns preflight-blocker, return to canvas.plan.set first.
156
- $CLI_PREFIX canvas --command canvas.preview.refresh --params '{"requestId":"req_refresh_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","targetId":"<target-id>","refreshMode":"full"}'
157
- $CLI_PREFIX canvas --command canvas.document.save --params '{"requestId":"req_save_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>","repoPath":null}'
186
+ $CLI_PREFIX canvas --command canvas.preview.refresh --params '{"requestId":"req_refresh_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","targetId":"<target-id>","refreshMode":"full"}' --output-format json
187
+ $CLI_PREFIX canvas --command canvas.document.save --params '{"requestId":"req_save_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>","repoPath":null}' --output-format json
158
188
  # Save should fail or warn when requiredBeforeSave governance blocks remain unresolved.
159
189
  EOF
160
190
  ;;
@@ -168,6 +198,8 @@ EOF
168
198
  release-direct-gates)
169
199
  print_daemon_preflight
170
200
  cat <<'EOF'
201
+ # artifacts/release/vX.Y.Z paths are local-only release proof outputs.
202
+ # Normal omitted workflow outputs persist under .opendevbrowser/<workflow>/<runId>.
171
203
  mkdir -p artifacts/release/vX.Y.Z
172
204
  node scripts/provider-direct-runs.mjs --release-gate --out artifacts/release/vX.Y.Z/provider-direct-runs.json
173
205
  node scripts/live-regression-direct.mjs --release-gate --out artifacts/release/vX.Y.Z/live-regression-direct.json
@@ -197,6 +229,8 @@ OPENCODE_CONFIG_DIR="$WORKDIR/config" CODEX_HOME="$WORKDIR/codex-home" CLAUDECOD
197
229
  ./skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh
198
230
  ./skills/opendevbrowser-research/scripts/validate-skill-assets.sh
199
231
  ./skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh
232
+ # Explicit artifacts/skill-runtime-audit outputs are local-only audit proof.
233
+ # Omitted provider workflow outputs persist under .opendevbrowser/<workflow>/<runId>.
200
234
  node scripts/skill-runtime-audit.mjs --smoke --out artifacts/skill-runtime-audit/smoke.json
201
235
  node scripts/skill-runtime-audit.mjs --out artifacts/skill-runtime-audit/full.json
202
236
  EOF
@@ -207,22 +241,29 @@ EOF
207
241
  # Public-first YouTube transcript probe
208
242
  node $TRANSCRIPT_PROBE_PATH --url "https://www.youtube.com/watch?v=aircAruvnKk" --youtube-mode auto --out artifacts/capability-fix/youtube-transcript-auto.json
209
243
 
244
+ # When --output-dir or --out is omitted, inspect .opendevbrowser/<workflow>/<runId> for workflow artifacts.
245
+
210
246
  # Evidence-gated research primitive with explicit public source families
211
247
  # Load opendevbrowser-research first, then inspect records.json, context.json, meta.json, and report.md before publishing claims.
212
248
  $CLI_PREFIX research run --topic "Chrome extension debugging workflows" --days 30 --sources web,community --mode json --output-format json
213
249
 
214
250
  # Deterministic shopping reruns with explicit providers
215
- $CLI_PREFIX shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --mode json --output-format json
216
- $CLI_PREFIX shopping run --query "27 inch 4k monitor" --providers shopping/bestbuy,shopping/ebay --budget 350 --sort lowest_price --browser-mode managed --mode json --output-format json
251
+ $CLI_PREFIX shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json
252
+ $CLI_PREFIX shopping run --query "27 inch 4k monitor" --providers shopping/bestbuy,shopping/ebay --budget 350 --sort lowest_price --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json
217
253
 
218
254
  # Public-reference inspiredesign contract synthesis
219
- $CLI_PREFIX inspiredesign run --brief "Design a premium docs workspace" --url "https://example.com/reference-a" --url "https://example.com/reference-b" --capture-mode off --include-prototype-guidance --mode json --output-format json
220
-
255
+ $CLI_PREFIX inspiredesign run --brief "Design a premium docs workspace" --url "https://example.com/reference-a" --url "https://example.com/reference-b" --include-prototype-guidance --mode json --output-format json
256
+ EOF
257
+ print_extension_readiness
258
+ cat <<EOF
221
259
  # Browser-native Pinterest recipe. Continue only when nextStepGuidance.readiness is ready.
222
260
  $CLI_PREFIX inspiredesign harvest --brief "Premium digital photography studio landing page" --query "Pinterest premium digital photography studio landing page cinematic parallax portfolio" --provider social/pinterest --max-references 5 --visual-evidence required --browser-mode extension --use-cookies --cookie-policy required --challenge-automation-mode browser_with_helper --mode json --output-format json
261
+ EOF
262
+ print_pinterest_multi_pin_harvest_guidance
263
+ cat <<EOF
223
264
 
224
265
  # Region note: advisory unless output reports meta.selection.region_authoritative=true
225
- $CLI_PREFIX shopping run --query "wireless earbuds" --providers shopping/amazon --region us --browser-mode managed --mode json --output-format json
266
+ $CLI_PREFIX shopping run --query "wireless earbuds" --providers shopping/amazon --region us --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json
226
267
  EOF
227
268
  ;;
228
269
  surface-audit)
@@ -236,24 +277,24 @@ EOF
236
277
  ops-channel-check)
237
278
  cat <<EOF
238
279
  $CLI_PREFIX serve
239
- # Daemon preflight for daemon-backed workflows:
240
- $CLI_PREFIX status --daemon --output-format json
241
- # Continue only when data.fingerprintCurrent === true.
280
+ EOF
281
+ print_daemon_preflight
282
+ cat <<EOF
242
283
  $CLI_PREFIX launch --extension-only --wait-for-extension --output-format json
243
284
  $CLI_PREFIX status --daemon --output-format json
244
- # Verify fingerprintCurrent=true, opsConnected=true, and extensionHandshakeComplete=true
285
+ # Verify data.fingerprintCurrent=true, data.relay.extensionConnected=true, and data.relay.extensionHandshakeComplete=true after launch. Treat data.relay.opsConnected as diagnostic presence only.
245
286
  cat skills/opendevbrowser-best-practices/assets/templates/ops-request-envelope.json
246
287
  EOF
247
288
  ;;
248
289
  cdp-channel-check)
249
290
  cat <<EOF
250
291
  $CLI_PREFIX serve
251
- # Daemon preflight for daemon-backed workflows:
252
- $CLI_PREFIX status --daemon --output-format json
253
- # Continue only when data.fingerprintCurrent === true.
292
+ EOF
293
+ print_daemon_preflight
294
+ cat <<EOF
254
295
  $CLI_PREFIX launch --extension-only --extension-legacy --wait-for-extension --output-format json
255
296
  $CLI_PREFIX status --daemon --output-format json
256
- # Verify fingerprintCurrent=true and cdpConnected=true while legacy session is active
297
+ # Verify data.fingerprintCurrent=true, data.relay.extensionConnected=true, and data.relay.extensionHandshakeComplete=true after launch. data.relay.cdpConnected is active-legacy-session-only and true only while the legacy /cdp session is active.
257
298
  cat skills/opendevbrowser-best-practices/assets/templates/cdp-forward-envelope.json
258
299
  EOF
259
300
  ;;
@@ -98,3 +98,31 @@ resolve_odb_cli() {
98
98
  }
99
99
 
100
100
  resolve_odb_cli
101
+
102
+ require_odb_daemon_current() {
103
+ local status_json
104
+
105
+ if ! status_json="$("${ODB_CLI[@]}" status --daemon --output-format json)"; then
106
+ echo "OpenDevBrowser daemon preflight failed. Run: ${ODB_CLI[*]} status --daemon --output-format json" >&2
107
+ return 1
108
+ fi
109
+
110
+ if ! printf '%s\n' "$status_json" | node -e '
111
+ const fs = require("node:fs");
112
+ const input = fs.readFileSync(0, "utf8");
113
+ let payload;
114
+ try {
115
+ payload = JSON.parse(input);
116
+ } catch {
117
+ process.exit(1);
118
+ }
119
+ if (payload?.data?.fingerprintCurrent !== true) {
120
+ process.exit(1);
121
+ }
122
+ '; then
123
+ echo "OpenDevBrowser daemon is not current. Expected data.fingerprintCurrent === true from:" >&2
124
+ echo "${ODB_CLI[*]} status --daemon --output-format json" >&2
125
+ printf '%s\n' "$status_json" >&2
126
+ return 1
127
+ fi
128
+ }
@@ -68,8 +68,16 @@ const workflowMarkers = [
68
68
  "inspiredesign run",
69
69
  "inspiredesign harvest",
70
70
  "social/pinterest",
71
+ "meta.discovery.acceptedUrls",
72
+ "Multi-pin Pinterest harvest agent pattern",
73
+ "one canonical harvest per selected pin",
74
+ "opens the exact canonical pin in the extension",
71
75
  "nextStepGuidance.readiness",
72
76
  "visual-evidence.json",
77
+ "pin-media-index.json",
78
+ "media-analysis.json",
79
+ "deterministic design facts from trusted saved pin media",
80
+ "raw mediaAnalysis in canvas-plan.request.json",
73
81
  "--include-prototype-guidance",
74
82
  "canvas-preflight",
75
83
  "canvas-feedback-eval",
@@ -98,6 +106,13 @@ const parityGateMarkers = [
98
106
 
99
107
  const providerWorkflowPath = "artifacts/provider-workflows.md";
100
108
  const providerWorkflowMarkers = [
109
+ "Agent Pattern F: Pinterest Multi-Pin Design Harvest",
110
+ "meta.discovery.acceptedUrls",
111
+ "not a new product workflow",
112
+ "opens the exact pin in the extension",
113
+ "media-analysis.json",
114
+ "`pin-media-index.json` remains the only pin-media readiness authority",
115
+ "raw `mediaAnalysis` in `canvas-plan.request.json`",
101
116
  "## Release evidence lane",
102
117
  "node scripts/provider-direct-runs.mjs --release-gate --out artifacts/release/vX.Y.Z/provider-direct-runs.json",
103
118
  "node scripts/live-regression-direct.mjs --release-gate --out artifacts/release/vX.Y.Z/live-regression-direct.json",
@@ -88,6 +88,19 @@ if (!domain || !command) {
88
88
 
89
89
  const flags = parseFlags(rest);
90
90
 
91
+ if (domain === "status") {
92
+ emitJson({
93
+ data: {
94
+ fingerprintCurrent: true,
95
+ relay: {
96
+ extensionConnected: true,
97
+ extensionHandshakeComplete: true
98
+ }
99
+ }
100
+ });
101
+ process.exit(0);
102
+ }
103
+
91
104
  if (domain === "research" && command === "run") {
92
105
  const topic = String(flags.topic || "fixture topic");
93
106
  const days = String(flags.days || "30");
@@ -169,6 +169,7 @@ Use when a redesign needs external references or when the brief explicitly asks
169
169
  - Start with `artifacts/research-harvest-workflow.md`.
170
170
  - Capture `3` to `5` live references with OpenDevBrowser.
171
171
  - For Pinterest, use the browser-native `social/pinterest` recipe with extension mode and cookies instead of treating Pinterest as a default full provider.
172
+ - Before extension-mode Pinterest harvests, preflight `npx opendevbrowser status --daemon --output-format json` and continue only when `data.fingerprintCurrent === true`, `data.relay.extensionConnected === true`, and `data.relay.extensionHandshakeComplete === true`.
172
173
  - Inspect `nextStepGuidance.readiness`, `doNotProceedIf`, and recovery commands before using the bundle.
173
174
  - Record ready evidence in `assets/templates/reference-pattern-board.v1.json`.
174
175
  - Turn the synthesis into contract deltas before implementation.
@@ -188,6 +189,7 @@ Use when starting from screenshots, mocks, or an existing page.
188
189
  Use when the task should run through the design canvas.
189
190
 
190
191
  - Start with `canvas.session.open`; use `canvas.capabilities.get` only after you have a `canvasSessionId`.
192
+ - Use `--output-format json` for Canvas CLI commands whenever you read returned IDs, statuses, guidance, or follow-up fields.
191
193
  - Read the handshake and inspect `planStatus`, `preflightState`, `generationPlanRequirements.allowedValues`, `generationPlanIssues`, `guidance.recommendedNextCommands`, `guidance.nextStepGuidance`, params examples, field examples, validation checks, and do-not-proceed blockers before choosing the next command.
192
194
  - Treat `preflightState="handshake_read"` as the normal first-step checkpoint before `canvas.plan.set`; if the handshake already reports `plan_invalid`, repair the plan instead of mutating.
193
195
  - Fill the full design contract and extract the `generationPlan`.
@@ -2,7 +2,7 @@
2
2
 
3
3
  This file turns the design-agent skill into repeatable execution paths.
4
4
 
5
- ## Workflow A Contract-First Frontend Delivery
5
+ ## Workflow A - Contract-First Frontend Delivery
6
6
 
7
7
  Use when the task starts from a PRD, issue, or user request.
8
8
 
@@ -37,7 +37,7 @@ Use when the task starts from a PRD, issue, or user request.
37
37
  16. Implement the smallest coherent slice that satisfies the contract.
38
38
  17. Validate in an isolated fixture first, then in a real browser before declaring the work complete.
39
39
 
40
- ## Workflow B Screenshot Or Existing-Page Audit
40
+ ## Workflow B - Screenshot Or Existing-Page Audit
41
41
 
42
42
  Use when a screenshot, mock, or live page is the starting point.
43
43
 
@@ -71,7 +71,7 @@ Use when a screenshot, mock, or live page is the starting point.
71
71
  8. Record the audit in `assets/templates/design-audit-report.v1.md`.
72
72
  9. Implement changes only after the contract reflects the intended end state.
73
73
 
74
- ## Workflow C `/canvas` Contract-Governed Iteration
74
+ ## Workflow C - `/canvas` Contract-Governed Iteration
75
75
 
76
76
  Use when the work should flow through the OpenDevBrowser design canvas.
77
77
 
@@ -88,22 +88,24 @@ Use when the work should flow through the OpenDevBrowser design canvas.
88
88
 
89
89
  Canonical command order:
90
90
 
91
+ Use `--output-format json` whenever returned IDs, statuses, guidance, or follow-up fields are read from Canvas command output.
92
+
91
93
  ```bash
92
- npx opendevbrowser canvas --command canvas.session.open --params '{"requestId":"req_open_01","browserSessionId":"<browser-session-id>","documentId":null,"repoPath":null,"mode":"dual-track"}'
94
+ npx opendevbrowser canvas --command canvas.session.open --params '{"requestId":"req_open_01","browserSessionId":"<browser-session-id>","documentId":null,"repoPath":null,"mode":"dual-track"}' --output-format json
93
95
  # Inspect planStatus, preflightState, generationPlanRequirements.allowedValues, generationPlanIssues, guidance.recommendedNextCommands, guidance.nextStepGuidance, guidance.paramsExamples, guidance.fieldExamples, guidance.validationChecks, and guidance.doNotProceedIf before continuing.
94
- npx opendevbrowser canvas --command canvas.plan.set --params-file ./tmp/canvas-plan.json
96
+ npx opendevbrowser canvas --command canvas.plan.set --params-file ./tmp/canvas-plan.json --output-format json
95
97
  # If canvas.plan.set succeeds with planStatus=accepted or preflightState=plan_accepted, follow the returned guidance into canvas.document.patch.
96
98
  # If canvas.plan.set returns generation_plan_invalid, repair ./tmp/canvas-plan.json from guidance.paramsExamples before retrying.
97
99
  # Optional diagnostics after generation_plan_invalid:
98
- # npx opendevbrowser canvas --command canvas.plan.get --params '{"requestId":"req_plan_get_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>"}'
100
+ # npx opendevbrowser canvas --command canvas.plan.get --params '{"requestId":"req_plan_get_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>"}' --output-format json
99
101
  # or re-read with canvas.capabilities.get to inspect generationPlanIssues before resubmitting canvas.plan.set.
100
- npx opendevbrowser canvas --command canvas.document.patch --params-file ./tmp/canvas-patch.json
101
- npx opendevbrowser canvas --command canvas.preview.render --params '{"requestId":"req_preview_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","targetId":"<target-id>","projection":"canvas_html"}'
102
- npx opendevbrowser canvas --command canvas.feedback.poll --params '{"requestId":"req_feedback_01","canvasSessionId":"<canvas-session-id>","documentId":"<document-id>","targetId":"<target-id>","afterCursor":null}'
103
- npx opendevbrowser canvas --command canvas.document.save --params '{"requestId":"req_save_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>","repoPath":null}'
102
+ npx opendevbrowser canvas --command canvas.document.patch --params-file ./tmp/canvas-patch.json --output-format json
103
+ npx opendevbrowser canvas --command canvas.preview.render --params '{"requestId":"req_preview_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","targetId":"<target-id>","projection":"canvas_html"}' --output-format json
104
+ npx opendevbrowser canvas --command canvas.feedback.poll --params '{"requestId":"req_feedback_01","canvasSessionId":"<canvas-session-id>","documentId":"<document-id>","targetId":"<target-id>","afterCursor":null}' --output-format json
105
+ npx opendevbrowser canvas --command canvas.document.save --params '{"requestId":"req_save_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>","repoPath":null}' --output-format json
104
106
  ```
105
107
 
106
- ## Workflow D Real-Surface Validation
108
+ ## Workflow D - Real-Surface Validation
107
109
 
108
110
  Use when design quality must be demonstrated, not inferred.
109
111
 
@@ -123,7 +125,7 @@ Use when design quality must be demonstrated, not inferred.
123
125
  - no console or network regressions caused by the UI change
124
126
  7. If parity matters, repeat across supported surfaces before sign-off.
125
127
 
126
- ## Workflow E Performance Audit
128
+ ## Workflow E - Performance Audit
127
129
 
128
130
  Use when the screen is visually correct but interaction quality is poor.
129
131
 
@@ -143,7 +145,7 @@ npx opendevbrowser screenshot --session-id <session-id>
143
145
  npx opendevbrowser debug-trace-snapshot --session-id <session-id>
144
146
  ```
145
147
 
146
- ## Workflow F Ship Audit
148
+ ## Workflow F - Ship Audit
147
149
 
148
150
  Use after implementation and before final sign-off.
149
151
 
@@ -62,7 +62,7 @@ npx opendevbrowser launch --no-extension --start-url http://127.0.0.1:3000/previ
62
62
  npx opendevbrowser snapshot --session-id <session-id>
63
63
  npx opendevbrowser screenshot --session-id <session-id>
64
64
  npx opendevbrowser debug-trace-snapshot --session-id <session-id>
65
- npx opendevbrowser canvas --command canvas.preview.render --params '{"canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","targetId":"<target-id>","projection":"canvas_html"}'
65
+ npx opendevbrowser canvas --command canvas.preview.render --params '{"canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","targetId":"<target-id>","projection":"canvas_html"}' --output-format json
66
66
  ```
67
67
 
68
68
  Use the same fixture states as the contract when comparing preview and integrated behavior.
@@ -29,12 +29,16 @@ npx opendevbrowser inspiredesign harvest \
29
29
  --max-references 5 \
30
30
  --visual-evidence required \
31
31
  --browser-mode managed \
32
- --mode json
32
+ --mode json \
33
+ --output-format json
33
34
  ```
34
35
 
35
- Use the browser-native Pinterest site recipe when the brief specifically needs logged-in Pinterest search. Pinterest is not a default full social provider, and the workflow should not widen to unrelated sources without user confirmation:
36
+ Use the browser-native Pinterest site recipe when the brief specifically needs logged-in Pinterest search. Pinterest is not a default full social provider, and the workflow should not widen to unrelated sources without user confirmation.
37
+
38
+ Before the extension-mode Pinterest harvest, preflight the daemon with JSON status output and continue only when `data.fingerprintCurrent === true`, `data.relay.extensionConnected === true`, and `data.relay.extensionHandshakeComplete === true`:
36
39
 
37
40
  ```bash
41
+ npx opendevbrowser status --daemon --output-format json
38
42
  npx opendevbrowser inspiredesign harvest \
39
43
  --brief "Premium digital photography studio landing page" \
40
44
  --query "Pinterest premium digital photography studio landing page cinematic parallax portfolio" \
@@ -57,7 +61,8 @@ npx opendevbrowser inspiredesign harvest \
57
61
  --url https://example.com/reference-a \
58
62
  --url https://example.com/reference-b \
59
63
  --visual-evidence required \
60
- --mode json
64
+ --mode json \
65
+ --output-format json
61
66
  ```
62
67
 
63
68
  Harvest defaults:
@@ -82,11 +87,13 @@ Then inspect these files before `/canvas` or code changes:
82
87
  1. `advanced-brief.md` for the reference-first creative brief.
83
88
  2. `ranked-references.json` for rank, score, confidence, visual strengths, visual risks, rejected references, and selection reasons.
84
89
  3. `visual-evidence.json` and `screenshot-index.json` for artifact-relative PNG paths, hashes, byte counts, viewport metadata when available, provenance, and warnings.
85
- 4. PNG files under `visual-evidence/<referenceId>/viewport.png` for actual visual review.
86
- 5. `meta-prompt.md` for borrow guidance, reject guidance, motion posture, accessibility constraints, no-copy warning, and validation gates.
87
- 6. `canvas-plan.request.json` and `design-agent-handoff.json` only after the visual synthesis is accepted and `nextStepGuidance.readiness` is `ready`.
90
+ 4. `motion-evidence.json` for screencast replay and preview paths when motion evidence is captured.
91
+ 5. `pin-media-evidence.json` and `pin-media-index.json` for persisted first-party Pinterest pin media proof. Remote media URLs alone are not proof.
92
+ 6. PNG files under `visual-evidence/<referenceId>/viewport.png` and pin-media files under `pin-media-evidence/<referenceId>/` for actual visual review.
93
+ 7. `meta-prompt.md` for borrow guidance, reject guidance, motion posture, accessibility constraints, no-copy warning, and validation gates.
94
+ 8. `canvas-plan.request.json` and `design-agent-handoff.json` only after the visual synthesis is accepted and `nextStepGuidance.readiness` is `ready`.
88
95
 
89
- JSON files are metadata-only. They must not contain base64 screenshots, absolute temp paths, full DOM, or full snapshot text.
96
+ JSON files are metadata-only. They must not contain base64 screenshots, absolute temp paths, full DOM, full snapshot text, or remote media as product-ready proof.
90
97
 
91
98
  ## Manual Evidence Fallback
92
99
 
@@ -17,6 +17,7 @@
17
17
  "dom",
18
18
  "visual"
19
19
  ],
20
+ "evidenceAuthority": "ranked_reference",
20
21
  "intentMatched": true,
21
22
  "layoutRecipe": "",
22
23
  "contentHierarchy": [],
@@ -67,6 +67,9 @@ cat skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.
67
67
  cat skills/opendevbrowser-design-agent/artifacts/external-pattern-synthesis.md
68
68
  cat skills/opendevbrowser-design-agent/artifacts/component-pattern-index.md
69
69
  cat skills/opendevbrowser-design-agent/artifacts/existing-surface-adaptation.md
70
+ # Daemon preflight for extension-mode Pinterest harvest:
71
+ $CLI_PREFIX status --daemon --output-format json
72
+ # Continue only when data.fingerprintCurrent === true, data.relay.extensionConnected === true, and data.relay.extensionHandshakeComplete === true.
70
73
  $CLI_PREFIX inspiredesign harvest --brief "Premium digital photography studio landing page" --query "Pinterest premium digital photography studio landing page cinematic parallax portfolio" --provider social/pinterest --max-references 5 --visual-evidence required --browser-mode extension --use-cookies --cookie-policy required --challenge-automation-mode browser_with_helper --mode json --output-format json
71
74
  # Inspect nextStepGuidance.readiness and doNotProceedIf first. Use recovery-first guidance unless readiness is ready.
72
75
  $CLI_PREFIX launch --no-extension --start-url https://example.com
@@ -102,19 +105,19 @@ cat skills/opendevbrowser-design-agent/artifacts/design-contract-playbook.md
102
105
  cat skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md
103
106
  cat skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json
104
107
  ./skills/opendevbrowser-design-agent/scripts/extract-canvas-plan.sh ./tmp/design-contract.json > ./tmp/canvas-plan.json
105
- $CLI_PREFIX canvas --command canvas.session.open --params '{"requestId":"req_open_01","browserSessionId":"<browser-session-id>","documentId":null,"repoPath":null,"mode":"dual-track"}'
108
+ $CLI_PREFIX canvas --command canvas.session.open --params '{"requestId":"req_open_01","browserSessionId":"<browser-session-id>","documentId":null,"repoPath":null,"mode":"dual-track"}' --output-format json
106
109
  # Inspect planStatus, preflightState, generationPlanRequirements.allowedValues, generationPlanIssues, guidance.recommendedNextCommands, guidance.nextStepGuidance, guidance.paramsExamples, guidance.fieldExamples, guidance.validationChecks, and guidance.doNotProceedIf before continuing.
107
110
  # Treat preflightState=handshake_read as the normal first-step checkpoint before canvas.plan.set.
108
- $CLI_PREFIX canvas --command canvas.plan.set --params-file ./tmp/canvas-plan.json
111
+ $CLI_PREFIX canvas --command canvas.plan.set --params-file ./tmp/canvas-plan.json --output-format json
109
112
  # If canvas.plan.set succeeds with planStatus=accepted or preflightState=plan_accepted, follow the returned guidance into canvas.document.patch.
110
113
  # If canvas.plan.set returns generation_plan_invalid, repair ./tmp/canvas-plan.json from guidance.paramsExamples before retrying.
111
114
  # Optional diagnostics after generation_plan_invalid:
112
- # $CLI_PREFIX canvas --command canvas.plan.get --params '{"requestId":"req_plan_get_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>"}'
115
+ # $CLI_PREFIX canvas --command canvas.plan.get --params '{"requestId":"req_plan_get_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>"}' --output-format json
113
116
  # or re-read with canvas.capabilities.get to inspect generationPlanIssues before resubmitting canvas.plan.set.
114
- $CLI_PREFIX canvas --command canvas.document.patch --params-file ./tmp/canvas-patch.json
115
- $CLI_PREFIX canvas --command canvas.preview.render --params '{"requestId":"req_preview_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","targetId":"<target-id>","prototypeId":"<prototype-id>"}'
116
- $CLI_PREFIX canvas --command canvas.feedback.poll --params '{"requestId":"req_feedback_01","canvasSessionId":"<canvas-session-id>","documentId":"<document-id>","targetId":"<target-id>","afterCursor":null}'
117
- $CLI_PREFIX canvas --command canvas.document.save --params '{"requestId":"req_save_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>","repoPath":null}'
117
+ $CLI_PREFIX canvas --command canvas.document.patch --params-file ./tmp/canvas-patch.json --output-format json
118
+ $CLI_PREFIX canvas --command canvas.preview.render --params '{"requestId":"req_preview_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","targetId":"<target-id>","prototypeId":"<prototype-id>"}' --output-format json
119
+ $CLI_PREFIX canvas --command canvas.feedback.poll --params '{"requestId":"req_feedback_01","canvasSessionId":"<canvas-session-id>","documentId":"<document-id>","targetId":"<target-id>","afterCursor":null}' --output-format json
120
+ $CLI_PREFIX canvas --command canvas.document.save --params '{"requestId":"req_save_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>","repoPath":null}' --output-format json
118
121
  EOF
119
122
  ;;
120
123
  real-surface-validation)
@@ -41,7 +41,7 @@ Use this skill when a task asks for animation, motion language, transition syste
41
41
 
42
42
  ## InspireDesign Harvest Inputs
43
43
 
44
- When an InspireDesign harvest bundle is available, inspect `nextStepGuidance.readiness` and `doNotProceedIf` before selecting motion patterns. Read `meta-prompt.md`, `ranked-references.json`, `visual-evidence.json`, `screenshot-index.json`, and the referenced PNG files only after the bundle is ready or while following recovery guidance. Treat harvested motion posture as evidence-backed design intent, not permission to add dependencies or copy source-brand choreography. Carry accepted cues into the motion contract with explicit reduced-motion behavior, device posture, frame budget, and temporal proof requirements.
44
+ When an InspireDesign harvest bundle is available, inspect `nextStepGuidance.readiness` and `doNotProceedIf` before selecting motion patterns. Read `meta-prompt.md`, `ranked-references.json`, `visual-evidence.json`, `screenshot-index.json`, `motion-evidence.json`, `pin-media-evidence.json`, `pin-media-index.json`, and the referenced PNG or pin-media files only after the bundle is ready or while following recovery guidance. Treat harvested motion posture as evidence-backed design intent, not permission to add dependencies or copy source-brand choreography. Pinterest video posters can support still-image cues through pin-media evidence, but motion timing still requires screencast authority. Carry accepted cues into the motion contract with explicit reduced-motion behavior, device posture, frame budget, and temporal proof requirements.
45
45
 
46
46
  ## Motion Contract
47
47
 
@@ -65,11 +65,12 @@ The `render-video-brief.sh` helper adds:
65
65
  ## What the User Should Do
66
66
 
67
67
  1. Pick product URL or product name.
68
- 2. Run collection workflow and confirm output pack path.
69
- 3. Review generated manifest/copy/features for accuracy and check whether the pack is visual-ready or metadata-first.
70
- 4. Run `./skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh` to generate production instructions and visual sourcing notes.
68
+ 2. Before daemon-backed `product-video run` workflows, run `opendevbrowser status --daemon --output-format json` and continue only when `data.fingerprintCurrent === true`.
69
+ 3. Run collection workflow and confirm output pack path.
70
+ 4. Review generated manifest/copy/features for accuracy and check whether the pack is visual-ready or metadata-first.
71
+ 5. Run `./skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh` to generate production instructions and visual sourcing notes.
71
72
  Canonical helper path: `./skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh`.
72
- 5. If no visuals were captured, source or capture visuals before handing the brief to the editor/creator pipeline.
73
+ 6. If no visuals were captured, source or capture visuals before handing the brief to the editor/creator pipeline.
73
74
 
74
75
  ## Parallel Multitab Alignment
75
76
 
@@ -9,5 +9,6 @@ fi
9
9
  script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
10
  # shellcheck source=../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh
11
11
  source "$script_dir/../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh"
12
+ require_odb_daemon_current
12
13
 
13
14
  "${ODB_CLI[@]}" product-video run --product-url "$1" --include-screenshots --include-all-images=false
@@ -10,6 +10,7 @@ VALUE="$1"
10
10
  script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
11
  # shellcheck source=../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh
12
12
  source "$script_dir/../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh"
13
+ require_odb_daemon_current
13
14
 
14
15
  if [[ "$VALUE" == http* ]]; then
15
16
  "${ODB_CLI[@]}" product-video run --product-url "$VALUE"
@@ -9,5 +9,6 @@ fi
9
9
  script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
10
  # shellcheck source=../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh
11
11
  source "$script_dir/../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh"
12
+ require_odb_daemon_current
12
13
 
13
14
  "${ODB_CLI[@]}" product-video run --product-url "$1" --include-all-images --include-screenshots=false
@@ -62,6 +62,10 @@ for rel in scripts/collect-product.sh scripts/capture-screenshots.sh scripts/dow
62
62
  echo "Workflow wrapper missing ODB_CLI invocation: $rel" >&2
63
63
  status=1
64
64
  fi
65
+ if [[ "$rel" == "scripts/collect-product.sh" || "$rel" == "scripts/capture-screenshots.sh" || "$rel" == "scripts/download-images.sh" || "$rel" == "scripts/write-manifest.sh" ]] && ! grep -Fq "require_odb_daemon_current" "$root/$rel"; then
66
+ echo "Workflow wrapper missing daemon fingerprint preflight: $rel" >&2
67
+ status=1
68
+ fi
65
69
  fi
66
70
  done
67
71
 
@@ -13,6 +13,7 @@ mkdir -p "$OUTDIR"
13
13
  script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
14
  # shellcheck source=../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh
15
15
  source "$script_dir/../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh"
16
+ require_odb_daemon_current
16
17
 
17
18
  cmd=("${ODB_CLI[@]}" product-video run --output-dir "$OUTDIR" --output-format json)
18
19
  if [[ "$VALUE" == http* ]]; then
@@ -38,6 +38,7 @@ Load this skill before research tasks. Use it to plan source families, gather pr
38
38
 
39
39
  ## Core Rules
40
40
 
41
+ - Before daemon-backed `research run` workflows, run `opendevbrowser status --daemon --output-format json` and continue only when `data.fingerprintCurrent === true`.
41
42
  - Define timebox first (`--days` or `--from/--to`).
42
43
  - Choose explicit source families before invoking the CLI primitive: `web`, `community`, `social`, `shopping`, or a deliberate combination such as `web,community`.
43
44
  - Treat `auto` as a source-family selector, not a reliability guarantee.
@@ -12,5 +12,6 @@ MODE="$2"
12
12
  script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
13
  # shellcheck source=../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh
14
14
  source "$script_dir/../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh"
15
+ require_odb_daemon_current
15
16
 
16
17
  "${ODB_CLI[@]}" research run --topic "$TOPIC" --mode "$MODE"
@@ -14,6 +14,7 @@ SOURCES="${4:-}"
14
14
  script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
15
  # shellcheck source=../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh
16
16
  source "$script_dir/../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh"
17
+ require_odb_daemon_current
17
18
 
18
19
  cmd=("${ODB_CLI[@]}" research run --topic "$TOPIC" --days "$DAYS" --mode "$MODE")
19
20
  if [[ -n "$SOURCES" ]]; then
@@ -153,6 +153,10 @@ for rel in scripts/run-research.sh scripts/render-output.sh scripts/write-artifa
153
153
  echo "Workflow wrapper missing ODB_CLI invocation: $rel" >&2
154
154
  status=1
155
155
  fi
156
+ if ! grep -Fq "require_odb_daemon_current" "$root/$rel"; then
157
+ echo "Workflow wrapper missing daemon fingerprint preflight: $rel" >&2
158
+ status=1
159
+ fi
156
160
  fi
157
161
  done
158
162
 
@@ -12,6 +12,7 @@ OUTDIR="$2"
12
12
  script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
13
  # shellcheck source=../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh
14
14
  source "$script_dir/../../opendevbrowser-best-practices/scripts/resolve-odb-cli.sh"
15
+ require_odb_daemon_current
15
16
 
16
17
  json_output="$("${ODB_CLI[@]}" research run --topic "$TOPIC" --mode path --output-dir "$OUTDIR" --output-format json)"
17
18
  printf '%s\n' "$json_output"