Initial commit: AI platform app (server, views, lib, data, deploy docs)
Made-with: Cursor
This commit is contained in:
22
data/ai-success-stories.json
Normal file
22
data/ai-success-stories.json
Normal file
@@ -0,0 +1,22 @@
|
||||
[
|
||||
{
|
||||
"id": "story-1774520941288",
|
||||
"slug": "jojung-sook-hr-claude-cowork",
|
||||
"title": "인사총무팀 AI 적용 사례",
|
||||
"excerpt": "인사총무팀 조정숙 과장의 AI 업무 혁신 이야기. Claude Cowork 도입, 법인세 인사자료 8시간→4시간, 데이터 오류율 감소.",
|
||||
"author": "조정숙",
|
||||
"department": "인사총무팀",
|
||||
"publishedAt": "2026-03-25",
|
||||
"tags": [
|
||||
"인사총무",
|
||||
"Claude Cowork",
|
||||
"법인세",
|
||||
"OT",
|
||||
"엑셀"
|
||||
],
|
||||
"contentFile": "jojung-sook-hr-claude-cowork.md",
|
||||
"pdfUrl": "/public/resources/ai-success/1774520936441-c8e17615-dad1-4a08-9a26-f6303b666058.pdf",
|
||||
"createdAt": "2026-03-26T10:29:01.288Z",
|
||||
"updatedAt": "2026-03-26T10:29:01.288Z"
|
||||
}
|
||||
]
|
||||
86
data/ax-assignments.json
Normal file
86
data/ax-assignments.json
Normal file
@@ -0,0 +1,86 @@
|
||||
[
|
||||
{
|
||||
"id": "2371e4d4-ac7b-4ae1-bde2-1f9ff67e9d15",
|
||||
"department": "테스트부서",
|
||||
"name": "홍길동",
|
||||
"employeeId": "",
|
||||
"position": "",
|
||||
"phone": "",
|
||||
"email": "",
|
||||
"workProcessDescription": "테스트",
|
||||
"painPoint": "테스트",
|
||||
"currentTimeSpent": "30분",
|
||||
"errorRateBefore": "5%",
|
||||
"collaborationDepts": "",
|
||||
"reasonToSolve": "테스트",
|
||||
"aiExpectation": "테스트",
|
||||
"outputType": "테스트",
|
||||
"automationLevel": "",
|
||||
"dataReadiness": "",
|
||||
"dataLocation": "",
|
||||
"personalInfo": "",
|
||||
"dataQuality": "",
|
||||
"dataCount": "",
|
||||
"dataTypes": null,
|
||||
"timeReduction": "",
|
||||
"errorReduction": "",
|
||||
"volumeIncrease": "",
|
||||
"costReduction": "",
|
||||
"responseTime": "",
|
||||
"otherMetrics": "",
|
||||
"annualSavings": "",
|
||||
"laborReplacement": "",
|
||||
"revenueIncrease": "",
|
||||
"otherEffects": "",
|
||||
"qualitativeEffects": null,
|
||||
"techStack": null,
|
||||
"risks": null,
|
||||
"riskDetail": "",
|
||||
"participationPledge": true,
|
||||
"status": "신청",
|
||||
"createdAt": "2026-03-18T05:11:13.793Z",
|
||||
"updatedAt": "2026-03-18T05:11:13.793Z"
|
||||
},
|
||||
{
|
||||
"id": "a9d59801-1f84-4c0d-ad7e-e8db28fcd003",
|
||||
"department": "테스트부서",
|
||||
"name": "홍길동",
|
||||
"employeeId": "",
|
||||
"position": "",
|
||||
"phone": "",
|
||||
"email": "",
|
||||
"workProcessDescription": "테스트",
|
||||
"painPoint": "테스트",
|
||||
"currentTimeSpent": "30분",
|
||||
"errorRateBefore": "5%",
|
||||
"collaborationDepts": "",
|
||||
"reasonToSolve": "테스트",
|
||||
"aiExpectation": "테스트",
|
||||
"outputType": "테스트",
|
||||
"automationLevel": "",
|
||||
"dataReadiness": "",
|
||||
"dataLocation": "",
|
||||
"personalInfo": "",
|
||||
"dataQuality": "",
|
||||
"dataCount": "",
|
||||
"dataTypes": null,
|
||||
"timeReduction": "",
|
||||
"errorReduction": "",
|
||||
"volumeIncrease": "",
|
||||
"costReduction": "",
|
||||
"responseTime": "",
|
||||
"otherMetrics": "",
|
||||
"annualSavings": "",
|
||||
"laborReplacement": "",
|
||||
"revenueIncrease": "",
|
||||
"otherEffects": "",
|
||||
"qualitativeEffects": null,
|
||||
"techStack": null,
|
||||
"risks": null,
|
||||
"riskDetail": "",
|
||||
"participationPledge": true,
|
||||
"status": "신청",
|
||||
"createdAt": "2026-03-18T05:05:04.467Z",
|
||||
"updatedAt": "2026-03-18T05:05:04.467Z"
|
||||
}
|
||||
]
|
||||
255
data/check-queue.html
Normal file
255
data/check-queue.html
Normal file
@@ -0,0 +1,255 @@
|
||||
<!doctype html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>학습센터</title>
|
||||
<link rel="stylesheet" href="/public/styles.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="app-shell">
|
||||
<aside class="left-nav">
|
||||
<div class="logo">DW</div>
|
||||
<a href="#" class="nav-item">채팅</a>
|
||||
<a href="#" class="nav-item">AI</a>
|
||||
<a href="/" class="nav-item active">학습센터</a>
|
||||
<a href="#" class="nav-item">과제신청</a>
|
||||
<a href="#" class="nav-item">성공사례</a>
|
||||
</aside>
|
||||
|
||||
<div class="content-area">
|
||||
<header class="topbar">
|
||||
<h1>학습센터</h1>
|
||||
<a class="top-action-link" href="#register">강의 등록하기</a>
|
||||
</header>
|
||||
|
||||
<main class="container">
|
||||
<section class="hero panel">
|
||||
<h2>최신 컨텐츠로 학습하고, 바로 업무에 적용하세요.</h2>
|
||||
<p>유튜브 링크 또는 PPT를 등록한 뒤, 목록에서 클릭하여 강의를 시청할 수 있습니다.</p>
|
||||
</section>
|
||||
|
||||
<section class="panel filter-panel">
|
||||
<h2>강의 검색/필터</h2>
|
||||
<form action="/" method="get" class="filter-grid">
|
||||
<label>
|
||||
검색어
|
||||
<input type="text" name="q" value="" placeholder="제목" />
|
||||
</label>
|
||||
<label>
|
||||
타입
|
||||
<select name="type">
|
||||
<option value="all" selected>전체</option>
|
||||
<option value="youtube" >YouTube</option>
|
||||
<option value="ppt" >PPT</option>
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
태그
|
||||
<select name="tag">
|
||||
<option value="">전체</option>
|
||||
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<input type="hidden" name="admin" value="1" />
|
||||
<input type="hidden" name="token" value="test-token" />
|
||||
|
||||
<div class="filter-actions">
|
||||
<button type="submit">필터 적용</button>
|
||||
<a class="link-muted" href="/">초기화</a>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="panel admin-panel">
|
||||
<h2>관리자 모드</h2>
|
||||
|
||||
|
||||
<p class="admin-ok">관리자 모드 활성화됨</p>
|
||||
<div class="queue-status">
|
||||
<span>큐: <b>1</b></span>
|
||||
<span>워커: <b>작동중</b></span>
|
||||
<span>실패 재시도 최대: <b>2</b></span>
|
||||
</div>
|
||||
<div class="queue-status">
|
||||
<span>PPT 썸네일 - 준비완료 <b>0</b></span>
|
||||
<span>처리중 <b>0</b></span>
|
||||
<span>대기 <b>0</b></span>
|
||||
<span>실패 <b>2</b></span>
|
||||
</div>
|
||||
|
||||
<form action="/" method="get" class="admin-inline">
|
||||
<input type="hidden" name="q" value="" />
|
||||
<input type="hidden" name="type" value="all" />
|
||||
<input type="hidden" name="tag" value="" />
|
||||
<input type="hidden" name="page" value="1" />
|
||||
<input type="hidden" name="admin" value="1" />
|
||||
<input type="password" name="token" placeholder="관리자 토큰" />
|
||||
<button type="submit">관리자 활성화</button>
|
||||
</form>
|
||||
|
||||
<form action="/thumbnails/retry-failed" method="post" class="admin-inline">
|
||||
<input type="hidden" name="token" value="test-token" />
|
||||
<input type="hidden" name="returnTo" value="?admin=1&token=test-token" />
|
||||
<button type="submit" class="ghost">실패 썸네일 일괄 재시도</button>
|
||||
</form>
|
||||
|
||||
</section>
|
||||
|
||||
<section id="register" class="panel">
|
||||
<h2>유튜브 강의 등록</h2>
|
||||
<form action="/lectures/youtube" method="post" class="form-grid">
|
||||
<label>
|
||||
제목
|
||||
<input type="text" name="title" required />
|
||||
</label>
|
||||
<label>
|
||||
유튜브 링크
|
||||
<input type="url" name="youtubeUrl" placeholder="https://www.youtube.com/watch?v=..." required />
|
||||
</label>
|
||||
<label class="full">
|
||||
설명
|
||||
<textarea name="description" rows="3" placeholder="강의 설명"></textarea>
|
||||
</label>
|
||||
<label class="full">
|
||||
태그 (쉼표 구분)
|
||||
<input type="text" name="tags" placeholder="예: AI에이전트, 바이브코딩" />
|
||||
</label>
|
||||
<button type="submit">유튜브 강의 등록</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="panel">
|
||||
<h2>PowerPoint 강의 등록</h2>
|
||||
<form action="/lectures/ppt" method="post" enctype="multipart/form-data" class="form-grid">
|
||||
<label>
|
||||
제목
|
||||
<input type="text" name="title" required />
|
||||
</label>
|
||||
<label>
|
||||
PPT 파일(.pptx)
|
||||
<input type="file" name="pptFile" accept=".pptx" required />
|
||||
</label>
|
||||
<label class="full">
|
||||
설명
|
||||
<textarea name="description" rows="3" placeholder="강의 설명"></textarea>
|
||||
</label>
|
||||
<label class="full">
|
||||
태그 (쉼표 구분)
|
||||
<input type="text" name="tags" placeholder="예: 프롬프트, 생성형AI" />
|
||||
</label>
|
||||
<button type="submit">강의 등록</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="panel">
|
||||
<div class="section-head">
|
||||
<h2>등록된 강의</h2>
|
||||
<span class="count-chip">총 2건</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="lecture-grid">
|
||||
|
||||
<article class="lecture-card">
|
||||
<a class="lecture-link" href="/lectures/51ee515c-fff0-4156-97ac-09ec0b412345">
|
||||
<div class="thumb ppt">
|
||||
|
||||
|
||||
<span class="thumb-fallback">썸네일 failed</span>
|
||||
|
||||
<span class="thumb-kicker">PPT 프리뷰</span>
|
||||
<strong>제목 없음</strong>
|
||||
<small>1장</small>
|
||||
|
||||
</div>
|
||||
<div class="badge ppt">
|
||||
PPT
|
||||
</div>
|
||||
<h3>생성형AI, LLM, 에이전틱 AI 이해하기</h3>
|
||||
<p>초기 샘플 PPT 강의</p>
|
||||
<div class="tag-row">
|
||||
|
||||
</div>
|
||||
<small>2026. 3. 14. AM 11:23:13</small>
|
||||
</a>
|
||||
|
||||
<form action="/lectures/51ee515c-fff0-4156-97ac-09ec0b412345/delete" method="post" class="delete-form">
|
||||
<input type="hidden" name="token" value="test-token" />
|
||||
<input type="hidden" name="returnTo" value="?admin=1&token=test-token" />
|
||||
<button type="submit" class="danger">삭제</button>
|
||||
</form>
|
||||
|
||||
<div class="thumb-state-row">
|
||||
<span class="state-chip failed">
|
||||
failed
|
||||
</span>
|
||||
|
||||
<small class="error-text">썸네일 생성 도구 실행 실패 또는 미설치</small>
|
||||
|
||||
</div>
|
||||
<form action="/lectures/51ee515c-fff0-4156-97ac-09ec0b412345/thumbnail/regenerate" method="post" class="delete-form">
|
||||
<input type="hidden" name="token" value="test-token" />
|
||||
<input type="hidden" name="returnTo" value="?admin=1&token=test-token" />
|
||||
<button type="submit" class="ghost">썸네일 재생성</button>
|
||||
</form>
|
||||
|
||||
|
||||
</article>
|
||||
|
||||
<article class="lecture-card">
|
||||
<a class="lecture-link" href="/lectures/4a937c1e-98cb-402f-abd4-497120212974">
|
||||
<div class="thumb ppt">
|
||||
|
||||
|
||||
<span class="thumb-fallback">썸네일 failed</span>
|
||||
|
||||
<span class="thumb-kicker">PPT 프리뷰</span>
|
||||
<strong>제목 없음</strong>
|
||||
<small>12장</small>
|
||||
|
||||
</div>
|
||||
<div class="badge ppt">
|
||||
PPT
|
||||
</div>
|
||||
<h3>claude cowork 가이드</h3>
|
||||
<p>초기 샘플 PPT 강의</p>
|
||||
<div class="tag-row">
|
||||
|
||||
</div>
|
||||
<small>2026. 3. 14. AM 11:23:13</small>
|
||||
</a>
|
||||
|
||||
<form action="/lectures/4a937c1e-98cb-402f-abd4-497120212974/delete" method="post" class="delete-form">
|
||||
<input type="hidden" name="token" value="test-token" />
|
||||
<input type="hidden" name="returnTo" value="?admin=1&token=test-token" />
|
||||
<button type="submit" class="danger">삭제</button>
|
||||
</form>
|
||||
|
||||
<div class="thumb-state-row">
|
||||
<span class="state-chip failed">
|
||||
failed
|
||||
</span>
|
||||
|
||||
<small class="error-text">썸네일 생성 도구 실행 실패 또는 미설치</small>
|
||||
|
||||
</div>
|
||||
<form action="/lectures/4a937c1e-98cb-402f-abd4-497120212974/thumbnail/regenerate" method="post" class="delete-form">
|
||||
<input type="hidden" name="token" value="test-token" />
|
||||
<input type="hidden" name="returnTo" value="?admin=1&token=test-token" />
|
||||
<button type="submit" class="ghost">썸네일 재생성</button>
|
||||
</form>
|
||||
|
||||
|
||||
</article>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
58
data/company-prompts.json
Normal file
58
data/company-prompts.json
Normal file
@@ -0,0 +1,58 @@
|
||||
[
|
||||
{
|
||||
"id": "meeting-summary",
|
||||
"title": "회의 요약",
|
||||
"description": "녹취·메모를 안건·결정사항·액션아이템으로 정리",
|
||||
"tag": "협업",
|
||||
"body": "아래 회의 내용(또는 녹취/메모)을 바탕으로 다음 형식으로 정리해 주세요.\n\n1) 회의 개요: 일시, 참석자(알 수 있는 경우), 목적\n2) 논의 안건별 요약\n3) 결정 사항 (명확한 문장으로)\n4) 액션 아이템 표: 담당 / 기한 / 산출물\n5) 체크리스트 (완료여부 체크)\n\n회의 내용:\n[여기에 붙여넣기]"
|
||||
},
|
||||
{
|
||||
"id": "email-draft",
|
||||
"title": "비즈니스 이메일 초안",
|
||||
"description": "정중하고 간결한 사내·대외 메일 문안",
|
||||
"tag": "커뮤니케이션",
|
||||
"body": "다음 조건에 맞는 비즈니스 이메일 초안을 작성해 주세요.\n\n- 수신자·관계(내부/거래처/고객)\n- 목적(요청, 공지, 사과, 후속, 감사 등)\n- 반드시 포함할 사실·숫자·일정\n- 톤: [격식 있게 / 친근하되 전문적으로]\n\n배경 및 요청 사항:\n[여기에 입력]"
|
||||
},
|
||||
{
|
||||
"id": "report-outline",
|
||||
"title": "보고서·기획안 목차",
|
||||
"description": "경영·프로젝트 보고용 목차와 각 절 요지",
|
||||
"tag": "기획",
|
||||
"body": "다음 주제에 대한 보고서(또는 기획안) 목차를 제안하고, 각 장·절에 2~3문장 수준의 작성 요지를 적어 주세요.\n\n주제:\n[여기에 입력]\n\n대상 독자: [임원 / 팀 / 외부 심사 등]\n분량 느낌: [A4 기준 N페이지 내외]\n\n추가로, Executive Summary에 넣을 핵심 bullet 5개도 제안해 주세요."
|
||||
},
|
||||
{
|
||||
"id": "okr-weekly",
|
||||
"title": "OKR·주간 업무 정리",
|
||||
"description": "목표 대비 진척·리스크·다음 주 계획",
|
||||
"tag": "성과관리",
|
||||
"body": "아래 정보를 바탕으로 주간 업무 정리 형식으로 작성해 주세요.\n\n형식:\n- 이번 주 완료 항목 (OKR 또는 KPI와 연결)\n- 진행 중 / 지연 항목과 사유\n- 리스크·에스컬레이션 필요 사항\n- 다음 주 우선순위 Top 3\n\n원시 메모:\n[여기에 입력]"
|
||||
},
|
||||
{
|
||||
"id": "code-review",
|
||||
"title": "코드 리뷰 요청",
|
||||
"description": "변경 의도·리뷰 포인트를 구조화",
|
||||
"tag": "개발",
|
||||
"body": "다음 코드(또는 PR 설명)를 검토할 때, 리뷰어가 빠르게 이해할 수 있도록 정리해 주세요.\n\n1) 변경 목적·배경\n2) 주요 변경 사항 요약\n3) 리뷰 시 특히 봐 주었으면 하는 부분 (성능, 보안, 가독성, 엣지 케이스)\n4) 테스트 범위·한계\n\n코드/설명:\n[여기에 붙여넣기]"
|
||||
},
|
||||
{
|
||||
"id": "customer-reply",
|
||||
"title": "고객 문의 응대 초안",
|
||||
"description": "클레임·문의에 대한 사실 기반 답변 틀",
|
||||
"tag": "CS",
|
||||
"body": "고객 문의에 대한 응대 초안을 작성해 주세요.\n\n원칙: 사실 관계를 명확히 하고, 과도한 약속은 피하며, 다음 단계와 연락 채널을 제시합니다.\n\n고객 메시지 요지:\n[요약 입력]\n\n사내 확인된 사실:\n[입력]\n\n희망 톤: [공손·단호·공감 중심 등]\n\n답변 초안을 본문과, 내부용 메모(주의사항)로 나누어 주세요."
|
||||
},
|
||||
{
|
||||
"id": "jd-draft",
|
||||
"title": "채용 JD 초안",
|
||||
"description": "직무·자격요건·우대사항을 균형 있게",
|
||||
"tag": "인사",
|
||||
"body": "다음 조건으로 채용 공고(JD) 초안을 작성해 주세요.\n\n- 직무명·조직 맥락\n- 핵심 업무 (5~7 bullet)\n- 필수 자격·경력\n- 우대 사항\n- 근무 방식·복리후생은 플레이스홀더로 표시 가능\n\n입력:\n[채용 배경, 팀 상황, 기술 스택 등]"
|
||||
},
|
||||
{
|
||||
"id": "risk-review",
|
||||
"title": "리스크·의사결정 메모",
|
||||
"description": "안건의 대안·트레이드오프·권고안",
|
||||
"tag": "경영",
|
||||
"body": "다음 의사결정 안건에 대해 내부 공유용 메모를 작성해 주세요.\n\n구성:\n1) 안건 한 줄 요약\n2) 선택지(옵션) A/B/C와 각각의 장단점\n3) 법무·보안·재무·운영 관점 체크리스트 (해당 시)\n4) 권고안과 근거\n5) 의사결정에 필요한 추가 정보\n\n안건 설명:\n[여기에 입력]"
|
||||
}
|
||||
]
|
||||
36
data/lectures.json
Normal file
36
data/lectures.json
Normal file
@@ -0,0 +1,36 @@
|
||||
[
|
||||
{
|
||||
"id": "4a937c1e-98cb-402f-abd4-497120212974",
|
||||
"type": "ppt",
|
||||
"title": "claude cowork 가이드",
|
||||
"description": "초기 샘플 PPT 강의",
|
||||
"fileName": "1773454993461-578d68bd-9486-4ee2-bcea-46d038571a2e.pptx",
|
||||
"originalName": "claude cowork 가이드.pptx",
|
||||
"createdAt": "2026-03-14T02:23:13.463Z",
|
||||
"tags": [],
|
||||
"previewTitle": "제목 없음",
|
||||
"slideCount": 12,
|
||||
"thumbnailUrl": null,
|
||||
"thumbnailStatus": "failed",
|
||||
"thumbnailRetryCount": 3,
|
||||
"thumbnailError": "썸네일 생성 도구 실행 실패 또는 미설치",
|
||||
"thumbnailUpdatedAt": "2026-03-14T02:55:55.126Z"
|
||||
},
|
||||
{
|
||||
"id": "51ee515c-fff0-4156-97ac-09ec0b412345",
|
||||
"type": "ppt",
|
||||
"title": "생성형AI, LLM, 에이전틱 AI 이해하기",
|
||||
"description": "초기 샘플 PPT 강의",
|
||||
"fileName": "1773454993463-3f6f09f5-0d48-4f0f-9a15-2b61adce1ba9.pptx",
|
||||
"originalName": "생성형AI, LLM, 에이전틱 AI 이해하기.pptx",
|
||||
"createdAt": "2026-03-14T02:23:13.466Z",
|
||||
"tags": [],
|
||||
"previewTitle": "제목 없음",
|
||||
"slideCount": 1,
|
||||
"thumbnailUrl": null,
|
||||
"thumbnailStatus": "failed",
|
||||
"thumbnailRetryCount": 3,
|
||||
"thumbnailError": "썸네일 생성 도구 실행 실패 또는 미설치",
|
||||
"thumbnailUpdatedAt": "2026-03-14T02:55:55.141Z"
|
||||
}
|
||||
]
|
||||
1
data/thumbnail-jobs.json
Normal file
1
data/thumbnail-jobs.json
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
||||
Reference in New Issue
Block a user