@stackwright-pro/scaffold-hooks 0.2.0 → 0.3.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,514 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for index.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="prettify.css" />
9
+ <link rel="stylesheet" href="base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="index.html">All files</a> index.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">93.75% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>30/32</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">57.14% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>8/14</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>4/4</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">93.75% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>30/32</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
210
+ <span class="cline-any cline-neutral">&nbsp;</span>
211
+ <span class="cline-any cline-neutral">&nbsp;</span>
212
+ <span class="cline-any cline-neutral">&nbsp;</span>
213
+ <span class="cline-any cline-neutral">&nbsp;</span>
214
+ <span class="cline-any cline-neutral">&nbsp;</span>
215
+ <span class="cline-any cline-neutral">&nbsp;</span>
216
+ <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-neutral">&nbsp;</span>
218
+ <span class="cline-any cline-neutral">&nbsp;</span>
219
+ <span class="cline-any cline-neutral">&nbsp;</span>
220
+ <span class="cline-any cline-yes">1x</span>
221
+ <span class="cline-any cline-neutral">&nbsp;</span>
222
+ <span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-neutral">&nbsp;</span>
224
+ <span class="cline-any cline-neutral">&nbsp;</span>
225
+ <span class="cline-any cline-neutral">&nbsp;</span>
226
+ <span class="cline-any cline-neutral">&nbsp;</span>
227
+ <span class="cline-any cline-neutral">&nbsp;</span>
228
+ <span class="cline-any cline-neutral">&nbsp;</span>
229
+ <span class="cline-any cline-neutral">&nbsp;</span>
230
+ <span class="cline-any cline-yes">1x</span>
231
+ <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-neutral">&nbsp;</span>
233
+ <span class="cline-any cline-neutral">&nbsp;</span>
234
+ <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-neutral">&nbsp;</span>
236
+ <span class="cline-any cline-neutral">&nbsp;</span>
237
+ <span class="cline-any cline-neutral">&nbsp;</span>
238
+ <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-yes">1x</span>
240
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
+ <span class="cline-any cline-neutral">&nbsp;</span>
242
+ <span class="cline-any cline-neutral">&nbsp;</span>
243
+ <span class="cline-any cline-neutral">&nbsp;</span>
244
+ <span class="cline-any cline-neutral">&nbsp;</span>
245
+ <span class="cline-any cline-neutral">&nbsp;</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-neutral">&nbsp;</span>
248
+ <span class="cline-any cline-neutral">&nbsp;</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-neutral">&nbsp;</span>
256
+ <span class="cline-any cline-neutral">&nbsp;</span>
257
+ <span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-neutral">&nbsp;</span>
260
+ <span class="cline-any cline-neutral">&nbsp;</span>
261
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-yes">8x</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-yes">1x</span>
269
+ <span class="cline-any cline-yes">1x</span>
270
+ <span class="cline-any cline-yes">1x</span>
271
+ <span class="cline-any cline-yes">1x</span>
272
+ <span class="cline-any cline-neutral">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-yes">1x</span>
275
+ <span class="cline-any cline-yes">7x</span>
276
+ <span class="cline-any cline-no">&nbsp;</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-yes">7x</span>
279
+ <span class="cline-any cline-no">&nbsp;</span>
280
+ <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-yes">1x</span>
285
+ <span class="cline-any cline-yes">1x</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-yes">1x</span>
289
+ <span class="cline-any cline-yes">1x</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-neutral">&nbsp;</span>
292
+ <span class="cline-any cline-yes">1x</span>
293
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-neutral">&nbsp;</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-yes">1x</span>
301
+ <span class="cline-any cline-yes">1x</span>
302
+ <span class="cline-any cline-yes">1x</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-yes">8x</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-yes">1x</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-yes">1x</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-yes">1x</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-yes">1x</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-yes">1x</span>
331
+ <span class="cline-any cline-yes">1x</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-yes">8x</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-yes">1x</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-yes">8x</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-neutral">&nbsp;</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-yes">1x</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
353
+ * @stackwright-pro/scaffold-hooks
354
+ *
355
+ * Auto-registers Pro packages during Stackwright project scaffolding.
356
+ * Uses @stackwright/hooks-registry singleton to survive module boundary crossings.
357
+ */
358
+ &nbsp;
359
+ import chalk from 'chalk';
360
+ import { registerScaffoldHook, type ScaffoldHookContext } from '@stackwright/hooks-registry';
361
+ &nbsp;
362
+ // Fixed npm versions for @stackwright/* packages
363
+ const STACKWRIGHT_NPM_VERSIONS: Record&lt;string, string&gt; = {
364
+ '@stackwright/core': '^0.7.0',
365
+ '@stackwright/icons': '^0.3.0',
366
+ '@stackwright/nextjs': '^0.3.1',
367
+ '@stackwright/ui-shadcn': '^0.1.0',
368
+ '@stackwright/build-scripts': '^0.4.0',
369
+ '@stackwright/mcp': '^0.2.0',
370
+ '@stackwright/otters': '^0.2.0',
371
+ };
372
+ &nbsp;
373
+ const PRO_DEPENDENCIES: Record&lt;string, string&gt; = {
374
+ '@stackwright-pro/mcp': 'latest',
375
+ '@stackwright-pro/otters': 'latest',
376
+ '@stackwright-pro/openapi': 'latest',
377
+ '@stackwright-pro/auth': 'latest',
378
+ '@stackwright-pro/auth-nextjs': 'latest',
379
+ zod: '^3.23.0',
380
+ };
381
+ &nbsp;
382
+ const PRO_DEV_DEPENDENCIES: Record&lt;string, string&gt; = {
383
+ '@stoplight/prism-cli': '^5.14.2',
384
+ };
385
+ &nbsp;
386
+ /**
387
+ * Register all Pro scaffold hooks with the shared registry.
388
+ *
389
+ * Uses @stackwright/hooks-registry's globalThis-based singleton so hooks
390
+ * survive module boundary crossings between Pro packages and the CLI.
391
+ *
392
+ * Call this BEFORE calling scaffold() to ensure hooks run in the correct context.
393
+ *
394
+ * @example
395
+ * ```typescript
396
+ * import { registerProScaffoldHooks } from '@stackwright-pro/scaffold-hooks';
397
+ *
398
+ * // Register hooks (they go to the shared global registry)
399
+ * registerProScaffoldHooks();
400
+ *
401
+ * // Now when CLI calls scaffold(), it will see these hooks
402
+ * ```
403
+ */
404
+ export function registerProScaffoldHooks(): void {
405
+ registerScaffoldHook({
406
+ type: 'preInstall',
407
+ name: 'pro-dependencies',
408
+ priority: 10,
409
+ critical: false,
410
+ handler: async (ctx: ScaffoldHookContext) =&gt; {
411
+ const packageJson = ctx.packageJson as Record&lt;string, unknown&gt;;
412
+ const dependencies = (packageJson.dependencies as Record&lt;string, string&gt;) || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
413
+ const devDependencies = (packageJson.devDependencies as Record&lt;string, string&gt;) || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
414
+ const scripts = (packageJson.scripts as Record&lt;string, string&gt;) || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
415
+ &nbsp;
416
+ // Fix workspace:* references from scaffold
417
+ for (const [pkgName, version] of Object.entries(STACKWRIGHT_NPM_VERSIONS)) {
418
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (dependencies[pkgName] === 'workspace:*') {
419
+ <span class="cstat-no" title="statement not covered" > dependencies[pkgName] = version;</span>
420
+ }
421
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (devDependencies[pkgName] === 'workspace:*') {
422
+ <span class="cstat-no" title="statement not covered" > devDependencies[pkgName] = version;</span>
423
+ }
424
+ }
425
+ &nbsp;
426
+ // Add Pro MCP packages
427
+ dependencies['@stackwright/mcp'] = STACKWRIGHT_NPM_VERSIONS['@stackwright/mcp']!;
428
+ dependencies['@stackwright-pro/mcp'] = 'latest';
429
+ &nbsp;
430
+ // Add Pro dependencies
431
+ Object.assign(dependencies, PRO_DEPENDENCIES);
432
+ Object.assign(devDependencies, PRO_DEV_DEPENDENCIES);
433
+ &nbsp;
434
+ // Add role-based dev scripts
435
+ Object.assign(scripts, {
436
+ 'dev:admin': 'MOCK_USER=admin next dev',
437
+ 'dev:analyst': 'MOCK_USER=analyst next dev',
438
+ 'dev:viewer': 'MOCK_USER=viewer next dev',
439
+ prebuild: 'node scripts/prebuild.js',
440
+ predev: 'node scripts/prebuild.js',
441
+ });
442
+ &nbsp;
443
+ packageJson.dependencies = dependencies;
444
+ packageJson.devDependencies = devDependencies;
445
+ packageJson.scripts = scripts;
446
+ },
447
+ });
448
+ &nbsp;
449
+ registerScaffoldHook({
450
+ type: 'preInstall',
451
+ name: 'pro-mcp-config',
452
+ priority: 20,
453
+ critical: false,
454
+ handler: async (ctx) =&gt; {
455
+ const codePuppyConfig = (ctx.codePuppyConfig || <span class="branch-1 cbranch-no" title="branch not covered" >{})</span> as Record&lt;string, unknown&gt;;
456
+ &nbsp;
457
+ // Ensure structure exists
458
+ codePuppyConfig.mcp_servers = codePuppyConfig.mcp_servers || {};
459
+ &nbsp;
460
+ // Add Pro MCP server
461
+ (codePuppyConfig.mcp_servers as Record&lt;string, unknown&gt;)['stackwright-pro'] = {
462
+ command: 'node',
463
+ args: ['node_modules/@stackwright-pro/mcp/dist/server.js'],
464
+ env: { NODE_ENV: 'development' },
465
+ };
466
+ &nbsp;
467
+ // Set agents_path to include both OSS and Pro otters
468
+ codePuppyConfig.agents_path = [
469
+ 'node_modules/@stackwright/otters',
470
+ 'node_modules/@stackwright-pro/otters',
471
+ ];
472
+ &nbsp;
473
+ ctx.codePuppyConfig = codePuppyConfig;
474
+ console.log(chalk.green('✅ Pro MCP server configured'));
475
+ },
476
+ });
477
+ &nbsp;
478
+ registerScaffoldHook({
479
+ type: 'postInstall',
480
+ name: 'verify-pro-installation',
481
+ priority: 50,
482
+ critical: false,
483
+ handler: async () =&gt; {
484
+ console.log(chalk.cyan('🦦🦦 Pro packages ready!'));
485
+ },
486
+ });
487
+ &nbsp;
488
+ console.log(chalk.bold.cyan('🦦🔗 @stackwright-pro/scaffold-hooks registered'));
489
+ }
490
+ &nbsp;
491
+ /**
492
+ * @deprecated Use registerProScaffoldHooks() instead. Kept for backward compatibility.
493
+ */
494
+ export const createProScaffoldHooks = registerProScaffoldHooks;
495
+ &nbsp;</pre></td></tr></table></pre>
496
+
497
+ <div class='push'></div><!-- for sticky footer -->
498
+ </div><!-- /wrapper -->
499
+ <div class='footer quiet pad2 space-top1 center small'>
500
+ Code coverage generated by
501
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
502
+ at 2026-04-12T21:04:48.167Z
503
+ </div>
504
+ <script src="prettify.js"></script>
505
+ <script>
506
+ window.onload = function () {
507
+ prettyPrint();
508
+ };
509
+ </script>
510
+ <script src="sorter.js"></script>
511
+ <script src="block-navigation.js"></script>
512
+ </body>
513
+ </html>
514
+
package/dist/index.d.mts CHANGED
@@ -1,20 +1,31 @@
1
- import { ScaffoldHook } from '@stackwright/scaffold-core';
2
-
3
1
  /**
4
2
  * @stackwright-pro/scaffold-hooks
5
3
  *
6
4
  * Auto-registers Pro packages during Stackwright project scaffolding.
7
- * Import createProScaffoldHooks() to get a function that registers the hooks
8
- * with the caller's scaffold-core instance.
5
+ * Uses @stackwright/hooks-registry singleton to survive module boundary crossings.
9
6
  */
10
-
11
- interface CreateScaffoldHooksOptions {
12
- registerScaffoldHook: (hook: ScaffoldHook) => void;
13
- }
14
7
  /**
15
- * Create and register all Pro scaffold hooks.
8
+ * Register all Pro scaffold hooks with the shared registry.
9
+ *
10
+ * Uses @stackwright/hooks-registry's globalThis-based singleton so hooks
11
+ * survive module boundary crossings between Pro packages and the CLI.
12
+ *
16
13
  * Call this BEFORE calling scaffold() to ensure hooks run in the correct context.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { registerProScaffoldHooks } from '@stackwright-pro/scaffold-hooks';
18
+ *
19
+ * // Register hooks (they go to the shared global registry)
20
+ * registerProScaffoldHooks();
21
+ *
22
+ * // Now when CLI calls scaffold(), it will see these hooks
23
+ * ```
24
+ */
25
+ declare function registerProScaffoldHooks(): void;
26
+ /**
27
+ * @deprecated Use registerProScaffoldHooks() instead. Kept for backward compatibility.
17
28
  */
18
- declare function createProScaffoldHooks(options: CreateScaffoldHooksOptions): void;
29
+ declare const createProScaffoldHooks: typeof registerProScaffoldHooks;
19
30
 
20
- export { createProScaffoldHooks };
31
+ export { createProScaffoldHooks, registerProScaffoldHooks };
package/dist/index.d.ts CHANGED
@@ -1,20 +1,31 @@
1
- import { ScaffoldHook } from '@stackwright/scaffold-core';
2
-
3
1
  /**
4
2
  * @stackwright-pro/scaffold-hooks
5
3
  *
6
4
  * Auto-registers Pro packages during Stackwright project scaffolding.
7
- * Import createProScaffoldHooks() to get a function that registers the hooks
8
- * with the caller's scaffold-core instance.
5
+ * Uses @stackwright/hooks-registry singleton to survive module boundary crossings.
9
6
  */
10
-
11
- interface CreateScaffoldHooksOptions {
12
- registerScaffoldHook: (hook: ScaffoldHook) => void;
13
- }
14
7
  /**
15
- * Create and register all Pro scaffold hooks.
8
+ * Register all Pro scaffold hooks with the shared registry.
9
+ *
10
+ * Uses @stackwright/hooks-registry's globalThis-based singleton so hooks
11
+ * survive module boundary crossings between Pro packages and the CLI.
12
+ *
16
13
  * Call this BEFORE calling scaffold() to ensure hooks run in the correct context.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { registerProScaffoldHooks } from '@stackwright-pro/scaffold-hooks';
18
+ *
19
+ * // Register hooks (they go to the shared global registry)
20
+ * registerProScaffoldHooks();
21
+ *
22
+ * // Now when CLI calls scaffold(), it will see these hooks
23
+ * ```
24
+ */
25
+ declare function registerProScaffoldHooks(): void;
26
+ /**
27
+ * @deprecated Use registerProScaffoldHooks() instead. Kept for backward compatibility.
17
28
  */
18
- declare function createProScaffoldHooks(options: CreateScaffoldHooksOptions): void;
29
+ declare const createProScaffoldHooks: typeof registerProScaffoldHooks;
19
30
 
20
- export { createProScaffoldHooks };
31
+ export { createProScaffoldHooks, registerProScaffoldHooks };