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
43 changes: 0 additions & 43 deletions .clinerules

This file was deleted.

47 changes: 0 additions & 47 deletions .cursorrules

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/zig-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- name: Install Zig
uses: mlugg/setup-zig@v2
uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2
with:
version: 0.15.2

Expand Down
5 changes: 0 additions & 5 deletions .maintenance-perms-ignore

This file was deleted.

Empty file removed .nojekyll
Empty file.
43 changes: 0 additions & 43 deletions .windsurfrules

This file was deleted.

14 changes: 0 additions & 14 deletions CODEOWNERS

This file was deleted.

10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ Unified server capability catalogue with formally verified cartridges, distribut
> `Set up Bundle of Joy Server from https://github.com/hyperpolymath/boj-server`
> The AI reads this repo, asks you a few questions, and handles everything.

<a href="https://glama.ai/mcp/servers/hyperpolymath/boj-server">
<img width="380" height="200" src="https://glama.ai/mcp/servers/hyperpolymath/boj-server/badge" alt="BoJ MCP Server on Glama" />
</a>

## What is this?

BoJ solves the **combinatoric explosion of developer server protocols**. Instead of hunting across dozens of MCP, LSP, DAP, and other servers, AI goes to ONE place — the Teranga menu — and orders what it needs.
Expand Down Expand Up @@ -93,9 +97,7 @@ cd ../../ffi/zig && zig build

# Run tests
cd ffi/zig && zig build test
```<a href="https://glama.ai/mcp/servers/hyperpolymath/boj-server">
<img width="380" height="200" src="https://glama.ai/mcp/servers/hyperpolymath/boj-server/badge" />
</a>
```

## Distributed Hosting (Umoja Network)

Expand Down Expand Up @@ -126,7 +128,7 @@ PMPL-1.0-or-later (Palimpsest License). The license's provenance requirements (c

## Project Status

**Grade A (Production)** — 18 cartridges, 307 tests passing, thread-safe FFI (mutex-hardened), panic-attack validated. See `READINESS.md` for the full CRG assessment and `.machine_readable/STATE.a2ml` for milestone progress.
**Grade A (Production)** — 18 cartridges, 307 tests passing, thread-safe FFI (mutex-hardened), panic-attack validated. See `docs/READINESS.md` for the full CRG assessment and `.machine_readable/STATE.a2ml` for milestone progress.

## A Community Project

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
14 changes: 12 additions & 2 deletions mcp-bridge/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,16 @@ async function fetchCartridges() {
}
}

function isValidCartridgeName(name) {
return typeof name === "string" && /^[a-z0-9][a-z0-9-]*$/.test(name) && name.length <= 64;
}

async function invokeCartridge(name, params) {
if (!isValidCartridgeName(name)) {
return { error: `Invalid cartridge name: ${name}` };
}
try {
const res = await fetch(`${BOJ_BASE}/cartridge/${name}/invoke`, {
const res = await fetch(`${BOJ_BASE}/cartridge/${encodeURIComponent(name)}/invoke`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(params || {}),
Expand All @@ -120,8 +127,11 @@ async function invokeCartridge(name, params) {
}

async function fetchCartridgeInfo(name) {
if (!isValidCartridgeName(name)) {
return { error: `Invalid cartridge name: ${name}` };
}
try {
const res = await fetch(`${BOJ_BASE}/cartridge/${name}`);
const res = await fetch(`${BOJ_BASE}/cartridge/${encodeURIComponent(name)}`);
return await res.json();
} catch {
const all = OFFLINE_MENU.tier_teranga.concat(OFFLINE_MENU.tier_shield);
Expand Down
Loading