@polderlabs/bizar 10.7.0 → 10.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/.claude/agents/_shared/AGENT_BASELINE.md +266 -0
  2. package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
  3. package/.claude/agents/_shared/SKILLS.md +109 -0
  4. package/.claude/agents/brand-designer.md +55 -0
  5. package/.claude/agents/exec-assistant.md +34 -0
  6. package/.claude/agents/help-desk.md +44 -0
  7. package/.claude/agents/it-lead.md +53 -0
  8. package/.claude/agents/knowledge-manager.md +49 -0
  9. package/.claude/agents/office-coordinator.md +39 -0
  10. package/.claude/agents/office-greeter.md +53 -0
  11. package/.claude/agents/office-manager.md +287 -0
  12. package/.claude/agents/principal-engineer.md +58 -0
  13. package/.claude/agents/qa-reviewer.md +51 -0
  14. package/.claude/agents/research-analyst.md +53 -0
  15. package/.claude/agents/senior-engineer.md +55 -0
  16. package/.claude/agents/support-tech.md +87 -0
  17. package/.claude/agents/vp-engineering.md +54 -0
  18. package/.claude/commands/audit.md +48 -0
  19. package/.claude/commands/bizar.md +22 -0
  20. package/.claude/commands/cron.md +36 -0
  21. package/.claude/commands/explain.md +17 -0
  22. package/.claude/commands/goal.md +99 -0
  23. package/.claude/commands/init.md +15 -0
  24. package/.claude/commands/learn.md +46 -0
  25. package/.claude/commands/plan.md +35 -0
  26. package/.claude/commands/plow-through.md +50 -0
  27. package/.claude/commands/pr-review.md +49 -0
  28. package/.claude/commands/setup-provider.md +96 -0
  29. package/.claude/commands/spec.md +47 -0
  30. package/.claude/commands/sprint.md +43 -0
  31. package/.claude/commands/tailscale-serve.md +100 -0
  32. package/.claude/commands/team.md +132 -0
  33. package/.claude/commands/test.md +62 -0
  34. package/.claude/commands/validate.md +68 -0
  35. package/.claude/commands/visual-plan.md +24 -0
  36. package/.claude/hooks/README.md +108 -0
  37. package/.claude/hooks/__tests__/pretooluse-editwrite.test.mjs +146 -0
  38. package/.claude/hooks/__tests__/sessionend-recall.test.mjs +256 -0
  39. package/.claude/hooks/__tests__/sessionstart-prime.test.mjs +325 -0
  40. package/.claude/hooks/__tests__/thinking-route.test.mjs +319 -0
  41. package/.claude/hooks/auto-instinct.sh +81 -0
  42. package/.claude/hooks/learning-extract.mjs +92 -0
  43. package/.claude/hooks/post-merge-audit.sh +93 -0
  44. package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
  45. package/.claude/hooks/pretooluse-bash.mjs +87 -0
  46. package/.claude/hooks/pretooluse-editwrite.mjs +117 -0
  47. package/.claude/hooks/sessionend-recall.mjs +384 -0
  48. package/.claude/hooks/sessionstart-prime.mjs +278 -0
  49. package/.claude/hooks/thinking-route.mjs +314 -0
  50. package/.claude/hooks/worker-suggest.mjs +110 -0
  51. package/.claude/settings.json +167 -0
  52. package/.claude/skills/9router/SKILL.md +80 -0
  53. package/.claude/skills/9router-chat/SKILL.md +73 -0
  54. package/.claude/skills/9router-embeddings/SKILL.md +69 -0
  55. package/.claude/skills/9router-image/SKILL.md +86 -0
  56. package/.claude/skills/9router-stt/SKILL.md +79 -0
  57. package/.claude/skills/9router-tts/SKILL.md +80 -0
  58. package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
  59. package/.claude/skills/9router-web-search/SKILL.md +91 -0
  60. package/.claude/skills/agent-browser/SKILL.md +64 -0
  61. package/.claude/skills/bizar/README.md +9 -0
  62. package/.claude/skills/bizar/SKILL.md +447 -0
  63. package/.claude/skills/cpp-coding-standards/README.md +28 -0
  64. package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
  65. package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
  66. package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
  67. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
  68. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
  69. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
  70. package/.claude/skills/cpp-testing/README.md +28 -0
  71. package/.claude/skills/cpp-testing/SKILL.md +304 -0
  72. package/.claude/skills/cpp-testing/references/coverage.md +370 -0
  73. package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
  74. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
  75. package/.claude/skills/cpp-testing/references/mocking.md +364 -0
  76. package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
  77. package/.claude/skills/cubesandbox/SKILL.md +148 -0
  78. package/.claude/skills/de-sloppify/SKILL.md +38 -0
  79. package/.claude/skills/de-sloppify/cleanup.mjs +253 -0
  80. package/.claude/skills/de-sloppify/cleanup.test.mjs +189 -0
  81. package/.claude/skills/embedded-esp-idf/README.md +41 -0
  82. package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
  83. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
  84. package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
  85. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
  86. package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
  87. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
  88. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
  89. package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
  90. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
  91. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
  92. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
  93. package/.claude/skills/glyph/SKILL.md +163 -0
  94. package/.claude/skills/harness-engineering/SKILL.md +142 -0
  95. package/.claude/skills/lightrag/SKILL.md +81 -0
  96. package/.claude/skills/memory-protocol/SKILL.md +105 -0
  97. package/.claude/skills/obsidian/SKILL.md +306 -0
  98. package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
  99. package/.claude/skills/self-improvement/SKILL.md +64 -0
  100. package/.claude/skills/skillopt/SKILL.md +129 -0
  101. package/.claude/skills/thinking-archetypes/SKILL.md +90 -0
  102. package/.claude/skills/thinking-bayesian/SKILL.md +267 -0
  103. package/.claude/skills/thinking-bounded-rationality/SKILL.md +406 -0
  104. package/.claude/skills/thinking-circle-of-competence/SKILL.md +216 -0
  105. package/.claude/skills/thinking-cynefin/SKILL.md +70 -0
  106. package/.claude/skills/thinking-debiasing/SKILL.md +192 -0
  107. package/.claude/skills/thinking-dual-process/SKILL.md +282 -0
  108. package/.claude/skills/thinking-effectuation/SKILL.md +366 -0
  109. package/.claude/skills/thinking-feedback-loops/SKILL.md +464 -0
  110. package/.claude/skills/thinking-fermi-estimation/SKILL.md +263 -0
  111. package/.claude/skills/thinking-first-principles/SKILL.md +167 -0
  112. package/.claude/skills/thinking-five-whys-plus/SKILL.md +139 -0
  113. package/.claude/skills/thinking-inversion/SKILL.md +195 -0
  114. package/.claude/skills/thinking-jobs-to-be-done/SKILL.md +363 -0
  115. package/.claude/skills/thinking-kepner-tregoe/SKILL.md +154 -0
  116. package/.claude/skills/thinking-leverage-points/SKILL.md +390 -0
  117. package/.claude/skills/thinking-lindy-effect/SKILL.md +331 -0
  118. package/.claude/skills/thinking-map-territory/SKILL.md +111 -0
  119. package/.claude/skills/thinking-margin-of-safety/SKILL.md +330 -0
  120. package/.claude/skills/thinking-model-combination/SKILL.md +406 -0
  121. package/.claude/skills/thinking-model-router/SKILL.md +360 -0
  122. package/.claude/skills/thinking-model-selection/SKILL.md +341 -0
  123. package/.claude/skills/thinking-occams-razor/SKILL.md +129 -0
  124. package/.claude/skills/thinking-ooda/SKILL.md +127 -0
  125. package/.claude/skills/thinking-opportunity-cost/SKILL.md +360 -0
  126. package/.claude/skills/thinking-pre-mortem/SKILL.md +170 -0
  127. package/.claude/skills/thinking-probabilistic/SKILL.md +324 -0
  128. package/.claude/skills/thinking-red-team/SKILL.md +142 -0
  129. package/.claude/skills/thinking-regret-minimization/SKILL.md +335 -0
  130. package/.claude/skills/thinking-reversibility/SKILL.md +326 -0
  131. package/.claude/skills/thinking-scientific-method/SKILL.md +162 -0
  132. package/.claude/skills/thinking-second-order/SKILL.md +184 -0
  133. package/.claude/skills/thinking-socratic/SKILL.md +198 -0
  134. package/.claude/skills/thinking-steel-manning/SKILL.md +332 -0
  135. package/.claude/skills/thinking-systems/SKILL.md +238 -0
  136. package/.claude/skills/thinking-theory-of-constraints/SKILL.md +338 -0
  137. package/.claude/skills/thinking-thought-experiment/SKILL.md +354 -0
  138. package/.claude/skills/thinking-triz/SKILL.md +171 -0
  139. package/.claude/skills/thinking-via-negativa/SKILL.md +358 -0
  140. package/bizar-dash/skills/publishing/SKILL.md +2 -1
  141. package/cli/install/postinstall.mjs +54 -28
  142. package/cli/install/postinstall.test.mjs +98 -0
  143. package/cli/provision.mjs +29 -0
  144. package/install.sh +7 -0
  145. package/package.json +7 -2
  146. package/scripts/git-hooks/__tests__/commit-msg.test.mjs +61 -0
  147. package/scripts/git-hooks/commit-msg +38 -0
  148. package/scripts/install-hooks.sh +9 -0
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: 9router-tts
3
+ description: Text-to-speech via 9Router /v1/audio/speech using OpenAI / ElevenLabs / Deepgram / Edge TTS / Google TTS / Hyperbolic / Inworld voices. Use when the user wants to convert text to speech, generate audio, voiceover, narrate, or read text aloud.
4
+ ---
5
+
6
+ # 9Router — Text-to-Speech
7
+
8
+ Requires `NINEROUTER_URL` (and `NINEROUTER_KEY` if auth enabled). See https://raw.githubusercontent.com/decolua/9router/refs/heads/master/skills/9router/SKILL.md for setup.
9
+
10
+ ## Discover
11
+
12
+ ```bash
13
+ # 1) List models
14
+ curl $NINEROUTER_URL/v1/models/tts | jq '.data[].id'
15
+ # 2) Per-model metadata (params, voicesUrl if voice-by-id)
16
+ curl "$NINEROUTER_URL/v1/models/info?id=el/eleven_multilingual_v2"
17
+ # 3) List voices (elevenlabs, edge-tts, deepgram, inworld, local-device). Optional ?lang=vi
18
+ curl "$NINEROUTER_URL/v1/audio/voices?provider=edge-tts&lang=vi" | jq '.data[].model'
19
+ ```
20
+
21
+ `model` field in `/v1/audio/speech` = voice ID directly (e.g. `edge-tts/vi-VN-HoaiMyNeural`, `el/<voice_id>`, or `openai/tts-1` model+default voice).
22
+
23
+ ## Endpoint
24
+
25
+ `POST $NINEROUTER_URL/v1/audio/speech`
26
+
27
+ | Field | Required | Notes |
28
+ |---|---|---|
29
+ | `model` | yes | voice ID from `/v1/models/tts` |
30
+ | `input` | yes | text to speak |
31
+
32
+ Query `?response_format=mp3` (default, raw bytes) or `?response_format=json` (`{audio: base64, format}`).
33
+
34
+ ## Examples
35
+
36
+ Save MP3:
37
+
38
+ ```bash
39
+ curl -X POST "$NINEROUTER_URL/v1/audio/speech" \
40
+ -H "Authorization: Bearer $NINEROUTER_KEY" \
41
+ -H "Content-Type: application/json" \
42
+ -d '{"model":"openai/tts-1","input":"Hello world"}' \
43
+ --output speech.mp3
44
+ ```
45
+
46
+ JS (save file):
47
+
48
+ ```js
49
+ import { writeFile } from "node:fs/promises";
50
+ const r = await fetch(`${process.env.NINEROUTER_URL}/v1/audio/speech`, {
51
+ method: "POST",
52
+ headers: { "Authorization": `Bearer ${process.env.NINEROUTER_KEY}`, "Content-Type": "application/json" },
53
+ body: JSON.stringify({ model: "el/eleven_multilingual_v2", input: "Xin chào" }),
54
+ });
55
+ await writeFile("speech.mp3", Buffer.from(await r.arrayBuffer()));
56
+ ```
57
+
58
+ ## Response shape
59
+
60
+ Default → raw audio bytes (Content-Type `audio/mp3`).
61
+
62
+ `?response_format=json`:
63
+ ```json
64
+ { "audio": "SUQzBAAAA...", "format": "mp3" }
65
+ ```
66
+
67
+ ## Provider quirks (model format)
68
+
69
+ | Provider | `model` format | Notes |
70
+ |---|---|---|
71
+ | `openai` | `tts-1/alloy` (model/voice) or just voice | Default model `gpt-4o-mini-tts` |
72
+ | `elevenlabs` | `<model_id>/<voice_id>` or `<voice_id>` | Default model `eleven_flash_v2_5`; list voices in Dashboard |
73
+ | `openrouter` | `openai/gpt-4o-mini-tts/alloy` | Streamed via chat-completions audio modality |
74
+ | `edge-tts` | voice id e.g. `vi-VN-HoaiMyNeural` | **noAuth**; default `vi-VN-HoaiMyNeural` |
75
+ | `google-tts` | language code e.g. `en`, `vi` | **noAuth** |
76
+ | `local-device` | OS voice name (`say -v ?` / SAPI) | **noAuth**; needs `ffmpeg` |
77
+ | `deepgram` | `aura-asteria-en` etc | Token auth |
78
+ | `nvidia`, `inworld`, `cartesia`, `playht` | `model/voice` | Provider-specific auth header |
79
+ | `coqui`, `tortoise` | speaker / voice id | Localhost noAuth |
80
+ | `hyperbolic` | model id | Body = `{text}` only |
@@ -0,0 +1,99 @@
1
+ ---
2
+ name: 9router-web-fetch
3
+ description: Fetch URL → markdown / text / HTML via 9Router /v1/web/fetch using Firecrawl / Jina Reader / Tavily Extract / Exa Contents. Use when the user wants to scrape a webpage, extract URL content, read article, or convert a URL to markdown.
4
+ ---
5
+
6
+ # 9Router — Web Fetch
7
+
8
+ Requires `NINEROUTER_URL` (and `NINEROUTER_KEY` if auth enabled). See https://raw.githubusercontent.com/decolua/9router/refs/heads/master/skills/9router/SKILL.md for setup.
9
+
10
+ ## Discover
11
+
12
+ ```bash
13
+ curl $NINEROUTER_URL/v1/models/web | jq '.data[] | select(.kind=="webFetch") | .id'
14
+ # Per-provider params
15
+ curl "$NINEROUTER_URL/v1/models/info?id=firecrawl/fetch"
16
+ ```
17
+
18
+ IDs end in `/fetch` (e.g. `firecrawl/fetch`, `jina/fetch`). `fetch-combo` chains providers with auto-fallback.
19
+
20
+ ## Endpoint
21
+
22
+ `POST $NINEROUTER_URL/v1/web/fetch`
23
+
24
+ | Field | Required | Notes |
25
+ |---|---|---|
26
+ | `model` (or `provider`) | yes | from `/v1/models/web` (e.g. `firecrawl` or `jina-reader`) |
27
+ | `url` | yes | URL to extract |
28
+ | `format` | no | `markdown` (default) / `text` / `html` |
29
+ | `max_characters` | no | truncate output |
30
+
31
+ ## Examples
32
+
33
+ ### Jina Reader
34
+ ```bash
35
+ curl -X POST $NINEROUTER_URL/v1/web/fetch \
36
+ -H "Authorization: Bearer $NINEROUTER_KEY" \
37
+ -H "Content-Type: application/json" \
38
+ -d '{"model":"jina-reader","url":"https://9router.com","format":"markdown"}'
39
+ ```
40
+
41
+ ### Exa
42
+ ```bash
43
+ curl -X POST $NINEROUTER_URL/v1/web/fetch \
44
+ -H "Authorization: Bearer $NINEROUTER_KEY" \
45
+ -H "Content-Type: application/json" \
46
+ -d '{"model":"exa","url":"https://example.com","format":"markdown","max_characters":0}'
47
+ ```
48
+
49
+ ### Firecrawl
50
+ ```bash
51
+ curl -X POST $NINEROUTER_URL/v1/web/fetch \
52
+ -H "Authorization: Bearer $NINEROUTER_KEY" \
53
+ -H "Content-Type: application/json" \
54
+ -d '{"model":"firecrawl","url":"https://example.com","format":"markdown","max_characters":0}'
55
+ ```
56
+
57
+ ### Tavily
58
+ ```bash
59
+ curl -X POST $NINEROUTER_URL/v1/web/fetch \
60
+ -H "Authorization: Bearer $NINEROUTER_KEY" \
61
+ -H "Content-Type: application/json" \
62
+ -d '{"model":"tavily","url":"https://example.com","format":"markdown","max_characters":0}'
63
+ ```
64
+
65
+
66
+ JS:
67
+
68
+ ```js
69
+ const r = await fetch(`${process.env.NINEROUTER_URL}/v1/web/fetch`, {
70
+ method: "POST",
71
+ headers: { "Authorization": `Bearer ${process.env.NINEROUTER_KEY}`, "Content-Type": "application/json" },
72
+ body: JSON.stringify({ model: "fetch-combo", url: "https://example.com", format: "markdown", max_characters: 5000 }),
73
+ });
74
+ const { data } = await r.json();
75
+ console.log(data.title, data.content.length);
76
+ ```
77
+
78
+ ## Response shape
79
+
80
+ ```json
81
+ {
82
+ "provider": "jina-reader",
83
+ "url": "...",
84
+ "title": "...",
85
+ "content": { "format": "markdown", "text": "...", "length": 1234 },
86
+ "metadata": { "author": null, "published_at": null, "language": null },
87
+ "usage": { "fetch_cost_usd": 0 },
88
+ "metrics": { "response_time_ms": 850, "upstream_latency_ms": 700 }
89
+ }
90
+ ```
91
+
92
+ ## Provider quirks
93
+
94
+ | Provider | Auth | Best for |
95
+ |---|---|---|
96
+ | `firecrawl` | Bearer | JS-rendered pages, `format=markdown/html` |
97
+ | `jina-reader` | Bearer (optional) | Free tier (~1M chars/mo); fastest plain markdown |
98
+ | `tavily` | Bearer | Bulk extract; returns `raw_content` |
99
+ | `exa` | `x-api-key` | Pre-indexed pages; fast text extraction |
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: 9router-web-search
3
+ description: Web search via 9Router /v1/search using Tavily / Exa / Brave / Serper / SearXNG / Google PSE / Linkup / SearchAPI / You.com / Perplexity. Use when the user wants to search the web, look up information, find articles, or query a search engine.
4
+ ---
5
+
6
+ # 9Router — Web Search
7
+
8
+ Requires `NINEROUTER_URL` (and `NINEROUTER_KEY` if auth enabled). See https://raw.githubusercontent.com/decolua/9router/refs/heads/master/skills/9router/SKILL.md for setup.
9
+
10
+ ## Discover
11
+
12
+ ```bash
13
+ curl $NINEROUTER_URL/v1/models/web | jq '.data[] | select(.kind=="webSearch") | .id'
14
+ # Per-provider params (searchTypes, maxResults, required options like cx for google-pse)
15
+ curl "$NINEROUTER_URL/v1/models/info?id=tavily/search"
16
+ ```
17
+
18
+ IDs end in `/search` (e.g. `tavily/search`). Combos (`owned_by:"combo"`) chain providers with auto-fallback.
19
+
20
+ ## Endpoint
21
+
22
+ `POST $NINEROUTER_URL/v1/search`
23
+
24
+ | Field | Required | Notes |
25
+ |---|---|---|
26
+ | `model` (or `provider`) | yes | from `/v1/models/web` (e.g. `tavily` or `brave`) |
27
+ | `query` | yes | search query |
28
+ | `max_results` | no | default 5 |
29
+ | `search_type` | no | `web` (default) / `news` |
30
+ | `country`, `language`, `time_range`, `domain_filter` | no | provider-dependent |
31
+
32
+ ## Examples
33
+
34
+ ```bash
35
+ curl -X POST $NINEROUTER_URL/v1/search \
36
+ -H "Authorization: Bearer $NINEROUTER_KEY" \
37
+ -H "Content-Type: application/json" \
38
+ -d '{"model":"tavily","query":"9Router open source","max_results":5}'
39
+ ```
40
+
41
+ JS:
42
+
43
+ ```js
44
+ const r = await fetch(`${process.env.NINEROUTER_URL}/v1/search`, {
45
+ method: "POST",
46
+ headers: { "Authorization": `Bearer ${process.env.NINEROUTER_KEY}`, "Content-Type": "application/json" },
47
+ body: JSON.stringify({ model: "search-combo", query: "latest LLM benchmarks", max_results: 10 }),
48
+ });
49
+ console.log(await r.json());
50
+ ```
51
+
52
+ ## Response shape
53
+
54
+ ```json
55
+ {
56
+ "provider": "tavily",
57
+ "query": "9Router open source",
58
+ "results": [
59
+ {
60
+ "title": "...", "url": "https://...", "display_url": "github.com/...",
61
+ "snippet": "...", "position": 1, "score": 0.92,
62
+ "published_at": null, "favicon_url": null, "content": null,
63
+ "metadata": { "author": null, "language": null, "source_type": null, "image_url": null },
64
+ "citation": { "provider": "tavily", "retrieved_at": "2026-...", "rank": 1 }
65
+ }
66
+ ],
67
+ "answer": null,
68
+ "usage": { "queries_used": 1, "search_cost_usd": 0.008 },
69
+ "metrics": { "response_time_ms": 850, "upstream_latency_ms": 700, "total_results_available": 12 },
70
+ "errors": []
71
+ }
72
+ ```
73
+
74
+ ## Provider quirks
75
+
76
+ All accept `query` + `max_results`. Optional fields vary:
77
+
78
+ | Provider | Supports | Required extras |
79
+ |---|---|---|
80
+ | `tavily` | country, domain_filter, news topic | — |
81
+ | `exa` | domain_filter (incl/excl), news category | — |
82
+ | `brave-search` | country, language | — |
83
+ | `serper` | country, language, news endpoint | — |
84
+ | `perplexity` | country, language, domain_filter | — |
85
+ | `linkup` | domain_filter, time_range | `depth: fast/standard/deep` (option) |
86
+ | `google-pse` | country, language, time_range, offset | **`cx` required** (providerOptions) |
87
+ | `searchapi` | country, language, pagination | — |
88
+ | `youcom` | country, language, time_range, domain_filter, full_page | — |
89
+ | `searxng` | language, time_range | Self-hosted, **noAuth** |
90
+
91
+ Provider IS the model — `"provider":"tavily" ≡ "model":"tavily"`.
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: kevin
3
+ description: Drives a real browser via the kevin Rust CLI or its MCP stdio server. Use for end-to-end web verification — screenshots, accessibility snapshots, click/fill by ref, JS-rendered page interaction. Prefer over curl/HTML parsing for any task that requires a real browser.
4
+ ---
5
+
6
+ # kevin — Browser-Driven E2E
7
+
8
+ ## When to use
9
+
10
+ - Verify a web app actually works (screenshot, accessibility snapshot, click flow)
11
+ - Confirm a JS-rendered page contains expected content
12
+ - Capture a snapshot for a PR review or regression baseline
13
+ - Interact with a page that requires real browser semantics (auth, JS, iframes)
14
+
15
+ Skip for static HTML — `WebFetch` or `curl` is faster.
16
+
17
+ ## Two ways to call it
18
+
19
+ ### 1. Bash + CLI (always available)
20
+
21
+ ```bash
22
+ kevin open <url>
23
+ kevin snapshot --json # accessibility tree with refs
24
+ kevin click @e2 # click by ref
25
+ kevin fill @e3 "test@example.com" # fill by ref
26
+ kevin get text @e1
27
+ kevin screenshot page.png
28
+ kevin close
29
+ ```
30
+
31
+ 100+ typed CLI commands ship with the binary; `kevin --help` is the source of truth.
32
+
33
+ ### 2. MCP stdio tools (`mcp__agent-browser__*`)
34
+
35
+ The kevin binary also ships an MCP stdio server (`kevin mcp`). After F-108 it is registered in `.claude/settings.json:mcpServers`, exposing typed tools (`open`, `snapshot`, `click`, `fill`, `screenshot`, `close`, …). Prefer MCP over Bash for typed args — no shell escaping.
36
+
37
+ ## Refs vs selectors
38
+
39
+ Prefer **refs** (`@e2`) — stable across page snapshots and independent of DOM structure. Use selectors (`"#submit"`, `role=button[name=Submit]`) only when no snapshot has been taken yet.
40
+
41
+ ## Setup
42
+
43
+ If the daemon is not running: `cli/kevin-up.mjs start` (or `bizar browser-agent-up start`).
44
+
45
+ ## Plugin system
46
+
47
+ kevin supports plugins — e.g. `kevin-plugin-vault` for credential storage. Configure in `kevin.json`:
48
+
49
+ ```json
50
+ {
51
+ "plugins": [
52
+ { "name": "vault", "command": "kevin-plugin-vault",
53
+ "capabilities": ["credential.read"] }
54
+ ]
55
+ }
56
+ ```
57
+
58
+ ## Natural-language chat
59
+
60
+ `kevin chat "open google.com and search for cats"` translates instructions into kevin commands and streams results. Requires `AI_GATEWAY_API_KEY`.
61
+
62
+ ## Where the kevin agent uses this
63
+
64
+ The `@kevin` agent drives this tool exclusively (no Edit/Write access). Dispatch it via Odin for end-to-end web verification tasks — it reads the page, takes a snapshot, and reports back. It never modifies project code.
@@ -0,0 +1,9 @@
1
+ # BizarHarness Skill
2
+
3
+ Norse-pantheon multi-agent system skill for Claude Code.
4
+
5
+ Copy to `~/.claude/skills/bizar/SKILL.md` to install.
6
+
7
+ ```
8
+ cp SKILL.md ~/.claude/skills/bizar/SKILL.md
9
+ ```