open-design/tools/dev/tests/diagnostics.test.ts
Eli-tangerine 8193981511
Keep PR 2400 changes without folder pickers (#2462)
* feat(daemon): add project working directory management and editor hand-off functionality

- Introduced new flags for project commands to manage working directories, including `--working-dir` and `--dir`.
- Implemented API routes for listing available editors and opening projects in selected editors.
- Added a hand-off button in the ChatPane header to facilitate opening project folders in local applications.
- Enhanced the HomeHero component to include working directory and design system settings, improving user experience in project creation.
- Created HomeHeroSettingsChips component for inline management of working directory and design system selection.

* feat(chat): implement voice transcription proxy and enhance UI components

- Added a new API route for voice transcription using OpenAI's `/audio/transcriptions` endpoint, allowing users to send audio blobs directly for transcription.
- Integrated multer for handling audio file uploads in memory, ensuring efficient processing without disk storage.
- Updated the HomeHero component to include example prompt suggestions for plugins, enhancing user interaction.
- Introduced the EditorIcon component to visually represent different editors in the hand-off menu, improving the user experience.
- Refined the HandoffButton component to utilize the new EditorIcon, providing a more cohesive interface for selecting editors.
- Enhanced CSS styles for various components to improve layout and responsiveness, including adjustments to tab and button sizes for better usability.

* style(workspace-shell): enhance layout and overflow handling

- Updated CSS for .workspace-shell to ensure full viewport width and height, with proper overflow management.
- Adjusted grid layout to prevent content overflow and maintain responsiveness.
- Modified styles for .workspace-tabs-chrome to improve width handling and prevent overflow issues.

* refactor(chat): remove voice transcription proxy and related components

- Deleted the voice transcription proxy implementation, including the associated API route and multer configuration.
- Removed the MicButton component from the ChatComposer and HomeHero components to streamline the UI.
- Updated HomeHero to include example suggestions without the voice input functionality.
- Adjusted CSS styles for various components to maintain layout consistency after the removal of the MicButton.

* feat(daemon): implement minting of HMAC tokens for working directory management

- Added a new function `mintImportTokenFromCurrentSecret` to generate HMAC tokens bound to a specified base directory, enhancing security for working directory operations.
- Updated the `desktop-auth.ts` file to include the new token minting functionality, which returns structured errors when the desktop auth secret is cleared.
- Introduced new IPC message types for minting import tokens in the sidecar protocol, allowing seamless integration with the daemon's working directory management.
- Enhanced the `WorkingDirPill` component to utilize the new token minting flow for secure directory selection in desktop builds.
- Updated CSS styles for the HomeHero component to accommodate new example suggestion features and maintain layout consistency.

* fix(HomeView): import HOME_HERO_CHIPS constant for improved chip management

- Updated the HomeView component to import the HOME_HERO_CHIPS constant from the chips module, enhancing the management of hero chips within the component.

* feat(daemon): implement mintImportTokenViaSidecar for secure working directory management

- Introduced the `mintImportTokenViaSidecar` function to facilitate the minting of HMAC tokens for desktop-import operations via the daemon's sidecar IPC. This allows CLI commands to bypass authentication when the desktop-auth gate is active.
- Updated the CLI to utilize the new token minting function when setting the working directory, ensuring secure access to trust-gated API endpoints.
- Enhanced the sidecar server to handle minting requests and return structured error messages for improved user feedback.
- Added tests to validate the new token minting functionality and its integration with the working directory management process.
- Refactored related components to support the new token flow, improving overall security and user experience.

* feat(HomeHero): enhance UI components and styles for improved user experience

- Updated HomeHero component to replace active dot indicators with Plug icons for better visual representation of active plugins.
- Adjusted CSS styles for various elements, including padding and dimensions, to enhance layout consistency and responsiveness.
- Introduced new styles for active type icons and improved hover effects for buttons.
- Updated HomeHeroSettingsChips to change button titles and icons for clarity.
- Added tests to ensure proper rendering and functionality of updated components.

* feat(ProjectDesignSystemPicker): enhance design system selection with preview functionality

- Updated the ProjectDesignSystemPicker component to include a preview feature for design systems, allowing users to see a preview of the selected design system.
- Implemented hover functionality to update the preview based on the hovered design system.
- Added fullscreen preview capability for a more immersive experience.
- Enhanced CSS styles for the design system picker to improve layout and responsiveness.
- Introduced tests to validate the new preview functionality and ensure proper interaction within the component.

* feat: refactor project metadata handling and enhance design system picker

- Updated the default scenario plugin ID retrieval to use project metadata, improving the logic for determining the appropriate plugin based on project intent.
- Enhanced the ProjectDesignSystemPicker and related components to support localized design system summaries and categories, improving user experience.
- Introduced new translations for working directory and design system picker components, ensuring better accessibility and usability across different locales.
- Added a new 'live-artifact' project type to the HomeHero chips, expanding the functionality for users creating refreshable artifacts.
- Updated tests to validate the new project metadata handling and design system picker functionalities.

* feat: enhance localization and styling for design system components

- Added French translations for working directory and design system picker components, improving accessibility for French-speaking users.
- Updated CSS styles for the pet task item to ensure consistent padding and layout.
- Introduced a new test suite for HomeHeroSettingsChips to validate localization and design system selection functionality.
- Enhanced ProjectDesignSystemPicker tests to ensure proper localization and interaction with design system categories.

* fix: update .gitignore to include all claude-sessions directories and remove specific session files

- Modified .gitignore to ensure all claude-sessions directories are ignored by using a wildcard pattern.
- Deleted two specific claude-sessions markdown files to clean up unnecessary session data.

* fix: repair home automation ci regressions

* fix: stabilize artifact consistency e2e

* Remove folder picker changes from PR 2400

---------

Co-authored-by: pftom <1043269994@qq.com>
Co-authored-by: qiongyu1999 <2694684348@qq.com>
2026-05-20 22:07:30 +08:00

99 lines
4.3 KiB
TypeScript

import assert from "node:assert/strict";
import { describe, it } from "node:test";
import {
appendStartupLogDiagnostics,
createStartupLogDiagnostics,
detectLogDiagnostics,
formatUnsupportedNodeRuntimeMessage,
isSupportedNodeRuntime,
} from "../src/diagnostics.js";
describe("tools-dev diagnostics", () => {
it("detects native addon ABI mismatches", () => {
const diagnostics = detectLogDiagnostics(
[
"Error: The module '/repo/node_modules/better-sqlite3/build/Release/better_sqlite3.node'",
"was compiled against a different Node.js version using",
"NODE_MODULE_VERSION 127. This version of Node.js requires",
"NODE_MODULE_VERSION 137. Please try re-compiling or re-installing",
],
{ nodeModuleVersion: "137", nodeVersion: "v24.15.0" },
);
assert.equal(diagnostics.length, 1);
assert.match(diagnostics[0].message, /native Node addon ABI mismatch/);
assert.match(diagnostics[0].recommendation, /active Node 24 runtime/);
assert.match(diagnostics[0].recommendation, /corepack pnpm --filter @open-design\/daemon rebuild better-sqlite3 --pending/);
assert.match(diagnostics[0].recommendation, /corepack pnpm install --frozen-lockfile/);
});
it("points ABI mismatches under unsupported Node at Node 24 first", () => {
const diagnostics = detectLogDiagnostics(
[
"Error: better_sqlite3.node was compiled against a different Node.js version using",
"NODE_MODULE_VERSION 137. This version of Node.js requires",
"NODE_MODULE_VERSION 127.",
],
{ nodeModuleVersion: "127", nodeVersion: "v22.22.3" },
);
assert.equal(diagnostics.length, 1);
assert.match(diagnostics[0].recommendation, /Current tools-dev runtime: Node v22\.22\.3/);
assert.match(diagnostics[0].recommendation, /Switch to Node 24 first/);
assert.match(diagnostics[0].recommendation, /nvm use 24/);
});
it("formats unsupported Node runtime errors before startup", () => {
assert.equal(isSupportedNodeRuntime("v24.15.0"), true);
assert.equal(isSupportedNodeRuntime("v22.22.3"), false);
const message = formatUnsupportedNodeRuntimeMessage({ nodeModuleVersion: "127", nodeVersion: "v22.22.3" });
assert.match(message, /tools-dev must run with Node ~24/);
assert.match(message, /Current runtime: Node v22\.22\.3 \(NODE_MODULE_VERSION 127\)/);
assert.match(message, /corepack pnpm install --frozen-lockfile/);
});
it("detects missing Next.js package resolution during web startup", () => {
const diagnostics = detectLogDiagnostics([
"Turbopack build failed with 1 errors:",
"./apps/web/app",
"Error: Next.js inferred your workspace root, but it may not be correct.",
"We couldn't find the Next.js package (next/package.json) from the project directory: /repo/apps/web/app",
]);
assert.equal(diagnostics.length, 1);
assert.match(diagnostics[0].message, /Next\.js package is not resolvable/);
assert.match(diagnostics[0].recommendation, /apps\/web\/node_modules\/next/);
assert.match(diagnostics[0].recommendation, /pnpm install --frozen-lockfile/);
});
it("detects missing Next.js package resolution when details change", () => {
const diagnostics = detectLogDiagnostics([
"Error: We couldn't find the Next.js package from the project directory: /repo/apps/web/app",
]);
assert.equal(diagnostics.length, 1);
assert.match(diagnostics[0].message, /Next\.js package is not resolvable/);
});
it("does not report diagnostics for unrelated logs", () => {
assert.deepEqual(detectLogDiagnostics(["daemon booting", "ready"]), []);
});
it("appends log tails and recommendations to startup timeout errors", () => {
const error = appendStartupLogDiagnostics(
new Error("daemon did not expose status in time"),
"daemon",
createStartupLogDiagnostics("/tmp/daemon.log", [
"better_sqlite3.node was compiled against a different Node.js version using",
"NODE_MODULE_VERSION 127. This version of Node.js requires NODE_MODULE_VERSION 137.",
]),
);
assert.match(error.message, /daemon did not expose status in time/);
assert.match(error.message, /daemon log tail \(\/tmp\/daemon\.log\)/);
assert.match(error.message, /better_sqlite3\.node/);
assert.match(error.message, /corepack pnpm --filter @open-design\/daemon rebuild better-sqlite3 --pending/);
});
});