projax 3.3.41 → 3.3.52

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 (111) hide show
  1. package/coverage/core-bridge.ts.html +24 -3
  2. package/coverage/index.html +34 -19
  3. package/coverage/lcov-report/core-bridge.ts.html +24 -3
  4. package/coverage/lcov-report/index.html +34 -19
  5. package/coverage/lcov-report/port-extractor.ts.html +1 -1
  6. package/coverage/lcov-report/port-scanner.ts.html +3 -3
  7. package/coverage/lcov-report/port-utils.ts.html +1 -1
  8. package/coverage/lcov-report/script-runner.ts.html +302 -11
  9. package/coverage/lcov-report/test-parser.ts.html +799 -0
  10. package/coverage/lcov.info +270 -49
  11. package/coverage/port-extractor.ts.html +1 -1
  12. package/coverage/port-scanner.ts.html +3 -3
  13. package/coverage/port-utils.ts.html +1 -1
  14. package/coverage/script-runner.ts.html +302 -11
  15. package/coverage/test-parser.ts.html +799 -0
  16. package/dist/api/__tests__/routes.test.js +1 -0
  17. package/dist/api/__tests__/routes.test.js.map +1 -1
  18. package/dist/api/__tests__/scanner.test.js +1 -0
  19. package/dist/api/__tests__/scanner.test.js.map +1 -1
  20. package/dist/api/package.json +4 -0
  21. package/dist/api/routes/backup.d.ts +2 -1
  22. package/dist/api/routes/backup.d.ts.map +1 -1
  23. package/dist/api/routes/backup.js.map +1 -1
  24. package/dist/api/routes/index.d.ts +2 -1
  25. package/dist/api/routes/index.d.ts.map +1 -1
  26. package/dist/api/routes/index.js.map +1 -1
  27. package/dist/api/routes/projects.d.ts +2 -1
  28. package/dist/api/routes/projects.d.ts.map +1 -1
  29. package/dist/api/routes/projects.js.map +1 -1
  30. package/dist/api/routes/settings.d.ts +2 -1
  31. package/dist/api/routes/settings.d.ts.map +1 -1
  32. package/dist/api/routes/settings.js +21 -1
  33. package/dist/api/routes/settings.js.map +1 -1
  34. package/dist/api/routes/workspaces.d.ts +2 -1
  35. package/dist/api/routes/workspaces.d.ts.map +1 -1
  36. package/dist/api/routes/workspaces.js.map +1 -1
  37. package/dist/core/__tests__/index.test.js +1 -0
  38. package/dist/core/__tests__/scanner.test.js +1 -0
  39. package/dist/core/__tests__/settings.test.js +1 -0
  40. package/dist/core-bridge.js +5 -1
  41. package/dist/electron/core/__tests__/index.test.js +1 -0
  42. package/dist/electron/core/__tests__/scanner.test.js +1 -0
  43. package/dist/electron/core/__tests__/settings.test.js +1 -0
  44. package/dist/electron/core.js +5 -1
  45. package/dist/electron/main.js +113 -99
  46. package/dist/electron/port-scanner.js +1 -1
  47. package/dist/electron/renderer/assets/index-BjZn_mEF.js +66 -0
  48. package/dist/electron/renderer/assets/index-CZmDxbJO.js +66 -0
  49. package/dist/electron/renderer/assets/{index-CWxXs5M7.css → index-DfocdjIj.css} +1 -1
  50. package/dist/electron/renderer/index.html +2 -2
  51. package/dist/index.js +19 -19
  52. package/dist/port-scanner.js +1 -1
  53. package/dist/prxi.d.ts +1 -0
  54. package/dist/prxi.js +1106 -0
  55. package/dist/prxi.tsx +6 -6
  56. package/jest.config.js +8 -0
  57. package/package.json +8 -4
  58. package/dist/api/routes/mcp.d.ts +0 -3
  59. package/dist/api/routes/mcp.d.ts.map +0 -1
  60. package/dist/api/routes/mcp.js +0 -147
  61. package/dist/api/routes/mcp.js.map +0 -1
  62. package/dist/electron/renderer/assets/index-59AhiV_K.css +0 -1
  63. package/dist/electron/renderer/assets/index-A04svynq.js +0 -62
  64. package/dist/electron/renderer/assets/index-B-etDnj2.js +0 -64
  65. package/dist/electron/renderer/assets/index-BGodNljq.js +0 -62
  66. package/dist/electron/renderer/assets/index-Bx18Cyic.js +0 -64
  67. package/dist/electron/renderer/assets/index-ByBOaxqv.js +0 -62
  68. package/dist/electron/renderer/assets/index-ByHY-x-j.js +0 -62
  69. package/dist/electron/renderer/assets/index-C1SRt6Jx.js +0 -62
  70. package/dist/electron/renderer/assets/index-C8f5yNYe.js +0 -64
  71. package/dist/electron/renderer/assets/index-C9Fo49a8.js +0 -61
  72. package/dist/electron/renderer/assets/index-CGx7K7jh.js +0 -62
  73. package/dist/electron/renderer/assets/index-CIZ3Wl6c.css +0 -1
  74. package/dist/electron/renderer/assets/index-CJbsU9y8.css +0 -1
  75. package/dist/electron/renderer/assets/index-CJrLunKK.js +0 -62
  76. package/dist/electron/renderer/assets/index-CQTleudf.css +0 -1
  77. package/dist/electron/renderer/assets/index-CQcilqlv.js +0 -62
  78. package/dist/electron/renderer/assets/index-CS-85xbL.css +0 -1
  79. package/dist/electron/renderer/assets/index-CYph0WPA.js +0 -62
  80. package/dist/electron/renderer/assets/index-C_WSLD6y.css +0 -1
  81. package/dist/electron/renderer/assets/index-CgB-tTpV.js +0 -62
  82. package/dist/electron/renderer/assets/index-ChoTzPLo.css +0 -1
  83. package/dist/electron/renderer/assets/index-CopVNRnR.js +0 -64
  84. package/dist/electron/renderer/assets/index-CtXtIMer.js +0 -64
  85. package/dist/electron/renderer/assets/index-D1jmaGv5.css +0 -1
  86. package/dist/electron/renderer/assets/index-D2AOB6Er.js +0 -62
  87. package/dist/electron/renderer/assets/index-DAfjuYKX.js +0 -61
  88. package/dist/electron/renderer/assets/index-DEOOHPEi.css +0 -1
  89. package/dist/electron/renderer/assets/index-DTtg6XrF.css +0 -1
  90. package/dist/electron/renderer/assets/index-DUvcepWm.js +0 -64
  91. package/dist/electron/renderer/assets/index-DVWDlM1D.js +0 -62
  92. package/dist/electron/renderer/assets/index-DWe2TQFv.css +0 -1
  93. package/dist/electron/renderer/assets/index-DZzB20Xf.css +0 -1
  94. package/dist/electron/renderer/assets/index-Dk0EQt0u.css +0 -1
  95. package/dist/electron/renderer/assets/index-DknLdADV.js +0 -63
  96. package/dist/electron/renderer/assets/index-DocuD8Lk.js +0 -64
  97. package/dist/electron/renderer/assets/index-DwRy5FqP.js +0 -62
  98. package/dist/electron/renderer/assets/index-DyU-xfd8.css +0 -1
  99. package/dist/electron/renderer/assets/index-GwC-JVUy.css +0 -1
  100. package/dist/electron/renderer/assets/index-JXrtTB1F.js +0 -63
  101. package/dist/electron/renderer/assets/index-Ocrdv8Lb.css +0 -1
  102. package/dist/electron/renderer/assets/index-R-HsWJ0K.js +0 -62
  103. package/dist/electron/renderer/assets/index-Ytah0wbZ.js +0 -62
  104. package/dist/electron/renderer/assets/index-ZVyXUshO.css +0 -1
  105. package/dist/electron/renderer/assets/index-Z_8dJn3i.js +0 -62
  106. package/dist/electron/renderer/assets/index-fehviker.js +0 -63
  107. package/dist/electron/renderer/assets/index-nts9ST-M.js +0 -62
  108. package/dist/electron/renderer/assets/index-q8NVIH3g.css +0 -1
  109. package/dist/electron/renderer/assets/index-thUWIXon.js +0 -62
  110. package/dist/electron/renderer/assets/index-tuQmrwcm.css +0 -1
  111. package/dist/prxi/src/index.tsx +0 -1370
@@ -124,7 +124,17 @@
124
124
  <a name='L59'></a><a href='#L59'>59</a>
125
125
  <a name='L60'></a><a href='#L60'>60</a>
126
126
  <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
135
+ <span class="cline-any cline-neutral">&nbsp;</span>
136
+ <span class="cline-any cline-neutral">&nbsp;</span>
137
+ <span class="cline-any cline-neutral">&nbsp;</span>
128
138
  <span class="cline-any cline-neutral">&nbsp;</span>
129
139
  <span class="cline-any cline-neutral">&nbsp;</span>
130
140
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -151,6 +161,10 @@
151
161
  <span class="cline-any cline-no">&nbsp;</span>
152
162
  <span class="cline-any cline-neutral">&nbsp;</span>
153
163
  <span class="cline-any cline-neutral">&nbsp;</span>
164
+ <span class="cline-any cline-neutral">&nbsp;</span>
165
+ <span class="cline-any cline-neutral">&nbsp;</span>
166
+ <span class="cline-any cline-neutral">&nbsp;</span>
167
+ <span class="cline-any cline-neutral">&nbsp;</span>
154
168
  <span class="cline-any cline-no">&nbsp;</span>
155
169
  <span class="cline-any cline-neutral">&nbsp;</span>
156
170
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -187,6 +201,9 @@
187
201
  <span class="cline-any cline-neutral">&nbsp;</span>
188
202
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import * as path from 'path';</span>
189
203
  &nbsp;
204
+ // NOTE: projax-core is a workspace alias (not an npm scoped package)
205
+ // pnpm resolves this via the "workspace:*" dependency in package.json
206
+ // to the local packages/core package
190
207
  type CoreModule = typeof import('projax-core');
191
208
  &nbsp;
192
209
  let cachedCore: CoreModule | null = <span class="cstat-no" title="statement not covered" >null;</span>
@@ -212,6 +229,10 @@ function <span class="fstat-no" title="function not covered" >loadCore(</span>):
212
229
  <span class="cstat-no" title="statement not covered" > return cachedCore;</span>
213
230
  }
214
231
  &nbsp;
232
+ // Try multiple locations to find the projax-core module
233
+ // 1. Local dist/core (copied during build)
234
+ // 2. Workspace root packages/core/dist (development)
235
+ // 3. Workspace alias 'projax-core' (resolved by pnpm via workspace:*)
215
236
  const candidates = <span class="cstat-no" title="statement not covered" >[</span>
216
237
  path.join(__dirname, 'core', 'index.js'),
217
238
  path.join(__dirname, 'core'),
@@ -219,7 +240,7 @@ function <span class="fstat-no" title="function not covered" >loadCore(</span>):
219
240
  path.join(__dirname, '..', 'core', 'dist'),
220
241
  path.join(__dirname, '..', '..', 'core', 'dist', 'index.js'),
221
242
  path.join(__dirname, '..', '..', 'core', 'dist'),
222
- 'projax-core',
243
+ 'projax-core', // Workspace alias - pnpm resolves this to packages/core
223
244
  ];
224
245
  &nbsp;
225
246
  <span class="cstat-no" title="statement not covered" > for (const candidate of candidates) {</span>
@@ -253,7 +274,7 @@ export type { Project, Test, ProjectPort } from 'projax-core';
253
274
  <div class='footer quiet pad2 space-top1 center small'>
254
275
  Code coverage generated by
255
276
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
256
- at 2025-11-20T01:55:35.207Z
277
+ at 2026-01-08T01:22:23.536Z
257
278
  </div>
258
279
  <script src="prettify.js"></script>
259
280
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">20.86% </span>
26
+ <span class="strong">17.96% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>154/738</span>
28
+ <span class='fraction'>154/857</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">16.88% </span>
33
+ <span class="strong">13% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>39/231</span>
35
+ <span class='fraction'>39/300</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">25.39% </span>
40
+ <span class="strong">20.77% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>16/63</span>
42
+ <span class='fraction'>16/77</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">21.11% </span>
47
+ <span class="strong">18.19% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>151/715</span>
49
+ <span class='fraction'>151/830</span>
50
50
  </div>
51
51
 
52
52
 
@@ -140,17 +140,32 @@
140
140
 
141
141
  <tr>
142
142
  <td class="file low" data-value="script-runner.ts"><a href="script-runner.ts.html">script-runner.ts</a></td>
143
- <td data-value="27.23" class="pic low">
144
- <div class="chart"><div class="cover-fill" style="width: 27%"></div><div class="cover-empty" style="width: 73%"></div></div>
143
+ <td data-value="25" class="pic low">
144
+ <div class="chart"><div class="cover-fill" style="width: 25%"></div><div class="cover-empty" style="width: 75%"></div></div>
145
145
  </td>
146
- <td data-value="27.23" class="pct low">27.23%</td>
147
- <td data-value="448" class="abs low">122/448</td>
148
- <td data-value="23.62" class="pct low">23.62%</td>
149
- <td data-value="127" class="abs low">30/127</td>
150
- <td data-value="29.54" class="pct low">29.54%</td>
151
- <td data-value="44" class="abs low">13/44</td>
152
- <td data-value="27.33" class="pct low">27.33%</td>
153
- <td data-value="439" class="abs low">120/439</td>
146
+ <td data-value="25" class="pct low">25%</td>
147
+ <td data-value="488" class="abs low">122/488</td>
148
+ <td data-value="21.89" class="pct low">21.89%</td>
149
+ <td data-value="137" class="abs low">30/137</td>
150
+ <td data-value="26" class="pct low">26%</td>
151
+ <td data-value="50" class="abs low">13/50</td>
152
+ <td data-value="25.21" class="pct low">25.21%</td>
153
+ <td data-value="476" class="abs low">120/476</td>
154
+ </tr>
155
+
156
+ <tr>
157
+ <td class="file low" data-value="test-parser.ts"><a href="test-parser.ts.html">test-parser.ts</a></td>
158
+ <td data-value="0" class="pic low">
159
+ <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
160
+ </td>
161
+ <td data-value="0" class="pct low">0%</td>
162
+ <td data-value="79" class="abs low">0/79</td>
163
+ <td data-value="0" class="pct low">0%</td>
164
+ <td data-value="59" class="abs low">0/59</td>
165
+ <td data-value="0" class="pct low">0%</td>
166
+ <td data-value="8" class="abs low">0/8</td>
167
+ <td data-value="0" class="pct low">0%</td>
168
+ <td data-value="78" class="abs low">0/78</td>
154
169
  </tr>
155
170
 
156
171
  </tbody>
@@ -161,7 +176,7 @@
161
176
  <div class='footer quiet pad2 space-top1 center small'>
162
177
  Code coverage generated by
163
178
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
164
- at 2025-11-20T01:55:35.207Z
179
+ at 2026-01-08T01:22:23.536Z
165
180
  </div>
166
181
  <script src="prettify.js"></script>
167
182
  <script>
@@ -124,7 +124,17 @@
124
124
  <a name='L59'></a><a href='#L59'>59</a>
125
125
  <a name='L60'></a><a href='#L60'>60</a>
126
126
  <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
135
+ <span class="cline-any cline-neutral">&nbsp;</span>
136
+ <span class="cline-any cline-neutral">&nbsp;</span>
137
+ <span class="cline-any cline-neutral">&nbsp;</span>
128
138
  <span class="cline-any cline-neutral">&nbsp;</span>
129
139
  <span class="cline-any cline-neutral">&nbsp;</span>
130
140
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -151,6 +161,10 @@
151
161
  <span class="cline-any cline-no">&nbsp;</span>
152
162
  <span class="cline-any cline-neutral">&nbsp;</span>
153
163
  <span class="cline-any cline-neutral">&nbsp;</span>
164
+ <span class="cline-any cline-neutral">&nbsp;</span>
165
+ <span class="cline-any cline-neutral">&nbsp;</span>
166
+ <span class="cline-any cline-neutral">&nbsp;</span>
167
+ <span class="cline-any cline-neutral">&nbsp;</span>
154
168
  <span class="cline-any cline-no">&nbsp;</span>
155
169
  <span class="cline-any cline-neutral">&nbsp;</span>
156
170
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -187,6 +201,9 @@
187
201
  <span class="cline-any cline-neutral">&nbsp;</span>
188
202
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import * as path from 'path';</span>
189
203
  &nbsp;
204
+ // NOTE: projax-core is a workspace alias (not an npm scoped package)
205
+ // pnpm resolves this via the "workspace:*" dependency in package.json
206
+ // to the local packages/core package
190
207
  type CoreModule = typeof import('projax-core');
191
208
  &nbsp;
192
209
  let cachedCore: CoreModule | null = <span class="cstat-no" title="statement not covered" >null;</span>
@@ -212,6 +229,10 @@ function <span class="fstat-no" title="function not covered" >loadCore(</span>):
212
229
  <span class="cstat-no" title="statement not covered" > return cachedCore;</span>
213
230
  }
214
231
  &nbsp;
232
+ // Try multiple locations to find the projax-core module
233
+ // 1. Local dist/core (copied during build)
234
+ // 2. Workspace root packages/core/dist (development)
235
+ // 3. Workspace alias 'projax-core' (resolved by pnpm via workspace:*)
215
236
  const candidates = <span class="cstat-no" title="statement not covered" >[</span>
216
237
  path.join(__dirname, 'core', 'index.js'),
217
238
  path.join(__dirname, 'core'),
@@ -219,7 +240,7 @@ function <span class="fstat-no" title="function not covered" >loadCore(</span>):
219
240
  path.join(__dirname, '..', 'core', 'dist'),
220
241
  path.join(__dirname, '..', '..', 'core', 'dist', 'index.js'),
221
242
  path.join(__dirname, '..', '..', 'core', 'dist'),
222
- 'projax-core',
243
+ 'projax-core', // Workspace alias - pnpm resolves this to packages/core
223
244
  ];
224
245
  &nbsp;
225
246
  <span class="cstat-no" title="statement not covered" > for (const candidate of candidates) {</span>
@@ -253,7 +274,7 @@ export type { Project, Test, ProjectPort } from 'projax-core';
253
274
  <div class='footer quiet pad2 space-top1 center small'>
254
275
  Code coverage generated by
255
276
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
256
- at 2025-11-20T01:55:35.186Z
277
+ at 2026-01-08T01:22:23.516Z
257
278
  </div>
258
279
  <script src="prettify.js"></script>
259
280
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">20.86% </span>
26
+ <span class="strong">17.96% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>154/738</span>
28
+ <span class='fraction'>154/857</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">16.88% </span>
33
+ <span class="strong">13% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>39/231</span>
35
+ <span class='fraction'>39/300</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">25.39% </span>
40
+ <span class="strong">20.77% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>16/63</span>
42
+ <span class='fraction'>16/77</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">21.11% </span>
47
+ <span class="strong">18.19% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>151/715</span>
49
+ <span class='fraction'>151/830</span>
50
50
  </div>
51
51
 
52
52
 
@@ -140,17 +140,32 @@
140
140
 
141
141
  <tr>
142
142
  <td class="file low" data-value="script-runner.ts"><a href="script-runner.ts.html">script-runner.ts</a></td>
143
- <td data-value="27.23" class="pic low">
144
- <div class="chart"><div class="cover-fill" style="width: 27%"></div><div class="cover-empty" style="width: 73%"></div></div>
143
+ <td data-value="25" class="pic low">
144
+ <div class="chart"><div class="cover-fill" style="width: 25%"></div><div class="cover-empty" style="width: 75%"></div></div>
145
145
  </td>
146
- <td data-value="27.23" class="pct low">27.23%</td>
147
- <td data-value="448" class="abs low">122/448</td>
148
- <td data-value="23.62" class="pct low">23.62%</td>
149
- <td data-value="127" class="abs low">30/127</td>
150
- <td data-value="29.54" class="pct low">29.54%</td>
151
- <td data-value="44" class="abs low">13/44</td>
152
- <td data-value="27.33" class="pct low">27.33%</td>
153
- <td data-value="439" class="abs low">120/439</td>
146
+ <td data-value="25" class="pct low">25%</td>
147
+ <td data-value="488" class="abs low">122/488</td>
148
+ <td data-value="21.89" class="pct low">21.89%</td>
149
+ <td data-value="137" class="abs low">30/137</td>
150
+ <td data-value="26" class="pct low">26%</td>
151
+ <td data-value="50" class="abs low">13/50</td>
152
+ <td data-value="25.21" class="pct low">25.21%</td>
153
+ <td data-value="476" class="abs low">120/476</td>
154
+ </tr>
155
+
156
+ <tr>
157
+ <td class="file low" data-value="test-parser.ts"><a href="test-parser.ts.html">test-parser.ts</a></td>
158
+ <td data-value="0" class="pic low">
159
+ <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
160
+ </td>
161
+ <td data-value="0" class="pct low">0%</td>
162
+ <td data-value="79" class="abs low">0/79</td>
163
+ <td data-value="0" class="pct low">0%</td>
164
+ <td data-value="59" class="abs low">0/59</td>
165
+ <td data-value="0" class="pct low">0%</td>
166
+ <td data-value="8" class="abs low">0/8</td>
167
+ <td data-value="0" class="pct low">0%</td>
168
+ <td data-value="78" class="abs low">0/78</td>
154
169
  </tr>
155
170
 
156
171
  </tbody>
@@ -161,7 +176,7 @@
161
176
  <div class='footer quiet pad2 space-top1 center small'>
162
177
  Code coverage generated by
163
178
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
164
- at 2025-11-20T01:55:35.186Z
179
+ at 2026-01-08T01:22:23.516Z
165
180
  </div>
166
181
  <script src="prettify.js"></script>
167
182
  <script>
@@ -1159,7 +1159,7 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromEn
1159
1159
  <div class='footer quiet pad2 space-top1 center small'>
1160
1160
  Code coverage generated by
1161
1161
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1162
- at 2025-11-20T01:55:35.186Z
1162
+ at 2026-01-08T01:22:23.516Z
1163
1163
  </div>
1164
1164
  <script src="prettify.js"></script>
1165
1165
  <script>
@@ -207,7 +207,7 @@
207
207
  <span class="cline-any cline-yes">6x</span>
208
208
  <span class="cline-any cline-neutral">&nbsp;</span>
209
209
  <span class="cline-any cline-neutral">&nbsp;</span>
210
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { getDatabaseManager, Project } from './core-bridge';
210
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { getDatabaseManager, Project, ProjectPort } from './core-bridge';
211
211
  import { extractPortsFromProject, PortInfo } from './port-extractor';
212
212
  import * as fs from 'fs';
213
213
  &nbsp;
@@ -274,7 +274,7 @@ export function shouldRescanPorts(projectId: number): boolean {
274
274
  &nbsp;
275
275
  // Check if any port was detected 24 hours ago or older
276
276
  const twentyFourHoursAgo = Math.floor(Date.now() / 1000) - (24 * 60 * 60);
277
- const needsRescan = ports.some(port =&gt; (port.last_detected || <span class="branch-1 cbranch-no" title="branch not covered" >0)</span> &lt;= twentyFourHoursAgo);
277
+ const needsRescan = ports.some((port: ProjectPort) =&gt; (port.last_detected || <span class="branch-1 cbranch-no" title="branch not covered" >0)</span> &lt;= twentyFourHoursAgo);
278
278
  &nbsp;
279
279
  return needsRescan;
280
280
  }
@@ -286,7 +286,7 @@ export function shouldRescanPorts(projectId: number): boolean {
286
286
  <div class='footer quiet pad2 space-top1 center small'>
287
287
  Code coverage generated by
288
288
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
289
- at 2025-11-20T01:55:35.186Z
289
+ at 2026-01-08T01:22:23.516Z
290
290
  </div>
291
291
  <script src="prettify.js"></script>
292
292
  <script>
@@ -655,7 +655,7 @@ export function extractPortFromError(error: string): number | null {
655
655
  <div class='footer quiet pad2 space-top1 center small'>
656
656
  Code coverage generated by
657
657
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
658
- at 2025-11-20T01:55:35.186Z
658
+ at 2026-01-08T01:22:23.516Z
659
659
  </div>
660
660
  <script src="prettify.js"></script>
661
661
  <script>