Agent skill

Lightjj

by chronologos in chronologos/lightjj

Interacts with a running lightjj instance (browser-based Jujutsu/jj viewer) via the lightjj api CLI.

MITAuto-check passedDevelopment

Install Lightjj

skills CLI
$ npx skills add chronologos/lightjj --skill lightjj -a claude-code

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

GitHub CLI
$ gh skill install chronologos/lightjj lightjj --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/chronologos/lightjj.git skills-src && mkdir -p .claude/skills && cp -r skills-src/cmd/lightjj .claude/skills/lightjj && 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
lightjj
GitHub stars
168
Token cost
~2.3k tokens
SKILL.md length
885 words
Files
15
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Interacts with a running lightjj instance (browser-based Jujutsu/jj viewer) via the lightjj api CLI.

  • Works in 5 steps: Set author on everything you post. Both… → Read before writing. GET the existing… → Re-read after the user reviews. Poll… → …
  • The user has lightjj running and wants the agent to review changes
  • SKILL.md covers Bootstrap, Synopsis, Common operations and Review loop, plus 4 more sections
  • Runs Go scripts from its folder

What it does

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.

When your agent uses it

  • The user has lightjj running and wants the agent to review changes
  • Comment on markdown docs

Example prompts

  • “Use the lightjj skill to interact with a running lightjj instance (browser-based Jujutsu/jj viewer) via the lightjj api CLI”
  • “/lightjj”

Workflow steps

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

  1. Set author on everything you post. Both /api/annotations and
  2. Read before writing. GET the existing comments for the file/change
  3. Re-read after the user reviews. Poll /api/annotations?changeId=... or
  4. Respect won't-fix. Don't re-post a finding the user marked
  5. Don't write /api/focus. It's the frontend's report of what the user

What it can do on your machine

Read from SKILL.md and the folder at commit 42427a1. 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

    Ships script files (Go), which the agent can run.

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

  • Network

    Links to these hosts (documentation or services it may open):

    • github.com

    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

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.

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

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 chronologos/lightjj at commit 42427a1, republished under its MIT licence (© chronologos). 885 words, ~2,253 tokens.

Download SKILL.mdSave it as .claude/skills/lightjj/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.
name
lightjj
description
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.

lightjj

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.

Bootstrap

text
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 availability

GET /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.

Synopsis

text
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 stdin

Full reference (flags, exit codes): lightjj api --help / GET /api/agent.

Quote query strings — bare & backgrounds the shell:

bash
lightjj api GET '/tab/0/api/file-show?revision=@&path=docs/DESIGN.md'

Common operations

bash
# 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"}'

Review loop

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:

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

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

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

  4. Respect won't-fix. Don't re-post a finding the user marked resolution: "wontfix". They saw it and decided.

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

Linking to a change

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:

text
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 it
  • change — 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.

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

Multiple sessions / repos

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:

bash
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/log

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

Don't

  • Don't curl — the entire reason lightjj api exists is that harnesses deny curl. It also won't auto-discover the port or set Content-Type.
  • Don't run 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.
  • Don't open the browser URL or screenshot the UI yourself (handing the user a ?change= link is fine — see "Linking to a change").
  • Don't guess endpoint shapes — lightjj api GET /tab/0/api/agent documents all of them with example payloads.

Common errors

  • 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.
  • HTTP 200 but the body is HTML — the path fell through to the SPA: with --addr or raw curl nothing is auto-prefixed, so an unprefixed /api/... needs an explicit /tab/0/api/...; otherwise check for a typo.
  • HTTP 400 Content-Type must be application/json — only happens with curl; lightjj api sets it automatically when a body is present.
  • HTTP 400 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

Files

SKILL.md and 14 other files in cmd/lightjj of chronologos/lightjj.

  • SKILL.md
  • api_cmd.go
  • api_cmd_integration_test.go
  • api_cmd_test.go
  • apply_hunks.go
  • apply_hunks_test.go
  • frontend_embed.go
  • frontend_stub.go
  • main.go
  • session_file.go
  • session_file_other.go
  • session_file_test.go
  • session_file_unix.go
  • skill_cmd.go
  • skill_cmd_test.go

Open the folder on GitHubat commit 42427a1

Compare with similar skills

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.

Lightjj compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Lightjj this skillchronologos/lightjj168—~2.3kAutomated safety check: PassMIT
Vercel Composition Patternssupabase/supabase111k58 repos~726Automated safety check: PassMIT
Finishing a Development Branchobra/superpowers297k5 repos~1.9kAutomated safety check: PassMIT
Typescript Advanced Typesrolling-scopes/rsschool-app10k25 repos~4.2kAutomated safety check: PassMPL-2.0
PR Babysitteropeninterpreter/openinterpreter69k3 repos~4.2kAutomated safety check: PassApache-2.0
Code Review ChecklistshareAI-lab/learn-claude-code78k4 repos~1.1kAutomated safety check: PassMIT

Similar skills

  • Official

    React composition patterns that scale. An agent skill from supabase/supabase.

    111k GitHub starsUsed in 58 repos~726 tokens
    DevelopmentAuto-check passed
  • 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.

    297k GitHub starsUsed in 5 repos~1.9k tokens
    DevelopmentAuto-check passed
  • Typescript Advanced Types

    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.

    10k GitHub starsUsed in 25 repos~4.2k tokens
    DevelopmentAuto-check passed
  • PR Babysitter

    openinterpreter/openinterpreter

    Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.

    69k GitHub starsUsed in 3 repos~4.2k tokens
    DevelopmentAuto-check passed
  • Code Review Checklist

    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.

    78k GitHub starsUsed in 4 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Greploop

    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.

    32k GitHub starsUsed in 4 repos~3.3k tokens
    DevelopmentAuto-check passed

Categories

Questions about Lightjj

What does Lightjj do?

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.

When should I use Lightjj?

Lightjj fits situations like: the user has lightjj running and wants the agent to review changes; comment on markdown docs.

How do I install Lightjj in Claude Code?

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.

How do I install Lightjj in Codex?

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.

Can I use Lightjj 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 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.

What does Lightjj need to run?

Going by SKILL.md and its folder, Lightjj needs Go for the scripts in its folder.

Does Lightjj access the network?

SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.

Is Lightjj 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 Lightjj use?

Lightjj 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 Lightjj use?

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.

What are the alternatives to Lightjj?

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.

Who maintains Lightjj?

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.