projax 3.3.51 → 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 (162) hide show
  1. package/README.md +0 -73
  2. package/coverage/core-bridge.ts.html +24 -3
  3. package/coverage/index.html +34 -19
  4. package/coverage/lcov-report/core-bridge.ts.html +24 -3
  5. package/coverage/lcov-report/index.html +34 -19
  6. package/coverage/lcov-report/port-extractor.ts.html +1 -1
  7. package/coverage/lcov-report/port-scanner.ts.html +3 -3
  8. package/coverage/lcov-report/port-utils.ts.html +1 -1
  9. package/coverage/lcov-report/script-runner.ts.html +302 -11
  10. package/coverage/lcov-report/test-parser.ts.html +799 -0
  11. package/coverage/lcov.info +270 -49
  12. package/coverage/port-extractor.ts.html +1 -1
  13. package/coverage/port-scanner.ts.html +3 -3
  14. package/coverage/port-utils.ts.html +1 -1
  15. package/coverage/script-runner.ts.html +302 -11
  16. package/coverage/test-parser.ts.html +799 -0
  17. package/dist/__tests__/port-scanner.test.js +17 -7
  18. package/dist/__tests__/script-runner.test.js +17 -7
  19. package/dist/api/__tests__/database.test.js +17 -7
  20. package/dist/api/__tests__/database.test.js.map +1 -1
  21. package/dist/api/__tests__/routes.test.js +18 -7
  22. package/dist/api/__tests__/routes.test.js.map +1 -1
  23. package/dist/api/__tests__/scanner.test.js +18 -7
  24. package/dist/api/__tests__/scanner.test.js.map +1 -1
  25. package/dist/api/database.d.ts +0 -8
  26. package/dist/api/database.d.ts.map +1 -1
  27. package/dist/api/database.js +24 -57
  28. package/dist/api/database.js.map +1 -1
  29. package/dist/api/index.js +19 -9
  30. package/dist/api/index.js.map +1 -1
  31. package/dist/api/migrate.js +1 -2
  32. package/dist/api/migrate.js.map +1 -1
  33. package/dist/api/package.json +6 -3
  34. package/dist/api/routes/backup.d.ts +2 -1
  35. package/dist/api/routes/backup.d.ts.map +1 -1
  36. package/dist/api/routes/backup.js.map +1 -1
  37. package/dist/api/routes/index.d.ts +2 -1
  38. package/dist/api/routes/index.d.ts.map +1 -1
  39. package/dist/api/routes/index.js +0 -2
  40. package/dist/api/routes/index.js.map +1 -1
  41. package/dist/api/routes/projects.d.ts +2 -1
  42. package/dist/api/routes/projects.d.ts.map +1 -1
  43. package/dist/api/routes/projects.js +17 -7
  44. package/dist/api/routes/projects.js.map +1 -1
  45. package/dist/api/routes/settings.d.ts +2 -1
  46. package/dist/api/routes/settings.d.ts.map +1 -1
  47. package/dist/api/routes/settings.js +22 -57
  48. package/dist/api/routes/settings.js.map +1 -1
  49. package/dist/api/routes/workspaces.d.ts +2 -1
  50. package/dist/api/routes/workspaces.d.ts.map +1 -1
  51. package/dist/api/routes/workspaces.js +21 -96
  52. package/dist/api/routes/workspaces.js.map +1 -1
  53. package/dist/api/services/scanner.js +19 -10
  54. package/dist/api/services/scanner.js.map +1 -1
  55. package/dist/api/services/test-parser.js +2 -3
  56. package/dist/api/services/test-parser.js.map +1 -1
  57. package/dist/api/types.d.ts +0 -5
  58. package/dist/api/types.d.ts.map +1 -1
  59. package/dist/core/__tests__/database.test.js +17 -7
  60. package/dist/core/__tests__/detector.test.js +17 -7
  61. package/dist/core/__tests__/index.test.js +18 -7
  62. package/dist/core/__tests__/scanner.test.js +18 -7
  63. package/dist/core/__tests__/settings.test.js +18 -7
  64. package/dist/core/backup-utils.js +20 -11
  65. package/dist/core/database.js +18 -9
  66. package/dist/core/detector.js +21 -11
  67. package/dist/core/git-utils.js +19 -10
  68. package/dist/core/index.js +5 -5
  69. package/dist/core/scanner.js +2 -3
  70. package/dist/core/settings.d.ts +0 -85
  71. package/dist/core/settings.js +9 -306
  72. package/dist/core/workspace-utils.js +20 -11
  73. package/dist/core-bridge.js +22 -8
  74. package/dist/electron/core/__tests__/database.test.js +17 -7
  75. package/dist/electron/core/__tests__/detector.test.js +17 -7
  76. package/dist/electron/core/__tests__/index.test.js +18 -7
  77. package/dist/electron/core/__tests__/scanner.test.js +18 -7
  78. package/dist/electron/core/__tests__/settings.test.js +18 -7
  79. package/dist/electron/core/backup-utils.js +20 -11
  80. package/dist/electron/core/database.js +18 -9
  81. package/dist/electron/core/detector.js +21 -11
  82. package/dist/electron/core/git-utils.js +19 -10
  83. package/dist/electron/core/index.js +5 -5
  84. package/dist/electron/core/scanner.js +2 -3
  85. package/dist/electron/core/settings.d.ts +0 -85
  86. package/dist/electron/core/settings.js +9 -306
  87. package/dist/electron/core/workspace-utils.js +20 -11
  88. package/dist/electron/core.js +22 -8
  89. package/dist/electron/main.js +143 -444
  90. package/dist/electron/port-extractor.js +18 -9
  91. package/dist/electron/port-scanner.js +21 -12
  92. package/dist/electron/port-utils.js +4 -5
  93. package/dist/electron/preload.d.ts +2 -13
  94. package/dist/electron/preload.js +2 -9
  95. package/dist/electron/renderer/assets/index-BjZn_mEF.js +66 -0
  96. package/dist/electron/renderer/assets/index-CZmDxbJO.js +66 -0
  97. package/dist/electron/renderer/assets/{index-DWe2TQFv.css → index-DfocdjIj.css} +1 -1
  98. package/dist/electron/renderer/index.html +2 -2
  99. package/dist/electron/script-runner.js +29 -20
  100. package/dist/index.js +37 -134
  101. package/dist/port-extractor.js +18 -9
  102. package/dist/port-scanner.js +21 -12
  103. package/dist/port-utils.js +4 -5
  104. package/dist/prxi.d.ts +1 -0
  105. package/dist/prxi.js +1106 -0
  106. package/dist/prxi.tsx +6 -6
  107. package/dist/script-runner.js +29 -20
  108. package/dist/test-parser.js +2 -3
  109. package/jest.config.js +8 -0
  110. package/package.json +9 -6
  111. package/dist/api/routes/mcp.d.ts +0 -3
  112. package/dist/api/routes/mcp.d.ts.map +0 -1
  113. package/dist/api/routes/mcp.js +0 -147
  114. package/dist/api/routes/mcp.js.map +0 -1
  115. package/dist/electron/renderer/assets/index-59AhiV_K.css +0 -1
  116. package/dist/electron/renderer/assets/index-A04svynq.js +0 -62
  117. package/dist/electron/renderer/assets/index-B-etDnj2.js +0 -64
  118. package/dist/electron/renderer/assets/index-BGodNljq.js +0 -62
  119. package/dist/electron/renderer/assets/index-Bx18Cyic.js +0 -64
  120. package/dist/electron/renderer/assets/index-ByBOaxqv.js +0 -62
  121. package/dist/electron/renderer/assets/index-ByHY-x-j.js +0 -62
  122. package/dist/electron/renderer/assets/index-C1SRt6Jx.js +0 -62
  123. package/dist/electron/renderer/assets/index-C8f5yNYe.js +0 -64
  124. package/dist/electron/renderer/assets/index-C9Fo49a8.js +0 -61
  125. package/dist/electron/renderer/assets/index-CGx7K7jh.js +0 -62
  126. package/dist/electron/renderer/assets/index-CIZ3Wl6c.css +0 -1
  127. package/dist/electron/renderer/assets/index-CJbsU9y8.css +0 -1
  128. package/dist/electron/renderer/assets/index-CJrLunKK.js +0 -62
  129. package/dist/electron/renderer/assets/index-CQTleudf.css +0 -1
  130. package/dist/electron/renderer/assets/index-CQcilqlv.js +0 -62
  131. package/dist/electron/renderer/assets/index-CS-85xbL.css +0 -1
  132. package/dist/electron/renderer/assets/index-CYph0WPA.js +0 -62
  133. package/dist/electron/renderer/assets/index-C_WSLD6y.css +0 -1
  134. package/dist/electron/renderer/assets/index-CgB-tTpV.js +0 -62
  135. package/dist/electron/renderer/assets/index-ChoTzPLo.css +0 -1
  136. package/dist/electron/renderer/assets/index-CopVNRnR.js +0 -64
  137. package/dist/electron/renderer/assets/index-D1jmaGv5.css +0 -1
  138. package/dist/electron/renderer/assets/index-D2AOB6Er.js +0 -62
  139. package/dist/electron/renderer/assets/index-DAfjuYKX.js +0 -61
  140. package/dist/electron/renderer/assets/index-DEOOHPEi.css +0 -1
  141. package/dist/electron/renderer/assets/index-DTtg6XrF.css +0 -1
  142. package/dist/electron/renderer/assets/index-DUvcepWm.js +0 -64
  143. package/dist/electron/renderer/assets/index-DVWDlM1D.js +0 -62
  144. package/dist/electron/renderer/assets/index-DZzB20Xf.css +0 -1
  145. package/dist/electron/renderer/assets/index-Dk0EQt0u.css +0 -1
  146. package/dist/electron/renderer/assets/index-DknLdADV.js +0 -63
  147. package/dist/electron/renderer/assets/index-DocuD8Lk.js +0 -64
  148. package/dist/electron/renderer/assets/index-DwRy5FqP.js +0 -62
  149. package/dist/electron/renderer/assets/index-DyU-xfd8.css +0 -1
  150. package/dist/electron/renderer/assets/index-GwC-JVUy.css +0 -1
  151. package/dist/electron/renderer/assets/index-JXrtTB1F.js +0 -63
  152. package/dist/electron/renderer/assets/index-Ocrdv8Lb.css +0 -1
  153. package/dist/electron/renderer/assets/index-R-HsWJ0K.js +0 -62
  154. package/dist/electron/renderer/assets/index-Ytah0wbZ.js +0 -62
  155. package/dist/electron/renderer/assets/index-ZVyXUshO.css +0 -1
  156. package/dist/electron/renderer/assets/index-Z_8dJn3i.js +0 -62
  157. package/dist/electron/renderer/assets/index-fehviker.js +0 -63
  158. package/dist/electron/renderer/assets/index-nts9ST-M.js +0 -62
  159. package/dist/electron/renderer/assets/index-q8NVIH3g.css +0 -1
  160. package/dist/electron/renderer/assets/index-thUWIXon.js +0 -62
  161. package/dist/electron/renderer/assets/index-tuQmrwcm.css +0 -1
  162. package/dist/prxi/src/index.tsx +0 -1370
package/README.md CHANGED
@@ -107,79 +107,6 @@ The API server automatically finds an available port in the range 38124-38133. T
107
107
  **API Endpoints:**
108
108
  See [packages/api/README.md](packages/api/README.md) for complete API documentation.
109
109
 
110
- ## MCP Server - AI Context Integration
111
-
112
- **PROJAX MCP Server** provides project and workspace context to AI tools like Cursor and VS Code through the Model Context Protocol (MCP). This enables AI assistants to understand your project structure and relationships.
113
-
114
- ### 🎯 What is MCP?
115
-
116
- The Model Context Protocol is an open standard that lets AI tools access contextual information from your development environment. The PROJAX MCP server exposes:
117
-
118
- - **Current Project Context**: Name, path, framework, tags, and git branch
119
- - **Linked Projects**: Other projects in the same workspace
120
- - **Workspace Metadata**: Workspace descriptions and relationships
121
-
122
- ### 📦 Configuration
123
-
124
- The MCP server is included with PROJAX. Configure it in your editor:
125
-
126
- #### Cursor Configuration
127
-
128
- Add to `~/.cursor/mcp.json`:
129
- ```json
130
- {
131
- "mcpServers": {
132
- "projax": {
133
- "command": "prx",
134
- "args": ["mcp"]
135
- }
136
- }
137
- }
138
- ```
139
-
140
- #### VS Code Configuration
141
-
142
- Add to `settings.json`:
143
- ```json
144
- {
145
- "mcp.servers": {
146
- "projax": {
147
- "command": "prx",
148
- "args": ["mcp"]
149
- }
150
- }
151
- }
152
- ```
153
-
154
- ### 💡 Usage
155
-
156
- Once configured, AI assistants automatically receive context about:
157
- - Your current project when working in any registered PROJAX project
158
- - Related projects in the same workspace
159
- - Project metadata (framework, tags, descriptions)
160
-
161
- **Example**: If you're working in a frontend project that's part of a workspace with backend and mobile projects, the AI assistant will know about all three projects and can provide context-aware suggestions.
162
-
163
- ### ⚙️ Commands
164
-
165
- ```bash
166
- # Display MCP configuration for copy/paste
167
- prx mcp-config
168
-
169
- # Show Cursor-specific configuration
170
- prx mcp-config --cursor
171
-
172
- # Show VS Code-specific configuration
173
- prx mcp-config --vscode
174
-
175
- # View configuration in Desktop app
176
- # Settings → MCP Server
177
- ```
178
-
179
- ### 📚 Documentation
180
-
181
- For detailed documentation, see [packages/mcp-server/README.md](packages/mcp-server/README.md)
182
-
183
110
  ## Usage
184
111
 
185
112
  ### CLI Commands
@@ -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>