name: tech-stack description: GROWI technology stack, build tools, and global commands. Auto-invoked for all GROWI development work.
Jotai - Atomic state management (recommended for all packages with UI state)
SWR ^2.3.2 - Data fetching with caching
Biome ^2.2.6 - Unified linter and formatter (recommended)
Configuration: biome.json
# Lint and format check
biome check <files>
# Auto-fix issues
biome check --write <files>
Stylelint ^16.5.0 - SCSS/CSS linter
Configuration: .stylelintrc.js
# Lint styles
stylelint "src/**/*.scss"
Vitest ^2.1.1 - Unit and integration testing (recommended)
vitest.workspace.mtsReact Testing Library ^16.0.1 - Component testing
vitest-mock-extended ^2.0.2 - Type-safe mocking
Playwright ^1.49.1 - E2E testing
# Start all dev servers (apps/app + dependencies)
turbo run dev
# Start dev server for specific package
turbo run dev --filter @growi/app
# Install dependencies for all packages
pnpm install
# Bootstrap (install + build dependencies)
turbo run bootstrap
# Run a specific test file (from package directory, e.g. apps/app)
pnpm vitest run yjs.integ # Partial file name match
pnpm vitest run helper.spec # Works for any test file
pnpm vitest run yjs.integ --repeat=10 # Repeat for flaky test detection
# Run ALL tests for a package (uses Turborepo caching)
turbo run test --filter @growi/app
# Run linters for specific package
turbo run lint --filter @growi/app
# Build all packages
turbo run build
# Build specific package
turbo run build --filter @growi/core
Turborepo uses --filter to target specific packages:
# Run task for single package
turbo run test --filter @growi/app
# Run task for multiple packages
turbo run build --filter @growi/core --filter @growi/ui
# Run task for package and its dependencies
turbo run build --filter @growi/app...
pnpm-workspace.yaml - Defines workspace packages
packages:
- 'apps/*'
- 'packages/*'
strict: true)Package-specific tsconfig.json example:
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "**/*.spec.ts"]
}
turbo run test --filter @growi/appcd apps/app && pnpm test (bypasses Turborepo caching)Use vitest directly for individual test files (from package directory):
pnpm vitest run yjs.integ (simple, fast)turbo run test --filter @growi/app -- yjs.integ (unnecessary overhead)Use pnpm for package management:
pnpm installnpm install or yarn installRun tasks from workspace root:
Use Jotai for UI state:
// Example: Modal state
import { atom } from 'jotai';
export const isModalOpenAtom = atom(false);
Use SWR for server state:
// Example: Fetching pages
import useSWR from 'swr';
const { data, error, isLoading } = useSWR('/api/pages', fetcher);
Avoid mixing concerns:
Different apps in the monorepo may use different tech stacks:
See package-specific CLAUDE.md or skills for details.