careermate 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +22 -17
  2. package/THIRD_PARTY_NOTICES.md +15 -0
  3. package/apps/mcp/src/index.ts +4 -3
  4. package/apps/web/DESIGN_GUIDE.md +2 -2
  5. package/apps/web/demo/demo-shim.js +536 -0
  6. package/apps/web/demo/demo.css +75 -0
  7. package/apps/web/demo/seed.js +269 -0
  8. package/apps/web/public/app.js +34 -2
  9. package/apps/web/public/icon-180.png +0 -0
  10. package/apps/web/public/index.html +14 -3
  11. package/apps/web/public/lib.js +135 -23
  12. package/apps/web/public/pages/applications.js +18 -9
  13. package/apps/web/public/pages/documents.js +66 -50
  14. package/apps/web/public/pages/home.js +12 -11
  15. package/apps/web/public/pages/interview.js +9 -12
  16. package/apps/web/public/pages/jobs.js +39 -36
  17. package/apps/web/public/pages/profile.js +66 -86
  18. package/apps/web/public/pages/settings.js +21 -14
  19. package/apps/web/public/styles.css +105 -38
  20. package/apps/web/src/http.ts +31 -4
  21. package/apps/web/src/info.ts +9 -22
  22. package/apps/web/src/routes.ts +19 -14
  23. package/apps/web/src/server.ts +34 -29
  24. package/apps/web/src/settings.ts +35 -17
  25. package/bin/careermate.mjs +8 -5
  26. package/dist/doctor.mjs +78908 -0
  27. package/dist/install-page/.omc/state/agent-replay-55a58c0d-bb6e-43ea-8a05-4b6c93b80b34.jsonl +12 -0
  28. package/dist/install-page/.omc/state/idle-notif-cooldown.json +3 -0
  29. package/dist/install-page/.omc/state/sessions/55a58c0d-bb6e-43ea-8a05-4b6c93b80b34/mission-state.json +147 -0
  30. package/dist/install-page/.omc/state/sessions/55a58c0d-bb6e-43ea-8a05-4b6c93b80b34/pre-tool-advisory-throttle.json +22 -0
  31. package/dist/install-page/.omc/state/sessions/55a58c0d-bb6e-43ea-8a05-4b6c93b80b34/subagent-tracking-state.json +44 -0
  32. package/dist/install-page/favicon.svg +1 -0
  33. package/dist/install-page/icon-180.png +0 -0
  34. package/dist/install-page/icon-512.png +0 -0
  35. package/dist/install-page/index.html +328 -225
  36. package/dist/install-page/landing.js +54 -0
  37. package/dist/install-page/llms-install.txt +202 -0
  38. package/dist/install-page/og.png +0 -0
  39. package/dist/install-page/shots/applications-dark.png +0 -0
  40. package/dist/install-page/shots/applications-light.png +0 -0
  41. package/dist/install-page/shots/documents-dark.png +0 -0
  42. package/dist/install-page/shots/documents-light.png +0 -0
  43. package/dist/install-page/shots/home-dark.png +0 -0
  44. package/dist/install-page/shots/home-light.png +0 -0
  45. package/dist/install-page/shots/interview-dark.png +0 -0
  46. package/dist/install-page/shots/interview-light.png +0 -0
  47. package/dist/install-page/shots/jobs-dark.png +0 -0
  48. package/dist/install-page/shots/jobs-light.png +0 -0
  49. package/dist/install-page/shots/settings-dark.png +0 -0
  50. package/dist/install-page/shots/settings-light.png +0 -0
  51. package/dist/install-page/start.html +323 -0
  52. package/dist/install-page/style.css +128 -4
  53. package/dist/mcp.mjs +74225 -2007
  54. package/dist/{mcpb-stage/dist/web.mjs → migrate.mjs} +142 -2660
  55. package/dist/pdf.worker.min.mjs +28 -0
  56. package/dist/public/app.js +34 -2
  57. package/dist/public/icon-180.png +0 -0
  58. package/dist/public/index.html +14 -3
  59. package/dist/public/lib.js +135 -23
  60. package/dist/public/pages/applications.js +18 -9
  61. package/dist/public/pages/documents.js +66 -50
  62. package/dist/public/pages/home.js +12 -11
  63. package/dist/public/pages/interview.js +9 -12
  64. package/dist/public/pages/jobs.js +39 -36
  65. package/dist/public/pages/profile.js +66 -86
  66. package/dist/public/pages/settings.js +21 -14
  67. package/dist/public/styles.css +105 -38
  68. package/dist/web.mjs +39950 -369
  69. package/docs/ARCHITECTURE.md +5 -5
  70. package/docs/DECISIONS.md +1 -1
  71. package/docs/DEMO.md +6 -6
  72. package/docs/MCP_TOOLS.md +68 -9
  73. package/docs/ROADMAP.md +11 -10
  74. package/docs/RUNTIME_DISTRIBUTION_RESEARCH.md +135 -0
  75. package/docs/START_WORKFLOW.md +19 -7
  76. package/docs/SUPPORTED_AI_APPS.md +85 -33
  77. package/docs/TODO.md +1 -1
  78. package/docs/WORKFLOWS.md +8 -6
  79. package/docs/superpowers/specs/2026-06-16-demo-dashboard-deploy-design.md +64 -0
  80. package/package.json +8 -3
  81. package/packages/core/src/services.ts +42 -1
  82. package/packages/db/src/connection.ts +30 -0
  83. package/packages/db/src/index.ts +1 -0
  84. package/packages/db/src/paths.ts +11 -0
  85. package/packages/db/src/repositories.ts +109 -63
  86. package/packages/db/src/schema.ts +118 -0
  87. package/packages/exporters/src/html.ts +9 -12
  88. package/packages/mcp-tools/src/bridge.ts +55 -32
  89. package/packages/mcp-tools/src/index.ts +9 -0
  90. package/packages/mcp-tools/src/tools.ts +269 -65
  91. package/packages/mcp-tools/src/update.ts +330 -0
  92. package/packages/parsers/src/documents.ts +521 -0
  93. package/packages/parsers/src/index.ts +8 -5
  94. package/packages/prompts/src/onboarding.ts +2 -2
  95. package/packages/shared/src/build-info.ts +22 -0
  96. package/packages/shared/src/enums.ts +39 -0
  97. package/packages/shared/src/index.ts +1 -0
  98. package/packages/shared/src/schemas.ts +24 -3
  99. package/packages/workflows/src/definitions.ts +4 -2
  100. package/scripts/build-demo.mjs +130 -0
  101. package/scripts/build-dist.mjs +46 -8
  102. package/scripts/build-mcpb.mjs +60 -4
  103. package/scripts/doctor.ts +16 -3
  104. package/scripts/gen-og.mjs +86 -0
  105. package/scripts/init.ts +32 -3
  106. package/scripts/seed.ts +5 -5
  107. package/scripts/shots-seed.ts +192 -0
  108. package/scripts/shots.ts +89 -0
  109. package/tsconfig.json +3 -1
  110. package/dist/careermate.mcpb +0 -0
  111. package/dist/mcp-smoke.err +0 -3
  112. package/dist/mcpb-stage/README.md +0 -219
  113. package/dist/mcpb-stage/dist/install-page/index.html +0 -434
  114. package/dist/mcpb-stage/dist/install-page/style.css +0 -407
  115. package/dist/mcpb-stage/dist/install-page/vercel.json +0 -20
  116. package/dist/mcpb-stage/dist/mcp.mjs +0 -23704
  117. package/dist/mcpb-stage/dist/public/app.js +0 -118
  118. package/dist/mcpb-stage/dist/public/index.html +0 -41
  119. package/dist/mcpb-stage/dist/public/lib.js +0 -282
  120. package/dist/mcpb-stage/dist/public/pages/applications.js +0 -98
  121. package/dist/mcpb-stage/dist/public/pages/documents.js +0 -446
  122. package/dist/mcpb-stage/dist/public/pages/home.js +0 -263
  123. package/dist/mcpb-stage/dist/public/pages/interview.js +0 -230
  124. package/dist/mcpb-stage/dist/public/pages/jobs.js +0 -494
  125. package/dist/mcpb-stage/dist/public/pages/profile.js +0 -576
  126. package/dist/mcpb-stage/dist/public/pages/settings.js +0 -233
  127. package/dist/mcpb-stage/dist/public/styles.css +0 -420
  128. package/dist/mcpb-stage/manifest.json +0 -40
  129. package/docs/INSTALL.md +0 -148
  130. package/docs/INSTALL_AND_USAGE.md +0 -99
  131. package/install-page/index.html +0 -474
  132. package/install-page/style.css +0 -391
  133. package/install-page/vercel.json +0 -20
  134. /package/dist/{mcpb-stage/dist/public → install-page}/fonts/PretendardVariable.woff2 +0 -0
package/README.md CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  ## 주요 기능
28
28
 
29
- - **AI와 대화로 모든 작업** — MCP 도구 24개로 온보딩·프로필·이력서·자소서·공고·핏 분석·지원 상태·면접 준비·AI 티 안 나는 글쓰기까지 처리.
29
+ - **AI와 대화로 모든 작업** — MCP 도구 31개로 온보딩·프로필·이력서·자소서·공고·핏 분석·지원 상태·면접 준비·AI 티 안 나는 글쓰기까지 처리.
30
30
  - **지원 상태 8단계 관리** — `draft`(작성 중) · `planned`(지원 예정) · `applied`(지원 완료) · `document_passed`(서류 합격) · `interview`(면접 진행) · `final_passed`(최종 합격) · `rejected`(불합격) · `on_hold`(보류). `document_passed` 이상에서 면접 준비가 해금됩니다.
31
31
  - **자기소개서 버전 관리** — 공고별로 자소서 버전을 쌓고 타임라인으로 비교, 파일로 내보내기.
32
32
  - **채용공고 파싱** — 붙여넣은 공고 텍스트를 구조화해 저장.
@@ -42,7 +42,7 @@
42
42
  | 프로세스 | 실행 | 역할 |
43
43
  | --- | --- | --- |
44
44
  | **대시보드 웹 서버** | `npm start` | `http://127.0.0.1:4319` — 내 데이터를 눈으로 확인·관리. `127.0.0.1`에만 바인딩. |
45
- | **MCP 서버** | `npm run mcp` | stdio 기반. 보통 AI 클라이언트가 자동 실행. 도구 24개 제공. |
45
+ | **MCP 서버** | `npm run mcp` | stdio 기반. 보통 AI 클라이언트가 자동 실행. 도구 31개 제공. |
46
46
 
47
47
  ---
48
48
 
@@ -55,11 +55,11 @@
55
55
  ```bash
56
56
  node --version
57
57
  ```
58
- `v22.5.0` 미만이거나 명령을 찾지 못하면 https://nodejs.org 에서 최신 LTS를 설치하세요.
58
+ `v22.5.0` 미만이거나 명령을 찾지 못하면 설치하세요 — Windows: `winget install OpenJS.NodeJS.LTS`, macOS: `brew install node`, 그 외: https://nodejs.org 에서 최신 LTS.
59
59
 
60
60
  ### 1) 설치
61
61
 
62
- 빌드 단계가 없습니다. TypeScript는 `tsx`로 바로 실행됩니다.
62
+ 빌드 단계가 없습니다. TypeScript는 `tsx`로 바로 실행됩니다. (소스를 직접 받으려면 `git clone https://github.com/osntak/CareerMate.git` — 현재 **비공개 저장소**라 접근 권한이 필요하며, 권한이 없으면 클론 없이 `npx -y careermate init`을 쓰세요.)
63
63
 
64
64
  ```bash
65
65
  npm install
@@ -91,9 +91,11 @@ v1에서 권장하는 연결 방식은 셋입니다. 아래 순서대로 골라
91
91
 
92
92
  #### ① Claude Desktop 연결 (.mcpb 원클릭)
93
93
 
94
- 터미널·Node 없이 가장 간단하게 붙이는 **하나의 연결 방법**입니다. `dist/careermate.mcpb`(`npm run build:mcpb`로 생성)를 더블클릭하거나 Claude Desktop의 **Settings → Extensions**로 끌어다 놓고, Claude Desktop을 재시작합니다.
94
+ 터미널·Node 없이 가장 간단하게 붙이는 **하나의 연결 방법**입니다. `dist/careermate.mcpb`(`npm run build:mcpb`로 생성)를 Claude Desktop의 **Settings → Extensions → Advanced settings → Install extension…** 에서 선택해 추가하고, Claude Desktop을 재시작합니다. (더블클릭·드래그는 Windows에서 파일 연결이 안 잡혀 반응이 없을 수 있습니다.)
95
95
 
96
- #### ② Claude Code
96
+ #### ② Claude Code (CLI 또는 Claude Desktop의 **Code 탭**)
97
+
98
+ 터미널이 부담스러우면 **Claude 데스크톱 앱의 "Code" 탭**(앱 안의 Claude Code, 통합 터미널 내장)이 비개발자에게 가장 매끄럽습니다 — 작업 폴더 하나를 잡고 데이터까지 그 안에 두는 방식입니다. 자세한 건 [`docs/SUPPORTED_AI_APPS.md`](docs/SUPPORTED_AI_APPS.md)(또는 사람용 안내 https://careermate.life). (Pro 이상 구독 필요, Windows는 Git 사전 설치.)
97
99
 
98
100
  CareerMate 폴더에서 Claude Code를 실행한 뒤, 이렇게 시켜 주세요.
99
101
 
@@ -115,7 +117,7 @@ Codex가 `~/.codex/config.toml`에 MCP 서버를 등록합니다. 연결은 Code
115
117
 
116
118
  > **기타 MCP 클라이언트(Cursor 등)** — Cursor·Cline·Windsurf 같은 로컬 stdio MCP 클라이언트는 `npm run init`(또는 `npm run init -- --print`)으로 등록할 수 있습니다.
117
119
 
118
- 연결 후 AI 클라이언트를 **완전히 재시작**하고, `get_onboarding_status`를 호출해 달라고 시켜 연결을 검증하세요. 자세한 절차는 AI용 런북 **[`INSTALL.md`](INSTALL.md)**와 사람용 설치 가이드 **[`docs/INSTALL_AND_USAGE.md`](docs/INSTALL_AND_USAGE.md)**를 참고하세요.
120
+ 연결 후 AI 클라이언트를 **완전히 재시작**하고, `get_onboarding_status`를 호출해 달라고 시켜 연결을 검증하세요. 자세한 절차는 AI용 런북 **[`INSTALL.md`](INSTALL.md)**, 사람용 설치 안내 **https://careermate.life**, 설치 후 사용법 **[`docs/START_WORKFLOW.md`](docs/START_WORKFLOW.md)**를 참고하세요.
119
121
 
120
122
  > **가장 간단한 길 — npx:** `careermate`가 npm에 게시되어 클론 없이 `npx -y careermate init` 한 줄로 등록됩니다. 소스 폴더에서 작업 중이면 `npm install` 후 `npm run init`을 써도 됩니다.
121
123
 
@@ -137,21 +139,23 @@ Codex가 `~/.codex/config.toml`에 MCP 서버를 등록합니다. 연결은 Code
137
139
 
138
140
  ---
139
141
 
140
- ## MCP 도구 한눈에 (24개)
142
+ ## MCP 도구 한눈에 (31개)
141
143
 
142
144
  | 분류 | 도구 |
143
145
  | --- | --- |
144
- | 온보딩 | `get_onboarding_status` · `start_onboarding` |
145
- | 프로필 | `save_profile` · `get_profile` · `update_profile` |
146
- | 이력서 | `add_resume` · `get_resumes` |
147
- | 자기소개서 | `add_cover_letter` · `get_cover_letters` · `save_cover_letter_version` · `export_cover_letter` |
148
- | 채용공고 | `save_job_posting` · `get_job_posting` · `list_jobs` · `parse_job_posting` |
146
+ | 온보딩 | `get_onboarding_status` |
147
+ | 프로필 | `save_profile` · `get_profile` |
148
+ | 이력서 | `read_document` · `add_resume` · `get_resumes` · `open_inbox` · `read_inbox` |
149
+ | 경력·프로젝트·스킬 | `add_experience` · `get_experiences` · `add_project` · `get_projects` · `add_skill` · `get_skills` |
150
+ | 자기소개서 | `get_cover_letters` · `save_cover_letter_version` · `export_cover_letter` |
151
+ | 채용공고 | `save_job_posting` · `get_job_posting` · `list_jobs` |
149
152
  | 핵심 컨텍스트 | **`get_application_context`** (지원에 필요한 맥락을 한 번에 모아줌) |
150
153
  | 핏 분석 | `save_fit_analysis` |
151
154
  | 지원 상태 | `update_application_status` |
152
155
  | 면접 준비 | `save_interview_prep` |
153
156
  | 글쓰기 | `get_writing_style_guide` (AI 티 안 나는 한국어 글쓰기 규칙) |
154
157
  | 대시보드/활동 | `open_dashboard` · `open_application` · `list_recent_activity` · `get_workflow_guide` |
158
+ | 업데이트 | `check_for_update` · `update_careermate` |
155
159
 
156
160
  이 도구들 위에 5종의 워크플로우(`onboarding`, `analyze_job`, `write_cover_letter`, `manage_application_status`, `prepare_interview`)가 정의되어 있어, AI가 단계별로 자연스럽게 안내합니다.
157
161
 
@@ -168,7 +172,7 @@ CareerMate/
168
172
  │ ├─ shared/ # 공용 타입·zod 스키마·유틸
169
173
  │ ├─ db/ # node:sqlite DB 접근·스키마·마이그레이션
170
174
  │ ├─ core/ # 도메인 유스케이스
171
- │ ├─ mcp-tools/ # MCP 도구 24개 정의
175
+ │ ├─ mcp-tools/ # MCP 도구 31개 정의
172
176
  │ ├─ exporters/ # 내보내기(자소서 등)
173
177
  │ ├─ parsers/ # 채용공고 파싱
174
178
  │ ├─ prompts/ # 프롬프트·안내 문구
@@ -195,6 +199,8 @@ CareerMate/
195
199
  | `npm run migrate` | DB 생성/업그레이드 |
196
200
  | `npm run doctor` | 설치/환경 점검 |
197
201
  | `npm run seed` | 예시 데이터 삽입 |
202
+ | `npm run build` | 배포용 플레인 JS 번들(`dist/`) 생성 (esbuild) |
203
+ | `npm run build:mcpb` | Claude Desktop용 `.mcpb` 번들 빌드 → `dist/careermate.mcpb`(+ `install-page/`로 복사). manifest+서버코드를 한 파일로 묶어 배포(careermate.life에 호스팅). |
198
204
  | `npm test` | E2E 테스트 실행 |
199
205
  | `npm run test:ui` | Playwright UI 스모크 테스트 |
200
206
  | `npm run typecheck` | 타입 검사 (`tsc --noEmit`) |
@@ -232,8 +238,7 @@ CareerMate/
232
238
 
233
239
  - [`INSTALL.md`](INSTALL.md) — AI 어시스턴트가 따라가는 설치·연결 런북(소스 직접 실행 기준).
234
240
  - [`AGENTS.md`](AGENTS.md) — Codex용 영속 지침. / [`CLAUDE.md`](CLAUDE.md) — Claude Code용 영속 지침.
235
- - [`docs/SUPPORTED_AI_APPS.md`](docs/SUPPORTED_AI_APPS.md) — 지원하는 AI 앱과 연결 방식 정리.
236
- - [`docs/INSTALL_AND_USAGE.md`](docs/INSTALL_AND_USAGE.md) — 사람용 두 트랙 설치(.mcpb 원클릭 / 터미널)와 설치 후 사용법.
241
+ - [`docs/SUPPORTED_AI_APPS.md`](docs/SUPPORTED_AI_APPS.md) — **설치 레퍼런스 허브**: 지원 앱 매트릭스 + 설치 3방식(에이전트/npx/.mcpb) + 클라이언트별 수동 MCP 설정 + 알려진 제약. (사람용 안내는 https://careermate.life)
237
242
  - [`docs/START_WORKFLOW.md`](docs/START_WORKFLOW.md) — 등록부터 면접 준비까지 단계별 작업 런북.
238
243
  - [`docs/TODO.md`](docs/TODO.md) — 남은 작업과 v1 범위 밖 항목.
239
244
 
@@ -253,4 +258,4 @@ npm run typecheck
253
258
 
254
259
  ## 라이선스
255
260
 
256
- MIT.
261
+ MIT 라이선스 — npm으로 배포되는 패키지 코드에 적용됩니다. (개발용 GitHub 저장소는 현재 비공개입니다.)
@@ -38,3 +38,18 @@ SOFTWARE.
38
38
 
39
39
  > 참고: 원 저장소의 정확한 저작권자 표기(`Copyright (c) <year> <holder>`)를 확인해
40
40
  > 위 전문 상단에 그대로 채워 넣는 것을 권장합니다.
41
+
42
+ ---
43
+
44
+ ## 번들에 포함되는 npm 의존성 (문서 텍스트 추출)
45
+
46
+ `read_document` 도구가 PDF·Word·한컴 문서에서 텍스트를 추출하는 데 사용하는 순수 JS 라이브러리들입니다. 배포 시 `dist/` 번들(esbuild)에 코드가 인라인되므로 각 라이선스 고지를 보존합니다. 각 라이선스 전문은 설치된 `node_modules/<패키지>/LICENSE` 에 포함됩니다.
47
+
48
+ | 패키지 | 용도 | 라이선스 | 저작권 |
49
+ | --- | --- | --- | --- |
50
+ | [`mammoth`](https://github.com/mwilliamson/mammoth.js) | `.docx` → 텍스트 | BSD-2-Clause | Copyright (c) Michael Williamson |
51
+ | [`hwp.js`](https://github.com/hahnlee/hwp.js) | `.hwp`(HWP 5.x) → 텍스트 | Apache-2.0 | Copyright Han Lee and other contributors |
52
+ | [`fflate`](https://github.com/101arrowz/fflate) | `.hwpx` 압축 해제 | MIT | Copyright (c) 2023 Arjun Barrett |
53
+ | [`pdfjs-dist`](https://github.com/mozilla/pdf.js) | `.pdf` → 텍스트 | Apache-2.0 | Copyright Mozilla Foundation and contributors |
54
+
55
+ > Apache-2.0(`hwp.js`, `pdfjs-dist`)은 라이선스 사본과 NOTICE 고지 보존을 요구합니다. 위 표와 `node_modules`의 동봉 라이선스로 이를 충족합니다.
@@ -6,14 +6,15 @@
6
6
  * dashboard uses, so anything the AI writes appears in the dashboard instantly,
7
7
  * and anything the user edits in the dashboard is visible to the AI.
8
8
  *
9
- * Nothing here calls out to the network. All reasoning stays in the user's AI.
9
+ * All reasoning stays in the user's AI. The only outbound network call is an
10
+ * optional version check (check_for_update / update_careermate) against the
11
+ * public npm registry — no user data is sent; disable with CAREERMATE_NO_UPDATE_CHECK.
10
12
  */
11
13
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
14
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
13
15
  import { getDb, getDataDir } from '@careermate/db';
14
16
  import { TOOLS, toCallToolResult } from '@careermate/mcp-tools';
15
-
16
- const APP_VERSION = '0.1.0';
17
+ import { APP_VERSION } from '@careermate/shared';
17
18
 
18
19
  async function main(): Promise<void> {
19
20
  // Ensure the DB is created/migrated before serving any tool call.
@@ -27,7 +27,7 @@
27
27
  3. **필러 설명 금지.** 설명 줄은 *수치·제약·상태·자명하지 않은 이유*를 말할 때만 허용. 제목을 바꿔 말하면 삭제. **"한눈에" 금지.**
28
28
  4. **설정/MCP 안내는 단 한 곳(홈 '시작하기' 카드)에만.** 빈 상태는 화면별 **고유 한 문장**. "ChatGPT/Claude에게 …저장됩니다" 반복·`MCP_HINT` 공용 상수 금지.
29
29
  5. **위계는 타이포·여백으로, 박스로 X.** 단일 빈 상태/단일 블록을 `.card`로 감싸지 않는다. 카드는 **반복·선택 가능한 객체**(공고 행, 자소서, 보드 카드)에만. **카드 in 카드 금지.**
30
- 6. **악센트(인디고)는 절제.** 1차 버튼·링크·포커스 링·active nav에만. **장식용 보라 그라데이션 금지** (`.sidebar__logo`, `.progress__bar`의 `135deg accent→#7c3aed`는 평면 `var(--accent)`로). 코드에 raw hex 금지 — 색은 CSS 변수로만.
30
+ 6. **악센트(에메랄드 `--accent: #0f7256`)는 절제.** 1차 버튼·링크·포커스 링·active nav에만. 랜딩(install-page)과 동일한 크림 페이퍼 + 에메랄드 팔레트로 통일(인디고 폐기). **장식용 보라 그라데이션 금지** (`.sidebar__logo`, `.progress__bar`의 `135deg accent→#7c3aed`는 평면 `var(--accent)`로). 코드에 raw hex 금지 — 색은 CSS 변수로만.
31
31
  7. **버튼 라벨은 동사+명사, 흐름 내내 일관.** 모달 저장 버튼은 `저장`이 아니라 **`공고 저장`/`경력 저장`**. 생성 라벨과 성공 토스트의 명사가 일치(`공고 저장`→`공고를 저장했습니다`). 맨동사는 `취소`·`닫기`·`복사`만.
32
32
  8. **인덱스 페이지는 툴바+행으로 직행.** 설명 헤더 블록은 settings/profile/온보딩/상세에만. 상세(`jobs/:id`)의 회사명 `<h1>`은 nav가 못 보여주는 *콘텐츠*이므로 유일한 정당한 예외.
33
33
  9. **숫자 열은 우정렬 + `.tnum`.** 적합도 점수·파일 크기 등은 `text-align:right`로 자릿수를 정렬.
@@ -52,7 +52,7 @@ PageHead( (인덱스 페이지) → 제거 (상단바 제목으로 충분
52
52
  ```
53
53
 
54
54
  추가 육안 테스트(페이지마다):
55
- - **눈 가늘게 뜨기 테스트**: 채워진 인디고 버튼은 정확히 1개. 2개가 경쟁하면 하나를 ghost로 강등.
55
+ - **눈 가늘게 뜨기 테스트**: 채워진 악센트(에메랄드) 버튼은 정확히 1개. 2개가 경쟁하면 하나를 ghost로 강등.
56
56
  - **h1 개수**: 인덱스 0개(사이드바가 제목) / 상세·설정·프로필 1개. h1→h3 건너뜀 없음.
57
57
  - **빈 상태 형태**: 제목 + 고유 한 문장 + (있다면) 버튼 1개. 검색결과 없음은 '필터 초기화'지 생성 CTA가 아님.
58
58