docs(repo): plugin layout and release tagging

This commit is contained in:
Ben Allfree committed 2026-10-06 22:25:02 -07:00
1 parent 5309a3a9c3
commit 1f7ded8f3f
4 files changed
+78 -31

No files matched your search

+5 -5
View File
@@ -1,18 +1,18 @@
---
description: Monorepo conventional commit message format
description: Conventional commit message format for the LoBBS plugin repo
alwaysApply: true
---
# Commit Message Convention
Use monorepo-style conventional commit messages for all git commits.
Use conventional commit messages for all git commits.
## Format
`type(scope): subject`
- `type` is a conventional commit type like `feat`, `fix`, `chore`, `docs`, `refactor`, or `test`.
- `scope` should identify the monorepo package or area (for example `lobbs`, `meshtastic`, `meshcore`, `repo`).
- `scope` should identify the plugin area (for example `core`, `apps`, `lodb`, `lofs`, `meshtastic`, `meshcore`, `repo`). `meshtastic` and `meshcore` mean the platform providers under `platforms/`.
- `subject` must be concise, imperative, and lowercase when possible.
## Limits
@@ -21,5 +21,5 @@ Use monorepo-style conventional commit messages for all git commits.
## Examples
- `feat(lobbs): add meshcore platform provider`
- `chore(meshcore): bump pin`
- `feat(meshcore): add chat mesh platform provider`
- `fix(lodb): flush index on record delete`
+8 -7
View File
@@ -11,20 +11,21 @@ Cross-platform, on-firmware BBS for **Meshtastic** and **MeshCore**. Greenfield:
**Plugin owns everything, forks stay upstream.**
1. **Plugin** (`lobbs/`, PlatformIO library): core, apps, LoScalar, LoDB, LoFS, protocol, and the platform providers under `lobbs/platforms/<platform>/`. On MeshCore the plugin also owns the firmware app (`setup()`/`loop()`).
2. **Firmware forks** ([`meshtastic/`](meshtastic/), [`meshcore/`](meshcore/) submodules, both on `lobbs`): upstream plus one new `variants/lobbs/*.ini` that defines the `*_lobbs` envs and pulls in the plugin.
1. **Plugin** (this repo, PlatformIO library): core, apps, LoScalar, LoDB, LoFS, protocol, and the platform providers under `platforms/<platform>/`. On MeshCore the plugin also owns the firmware app (`setup()`/`loop()`).
2. **Firmware forks** (`../lobbs-meshtastic-firmware`, `../lobbs-meshcore-firmware`, both on `lobbs`): upstream plus one new `variants/lobbs/` folder that defines the `*_lobbs` envs and pins the plugin in `lib_deps`.
Until extraction finishes, LoBBS code still lives in-tree at `meshtastic/src/modules/LoBBS/`.
The repos are siblings under `/Volumes/Code/repos/meshenvy/`. No submodules anywhere: PlatformIO clones git deps with `--recursive`, and MeshForge builds a fork repo alone.
Until extraction finishes, LoBBS code still lives in-tree at `../lobbs-meshtastic-firmware/src/modules/LoBBS/`.
## Fork diff policy
- Allowed: one new `variants/lobbs/` ini per fork.
- Allowed: one new `variants/lobbs/` folder per fork (ini, `.gitignore` for the local override, README pointer).
- No edits to upstream files. If an extension point is missing, make the smallest possible change, list it in [`README.md`](README.md), and open an upstream PR.
## Workflow
## Pins and releases
- Work inside the submodules; commit and push there, then commit the pin bump here.
- Keep both submodules on `lobbs` (`.gitmodules` `branch = lobbs`).
Local dev uses a gitignored `symlink://../lobbs` override. Committed fork config only ever pins a plugin commit. Tagging and pin procedure: [`release.mdc`](release.mdc).
## Style
+46
View File
@@ -0,0 +1,46 @@
---
description: LoBBS plugin pins, local symlink dev, and release tagging across the plugin and both firmware forks
alwaysApply: true
---
# Pins and releases
Three sibling repos: `lobbs` (plugin), `lobbs-meshtastic-firmware`, `lobbs-meshcore-firmware`. Each fork's `variants/lobbs/` config pulls the plugin through `lib_deps`.
## Local dev: symlink, never committed
Point a fork at the working copy with a gitignored override:
| Fork | Override file | Content |
| --- | --- | --- |
| MeshCore | `platformio.local.ini` (already gitignored, already in `extra_configs`) | `lib_deps` with `lobbs=symlink://../lobbs` |
| Meshtastic | `variants/lobbs/local.ini` (gitignored by `variants/lobbs/.gitignore`, picked up by the `variants/*/*.ini` glob) | same |
- `symlink://` never appears in a committed file. A pushed symlink breaks MeshForge and CI, because the path only exists locally.
- Before pushing a fork, `git grep -n 'symlink://' -- variants/lobbs` must return nothing.
## Committed pin
```ini
lobbs=https://github.com/MeshEnvy/lobbs.git#<full 40-char plugin commit sha>
```
Pin by commit, not branch. A commit pin is immutable, and PlatformIO fetches it without a recursive clone.
## Tags
| Repo | Format | Example |
| --- | --- | --- |
| `lobbs` | `vX.Y.Z` | `v2.1.0` |
| `lobbs-meshtastic-firmware` | `lobbs-vX.Y.Z.<lobbs sha7>-meshtastic-v<upstream version>.<upstream sha7>` | `lobbs-v2.1.0.abc1234-meshtastic-v2.7.15.567b8ea` |
| `lobbs-meshcore-firmware` | `lobbs-vX.Y.Z.<lobbs sha7>-meshcore-v<upstream version>.<upstream sha7>` | `lobbs-v2.1.0.abc1234-meshcore-v1.9.1.def5678` |
- `<lobbs sha7>` is the plugin commit the fork pins (the `vX.Y.Z` tag's commit).
- `<upstream version>.<upstream sha7>` is the upstream release and commit the fork's `lobbs` branch is based on (`git merge-base lobbs upstream/<branch>`).
- Annotated tags only (`git tag -a`).
## Release procedure
1. Plugin: update `CHANGELOG.md`, commit, `git tag -a vX.Y.Z`, push the tag.
2. Each fork: set the committed `lib_deps` pin to the `vX.Y.Z` commit sha. Confirm no `symlink://` is committed. Build the `*_lobbs` envs from a clean clone.
3. Commit the pin bump, tag with the fork format above, push branch and tag.
+19 -19
View File
@@ -1,36 +1,36 @@
# LoBBS
On-firmware bulletin board for **Meshtastic** and **MeshCore**. This umbrella repo holds the firmware forks as submodules. The portable LoBBS plugin (core, apps, storage, and both platform providers) will live in `lobbs/` once it is extracted from the Meshtastic fork.
On-firmware bulletin board for **Meshtastic** and **MeshCore**. This repo is the portable LoBBS plugin, a PlatformIO library: core, apps, storage, and both platform providers. It is being extracted from the Meshtastic fork.
## Submodules
## Firmware forks
| Path | Repo | Branch |
| --- | --- | --- |
| [`meshtastic/`](meshtastic/) | [MeshEnvy/lobbs-meshtastic-firmware](https://github.com/MeshEnvy/lobbs-meshtastic-firmware) | `lobbs` |
| [`meshcore/`](meshcore/) | [MeshEnvy/lobbs-meshcore-firmware](https://github.com/MeshEnvy/lobbs-meshcore-firmware) | `lobbs` |
| Repo | Branch |
| --- | --- |
| [MeshEnvy/lobbs-meshtastic-firmware](https://github.com/MeshEnvy/lobbs-meshtastic-firmware) | `lobbs` |
| [MeshEnvy/lobbs-meshcore-firmware](https://github.com/MeshEnvy/lobbs-meshcore-firmware) | `lobbs` |
## Setup
Each fork builds standalone. Its `variants/lobbs/` config pins this plugin by commit in `lib_deps`, so cloning one fork is enough to build it.
## Local development
Clone the plugin and the forks side by side:
```bash
git clone --recurse-submodules git@github.com:MeshEnvy/lobbs.git
# or, in an existing clone:
git submodule update --init --recursive
git clone git@github.com:MeshEnvy/lobbs.git
git clone -b lobbs git@github.com:MeshEnvy/lobbs-meshtastic-firmware.git
git clone -b lobbs git@github.com:MeshEnvy/lobbs-meshcore-firmware.git
```
## Workflow
Point a fork at your working copy with a gitignored override that sets `lib_deps` to `symlink://../lobbs`. Committed config always carries the real pin. Details: [`.cursor/rules/release.mdc`](.cursor/rules/release.mdc).
Work inside the submodules. Commit and push there, then commit the pin bump here.
## Releases
```bash
cd meshtastic && git checkout lobbs && git pull --ff-only
# edit, build, commit, push in the submodule
cd .. && git add meshtastic && git commit -m "chore(meshtastic): bump pin"
```
The plugin is tagged `vX.Y.Z`. Each fork release is tagged `lobbs-vX.Y.Z.<lobbs sha7>-<platform>-v<upstream version>.<upstream sha7>`, for example `lobbs-v2.1.0.abc1234-meshtastic-v2.7.15.567b8ea`. Full procedure: [`.cursor/rules/release.mdc`](.cursor/rules/release.mdc).
## Fork diff policy
The forks stay upstream plus one new config file: `variants/lobbs/*.ini`, which defines the `*_lobbs` build envs and pulls in the plugin. No edits to upstream files. If an extension point is missing, the fix is the smallest possible change, listed here and paired with an upstream PR.
The forks stay upstream plus one new folder: `variants/lobbs/`, which defines the `*_lobbs` build envs and pulls in the plugin. No edits to upstream files. If an extension point is missing, the fix is the smallest possible change, listed here and paired with an upstream PR.
Until extraction finishes, LoBBS code still lives in-tree at `meshtastic/src/modules/LoBBS/`.
Until extraction finishes, LoBBS code still lives in-tree at `lobbs-meshtastic-firmware/src/modules/LoBBS/`.
Architecture and greenfield rules: [`.cursor/rules/lobbs-project.mdc`](.cursor/rules/lobbs-project.mdc).