@@ -106,10 +106,15 @@
106 106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Go workspace
107 107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if (root / "go.work").exists():
108 108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
packages = self._go_packages(root)
109 109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return WorkspaceConfig(type="go", root=root, packages=packages)
110 110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Bare monorepo — no tooling, just a directory of apps/services
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ packages = self._bare_packages(root)
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if len(packages) >= 2:
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return WorkspaceConfig(type="bare", root=root, packages=packages)
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
111 116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return None
112 117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# ── JS-family helpers ─────────────────────────────────────────────────────
114 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
def _js_workspace_packages(self, root: Path) -> list[Path]:
@@ -220,10 +225,71 @@
220 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for child in sorted(root.iterdir()):
221 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if child.is_dir() and not child.name.startswith("."):
222 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if (child / "package.json").exists():
223 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
packages.append(child)
224 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return packages
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Bare monorepo helpers ─────────────────────────────────────────────────
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Manifests expected directly inside the package root
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ _PROJECT_MANIFESTS = (
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "package.json",
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "pyproject.toml",
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "setup.py",
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "setup.cfg",
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Cargo.toml",
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "go.mod",
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "pom.xml",
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "build.gradle",
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "build.gradle.kts",
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Gemfile",
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "composer.json",
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "mix.exs",
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Manifests that may live one subdirectory deeper (e.g. Django's manage.py
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # inside an inner package dir: myapp/myapp/manage.py)
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ _NESTED_MANIFESTS = (
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "manage.py",
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "wsgi.py",
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "asgi.py",
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def _bare_packages(self, root: Path) -> list[Path]:
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Detect a bare monorepo: a directory whose immediate children are
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ independent apps/services with no shared workspace tooling.
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ A child directory qualifies if it contains at least one recognised
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ project manifest directly, or a Django/WSGI manifest one level deeper
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (e.g. myapp/myapp/manage.py).
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Non-project dirs (docs, scripts, config-only folders) are skipped.
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ packages: list[Path] = []
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for child in sorted(root.iterdir()):
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if not child.is_dir() or child.name.startswith("."):
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Check top-level manifests first
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for manifest in self._PROJECT_MANIFESTS:
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (child / manifest).exists():
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ packages.append(child)
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else:
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Fall back: look one level deeper for Django/WSGI markers
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if self._has_nested_manifest(child):
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ packages.append(child)
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return packages
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def _has_nested_manifest(self, pkg_root: Path) -> bool:
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Return True if any immediate subdirectory contains a nested manifest."""
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for subdir in pkg_root.iterdir():
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if not subdir.is_dir() or subdir.name.startswith("."):
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for manifest in self._NESTED_MANIFESTS:
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (subdir / manifest).exists():
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return True
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return False
225 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
226 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# ── Cargo helpers ─────────────────────────────────────────────────────────
227 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
228 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
def _cargo_packages(self, root: Path, cargo_toml: Path) -> list[Path] | None:
229 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"""
@@ -459,10 +525,17 @@
459 525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return self._js_deps(pkg_path)
460 526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if workspace_type == "cargo":
461 527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return self._cargo_deps(pkg_path)
462 528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if workspace_type == "go":
463 529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return self._go_deps(pkg_path)
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if workspace_type == "bare":
531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Try all known manifest parsers and merge results
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ deps: list[str] = []
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ deps.extend(self._js_deps(pkg_path))
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ deps.extend(self._cargo_deps(pkg_path))
535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ deps.extend(self._go_deps(pkg_path))
536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return deps
464 537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return []
465 538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
466 539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
def _js_deps(self, pkg_path: Path) -> list[str]:
467 540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pkg_json = pkg_path / "package.json"
468 541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if not pkg_json.exists():
469 542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!