First version
This commit is contained in:
@@ -0,0 +1,232 @@
|
||||
# Claude for Nova
|
||||
|
||||
Claude Code inside [Nova](https://nova.app): a sidebar for the session, a live
|
||||
transcript in an editor tab, and every tool call routed through an approval you
|
||||
can review before it touches your files.
|
||||
|
||||
The extension drives the `claude` executable already installed on your machine,
|
||||
speaking its streaming JSON protocol over stdio. Your existing sign-in, settings,
|
||||
`CLAUDE.md`, skills, plugins, and MCP servers all apply — this is the same agent
|
||||
you get in a terminal, wearing Nova's interface.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Nova 10 or later (built against Nova 14; not exercised on older versions)
|
||||
- [Claude Code](https://claude.com/product/claude-code) installed and on disk
|
||||
(`~/.local/bin/claude`, Homebrew, or a path you set in settings)
|
||||
|
||||
## Getting started
|
||||
|
||||
1. Open the **Claude** sidebar (the starburst in the sidebar rail).
|
||||
2. If the Account row says *Not signed in*, click it and choose how to sign in.
|
||||
3. Press **⌘⇧L**, or use the ✳︎ button in the sidebar header, and ask for something.
|
||||
|
||||
The first prompt starts a session in your project directory. The transcript opens
|
||||
as a tab and updates as Claude works.
|
||||
|
||||
## Signing in
|
||||
|
||||
Authentication is handled by Claude Code itself — the extension never sees your
|
||||
credentials. **Sign In** offers three routes:
|
||||
|
||||
| Route | What happens |
|
||||
| --- | --- |
|
||||
| Claude Subscription | Runs `claude auth login`, opens the authorization page in your browser, and relays the code back |
|
||||
| Anthropic Console | The same flow with `--console`, for API-billed accounts |
|
||||
| Open a Terminal | Runs `claude auth login` in a terminal window — use this for SSO or if the in-app flow stalls |
|
||||
|
||||
You can also store an API key with **Set API Key…**. It goes in the macOS
|
||||
keychain and is passed to Claude Code as `ANTHROPIC_API_KEY`, taking precedence
|
||||
over a signed-in account. **Clear Stored API Key** removes it.
|
||||
|
||||
## Approving tool use
|
||||
|
||||
In the default *Manual* permission mode, Claude asks before each tool that needs
|
||||
permission. Every request appears in **Needs Approval** in the sidebar *and* as a
|
||||
panel, so dismissing the panel never strands the session — the request waits
|
||||
until you answer it from the sidebar's context menu.
|
||||
|
||||
### Reviewing a file change
|
||||
|
||||
When Claude wants to edit or create a file, the file **as it would be after the
|
||||
change** opens in a tab. Review it there, and settle it with ordinary editor
|
||||
gestures:
|
||||
|
||||
| Gesture | Result |
|
||||
| --- | --- |
|
||||
| **⌘S** save | Apply the change |
|
||||
| **⌘W** close | Reject it |
|
||||
|
||||
The tab is editable, and that is the point: fix the variable name Claude got
|
||||
wrong, delete the half you don't want, then save — **your** version is what gets
|
||||
written, not Claude's. A notification carries the same choices, and they appear
|
||||
as rows under the request in the sidebar; **Show Diff** gives the unified diff if
|
||||
you'd rather see just what moved.
|
||||
|
||||
Prefer the old quick yes/no? Set *Reviewing file changes* to **Ask in a panel**.
|
||||
|
||||
**Allow for Session** adds an allow rule for that tool for the rest of the
|
||||
session, so Claude stops asking about it.
|
||||
|
||||
Two tools are their own interaction surface rather than a yes/no gate, and get
|
||||
purpose-built handling — see *Plan mode* and *Questions* below.
|
||||
|
||||
## Plan mode
|
||||
|
||||
**Plan with Claude… (⌘⇧P)** switches the session into plan mode and prompts you.
|
||||
Claude researches and proposes but changes nothing. When it has a plan, the plan
|
||||
opens in a tab and you choose:
|
||||
|
||||
| Choice | What happens |
|
||||
| --- | --- |
|
||||
| Approve — auto-accept edits | Plan accepted; the session moves to Accept Edits so Claude can work uninterrupted |
|
||||
| Approve — ask before each edit | Plan accepted; you keep approving each change |
|
||||
| Keep Planning… | Send it back for revision; Claude revises and re-presents |
|
||||
| Show Plan Again | Re-open the plan |
|
||||
|
||||
When a plan is ready you get a **notification**, not a modal sheet — the plan tab
|
||||
stays scrollable and editable while you decide. The same choices also appear as
|
||||
rows under the request in **Needs Approval**, so you can dismiss the notification
|
||||
and take your time.
|
||||
|
||||
### Giving feedback on a plan
|
||||
|
||||
The plan is an ordinary editable document, and there are three ways to respond —
|
||||
they combine freely:
|
||||
|
||||
- **Edit the plan in its tab.** Rewrite, delete, or add steps directly. When you
|
||||
approve, your version is sent back and becomes the plan of record — Claude
|
||||
works from what you wrote, not its own draft. Unsaved edits count.
|
||||
- **Highlight a passage**, then choose *Keep Planning…*. The selected lines are
|
||||
quoted back to Claude along with your note, so "this part is wrong" has an
|
||||
unambiguous referent.
|
||||
- **Write Feedback…** opens a scratch tab you can type into freely — as many
|
||||
paragraphs, lists, and code snippets as you want. When you're done, choose
|
||||
**Send Feedback** in the sidebar. Nova gives extensions no multi-line field of
|
||||
their own, so the editor itself is the text box.
|
||||
|
||||
If you edit the plan *and* send feedback, your rewrite goes along with it, marked
|
||||
authoritative.
|
||||
|
||||
Nothing is lost by ignoring the notification: the plan waits in **Needs Approval**
|
||||
with its choices until you act. Plans are saved by Claude Code under
|
||||
`~/.claude/plans/`, so you can reopen one later.
|
||||
|
||||
You can also stay in plan mode for a whole session by setting the permission
|
||||
mode to *Plan*.
|
||||
|
||||
## Questions
|
||||
|
||||
When Claude needs a decision from you it asks a real question, and the options
|
||||
appear in a Nova choice palette. Pick one — or **Other…** to type your own
|
||||
answer. Multi-select questions let you toggle several options and then choose
|
||||
*Done*. Your answer goes straight back to Claude as the tool's result.
|
||||
|
||||
## Permission modes
|
||||
|
||||
Change the mode any time from the Permissions row:
|
||||
|
||||
| Mode | Behaviour |
|
||||
| --- | --- |
|
||||
| Manual | Ask before each tool (default) |
|
||||
| Accept Edits | File edits apply automatically; other tools still ask |
|
||||
| Plan | Research only — Claude proposes, changes nothing |
|
||||
| Auto | Claude decides what is worth asking about |
|
||||
| Bypass | Approve everything. Only in a directory you trust |
|
||||
|
||||
## The sidebar
|
||||
|
||||
- **Session** — status, account, model, permission mode, and running cost.
|
||||
Double-click Model or Permissions to change them mid-session.
|
||||
- **Needs Approval** — anything waiting on you, with its choices as rows
|
||||
underneath: Allow / Allow for Session / Review / Deny for an ordinary tool,
|
||||
or the approve-and-feedback options for a plan. Double-click a row to take it.
|
||||
- **Activity** — every tool call, newest first. Double-click one that touched a
|
||||
file to open it.
|
||||
- **Changed Files** — files Claude actually modified. Double-click to open, or
|
||||
use **Show Change…** to see the last edit as a diff.
|
||||
|
||||
## Commands
|
||||
|
||||
| Command | Shortcut |
|
||||
| --- | --- |
|
||||
| Ask Claude… | ⌘⇧L |
|
||||
| Plan with Claude… | ⌘⇧P |
|
||||
| Ask Claude About Selection… (Editor menu) | ⌃⌘L |
|
||||
| Add File to Claude's Context (Editor menu) | |
|
||||
| Add Files to Context… | |
|
||||
| Show Transcript | |
|
||||
| New Session / Resume Session… | |
|
||||
| Stop Claude / End Session | |
|
||||
| Set Model… / Set Permission Mode… | |
|
||||
|
||||
**Add Files to Context…** opens a file chooser — pick any files or folders in the
|
||||
project and ask about them together, without opening them first.
|
||||
|
||||
**Ask Claude About Selection…** sends the file, the line range, and the selected
|
||||
text with your question. Plain **Ask Claude** does the same automatically when
|
||||
there is a selection — turn that off with the *Include the editor selection*
|
||||
setting.
|
||||
|
||||
**Resume Session…** lists this project's recent Claude Code sessions, labelled
|
||||
with their opening prompt, including ones started in a terminal.
|
||||
|
||||
## Settings
|
||||
|
||||
Model, effort, permission mode, and the `claude` executable path are set in
|
||||
Extension Settings; Model and Permission Mode can also be overridden per project
|
||||
in Project Settings. Other options:
|
||||
|
||||
- **Reviewing file changes** — an editable proposal tab, or a panel
|
||||
- **Open the transcript automatically** when a session starts
|
||||
- **Stream text as it is generated** — token-by-token output
|
||||
- **Show thinking in the transcript**
|
||||
- **Include the editor selection with prompts**
|
||||
- **Additional CLI arguments** — appended to the `claude` command line
|
||||
|
||||
## How it works
|
||||
|
||||
```
|
||||
Nova extension ──stdio (stream-json)──> claude --print
|
||||
│ │
|
||||
│ <── assistant / tool / result ───────┤
|
||||
├──── control_response (allow/deny) ────┤
|
||||
└──── control_request (interrupt) ─────>┘
|
||||
```
|
||||
|
||||
One `claude` process per window, launched with
|
||||
`--input-format stream-json --output-format stream-json`. Session messages and
|
||||
control traffic share the pipe: the CLI raises a `can_use_tool` control request
|
||||
for each permission prompt, and the extension answers it with your decision.
|
||||
Questions are answered by returning the choices as `updatedInput`; approving a
|
||||
plan returns a `setMode` permission update, which is what moves the session out
|
||||
of plan mode. Interrupts and mid-session model or permission changes travel the
|
||||
same channel.
|
||||
|
||||
There is no bundled copy of Claude Code, no Node sidecar, and no network access
|
||||
of its own — the extension only talks to the executable you already trust.
|
||||
|
||||
## Known limits
|
||||
|
||||
- Nova has no scriptable diff viewer, so proposed changes are shown as a unified
|
||||
diff in a scratch tab rather than in a side-by-side editor.
|
||||
- Extension sidebars can only contain tree rows — there is no API for a
|
||||
multi-line field like the one in Nova's own Source Control sidebar. Feedback
|
||||
is written in a scratch tab instead, and decisions are tree rows.
|
||||
- Ordinary tool approvals still use a panel, since they are a quick yes/no.
|
||||
- Questions and plan approvals are handled natively. Any *other* tool that
|
||||
needs its own interactive prompt is declined with an explanation — run those
|
||||
from a terminal.
|
||||
- The transcript is a Markdown document, so it renders text, not widgets.
|
||||
- Sessions run in the workspace directory. Open a folder in Nova before asking.
|
||||
|
||||
## Development
|
||||
|
||||
```sh
|
||||
nova extension validate . # check the bundle
|
||||
nova extension activate . # load it into Nova for development
|
||||
```
|
||||
|
||||
Extension logs (with `nova.inDevMode()` output) appear in Nova's Extension
|
||||
Console. Keyboard shortcuts can be rebound in Preferences → Key Bindings if any
|
||||
of the defaults collide with yours.
|
||||
|
||||
Reference in New Issue
Block a user