diff --git a/.github/workflows/codesight.yml b/.github/workflows/codesight.yml index aa331e2..537c52c 100644 --- a/.github/workflows/codesight.yml +++ b/.github/workflows/codesight.yml @@ -10,6 +10,7 @@ on: permissions: contents: write pull-requests: write + issues: write jobs: codesight: diff --git a/src/core.ts b/src/core.ts index 82df6fa..9a8da24 100644 --- a/src/core.ts +++ b/src/core.ts @@ -46,7 +46,10 @@ export async function scan( ` ${project.frameworks.length > 0 ? project.frameworks.join(", ") : "generic"} | ${project.orms.length > 0 ? project.orms.join(", ") : "no ORM"} | ${project.language}` ); if (project.isMonorepo) { - console.log(` Monorepo: ${project.workspaces.map((w) => w.name).join(", ")}`); + const repoLabel = project.repoType === "meta" ? "Meta-repo" + : project.repoType === "microservices" ? "Microservices" + : "Monorepo"; + console.log(` ${repoLabel}: ${project.workspaces.map((w) => w.name).join(", ")}`); } } diff --git a/src/formatter.ts b/src/formatter.ts index 2fc8dcf..365d388 100644 --- a/src/formatter.ts +++ b/src/formatter.ts @@ -379,7 +379,10 @@ function formatCombined( lines.push(`> **Stack:** ${fw} | ${orm} | ${compFw} | ${lang}`); if (result.project.isMonorepo) { const wsNames = result.project.workspaces.map((w) => w.name).join(", "); - lines.push(`> **Monorepo:** ${wsNames}`); + const repoLabel = result.project.repoType === "meta" ? "Meta-repo" + : result.project.repoType === "microservices" ? "Microservices" + : "Monorepo"; + lines.push(`> **${repoLabel}:** ${wsNames}`); } lines.push(""); diff --git a/src/generators/ai-config.ts b/src/generators/ai-config.ts index 8346bbd..678d04e 100644 --- a/src/generators/ai-config.ts +++ b/src/generators/ai-config.ts @@ -22,7 +22,10 @@ function generateContext(result: ScanResult): string { lines.push(`This is a ${project.language} project using ${fw}${orm !== "none" ? ` with ${orm}` : ""}.`); if (project.isMonorepo) { - lines.push(`It is a monorepo with workspaces: ${project.workspaces.map((w) => `${w.name} (${w.path})`).join(", ")}.`); + const repoLabel = project.repoType === "meta" ? "meta-repo" + : project.repoType === "microservices" ? "microservices repo" + : "monorepo"; + lines.push(`It is a ${repoLabel} with workspaces: ${project.workspaces.map((w) => `${w.name} (${w.path})`).join(", ")}.`); } lines.push(""); @@ -175,7 +178,10 @@ export async function generateProfileConfig( summaryLines.push(`# ${project.name} — Project Context\n`); summaryLines.push(`**Stack:** ${project.frameworks.join(", ") || "generic"} | ${project.orms.join(", ") || "none"} | ${project.language}`); if (project.isMonorepo) { - summaryLines.push(`**Monorepo:** ${project.workspaces.map((w) => w.name).join(", ")}`); + const repoLabel = project.repoType === "meta" ? "Meta-repo" + : project.repoType === "microservices" ? "Microservices" + : "Monorepo"; + summaryLines.push(`**${repoLabel}:** ${project.workspaces.map((w) => w.name).join(", ")}`); } summaryLines.push(`\n${routes.length} routes | ${schemas.length} models | ${config.envVars.length} env vars | ${graph.edges.length} import links\n`); diff --git a/src/generators/html-report.ts b/src/generators/html-report.ts index 829b058..77b3bfd 100644 --- a/src/generators/html-report.ts +++ b/src/generators/html-report.ts @@ -96,7 +96,7 @@ ${project.frameworks.map((f) => `${escapeHtml(f)} `${escapeHtml(o)}`).join("")} ${escapeHtml(project.componentFramework)} ${escapeHtml(project.language)} -${project.isMonorepo ? 'monorepo' : ""} +${project.repoType !== "single" ? `${escapeHtml(project.repoType)}` : ""}
diff --git a/src/generators/wiki.ts b/src/generators/wiki.ts index 66975a7..2375163 100644 --- a/src/generators/wiki.ts +++ b/src/generators/wiki.ts @@ -157,12 +157,17 @@ function overviewArticle(result: ScanResult): string { // One-sentence description const parts: string[] = [`a ${project.language} project built with ${fw}`]; if (orm !== "none") parts.push(`using ${orm} for data persistence`); - if (project.isMonorepo) parts.push(`organized as a monorepo`); + if (project.repoType === "meta") parts.push(`organized as a meta-repo (aggregated independent projects)`); + else if (project.repoType === "microservices") parts.push(`organized as a microservices repo`); + else if (project.isMonorepo) parts.push(`organized as a monorepo`); lines.push(`**${project.name}** is ${parts.join(", ")}.`, ""); if (project.isMonorepo && project.workspaces.length > 0) { + const wsLabel = project.repoType === "meta" ? "Projects" + : project.repoType === "microservices" ? "Services" + : "Workspaces"; lines.push( - `**Workspaces:** ${project.workspaces.map((w) => `\`${w.name}\` (\`${w.path}\`)`).join(", ")}`, + `**${wsLabel}:** ${project.workspaces.map((w) => `\`${w.name}\` (\`${w.path}\`)`).join(", ")}`, "" ); } diff --git a/src/mcp-server.ts b/src/mcp-server.ts index 6bbc02c..2b79def 100644 --- a/src/mcp-server.ts +++ b/src/mcp-server.ts @@ -268,7 +268,10 @@ async function toolGetSummary(args: any): Promise { lines.push(`# ${project.name}`); lines.push(`Stack: ${fw} | ${orm} | ${project.componentFramework} | ${project.language}`); if (project.isMonorepo) { - lines.push(`Monorepo: ${project.workspaces.map((w) => w.name).join(", ")}`); + const repoLabel = project.repoType === "meta" ? "Meta-repo" + : project.repoType === "microservices" ? "Microservices" + : "Monorepo"; + lines.push(`${repoLabel}: ${project.workspaces.map((w) => w.name).join(", ")}`); } lines.push(""); lines.push( diff --git a/src/scanner.ts b/src/scanner.ts index 126aa80..20c0285 100644 --- a/src/scanner.ts +++ b/src/scanner.ts @@ -6,6 +6,7 @@ import type { ORM, ComponentFramework, ProjectInfo, + RepoType, WorkspaceInfo, } from "./types.js"; @@ -222,6 +223,8 @@ export async function detectProject(root: string): Promise { // Treat as implicit monorepo when multiple distinct stacks are found if (!isMonorepo && workspaces.length >= 2) isMonorepo = true; + const repoType = await classifyRepoType(root, workspaces, isMonorepo); + // Aggregate all workspace deps (always — not just for declared monorepos) let allDeps = { ...deps }; for (const ws of workspaces) { @@ -300,6 +303,7 @@ export async function detectProject(root: string): Promise { orms, componentFramework: detectComponentFramework(allDeps, frameworks), isMonorepo, + repoType, workspaces, language, }; @@ -342,6 +346,44 @@ async function discoverImplicitWorkspaces( } catch {} } +/** + * Classify the repo structure into one of: single, monorepo, microservices, meta. + * + * - meta: .gitmodules exists → git submodules mean independent projects are + * aggregated here (e.g. org-wide umbrella repos) + * - microservices: multiple workspaces each with their own Dockerfile, or infra dirs + * (k8s/, kubernetes/, helm/) are present alongside 2+ workspaces + * - monorepo: multiple workspaces under shared tooling (packages.json workspaces, + * pnpm-workspace.yaml, turbo.json, nx.json, etc.) + * - single: single-project repo with no workspaces + */ +async function classifyRepoType( + root: string, + workspaces: WorkspaceInfo[], + isMonorepo: boolean +): Promise { + // Meta-repo: git submodules are the definitive signal + if (await fileExists(join(root, ".gitmodules"))) return "meta"; + + if (!isMonorepo || workspaces.length <= 1) return "single"; + + // Microservices: 2+ workspaces each with a Dockerfile, or infra orchestration at root + const infraDirs = ["k8s", "kubernetes", "helm"]; + for (const dir of infraDirs) { + if (await fileExists(join(root, dir))) return "microservices"; + } + + let dockerfileCount = 0; + for (const ws of workspaces) { + if (await fileExists(join(root, ws.path, "Dockerfile"))) { + dockerfileCount++; + if (dockerfileCount >= 2) return "microservices"; + } + } + + return "monorepo"; +} + async function hasDirectWorkspaceManifest(dir: string): Promise { const directManifestNames = [ "package.json", diff --git a/src/types.ts b/src/types.ts index 0460c28..c3d89e0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -71,6 +71,8 @@ export interface KnowledgeMap { dateRange?: { from: string; to: string }; } +export type RepoType = "single" | "monorepo" | "microservices" | "meta"; + export interface ProjectInfo { root: string; name: string; @@ -78,6 +80,7 @@ export interface ProjectInfo { orms: ORM[]; componentFramework: ComponentFramework; isMonorepo: boolean; + repoType: RepoType; workspaces: WorkspaceInfo[]; language: "typescript" | "javascript" | "python" | "go" | "ruby" | "elixir" | "java" | "kotlin" | "rust" | "php" | "dart" | "swift" | "csharp" | "mixed"; } diff --git a/tests/detectors.test.ts b/tests/detectors.test.ts index 8bf2282..836ff3c 100644 --- a/tests/detectors.test.ts +++ b/tests/detectors.test.ts @@ -521,12 +521,58 @@ describe("Framework Detection", async () => { }); const project = await mods.detectProject(dir); assert.equal(project.isMonorepo, true); + assert.equal(project.repoType, "monorepo"); assert.ok(project.workspaces.length >= 2); assert.ok(project.frameworks.includes("hono")); assert.equal(project.componentFramework, "react"); }); }); +describe("Repo Type Classification", async () => { + const mods = await loadModules(); + + it("classifies single-project repo as 'single'", async () => { + const dir = await writeFixture("repotype-single", { + "package.json": JSON.stringify({ name: "my-app", dependencies: { express: "^4.0.0" } }), + }); + const project = await mods.detectProject(dir); + assert.equal(project.repoType, "single"); + assert.equal(project.isMonorepo, false); + }); + + it("classifies meta-repo via .gitmodules", async () => { + const dir = await writeFixture("repotype-meta", { + ".gitmodules": `[submodule "frontend-app"]\n\tpath = frontend-app\n\turl = https://github.com/org/frontend-app\n[submodule "backend-api"]\n\tpath = backend-api\n\turl = https://github.com/org/backend-api\n`, + "frontend-app/package.json": JSON.stringify({ name: "frontend-app", dependencies: { react: "^18.0.0" } }), + "backend-api/package.json": JSON.stringify({ name: "backend-api", dependencies: { express: "^4.0.0" } }), + }); + const project = await mods.detectProject(dir); + assert.equal(project.repoType, "meta"); + }); + + it("classifies microservices repo via multiple Dockerfiles", async () => { + const dir = await writeFixture("repotype-microservices-docker", { + "auth/package.json": JSON.stringify({ name: "auth-service", dependencies: { express: "^4.0.0" } }), + "auth/Dockerfile": "FROM node:20\nCMD [\"node\", \"index.js\"]", + "payments/package.json": JSON.stringify({ name: "payments-service", dependencies: { fastify: "^4.0.0" } }), + "payments/Dockerfile": "FROM node:20\nCMD [\"node\", \"index.js\"]", + }); + const project = await mods.detectProject(dir); + assert.equal(project.repoType, "microservices"); + assert.equal(project.isMonorepo, true); + }); + + it("classifies microservices repo via k8s directory", async () => { + const dir = await writeFixture("repotype-microservices-k8s", { + "k8s/deployment.yaml": "apiVersion: apps/v1\nkind: Deployment", + "api/package.json": JSON.stringify({ name: "api", dependencies: { hono: "^4.0.0" } }), + "worker/package.json": JSON.stringify({ name: "worker", dependencies: { bullmq: "^5.0.0" } }), + }); + const project = await mods.detectProject(dir); + assert.equal(project.repoType, "microservices"); + }); +}); + describe("Python Workspace Subdirectory Detection", async () => { const mods = await loadModules(); diff --git a/tests/fixtures/python-custom-subdir-pyproject/apps/web/package.json b/tests/fixtures/python-custom-subdir-pyproject/apps/web/package.json new file mode 100644 index 0000000..7224562 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-pyproject/apps/web/package.json @@ -0,0 +1 @@ +{"name":"@test/web","dependencies":{"react":"^18.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/python-custom-subdir-pyproject/package.json b/tests/fixtures/python-custom-subdir-pyproject/package.json new file mode 100644 index 0000000..bad87f6 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-pyproject/package.json @@ -0,0 +1 @@ +{"name":"test","workspaces":["apps/*","services/*"]} \ No newline at end of file diff --git a/tests/fixtures/python-custom-subdir-pyproject/services/custom-api/main.py b/tests/fixtures/python-custom-subdir-pyproject/services/custom-api/main.py new file mode 100644 index 0000000..5ba599b --- /dev/null +++ b/tests/fixtures/python-custom-subdir-pyproject/services/custom-api/main.py @@ -0,0 +1,10 @@ +from fastapi import FastAPI +app = FastAPI() + +@app.get("/health") +def health(): + return {"ok": True} + +@app.post("/users") +def create_user(): + return {"created": True} diff --git a/tests/fixtures/python-custom-subdir-pyproject/services/custom-api/models.py b/tests/fixtures/python-custom-subdir-pyproject/services/custom-api/models.py new file mode 100644 index 0000000..967cb20 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-pyproject/services/custom-api/models.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.orm import declarative_base, relationship + +Base = declarative_base() + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True) + email = Column(String, unique=True) + posts = relationship("Post") + +class Post(Base): + __tablename__ = "posts" + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey("users.id")) + user = relationship("User") diff --git a/tests/fixtures/python-custom-subdir-pyproject/services/custom-api/pyproject.toml b/tests/fixtures/python-custom-subdir-pyproject/services/custom-api/pyproject.toml new file mode 100644 index 0000000..3e239f7 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-pyproject/services/custom-api/pyproject.toml @@ -0,0 +1,8 @@ +[project] +name = "custom-api" +version = "0.1.0" +dependencies = [ + "fastapi>=0.110.0", + "sqlalchemy>=2.0.0", + "uvicorn>=0.29.0", +] diff --git a/tests/fixtures/python-custom-subdir-root/my-service-api/main.py b/tests/fixtures/python-custom-subdir-root/my-service-api/main.py new file mode 100644 index 0000000..5ba599b --- /dev/null +++ b/tests/fixtures/python-custom-subdir-root/my-service-api/main.py @@ -0,0 +1,10 @@ +from fastapi import FastAPI +app = FastAPI() + +@app.get("/health") +def health(): + return {"ok": True} + +@app.post("/users") +def create_user(): + return {"created": True} diff --git a/tests/fixtures/python-custom-subdir-root/my-service-api/models.py b/tests/fixtures/python-custom-subdir-root/my-service-api/models.py new file mode 100644 index 0000000..967cb20 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-root/my-service-api/models.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.orm import declarative_base, relationship + +Base = declarative_base() + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True) + email = Column(String, unique=True) + posts = relationship("Post") + +class Post(Base): + __tablename__ = "posts" + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey("users.id")) + user = relationship("User") diff --git a/tests/fixtures/python-custom-subdir-root/my-service-api/requirements.txt b/tests/fixtures/python-custom-subdir-root/my-service-api/requirements.txt new file mode 100644 index 0000000..c1040e6 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-root/my-service-api/requirements.txt @@ -0,0 +1,3 @@ +fastapi +sqlalchemy +uvicorn diff --git a/tests/fixtures/python-custom-subdir-root/package.json b/tests/fixtures/python-custom-subdir-root/package.json new file mode 100644 index 0000000..c8cacbf --- /dev/null +++ b/tests/fixtures/python-custom-subdir-root/package.json @@ -0,0 +1 @@ +{"name":"test","dependencies":{"react":"^18.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/python-custom-subdir-root/src/App.tsx b/tests/fixtures/python-custom-subdir-root/src/App.tsx new file mode 100644 index 0000000..02fb46a --- /dev/null +++ b/tests/fixtures/python-custom-subdir-root/src/App.tsx @@ -0,0 +1 @@ +export default function App() { return
web
; } \ No newline at end of file diff --git a/tests/fixtures/python-custom-subdir-workspaces/apps/web/package.json b/tests/fixtures/python-custom-subdir-workspaces/apps/web/package.json new file mode 100644 index 0000000..7224562 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-workspaces/apps/web/package.json @@ -0,0 +1 @@ +{"name":"@test/web","dependencies":{"react":"^18.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/python-custom-subdir-workspaces/apps/web/src/App.tsx b/tests/fixtures/python-custom-subdir-workspaces/apps/web/src/App.tsx new file mode 100644 index 0000000..02fb46a --- /dev/null +++ b/tests/fixtures/python-custom-subdir-workspaces/apps/web/src/App.tsx @@ -0,0 +1 @@ +export default function App() { return
web
; } \ No newline at end of file diff --git a/tests/fixtures/python-custom-subdir-workspaces/package.json b/tests/fixtures/python-custom-subdir-workspaces/package.json new file mode 100644 index 0000000..bad87f6 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-workspaces/package.json @@ -0,0 +1 @@ +{"name":"test","workspaces":["apps/*","services/*"]} \ No newline at end of file diff --git a/tests/fixtures/python-custom-subdir-workspaces/services/my-backend-service/main.py b/tests/fixtures/python-custom-subdir-workspaces/services/my-backend-service/main.py new file mode 100644 index 0000000..5ba599b --- /dev/null +++ b/tests/fixtures/python-custom-subdir-workspaces/services/my-backend-service/main.py @@ -0,0 +1,10 @@ +from fastapi import FastAPI +app = FastAPI() + +@app.get("/health") +def health(): + return {"ok": True} + +@app.post("/users") +def create_user(): + return {"created": True} diff --git a/tests/fixtures/python-custom-subdir-workspaces/services/my-backend-service/models.py b/tests/fixtures/python-custom-subdir-workspaces/services/my-backend-service/models.py new file mode 100644 index 0000000..967cb20 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-workspaces/services/my-backend-service/models.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.orm import declarative_base, relationship + +Base = declarative_base() + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True) + email = Column(String, unique=True) + posts = relationship("Post") + +class Post(Base): + __tablename__ = "posts" + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey("users.id")) + user = relationship("User") diff --git a/tests/fixtures/python-custom-subdir-workspaces/services/my-backend-service/requirements.txt b/tests/fixtures/python-custom-subdir-workspaces/services/my-backend-service/requirements.txt new file mode 100644 index 0000000..c1040e6 --- /dev/null +++ b/tests/fixtures/python-custom-subdir-workspaces/services/my-backend-service/requirements.txt @@ -0,0 +1,3 @@ +fastapi +sqlalchemy +uvicorn diff --git a/tests/fixtures/python-nested-container-backend/apps/web/package.json b/tests/fixtures/python-nested-container-backend/apps/web/package.json new file mode 100644 index 0000000..7224562 --- /dev/null +++ b/tests/fixtures/python-nested-container-backend/apps/web/package.json @@ -0,0 +1 @@ +{"name":"@test/web","dependencies":{"react":"^18.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/python-nested-container-backend/apps/web/src/App.tsx b/tests/fixtures/python-nested-container-backend/apps/web/src/App.tsx new file mode 100644 index 0000000..02fb46a --- /dev/null +++ b/tests/fixtures/python-nested-container-backend/apps/web/src/App.tsx @@ -0,0 +1 @@ +export default function App() { return
web
; } \ No newline at end of file diff --git a/tests/fixtures/python-nested-container-backend/container-dir/custom-python-backend/main.py b/tests/fixtures/python-nested-container-backend/container-dir/custom-python-backend/main.py new file mode 100644 index 0000000..5ba599b --- /dev/null +++ b/tests/fixtures/python-nested-container-backend/container-dir/custom-python-backend/main.py @@ -0,0 +1,10 @@ +from fastapi import FastAPI +app = FastAPI() + +@app.get("/health") +def health(): + return {"ok": True} + +@app.post("/users") +def create_user(): + return {"created": True} diff --git a/tests/fixtures/python-nested-container-backend/container-dir/custom-python-backend/models.py b/tests/fixtures/python-nested-container-backend/container-dir/custom-python-backend/models.py new file mode 100644 index 0000000..967cb20 --- /dev/null +++ b/tests/fixtures/python-nested-container-backend/container-dir/custom-python-backend/models.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.orm import declarative_base, relationship + +Base = declarative_base() + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True) + email = Column(String, unique=True) + posts = relationship("Post") + +class Post(Base): + __tablename__ = "posts" + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey("users.id")) + user = relationship("User") diff --git a/tests/fixtures/python-nested-container-backend/container-dir/custom-python-backend/requirements.txt b/tests/fixtures/python-nested-container-backend/container-dir/custom-python-backend/requirements.txt new file mode 100644 index 0000000..c1040e6 --- /dev/null +++ b/tests/fixtures/python-nested-container-backend/container-dir/custom-python-backend/requirements.txt @@ -0,0 +1,3 @@ +fastapi +sqlalchemy +uvicorn diff --git a/tests/fixtures/python-nested-container-backend/package.json b/tests/fixtures/python-nested-container-backend/package.json new file mode 100644 index 0000000..1368a8b --- /dev/null +++ b/tests/fixtures/python-nested-container-backend/package.json @@ -0,0 +1 @@ +{"name":"test","workspaces":["apps/*"]} \ No newline at end of file diff --git a/tests/fixtures/repotype-meta/.gitmodules b/tests/fixtures/repotype-meta/.gitmodules new file mode 100644 index 0000000..10d3e3b --- /dev/null +++ b/tests/fixtures/repotype-meta/.gitmodules @@ -0,0 +1,6 @@ +[submodule "frontend-app"] + path = frontend-app + url = https://github.com/org/frontend-app +[submodule "backend-api"] + path = backend-api + url = https://github.com/org/backend-api diff --git a/tests/fixtures/repotype-meta/backend-api/package.json b/tests/fixtures/repotype-meta/backend-api/package.json new file mode 100644 index 0000000..d6d2499 --- /dev/null +++ b/tests/fixtures/repotype-meta/backend-api/package.json @@ -0,0 +1 @@ +{"name":"backend-api","dependencies":{"express":"^4.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/repotype-meta/frontend-app/package.json b/tests/fixtures/repotype-meta/frontend-app/package.json new file mode 100644 index 0000000..6002687 --- /dev/null +++ b/tests/fixtures/repotype-meta/frontend-app/package.json @@ -0,0 +1 @@ +{"name":"frontend-app","dependencies":{"react":"^18.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/repotype-microservices-docker/auth/Dockerfile b/tests/fixtures/repotype-microservices-docker/auth/Dockerfile new file mode 100644 index 0000000..feea8df --- /dev/null +++ b/tests/fixtures/repotype-microservices-docker/auth/Dockerfile @@ -0,0 +1,2 @@ +FROM node:20 +CMD ["node", "index.js"] \ No newline at end of file diff --git a/tests/fixtures/repotype-microservices-docker/auth/package.json b/tests/fixtures/repotype-microservices-docker/auth/package.json new file mode 100644 index 0000000..af9fa60 --- /dev/null +++ b/tests/fixtures/repotype-microservices-docker/auth/package.json @@ -0,0 +1 @@ +{"name":"auth-service","dependencies":{"express":"^4.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/repotype-microservices-docker/payments/Dockerfile b/tests/fixtures/repotype-microservices-docker/payments/Dockerfile new file mode 100644 index 0000000..feea8df --- /dev/null +++ b/tests/fixtures/repotype-microservices-docker/payments/Dockerfile @@ -0,0 +1,2 @@ +FROM node:20 +CMD ["node", "index.js"] \ No newline at end of file diff --git a/tests/fixtures/repotype-microservices-docker/payments/package.json b/tests/fixtures/repotype-microservices-docker/payments/package.json new file mode 100644 index 0000000..eb105ff --- /dev/null +++ b/tests/fixtures/repotype-microservices-docker/payments/package.json @@ -0,0 +1 @@ +{"name":"payments-service","dependencies":{"fastify":"^4.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/repotype-microservices-k8s/api/package.json b/tests/fixtures/repotype-microservices-k8s/api/package.json new file mode 100644 index 0000000..c999106 --- /dev/null +++ b/tests/fixtures/repotype-microservices-k8s/api/package.json @@ -0,0 +1 @@ +{"name":"api","dependencies":{"hono":"^4.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/repotype-microservices-k8s/k8s/deployment.yaml b/tests/fixtures/repotype-microservices-k8s/k8s/deployment.yaml new file mode 100644 index 0000000..6bdc27b --- /dev/null +++ b/tests/fixtures/repotype-microservices-k8s/k8s/deployment.yaml @@ -0,0 +1,2 @@ +apiVersion: apps/v1 +kind: Deployment \ No newline at end of file diff --git a/tests/fixtures/repotype-microservices-k8s/worker/package.json b/tests/fixtures/repotype-microservices-k8s/worker/package.json new file mode 100644 index 0000000..9a1a659 --- /dev/null +++ b/tests/fixtures/repotype-microservices-k8s/worker/package.json @@ -0,0 +1 @@ +{"name":"worker","dependencies":{"bullmq":"^5.0.0"}} \ No newline at end of file diff --git a/tests/fixtures/repotype-single/package.json b/tests/fixtures/repotype-single/package.json new file mode 100644 index 0000000..7ad15fb --- /dev/null +++ b/tests/fixtures/repotype-single/package.json @@ -0,0 +1 @@ +{"name":"my-app","dependencies":{"express":"^4.0.0"}} \ No newline at end of file