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 pre-commit hooks and lint-staged; introduced centralized tooling config and top-level lint/format settings.
    • Switched many scripts to run via pnpm and updated workspace tooling/dependencies.
  • Refactor

    • Removed numerous per-package lint/format configs in favor of a unified root configuration and standardized ignore patterns.
  • New Features

    • Added named exports for several services/components and expanded the icon set available to apps.

✏️ 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 centralized ESLint v9 config, consolidates Prettier configuration and ignores, migrates package lint/format scripts to pnpm exec, removes many per-package ESLint/Prettier files, normalizes TypeScript path mappings, introduces Husky pre-commit hook to run pnpm lint-staged, and updates root devDependencies and lint-staged config.

Changes

Cohort / File(s) Summary
Central ESLint + Ownership
eslint.config.mjs, CODEOWNERS
Add a unified ESLint 9 configuration file and record ownership for the config.
Root Prettier & Ignore
.prettierrc, .prettierignore
Introduce root Prettier config (schema + overrides) and add recursive .prettierignore.
PNPM / Husky / lint-staged
.npmrc, .husky/pre-commit, package.json
Rework .npmrc, add Husky pre-commit script pnpm lint-staged, add prepare/fix:lint scripts, add top-level lint-staged, and update devDependencies (ESLint toolset, husky, lint-staged).
Remove per-package ESLint/Prettier
packages/eslint-config/*, many **/.eslintrc.*, many **/.prettierrc
Remove legacy package-specific ESLint config package and numerous per-package ESLint/Prettier files.
Update package scripts to pnpm
multiple apps/*/package.json, packages/*/package.json
Replace direct eslint/prettier script invocations with pnpm exec variants, adjust --max-warnings per package, and remove @prettier/plugin-oxc from devDeps.
Add/Update .prettierignore per scope
apps/*/.prettierignore, packages/*/.prettierignore, packages/codemods/.prettierignore, apps/api/.prettierignore, apps/proxy/.prettierignore
Create or replace .prettierignore files using recursive globs for build outputs, caches, node_modules, and pnpm-lock.yaml.
TSConfig normalization
apps/*/tsconfig.json, packages/*/tsconfig.json, packages/typescript-config/base.json
Remove baseUrl, make path mappings explicit ("./..."), and add incremental/composite build metadata in base config.
Removed ESLint suppressions
various postcss.config.*, tailwind.config.*, some components
Delete inline eslint-disable comments; runtime behavior unchanged.
Exports: named additions & dedup
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
Add named exports, remove duplicate re-exports, and reorder exports.
Polyfill consolidation
apps/web/core/lib/polyfills/index.ts, (removed) apps/web/core/lib/polyfills/requestIdleCallback.ts
Inline requestIdleCallback polyfill into polyfills/index.ts and remove the separate module.
Service exports
`packages/services/src/**/(dashboard
webhook
CI workflow tweak
.github/workflows/pull-request-build-lint-web-apps.yml
Remove duplicate Build Affected step and run it earlier.
Misc: icons & small edits
packages/propel/src/icons/**, various components
Reorder/deduplicate icon exports and remove a few inline lint comments.

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: run eslint on staged files
    ESLint-->>LintStaged: lint results (pass/fail)
    LintStaged->>Prettier: run prettier on staged files
    Prettier-->>LintStaged: format results
    LintStaged-->>Husky: success / failure
    alt success
        Husky->>Git: allow commit
    else failure
        Husky->>Dev: surface errors, block commit
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Focus areas:

  • eslint.config.mjs rules, parserOptions, plugin compatibility and overrides.
  • Root package.json (lint-staged, new scripts, devDependencies) and .husky/pre-commit.
  • .npmrc changes affecting pnpm linking/hoisting.
  • Large-scale removal of per-package ESLint/Prettier files and package manifest/devDep removals.
  • TS config path changes and incremental build metadata.
  • Polyfill relocation and any browser/environment guards.

Poem

🐰 I hopped through configs, tidy and neat,
Husky at the gate keeps commits sweet.
Prettier trims whiskers, ESLint hums soft,
Paths now point home, exported names aloft.
A rabbit claps paws — the repo feels complete.

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description is entirely empty with only template placeholders and no actual information filled in about the changes. Complete all required sections: add a detailed description of the ESLint migration changes, select the type of change, and provide test scenarios demonstrating the changes work correctly.
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 does not clearly convey what specific ESLint changes were made. Provide a more specific title that describes the primary change, such as 'feat: migrate to flat ESLint config' or 'feat: consolidate ESLint and Prettier configuration'.
✨ 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

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.

Comment on lines +1 to +11
**/.next
**/.react-router
**/.turbo
**/.vercel
**/.vite
**/build
**/dist
**/node_modules
**/out
**/public
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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

# Find all .prettierignore files in the repo
echo "=== All .prettierignore files ==="
find . -name ".prettierignore" -type f 2>/dev/null | sort

# Check if root .prettierignore exists
echo -e "\n=== Root .prettierignore content ==="
if [ -f ".prettierignore" ]; then
    cat -n ".prettierignore"
else
    echo "No .prettierignore at root"
fi

# List all files in packages directory to see structure
echo -e "\n=== Packages directory structure ==="
ls -la packages/ 2>/dev/null | head -20

Repository: makeplane/plane

Length of output: 2069


🏁 Script executed:

# Get PR details if available via GitHub CLI
gh pr view --json title,body,description 2>/dev/null || echo "GitHub CLI not available or not a PR context"

Repository: makeplane/plane

Length of output: 103


🏁 Script executed:

#!/bin/bash

# Sample check: compare a few package-level files to root
echo "=== Comparing root .prettierignore with sample packages ==="

# Get content of root
root_content=$(cat .prettierignore)

# Compare with packages/constants/.prettierignore
echo "packages/constants/.prettierignore matches root:"
if diff -q .prettierignore packages/constants/.prettierignore > /dev/null 2>&1; then
    echo "YES (identical)"
else
    echo "NO (different)"
    echo "Diff:"
    diff .prettierignore packages/constants/.prettierignore
fi

# Check a couple more
echo -e "\npackages/ui/.prettierignore matches root:"
if diff -q .prettierignore packages/ui/.prettierignore > /dev/null 2>&1; then
    echo "YES (identical)"
else
    echo "NO (different)"
fi

echo -e "\napps/web/.prettierignore matches root:"
if diff -q .prettierignore apps/web/.prettierignore > /dev/null 2>&1; then
    echo "YES (identical)"
else
    echo "NO (different)"
fi

# Count how many are identical to root
echo -e "\n=== Total .prettierignore files identical to root ==="
count=0
total=0
for file in $(find . -name ".prettierignore" -type f ! -path "././.prettierignore" 2>/dev/null); do
    total=$((total + 1))
    if diff -q .prettierignore "$file" > /dev/null 2>&1; then
        count=$((count + 1))
    fi
done
echo "Identical: $count / $total"

Repository: makeplane/plane

Length of output: 372


🏁 Script executed:

#!/bin/bash

# Check git log for recent commits related to .prettierignore
echo "=== Recent commits mentioning prettierignore ==="
git log --oneline -20 --all --grep="prettierignore\|prettier.*ignore" 2>/dev/null || echo "Git history not available"

# Check if there's a prettier config file
echo -e "\n=== Prettier configuration files ==="
find . -maxdepth 2 -type f \( -name ".prettierrc*" -o -name "prettier.config.*" \) 2>/dev/null || echo "No prettier config files found"

# Check git diff or status to see what changed
echo -e "\n=== Check if this is a new PR (git status of .prettierignore files) ==="
git status --short packages/constants/.prettierignore 2>/dev/null || echo "Not a git status context"

Repository: makeplane/plane

Length of output: 232


🏁 Script executed:

#!/bin/bash

# Check the prettier configuration to understand how it resolves ignores
echo "=== Root .prettierrc content ==="
cat -n .prettierrc

echo -e "\n=== Searching for prettier documentation or comments about ignore paths ==="
# Check if there are any monorepo-specific prettier configs
find . -maxdepth 3 -type f \( -name "*.md" -o -name "*.json" \) -exec grep -l "prettierignore\|prettier.*ignore" {} \; 2>/dev/null | head -10

# Check package.json files for prettier config
echo -e "\n=== Check root package.json for prettier config ==="
if [ -f "package.json" ]; then
    cat package.json | grep -A 5 -B 5 "prettier" || echo "No prettier config in root package.json"
fi

# Look at a package.json in a subpackage
echo -e "\n=== Check packages/constants/package.json for prettier config ==="
if [ -f "packages/constants/package.json" ]; then
    cat packages/constants/package.json | grep -A 5 -B 5 "prettier" || echo "No prettier config in package.json"
fi

Repository: makeplane/plane

Length of output: 2139


🏁 Script executed:

#!/bin/bash

# Create a test to understand prettier's ignore resolution
cat > /tmp/test_prettier_behavior.md << 'EOF'
Prettier Ignore Path Resolution Analysis:

1. Root .prettierignore with "pnpm-lock.yaml":
   - Working directory: repository root
   - Pattern "pnpm-lock.yaml" matches: ./pnpm-lock.yaml ✓

2. Package-level .prettierignore (e.g., packages/constants/) with "pnpm-lock.yaml":
   - Prettier resolves ignores relative to the current working directory when running
   - When prettier runs from root with packages/constants/.prettierignore present:
     a) Ignore files are resolved from where prettier is invoked (typically root)
     b) "pnpm-lock.yaml" in packages/constants/.prettierignore still matches root pnpm-lock.yaml
     c) BUT: package-level ignores have lower precedence than root ignores
     d) Duplication is redundant but not necessarily broken

3. The real issue with package-level .prettierignore duplication:
   - Maintenance burden: changes must be made in 22 places
   - Inconsistency risk: files can diverge
   - Ignores patterns like **/.next work same way at any level

Analysis:
- Original review's concern about pnpm-lock.yaml is partially valid:
  If prettier is run from packages/constants/, then pnpm-lock.yaml won't match root
  If prettier is run from root, package-level ignores are redundant
EOF

cat /tmp/test_prettier_behavior.md

Repository: makeplane/plane

Length of output: 1278


🏁 Script executed:

#!/bin/bash

# Check how prettier is configured to run - look for scripts and configs
echo "=== Root package.json scripts ==="
if [ -f "package.json" ]; then
    jq -r '.scripts | to_entries[] | select(.key | contains("prettier")) | "\(.key): \(.value)"' package.json 2>/dev/null || echo "Could not parse scripts"
fi

# Check pnpm-workspace.yaml or similar
echo -e "\n=== Monorepo configuration files ==="
ls -la pnpm-workspace.yaml turbo.json 2>/dev/null | grep -v "cannot access" || echo "Standard monorepo files found or not present"

cat pnpm-workspace.yaml 2>/dev/null || echo "No pnpm-workspace.yaml"

Repository: makeplane/plane

Length of output: 1173


Remove pnpm-lock.yaml from all per-package .prettierignore files; it belongs only in root.

Packages run prettier from their own directory (e.g., pnpm exec prettier --write . from packages/constants/), so pnpm-lock.yaml won't be found relative to the package root. The root pnpm-lock.yaml is already excluded by the root .prettierignore, making per-package references redundant and ineffective. Keep the 21 package-level files only for local patterns like **/.next, **/dist, etc., or consolidate entirely at root and remove per-package files.

🤖 Prompt for AI Agents
In packages/constants/.prettierignore lines 1-11, the file currently lists
pnpm-lock.yaml which is unnecessary and ineffective in per-package
.prettierignore files; remove the pnpm-lock.yaml entry so the file only contains
local ignore patterns (e.g., **/.next, **/dist, node_modules, etc.), leaving the
root .prettierignore to manage pnpm-lock.yaml centrally.

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.

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.

2 participants