Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 4 additions & 4 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
cache: maven

- name: Auto-tag
if: (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.repository == 'nbclaudecodegui/NetbeansClaudeCodeGui'
if: (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.repository == 'nbplugins/NetbeansPluginClaudeCodeGui'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
Expand Down Expand Up @@ -111,11 +111,11 @@ jobs:
# xvfb-run provides a virtual display so Swing UI tests don't throw HeadlessException
run: xvfb-run mvn package --batch-mode
- name: Deploy to Maven Central (release only)
if: needs.calc_ver.outputs.release_flag == 'ON' && github.repository == 'nbclaudecodegui/NetbeansClaudeCodeGui'
if: needs.calc_ver.outputs.release_flag == 'ON' && github.repository == 'nbplugins/NetbeansPluginClaudeCodeGui'
run: |
VERSION="${{ needs.calc_ver.outputs.project_ver }}"
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
"https://repo1.maven.org/maven2/io/github/nbclaudecodegui/netbeans-claude-code-gui/$VERSION/netbeans-claude-code-gui-$VERSION.pom")
"https://repo1.maven.org/maven2/io/github/nbplugins/netbeans-plugin-claude-code-gui/$VERSION/netbeans-plugin-claude-code-gui-$VERSION.pom")
if [[ "$STATUS" == "200" ]]; then
echo "Version $VERSION already published to Maven Central, skipping."
else
Expand Down Expand Up @@ -146,7 +146,7 @@ jobs:

release:
needs: [calc_ver, build]
if: needs.calc_ver.outputs.release_flag == 'ON' && github.repository == 'nbclaudecodegui/NetbeansClaudeCodeGui'
if: needs.calc_ver.outputs.release_flag == 'ON' && github.repository == 'nbplugins/NetbeansPluginClaudeCodeGui'
runs-on: ubuntu-latest
steps:
- name: Publish GitHub Release
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
- Migrated plugin home to https://github.com/nbplugins/NetbeansPluginClaudeCodeGui; updated Maven coordinates to io.github.nbplugins:netbeans-plugin-claude-code-gui; renamed Java packages to io.github.nbplugins.claudecodegui

# 0.23.10 (2026-05-18)

- Fixed F5 not refreshing the Markdown Preview from disk
Expand Down
8 changes: 4 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ Each changelog entry must be committed **together with the code change it descri
Commit messages must also start with a past-tense verb (e.g. "Fixed ...", "Added ..."). The subject line describes *what* was done; the body (if needed) explains *how* or *why*.

When the commit fixes a GitHub issue:
- The CHANGELOG entry must include the full issue URL: e.g. `Fixed ... (https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui/issues/N)`
- The CHANGELOG entry must include the full issue URL: e.g. `Fixed ... (https://github.com/nbplugins/NetbeansPluginClaudeCodeGui/issues/N)`
- The commit subject line should match the CHANGELOG entry text (without the leading `-`)
- The commit body must include `Resolves: #N` followed by implementation explanation

Expand Down Expand Up @@ -176,7 +176,7 @@ The plugin follows an MVC structure for session management:
| `ui/common/` | Shared input components: `AtCompletionPopup` — @-triggered path popup; `AtPathHighlighter` — blue token highlight; `FileDropHandler` — DnD + Ctrl+V → @path insertion; `ShortcutMatcher` — key→shortcut match with KEY_TYPED suppression; `TextComponentDecorator` — wires all the above; `DecoratedTextArea/TextField`, `TextContextMenu`, `RangeHighlightable` |
| `settings/` | `ClaudeCodePreferences` — NbPreferences wrapper (keys: `contextMenuSessionMode` default CONTINUE_LAST, `sessionListLimit` default 30); `ClaudeCodeOptionsPanelController` / `ClaudeCodeOptionsPanel` — Tools→Options (General + Profiles tabs); `ClaudeProfile`, `ClaudeProfileStore` — named profiles with isolated `CLAUDE_CONFIG_DIR`, auth, proxy, extra env vars; `ClaudeProjectProperties` — per-project profile assignment |
| `actions/` | `ClaudeCodeAction` — toolbar button; `OpenWithClaudeAction` — project node context menu; `PromptFavoriteAction` — dynamically registered action per favorite for Keymap API |
| `io.github.nbclaudecodegui.mcp` | `MCPSseServer` — Jetty `/sse` `/messages` `/hook`; `NetBeansMCPHandler` — MCP dispatcher + PreToolUse hook; `tools/` — `OpenDiff`, `PermissionPromptTool`, `DiffTabTracker`, `GetDiagnostics`, `GetOpenEditors`, `GetCurrentSelection`, `OpenFile` |
| `io.github.nbplugins.claudecodegui.mcp` | `MCPSseServer` — Jetty `/sse` `/messages` `/hook`; `NetBeansMCPHandler` — MCP dispatcher + PreToolUse hook; `tools/` — `OpenDiff`, `PermissionPromptTool`, `DiffTabTracker`, `GetDiagnostics`, `GetOpenEditors`, `GetCurrentSelection`, `OpenFile` |
| `org.openbeans.claude.netbeans` | **Legacy package — do not add new code here and avoid modifying existing code.** Contains: `ClaudeCodeStatusService`, `ClaudeCodeStatusLineElement`, `EditorUtils`, `NbUtils`; `tools/` — `AsyncHandler`, `AsyncResponse`, `GetWorkspaceFolders`, `CheckDocumentDirty`, `SaveDocument`, `CloseTab`, `CloseAllDiffTabs` |

### Session lifecycle
Expand Down Expand Up @@ -263,7 +263,7 @@ After any action the originating `ClaudeSessionTab` is re-activated automaticall
- Integration test: `ClaudeCodePluginIT` uses `NbModuleSuite` for full IDE lifecycle
- Test fixtures (JSON): `src/test/resources/fixtures/`
- `ClaudeProcessTest` skips on Windows; uses a fake `claude` shell script
- Test resources in `src/test/resources/` must mirror the package structure of `src/main/java/`. For example, resources for `io.github.nbclaudecodegui.process.ScreenContentDetector` go in `src/test/resources/io/github/nbclaudecodegui/process/`.
- Test resources in `src/test/resources/` must mirror the package structure of `src/main/java/`. For example, resources for `io.github.nbplugins.claudecodegui.process.ScreenContentDetector` go in `src/test/resources/io/github/nbplugins/claudecodegui/process/`.

## Bug Fixing Protocol

Expand Down Expand Up @@ -303,7 +303,7 @@ Reserve `LOG.info` for important events; wrap with `isDebugMode()` only when usi
## Git Workflow

- `origin` — personal fork
- `upstream` — org repo (`nbclaudecodegui/NetbeansClaudeCodeGui`)
- `upstream` — org repo (`nbplugins/NetbeansPluginClaudeCodeGui`)

**Never push directly to upstream.** Always:
1. Run `git fetch upstream` before creating a branch
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Claude Code GUI — NetBeans Plugin

![Build](https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui/actions/workflows/build.yml/badge.svg)
[![Release](https://img.shields.io/github/v/release/nbclaudecodegui/NetbeansClaudeCodeGui)](https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui/releases/latest)
[![Downloads](https://img.shields.io/github/downloads/nbclaudecodegui/NetbeansClaudeCodeGui/total)](https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui/releases)
![Build](https://github.com/nbplugins/NetbeansPluginClaudeCodeGui/actions/workflows/build.yml/badge.svg)
[![Release](https://img.shields.io/github/v/release/nbplugins/NetbeansPluginClaudeCodeGui)](https://github.com/nbplugins/NetbeansPluginClaudeCodeGui/releases/latest)
[![Downloads](https://img.shields.io/github/downloads/nbplugins/NetbeansPluginClaudeCodeGui/total)](https://github.com/nbplugins/NetbeansPluginClaudeCodeGui/releases)

> **Alpha:** The plugin is under active development. Some features may not work correctly.

Expand All @@ -25,9 +25,9 @@ The plugin code was written entirely by [Claude Code](https://claude.ai/code) us

## Download

Download the latest `.nbm` file from [GitHub Releases](https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui/releases/latest).
Download the latest `.nbm` file from [GitHub Releases](https://github.com/nbplugins/NetbeansPluginClaudeCodeGui/releases/latest).

Intermediate builds between releases are available as artifacts on the [Actions](https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui/actions) page — open the latest successful workflow run and download the `nbm` artifact (delivered as a zip file; extract the `.nbm` before installing).
Intermediate builds between releases are available as artifacts on the [Actions](https://github.com/nbplugins/NetbeansPluginClaudeCodeGui/actions) page — open the latest successful workflow run and download the `nbm` artifact (delivered as a zip file; extract the `.nbm` before installing).

---

Expand Down
4 changes: 2 additions & 2 deletions docs/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ The plugin is available in the [NetBeans Plugin Portal](https://plugins.netbeans

### Recommended: download from GitHub Releases

Download the latest `.nbm` file from the [Releases page](https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui/releases/latest).
Download the latest `.nbm` file from the [Releases page](https://github.com/nbplugins/NetbeansPluginClaudeCodeGui/releases/latest).

### Intermediate builds

Builds between releases are available as artifacts on the [Actions](https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui/actions) page — open the latest successful workflow run and download the `nbm` artifact (delivered as a zip file; extract the `.nbm` before installing).
Builds between releases are available as artifacts on the [Actions](https://github.com/nbplugins/NetbeansPluginClaudeCodeGui/actions) page — open the latest successful workflow run and download the `nbm` artifact (delivered as a zip file; extract the `.nbm` before installing).

### Install into NetBeans

Expand Down
24 changes: 12 additions & 12 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>io.github.nbclaudecodegui</groupId>
<artifactId>netbeans-claude-code-gui</artifactId>
<version>0.23.19-SNAPSHOT</version>
<groupId>io.github.nbplugins</groupId>
<artifactId>netbeans-plugin-claude-code-gui</artifactId>
<version>1.0.1-SNAPSHOT</version>
<packaging>nbm</packaging>
<name>Netbeans Plugin Claude Code GUI</name>
<description>NetBeans plugin that provides a GUI for Claude Code CLI — run claude code sessions directly inside the IDE.</description>
<url>https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui</url>
<url>https://github.com/nbplugins/NetbeansPluginClaudeCodeGui</url>

<licenses>
<license>
Expand All @@ -22,16 +22,16 @@

<developers>
<developer>
<id>nbclaudecodegui</id>
<name>nbclaudecodegui</name>
<url>https://github.com/nbclaudecodegui</url>
<id>nbplugins</id>
<name>nbplugins</name>
<url>https://github.com/nbplugins</url>
</developer>
</developers>

<scm>
<connection>scm:git:git://github.com/nbclaudecodegui/NetbeansClaudeCodeGui.git</connection>
<developerConnection>scm:git:ssh://github.com/nbclaudecodegui/NetbeansClaudeCodeGui.git</developerConnection>
<url>https://github.com/nbclaudecodegui/NetbeansClaudeCodeGui</url>
<connection>scm:git:git://github.com/nbplugins/NetbeansPluginClaudeCodeGui.git</connection>
<developerConnection>scm:git:ssh://github.com/nbplugins/NetbeansPluginClaudeCodeGui.git</developerConnection>
<url>https://github.com/nbplugins/NetbeansPluginClaudeCodeGui</url>
</scm>

<properties>
Expand Down Expand Up @@ -127,9 +127,9 @@
import org.apache.batik.transcoder.TranscoderOutput

def svg = new File(project.basedir,
'src/main/resources/io/github/nbclaudecodegui/icons/cc-gui-icon.svg')
'src/main/resources/io/github/nbplugins/claudecodegui/icons/cc-gui-icon.svg')
def out = new File(project.build.outputDirectory,
'io/github/nbclaudecodegui/icons')
'io/github/nbplugins/claudecodegui/icons')
out.mkdirs()

[['claude-icon.png', 16f], ['claude-icon-32.png', 32f]].each { name, size ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// Originally forked from https://github.com/emilianbold/claude-code-netbeans
// Original: src/main/java/org/openbeans/claude/netbeans/ClaudeCodeInstaller.java
package io.github.nbclaudecodegui;
package io.github.nbplugins.claudecodegui;

import io.github.nbclaudecodegui.mcp.MCPSseServer;
import io.github.nbclaudecodegui.mcp.NetBeansMCPHandler;
import io.github.nbclaudecodegui.settings.ClaudeCodePreferences;
import io.github.nbplugins.claudecodegui.mcp.MCPSseServer;
import io.github.nbplugins.claudecodegui.mcp.NetBeansMCPHandler;
import io.github.nbplugins.claudecodegui.settings.ClaudeCodePreferences;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
Expand All @@ -13,6 +13,7 @@
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openide.util.NbPreferences;
import org.netbeans.api.project.ui.OpenProjects;
import org.openide.modules.ModuleInstall;
import org.openide.util.Exceptions;
Expand All @@ -31,6 +32,7 @@ public class ClaudeCodeInstaller extends ModuleInstall implements PropertyChange
private static final Logger LOGGER = Logger.getLogger(ClaudeCodeInstaller.class.getName());
private static final RequestProcessor RP = new RequestProcessor("ClaudeCode", 1);


// Static so that the Lookup-created instance (separate from the ModuleInstall
// instance managed by NetBeans) reads the same running server state.
private static volatile MCPSseServer mcpServer;
Expand All @@ -46,6 +48,26 @@ public ClaudeCodeInstaller() {}
public void restored() {
LOGGER.info("Claude Code NetBeans plugin is starting up...");

// Migrate window settings files (must run before window system reads them)
String userDir = System.getProperty("netbeans.user");
if (userDir != null) {
V1MigrationHelper.migrateWindowsSettings(
Paths.get(userDir, "config", "Windows2Local", "Components"));
}

// Migrate preferences from old package paths (one-time, after package rename in 1.0)
String p = V1MigrationHelper.OLD_PREFS_PREFIX;
V1MigrationHelper.migratePrefsNode(p + "settings/ClaudeCodePreferences",
NbPreferences.forModule(ClaudeCodePreferences.class));
V1MigrationHelper.migratePrefsNode(p + "ui/ClaudeSessionTab",
NbPreferences.forModule(io.github.nbplugins.claudecodegui.ui.ClaudeSessionTab.class));
V1MigrationHelper.migratePrefsNode(p + "ui/MarkdownDiffPanel",
NbPreferences.forModule(io.github.nbplugins.claudecodegui.ui.MarkdownDiffPanel.class));
V1MigrationHelper.migratePrefsNode(p + "ui/MarkdownPreviewTab",
NbPreferences.forModule(io.github.nbplugins.claudecodegui.ui.MarkdownPreviewTab.class));
V1MigrationHelper.migratePrefsNode(p + "ui/markdown/MarkdownFindBar",
NbPreferences.forModule(io.github.nbplugins.claudecodegui.ui.markdown.MarkdownFindBar.class));

// Remove any stale NetBeans lock files from previous sessions
removeNetBeansLockFiles();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package io.github.nbplugins.claudecodegui;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import org.openide.util.NbPreferences;

/** One-time migration helpers from pre-1.0 package names. Can be removed in 2.0. */
class V1MigrationHelper {

private static final Logger LOG = Logger.getLogger(V1MigrationHelper.class.getName());

static final String OLD_PKG = "io.github.nbclaudecodegui.";
static final String NEW_PKG = "io.github.nbplugins.claudecodegui.";
static final String OLD_PREFS_PREFIX = "io/github/nbclaudecodegui/";

private V1MigrationHelper() {}

/** Rewrites *.settings files under componentsDir, replacing old class FQNs with new ones. */
static void migrateWindowsSettings(Path componentsDir) {
if (!Files.exists(componentsDir)) return;
try (var stream = Files.list(componentsDir)) {
stream.filter(p -> p.toString().endsWith(".settings"))
.forEach(p -> {
try {
String content = Files.readString(p);
if (content.contains(OLD_PKG)) {
Files.writeString(p, content.replace(OLD_PKG, NEW_PKG));
LOG.log(Level.FINE, "Migrated window settings: {0}", p);
}
} catch (IOException e) {
LOG.log(Level.WARNING, "Could not migrate window settings: " + p, e);
}
});
} catch (IOException e) {
LOG.log(Level.WARNING, "Window settings migration failed", e);
}
}

/** Copies keys from oldPath NbPreferences node to newNode, then removes the old node. */
static void migratePrefsNode(String oldPath, Preferences newNode) {
migratePrefsNode(NbPreferences.root(), oldPath, newNode);
}

static void migratePrefsNode(Preferences root, String oldPath, Preferences newNode) {
try {
Preferences oldNode = root.node(oldPath);
String[] keys = oldNode.keys();
if (keys.length == 0) return;
for (String key : keys) {
if (newNode.get(key, null) == null) {
newNode.put(key, oldNode.get(key, ""));
}
}
oldNode.removeNode();
LOG.log(Level.FINE, "Migrated prefs from {0}", oldPath);
} catch (BackingStoreException ignored) {}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.github.nbclaudecodegui.actions;
package io.github.nbplugins.claudecodegui.actions;

import io.github.nbclaudecodegui.ui.ClaudeSessionTab;
import io.github.nbplugins.claudecodegui.ui.ClaudeSessionTab;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import static javax.swing.Action.SMALL_ICON;
Expand All @@ -17,7 +17,7 @@
*/
@ActionID(
category = "Window",
id = "io.github.nbclaudecodegui.actions.ClaudeCodeAction"
id = "io.github.nbplugins.claudecodegui.actions.ClaudeCodeAction"
)
@ActionRegistration(
displayName = "#CTL_ClaudeCodeAction",
Expand All @@ -28,7 +28,7 @@
@Messages("CTL_ClaudeCodeAction=Claude Code")
public final class ClaudeCodeAction extends AbstractAction {

private static final String ICON_PATH = "io/github/nbclaudecodegui/icons/claude-icon-32.png";
private static final String ICON_PATH = "io/github/nbplugins/claudecodegui/icons/claude-icon-32.png";

/** Constructs the action and sets the toolbar icon. */
public ClaudeCodeAction() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.github.nbclaudecodegui.actions;
package io.github.nbplugins.claudecodegui.actions;

import io.github.nbclaudecodegui.settings.ClaudeProjectProperties;
import io.github.nbclaudecodegui.ui.ClaudeSessionTab;
import io.github.nbplugins.claudecodegui.settings.ClaudeProjectProperties;
import io.github.nbplugins.claudecodegui.ui.ClaudeSessionTab;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.AbstractAction;
Expand All @@ -27,11 +27,11 @@
*/
@ActionID(
category = "Project",
id = "io.github.nbclaudecodegui.actions.OpenWithClaudeAction"
id = "io.github.nbplugins.claudecodegui.actions.OpenWithClaudeAction"
)
@ActionRegistration(
displayName = "#CTL_OpenWithClaudeAction",
iconBase = "io/github/nbclaudecodegui/icons/claude-icon.png",
iconBase = "io/github/nbplugins/claudecodegui/icons/claude-icon.png",
lazy = false
)
@ActionReferences({
Expand All @@ -42,7 +42,7 @@ public final class OpenWithClaudeAction extends AbstractAction
implements ContextAwareAction {

private static final String ICON =
"io/github/nbclaudecodegui/icons/claude-icon.png";
"io/github/nbplugins/claudecodegui/icons/claude-icon.png";

/** No-arg constructor required by the annotation processor. */
public OpenWithClaudeAction() {
Expand Down
Loading
Loading