careermate 0.1.1 → 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 (71) hide show
  1. package/README.md +12 -10
  2. package/THIRD_PARTY_NOTICES.md +15 -0
  3. package/apps/mcp/src/index.ts +4 -5
  4. package/apps/web/demo/demo-shim.js +536 -0
  5. package/apps/web/demo/demo.css +75 -0
  6. package/apps/web/demo/seed.js +269 -0
  7. package/apps/web/public/app.js +34 -2
  8. package/apps/web/public/index.html +10 -2
  9. package/apps/web/public/lib.js +134 -22
  10. package/apps/web/public/pages/applications.js +2 -9
  11. package/apps/web/public/pages/documents.js +66 -50
  12. package/apps/web/public/pages/home.js +12 -11
  13. package/apps/web/public/pages/interview.js +9 -12
  14. package/apps/web/public/pages/jobs.js +39 -36
  15. package/apps/web/public/pages/profile.js +66 -86
  16. package/apps/web/public/pages/settings.js +15 -10
  17. package/apps/web/public/styles.css +56 -2
  18. package/apps/web/src/http.ts +31 -4
  19. package/apps/web/src/info.ts +3 -3
  20. package/apps/web/src/routes.ts +2 -1
  21. package/apps/web/src/server.ts +1 -4
  22. package/dist/doctor.mjs +72607 -611
  23. package/dist/install-page/.omc/state/agent-replay-55a58c0d-bb6e-43ea-8a05-4b6c93b80b34.jsonl +12 -0
  24. package/dist/install-page/.omc/state/idle-notif-cooldown.json +3 -0
  25. package/dist/install-page/.omc/state/sessions/55a58c0d-bb6e-43ea-8a05-4b6c93b80b34/mission-state.json +147 -0
  26. package/dist/install-page/.omc/state/sessions/55a58c0d-bb6e-43ea-8a05-4b6c93b80b34/pre-tool-advisory-throttle.json +22 -0
  27. package/dist/install-page/.omc/state/sessions/55a58c0d-bb6e-43ea-8a05-4b6c93b80b34/subagent-tracking-state.json +44 -0
  28. package/dist/install-page/index.html +31 -70
  29. package/dist/install-page/landing.js +54 -0
  30. package/dist/install-page/start.html +13 -36
  31. package/dist/install-page/style.css +34 -1
  32. package/dist/mcp.mjs +73936 -1976
  33. package/dist/migrate.mjs +17 -10
  34. package/dist/pdf.worker.min.mjs +28 -0
  35. package/dist/public/app.js +34 -2
  36. package/dist/public/index.html +10 -2
  37. package/dist/public/lib.js +134 -22
  38. package/dist/public/pages/applications.js +2 -9
  39. package/dist/public/pages/documents.js +66 -50
  40. package/dist/public/pages/home.js +12 -11
  41. package/dist/public/pages/interview.js +9 -12
  42. package/dist/public/pages/jobs.js +39 -36
  43. package/dist/public/pages/profile.js +66 -86
  44. package/dist/public/pages/settings.js +15 -10
  45. package/dist/public/styles.css +56 -2
  46. package/dist/web.mjs +39631 -244
  47. package/docs/ARCHITECTURE.md +5 -5
  48. package/docs/DECISIONS.md +1 -1
  49. package/docs/DEMO.md +3 -3
  50. package/docs/MCP_TOOLS.md +49 -9
  51. package/docs/ROADMAP.md +8 -7
  52. package/docs/START_WORKFLOW.md +13 -7
  53. package/docs/TODO.md +1 -1
  54. package/docs/WORKFLOWS.md +7 -5
  55. package/docs/superpowers/specs/2026-06-16-demo-dashboard-deploy-design.md +64 -0
  56. package/package.json +6 -2
  57. package/packages/db/src/paths.ts +11 -0
  58. package/packages/mcp-tools/src/bridge.ts +55 -32
  59. package/packages/mcp-tools/src/index.ts +9 -0
  60. package/packages/mcp-tools/src/tools.ts +193 -70
  61. package/packages/mcp-tools/src/update.ts +330 -0
  62. package/packages/parsers/src/documents.ts +521 -0
  63. package/packages/parsers/src/index.ts +8 -5
  64. package/packages/prompts/src/onboarding.ts +2 -2
  65. package/packages/shared/src/build-info.ts +22 -0
  66. package/packages/shared/src/index.ts +1 -0
  67. package/packages/shared/src/schemas.ts +24 -3
  68. package/packages/workflows/src/definitions.ts +4 -2
  69. package/scripts/build-demo.mjs +130 -0
  70. package/scripts/build-dist.mjs +20 -1
  71. package/scripts/doctor.ts +16 -3
@@ -155,6 +155,13 @@ h1,h2,h3,h4 { margin: 0; font-weight: 650; letter-spacing: -0.01em; }
155
155
  .topbar__title { font-size: 15px; font-weight: 650; }
156
156
  .topbar__crumb { color: var(--text-tertiary); }
157
157
  .topbar__spacer { flex: 1; }
158
+ /* mobile nav: hamburger (hidden ≥900px) + off-canvas drawer scrim */
159
+ .nav-toggle { display: none; width: 34px; height: 34px; flex: none; place-items: center;
160
+ border: 1px solid var(--border); background: var(--surface); border-radius: var(--radius-sm);
161
+ color: var(--text-secondary); cursor: pointer; margin-right: 4px; }
162
+ .nav-toggle:hover { background: var(--surface-hover); color: var(--text); }
163
+ .nav-toggle svg { width: 20px; height: 20px; }
164
+ .nav-scrim { display: none; position: fixed; inset: 0; z-index: 40; background: rgba(0,0,0,.4); }
158
165
  .view { padding: 24px; max-width: var(--maxw); width: 100%; margin: 0 auto; }
159
166
  .view--wide { max-width: 1280px; }
160
167
 
@@ -168,7 +175,16 @@ h1,h2,h3,h4 { margin: 0; font-weight: 650; letter-spacing: -0.01em; }
168
175
  .grid--2 { grid-template-columns: repeat(2, 1fr); }
169
176
  .grid--3 { grid-template-columns: repeat(3, 1fr); }
170
177
  .grid--4 { grid-template-columns: repeat(4, 1fr); }
171
- @media (max-width: 900px){ .grid--2,.grid--3,.grid--4{ grid-template-columns: 1fr; } .app{ grid-template-columns: 1fr; } .sidebar{ display:none; } }
178
+ @media (max-width: 900px){
179
+ .grid--2,.grid--3,.grid--4{ grid-template-columns: 1fr; }
180
+ .app{ grid-template-columns: 1fr; }
181
+ /* sidebar slides in as an off-canvas drawer; the topbar hamburger toggles it */
182
+ .sidebar{ position: fixed; top: 0; left: 0; bottom: 0; height: 100%; z-index: 50;
183
+ transform: translateX(-100%); transition: transform .22s ease; box-shadow: var(--shadow-lg); }
184
+ .app.nav-open .sidebar{ transform: none; }
185
+ .app.nav-open .nav-scrim{ display: block; }
186
+ .nav-toggle{ display: inline-grid; }
187
+ }
172
188
 
173
189
  /* ----------------------------------------------------------------- card */
174
190
  .card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
@@ -229,7 +245,14 @@ h1,h2,h3,h4 { margin: 0; font-weight: 650; letter-spacing: -0.01em; }
229
245
  background: var(--surface); border: 1px solid var(--border-strong); border-radius: var(--radius-sm);
230
246
  padding: 8px 11px; transition: border-color .12s, box-shadow .12s;
231
247
  }
232
- .input:focus, .textarea:focus, .select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
248
+ .input:focus, .textarea:focus, .select:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
249
+ /* keyboard focus must be clearly visible (the soft ring alone fails WCAG 1.4.11/2.4.11) */
250
+ .input:focus-visible, .textarea:focus-visible, .select:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; box-shadow: none; }
251
+ /* skip link — hidden until focused, then drops into the top-left */
252
+ .skip-link { position: fixed; top: 8px; left: 8px; z-index: 200; transform: translateY(-200%);
253
+ background: var(--accent); color: var(--text-on-accent); padding: 8px 14px; border: 0;
254
+ border-radius: var(--radius-sm); font: inherit; font-weight: 600; cursor: pointer; transition: transform .15s; }
255
+ .skip-link:focus { transform: none; outline: 2px solid var(--text-on-accent); outline-offset: 2px; }
233
256
  .textarea { resize: vertical; min-height: 90px; line-height: 1.6; }
234
257
  .textarea--lg { min-height: 280px; font-size: 15px; }
235
258
  .input::placeholder, .textarea::placeholder { color: var(--text-tertiary); }
@@ -268,6 +291,9 @@ h1,h2,h3,h4 { margin: 0; font-weight: 650; letter-spacing: -0.01em; }
268
291
  .table tbody tr.is-clickable:hover { background: var(--surface-hover); }
269
292
  .table .muted { color: var(--text-tertiary); }
270
293
  .table .strong { font-weight: 600; }
294
+ /* keyboard-reachable lead-cell link that looks identical to plain text */
295
+ .cell-link { color: inherit; text-decoration: none; }
296
+ .cell-link:hover { text-decoration: none; }
271
297
 
272
298
  /* ----------------------------------------------------------------- progress */
273
299
  .progress { height: 7px; background: var(--bg-sunken); border-radius: 999px; overflow: hidden; }
@@ -390,6 +416,9 @@ h1,h2,h3,h4 { margin: 0; font-weight: 650; letter-spacing: -0.01em; }
390
416
  .modal__head { padding: 16px 20px; border-bottom: 1px solid var(--border); display: flex; align-items: center; }
391
417
  .modal__head h3 { font-size: 15px; }
392
418
  .modal__body { padding: 20px; overflow-y: auto; }
419
+ .modal__error { margin: 0 20px 4px; padding: 10px 12px; border-radius: var(--radius); border: 1px solid var(--red-border);
420
+ background: var(--red-soft); color: var(--red); font-size: 13px; line-height: 1.5; }
421
+ .modal__error[hidden] { display: none; }
393
422
  .modal__foot { padding: 14px 20px; border-top: 1px solid var(--border); display: flex; justify-content: flex-end; gap: 8px; }
394
423
  @keyframes pop { from { transform: translate(-50%,-46%); opacity: 0; } to { transform: translate(-50%,-50%); opacity: 1; } }
395
424
  @keyframes fade { from { opacity: 0; } to { opacity: 1; } }
@@ -426,6 +455,7 @@ h1,h2,h3,h4 { margin: 0; font-weight: 650; letter-spacing: -0.01em; }
426
455
  .skeleton { background: linear-gradient(90deg, var(--bg-sunken) 25%, var(--surface-hover) 37%, var(--bg-sunken) 63%); background-size: 400% 100%; animation: shimmer 1.4s infinite; border-radius: 6px; }
427
456
  @keyframes shimmer { 0% { background-position: 100% 0; } 100% { background-position: 0 0; } }
428
457
  .hide { display: none !important; }
458
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
429
459
 
430
460
  /* score color helper */
431
461
  .score-strong { color: var(--green); } .score-mid { color: var(--amber); } .score-weak { color: var(--red); }
@@ -437,3 +467,27 @@ h1,h2,h3,h4 { margin: 0; font-weight: 650; letter-spacing: -0.01em; }
437
467
  .callout--privacy svg { color: var(--text-tertiary); }
438
468
  .callout__title { font-weight: 600; margin-bottom: 2px; }
439
469
  .callout__body { color: var(--text-secondary); font-size: 13px; }
470
+
471
+ /* ----------------------------------------------------------------- phone layout */
472
+ /* Placed last so these win over the base widths (media queries add no specificity). */
473
+ @media (max-width: 640px){
474
+ .topbar{ padding: 0 12px; gap: 8px; }
475
+ /* title takes the room between hamburger and actions and truncates instead of
476
+ collapsing to vertical text; the flex spacer isn't needed at this width */
477
+ .topbar__title{ flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
478
+ .topbar__spacer{ display: none; }
479
+ .input--inline{ width: 110px; max-width: 32vw; }
480
+ .view{ padding: 16px; }
481
+ /* jobs table: drop the secondary 위치·마감일 column so 회사·직무·적합도·상태 all fit */
482
+ .table--jobs th:nth-child(2), .table--jobs td:nth-child(2){ display: none; }
483
+ /* keep the 적합도 score ("88점") on one line in the narrow column */
484
+ .table--jobs th:nth-child(3), .table--jobs td:nth-child(3){ white-space: nowrap; }
485
+ .table--jobs td:nth-child(3) .tnum{ font-size: 13px; }
486
+ /* any remaining wide table can still scroll instead of crushing columns */
487
+ .table-scroll{ overflow-x: auto; -webkit-overflow-scrolling: touch; }
488
+ /* stack key/value so long emails·paths·URLs aren't clipped by the fixed label column */
489
+ .kv{ grid-template-columns: 1fr; gap: 0; }
490
+ .kv dt{ margin-top: 10px; }
491
+ .kv dd{ margin: 0 0 2px; }
492
+ .page-head{ flex-wrap: wrap; }
493
+ }