chore: reorganize into polyglot monorepo (workshop)
- Move bigmind/ -> mcp/bigmind/ - Move webscraper/ -> mcp/webscraper/ - Move mss-failsafe/ -> java/mss-failsafe/ - Move Wellmann-Shop/ -> java/wellmann-shop/ (normalize to kebab-case) - Add .roo/ IDE config files to tracking - Add plans/REPO_STRATEGY.md (monorepo strategy document) - Expand .gitignore: Java/Maven, Node/TS, coverage, uv.lock - Rewrite README.md as navigation index - Update .roo/mcp.json webscraper path to mcp/webscraper/
This commit is contained in:
@@ -0,0 +1,304 @@
|
||||
# Monorepo Strategy — Patrick's Homelab Workshop
|
||||
|
||||
*Written: 2026-04-04 | Authors: Patrick + Lumen*
|
||||
|
||||
---
|
||||
|
||||
## 1. Why This Document Exists
|
||||
|
||||
The repo started as `pi_mcps` — a home for Python MCP servers. Then two older Java web projects arrived: `mss-failsafe` and `Wellmann-Shop`. This is not an accident — it's the beginning of a pattern: a single place to keep all of Patrick's personal engineering work, regardless of language.
|
||||
|
||||
This document defines the strategy for the repo so that both of us — human and AI — can navigate it without confusion now and in two years from now.
|
||||
|
||||
---
|
||||
|
||||
## 2. Philosophy: Polyglot Monorepo, Not a Dump
|
||||
|
||||
A **monorepo is not code colocation**. The key principle from [monorepo.tools](https://monorepo.tools/): projects must have **well-defined relationships** and **clear boundaries**. What we are building is closer to a *workshop* — a curated collection of distinct tools and projects under one roof, organized by language/purpose, each independently buildable and deployable.
|
||||
|
||||
**We are NOT:**
|
||||
- Sharing dependencies across Java and Python (they live in entirely separate ecosystems)
|
||||
- Using a monorepo build tool like Nx or Turborepo (overkill for a personal homelab)
|
||||
- Creating a monolith (each project is independently deployable)
|
||||
|
||||
**We ARE:**
|
||||
- Keeping one git history (single place to look for all changes)
|
||||
- Using a clear directory taxonomy to signal *what kind of thing* each project is
|
||||
- Making it easy for an AI (Lumen) or a new contributor to orient quickly
|
||||
- Preventing repo sprawl — one Gitea repo instead of a dozen
|
||||
|
||||
---
|
||||
|
||||
## 3. Repo Rename: `pi_mcps` → `workshop`
|
||||
|
||||
The name `pi_mcps` no longer describes what the repo contains. It was named for Raspberry Pi MCP servers — neither of which is accurate anymore (Fedora homelab, not Pi; more than just MCP servers).
|
||||
|
||||
**Proposed new name:** `workshop`
|
||||
|
||||
Why `workshop`?
|
||||
- Neutral, language-agnostic
|
||||
- Conveys personal creative output (not corporate, not framework-specific)
|
||||
- Short, memorable
|
||||
- Maps well to `http://192.168.188.119:30008/pplate/workshop`
|
||||
|
||||
**Action required:**
|
||||
1. Rename the Gitea repo at `http://192.168.188.119:30008/pplate/pi_mcps` → `workshop`
|
||||
2. Update the local remote: `git remote set-url origin http://192.168.188.119:30008/pplate/workshop.git`
|
||||
3. The local folder on disk can stay as `~/pi_mcps/` or be renamed to `~/workshop/` — Patrick's choice. The folder name and repo name do not need to match.
|
||||
|
||||
---
|
||||
|
||||
## 4. Directory Taxonomy
|
||||
|
||||
Every directory at the repo root belongs to one of three categories:
|
||||
|
||||
| Category | Directory | Purpose |
|
||||
|---|---|---|
|
||||
| Language group | `mcp/` | Python MCP servers — FastMCP, uv, pytest |
|
||||
| Language group | `java/` | Java web projects — Maven, Jakarta EE |
|
||||
| Tooling/Config | `.roo/` | IDE config, Roo mode rules, MCP wiring |
|
||||
| Tooling/Config | `plans/` | Architecture plans, assessments, strategy docs |
|
||||
| Root files | `README.md`, `.gitignore` | Navigation index + polyglot ignores |
|
||||
|
||||
**Future language groups (when they arrive):**
|
||||
|
||||
| Directory | Purpose |
|
||||
|---|---|
|
||||
| `ts/` | TypeScript MCP servers or web frontends |
|
||||
| `go/` | Go utilities or services |
|
||||
| `scripts/` | Shell/Python one-off automation |
|
||||
|
||||
### 4.1 Full Target Structure
|
||||
|
||||
```
|
||||
workshop/
|
||||
├── mcp/ # Python MCP servers
|
||||
│ ├── bigmind/ # BigMind persistent memory server
|
||||
│ │ ├── src/server.py
|
||||
│ │ ├── bigmind/ # library code
|
||||
│ │ ├── tests/
|
||||
│ │ ├── pyproject.toml
|
||||
│ │ └── run.sh
|
||||
│ └── webscraper/ # Web scraping MCP server
|
||||
│ ├── src/server.py
|
||||
│ ├── tests/
|
||||
│ ├── pyproject.toml
|
||||
│ └── run.sh
|
||||
│
|
||||
├── java/ # Java web projects
|
||||
│ ├── mss-failsafe/ # MSS Failsafe (Java EE multi-module, WildFly)
|
||||
│ │ ├── mssfailsafeWeblayer/
|
||||
│ │ ├── userManagement/
|
||||
│ │ └── pom.xml
|
||||
│ └── wellmann-shop/ # Wellmann Shop (JSF/PrimeFaces, Java 8, MySQL)
|
||||
│ ├── src/
|
||||
│ └── pom.xml
|
||||
│
|
||||
├── plans/ # Architecture plans and strategy docs
|
||||
│ └── REPO_STRATEGY.md # this file
|
||||
│
|
||||
├── .roo/ # Roo Code IDE configuration
|
||||
│ ├── mcp.json # MCP server wiring (paths updated post-move)
|
||||
│ └── rules-*/ # Per-mode Roo rules
|
||||
│
|
||||
├── .gitignore # Polyglot: Python + Java + Node + OS
|
||||
└── README.md # Navigation index (the front door)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Naming Conventions
|
||||
|
||||
Consistency matters — both for humans and for AI tools reading directory listings.
|
||||
|
||||
| Rule | Convention | Rationale |
|
||||
|---|---|---|
|
||||
| Directory names | `kebab-case` | Unix-friendly, consistent across all languages |
|
||||
| Java project dirs | `kebab-case` matching Maven `artifactId` | No surprise mapping needed |
|
||||
| Python package dirs | `kebab-case` at group level, `snake_case` inside for Python modules | PEP 8 inside, Unix outside |
|
||||
| Plan files | `UPPER_SNAKE.md` in `plans/` | Stands out from code files |
|
||||
| README per project | Required | Each project is independently comprehensible |
|
||||
|
||||
**Normalization needed:**
|
||||
- `Wellmann-Shop/` → `java/wellmann-shop/` (lowercase the W, move under `java/`)
|
||||
- `mss-failsafe/` → `java/mss-failsafe/` (already correct name, just needs moving)
|
||||
- `bigmind/` → `mcp/bigmind/`
|
||||
- `webscraper/` → `mcp/webscraper/`
|
||||
|
||||
---
|
||||
|
||||
## 6. Language-Specific Rules
|
||||
|
||||
### 6.1 Python (mcp/)
|
||||
|
||||
- Package manager: **uv** (already standardized)
|
||||
- Framework: **FastMCP** for all MCP servers
|
||||
- Testing: **pytest** with `pytest-mock` and `pytest-cov`
|
||||
- Each server is an **independent Python package** with its own `pyproject.toml` and `.venv`
|
||||
- No shared `requirements.txt` at root — dependency isolation is a feature
|
||||
- Run pattern: `cd mcp/bigmind && ./run.sh`
|
||||
|
||||
### 6.2 Java (java/)
|
||||
|
||||
- Build tool: **Maven** (both existing projects use it)
|
||||
- Java version: Currently Java 8 (Wellmann-Shop) and unspecified (mss-failsafe — legacy NetBeans project)
|
||||
- **Future Java projects should target Java 21+** (current LTS)
|
||||
- Each project has its own `pom.xml` — no shared parent POM at root (cross-language root POMs are an antipattern)
|
||||
- Target servers: WildFly / Payara / GlassFish (Jakarta EE)
|
||||
- No shared Maven `settings.xml` needed — use standard `~/.m2/settings.xml`
|
||||
|
||||
### 6.3 Future: TypeScript (ts/)
|
||||
|
||||
- Package manager: **npm** or **pnpm**
|
||||
- Framework: **FastMCP** (TypeScript flavor) for MCP servers
|
||||
- Each project has its own `package.json`
|
||||
|
||||
---
|
||||
|
||||
## 7. .gitignore Strategy
|
||||
|
||||
The root `.gitignore` must cover all languages in the repo. Currently it only covers Python. After the reorganization, it must also cover:
|
||||
|
||||
**To add:**
|
||||
```gitignore
|
||||
# Java / Maven
|
||||
target/
|
||||
*.class
|
||||
*.war
|
||||
*.jar
|
||||
*.ear
|
||||
*.nar
|
||||
.classpath
|
||||
.project
|
||||
.settings/
|
||||
nb-configuration.xml
|
||||
nbactions.xml
|
||||
*.iml
|
||||
|
||||
# Node / TypeScript (future)
|
||||
node_modules/
|
||||
dist/
|
||||
*.js.map
|
||||
package-lock.json
|
||||
|
||||
# Test coverage
|
||||
.coverage
|
||||
coverage.xml
|
||||
htmlcov/
|
||||
```
|
||||
|
||||
**Note:** `nb-configuration.xml` is NetBeans IDE config — already present in `mss-failsafe/` and `Wellmann-Shop/`. It should be in `.gitignore` for new projects but is intentionally tracked here since it carries build configuration for legacy projects.
|
||||
|
||||
---
|
||||
|
||||
## 8. IDE Wiring: `.roo/mcp.json` After Move
|
||||
|
||||
The webscraper path in `.roo/mcp.json` currently points to `/home/pplate/pi_mcps/webscraper`. After moving to `mcp/webscraper/`, it must be updated:
|
||||
|
||||
**Before:**
|
||||
```json
|
||||
"webscraper": {
|
||||
"args": ["run", "--directory", "/home/pplate/pi_mcps/webscraper", "src/server.py"]
|
||||
}
|
||||
```
|
||||
|
||||
**After:**
|
||||
```json
|
||||
"webscraper": {
|
||||
"args": ["run", "--directory", "/home/pplate/pi_mcps/mcp/webscraper", "src/server.py"]
|
||||
}
|
||||
```
|
||||
|
||||
*(If the local folder is also renamed to `workshop/`, the path changes to `/home/pplate/workshop/mcp/webscraper`)*
|
||||
|
||||
The same applies to any external MCP configs (e.g., IntelliJ/PyCharm `mcp.json` files stored outside this repo).
|
||||
|
||||
---
|
||||
|
||||
## 9. README.md — The Front Door
|
||||
|
||||
The root `README.md` should function as a **navigation index**, not a tutorial. Readers (Patrick, Lumen, future contributors) should land there and know exactly where to go within 10 seconds.
|
||||
|
||||
**Structure:**
|
||||
```
|
||||
# Workshop — Patrick Plate's Homelab Monorepo
|
||||
|
||||
## What's Here
|
||||
[table: project name | language | description | status]
|
||||
|
||||
## MCP Servers (mcp/)
|
||||
[short list with links]
|
||||
|
||||
## Java Projects (java/)
|
||||
[short list with links]
|
||||
|
||||
## Plans & Architecture
|
||||
[link to plans/]
|
||||
|
||||
## Gitea
|
||||
[link to homelab Gitea]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 10. Migration Plan (Ordered Steps)
|
||||
|
||||
```
|
||||
Step 1: Rename Gitea repo pi_mcps → workshop (Gitea UI)
|
||||
Step 2: Update local git remote URL
|
||||
Step 3: Move mcp/bigmind ← bigmind/
|
||||
Step 4: Move mcp/webscraper ← webscraper/
|
||||
Step 5: Move java/mss-failsafe ← mss-failsafe/
|
||||
Step 6: Move java/wellmann-shop ← Wellmann-Shop/ (normalize name)
|
||||
Step 7: Update .roo/mcp.json webscraper path
|
||||
Step 8: Update any external MCP configs pointing to old paths
|
||||
Step 9: Expand .gitignore with Java + Node patterns
|
||||
Step 10: Rewrite root README.md as navigation index
|
||||
Step 11: git add -A && git commit -m "chore: reorganize into polyglot monorepo structure"
|
||||
Step 12: git push origin master
|
||||
```
|
||||
|
||||
**Important:** Git tracks renames as move+add. Using `git mv` preserves file history. Use it for each moved file/directory.
|
||||
|
||||
---
|
||||
|
||||
## 11. What We Are NOT Doing
|
||||
|
||||
It's worth being explicit about choices we considered and rejected:
|
||||
|
||||
| Considered | Decision | Reason |
|
||||
|---|---|---|
|
||||
| Separate repo per project | Rejected | Polyrepo tax: fragmented history, harder for AI context |
|
||||
| Nx / Turborepo monorepo tools | Rejected | Overkill for personal homelab; adds tooling complexity without benefit |
|
||||
| Shared Maven parent POM at root | Rejected | Java-specific tooling at repo root would confuse Python tooling |
|
||||
| Keeping `pi_mcps` name | Reconsidered | The name no longer describes the content; `workshop` is future-proof |
|
||||
| `src/` at root with language subdirs | Rejected | Less clear at a glance than top-level `mcp/`, `java/` groupings |
|
||||
|
||||
---
|
||||
|
||||
## 12. Visual Overview
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
Root[workshop/] --> MCP[mcp/]
|
||||
Root --> Java[java/]
|
||||
Root --> Plans[plans/]
|
||||
Root --> Roo[.roo/]
|
||||
Root --> GI[.gitignore]
|
||||
Root --> RM[README.md]
|
||||
|
||||
MCP --> BM[bigmind/]
|
||||
MCP --> WS[webscraper/]
|
||||
MCP --> FutMCP[future MCP servers...]
|
||||
|
||||
Java --> MSS[mss-failsafe/]
|
||||
Java --> WSh[wellmann-shop/]
|
||||
Java --> FutJava[future Java projects...]
|
||||
|
||||
Plans --> STRAT[REPO_STRATEGY.md]
|
||||
Plans --> FutPlans[future plans...]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*This document is the living reference for how this repo is organized. Update it when structure changes.*
|
||||
Reference in New Issue
Block a user