Skip to content

Commit 6d76570

Browse files
hyperpolymathclaude
andcommitted
feat: PanLL panels, TOPOLOGY update, LSP/DAP/BSP CI (closes #25)
PanLL panel integration: - Add panel manifests for 4 remaining core cartridges: agent-mcp, database-mcp, fleet-mcp, secrets-mcp — all 55 cartridges now have PanLL v1 panel manifests with data sources and widgets TOPOLOGY.md update: - Update date to 2026-03-20 - Reflect 55 total cartridges (18 core + 37 community/provider) - Update LSP/DAP/BSP entries to reference dedicated CI workflow - Add PanLL panel manifest completion row (55/55) - Add lsp-dap-bsp.yml CI pipeline row LSP/DAP/BSP CI: - Add dedicated lsp-dap-bsp.yml workflow with 5 jobs: - ABI check (Idris2 modules + banned pattern scan) - FFI build & test (Zig 0.15.2 compile + test) - V-lang adapter syntax check - Panel manifest JSON validation - Triadic structure completeness audit - Path-filtered: only runs on cartridge/protocol changes - All actions SHA-pinned (actions/checkout@v5) Resolves #25 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent a52f5df commit 6d76570

6 files changed

Lines changed: 441 additions & 5 deletions

File tree

.github/workflows/lsp-dap-bsp.yml

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
# SPDX-License-Identifier: PMPL-1.0-or-later
2+
# lsp-dap-bsp.yml — Dedicated CI for Language Server, Debug Adapter, and Build Server cartridges
3+
# Validates ABI specs, FFI builds, adapter compilation, and panel manifests
4+
# for the three protocol cartridges (lsp-mcp, dap-mcp, bsp-mcp).
5+
6+
name: LSP/DAP/BSP CI
7+
8+
on:
9+
push:
10+
paths:
11+
- 'cartridges/lsp-mcp/**'
12+
- 'cartridges/dap-mcp/**'
13+
- 'cartridges/bsp-mcp/**'
14+
- 'src/abi/Boj/Protocol.idr'
15+
- '.github/workflows/lsp-dap-bsp.yml'
16+
pull_request:
17+
paths:
18+
- 'cartridges/lsp-mcp/**'
19+
- 'cartridges/dap-mcp/**'
20+
- 'cartridges/bsp-mcp/**'
21+
22+
permissions: read-all
23+
24+
jobs:
25+
abi-check:
26+
name: ABI Specification Check (Idris2)
27+
runs-on: ubuntu-latest
28+
steps:
29+
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
30+
- name: Validate ABI modules exist
31+
run: |
32+
echo "=== Checking LSP/DAP/BSP ABI modules ==="
33+
for cart in lsp-mcp dap-mcp bsp-mcp; do
34+
echo "--- $cart ---"
35+
abi_dir="cartridges/$cart/abi"
36+
if [ ! -d "$abi_dir" ]; then
37+
echo "ERROR: $abi_dir directory missing"
38+
exit 1
39+
fi
40+
idr_count=$(find "$abi_dir" -name '*.idr' | wc -l)
41+
echo " Found $idr_count .idr files"
42+
if [ "$idr_count" -eq 0 ]; then
43+
echo "ERROR: No .idr files in $abi_dir"
44+
exit 1
45+
fi
46+
# Check for banned patterns
47+
if grep -r 'believe_me\|assert_total\|sorry' "$abi_dir" 2>/dev/null; then
48+
echo "ERROR: Banned pattern found in $abi_dir"
49+
exit 1
50+
fi
51+
echo " No banned patterns — OK"
52+
done
53+
54+
ffi-build:
55+
name: FFI Build & Test (Zig)
56+
runs-on: ubuntu-latest
57+
steps:
58+
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
59+
- name: Install Zig 0.15.2
60+
run: |
61+
curl -L https://ziglang.org/builds/zig-linux-x86_64-0.15.2.tar.xz | tar -xJ
62+
echo "$PWD/zig-linux-x86_64-0.15.2" >> "$GITHUB_PATH"
63+
- name: Build LSP/DAP/BSP cartridge FFI
64+
run: |
65+
for cart in lsp-mcp dap-mcp bsp-mcp; do
66+
echo "=== Building $cart FFI ==="
67+
ffi_dir="cartridges/$cart/ffi"
68+
if [ ! -f "$ffi_dir/build.zig" ]; then
69+
echo "ERROR: $ffi_dir/build.zig missing"
70+
exit 1
71+
fi
72+
cd "$ffi_dir"
73+
zig build 2>&1 || { echo "ERROR: Zig build failed for $cart"; exit 1; }
74+
echo " Build succeeded"
75+
# Check .so output exists
76+
so_file=$(find zig-out/lib/ -name '*.so' 2>/dev/null | head -1)
77+
if [ -n "$so_file" ]; then
78+
echo " Shared library: $so_file"
79+
else
80+
echo " WARNING: No .so output (may be static-only)"
81+
fi
82+
cd "$GITHUB_WORKSPACE"
83+
done
84+
- name: Run FFI tests
85+
run: |
86+
for cart in lsp-mcp dap-mcp bsp-mcp; do
87+
echo "=== Testing $cart FFI ==="
88+
cd "cartridges/$cart/ffi"
89+
zig build test 2>&1 || { echo "ERROR: Tests failed for $cart"; exit 1; }
90+
echo " Tests passed"
91+
cd "$GITHUB_WORKSPACE"
92+
done
93+
94+
adapter-check:
95+
name: V-lang Adapter Check
96+
runs-on: ubuntu-latest
97+
steps:
98+
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
99+
- name: Install V-lang
100+
run: |
101+
sudo apt-get update && sudo apt-get install -y libgc-dev
102+
git clone --depth=1 https://github.com/vlang/v
103+
cd v && make && sudo ./v symlink
104+
- name: Check LSP/DAP/BSP adapters
105+
run: |
106+
for cart in lsp-mcp dap-mcp bsp-mcp; do
107+
echo "=== Checking $cart adapter ==="
108+
adapter_dir="cartridges/$cart/adapter"
109+
if [ ! -d "$adapter_dir" ]; then
110+
echo "ERROR: $adapter_dir missing"
111+
exit 1
112+
fi
113+
v_files=$(find "$adapter_dir" -name '*.v' | wc -l)
114+
if [ "$v_files" -eq 0 ]; then
115+
echo "ERROR: No .v files in $adapter_dir"
116+
exit 1
117+
fi
118+
v check "$adapter_dir"/*.v 2>&1 || { echo "ERROR: V check failed for $cart"; exit 1; }
119+
echo " V-lang check passed ($v_files files)"
120+
done
121+
122+
panel-validation:
123+
name: Panel Manifest Validation
124+
runs-on: ubuntu-latest
125+
steps:
126+
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
127+
- name: Validate LSP/DAP/BSP panel manifests
128+
run: |
129+
for cart in lsp-mcp dap-mcp bsp-mcp; do
130+
echo "=== Validating $cart panel manifest ==="
131+
manifest="cartridges/$cart/panels/manifest.json"
132+
if [ ! -f "$manifest" ]; then
133+
echo "ERROR: $manifest missing"
134+
exit 1
135+
fi
136+
# Validate JSON
137+
python3 -m json.tool "$manifest" > /dev/null 2>&1 || {
138+
echo "ERROR: Invalid JSON in $manifest"
139+
exit 1
140+
}
141+
# Check required fields
142+
for field in cartridge domain version panels; do
143+
if ! python3 -c "import json; d=json.load(open('$manifest')); assert '$field' in d" 2>/dev/null; then
144+
echo "ERROR: Missing field '$field' in $manifest"
145+
exit 1
146+
fi
147+
done
148+
# Count panels
149+
panel_count=$(python3 -c "import json; print(len(json.load(open('$manifest'))['panels']))")
150+
echo " Valid JSON, $panel_count panels defined"
151+
done
152+
153+
completeness:
154+
name: Cartridge Completeness Check
155+
runs-on: ubuntu-latest
156+
needs: [abi-check, ffi-build, adapter-check, panel-validation]
157+
steps:
158+
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
159+
- name: Verify triadic structure
160+
run: |
161+
echo "=== LSP/DAP/BSP Triadic Structure Audit ==="
162+
all_pass=true
163+
for cart in lsp-mcp dap-mcp bsp-mcp; do
164+
echo "--- $cart ---"
165+
layers=("abi" "ffi" "adapter" "panels")
166+
for layer in "${layers[@]}"; do
167+
dir="cartridges/$cart/$layer"
168+
if [ -d "$dir" ]; then
169+
echo " ✓ $layer/"
170+
else
171+
echo " ✗ $layer/ MISSING"
172+
all_pass=false
173+
fi
174+
done
175+
done
176+
if [ "$all_pass" != "true" ]; then
177+
echo "ERROR: Incomplete triadic structure"
178+
exit 1
179+
fi
180+
echo ""
181+
echo "All 3 protocol cartridges have complete ABI+FFI+Adapter+Panel stacks."
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
{
2+
"$schema": "https://panll.dev/schemas/panel-manifest/v1.json",
3+
"spdx": "PMPL-1.0-or-later",
4+
"cartridge": "agent-mcp",
5+
"domain": "Agent Orchestration",
6+
"version": "0.1.0",
7+
"panels": [
8+
{
9+
"id": "agent-status",
10+
"title": "Agent Gateway Status",
11+
"description": "AI agent orchestration health and active sessions",
12+
"type": "status-indicator",
13+
"data_source": {
14+
"endpoint": "/cartridge/agent-mcp/invoke",
15+
"method": "POST",
16+
"body": { "tool": "status" },
17+
"refresh_interval_ms": 5000
18+
},
19+
"widgets": [
20+
{
21+
"type": "state-badge",
22+
"field": "state",
23+
"states": {
24+
"ready": { "color": "#2ecc71", "icon": "bot" },
25+
"degraded": { "color": "#f39c12", "icon": "alert-circle" },
26+
"error": { "color": "#e74c3c", "icon": "alert-triangle" }
27+
}
28+
},
29+
{ "type": "text", "field": "version", "label": "Version" }
30+
]
31+
},
32+
{
33+
"id": "agent-sessions",
34+
"title": "Active Agent Sessions",
35+
"description": "Running agent sessions with model and task details",
36+
"type": "metric",
37+
"data_source": {
38+
"endpoint": "/cartridge/agent-mcp/invoke",
39+
"method": "POST",
40+
"body": { "tool": "session_list" },
41+
"refresh_interval_ms": 10000
42+
},
43+
"widgets": [
44+
{ "type": "counter", "field": "active_sessions", "label": "Active Sessions", "icon": "users" },
45+
{ "type": "counter", "field": "pending_tasks", "label": "Pending Tasks", "icon": "clock" },
46+
{ "type": "counter", "field": "completed_tasks", "label": "Completed", "icon": "check-circle" }
47+
]
48+
},
49+
{
50+
"id": "agent-coprocessors",
51+
"title": "Coprocessor Dispatch",
52+
"description": "Axiom-style coprocessor detection and dispatch metrics",
53+
"type": "metric",
54+
"data_source": {
55+
"endpoint": "/cartridge/agent-mcp/invoke",
56+
"method": "POST",
57+
"body": { "tool": "coprocessor_stats" },
58+
"refresh_interval_ms": 15000
59+
},
60+
"widgets": [
61+
{ "type": "counter", "field": "dispatched", "label": "Dispatched", "icon": "send" },
62+
{ "type": "counter", "field": "fallbacks", "label": "Fallbacks", "icon": "rotate-ccw" },
63+
{ "type": "counter", "field": "avg_latency_ms", "label": "Avg Latency (ms)", "icon": "activity" }
64+
]
65+
}
66+
]
67+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
{
2+
"$schema": "https://panll.dev/schemas/panel-manifest/v1.json",
3+
"spdx": "PMPL-1.0-or-later",
4+
"cartridge": "database-mcp",
5+
"domain": "Database Operations",
6+
"version": "0.1.0",
7+
"panels": [
8+
{
9+
"id": "db-status",
10+
"title": "Database Gateway Status",
11+
"description": "Connection pool health and active database connections",
12+
"type": "status-indicator",
13+
"data_source": {
14+
"endpoint": "/cartridge/database-mcp/invoke",
15+
"method": "POST",
16+
"body": { "tool": "status" },
17+
"refresh_interval_ms": 5000
18+
},
19+
"widgets": [
20+
{
21+
"type": "state-badge",
22+
"field": "state",
23+
"states": {
24+
"ready": { "color": "#2ecc71", "icon": "database" },
25+
"degraded": { "color": "#f39c12", "icon": "alert-circle" },
26+
"error": { "color": "#e74c3c", "icon": "alert-triangle" }
27+
}
28+
},
29+
{ "type": "text", "field": "version", "label": "Version" }
30+
]
31+
},
32+
{
33+
"id": "db-connections",
34+
"title": "Active Connections",
35+
"description": "Database connection pool metrics and query throughput",
36+
"type": "metric",
37+
"data_source": {
38+
"endpoint": "/cartridge/database-mcp/invoke",
39+
"method": "POST",
40+
"body": { "tool": "pool_stats" },
41+
"refresh_interval_ms": 10000
42+
},
43+
"widgets": [
44+
{ "type": "counter", "field": "active_connections", "label": "Active", "icon": "link" },
45+
{ "type": "counter", "field": "idle_connections", "label": "Idle", "icon": "pause" },
46+
{ "type": "counter", "field": "queries_per_second", "label": "QPS", "icon": "zap" }
47+
]
48+
},
49+
{
50+
"id": "db-verisimdb",
51+
"title": "VeriSimDB Backing Store",
52+
"description": "Proof-carrying data store health and octad counts",
53+
"type": "metric",
54+
"data_source": {
55+
"endpoint": "/cartridge/database-mcp/invoke",
56+
"method": "POST",
57+
"body": { "tool": "verisimdb_stats" },
58+
"refresh_interval_ms": 15000
59+
},
60+
"widgets": [
61+
{ "type": "counter", "field": "octad_count", "label": "Octads", "icon": "box" },
62+
{ "type": "counter", "field": "proof_count", "label": "Proofs", "icon": "shield" },
63+
{ "type": "counter", "field": "store_size_mb", "label": "Size (MB)", "icon": "hard-drive" }
64+
]
65+
}
66+
]
67+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
{
2+
"$schema": "https://panll.dev/schemas/panel-manifest/v1.json",
3+
"spdx": "PMPL-1.0-or-later",
4+
"cartridge": "fleet-mcp",
5+
"domain": "Bot Fleet Management",
6+
"version": "0.1.0",
7+
"panels": [
8+
{
9+
"id": "fleet-status",
10+
"title": "Fleet Gateway Status",
11+
"description": "gitbot-fleet orchestration health and active bots",
12+
"type": "status-indicator",
13+
"data_source": {
14+
"endpoint": "/cartridge/fleet-mcp/invoke",
15+
"method": "POST",
16+
"body": { "tool": "status" },
17+
"refresh_interval_ms": 5000
18+
},
19+
"widgets": [
20+
{
21+
"type": "state-badge",
22+
"field": "state",
23+
"states": {
24+
"ready": { "color": "#2ecc71", "icon": "users" },
25+
"degraded": { "color": "#f39c12", "icon": "alert-circle" },
26+
"error": { "color": "#e74c3c", "icon": "alert-triangle" }
27+
}
28+
},
29+
{ "type": "text", "field": "version", "label": "Version" }
30+
]
31+
},
32+
{
33+
"id": "fleet-bots",
34+
"title": "Active Bots",
35+
"description": "Bot status across the 6-bot gitbot-fleet",
36+
"type": "metric",
37+
"data_source": {
38+
"endpoint": "/cartridge/fleet-mcp/invoke",
39+
"method": "POST",
40+
"body": { "tool": "bot_list" },
41+
"refresh_interval_ms": 10000
42+
},
43+
"widgets": [
44+
{ "type": "counter", "field": "active_bots", "label": "Active Bots", "icon": "cpu" },
45+
{ "type": "counter", "field": "pending_jobs", "label": "Pending Jobs", "icon": "clock" },
46+
{ "type": "counter", "field": "completed_jobs", "label": "Completed", "icon": "check-circle" }
47+
]
48+
},
49+
{
50+
"id": "fleet-har",
51+
"title": "HAR Integration",
52+
"description": "HTTP Archive recording and replay automation metrics",
53+
"type": "metric",
54+
"data_source": {
55+
"endpoint": "/cartridge/fleet-mcp/invoke",
56+
"method": "POST",
57+
"body": { "tool": "har_stats" },
58+
"refresh_interval_ms": 15000
59+
},
60+
"widgets": [
61+
{ "type": "counter", "field": "recordings", "label": "Recordings", "icon": "film" },
62+
{ "type": "counter", "field": "replays", "label": "Replays", "icon": "play" },
63+
{ "type": "counter", "field": "assertions_passed", "label": "Assertions OK", "icon": "check" }
64+
]
65+
}
66+
]
67+
}

0 commit comments

Comments
 (0)