diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index e6044823..8fb0a5f6 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -29,5 +29,13 @@ jobs: # optional dependencies (e.g., @tailwindcss/oxide, lightningcss binaries) run: npm install + - name: Install Linux native bindings + # Workaround for npm optional dependencies bug (npm/cli#4828) + # Explicitly install Linux bindings needed for build tools + run: | + npm install --no-save --force \ + @rollup/rollup-linux-x64-gnu@4.53.3 \ + @tailwindcss/oxide-linux-x64-gnu@4.1.17 + - name: Run build:electron run: npm run build:electron diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 36d53e37..d39673da 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -48,6 +48,15 @@ jobs: # optional dependencies (e.g., @tailwindcss/oxide, lightningcss binaries) run: npm install + - name: Install Linux native bindings + # Workaround for npm optional dependencies bug (npm/cli#4828) + # Only needed on Linux - macOS and Windows get their bindings automatically + if: matrix.os == 'ubuntu-latest' + run: | + npm install --no-save --force \ + @rollup/rollup-linux-x64-gnu@4.53.3 \ + @tailwindcss/oxide-linux-x64-gnu@4.1.17 + - name: Extract and set version id: version shell: bash diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..4cdc9c6e --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,53 @@ +name: Test Suite + +on: + pull_request: + branches: + - "*" + push: + branches: + - main + - master + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + cache-dependency-path: package-lock.json + + - name: Install dependencies + # Use npm install instead of npm ci to correctly resolve platform-specific + # optional dependencies (e.g., @tailwindcss/oxide, lightningcss binaries) + run: npm install + + - name: Install Linux native bindings + # Workaround for npm optional dependencies bug (npm/cli#4828) + # Explicitly install Linux bindings needed for build tools + run: | + npm install --no-save --force \ + @rollup/rollup-linux-x64-gnu@4.53.3 \ + @tailwindcss/oxide-linux-x64-gnu@4.1.17 + + - name: Run server tests with coverage + run: npm run test:server:coverage + env: + NODE_ENV: test + + # - name: Upload coverage reports + # uses: codecov/codecov-action@v4 + # if: always() + # with: + # files: ./apps/server/coverage/coverage-final.json + # flags: server + # name: server-coverage + # env: + # CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index dba6edc7..1d01c7c2 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ dist/ .automaker/ /.automaker/* /.automaker/ + +/old \ No newline at end of file diff --git a/.npmrc b/.npmrc index e5c1ee73..86aca125 100644 --- a/.npmrc +++ b/.npmrc @@ -8,3 +8,9 @@ # # In CI/CD: Use "npm install" instead of "npm ci" to allow npm to resolve # the correct platform-specific binaries at install time. + +# Include bindings for all platforms in package-lock.json to support CI/CD +# This ensures Linux, macOS, and Windows bindings are all present +# NOTE: Only enable when regenerating package-lock.json, then comment out to keep installs fast +# supportedArchitectures.os=linux,darwin,win32 +# supportedArchitectures.cpu=x64,arm64 diff --git a/apps/app/electron/main.js b/apps/app/electron/main.js index a39cc7d4..63fb2280 100644 --- a/apps/app/electron/main.js +++ b/apps/app/electron/main.js @@ -128,14 +128,18 @@ async function startServer() { let command, args, serverPath; if (isDev) { // In development, use tsx to run TypeScript directly - // Use the node executable that's running Electron - command = process.execPath; // This is the path to node.exe + // Use node from PATH (process.execPath in Electron points to Electron, not Node.js) + // spawn() resolves "node" from PATH on all platforms (Windows, Linux, macOS) + command = "node"; serverPath = path.join(__dirname, "../../server/src/index.ts"); - + // Find tsx CLI - check server node_modules first, then root - const serverNodeModules = path.join(__dirname, "../../server/node_modules/tsx"); + const serverNodeModules = path.join( + __dirname, + "../../server/node_modules/tsx" + ); const rootNodeModules = path.join(__dirname, "../../../node_modules/tsx"); - + let tsxCliPath; if (fs.existsSync(path.join(serverNodeModules, "dist/cli.mjs"))) { tsxCliPath = path.join(serverNodeModules, "dist/cli.mjs"); @@ -144,12 +148,16 @@ async function startServer() { } else { // Last resort: try require.resolve try { - tsxCliPath = require.resolve("tsx/cli.mjs", { paths: [path.join(__dirname, "../../server")] }); + tsxCliPath = require.resolve("tsx/cli.mjs", { + paths: [path.join(__dirname, "../../server")], + }); } catch { - throw new Error("Could not find tsx. Please run 'npm install' in the server directory."); + throw new Error( + "Could not find tsx. Please run 'npm install' in the server directory." + ); } } - + args = [tsxCliPath, "watch", serverPath]; } else { // In production, use compiled JavaScript @@ -230,13 +238,16 @@ async function waitForServer(maxAttempts = 30) { for (let i = 0; i < maxAttempts; i++) { try { await new Promise((resolve, reject) => { - const req = http.get(`http://localhost:${SERVER_PORT}/api/health`, (res) => { - if (res.statusCode === 200) { - resolve(); - } else { - reject(new Error(`Status: ${res.statusCode}`)); + const req = http.get( + `http://localhost:${SERVER_PORT}/api/health`, + (res) => { + if (res.statusCode === 200) { + resolve(); + } else { + reject(new Error(`Status: ${res.statusCode}`)); + } } - }); + ); req.on("error", reject); req.setTimeout(1000, () => { req.destroy(); diff --git a/apps/app/package.json b/apps/app/package.json index 40510b79..a5bafda6 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -24,6 +24,7 @@ "build:electron:win": "node scripts/prepare-server.js && next build && electron-builder --win", "build:electron:mac": "node scripts/prepare-server.js && next build && electron-builder --mac", "build:electron:linux": "node scripts/prepare-server.js && next build && electron-builder --linux", + "postinstall": "electron-builder install-app-deps", "start": "next start", "lint": "eslint", "test": "playwright test", @@ -54,7 +55,7 @@ "dotenv": "^17.2.3", "geist": "^1.5.1", "lucide-react": "^0.556.0", - "next": "16.0.7", + "next": "^16.0.10", "react": "19.2.0", "react-dom": "19.2.0", "react-markdown": "^10.1.0", diff --git a/apps/app/src/components/views/board-view.tsx b/apps/app/src/components/views/board-view.tsx index 12df34e5..5739790f 100644 --- a/apps/app/src/components/views/board-view.tsx +++ b/apps/app/src/components/views/board-view.tsx @@ -121,7 +121,7 @@ type ModelOption = { label: string; description: string; badge?: string; - provider: "claude" | "codex"; + provider: "claude"; }; const CLAUDE_MODELS: ModelOption[] = [ @@ -148,37 +148,6 @@ const CLAUDE_MODELS: ModelOption[] = [ }, ]; -const CODEX_MODELS: ModelOption[] = [ - { - id: "gpt-5.1-codex-max", - label: "GPT-5.1 Codex Max", - description: "Flagship Codex model tuned for deep coding tasks.", - badge: "Flagship", - provider: "codex", - }, - { - id: "gpt-5.1-codex", - label: "GPT-5.1 Codex", - description: "Strong coding performance with lower cost.", - badge: "Standard", - provider: "codex", - }, - { - id: "gpt-5.1-codex-mini", - label: "GPT-5.1 Codex Mini", - description: "Fastest Codex option for lightweight edits.", - badge: "Fast", - provider: "codex", - }, - { - id: "gpt-5.1", - label: "GPT-5.1", - description: "General-purpose reasoning with solid coding ability.", - badge: "General", - provider: "codex", - }, -]; - // Profile icon mapping const PROFILE_ICONS: Record< string, @@ -1693,12 +1662,8 @@ export function BoardView() {
- Codex CLI enables GPT-5.1 Codex models for autonomous coding tasks. -
-- Codex CLI Installed -
-- Method: {status.method} -
- )} - {status.version && ( -- Version:{" "} - {status.version} -
- )} - {status.path && ( -- Path:{" "} - - {status.path} - -
- )} -- {status.recommendation} -
- )} -- API Key Detected - CLI Not Installed -
-- {status.recommendation || - "OPENAI_API_KEY found but Codex CLI not installed. Install the CLI for full agentic capabilities."} -
-- Installation Commands: -
-npm:
-
- {status.installCommands.npm}
-
- - Codex CLI Not Detected -
-- {status.recommendation || - "Install OpenAI Codex CLI to use GPT-5.1 Codex models for autonomous coding."} -
-- Installation Commands: -
-npm:
-
- {status.installCommands.npm}
-
- - macOS (Homebrew): -
-
- {status.installCommands.macos}
-
- When enabled, the Add Feature dialog will show only AI profiles and hide advanced model tweaking options (Claude SDK, thinking - levels, and OpenAI Codex CLI). This creates a cleaner, less + levels). This creates a cleaner, less overwhelming UI. You can always disable this to access advanced settings.
diff --git a/apps/app/src/components/views/settings-view/hooks/use-cli-status.ts b/apps/app/src/components/views/settings-view/hooks/use-cli-status.ts index 600a5f67..4b65d1ae 100644 --- a/apps/app/src/components/views/settings-view/hooks/use-cli-status.ts +++ b/apps/app/src/components/views/settings-view/hooks/use-cli-status.ts @@ -18,25 +18,17 @@ interface CliStatusResult { error?: string; } -interface CodexCliStatusResult extends CliStatusResult { - hasApiKey?: boolean; -} - /** - * Custom hook for managing Claude and Codex CLI status + * Custom hook for managing Claude CLI status * Handles checking CLI installation, authentication, and refresh functionality */ export function useCliStatus() { - const { setClaudeAuthStatus, setCodexAuthStatus } = useSetupStore(); + const { setClaudeAuthStatus } = useSetupStore(); const [claudeCliStatus, setClaudeCliStatus] = useState- OpenAI's GPT-5.1 Codex for advanced code generation -
-
- npm install -g @openai/codex
-
- - Requires Node.js to be installed. If the auto-install fails, - try running the command manually in your terminal. -
-- Authenticate via CLI -
-- Run this command in your terminal: -
-
- codex auth login
-
-
- Get your API key from{" "}
-
- platform.openai.com
-
- Codex is ready to use! -
-- {getAuthMethodLabel() && - `Authenticated via ${getAuthMethodLabel()}. `} - You can proceed to complete setup -
-Codex
-- {codexReady ? "Ready to use" : "Configure later in settings"} -
-- OpenAI's GPT-5.1 Codex for advanced code generation tasks -
-