Reasoning Serialization Tests
tailcallhq/forgecode
Checks that ReasoningConfig fields are serialized into the right provider-specific JSON for OpenRouter, Anthropic, GitHub Copilot and Codex requests.
Add an AI provider to ClaudeBar as a JSON definition run by the one generic Provider and DataSource.
$ npx skills add tddworks/ClaudeBar --skill add-provider -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install tddworks/ClaudeBar add-provider --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/tddworks/ClaudeBar.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/add-provider .claude/skills/add-provider && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "add-provider" agent skill from https://github.com/tddworks/ClaudeBar/tree/main/.claude/skills/add-provider into .claude/skills/add-provider/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-provider", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/tddworks/ClaudeBar/tree/main/.claude/skills/add-providerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add tddworks/ClaudeBar --skill add-provider -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install tddworks/ClaudeBar add-provider --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tddworks/ClaudeBar.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/add-provider .agents/skills/add-provider && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "add-provider" agent skill from https://github.com/tddworks/ClaudeBar/tree/main/.claude/skills/add-provider into .agents/skills/add-provider/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-provider", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tddworks/ClaudeBar --skill add-provider -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install tddworks/ClaudeBar add-provider --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tddworks/ClaudeBar.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/add-provider .cursor/skills/add-provider && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "add-provider" agent skill from https://github.com/tddworks/ClaudeBar/tree/main/.claude/skills/add-provider into .cursor/skills/add-provider/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-provider", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/tddworks/ClaudeBar.git --path .claude/skills/add-provider--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add tddworks/ClaudeBar --skill add-provider -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install tddworks/ClaudeBar add-provider --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tddworks/ClaudeBar.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/add-provider .gemini/skills/add-provider && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "add-provider" agent skill from https://github.com/tddworks/ClaudeBar/tree/main/.claude/skills/add-provider into .gemini/skills/add-provider/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-provider", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install tddworks/ClaudeBar add-providerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add tddworks/ClaudeBar --skill add-provider -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/tddworks/ClaudeBar.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/add-provider .github/skills/add-provider && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "add-provider" agent skill from https://github.com/tddworks/ClaudeBar/tree/main/.claude/skills/add-provider into .github/skills/add-provider/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-provider", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tddworks/ClaudeBar --skill add-provider -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install tddworks/ClaudeBar add-provider --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tddworks/ClaudeBar.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/add-provider .opencode/skills/add-provider && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "add-provider" agent skill from https://github.com/tddworks/ClaudeBar/tree/main/.claude/skills/add-provider into .opencode/skills/add-provider/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-provider", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
add-providerAdd an AI provider to ClaudeBar as a JSON definition run by the one generic Provider and DataSource.
Add Provider is an agent skill from tddworks/ClaudeBar. Add an AI provider to ClaudeBar as a JSON definition run by the one generic Provider and DataSource. Use this skill when: (1) Adding a new AI assistant provider (like Antigravity, Cursor, etc.) (2) A provider needs a setting, an added account, or an old saved key kept working (3) A provider's CLI, API or file format changed and its definition must follow (4) User asks "how do I add a new provider" or "create a provider for X"
Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/provider-icon-guide.md`).
It sits in Testing & QA. It works with Kimi. The repository describes itself as: A macOS menu bar application that monitors AI coding assistant usage quotas. Keep track of your Claude, Codex, Antigravity ,and Gemini usage at a glance. The licence is Apache-2.0.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 1a47a36. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmpython3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
ACME_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Add Provider loads about 4.1k tokens when it runs, and up to ~5k if it reads all its reference files. Until then it costs about 111 tokens; SKILL.md has 1,418 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from tddworks/ClaudeBar at commit 1a47a36, republished under its Apache-2.0 licence (© tddworks). 1,418 words, ~4,081 tokens.
.claude/skills/add-provider/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.A provider is data: one file, Modules/Providers/Resources/Providers/<id>.json.
The app finds it — ProviderCatalog.detect() reads every definition in the
bundle (and in ~/.claudebar/providers, ~/.claudebar/extensions) and makes
each on one shared Engine (TARGET_ARCHITECTURE §10).
There is no registration step and no Swift line that names it.
It says where the key is, how to fetch, and how to read the answer. One
Provider class and one DataSource type run every definition. You write
no Swift for a vendor: no XxxProvider, no XxxUsageProbe, no
XxxCredentialLoader.
Read first: TARGET_ARCHITECTURE.md (how a definition runs), MODULAR_DESIGN.md (which module a file goes in), and CANONICAL_MODEL.md (the words). Every built-in provider is a definition, so there is a worked example for most shapes: an API key with a region (
minimax.json), a CLI's login file renewed by OAuth (grok.json) or by the CLI itself (gemini.json), a TUI (kimi.json), a browser session over several requests (alibaba.json), an app's local server (antigravity.json), cloud metrics priced into money (bedrock.json). Their tests are inModules/Providers/Tests/.
The docs are the source of truth (AGENTS.md). A provider that fits the definition language needs no design change. One that needs the language to grow — a new case and worker, a new capability (CANONICAL §2.1), a new setting kind — is a design change: write it into TARGET_ARCHITECTURE / CANONICAL_MODEL first and ask the user to confirm before writing code.
| Piece | Where | You touch it when |
|---|---|---|
<id>.json | Modules/Providers/Resources/Providers/ | always |
<id>-*.js mapping script | beside the JSON | only when no mapping rule can read the format (a TUI screen) |
| golden tests | Modules/Providers/Tests/<Name>DefinitionTests.swift | always |
| a generic rule or worker | Modules/DataSources/ (+ DataSourcesTests) | when the definition language can't say what the provider needs |
| look (name, symbol, colour, icon) | profile.look in <id>.json; the icon image in the asset catalog | always |
| research | docs/providers/<id>/README.md (users), design.md (contributors) | always |
The rules (MODULAR_DESIGN §3–4):
JSONRPCFetcher, OAuth2Refresher), never a vendor.Probe names. The words are DataSource, Fetch, Mapping, Usage, Quota, Plan and Cost.Modules/* never import Domain. The usage model is Quotas; providers, settings and accounts are Providers.{
"profile": { // WHO IT IS
"id": "acme", // stable forever: settings and the menu bar key on it
"name": "Acme",
"links": { "dashboard": "https://…", "status": "https://…" },
"look": { "symbol": "bolt.fill", "icon": "AcmeIcon", // SF Symbol, asset name
"color": { "light": [0.2, 0.5, 0.9], "dark": [0.3, 0.6, 1.0] },
"gradientEnd": { "light": [0.1, 0.3, 0.7], "dark": [0.2, 0.4, 0.8] } }
},
"cli": "acme", // optional
"enabledByDefault": true,
"order": 280, // its default place in the lineup; none → after the rest, by name
"guestPasses": {}, // optional: a capability the engine runs (Claude's)
"defaultDataSource": "api",
"dataSources": [
{
"kind": "api", // what Settings' Data source picker saves as <id>.probeMode
"label": "API", "summary": "Calls Acme API directly",
"credential": { … }, // CredentialLookup — where the key is
"fetch": { … }, // Fetch — how to ask
"mapping": { … }, // Mapping — how to read the answer
"fallback": "cli" // optional: try this kind when this one fails
}
]
}| Sum | Cases |
|---|---|
credential | environment ("loginShell": true also asks the person's login shell) · browserStorage (a site's local storage, one browser profile) · setting (a key pasted into ClaudeBar, in the Keychain) · jsonFile (paths $.a.b, or a list — the first that answers; ~ and ${VAR:-default}; record, defaults) · keychain (account, encoding: "goKeyringBase64") · browserCookies (format: "value"|"header") · sqlite · firstOf — any of them refined with match (a value must fit a pattern, or no key), with (values added) and cookies (named cookies read out of a Cookie header); plus "refresh": { "oauth2": … } or "refresh": { "cli": … } (the CLI renews its own file) |
fetch | http ({{token}}, {{x#host}}, {{x#jwt.claim}}, {{system.timeZone}}) or "http": { "steps": [ … ] } (keep, optional, unless, attempts, dropEmpty) · jsonRpc · cli — a terminal, for a TUI (input, inputDelay, autoResponses, readyWhen, screen: "rendered") · command — pipes, exit code reported · file · directory · sqlite (rows of an app's own database, read-only) · localServer (an app's server on 127.0.0.1, found through its process) · cloudWatch (cloud metrics through a port, priced from a PriceCatalog) |
mapping | json (below) · text (error phrases, then label + regex for % left/used) · script (a .js file in JavaScriptCore, no I/O; host humanDate(), jsonDecimal(), decimalCents(), decimalAdd(), decimalMultiply(); context.values from "values"; returns quotas (with group), notes, plan, cost (with lines), account, or error) |
Per data source, also: errors (http.<status>, http.default,
cli.missing, cli.nonzero, cli.failed → a reason; a 429 is always a rate
limit), fallbackOn (hand-off by failure tag), fallback, cache.ttl (also
the background-refresh floor), context (JSON files the mapping may read),
recover.patchJSONFile, requiresFiles, identity,
verifyBeforeBackground. Per provider: links.dashboardByPlan and accounts
(added logins, see codex.json).
"settings": [
{ "id": "apiKey", "label": "API Key", "kind": "secret", "scope": "account", "for": ["api"] },
{ "id": "region", "label": "Region", "scope": "account", "default": "china",
"kind": { "choice": [ { "id": "china", "label": "China", "host": "api.acme.cn" },
{ "id": "intl", "label": "International", "host": "api.acme.com" } ] } },
{ "id": "home", "label": "Signed-in Folder", "scope": "account", "for": ["cli"], "kind": { "path": { "mustExist": true } } },
{ "id": "authEnvVar", "label": "Environment variable", "default": "ACME_API_KEY" }
]secret (to the Keychain, fills nothing), choice (its options carry values), path (mustExist), text (pattern).{{setting.region.host}} fills any string of the definition; a blank setting leaves its template unfilled (a script's values drop it).scope: "account" is what Add Account asks for; "for": [kind] asks only while that data source is active, and a login without such a value runs only the sources that don't need it.accounts.patch.<kind> changes a data source for added logins ("firstOf": null drops the default lookups; {{account.home}} fills from the login's values)."json": {
"plan": { "path": "$credential.plan", "plans": { "max": "claudeMax" } }, // or "badges"
"email": ["$.account.email", "$credential.email"],
"quotas": [
{ "kind": "session", "at": "$.five_hour", "usedPercent": "utilization",
"resetsAt": { "iso8601": "resets_at" } }, // or epochSeconds / secondsFromNow
{ "kind": "model", "each": "$.limits", "where": { "path": "kind", "equals": "weekly" },
"name": { "firstOf": ["model.name"], "firstWord": true, "lowercase": true },
"usedPercent": "percent", "unique": true, "overLimit": true, "countdown": "hours",
"window": [{ "seconds": "window_seconds" }, { "days": 7 }] }, // the response's word, else the provider's
{ "kind": "time", "name": "Credits", // money, not a percentage:
"left": { "money": "$.data.remaining", "of": "$.data.limit", "currency": "USD" } } // no "of" = a balance
],
"cost": [ // the first shape that answers
{ "kind": "extraUsage", "when": { "path": "$.spend.enabled", "equals": true },
"used": { "amount": "$.spend.used.amount_minor", "decimals": "$.spend.used.exponent" },
"limit": { "amount": "$.spend.limit.amount_minor", "decimals": "$.spend.limit.exponent" } }
],
"whenEmpty": { "if": { "path": "$.plan", "equals": "free" }, "quotas": [ … ], "otherwise": "No data yet" },
"notAnObject": "Failed to parse usage response"
}Paths: $.a.b from the root, a.b from the current object, $header.x, $key
(the map key inside each), $credential.x (a non-secret credential value),
$context.file.field (a field of a context file the data source reads, such as
the email a tool keeps in its own account file).
A list of values means the first that answers; a number is a constant.
Name each test should <outcome> [when <situation>], in the person's words, never a method, type or mechanism verb → Naming tests.
Find where the usage really comes from (CLI command, endpoint, local file) and
capture real responses, redacted, including the failure answers: logged
out, rate limited, a free plan, an empty account. Write what you learned in
docs/providers/<id>/design.md.
Modules/Providers/Tests/<Name>DefinitionTests.swift runs the real definition
through the real Provider over stubbed connections with StubbedProvider
(Tests/Support/Connections.swift). They fail first because <id>.json doesn't exist.
@MainActor
@Suite
struct AcmeDefinitionTests {
@Test
func `should read Acme from its API by default`() throws {
let acme = try ProviderFactory.builtIn("acme")
#expect(acme.dataSources.map(\.kind) == ["api"])
#expect(acme.defaultDataSource == "api")
}
@Test
func `should show the session window when the API answers`() async throws {
let stub = try StubbedProvider(providerId: "acme")
defer { stub.cleanUp() }
stub.environment = ["ACME_API_KEY": "test-key"]
stub.answerHTTP(#"{"session":{"used_percent":30,"reset_at":1735000000}}"#)
let usage = try await stub.make("acme").refreshPlain()
#expect(usage.quota(for: .session)?.percentRemaining == 70)
#expect(usage.quota(for: .session)?.resetsAt == Date(timeIntervalSince1970: 1735000000))
}
@Test
func `should say the key is missing when the API has no key`() async throws {
let stub = try StubbedProvider(providerId: "acme")
defer { stub.cleanUp() }
let acme = try stub.make("acme")
await #expect(throws: UsageError.authenticationRequired) { try await acme.refresh(acme.defaultAccount) }
#expect(acme.defaultAccount.lastFailedStep == .lookup)
}
}Assert on state: the usage, lastError, lastFailedStep, answeredBy, and
files written back. Don't verify() calls. Cover every fixture from step 1.
Add <id>.json until the golden tests pass. ProviderFactory.builtIn validates it:
kinds are unique, and the default and every fallback name an existing kind.
Don't write vendor code. Find the generic shape of the need, for example
"a list filtered by a field" or "money in minor units", and add it to
DataSources test-first in Modules/DataSources/Tests/. Then use it from the
JSON. ENGINE_DESIGN §1
lists the pieces each provider needed. Add your row there.
Only a format no rule can read, like a terminal UI screen, gets a mapping
script, <id>-<what>.js. Test it through Swift with real captured screens
(see ClaudeUsageScreenTests).
There is nothing to register: the file being in Resources/Providers/ makes it
a provider. "order" places it in the default lineup (the built-ins use 10, 20,
… 270); leave it out to come after the rest, by name. The person's own order
still wins. DetectionTests lists the built-ins in order — add your id there.
Every provider gets the same Engine: settings, the vault, the login shell (for
a lookup with "loginShell": true), the cloud ports (for a cloudWatch fetch),
the guest-passes runner (for "guestPasses": {}). Ask for one in the JSON;
never pass one in Swift.
Its name, symbol and colours are profile.look in the JSON — no switch id
table to edit. Add the icon image to the asset catalog under look.icon
(references/provider-icon-guide.md).
Settings need no new protocol: the data source choice is
dataSourceKind(forProvider:), and an on/off setting a definition names (for
example fallback.enabledBySetting) is isOn(_:forProvider:).
docs/providers/<id>/README.md (what users see, setup, errors) and design.md (sources, fields, gotchas).README.md — name, what it tracks, a link to its docs/providers/<id>/README.md — placed by its "order", so the table follows the default lineup.website/public/index.html, <div class="pv" data-id="<id>" …>), in lineup order, and every count on the page raised by one — npm test in website/ reads the definitions and fails until both match.## [Unreleased] in CHANGELOG.md.python3 scripts/gen-docs.py && python3 scripts/check-docs.py --strict.Every built-in provider is already a definition; when you change one, keep
every saved value working. The data source choice is <id>.probeMode, and a
setting foo is read from <id>.foo. A value kept somewhere else gets a row,
never a branch:
JSONSettingsRepository.legacySettingKeysJSONSettingsRepository.legacyDefaultsKeys (a saved number or list reads as text)ProviderVault.legacyKeysEach moves to its new place the first time it's saved, and each needs a test.
design.md<id>.json makes them pass; no vendor-named Swift anywhereDataSources, test-first, and listed in ENGINE_DESIGN §1"order" set if it has a place in the default lineup, and its id in DetectionTestsprofile.look filled in and the icon added to the asset catalogREADME.md Providers table, its landing-page tile and counts (npm test in website/), and the CHANGELOG line written; docs check passestuist test green© tddworks, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .claude/skills/add-provider of tddworks/ClaudeBar.
Open the folder on GitHubat commit 1a47a36
Add Provider next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Add Provider this skilltddworks/ClaudeBar | 1.5k | — | ~4.1k | Automated safety check: Pass | Apache-2.0 | |
| Reasoning Serialization Teststailcallhq/forgecode | 7.6k | — | ~1k | Automated safety check: Pass | Apache-2.0 | |
| Run Shuntpleaseai/shunt | 281 | — | ~2.6k | Automated safety check: Pass | Apache-2.0 | |
| Heterogeneous Agent Compatibility Testlobehub/lobehub | 83k | — | ~1.8k | Automated safety check: Pass | Custom licence | |
| Provider Chat SmokePorabuild/Poracode | 115 | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| CCS Task Delegationkaitranntt/ccs | 2.9k | — | ~1.8k | Automated safety check: Pass | MIT |
tailcallhq/forgecode
Checks that ReasoningConfig fields are serialized into the right provider-specific JSON for OpenRouter, Anthropic, GitHub Copilot and Codex requests.
pleaseai/shunt
Build, launch, and drive shunt — the Claude Code LLM gateway (a Rust/axum Anthropic-Messages proxy).
lobehub/lobehub
A user-invoked check that every official model the server advertises works through six external CLI agents, from Claude Code and Codex to TRAE, in a live test matrix.
Porabuild/Poracode
Smoke test real Poracode provider chat threads and ACP sessions end to end.
kaitranntt/ccs
Hands simple, deterministic tasks such as typo fixes, tests and small refactors to cheaper models through the ccs CLI, choosing a profile from your config.
kbwo/ccmanager
Set up, review, or repair a CCManager config — .ccmanager.json at a git repository root, or the global ~/.config/ccmanager/config.json.
tddworks/ClaudeBar
Guide for adding new report cards to ClaudeBar that analyze local data sources and display metrics with comparison deltas.
tddworks/ClaudeBar
Manage ClaudeBar's GitHub Actions CI/CD pipelines: build, test, and release workflows.
tddworks/ClaudeBar
Guide for implementing features in ClaudeBar following architecture-first design, TDD, rich domain models, and Swift 6.2 patterns.
tddworks/ClaudeBar
Guide for fixing bugs in ClaudeBar following Chicago School TDD and rich domain design.
tddworks/ClaudeBar
Guide for making improvements to existing ClaudeBar functionality using TDD.
Works with
Categories
Add an AI provider to ClaudeBar as a JSON definition run by the one generic Provider and DataSource. Add Provider is an agent skill from tddworks/ClaudeBar. Add an AI provider to ClaudeBar as a JSON definition run by the one generic Provider and DataSource.
Add Provider fits situations like: adding a new AI assistant provider (like Antigravity; A provider needs a setting; an added account; an old saved key kept working.
Run `npx skills add tddworks/ClaudeBar --skill add-provider -a claude-code`. Or copy the skill folder (.claude/skills/add-provider in tddworks/ClaudeBar) into .claude/skills/add-provider in your project. Claude Code loads it when a task matches its description.
Run `npx skills add tddworks/ClaudeBar --skill add-provider -a codex`. Or copy the skill folder (.claude/skills/add-provider in tddworks/ClaudeBar) into .agents/skills/add-provider in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tddworks/ClaudeBar --skill add-provider -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-provider, .gemini/skills/add-provider, .github/skills/add-provider and .opencode/skills/add-provider in your project.
Going by SKILL.md and its folder, Add Provider needs the command-line tools its instructions call (npm and python3) and credentials named ACME_API_KEY. Our summary lists: A credential in ACME_API_KEY.
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Add Provider is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.1k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 966 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Add Provider: Reasoning Serialization Tests (tailcallhq/forgecode, 7.6k stars), Run Shunt (pleaseai/shunt, 281 stars), Heterogeneous Agent Compatibility Test (lobehub/lobehub, 83k stars) and Provider Chat Smoke (Porabuild/Poracode, 115 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
tddworks (a GitHub organization) maintains it in tddworks/ClaudeBar, which has 1,531 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on October 9, 2026.
Source: tddworks/ClaudeBar on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.