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
6 changes: 3 additions & 3 deletions .github/workflows/pull-request-build-lint-web-apps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build Affected
run: pnpm turbo run build --affected

- name: Lint Affected
run: pnpm turbo run check:lint --affected

Expand All @@ -51,6 +54,3 @@ jobs:

- name: Check Affected types
run: pnpm turbo run check:types --affected

- name: Build Affected
run: pnpm turbo run build --affected
1 change: 1 addition & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pnpm lint-staged
75 changes: 50 additions & 25 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -1,34 +1,59 @@
# Enforce pnpm workspace behavior and allow Turbo's lifecycle hooks if scripts are disabled
# This repo uses pnpm with workspaces.
# ------------------------------
# Core Workspace Behavior
# ------------------------------

# Prefer linking local workspace packages when available
prefer-workspace-packages=true
link-workspace-packages=true
shared-workspace-lockfile=true
# Always prefer using local workspace packages when available
prefer-workspace-packages = true

# Make peer installs smoother across the monorepo
auto-install-peers=true
strict-peer-dependencies=false
# Symlink workspace packages instead of duplicating them
link-workspace-packages = true

# If scripts are disabled (e.g., CI with --ignore-scripts), allowlisted packages can still run their hooks
# Turbo occasionally performs postinstall tasks for optimal performance
# moved to pnpm-workspace.yaml: onlyBuiltDependencies (e.g., allow turbo)
# Use a single lockfile across the whole monorepo
shared-workspace-lockfile = true

public-hoist-pattern[]=*eslint*
public-hoist-pattern[]=prettier
public-hoist-pattern[]=typescript
# Ensure packages added from workspace save using workspace: protocol
save-workspace-protocol = true

# Reproducible installs across CI and dev
prefer-frozen-lockfile=true

# Prefer resolving to highest versions in monorepo to reduce duplication
resolution-mode=highest
# ------------------------------
# Dependency Resolution
# ------------------------------

# Speed up native module builds by caching side effects
side-effects-cache=true
# Choose the highest compatible version across the workspace
# → reduces fragmentation & node_modules bloat
resolution-mode = highest

# Speed up local dev by reusing local store when possible
prefer-offline=true
# Automatically install peer dependencies instead of forcing every package to declare them
auto-install-peers = true

# Ensure workspace protocol is used when adding internal deps
save-workspace-protocol=true
# Don't break the install if peers are missing
strict-peer-dependencies = false


# ------------------------------
# Performance Optimizations
# ------------------------------

# Use cached artifacts for native modules (sharp, esbuild, etc.)
side-effects-cache = true

# Prefer local cached packages rather than hitting network
prefer-offline = true

# In CI, refuse to modify lockfile (prevents drift)
prefer-frozen-lockfile = true

# Use isolated linker (best compatibility with Node ecosystem tools)
node-linker = isolated


# ------------------------------
# Hoisting Strategy
# ------------------------------

# Hoist commonly used tools to the root to prevent duplicates and speed up resolution
public-hoist-pattern[] = typescript
public-hoist-pattern[] = eslint
public-hoist-pattern[] = *@plane/*
public-hoist-pattern[] = vite
public-hoist-pattern[] = turbo
Comment on lines +50 to +59
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Verify that hoisted packages are actually installed and used across the monorepo.

echo "=== Checking for presence of hosted tools in package.json files ==="
# Check root and major app/package package.json files for these dependencies
for pattern in typescript eslint vite turbo; do
  echo -e "\n--- Searching for $pattern dependency ---"
  fd 'package\.json$' -x grep -l "\"$pattern\"" {} \; | head -10
done

echo -e "\n=== Checking for @plane scoped packages ==="
fd 'package\.json$' -x grep -l '"@plane/' {} \; | head -10

echo -e "\n=== Checking if prettier is used anywhere (as potential hoisting candidate) ==="
rg -n 'prettier' --type=json | head -20

Repository: makeplane/plane

Length of output: 2550


Confirm prettier should be added to public-hoist-pattern.

The hoisting patterns are mostly appropriate:

  • typescript: ✓ Justified – used across 9+ packages for compilation
  • vite: ✓ Justified – used in 3 apps (space, web, admin) for dev builds
  • @plane/: ✓ Justified – used across 10+ scoped packages
  • eslint and turbo: Consider removing – these are root-only devDependencies and workspace tools; hoisting them typically doesn't benefit child packages
  • prettier: Add to hoisting patterns – it's actively used across 8+ packages (utils, ui, types, services, propel, shared-state, hooks, i18n) for formatting tasks

Suggested revision:

public-hoist-pattern[] = typescript
public-hoist-pattern[] = *@plane/*
public-hoist-pattern[] = vite
public-hoist-pattern[] = prettier
🤖 Prompt for AI Agents
In .npmrc around lines 50 to 59, update the public-hoist-pattern list: remove
eslint and turbo entries (they are root-only dev tools and need not be hoisted)
and add prettier to the hoist list so formatting dependency is available to
child packages; ensure final patterns include typescript, *@plane/*, vite, and
prettier in that section.

10 changes: 10 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.next/
.react-router/
.turbo/
.vite/
build/
dist/
node_modules/
out/
pnpm-lock.yaml
storybook-static/
13 changes: 11 additions & 2 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
{
"$schema": "https://json.schemastore.org/prettierrc",
"overrides": [
{
"files": ["packages/codemods/**/*"],
"options": {
"printWidth": 80
}
}
],
"plugins": ["@prettier/plugin-oxc"],
"printWidth": 120,
"tabWidth": 2,
"trailingComma": "es5",
"plugins": ["@prettier/plugin-oxc"]
"trailingComma": "es5"
}
1 change: 1 addition & 0 deletions CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
eslint.config.mjs @lifeiscontent
18 changes: 10 additions & 8 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ If you would like to _implement_ it, an issue with your proposal must be submitt
To ensure consistency throughout the source code, please keep these rules in mind as you are working:

- All features or bug fixes must be tested by one or more specs (unit-tests).
- We use [Eslint default rule guide](https://eslint.org/docs/rules/), with minor changes. An automated formatter is available using prettier.
- We lint with [ESLint 9](https://eslint.org/docs/latest/) using the shared `eslint.config.mjs` (type-aware via `typescript-eslint`) and format with [Prettier](https://prettier.io/) using `prettier.config.cjs`.

## Ways to contribute

Expand Down Expand Up @@ -187,18 +187,19 @@ Adding a new language involves several steps to ensure it integrates seamlessly
Add the new language to the TLanguage type in the language definitions file:

```ts
// packages/i18n/src/types/language.ts
export type TLanguage = "en" | "fr" | "your-lang";
// packages/i18n/src/types/language.ts
export type TLanguage = "en" | "fr" | "your-lang";
```

1. **Add language configuration**
Include the new language in the list of supported languages:

```ts
// packages/i18n/src/constants/language.ts
export const SUPPORTED_LANGUAGES: ILanguageOption[] = [
{ label: "English", value: "en" },
{ label: "Your Language", value: "your-lang" }
];
// packages/i18n/src/constants/language.ts
export const SUPPORTED_LANGUAGES: ILanguageOption[] = [
{ label: "English", value: "en" },
{ label: "Your Language", value: "your-lang" },
];
```

2. **Create translation files**
Expand All @@ -210,6 +211,7 @@ Adding a new language involves several steps to ensure it integrates seamlessly

3. **Update import logic**
Modify the language import logic to include your new language:

```ts
private importLanguageFile(language: TLanguage): Promise<any> {
switch (language) {
Expand Down
14 changes: 0 additions & 14 deletions apps/admin/.eslintignore

This file was deleted.

18 changes: 0 additions & 18 deletions apps/admin/.eslintrc.cjs

This file was deleted.

16 changes: 9 additions & 7 deletions apps/admin/.prettierignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
.next
.react-router
.vite
.vercel
.tubro
out/
dist/
.next/
.react-router/
.turbo/
.vite/
build/
dist/
node_modules/
out/
pnpm-lock.yaml
storybook-static/
6 changes: 0 additions & 6 deletions apps/admin/.prettierrc

This file was deleted.

10 changes: 4 additions & 6 deletions apps/admin/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@
"preview": "react-router build && serve -s build/client -l 3001",
"start": "serve -s build/client -l 3001",
"clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist && rm -rf build",
"check:lint": "eslint . --max-warnings 19",
"check:lint": "eslint . --max-warnings=485",
"check:types": "react-router typegen && tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",
"fix:format": "prettier --write \"**/*.{ts,tsx,md,json,css,scss}\""
"check:format": "prettier --check .",
"fix:lint": "eslint . --fix --max-warnings=485",
"fix:format": "prettier --write ."
},
"dependencies": {
"@bprogress/core": "catalog:",
Expand Down Expand Up @@ -49,10 +49,8 @@
},
"devDependencies": {
"@dotenvx/dotenvx": "catalog:",
"@plane/eslint-config": "workspace:*",
"@plane/tailwind-config": "workspace:*",
"@plane/typescript-config": "workspace:*",
"@prettier/plugin-oxc": "0.1.3",
"@react-router/dev": "catalog:",
"@types/lodash-es": "catalog:",
"@types/node": "catalog:",
Expand Down
1 change: 0 additions & 1 deletion apps/admin/postcss.config.cjs
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
// eslint-disable-next-line @typescript-eslint/no-require-imports
module.exports = require("@plane/tailwind-config/postcss.config.js");
1 change: 0 additions & 1 deletion apps/admin/tailwind.config.cjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* eslint-disable @typescript-eslint/no-require-imports */
const sharedConfig = require("@plane/tailwind-config/tailwind.config.js");

module.exports = {
Expand Down
21 changes: 13 additions & 8 deletions apps/admin/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
{
"extends": "@plane/typescript-config/react-router.json",
"compilerOptions": {
"baseUrl": ".",
"noImplicitOverride": false,
"exactOptionalPropertyTypes": false,
"noUnusedParameters": false,
"noUnusedLocals": false,
Comment on lines +4 to +7
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat apps/admin/tsconfig.json

Repository: makeplane/plane

Length of output: 728


🏁 Script executed:

fd "react-router.json" --type f

Repository: makeplane/plane

Length of output: 103


🏁 Script executed:

git diff HEAD~1 apps/admin/tsconfig.json 2>/dev/null || git show HEAD:apps/admin/tsconfig.json 2>/dev/null || echo "Git history unavailable"

Repository: makeplane/plane

Length of output: 728


🏁 Script executed:

rg "noImplicitOverride|exactOptionalPropertyTypes|noUnusedParameters|noUnusedLocals" --type json --max-count=10 -B 2 -A 2

Repository: makeplane/plane

Length of output: 5262


🏁 Script executed:

cat packages/typescript-config/react-router.json

Repository: makeplane/plane

Length of output: 483


🏁 Script executed:

cat packages/typescript-config/base.json | head -50

Repository: makeplane/plane

Length of output: 909


🏁 Script executed:

rg "noImplicitOverride|noUnusedLocals|noUnusedParameters|exactOptionalPropertyTypes" --type md --max-count=5

Repository: makeplane/plane

Length of output: 41


🏁 Script executed:

git log --oneline --all -- apps/admin/tsconfig.json 2>/dev/null | head -5 || echo "Git history unavailable"

Repository: makeplane/plane

Length of output: 154


Strictness flags disabled without documented justification.

The four compiler options (noImplicitOverride, exactOptionalPropertyTypes, noUnusedParameters, noUnusedLocals) are explicitly set to false, overriding the strict settings from the base configuration. This pattern is systematic across the codebase (apps/web, apps/space, apps/live, and multiple packages), but lacks documented reasoning.

Clarify:

  1. Why these flags are disabled across the codebase
  2. Whether this decision is intentional and permanent, or planned to be addressed
  3. If code fixes would be preferable to global suppression
🤖 Prompt for AI Agents
In apps/admin/tsconfig.json lines 4-7 the compiler strictness flags
noImplicitOverride, exactOptionalPropertyTypes, noUnusedParameters, and
noUnusedLocals are explicitly set to false without documented justification;
either restore strictness by removing these overrides so the file inherits the
base config or flip each flag to true and fix resulting type/unused issues, and
if disabling is intentional add a short inline comment in this tsconfig (or a
central CONTRIBUTING/TSCONFIG.md entry) stating why each flag is disabled,
whether it’s temporary or permanent, and a planned remediation timeline so
reviewers know this is deliberate and tracked.

"rootDirs": [".", "./.react-router/types"],
"types": ["node", "vite/client"],
"types": ["vite/client"],
"paths": {
"@/app/*": ["app/*"],
"@/*": ["core/*"],
"@/plane-admin/*": ["ce/*"],
"@/styles/*": ["styles/*"]
},
"strictNullChecks": true
"package.json": ["./package.json"],
"ce/*": ["./ce/*"],
"@/app/*": ["./app/*"],
"@/*": ["./core/*"],
"@/plane-admin/*": ["./ce/*"],
"@/ce/*": ["./ce/*"],
"@/styles/*": ["./styles/*"]
}
},
"include": ["**/*", "**/.server/**/*", "**/.client/**/*", ".react-router/types/**/*"],
"exclude": ["node_modules"]
Expand Down
10 changes: 10 additions & 0 deletions apps/api/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.next/
.react-router/
.turbo/
.vite/
build/
dist/
node_modules/
out/
pnpm-lock.yaml
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Remove pnpm-lock.yaml from per-package .prettierignore.

Same issue as other package-level files in this PR—lockfiles should be ignored centrally from the repository root.

  node_modules/
  out/
- pnpm-lock.yaml
  storybook-static/
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
pnpm-lock.yaml
node_modules/
out/
storybook-static/
🤖 Prompt for AI Agents
In apps/api/.prettierignore around line 9, remove the line "pnpm-lock.yaml" so
per-package prettier ignores no longer include the lockfile; ensure that
lockfiles are ignored centrally from the repository root .prettierignore (or
.gitignore) instead and do not reintroduce package-level lockfile ignores in
other package .prettierignore files.

storybook-static/
4 changes: 0 additions & 4 deletions apps/live/.eslintignore

This file was deleted.

4 changes: 0 additions & 4 deletions apps/live/.eslintrc.cjs

This file was deleted.

14 changes: 9 additions & 5 deletions apps/live/.prettierignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
.next
.turbo
out/
dist/
.next/
.react-router/
.turbo/
.vite/
build/
node_modules/
dist/
node_modules/
out/
pnpm-lock.yaml
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Remove pnpm-lock.yaml from per-package .prettierignore.

This entry is ineffective in package-level ignore files when prettier runs from individual package directories. The root .prettierignore should handle this centrally.

  .vite/
  build/
  dist/
  node_modules/
  out/
- pnpm-lock.yaml
  storybook-static/
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
pnpm-lock.yaml
.vite/
build/
dist/
node_modules/
out/
storybook-static/
🤖 Prompt for AI Agents
In apps/live/.prettierignore around line 9, remove the line "pnpm-lock.yaml"
because package-level .prettierignore entries for lockfiles are ineffective when
prettier runs from package directories; ensure the root .prettierignore contains
"pnpm-lock.yaml" so the lockfile is ignored globally, then save and commit the
change.

storybook-static/
6 changes: 0 additions & 6 deletions apps/live/.prettierrc

This file was deleted.

10 changes: 4 additions & 6 deletions apps/live/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
"build": "tsc --noEmit && tsdown",
"dev": "tsdown --watch --onSuccess \"node --env-file=.env .\"",
"start": "node --env-file=.env .",
"check:lint": "eslint . --max-warnings 10",
"check:lint": "eslint . --max-warnings=160",
"check:types": "tsc --noEmit",
"check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"",
"fix:lint": "eslint . --fix",
"fix:format": "prettier --write \"**/*.{ts,tsx,md,json,css,scss}\"",
"check:format": "prettier --check .",
"fix:lint": "eslint . --fix --max-warnings=160",
"fix:format": "prettier --write .",
"clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist"
},
"author": "Plane Software Inc.",
Expand Down Expand Up @@ -53,9 +53,7 @@
"zod": "^3.25.76"
},
"devDependencies": {
"@plane/eslint-config": "workspace:*",
"@plane/typescript-config": "workspace:*",
"@prettier/plugin-oxc": "0.1.3",
"@types/compression": "1.8.1",
"@types/cors": "^2.8.17",
"@types/express": "4.17.23",
Expand Down
Loading
Loading