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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,27 @@ All notable changes to DeepCode are documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.1.5] — 2026-05-28

### Polish + dead-code removal
- **Composer `+` menu wired**. Click `+` → popover with three actions:
Attach file (opens native file picker, inserts `@<absolute-path>`
into the textarea), Slash command (prepends `/`), Memory note
(prepends `#`). Replaces the previously-disabled `+` button.
- **Plugins toggle works.** Click the switch on any plugin → writes
to `settings.disabledPlugins[]` so the change survives restart
and the agent picks it up on the next turn. Optimistic UI with
rollback on failure.
- **Dead code removed.** Deleted unused screens (FilePanel.tsx —
Monaco file panel not surfaced in new shell; legacy Chat.tsx stub;
Nav.tsx — only the type was needed, moved to `src/types/screens.ts`;
Terminal.tsx — xterm side-pane wasn't wired in). Trimmed deps:
removed `@monaco-editor/react`, `monaco-editor`, `@xterm/*`,
`tailwindcss`, `postcss`, `autoprefixer` — none referenced any
more.
- ScreenName type moved to `src/types/screens.ts` (single source of
truth for App.tsx + InspectorRail).

## [0.1.4] — 2026-05-28

### Robustness + polish
Expand Down
2 changes: 1 addition & 1 deletion apps/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "deepcode-cli",
"version": "0.1.4",
"version": "0.1.5",
"description": "DeepCode CLI — DeepSeek-powered AI coding agent, parity with Claude Code",
"license": "MIT",
"type": "module",
Expand Down
10 changes: 1 addition & 9 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@deepcode/desktop",
"version": "0.1.4",
"version": "0.1.5",
"private": true,
"description": "DeepCode Mac desktop client — Tauri + React",
"license": "MIT",
Expand All @@ -21,18 +21,13 @@
"dependencies": {
"@deepcode/core": "workspace:*",
"@deepcode/shared-ui": "workspace:*",
"@monaco-editor/react": "^4.7.0",
"@tauri-apps/api": "^2.0.0",
"@tauri-apps/plugin-dialog": "^2.0.0",
"@tauri-apps/plugin-fs": "^2.0.0",
"@tauri-apps/plugin-opener": "^2.0.0",
"@tauri-apps/plugin-process": "^2.3.1",
"@tauri-apps/plugin-shell": "^2.0.0",
"@tauri-apps/plugin-updater": "^2.0.0",
"@xterm/addon-fit": "^0.11.0",
"@xterm/addon-web-links": "^0.12.0",
"@xterm/xterm": "^6.0.0",
"monaco-editor": "^0.55.1",
"react": "^18.3.0",
"react-dom": "^18.3.0"
},
Expand All @@ -42,9 +37,6 @@
"@types/react": "^18.3.0",
"@types/react-dom": "^18.3.0",
"@vitejs/plugin-react": "^4.3.0",
"autoprefixer": "^10.5.0",
"postcss": "^8.5.15",
"tailwindcss": "^3.4",
"typescript": "^5.7.0",
"vite": "^5.4.0",
"vitest": "^2.1.9"
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "deepcode_desktop"
version = "0.1.4"
version = "0.1.5"
description = "DeepCode Mac desktop client"
authors = ["oratis"]
edition = "2021"
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "DeepCode",
"version": "0.1.4",
"version": "0.1.5",
"identifier": "dev.deepcode.desktop",
"build": {
"frontendDist": "../dist",
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { ReplScreen } from './screens/Repl.js';
import { SessionsScreen } from './screens/Sessions.js';
import { SettingsScreen } from './screens/Settings.js';
import { SkillsScreen } from './screens/Skills.js';
import type { ScreenName } from './components/Nav.js';
import type { ScreenName } from './types/screens.js';
import type { UpdateInfo } from './types/global.js';

export function App(): JSX.Element {
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/components/InspectorRail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
// chevron is still deferred (the full-width inspector panel lands in
// the next phase) — we leave it disabled with a tooltip.

import type { ScreenName } from './Nav.js';
import type { ScreenName } from '../types/screens.js';

interface InspectorRailProps {
/** Plan items pending — shown as a badge on ▤. */
Expand Down
52 changes: 0 additions & 52 deletions apps/desktop/src/components/Nav.tsx

This file was deleted.

126 changes: 126 additions & 0 deletions apps/desktop/src/components/PlusMenu.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
// Composer "+" popover — design spec screen #4.
// Click-popover with three actions: Attach file / Slash command / Memory.
// Sits absolute-positioned above the composer toolbar (opens upward so
// it doesn't get clipped by the chat-stream above the composer).

import { useEffect, useRef, useState } from 'react';

export interface PlusMenuItem {
icon: string; // emoji or single-char icon
label: string;
description?: string;
onClick: () => void | Promise<void>;
disabled?: boolean;
}

interface PlusMenuProps {
items: PlusMenuItem[];
disabled?: boolean;
}

export function PlusMenu({ items, disabled }: PlusMenuProps): JSX.Element {
const [open, setOpen] = useState(false);
const rootRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (!open) return;
function handle(e: MouseEvent): void {
if (!rootRef.current?.contains(e.target as Node)) setOpen(false);
}
function esc(e: KeyboardEvent): void {
if (e.key === 'Escape') setOpen(false);
}
window.addEventListener('mousedown', handle);
window.addEventListener('keydown', esc);
return () => {
window.removeEventListener('mousedown', handle);
window.removeEventListener('keydown', esc);
};
}, [open]);

return (
<div ref={rootRef} style={{ position: 'relative', display: 'inline-flex' }}>
<button
type="button"
className="icon-btn"
onClick={() => !disabled && setOpen((o) => !o)}
disabled={disabled}
title="Attach / commands / memory"
>
+
</button>
{open && (
<div
role="menu"
style={{
position: 'absolute',
bottom: 'calc(100% + 6px)',
left: 0,
width: 280,
background: 'var(--bg-2)',
border: '1px solid var(--line)',
borderRadius: 'var(--radius)',
boxShadow: 'var(--shadow)',
padding: 4,
zIndex: 20,
}}
>
{items.map((item) => (
<button
type="button"
role="menuitem"
key={item.label}
onClick={async () => {
if (item.disabled) return;
setOpen(false);
await item.onClick();
}}
disabled={item.disabled}
style={{
width: '100%',
textAlign: 'left',
padding: '8px 10px',
borderRadius: 'var(--radius-sm)',
background: 'transparent',
color: item.disabled ? 'var(--text-3)' : 'var(--text-0)',
display: 'flex',
alignItems: 'center',
gap: 10,
font: 'inherit',
fontSize: 13,
border: 0,
cursor: item.disabled ? 'not-allowed' : 'pointer',
}}
onMouseEnter={(e) => {
if (!item.disabled)
e.currentTarget.style.background = 'var(--bg-3)';
}}
onMouseLeave={(e) => {
e.currentTarget.style.background = 'transparent';
}}
>
<span
style={{
width: 22,
textAlign: 'center',
fontSize: 14,
color: 'var(--text-2)',
}}
>
{item.icon}
</span>
<span style={{ flex: 1 }}>
<div style={{ fontWeight: 500 }}>{item.label}</div>
{item.description && (
<div style={{ fontSize: 11, color: 'var(--text-3)', marginTop: 1 }}>
{item.description}
</div>
)}
</span>
</button>
))}
</div>
)}
</div>
);
}
Loading
Loading