4 Commits

Author SHA1 Message Date
andrepimenta
2f792e7158 Bump version to 1.1.0
- Update changelog with all new features since 1.0.7
- Add Inline Diff Viewer section to README
- Update package.json version

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-06 12:56:15 +00:00
andrepimenta
97920395d1 Add WSL support for usage terminal commands
Run ccusage commands through bash -ic in WSL to properly load shell environment.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-06 12:55:44 +00:00
andrepimenta
2e640fa20a Use --permission-mode plan flag for plan mode
Replace message prepending with native CLI flag for cleaner implementation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-06 12:32:25 +00:00
andrepimenta
5136985474 Add Umami analytics events to install flow
Track user journey through installation:
- Install modal shown
- Install started
- Install success/failed

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-06 11:19:23 +00:00
5 changed files with 66 additions and 7 deletions

View File

@@ -4,6 +4,38 @@ All notable changes to the "claude-code-chat" extension will be documented in th
Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
## [1.1.0] - 2025-12-06
### 🚀 Features Added
- **Install Modal**: Added installation flow for users without Claude Code CLI
- Auto-detects when Claude Code is not installed
- One-click installation with progress indicator
- Platform-specific installation commands
- **Diff Viewer Improvements**:
- Show full diff in Edit, MultiEdit, and Write tool use messages
- Add "Open Diff" button to open VS Code's native side-by-side diff editor
- Add truncation with expand button for long diffs
- Optimize diff storage and improve Open Diff button behavior
- **Processing Indicator**: New morphing orange dot animation while Claude is working
- **Subscription Detection**: Added usage badge to status bar showing plan type (Pro, Max) or API cost
- **Conversation Compacting**: Handle `/compact` command in chat with status messages and token reset
- **Permission System**: Migrated from MCP file-based to stdio-based permission prompts
- **Plan Mode**: Now uses native `--permission-mode plan` CLI flag for cleaner implementation
### 🐛 Bug Fixes
- Fixed diff line alignment by removing ::before pseudo-elements
- Fixed auto-scroll for diff tool results
- Strip tool_use_error tags from error messages
- Improved process termination handling
### 🔧 Technical Improvements
- Run /compact command in chat instead of spawning terminal
- Improved terminal and UI experience
- Updated diff icon colors
### 📊 Analytics
- Added Umami analytics events to track install flow (modal shown, started, success/failed)
## [1.0.7] - 2025-10-01 ## [1.0.7] - 2025-10-01
### 🚀 Features Added ### 🚀 Features Added

View File

@@ -47,6 +47,13 @@ Ditch the command line and experience Claude Code like never before. This extens
- Real-time cost and token tracking - Real-time cost and token tracking
- Session statistics and performance metrics - Session statistics and performance metrics
### 📝 **Inline Diff Viewer** ⭐ **NEW IN V1.1**
- **Full Diff Display** - See complete file changes directly in Edit, MultiEdit, and Write messages
- **Open in VS Code Diff** - One-click button to open VS Code's native side-by-side diff editor
- **Smart Truncation** - Long diffs are truncated with an expand button for better readability
- **Syntax Highlighting** - Proper code highlighting in diff views
- **Visual Change Indicators** - Clear green/red highlighting for additions and deletions
### 🔌 **MCP Server Management** ⭐ **NEW IN V1.0** ### 🔌 **MCP Server Management** ⭐ **NEW IN V1.0**
- **Popular Servers Gallery** - One-click installation of common MCP servers - **Popular Servers Gallery** - One-click installation of common MCP servers
- **Custom Server Creation** - Build and configure your own MCP servers - **Custom Server Creation** - Build and configure your own MCP servers

View File

@@ -2,7 +2,7 @@
"name": "claude-code-chat", "name": "claude-code-chat",
"displayName": "Chat for Claude Code", "displayName": "Chat for Claude Code",
"description": "Beautiful Claude Code Chat Interface for VS Code", "description": "Beautiful Claude Code Chat Interface for VS Code",
"version": "1.0.7", "version": "1.1.0",
"publisher": "AndrePimenta", "publisher": "AndrePimenta",
"author": "Andre Pimenta", "author": "Andre Pimenta",
"repository": { "repository": {

View File

@@ -463,11 +463,8 @@ class ClaudeChatProvider {
const configThink = vscode.workspace.getConfiguration('claudeCodeChat'); const configThink = vscode.workspace.getConfiguration('claudeCodeChat');
const thinkingIntensity = configThink.get<string>('thinking.intensity', 'think'); const thinkingIntensity = configThink.get<string>('thinking.intensity', 'think');
// Prepend mode instructions if enabled // Prepend thinking mode instructions if enabled
let actualMessage = message; let actualMessage = message;
if (planMode) {
actualMessage = 'PLAN FIRST FOR THIS MESSAGE ONLY: Plan first before making any changes. Show me in detail what you will change and wait for my explicit approval in a separate message before proceeding. Do not implement anything until I confirm. This planning requirement applies ONLY to this current message. \n\n' + message;
}
if (thinkingMode) { if (thinkingMode) {
let thinkingPrompt = ''; let thinkingPrompt = '';
const thinkingMesssage = ' THROUGH THIS STEP BY STEP: \n' const thinkingMesssage = ' THROUGH THIS STEP BY STEP: \n'
@@ -548,6 +545,11 @@ class ClaudeChatProvider {
args.push('--mcp-config', this.convertToWSLPath(mcpConfigPath)); args.push('--mcp-config', this.convertToWSLPath(mcpConfigPath));
} }
// Add plan mode if enabled
if (planMode) {
args.push('--permission-mode', 'plan');
}
// Add model selection if not using default // Add model selection if not using default
if (this._selectedModel && this._selectedModel !== 'default') { if (this._selectedModel && this._selectedModel !== 'default') {
args.push('--model', this._selectedModel); args.push('--model', this._selectedModel);
@@ -2714,17 +2716,29 @@ class ClaudeChatProvider {
} }
private _openUsageTerminal(usageType: string): void { private _openUsageTerminal(usageType: string): void {
// Get WSL configuration
const config = vscode.workspace.getConfiguration('claudeCodeChat');
const wslEnabled = config.get<boolean>('wsl.enabled', false);
const wslDistro = config.get<string>('wsl.distro', 'Ubuntu');
const terminal = vscode.window.createTerminal({ const terminal = vscode.window.createTerminal({
name: 'Claude Usage', name: 'Claude Usage',
location: { viewColumn: vscode.ViewColumn.One } location: { viewColumn: vscode.ViewColumn.One }
}); });
let command: string;
if (usageType === 'plan') { if (usageType === 'plan') {
// Plan users get live usage view // Plan users get live usage view
terminal.sendText('npx -y ccusage blocks --live'); command = 'npx -y ccusage blocks --live';
} else { } else {
// API users get recent usage history // API users get recent usage history
terminal.sendText('npx -y ccusage blocks --recent --order desc'); command = 'npx -y ccusage blocks --recent --order desc';
}
if (wslEnabled) {
terminal.sendText(`wsl -d ${wslDistro} bash -ic "${command}"`);
} else {
terminal.sendText(command);
} }
terminal.show(); terminal.show();

View File

@@ -1613,6 +1613,8 @@ const getScript = (isTelemetryEnabled: boolean) => `<script>
if (main) main.style.display = 'flex'; if (main) main.style.display = 'flex';
if (progress) progress.style.display = 'none'; if (progress) progress.style.display = 'none';
if (success) success.style.display = 'none'; if (success) success.style.display = 'none';
sendStats('Install modal shown');
} }
function hideInstallModal() { function hideInstallModal() {
@@ -1620,6 +1622,8 @@ const getScript = (isTelemetryEnabled: boolean) => `<script>
} }
function startInstallation() { function startInstallation() {
sendStats('Install started');
// Hide main content, show progress // Hide main content, show progress
document.getElementById('installMain').style.display = 'none'; document.getElementById('installMain').style.display = 'none';
document.getElementById('installProgress').style.display = 'flex'; document.getElementById('installProgress').style.display = 'flex';
@@ -1637,9 +1641,11 @@ const getScript = (isTelemetryEnabled: boolean) => `<script>
successEl.style.display = 'flex'; successEl.style.display = 'flex';
if (success) { if (success) {
sendStats('Install success');
successEl.querySelector('.install-success-text').textContent = 'Installed'; successEl.querySelector('.install-success-text').textContent = 'Installed';
successEl.querySelector('.install-success-hint').textContent = 'Send a message to get started'; successEl.querySelector('.install-success-hint').textContent = 'Send a message to get started';
} else { } else {
sendStats('Install failed');
// Show error state // Show error state
successEl.querySelector('.install-check').style.display = 'none'; successEl.querySelector('.install-check').style.display = 'none';
successEl.querySelector('.install-success-text').textContent = 'Installation failed'; successEl.querySelector('.install-success-text').textContent = 'Installation failed';