用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/NIKX-Tech/karshipta --skill verify命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | verify |
| description | Runtime verification recipe for the Karshipta console (SvelteKit web app with MapLibre WebGL map) |
cd console
npm install && npm run proto:gen
npm run dev -- --port 5199
Default (no env) opens empty: no ward appears until an onboarding action is taken (see below). Set PUBLIC_GATEWAY_WS_URL=ws://... to auto-connect a gateway on load instead (automation override, not the default UX).
MapLibre needs WebGL. Plain --disable-gpu headless Chrome throws "Failed to initialize WebGL"; pass SwiftShader flags:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new \
--enable-unsafe-swiftshader --use-angle=swiftshader \
--window-size=1280,800 --virtual-time-budget=20000 --timeout=30000 \
--screenshot=out.png http://localhost:5199/
For console logs, pageerrors, and timed multi-shot captures, use playwright-core pointed at system Chrome (install it in the scratchpad, not this repo) with the same two SwiftShader args.
demo-1 instantly (no gateway needed), card shows a DEMO badge; click again for demo-2 etc., each on a different orbit. Card's remove (x) works instantly once the ward is disarmed/landed; disabled with a title while armed or airborne.ws://localhost:8765); Connect shows CONNECTING then LIVE against a running gateway, or stays DOWN retrying with backoff against nothing. Disconnect removes only source: gateway wards, demo wards stay. The Fleets tab's header shows the live ward count (moved out of the top bar, which no longer has a WARDS badge or connection button).AddWard and shows Adding... then either closes (ACCEPTED) or shows the rejection reason inline. A second simulated-ward add in one session shows the resource-warning confirm first. The Class dropdown lists every WardClass (flight and non-flight), not just flight ones.state.connected is false (link lost, not just gateway disconnected), the whole card and its map marker fade (opacity-50 grayscale / marker opacity 0.4), not just the dot. The demo engine never produces this on its own; force it by editing connected: true to false in fake/fleet-sim.ts's stateEnvelope and reverting after.flight field; there is no non-flight demo ward yet to exercise the other side of that gate.PUBLIC_READONLY=true: VIEWER badge in the top bar, COMMANDS and MISSION panels absent from the detail panel, telemetry still updating.PUBLIC_GATEWAY_WS_URL set and no gateway: no demo wards, top bar auto-attempts connection and stays DOWN, transport: websocket error retries with growing backoff, no crash; sent commands settle TIMEOUT after 10 s.PUBLIC_OPENAIP_KEY: no geozone layer, no legend, zero requests to api.core.openaip.net (only the local module URL appears in the network log; that is Vite serving the source, not a real API call).PUBLIC_OPENAIP_KEY set (even to a bogus value): legend appears bottom-left of the map; a failed or unexpected response is caught and logged (geozones: failed to load viewport), never thrown, and the rest of the console keeps working.--screenshot at page load races the first 200 ms telemetry tick; use --virtual-time-budget or a real wait.onMount in +page.svelte; this must never move into an $effect (feeding the store from inside an effect that also reads it causes an infinite setup/teardown loop).fleet.wards carries source: 'demo' | 'gateway'; commands and mission uploads route by it (channelFor in fleet-store.svelte.ts). A ward appearing with no commands working is almost always a channel-routing bug, not a transport bug: check source first.bind:this={container} div in fleet-map.svelte, never children of it: MapLibre takes ownership of that div's contents and paints its own canvas over anything already inside it.active getter) must be $state in Svelte 5, even when private; a plain field silently breaks reactivity with no error, only a UI that never updates.