Agent skill

Circuitjs

by autonomous-ai in autonomous-ai/openharness

Write and fix circuits in CircuitJS1's text format — the $ options header, element lines on a 16-px grid, scope o lines, slider 38 lines, layout rules, and the workflow that keeps the pane moving.

MITAuto-check passed

Install Circuitjs

skills CLI
$ npx skills add autonomous-ai/openharness --skill circuitjs -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install autonomous-ai/openharness circuitjs --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/store/agents/circuitjs/skills/circuitjs .claude/skills/circuitjs && rm -rf skills-src

Use ~/.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/

Facts

Skill name
circuitjs
GitHub stars
1.2k
Token cost
~3.2k tokens
SKILL.md length
1,938 words
Files
11
Skills in repo
99
Repo updated
First seen
Licence
MIT

At a glance

Write and fix circuits in CircuitJS1's text format — the $ options header, element lines on a 16-px grid, scope o lines, slider 38 lines, layout rules, and the workflow that keeps the pane moving.

  • Works in 7 steps: Signal flows left to right. Source on… → Supplies at the top, ground at the… → Everything on the 16-px grid, and prefer… → …
  • SKILL.md covers The $ options header, Element lines, Scope lines: o and Slider lines: 38, plus 5 more sections
  • Calls python3

What it does

Circuitjs is an agent skill from autonomous-ai/openharness. Write and fix circuits in CircuitJS1's text format — the $ options header, element lines on a 16-px grid, scope o lines, slider 38 lines, layout rules, and the workflow that keeps the pane moving. Use this for every circuit in this workspace, whether writing a new circuit.txt, editing one, or reading the verdict's findings.

Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files (for example `examples/README.md`).

The repository describes itself as: The ultimate harness for coding agents and beyond. All your agents. All your machines. One command center. Start with code, then follow your curiosity and build across… The licence is MIT.

Example prompts

  • “/circuitjs”

Requirements

  • Python 3

Workflow steps

7 steps, taken from the first numbered list in SKILL.md.

  1. Signal flows left to right. Source on the left, load or output on the right.
  2. Supplies at the top, ground at the bottom. Put the g at the lowest point of the circuit and
  3. Everything on the 16-px grid, and prefer multiples of 32 or 48 for the spacing between
  4. One axis at a time. Wires are horizontal or vertical; turn a corner with a second w rather
  5. Keep it around 500 × 400. The pane fits that without scrolling; the app centres what it gets.
  6. Label the nodes that matter with x text, or use 207 labeled nodes instead of long wires
  7. Leave the scope elements' indices alone — append, don't insert.

What it can do on your machine

Read from SKILL.md and the folder at commit 74c2733. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Circuitjs loads about 3.2k tokens when it runs. Until then it costs about 86 tokens; SKILL.md has 1,938 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~86
When it runs · the whole SKILL.md, loaded when a task matches
~3.2k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from autonomous-ai/openharness at commit 74c2733, republished under its MIT licence (© autonomous-ai). 1,938 words, ~3,176 tokens.

Download SKILL.mdSave it as .claude/skills/circuitjs/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.
name
circuitjs
description
Write and fix circuits in CircuitJS1's text format — the `$` options header, element lines on a 16-px grid, scope `o` lines, slider `38` lines, layout rules, and the workflow that keeps the pane moving. Use this for every circuit in this workspace, whether writing a new `circuit.txt`, editing one, or reading the verdict's findings.

CircuitJS1's circuit format

A circuit is one plain-text file. Each line is either the options header, one element, one scope, or one slider. That is the whole format. CircuitJS1 reads it with a tokenizer that splits on spaces and gives up on a line it cannot make sense of, so a wrong field is a missing element, not an error message — which is why verdict.py exists.

$ 1 0.000005 10.20027730826997 50 5 43 5e-11
v 176 224 176 112 0 1 40 5 0 0 0.5
r 176 112 336 112 0 1000
c 336 112 336 224 0 0.00001 0
w 176 224 336 224 0
g 176 224 176 256 0
o 2 64 0 2 5 0.0125

That is a working RC low-pass: a 5 V sine into 1 kΩ, across 10 µF, with the capacitor on the scope. Everything else is more of the same.

The $ options header

One line, first, always.

$ <flags> <maxTimeStep> <iterations> <currentSpeed> <voltageRange> [<powerBrightness> <minTimeStep>]
FieldWhat it doesSane value
flags1 show current dots, 2 small (8-px) grid, 4 hide voltage colour, 8 show power, 16 hide values, 64 adaptive timestep, 128 auto-DC on reset1
maxTimeStepseconds per simulation step0.000005 (5 µs)
iterationshow fast it runs on screen: steps per second ≈ 160 × this. At 5 and a 5 µs step the simulator advances about 4 ms of circuit time per second of wall clock, so a 300 Hz oscillator reads as a ~1 Hz blink5 to 10
currentSpeedhow fast the charge dots move50
voltageRangevolts per full colour swing5 (or the supply)
powerBrightness, minTimeStepoptional43 5e-11

iterations is the dial that makes a circuit watchable. Slow it down (2) for something that should visibly blink; leave it (10) for a waveform on a scope.

Element lines

<code> <x1> <y1> <x2> <y2> <flags> [values…]

Everything after flags belongs to that element and differs per code. Coordinates are integers on a 16-px grid — CircuitJS1 snaps to it, and two ends that are not on it will not meet.

Elements connect only by sharing a coordinate. There are no net names and no explicit connections: two posts at exactly the same (x, y) are the same node. Crossing wires that do not share an endpoint do not touch. w is an ideal wire and exists purely to move a node somewhere else on the canvas.

Where an element's posts are
ShapePosts
Two-terminal — r c l d z v i w s m p I 162 175 176 181 182 183 187 203 209 216 350 370 374 404 415 422 425 426exactly (x1,y1) and (x2,y2)
One-terminal — g R O L M A n 170 172 200 201 207 210 211 368 408 411 418 424(x1,y1) only; (x2,y2) is just which way it points
Decoration — x b 403 423none
Everything else (chips, transistors, op-amps, pots, transformers)at offsets the app computes — see below
The ones you will actually write
CodeElementFields after flags
wwire(none)
rresistorresistance
ccapacitorcapacitance voltdiff [initialVoltage [seriesResistance]] (the last needs flag 4)
linductorinductance current [initialCurrent saturationCurrent]
ddiodemodelName when flag 2 is set (default, zener, 1N4004, led-*); with flags 0 the default silicon diode and no fields
zzenerzenerVoltage with flags 0
vvoltage sourcewaveform frequency maxVoltage bias phaseShift dutyCycle
Rrail (one-terminal source)same six as v
ggroundsymbolType (0 normal, 1 chassis, 2 signal, 3 earth)
sswitchposition momentary [label] — 0/1 or false/true, label needs flag 4
Ooutput (voltmeter label)scale (0 auto)
pprobemeter scale resistance
162LEDdiode fields, then red green blue [maxBrightnessCurrent] — 1 0 0 is red
207labeled nodename — every 207 with the same name is the same node, wire-free
xtextsize escapedText — flags 4, spaces written \s
170sweep sourceminF maxF maxV sweepTime
174potentiometermaxResistance position sliderLabel

Waveforms for v and R: 0 DC, 1 sine, 2 square, 3 triangle, 4 sawtooth, 5 pulse, 6 noise. frequency is in hertz, maxVoltage is the amplitude, bias the offset, phaseShift radians, dutyCycle a fraction. A 5 V DC supply is v x1 y1 x2 y2 0 0 40 5 0 0 0.5 — the 40 is a leftover frequency that DC ignores. Post 0 is (x1,y1), the negative end; post 1 is the positive end. Look at the examples before inventing a value.

Placing an op-amp, a transistor or a chip

Their pins are not at the line's own ends, so writing the wires around them by hand is the one place this format bites. Two that are worth knowing exactly, both drawn left to right at the default size:

  • Op-amp a x1 y1 x2 y2 flags [maxOut minOut gbw v0 v1 gain] — inputs at (x1, y1−16) and (x1, y1+16), output at (x2, y2). With flags 0 the upper input is the inverting (−) one; flags 1 swaps them. See examples/amp-invert.txt (flags 0) and examples/amp-noninvert.txt.
  • Transistor t x1 y1 x2 y2 flags type vbe vbc beta [model] — type is 1 for NPN and -1 for PNP. Base at (x1, y1); for an NPN with flags 0, collector at (x2, y2−16) and emitter at (x2, y2+16). flags 1 flips them, and PNP swaps them. beta is usually 100. See examples/npn.txt.

For anything with a body — the 555 (165), counters, gates, flip-flops, transformers, pots — do not compute the pins. Copy the whole block, chip line and surrounding wires together, out of an example, and if you need it somewhere else add the same offset to every coordinate in the block. The verdict will tell you the ends that stopped meeting. template/circuit.txt is exactly this: the 555 and its wires lifted unchanged out of examples/555square.txt, with an LED branch added on the output node.

Scope lines: o

A scope is what makes the pane worth looking at. Put at least one on every circuit.

o <element> <speed> <value> <flags> <scaleV> <scaleA> [position]
  • element is an index, counting only element lines, from 0. The commonest mistake in the whole format. Insert an element in the middle and every scope below it is watching the wrong thing — so append new elements at the end rather than inserting, or renumber every o and 38 line.
  • speed — simulation steps per pixel column. 64 is a good default; larger sweeps slower.
  • value — 0 voltage, 3 current, 7 power. For a transistor: 1 Ib, 2 Ic, 4 Vbe, 6 Vce.
  • flags — 1 plot current, 2 plot voltage, 8 show frequency, 256 show minimum, 512 show the scale, 8192 auto-scale. 3 (both traces) is a good default.
  • scaleV, scaleA — volts and amps per division.
  • position — which stacked slot, from 0.

o 2 64 0 3 5 0.0125 reads: watch element 2, 64 steps per column, plot its voltage and current, 5 V and 12.5 mA per division. Files saved by the app itself set flag 4096 and write a longer, multi-plot form; both load, and the short one above is the one to write by hand.

Show full SKILL.md (851 more words)Show less

Slider lines: 38

A knob in the app's right-hand column. The user turning it while the sim runs is most of the fun.

38 <element> F<flags> <editItem> <min> <max> <label> <step>

element is the same index as a scope's. editItem is which of that element's editable values the slider drives, from 0 — 0 is the primary one (a resistor's resistance, a capacitor's capacitance). F0 is plain, F2 logarithmic. Spaces in the label are written \s; step is 0 for a smooth knob. 38 0 F0 0 1 101 Resistance 0 puts a 1 Ω – 101 Ω knob on element 0. See examples/lrc.txt.

No -1 before the label. The app's own export writes a sharedWith field there, but the loader only reads it when the flags say the knob is shared (F1); after F0 or F2 the -1 becomes the knob's label and the pane shows a slider called "-1". The verdict warns about it.

Other line types

h a hint the app shows, ! a custom-logic model, . a composite-subcircuit model, 32 and 34 transistor and diode model definitions. Copy them when you copy a block; do not write them fresh.

Laying it out

The drawing is the explanation, so lay it out the way a schematic is read.

  1. Signal flows left to right. Source on the left, load or output on the right.
  2. Supplies at the top, ground at the bottom. Put the g at the lowest point of the circuit and run the return wire along the bottom.
  3. Everything on the 16-px grid, and prefer multiples of 32 or 48 for the spacing between parallel branches — a two-terminal part wants about 64–160 px of room.
  4. One axis at a time. Wires are horizontal or vertical; turn a corner with a second w rather than one diagonal.
  5. Keep it around 500 × 400. The pane fits that without scrolling; the app centres what it gets.
  6. Label the nodes that matter with x text, or use 207 labeled nodes instead of long wires across the canvas.
  7. Leave the scope elements' indices alone — append, don't insert.

How to work

The pane is live: it re-imports circuit.txt on every save without reloading the app, keeping the simulation running. So save early and often, and let the user watch it grow.

  1. Source and ground first. v (or R), g, and the return wire. Save. Run the verdict. The pane already shows something running.

  2. Then the circuit proper, one branch at a time, saving after each. Two-terminal parts are the easy path; reach for a chip only when the circuit really is one.

  3. Then a scope on the output node, and a slider on the value worth turning. Say in one line which knob you gave them.

  4. Run the verdict after every save:

    sh
    python3 "$CIRCUITJS_TOOLCHAIN/verdict.py"            # circuit.txt
    python3 "$CIRCUITJS_TOOLCHAIN/verdict.py" other.txt

    Errors mean CircuitJS1 will drop a line: an unknown code, a truncated element, a scope pointing past the last element. Fix those. Warnings are usually real too — a floating end is a part that is not in the circuit, an off-grid coordinate is two ends that look joined and are not. An open_end info on a circuit that contains a chip or a transistor is expected: that end is a pin the checker cannot see.

  5. Never write the XML dump. exportCircuit() in the app returns XML; this workspace is the text format, which the app still reads and a human can still edit.

  6. Use kept Scope Lab captures as feedback. The pane can run an isolated native copy, record node voltage or component voltage/current, overlay another take, and keep exact circuits, CSV/JSON samples, a trace and notes under .harness/circuit-captures/<id>/. Read the selected packet before revising the circuit; in-pane changes may differ from the source. Edit the original plain-text file and preserve the packet. Its native XML is for simulator import, not a replacement workspace format. Keep node names and element indices stable for comparison. Treat measurements as sampled simulation results, with the recorded timestep and duration; a new capture has its own time origin and can have different initial transients.

When something does not work

What you seeUsually
A part is missing from the paneits line had a bad field and the loader skipped it; check the field count against the table
Two parts look joined but nothing flowstheir ends differ by a few pixels, or one is off the grid
"Capacitor loop with no resistance" or a hangadd a small series resistance, or a resistor in the loop
Everything reads 0 Vno ground: add a g, or the source's negative end is not the reference
The scope is flatit is watching the wrong element index — count the element lines again
It runs far too fast or slow to seechange iterations in the $ line, not the circuit

Examples

examples/ holds eight of CircuitJS1's own circuits, unchanged (GPL-2.0, © Paul Falstad and Iain Sharp) — see examples/README.md for what each one is worth reading for. The installed app has all 373 in its Circuits menu; open one in the pane, poke at it, and copy the lines you want.

© autonomous-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 10 other files in store/agents/circuitjs/skills/circuitjs of autonomous-ai/openharness.

  • SKILL.md
  • examples/555square.txt
  • examples/README.md
  • examples/amp-invert.txt
  • examples/amp-noninvert.txt
  • examples/filt-lopass.txt
  • examples/ledflasher.txt
  • examples/lrc.txt
  • examples/npn.txt
  • examples/rectify.txt
  • examples/voltdivide.txt

Open the folder on GitHubat commit 74c2733

Compare with similar skills

Circuitjs 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.

Circuitjs compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Circuitjs this skillautonomous-ai/openharness1.2k—~3.2kAutomated safety check: PassMIT
Optionsasgeirtj/system_prompts_leaks69k—~918Automated safety check: PassCC0-1.0
Options Strategy BacktestingHKUDS/Vibe-Trading35k—~2kAutomated safety check: PassMIT
Remove Option Or Flaggetsentry/sentry46k—~3kAutomated safety check: PassCustom licence
Options PayoffHKUDS/Vibe-Trading35k—~6.8kAutomated safety check: PassMIT
Add CLI Optionremotion-dev/remotion63k—~1.5kAutomated safety check: PassCustom licence

Similar skills

  • Options

    asgeirtj/system_prompts_leaks

    Present multiple design options as a vertical stack of anchored turns

    69k GitHub stars~918 tokensUpdated yesterday
    Auto-check passed
  • Backtests multi-leg option strategies by synthesizing Black-Scholes prices from the underlying, simulating PnL, Greeks exposure and expiration for crypto and equity options.

    35k GitHub stars~2k tokensUpdated today
    Business, Finance & HRAuto-check passed
  • Remove Option Or Flag

    getsentry/sentry

    Official

    Remove a Sentry option or FlagPole feature flag whose rollout is finished, in the correct PR order across sentry, getsentry, and sentry-options-automator.

    46k GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Options Payoff

    HKUDS/Vibe-Trading

    Option P&L analysis methodology: payoff diagrams, breakeven calculation, multi-leg strategy visualization, and Greeks-based scenario analysis.

    35k GitHub stars~6.8k tokensUpdated today
    Business, Finance & HRAuto-check passed
  • Add CLI Option

    remotion-dev/remotion

    Official

    Add a new Remotion CLI or config option by creating an AnyRemotionOption, registering CLI parsing, wiring config setters, and updating documentation.

    63k GitHub stars~1.5k tokensUpdated today
    Media & CreativeAuto-check passed
  • Official

    A skill your agent uses when biome migrate eslint must preserve configurable ESLint rule options through source-option models, Biome conversions, typed rule variants, and migration fixtures.

    26k GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed

More from autonomous-ai/openharness

All 99 skills in this repo
  • G-code Slicer Tool

    autonomous-ai/openharness

    Slices 3D mesh files into printer-profiled plain G-code through real slicer CLIs, with backend discovery, input inspection, dry runs and static validation.

    1.2k GitHub stars~1.5k tokensUpdated today
    Auto-check passed
  • Home Assistant Automation Builder

    autonomous-ai/openharness

    Turns a home-automation request into standard, testable automations.yaml, run against Home Assistant Core's real triggers and verified with its own trace tool.

    1.2k GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Score Music Composer

    autonomous-ai/openharness

    Turns a musical brief into LilyPond concert-pitch music, checked parts for each instrument and a playable practice pack.

    1.2k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • OrcaSlicer 3MF and G-code Workflow

    autonomous-ai/openharness

    Turns an STL and explicit printer and material requirements into compared OrcaSlicer plans, an editable 3MF project, checked G-code and a portable handoff.

    1.2k GitHub stars~1.5k tokensUpdated today
    Auto-check passed
  • Sheets and Docs Report Builder

    autonomous-ai/openharness

    Builds an editable DOCX report, a formula-driven XLSX workbook and a fresh LibreOffice PDF preview from one structured source file, then checks them together.

    1.2k GitHub stars~708 tokensUpdated today
    Auto-check passed
  • Bambu Labs

    autonomous-ai/openharness

    Dry-run, upload, and cautiously initiate local Bambu Lab print jobs from validated plain .gcode, using Bambu LAN FTPS/MQTT handoffs.

    1.2k GitHub starsUsed in 1 repo~2.1k tokens
    Auto-check: warnings

Questions about Circuitjs

What does Circuitjs do?

Write and fix circuits in CircuitJS1's text format — the $ options header, element lines on a 16-px grid, scope o lines, slider 38 lines, layout rules, and the workflow that keeps the pane moving. Circuitjs is an agent skill from autonomous-ai/openharness. Write and fix circuits in CircuitJS1's text format — the $ options header, element lines on a 16-px grid, scope o lines, slider 38 lines, layout rules, and the workflow that keeps the pane moving.

How do I install Circuitjs in Claude Code?

Run `npx skills add autonomous-ai/openharness --skill circuitjs -a claude-code`. Or copy the skill folder (store/agents/circuitjs/skills/circuitjs in autonomous-ai/openharness) into .claude/skills/circuitjs in your project. Claude Code loads it when a task matches its description.

How do I install Circuitjs in Codex?

Run `npx skills add autonomous-ai/openharness --skill circuitjs -a codex`. Or copy the skill folder (store/agents/circuitjs/skills/circuitjs in autonomous-ai/openharness) into .agents/skills/circuitjs in your project. Codex loads it when a task matches its description.

Can I use Circuitjs in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add autonomous-ai/openharness --skill circuitjs -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/circuitjs, .gemini/skills/circuitjs, .github/skills/circuitjs and .opencode/skills/circuitjs in your project.

What does Circuitjs need to run?

Going by SKILL.md and its folder, Circuitjs needs the command-line tools its instructions call (python3). Our summary lists: Python 3.

Does Circuitjs access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Circuitjs safe to install?

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.

What licence does Circuitjs use?

Circuitjs is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Circuitjs use?

About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Circuitjs?

Skills that share tags, products or a category with Circuitjs: Options (asgeirtj/system_prompts_leaks, 69k stars), Options Strategy Backtesting (HKUDS/Vibe-Trading, 35k stars), Remove Option Or Flag (getsentry/sentry, 46k stars) and Options Payoff (HKUDS/Vibe-Trading, 35k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Circuitjs?

autonomous-ai (a GitHub organization) maintains it in autonomous-ai/openharness, which has 1,194 GitHub stars. The repository holds 99 skills in this directory. The repository was last updated on October 9, 2026.

Source: autonomous-ai/openharness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.