@vibgrate/cli 2026.818.2 → 2026.819.2

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 (187) hide show
  1. package/DOCS.md +3 -3
  2. package/dist/agent-ZJRWCMR6.js +30 -0
  3. package/dist/{agent-X6VYCE63.js.map → agent-ZJRWCMR6.js.map} +1 -1
  4. package/dist/{approvals-TPQFQSWG.js → approvals-YTUXBZWQ.js} +7 -7
  5. package/dist/{approvals-TPQFQSWG.js.map → approvals-YTUXBZWQ.js.map} +1 -1
  6. package/dist/attach-WOA25VNH.js +10 -0
  7. package/dist/{attach-G5JUIWIT.js.map → attach-WOA25VNH.js.map} +1 -1
  8. package/dist/baseline-TVRRUZGA.js +9 -0
  9. package/dist/{baseline-DXI64VLW.js.map → baseline-TVRRUZGA.js.map} +1 -1
  10. package/dist/{chunk-V6WONSIK.js → chunk-24HKTTFV.js} +5 -5
  11. package/dist/{chunk-V6WONSIK.js.map → chunk-24HKTTFV.js.map} +1 -1
  12. package/dist/{chunk-VMAIDM4K.js → chunk-2C4QT5D7.js} +5 -5
  13. package/dist/{chunk-VMAIDM4K.js.map → chunk-2C4QT5D7.js.map} +1 -1
  14. package/dist/{chunk-JGA63RGF.js → chunk-2ZBLZ2S3.js} +13 -13
  15. package/dist/{chunk-JGA63RGF.js.map → chunk-2ZBLZ2S3.js.map} +1 -1
  16. package/dist/{chunk-OV4KGXPD.js → chunk-57ZRSCHY.js} +3 -3
  17. package/dist/{chunk-OV4KGXPD.js.map → chunk-57ZRSCHY.js.map} +1 -1
  18. package/dist/{chunk-NDNNOAS6.js → chunk-6H2QV5DR.js} +3 -3
  19. package/dist/{chunk-NDNNOAS6.js.map → chunk-6H2QV5DR.js.map} +1 -1
  20. package/dist/{chunk-2C33WR5O.js → chunk-7BSUPHX6.js} +3 -3
  21. package/dist/{chunk-2C33WR5O.js.map → chunk-7BSUPHX6.js.map} +1 -1
  22. package/dist/{chunk-LJSJX6U4.js → chunk-A3WWRW7U.js} +3 -3
  23. package/dist/{chunk-LJSJX6U4.js.map → chunk-A3WWRW7U.js.map} +1 -1
  24. package/dist/{chunk-X2MQ7UFL.js → chunk-AP3JN33O.js} +12 -12
  25. package/dist/{chunk-X2MQ7UFL.js.map → chunk-AP3JN33O.js.map} +1 -1
  26. package/dist/{chunk-O5IJDMTB.js → chunk-AQZYDFEK.js} +4 -4
  27. package/dist/{chunk-O5IJDMTB.js.map → chunk-AQZYDFEK.js.map} +1 -1
  28. package/dist/{chunk-VQ5KMHW6.js → chunk-BQ6NTRRK.js} +44 -15
  29. package/dist/chunk-BQ6NTRRK.js.map +1 -0
  30. package/dist/{chunk-HF6R73UC.js → chunk-C2EZIAA3.js} +27 -13
  31. package/dist/chunk-C2EZIAA3.js.map +1 -0
  32. package/dist/{chunk-MRZHNUN7.js → chunk-CA4YQBA7.js} +4 -4
  33. package/dist/{chunk-MRZHNUN7.js.map → chunk-CA4YQBA7.js.map} +1 -1
  34. package/dist/{chunk-YF54UMOU.js → chunk-CBL3VY7J.js} +3 -3
  35. package/dist/{chunk-YF54UMOU.js.map → chunk-CBL3VY7J.js.map} +1 -1
  36. package/dist/{chunk-PRHH4DVO.js → chunk-FCMWHSQ6.js} +3 -3
  37. package/dist/{chunk-PRHH4DVO.js.map → chunk-FCMWHSQ6.js.map} +1 -1
  38. package/dist/{chunk-V2UGRUTL.js → chunk-GBXOAO5V.js} +176 -37
  39. package/dist/chunk-GBXOAO5V.js.map +1 -0
  40. package/dist/{chunk-JFE7XCAE.js → chunk-IASO2HCI.js} +3 -3
  41. package/dist/{chunk-JFE7XCAE.js.map → chunk-IASO2HCI.js.map} +1 -1
  42. package/dist/{chunk-ZUOBPKVK.js → chunk-IMI2VHHZ.js} +3 -3
  43. package/dist/{chunk-ZUOBPKVK.js.map → chunk-IMI2VHHZ.js.map} +1 -1
  44. package/dist/{chunk-NKLYDSB7.js → chunk-JPOYXG7Z.js} +10 -10
  45. package/dist/{chunk-NKLYDSB7.js.map → chunk-JPOYXG7Z.js.map} +1 -1
  46. package/dist/{chunk-L2OS4WHT.js → chunk-MMJFHEZ4.js} +4 -4
  47. package/dist/{chunk-L2OS4WHT.js.map → chunk-MMJFHEZ4.js.map} +1 -1
  48. package/dist/{chunk-E3O5UKNA.js → chunk-NKKOGJ63.js} +35 -17
  49. package/dist/chunk-NKKOGJ63.js.map +1 -0
  50. package/dist/{chunk-7AVYKZEM.js → chunk-NV7XNBX4.js} +4 -4
  51. package/dist/{chunk-7AVYKZEM.js.map → chunk-NV7XNBX4.js.map} +1 -1
  52. package/dist/{chunk-NJQZRM55.js → chunk-OGFOJG4H.js} +6 -6
  53. package/dist/{chunk-NJQZRM55.js.map → chunk-OGFOJG4H.js.map} +1 -1
  54. package/dist/{chunk-NZELMYT4.js → chunk-OLIMW4PQ.js} +8 -56
  55. package/dist/chunk-OLIMW4PQ.js.map +1 -0
  56. package/dist/{chunk-B4EXD5LK.js → chunk-PJRPSYFQ.js} +9 -7
  57. package/dist/chunk-PJRPSYFQ.js.map +1 -0
  58. package/dist/{chunk-NG4KIJW6.js → chunk-PVNALGTG.js} +10 -6
  59. package/dist/chunk-PVNALGTG.js.map +1 -0
  60. package/dist/{chunk-BMOFJIMG.js → chunk-QE6F62FR.js} +3 -3
  61. package/dist/{chunk-BMOFJIMG.js.map → chunk-QE6F62FR.js.map} +1 -1
  62. package/dist/{chunk-6ABMV74F.js → chunk-R5TQBIR6.js} +4 -4
  63. package/dist/{chunk-6ABMV74F.js.map → chunk-R5TQBIR6.js.map} +1 -1
  64. package/dist/{chunk-5I4VSBWQ.js → chunk-RTURQXQL.js} +372 -113
  65. package/dist/chunk-RTURQXQL.js.map +1 -0
  66. package/dist/{chunk-74UBGF4P.js → chunk-SHD5TCZ5.js} +3 -3
  67. package/dist/{chunk-74UBGF4P.js.map → chunk-SHD5TCZ5.js.map} +1 -1
  68. package/dist/{chunk-KU7FI5EV.js → chunk-USPMMVNH.js} +3 -3
  69. package/dist/{chunk-KU7FI5EV.js.map → chunk-USPMMVNH.js.map} +1 -1
  70. package/dist/{chunk-E53WBVUQ.js → chunk-VHRSG6CF.js} +3 -3
  71. package/dist/{chunk-E53WBVUQ.js.map → chunk-VHRSG6CF.js.map} +1 -1
  72. package/dist/{chunk-I5LP55B6.js → chunk-W44THEXF.js} +3 -3
  73. package/dist/{chunk-I5LP55B6.js.map → chunk-W44THEXF.js.map} +1 -1
  74. package/dist/{chunk-AEJYA6HZ.js → chunk-W6ASIMG5.js} +7 -7
  75. package/dist/{chunk-AEJYA6HZ.js.map → chunk-W6ASIMG5.js.map} +1 -1
  76. package/dist/{chunk-CQDUBAQY.js → chunk-WNKGRXUA.js} +3 -3
  77. package/dist/{chunk-CQDUBAQY.js.map → chunk-WNKGRXUA.js.map} +1 -1
  78. package/dist/{chunk-RHKOUPWT.js → chunk-WPLOEFZU.js} +7 -5
  79. package/dist/chunk-WPLOEFZU.js.map +1 -0
  80. package/dist/{chunk-FJG5AXKZ.js → chunk-WUFIXAEJ.js} +22 -6
  81. package/dist/chunk-WUFIXAEJ.js.map +1 -0
  82. package/dist/{chunk-6PFHDHOL.js → chunk-XLQ4YHS3.js} +16 -14
  83. package/dist/chunk-XLQ4YHS3.js.map +1 -0
  84. package/dist/{chunk-BWPBB45M.js → chunk-XP6UUCZZ.js} +3 -3
  85. package/dist/{chunk-BWPBB45M.js.map → chunk-XP6UUCZZ.js.map} +1 -1
  86. package/dist/{chunk-BPF3YX2U.js → chunk-XQNKCA2J.js} +6 -3
  87. package/dist/chunk-XQNKCA2J.js.map +1 -0
  88. package/dist/{chunk-FFXGWFAE.js → chunk-XW2XQM3C.js} +7 -7
  89. package/dist/{chunk-FFXGWFAE.js.map → chunk-XW2XQM3C.js.map} +1 -1
  90. package/dist/{chunk-7N4Y3E47.js → chunk-YJYEPYB2.js} +13 -18
  91. package/dist/chunk-YJYEPYB2.js.map +1 -0
  92. package/dist/chunk-ZUZHYAJK.js +6 -0
  93. package/dist/{chunk-4NTNMT6T.js.map → chunk-ZUZHYAJK.js.map} +1 -1
  94. package/dist/cli.js +112 -108
  95. package/dist/cli.js.map +1 -1
  96. package/dist/client-P5XSRFV4.js +8 -0
  97. package/dist/{client-UQIELEEZ.js.map → client-P5XSRFV4.js.map} +1 -1
  98. package/dist/daemon-YKOEP3XA.js +30 -0
  99. package/dist/{daemon-GUMWMKCA.js.map → daemon-YKOEP3XA.js.map} +1 -1
  100. package/dist/embed-worker-main.js +5 -5
  101. package/dist/ensure-map-BLRJDO2Y.js +40 -0
  102. package/dist/{ensure-map-FHDJTO7Y.js.map → ensure-map-BLRJDO2Y.js.map} +1 -1
  103. package/dist/federation-M4ZNXOPX.js +8 -0
  104. package/dist/{federation-MDQPO3PW.js.map → federation-M4ZNXOPX.js.map} +1 -1
  105. package/dist/fs-FO3NQHPT.js +4 -0
  106. package/dist/fs-FO3NQHPT.js.map +1 -0
  107. package/dist/git-ref-LMT3EXYY.js +4 -0
  108. package/dist/{git-ref-RSRAN4OH.js.map → git-ref-LMT3EXYY.js.map} +1 -1
  109. package/dist/graph-backend-NTYONTWW.js +16 -0
  110. package/dist/{graph-backend-W2D3HRRD.js.map → graph-backend-NTYONTWW.js.map} +1 -1
  111. package/dist/index.d.ts +1 -1
  112. package/dist/index.js +24 -25
  113. package/dist/index.js.map +1 -1
  114. package/dist/{interactive-2MK4TLRD.js → interactive-B3WTC7LB.js} +41 -42
  115. package/dist/interactive-B3WTC7LB.js.map +1 -0
  116. package/dist/{llm-host-XFYFOAAX.js → llm-host-QVTJJVER.js} +5 -5
  117. package/dist/{llm-host-XFYFOAAX.js.map → llm-host-QVTJJVER.js.map} +1 -1
  118. package/dist/load-AJROS77R.js +11 -0
  119. package/dist/{load-4R4HYMBB.js.map → load-AJROS77R.js.map} +1 -1
  120. package/dist/local-runtime-GA43KYS5.js +6 -0
  121. package/dist/{local-runtime-6SNWKSA7.js.map → local-runtime-GA43KYS5.js.map} +1 -1
  122. package/dist/model-manager-6H3TMZKK.js +10 -0
  123. package/dist/{model-manager-SXHZ5VD4.js.map → model-manager-6H3TMZKK.js.map} +1 -1
  124. package/dist/{model-orchestrator-LHYPJBFH.js → model-orchestrator-X3NE3Y2G.js} +6 -6
  125. package/dist/{model-orchestrator-LHYPJBFH.js.map → model-orchestrator-X3NE3Y2G.js.map} +1 -1
  126. package/dist/parse-worker.js +2 -2
  127. package/dist/{paths-62AKTFSR.js → paths-RVK6FKRN.js} +4 -4
  128. package/dist/{paths-62AKTFSR.js.map → paths-RVK6FKRN.js.map} +1 -1
  129. package/dist/publish-27S66NOW.js +9 -0
  130. package/dist/{publish-7YHRTBRA.js.map → publish-27S66NOW.js.map} +1 -1
  131. package/dist/resolve-gguf-WVKVDN45.js +9 -0
  132. package/dist/{resolve-gguf-SDIYGGI6.js.map → resolve-gguf-WVKVDN45.js.map} +1 -1
  133. package/dist/{run-outcome-H5GVDDZJ.js → run-outcome-SBBSTSH3.js} +7 -7
  134. package/dist/{run-outcome-H5GVDDZJ.js.map → run-outcome-SBBSTSH3.js.map} +1 -1
  135. package/dist/runtime-session-JYYKQVDX.js +26 -0
  136. package/dist/{runtime-session-JBIHHH5N.js.map → runtime-session-JYYKQVDX.js.map} +1 -1
  137. package/dist/session-2ZMHZ2O6.js +17 -0
  138. package/dist/{session-N5IU4K5Q.js.map → session-2ZMHZ2O6.js.map} +1 -1
  139. package/dist/{slot-subscription-25GOARW5.js → slot-subscription-C2ZUJED6.js} +5 -5
  140. package/dist/{slot-subscription-25GOARW5.js.map → slot-subscription-C2ZUJED6.js.map} +1 -1
  141. package/dist/{stream-json-4WLSUF6I.js → stream-json-ZWGB4C47.js} +17 -17
  142. package/dist/{stream-json-4WLSUF6I.js.map → stream-json-ZWGB4C47.js.map} +1 -1
  143. package/dist/version-5QIEUXU6.js +4 -0
  144. package/dist/{version-DTEU3SQD.js.map → version-5QIEUXU6.js.map} +1 -1
  145. package/dist/{vg-mcp-bridge-KDVYIMFX.js → vg-mcp-bridge-4FETMJ6M.js} +16 -15
  146. package/dist/vg-mcp-bridge-4FETMJ6M.js.map +1 -0
  147. package/dist/{vgd-M7UOPWLB.js → vgd-R524P5BJ.js} +13 -14
  148. package/dist/vgd-R524P5BJ.js.map +1 -0
  149. package/package.json +1 -1
  150. package/dist/agent-X6VYCE63.js +0 -30
  151. package/dist/attach-G5JUIWIT.js +0 -10
  152. package/dist/baseline-DXI64VLW.js +0 -9
  153. package/dist/chunk-4NTNMT6T.js +0 -6
  154. package/dist/chunk-5I4VSBWQ.js.map +0 -1
  155. package/dist/chunk-6PFHDHOL.js.map +0 -1
  156. package/dist/chunk-7N4Y3E47.js.map +0 -1
  157. package/dist/chunk-B4EXD5LK.js.map +0 -1
  158. package/dist/chunk-BPF3YX2U.js.map +0 -1
  159. package/dist/chunk-E3O5UKNA.js.map +0 -1
  160. package/dist/chunk-FJG5AXKZ.js.map +0 -1
  161. package/dist/chunk-HF6R73UC.js.map +0 -1
  162. package/dist/chunk-NG4KIJW6.js.map +0 -1
  163. package/dist/chunk-NZELMYT4.js.map +0 -1
  164. package/dist/chunk-POOL355F.js +0 -237
  165. package/dist/chunk-POOL355F.js.map +0 -1
  166. package/dist/chunk-RHKOUPWT.js.map +0 -1
  167. package/dist/chunk-V2UGRUTL.js.map +0 -1
  168. package/dist/chunk-VQ5KMHW6.js.map +0 -1
  169. package/dist/client-UQIELEEZ.js +0 -8
  170. package/dist/daemon-GUMWMKCA.js +0 -31
  171. package/dist/ensure-map-FHDJTO7Y.js +0 -41
  172. package/dist/federation-MDQPO3PW.js +0 -7
  173. package/dist/fs-TLPOWC2D.js +0 -4
  174. package/dist/fs-TLPOWC2D.js.map +0 -1
  175. package/dist/git-ref-RSRAN4OH.js +0 -4
  176. package/dist/graph-backend-W2D3HRRD.js +0 -16
  177. package/dist/interactive-2MK4TLRD.js.map +0 -1
  178. package/dist/load-4R4HYMBB.js +0 -11
  179. package/dist/local-runtime-6SNWKSA7.js +0 -6
  180. package/dist/model-manager-SXHZ5VD4.js +0 -10
  181. package/dist/publish-7YHRTBRA.js +0 -9
  182. package/dist/resolve-gguf-SDIYGGI6.js +0 -9
  183. package/dist/runtime-session-JBIHHH5N.js +0 -27
  184. package/dist/session-N5IU4K5Q.js +0 -17
  185. package/dist/version-DTEU3SQD.js +0 -4
  186. package/dist/vg-mcp-bridge-KDVYIMFX.js.map +0 -1
  187. package/dist/vgd-M7UOPWLB.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { pathExists, readTextFile, readJsonFile, Semaphore, FileCache, quickTreeCount, ensureDir, writeJsonFile, writeTextFile, findPackageJsonFiles, findFiles, findSolutionFiles, isSkippedDirName } from './chunk-NG4KIJW6.js';
1
+ import { pathExists, readTextFile, readJsonFile, Semaphore, FileCache, quickTreeCount, ensureDir, writeJsonFile, writeTextFile, findPackageJsonFiles, findFiles, findSolutionFiles, isSkippedDirName } from './chunk-PVNALGTG.js';
2
2
  import { redactUrlCredentials, DOTNET_AST_ROLES, JAVA_AST_ROLES, GO_AST_ROLES, SPRING_AST_ROLES, DJANGO_AST_ROLES, FASTAPI_AST_ROLES, NESTJS_AST_ROLES } from './chunk-T7RSQ5WD.js';
3
3
  import * as path31 from 'path';
4
4
  import { basename, dirname } from 'path';
@@ -407,7 +407,10 @@ async function npmViewJson(args, cwd) {
407
407
  return new Promise((resolve9, reject) => {
408
408
  const child = spawn(NPM_COMMAND, ["view", ...args, "--json"], {
409
409
  cwd,
410
- stdio: ["ignore", "pipe", "pipe"]
410
+ stdio: ["ignore", "pipe", "pipe"],
411
+ // Scans also run from console-less hosts (vgd background rebuilds,
412
+ // editor-spawned servers) — never flash a console window on Windows.
413
+ windowsHide: true
411
414
  });
412
415
  let out = "";
413
416
  let err = "";
@@ -2380,7 +2383,7 @@ async function scanPythonProjects(rootDir, pypiCache, cache, projectScanTimeout,
2380
2383
  return results;
2381
2384
  }
2382
2385
  async function findPythonManifests(rootDir) {
2383
- const { findFiles: findFiles2 } = await import('./fs-TLPOWC2D.js');
2386
+ const { findFiles: findFiles2 } = await import('./fs-FO3NQHPT.js');
2384
2387
  return findFiles2(rootDir, (name) => PYTHON_MANIFEST_FILES.has(name) || /^requirements.*\.txt$/.test(name));
2385
2388
  }
2386
2389
  async function scanOnePythonProject(dir, manifestFiles, rootDir, pypiCache, cache, catalog) {
@@ -2820,7 +2823,7 @@ async function scanJavaProjects(rootDir, mavenCache, cache, projectScanTimeout,
2820
2823
  return results;
2821
2824
  }
2822
2825
  async function findJavaManifests(rootDir) {
2823
- const { findFiles: findFiles2 } = await import('./fs-TLPOWC2D.js');
2826
+ const { findFiles: findFiles2 } = await import('./fs-FO3NQHPT.js');
2824
2827
  return findFiles2(rootDir, (name) => JAVA_MANIFEST_FILES.has(name));
2825
2828
  }
2826
2829
  async function scanOneJavaProject(dir, manifestFiles, rootDir, mavenCache, cache, catalog) {
@@ -3225,7 +3228,7 @@ async function scanRubyProjects(rootDir, rubygemsCache, cache, projectScanTimeou
3225
3228
  return results;
3226
3229
  }
3227
3230
  async function findRubyManifests(rootDir) {
3228
- const { findFiles: findFiles2 } = await import('./fs-TLPOWC2D.js');
3231
+ const { findFiles: findFiles2 } = await import('./fs-FO3NQHPT.js');
3229
3232
  return findFiles2(rootDir, (name) => RUBY_MANIFEST_FILES.has(name) || isGemspec(name));
3230
3233
  }
3231
3234
  async function scanOneRubyProject(dir, manifestFiles, rootDir, rubygemsCache, cache, catalog) {
@@ -3466,7 +3469,7 @@ async function scanSwiftProjects(rootDir, swiftCache, cache, projectScanTimeout)
3466
3469
  return results;
3467
3470
  }
3468
3471
  async function findSwiftManifests(rootDir) {
3469
- const { findFiles: findFiles2 } = await import('./fs-TLPOWC2D.js');
3472
+ const { findFiles: findFiles2 } = await import('./fs-FO3NQHPT.js');
3470
3473
  return findFiles2(rootDir, (name) => SWIFT_MANIFEST_FILES.has(name));
3471
3474
  }
3472
3475
  async function scanOneSwiftProject(dir, manifestFile, rootDir, swiftCache, cache) {
@@ -3702,7 +3705,7 @@ async function scanGoProjects(rootDir, goCache, cache, projectScanTimeout, catal
3702
3705
  return results;
3703
3706
  }
3704
3707
  async function findGoManifests(rootDir) {
3705
- const { findFiles: findFiles2 } = await import('./fs-TLPOWC2D.js');
3708
+ const { findFiles: findFiles2 } = await import('./fs-FO3NQHPT.js');
3706
3709
  return findFiles2(rootDir, (name) => GO_MANIFEST_FILES.has(name));
3707
3710
  }
3708
3711
  async function scanOneGoProject(dir, manifestFile, rootDir, goCache, cache, catalog) {
@@ -3988,7 +3991,7 @@ async function scanRustProjects(rootDir, cargoCache, cache, projectScanTimeout)
3988
3991
  return results;
3989
3992
  }
3990
3993
  async function findRustManifests(rootDir) {
3991
- const { findFiles: findFiles2 } = await import('./fs-TLPOWC2D.js');
3994
+ const { findFiles: findFiles2 } = await import('./fs-FO3NQHPT.js');
3992
3995
  return findFiles2(rootDir, (name) => RUST_MANIFEST_FILES.has(name));
3993
3996
  }
3994
3997
  async function scanOneRustProject(dir, manifestFile, rootDir, cargoCache, cache) {
@@ -4220,7 +4223,7 @@ async function scanPhpProjects(rootDir, composerCache, cache, projectScanTimeout
4220
4223
  return results;
4221
4224
  }
4222
4225
  async function findPhpManifests(rootDir) {
4223
- const { findFiles: findFiles2 } = await import('./fs-TLPOWC2D.js');
4226
+ const { findFiles: findFiles2 } = await import('./fs-FO3NQHPT.js');
4224
4227
  return findFiles2(rootDir, (name) => PHP_MANIFEST_FILES.has(name));
4225
4228
  }
4226
4229
  async function scanOnePhpProject(dir, manifestFile, rootDir, composerCache, cache) {
@@ -4485,7 +4488,7 @@ async function scanDartProjects(rootDir, pubCache, cache, projectScanTimeout) {
4485
4488
  return results;
4486
4489
  }
4487
4490
  async function findDartManifests(rootDir) {
4488
- const { findFiles: findFiles2 } = await import('./fs-TLPOWC2D.js');
4491
+ const { findFiles: findFiles2 } = await import('./fs-FO3NQHPT.js');
4489
4492
  return findFiles2(rootDir, (name) => DART_MANIFEST_FILES.has(name));
4490
4493
  }
4491
4494
  async function scanOneDartProject(dir, manifestFile, rootDir, pubCache, cache) {
@@ -11685,6 +11688,30 @@ function contractKindFromName(filePath, basename22) {
11685
11688
  function hasExt(ctx, ...exts) {
11686
11689
  return exts.some((e) => ctx.extensions.has(e));
11687
11690
  }
11691
+ function projectNameHaystack(ctx) {
11692
+ return `${ctx.projectPath.replace(/\\/g, "/")}/${ctx.project.name ?? ""}`;
11693
+ }
11694
+ function looksLikeWebAppName(ctx) {
11695
+ return /webapp|frontend|(?:^|[/._-])spa(?:[/._-]|$)/i.test(projectNameHaystack(ctx));
11696
+ }
11697
+ function looksLikeClientName(ctx) {
11698
+ return /(?:^|[/._-])client(?:[/._-]|$)/i.test(projectNameHaystack(ctx));
11699
+ }
11700
+ var SPA_UI_PACKAGES = [
11701
+ "react",
11702
+ "vue",
11703
+ "svelte",
11704
+ "@angular/core",
11705
+ "vue-router",
11706
+ "vuetify",
11707
+ "@vitejs/plugin-vue",
11708
+ "react-router",
11709
+ "react-router-dom",
11710
+ "@angular/router"
11711
+ ];
11712
+ function hasSpaUiSignal(ctx) {
11713
+ return hasPackage(ctx, ...SPA_UI_PACKAGES) || hasExt(ctx, ".vue", ".svelte");
11714
+ }
11688
11715
  function hasFile(ctx, ...names) {
11689
11716
  return names.some((n) => ctx.fileNames.has(n.toLowerCase()));
11690
11717
  }
@@ -11889,6 +11916,30 @@ var frameworkPacks = [
11889
11916
  depFramework("framework/remix", "remix", ["@remix-run/react", "@remix-run/node", "@remix-run/dev"]),
11890
11917
  depFramework("framework/sveltekit", "sveltekit", ["@sveltejs/kit"]),
11891
11918
  depFramework("framework/nuxt", "nuxt", ["nuxt"]),
11919
+ {
11920
+ id: "framework/vue",
11921
+ frameworks: ["vue"],
11922
+ pathRules: [
11923
+ { pattern: /\/api\//, layer: "infrastructure", confidence: 0.88, signal: "SPA HTTP client (api/)" },
11924
+ { pattern: /\/plugins\//, layer: "config", confidence: 0.82, signal: "SPA plugin wiring" },
11925
+ { pattern: /(^|\/)router\.[jt]sx?$/, layer: "routing", confidence: 0.92, signal: "client router module" },
11926
+ { pattern: /(^|\/)routes\.[jt]sx?$/, layer: "routing", confidence: 0.9, signal: "client routes module" }
11927
+ ],
11928
+ match(ctx) {
11929
+ if (hasPackage(ctx, "nuxt")) return [];
11930
+ const dep = hasPackage(ctx, "vue", "vue-router", "vuetify", "@vitejs/plugin-vue");
11931
+ const files = hasExt(ctx, ".vue");
11932
+ if (!dep && !files) return [];
11933
+ const signals = [];
11934
+ if (hasPackage(ctx, "vue")) signals.push("dep:vue");
11935
+ if (hasPackage(ctx, "vue-router")) signals.push("dep:vue-router");
11936
+ if (hasPackage(ctx, "vuetify")) signals.push("dep:vuetify");
11937
+ if (hasPackage(ctx, "@vitejs/plugin-vue")) signals.push("dep:@vitejs/plugin-vue");
11938
+ if (files) signals.push("vue-source");
11939
+ const confidence = hasPackage(ctx, "vue") ? 0.9 : files ? 0.78 : 0.82;
11940
+ return [evidenceOf("framework/vue", "framework", "vue", confidence, signals)];
11941
+ }
11942
+ },
11892
11943
  depFramework("framework/fastify", "fastify", ["fastify"]),
11893
11944
  depFramework("framework/hono", "hono", ["hono"]),
11894
11945
  depFramework("framework/koa", "koa", ["koa"]),
@@ -12307,17 +12358,28 @@ var projectKindPacks = [
12307
12358
  match(ctx) {
12308
12359
  const metaFw = hasPackage(ctx, "next", "@next/core", "nuxt", "@remix-run/react", "@sveltejs/kit");
12309
12360
  const uiDep = hasPackage(ctx, "react", "vue", "svelte", "@angular/core");
12361
+ const spaDeps = hasPackage(ctx, "vue-router", "vuetify", "@vitejs/plugin-vue", "react-router", "react-router-dom", "@angular/router");
12362
+ const vueFiles = hasExt(ctx, ".vue");
12310
12363
  const pages = filePathHas(ctx, /(^|\/)(pages|app\/.*page\.)/);
12311
12364
  const railsViews = filePathHas(ctx, /(^|\/)app\/views\//);
12312
12365
  const libPath = /(^|\/)(packages|libs)(\/|$)/.test(ctx.projectPath.replace(/\\/g, "/"));
12313
- if (!metaFw && !pages && !railsViews && !(uiDep && !libPath)) return [];
12314
- const apiOnly = !metaFw && !railsViews && filePathHas(ctx, /(^|\/)(controllers|routes)\//) && !pages;
12366
+ const namedWebApp = looksLikeWebAppName(ctx);
12367
+ const clientWithUi = looksLikeClientName(ctx) && (uiDep || spaDeps || vueFiles || pages || railsViews || metaFw);
12368
+ const uiWithoutLib = uiDep && !libPath;
12369
+ if (!metaFw && !pages && !railsViews && !uiWithoutLib && !namedWebApp && !clientWithUi && !spaDeps && !vueFiles) {
12370
+ return [];
12371
+ }
12372
+ const apiOnly = !metaFw && !railsViews && !namedWebApp && !uiDep && !vueFiles && !spaDeps && filePathHas(ctx, /(^|\/)(controllers|routes)\//) && !pages;
12315
12373
  if (apiOnly) return [];
12316
12374
  const signals = [];
12317
12375
  if (metaFw) signals.push("meta-framework");
12318
- else if (uiDep) signals.push("ui-dependency");
12376
+ else if (uiDep || spaDeps) signals.push("ui-dependency");
12319
12377
  if (pages || railsViews) signals.push("ui-layout");
12320
- return [evidenceOf("project-kind/web-app", "projectKind", "web-app", metaFw ? 0.88 : 0.72, signals)];
12378
+ if (namedWebApp) signals.push("webapp-path");
12379
+ if (clientWithUi) signals.push("client-path");
12380
+ if (vueFiles) signals.push("vue-source");
12381
+ const confidence = metaFw || namedWebApp && (uiDep || spaDeps || vueFiles) || spaDeps ? 0.88 : namedWebApp || clientWithUi ? 0.8 : 0.72;
12382
+ return [evidenceOf("project-kind/web-app", "projectKind", "web-app", confidence, signals)];
12321
12383
  }
12322
12384
  },
12323
12385
  {
@@ -12341,7 +12403,8 @@ var projectKindPacks = [
12341
12403
  ctx,
12342
12404
  (p) => p.includes("springframework") || p.includes("spring-boot") || p.toLowerCase().includes("microsoft.aspnetcore")
12343
12405
  );
12344
- const layout = filePathHas(ctx, /(^|\/)(controllers|routes|handlers|api)\//) || filePathHas(ctx, /\.controller\.[jt]sx?$/) || filePathHas(ctx, /Controller\.(cs|java|kt)$/);
12406
+ const spaClient = hasSpaUiSignal(ctx) || looksLikeWebAppName(ctx);
12407
+ const layout = spaClient ? filePathHas(ctx, /(^|\/)(controllers|routes|handlers)\//) || filePathHas(ctx, /\.controller\.[jt]sx?$/) || filePathHas(ctx, /Controller\.(cs|java|kt)$/) : filePathHas(ctx, /(^|\/)(controllers|routes|handlers|api)\//) || filePathHas(ctx, /\.controller\.[jt]sx?$/) || filePathHas(ctx, /Controller\.(cs|java|kt)$/);
12345
12408
  if (!apiDep && !layout) return [];
12346
12409
  const signals = [];
12347
12410
  if (apiDep) signals.push("api-dependency");
@@ -12906,7 +12969,8 @@ var PATH_RULES = [
12906
12969
  { pattern: /\.(infrastructure|infra)\//, layer: "infrastructure", confidence: 0.85, signal: "*.Infrastructure project" },
12907
12970
  { pattern: /\.worker\//, layer: "infrastructure", confidence: 0.8, signal: "*.Worker project" },
12908
12971
  { pattern: /\.(webapi|api)\//, layer: "routing", confidence: 0.8, signal: "*.WebApi project" },
12909
- { pattern: /\.(webapp|web|ui)\//, layer: "presentation", confidence: 0.75, signal: "*.WebApp project" },
12972
+ // `*.WebApp` / `*.Client` / `*.UI` are project-kind signals, not a
12973
+ // blanket presentation stamp. See isSpaWebApp + project-kind/web-app.
12910
12974
  { pattern: /\.(services?|application)\//, layer: "services", confidence: 0.8, signal: "*.Services project" },
12911
12975
  { pattern: /\/wwwroot\//, layer: "presentation", confidence: 0.85, signal: "wwwroot/ static assets" },
12912
12976
  { pattern: /\/properties\//, layer: "config", confidence: 0.85, signal: "Properties/ directory" },
@@ -13024,40 +13088,90 @@ var PASCAL_SUFFIX_RULES = [
13024
13088
  { suffix: "Widget", layer: "presentation", confidence: 0.75, signal: "Widget class" }
13025
13089
  ];
13026
13090
  var UI_SOURCE_EXTENSIONS = /* @__PURE__ */ new Set([".tsx", ".jsx", ".vue", ".svelte"]);
13091
+ var META_WEBAPP_ARCHETYPES = /* @__PURE__ */ new Set([
13092
+ "nextjs",
13093
+ "nuxt",
13094
+ "remix",
13095
+ "sveltekit",
13096
+ "rails"
13097
+ ]);
13098
+ var SPA_SKIP_PASCAL = /* @__PURE__ */ new Set(["Service", "Handler", "Client"]);
13099
+ var SPA_PATH_RULES = [
13100
+ { pattern: /\/api\//, layer: "infrastructure", confidence: 0.88, signal: "SPA HTTP client (api/)" },
13101
+ { pattern: /\/plugins\//, layer: "config", confidence: 0.82, signal: "SPA plugin wiring" },
13102
+ { pattern: /(^|\/)router\.[jt]sx?$/, layer: "routing", confidence: 0.92, signal: "client router module" },
13103
+ { pattern: /(^|\/)routes\.[jt]sx?$/, layer: "routing", confidence: 0.9, signal: "client routes module" }
13104
+ ];
13105
+ function isSpaWebApp(projectKind, archetype) {
13106
+ return projectKind === "web-app" && !META_WEBAPP_ARCHETYPES.has(archetype);
13107
+ }
13108
+ function collectPackLayerRules(packs) {
13109
+ const pathRules = [];
13110
+ const suffixRules = [];
13111
+ const pascalSuffixRules = [];
13112
+ for (const pack of packs) {
13113
+ if (pack.pathRules) pathRules.push(...pack.pathRules);
13114
+ if (pack.suffixRules) suffixRules.push(...pack.suffixRules);
13115
+ if (pack.pascalSuffixRules) pascalSuffixRules.push(...pack.pascalSuffixRules);
13116
+ }
13117
+ return { pathRules, suffixRules, pascalSuffixRules };
13118
+ }
13027
13119
  function isDomainRepositoryPort(baseName, loweredPath) {
13028
13120
  if (!/^I[A-Z]\w*(Repository|Repo)$/.test(baseName)) return false;
13029
13121
  return /\/(domain|interfaces)\//.test(loweredPath);
13030
13122
  }
13031
- function classifyOne(filePath, archetype) {
13123
+ function considerRule(bestMatch, layer, confidence, signal) {
13124
+ if (!bestMatch || confidence > bestMatch.confidence) {
13125
+ return { layer, confidence, signal };
13126
+ }
13127
+ return bestMatch;
13128
+ }
13129
+ function classifyOne(filePath, archetype, opts) {
13032
13130
  const normalised = "/" + filePath.replace(/\\/g, "/").replace(/^\/+/, "");
13033
13131
  const lowered = normalised.toLowerCase();
13132
+ const spa = isSpaWebApp(opts?.projectKind, archetype);
13034
13133
  let bestMatch = null;
13035
- for (const rule of PATH_RULES) {
13134
+ const pathRules = spa ? [...SPA_PATH_RULES, ...PATH_RULES] : PATH_RULES;
13135
+ for (const rule of pathRules) {
13036
13136
  if (rule.archetypes && rule.archetypes.length > 0 && !rule.archetypes.includes(archetype)) {
13037
13137
  continue;
13038
13138
  }
13039
13139
  if (rule.pattern.test(lowered)) {
13040
13140
  const boost = rule.archetypes ? 0.05 : 0;
13041
13141
  const adjustedConfidence = Math.min(rule.confidence + boost, 1);
13042
- if (!bestMatch || adjustedConfidence > bestMatch.confidence) {
13043
- bestMatch = { layer: rule.layer, confidence: adjustedConfidence, signal: rule.signal };
13044
- }
13142
+ bestMatch = considerRule(bestMatch, rule.layer, adjustedConfidence, rule.signal);
13143
+ }
13144
+ }
13145
+ for (const rule of opts?.extraPathRules ?? []) {
13146
+ if (rule.archetypes && rule.archetypes.length > 0 && !rule.archetypes.includes(archetype)) {
13147
+ continue;
13148
+ }
13149
+ if (rule.pattern.test(lowered)) {
13150
+ bestMatch = considerRule(bestMatch, rule.layer, rule.confidence, rule.signal);
13045
13151
  }
13046
13152
  }
13047
13153
  const baseName = path31.basename(filePath, path31.extname(filePath));
13048
13154
  const cleanBase = baseName.replace(/\.(test|spec)$/, "");
13049
13155
  for (const rule of SUFFIX_RULES) {
13050
13156
  if (cleanBase.endsWith(rule.suffix)) {
13051
- if (!bestMatch || rule.confidence > bestMatch.confidence) {
13052
- bestMatch = { layer: rule.layer, confidence: rule.confidence, signal: rule.signal };
13053
- }
13157
+ bestMatch = considerRule(bestMatch, rule.layer, rule.confidence, rule.signal);
13158
+ }
13159
+ }
13160
+ for (const rule of opts?.extraSuffixRules ?? []) {
13161
+ if (cleanBase.endsWith(rule.suffix)) {
13162
+ bestMatch = considerRule(bestMatch, rule.layer, rule.confidence, rule.signal);
13054
13163
  }
13055
13164
  }
13056
13165
  for (const rule of PASCAL_SUFFIX_RULES) {
13166
+ if (spa && SPA_SKIP_PASCAL.has(rule.suffix)) continue;
13057
13167
  if (cleanBase.endsWith(rule.suffix)) {
13058
- if (!bestMatch || rule.confidence > bestMatch.confidence) {
13059
- bestMatch = { layer: rule.layer, confidence: rule.confidence, signal: rule.signal };
13060
- }
13168
+ bestMatch = considerRule(bestMatch, rule.layer, rule.confidence, rule.signal);
13169
+ }
13170
+ }
13171
+ for (const rule of opts?.extraPascalSuffixRules ?? []) {
13172
+ if (spa && SPA_SKIP_PASCAL.has(rule.suffix)) continue;
13173
+ if (cleanBase.endsWith(rule.suffix)) {
13174
+ bestMatch = considerRule(bestMatch, rule.layer, rule.confidence, rule.signal);
13061
13175
  }
13062
13176
  }
13063
13177
  if (isDomainRepositoryPort(cleanBase, lowered)) {
@@ -13086,9 +13200,9 @@ function prefixHasLayerHint(repoRelative, localPath) {
13086
13200
  return prefix.length > 0 && LAYER_HINT_SEGMENT.test(`/${prefix}/`);
13087
13201
  }
13088
13202
  function classifyFile(filePath, archetype, opts) {
13089
- const local = classifyOne(filePath, archetype);
13203
+ const local = classifyOne(filePath, archetype, opts);
13090
13204
  const repoPath = opts?.repoRelative?.replace(/\\/g, "/");
13091
- const repo = repoPath && repoPath !== filePath.replace(/\\/g, "/") && prefixHasLayerHint(repoPath, filePath) ? classifyOne(repoPath, archetype) : null;
13205
+ const repo = repoPath && repoPath !== filePath.replace(/\\/g, "/") && prefixHasLayerHint(repoPath, filePath) ? classifyOne(repoPath, archetype, opts) : null;
13092
13206
  let best = local;
13093
13207
  let usedHint = false;
13094
13208
  if (repo && (!local || repo.confidence > local.confidence)) {
@@ -13377,6 +13491,16 @@ function inferStructure(result, projects) {
13377
13491
  confidence: 0.8
13378
13492
  };
13379
13493
  }
13494
+ if (result.projectKind === "web-app") {
13495
+ if (evidencePrimary && !["layered", "mvc", "mvvm"].includes(evidencePrimary.value)) {
13496
+ return {
13497
+ primary: evidencePrimary.value,
13498
+ characteristics: [],
13499
+ confidence: evidencePrimary.confidence
13500
+ };
13501
+ }
13502
+ return void 0;
13503
+ }
13380
13504
  if (evidencePrimary) {
13381
13505
  return {
13382
13506
  primary: evidencePrimary.value,
@@ -13391,6 +13515,10 @@ function inferStructure(result, projects) {
13391
13515
  }
13392
13516
  function selectBoundaryProfile(structure, result) {
13393
13517
  const primary = structure?.primary;
13518
+ if (result.projectKind === "web-app") {
13519
+ if (primary && (CLEAN_PROFILES.has(primary) || primary === "vertical-slice")) return primary;
13520
+ return void 0;
13521
+ }
13394
13522
  if (primary && CLEAN_PROFILES.has(primary)) return primary;
13395
13523
  if (primary === "vertical-slice" || primary === "mvc" || primary === "mvvm" || primary === "layered") {
13396
13524
  return primary;
@@ -13406,7 +13534,7 @@ function isSliceInternal(filePath) {
13406
13534
  const base = normalizeRelPath3(filePath).split("/").pop() ?? "";
13407
13535
  return !/^(index|public|api|mod)\.[^./]+$/i.test(base);
13408
13536
  }
13409
- function isIllegalEdge(profile, from, to, fromFile, toFile) {
13537
+ function isIllegalEdge(profile, from, to, fromFile, toFile, projectKind) {
13410
13538
  if (profile === "vertical-slice") {
13411
13539
  const fromSlice = sliceOf(fromFile);
13412
13540
  const toSlice = sliceOf(toFile);
@@ -13423,6 +13551,9 @@ function isIllegalEdge(profile, from, to, fromFile, toFile) {
13423
13551
  return { illegal: false, rule: "" };
13424
13552
  }
13425
13553
  if (profile === "layered" || profile === "mvc" || profile === "mvvm") {
13554
+ if (projectKind === "web-app" && to === "presentation" && (from === "routing" || from === "middleware")) {
13555
+ return { illegal: false, rule: "" };
13556
+ }
13426
13557
  if (EXEMPT_LAYERS.has(from) || EXEMPT_LAYERS.has(to)) return { illegal: false, rule: "" };
13427
13558
  if (to === "domain") return { illegal: false, rule: "" };
13428
13559
  if (from === "domain" && (to === "data-access" || to === "infrastructure")) {
@@ -13565,7 +13696,7 @@ function collectBoundaryViolations(result, graph, profile, projectPath, projects
13565
13696
  const fromState = states.get(fromFile);
13566
13697
  const toState = states.get(toFile);
13567
13698
  if (!fromState?.layer || !toState?.layer) continue;
13568
- const { illegal, rule } = isIllegalEdge(profile, fromState.layer, toState.layer, fromFile, toFile);
13699
+ const { illegal, rule } = isIllegalEdge(profile, fromState.layer, toState.layer, fromFile, toFile, result.projectKind);
13569
13700
  if (!illegal) continue;
13570
13701
  const key = `${fromFile}|${toFile}|${rule}`;
13571
13702
  if (seen.has(key)) continue;
@@ -13784,7 +13915,7 @@ function buildFileState2(filePath, result) {
13784
13915
  role
13785
13916
  };
13786
13917
  }
13787
- const pathClass = classifyFile(n, result.archetype);
13918
+ const pathClass = classifyFile(n, result.archetype, { projectKind: result.projectKind });
13788
13919
  if (pathClass) {
13789
13920
  return {
13790
13921
  filePath: n,
@@ -14096,7 +14227,8 @@ var FRAMEWORK_TO_PROJECT_KIND = {
14096
14227
  rails: "web-app",
14097
14228
  laravel: "web-api",
14098
14229
  phoenix: "web-api",
14099
- serverless: "worker"
14230
+ serverless: "worker",
14231
+ vue: "web-app"
14100
14232
  };
14101
14233
  function projectKindFromFramework(framework) {
14102
14234
  if (!framework) return void 0;
@@ -14889,19 +15021,26 @@ async function classifyTree(rootDir, projects, tooling, services, cache, scope)
14889
15021
  dependencyAgeBuckets: { current: 0, oneBehind: 0, twoPlusBehind: 0, unknown: 0 }
14890
15022
  };
14891
15023
  const context = buildProjectContext(primary, sourceFiles);
14892
- const { evidence: rawEvidence } = collectPackEvidence(ARCHITECTURE_PACKS, context);
15024
+ const { evidence: rawEvidence, matching } = collectPackEvidence(ARCHITECTURE_PACKS, context);
14893
15025
  const fusion = fuseEvidence(rawEvidence);
14894
15026
  const { archetype, confidence: archetypeConfidence } = deriveArchetype(detected, fusion);
14895
15027
  const projectKind = fusion.winners.get("projectKind")?.value ?? projectKindFromFramework(fusion.winners.get("framework")?.value);
14896
15028
  const artifactKind = fusion.winners.get("artifactKind")?.value;
14897
15029
  const skipAllLayers = projectKind === "iac" || projectKind === "contract";
15030
+ const packRules = collectPackLayerRules(matching);
14898
15031
  sourceFiles.sort(compareRelPath4);
14899
15032
  const seedClassified = [];
14900
15033
  const seedUnclassified = [];
14901
15034
  for (const file of sourceFiles) {
14902
15035
  if (!isLayerCandidate(file) || skipAllLayers) continue;
14903
15036
  const storedPath = scope ? toRepoRelative(scope.projectPath, file) : file;
14904
- const classification = classifyFile(file, archetype, { repoRelative: storedPath });
15037
+ const classification = classifyFile(file, archetype, {
15038
+ repoRelative: storedPath,
15039
+ projectKind,
15040
+ extraPathRules: packRules.pathRules,
15041
+ extraSuffixRules: packRules.suffixRules,
15042
+ extraPascalSuffixRules: packRules.pascalSuffixRules
15043
+ });
14905
15044
  if (classification) {
14906
15045
  seedClassified.push({ ...classification, filePath: storedPath });
14907
15046
  } else {
@@ -15785,5 +15924,5 @@ async function computeTreeMetadataHash(rootDir, options) {
15785
15924
  }
15786
15925
 
15787
15926
  export { PROJECT_TYPE_TO_OSV_ECOSYSTEM, aggregateSolutionArchitecture, boundaryProfileRules, brandProgressBar, buildVersionTimelines, compactUiPurpose, computeDriftScore, computeRepoFingerprint, computeUpgradeImpact, detectVcs, driftBar, fetchRiskySymbols, fetchScanPreflight, findPackageAnyEcosystem, findPackageTimeline, findVersionCrossings, getChangelogSignals, gitHistoryAvailable, loadConfig, mermaidFromArchitecture, normalizeConstraint, parseDsn, perDependencyDrift, prepareCompressedUpload, projectTypeToVulnEcosystem, refineArchitectureWithAstRoles, refineArchitectureWithGraph, resolveHead, resolveRepositoryName, runCoreScan, scanArchitectureBundle, severityRank, titleBox, versionSatisfies, workingTreeDirty, writeDefaultConfig };
15788
- //# sourceMappingURL=chunk-V2UGRUTL.js.map
15789
- //# sourceMappingURL=chunk-V2UGRUTL.js.map
15927
+ //# sourceMappingURL=chunk-GBXOAO5V.js.map
15928
+ //# sourceMappingURL=chunk-GBXOAO5V.js.map