Initial commit: AI platform app (server, views, lib, data, deploy docs)

Made-with: Cursor
This commit is contained in:
2026-04-03 20:45:17 +09:00
commit da39cfeef9
70 changed files with 17506 additions and 0 deletions

View 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
View 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
View 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&amp;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&amp;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&amp;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&amp;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&amp;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
View 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
View 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
View File

@@ -0,0 +1 @@
[]