Vercel Composition Patterns
supabase/supabase
React composition patterns that scale. An agent skill from supabase/supabase.
Interacts with a running lightjj instance (browser-based Jujutsu/jj viewer) via the lightjj api CLI.
$ npx skills add chronologos/lightjj --skill lightjj -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install chronologos/lightjj lightjj --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/chronologos/lightjj.git skills-src && mkdir -p .claude/skills && cp -r skills-src/cmd/lightjj .claude/skills/lightjj && 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 "lightjj" agent skill from https://github.com/chronologos/lightjj/tree/main/cmd/lightjj into .claude/skills/lightjj/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lightjj", 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/chronologos/lightjj/tree/main/cmd/lightjjType 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 chronologos/lightjj --skill lightjj -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install chronologos/lightjj lightjj --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/chronologos/lightjj.git skills-src && mkdir -p .agents/skills && cp -r skills-src/cmd/lightjj .agents/skills/lightjj && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "lightjj" agent skill from https://github.com/chronologos/lightjj/tree/main/cmd/lightjj into .agents/skills/lightjj/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lightjj", 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 chronologos/lightjj --skill lightjj -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install chronologos/lightjj lightjj --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/chronologos/lightjj.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/cmd/lightjj .cursor/skills/lightjj && 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 "lightjj" agent skill from https://github.com/chronologos/lightjj/tree/main/cmd/lightjj into .cursor/skills/lightjj/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lightjj", 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/chronologos/lightjj.git --path cmd/lightjj--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 chronologos/lightjj --skill lightjj -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install chronologos/lightjj lightjj --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/chronologos/lightjj.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/cmd/lightjj .gemini/skills/lightjj && 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 "lightjj" agent skill from https://github.com/chronologos/lightjj/tree/main/cmd/lightjj into .gemini/skills/lightjj/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lightjj", 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 chronologos/lightjj lightjjInstalls 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 chronologos/lightjj --skill lightjj -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/chronologos/lightjj.git skills-src && mkdir -p .github/skills && cp -r skills-src/cmd/lightjj .github/skills/lightjj && 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 "lightjj" agent skill from https://github.com/chronologos/lightjj/tree/main/cmd/lightjj into .github/skills/lightjj/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lightjj", 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 chronologos/lightjj --skill lightjj -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install chronologos/lightjj lightjj --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/chronologos/lightjj.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/cmd/lightjj .opencode/skills/lightjj && 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 "lightjj" agent skill from https://github.com/chronologos/lightjj/tree/main/cmd/lightjj into .opencode/skills/lightjj/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "lightjj", 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.
lightjjInteracts with a running lightjj instance (browser-based Jujutsu/jj viewer) via the lightjj api CLI.
Lightjj is an agent skill from chronologos/lightjj. Interacts with a running lightjj instance (browser-based Jujutsu/jj viewer) via the lightjj api CLI. Reads diffs, posts inline review comments, posts doc-mode suggestions, and steers the user's view. Use when the user has lightjj running and wants the agent to review changes, annotate diffs, or comment on markdown docs.
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 14 other files.
It sits in Development. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 42427a1. 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.
Ships script files (Go), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom 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.
Lightjj loads about 2.3k tokens when it runs. Until then it costs about 83 tokens; SKILL.md has 885 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 chronologos/lightjj at commit 42427a1, republished under its MIT licence (© chronologos). 885 words, ~2,253 tokens.
.claude/skills/lightjj/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.lightjj is a browser-based UI for Jujutsu (jj)
version control. The browser is for the user — do NOT open URLs or screenshot
it. Use lightjj api to read and write through the same HTTP API the browser
uses. It auto-discovers the running instance, sets headers correctly, and works
in harnesses that denylist curl.
If no lightjj is running, ask the user to start it (lightjj in a jj repo) —
do not start it yourself.
1. lightjj sessions # confirm a session exists, find its repo
2. lightjj api GET /tab/0/api/agent # full API contract (markdown) — read once
3. lightjj api GET /tab/0/api/capabilities # probe feature availabilityGET /api/agent is the source of truth for endpoints, request/response schemas,
and the comment/suggestion model. Read it before guessing routes — it describes
the doc-comment store, the navigate endpoint, and the review-comment store.
lightjj api [flags] METHOD PATH [BODY]
METHOD GET | POST | PUT | DELETE | PATCH
PATH /tab/{N}/api/... (sent as written) or /api/... (aimed at the
tab whose repo contains your cwd). Root-only: /tabs, /api/config.
Tab 0 is the launch repo.
BODY literal JSON | @file | "-" for stdinFull reference (flags, exit codes): lightjj api --help / GET /api/agent.
Quote query strings — bare & backgrounds the shell:
lightjj api GET '/tab/0/api/file-show?revision=@&path=docs/DESIGN.md'# What is the user looking at right now? Read this FIRST — it's the difference
# between narrating a review and spraying comments past the user's cursor.
# Returns {change_id, commit_id, active_view, doc_file_path, updated_at}.
# Stale if updated_at is >60s old (browser closed or not focused) — the
# frontend heartbeats every 20s while the tab is visible.
lightjj api GET /tab/0/api/focus
# Read the current revision graph (commit metadata, descriptions, bookmarks)
lightjj api GET /tab/0/api/log
# Read a file at a revision
lightjj api GET '/tab/0/api/file-show?revision=@&path=src/main.go'
# Read existing doc-mode comments on a markdown file
lightjj api GET '/tab/0/api/doc-comments?path=docs/DESIGN.md'
# Post a doc-mode comment (range-anchored on rendered text — see /api/agent
# for the anchor schema). Set "author" so the UI marks it as agent-posted.
lightjj api POST /tab/0/api/doc-comments @comment.json
# Steer the user's view to a file/line, or to a comment by id
lightjj api POST /tab/0/api/navigate '{"file_path":"src/main.go","line":42}'
lightjj api POST /tab/0/api/navigate '{"change_id":"xyzabc","comment_id":"a1b2c3"}'
# Read inline review comments (annotations) on a change. Note: camelCase param.
lightjj api GET '/tab/0/api/annotations?changeId=xyzabc'
# Post a diff-line review comment. Same store the user's Alt+click writes to.
# severity: must-fix | suggestion | question | nitpick | reviewed
lightjj api POST /tab/0/api/annotations '{"id":"a1","changeId":"xyzabc",
"filePath":"src/main.go","lineNum":42,"lineContent":"func main() {",
"comment":"missing error check","severity":"suggestion","author":"agent-name"}'A review is multi-turn — the user reads your comments, accepts some, marks others won't-fix, and may post their own. Be a good participant:
Set author on everything you post. Both /api/annotations and
/api/doc-comments take an author field. Use a stable name (your harness
or model name). The UI renders agent comments with a ⟐ prefix and lets the
user hide-by-author. Without it, your comments look like the user's own and
you can't tell yours apart on re-read.
Read before writing. GET the existing comments for the file/change
before posting. The store upserts by id — a re-POST with a fresh UUID is
a duplicate, not an update. To update, re-POST with the same id.
Re-read after the user reviews. Poll /api/annotations?changeId=... or
/api/doc-comments?path=... and check resolution on the comments you
posted. "addressed" = accepted, "wontfix" = rejected, absent = still
open. There is no "review finished" signal — poll until your ids resolve,
or agree a convention with the user.
Respect won't-fix. Don't re-post a finding the user marked
resolution: "wontfix". They saw it and decided.
Don't write /api/focus. It's the frontend's report of what the user
is looking at — POSTing to it forges that report and lies to yourself on
the next read. Use /api/navigate to steer the user; /api/focus to
read where they are.
When you've made or found a change the user should look at, hand them a URL
instead of (or as well as) steering with navigate — it works even if their
browser tab is closed, and it's the fallback when navigate returns 409
(no browser is viewing the tab you targeted). Take the address from
lightjj sessions:
http://127.0.0.1:54321/?change=wqnwkozp
http://127.0.0.1:54321/?change=wqnwkozp&path=src/main.go
http://127.0.0.1:54321/?revset=trunk()..wqnwkozp # a range / several changes
http://127.0.0.1:54321/?change=wqnwkozp&revset=mine() # filter, then select within itchange — a change id or commit id; the short unique prefixes jj prints are
fine. If it isn't in the user's current view, lightjj widens the revset once
to <id> | @ | trunk() and selects it; if it still can't be found (or the
prefix is ambiguous) the previous view is restored and the user sees a
warning. Ids only — bookmarks, @, or expressions go in revset.revset — replaces the revset filter, exactly as if typed. Keep it scoped
(trunk()..x, mine(), ancestors(x, 20) | @) — never all() on a large repo.path — scroll that change's diff to a file.The params apply once to the launch repo (tab 0) and are then stripped from the
address bar, so a refresh returns to the plain URL. URL-encode revsets that
contain &, +, #, or spaces.
Discovery matches the agent's cwd against every open tab of each session (not
just the launch repo). Inside any repo lightjj has open, lightjj api ...
just works — and a tab-relative /api/... path is aimed at the matched tab
for you (/tab/2/api/log if your cwd is tab 2's repo; stderr names the tab
when it isn't tab 0). An explicit /tab/N/... is sent as written. A stderr
warning: ... one of them is stale means the running server and this binary
are different lightjj versions. If nothing matches:
lightjj sessions # see what's running
lightjj api --repo /path/to/other GET /tab/0/api/log
lightjj api --addr 127.0.0.1:54321 GET /tab/0/api/logA session run with lightjj --remote user@host:/repo is listed by sessions
but won't auto-match — its repo dir is a remote path. Use --addr.
curl — the entire reason lightjj api exists is that harnesses
deny curl. It also won't auto-discover the port or set Content-Type.jj commands directly when the user is reviewing in lightjj —
the snapshot loop will pick up your changes and the user's view will jump.
If you need to mutate, tell the user what you'd do and let them decide.?change= link is fine — see "Linking to a change").lightjj api GET /tab/0/api/agent documents
all of them with example payloads.no running lightjj session matches <path> — lightjj isn't running in
this repo. Ask the user to start it, or pass --repo/--addr.address ... is not loopback — --addr only accepts 127.0.0.1,
::1, or localhost. SSH tunnels: forward to a local port, then --addr 127.0.0.1:N.multiple lightjj sessions match — two instances on the same repo.
lightjj sessions, then pick one with --addr.--addr or raw curl nothing is auto-prefixed, so an unprefixed
/api/... needs an explicit /tab/0/api/...; otherwise check for a typo.Content-Type must be application/json — only happens with
curl; lightjj api sets it automatically when a body is present.changeId required — /api/annotations uses camelCase query
params (changeId, id); /api/navigate uses snake_case body fields
(change_id, file_path). They predate each other — check /api/agent.© chronologos, 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 14 other files in cmd/lightjj of chronologos/lightjj.
Open the folder on GitHubat commit 42427a1
Lightjj 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 |
|---|---|---|---|---|---|---|
| Lightjj this skillchronologos/lightjj | 168 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Vercel Composition Patternssupabase/supabase | 111k | 58 repos | ~726 | Automated safety check: Pass | MIT | |
| Finishing a Development Branchobra/superpowers | 297k | 5 repos | ~1.9k | Automated safety check: Pass | MIT | |
| Typescript Advanced Typesrolling-scopes/rsschool-app | 10k | 25 repos | ~4.2k | Automated safety check: Pass | MPL-2.0 | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Code Review ChecklistshareAI-lab/learn-claude-code | 78k | 4 repos | ~1.1k | Automated safety check: Pass | MIT |
supabase/supabase
React composition patterns that scale. An agent skill from supabase/supabase.
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
rolling-scopes/rsschool-app
Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications.
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
onyx-dot-app/onyx
Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.
Categories
Interacts with a running lightjj instance (browser-based Jujutsu/jj viewer) via the lightjj api CLI. Lightjj is an agent skill from chronologos/lightjj. Interacts with a running lightjj instance (browser-based Jujutsu/jj viewer) via the lightjj api CLI.
Lightjj fits situations like: the user has lightjj running and wants the agent to review changes; comment on markdown docs.
Run `npx skills add chronologos/lightjj --skill lightjj -a claude-code`. Or copy the skill folder (cmd/lightjj in chronologos/lightjj) into .claude/skills/lightjj in your project. Claude Code loads it when a task matches its description.
Run `npx skills add chronologos/lightjj --skill lightjj -a codex`. Or copy the skill folder (cmd/lightjj in chronologos/lightjj) into .agents/skills/lightjj 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 chronologos/lightjj --skill lightjj -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/lightjj, .gemini/skills/lightjj, .github/skills/lightjj and .opencode/skills/lightjj in your project.
Going by SKILL.md and its folder, Lightjj needs Go for the scripts in its folder.
SKILL.md names 1 domain. As links in the text: github.com. 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.
Lightjj is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Lightjj: Vercel Composition Patterns (supabase/supabase, 111k stars), Finishing a Development Branch (obra/superpowers, 297k stars), Typescript Advanced Types (rolling-scopes/rsschool-app, 10k stars) and PR Babysitter (openinterpreter/openinterpreter, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
chronologos (a GitHub user) maintains it in chronologos/lightjj, which has 168 GitHub stars. The repository was last updated on September 29, 2026.
Source: chronologos/lightjj on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.