opendevbrowser 0.0.19 → 0.0.21

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 (173) hide show
  1. package/README.md +32 -24
  2. package/dist/automation/coordinator.d.ts +61 -2
  3. package/dist/automation/coordinator.d.ts.map +1 -1
  4. package/dist/browser/browser-manager.d.ts +6 -1
  5. package/dist/browser/browser-manager.d.ts.map +1 -1
  6. package/dist/browser/canvas-manager.d.ts +4 -0
  7. package/dist/browser/canvas-manager.d.ts.map +1 -1
  8. package/dist/browser/manager-types.d.ts +6 -1
  9. package/dist/browser/manager-types.d.ts.map +1 -1
  10. package/dist/browser/ops-browser-manager.d.ts +6 -1
  11. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  12. package/dist/browser/screencast-recorder.d.ts.map +1 -1
  13. package/dist/browser/session-inspector.d.ts +39 -0
  14. package/dist/browser/session-inspector.d.ts.map +1 -1
  15. package/dist/canvas/document-store.d.ts +14 -5
  16. package/dist/canvas/document-store.d.ts.map +1 -1
  17. package/dist/canvas/starters/catalog.d.ts.map +1 -1
  18. package/dist/canvas/types.d.ts +120 -9
  19. package/dist/canvas/types.d.ts.map +1 -1
  20. package/dist/challenges/action-loop.d.ts +2 -1
  21. package/dist/challenges/action-loop.d.ts.map +1 -1
  22. package/dist/challenges/capture.d.ts +14 -0
  23. package/dist/challenges/capture.d.ts.map +1 -0
  24. package/dist/challenges/index.d.ts +3 -1
  25. package/dist/challenges/index.d.ts.map +1 -1
  26. package/dist/challenges/inspect-plan.d.ts +40 -0
  27. package/dist/challenges/inspect-plan.d.ts.map +1 -0
  28. package/dist/challenges/orchestrator.d.ts.map +1 -1
  29. package/dist/challenges/types.d.ts +34 -0
  30. package/dist/challenges/types.d.ts.map +1 -1
  31. package/dist/{chunk-YBQECXZX.js → chunk-3VA6XR25.js} +3 -3
  32. package/dist/chunk-3VA6XR25.js.map +1 -0
  33. package/dist/{chunk-W4IHGDXV.js → chunk-4KVXCXV3.js} +25778 -24279
  34. package/dist/chunk-4KVXCXV3.js.map +1 -0
  35. package/dist/{chunk-5FZQJRBQ.js → chunk-ZE2E7ZGH.js} +3013 -1010
  36. package/dist/chunk-ZE2E7ZGH.js.map +1 -0
  37. package/dist/cli/commands/challenge-automation-mode.d.ts +3 -0
  38. package/dist/cli/commands/challenge-automation-mode.d.ts.map +1 -0
  39. package/dist/cli/commands/inspiredesign.d.ts +25 -0
  40. package/dist/cli/commands/inspiredesign.d.ts.map +1 -0
  41. package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
  42. package/dist/cli/commands/nav/review-desktop.d.ts +7 -0
  43. package/dist/cli/commands/nav/review-desktop.d.ts.map +1 -0
  44. package/dist/cli/commands/nav/review-shared.d.ts +10 -0
  45. package/dist/cli/commands/nav/review-shared.d.ts.map +1 -0
  46. package/dist/cli/commands/nav/review.d.ts.map +1 -1
  47. package/dist/cli/commands/serve.d.ts.map +1 -1
  48. package/dist/cli/commands/session/inspector-audit.d.ts +7 -0
  49. package/dist/cli/commands/session/inspector-audit.d.ts.map +1 -0
  50. package/dist/cli/commands/session/inspector-plan.d.ts +7 -0
  51. package/dist/cli/commands/session/inspector-plan.d.ts.map +1 -0
  52. package/dist/cli/commands/session/inspector-shared.d.ts +11 -0
  53. package/dist/cli/commands/session/inspector-shared.d.ts.map +1 -0
  54. package/dist/cli/commands/session/inspector.d.ts +1 -11
  55. package/dist/cli/commands/session/inspector.d.ts.map +1 -1
  56. package/dist/cli/commands/status-capabilities.d.ts +7 -0
  57. package/dist/cli/commands/status-capabilities.d.ts.map +1 -0
  58. package/dist/cli/daemon-client.d.ts.map +1 -1
  59. package/dist/cli/daemon-commands.d.ts.map +1 -1
  60. package/dist/cli/daemon-status.d.ts +5 -0
  61. package/dist/cli/daemon-status.d.ts.map +1 -1
  62. package/dist/cli/daemon.d.ts +5 -0
  63. package/dist/cli/daemon.d.ts.map +1 -1
  64. package/dist/cli/help.d.ts +2 -0
  65. package/dist/cli/help.d.ts.map +1 -1
  66. package/dist/cli/index.js +660 -244
  67. package/dist/cli/index.js.map +1 -1
  68. package/dist/cli/remote-manager.d.ts +6 -0
  69. package/dist/cli/remote-manager.d.ts.map +1 -1
  70. package/dist/cli/utils/parse.d.ts +1 -0
  71. package/dist/cli/utils/parse.d.ts.map +1 -1
  72. package/dist/cli/utils/skills.d.ts +1 -1
  73. package/dist/cli/utils/skills.d.ts.map +1 -1
  74. package/dist/cli/utils/workflow-message.d.ts +3 -0
  75. package/dist/cli/utils/workflow-message.d.ts.map +1 -1
  76. package/dist/config.d.ts +1 -0
  77. package/dist/config.d.ts.map +1 -1
  78. package/dist/core/bootstrap.d.ts.map +1 -1
  79. package/dist/core/runtime-assemblies.d.ts +2 -1
  80. package/dist/core/runtime-assemblies.d.ts.map +1 -1
  81. package/dist/core/types.d.ts +1 -1
  82. package/dist/core/types.d.ts.map +1 -1
  83. package/dist/desktop/runtime.d.ts +1 -0
  84. package/dist/desktop/runtime.d.ts.map +1 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +729 -448
  87. package/dist/index.js.map +1 -1
  88. package/dist/inspiredesign/handoff.d.ts +34 -0
  89. package/dist/inspiredesign/handoff.d.ts.map +1 -0
  90. package/dist/opendevbrowser.d.ts.map +1 -1
  91. package/dist/opendevbrowser.js +729 -448
  92. package/dist/opendevbrowser.js.map +1 -1
  93. package/dist/providers/browser-fallback.d.ts.map +1 -1
  94. package/dist/providers/constraint.d.ts +11 -0
  95. package/dist/providers/constraint.d.ts.map +1 -1
  96. package/dist/providers/cookie-source.d.ts +8 -0
  97. package/dist/providers/cookie-source.d.ts.map +1 -0
  98. package/dist/providers/index.d.ts.map +1 -1
  99. package/dist/providers/inspiredesign-capture.d.ts +17 -0
  100. package/dist/providers/inspiredesign-capture.d.ts.map +1 -0
  101. package/dist/providers/inspiredesign-contract.d.ts +110 -0
  102. package/dist/providers/inspiredesign-contract.d.ts.map +1 -0
  103. package/dist/providers/renderer.d.ts +23 -0
  104. package/dist/providers/renderer.d.ts.map +1 -1
  105. package/dist/providers/runtime-bundle.d.ts +2 -1
  106. package/dist/providers/runtime-bundle.d.ts.map +1 -1
  107. package/dist/providers/runtime-factory.d.ts +4 -2
  108. package/dist/providers/runtime-factory.d.ts.map +1 -1
  109. package/dist/providers/shopping/index.d.ts +1 -1
  110. package/dist/providers/types.d.ts +3 -2
  111. package/dist/providers/types.d.ts.map +1 -1
  112. package/dist/providers/workflow-contracts.d.ts +1 -1
  113. package/dist/providers/workflow-contracts.d.ts.map +1 -1
  114. package/dist/providers/workflow-handoff.d.ts +14 -0
  115. package/dist/providers/workflow-handoff.d.ts.map +1 -0
  116. package/dist/providers/workflows.d.ts +21 -2
  117. package/dist/providers/workflows.d.ts.map +1 -1
  118. package/dist/{providers-G36AM3Z2.js → providers-ZIVHHH4F.js} +6 -2
  119. package/dist/public-surface/generated-manifest.d.ts +143 -7
  120. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  121. package/dist/public-surface/source.d.ts +102 -3
  122. package/dist/public-surface/source.d.ts.map +1 -1
  123. package/dist/relay/protocol.d.ts +1 -1
  124. package/dist/relay/protocol.d.ts.map +1 -1
  125. package/dist/relay/relay-server.d.ts +1 -0
  126. package/dist/relay/relay-server.d.ts.map +1 -1
  127. package/dist/skills/skill-loader.js +1 -1
  128. package/dist/tools/automation-shared.d.ts +6 -0
  129. package/dist/tools/automation-shared.d.ts.map +1 -0
  130. package/dist/tools/index.d.ts.map +1 -1
  131. package/dist/tools/inspiredesign_run.d.ts +4 -0
  132. package/dist/tools/inspiredesign_run.d.ts.map +1 -0
  133. package/dist/tools/review_desktop.d.ts +4 -0
  134. package/dist/tools/review_desktop.d.ts.map +1 -0
  135. package/dist/tools/session_inspector.d.ts.map +1 -1
  136. package/dist/tools/session_inspector_audit.d.ts +4 -0
  137. package/dist/tools/session_inspector_audit.d.ts.map +1 -0
  138. package/dist/tools/session_inspector_plan.d.ts +4 -0
  139. package/dist/tools/session_inspector_plan.d.ts.map +1 -0
  140. package/dist/tools/status_capabilities.d.ts +4 -0
  141. package/dist/tools/status_capabilities.d.ts.map +1 -0
  142. package/extension/dist/background.js +70 -10
  143. package/extension/dist/canvas/canvas-runtime.js +14 -1
  144. package/extension/dist/ops/ops-runtime.js +18 -1
  145. package/extension/dist/popup.js +29 -16
  146. package/extension/dist/services/ConnectionManager.js +27 -2
  147. package/extension/manifest.json +1 -1
  148. package/extension/popup.html +11 -0
  149. package/package.json +5 -5
  150. package/skills/AGENTS.md +2 -2
  151. package/skills/opendevbrowser-best-practices/SKILL.md +50 -15
  152. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +31 -12
  153. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +64 -15
  154. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +4 -0
  155. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +11 -10
  156. package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +28 -22
  157. package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +18 -17
  158. package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +135 -17
  159. package/skills/opendevbrowser-best-practices/assets/templates/skill-runtime-pack-matrix.json +55 -8
  160. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +18 -4
  161. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +16 -4
  162. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +3 -1
  163. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +68 -25
  164. package/skills/opendevbrowser-design-agent/SKILL.md +9 -4
  165. package/skills/opendevbrowser-design-agent/artifacts/design-workflows.md +15 -6
  166. package/skills/opendevbrowser-design-agent/assets/templates/canvas-generation-plan.design.v1.json +18 -17
  167. package/skills/opendevbrowser-design-agent/scripts/design-workflow.sh +11 -0
  168. package/skills/opendevbrowser-design-agent/scripts/validate-skill-assets.sh +57 -0
  169. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +2 -2
  170. package/dist/chunk-5FZQJRBQ.js.map +0 -1
  171. package/dist/chunk-W4IHGDXV.js.map +0 -1
  172. package/dist/chunk-YBQECXZX.js.map +0 -1
  173. /package/dist/{providers-G36AM3Z2.js.map → providers-ZIVHHH4F.js.map} +0 -0
@@ -77,20 +77,29 @@ Use when the work should flow through the OpenDevBrowser design canvas.
77
77
 
78
78
  1. Open a canvas session.
79
79
  2. Read the handshake and document context.
80
- 3. Fill the full design contract.
81
- 4. Extract the `generationPlan`.
82
- 5. Send `canvas.plan.set`.
83
- 6. Mutate with `canvas.document.patch`.
84
- 7. Poll feedback and refresh preview until the contract and runtime match.
80
+ 3. Inspect `planStatus`, `preflightState`, `generationPlanRequirements.allowedValues`, `generationPlanIssues`, and `guidance.recommendedNextCommands` before moving on.
81
+ 4. Treat `preflightState="handshake_read"` as the normal first-step checkpoint; if the handshake is already reporting `plan_invalid`, repair the plan instead of mutating.
82
+ 5. Fill the full design contract.
83
+ 6. Extract the `generationPlan`.
84
+ 7. Send `canvas.plan.set`.
85
+ 8. If the response is accepted, read `guidance.recommendedNextCommands` again and mutate with `canvas.document.patch`.
86
+ 9. If the response fails with `generation_plan_invalid`, inspect `details.missingFields`, `details.issues`, and `generationPlanIssues`, then optionally re-read with `canvas.plan.get` or `canvas.capabilities.get`.
87
+ 10. Render preview, poll feedback, and save or export until the contract and runtime match.
85
88
 
86
89
  Canonical command order:
87
90
 
88
91
  ```bash
89
92
  npx opendevbrowser canvas --command canvas.session.open --params '{"requestId":"req_open_01","browserSessionId":"<browser-session-id>","documentId":null,"repoPath":null,"mode":"dual-track"}'
93
+ # Inspect planStatus, preflightState, generationPlanRequirements.allowedValues, generationPlanIssues, and guidance.recommendedNextCommands before continuing.
90
94
  npx opendevbrowser canvas --command canvas.plan.set --params-file ./tmp/canvas-plan.json
95
+ # If canvas.plan.set succeeds with planStatus=accepted or preflightState=plan_accepted, follow the returned guidance into canvas.document.patch.
96
+ # Optional diagnostics after generation_plan_invalid:
97
+ # npx opendevbrowser canvas --command canvas.plan.get --params '{"requestId":"req_plan_get_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>"}'
98
+ # or re-read with canvas.capabilities.get to inspect generationPlanIssues before resubmitting canvas.plan.set.
91
99
  npx opendevbrowser canvas --command canvas.document.patch --params-file ./tmp/canvas-patch.json
92
- npx opendevbrowser canvas --command canvas.feedback.poll --params '{"requestId":"req_feedback_01","canvasSessionId":"<canvas-session-id>","documentId":"<document-id>","targetId":"<target-id>","afterCursor":null}'
93
100
  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"}'
101
+ npx opendevbrowser canvas --command canvas.feedback.poll --params '{"requestId":"req_feedback_01","canvasSessionId":"<canvas-session-id>","documentId":"<document-id>","targetId":"<target-id>","afterCursor":null}'
102
+ npx opendevbrowser canvas --command canvas.document.save --params '{"requestId":"req_save_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>","repoPath":null}'
94
103
  ```
95
104
 
96
105
  ## Workflow D — Real-Surface Validation
@@ -9,29 +9,28 @@
9
9
  "summary": "Clarify hierarchy, trust, and action flow"
10
10
  },
11
11
  "visualDirection": {
12
- "profile": "product-led-clarity",
13
- "styleAxes": {
14
- "contrast": "high",
15
- "density": "airy"
16
- }
12
+ "profile": "product-story",
13
+ "themeStrategy": "single-theme"
17
14
  },
18
15
  "layoutStrategy": {
19
- "approach": "hero-led-grid"
16
+ "approach": "hero-led-grid",
17
+ "navigationModel": "global-header"
20
18
  },
21
19
  "contentStrategy": {
22
20
  "source": "real-content-first"
23
21
  },
24
22
  "componentStrategy": {
25
23
  "mode": "reuse-first",
26
- "approvedLibraries": [
27
- "shadcn"
24
+ "interactionStates": [
25
+ "default",
26
+ "hover",
27
+ "focus",
28
+ "disabled"
28
29
  ]
29
30
  },
30
31
  "motionPosture": {
31
32
  "level": "subtle",
32
- "allow3D": false,
33
- "allowParallax": false,
34
- "allowCustomSmoothScroll": false
33
+ "reducedMotion": "respect-user-preference"
35
34
  },
36
35
  "responsivePosture": {
37
36
  "primaryViewport": "desktop",
@@ -43,16 +42,18 @@
43
42
  },
44
43
  "accessibilityPosture": {
45
44
  "target": "WCAG_2_2_AA",
46
- "reducedMotion": "required",
47
- "keyboardParity": true
45
+ "keyboardNavigation": "full"
48
46
  },
49
47
  "validationTargets": {
50
48
  "blockOn": [
51
- "contrast-failure"
52
- ],
53
- "warnOn": [
49
+ "contrast-failure",
54
50
  "responsive-mismatch"
55
- ]
51
+ ],
52
+ "requiredThemes": [
53
+ "light"
54
+ ],
55
+ "browserValidation": "required",
56
+ "maxInteractionLatencyMs": 160
56
57
  }
57
58
  }
58
59
  }
@@ -97,10 +97,21 @@ EOF
97
97
  cat skills/opendevbrowser-design-agent/assets/templates/design-contract.v1.json
98
98
  cat skills/opendevbrowser-design-agent/assets/templates/canvas-generation-plan.design.v1.json
99
99
  cat skills/opendevbrowser-design-agent/artifacts/design-contract-playbook.md
100
+ cat skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md
101
+ cat skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json
100
102
  ./skills/opendevbrowser-design-agent/scripts/extract-canvas-plan.sh ./tmp/design-contract.json > ./tmp/canvas-plan.json
101
103
  $CLI_PREFIX canvas --command canvas.session.open --params '{"requestId":"req_open_01","browserSessionId":"<browser-session-id>","documentId":null,"repoPath":null,"mode":"dual-track"}'
104
+ # Inspect planStatus, preflightState, generationPlanRequirements.allowedValues, generationPlanIssues, and guidance.recommendedNextCommands before continuing.
105
+ # Treat preflightState=handshake_read as the normal first-step checkpoint before canvas.plan.set.
102
106
  $CLI_PREFIX canvas --command canvas.plan.set --params-file ./tmp/canvas-plan.json
107
+ # If canvas.plan.set succeeds with planStatus=accepted or preflightState=plan_accepted, follow the returned guidance into canvas.document.patch.
108
+ # Optional diagnostics after generation_plan_invalid:
109
+ # $CLI_PREFIX canvas --command canvas.plan.get --params '{"requestId":"req_plan_get_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>"}'
110
+ # or re-read with canvas.capabilities.get to inspect generationPlanIssues before resubmitting canvas.plan.set.
111
+ $CLI_PREFIX canvas --command canvas.document.patch --params-file ./tmp/canvas-patch.json
112
+ $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>"}'
103
113
  $CLI_PREFIX canvas --command canvas.feedback.poll --params '{"requestId":"req_feedback_01","canvasSessionId":"<canvas-session-id>","documentId":"<document-id>","targetId":"<target-id>","afterCursor":null}'
114
+ $CLI_PREFIX canvas --command canvas.document.save --params '{"requestId":"req_save_01","canvasSessionId":"<canvas-session-id>","leaseId":"<lease-id>","documentId":"<document-id>","repoPath":null}'
104
115
  EOF
105
116
  ;;
106
117
  real-surface-validation)
@@ -88,6 +88,16 @@ const skillDocMarkers = [
88
88
  "assets/templates/reference-pattern-board.v1.json",
89
89
  "assets/templates/design-release-gate.v1.json",
90
90
  "scripts/extract-canvas-plan.sh",
91
+ "canvas.session.open",
92
+ "canvas.plan.get",
93
+ "generationPlanIssues",
94
+ "canvas.document.patch",
95
+ "canvas.preview.render",
96
+ "canvas.document.save",
97
+ "handshake_read",
98
+ "plan_invalid",
99
+ "plan_accepted",
100
+ "recommendedNextCommands",
91
101
  "canvas.plan.set",
92
102
  "canvas.history.undo",
93
103
  "canvas.history.redo",
@@ -105,6 +115,38 @@ const skillDocMarkers = [
105
115
  "docs.lovable.dev/prompting/prompting-best-practices"
106
116
  ];
107
117
 
118
+ const designWorkflowMarkers = [
119
+ "canvas.session.open",
120
+ "canvas.plan.set",
121
+ "canvas.plan.get",
122
+ "generationPlanIssues",
123
+ "canvas.document.patch",
124
+ "canvas.preview.render",
125
+ "canvas.feedback.poll",
126
+ "canvas.document.save",
127
+ "handshake_read",
128
+ "plan_invalid",
129
+ "plan_accepted",
130
+ "recommendedNextCommands"
131
+ ];
132
+
133
+ const workflowOutputMarkers = {
134
+ "canvas-contract": [
135
+ "canvas.session.open",
136
+ "canvas.plan.set",
137
+ "canvas.plan.get",
138
+ "generationPlanIssues",
139
+ "canvas.document.patch",
140
+ "canvas.preview.render",
141
+ "canvas.feedback.poll",
142
+ "canvas.document.save",
143
+ "handshake_read",
144
+ "plan_invalid",
145
+ "plan_accepted",
146
+ "recommendedNextCommands"
147
+ ]
148
+ };
149
+
108
150
  const patternMarkers = [
109
151
  "Anthropic",
110
152
  "Vercel v0",
@@ -154,6 +196,13 @@ for (const marker of patternMarkers) {
154
196
  }
155
197
  }
156
198
 
199
+ const designWorkflowDoc = fs.readFileSync(fullPath("artifacts/design-workflows.md"), "utf8");
200
+ for (const marker of designWorkflowMarkers) {
201
+ if (!designWorkflowDoc.includes(marker)) {
202
+ failures.push(`design-workflows missing marker: ${marker}`);
203
+ }
204
+ }
205
+
157
206
  const extractScript = fullPath("scripts/extract-canvas-plan.sh");
158
207
  const contractTemplate = fullPath("assets/templates/design-contract.v1.json");
159
208
  const extractResult = spawnSync(extractScript, [contractTemplate], { encoding: "utf8" });
@@ -210,6 +259,14 @@ for (const workflow of [
210
259
  if ((result.stdout ?? "").trim().length === 0) {
211
260
  failures.push(`design-workflow.sh produced empty output for mode ${workflow}`);
212
261
  }
262
+ const requiredOutputMarkers = workflowOutputMarkers[workflow];
263
+ if (requiredOutputMarkers) {
264
+ for (const marker of requiredOutputMarkers) {
265
+ if (!(result.stdout ?? "").includes(marker)) {
266
+ failures.push(`design-workflow.sh output for ${workflow} missing marker: ${marker}`);
267
+ }
268
+ }
269
+ }
213
270
  }
214
271
 
215
272
  if (failures.length > 0) {
@@ -67,8 +67,8 @@ The `render-video-brief.sh` helper adds:
67
67
  1. Pick product URL or product name.
68
68
  2. Run collection workflow and confirm output pack path.
69
69
  3. Review generated manifest/copy/features for accuracy and check whether the pack is visual-ready or metadata-first.
70
- 4. Run `render-video-brief.sh` to generate production instructions and visual sourcing notes.
71
- Canonical helper path: `scripts/render-video-brief.sh`.
70
+ 4. Run `./skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh` to generate production instructions and visual sourcing notes.
71
+ Canonical helper path: `./skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh`.
72
72
  5. If no visuals were captured, source or capture visuals before handing the brief to the editor/creator pipeline.
73
73
 
74
74
  ## Parallel Multitab Alignment