Skip to content

Conversation

@lifeiscontent
Copy link
Collaborator

@lifeiscontent lifeiscontent commented Nov 27, 2025

Description

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • Feature (non-breaking change which adds functionality)
  • Improvement (change that would cause existing functionality to not work as expected)
  • Code refactoring
  • Performance improvements
  • Documentation update

Screenshots and Media (if applicable)

Test Scenarios

References

Summary by CodeRabbit

  • Chores
    • Added a pre-commit hook and lint-staged; introduced centralized lint/format tooling and top-level config; updated package scripts and workspace package manager settings.
  • Refactor
    • Removed many per-package lint/Prettier files and consolidated ignore patterns under a root configuration.
  • New Features
    • Added several named exports and expanded the icon set.
  • Documentation
    • Updated contributing and lint/format guidance.

✏️ Tip: You can customize this high-level summary in your review settings.

@lifeiscontent lifeiscontent self-assigned this Nov 27, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 27, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Adds a centralized ESLint v9 config, wire up Husky + lint-staged, standardize Prettier and .prettierignore files, normalize TypeScript configs and path aliases, remove many per-package ESLint/Prettier files, update pnpm/.npmrc settings, and inline a requestIdleCallback polyfill.

Changes

Cohort / File(s) Summary
Central ESLint + Ownership
eslint.config.mjs, CODEOWNERS
Add a unified ESLint v9 flat config and register it in CODEOWNERS.
Root Prettier & Ignore
.prettierrc, .prettierignore, packages/*/.prettierrc?, apps/*/.prettierrc?
Add/normalize root Prettier config (schema, plugin, override) and standardize .prettierignore files across scopes; remove many per-package .prettierrc files.
PNPM / Husky / lint-staged
.npmrc, .husky/pre-commit, package.json
Rework .npmrc settings for workspace linking/hoisting/node-linker; add Husky pre-commit hook to run pnpm lint-staged; update root package.json scripts, devDependencies, and add top-level lint-staged block.
Remove per-package ESLint configs
packages/eslint-config/*, many **/.eslintrc.*, many **/.eslintignore
Delete legacy @plane ESLint package and numerous per-package ESLint config/ignore files across apps and packages.
Scripts & devDeps unification
many apps/*/package.json, many packages/*/package.json
Replace direct eslint/prettier calls with pnpm or simplified commands, increase/adjust --max-warnings, and remove @prettier/plugin-oxc and related devDeps in many packages.
Standardize .prettierignore per-scope
apps/*/.prettierignore, packages/*/.prettierignore, packages/codemods/.prettierignore, apps/api/.prettierignore, apps/proxy/.prettierignore
Add or standardize .prettierignore files using recursive globs for build outputs, caches, node_modules, pnpm-lock.yaml, and storybook output.
TSConfig normalization & metadata
apps/*/tsconfig.json, packages/*/tsconfig.json, packages/propel/tsconfig.json, packages/services/tsconfig.json, packages/typescript-config/base.json
Remove baseUrl, make path targets explicit ("./..."), add/adjust strictness-related flags, and enable incremental/composite build metadata in base config.
Remove inline lint suppressions
many postcss.config.*, tailwind.config.*, specific component files like apps/space/.../comment-detail-card.tsx
Delete ESLint disable comments/suppressions; runtime behavior unchanged, linting enforcement may change.
Exports: named additions, dedup & reorder
apps/web/ce/.../attributes.tsx, apps/web/core/components/integration/guide.tsx, apps/web/core/components/home/widgets/index.ts, apps/web/core/components/issues/.../sub-issues/index.ts, packages/services/src/**/*.ts
Add several named exports (alongside defaults), remove duplicate re-exports, reorder exports, and expose named exports for several services.
Polyfill consolidation
apps/web/core/lib/polyfills/index.ts, (removed) apps/web/core/lib/polyfills/requestIdleCallback.ts
Inline requestIdleCallback polyfill into index.ts and remove the separate module.
Icons & misc re-exports
packages/propel/src/icons/*, assorted packages/propel/*
Reorder, deduplicate, and expand icon exports; minor public export surface adjustments.
CI workflow tweak
.github/workflows/pull-request-build-lint-web-apps.yml
Move Build Affected step earlier and remove duplicate step.
Prettier ignores added for new scopes
new apps/api/.prettierignore, apps/proxy/.prettierignore, packages/codemods/.prettierignore, etc.
Add missing .prettierignore files to several apps/packages with standard ignore patterns.

Sequence Diagram(s)

sequenceDiagram
    participant Dev as Developer
    participant Git as Git
    participant Husky as Husky (pre-commit)
    participant LintStaged as lint-staged (pnpm)
    participant ESLint as ESLint (eslint.config.mjs)
    participant Prettier as Prettier (.prettierrc)

    Dev->>Git: git commit (staged files)
    Git->>Husky: trigger pre-commit hook
    Husky->>LintStaged: run `pnpm lint-staged`
    LintStaged->>ESLint: lint staged files
    ESLint-->>LintStaged: results
    LintStaged->>Prettier: format staged files
    Prettier-->>LintStaged: results
    LintStaged-->>Husky: success / failure
    alt success
        Husky->>Git: allow commit
    else failure
        Husky->>Dev: block commit, show errors
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Focus areas:

  • eslint.config.mjs — comprehensive rule set, overrides, parserOptions, and plugin compatibility.
  • Root package.json — new devDependencies, lint-staged config, prepare/husky wiring.
  • .npmrc — workspace linking/hoisting and node-linker behavior changes.
  • Large deletions of per-package ESLint/Prettier files — verify lint coverage and CI implications.
  • TSConfig path mappings and incremental/composite metadata in packages/typescript-config/base.json.
  • Polyfill inlining in apps/web/core/lib/polyfills/index.ts.
  • Service files where named exports were added (ensure no export collisions).

Poem

🐰 I hopped through configs, tidy and light,
Husky guards the commits by day and night.
Prettier trims whiskers, ESLint hums a tune,
Paths point like burrows beneath the moon.
A rabbit bumps the key — the repo feels right.

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description consists entirely of unfilled template placeholders with no actual content. All required sections (Description, Type of Change, Test Scenarios, References) remain empty or contain only template instructions. Complete all required sections: provide a detailed description of the ESLint/Prettier refactoring, select the appropriate type of change (likely Code refactoring), describe test scenarios, and link any related issues.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive The title 'feat: eslint' is vague and generic. While it indicates ESLint-related changes, it doesn't convey the primary scope or nature of the changes, which involves a major ESLint and Prettier tooling refactor across the entire monorepo. Provide a more descriptive title that captures the main change, such as 'feat: migrate to flat ESLint config and remove local Prettier configs' or 'refactor: consolidate linting configuration to workspace root'.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/eslint

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8047ebc and ba4d9b0.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (2)
  • apps/web/public/sw.js (2 hunks)
  • package.json (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{js,mjs,cjs}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

Use @import tags in JSDoc for cleaner type imports in JavaScript files when working in a mixed codebase (TypeScript 5.5+)

Files:

  • apps/web/public/sw.js
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use standard ECMAScript decorators (Stage 3) instead of legacy `experimentalDecorators`
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to {turbo.json,**/*.sh} : Use Turbo for build system orchestration with configuration in turbo.json

Applied to files:

  • package.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Build and lint web apps
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (3)
apps/web/public/sw.js (1)

24-44: LGTM on the reformatting.

The multi-line formatting improves readability of the promise chaining in singleRequire and the Workbox route registrations. No functional changes introduced.

Also applies to: 66-101

package.json (2)

45-51: lint-staged configuration looks correct.

The setup appropriately:

  1. Runs Prettier first on a broad set of file types (including non-JS files like JSON, CSS, MD)
  2. Then runs ESLint with --fix on JS/TS files only

The --max-warnings=0 enforces strict linting on commits, and --no-warn-ignored is the correct ESLint v9 flag to prevent warnings when staged files are in the ignore list.


20-20: Husky prepare script is correctly wired.

The "prepare": "husky" script follows the Husky v9 pattern for automatic Git hooks installation during pnpm install. Based on learnings, this integrates well with the Turbo build system orchestration.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@lifeiscontent lifeiscontent force-pushed the feat/eslint branch 5 times, most recently from 6944e1c to c163ad5 Compare November 27, 2025 08:32
@lifeiscontent lifeiscontent marked this pull request as ready for review November 27, 2025 08:32
Copilot AI review requested due to automatic review settings November 27, 2025 08:32
Copilot finished reviewing on behalf of lifeiscontent November 27, 2025 08:33
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces a comprehensive ESLint setup to the monorepo, migrating from a legacy @plane/eslint-config package to a modern flat config approach with ESLint 9. The changes include adding numerous linting tools, removing outdated configuration files, and setting up git hooks for automated code quality checks.

Key Changes

  • Migrated from ESLint 8 (legacy config) to ESLint 9 (flat config) with eslint.config.mjs
  • Added comprehensive linting plugins including TypeScript, React, accessibility, and code quality tools
  • Removed the @plane/eslint-config package and all local .eslintrc.* files across packages
  • Introduced Husky and lint-staged for pre-commit hooks
  • Centralized Prettier configuration and removed @prettier/plugin-oxc
  • Updated all package scripts to use pnpm exec and adjusted max-warnings thresholds

Reviewed changes

Copilot reviewed 108 out of 109 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
eslint.config.mjs New root ESLint flat config with comprehensive rules for TypeScript, React, accessibility, and code quality
prettier.config.cjs Centralized Prettier configuration with custom override for codemods
package.json Added ESLint 9, plugins, husky, lint-staged; configured pre-commit hooks
turbo.json Added new lint task and updated check:lint with better file patterns
pnpm-lock.yaml Updated dependencies including ESLint 9 and all related plugins
packages/*/package.json Removed @plane/eslint-config dependency, updated script commands with pnpm exec
packages/*/.eslintrc.* Removed all legacy ESLint config files
packages/*/.prettierrc Removed local Prettier configs in favor of root config
packages/eslint-config/* Removed entire deprecated ESLint config package
Various TypeScript configs Updated paths, removed unnecessary baseUrl, added composite settings
Service exports Added explicit named exports for better compatibility

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

import reactRefreshPlugin from "eslint-plugin-react-refresh";
import unicornPlugin from "eslint-plugin-unicorn";
import vitestPlugin from "@vitest/eslint-plugin";
import storybookPlugin from "eslint-plugin-storybook";
Copy link

Copilot AI Nov 27, 2025

Choose a reason for hiding this comment

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

Unused import storybookPlugin.

Copilot uses AI. Check for mistakes.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

♻️ Duplicate comments (4)
packages/propel/package.json (1)

10-14: [DUPLICATE_COMMENT] Inconsistent --max-warnings thresholds continue across packages.

This package uses --max-warnings=1306, the highest threshold seen yet (compared to 1062 in packages/utils and 51 in packages/i18n). The lack of standardization across the monorepo is problematic.

See prior comment on packages/i18n/package.json for the full concern and requested documentation.

packages/hooks/package.json (1)

15-23: [DUPLICATE_COMMENT] Inconsistent --max-warnings thresholds continue across packages.

This package uses --max-warnings=60 (compared to 51, 1062, and 1306 in other packages). This pattern of inconsistency continues across the PR.

See prior comments on packages/i18n/package.json and packages/propel/package.json for the full concern about standardization and plan for post-migration reduction.

packages/editor/package.json (1)

18-26: [DUPLICATE_COMMENT] Inconsistent --max-warnings thresholds continue across packages.

This package uses --max-warnings=1435, the highest threshold in the entire PR (compared to 51, 60, 1062, 1306 in other packages). While the editor package is complex, the lack of standardization is problematic.

See prior comments on packages/i18n/package.json and packages/propel/package.json for the full concern. Additionally, document whether the editor package's higher warning count is expected or indicates code quality issues that should be addressed rather than suppressed.

eslint.config.mjs (1)

16-16: Unused import: storybookPlugin.

This import is only referenced in commented-out code (line 52). Remove it until Storybook linting is enabled.

-import storybookPlugin from "eslint-plugin-storybook";
🧹 Nitpick comments (3)
apps/web/core/lib/polyfills/index.ts (1)

1-1: Simplify redundant window check.

The second && window check is redundant since typeof window !== "undefined" already ensures window exists.

Apply this diff:

-if (typeof window !== "undefined" && window) {
+if (typeof window !== "undefined") {
apps/admin/package.json (1)

14-17: Consider tracking lint warning reduction over time.

The max-warnings threshold increased significantly (19 → 485). While this is necessary for the migration, consider creating a tracking issue to incrementally reduce this threshold as warnings are addressed.

eslint.config.mjs (1)

39-39: Consider disabling jsdoc rules if JSDoc is not enforced project-wide.

jsdoc/flat/recommended-typescript will flag missing JSDoc comments across the codebase. If JSDoc documentation isn't a current requirement, this may generate significant noise. Consider starting with a more minimal jsdoc config or disabling noisy rules.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between eddf80a and 951c61d.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (107)
  • .github/workflows/pull-request-build-lint-web-apps.yml (1 hunks)
  • .husky/pre-commit (1 hunks)
  • .npmrc (1 hunks)
  • .prettierignore (1 hunks)
  • .prettierrc (0 hunks)
  • CONTRIBUTING.md (3 hunks)
  • apps/admin/.eslintignore (0 hunks)
  • apps/admin/.eslintrc.cjs (0 hunks)
  • apps/admin/.prettierrc (0 hunks)
  • apps/admin/package.json (1 hunks)
  • apps/admin/postcss.config.cjs (0 hunks)
  • apps/admin/tailwind.config.cjs (0 hunks)
  • apps/admin/tsconfig.json (1 hunks)
  • apps/live/.eslintignore (0 hunks)
  • apps/live/.eslintrc.cjs (0 hunks)
  • apps/live/.prettierrc (0 hunks)
  • apps/live/package.json (2 hunks)
  • apps/live/tsconfig.json (0 hunks)
  • apps/space/.eslintignore (0 hunks)
  • apps/space/.eslintrc.cjs (0 hunks)
  • apps/space/.prettierrc (0 hunks)
  • apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx (0 hunks)
  • apps/space/package.json (1 hunks)
  • apps/space/postcss.config.cjs (0 hunks)
  • apps/space/tailwind.config.cjs (0 hunks)
  • apps/space/tsconfig.json (1 hunks)
  • apps/web/.eslintignore (0 hunks)
  • apps/web/.eslintrc.cjs (0 hunks)
  • apps/web/.prettierignore (1 hunks)
  • apps/web/.prettierrc (0 hunks)
  • apps/web/ce/components/projects/create/attributes.tsx (1 hunks)
  • apps/web/core/components/home/widgets/index.ts (0 hunks)
  • apps/web/core/components/integration/guide.tsx (1 hunks)
  • apps/web/core/components/issues/issue-detail-widgets/sub-issues/index.ts (1 hunks)
  • apps/web/core/lib/polyfills/index.ts (1 hunks)
  • apps/web/core/lib/polyfills/requestIdleCallback.ts (0 hunks)
  • apps/web/package.json (1 hunks)
  • apps/web/postcss.config.cjs (0 hunks)
  • apps/web/tailwind.config.cjs (0 hunks)
  • apps/web/tsconfig.json (1 hunks)
  • eslint.config.mjs (1 hunks)
  • package.json (1 hunks)
  • packages/codemods/.prettierrc (0 hunks)
  • packages/constants/.eslintignore (0 hunks)
  • packages/constants/.eslintrc.cjs (0 hunks)
  • packages/constants/.prettierrc (0 hunks)
  • packages/constants/package.json (1 hunks)
  • packages/decorators/.eslintignore (0 hunks)
  • packages/decorators/.eslintrc.cjs (0 hunks)
  • packages/decorators/.prettierrc (0 hunks)
  • packages/decorators/package.json (1 hunks)
  • packages/decorators/tsconfig.json (1 hunks)
  • packages/editor/.eslintignore (0 hunks)
  • packages/editor/.eslintrc.cjs (0 hunks)
  • packages/editor/.prettierrc (0 hunks)
  • packages/editor/package.json (2 hunks)
  • packages/editor/tsconfig.json (1 hunks)
  • packages/eslint-config/library.js (0 hunks)
  • packages/eslint-config/next.js (0 hunks)
  • packages/eslint-config/package.json (0 hunks)
  • packages/eslint-config/server.js (0 hunks)
  • packages/hooks/.eslintignore (0 hunks)
  • packages/hooks/.eslintrc.cjs (0 hunks)
  • packages/hooks/.prettierrc (0 hunks)
  • packages/hooks/package.json (1 hunks)
  • packages/i18n/.eslintignore (0 hunks)
  • packages/i18n/.eslintrc.cjs (0 hunks)
  • packages/i18n/.prettierrc (0 hunks)
  • packages/i18n/package.json (1 hunks)
  • packages/logger/.eslintignore (0 hunks)
  • packages/logger/.eslintrc.cjs (0 hunks)
  • packages/logger/.prettierrc (0 hunks)
  • packages/logger/package.json (1 hunks)
  • packages/logger/tsconfig.json (0 hunks)
  • packages/propel/.eslintignore (0 hunks)
  • packages/propel/.eslintrc.cjs (0 hunks)
  • packages/propel/.prettierrc (0 hunks)
  • packages/propel/package.json (1 hunks)
  • packages/propel/postcss.config.js (0 hunks)
  • packages/propel/src/icons/cycle/index.ts (1 hunks)
  • packages/propel/src/icons/index.ts (3 hunks)
  • packages/services/.eslintignore (0 hunks)
  • packages/services/.eslintrc.cjs (0 hunks)
  • packages/services/.prettierrc (0 hunks)
  • packages/services/package.json (2 hunks)
  • packages/services/src/dashboard/dashboard.service.ts (1 hunks)
  • packages/services/src/developer/webhook.service.ts (1 hunks)
  • packages/services/src/intake/intake.service.ts (1 hunks)
  • packages/services/src/intake/issue.service.ts (1 hunks)
  • packages/shared-state/.eslintignore (0 hunks)
  • packages/shared-state/.eslintrc.js (0 hunks)
  • packages/shared-state/.prettierrc (0 hunks)
  • packages/shared-state/package.json (2 hunks)
  • packages/types/.eslintrc.cjs (0 hunks)
  • packages/types/.prettierrc (0 hunks)
  • packages/types/package.json (1 hunks)
  • packages/typescript-config/base.json (2 hunks)
  • packages/ui/.eslintignore (0 hunks)
  • packages/ui/.eslintrc.cjs (0 hunks)
  • packages/ui/.prettierrc (0 hunks)
  • packages/ui/package.json (1 hunks)
  • packages/ui/postcss.config.js (0 hunks)
  • packages/ui/tailwind.config.js (0 hunks)
  • packages/utils/.eslintignore (0 hunks)
  • packages/utils/.eslintrc.cjs (0 hunks)
  • packages/utils/.prettierrc (0 hunks)
  • packages/utils/package.json (1 hunks)
⛔ Files not processed due to max files limit (2)
  • prettier.config.cjs
  • turbo.json
💤 Files with no reviewable changes (67)
  • packages/ui/.eslintignore
  • packages/constants/.prettierrc
  • packages/ui/.prettierrc
  • packages/utils/.eslintignore
  • apps/admin/tailwind.config.cjs
  • apps/live/.prettierrc
  • packages/services/.eslintrc.cjs
  • apps/space/.eslintignore
  • apps/live/.eslintignore
  • apps/space/.eslintrc.cjs
  • apps/web/core/components/home/widgets/index.ts
  • apps/space/postcss.config.cjs
  • packages/decorators/.eslintrc.cjs
  • apps/space/.prettierrc
  • packages/ui/.eslintrc.cjs
  • packages/i18n/.eslintignore
  • packages/constants/.eslintignore
  • packages/shared-state/.eslintrc.js
  • packages/eslint-config/library.js
  • packages/hooks/.eslintignore
  • packages/shared-state/.prettierrc
  • packages/ui/tailwind.config.js
  • packages/hooks/.eslintrc.cjs
  • apps/live/.eslintrc.cjs
  • apps/web/tailwind.config.cjs
  • packages/utils/.prettierrc
  • apps/web/.eslintignore
  • packages/propel/.eslintignore
  • packages/logger/.eslintignore
  • packages/propel/.prettierrc
  • packages/editor/.eslintignore
  • packages/ui/postcss.config.js
  • apps/web/core/lib/polyfills/requestIdleCallback.ts
  • packages/codemods/.prettierrc
  • packages/editor/.prettierrc
  • packages/hooks/.prettierrc
  • apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx
  • packages/types/.prettierrc
  • packages/propel/.eslintrc.cjs
  • packages/services/.prettierrc
  • packages/eslint-config/server.js
  • packages/services/.eslintignore
  • apps/admin/postcss.config.cjs
  • apps/live/tsconfig.json
  • packages/decorators/.eslintignore
  • packages/shared-state/.eslintignore
  • apps/admin/.prettierrc
  • packages/constants/.eslintrc.cjs
  • packages/propel/postcss.config.js
  • packages/eslint-config/next.js
  • packages/logger/tsconfig.json
  • packages/utils/.eslintrc.cjs
  • packages/i18n/.prettierrc
  • apps/web/.prettierrc
  • packages/editor/.eslintrc.cjs
  • apps/admin/.eslintrc.cjs
  • apps/space/tailwind.config.cjs
  • apps/web/postcss.config.cjs
  • packages/types/.eslintrc.cjs
  • packages/decorators/.prettierrc
  • packages/logger/.eslintrc.cjs
  • packages/logger/.prettierrc
  • packages/i18n/.eslintrc.cjs
  • packages/eslint-config/package.json
  • .prettierrc
  • apps/web/.eslintrc.cjs
  • apps/admin/.eslintignore
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • packages/services/src/intake/intake.service.ts
  • packages/services/src/dashboard/dashboard.service.ts
  • apps/web/core/components/integration/guide.tsx
  • packages/services/src/intake/issue.service.ts
  • packages/services/src/developer/webhook.service.ts
  • apps/web/ce/components/projects/create/attributes.tsx
  • packages/propel/src/icons/cycle/index.ts
  • apps/web/core/components/issues/issue-detail-widgets/sub-issues/index.ts
  • packages/propel/src/icons/index.ts
  • apps/web/core/lib/polyfills/index.ts
**/*.{js,mjs,cjs}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

Use @import tags in JSDoc for cleaner type imports in JavaScript files when working in a mixed codebase (TypeScript 5.5+)

Files:

  • eslint.config.mjs
🧠 Learnings (31)
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `with { type: "json" }` for import attributes; avoid deprecated `assert` syntax (TypeScript 5.3/5.8+)

Applied to files:

  • packages/typescript-config/base.json
  • apps/web/tsconfig.json
  • CONTRIBUTING.md
  • packages/decorators/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/space/tsconfig.json
  • apps/admin/tsconfig.json
  • eslint.config.mjs
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `const` type parameters for more precise literal inference in TypeScript 5.0+

Applied to files:

  • packages/typescript-config/base.json
  • apps/web/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/space/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `Object.groupBy` / `Map.groupBy` standard methods for grouping instead of external libraries (TypeScript 5.4+)

Applied to files:

  • packages/typescript-config/base.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use copying array methods (`toSorted`, `toSpliced`, `with`) for immutable array operations (TypeScript 5.2+)

Applied to files:

  • packages/typescript-config/base.json
  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Utilize narrowing in `switch(true)` blocks for control flow analysis (TypeScript 5.3+)

Applied to files:

  • packages/typescript-config/base.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)

Applied to files:

  • packages/typescript-config/base.json
  • apps/web/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/space/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use constant indices to narrow object/array properties (TypeScript 5.5+)

Applied to files:

  • packages/typescript-config/base.json
  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `.ts`, `.mts`, `.cts` extensions in `import type` statements (TypeScript 5.2+)

Applied to files:

  • packages/typescript-config/base.json
  • apps/web/tsconfig.json
  • CONTRIBUTING.md
  • packages/decorators/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/space/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Utilize new `Set` methods like `union`, `intersection`, etc., when available (TypeScript 5.5+)

Applied to files:

  • packages/typescript-config/base.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Prioritize using modern features and best practices introduced in TypeScript versions 5.0 through 5.8

Applied to files:

  • packages/typescript-config/base.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use standard ECMAScript decorators (Stage 3) instead of legacy `experimentalDecorators`

Applied to files:

  • packages/typescript-config/base.json
  • apps/web/tsconfig.json
  • packages/decorators/tsconfig.json
  • packages/editor/tsconfig.json
  • packages/decorators/package.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Assume `--moduleResolution bundler` resolution strategy for modern web projects (Vite, Next.js, etc.)

Applied to files:

  • packages/typescript-config/base.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to {turbo.json,**/*.sh} : Use Turbo for build system orchestration with configuration in turbo.json

Applied to files:

  • packages/typescript-config/base.json
  • packages/utils/package.json
  • packages/logger/package.json
  • packages/hooks/package.json
  • apps/live/package.json
  • packages/shared-state/package.json
  • packages/services/package.json
  • packages/types/package.json
  • apps/admin/package.json
  • .github/workflows/pull-request-build-lint-web-apps.yml
  • packages/i18n/package.json
  • packages/constants/package.json
  • packages/propel/package.json
  • package.json
  • apps/web/package.json
  • apps/space/package.json
  • packages/decorators/package.json
  • packages/editor/package.json
  • .npmrc
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Treat legacy `experimentalDecorators`-style behavior as deprecated in favor of standard TC39-compliant decorators

Applied to files:

  • apps/web/tsconfig.json
  • packages/decorators/tsconfig.json
  • packages/editor/tsconfig.json
  • packages/decorators/package.json
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • apps/web/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/space/tsconfig.json
  • apps/admin/tsconfig.json
  • packages/i18n/package.json
  • packages/editor/package.json
📚 Learning: 2025-10-21T17:22:05.204Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7989
File: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx:45-46
Timestamp: 2025-10-21T17:22:05.204Z
Learning: In the makeplane/plane repository, the refactor from useParams() to params prop is specifically scoped to page.tsx and layout.tsx files in apps/web/app (Next.js App Router pattern). Other components (hooks, regular client components, utilities) should continue using the useParams() hook as that is the correct pattern for non-route components.

Applied to files:

  • apps/web/tsconfig.json
  • apps/space/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{js,mjs,cjs} : Use `import` tags in JSDoc for cleaner type imports in JavaScript files when working in a mixed codebase (TypeScript 5.5+)

Applied to files:

  • CONTRIBUTING.md
  • eslint.config.mjs
📚 Learning: 2025-03-11T19:42:41.769Z
Learnt from: janreges
Repo: makeplane/plane PR: 6743
File: packages/i18n/src/store/index.ts:160-161
Timestamp: 2025-03-11T19:42:41.769Z
Learning: In the Plane project, the file 'packages/i18n/src/store/index.ts' already includes support for Polish language translations with the case "pl".

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `import type { Type } from "mod" with { "resolution-mode": "import" }` for specific module resolution contexts (TypeScript 5.3+)

Applied to files:

  • CONTRIBUTING.md
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Use pnpm for package management - do not use npm or yarn

Applied to files:

  • packages/utils/package.json
  • packages/logger/package.json
  • packages/hooks/package.json
  • apps/web/.prettierignore
  • apps/live/package.json
  • packages/shared-state/package.json
  • packages/services/package.json
  • packages/types/package.json
  • apps/admin/package.json
  • .prettierignore
  • packages/i18n/package.json
  • packages/constants/package.json
  • packages/propel/package.json
  • .husky/pre-commit
  • apps/space/package.json
  • packages/decorators/package.json
  • packages/editor/package.json
  • .npmrc
  • packages/ui/package.json
📚 Learning: 2025-08-29T08:45:15.953Z
Learnt from: sriramveeraghanta
Repo: makeplane/plane PR: 7672
File: pnpm-workspace.yaml:8-9
Timestamp: 2025-08-29T08:45:15.953Z
Learning: The makeplane/plane repository uses pnpm v10.12.1, which supports onlyBuiltDependencies configuration in pnpm-workspace.yaml files.

Applied to files:

  • packages/utils/package.json
  • packages/logger/package.json
  • packages/hooks/package.json
  • apps/live/package.json
  • packages/shared-state/package.json
  • packages/services/package.json
  • packages/types/package.json
  • apps/admin/package.json
  • .prettierignore
  • packages/i18n/package.json
  • packages/constants/package.json
  • packages/propel/package.json
  • .husky/pre-commit
  • apps/web/package.json
  • apps/space/package.json
  • packages/decorators/package.json
  • packages/editor/package.json
  • .npmrc
  • packages/ui/package.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Run tests in a specific package using pnpm --filter plane/<package_name> run test

Applied to files:

  • packages/utils/package.json
  • packages/constants/package.json
  • packages/ui/package.json
📚 Learning: 2025-05-14T13:16:23.323Z
Learnt from: vamsikrishnamathala
Repo: makeplane/plane PR: 7061
File: web/core/components/workspace-notifications/root.tsx:18-18
Timestamp: 2025-05-14T13:16:23.323Z
Learning: In the Plane project codebase, the path alias `@/plane-web` resolves to the `ce` directory, making imports like `@/plane-web/hooks/use-notification-preview` correctly resolve to files in `web/ce/hooks/`.

Applied to files:

  • packages/editor/tsconfig.json
  • apps/space/tsconfig.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-workspace.yaml : Use pnpm-workspace.yaml for monorepo workspace configuration

Applied to files:

  • packages/logger/package.json
  • packages/hooks/package.json
  • packages/types/package.json
  • .prettierignore
  • packages/constants/package.json
  • .husky/pre-commit
  • packages/decorators/package.json
  • .npmrc
📚 Learning: 2025-10-09T22:12:26.424Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T22:12:26.424Z
Learning: When `types/react` is installed in a TypeScript project (which is standard for React + TypeScript codebases), React types (React.FC, React.ReactNode, React.ComponentProps, etc.) are globally available by design. These type annotations can and should be used without explicitly importing the React namespace. This is a TypeScript/DefinitelyTyped feature, not codebase-specific configuration.

Applied to files:

  • apps/space/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-10-06T01:44:38.472Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7888
File: packages/propel/src/collapsible/collapsible.stories.tsx:4-4
Timestamp: 2025-10-06T01:44:38.472Z
Learning: In Storybook v9, imports use bare paths instead of scoped packages. For example, `import { useArgs } from "storybook/preview-api"` is correct (not `storybook/preview-api`). This applies to other Storybook modules as well - the scoped storybook/* packages were consolidated into bare "storybook/*" imports.

Applied to files:

  • eslint.config.mjs
📚 Learning: 2025-10-06T01:45:11.248Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7888
File: packages/propel/src/table/table.stories.tsx:1-1
Timestamp: 2025-10-06T01:45:11.248Z
Learning: When using Storybook with React + Vite framework, Meta and StoryObj types should be imported from "storybook/react-vite", not from "storybook/react". This is the correct pattern per Storybook's official documentation for framework-specific type imports.

Applied to files:

  • eslint.config.mjs
  • packages/propel/package.json
📚 Learning: 2025-06-04T16:22:44.344Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7164
File: packages/ui/.storybook/main.ts:24-47
Timestamp: 2025-06-04T16:22:44.344Z
Learning: In packages/ui/.storybook/main.ts, the webpackFinal function intentionally overrides the CSS loader strategy by finding and replacing existing CSS rules. This is a temporary workaround for a known upstream issue in Storybook's CSS handling that has been communicated to the Storybook maintainers. The current implementation should not be changed until the upstream issue is resolved.

Applied to files:

  • eslint.config.mjs
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-lock.yaml : Use pnpm-lock.yaml as the lockfile for dependency management

Applied to files:

  • .prettierignore
  • .husky/pre-commit
  • .npmrc
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Avoid `import ... assert` syntax; use `with` instead for import attributes

Applied to files:

  • apps/web/ce/components/projects/create/attributes.tsx
📚 Learning: 2025-10-09T20:43:07.762Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/core/components/new-user-popup.tsx:4-6
Timestamp: 2025-10-09T20:43:07.762Z
Learning: The `next-themes` library is React-compatible and can be used outside of Next.js applications. It's not Next.js-specific despite its name.

Applied to files:

  • packages/editor/package.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build and lint web apps
🔇 Additional comments (46)
apps/web/core/components/issues/issue-detail-widgets/sub-issues/index.ts (1)

3-5: LGTM! Clean alphabetical ordering.

The reordering establishes alphabetical export order and removes the duplicate "./content" export mentioned in the summary, improving maintainability and consistency.

apps/web/core/lib/polyfills/index.ts (2)

24-24: LGTM!

The empty export statement correctly signals this is a side-effect-only module, which is the appropriate pattern for polyfill files.


3-15: I'll help you verify the requestIdleCallback polyfill implementation. Let me search for how it's being used in the codebase.
<function_calls>


#!/bin/bash

Search for requestIdleCallback usage across the codebase

rg -n "requestIdleCallback" --type=ts --type=tsx -C3 -g '!/node_modules/' -g '!/polyfills/'


</function_calls>

packages/services/src/intake/intake.service.ts (1)

9-10: Named export for IntakeService is correct and backward compatible

Re‑exporting the class name as a named export is valid in TS/ES and keeps existing default imports working while enabling { IntakeService } imports. This aligns with the broader pattern in the PR.

apps/web/core/components/integration/guide.tsx (1)

175-177: Dual default + named export for IntegrationGuide looks good

Keeping the default export and adding export { IntegrationGuide }; is safe and provides flexibility for consumers to use either default or named imports without behavior changes.

apps/web/ce/components/projects/create/attributes.tsx (1)

93-95: ProjectAttributes default + named export is safe and consistent

Exposing ProjectAttributes as both the default and a named export is backward compatible and matches the export pattern used elsewhere, with no impact on runtime behavior. Based on learnings, there’s no import ... assert usage here, so TS import guidelines remain satisfied.

packages/services/src/dashboard/dashboard.service.ts (1)

80-81: Adding a named export for DashboardService is appropriate

The extra export { DashboardService }; cleanly exposes a named export alongside the existing default export and should not introduce breaking changes for current consumers.

packages/services/src/developer/webhook.service.ts (1)

105-106: WebhookService named export mirrors other service modules

Exposing WebhookService as a named export in addition to the default is a safe, consistent API expansion and doesn’t affect existing imports.

packages/services/src/intake/issue.service.ts (1)

19-20: Named export for IntakeIssueService aligns with the new service export pattern

Adding export { IntakeIssueService }; cleanly broadens the module’s public API while preserving all existing default‑import call sites.

packages/typescript-config/base.json (2)

5-5: Formatting change approved.

The lib array reformatting to a single line with the same values is a minor cleanup. ES2023 target aligns with modern TypeScript best practices.


18-21: Verify and clarify the semantic inconsistency in base tsconfig configuration.

The base config combines incompatible patterns that, while functional due to noEmit, create unnecessary confusion:

  1. Declaration flag contradiction: declaration: true and declarationMap: true paired with noEmit: true means declarations are never emitted. The emitDeclarationOnly: false setting is redundant and semantically incorrect here. For a type-checking-only base config, remove the declaration flags or clarify the intent.

  2. Unused composite mode: composite: true is intended for TypeScript project references, but no "references" field exists anywhere in the codebase. All packages and apps omit project references entirely. Either implement project references across the monorepo (requiring a root tsconfig with references entries) or remove composite: true from the base config to match the actual setup.

  3. Build info file path: ✓ Correctly configured. The .turbo/tsconfig.tsbuildinfo path is consistently managed across all packages, properly ignored in .gitignore, and cleaned uniformly in package.json scripts.

Recommendation: Decide whether to:

  • Option A: Adopt TypeScript project references (add root tsconfig with references, set references in consuming packages) — then keep composite: true and fix declaration flags
  • Option B: Remove project references intent — delete composite: true and declaration flags from base.json since they serve no purpose with noEmit: true
packages/propel/src/icons/cycle/index.ts (1)

1-5: Cycle icon barrel exports look consistent and deduplicated

Exporting ./double-circle-icon once in this ordered list keeps the barrel clean and consistent with the rest of the icon modules; no issues from a typing or module-resolution perspective.

packages/propel/src/icons/index.ts (3)

7-7: Arrows barrel export integrates cleanly into the icon index

Adding export * from "./arrows"; is consistent with how other icon groups are exposed from this index and should be safe as long as the ./arrows barrel compiles cleanly.


67-68: Workspace exports remain consistent with other icon barrels

Re‑exporting ./workspace alongside ./workspace-icon keeps the workspace-related icons discoverable from a single barrel; ordering change is purely organizational with no behavioral impact.


30-35: Based on my comprehensive verification of the codebase, I have confirmed that there are no circular import issues in the icons barrel. Here are my findings:

Verification Results:

  • icon.ts imports only from ./registry and ./type (no barrel/index imports)
  • icon-wrapper.tsx imports only from ./type (no barrel/index imports)
  • helpers.ts imports only from ./registry (no barrel/index imports)
  • registry.ts imports specific components from subdirectories, not from the barrel
  • ✅ No files within the icons directory import from ./icons or ./index

The re-export pattern export * from "./icon" at line 32 is safe and does not introduce circular dependencies.


No circular dependencies detected. The re-export of ./icon is safe.

The icon.ts file imports only from local modules (./registry, ./type) and does not reference the index barrel, so export * from "./icon" does not create circular dependencies. Similarly, all other modules in the icons directory use direct imports and avoid barrel re-imports.

.prettierignore (1)

1-1: LGTM!

Adding pnpm-lock.yaml to .prettierignore is correct. Lockfiles are auto-generated and should not be formatted to avoid unnecessary diffs and merge conflicts.

packages/decorators/tsconfig.json (1)

12-12: LGTM!

The include configuration is correct and properly scoped to the src directory.

.husky/pre-commit (1)

1-1: LGTM!

The pre-commit hook correctly uses pnpm lint-staged, aligning with the repository's package manager standard.

apps/web/.prettierignore (1)

10-10: LGTM!

Adding public/ to .prettierignore is appropriate, as this directory typically contains static assets and generated files that should not be formatted.

.github/workflows/pull-request-build-lint-web-apps.yml (1)

46-48: LGTM!

Moving the "Build Affected" step earlier in the workflow (after install, before lint/format/type checks) is logical and ensures that generated files and build artifacts are available for subsequent validation steps.

packages/editor/tsconfig.json (1)

5-5: LGTM!

Adding the explicit "src/*": ["./src/*"] path mapping aligns with the project-wide migration to explicit "./"-prefixed path aliases and removal of implicit baseUrl resolution.

apps/admin/tsconfig.json (1)

7-12: LGTM!

The path mappings have been correctly updated with explicit "./"-prefixed targets, consistent with the project-wide migration away from implicit baseUrl resolution.

CONTRIBUTING.md (3)

94-94: LGTM!

The documentation correctly reflects the migration to ESLint 9 with eslint.config.mjs and Prettier with prettier.config.cjs, aligning with the PR's tooling modernization objectives.


190-203: LGTM!

The code examples have been reformatted for improved readability and consistency. The structure and content remain accurate.


214-223: LGTM!

The importLanguageFile example has been reformatted for better readability while maintaining correct implementation guidance.

packages/i18n/package.json (1)

15-24: Clarify inconsistent --max-warnings thresholds across packages.

This package uses --max-warnings=51, while packages/utils uses --max-warnings=1062. The inconsistency across the monorepo makes it difficult to enforce a standard linting baseline.

Document the intended --max-warnings values per package and whether these are:

  • Temporary migration values
  • Intentionally calibrated to each package's warning baseline
  • Planned to converge to a single standard

Additionally, provide the plan for reducing these thresholds post-migration.

packages/logger/package.json (1)

15-19: [APPROVE_CODE_CHANGES] Positive sign: packages/logger maintains strict linting (--max-warnings=0).

Unlike other packages in this PR, packages/logger maintains --max-warnings=0, indicating this package is clean and doesn't relax linting enforcement during the migration. This is a positive pattern.

However, this highlights the problematic inconsistency across the monorepo. See the consolidated concern comment below.

apps/space/tsconfig.json (1)

1-18: The additional.d.ts inclusion is legitimate and not a code smell.

The file exists at apps/space/additional.d.ts and contains only a type reference directive for next-images:

// additional.d.ts
/// <reference types="next-images" />

This is a standard TypeScript practice for augmenting type definitions (in this case, adding types for image imports). The file's inclusion in the include array is appropriate and necessary. The concern raised in the original review comment is unfounded—this is intentional, properly maintained code, not a workaround for module resolution issues.

apps/web/tsconfig.json (1)

1-20: The review comment is based on incorrect premises and should be resolved.

The git history shows that apps/web/tsconfig.json was created (not modified) in commit 951c61d as an initial commit with no parent. The file has never contained a baseUrl in the tracked history—it was created with explicit "./" prefixes in all path mappings. Verification of the codebase confirms that all imports actively use the defined path aliases (@/, @/plane-web/, ce/*, etc.) and resolve correctly.

There was no baseUrl removal in this PR or any recent commit.

packages/utils/package.json (2)

15-24: Let me check the actual current state of the config files to fully verify the setup.
<function_calls>

#!/bin/bash

Verify eslint.config.mjs exists and check its content

echo "=== Verify root config files exist ==="
ls -lh eslint.config.mjs prettier.config.cjs 2>&1

echo ""
echo "=== eslint.config.mjs first 30 lines ==="
head -30 eslint.config.mjs 2>/dev/null || echo "FILE NOT FOUND"

echo ""
echo "=== prettier.config.cjs content ==="
cat prettier.config.cjs 2>/dev/null || echo "FILE NOT FOUND"


</function_calls>

Perfect. Now I have enough information to provide a verified rewrite of the review comment.

Based on my verification:

  1. Centralized ESLint/Prettier config exists: Root-level eslint.config.mjs and prettier.config.cjs are present and properly configured per CONTRIBUTING.md
  2. Removed dependencies verified: Neither @plane/eslint-config nor @prettier/plugin-oxc are referenced anywhere in the codebase—their removal is intentional
  3. High max-warnings is part of broader pattern: The 1062 threshold in packages/utils is not isolated—it's consistent with a monorepo-wide strategy where the root enforces --max-warnings=0 while individual packages have permissive thresholds (ranging from 29 to 14,367)
  4. Recent ESLint migration: Commit 951c61db5 "feat: eslint" introduced the current state, but lacks documentation about intent or timeline
  5. No documentation about strategy: No comments, migration docs, or PR documentation explain whether these high thresholds are temporary or permanent

The --max-warnings=1062 threshold continues ESLint warning suppression across the monorepo, without documented rationale or timeline for reduction.

While this threshold is part of a consistent monorepo pattern (not unique to packages/utils), and centralized ESLint/Prettier configuration exists at the root level, the lack of clarity on intent remains a concern. Verify whether this permissive threshold during migration is:

  1. Temporary (document the target reduction timeline)
  2. Intentional (document the rationale)

The removed dependencies (@plane/eslint-config, @prettier/plugin-oxc) have no other references and their removal aligns with the centralized root-level configuration setup.

⛔ Skipped due to learnings
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7888
File: packages/propel/package.json:74-79
Timestamp: 2025-10-06T14:40:39.253Z
Learning: When reviewing package.json dependency version updates, verify each package version individually on the npm registry before claiming a version doesn't exist. Different packages within the same organization may have different latest versions.
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to {turbo.json,**/*.sh} : Use Turbo for build system orchestration with configuration in turbo.json
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Use pnpm for package management - do not use npm or yarn

18-22: ESLint and Prettier config consolidation cannot be verified due to repository access limitations.

Unfortunately, I'm unable to access the makeplane/plane repository through automated means to verify the three concerns raised:

  1. Whether a centralized ESLint config file exists (root eslint.config.js or equivalent)
  2. Whether a Prettier config exists (root .prettierrc or equivalent)
  3. The impact of removing @prettier/plugin-oxc

Both the repository clone and web-based file access are blocked. A developer with local repository access should manually verify these configurations are properly in place and functional before merging.

packages/types/package.json (1)

14-18: LGTM — Scripts updated to use pnpm exec wrappers.

The migration to pnpm exec eslint and pnpm exec prettier is consistent with the repo-wide tooling standardization. The simplified Prettier glob (. instead of explicit patterns) relies on .prettierignore for exclusions, which is cleaner.

packages/decorators/package.json (1)

15-19: LGTM — Consistent tooling migration.

Scripts align with the standardized pnpm wrapper approach across the monorepo.

packages/constants/package.json (1)

10-14: LGTM — Scripts standardized.

The migration follows the same pattern as other packages in this PR.

package.json (2)

46-52: Good approach: strict pre-commit with relaxed package thresholds.

The lint-staged configuration enforces --max-warnings=0 for new commits, preventing warning accumulation while package-level scripts allow existing warnings. This is a sound incremental improvement strategy.


35-35: eslint-plugin-react-hooks v7 is properly configured.

The eslint.config.mjs loads reactHooksPlugin.configs.flat.recommended (line 45) and explicitly enables the v7 React Compiler-related rules at warn level, including react-hooks/immutability, react-hooks/purity, react-hooks/preserve-manual-memoization, react-hooks/refs, react-hooks/set-state-in-effect, and react-hooks/static-components (lines 96–102). No alignment issues detected.

.npmrc (1)

1-59: Well-structured pnpm configuration.

The reorganization with clear section headers and sensible defaults (resolution-mode=highest, prefer-frozen-lockfile=true, node-linker=isolated) improves maintainability and CI reproducibility.

apps/live/package.json (1)

18-22: LGTM — Scripts aligned with repo-wide tooling.

Consistent migration to pnpm wrappers.

eslint.config.mjs (3)

209-224: Good TypeScript-specific import resolution setup.

The import resolver configuration correctly targets the monorepo structure with {apps,packages}/*/tsconfig.json and marks @plane/ as internal. The ignore list for Next.js modules handles known resolution quirks.


226-240: Correct handling of JavaScript and CommonJS files.

Disabling type-checked rules for JS files and allowing require in .cjs files are appropriate accommodations for a mixed codebase.


96-102: All specified react-hooks rules are available in [email protected].

Verification confirms that the rules in lines 96-102 (immutability, preserve-manual-memoization, purity, refs, set-state-in-effect, and static-components) are all included in v7.0.1 as part of the React Compiler integration rules. The configuration is correct.

apps/space/package.json (1)

13-17: Mirror concern: High max-warnings=932 baseline.

Like packages/services, the max-warnings threshold here (932) is substantial and reflects ESLint warnings counted but not fixed. Ensure this aligns with the repo's long-term linting strategy.

packages/ui/package.json (1)

27-27: Format script glob pattern broadened from specific extensions to ..

The check:format and fix:format scripts now target . (all files) instead of the previous specific pattern "**/*.{ts,tsx,md,json,css,scss}". This is broader and may now format additional file types (configs, build artifacts, etc.) unintentionally.

Verify this change aligns with the intended Prettier scope, or consider restoring the specific glob pattern in a .prettierignore file.

Also applies to: 29-29

packages/shared-state/package.json (2)

10-14: Scripts and tooling migration align with repo pattern; baseline warnings are healthy.

Lines 10-14 follow the repository-wide migration to pnpm exec eslint/prettier, with max-warnings=191 representing a reasonable baseline for this package. This file demonstrates good linting hygiene compared to other packages in the PR.


33-33: Verify: End-of-file newline removed (line 33).

The file now ends with } without a trailing newline. Confirm this is intentional and aligns with your project's code formatting standards (most Node.js projects and Prettier default to requiring a trailing newline).

packages/services/package.json (1)

17-21: Eslint and prettier are properly available in the workspace; central configuration files exist and are correctly configured.

The concerns in the original review comment do not reflect the actual repository state:

  • eslint and prettier are available: Both are installed in root devDependencies and accessible to all workspace packages via pnpm exec.
  • Central configurations exist: eslint.config.mjs and prettier.config.cjs are present in the repository root and properly configured.
  • Migration is sound: The removal of @plane/eslint-config was an intentional migration to the flat config approach (now in eslint.config.mjs). The removal of @prettier/plugin-oxc is reflected in the updated prettier.config.cjs.
  • pnpm workspace setup is correct: The pnpm-workspace.yaml includes packages/*, which allows packages/services to access root tools and configurations.

No action is required; the code changes are correctly implemented.

@lifeiscontent lifeiscontent force-pushed the feat/eslint branch 7 times, most recently from ddbff15 to dff99b6 Compare November 27, 2025 09:34
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (3)
packages/decorators/.prettierignore (1)

1-11: Duplication: See related concern in packages/constants/.prettierignore.

This file is identical to packages/constants/.prettierignore. The architectural and pnpm-lock.yaml concerns raised there apply here as well. If the intent is to consolidate Prettier ignores at the root per the PR objective, consider whether these per-package files are necessary.

apps/admin/.prettierignore (1)

1-11: Duplication: See related concern in packages/constants/.prettierignore.

This file mirrors identical patterns to packages/constants/.prettierignore and packages/decorators/.prettierignore. The architectural mismatch and pnpm-lock.yaml reference concerns apply uniformly across all three. If the PR intends to consolidate Prettier ignores at the root per the stated objective, these per-package files should be evaluated for necessity.

eslint.config.mjs (1)

16-16: Unused import: storybookPlugin.

This import is currently unused since the storybook linting is commented out at lines 51-52. Consider removing the import until the TODO is resolved, or leave it if you plan to enable it soon.

-import storybookPlugin from "eslint-plugin-storybook";
+// TODO: re-enable once storybook linting issues are resolved
+// import storybookPlugin from "eslint-plugin-storybook";
🧹 Nitpick comments (2)
packages/propel/src/icons/index.ts (2)

31-33: Minor ordering inconsistency.

The export for ./icon is placed after ./icon-wrapper, breaking the alphabetical order maintained throughout the file. Consider reordering for consistency.

 export * from "./helpers";
-export * from "./icon-wrapper";
 export * from "./icon";
+export * from "./icon-wrapper";
 export * from "./in-progress-icon";

67-68: Same ordering issue with workspace exports.

./workspace should come before ./workspace-icon to maintain alphabetical order.

 export * from "./user-activity-icon";
-export * from "./workspace-icon";
 export * from "./workspace";
+export * from "./workspace-icon";
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 951c61d and dff99b6.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (107)
  • .github/workflows/pull-request-build-lint-web-apps.yml (1 hunks)
  • .husky/pre-commit (1 hunks)
  • .npmrc (1 hunks)
  • .prettierignore (1 hunks)
  • .prettierrc (1 hunks)
  • CODEOWNERS (1 hunks)
  • CONTRIBUTING.md (3 hunks)
  • apps/admin/.eslintignore (0 hunks)
  • apps/admin/.eslintrc.cjs (0 hunks)
  • apps/admin/.prettierignore (1 hunks)
  • apps/admin/.prettierrc (0 hunks)
  • apps/admin/package.json (1 hunks)
  • apps/admin/postcss.config.cjs (0 hunks)
  • apps/admin/tailwind.config.cjs (0 hunks)
  • apps/admin/tsconfig.json (1 hunks)
  • apps/api/.prettierignore (1 hunks)
  • apps/live/.eslintignore (0 hunks)
  • apps/live/.eslintrc.cjs (0 hunks)
  • apps/live/.prettierignore (1 hunks)
  • apps/live/.prettierrc (0 hunks)
  • apps/live/package.json (1 hunks)
  • apps/live/tsconfig.json (0 hunks)
  • apps/proxy/.prettierignore (1 hunks)
  • apps/space/.eslintignore (0 hunks)
  • apps/space/.eslintrc.cjs (0 hunks)
  • apps/space/.prettierignore (1 hunks)
  • apps/space/.prettierrc (0 hunks)
  • apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx (0 hunks)
  • apps/space/package.json (1 hunks)
  • apps/space/postcss.config.cjs (0 hunks)
  • apps/space/tailwind.config.cjs (0 hunks)
  • apps/space/tsconfig.json (1 hunks)
  • apps/web/.eslintignore (0 hunks)
  • apps/web/.eslintrc.cjs (0 hunks)
  • apps/web/.prettierignore (1 hunks)
  • apps/web/.prettierrc (0 hunks)
  • apps/web/ce/components/projects/create/attributes.tsx (1 hunks)
  • apps/web/core/components/home/widgets/index.ts (0 hunks)
  • apps/web/core/components/integration/guide.tsx (1 hunks)
  • apps/web/core/components/issues/issue-detail-widgets/sub-issues/index.ts (1 hunks)
  • apps/web/core/lib/polyfills/index.ts (1 hunks)
  • apps/web/core/lib/polyfills/requestIdleCallback.ts (0 hunks)
  • apps/web/package.json (1 hunks)
  • apps/web/postcss.config.cjs (0 hunks)
  • apps/web/tailwind.config.cjs (0 hunks)
  • apps/web/tsconfig.json (1 hunks)
  • eslint.config.mjs (1 hunks)
  • package.json (1 hunks)
  • packages/codemods/.prettierignore (1 hunks)
  • packages/codemods/.prettierrc (0 hunks)
  • packages/constants/.eslintignore (0 hunks)
  • packages/constants/.eslintrc.cjs (0 hunks)
  • packages/constants/.prettierignore (1 hunks)
  • packages/constants/.prettierrc (0 hunks)
  • packages/constants/package.json (1 hunks)
  • packages/decorators/.eslintignore (0 hunks)
  • packages/decorators/.eslintrc.cjs (0 hunks)
  • packages/decorators/.prettierignore (1 hunks)
  • packages/decorators/.prettierrc (0 hunks)
  • packages/decorators/package.json (1 hunks)
  • packages/decorators/tsconfig.json (1 hunks)
  • packages/editor/.eslintignore (0 hunks)
  • packages/editor/.eslintrc.cjs (0 hunks)
  • packages/editor/.prettierignore (1 hunks)
  • packages/editor/.prettierrc (0 hunks)
  • packages/editor/package.json (1 hunks)
  • packages/editor/tsconfig.json (1 hunks)
  • packages/eslint-config/library.js (0 hunks)
  • packages/eslint-config/next.js (0 hunks)
  • packages/eslint-config/package.json (0 hunks)
  • packages/eslint-config/server.js (0 hunks)
  • packages/hooks/.eslintignore (0 hunks)
  • packages/hooks/.eslintrc.cjs (0 hunks)
  • packages/hooks/.prettierignore (1 hunks)
  • packages/hooks/.prettierrc (0 hunks)
  • packages/hooks/package.json (1 hunks)
  • packages/i18n/.eslintignore (0 hunks)
  • packages/i18n/.eslintrc.cjs (0 hunks)
  • packages/i18n/.prettierignore (1 hunks)
  • packages/i18n/.prettierrc (0 hunks)
  • packages/i18n/package.json (1 hunks)
  • packages/logger/.eslintignore (0 hunks)
  • packages/logger/.eslintrc.cjs (0 hunks)
  • packages/logger/.prettierignore (1 hunks)
  • packages/logger/.prettierrc (0 hunks)
  • packages/logger/package.json (1 hunks)
  • packages/logger/tsconfig.json (0 hunks)
  • packages/propel/.eslintignore (0 hunks)
  • packages/propel/.eslintrc.cjs (0 hunks)
  • packages/propel/.prettierignore (1 hunks)
  • packages/propel/.prettierrc (0 hunks)
  • packages/propel/package.json (1 hunks)
  • packages/propel/postcss.config.js (0 hunks)
  • packages/propel/src/icons/cycle/index.ts (1 hunks)
  • packages/propel/src/icons/index.ts (3 hunks)
  • packages/services/.eslintignore (0 hunks)
  • packages/services/.eslintrc.cjs (0 hunks)
  • packages/services/.prettierignore (1 hunks)
  • packages/services/.prettierrc (0 hunks)
  • packages/services/package.json (1 hunks)
  • packages/services/src/dashboard/dashboard.service.ts (1 hunks)
  • packages/services/src/developer/webhook.service.ts (1 hunks)
  • packages/services/src/intake/intake.service.ts (1 hunks)
  • packages/services/src/intake/issue.service.ts (1 hunks)
  • packages/shared-state/.eslintignore (0 hunks)
  • packages/shared-state/.eslintrc.js (0 hunks)
  • packages/shared-state/.prettierignore (1 hunks)
⛔ Files not processed due to max files limit (22)
  • packages/shared-state/.prettierrc
  • packages/shared-state/package.json
  • packages/tailwind-config/.prettierignore
  • packages/types/.eslintrc.cjs
  • packages/types/.prettierignore
  • packages/types/.prettierrc
  • packages/types/package.json
  • packages/typescript-config/.prettierignore
  • packages/typescript-config/base.json
  • packages/ui/.eslintignore
  • packages/ui/.eslintrc.cjs
  • packages/ui/.prettierignore
  • packages/ui/.prettierrc
  • packages/ui/package.json
  • packages/ui/postcss.config.js
  • packages/ui/tailwind.config.js
  • packages/utils/.eslintignore
  • packages/utils/.eslintrc.cjs
  • packages/utils/.prettierignore
  • packages/utils/.prettierrc
  • packages/utils/package.json
  • turbo.json
💤 Files with no reviewable changes (55)
  • packages/decorators/.eslintrc.cjs
  • packages/decorators/.eslintignore
  • apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx
  • apps/live/.eslintrc.cjs
  • apps/web/.prettierrc
  • packages/constants/.eslintignore
  • apps/live/tsconfig.json
  • packages/logger/.eslintrc.cjs
  • packages/propel/.eslintignore
  • packages/hooks/.prettierrc
  • packages/shared-state/.eslintignore
  • packages/decorators/.prettierrc
  • packages/services/.prettierrc
  • apps/web/tailwind.config.cjs
  • packages/eslint-config/library.js
  • apps/web/.eslintignore
  • packages/hooks/.eslintignore
  • packages/shared-state/.eslintrc.js
  • packages/hooks/.eslintrc.cjs
  • apps/admin/tailwind.config.cjs
  • apps/live/.prettierrc
  • packages/i18n/.eslintignore
  • apps/web/core/lib/polyfills/requestIdleCallback.ts
  • packages/editor/.eslintignore
  • packages/eslint-config/next.js
  • apps/admin/.eslintignore
  • packages/i18n/.eslintrc.cjs
  • apps/space/.eslintrc.cjs
  • packages/constants/.eslintrc.cjs
  • packages/constants/.prettierrc
  • apps/web/postcss.config.cjs
  • apps/web/core/components/home/widgets/index.ts
  • apps/space/.eslintignore
  • packages/propel/.prettierrc
  • apps/space/.prettierrc
  • apps/space/tailwind.config.cjs
  • packages/logger/.prettierrc
  • packages/codemods/.prettierrc
  • packages/propel/postcss.config.js
  • apps/admin/.prettierrc
  • apps/live/.eslintignore
  • packages/editor/.prettierrc
  • packages/eslint-config/package.json
  • packages/eslint-config/server.js
  • packages/i18n/.prettierrc
  • packages/logger/tsconfig.json
  • packages/editor/.eslintrc.cjs
  • packages/services/.eslintrc.cjs
  • apps/admin/.eslintrc.cjs
  • apps/web/.eslintrc.cjs
  • packages/propel/.eslintrc.cjs
  • packages/logger/.eslintignore
  • apps/space/postcss.config.cjs
  • packages/services/.eslintignore
  • apps/admin/postcss.config.cjs
🚧 Files skipped from review as they are similar to previous changes (30)
  • packages/codemods/.prettierignore
  • packages/services/src/dashboard/dashboard.service.ts
  • packages/hooks/.prettierignore
  • .husky/pre-commit
  • packages/propel/.prettierignore
  • apps/web/ce/components/projects/create/attributes.tsx
  • apps/web/.prettierignore
  • apps/proxy/.prettierignore
  • apps/space/.prettierignore
  • packages/services/.prettierignore
  • apps/live/.prettierignore
  • apps/web/core/lib/polyfills/index.ts
  • apps/web/core/components/integration/guide.tsx
  • packages/shared-state/.prettierignore
  • packages/i18n/package.json
  • packages/hooks/package.json
  • packages/propel/src/icons/cycle/index.ts
  • apps/space/tsconfig.json
  • .github/workflows/pull-request-build-lint-web-apps.yml
  • apps/admin/tsconfig.json
  • packages/logger/.prettierignore
  • apps/web/core/components/issues/issue-detail-widgets/sub-issues/index.ts
  • packages/editor/package.json
  • packages/decorators/tsconfig.json
  • packages/i18n/.prettierignore
  • packages/decorators/package.json
  • .prettierrc
  • CODEOWNERS
  • CONTRIBUTING.md
  • .prettierignore
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • packages/services/src/intake/issue.service.ts
  • packages/services/src/developer/webhook.service.ts
  • packages/services/src/intake/intake.service.ts
  • packages/propel/src/icons/index.ts
**/*.{js,mjs,cjs}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

Use @import tags in JSDoc for cleaner type imports in JavaScript files when working in a mixed codebase (TypeScript 5.5+)

Files:

  • eslint.config.mjs
🧠 Learnings (24)
📓 Common learnings
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{js,mjs,cjs} : Use `import` tags in JSDoc for cleaner type imports in JavaScript files when working in a mixed codebase (TypeScript 5.5+)
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Use pnpm for package management - do not use npm or yarn
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use standard ECMAScript decorators (Stage 3) instead of legacy `experimentalDecorators`
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-workspace.yaml : Use pnpm-workspace.yaml for monorepo workspace configuration
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Use pnpm for package management - do not use npm or yarn

Applied to files:

  • packages/constants/.prettierignore
  • packages/constants/package.json
  • apps/live/package.json
  • packages/propel/package.json
  • apps/api/.prettierignore
  • packages/services/package.json
  • packages/logger/package.json
  • packages/decorators/.prettierignore
  • apps/admin/.prettierignore
  • packages/editor/.prettierignore
  • .npmrc
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-workspace.yaml : Use pnpm-workspace.yaml for monorepo workspace configuration

Applied to files:

  • packages/constants/.prettierignore
  • packages/constants/package.json
  • apps/api/.prettierignore
  • packages/logger/package.json
  • .npmrc
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to {turbo.json,**/*.sh} : Use Turbo for build system orchestration with configuration in turbo.json

Applied to files:

  • packages/constants/.prettierignore
  • packages/constants/package.json
  • apps/live/package.json
  • packages/propel/package.json
  • packages/services/package.json
  • apps/admin/package.json
  • packages/logger/package.json
  • .npmrc
  • package.json
  • apps/space/package.json
  • apps/web/package.json
📚 Learning: 2025-08-29T08:45:15.953Z
Learnt from: sriramveeraghanta
Repo: makeplane/plane PR: 7672
File: pnpm-workspace.yaml:8-9
Timestamp: 2025-08-29T08:45:15.953Z
Learning: The makeplane/plane repository uses pnpm v10.12.1, which supports onlyBuiltDependencies configuration in pnpm-workspace.yaml files.

Applied to files:

  • packages/constants/.prettierignore
  • packages/constants/package.json
  • apps/live/package.json
  • packages/propel/package.json
  • apps/api/.prettierignore
  • packages/services/package.json
  • apps/admin/package.json
  • packages/logger/package.json
  • .npmrc
  • apps/space/package.json
  • apps/web/package.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Run tests in a specific package using pnpm --filter plane/<package_name> run test

Applied to files:

  • packages/constants/package.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `.ts`, `.mts`, `.cts` extensions in `import type` statements (TypeScript 5.2+)

Applied to files:

  • apps/web/tsconfig.json
  • packages/editor/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `with { type: "json" }` for import attributes; avoid deprecated `assert` syntax (TypeScript 5.3/5.8+)

Applied to files:

  • apps/web/tsconfig.json
  • eslint.config.mjs
  • packages/editor/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `const` type parameters for more precise literal inference in TypeScript 5.0+

Applied to files:

  • apps/web/tsconfig.json
  • packages/editor/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Treat legacy `experimentalDecorators`-style behavior as deprecated in favor of standard TC39-compliant decorators

Applied to files:

  • apps/web/tsconfig.json
  • eslint.config.mjs
  • packages/decorators/.prettierignore
  • packages/editor/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use constant indices to narrow object/array properties (TypeScript 5.5+)

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use copying array methods (`toSorted`, `toSpliced`, `with`) for immutable array operations (TypeScript 5.2+)

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use standard ECMAScript decorators (Stage 3) instead of legacy `experimentalDecorators`

Applied to files:

  • apps/web/tsconfig.json
  • eslint.config.mjs
  • packages/decorators/.prettierignore
  • packages/editor/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Utilize narrowing in `switch(true)` blocks for control flow analysis (TypeScript 5.3+)

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `Object.groupBy` / `Map.groupBy` standard methods for grouping instead of external libraries (TypeScript 5.4+)

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • apps/web/tsconfig.json
  • packages/editor/tsconfig.json
📚 Learning: 2025-10-21T17:22:05.204Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7989
File: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx:45-46
Timestamp: 2025-10-21T17:22:05.204Z
Learning: In the makeplane/plane repository, the refactor from useParams() to params prop is specifically scoped to page.tsx and layout.tsx files in apps/web/app (Next.js App Router pattern). Other components (hooks, regular client components, utilities) should continue using the useParams() hook as that is the correct pattern for non-route components.

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-10-06T01:45:11.248Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7888
File: packages/propel/src/table/table.stories.tsx:1-1
Timestamp: 2025-10-06T01:45:11.248Z
Learning: When using Storybook with React + Vite framework, Meta and StoryObj types should be imported from "storybook/react-vite", not from "storybook/react". This is the correct pattern per Storybook's official documentation for framework-specific type imports.

Applied to files:

  • packages/propel/package.json
  • eslint.config.mjs
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{js,mjs,cjs} : Use `import` tags in JSDoc for cleaner type imports in JavaScript files when working in a mixed codebase (TypeScript 5.5+)

Applied to files:

  • eslint.config.mjs
📚 Learning: 2025-10-06T01:44:38.472Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7888
File: packages/propel/src/collapsible/collapsible.stories.tsx:4-4
Timestamp: 2025-10-06T01:44:38.472Z
Learning: In Storybook v9, imports use bare paths instead of scoped packages. For example, `import { useArgs } from "storybook/preview-api"` is correct (not `storybook/preview-api`). This applies to other Storybook modules as well - the scoped storybook/* packages were consolidated into bare "storybook/*" imports.

Applied to files:

  • eslint.config.mjs
📚 Learning: 2025-06-04T16:22:44.344Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7164
File: packages/ui/.storybook/main.ts:24-47
Timestamp: 2025-06-04T16:22:44.344Z
Learning: In packages/ui/.storybook/main.ts, the webpackFinal function intentionally overrides the CSS loader strategy by finding and replacing existing CSS rules. This is a temporary workaround for a known upstream issue in Storybook's CSS handling that has been communicated to the Storybook maintainers. The current implementation should not be changed until the upstream issue is resolved.

Applied to files:

  • eslint.config.mjs
📚 Learning: 2025-05-14T13:16:23.323Z
Learnt from: vamsikrishnamathala
Repo: makeplane/plane PR: 7061
File: web/core/components/workspace-notifications/root.tsx:18-18
Timestamp: 2025-05-14T13:16:23.323Z
Learning: In the Plane project codebase, the path alias `@/plane-web` resolves to the `ce` directory, making imports like `@/plane-web/hooks/use-notification-preview` correctly resolve to files in `web/ce/hooks/`.

Applied to files:

  • packages/editor/tsconfig.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-lock.yaml : Use pnpm-lock.yaml as the lockfile for dependency management

Applied to files:

  • .npmrc
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build and lint web apps
🔇 Additional comments (25)
packages/editor/.prettierignore (1)

1-11: Standardized recursive ignore patterns across the monorepo.

The conversion to recursive glob patterns (**/ prefix) ensures consistent Prettier formatting exclusions across all subdirectories and aligns with the monorepo-wide centralization of linting and formatting configuration. The inclusion of framework build directories, build outputs, dependencies, and the pnpm lockfile is comprehensive and appropriate for the project structure.

packages/services/src/intake/issue.service.ts (1)

20-20: Named export complements existing default export cleanly

Adding export { IntakeIssueService }; exposes a named export without changing runtime behavior and keeps existing default-import callers working. This is a straightforward API ergonomics improvement and aligns with the pattern used in other services.

packages/services/src/developer/webhook.service.ts (1)

106-106: Expanding module API with a named WebhookService export

The additional export { WebhookService }; cleanly adds a named export while preserving the existing default export contract. This improves flexibility for consumers (especially with eslint rules favoring named imports) without altering behavior.

packages/services/src/intake/intake.service.ts (1)

10-10: Consistent named export for IntakeService

Adding export { IntakeService }; provides a named export alongside the default, matching the pattern in other services and giving consumers the option to prefer named imports. No compatibility or behavioral concerns here.

apps/api/.prettierignore (1)

1-11: This file duplicates the root .prettierignore and contradicts the PR's centralization strategy.

A root-level .prettierignore already exists at the repository root with identical content. Adding a per-package .prettierignore to apps/api/ directly contradicts the stated PR objective of consolidating Prettier configuration at the root level and removing per-package configurations.

Remove apps/api/.prettierignore or clarify if per-package overrides are intentional.

⛔ Skipped due to learnings
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Use pnpm for package management - do not use npm or yarn
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-workspace.yaml : Use pnpm-workspace.yaml for monorepo workspace configuration
Learnt from: sriramveeraghanta
Repo: makeplane/plane PR: 7672
File: pnpm-workspace.yaml:8-9
Timestamp: 2025-08-29T08:45:15.953Z
Learning: The makeplane/plane repository uses pnpm v10.12.1, which supports onlyBuiltDependencies configuration in pnpm-workspace.yaml files.
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-lock.yaml : Use pnpm-lock.yaml as the lockfile for dependency management
packages/editor/tsconfig.json (1)

4-9: LGTM! Path mappings are properly normalized.

The explicit ./ prefix for src/* aligns with the broader tsconfig normalization across the repository, ensuring consistent path resolution behavior.

apps/web/tsconfig.json (1)

6-15: LGTM! Path mappings normalized consistently.

The explicit ./ prefixes for all path mappings ensure predictable resolution behavior without relying on baseUrl. The structure provides clear aliasing for core modules (@/*), helpers, styles, and the CE edition paths.

packages/propel/package.json (1)

10-14: High --max-warnings count warrants a tracking issue.

The pnpm exec wrapper usage is correct and aligns with repo conventions. However, --max-warnings=1306 is quite high. Consider creating a tracking issue to incrementally reduce this count over time, otherwise warnings may accumulate unnoticed.

eslint.config.mjs (3)

209-225: Import plugin configuration looks solid for the monorepo.

The TypeScript resolver is correctly configured to find tsconfig.json files across apps and packages. The import/internal-regex pattern for @plane/ properly identifies internal workspace packages, and the ignore list prevents false positives on Next.js modules.


226-241: LGTM! JS/CJS overrides are correctly configured.

Disabling type-checked rules for JavaScript files and enabling Node.js globals with require support for CommonJS files are appropriate overrides. Placing prettierConfig last ensures ESLint formatting rules don't conflict with Prettier.


96-102: The React Hooks rules are valid and available in eslint-plugin-react-hooks 7.0.1.

The review comment's assertion is incorrect. All the specified rules—immutability, preserve-manual-memoization, purity, refs, rules-of-hooks, set-state-in-effect, and static-components—are part of the standard eslint-plugin-react-hooks (v7.0.1) that is already installed in the project. These are not from a separate eslint-plugin-react-compiler plugin (which is not even a dependency). The configuration is correct and will not cause ESLint errors.

Likely an incorrect or invalid review comment.

apps/admin/package.json (1)

14-18: LGTM! Script changes align with the centralized tooling approach.

The pnpm exec wrapper ensures ESLint and Prettier resolve from the workspace root. Similar to the propel package, the --max-warnings=485 count is high—tracking these for gradual reduction would be beneficial.

packages/services/package.json (1)

17-21: Script standardization via pnpm exec is consistent with tooling migration.

The conversion to pnpm exec wrappers and use of . glob (instead of explicit patterns) aligns with the centralized ESLint/Prettier configuration strategy. The max-warnings=1131 threshold was established as a post-migration baseline in the recent ESLint standardization and remains unchanged, which prevents regression while the codebase quality improves.

apps/space/package.json (1)

13-17: Script standardization is consistent.

The conversion to pnpm exec wrappers aligns with the tooling centralization. The max-warnings=932 threshold is appropriate for the scope of this application.

apps/live/package.json (1)

18-22: Verify the 16× increase in max-warnings (10 → 160) for apps/live.

The max-warnings threshold increased from 10 to 160, which represents a significant loosening of linting strictness. While this aligns with a post-migration baseline approach (as documented in prior commits), clarify whether this jump is intentional or reflects changes in the ESLint configuration applied to this package.

packages/constants/package.json (1)

10-14: max-warnings increased from 0 to 30 for a constants package—verify this is intentional.

This package previously enforced zero warnings (strict linting). The increase to 30 suggests either that new ESLint rules are producing violations or the configuration has changed. For a small constants-only package, maintaining a stricter threshold is preferable. Clarify whether this change is part of the intentional post-migration baseline or warrants immediate reduction.

apps/web/package.json (1)

13-17: Verify that the exceptional max-warnings=14367 threshold for apps/web has been addressed.

A past review flagged this as a critical issue (approximately 75× higher than other packages and 15.4× higher than the previous value of 934). The past comment indicates it was addressed in commit 8434c76, but the current code still shows 14367. Confirm whether that commit actually resolved this or if further action is needed to bring this threshold in line with other packages (e.g., packages/editor at 1435).

packages/logger/package.json (1)

15-19: Maintains strict linting standard with max-warnings=0.

Unlike other packages that have been adjusted to allow baseline warnings, packages/logger retains the strictest linting enforcement. This is appropriate for shared infrastructure and models the desired code quality standard.

package.json (3)

15-21: Root-level script coordination enables centralized tooling.

The addition of fix:lint, prepare (Husky), and delegation via Turbo creates a cohesive workflow. The prepare script ensures Husky hooks are installed on pnpm install. However, verify that .npmrc settings do not interfere with script execution (see related review comment for .npmrc).


23-45: ESLint and Prettier ecosystem consolidation at root is well-structured.

Centralizing ESLint plugins, Prettier, and related tooling at the root level (with removal from per-package devDependencies) streamlines dependency management. The comprehensive plugin set (jsx-a11y, react, react-hooks, storybook, unicorn, etc.) indicates a mature, opinion-driven linting setup. Verify that hoisting rules in .npmrc correctly expose these tools to all packages.


47-54: lint-staged configuration enforces strict linting on pre-commit.

The lint-staged rules apply pnpm exec prettier --write and pnpm exec eslint --fix --max-warnings=0 to staged files. The zero-warning threshold at the hook level enforces quality before commit, which is a strong practice. This complements per-package relaxed baselines—developers must fix violations before committing but have more lenience in non-commit checks.

.npmrc (4)

1-15: Core workspace configuration is well-organized and maintains stability.

The reorganization with clear section comments improves maintainability. The save-workspace-protocol = true ensures consistent workspace:* protocol usage, and the core settings prioritize workspace packages, which is correct for a monorepo.


18-31: Dependency resolution strategy balances peer dependencies and strictness appropriately.

The auto-install-peers = true with strict-peer-dependencies = false reduces friction while still providing safeguards. The resolution-mode = highest prevents fragmentation. These settings align well with monorepo requirements.


34-47: Performance optimizations are well-chosen for both local and CI environments.

The prefer-offline = true, side-effects-cache = true, and prefer-frozen-lockfile = true settings optimize for local development caching and CI consistency. The node-linker = isolated ensures compatibility with Node ecosystem tooling. These are solid choices.


50-59: Hoisting strategy update is mostly sound, but verify Prettier hoisting.

The hoisting pattern now includes vite, turbo, and *@plane/* namespace (namespace hoisting for all plane packages), which are appropriate. However, prettier was removed from the hoisting list. Verify that this is intentional and doesn't cause issues with packages that invoke prettier via direct path references rather than pnpm exec. If prettier is only used via pnpm exec prettier, then removing it from hoisting is acceptable (it will resolve via root node_modules). Consider adding a comment explaining why prettier is not hoisted.

As noted in prior review comments, enable-pre-post-scripts = false was flagged as critical in past reviews and has been removed—this is correct and allows the prepare: "husky" script to execute automatically on install.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (3)
packages/propel/src/icons/index.ts (1)

67-68: Reorder exports to maintain alphabetical sorting.

The exports are not in alphabetical order. "./workspace" should come before "./workspace-icon".

Apply this diff to fix the ordering:

-export * from "./workspace-icon";
 export * from "./workspace";
+export * from "./workspace-icon";
packages/decorators/tsconfig.json (1)

3-13: Include restriction looks good; consider future migration off legacy decorators.

"include": ["src"] is a sensible restriction for this package and pairs fine with the existing rootDir/paths setup. Longer term, it would be good to plan a migration away from experimentalDecorators/emitDecoratorMetadata toward TC39-compliant decorators, since the legacy pipeline is treated as deprecated in the repo guidelines.

Based on learnings, this package may eventually want to align with the standard decorators guidance.

.npmrc (1)

1-59: pnpm workspace settings are coherent; just be mindful of frozen lockfile semantics.

These .npmrc settings are well-aligned with a pnpm monorepo (workspace-preferring resolution, shared lockfile, isolated linker, side-effects cache, targeted public hoisting of toolchain packages). One behavioral change to keep in mind is prefer-frozen-lockfile = true, which will make plain pnpm install fail if pnpm-lock.yaml is out of sync—developers and CI will need to explicitly opt out when intentionally updating dependencies. If that’s the goal, this looks good; otherwise, consider documenting the workflow or adjusting this flag.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between dff99b6 and 8369fef.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (107)
  • .github/workflows/pull-request-build-lint-web-apps.yml (1 hunks)
  • .husky/pre-commit (1 hunks)
  • .npmrc (1 hunks)
  • .prettierignore (1 hunks)
  • .prettierrc (1 hunks)
  • CODEOWNERS (1 hunks)
  • CONTRIBUTING.md (3 hunks)
  • apps/admin/.eslintignore (0 hunks)
  • apps/admin/.eslintrc.cjs (0 hunks)
  • apps/admin/.prettierignore (1 hunks)
  • apps/admin/.prettierrc (0 hunks)
  • apps/admin/package.json (1 hunks)
  • apps/admin/postcss.config.cjs (0 hunks)
  • apps/admin/tailwind.config.cjs (0 hunks)
  • apps/admin/tsconfig.json (1 hunks)
  • apps/api/.prettierignore (1 hunks)
  • apps/live/.eslintignore (0 hunks)
  • apps/live/.eslintrc.cjs (0 hunks)
  • apps/live/.prettierignore (1 hunks)
  • apps/live/.prettierrc (0 hunks)
  • apps/live/package.json (1 hunks)
  • apps/live/tsconfig.json (0 hunks)
  • apps/proxy/.prettierignore (1 hunks)
  • apps/space/.eslintignore (0 hunks)
  • apps/space/.eslintrc.cjs (0 hunks)
  • apps/space/.prettierignore (1 hunks)
  • apps/space/.prettierrc (0 hunks)
  • apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx (0 hunks)
  • apps/space/package.json (1 hunks)
  • apps/space/postcss.config.cjs (0 hunks)
  • apps/space/tailwind.config.cjs (0 hunks)
  • apps/space/tsconfig.json (1 hunks)
  • apps/web/.eslintignore (0 hunks)
  • apps/web/.eslintrc.cjs (0 hunks)
  • apps/web/.prettierignore (1 hunks)
  • apps/web/.prettierrc (0 hunks)
  • apps/web/ce/components/projects/create/attributes.tsx (1 hunks)
  • apps/web/core/components/home/widgets/index.ts (0 hunks)
  • apps/web/core/components/integration/guide.tsx (1 hunks)
  • apps/web/core/components/issues/issue-detail-widgets/sub-issues/index.ts (1 hunks)
  • apps/web/core/lib/polyfills/index.ts (1 hunks)
  • apps/web/core/lib/polyfills/requestIdleCallback.ts (0 hunks)
  • apps/web/package.json (1 hunks)
  • apps/web/postcss.config.cjs (0 hunks)
  • apps/web/tailwind.config.cjs (0 hunks)
  • apps/web/tsconfig.json (1 hunks)
  • eslint.config.mjs (1 hunks)
  • package.json (1 hunks)
  • packages/codemods/.prettierignore (1 hunks)
  • packages/codemods/.prettierrc (0 hunks)
  • packages/constants/.eslintignore (0 hunks)
  • packages/constants/.eslintrc.cjs (0 hunks)
  • packages/constants/.prettierignore (1 hunks)
  • packages/constants/.prettierrc (0 hunks)
  • packages/constants/package.json (1 hunks)
  • packages/decorators/.eslintignore (0 hunks)
  • packages/decorators/.eslintrc.cjs (0 hunks)
  • packages/decorators/.prettierignore (1 hunks)
  • packages/decorators/.prettierrc (0 hunks)
  • packages/decorators/package.json (1 hunks)
  • packages/decorators/tsconfig.json (1 hunks)
  • packages/editor/.eslintignore (0 hunks)
  • packages/editor/.eslintrc.cjs (0 hunks)
  • packages/editor/.prettierignore (1 hunks)
  • packages/editor/.prettierrc (0 hunks)
  • packages/editor/package.json (1 hunks)
  • packages/editor/tsconfig.json (1 hunks)
  • packages/eslint-config/library.js (0 hunks)
  • packages/eslint-config/next.js (0 hunks)
  • packages/eslint-config/package.json (0 hunks)
  • packages/eslint-config/server.js (0 hunks)
  • packages/hooks/.eslintignore (0 hunks)
  • packages/hooks/.eslintrc.cjs (0 hunks)
  • packages/hooks/.prettierignore (1 hunks)
  • packages/hooks/.prettierrc (0 hunks)
  • packages/hooks/package.json (1 hunks)
  • packages/i18n/.eslintignore (0 hunks)
  • packages/i18n/.eslintrc.cjs (0 hunks)
  • packages/i18n/.prettierignore (1 hunks)
  • packages/i18n/.prettierrc (0 hunks)
  • packages/i18n/package.json (1 hunks)
  • packages/logger/.eslintignore (0 hunks)
  • packages/logger/.eslintrc.cjs (0 hunks)
  • packages/logger/.prettierignore (1 hunks)
  • packages/logger/.prettierrc (0 hunks)
  • packages/logger/package.json (1 hunks)
  • packages/logger/tsconfig.json (0 hunks)
  • packages/propel/.eslintignore (0 hunks)
  • packages/propel/.eslintrc.cjs (0 hunks)
  • packages/propel/.prettierignore (1 hunks)
  • packages/propel/.prettierrc (0 hunks)
  • packages/propel/package.json (1 hunks)
  • packages/propel/postcss.config.js (0 hunks)
  • packages/propel/src/icons/cycle/index.ts (1 hunks)
  • packages/propel/src/icons/index.ts (3 hunks)
  • packages/services/.eslintignore (0 hunks)
  • packages/services/.eslintrc.cjs (0 hunks)
  • packages/services/.prettierignore (1 hunks)
  • packages/services/.prettierrc (0 hunks)
  • packages/services/package.json (1 hunks)
  • packages/services/src/dashboard/dashboard.service.ts (1 hunks)
  • packages/services/src/developer/webhook.service.ts (1 hunks)
  • packages/services/src/intake/intake.service.ts (1 hunks)
  • packages/services/src/intake/issue.service.ts (1 hunks)
  • packages/shared-state/.eslintignore (0 hunks)
  • packages/shared-state/.eslintrc.js (0 hunks)
  • packages/shared-state/.prettierignore (1 hunks)
⛔ Files not processed due to max files limit (22)
  • packages/shared-state/.prettierrc
  • packages/shared-state/package.json
  • packages/tailwind-config/.prettierignore
  • packages/types/.eslintrc.cjs
  • packages/types/.prettierignore
  • packages/types/.prettierrc
  • packages/types/package.json
  • packages/typescript-config/.prettierignore
  • packages/typescript-config/base.json
  • packages/ui/.eslintignore
  • packages/ui/.eslintrc.cjs
  • packages/ui/.prettierignore
  • packages/ui/.prettierrc
  • packages/ui/package.json
  • packages/ui/postcss.config.js
  • packages/ui/tailwind.config.js
  • packages/utils/.eslintignore
  • packages/utils/.eslintrc.cjs
  • packages/utils/.prettierignore
  • packages/utils/.prettierrc
  • packages/utils/package.json
  • turbo.json
💤 Files with no reviewable changes (55)
  • packages/constants/.prettierrc
  • packages/propel/postcss.config.js
  • apps/live/.prettierrc
  • apps/space/.prettierrc
  • packages/editor/.eslintrc.cjs
  • apps/web/core/components/home/widgets/index.ts
  • apps/web/.eslintignore
  • packages/i18n/.prettierrc
  • packages/eslint-config/library.js
  • packages/services/.eslintignore
  • packages/propel/.prettierrc
  • packages/services/.eslintrc.cjs
  • apps/admin/.prettierrc
  • apps/admin/.eslintignore
  • apps/space/.eslintrc.cjs
  • packages/logger/tsconfig.json
  • packages/logger/.eslintrc.cjs
  • apps/live/.eslintignore
  • apps/web/postcss.config.cjs
  • packages/constants/.eslintignore
  • packages/logger/.prettierrc
  • packages/i18n/.eslintrc.cjs
  • apps/admin/.eslintrc.cjs
  • packages/i18n/.eslintignore
  • apps/live/.eslintrc.cjs
  • packages/eslint-config/next.js
  • apps/web/.eslintrc.cjs
  • packages/editor/.prettierrc
  • apps/web/core/lib/polyfills/requestIdleCallback.ts
  • apps/admin/tailwind.config.cjs
  • packages/hooks/.prettierrc
  • packages/logger/.eslintignore
  • packages/decorators/.eslintrc.cjs
  • packages/codemods/.prettierrc
  • packages/propel/.eslintignore
  • packages/shared-state/.eslintignore
  • packages/hooks/.eslintignore
  • apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx
  • packages/decorators/.eslintignore
  • apps/live/tsconfig.json
  • apps/space/.eslintignore
  • packages/shared-state/.eslintrc.js
  • apps/admin/postcss.config.cjs
  • packages/eslint-config/package.json
  • packages/decorators/.prettierrc
  • packages/services/.prettierrc
  • apps/web/tailwind.config.cjs
  • packages/constants/.eslintrc.cjs
  • packages/eslint-config/server.js
  • apps/web/.prettierrc
  • apps/space/tailwind.config.cjs
  • packages/editor/.eslintignore
  • packages/hooks/.eslintrc.cjs
  • packages/propel/.eslintrc.cjs
  • apps/space/postcss.config.cjs
✅ Files skipped from review due to trivial changes (3)
  • packages/codemods/.prettierignore
  • eslint.config.mjs
  • apps/proxy/.prettierignore
🚧 Files skipped from review as they are similar to previous changes (28)
  • .husky/pre-commit
  • CONTRIBUTING.md
  • apps/admin/.prettierignore
  • apps/web/ce/components/projects/create/attributes.tsx
  • apps/web/core/components/integration/guide.tsx
  • apps/admin/tsconfig.json
  • packages/editor/package.json
  • packages/decorators/.prettierignore
  • packages/services/src/dashboard/dashboard.service.ts
  • packages/propel/.prettierignore
  • packages/hooks/.prettierignore
  • packages/editor/.prettierignore
  • .github/workflows/pull-request-build-lint-web-apps.yml
  • packages/hooks/package.json
  • apps/space/tsconfig.json
  • packages/constants/.prettierignore
  • packages/services/.prettierignore
  • packages/i18n/package.json
  • apps/space/package.json
  • packages/services/src/intake/issue.service.ts
  • packages/propel/src/icons/cycle/index.ts
  • packages/editor/tsconfig.json
  • packages/logger/package.json
  • apps/web/core/lib/polyfills/index.ts
  • packages/logger/.prettierignore
  • apps/web/core/components/issues/issue-detail-widgets/sub-issues/index.ts
  • .prettierignore
  • apps/api/.prettierignore
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • packages/propel/src/icons/index.ts
  • packages/services/src/developer/webhook.service.ts
  • packages/services/src/intake/intake.service.ts
🧠 Learnings (20)
📓 Common learnings
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Use pnpm for package management - do not use npm or yarn
Learnt from: sriramveeraghanta
Repo: makeplane/plane PR: 7672
File: pnpm-workspace.yaml:8-9
Timestamp: 2025-08-29T08:45:15.953Z
Learning: The makeplane/plane repository uses pnpm v10.12.1, which supports onlyBuiltDependencies configuration in pnpm-workspace.yaml files.
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use standard ECMAScript decorators (Stage 3) instead of legacy `experimentalDecorators`
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Use pnpm for package management - do not use npm or yarn

Applied to files:

  • packages/shared-state/.prettierignore
  • apps/web/.prettierignore
  • packages/i18n/.prettierignore
  • packages/propel/package.json
  • apps/live/.prettierignore
  • packages/services/package.json
  • packages/decorators/package.json
  • apps/live/package.json
  • apps/space/.prettierignore
  • packages/constants/package.json
  • .npmrc
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-workspace.yaml : Use pnpm-workspace.yaml for monorepo workspace configuration

Applied to files:

  • packages/shared-state/.prettierignore
  • apps/live/.prettierignore
  • packages/decorators/package.json
  • packages/constants/package.json
  • .npmrc
📚 Learning: 2025-08-29T08:45:15.953Z
Learnt from: sriramveeraghanta
Repo: makeplane/plane PR: 7672
File: pnpm-workspace.yaml:8-9
Timestamp: 2025-08-29T08:45:15.953Z
Learning: The makeplane/plane repository uses pnpm v10.12.1, which supports onlyBuiltDependencies configuration in pnpm-workspace.yaml files.

Applied to files:

  • packages/shared-state/.prettierignore
  • packages/propel/package.json
  • apps/web/package.json
  • packages/services/package.json
  • apps/admin/package.json
  • packages/decorators/package.json
  • apps/live/package.json
  • packages/constants/package.json
  • .npmrc
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use standard ECMAScript decorators (Stage 3) instead of legacy `experimentalDecorators`

Applied to files:

  • packages/decorators/tsconfig.json
  • apps/web/tsconfig.json
  • packages/decorators/package.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Treat legacy `experimentalDecorators`-style behavior as deprecated in favor of standard TC39-compliant decorators

Applied to files:

  • packages/decorators/tsconfig.json
  • apps/web/tsconfig.json
  • packages/decorators/package.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `with { type: "json" }` for import attributes; avoid deprecated `assert` syntax (TypeScript 5.3/5.8+)

Applied to files:

  • packages/decorators/tsconfig.json
  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `.ts`, `.mts`, `.cts` extensions in `import type` statements (TypeScript 5.2+)

Applied to files:

  • packages/decorators/tsconfig.json
  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to {turbo.json,**/*.sh} : Use Turbo for build system orchestration with configuration in turbo.json

Applied to files:

  • packages/i18n/.prettierignore
  • packages/propel/package.json
  • apps/live/.prettierignore
  • apps/web/package.json
  • packages/services/package.json
  • apps/admin/package.json
  • package.json
  • packages/decorators/package.json
  • apps/live/package.json
  • packages/constants/package.json
  • .npmrc
📚 Learning: 2025-10-06T01:45:11.248Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7888
File: packages/propel/src/table/table.stories.tsx:1-1
Timestamp: 2025-10-06T01:45:11.248Z
Learning: When using Storybook with React + Vite framework, Meta and StoryObj types should be imported from "storybook/react-vite", not from "storybook/react". This is the correct pattern per Storybook's official documentation for framework-specific type imports.

Applied to files:

  • packages/propel/package.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `const` type parameters for more precise literal inference in TypeScript 5.0+

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use copying array methods (`toSorted`, `toSpliced`, `with`) for immutable array operations (TypeScript 5.2+)

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use constant indices to narrow object/array properties (TypeScript 5.5+)

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Utilize narrowing in `switch(true)` blocks for control flow analysis (TypeScript 5.3+)

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-05-14T13:16:23.323Z
Learnt from: vamsikrishnamathala
Repo: makeplane/plane PR: 7061
File: web/core/components/workspace-notifications/root.tsx:18-18
Timestamp: 2025-05-14T13:16:23.323Z
Learning: In the Plane project codebase, the path alias `@/plane-web` resolves to the `ce` directory, making imports like `@/plane-web/hooks/use-notification-preview` correctly resolve to files in `web/ce/hooks/`.

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-10-21T17:22:05.204Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7989
File: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx:45-46
Timestamp: 2025-10-21T17:22:05.204Z
Learning: In the makeplane/plane repository, the refactor from useParams() to params prop is specifically scoped to page.tsx and layout.tsx files in apps/web/app (Next.js App Router pattern). Other components (hooks, regular client components, utilities) should continue using the useParams() hook as that is the correct pattern for non-route components.

Applied to files:

  • apps/web/tsconfig.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Run tests in a specific package using pnpm --filter plane/<package_name> run test

Applied to files:

  • packages/constants/package.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-lock.yaml : Use pnpm-lock.yaml as the lockfile for dependency management

Applied to files:

  • .npmrc
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Analyze (javascript)
  • GitHub Check: Build and lint web apps
🔇 Additional comments (21)
packages/i18n/.prettierignore (1)

1-11: Prettier ignore patterns are consistent and correct.

The recursive glob patterns appropriately exclude build outputs, tool caches, dependencies, and lockfiles from formatting across all directory depths. The standardization aligns well with the monorepo structure.

packages/shared-state/.prettierignore (1)

1-11: New .prettierignore file follows consolidation pattern.

Adding this Prettier ignore file extends consistent ignore patterns to packages/shared-state. The patterns match the standardized approach across the monorepo.

apps/live/.prettierignore (1)

1-11: Recursive glob patterns improve ignore coverage consistency.

The migration to recursive **/ patterns ensures proper exclusion across all nesting levels in apps/live. This aligns the ignore behavior with other apps/packages in the monorepo.

apps/web/.prettierignore (1)

1-11: Standardized ignore patterns maintain broad coverage for apps/web.

The update to recursive glob patterns ensures consistency across the monorepo while properly excluding build outputs, caches, and dependencies at all directory depths.

apps/space/.prettierignore (1)

1-11: Standardized patterns and typo fix improve apps/space ignore coverage.

The migration to recursive globs and correction of .turbo (previously .tubro) ensures both consistency and correctness across the monorepo's Prettier ignore configuration.

packages/services/src/developer/webhook.service.ts (1)

105-106: LGTM! Named export added for flexibility.

The addition of a named export alongside the existing default export is a clean, backward-compatible change that allows consumers to use either import style. This aligns with the pattern applied consistently across other service classes in this PR.

packages/services/src/intake/intake.service.ts (1)

9-10: LGTM! Named export added for flexibility.

The addition of a named export alongside the existing default export follows the same backward-compatible pattern applied across service classes in this PR. This allows consumers to choose their preferred import style.

packages/propel/src/icons/index.ts (1)

32-32: The review comment is based on inaccurate information.

The AI summary claims IconProps was removed, but verification shows:

  1. IconProps is still defined in packages/propel/src/icons/icon.tsx (line 7)
  2. It is still exported via packages/propel/src/icons/index.ts line 32 (export * from "./icon")
  3. Git diff shows no changes to either file in this PR—only the ESLint configuration was modified
  4. No downstream code in the repository imports or uses IconProps, so there is no breaking change impact

There is no removal to verify or breaking change to address.

CODEOWNERS (1)

1-1: Explicit ownership for eslint.config.mjs is helpful.

Assigning eslint.config.mjs to @lifeiscontent makes future changes and reviews for the central ESLint config clearer.

.prettierrc (1)

2-15: Centralized Prettier config looks consistent; just confirm plugin + override wiring.

The root $schema, @prettier/plugin-oxc plugin entry, and codemods-specific printWidth override are a good consolidation step. Please double-check that:

  • @prettier/plugin-oxc is declared at the workspace level where pnpm exec prettier resolves it, and
  • packages/codemods/**/* matches the actual codemods directory structure you intend to format at width 80.
packages/propel/package.json (1)

7-18: Propel lint/format scripts correctly aligned to pnpm exec.

Switching check:lint/fix:lint and check:format/fix:format to use pnpm exec eslint/prettier with a . target matches the workspace-wide tooling approach and the pnpm recommendation for command execution. The elevated --max-warnings value looks consistent with using a baseline during the ESLint migration; you can iterate that down later as warnings are fixed.

apps/web/tsconfig.json (1)

3-19: Path aliases look coherent; verify all existing @/… imports still resolve as expected.

The updated paths keep @/plane-web/* pointing at ./ce/* (per prior repo conventions) and add clearer aliases like ce/* and app/* while mapping @/* to ./core/*. That’s a sensible structure; just confirm there are no remaining @/… imports that previously relied on @/* resolving to anything outside core, and that React Router build/typegen still works with these aliases.

packages/services/package.json (1)

14-22: Services lint/format scripts are correctly migrated to pnpm exec.

Using pnpm exec eslint and pnpm exec prettier with . as the target keeps this package consistent with the repo’s pnpm-based tooling setup and central Prettier/ESLint configs. Behavior should remain the same aside from the standardized execution wrapper.

apps/admin/package.json (1)

8-18: Admin lint/format scripts now match the standardized pnpm-based tooling.

The move to pnpm exec eslint/prettier plus the updated --max-warnings threshold follows the same pattern as other apps/packages in this PR and respects the repo’s pnpm-first convention. No issues from a config perspective.

apps/live/package.json (1)

18-18: Script migration to pnpm exec looks good.

The migration to pnpm exec for lint/format commands follows the established pattern and aligns with the monorepo tooling strategy. The max-warnings=160 threshold is reasonable for this package.

Also applies to: 20-22

packages/decorators/package.json (1)

15-15: Script migration consistent with monorepo pattern.

The pnpm exec migration and max-warnings=29 threshold follow the established pattern. The lower threshold for this decorators package suggests stricter linting requirements, which is appropriate for core utilities.

Also applies to: 17-19

apps/web/package.json (1)

13-13: ⚠️ Verify max-warnings=14367 — potential regression or inconsistency with past review.

The past review (lines 13 noted) flagged max-warnings=14367 as exceptionally high and marked it as "Addressed in commit 8434c76". However, the current code still shows 14367. This represents accepting approximately 14,000+ ESLint violations.

Clarify: Has this threshold been properly reduced, or does the current code reflect a pre-fix state? If this is the latest state, the threshold should be significantly lowered (aim for ≤1,435, matching the next-highest package) after fixing auto-correctable issues.

Also applies to: 16-16

packages/constants/package.json (1)

10-10: Script migration aligned with monorepo standards.

The pnpm exec migration and max-warnings=30 threshold are consistent with the established pattern. The strict threshold is appropriate for a constants package.

Also applies to: 12-14

package.json (3)

20-20: Husky prepare hook and lint-staged configuration look sound.

The prepare script will properly initialize Husky git hooks, and the lint-staged config correctly uses pnpm exec with appropriate tool invocations. The strict --max-warnings=0 for staged ESLint checks ensures pre-commit linting quality.

Also applies to: 45-51


23-43: Centralized ESLint v9 configuration is properly established and discoverable.

Verification confirms:

  1. ✓ Centralized ESLint config file exists at root: eslint.config.mjs (ESLint v9 flat config format)
  2. ✓ Config is properly exported via defineConfig and uses correct ESLint v9 syntax
  3. ✓ All ESLint plugins listed in package.json are imported and configured:
    • @eslint/js, eslint-plugin-import, eslint-plugin-jsx-a11y, eslint-plugin-promise, eslint-plugin-react, eslint-plugin-react-hooks, eslint-plugin-react-refresh, @vitest/eslint-plugin
    • eslint-plugin-storybook is commented out (as noted in TODO on line 47)
  4. ✓ TypeScript support via typescript-eslint is correctly configured:
    • tseslint.configs.recommendedTypeChecked applied
    • projectService: true enabled for type checking
    • TypeScript resolver configured with monorepo support ({apps,packages}/*/tsconfig.json)

The configuration supports multiple file types (.ts, .tsx, .js, .cjs, .jsx) and integrates Prettier via eslint-config-prettier/flat.


24-24: Line 41 reference in the review comment is incorrect — it points to the prettier dependency, not @prettier/plugin-oxc.

The review comment claims "Also applies to: 41-41," but line 41 contains "prettier": "3.6.2", not @prettier/plugin-oxc. The only occurrence of @prettier/plugin-oxc in the codebase is at line 24 in the root package.json.

The root .prettierrc correctly references this plugin ("plugins": ["@prettier/plugin-oxc"), and it resides only at the root level—not in any subpackages. This is the expected pattern: a root-level Prettier configuration uses a root-level dev dependency for shared tooling across the monorepo. No subpackages currently have (or had) this dependency.

The concern about inconsistency appears to be based on a misunderstanding of the PR changes or incorrect line references. The current state shows proper alignment: root dependency + root config = consistent setup.

Likely an incorrect or invalid review comment.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 8

♻️ Duplicate comments (1)
packages/constants/.prettierignore (1)

9-9: Remove pnpm-lock.yaml — regression from prior review.

This was previously flagged as a major issue and marked as addressed in prior commits, but the entry persists. Lockfile ignores must be centralized in root .prettierignore only, as per-package entries are ineffective when prettier runs from package directories.

  node_modules/
  out/
- pnpm-lock.yaml
  storybook-static/

Please verify that the prior fix (commits c31a225–25a531b) was completed or explain if this change intentionally reintroduces the entry.

🧹 Nitpick comments (6)
packages/eslint-config/.prettierignore (1)

1-10: Remove pnpm-lock.yaml from per-package .prettierignore files; keep only in root.

Including pnpm-lock.yaml in per-package .prettierignore files is redundant. When prettier runs from a package directory (e.g., prettier --write . from packages/eslint-config/), the relative path pnpm-lock.yaml will not match the root-level lockfile. This entry should be centralized in the root .prettierignore only, where it applies to all executed prettier commands via the configuration discovery mechanism. The duplication across all 23 .prettierignore files appears to be part of a single commit pattern; consolidating to the root version will reduce maintenance burden.

apps/admin/tsconfig.json (1)

11-18: Clarify overlapping path mappings and unusual entries.

The path mappings include several entries that may warrant review:

  • Line 11: "package.json": ["./package.json"] — This is unusual. Path mappings are typically for code imports. Is this for JSON imports? If so, use import pkg from "./package.json" with { type: "json" } per TypeScript 5.3+ (as noted in learnings).
  • Lines 13–14: "@/app/*" and "@/*" overlap; TypeScript uses the most specific match, so this works, but could be confusing. Document the intent if these are intentionally different (e.g., app-specific vs. core utilities).

If package.json import is needed, consider using import attributes syntax instead of path mapping. Review the semantic distinction between @/app/* and @/* to ensure the mapping aligns with actual directory structure and intended consumption patterns.

eslint.config.mjs (2)

1-64: Flat config composition looks aligned with ESLint 9 / TS-ESLint best practices

The overall structure (globalIgnores, eslint.configs.recommended, tseslint.configs.recommendedTypeChecked, React/a11y/promise/vitest/react-refresh presets) matches the documented flat-config approach and should give good coverage across apps. One thing to double‑check: tsconfigRootDir: import.meta.dirname relies on modern Node ESM support—make sure the Node version used by pnpm lint/CI supports import.meta.dirname, or fall back to the classic fileURLToPath(new URL(".", import.meta.url)) pattern if you need broader compatibility. Also, since .storybook/** is globally ignored, remember to remove that pattern when you eventually enable Storybook linting so those files actually get checked.


65-130: Remove or properly wire the jsdoc/require-jsdoc rule

You’re disabling jsdoc/require-jsdoc without importing or configuring eslint-plugin-jsdoc anywhere in this flat config. Referencing a plugin rule when the plugin itself isn’t registered can produce “Definition for rule 'jsdoc/…' was not found” noise depending on ESLint version. If you don’t intend to use jsdoc linting, it’s cleaner to drop this rule entry entirely; if you do, explicitly import eslint-plugin-jsdoc and include its flat config before overriding this rule.

apps/space/package.json (1)

13-17: Confirm intended scope and loosened warning threshold for lint/format scripts

Switching to eslint . / prettier --check . expands coverage to everything under apps/space (including config and ancillary files), and raising --max-warnings to 932 means these scripts are unlikely to fail builds on new warnings. If that’s intentional for this app, it’s fine; if you still want warnings to gate CI, consider a lower, shared threshold or using --max-warnings=0 in your central check workflow instead.

packages/hooks/package.json (1)

18-22: Script changes broaden coverage; validate the new --max-warnings=60 policy

Running ESLint/Prettier over . will now include any new config or helper files you add under packages/hooks, which is generally a nice safety net. The jump from 6 to 60 allowed warnings makes the checks less strict but still meaningfully bounded; just confirm this aligns with how you want CI to behave for a shared hooks library (vs. keeping a tighter cap or using --max-warnings=0 in a top‑level job).

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8369fef and 8047ebc.

📒 Files selected for processing (107)
  • .github/workflows/pull-request-build-lint-web-apps.yml (1 hunks)
  • .husky/pre-commit (1 hunks)
  • .npmrc (1 hunks)
  • .prettierignore (1 hunks)
  • .prettierrc (1 hunks)
  • CODEOWNERS (1 hunks)
  • CONTRIBUTING.md (3 hunks)
  • apps/admin/.eslintignore (0 hunks)
  • apps/admin/.eslintrc.cjs (0 hunks)
  • apps/admin/.prettierignore (1 hunks)
  • apps/admin/.prettierrc (0 hunks)
  • apps/admin/package.json (1 hunks)
  • apps/admin/postcss.config.cjs (0 hunks)
  • apps/admin/tailwind.config.cjs (0 hunks)
  • apps/admin/tsconfig.json (1 hunks)
  • apps/api/.prettierignore (1 hunks)
  • apps/live/.eslintignore (0 hunks)
  • apps/live/.eslintrc.cjs (0 hunks)
  • apps/live/.prettierignore (1 hunks)
  • apps/live/.prettierrc (0 hunks)
  • apps/live/package.json (1 hunks)
  • apps/live/tsconfig.json (1 hunks)
  • apps/proxy/.prettierignore (1 hunks)
  • apps/space/.eslintignore (0 hunks)
  • apps/space/.eslintrc.cjs (0 hunks)
  • apps/space/.prettierignore (1 hunks)
  • apps/space/.prettierrc (0 hunks)
  • apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx (0 hunks)
  • apps/space/package.json (1 hunks)
  • apps/space/postcss.config.cjs (0 hunks)
  • apps/space/tailwind.config.cjs (0 hunks)
  • apps/space/tsconfig.json (1 hunks)
  • apps/web/.eslintignore (0 hunks)
  • apps/web/.eslintrc.cjs (0 hunks)
  • apps/web/.prettierignore (1 hunks)
  • apps/web/.prettierrc (0 hunks)
  • apps/web/ce/components/projects/create/attributes.tsx (1 hunks)
  • apps/web/core/components/home/widgets/index.ts (0 hunks)
  • apps/web/core/components/integration/guide.tsx (1 hunks)
  • apps/web/core/components/issues/issue-detail-widgets/sub-issues/index.ts (1 hunks)
  • apps/web/core/lib/polyfills/index.ts (1 hunks)
  • apps/web/core/lib/polyfills/requestIdleCallback.ts (0 hunks)
  • apps/web/package.json (1 hunks)
  • apps/web/postcss.config.cjs (0 hunks)
  • apps/web/tailwind.config.cjs (0 hunks)
  • apps/web/tsconfig.json (1 hunks)
  • eslint.config.mjs (1 hunks)
  • package.json (1 hunks)
  • packages/codemods/.prettierignore (1 hunks)
  • packages/codemods/.prettierrc (0 hunks)
  • packages/constants/.eslintignore (0 hunks)
  • packages/constants/.eslintrc.cjs (0 hunks)
  • packages/constants/.prettierignore (1 hunks)
  • packages/constants/.prettierrc (0 hunks)
  • packages/constants/package.json (1 hunks)
  • packages/decorators/.eslintignore (0 hunks)
  • packages/decorators/.eslintrc.cjs (0 hunks)
  • packages/decorators/.prettierignore (1 hunks)
  • packages/decorators/.prettierrc (0 hunks)
  • packages/decorators/package.json (1 hunks)
  • packages/decorators/tsconfig.json (1 hunks)
  • packages/editor/.eslintignore (0 hunks)
  • packages/editor/.eslintrc.cjs (0 hunks)
  • packages/editor/.prettierignore (1 hunks)
  • packages/editor/.prettierrc (0 hunks)
  • packages/editor/package.json (1 hunks)
  • packages/editor/tsconfig.json (1 hunks)
  • packages/eslint-config/.prettierignore (1 hunks)
  • packages/eslint-config/library.js (0 hunks)
  • packages/eslint-config/next.js (0 hunks)
  • packages/eslint-config/package.json (0 hunks)
  • packages/eslint-config/server.js (0 hunks)
  • packages/hooks/.eslintignore (0 hunks)
  • packages/hooks/.eslintrc.cjs (0 hunks)
  • packages/hooks/.prettierignore (1 hunks)
  • packages/hooks/.prettierrc (0 hunks)
  • packages/hooks/package.json (1 hunks)
  • packages/i18n/.eslintignore (0 hunks)
  • packages/i18n/.eslintrc.cjs (0 hunks)
  • packages/i18n/.prettierignore (1 hunks)
  • packages/i18n/.prettierrc (0 hunks)
  • packages/i18n/package.json (1 hunks)
  • packages/logger/.eslintignore (0 hunks)
  • packages/logger/.eslintrc.cjs (0 hunks)
  • packages/logger/.prettierignore (1 hunks)
  • packages/logger/.prettierrc (0 hunks)
  • packages/logger/package.json (1 hunks)
  • packages/logger/tsconfig.json (1 hunks)
  • packages/propel/.eslintignore (0 hunks)
  • packages/propel/.eslintrc.cjs (0 hunks)
  • packages/propel/.prettierignore (1 hunks)
  • packages/propel/.prettierrc (0 hunks)
  • packages/propel/package.json (1 hunks)
  • packages/propel/postcss.config.js (0 hunks)
  • packages/propel/src/icons/cycle/index.ts (1 hunks)
  • packages/propel/src/icons/index.ts (3 hunks)
  • packages/propel/tsconfig.json (1 hunks)
  • packages/services/.eslintignore (0 hunks)
  • packages/services/.eslintrc.cjs (0 hunks)
  • packages/services/.prettierignore (1 hunks)
  • packages/services/.prettierrc (0 hunks)
  • packages/services/package.json (1 hunks)
  • packages/services/src/dashboard/dashboard.service.ts (1 hunks)
  • packages/services/src/developer/webhook.service.ts (1 hunks)
  • packages/services/src/intake/intake.service.ts (1 hunks)
  • packages/services/src/intake/issue.service.ts (1 hunks)
  • packages/services/tsconfig.json (1 hunks)
⛔ Files not processed due to max files limit (18)
  • packages/shared-state/.eslintignore
  • packages/shared-state/.eslintrc.js
  • packages/shared-state/.prettierignore
  • packages/shared-state/.prettierrc
  • packages/shared-state/package.json
  • packages/shared-state/tsconfig.json
  • packages/tailwind-config/.prettierignore
  • packages/types/.eslintrc.cjs
  • packages/types/.prettierignore
  • packages/types/.prettierrc
  • packages/types/package.json
  • packages/typescript-config/.prettierignore
  • packages/typescript-config/base.json
  • packages/ui/.eslintignore
  • packages/ui/.eslintrc.cjs
  • packages/ui/.prettierignore
  • packages/ui/.prettierrc
  • packages/ui/package.json
💤 Files with no reviewable changes (51)
  • packages/editor/.prettierrc
  • apps/web/.eslintignore
  • packages/propel/.prettierrc
  • apps/live/.eslintignore
  • apps/admin/.prettierrc
  • apps/space/.prettierrc
  • apps/space/.eslintrc.cjs
  • packages/eslint-config/library.js
  • packages/codemods/.prettierrc
  • packages/eslint-config/server.js
  • apps/space/postcss.config.cjs
  • apps/live/.eslintrc.cjs
  • apps/web/core/components/home/widgets/index.ts
  • packages/editor/.eslintignore
  • apps/admin/postcss.config.cjs
  • packages/services/.eslintrc.cjs
  • packages/propel/.eslintrc.cjs
  • apps/web/core/lib/polyfills/requestIdleCallback.ts
  • packages/eslint-config/package.json
  • packages/eslint-config/next.js
  • packages/logger/.eslintignore
  • apps/space/.eslintignore
  • packages/hooks/.eslintrc.cjs
  • packages/propel/postcss.config.js
  • apps/web/tailwind.config.cjs
  • apps/web/.eslintrc.cjs
  • packages/hooks/.eslintignore
  • packages/i18n/.prettierrc
  • apps/web/.prettierrc
  • apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx
  • packages/decorators/.eslintignore
  • packages/logger/.eslintrc.cjs
  • packages/editor/.eslintrc.cjs
  • packages/i18n/.eslintignore
  • packages/logger/.prettierrc
  • apps/admin/.eslintignore
  • packages/i18n/.eslintrc.cjs
  • packages/decorators/.eslintrc.cjs
  • apps/admin/tailwind.config.cjs
  • apps/admin/.eslintrc.cjs
  • packages/services/.eslintignore
  • packages/constants/.eslintignore
  • apps/live/.prettierrc
  • packages/constants/.eslintrc.cjs
  • packages/decorators/.prettierrc
  • apps/web/postcss.config.cjs
  • packages/constants/.prettierrc
  • packages/services/.prettierrc
  • packages/propel/.eslintignore
  • packages/hooks/.prettierrc
  • apps/space/tailwind.config.cjs
✅ Files skipped from review due to trivial changes (1)
  • packages/decorators/.prettierignore
🚧 Files skipped from review as they are similar to previous changes (36)
  • .prettierrc
  • packages/services/src/intake/issue.service.ts
  • packages/i18n/package.json
  • apps/web/core/lib/polyfills/index.ts
  • apps/web/core/components/integration/guide.tsx
  • .husky/pre-commit
  • packages/services/package.json
  • packages/services/src/intake/intake.service.ts
  • apps/admin/package.json
  • packages/services/src/dashboard/dashboard.service.ts
  • apps/live/tsconfig.json
  • packages/logger/.prettierignore
  • apps/web/tsconfig.json
  • packages/propel/.prettierignore
  • apps/space/tsconfig.json
  • .prettierignore
  • apps/proxy/.prettierignore
  • .github/workflows/pull-request-build-lint-web-apps.yml
  • packages/decorators/package.json
  • apps/web/ce/components/projects/create/attributes.tsx
  • packages/decorators/tsconfig.json
  • apps/web/core/components/issues/issue-detail-widgets/sub-issues/index.ts
  • apps/live/package.json
  • packages/codemods/.prettierignore
  • packages/propel/src/icons/cycle/index.ts
  • CONTRIBUTING.md
  • packages/propel/package.json
  • CODEOWNERS
  • packages/editor/package.json
  • apps/web/.prettierignore
  • apps/web/package.json
  • packages/logger/package.json
  • apps/space/.prettierignore
  • package.json
  • packages/services/.prettierignore
  • packages/hooks/.prettierignore
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx,mts,cts}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

**/*.{ts,tsx,mts,cts}: Use const type parameters for more precise literal inference in TypeScript 5.0+
Use the satisfies operator to validate types without widening them
Leverage inferred type predicates to reduce the need for explicit is return types in filter/check functions
Use NoInfer<T> utility to block inference for specific type arguments when they should be determined by other arguments
Utilize narrowing in switch(true) blocks for control flow analysis (TypeScript 5.3+)
Rely on narrowing from direct boolean comparisons for type guards
Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)
Use constant indices to narrow object/array properties (TypeScript 5.5+)
Use standard ECMAScript decorators (Stage 3) instead of legacy experimentalDecorators
Use using declarations for explicit resource management with Disposable pattern instead of manual cleanup (TypeScript 5.2+)
Use with { type: "json" } for import attributes; avoid deprecated assert syntax (TypeScript 5.3/5.8+)
Use import type explicitly when importing types to ensure they are erased during compilation, respecting verbatimModuleSyntax flag
Use .ts, .mts, .cts extensions in import type statements (TypeScript 5.2+)
Use import type { Type } from "mod" with { "resolution-mode": "import" } for specific module resolution contexts (TypeScript 5.3+)
Use new iterator methods (map, filter, etc.) if targeting modern environments (TypeScript 5.6+)
Utilize new Set methods like union, intersection, etc., when available (TypeScript 5.5+)
Use Object.groupBy / Map.groupBy standard methods for grouping instead of external libraries (TypeScript 5.4+)
Use Promise.withResolvers() for creating promises with exposed resolve/reject functions (TypeScript 5.7+)
Use copying array methods (toSorted, toSpliced, with) for immutable array operations (TypeScript 5.2+)
Avoid accessing instance fields via super in classes (TypeScript 5....

Files:

  • packages/services/src/developer/webhook.service.ts
  • packages/propel/src/icons/index.ts
**/*.{js,mjs,cjs}

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

Use @import tags in JSDoc for cleaner type imports in JavaScript files when working in a mixed codebase (TypeScript 5.5+)

Files:

  • eslint.config.mjs
🧠 Learnings (27)
📓 Common learnings
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Prioritize using modern features and best practices introduced in TypeScript versions 5.0 through 5.8
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use standard ECMAScript decorators (Stage 3) instead of legacy `experimentalDecorators`
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{js,mjs,cjs} : Use `import` tags in JSDoc for cleaner type imports in JavaScript files when working in a mixed codebase (TypeScript 5.5+)

Applied to files:

  • eslint.config.mjs
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `with { type: "json" }` for import attributes; avoid deprecated `assert` syntax (TypeScript 5.3/5.8+)

Applied to files:

  • eslint.config.mjs
  • packages/services/tsconfig.json
  • packages/propel/tsconfig.json
  • packages/logger/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use standard ECMAScript decorators (Stage 3) instead of legacy `experimentalDecorators`

Applied to files:

  • eslint.config.mjs
  • packages/services/tsconfig.json
  • packages/propel/tsconfig.json
  • packages/logger/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Treat legacy `experimentalDecorators`-style behavior as deprecated in favor of standard TC39-compliant decorators

Applied to files:

  • eslint.config.mjs
  • packages/services/tsconfig.json
  • packages/logger/tsconfig.json
  • packages/hooks/package.json
  • packages/constants/package.json
  • packages/editor/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-10-06T01:44:38.472Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7888
File: packages/propel/src/collapsible/collapsible.stories.tsx:4-4
Timestamp: 2025-10-06T01:44:38.472Z
Learning: In Storybook v9, imports use bare paths instead of scoped packages. For example, `import { useArgs } from "storybook/preview-api"` is correct (not `storybook/preview-api`). This applies to other Storybook modules as well - the scoped storybook/* packages were consolidated into bare "storybook/*" imports.

Applied to files:

  • eslint.config.mjs
📚 Learning: 2025-10-06T01:45:11.248Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7888
File: packages/propel/src/table/table.stories.tsx:1-1
Timestamp: 2025-10-06T01:45:11.248Z
Learning: When using Storybook with React + Vite framework, Meta and StoryObj types should be imported from "storybook/react-vite", not from "storybook/react". This is the correct pattern per Storybook's official documentation for framework-specific type imports.

Applied to files:

  • eslint.config.mjs
📚 Learning: 2025-06-04T16:22:44.344Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7164
File: packages/ui/.storybook/main.ts:24-47
Timestamp: 2025-06-04T16:22:44.344Z
Learning: In packages/ui/.storybook/main.ts, the webpackFinal function intentionally overrides the CSS loader strategy by finding and replacing existing CSS rules. This is a temporary workaround for a known upstream issue in Storybook's CSS handling that has been communicated to the Storybook maintainers. The current implementation should not be changed until the upstream issue is resolved.

Applied to files:

  • eslint.config.mjs
  • apps/api/.prettierignore
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `const` type parameters for more precise literal inference in TypeScript 5.0+

Applied to files:

  • packages/services/tsconfig.json
  • packages/propel/tsconfig.json
  • packages/logger/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `.ts`, `.mts`, `.cts` extensions in `import type` statements (TypeScript 5.2+)

Applied to files:

  • packages/services/tsconfig.json
  • packages/logger/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Trust preserved narrowing in closures when variables aren't modified after the check (TypeScript 5.4+)

Applied to files:

  • packages/services/tsconfig.json
  • packages/propel/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `NoInfer<T>` utility to block inference for specific type arguments when they should be determined by other arguments

Applied to files:

  • packages/services/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Ensure variables are initialized before use to avoid errors with never-initialized variables (TypeScript 5.7+)

Applied to files:

  • packages/services/tsconfig.json
  • packages/editor/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Utilize narrowing in `switch(true)` blocks for control flow analysis (TypeScript 5.3+)

Applied to files:

  • packages/services/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Avoid `enum`s if the project prefers erasable syntax, using `const` objects or unions instead (TypeScript 5.8+)

Applied to files:

  • packages/services/tsconfig.json
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • packages/services/tsconfig.json
  • packages/propel/tsconfig.json
  • packages/editor/tsconfig.json
  • apps/admin/tsconfig.json
📚 Learning: 2025-10-09T22:12:26.424Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T22:12:26.424Z
Learning: When `types/react` is installed in a TypeScript project (which is standard for React + TypeScript codebases), React types (React.FC, React.ReactNode, React.ComponentProps, etc.) are globally available by design. These type annotations can and should be used without explicitly importing the React namespace. This is a TypeScript/DefinitelyTyped feature, not codebase-specific configuration.

Applied to files:

  • packages/services/tsconfig.json
  • packages/propel/tsconfig.json
  • packages/editor/tsconfig.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to {turbo.json,**/*.sh} : Use Turbo for build system orchestration with configuration in turbo.json

Applied to files:

  • packages/hooks/package.json
  • packages/constants/package.json
  • packages/i18n/.prettierignore
  • .npmrc
📚 Learning: 2025-08-29T08:45:15.953Z
Learnt from: sriramveeraghanta
Repo: makeplane/plane PR: 7672
File: pnpm-workspace.yaml:8-9
Timestamp: 2025-08-29T08:45:15.953Z
Learning: The makeplane/plane repository uses pnpm v10.12.1, which supports onlyBuiltDependencies configuration in pnpm-workspace.yaml files.

Applied to files:

  • apps/space/package.json
  • .npmrc
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Rely on narrowing from direct boolean comparisons for type guards

Applied to files:

  • packages/editor/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use constant indices to narrow object/array properties (TypeScript 5.5+)

Applied to files:

  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use `import type` explicitly when importing types to ensure they are erased during compilation, respecting `verbatimModuleSyntax` flag

Applied to files:

  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:18:05.172Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-11-25T10:18:05.172Z
Learning: Applies to **/*.{ts,tsx,mts,cts} : Use copying array methods (`toSorted`, `toSpliced`, `with`) for immutable array operations (TypeScript 5.2+)

Applied to files:

  • apps/admin/tsconfig.json
📚 Learning: 2025-10-21T17:22:05.204Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7989
File: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx:45-46
Timestamp: 2025-10-21T17:22:05.204Z
Learning: In the makeplane/plane repository, the refactor from useParams() to params prop is specifically scoped to page.tsx and layout.tsx files in apps/web/app (Next.js App Router pattern). Other components (hooks, regular client components, utilities) should continue using the useParams() hook as that is the correct pattern for non-route components.

Applied to files:

  • apps/admin/tsconfig.json
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-workspace.yaml : Use pnpm-workspace.yaml for monorepo workspace configuration

Applied to files:

  • .npmrc
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to **/*.sh : Use pnpm for package management - do not use npm or yarn

Applied to files:

  • .npmrc
📚 Learning: 2025-11-25T10:17:39.709Z
Learnt from: CR
Repo: makeplane/plane PR: 0
File: .github/instructions/bash.instructions.md:0-0
Timestamp: 2025-11-25T10:17:39.709Z
Learning: Applies to pnpm-lock.yaml : Use pnpm-lock.yaml as the lockfile for dependency management

Applied to files:

  • .npmrc
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build and lint web apps
🔇 Additional comments (13)
apps/admin/.prettierignore (1)

1-10: Standardization of Prettier ignores looks good.

The changes properly normalize directory entries with trailing slashes for recursive matching, fix the .tubro typo to .turbo, and add sensible common outputs (dist/, out/), the lock file, and Storybook build artifacts. These additions align well with the PR's objective to centralize and standardize Prettier configuration across the monorepo.

packages/constants/package.json (3)

10-10: Verify the max-warnings=30 threshold is intentional.

The max-warnings value is being relaxed from 0 to 30 across lint scripts. Confirm this is a deliberate repo-wide policy change rather than an oversight, and ensure it aligns with project linting standards for this package.

Also applies to: 13-13


12-12: Ensure root-level .prettierignore is properly configured.

The formatting commands now use . instead of explicit glob patterns. This simplification relies on a root-level .prettierignore file to exclude unwanted directories (e.g., node_modules, dist). Verify that the root configuration is in place and will prevent unintended file formatting in this package.

Also applies to: 14-14


20-26: Verify that root-level ESLint and Prettier configurations replace removed package-level dependencies.

The package-level @plane/eslint-config and @prettier/plugin-oxc devDependencies have been removed. Ensure that:

  1. A root-level ESLint configuration (e.g., eslint.config.js or .eslintrc.*) is present and properly configured for this package.
  2. Removal of the @prettier/plugin-oxc plugin does not affect formatting behavior (e.g., if it was used for Rust/Oxc-specific transformations).
  3. The package can resolve the centralized ESLint config without these local dependencies.

Verify these assumptions across the PR context to confirm the migration is complete.

packages/i18n/.prettierignore (1)

1-10: Prettier ignore patterns look good.

The consolidated patterns appropriately cover build artifacts, cache directories, lock files, and dependencies. Format is correct—directory patterns use trailing slashes consistently, and the file pattern (pnpm-lock.yaml) correctly omits the trailing slash. This aligns well with the PR's objective to standardize Prettier configuration across the repository.

packages/services/src/developer/webhook.service.ts (1)

105-106: LGTM! Dual export pattern aligns with service module conventions.

The addition of a named export alongside the existing default export provides flexibility for consumers while maintaining backward compatibility. This matches the pattern established in DashboardService, IntakeService, and IntakeIssueService.

.npmrc (1)

1-47: Configuration reorganization aligns well with pnpm monorepo best practices.

The refactored structure with clear sections (Core Workspace Behavior, Dependency Resolution, Performance Optimizations) significantly improves maintainability. The individual settings are sound:

  • prefer-workspace-packages + link-workspace-packages + shared-workspace-lockfile eliminate node_modules duplication.
  • resolution-mode = highest + auto-install-peers = true + strict-peer-dependencies = false strike a reasonable balance for a large monorepo where peer dependency strictness is less critical than installation stability.
  • prefer-frozen-lockfile = true in CI prevents lockfile drift (appropriate for this context).
  • node-linker = isolated is the modern, recommended linker strategy.
packages/editor/tsconfig.json (2)

11-12: Path alias alignment looks good.

The reordering and addition of "./" prefixes to path targets aligns with the repo-wide TypeScript configuration refactoring and the removal of baseUrl.


4-7: This is a repo-wide pattern, not an anomaly in packages/editor.

All applications (admin, live, space, web) and most packages (editor, propel, services, ui, utils) explicitly override the strict compiler options from the base config to false. The base config enforces noUnusedLocals: true, noUnusedParameters: true, noImplicitReturns: true, and exactOptionalPropertyTypes: true, but every consuming project disables these checks.

This appears to be a deliberate, repo-wide strategy rather than a localized issue requiring individual attention. If the intent is to enforce strict checking, this requires a coordinated refactoring across the monorepo, not a fix to packages/editor alone.

Likely an incorrect or invalid review comment.

apps/admin/tsconfig.json (1)

9-9: Verify removal of "node" from types array.

Removing "node" from the types array means Node.js ambient types are no longer included. If this app uses Node globals (e.g., process, Buffer), type errors may appear.

Confirm that:

  • This app doesn't rely on Node.js ambient types
  • Or if it does, "node" should remain in the types array
packages/propel/tsconfig.json (1)

4-8: This suppression pattern is systematic across the codebase and intentional.

Disabling exactOptionalPropertyTypes, noUnusedLocals, and noImplicitReturns in packages/propel/tsconfig.json is not an isolated issue—it's part of a deliberate bulk lint suppression applied to multiple packages (utils, ui, editor, services, shared-state) and apps (web, admin, space, live). The base configuration enables all three flags, but this codebase has standardized on disabling them in these specific packages, likely due to the bulk "fix: lint" commit.

The original comparison to packages/services is inaccurate: services does not disable noImplicitReturns, whereas propel does. The pattern shows this is a team decision, not an oversight or inconsistency.

Likely an incorrect or invalid review comment.

packages/propel/src/icons/index.ts (1)

32-32: No action required. The change to use export * from "./icon" instead of an explicit type export is correct and does not break functionality. IconProps is defined as an export interface in icon.tsx, which means it is included in wildcard exports. Additionally, no code in the codebase imports IconProps from the index file—all icon imports use specific component names (e.g., ChevronDownIcon, CloseIcon). The change is consistent with the wildcard export pattern used throughout the rest of index.ts.

Likely an incorrect or invalid review comment.

eslint.config.mjs (1)

132-165: Per‑file overrides for TS, JS, and CJS look consistent with TS‑ESLint docs

The TypeScript override extending importPlugin.flatConfigs.recommended + .typescript with a workspace‑wide project pattern and import/internal-regex looks good for multi‑package resolution, and the dedicated JS/JSX override using tseslint.configs.disableTypeChecked is exactly how TS‑ESLint recommends avoiding unnecessary type‑checking on plain JS. The CJS‑specific globals and @typescript-eslint/no-require-imports: off for *.cjs are also appropriate. No changes needed here from my side.

Comment on lines +50 to +59
# ------------------------------
# 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
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.

Comment on lines +4 to +7
"noImplicitOverride": false,
"exactOptionalPropertyTypes": false,
"noUnusedParameters": false,
"noUnusedLocals": false,
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.

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.

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.

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.

Lockfile ignores should be centralized in the root .prettierignore, not duplicated across packages.

  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 packages/editor/.prettierignore around line 9 the file contains
"pnpm-lock.yaml" which should not be ignored per-package; remove that line from
packages/editor/.prettierignore and ensure the root .prettierignore (project
root) contains "pnpm-lock.yaml" so lockfile ignores are centralized; after
removal run prettier check or lint to confirm no other per-package duplicates
remain and commit the change.

"noUnusedLocals": false,
"noUnusedParameters": false,
"paths": {
"src/*": ["./src/*"],
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:

cat -n packages/editor/tsconfig.json

Repository: makeplane/plane

Length of output: 174


🏁 Script executed:

# Search for imports using the src/ prefix in the packages/editor directory
rg 'from\s+["\']src/' packages/editor/ --type ts --type tsx -A 2 -B 2

Repository: makeplane/plane

Length of output: 127


🏁 Script executed:

# Also check the root tsconfig if it exists
cat -n tsconfig.json 2>/dev/null || echo "No root tsconfig.json found"

Repository: makeplane/plane

Length of output: 86


🏁 Script executed:

# Search for any documentation or comments about this path mapping
rg 'src/\*' . --type json -B 3 -A 3

Repository: makeplane/plane

Length of output: 3057


🏁 Script executed:

# Properly search for imports using src/ prefix in the editor package
rg 'import.*from\s+["\']src/' packages/editor --type ts --type tsx -c | head -20

Repository: makeplane/plane

Length of output: 127


🏁 Script executed:

# Get actual matches
rg 'import.*from\s+["\']src/' packages/editor --type ts --type tsx | head -20

Repository: makeplane/plane

Length of output: 127


🏁 Script executed:

# Check if there are any comments or git history about this mapping
git log --oneline --all -- packages/editor/tsconfig.json | head -10

Repository: makeplane/plane

Length of output: 154


🏁 Script executed:

# Also check for re-exports or index files that might use src/ imports
rg 'export.*from\s+["\']src/' packages/editor --type ts --type tsx | head -10

Repository: makeplane/plane

Length of output: 127


Remove the redundant "src/*" path mapping from the tsconfig.

The "src/*": ["./src/*"] mapping is redundant—TypeScript can already resolve imports from the src/ directory without an explicit path mapping. Unlike alias-based imports (@/*, @/plane-editor/*, @/styles/*), this mapping points to the actual file system location and enables imports that bypass the intended alias system.

This pattern is inconsistent with other packages in the monorepo, which use only @/* mappings. Remove this line to enforce a consistent import pattern across the project.

🤖 Prompt for AI Agents
In packages/editor/tsconfig.json around line 9, remove the redundant "src/*":
["./src/*"] path mapping entry; this mapping bypasses the intended alias system
and is inconsistent with the monorepo convention, so delete that line from the
"paths" section and ensure only the alias mappings (e.g. "@/*",
"@/plane-editor/*", "@/styles/*") remain, then run a quick build or tsc to
verify no import breakage.

"@/*": ["./src/*"]
}
},
"experimentalDecorators": true
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:

# Search for decorator usage in the logger package
rg -n '@[A-Za-z]' packages/logger/src --type=ts --type=tsx -B1 -A1

Repository: makeplane/plane

Length of output: 86


🏁 Script executed:

# Check the full tsconfig.json to understand context
cat -n packages/logger/tsconfig.json

Repository: makeplane/plane

Length of output: 373


🏁 Script executed:

# Search for decorator usage in the entire repository to understand patterns
rg -n '@[A-Za-z]' --type=ts --type=tsx | grep -E '(class|method|property|parameter)' | head -20

Repository: makeplane/plane

Length of output: 86


🏁 Script executed:

# Check if there's a root tsconfig that might have experimentalDecorators
cat -n tsconfig.json 2>/dev/null || echo "No root tsconfig.json"

Repository: makeplane/plane

Length of output: 80


🏁 Script executed:

# Search for decorator usage in logger package with correct file type
rg -n '@[A-Za-z]' packages/logger/src --type=ts -B1 -A1

Repository: makeplane/plane

Length of output: 41


🏁 Script executed:

# List files in logger src to understand structure
find packages/logger/src -type f -name "*.ts" | head -20

Repository: makeplane/plane

Length of output: 151


🏁 Script executed:

# Check the base typescript config
find . -path "*/typescript-config/node-library.json" -o -path "*/typescript-config/*" -type f | head -10

Repository: makeplane/plane

Length of output: 367


🏁 Script executed:

# Check the base config that logger tsconfig extends
cat -n packages/typescript-config/node-library.json

Repository: makeplane/plane

Length of output: 272


🏁 Script executed:

# Also check the base.json
cat -n packages/typescript-config/base.json

Repository: makeplane/plane

Length of output: 1119


🏁 Script executed:

# Examine all three logger source files
cat -n packages/logger/src/config.ts

Repository: makeplane/plane

Length of output: 573


🏁 Script executed:

# Check the other logger source files
cat -n packages/logger/src/index.ts && echo "---" && cat -n packages/logger/src/middleware.ts

Repository: makeplane/plane

Length of output: 621


Remove deprecated experimentalDecorators; the logger package does not use decorators.

The experimentalDecorators: true flag contradicts repository TypeScript guidelines and serves no purpose in this package. No decorators are used in any of the logger source files (config.ts, index.ts, middleware.ts), and the flag is not present in the inherited base configuration. Per repository learnings, standard ECMAScript decorators (Stage 3) should be used instead of the legacy experimental flag. Simply remove this line.

🤖 Prompt for AI Agents
packages/logger/tsconfig.json around line 7: the tsconfig sets
"experimentalDecorators": true even though this package does not use decorators
and the flag conflicts with repository TypeScript guidelines; remove the
"experimentalDecorators" entry from this tsconfig so it inherits the base
configuration and relies on standard ECMAScript decorators if/when needed, then
run a quick local TypeScript build to confirm no config regressions.

Comment on lines +3 to +6
"compilerOptions": {
"exactOptionalPropertyTypes": false,
"noUnusedLocals": false
},
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:

# First, let's read the full tsconfig.json file to understand the complete context
cat -n packages/services/tsconfig.json

Repository: makeplane/plane

Length of output: 353


🏁 Script executed:

# Check the parent config to understand what defaults are being overridden
find . -path "*typescript-config/react-library.json" -o -path "*typescript-config*" -name "*.json" | head -20

Repository: makeplane/plane

Length of output: 322


🏁 Script executed:

# Search for the actual parent config referenced in the file
rg "@plane/typescript-config" --type json -A 2 -B 2

Repository: makeplane/plane

Length of output: 9088


🏁 Script executed:

# Check for unused variables or issues in packages/services that might justify disabling noUnusedLocals
find packages/services -type f \( -name "*.ts" -o -name "*.tsx" \) | wc -l

Repository: makeplane/plane

Length of output: 61


🏁 Script executed:

# Look for any comments or documentation about why these flags are disabled
rg "noUnusedLocals|exactOptionalPropertyTypes" --type json -B 5 -A 5

Repository: makeplane/plane

Length of output: 7711


🏁 Script executed:

# Read the parent config to understand what's being overridden
cat -n packages/typescript-config/react-library.json

Repository: makeplane/plane

Length of output: 296


🏁 Script executed:

# Check if these settings are new in this PR or pre-existing
git log --oneline -20 packages/services/tsconfig.json 2>/dev/null || echo "No git history available"

Repository: makeplane/plane

Length of output: 78


🏁 Script executed:

# Check if other packages document why they disable these flags
rg "exactOptionalPropertyTypes|noUnusedLocals" --type ts --type tsx -B 3 -A 3 packages/services/src | head -50

Repository: makeplane/plane

Length of output: 86


🏁 Script executed:

# Check the git commit for this file more thoroughly
git show 8047ebce9 --stat packages/services/tsconfig.json 2>/dev/null | head -20 || echo "Commit details unavailable"

Repository: makeplane/plane

Length of output: 287


🏁 Script executed:

# Check when packages/services tsconfig was last modified before this commit
git log --all --oneline -- packages/services/tsconfig.json 2>/dev/null | head -10 || echo "Extended history unavailable"

Repository: makeplane/plane

Length of output: 154


🏁 Script executed:

# Verify this is standard across similar packages - check if services, ui, utils all have same pattern
echo "=== packages/services ===" && grep -A 1 "exactOptionalPropertyTypes\|noUnusedLocals" packages/services/tsconfig.json && \
echo -e "\n=== packages/ui ===" && grep -A 1 "exactOptionalPropertyTypes\|noUnusedLocals" packages/ui/tsconfig.json && \
echo -e "\n=== packages/utils ===" && grep -A 1 "exactOptionalPropertyTypes\|noUnusedLocals" packages/utils/tsconfig.json

Repository: makeplane/plane

Length of output: 411


Improve PR documentation; align packages/services tsconfig with monorepo patterns.

The tsconfig.json additions disabling noUnusedLocals and exactOptionalPropertyTypes follow a pattern used across the monorepo (packages/ui, packages/utils, packages/editor, etc.). However, the PR message "fix: lint" provides no context for why these settings are necessary in packages/services.

Update the PR description to explain:

  1. Why these flags need to be disabled for the services package
  2. Whether this is addressing legitimate code incompatibilities or technical debt
  3. Any plans to re-enable these checks or refactor the code to satisfy them

Adding inline comments to the tsconfig.json would also help future maintainers understand the rationale.

🤖 Prompt for AI Agents
packages/services/tsconfig.json lines 3-6: the PR currently disables
exactOptionalPropertyTypes and noUnusedLocals without explanation; update the PR
description to state why these flags were turned off for the services package
(e.g., specific type/usage incompatibilities or temporary accommodation for
legacy code), declare whether this change fixes legitimate incompatibilities or
is a stop-gap for technical debt, and add a plan/timeline to re-enable the
checks or refactor the code to comply; also add concise inline comments in the
tsconfig.json next to each disabled option summarizing the rationale and
intended follow-up so future maintainers understand the decision.

@sriramveeraghanta sriramveeraghanta merged commit 85d9003 into preview Dec 5, 2025
6 of 7 checks passed
@sriramveeraghanta sriramveeraghanta deleted the feat/eslint branch December 5, 2025 10:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants