Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,13 @@ jobs:
steps:
- uses: actions/checkout@v3

- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9

- name: Install Vercel CLI
run: npm install --global vercel@latest
run: pnpm add --global vercel@latest

- name: Pull Vercel Environment Information
run: vercel pull --yes --environment=${{ env.VERCEL_ENV }} --token=${{ secrets.VERCEL_TOKEN }}
Expand Down
22 changes: 16 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,22 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22.x"
cache: "npm"
cache: "pnpm"

- name: Install dependencies
run: npm ci
run: pnpm install --frozen-lockfile

- name: Run ESLint (includes Prettier) & TypeScript
run: npm run ci:check
run: pnpm run ci:check

build:
name: Build Verification
Expand All @@ -34,16 +39,21 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22.x"
cache: "npm"
cache: "pnpm"

- name: Install dependencies
run: npm ci
run: pnpm install --frozen-lockfile

- name: Build Next.js application
run: npm run build
run: pnpm run build
env:
NODE_ENV: production
7 changes: 6 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,13 @@ jobs:
steps:
- uses: actions/checkout@v3

- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9

- name: Install Vercel CLI
run: npm install --global vercel@latest
run: pnpm add --global vercel@latest

- name: Pull Vercel Environment Information
run: vercel pull --yes --environment=${{ env.VERCEL_ENV }} --token=${{ secrets.VERCEL_TOKEN }}
Expand Down
2 changes: 1 addition & 1 deletion .husky/commit-msg
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
npx --no -- commitlint --edit ${1}
pnpm dlx commitlint --edit ${1}
Copy link

@coderabbitai coderabbitai bot Jan 6, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

pnpm dlx vs npx --no behavior commitlint

💡 Result:

Short answer: they’re different.

  • npx --no (aka --no-install) prevents npx from downloading a package; it only runs an existing local/global binary and will fail instead of installing. This is what commitlint docs use in husky hooks to avoid prompting to install. [1][3]

  • pnpm dlx always fetches a package temporarily from the registry and runs it (does not add it to package.json). It’s the pnpm equivalent of npx for one‑off remote execution. It does not implement an npx‑style “no‑install” that refuses to download. [2]

Practical guidance for commitlint + Husky:

  • If commitlint is a devDependency in the repo: run the local binary via pnpm (pnpm exec commitlint or simply pnpm commitlint) in the hook. That mirrors npx --no behaviour (no remote install). [2][3]
  • If you want the one‑time download/execute behaviour (like npx when it installs), use pnpm dlx commitlint ... which will fetch commitlint temporarily. [2][3]

Sources:
[1] npx docs (npm) — npx options and --no/--no-install behavior.
[2] pnpm dlx docs — dlx fetches and runs packages temporarily.
[3] commitlint local setup (Husky example uses "npx --no -- commitlint --edit $1").


🌐 Web query:

pnpm dlx automatic install prompt behavior missing package

💡 Result:

Short answer: pnpm dlx does not "automatically install" a package into your project — it fetches the requested package temporarily from the registry and runs it. If the package cannot be resolved (not published, private/unreachable, or blocked by policy like minimumReleaseAge), dlx will fail with an error (or with the same resolution behavior as normal pnpm commands) rather than silently installing something different. There are related pnpm settings that control prompts and automatic installs for other commands (e.g., verify-deps-before-run), and there are known edge-case bugs (e.g., minimumReleaseAge interactions) discussed in the pnpm issue tracker. See pnpm dlx docs and related GitHub issues for details. [1][2][3]

Sources:

  • pnpm dlx documentation. [1]
  • pnpm CLI docs / release notes mentioning verify-deps-before-run and dlx behavior. [2]
  • GitHub issue discussing dlx / minimumReleaseAge behavior. [3]

🌐 Web query:

npx --no flag purpose prevent install prompt

💡 Result:

--no tells npx to answer the interactive "Ok to proceed?" prompt with "no" (i.e., refuse installing missing packages), so it prevents npx from prompting to download/install and causes the run to fail if the command isn’t already available. It’s the replacement for the older --no-install behavior. [1][2]


pnpm dlx에서 pnpm exec로 변경하세요.

npx --no에서 pnpm dlx로의 전환은 기능적으로 다릅니다. 다음을 확인해주세요:

  1. npx --no의 역할: 원격 패키지 설치를 거부하고 로컬에 있는 패키지만 실행합니다. 패키지가 없으면 실행이 실패합니다.

  2. pnpm dlx의 동작: 항상 레지스트리에서 패키지를 임시로 다운로드하여 실행합니다. --no 같은 플래그로 다운로드를 거부할 수 없습니다.

  3. 올바른 대체 방법: commitlint가 devDependency로 설치되어 있다면 pnpm exec commitlint --edit ${1}을 사용하세요. 이것이 npx --no 동작과 동등합니다.

현재 코드는 의도하지 않은 동작 변경을 포함하고 있습니다.

🤖 Prompt for AI Agents
In @.husky/commit-msg at line 1, Replace the use of "pnpm dlx commitlint --edit
${1}" with the equivalent local-only execution "pnpm exec commitlint --edit
${1}" in the .husky/commit-msg hook (change the "pnpm dlx commitlint --edit
${1}" invocation), and ensure commitlint is installed as a devDependency so the
local exec will run the local package rather than downloading from the registry.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

커밋린트가 데브디펜던시인지 확인하고
해당 내용은 커밋메시지 허스키인데 크게 중요한가 ?

Copy link

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if commitlint is in devDependencies in package.json
cat package.json | jq '.devDependencies | to_entries | .[] | select(.key | contains("commitlint"))'

Length of output: 121


@manNomi, 확인 결과 commitlint는 devDependency로 설치되어 있습니다 (@commitlint/cli, @commitlint/config-conventional).

중요도에 대해서는:

크게 중요하지 않습니다. 커밋 메시지 검증 훅이므로 프로덕션에 영향을 주지 않고, pnpm dlx도 정상 동작합니다.

다만 차이점은:

  • pnpm dlx: 매번 레지스트리에서 임시 다운로드 (약간 느림)
  • pnpm exec: 로컬 설치된 패키지 실행 (원래 npx --no 동작과 동일)

이미 로컬에 설치되어 있으니 pnpm exec commitlint --edit ${1} 또는 pnpm commitlint --edit ${1}로 변경하면 더 빠르고 원래 동작과 일치하지만, 현 상태로도 문제없이 작동합니다. 우선순위 낮은 개선사항으로 보시면 됩니다.


🧠 Learnings used
Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 242
File: src/components/ui/TabSelector.tsx:10-11
Timestamp: 2025-08-12T09:41:44.182Z
Learning: manNomi prefers to keep reusable UI components simple and focused on core functionality rather than adding many features. They don't want to over-engineer flexible/reusable UI components at the initial stage.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/components/mentor/MentorChatCard/index.tsx:17-21
Timestamp: 2025-08-24T11:14:34.297Z
Learning: manNomi prefers not to receive accessibility suggestions or recommendations during code reviews.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/api/auth/client/usePostLogout.ts:17-33
Timestamp: 2025-08-24T11:13:08.477Z
Learning: manNomi prefers to prioritize user experience over perfect state consistency in auth flows. Specifically, in logout scenarios, they prefer to keep tokens intact on API failure to avoid forcing users to re-login, even if it means temporary UI state inconsistency.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/api/auth/client/useDeleteUserAccount.ts:17-27
Timestamp: 2025-08-24T11:11:40.758Z
Learning: manNomi prefers optimistic navigation in auth-related flows (like account deletion) to prevent race conditions where token clearing before navigation could cause intermediate redirects to login page due to pending async requests failing.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 242
File: src/types/mentor.ts:70-73
Timestamp: 2025-08-12T04:07:04.134Z
Learning: manNomi prefers using Korean labels directly in enum values (e.g., MentorTab.MY_MENTEE = "나의 멘티") over separating enum keys from UI labels for efficiency and intuitiveness, considering scalability concerns as excessive for their current project needs.


4 changes: 2 additions & 2 deletions .husky/pre-push
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
echo "🔍 Running lint check before push..."
npm run lint
pnpm run lint

echo "🔍 Running type check before push..."
npm run typecheck
pnpm run typecheck

echo "✅ All checks passed!"
9 changes: 9 additions & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Next.js 호환성을 위한 설정
shamefully-hoist=true
auto-install-peers=true
strict-peer-dependencies=false
Comment on lines +1 to +4
Copy link

@coderabbitai coderabbitai bot Jan 6, 2026

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# Check if .npmrc exists and read its content
if [ -f .npmrc ]; then
  echo "=== .npmrc content ==="
  cat -n .npmrc
  echo ""
else
  echo ".npmrc not found"
fi

# Check for package.json to understand the project
if [ -f package.json ]; then
  echo "=== package.json (first 50 lines) ==="
  head -50 package.json
  echo ""
fi

Repository: solid-connection/solid-connect-web

Length of output: 2002


🏁 Script executed:

# Search for any related issues or comments about shamefully-hoist or pnpm settings
echo "=== Searching for pnpm config related comments ==="
rg -i "shamefully-hoist|auto-install-peers|strict-peer-dependencies|public-hoist" --type-list | head -20

Repository: solid-connection/solid-connect-web

Length of output: 535


🏁 Script executed:

# Check for any build configuration files
echo "=== Checking for build/config files ==="
fd -e "next.config" -e "tsconfig" -e "babel.config" -e ".npmrc" -e "pnpm-workspace"

Repository: solid-connection/solid-connect-web

Length of output: 117


🏁 Script executed:

# Check for pnpm-related files and search for any configuration comments
echo "=== Checking for pnpm workspace or related configs ==="
find . -maxdepth 2 -type f \( -name "pnpm-workspace.yaml" -o -name ".pnpmfile.cjs" -o -name "pnpm-lock.yaml" \) 2>/dev/null | head -10

echo ""
echo "=== Searching for peer dependency or pnpm-related issues in comments ==="
rg -i "peer.*depend|shamefully|hoist|pnpm.*config" --type ts --type tsx --type js --type json -B 1 -A 1 2>/dev/null | head -30

Repository: solid-connection/solid-connect-web

Length of output: 223


🏁 Script executed:

# Check if there are any build errors or warnings documented
echo "=== Looking for any related documentation or issues ==="
find . -maxdepth 2 -type f \( -name "README.md" -o -name "CONTRIBUTING.md" -o -name ".github" \) 2>/dev/null | head -10

# Search in README if it exists
if [ -f README.md ]; then
  echo ""
  echo "=== Checking README for pnpm/Next.js setup info ==="
  rg -i "pnpm|install|setup|next" README.md -A 2 | head -40
fi

Repository: solid-connection/solid-connect-web

Length of output: 606


🌐 Web query:

Next.js pnpm shamefully-hoist configuration best practices

💡 Result:

Short answer: avoid shamefully-hoist=true for Next.js workspaces unless you must — prefer targeted hoisting (publicHoistPattern / hoistPattern) or fixing dependency declarations. Use shamefully-hoist only as a last-resort compatibility fallback.

Why:

  • shamefully-hoist flattens/hoists everything to root node_modules (makes phantom deps globally available) which hides missing/incorrect dependency declarations and can cause subtle runtime/build differences and native-module resolution problems in Next.js. (pnpm.io)

Best practices

  1. Prefer correctness over global hoisting

    • Ensure each package declares the deps/devDeps it actually uses (fix phantom/missing deps). This avoids needing global hoisting. (pnpm.io)
  2. Use targeted hoisting instead of shamefully-hoist

    • publicHoistPattern (or public-hoist-pattern in .npmrc) exposes only matching packages at the root; hoistPattern controls what goes into the virtual store. Use patterns for specific tooling (e.g., eslint, babel, legacy plugins) rather than * for everything. Example: publicHoistPattern[]=plugin or hoistPattern[]=eslint. (pnpm.io)
  3. Only enable shamefully-hoist as last resort

    • If a third‑party tool absolutely requires classic flattened node_modules and you cannot fix it, set shamefully-hoist=true temporarily and document why. Prefer limited publicHoistPattern over a global shameful hoist. (pnpm.io)
  4. Common Next.js-specific gotchas and fixes

    • Native modules / compiled artifacts inside workspace packages: Next’s resolver/build may not find .node/.native builds if not hoisted; instead either (a) export/build artifacts into package’s published dist and require from that path, (b) add a narrow publicHoistPattern for that native package, or (c) fix import paths/packaging. See Next.js issues where native modules in pnpm workspaces failed to load unless hoisted. (github.com)
    • SWC/webpack/loaders and plugin tooling that assume root node_modules: prefer publicHoistPattern for those specific plugins (e.g., babel, eslint, webpack plugins) rather than global hoist. (pnpm.io)
  5. Recommended minimal config examples

    • .npmrc (root) — targeted public hoist:
      • public-hoist-pattern[]=eslint
      • public-hoist-pattern[]=babel-
        (avoid shamefully-hoist=true)
        (pnpm.io)
    • pnpm-workspace.yaml — hoistPattern example:
      • hoistPattern:
  6. Debugging checklist before enabling shamefully-hoist

    • pnpm why to see where a package is installed.
    • Confirm each package.json lists required deps.
    • Try hoistPattern/publicHoistPattern for the offending package.
    • Reproduce build locally after each change; if unresolved, enable shamefully-hoist temporarily and open an issue with the tool/maintainer. (newreleases.io)
  7. Operational notes

    • Pin pnpm versions across CI/dev machines because hoisting behavior and defaults have changed across pnpm releases. Test CI builds after any hoist config change. (newreleases.io)

If you want, I can:

  • review your repo’s pnpm/Next.js layout and suggest a minimal hoistPattern/publicHoistPattern, or
  • produce the exact .npmrc / pnpm-workspace.yaml snippets tailored to your packages.

Citations:


pnpm 설정의 엄격함을 약화시키는 옵션들을 검토하고 개선해주세요.

현재 .npmrc의 설정들이 pnpm의 핵심 강점인 의존성 격리를 완화하고 있습니다. 다음 단계를 통해 더 나은 구성으로 개선할 수 있습니다:

  1. 현재 설정의 영향 파악하기

    • shamefully-hoist=true: 모든 패키지를 root node_modules에 호이스팅하여 누락된 의존성 선언을 숨길 수 있음
    • auto-install-peers=truestrict-peer-dependencies=false: pnpm의 엄격한 의존성 검사를 우회
  2. 설정 없이 프로젝트가 정상 작동하는지 테스트

    • .npmrc에서 shamefully-hoist=true 주석 처리
    • node_modules 제거 후 pnpm install 실행
    • pnpm run buildpnpm run dev 실행하여 에러 확인
  3. 특정 패키지만 호이스팅 필요한 경우 대안 사용

    • 특정 도구나 플러그인(예: eslint, babel)만 호이스팅이 필요하다면, 전역 shamefully-hoist 대신 public-hoist-pattern을 사용하는 것이 권장됨
    • 예시: public-hoist-pattern[]=*eslint* 또는 public-hoist-pattern[]=*babel-*
  4. 의존성 누락 확인

    • pnpm why <패키지명> 명령으로 각 패키지의 설치 위치 확인
    • 필요한 경우 package.json의 의존성 선언을 정정
🤖 Prompt for AI Agents
In @.npmrc around lines 1 - 4, The .npmrc currently weakens pnpm isolation via
shamefully-hoist=true, auto-install-peers=true, and
strict-peer-dependencies=false; remove or comment out those three lines, run rm
-rf node_modules && pnpm install then validate with pnpm run build and pnpm run
dev, and if a specific tool truly needs hoisting replace shamefully-hoist with
targeted public-hoist-pattern entries (e.g., public-hoist-pattern[]=*eslint* or
public-hoist-pattern[]=*babel-*) and fix any missing declarations discovered via
pnpm why <package> by adding them to package.json.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

음 npmrc가 필수적일까요 ? 이 파일 제거해도 좋을것 같아보이는데

Copy link

Choose a reason for hiding this comment

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

@manNomi 좋은 지적입니다! 맞습니다, .npmrc 파일을 완전히 제거하는 것이 가장 깔끔한 방법입니다.

테스트 방법:

  1. .npmrc 파일 삭제
  2. 클린 재설치 및 검증:
    rm -rf node_modules pnpm-lock.yaml
    pnpm install
    pnpm run build
    pnpm run dev

만약 위 과정이 에러 없이 정상 작동한다면, .npmrc 파일은 불필요한 것이므로 제거하시는 게 맞습니다.

pnpm의 기본 설정이 가장 엄격하고 안전하기 때문에, 특별한 이유가 없다면 설정 파일 없이 사용하는 것이 권장됩니다. 혹시 빌드나 실행 중 문제가 발생한다면 그때 필요한 최소한의 설정만 추가하는 방식이 좋습니다.


🧠 Learnings used
Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 242
File: src/components/ui/TabSelector.tsx:10-11
Timestamp: 2025-08-12T09:41:44.182Z
Learning: manNomi prefers to keep reusable UI components simple and focused on core functionality rather than adding many features. They don't want to over-engineer flexible/reusable UI components at the initial stage.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/components/mentor/MentorChatCard/index.tsx:17-21
Timestamp: 2025-08-24T11:14:34.297Z
Learning: manNomi prefers not to receive accessibility suggestions or recommendations during code reviews.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/api/auth/client/usePostLogout.ts:17-33
Timestamp: 2025-08-24T11:13:08.477Z
Learning: manNomi prefers to prioritize user experience over perfect state consistency in auth flows. Specifically, in logout scenarios, they prefer to keep tokens intact on API failure to avoid forcing users to re-login, even if it means temporary UI state inconsistency.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/api/auth/client/useDeleteUserAccount.ts:17-27
Timestamp: 2025-08-24T11:11:40.758Z
Learning: manNomi prefers optimistic navigation in auth-related flows (like account deletion) to prevent race conditions where token clearing before navigation could cause intermediate redirects to login page due to pending async requests failing.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 242
File: src/types/mentor.ts:70-73
Timestamp: 2025-08-12T04:07:04.134Z
Learning: manNomi prefers using Korean labels directly in enum values (e.g., MentorTab.MY_MENTEE = "나의 멘티") over separating enum keys from UI labels for efficiency and intuitiveness, considering scalability concerns as excessive for their current project needs.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

추가적으로 pnpm 설정 부족한 부분이 있을까?

Copy link

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

echo "=== 1. Checking package.json for engines and packageManager fields ==="
if [ -f package.json ]; then
  jq '{engines, packageManager, scripts: {preinstall: .scripts.preinstall}}' package.json
else
  echo "package.json not found"
fi

echo ""
echo "=== 2. Checking for pnpm-lock.yaml ==="
if [ -f pnpm-lock.yaml ]; then
  echo "✓ pnpm-lock.yaml exists"
  head -10 pnpm-lock.yaml
else
  echo "✗ pnpm-lock.yaml NOT found"
fi

echo ""
echo "=== 3. Checking for Node.js version files ==="
if [ -f .nvmrc ]; then
  echo "✓ .nvmrc exists:"
  cat .nvmrc
else
  echo "✗ .nvmrc not found"
fi

if [ -f .node-version ]; then
  echo "✓ .node-version exists:"
  cat .node-version
else
  echo "✗ .node-version not found"
fi

echo ""
echo "=== 4. Checking for pnpm-workspace.yaml ==="
if [ -f pnpm-workspace.yaml ]; then
  echo "✓ pnpm-workspace.yaml exists:"
  cat pnpm-workspace.yaml
else
  echo "✗ pnpm-workspace.yaml not found (OK for single-package projects)"
fi

echo ""
echo "=== 5. Checking CI workflows for caching configuration ==="
echo "--- ci.yml caching setup ---"
if [ -f .github/workflows/ci.yml ]; then
  grep -A 10 "setup-node" .github/workflows/ci.yml | head -15
else
  echo "ci.yml not found"
fi

echo ""
echo "=== 6. Checking for .npmrc configuration ==="
if [ -f .npmrc ]; then
  echo "✓ .npmrc exists:"
  cat .npmrc
else
  echo "✗ .npmrc not found"
fi

Length of output: 1275


@manNomi 좋은 질문입니다! 현재 설정을 분석한 결과, 몇 가지 개선할 부분이 있습니다:

📋 추가 권장 사항

1. packageManager 필드 추가 (🔴 중요)

package.json에 다음을 추가하여 팀원 간 pnpm 버전을 통일하고 Corepack을 자동 활성화하세요:

{
  "packageManager": "pnpm@9.15.0"
}

이렇게 하면:

  • 팀원이 다른 버전의 pnpm을 사용하는 것을 방지
  • Corepack이 자동으로 올바른 버전 설치
  • CI/CD 환경에서도 일관성 보장

2. preinstall 스크립트 추가 (🟡 권장)

실수로 npm install이나 yarn install을 실행하는 것을 방지:

{
  "scripts": {
    "preinstall": "npx only-allow pnpm"
  }
}

3. Node.js 버전 파일 추가 (🟡 권장)

.nvmrc 파일을 추가하여 개발 환경에서 Node 버전 자동 전환:

22

또는 .node-version:

22.0.0

package.json의 engines 필드는 이미 있지만, 이 파일들은 nvm/fnm 같은 도구가 자동으로 버전을 전환하도록 도와줍니다.

4. .npmrc 제거 (이미 논의됨)

위에서 논의한 대로, .npmrc 파일을 제거하고 테스트해보세요.


우선순위:

  1. 🔴 packageManager 필드 추가 (필수)
  2. 🟡 preinstall 스크립트 추가 (강력 권장)
  3. 🟡 .nvmrc 파일 추가 (권장)
  4. 🟢 .npmrc 제거 테스트 (이미 논의됨)

현재 CI 설정에서 pnpm 캐싱이 잘 구성되어 있고, pnpm-lock.yaml도 존재하므로 기본적인 마이그레이션은 잘 되어 있습니다! 👍


🧠 Learnings used
Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 242
File: src/components/ui/TabSelector.tsx:10-11
Timestamp: 2025-08-12T09:41:44.182Z
Learning: manNomi prefers to keep reusable UI components simple and focused on core functionality rather than adding many features. They don't want to over-engineer flexible/reusable UI components at the initial stage.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/components/mentor/MentorChatCard/index.tsx:17-21
Timestamp: 2025-08-24T11:14:34.297Z
Learning: manNomi prefers not to receive accessibility suggestions or recommendations during code reviews.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/api/auth/client/usePostLogout.ts:17-33
Timestamp: 2025-08-24T11:13:08.477Z
Learning: manNomi prefers to prioritize user experience over perfect state consistency in auth flows. Specifically, in logout scenarios, they prefer to keep tokens intact on API failure to avoid forcing users to re-login, even if it means temporary UI state inconsistency.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/api/auth/client/useDeleteUserAccount.ts:17-27
Timestamp: 2025-08-24T11:11:40.758Z
Learning: manNomi prefers optimistic navigation in auth-related flows (like account deletion) to prevent race conditions where token clearing before navigation could cause intermediate redirects to login page due to pending async requests failing.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 242
File: src/types/mentor.ts:70-73
Timestamp: 2025-08-12T04:07:04.134Z
Learning: manNomi prefers using Korean labels directly in enum values (e.g., MentorTab.MY_MENTEE = "나의 멘티") over separating enum keys from UI labels for efficiency and intuitiveness, considering scalability concerns as excessive for their current project needs.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

최고~~~!!

Copy link

Choose a reason for hiding this comment

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

@manNomi 감사합니다! 🎉

구현 중에 궁금한 점이나 문제가 생기면 언제든 말씀해주세요. 도움이 필요하시면 기꺼이 도와드리겠습니다!


🧠 Learnings used
Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 242
File: src/components/ui/TabSelector.tsx:10-11
Timestamp: 2025-08-12T09:41:44.182Z
Learning: manNomi prefers to keep reusable UI components simple and focused on core functionality rather than adding many features. They don't want to over-engineer flexible/reusable UI components at the initial stage.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/components/mentor/MentorChatCard/index.tsx:17-21
Timestamp: 2025-08-24T11:14:34.297Z
Learning: manNomi prefers not to receive accessibility suggestions or recommendations during code reviews.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/api/auth/client/usePostLogout.ts:17-33
Timestamp: 2025-08-24T11:13:08.477Z
Learning: manNomi prefers to prioritize user experience over perfect state consistency in auth flows. Specifically, in logout scenarios, they prefer to keep tokens intact on API failure to avoid forcing users to re-login, even if it means temporary UI state inconsistency.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 245
File: src/api/auth/client/useDeleteUserAccount.ts:17-27
Timestamp: 2025-08-24T11:11:40.758Z
Learning: manNomi prefers optimistic navigation in auth-related flows (like account deletion) to prevent race conditions where token clearing before navigation could cause intermediate redirects to login page due to pending async requests failing.

Learnt from: manNomi
Repo: solid-connection/solid-connect-web PR: 242
File: src/types/mentor.ts:70-73
Timestamp: 2025-08-12T04:07:04.134Z
Learning: manNomi prefers using Korean labels directly in enum values (e.g., MentorTab.MY_MENTEE = "나의 멘티") over separating enum keys from UI labels for efficiency and intuitiveness, considering scalability concerns as excessive for their current project needs.

If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!


# 기본 설정
registry=https://registry.npmjs.org/
enable-pre-post-scripts=true
lockfile=true
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
22
41 changes: 39 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,47 @@
- Prettier
- Vercel

## Prerequisites

- Node.js 22.x
- pnpm 9.x or later

## Installation

This project uses pnpm as the package manager.

```bash
# Install pnpm globally
npm install -g pnpm

# Install dependencies
pnpm install
```

## Commands

```bash
npm run dev
# Development server
pnpm run dev

npm run lint
# Build for production
pnpm run build

# Linting
pnpm run lint

# Type checking
pnpm run typecheck

# Format code
pnpm run format
```

## Migration from npm

If you have an existing clone:

```bash
rm -rf node_modules package-lock.json
pnpm install
```
38 changes: 37 additions & 1 deletion commitlint.config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,42 @@
module.exports = {
extends: ["@commitlint/config-conventional"],
parserPreset: {
parserOpts: {
headerPattern: /^([\p{Emoji_Presentation}\p{Extended_Pictographic}]|\w+)(?:\((.+)\))?[:\s]+(.+)$/u,
headerCorrespondence: ["type", "scope", "subject"],
},
},
rules: {
"type-enum": [2, "always", ["feat", "fix", "refactor", "style", "test", "docs", "chore"]],
"type-enum": [
2,
"always",
[
"feat",
"fix",
"refactor",
"style",
"test",
"docs",
"chore",
// Gitmoji support
"✨",
"🐛",
"🔧",
"📝",
"💄",
"♻️",
"🔥",
"🚀",
"✅",
"🔒",
"⬆️",
"⬇️",
"🎨",
"🚧",
"💚",
"📦",
"🔀",
],
],
},
};
Loading