Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Architecture

MeshChat is a PySide6 (Qt 6) desktop app that connects to **one** Meshtastic
OrcMesh is a PySide6 (Qt 6) desktop app that connects to **one** Meshtastic
radio at a time over USB/Serial, Bluetooth, or TCP. The radio does the actual
LoRa transmit/receive; MeshChat's job is to talk to it, keep a local record of
LoRa transmit/receive; OrcMesh's job is to talk to it, keep a local record of
everything it reports, and present that as a chat client plus a network
monitor.

Expand Down Expand Up @@ -213,15 +213,15 @@ test in isolation, and it should stay that way.

PyInstaller (`scripts/build.ps1`) builds a windowed (non-console) exe. Two
PySide6/QtWebEngine artifacts — `QtWebEngineProcess.exe` and `icudtl.dat` —
need a manual post-build copy into `dist/MeshChat/` since PyInstaller's
need a manual post-build copy into `dist/OrcMesh/` since PyInstaller's
default hooks don't always pick them up. Because the release build is
windowed, `app.py` installs a global excepthook so unhandled exceptions
produce a visible crash dialog instead of silently exiting — this is how
several real bugs in this project were first surfaced by user reports.

## Licensing constraint

MeshChat links the official `meshtastic` Python package, which is
OrcMesh links the official `meshtastic` Python package, which is
GPL-3.0-only. That makes GPL-3.0-only the only license this project can
legally ship under — this is a hard constraint on any future dependency
choice too, not just the project's own license.
34 changes: 17 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<div align="center">

# MeshChat for Windows
# OrcMesh

**A native Windows client and deep network monitor for [Meshtastic](https://meshtastic.org) mesh radios.**
**A native Windows operations console for [Meshtastic](https://meshtastic.org) LoRa mesh radios.**

Chat with your mesh, then actually *see* it — every node, every packet, every hop.
Map. Monitor. Message.

[![Release](https://img.shields.io/github/v/release/hardcoreerik/MeshChat-Windows?include_prereleases&color=00D4FF)](https://github.com/hardcoreerik/MeshChat-Windows/releases)
[![Release](https://img.shields.io/github/v/release/hardcoreerik/OrcMesh?include_prereleases&color=00D4FF)](https://github.com/hardcoreerik/OrcMesh/releases)
[![License](https://img.shields.io/badge/license-GPL--3.0-8B5CF6)](LICENSE)
[![Platform](https://img.shields.io/badge/platform-Windows%20x64-4F9EFF)](https://github.com/hardcoreerik/MeshChat-Windows/releases)
[![Platform](https://img.shields.io/badge/platform-Windows%20x64-4F9EFF)](https://github.com/hardcoreerik/OrcMesh/releases)
[![Python](https://img.shields.io/badge/python-3.12%2B-00FF88)](https://www.python.org/)

</div>
Expand All @@ -19,8 +19,8 @@ Chat with your mesh, then actually *see* it — every node, every packet, every

## What this is

MeshChat connects to **one** Meshtastic radio over USB, Bluetooth, or Wi-Fi.
The radio — not the PC — sends and receives the actual LoRa packets. MeshChat
OrcMesh connects to **one** Meshtastic radio over USB, Bluetooth, or Wi-Fi.
The radio — not the PC — sends and receives the actual LoRa packets. OrcMesh
gives you a chat client on top of it, plus a monitoring dashboard that surfaces
what the mesh is really doing: who's reachable, how many hops away, what's
relaying, and how the signal looks.
Expand Down Expand Up @@ -92,28 +92,28 @@ environment sensors when a node reports them.
Channel messaging across the radio's configured Meshtastic channels, direct
messages to any reachable node, and local message history that survives
restarts — Meshtastic radios don't store message history themselves, so
MeshChat keeps its own.
OrcMesh keeps its own.

### 📶 Spectrum *(optional — needs an RTL-SDR)*

A waterfall view of raw RF energy in the LoRa ISM bands. This shows *that*
activity is happening and where in the band — it does **not** decode LoRa
packets. Requires an RTL-SDR dongle plus `pyrtlsdr` and the native librtlsdr
driver; MeshChat runs normally without any of that.
driver; OrcMesh runs normally without any of that.

---

## Install

**Just want to run it?** Grab the latest build from
[Releases](https://github.com/hardcoreerik/MeshChat-Windows/releases), extract,
and run `MeshChat.exe`. No installer, no Python needed. Windows x64.
[Releases](https://github.com/hardcoreerik/OrcMesh/releases), extract,
and run `OrcMesh.exe`. No installer, no Python needed. Windows x64.

**From source** (Python 3.12+ x64):

```powershell
git clone https://github.com/hardcoreerik/MeshChat-Windows.git
cd MeshChat-Windows
git clone https://github.com/hardcoreerik/OrcMesh.git
cd OrcMesh
.\scripts\bootstrap.ps1
.\scripts\run-dev.ps1
```
Expand All @@ -125,7 +125,7 @@ cd MeshChat-Windows
| Transport | Notes |
|---|---|
| **USB / Serial** | Most reliable. Pick the COM port and hit Connect. |
| **Bluetooth** | Pair the radio in **Windows Settings first** — Meshtastic radios require OS-level pairing before any app can reach them. MeshChat detects this case and offers a shortcut to the Bluetooth settings page. |
| **Bluetooth** | Pair the radio in **Windows Settings first** — Meshtastic radios require OS-level pairing before any app can reach them. OrcMesh detects this case and offers a shortcut to the Bluetooth settings page. |
| **Wi-Fi / TCP** | Enter the radio's hostname or IP (default port 4403). |

---
Expand All @@ -134,11 +134,11 @@ cd MeshChat-Windows

```powershell
.\scripts\test.ps1 # run the test suite
.\scripts\build.ps1 # build dist\MeshChat\MeshChat.exe
.\scripts\build.ps1 # build dist\OrcMesh\OrcMesh.exe
.\scripts\run-dev.ps1 -Debug # verbose logging
```

Logs are written to `%LOCALAPPDATA%\MeshChat\Logs\`.
For upgrade compatibility, logs remain under `%LOCALAPPDATA%\MeshChat\Logs\`.

**Architecture** — PySide6 (Qt 6) desktop app. All blocking Meshtastic I/O runs
on a dedicated `QThread`; the radio library's PubSub callbacks are marshalled
Expand Down Expand Up @@ -168,7 +168,7 @@ issues are welcome.

GPL-3.0-only — see [LICENSE](LICENSE).

MeshChat links the official Meshtastic Python package, which is GPL-3.0
OrcMesh links the official Meshtastic Python package, which is GPL-3.0
copyleft, so this project is licensed to match. Full dependency licensing is in
[THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md).

Expand Down
2 changes: 1 addition & 1 deletion THIRD_PARTY_LICENSES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Third Party Licenses

MeshChat for Windows is licensed **GPL-3.0-only** — see [LICENSE](LICENSE).
OrcMesh is licensed **GPL-3.0-only** — see [LICENSE](LICENSE).
It is licensed this way because it links the official Meshtastic Python
package, which is GPL-3.0-only copyleft.

Expand Down
22 changes: 11 additions & 11 deletions docs/mcoreimg-integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Status: **exploratory — no implementation started.** This document captures the
research and open decisions from an initial discussion about bringing
[MCoreIMG](https://github.com/Aaron-KE9ETA/MCoreIMG) (a compact vector-image
transport protocol built for MeshCore) into MeshChat.
transport protocol built for MeshCore) into OrcMesh.

---

Expand Down Expand Up @@ -56,12 +56,12 @@ MIT. No legal obstacle to forking or vendoring any part of it.

MCoreIMG's framing constants are tuned to MeshCore's transport:

| | MeshCore (MCoreIMG's target) | Meshtastic (MeshChat's target) |
| | MeshCore (MCoreIMG's target) | Meshtastic (OrcMesh's target) |
|---|---|---|
| Message size limit | 150 characters | 200 **bytes** (UTF-8; MeshChat already enforces this in the composer) |
| Message size limit | 150 characters | 200 **bytes** (UTF-8; OrcMesh already enforces this in the composer) |
| Frame header | 15 chars, MeshCore-specific | would need a Meshtastic-specific design |
| Per-frame integrity | CRC-16 | reusable as-is |
| Message addressing | MeshCore's own | Meshtastic channel index / direct-message node ID (MeshChat already models both — see `ChatMessage.destination_num`) |
| Message addressing | MeshCore's own | Meshtastic channel index / direct-message node ID (OrcMesh already models both — see `ChatMessage.destination_num`) |

The **framing layer is the MeshCore-specific part** and can't be reused
directly — the byte budget, header format, and message-count math would all
Expand All @@ -76,7 +76,7 @@ the bytes.

**Bottom line:** this is a vendor-and-adapt situation, not a drop-in dependency.
The reusable core is real and substantial; the framing/transport layer and all
of the MeshChat-side UI would be new work.
of the OrcMesh-side UI would be new work.

---

Expand All @@ -92,7 +92,7 @@ reason they feel like "more than the file size" is that the reader is a
black/white cells is a much denser *visual* channel than, say, a 1D barcode,
for that specific transport method (printed ink, camera sensor).

That trick doesn't apply here. MeshChat has no optical scan step — the
That trick doesn't apply here. OrcMesh has no optical scan step — the
Meshtastic text messages *are* the data channel directly, with no image
representation in between. Drawing our compressed bitstream as a QR-style
raster pattern wouldn't add capacity; MCoreIMG's existing Base91 text encoding
Expand Down Expand Up @@ -137,8 +137,8 @@ exists to make them explicit, not to answer them unilaterally.

| Option | Tradeoff |
|---|---|
| **Vendor a one-time copy** | Copy `model` + `compression` into MeshChat, adapt freely for our framing. No dependency on Aaron's repo staying maintained or stable. Loses future upstream compression improvements automatically. |
| **Real fork, track upstream** | Can pull in future protocol/compression improvements. More coordination overhead once MeshChat's framing diverges from MeshCore's — merges get harder the more the two projects' transport layers differ. |
| **Vendor a one-time copy** | Copy `model` + `compression` into OrcMesh, adapt freely for our framing. No dependency on Aaron's repo staying maintained or stable. Loses future upstream compression improvements automatically. |
| **Real fork, track upstream** | Can pull in future protocol/compression improvements. More coordination overhead once OrcMesh's framing diverges from MeshCore's — merges get harder the more the two projects' transport layers differ. |

Given the framing layer *must* diverge regardless (Meshtastic's byte budget is
different from MeshCore's), a real fork mostly buys future improvements to the
Expand All @@ -158,21 +158,21 @@ Not a commitment, just what the work would concretely involve, to size it:
bytes/message instead of 150 chars, reusing CRC-16 per-frame + CRC-32
stream-level integrity. Needs a message-count strategy (fixed N like
MCoreIMG's "10", or variable based on content).
3. **New message kind in MeshChat's chat model.** `ChatMessage` currently
3. **New message kind in OrcMesh's chat model.** `ChatMessage` currently
models plain text; an image transfer needs to be recognizable as
"part of image transfer #X, frame N/M" so it doesn't render as garbled
text in the chat bubble, and so out-of-order/partial arrivals can be
buffered correctly (Meshtastic doesn't guarantee delivery order).
4. **Compose UI.** Import/select an SVG (or a simple drawing tool) in
`ChatView`, live message-count budget as the user composes — mirroring
MCoreIMG's Constructor GUI feedback loop, adapted to MeshChat's theme
MCoreIMG's Constructor GUI feedback loop, adapted to OrcMesh's theme
and widget set.
5. **Receive UI.** Detect an in-progress transfer, show a progress
indicator across incoming frames, decode with the vendored Reconstructor
logic once complete, render inline in the chat bubble (not a separate
window).
6. **Decide fork vs. vendor** (see above) before step 1, since it affects
how the vendored files are organized in the MeshChat tree.
how the vendored files are organized in the OrcMesh tree.

Sizing note: the codec port (step 1–2) is moderate, well-scoped work given the
existing clean module boundaries. The UI (steps 3–5) is the larger piece —
Expand Down
22 changes: 11 additions & 11 deletions packaging/installer.iss
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
; MeshChat for Windows — Inno Setup installer script.
; OrcMesh — Inno Setup installer script.
;
; Build with (after scripts\build.ps1 has produced dist\MeshChat\):
; Build with (after scripts\build.ps1 has produced dist\OrcMesh\):
; & "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" packaging\installer.iss
; (or wherever ISCC.exe landed for your Inno Setup install — winget installs
; per-user by default, not to Program Files.)
;
; Produces dist\MeshChat-Setup-<version>.exe: a single installer with a
; Produces dist\OrcMesh-Setup-<version>.exe: a single installer with a
; Start Menu shortcut, optional desktop icon, and a standard uninstaller
; registered in Windows' "Apps & features". No code signing — MeshChat
; registered in Windows' "Apps & features". No code signing — OrcMesh
; isn't signed yet (see ROADMAP.md), so Windows SmartScreen will show an
; "unrecognized publisher" warning on first run until it builds up
; enough download reputation.
Expand All @@ -17,11 +17,11 @@
; (pyproject.toml drives what gets baked into the exe via
; importlib.metadata; this drives the installer filename/registry entry).

#define MyAppName "MeshChat"
#define MyAppVersion "0.1.1"
#define MyAppName "OrcMesh"
#define MyAppVersion "0.2.0"
#define MyAppPublisher "hardcoreerik"
#define MyAppURL "https://github.com/hardcoreerik/MeshChat-Windows"
#define MyAppExeName "MeshChat.exe"
#define MyAppURL "https://github.com/hardcoreerik/OrcMesh"
#define MyAppExeName "OrcMesh.exe"
Comment on lines +20 to +24

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'Repo files matching installer.iss:\n'
fd -a 'installer\.iss$' . || true

printf '\n.gitignore or uninstall-related mentions:\n'
rg -n "Delete|DeleteRegKey|RegDelete|Del |del |MeshChat|OrcMesh|AppId|Uninstall" -S . --glob '!node_modules' --glob '!dist' --glob '!build' --glob '!*.png' --glob '!*.jpg' | head -200

if [ -f packaging/installer.iss ]; then
  printf '\npackaging/installer.iss outline/size:\n'
  wc -l packaging/installer.iss
  sed -n '1,140p' packaging/installer.iss | nl -ba
fi

Repository: hardcoreerik/OrcMesh

Length of output: 17066


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf 'packaging/installer.iss contents:\n'
sed -n '1,120p' packaging/installer.iss || cat packaging/installer.iss

printf '\nRead-only verifier for Inno Setup uninstall/delete directives:\n'
python3 - <<'PY'
from pathlib import Path
text = Path('packaging/installer.iss').read_text()
for section in ['[Files]', '[Icons]', '[Run]', '[Registry]', '[UninstallDelete]', '[UninstallRun]']:
    print(f'{section}: ' + str(section.strip('[]') in text))
PY

Repository: hardcoreerik/OrcMesh

Length of output: 3513


🌐 Web query:

Inno Setup upgrade behavior AppId unchanged existing files old shortcuts not removed

💡 Result:

In Inno Setup, the AppId directive is the primary identifier used to maintain the relationship between installations [1][2]. When you keep the AppId the same across versions, Inno Setup treats the new installation as an upgrade to the existing one [1][2]. This behavior is intentional and generally correct for software updates [1][3]. Regarding your observations: 1. Existing Files: Inno Setup does not automatically remove files from a previous installation if they are not part of the new installer's file list [4][1]. It simply installs the new files over the old ones [3]. If you have files that were present in an older version but are no longer needed in the new version, they will remain in the installation directory [4][1]. To handle this, you should use the [InstallDelete] section to explicitly list any obsolete files that need to be removed during the upgrade process [4][1][5]. Avoid using wildcards in this section to prevent accidental deletion of user data or system files [6][3]. 2. Old Shortcuts: If shortcuts (icons) from an old version are not being updated or removed, verify that the [Icons] section entries in your new script match those of the old script. Inno Setup is designed to overwrite existing shortcuts if the name and location match. If you have renamed or removed an icon entry from the [Icons] section, it will not be automatically deleted from the user's system by the installer [6]. To remove old shortcuts that are no longer part of your application, you must include them in the [InstallDelete] section or, more commonly, handle their cleanup via custom Pascal scripting during the install process if necessary [6][5]. 3. Best Practices for Upgrades: - Always keep the AppId consistent across updates for the same application [1][2]. - Set DisableDirPage=auto and DisableProgramGroupPage=auto in the [Setup] section [1]. This ensures the installer defaults to the previous installation path and prevents confusion during upgrades [1]. - Do not attempt to uninstall the previous version before installing the new one; simply installing over the existing files is the standard, recommended approach for Inno Setup [1][3]. - If you find that files are persisting after uninstallation, ensure that the files were actually installed by the Inno Setup installer. Inno Setup's uninstaller only removes files that it tracked during the installation process [6]. If you have files created by the application at runtime (like logs or user data), these will not be removed by default [6]. If you ever intend for a new version to be installed side-by-side with an older one rather than upgrading it, you must change the AppId to a new, unique value for the new installer [7][8].

Citations:


Remove legacy MeshChat files and shortcuts during upgrades.

AppId is unchanged, so this installs over an existing MeshChat installation. Inno Setup does not remove obsolete files or shortcuts that are not part of the current installer script. Add InstallDelete entries for obsolete files such as MeshChat.exe, and clean up old shortcuts if the previous installation created them. Test an in-place upgrade from a previous MeshChat installation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packaging/installer.iss` around lines 20 - 24, Update the installer script to
remove legacy MeshChat artifacts during in-place upgrades by adding
InstallDelete entries for obsolete files such as MeshChat.exe and the old
installation shortcuts. Keep the existing AppId and current OrcMesh installation
entries unchanged, and cover shortcuts created by the previous MeshChat
installer.


[Setup]
AppId={{6E9C2C6D-6B7B-4F2E-9C2C-6D6B7B4F2E9C}
Expand All @@ -40,7 +40,7 @@ LicenseFile=..\LICENSE
PrivilegesRequired=lowest
PrivilegesRequiredOverridesAllowed=dialog
OutputDir=..\dist
OutputBaseFilename=MeshChat-Setup-{#MyAppVersion}
OutputBaseFilename=OrcMesh-Setup-{#MyAppVersion}
Compression=lzma2
SolidCompression=yes
WizardStyle=modern
Expand All @@ -58,7 +58,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
; Everything PyInstaller collected — the exe, its _internal/ dependency
; tree, and the QtWebEngineProcess.exe/icudtl.dat build.ps1 copies in
; alongside it.
Source: "..\dist\MeshChat\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "..\dist\OrcMesh\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Expand All @@ -69,7 +69,7 @@ Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: de
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

[UninstallDelete]
; MeshChat writes logs/settings under %LOCALAPPDATA%\MeshChat (see
; OrcMesh retains its pre-rebrand data under %LOCALAPPDATA%\MeshChat (see
; platformdirs usage in app.py) — deliberately NOT removed here. An
; uninstall shouldn't silently delete a user's chat history/node
; database; that's what "Reset" inside the app (once it exists) or a
Expand Down
8 changes: 4 additions & 4 deletions packaging/meshchat.spec → packaging/orcmesh.spec
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# -*- mode: python ; coding: utf-8 -*-
"""
PyInstaller spec for MeshChat for Windows.
PyInstaller spec for OrcMesh.

Build with:
.\.venv\Scripts\pyinstaller packaging\meshchat.spec
.\.venv\Scripts\pyinstaller packaging\orcmesh.spec

Or use the build script:
.\scripts\build.ps1
Expand Down Expand Up @@ -129,7 +129,7 @@ exe = EXE(
a.scripts,
[],
exclude_binaries=True,
name="MeshChat",
name="OrcMesh",
debug=False,
bootloader_ignore_signals=False,
strip=False,
Expand All @@ -152,5 +152,5 @@ coll = COLLECT(
strip=False,
upx=True,
upx_exclude=["vcruntime140.dll", "python3*.dll", "Qt6*.dll"],
name="MeshChat",
name="OrcMesh",
)
8 changes: 4 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ requires = ["setuptools>=68", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "meshchat-windows"
name = "orcmesh"
version = "0.2.0"
description = "Native Windows desktop client and network monitor for Meshtastic mesh radio networks"
description = "Native Windows operations console for LoRa mesh networks"
requires-python = ">=3.12"
license = "GPL-3.0-only"
dependencies = [
Expand All @@ -18,11 +18,11 @@ dependencies = [
]

[project.scripts]
meshchat = "meshchat.app:main"
orcmesh = "meshchat.app:main"

[project.optional-dependencies]
# RTL-SDR spectrum waterfall. Also needs the native librtlsdr driver — on
# Windows, install the WinUSB driver for the dongle with Zadig. MeshChat runs
# Windows, install the WinUSB driver for the dongle with Zadig. OrcMesh runs
# normally without this; the Spectrum page just reports it as unavailable.
sdr = [
"pyrtlsdr>=0.3",
Expand Down
2 changes: 1 addition & 1 deletion requirements-dev.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# MeshChat for Windows — development dependencies
# OrcMesh — development dependencies
# Mirrors [project.optional-dependencies].dev in pyproject.toml.
# Preferred install is `pip install -e ".[dev]"` (or .\scripts\bootstrap.ps1).

Expand Down
4 changes: 2 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# MeshChat for Windows — runtime dependencies
# OrcMesh — runtime dependencies
# Mirrors [project.dependencies] in pyproject.toml.
# Preferred install is `pip install -e .` (or .\scripts\bootstrap.ps1),
# which reads pyproject.toml directly.
Expand All @@ -12,5 +12,5 @@ numpy>=1.26

# Optional — RTL-SDR spectrum waterfall (Spectrum page).
# Also needs the native librtlsdr driver; on Windows install the WinUSB
# driver for the dongle with Zadig. MeshChat runs fine without this.
# driver for the dongle with Zadig. OrcMesh runs fine without this.
# pyrtlsdr>=0.3
4 changes: 2 additions & 2 deletions scripts/bootstrap.ps1
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<#
.SYNOPSIS
Bootstrap the MeshChat development environment.
Bootstrap the OrcMesh development environment.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Update the remaining bootstrap status text.

The banner now says OrcMesh, but Line 38 still prints Installing meshchat[dev].... Change the status text to use OrcMesh.

Also applies to: 12-12

🧰 Tools
🪛 PSScriptAnalyzer (1.25.0)

[warning] Missing BOM encoding for non-ASCII encoded file 'bootstrap.ps1'

(PSUseBOMForUnicodeEncodedFile)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/bootstrap.ps1` at line 3, Update the remaining bootstrap status
message at the installation step, including the corresponding occurrence around
line 38 and the additional reported occurrence, replacing “Installing
meshchat[dev]...” with OrcMesh terminology while preserving the existing
installation behavior.

.DESCRIPTION
Creates a virtual environment, installs the package in editable mode with
all dev dependencies. Run once after cloning, or again to upgrade deps.
Expand All @@ -9,7 +9,7 @@ $ErrorActionPreference = "Stop"
$root = Split-Path $PSScriptRoot -Parent
Set-Location $root

Write-Host "==> MeshChat bootstrap" -ForegroundColor Cyan
Write-Host "==> OrcMesh bootstrap" -ForegroundColor Cyan

# ── Python version check ────────────────────────────────────────────────────
$py = Get-Command python -ErrorAction SilentlyContinue
Expand Down
Loading
Loading