diff .claude/skills/zenbu-hg-web/SKILL.md @ 248:b8b6e726964a

[style] Use Dowa type aliases in C Co-authored-by: Copilot <[email protected]>
author MrJuneJune <me@mrjunejune.com>
date Tue, 04 Aug 2026 02:44:06 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.claude/skills/zenbu-hg-web/SKILL.md	Tue Aug 04 02:44:06 2026 -0700
@@ -0,0 +1,70 @@
+---
+name: zenbu-hg-web
+description: Use this skill when changing hg-web, the Mercurial repository browser, including the C API server, hg proxying, React/TypeScript frontend, markdown rendering, graph views, or static asset bundle.
+---
+
+# Hg Web
+
+Use this skill for `hg-web/`, a GitHub-style Mercurial repository browser backed by a C server and a TypeScript frontend.
+
+## Structure
+
+- `hg-web/main.c`: C server, routes, Mercurial proxy APIs, wire protocol streaming.
+- `hg-web/src/main.tsx`: frontend entry.
+- `hg-web/src/components/`: React/TypeScript UI components.
+- `hg-web/src/index.html`, `index.css`, `base.css`: shell and styles.
+- `hg-web/BUILD`: Bun bundle, static assets, C server, and release bundle.
+- `hg-web/deploy.sh`: deployment entry point.
+
+The server depends on `//seobeo:seobeo`. The frontend bundle includes `markdown_converter:markdown_to_html_wasm` and `third_party/highlight:js`.
+
+## Backend model
+
+The C backend proxies to local `hg serve` at:
+
+```c
+#define HG_SERVE_HOST "127.0.0.1"
+#define HG_SERVE_PORT "4444"
+```
+
+Public endpoints include:
+
+- `GET /`
+- `GET /directories`
+- `GET /graph`
+- `GET /api/repo/list?path=...`
+- `GET /api/repo/file?path=...`
+- `GET /api/repo/readme?path=...`
+- `GET /api/graph/:graph_id?...`
+- `GET /repo` and `POST /repo` streaming Mercurial wire protocol proxy.
+
+Use `sanitize_path` and `Seobeo_Url_Decode` patterns for any path-derived endpoint. Never pass raw path input to an hg path.
+
+## Frontend model
+
+Prefer editing components under `hg-web/src/components/`. Keep API paths aligned with backend registrations in `main.c`. The frontend should be able to handle:
+
+- directory listings from `/api/repo/list`,
+- file contents from `/api/repo/file`,
+- README markdown rendering through the WASM markdown converter,
+- syntax highlighting through highlight.js,
+- graph data via `/api/graph/:graph_id`.
+
+## Build
+
+```bash
+bazel build //hg-web:hg_web_server
+bazel build //hg-web:hg_web_server_bundle
+```
+
+If changing shared networking behavior, also run the relevant seobeo tests.
+
+## Safety checklist
+
+- Prefer Dowa aliases (`uint8`, `uint32`, `boolean`, `TRUE`/`FALSE`) over
+  `<stdint.h>` `_t` types and `<stdbool.h>` `bool` in first-party C.
+- Preserve binary-safe streaming in `StreamHgWireProtocol`; Mercurial bundle data can contain null bytes.
+- Do not buffer large wire-protocol responses through the normal HTTP client path unless the task explicitly requires it.
+- Validate and sanitize all path and graph inputs.
+- Keep content types accurate: JSON for API listing responses, `text/plain` or source-specific content for file/graph proxy responses, `text/html` for the app shell.
+- If changing route names, update both backend registrations and frontend fetch/navigation code.