Deskcomm Contribuir
melgarafael/DeskcommCRM
Guia de contribuição ao DeskcommCRM para quem vai mexer no código e abrir um pull request, sobretudo de um fork.
Designs the contract for an API change inside one codebase — a component's props, a function surface, URL or query parameters, an event payload, or a module boundary — through a discovery pass, an…
$ npx skills add testdouble/han --skill design-an-api -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install testdouble/han design-an-api --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/testdouble/han.git skills-src && mkdir -p .claude/skills && cp -r skills-src/han-coding/skills/design-an-api .claude/skills/design-an-api && 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 "design-an-api" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/design-an-api into .claude/skills/design-an-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-an-api", 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/testdouble/han/tree/main/han-coding/skills/design-an-apiType 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 testdouble/han --skill design-an-api -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install testdouble/han design-an-api --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .agents/skills && cp -r skills-src/han-coding/skills/design-an-api .agents/skills/design-an-api && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "design-an-api" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/design-an-api into .agents/skills/design-an-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-an-api", 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 testdouble/han --skill design-an-api -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install testdouble/han design-an-api --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/han-coding/skills/design-an-api .cursor/skills/design-an-api && 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 "design-an-api" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/design-an-api into .cursor/skills/design-an-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-an-api", 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/testdouble/han.git --path han-coding/skills/design-an-api--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 testdouble/han --skill design-an-api -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install testdouble/han design-an-api --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/han-coding/skills/design-an-api .gemini/skills/design-an-api && 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 "design-an-api" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/design-an-api into .gemini/skills/design-an-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-an-api", 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 testdouble/han design-an-apiInstalls 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 testdouble/han --skill design-an-api -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .github/skills && cp -r skills-src/han-coding/skills/design-an-api .github/skills/design-an-api && 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 "design-an-api" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/design-an-api into .github/skills/design-an-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-an-api", 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 testdouble/han --skill design-an-api -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install testdouble/han design-an-api --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/han-coding/skills/design-an-api .opencode/skills/design-an-api && 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 "design-an-api" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/design-an-api into .opencode/skills/design-an-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-an-api", 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.
design-an-apiDesigns the contract for an API change inside one codebase — a component's props, a function surface, URL or query parameters, an event payload, or a module boundary — through a discovery pass, an…
Design An API is an agent skill from testdouble/han. Designs the contract for an API change inside one codebase — a component's props, a function surface, URL or query parameters, an event payload, or a module boundary — through a discovery pass, an options document with one recommendation, a question round, and an adversarial validation round, with every element of the contract justified from one stated goal. Use when you want to design, shape, decide, or nail down an interface, contract, signature, or API change for a capability you can already describe, sized…
Its SKILL.md is about 7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/api-design-template.md`).
It sits in Development, covering API design, Test-driven development and Pull requests. It works with Git. The repository describes itself as: Han: AI skills and agents for "Solo" product engineers and small teams. The licence is MIT.
11 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit abba73a. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteGlobGrepAgentBash(git *)Bash(find *)Bash(mkdir *)Bash(bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh")From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitbashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Design An API loads about 7k tokens when it runs, and up to ~8.2k if it reads all its reference files. Until then it costs about 248 tokens; SKILL.md has 3,912 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 testdouble/han at commit abba73a, republished under its MIT licence (© testdouble). 3,912 words, ~6,994 tokens.
.claude/skills/design-an-api/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.which git 2>/dev/null || echo "not installed"git branch --show-current 2>/dev/null || echo "no git branch"git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null || echo unknownfind . -maxdepth 1 -name "CLAUDE.md" -type ffind . -maxdepth 3 -name "project-discovery.md" -type fbash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh" 2>/dev/null || echo "$HOME/.claude"cat .han/config.md 2>/dev/null || echo ""As your first action, use the Read tool on .han/config.md inside the personal config directory path above. A read
that returns no file is no personal configuration: continue silently. When that file or the project .han/config.md
probe supplies content, apply it per config-rule.md, which governs precedence
between the two files, relative-path resolution, and what to do with a file that reads but cannot be used.
Read these before dispatching anything. They constrain every step below.
han-core:codebase-explorer,
han-core:software-architect, han-core:junior-developer, and han-core:adversarial-validator run at every size
BECAUSE evidence, design, questioning, and attack are the irreducible core of a contract that survives contact. Every
other specialist is added only when the interface's signals warrant it and the band allows it, BECAUSE dispatching an
agent whose domain the contract never touches burns tokens and pulls the design toward concerns the goal did not ask
for.tdd run against this document.han-communication:readability-guidance and applies it, holding one audience
above the writing: the engineer who will implement this contract and the reviewer who will approve it. Scope that
frame per section so the specifics that reader needs — exact signatures, types, precedence rules, file paths — are
preserved, never simplified away.Bind $size. If the user passed small, medium, large, or dynamic as the first positional argument, bind
$size to it. Anything else is part of the goal-and-interface context, not a size; bind $size to the literal
none provided.
Resolve the goal. Take the remaining argument and conversation context as the goal this design serves. A ticket reference, issue URL, file path, or a described capability all qualify. Read the referenced material if it names a file or is fetchable from the conversation. Record the goal verbatim where it is quotable — the justification field in every later step cites it. If no goal resolves, stop and ask the user for the ticket, issue, or one-paragraph statement of what this change is for. Do not proceed without it.
Resolve the interface. Identify what is being designed: which component, function, module, route, or payload, and
where it lives. Confirm it resolves to real files using Glob and Read. If the interface is genuinely new and has no
file yet, resolve instead the module or directory it will live in and the consumers that will call it. If neither
resolves, ask the user to name the surface before going further.
Resolve the starting point. Read the current branch and default branch values from Project Context. When
default branch reads unknown, origin/HEAD is unset and there is no base to compare against: the working tree is
the starting point, no question is asked, and the run continues. Otherwise run
git diff --name-only {default branch}...HEAD and check whether any interface file resolved above appears in the
output. Only when one does, ask the user in one short message whether to design from the branch as it stands or from
the merge base, ignoring the branch's changes; read the merge-base state with git show when they choose the merge
base. In every other case — no interface file changed on the branch, git unavailable, or the command fails — the
working tree is the starting point and no question is asked. State the chosen starting point in one line.
Resolve project context. If CLAUDE.md is present, read its ## Project Discovery section for conventions. Fall
back to project-discovery.md. These resolve language, framework, and convention questions so the agents infer less. If
neither exists, the agents fall back to surrounding-code inference — note this in the briefs.
Resolve the output folder. The run writes three files: {folder}/context-brief.md, {folder}/design-options.md,
and {folder}/api-design.md. Resolve {folder} in this order:
output-directory, place the run folder under it, per
config-rule.md.CLAUDE.md, project-discovery.md, or a Glob fallback (docs/plans/, docs/).Create the folder with mkdir -p. Check all three names with Glob before writing anything. If any of the three
already exists there, write every file this run produces to a date-suffixed name (for example api-design-2026-08-07.md
alongside context-brief-2026-08-07.md and design-options-2026-08-07.md) so one run's files stay together, and state
which files were written; never silently overwrite. State the chosen folder in one short line and proceed without
waiting for confirmation.
Run targeted Grep and Glob over the interface and its consumers to detect which domains the contract actually
touches. These signals drive both the band and the roster:
Classify the size. Default to small. Escalate only when a band's signal is clearly present; when a signal is borderline, stay at the smaller band.
$size is
large.Apply the size override. If $size is not none provided, use it: a band value is the band and skips the
signal-based classification above, while dynamic forces the signal-based classification even when the project config
sets a default band. If $size is none provided and the project config supplies a band via default-swarm-size (per
config-rule.md), use that band, skip the signal-based classification, and announce
the config as the source. In every case still select specialists by signal: a large band does not dispatch agents
whose domain the contract never touches. A conversational override ("design this large") is equivalent to $size.
Spine — dispatched at every size:
han-core:codebase-explorer — discovers the current surface, its consumers, and the constraints the design has to
live inside. Feeds the context brief. Runs in Step 4.han-core:software-architect — produces the options document and every later amendment. Runs in Steps 5, 7, 8, and 9.han-core:junior-developer — questions the chosen option as a generalist who was not in the room. Runs in Step 7.han-core:adversarial-validator — attacks the amended design and the evidence under it. Runs in Step 9.Signal-selected specialists — added to the discovery wave when the signal is present and the band allows:
| Specialist | Add when | Min band |
|---|---|---|
han-core:structural-analyst | Consumer-spread signal | Medium |
han-core:behavioral-analyst | Boundary-data signal | Medium |
han-core:concurrency-analyst | Ordering signal | Medium |
han-core:data-engineer | Data-contract signal | Medium |
han-core:on-call-engineer | Failure-path signal | Medium |
han-core:system-architect | System-seam signal | Large |
han-core:adversarial-security-analyst | Trust-boundary signal | Medium |
Roster caps by band are ceilings, not quotas: small runs the spine only (4 agents); medium adds at most two
signalled specialists (up to 6 agents); large adds at most four, including han-core:system-architect when a
system-seam signal is present (up to 8 agents). A band reached by override rather than by signal can sit well under its
ceiling; add no specialist whose signal is absent just to fill the band. If more specialists are signalled than the cap
allows, keep the band's count, prefer the specialists covering the strongest signals, and name the omitted domains in
the design document's summary so the user can re-run larger.
Extra agents named in the project config's ## Extra Agents list join the signal-selected pool and compete under the
same signals and band caps, per config-rule.md: add one only when a signal in the
interface matches its stated specialty, count it against the band's cap, and skip an entry that does not resolve to a
dispatchable agent with a one-line note.
Announce the decision in one line before dispatching, with per-specialist justification — for example:
Size: medium. Designing the query-parameter prefill contract on
FlowProvider; consumer-spread signal (7 call sites) and a trust-boundary signal (values arrive from the URL). Roster (6):han-core:codebase-explorer,han-core:structural-analyst(consumer audit),han-core:adversarial-security-analyst(untrusted URL input), thenhan-core:software-architect,han-core:junior-developer, andhan-core:adversarial-validator.
State git availability in the same message if git is absent. Proceed without a blocking confirmation; discovery is read-only and re-runnable, so a gate here would gate a reversible operation. If the user objects to the roster, honor the adjustment.
Running collaboratively. When the request asks to review each round as it lands, which is what
pairing does when it hands work here, stop at this point and hand control back instead of continuing. Present the stop
in the shape collaborative-stop-rule.md specifies. Absent such a request,
continue as below; an ordinary invocation is unchanged.
For this skill a round is one dispatch step: the discovery wave, the options round, the question round, and the validation round. The two human gates below are unchanged and still fire regardless.
Launch han-core:codebase-explorer and every signalled specialist in a single message with one Agent call per agent
so they run concurrently. Each brief must contain:
Wait for the whole wave to return. Then write {folder}/context-brief.md: a numbered list of findings (F1, F2, F3, …),
each carrying the finding, its provenance (a file:line citation, or the label inferred), and the agent that reported
it. Merge duplicates and keep conflicting findings as separate numbered entries with both citations, rather than
picking a winner. Apply the evidence rule from ../../references/evidence-rule.md to
every finding. When a question the design depends on has no evidence at any tier, record it as an open item rather than
guessing, and carry it into Step 8 alongside the open items the question round produces.
If a specialist returns nothing usable or fails, record a one-line note in the context brief naming the agent and the
domain left uncovered, and continue. A missing specialist narrows the design's evidence; it does not stop the run. If
han-core:codebase-explorer returns nothing usable, relaunch it once with the interface's file paths spelled out. If
the second attempt also returns nothing, stop and tell the user the interface could not be discovered, naming the paths
that were searched.
Launch han-core:software-architect with one Agent call. Pass it the stated goal verbatim, the full context brief,
and the resolved project conventions. Its brief must ask for:
Write the returned options to {folder}/design-options.md.
If the architect returns one option, or returns options whose elements carry no justification, relaunch it once with the missing requirement restated. If the second attempt still returns one option, carry that option forward and record in the design document that only one viable option was produced, with the architect's stated reason. If the second attempt still leaves elements unjustified, do not carry those elements: move each one to the cut list with what it would have done and the note that no justification was produced for it, so the gap reaches the user in Step 6 rather than passing as designed.
Before writing the question, invoke han-communication:explanation-guidance to source the shared explanation standard
into your context. After that skill returns, proceed immediately to the question below — do not stop there. The
standard stays in context for Step 8, so do not invoke it a second time.
Present the options to the user with AskUserQuestion: one option per choice, the recommendation named first and
labelled as recommended, each with its one-line reasoning. Apply the explanation standard to the wording, so each option
reads as an outcome the user could observe rather than a mechanism. Include the cut list in the surrounding message so
the user sees what the design is giving up.
Handle the response:
Launch han-core:junior-developer with one Agent call. Pass it the stated goal verbatim, the context brief, and the
chosen option in full. Its brief must ask it to reframe the contract in simpler terms and raise the clarifying questions
a generalist who was not in the room would ask: unstated prerequisites, conflicts with the project's own conventions,
names that do not say what they hold, and behavior the contract leaves undefined. Ask for numbered questions.
Sort the returned questions into three buckets:
Then relaunch han-core:software-architect with one Agent call, passing the chosen option, every question, and the
answers from buckets 1 and 2, and ask it to amend the design accordingly. Hold the open items until Step 8 answers
them.
If Step 7 and Step 4 left no open item, say so in one line, skip this gate, and go straight to Step 9. The gate exists to settle open items; with none to settle it has nothing to ask and no answer to fold in.
Otherwise surface the open items — those the question round produced in Step 7, plus any no-evidence item recorded in
Step 4 — one at a time, each as its own AskUserQuestion call. Never batch them BECAUSE
each answer routinely settles or reshapes the ones behind it, and a batch asks the user to decide in an order the design
does not follow.
Apply the explanation standard already in your context from Step 6 to each question's wording. Each question leads with the plain-language consequence of the choice, names two to four candidate answers, and says what changes in the contract depending on the answer. After each answer, re-check the remaining open items: drop the ones the answer just settled, and re-word the ones it changed.
When every open item is answered, relaunch han-core:software-architect with one Agent call carrying the answers, and
have it fold them into the amended design. Record each answer in the design document as the justification for the
elements it settles.
Launch han-core:adversarial-validator with one Agent call. Pass it, verbatim and unsummarized, the stated goal, the
full context brief with every finding and its citation, the amended design with its justifications, and the cut list.
Do not summarize — the validator needs the detail to attack effectively. Its job is to try to break the contract: find
the consumer the design forgets, the input state it does not define behavior for, the invariant a caller can violate,
the justification that does not actually follow from the goal, and the finding whose evidence does not support what the
design built on it.
Record its output as numbered validation findings (V1, V2, V3, …), and mark each one:
han-core:software-architect a single time
carrying all accepted findings together, and record what changed for each.If the validator finds nothing, record what it checked and why that supports the design. A clean validation round is a result, not an empty section.
Cap the revision at one round. If the revised design would open new open items, list them in the design document's Open Risks section rather than starting another gate cycle.
Read references/api-design-template.md and render it into
{folder}/api-design.md. Render rules:
Then invoke han-communication:readability-guidance to source the shared readability standard into your context. After
that skill returns, proceed immediately to the rewrite below — do not stop there. Dispatch
han-communication:readability-editor with one Agent call to audit and rewrite the document. Pass it the
file path and the named audience: the engineer who will implement this contract and the reviewer who will approve it.
The editor reads han-communication's own canonical rule, so pass no rule path. It preserves every fact and edits prose
regions only — never inside code fences, pseudocode sketches, type signatures in code blocks, or finding-ID and
file:line citation identifiers. Apply its rewrite to the file.
Then run the readability rule's standardized self-check, which is in your context from the readability-guidance
invocation above, over the document's prose regions only. Correct every failure before presenting. Its fidelity
criterion is not optional: the standard governs how the content is said, and drops a required fact only when the reader
asked for less and losing it would not change what they do next.
Present the design to the user in a short closing message covering:
tdd run that implements the contract.© testdouble, MIT. 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 han-coding/skills/design-an-api of testdouble/han.
Open the folder on GitHubat commit abba73a
Design An API 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 |
|---|---|---|---|---|---|---|
| Design An API this skilltestdouble/han | 279 | — | ~7k | Automated safety check: Pass | MIT | |
| Deskcomm Contribuirmelgarafael/DeskcommCRM | 4.5k | — | ~3.6k | Automated safety check: Notes | MIT | |
| Adk Setupgoogle/adk-python | 22k | — | ~993 | Automated safety check: Notes | Apache-2.0 | |
| Bktavivsinai/bitbucket-cli | 232 | 1 repos | ~1k | Automated safety check: Pass | MIT | |
| Breaking Change Analysisruby-git/ruby-git | 1.8k | — | ~1.7k | Automated safety check: Pass | MIT | |
| Find Regression Riskdotnet/maui | 23k | — | ~1.1k | Automated safety check: Pass | MIT |
melgarafael/DeskcommCRM
Guia de contribuição ao DeskcommCRM para quem vai mexer no código e abrir um pull request, sobretudo de um fork.
google/adk-python
Sets up a local ADK Python development environment in a git clone of the open-source adk-python repository: a uv virtual environment, all dependency extras, pre-commit hooks, and a first unit-test…
avivsinai/bitbucket-cli
Operate Bitbucket Cloud or Data Center repositories, pull requests, branches, issues, pipelines, permissions, and webhooks with bkt.
ruby-git/ruby-git
Assesses what an API change would break before it is made, finds every usage, documents the impact and plans a deprecation or migration path.
dotnet/maui
Checks a pull request for lines that undo a recent bug fix by comparing what the PR removes with what labeled bug-fix PRs added to the same files.
handsontable/handsontable
Builds two throwaway HTML test pages for a Handsontable pull request, one on the released CDN version and one on the local build, to compare behavior side by side.
testdouble/han
Convert a stakeholder summary markdown file into a single self-contained HTML executive report — bottom line and decision asks up front, supporting detail later — styled with a Test Double-derived…
testdouble/han
Update Han plugin documentation so every skill, agent, guidance doc, index, and cross-reference is current and accurate.
testdouble/han
Authoritative guidance for building Claude Code skills, agents, and plugins, plus init and update steps that install and refresh the plugin-building skills in the current repository.
testdouble/han
Cut a Han release: update CHANGELOG.md with the changes since the last release, bump and tag every plugin that changed as {plugin-name}--v{version} so a version-constrained dependency can resolve…
testdouble/han
Generate a PR description from the current branch's changes against a GitHub PR, using the gh CLI.
testdouble/han
Builds a feature implementation plan from an existing feature specification (or equivalent context) through a facilitated team conversation.
Works with
Categories
Designs the contract for an API change inside one codebase — a component's props, a function surface, URL or query parameters, an event payload, or a module boundary — through a discovery pass, an…. Design An API is an agent skill from testdouble/han. Designs the contract for an API change inside one codebase — a component's props, a function surface, URL or query parameters, an event payload, or a module boundary — through a discovery pass, an options document with one recommendation, a question round, and an adversarial validation round, with every element of the contract justified from one stated goal.
Design An API fits situations like: you want to design; nail down an interface; API change for a capability you can already describe; sized for roughly one pull request.
Run `npx skills add testdouble/han --skill design-an-api -a claude-code`. Or copy the skill folder (han-coding/skills/design-an-api in testdouble/han) into .claude/skills/design-an-api in your project. Claude Code loads it when a task matches its description.
Run `npx skills add testdouble/han --skill design-an-api -a codex`. Or copy the skill folder (han-coding/skills/design-an-api in testdouble/han) into .agents/skills/design-an-api 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 testdouble/han --skill design-an-api -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/design-an-api, .gemini/skills/design-an-api, .github/skills/design-an-api and .opencode/skills/design-an-api in your project.
Going by SKILL.md and its folder, Design An API needs the command-line tools its instructions call (git and bash). Its frontmatter pre-approves these tools: Read, Write, Glob, Grep, Agent, Bash(git *), Bash(find *), Bash(mkdir *), Bash(bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh").
SKILL.md contains no URLs. Its commands use git, 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.
Design An API is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7k tokens (SKILL.md is roughly 28k 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 1.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Design An API: Deskcomm Contribuir (melgarafael/DeskcommCRM, 4.5k stars), Adk Setup (google/adk-python, 22k stars), Bkt (avivsinai/bitbucket-cli, 232 stars) and Breaking Change Analysis (ruby-git/ruby-git, 1.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
testdouble (a GitHub organization) maintains it in testdouble/han, which has 279 GitHub stars. The repository holds 54 skills in this directory. The repository was last updated on October 1, 2026.
Source: testdouble/han on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.