From 26c81467c489f9785c3f72be00c62c471f5b3b44 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 10:46:56 +0000 Subject: [PATCH 1/5] docs: update README with structured template, contributing guide, and project details Co-Authored-By: Thuong Huynh --- README.md | 162 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 138 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 949f803..7eafd2c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,89 @@ # Workspace IDE -A modern, flexible workspace IDE built with React + TypeScript. Provides a complete development environment with resizable panes, tabbed editors, file management, and integrated tools. +> A modern, flexible browser-based IDE built with React + TypeScript. Provides a complete development environment with resizable panes, tabbed editors, file management, and integrated tools. + +--- + +## Table of Contents + +- [Description](#description) +- [Installation](#installation) +- [Usage](#usage) +- [Features](#features) +- [Tech Stack](#tech-stack) +- [Project Structure](#project-structure) +- [Architecture](#architecture) +- [Keyboard Shortcuts](#keyboard-shortcuts) +- [Contributing](#contributing) +- [License](#license) +- [Contact](#contact) + +--- + +## Description + +Workspace IDE is a browser-based Integrated Development Environment that provides a multi-window, multi-pane workspace for software development. It enables users to manage files, execute code, view live previews, and monitor real-time resource telemetry -- all within a single browser tab. + +Key highlights: + +- **Multi-window support** with resizable, split, and floating panes +- **Tabbed interface** for editors, terminals, previews, and more +- **File tree** with full CRUD operations and context menus +- **Integrated tools** including code editor, shell, console, AI agent, and secrets manager +- **Real-time resource monitoring** for RAM, CPU, and storage +- **Global search** with keyboard navigation (Ctrl+K) +- **Spotlight page** for project metadata and sharing + +--- + +## Installation + +1. **Clone the repository** + ```sh + git clone https://github.com/ATC-O48/Claude-OpenAI-Code.git + cd Claude-OpenAI-Code + ``` + +2. **Install dependencies** + ```sh + npm install + ``` + +3. **Start the development server** + ```sh + npm run dev + ``` + +--- + +## Usage + +### Development + +```sh +# Start development server +npm run dev + +# Build for production +tsc -b && npm run build + +# Preview production build +npm run preview + +# Run linter +npm run lint +``` + +### Working with the IDE + +- Open the app in your browser after starting the dev server +- Use the **File Tree** sidebar to browse and manage project files +- Split panes horizontally or vertically via the **Options Menu** (three dots icon) +- Access tools quickly from the **Tools Dock** at the bottom +- Use **Ctrl+K** to open global search +- Click the project name to open the **Spotlight Page** for project settings + +--- ## Features @@ -22,7 +105,7 @@ A modern, flexible workspace IDE built with React + TypeScript. Provides a compl ### 4. Run Button - Start/stop the current workflow -- Visual state change (green Run → red Stop) +- Visual state change (green Run / red Stop) - Controls the Preview and Console output ### 5. Spotlight Page @@ -49,6 +132,7 @@ A modern, flexible workspace IDE built with React + TypeScript. Provides a compl - Located at the bottom of the sidebar ### 9. Integrated Tools + | Tool | Description | |------|-------------| | **Editor** | Code viewer with line numbers and syntax display | @@ -61,6 +145,8 @@ A modern, flexible workspace IDE built with React + TypeScript. Provides a compl | **User Settings** | Configure editor and appearance preferences | | **AI Agent** | Chat-based AI coding assistant | +--- + ## Tech Stack - **React 19** + **TypeScript** @@ -70,21 +156,7 @@ A modern, flexible workspace IDE built with React + TypeScript. Provides a compl - **Tailwind CSS v4** for styling - **Lucide React** for icons -## Getting Started - -```bash -# Install dependencies -npm install - -# Start development server -npm run dev - -# Build for production -npm run build - -# Preview production build -npm run preview -``` +--- ## Project Structure @@ -127,12 +199,7 @@ src/ └── AgentTool.tsx # AI agent chat ``` -## Keyboard Shortcuts - -| Shortcut | Action | -|----------|--------| -| `Ctrl+K` | Open search | -| `Escape` | Close search/spotlight/menus | +--- ## Architecture @@ -157,6 +224,53 @@ State is managed centrally via Zustand store with actions for: - File tree operations (CRUD + expand/collapse) - Application state (running, search, spotlight) +--- + +## Keyboard Shortcuts + +| Shortcut | Action | +|----------|--------| +| `Ctrl+K` | Open search | +| `Escape` | Close search/spotlight/menus | + +--- + +## Contributing + +Contributions are welcome! Please follow these guidelines: + +1. **Fork the repository** +2. **Create a new branch** + ```sh + git checkout -b feature/your-feature-name + ``` +3. **Make your changes** +4. **Test your changes** + ```sh + npm run lint + npm run build + ``` +5. **Commit and push** + ```sh + git commit -m "Add feature: your-feature-name" + git push origin feature/your-feature-name + ``` +6. **Open a pull request** + +**Issues & Suggestions:** +Open an issue for bugs, questions, or feature requests using the provided issue templates. + +--- + ## License -MIT +This project is licensed under the [Boost Software License 1.0](LICENSE). + +--- + +## Contact + +- **Organization:** [ATC-O48](https://github.com/ATC-O48) +- **Project Link:** https://github.com/ATC-O48/Claude-OpenAI-Code + +--- From 8a0128c04ccf2cd3f94c40285df36e56149ccf0b Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 13:41:34 +0000 Subject: [PATCH 2/5] chore(ci): pin Datadog Synthetic tests by public_id instead of tag query --- .github/workflows/datadog-synthetics.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/datadog-synthetics.yml b/.github/workflows/datadog-synthetics.yml index 66c70f8..201b8a3 100644 --- a/.github/workflows/datadog-synthetics.yml +++ b/.github/workflows/datadog-synthetics.yml @@ -33,6 +33,10 @@ jobs: with: api_key: ${{secrets.DD_API_KEY}} app_key: ${{secrets.DD_APP_KEY}} - test_search_query: 'tag:e2e-tests' #Modify this tag to suit your tagging strategy + # Pin tests explicitly by public_id so the CI test set is controlled via code review. + # Replace the placeholders below with the real Datadog Synthetic test public_ids. + public_ids: | + xxx-xxx-xxx + yyy-yyy-yyy From c091d59b11b2895d86064a3b1843ea3b53afc415 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 13:43:14 +0000 Subject: [PATCH 3/5] ci(datadog): skip synthetics steps when DD secrets are missing --- .github/workflows/datadog-synthetics.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/datadog-synthetics.yml b/.github/workflows/datadog-synthetics.yml index 201b8a3..577116d 100644 --- a/.github/workflows/datadog-synthetics.yml +++ b/.github/workflows/datadog-synthetics.yml @@ -24,11 +24,26 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Check Datadog secrets + id: check_secrets + env: + DD_API_KEY: ${{ secrets.DD_API_KEY }} + DD_APP_KEY: ${{ secrets.DD_APP_KEY }} + run: | + if [ -z "$DD_API_KEY" ] || [ -z "$DD_APP_KEY" ]; then + echo "Datadog secrets not configured; skipping Synthetic tests." + echo "skip=true" >> "$GITHUB_OUTPUT" + else + echo "skip=false" >> "$GITHUB_OUTPUT" + fi + + - if: steps.check_secrets.outputs.skip != 'true' + uses: actions/checkout@v4 # Run Synthetic tests within your GitHub workflow. # For additional configuration options visit the action within the marketplace: https://github.com/marketplace/actions/datadog-synthetics-ci - name: Run Datadog Synthetic tests + if: steps.check_secrets.outputs.skip != 'true' uses: DataDog/synthetics-ci-github-action@87b505388a22005bb8013481e3f73a367b9a53eb # v1.4.0 with: api_key: ${{secrets.DD_API_KEY}} From 943b9846c866e98dd107b5ca952c6b405291b835 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 13:45:18 +0000 Subject: [PATCH 4/5] ci(datadog): add path filters and manual dispatch trigger --- .github/workflows/datadog-synthetics.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/datadog-synthetics.yml b/.github/workflows/datadog-synthetics.yml index 577116d..54128c2 100644 --- a/.github/workflows/datadog-synthetics.yml +++ b/.github/workflows/datadog-synthetics.yml @@ -16,8 +16,19 @@ name: Run Datadog Synthetic tests on: push: branches: [ "main" ] + paths-ignore: + - '**/*.md' + - 'docs/**' + - '.github/**' + - '!.github/workflows/datadog-synthetics.yml' pull_request: branches: [ "main" ] + paths-ignore: + - '**/*.md' + - 'docs/**' + - '.github/**' + - '!.github/workflows/datadog-synthetics.yml' + workflow_dispatch: jobs: build: From fee9d7ee0710fe7f8a4d30c8abef23a5788f2422 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 13:54:56 +0000 Subject: [PATCH 5/5] fix: address 2 bugs from Devin Review on workspaceStore - Fix updateChildrenPaths: use startsWith+slice instead of String.replace() to prevent incorrect substring matching when renaming files/folders - Fix duplicateFile: deep-clone children with new IDs and paths when duplicating folders to avoid shared references Co-Authored-By: Thuong Huynh --- src/stores/workspaceStore.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/stores/workspaceStore.ts b/src/stores/workspaceStore.ts index c9cdda8..82532ad 100644 --- a/src/stores/workspaceStore.ts +++ b/src/stores/workspaceStore.ts @@ -192,7 +192,7 @@ function updateChildrenPaths(children: FileNode[], oldPath: string, newPath: str return children.map((child) => { const updatedChild: FileNode = { ...child, - path: child.path.replace(oldPath, newPath), + path: child.path.startsWith(oldPath) ? newPath + child.path.slice(oldPath.length) : child.path, }; if (updatedChild.children) { updatedChild.children = updateChildrenPaths(updatedChild.children, oldPath, newPath); @@ -201,6 +201,20 @@ function updateChildrenPaths(children: FileNode[], oldPath: string, newPath: str }); } +function deepCloneFileNode(node: FileNode, newParentPath: string): FileNode { + const cloned: FileNode = { + ...node, + id: genId('file'), + path: `${newParentPath}/${node.name}`, + }; + if (node.children) { + cloned.children = node.children.map((child) => + deepCloneFileNode(child, cloned.path) + ); + } + return cloned; +} + function addChildToFolder( nodes: FileNode[], parentPath: string, @@ -492,6 +506,11 @@ export const useWorkspaceStore = create((set, get) => ({ name: dupName, path: `${parentPath}/${dupName}`, }; + if (node.children) { + newNode.children = node.children.map((child) => + deepCloneFileNode(child, newNode.path) + ); + } if (!parentPath) { return { files: [...s.files, newNode] }; }