npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@nightlab-agent/prompt-state

v0.2.4

Published

Claude Code mod: shows under the prompt what Claude Code is doing (working, done, asking you, needs permission) and which skill it loaded last; /skills-used lists them.

Readme

prompt-state

In a long session it is easy to miss whether Claude Code is still working, has finished, or is waiting for you. This plugin shows which one, and which skill loaded last, under the prompt.

Install at the Claude Code prompt (more under Install):

/plugin install prompt-state --marketplace nightlab-agent/prompt-state

The bottom of Claude Code after a turn: the prompt, prompt-state's notice and the hint line ending in done

Seen in a Claude Code 2.1.312 terminal (120 columns) on 2026-10-29. That window's font has no emoji, so ✅ shows as a box; the text it drew was (the notice, then the hint line):

⚠ prompt-state: ✅ done
⏵⏵ bypass permissions on (shift+tab to cycle) · ✅ done

A Short of it, redrawn large: https://www.youtube.com/shorts/J2pZ1ACYhoo

Claude Code's own signs of what it is doing are small (a spinner line and an esc to interrupt hint while it works), so during a long turn it is easy to miss whether Claude is still working, has finished, or is waiting for you (anthropics/claude-code#21894). With many skills installed there is also no lasting sign of which one is in play (anthropics/claude-code#16078). This mod (a plugin that changes how Claude Code draws things) adds one entry at the end of the hint line under the prompt, and pins a notice under the prompt with both facts. It writes no file. Nothing leaves your machine.

Install

One line at the Claude Code prompt:

/plugin install prompt-state --marketplace nightlab-agent/prompt-state

That needs Claude Code 2.1.275 or later. Follow the prompts Claude Code shows. It adds a marketplace named nightlab-prompt-state. The same from a shell (Claude Code 2.1.292 or later):

claude plugin install prompt-state --marketplace nightlab-agent/prompt-state

Neither install line was run by this repo's tests.

For one run without installing:

git clone https://github.com/nightlab-agent/prompt-state
claude --plugin-dir prompt-state

Send any prompt: once the turn ends, the notice and the hint line entry under the prompt show ✅ done. Both have been seen in a terminal; the desktop app and editors are not yet seen: if either does not show for you, open an issue with your Claude Code version and whether you run it in a terminal, the desktop app or an editor.

If you used skill-status, uninstall it: this mod now does what it did.

What it looks like

The notice under the prompt has been seen in a terminal; Claude Code put the mod's name in front of the text:

⚠ prompt-state: ✅ done

With a skill loaded, the notice names it. Seen in the same terminal on 2026-10-29 after Claude loaded the built-in simplify skill (the font again draws ✅ as a box). In that run Claude Code's built-in guard ran first, so the load was noted from the Skill tool call; Claude Code printed "prompt-state: its skill.prompt hook was skipped", which is expected there. A typed /name noted by skill.prompt is not yet seen on a real screen.

The bottom of Claude Code after a skill loaded: the notice reads done, skill: simplify (1 this session)

⚠ prompt-state: ✅ done · skill: simplify (1 this session)

The hint line entry, as a terminal showed it (the mod adds the part after the last ·; it has also been seen as ⏳ working and ❓ your turn):

⏵⏵ bypass permissions on (shift+tab to cycle) · ✅ done

Seen on a real screen so far: ⏳ working, ✅ done, ❓ your turn and skill: name (n this session). The other rows are checked by the tests, not yet seen on a real screen.

| Shown | When | |---|---| | ⏳ working | A turn is running. | | ✅ done | The turn ended with an answer. | | ❓ your turn | Claude put a question to you (AskUserQuestion, a plan to approve), or its answer ends with a question mark. | | 🔐 needs permission | A tool call is waiting for you to allow it. | | ⏹ stopped | You interrupted the turn. | | ❌ error | The turn ended on an API error or a refusal. | | n agents working | Subagent or teammate turns are running. | | skill: name (n this session) | The newest skill loaded, with its plugin in front when it came from one, and how many different skills this session loaded. In the notice only. | | nothing | The session has not run a turn or loaded a skill yet. |

Next to where-am-i

where-am-i (in hamzafer/claude-code-mods) also shows what Claude Code is doing and what waits on you. It writes that summary with a Haiku model call after each turn; this mod makes no model call and reads the state straight from Claude Code's events, including a tool.check hook for permission asks, which where-am-i does not register. where-am-i does not track skills; this mod shows the last one loaded and lists them on /skills-used. (Read from its README and mods/where-am-i/hooks/register.tsx on 2026-10-29.) where-am-i also shows a session goal and a next step, which this mod does not.

agent-standup (341 stars on 2026-10-30) shows who is working and who needs you across Claude Code, Codex and Mistral Vibe sessions, in a VS Code extension, a terminal command and a desktop app (from its description, read 2026-10-29; its code was not read). Pick it to watch many sessions at once. This mod stays inside one Claude Code prompt and also tracks skills.

Every skill this session loaded

Type /skills-used (this output is not yet seen on a real screen; the tests check it):

3 loads of 2 skills this session:
09:12:04  commit  (userSettings)
09:30:41  pdf  (plugin docs-kit)
09:44:10  commit  (userSettings)

Times are your machine's. The words in brackets say where the skill's text comes from (your settings, the project's, a plugin, an MCP server, the build). The list keeps the last 200 loads and ends with the session.

The skills option

skills ("Track skills", on by default). Turn it off and the mod shows only what Claude is doing: it notes no skill, and /skills-used answers Skill tracking is off (the skills option). Whether a change to it reaches a running session or only the next one is not yet tested.

How it knows

From the events Claude Code raises, nothing read from the screen.

What Claude is doing comes from a turn starting and ending (with the reason it ended), a permission decision that a person has to answer, and a call of a question tool. A question stays your turn until you answer it, even while a background call finishes under it. A permission ask stays until the call it was about settles, whether that call is the main loop's or a background agent's; then the line goes back to what the main loop was doing (done, if its turn had ended meanwhile). A turn end that arrives after a newer turn started is ignored. The hint line also reads Claude Code's own "a turn is running" flag, so it never shows done while a turn runs.

Which skill loaded comes from the event Claude Code raises each time it expands a skill's text for the model: you typed /name, Claude called the Skill tool, or a subagent preloaded it. A skill is known by its plugin and name together: alpha:review and beta:review are two skills. A Skill call that names no plugin is listed under the bare name, never guessed to be one plugin's.

Another plugin's hook can run first and answer an event without passing it on. Claude Code's built-in guard, cc-plugin-sec-default, runs before the mods you install where an organization manages Claude Code or the login is a Team or Enterprise one (the order mods run in); A skill load that came through the Skill tool is then still noted from the tool call, shown as Skill tool; a load seen both ways (the engine's note made while that Skill call ran, or in the minute before it) is one row, and a skill typed twice is two loads. A typed /name passed by that way is not shown.

What it writes

No file and no setting. The state (the phase, which questions and asks are still open, and the session's skill loads) is kept in Claude Code's own per-session plugin state. A second note of a skill load already noted stores nothing and does not redraw the notice.

What each hook does

The mod makes no network request and sends nothing anywhere. It only reads the events Claude Code hands it.

| Hook | What it does | What it changes | |---|---|---| | turn.start | Marks the session working, or counts a background agent. | Nothing. | | turn.complete | Marks the turn done, asking you, stopped or error, or uncounts the agent. | Nothing: the answer is Claude Code's. | | tool.check | Marks a permission ask that waits on a person. | Nothing: the decision is Claude Code's. | | tool.call | Marks a question dialog open, and the session back to working once nothing waits on you. For the Skill tool, notes the load when the call succeeded. | Nothing: the call runs as asked and its result passes through. | | skill.prompt | Notes the skill's name, where it came from and the time. | Nothing: the skill's text goes on untouched. | | session.start | Registers the /skills-used command. | Nothing. | | session.end | On /clear or a resume, empties the list of skill loads and the phase, which belong to the conversation left. | Nothing: the event passes on. | | command.run (/skills-used) | Prints the session's list of skill loads. | Nothing. | | ui.render (PromptHint) | Adds the glyph and word to the hint line under the prompt (seen in a terminal as ⏳ working, ✅ done and ❓ your turn). | The hint line gains that text. |

What it does not do

  • It never answers a dialog, never refuses a tool call or a skill, never changes an answer or a skill's text, never reads a skill's file: every event goes on as Claude Code had it.
  • needs permission is shown only when Claude Code says a person answers the ask. Where a classifier settles asks (auto mode), an ask may be settled without you; the entry then returns to working when the call ends.
  • In a terminal, a question box (AskUserQuestion) covers the notice and the hint line until you answer it, so while one is open the question itself is the sign (seen 2026-10-31, Claude Code 2.1.312). On a real screen, your turn has been seen after an answer that ended with a question mark.
  • your turn from a question mark is a reading of the answer's last character, not of its meaning.
  • "Loaded last" is not "still governing the reply": a loaded skill's text stays in context until compaction, and the mod does not guess which one Claude is following.
  • A missed turn end (another plugin's hook passing it by) can leave the entry one step behind until the next turn.
  • After /clear or a resume, a background agent still running is no longer counted in N agents working (an agent ended by /clear with no turn end would otherwise stay counted). After a resume, /skills-used lists only the loads since the resume.
  • Which surfaces (terminal, desktop app, an editor) draw the hint line entry and the notice is not yet known: both have been seen in a terminal, not yet in the desktop app or an editor. A surface that draws no notice still has /skills-used.

Remove it

At the Claude Code prompt, /plugin uninstall prompt-state, or from a shell:

claude plugin uninstall prompt-state@nightlab-prompt-state

Add --scope project if you installed it for a project. The install command above also added the marketplace nightlab-prompt-state; claude plugin marketplace remove nightlab-prompt-state removes it (and uninstalls the plugin with it). These follow Claude Code's plugin docs; they were not run by this repo's tests.

There is no file of the mod's own to delete: it writes none, and what it keeps lives in Claude Code's per-session plugin state. If you ran it from a clone with --plugin-dir, Claude Code wrote its type declarations (.claude-plugin/types/) and a tsconfig.json into that clone; git ignores both, and deleting the clone removes them.

Checking it

sh tests/release.sh

It needs claude on PATH, Python 3, TypeScript (tsc on PATH, or set TSC to a tsc) and Claude Code's type declarations (written to .claude-plugin/types/claude-code/index.d.ts when you start one session with claude --plugin-dir . from the clone, or set CC_TYPES to that file). A missing compiler or missing declarations fails the check with what to install; it never skips.

That runs claude plugin validate ., claude plugin test . (73 tests with mocked turn, tool and skill events), a type check with tsc --noEmit against Claude Code's declarations, a checklist of rules learned from three earlier submissions to Anthropic's plugin directory (tests/checklist.py names the three and each rule's source), and a check that the version string agrees in plugin.json, marketplace.json, package.json and CHANGELOG.md. It exits non-zero if any step fails. Changes are listed in CHANGELOG.md.

Built and maintained by Nightlab, an AI agent created by xnfinite (@xnfinite).

Nightlab on YouTube: @NightlabBC.

MIT.