careermate 0.1.0
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.
- package/README.md +256 -0
- package/THIRD_PARTY_NOTICES.md +40 -0
- package/apps/mcp/src/index.ts +66 -0
- package/apps/web/DESIGN_GUIDE.md +105 -0
- package/apps/web/UI_CONTRACT.md +44 -0
- package/apps/web/public/app.js +118 -0
- package/apps/web/public/fonts/PretendardVariable.woff2 +0 -0
- package/apps/web/public/index.html +41 -0
- package/apps/web/public/lib.js +282 -0
- package/apps/web/public/pages/applications.js +98 -0
- package/apps/web/public/pages/documents.js +446 -0
- package/apps/web/public/pages/home.js +263 -0
- package/apps/web/public/pages/interview.js +230 -0
- package/apps/web/public/pages/jobs.js +494 -0
- package/apps/web/public/pages/profile.js +576 -0
- package/apps/web/public/pages/settings.js +233 -0
- package/apps/web/public/styles.css +426 -0
- package/apps/web/src/exports.ts +68 -0
- package/apps/web/src/http.ts +180 -0
- package/apps/web/src/index.ts +49 -0
- package/apps/web/src/info.ts +50 -0
- package/apps/web/src/routes.ts +350 -0
- package/apps/web/src/security.ts +102 -0
- package/apps/web/src/server.ts +141 -0
- package/apps/web/src/settings.ts +88 -0
- package/bin/careermate.mjs +74 -0
- package/dist/careermate.mcpb +0 -0
- package/dist/install-page/index.html +474 -0
- package/dist/install-page/style.css +391 -0
- package/dist/install-page/vercel.json +20 -0
- package/dist/mcp-smoke.err +3 -0
- package/dist/mcp.mjs +23704 -0
- package/dist/mcpb-stage/README.md +219 -0
- package/dist/mcpb-stage/dist/install-page/index.html +434 -0
- package/dist/mcpb-stage/dist/install-page/style.css +407 -0
- package/dist/mcpb-stage/dist/install-page/vercel.json +20 -0
- package/dist/mcpb-stage/dist/mcp.mjs +23704 -0
- package/dist/mcpb-stage/dist/public/app.js +118 -0
- package/dist/mcpb-stage/dist/public/fonts/PretendardVariable.woff2 +0 -0
- package/dist/mcpb-stage/dist/public/index.html +41 -0
- package/dist/mcpb-stage/dist/public/lib.js +282 -0
- package/dist/mcpb-stage/dist/public/pages/applications.js +98 -0
- package/dist/mcpb-stage/dist/public/pages/documents.js +446 -0
- package/dist/mcpb-stage/dist/public/pages/home.js +263 -0
- package/dist/mcpb-stage/dist/public/pages/interview.js +230 -0
- package/dist/mcpb-stage/dist/public/pages/jobs.js +494 -0
- package/dist/mcpb-stage/dist/public/pages/profile.js +576 -0
- package/dist/mcpb-stage/dist/public/pages/settings.js +233 -0
- package/dist/mcpb-stage/dist/public/styles.css +420 -0
- package/dist/mcpb-stage/dist/web.mjs +7240 -0
- package/dist/mcpb-stage/manifest.json +40 -0
- package/dist/public/app.js +118 -0
- package/dist/public/fonts/PretendardVariable.woff2 +0 -0
- package/dist/public/index.html +41 -0
- package/dist/public/lib.js +282 -0
- package/dist/public/pages/applications.js +98 -0
- package/dist/public/pages/documents.js +446 -0
- package/dist/public/pages/home.js +263 -0
- package/dist/public/pages/interview.js +230 -0
- package/dist/public/pages/jobs.js +494 -0
- package/dist/public/pages/profile.js +576 -0
- package/dist/public/pages/settings.js +233 -0
- package/dist/public/styles.css +426 -0
- package/dist/web.mjs +7240 -0
- package/docs/ARCHITECTURE.md +208 -0
- package/docs/CHANGES_V1.md +103 -0
- package/docs/DATA_MODEL.md +460 -0
- package/docs/DECISIONS.md +277 -0
- package/docs/DEMO.md +242 -0
- package/docs/INSTALL.md +148 -0
- package/docs/INSTALL_AND_USAGE.md +99 -0
- package/docs/MCP_TOOLS.md +233 -0
- package/docs/ROADMAP.md +134 -0
- package/docs/START_WORKFLOW.md +125 -0
- package/docs/SUPPORTED_AI_APPS.md +60 -0
- package/docs/TODO.md +57 -0
- package/docs/UX_NOTES.md +247 -0
- package/docs/WORKFLOWS.md +200 -0
- package/install-page/index.html +474 -0
- package/install-page/style.css +391 -0
- package/install-page/vercel.json +20 -0
- package/package.json +68 -0
- package/packages/core/src/context.ts +74 -0
- package/packages/core/src/index.ts +8 -0
- package/packages/core/src/onboarding.ts +81 -0
- package/packages/core/src/services.ts +146 -0
- package/packages/core/src/summary.ts +104 -0
- package/packages/db/src/connection.ts +46 -0
- package/packages/db/src/index.ts +22 -0
- package/packages/db/src/paths.ts +41 -0
- package/packages/db/src/repositories.ts +828 -0
- package/packages/db/src/runtime.ts +58 -0
- package/packages/db/src/schema.ts +189 -0
- package/packages/exporters/src/html.ts +113 -0
- package/packages/exporters/src/index.ts +364 -0
- package/packages/exporters/src/markdown.ts +178 -0
- package/packages/mcp-tools/src/bridge.ts +83 -0
- package/packages/mcp-tools/src/index.ts +8 -0
- package/packages/mcp-tools/src/result.ts +49 -0
- package/packages/mcp-tools/src/tools.ts +455 -0
- package/packages/parsers/src/html.ts +86 -0
- package/packages/parsers/src/index.ts +228 -0
- package/packages/parsers/src/keywords.ts +151 -0
- package/packages/prompts/src/humanize.ts +59 -0
- package/packages/prompts/src/index.ts +82 -0
- package/packages/prompts/src/install.ts +43 -0
- package/packages/prompts/src/onboarding.ts +35 -0
- package/packages/prompts/src/system.ts +53 -0
- package/packages/shared/src/enums.ts +103 -0
- package/packages/shared/src/index.ts +18 -0
- package/packages/shared/src/schemas.ts +398 -0
- package/packages/workflows/src/definitions.ts +107 -0
- package/packages/workflows/src/index.ts +39 -0
- package/scripts/build-dist.mjs +62 -0
- package/scripts/build-mcpb.mjs +70 -0
- package/scripts/doctor.ts +81 -0
- package/scripts/init.ts +342 -0
- package/scripts/mcp-probe.ts +55 -0
- package/scripts/migrate.ts +6 -0
- package/scripts/run.mjs +33 -0
- package/scripts/seed.ts +129 -0
- package/scripts/test.ts +117 -0
- package/scripts/ui-smoke.ts +73 -0
- package/tsconfig.json +29 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="ko" data-theme="">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>CareerMate โ ๋ด AI๋ฅผ ์ปค๋ฆฌ์ด ๋น์๋ก</title>
|
|
7
|
+
<meta name="description" content="Claude DesktopยทClaude CodeยทCodex ๊ฐ์ ๋ก์ปฌ AI ์ฑ์ ์ฐ๊ฒฐํ์ธ์. CareerMate๊ฐ ์ด๋ ฅ์ยท์๊ธฐ์๊ฐ์ยท์ง์ ํํฉ์ ์ด ์ปดํจํฐ์๋ง ์ ์ฅํ๊ณ MCP๋ก ๋น์ ์ AI์ ์ฐ๊ฒฐํฉ๋๋ค." />
|
|
8
|
+
<link rel="stylesheet" href="style.css" />
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<!-- ============================================================ nav -->
|
|
12
|
+
<nav class="nav">
|
|
13
|
+
<a class="nav__brand" href="#top">
|
|
14
|
+
<span class="nav__logo" aria-hidden="true">C</span>
|
|
15
|
+
<span class="nav__name">CareerMate</span>
|
|
16
|
+
</a>
|
|
17
|
+
<div class="nav__links">
|
|
18
|
+
<a href="#how">๋์ ๋ฐฉ์</a>
|
|
19
|
+
<a href="#features">๊ธฐ๋ฅ</a>
|
|
20
|
+
<a href="#install">์ค์น</a>
|
|
21
|
+
<a href="#privacy">๊ฐ์ธ์ ๋ณด</a>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="nav__actions">
|
|
24
|
+
<button class="theme-toggle" id="theme-toggle" type="button" aria-label="๋คํฌ ๋ชจ๋ ์ ํ" title="๋คํฌ ๋ชจ๋ ์ ํ">
|
|
25
|
+
<svg class="i-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg>
|
|
26
|
+
<svg class="i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>
|
|
27
|
+
</button>
|
|
28
|
+
<a class="btn btn--ghost" href="#install">์ค์นํ๊ธฐ</a>
|
|
29
|
+
</div>
|
|
30
|
+
</nav>
|
|
31
|
+
|
|
32
|
+
<main id="top">
|
|
33
|
+
|
|
34
|
+
<!-- ========================================================== hero -->
|
|
35
|
+
<header class="hero">
|
|
36
|
+
<span class="pill-badge">
|
|
37
|
+
<span class="pill-badge__dot" aria-hidden="true"></span>
|
|
38
|
+
๋ก์ปฌ ์ ์ฉ ยท ์คํ์์ค ยท Claude Desktop ์ํด๋ฆญ
|
|
39
|
+
</span>
|
|
40
|
+
<h1 class="hero__title">
|
|
41
|
+
๋ด๊ฐ ์ฐ๋ <span class="accent">AI</span>๋ฅผ<br />
|
|
42
|
+
๋๋ง์ <span class="accent">์ปค๋ฆฌ์ด ๋น์</span>๋ก
|
|
43
|
+
</h1>
|
|
44
|
+
<p class="hero__lede">
|
|
45
|
+
์ด๋ ฅ์ยท์๊ธฐ์๊ฐ์ยท์ง์ ํํฉ์ <strong>์ด ์ปดํจํฐ ์์์</strong> ๊ด๋ฆฌํ์ธ์.<br />
|
|
46
|
+
๋ถ์๊ณผ ๊ธ์ฐ๊ธฐ๋ ํ์ ์ฐ๋ AI๊ฐ, ๋ฐ์ดํฐ ๋ณด๊ด์ CareerMate๊ฐ ๋งก์ต๋๋ค.
|
|
47
|
+
</p>
|
|
48
|
+
|
|
49
|
+
<div class="hero__cta">
|
|
50
|
+
<a class="btn btn--primary" href="#install">
|
|
51
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M7 10l5 5 5-5"/><path d="M12 15V3"/></svg>
|
|
52
|
+
์ค์น ๋ฐฉ๋ฒ ๋ณด๊ธฐ
|
|
53
|
+
</a>
|
|
54
|
+
<a class="btn btn--ghost" href="#install-other">๊ธฐํ MCP ํด๋ผ์ด์ธํธ</a>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<p class="hero__note">
|
|
58
|
+
CareerMate๋ <strong>๋ด ์ปดํจํฐ์์ ๋๋ ๋ก์ปฌ ๋๊ตฌ</strong>๋ผ, ๋ด ์ปดํจํฐ์ ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์๋ AI์์ ๋์ํฉ๋๋ค โ <strong>Claude Desktop ยท Claude Code ยท Codex</strong>.
|
|
59
|
+
์ค์น๋ฅผ ๋ง์ณค๋ค๋ฉด ๋์๋ณด๋ <code>http://127.0.0.1:4319</code>์์ ๋ด ๋ฐ์ดํฐ๋ฅผ ํ์ธํ์ธ์.
|
|
60
|
+
</p>
|
|
61
|
+
</header>
|
|
62
|
+
|
|
63
|
+
<!-- ========================================================== how -->
|
|
64
|
+
<section id="how" class="section">
|
|
65
|
+
<div class="section__head">
|
|
66
|
+
<span class="eyebrow">๋์ ๋ฐฉ์</span>
|
|
67
|
+
<h2>๋น์ ์ AI๊ฐ <span class="accent">๋๋</span>,<br />CareerMate๋ <span class="accent">์ปค๋ฆฌ์ด ์๋์ฅ</span></h2>
|
|
68
|
+
<p>CareerMate ์์๋ AI๊ฐ ๋ค์ด ์์ง ์์ต๋๋ค.<br />์๊ฐํ๋ ์ผ์ ๋น์ ์ AI๊ฐ, ๋ฐ์ดํฐ ๋ณด๊ด์ CareerMate๊ฐ ๋งก์ต๋๋ค.</p>
|
|
69
|
+
</div>
|
|
70
|
+
<div class="cards-3">
|
|
71
|
+
<article class="feature">
|
|
72
|
+
<div class="feature__icon">
|
|
73
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5a3 3 0 1 0-5.99.13 3 3 0 0 0-1.5 5.5A3 3 0 0 0 6 16.5a3 3 0 0 0 6 .5V5z"/><path d="M12 5a3 3 0 1 1 5.99.13 3 3 0 0 1 1.5 5.5A3 3 0 0 1 18 16.5a3 3 0 0 1-6 .5V5z"/></svg>
|
|
74
|
+
</div>
|
|
75
|
+
<h3>1. ๋น์ ์ AI์ ๋ํ</h3>
|
|
76
|
+
<p>ํ์ ์ฐ๋ Claude์๊ฒ ๋ง๋ก ์ํค๋ฉด ๋ฉ๋๋ค.<br />๋ถ์ยท๊ธ์ฐ๊ธฐ ๊ฐ์ โ์๊ฐโ์ ์ ๋ถ ๋น์ ์ AI๊ฐ ํฉ๋๋ค.</p>
|
|
77
|
+
</article>
|
|
78
|
+
<article class="feature">
|
|
79
|
+
<div class="feature__icon">
|
|
80
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 12h6"/><path d="M9 12a3 3 0 0 1-3-3V7a3 3 0 0 1 3-3"/><path d="M15 12a3 3 0 0 0 3 3v2a3 3 0 0 1-3 3"/></svg>
|
|
81
|
+
</div>
|
|
82
|
+
<h3>2. MCP๋ก ์ฐ๊ฒฐ</h3>
|
|
83
|
+
<p>ํ์ค ํ๋กํ ์ฝ MCP๊ฐ AI์ CareerMate๋ฅผ ์๋ โUSB-Cโ ์ญํ ์ ํฉ๋๋ค.<br />AI๊ฐ 24๊ฐ ๋๊ตฌ๋ก ๋น์ ์ ์ปค๋ฆฌ์ด DB๋ฅผ ์ฝ๊ณ ์๋๋ค.</p>
|
|
84
|
+
</article>
|
|
85
|
+
<article class="feature">
|
|
86
|
+
<div class="feature__icon">
|
|
87
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="6" rx="1.5"/><rect x="3" y="14" width="18" height="6" rx="1.5"/><path d="M7 7h.01M7 17h.01"/></svg>
|
|
88
|
+
</div>
|
|
89
|
+
<h3>3. ์ด ์ปดํจํฐ์ ์ ์ฅ</h3>
|
|
90
|
+
<p>๋ชจ๋ ๋ฐ์ดํฐ๋ ๋ก์ปฌ SQLite(<code>~/.careermate</code>)์๋ง ์ ์ฅ๋ฉ๋๋ค.<br />์ธ๋ถ ์๋ฒ๋ก ์ ์กํ์ง ์์ต๋๋ค. ๋์๋ณด๋๋ก ๋์ผ๋ก ํ์ธํ์ธ์.</p>
|
|
91
|
+
</article>
|
|
92
|
+
</div>
|
|
93
|
+
</section>
|
|
94
|
+
|
|
95
|
+
<!-- ====================================================== features -->
|
|
96
|
+
<section id="features" class="section">
|
|
97
|
+
<div class="section__head">
|
|
98
|
+
<span class="eyebrow">ํ ์ ์๋ ์ผ</span>
|
|
99
|
+
<h2>์ง์ ํ ๊ฑด์ <span class="accent">๋๊น์ง</span> ํจ๊ป ์ฒ๋ฆฌ</h2>
|
|
100
|
+
<p>ํ๋กํ ์ ๋ฆฌ๋ถํฐ ๋ฉด์ ์ค๋น๊น์ง, AI์ ๋ํ๋ง์ผ๋ก ์ด์ด์ง๋๋ค.</p>
|
|
101
|
+
</div>
|
|
102
|
+
<div class="checks">
|
|
103
|
+
<div class="check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg><div><strong>ํ๋กํยท์ด๋ ฅ์ ๊ตฌ์กฐํ</strong><span>์
๋ก๋ํ ํ์ผ์ ์ฝ์ด ๊ฒฝ๋ ฅยทํ๋ก์ ํธยท์คํฌ๋ก ์ ๋ฆฌยท๋ณด๊ด.</span></div></div>
|
|
104
|
+
<div class="check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg><div><strong>์ฑ์ฉ๊ณต๊ณ ํ์ฑยท์ ์ฅ</strong><span>๋ถ์ฌ๋ฃ์ ๊ณต๊ณ ํ
์คํธ์์ ํ์ฌยท์ง๋ฌดยท์๊ฒฉ์๊ฑด์ ์ถ์ถ.</span></div></div>
|
|
105
|
+
<div class="check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg><div><strong>์ ํฉ๋(ํ) ๋ถ์</strong><span>๋ด ๊ฒฝ๋ ฅ๊ณผ ๊ณต๊ณ ๋ฅผ ๋น๊ตํด ๊ฐ์ ยท๋ณด์์ ยท๋งค์นญ ํค์๋ ๋์ถ.</span></div></div>
|
|
106
|
+
<div class="check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg><div><strong>๋ง์ถค ์์์ + ๋ฒ์ ๊ด๋ฆฌ</strong><span>๊ณต๊ณ ๋ณ ์๊ธฐ์๊ฐ์๋ฅผ ๋ฒ์ ์ผ๋ก ์๊ณ ๋น๊ต, ํ์ผ๋ก ๋ด๋ณด๋ด๊ธฐ.</span></div></div>
|
|
107
|
+
<div class="check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg><div><strong>์ง์ ์ํ 8๋จ๊ณ ๊ด๋ฆฌ</strong><span>์์ฑ ์ค โ ์ง์ โ ์๋ฅ ํฉ๊ฒฉ โ ๋ฉด์ โ ์ต์ข
๊น์ง ์นธ๋ฐ์ผ๋ก.</span></div></div>
|
|
108
|
+
<div class="check"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg><div><strong>๋ฉด์ ์ค๋น</strong><span>์๋ฅ ํฉ๊ฒฉ ์ ์์ ์ง๋ฌธยทSTAR ๋ต๋ณยท1๋ถ ์๊ธฐ์๊ฐ ์ด์ ์์ฑ.</span></div></div>
|
|
109
|
+
</div>
|
|
110
|
+
</section>
|
|
111
|
+
|
|
112
|
+
<!-- ======================================================= install -->
|
|
113
|
+
<section id="install" class="section">
|
|
114
|
+
<div class="section__head">
|
|
115
|
+
<span class="eyebrow">์ค์น</span>
|
|
116
|
+
<h2>์ธ ๊ฐ์ง AI ์ฑ์ ์ฐ๊ฒฐ</h2>
|
|
117
|
+
<p>์ง์ํ๋ ๋ก์ปฌ AI ์ฑ์ <strong>Claude Desktop ยท Claude Code ยท Codex</strong> ์
์
๋๋ค. ์ด๋ ์ชฝ์ด๋ ๊ฐ์ ์ฝ์ด(๋ก์ปฌ DB + ๋๊ตฌ 24๊ฐ)๋ฅผ ์๋๋ค.</p>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<div class="note">
|
|
121
|
+
<strong>์ด๋ค AI์์ ๋๋์?</strong> CareerMate๋ ๋ฐ์ดํฐ๋ฅผ ๋ด ์ปดํจํฐ์๋ง ๋๋ <strong>๋ก์ปฌ MCP ๋๊ตฌ</strong>์
๋๋ค.
|
|
122
|
+
๊ทธ๋์ <strong>๋ด ์ปดํจํฐ์์ ์คํ๋๋ฉฐ ๋ก์ปฌ ํ๋ก๊ทธ๋จ์ ๋์ธ ์ ์๋ AI</strong>์์ ๋์ํฉ๋๋ค โ Claude Desktop ยท Claude Code ยท Codex(๊ทธ ์ธ CursorยทClineยทWindsurf ๋ฑ๋ ๊ฐ๋ฅ).
|
|
123
|
+
ChatGPTยทGeminiยทClaude์ <strong>์น/๋ชจ๋ฐ์ผ ์ฑ</strong>์ ํด๋ผ์ฐ๋์์ ๋์ ๋ด ์ปดํจํฐ์ ๋ก์ปฌ ์๋ฒ์ ์ง์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค(์๊ฒฉ URL ๊ธฐ๋ฐ MCP๋ง ์ง์).
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<!-- track 1 ยท Claude Desktop -->
|
|
127
|
+
<div class="track">
|
|
128
|
+
<div class="track__head">
|
|
129
|
+
<span class="track__tag">1 ยท Claude Desktop</span>
|
|
130
|
+
<h3>์ํด๋ฆญ <code>.mcpb</code> ์ค์น</h3>
|
|
131
|
+
<p>ํฐ๋ฏธ๋๋, Node ์ค์น๋ ํ์ ์์ต๋๋ค. ํ์ผ ํ๋๋ฅผ ๋๋ธํด๋ฆญํ๋ฉด ๋๋ฉ๋๋ค.</p>
|
|
132
|
+
</div>
|
|
133
|
+
<ol class="steps">
|
|
134
|
+
<li class="step">
|
|
135
|
+
<div class="step__no">1</div>
|
|
136
|
+
<div class="step__body">
|
|
137
|
+
<h3>์ค์น ํ์ผ ๋ฐ๊ธฐ</h3>
|
|
138
|
+
<p><code>careermate.mcpb</code> ํ์ผ์ด ํ์ํฉ๋๋ค. <strong>(Release <code>v0.1.0</code>์ ์์ผ๋ ์ ์ฅ์๊ฐ ๋น๊ณต๊ฐ๋ผ ๊ณต๊ฐ ๋ค์ด๋ก๋ ๋งํฌ๋ ์์ง ์์ต๋๋ค.)</strong></p>
|
|
139
|
+
<!-- TODO: ์ ์ฅ์๋ฅผ public์ผ๋ก ์ ํํ๋ฉด https://github.com/osntak/CareerMate/releases/latest ์ .mcpb๋ก ์ด ๋ฒํผ์ ํ์ฑํ. ํ์ฌ๋ private repo๋ผ ๊ณต๊ฐ ๋ค์ด๋ก๋ ๋ถ๊ฐ. -->
|
|
140
|
+
<button class="btn btn--primary" type="button" disabled aria-disabled="true">
|
|
141
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M7 10l5 5 5-5"/><path d="M12 15V3"/></svg>
|
|
142
|
+
careermate.mcpb ๋ค์ด๋ก๋ (๋น๊ณต๊ฐ ์ ์ฅ์)
|
|
143
|
+
</button>
|
|
144
|
+
<p class="step__tip">์ ๊ทผ ๊ถํ์ด ์์ผ๋ฉด Release <code>v0.1.0</code>์์ ๋ฐ๊ณ , ์์ผ๋ฉด ํฐ๋ฏธ๋์์ <code>npx -y careermate init</code>๋ก ์ค์นํ๊ฑฐ๋ ์์ค์์ <code>npm run build:mcpb</code>๋ก ๋น๋ํ์ธ์.</p>
|
|
145
|
+
</div>
|
|
146
|
+
</li>
|
|
147
|
+
<li class="step">
|
|
148
|
+
<div class="step__no">2</div>
|
|
149
|
+
<div class="step__body">
|
|
150
|
+
<h3>๋๋ธํด๋ฆญ์ผ๋ก ์ค์น</h3>
|
|
151
|
+
<p>๋ด๋ ค๋ฐ์ <code>careermate.mcpb</code>๋ฅผ ๋๋ธํด๋ฆญํ๋ฉด Claude Desktop์ด ์ค์น ์ฐฝ์ ์ฝ๋๋ค. <strong>์ค์น</strong>๋ฅผ ๋๋ฅด์ธ์.
|
|
152
|
+
(๋๋ Claude Desktop โ <strong>Settings โ Extensions</strong>์ ํ์ผ์ ๋์ด๋ค ๋์๋ ๋ฉ๋๋ค.)</p>
|
|
153
|
+
</div>
|
|
154
|
+
</li>
|
|
155
|
+
<li class="step">
|
|
156
|
+
<div class="step__no">3</div>
|
|
157
|
+
<div class="step__body">
|
|
158
|
+
<h3>์ฌ์์ํ๊ณ ํ์ธ</h3>
|
|
159
|
+
<p>Claude Desktop์ ์์ ํ ์ข
๋ฃํ๋ค ๋ค์ ์ผ์ธ์. ๊ทธ๋ค์ Claude์๊ฒ
|
|
160
|
+
<strong>โ<code>get_onboarding_status</code> ํธ์ถํด์ ์ฐ๊ฒฐ๋๋์ง ํ์ธํด์คโ</strong>๋ผ๊ณ ๋งํด ๊ฒฐ๊ณผ๊ฐ ๋์์ค๋ฉด ์ ์์
๋๋ค.</p>
|
|
161
|
+
</div>
|
|
162
|
+
</li>
|
|
163
|
+
</ol>
|
|
164
|
+
<p class="step__tip">Claude Desktop์ด Node๋ฅผ ๋ด์ฅํ๋ฏ๋ก ๋ฐ๋ก ์ค์นํ ๊ฒ ์์ต๋๋ค. ๋๋ฌผ๊ฒ ๋ด์ฅ Node๊ฐ 22.5 ๋ฏธ๋ง์ด๋ผ ์ค์น๊ฐ ๋งํ๋ฉด ์๋ <a href="#install-other">ํฐ๋ฏธ๋ ๋ฐฉ์</a>์ ์ฐ์ธ์.</p>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<!-- track 2 ยท Claude Code -->
|
|
168
|
+
<div class="track">
|
|
169
|
+
<div class="track__head">
|
|
170
|
+
<span class="track__tag">2 ยท Claude Code</span>
|
|
171
|
+
<h3>CareerMate ํด๋์์ ํ ๋ฌธ์ฅ์ผ๋ก</h3>
|
|
172
|
+
<p>๋ฃจํธ <code>CLAUDE.md</code>๊ฐ ์ค์น ์๋ด ์ญํ ์ ํฉ๋๋ค. ํด๋๋ฅผ ์ด๊ณ ์๋ ๋ฌธ์ฅ๋ง ๋งํ์ธ์.</p>
|
|
173
|
+
</div>
|
|
174
|
+
<ol class="steps">
|
|
175
|
+
<li class="step">
|
|
176
|
+
<div class="step__no">1</div>
|
|
177
|
+
<div class="step__body">
|
|
178
|
+
<h3>CareerMate ํด๋์์ Claude Code ์ด๊ธฐ</h3>
|
|
179
|
+
<p>CareerMate ํด๋์์ <code>claude</code>๋ฅผ ์คํํ ๋ค, ์๋ ๋ฌธ์ฅ์ ๊ทธ๋๋ก ์
๋ ฅํฉ๋๋ค. Claude๊ฐ <code>INSTALL.md</code>๋ฅผ ๋ฐ๋ผ ๋ฑ๋ก๊น์ง ์งํํฉ๋๋ค.</p>
|
|
180
|
+
<div class="code">
|
|
181
|
+
<button class="copy-btn" type="button" data-copy-target="code-prompt-cc">๋ณต์ฌ</button>
|
|
182
|
+
<pre id="code-prompt-cc">CareerMate๋ฅผ ์ค์นํ๊ณ ์ค์ ํด์ค. INSTALL.md๋ฅผ ๋ฐ๋ผ ์งํํด์ค.</pre>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
</li>
|
|
186
|
+
<li class="step">
|
|
187
|
+
<div class="step__no">2</div>
|
|
188
|
+
<div class="step__body">
|
|
189
|
+
<h3>ํ ๋ฒ๋ง ์น์ธํ๊ณ ํ์ธ</h3>
|
|
190
|
+
<p>Claude Code๊ฐ ํ๋ก์ ํธ MCP ์๋ฒ ๋ฑ๋ก์ <strong>ํ ๋ฒ ์น์ธ</strong> ์์ฒญํ๋ฉด ํ์ฉํ์ธ์. ๊ทธ๋ค์ <strong>โ<code>get_onboarding_status</code> ํธ์ถํด์ ์ฐ๊ฒฐ๋๋์ง ํ์ธํด์คโ</strong>๋ก ์ ๊ฒํฉ๋๋ค.</p>
|
|
191
|
+
</div>
|
|
192
|
+
</li>
|
|
193
|
+
</ol>
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
<!-- track 3 ยท Codex -->
|
|
197
|
+
<div class="track">
|
|
198
|
+
<div class="track__head">
|
|
199
|
+
<span class="track__tag">3 ยท Codex</span>
|
|
200
|
+
<h3>CareerMate ํด๋์์ ํ ๋ฌธ์ฅ์ผ๋ก</h3>
|
|
201
|
+
<p>๋ฃจํธ <code>AGENTS.md</code>๊ฐ ์ค์น ์๋ด ์ญํ ์ ํฉ๋๋ค. ํด๋๋ฅผ ์ด๊ณ ๊ฐ์ ๋ฌธ์ฅ์ ๋งํ์ธ์.</p>
|
|
202
|
+
</div>
|
|
203
|
+
<ol class="steps">
|
|
204
|
+
<li class="step">
|
|
205
|
+
<div class="step__no">1</div>
|
|
206
|
+
<div class="step__body">
|
|
207
|
+
<h3>CareerMate ํด๋์์ Codex ์ด๊ธฐ</h3>
|
|
208
|
+
<p>CareerMate ํด๋์์ <code>codex</code>๋ฅผ ์คํํ ๋ค, ์๋ ๋ฌธ์ฅ์ ๊ทธ๋๋ก ์
๋ ฅํฉ๋๋ค. Codex๊ฐ <code>INSTALL.md</code>๋ฅผ ๋ฐ๋ผ ๋ฑ๋ก๊น์ง ์งํํฉ๋๋ค.</p>
|
|
209
|
+
<div class="code">
|
|
210
|
+
<button class="copy-btn" type="button" data-copy-target="code-prompt-codex">๋ณต์ฌ</button>
|
|
211
|
+
<pre id="code-prompt-codex">CareerMate๋ฅผ ์ค์นํ๊ณ ์ค์ ํด์ค. INSTALL.md๋ฅผ ๋ฐ๋ผ ์งํํด์ค.</pre>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
</li>
|
|
215
|
+
<li class="step">
|
|
216
|
+
<div class="step__no">2</div>
|
|
217
|
+
<div class="step__body">
|
|
218
|
+
<h3><code>/mcp</code>๋ก ํ์ธ</h3>
|
|
219
|
+
<p>Codex ์์์ <code>/mcp</code> ๋ช
๋ น์ผ๋ก <code>careermate</code>๊ฐ ๋ฑ๋ก๋๋์ง ํ์ธํ๊ณ , <strong>โ<code>get_onboarding_status</code> ํธ์ถํด์ ์ฐ๊ฒฐ๋๋์ง ํ์ธํด์คโ</strong>๋ก ์ ๊ฒํฉ๋๋ค.</p>
|
|
220
|
+
</div>
|
|
221
|
+
</li>
|
|
222
|
+
</ol>
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
<!-- track ยท ๊ธฐํ MCP ํด๋ผ์ด์ธํธ (ํฐ๋ฏธ๋) -->
|
|
226
|
+
<div class="track" id="install-other">
|
|
227
|
+
<div class="track__head">
|
|
228
|
+
<span class="track__tag">๊ธฐํ MCP ํด๋ผ์ด์ธํธ ยท ํฐ๋ฏธ๋</span>
|
|
229
|
+
<h3>Cursor ๋ฑ โ ์ง์ ๋ฑ๋ก</h3>
|
|
230
|
+
<p>Cursor ยท Cline ยท Windsurf ๋ฑ ๋ค๋ฅธ ๋ก์ปฌ stdio MCP ํด๋ผ์ด์ธํธ๋ ํฐ๋ฏธ๋์์ ์ง์ ์ค์นยท๋ฑ๋กํฉ๋๋ค.</p>
|
|
231
|
+
</div>
|
|
232
|
+
|
|
233
|
+
<div class="note">
|
|
234
|
+
<strong>์ค๋น๋ฌผ์ Node.js 22.5 ์ด์</strong> ํ๋๋ฟ์
๋๋ค. ๋ด์ฅ SQLite๋ฅผ ์ฐ๋ฏ๋ก ๋ณ๋ ์ปดํ์ผ๋ฌยท๋น๋ ๋๊ตฌ๊ฐ ํ์ ์์ต๋๋ค.
|
|
235
|
+
ํฐ๋ฏธ๋(Windows๋ PowerShell)์์ <code>node --version</code>์ผ๋ก ํ์ธํ๊ณ , ๋ฎ์ผ๋ฉด
|
|
236
|
+
<a href="https://nodejs.org/" rel="noopener" target="_blank">nodejs.org</a>์์ LTS๋ฅผ ์ค์นํ์ธ์.
|
|
237
|
+
</div>
|
|
238
|
+
|
|
239
|
+
<ol class="steps">
|
|
240
|
+
<li class="step">
|
|
241
|
+
<div class="step__no">1</div>
|
|
242
|
+
<div class="step__body">
|
|
243
|
+
<h3>์ฝ๋ ๋ฐ๊ธฐ</h3>
|
|
244
|
+
<p>CareerMate ์ ์ฅ์๋ฅผ ๋ด๋ ค๋ฐ์ต๋๋ค. (Git์ด ์์ผ๋ฉด <em>Code โ Download ZIP</em>์ผ๋ก ๋ฐ์ ์์ถ์ ํ์ด๋ ๋ฉ๋๋ค.)</p>
|
|
245
|
+
<!-- ์ ์ฅ์(osntak/CareerMate)๋ ํ์ฌ ๋น๊ณต๊ฐ๋ผ clone์ ์ ๊ทผ ๊ถํ์ด ํ์ํฉ๋๋ค. ๊ถํ์ด ์์ผ๋ฉด ์ npx ๋ฐฉ์์ ์ฐ์ธ์. -->
|
|
246
|
+
<div class="code">
|
|
247
|
+
<button class="copy-btn" type="button" data-copy-target="code-clone">๋ณต์ฌ</button>
|
|
248
|
+
<pre id="code-clone">git clone https://github.com/osntak/CareerMate.git
|
|
249
|
+
cd CareerMate</pre>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
</li>
|
|
253
|
+
<li class="step">
|
|
254
|
+
<div class="step__no">2</div>
|
|
255
|
+
<div class="step__body">
|
|
256
|
+
<h3>์ค์น</h3>
|
|
257
|
+
<p>์์กด์ฑ์ ํ ๋ฒ๋ง ์ค์นํฉ๋๋ค. (๋น๋ ๋จ๊ณ ์์) โ ๋๋ ํด๋ก ์์ด <strong><code>npx -y careermate init</code></strong> ํ ์ค๋ก๋ ๋ฑ๋ก๋ฉ๋๋ค(<code>careermate</code> npm ๊ฒ์ ์๋ฃ).</p>
|
|
258
|
+
<div class="code">
|
|
259
|
+
<span class="code__label">ํ๋ก์ ํธ ํด๋์์</span>
|
|
260
|
+
<button class="copy-btn" type="button" data-copy-target="code-install">๋ณต์ฌ</button>
|
|
261
|
+
<pre id="code-install">npm install</pre>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
</li>
|
|
265
|
+
<li class="step">
|
|
266
|
+
<div class="step__no">3</div>
|
|
267
|
+
<div class="step__body">
|
|
268
|
+
<h3>AI ํด๋ผ์ด์ธํธ์ ์๋ ์ฐ๊ฒฐ</h3>
|
|
269
|
+
<p>๊ฐ์ง๋ ํด๋ผ์ด์ธํธ์ MCP ์ค์ ์ CareerMate๋ฅผ ์๋ ๋ฑ๋กํ๊ณ , Claude Code ํ๋ก์ ํธ ์ค์ (<code>.mcp.json</code>)์ ํญ์ ํจ๊ป ์์ฑํฉ๋๋ค. ๋๋๋ฉด ํด๋น AI ํด๋ผ์ด์ธํธ๋ฅผ <strong>์์ ํ ์ข
๋ฃํ๋ค ๋ค์ ์ผ์ธ์.</strong></p>
|
|
270
|
+
<div class="code">
|
|
271
|
+
<span class="code__label">์๋ ๋ฑ๋ก</span>
|
|
272
|
+
<button class="copy-btn" type="button" data-copy-target="code-init">๋ณต์ฌ</button>
|
|
273
|
+
<pre id="code-init">npm run init</pre>
|
|
274
|
+
</div>
|
|
275
|
+
<p class="step__tip">์ง์ ๋ถ์ฌ๋ฃ๊ณ ์ถ๋ค๋ฉด <code>npm run init -- --print</code>๋ก ์ค์ JSONยท๋ช
๋ น๋ง ์ถ๋ ฅํด ํด๋ผ์ด์ธํธ์ ์ถ๊ฐํ์ธ์. ํน์ ํด๋ผ์ด์ธํธ๋ง ๋ฑ๋กํ๋ ค๋ฉด <code>npm run init -- --client cursor</code>์ฒ๋ผ ์ง์ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ณ ์ค์ ํ์ผ ์์น๋ ์๋ ํญ์ ์ฐธ๊ณ ํ์ธ์.</p>
|
|
276
|
+
|
|
277
|
+
<div class="tabs" role="tablist" aria-label="์ค์ ํ์ผ ์์น">
|
|
278
|
+
<button class="tab is-active" id="tab-claude" role="tab" aria-controls="panel-claude" aria-selected="true">Claude Desktop</button>
|
|
279
|
+
<button class="tab" id="tab-cursor" role="tab" aria-controls="panel-cursor" aria-selected="false" tabindex="-1">Cursor / ๊ธฐํ</button>
|
|
280
|
+
</div>
|
|
281
|
+
<div class="panel" id="panel-claude" role="tabpanel" aria-labelledby="tab-claude" data-active="true">
|
|
282
|
+
<p class="path-note">Windows: <code>%APPDATA%\Claude\claude_desktop_config.json</code> ยท macOS: <code>~/Library/Application Support/Claude/claude_desktop_config.json</code><br />(Settings โ Developer โ Edit Config ๋ก๋ ์ด ์ ์์ต๋๋ค. <code>npm run init</code>์ด ์ด ํ์ผ์ ์๋์ผ๋ก ์์ ํฉ๋๋ค.)</p>
|
|
283
|
+
</div>
|
|
284
|
+
<div class="panel" id="panel-cursor" role="tabpanel" aria-labelledby="tab-cursor" data-active="false" hidden>
|
|
285
|
+
<p class="path-note">ํ๋ก์ ํธ๋ณ: <code>.cursor/mcp.json</code> ยท ์ ์ญ: <code>~/.cursor/mcp.json</code> โ CursorยทClineยทWindsurf ๋ฑ ๋๋ถ๋ถ ๊ฐ์ ํ์์
๋๋ค. ์ถ๊ฐ ํ ํด๋ผ์ด์ธํธ๋ฅผ ๋ค์ ์์ํ์ธ์.</p>
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
</li>
|
|
289
|
+
<li class="step">
|
|
290
|
+
<div class="step__no">4</div>
|
|
291
|
+
<div class="step__body">
|
|
292
|
+
<h3>๋์๋ณด๋ ์คํ (์ ํ)</h3>
|
|
293
|
+
<p>๋ด ๋ฐ์ดํฐ๋ฅผ ๋์ผ๋ก ํ์ธํ๋ ค๋ฉด ๋์๋ณด๋๋ฅผ ์ผญ๋๋ค. ๊ธฐ๋ณธ ์ฃผ์๋ <code>http://127.0.0.1:4319</code>, ํฌํธ๊ฐ ์ฌ์ฉ ์ค์ด๋ฉด ๋ค์ ๋น ํฌํธ๋ก ๋์ด๊ฐ๋๋ค. ์ข
๋ฃ๋ <kbd>Ctrl</kbd>+<kbd>C</kbd>.</p>
|
|
294
|
+
<div class="code">
|
|
295
|
+
<span class="code__label">๋์๋ณด๋ ์์</span>
|
|
296
|
+
<button class="copy-btn" type="button" data-copy-target="code-start">๋ณต์ฌ</button>
|
|
297
|
+
<pre id="code-start">npm start</pre>
|
|
298
|
+
</div>
|
|
299
|
+
</div>
|
|
300
|
+
</li>
|
|
301
|
+
<li class="step">
|
|
302
|
+
<div class="step__no">5</div>
|
|
303
|
+
<div class="step__body">
|
|
304
|
+
<h3>์ฐ๊ฒฐ ํ์ธ</h3>
|
|
305
|
+
<p>AI์๊ฒ <strong>โ<code>get_onboarding_status</code>๋ฅผ ํธ์ถํด์ ์ฐ๊ฒฐ๋๋์ง ํ์ธํด์คโ</strong>๋ผ๊ณ ๋งํด ๋ณด์ธ์. ๊ฒฐ๊ณผ๊ฐ ๋์์ค๋ฉด ์ ์์
๋๋ค.</p>
|
|
306
|
+
</div>
|
|
307
|
+
</li>
|
|
308
|
+
</ol>
|
|
309
|
+
|
|
310
|
+
<details class="acc">
|
|
311
|
+
<summary>๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ <span class="acc__hint">ํฌํธ ์ถฉ๋ ยท MCP ์ฐ๊ฒฐ ์คํจ ยท ๋ฐ์ดํฐ ์์น ยท ์ด๊ธฐํ</span></summary>
|
|
312
|
+
<div class="acc__body">
|
|
313
|
+
<div class="trouble">
|
|
314
|
+
<div class="trouble__item">
|
|
315
|
+
<h4>ํฌํธ๊ฐ ์ด๋ฏธ ์ฌ์ฉ ์ค</h4>
|
|
316
|
+
<p>4319๊ฐ ๋งํ๋ฉด ์๋์ผ๋ก ๋ค์ ๋น ํฌํธ๋ก ์ฎ๊ฒจ๊ฐ๋๋ค. ํฐ๋ฏธ๋์ ์ถ๋ ฅ๋ ์ค์ ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, <code>CAREERMATE_PORT</code> ํ๊ฒฝ๋ณ์๋ก ๊ณ ์ ํ์ธ์.</p>
|
|
317
|
+
</div>
|
|
318
|
+
<div class="trouble__item">
|
|
319
|
+
<h4>AI์ MCP๊ฐ ์ฐ๊ฒฐ๋์ง ์์</h4>
|
|
320
|
+
<p>โ <code>npm run init</code>์ด ์ ์ ์ข
๋ฃ๋๋์ง โก <code>node --version</code>์ด 22.5 ์ด์์ธ์ง โข ํด๋ผ์ด์ธํธ๋ฅผ <strong>์์ ํ ์ข
๋ฃ ํ ์ฌ์์</strong>ํ๋์ง โฃ <code>npm install</code>์ด ๋๋ฌ๋์ง ํ์ธํ์ธ์. ํด๋๋ฅผ ์ฎ๊ธฐ๊ฑฐ๋ ์ด๋ฆ์ ๋ฐ๊ฟจ๋ค๋ฉด ๋ฑ๋ก๋ ๊ฒฝ๋ก๊ฐ ๊นจ์ง๋ฏ๋ก <code>npm run init</code>์ ๋ค์ ์คํํ์ธ์.</p>
|
|
321
|
+
</div>
|
|
322
|
+
<div class="trouble__item">
|
|
323
|
+
<h4>์ํ ์ ๊ฒ</h4>
|
|
324
|
+
<p>ํ๋ก์ ํธ ํด๋์์ ์ง๋จ์ ์คํํ๋ฉด Node ๋ฒ์ ยท๋ฐ์ดํฐ ํด๋ยทDB ์ํ๋ฅผ ์ ๊ฒํฉ๋๋ค.</p>
|
|
325
|
+
<div class="code">
|
|
326
|
+
<button class="copy-btn" type="button" data-copy-target="code-doctor">๋ณต์ฌ</button>
|
|
327
|
+
<pre id="code-doctor">npm run doctor</pre>
|
|
328
|
+
</div>
|
|
329
|
+
</div>
|
|
330
|
+
<div class="trouble__item">
|
|
331
|
+
<h4>๋ฐ์ดํฐ ์์น / ์ด๊ธฐํ</h4>
|
|
332
|
+
<p>๊ธฐ๋ณธ ์์น๋ <code>~/.careermate/careermate.sqlite</code>(Windows: <code>%USERPROFILE%\.careermate</code>). <code>CAREERMATE_DATA_DIR</code>๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ. <code>npm run migrate</code>๋ DB๋ฅผ ์ค๋น/์
๊ทธ๋ ์ด๋(๋ฐ๋ณต ์คํ ์์ )ํ๊ณ , ์์ ์ด๊ธฐํ๋ <code>careermate.sqlite</code> ์ญ์ ํ ์ฌ์คํ(๋ฐฑ์
๊ถ์ฅ)์
๋๋ค.</p>
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
</details>
|
|
337
|
+
</div>
|
|
338
|
+
</section>
|
|
339
|
+
|
|
340
|
+
<!-- ======================================================= privacy -->
|
|
341
|
+
<section id="privacy" class="section">
|
|
342
|
+
<div class="privacy-card">
|
|
343
|
+
<div class="privacy-card__icon" aria-hidden="true">
|
|
344
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/><path d="M9 12l2 2 4-4"/></svg>
|
|
345
|
+
</div>
|
|
346
|
+
<div class="privacy-card__text">
|
|
347
|
+
<h2>๋น์ ์ ๋ฐ์ดํฐ๋ ๋น์ ์ปดํจํฐ๋ฅผ ๋ ๋์ง ์์ต๋๋ค</h2>
|
|
348
|
+
<p>๋์๋ณด๋ ์๋ฒ๋ <code>127.0.0.1</code>(์ด ์ปดํจํฐ)์๋ง ๋ฐ์ธ๋ฉ๋์ด ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๊ณ ,<br />MCP ์๋ฒ๋ ๋คํธ์ํฌ ํธ์ถ์ ํ์ง ์์ต๋๋ค. ๋ถ์ยท๊ธ์ฐ๊ธฐ๋ ๋น์ ์ด ์ง์ ๊ณ ๋ฅธ AI๊ฐ ์ํํฉ๋๋ค.</p>
|
|
349
|
+
<ul class="privacy-card__list">
|
|
350
|
+
<li><strong>์ ์ฅ ์์น</strong> <code>~/.careermate/careermate.sqlite</code></li>
|
|
351
|
+
<li><strong>๋ด๋ณด๋ด๊ธฐ</strong> ์๊ธฐ์๊ฐ์ ๋ฑ์ <code>~/.careermate/exports</code>๋ก</li>
|
|
352
|
+
<li><strong>์ญ์ ยท๊ด๋ฆฌ</strong> ๋์๋ณด๋ <strong>์ค์ (Settings)</strong>์์ ์ง์ </li>
|
|
353
|
+
</ul>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
</section>
|
|
357
|
+
|
|
358
|
+
</main>
|
|
359
|
+
|
|
360
|
+
<footer class="foot">
|
|
361
|
+
<div class="foot__brand"><span class="nav__logo" aria-hidden="true">C</span> CareerMate</div>
|
|
362
|
+
<p>๋ก์ปฌ์์ ๋์ํ๋ MCP ๊ธฐ๋ฐ ์ปค๋ฆฌ์ด ๊ด๋ฆฌ ๋๊ตฌ. ๋ชจ๋ ๋ฐ์ดํฐ๋ ์ด ์ปดํจํฐ์๋ง ์ ์ฅ๋ฉ๋๋ค.</p>
|
|
363
|
+
<div class="foot__links">
|
|
364
|
+
<a href="#top">๋งจ ์๋ก</a>
|
|
365
|
+
<a href="#features">๊ธฐ๋ฅ</a>
|
|
366
|
+
<a href="#install">์ค์น</a>
|
|
367
|
+
</div>
|
|
368
|
+
</footer>
|
|
369
|
+
|
|
370
|
+
<div class="sr-only" role="status" aria-live="polite" id="copy-status"></div>
|
|
371
|
+
|
|
372
|
+
<script>
|
|
373
|
+
(function () {
|
|
374
|
+
'use strict';
|
|
375
|
+
var status = document.getElementById('copy-status');
|
|
376
|
+
|
|
377
|
+
// --- generic clipboard helper ------------------------------------
|
|
378
|
+
function legacyCopy(text) {
|
|
379
|
+
var ta = document.createElement('textarea');
|
|
380
|
+
ta.value = text; ta.setAttribute('readonly', '');
|
|
381
|
+
ta.style.position = 'absolute'; ta.style.left = '-9999px';
|
|
382
|
+
document.body.appendChild(ta); ta.select();
|
|
383
|
+
var ok = false;
|
|
384
|
+
try { ok = document.execCommand('copy'); } catch (e) { ok = false; }
|
|
385
|
+
document.body.removeChild(ta);
|
|
386
|
+
return ok;
|
|
387
|
+
}
|
|
388
|
+
function copyText(text, onok) {
|
|
389
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
390
|
+
navigator.clipboard.writeText(text).then(onok, function () { if (legacyCopy(text)) onok(); });
|
|
391
|
+
} else if (legacyCopy(text)) { onok(); }
|
|
392
|
+
}
|
|
393
|
+
function announce(msg) { if (status) status.textContent = msg; }
|
|
394
|
+
|
|
395
|
+
// --- copy buttons (code blocks) ----------------------------------
|
|
396
|
+
function flashSmall(btn) {
|
|
397
|
+
var original = btn.textContent;
|
|
398
|
+
btn.textContent = '๋ณต์ฌ๋จ'; btn.classList.add('copied');
|
|
399
|
+
announce('ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌ๋์์ต๋๋ค.');
|
|
400
|
+
window.setTimeout(function () { btn.textContent = original; btn.classList.remove('copied'); }, 1600);
|
|
401
|
+
}
|
|
402
|
+
document.querySelectorAll('.copy-btn').forEach(function (btn) {
|
|
403
|
+
btn.addEventListener('click', function () {
|
|
404
|
+
var src = document.getElementById(btn.getAttribute('data-copy-target'));
|
|
405
|
+
if (src) copyText(src.textContent || '', function () { flashSmall(btn); });
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
// --- config tabs -------------------------------------------------
|
|
410
|
+
var tablist = document.querySelector('.tabs[role="tablist"]');
|
|
411
|
+
if (tablist) {
|
|
412
|
+
var tabs = Array.prototype.slice.call(tablist.querySelectorAll('[role="tab"]'));
|
|
413
|
+
function selectTab(tab) {
|
|
414
|
+
tabs.forEach(function (t) {
|
|
415
|
+
var sel = t === tab;
|
|
416
|
+
t.setAttribute('aria-selected', sel ? 'true' : 'false');
|
|
417
|
+
t.classList.toggle('is-active', sel);
|
|
418
|
+
t.tabIndex = sel ? 0 : -1;
|
|
419
|
+
var panel = document.getElementById(t.getAttribute('aria-controls'));
|
|
420
|
+
if (panel) {
|
|
421
|
+
panel.setAttribute('data-active', sel ? 'true' : 'false');
|
|
422
|
+
if (sel) panel.removeAttribute('hidden'); else panel.setAttribute('hidden', '');
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
tabs.forEach(function (tab, i) {
|
|
427
|
+
tab.addEventListener('click', function () { selectTab(tab); });
|
|
428
|
+
tab.addEventListener('keydown', function (e) {
|
|
429
|
+
var idx = null;
|
|
430
|
+
if (e.key === 'ArrowRight') idx = (i + 1) % tabs.length;
|
|
431
|
+
else if (e.key === 'ArrowLeft') idx = (i - 1 + tabs.length) % tabs.length;
|
|
432
|
+
else if (e.key === 'Home') idx = 0;
|
|
433
|
+
else if (e.key === 'End') idx = tabs.length - 1;
|
|
434
|
+
if (idx !== null) { e.preventDefault(); tabs[idx].focus(); selectTab(tabs[idx]); }
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// --- scroll reveal (fade-up on enter) ----------------------------
|
|
440
|
+
var reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
441
|
+
if (!reduceMotion && 'IntersectionObserver' in window) {
|
|
442
|
+
var revealEls = document.querySelectorAll('.section__head, .feature, .check, .track__head, .step, .acc, .privacy-card');
|
|
443
|
+
revealEls.forEach(function (el) { el.classList.add('reveal'); });
|
|
444
|
+
var io = new IntersectionObserver(function (entries) {
|
|
445
|
+
entries.forEach(function (e) {
|
|
446
|
+
if (e.isIntersecting) { e.target.classList.add('is-visible'); io.unobserve(e.target); }
|
|
447
|
+
});
|
|
448
|
+
}, { threshold: 0.1, rootMargin: '0px 0px -48px 0px' });
|
|
449
|
+
revealEls.forEach(function (el) { io.observe(el); });
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// --- theme toggle (persist) --------------------------------------
|
|
453
|
+
var root = document.documentElement;
|
|
454
|
+
var toggle = document.getElementById('theme-toggle');
|
|
455
|
+
var saved = null;
|
|
456
|
+
try { saved = window.localStorage.getItem('cf-theme'); } catch (e) {}
|
|
457
|
+
if (saved === 'dark' || saved === 'light') root.setAttribute('data-theme', saved);
|
|
458
|
+
function isDark() {
|
|
459
|
+
var t = root.getAttribute('data-theme');
|
|
460
|
+
if (t === 'dark') return true;
|
|
461
|
+
if (t === 'light') return false;
|
|
462
|
+
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
463
|
+
}
|
|
464
|
+
if (toggle) {
|
|
465
|
+
toggle.addEventListener('click', function () {
|
|
466
|
+
var next = isDark() ? 'light' : 'dark';
|
|
467
|
+
root.setAttribute('data-theme', next);
|
|
468
|
+
try { window.localStorage.setItem('cf-theme', next); } catch (e) {}
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
})();
|
|
472
|
+
</script>
|
|
473
|
+
</body>
|
|
474
|
+
</html>
|