AX 과제 - 1 → AX 강의 - 1 폴더명 변경 및 강의형 산출물 추가

Made-with: Cursor
This commit is contained in:
dsyoon
2026-02-26 09:55:10 +09:00
parent b0a2b0eec4
commit c0c486bc86
87 changed files with 10359 additions and 520 deletions

View File

@@ -0,0 +1,29 @@
너는 기업 AX 전환 교육용 PPT를 설계하는 교육 콘텐츠 디자이너다.
주제(폴더명/PPT 제목): 엑셀 함수 몰라도 괜찮아 - 말로 하는 데이터 분석
구분: 데이터 활용
요청(시드 프롬프트):
"비전공자를 위한 AI 데이터 분석"을 주제로 해줘. 복잡한 코딩 없이 자연어로 그래프를 그리고 인사이트를 뽑아내는 과정을 시연하듯 구성해줘. '누구나 할 수 있다'는 자신감을 주는 쉬운 용어로 작성해줘.
목표:
- 리더십부터 실무자까지 "왜 이 주제를 이해해야 하는지"를 먼저 설득한다.
- 30분 교육으로 진행 가능하도록 구성한다.
- 최소 20장 이상(권장 22장) 슬라이드가 나오도록 한다.
- 예시(상황/결과/체크리스트/사례)가 풍부해야 한다.
- 발표자가 그대로 읽어도 자연스럽도록 슬라이드 흐름(도입→핵심→사례→리스크→정리)을 만든다.
- 발표 중 **참여형 활동 없이 진행한다.** (참여자에게 '직접 해보라'는 지시 금지)
- 프롬프트/템플릿은 "참고 예시"로만 제시하고, 단계별 따라하기 구성은 만들지 않는다.
출력 형식(반드시 준수):
- 최종 출력은 JSON 한 덩어리만 출력한다. (설명/문장/코드블록 금지)
- JSON은 아래 스키마를 만족해야 한다: slides.schema.json
- slides[0]은 반드시 type="cover"로 둔다. (표지는 meta.title/meta.subtitle/meta.badge로 자동 생성됨)
- 슬라이드 타입은 다음만 사용한다:
- cover, agenda, section, bullets, two_column, process, table
작성 규칙:
- bullets는 4~7개 내로, 한 줄은 60자 내로.
- 별도의 prompt(코드블록) 슬라이드를 만들지 않는다. (참여형 활동 유도로 오해될 수 있음)
- table 슬라이드는 열 3~4개, 행 3~6개 정도로 간결하게.
- 보안/윤리/환각 등 리스크가 있는 주제는 "Do & Don't" 또는 "리스크/완화"를 반드시 포함한다.
- 마지막은 요약 + 다음 행동(오늘부터 1개 실행)으로 끝낸다.

View File

@@ -0,0 +1,17 @@
from __future__ import annotations
import subprocess
import sys
from pathlib import Path
def main() -> None:
base = Path(__file__).resolve().parent
common = base.parent / "_common" / "make_ppt.py"
spec = base / "slides.json"
out = base / f"{base.name}.pptx"
subprocess.check_call([sys.executable, str(common), "--spec", str(spec), "--out", str(out)])
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,112 @@
{
"meta": {
"title": "예시 - 강의형(참여형 활동 없음)",
"subtitle": "AX 전환 교육 (30분 / 20+ Slides)",
"badge": "예시 트랙",
"duration_minutes": 30,
"audience": "리더십 + 실무자",
"tone": "명확하고 실용적, 예시 중심",
"footer_left": "AX 전환 교육 | 2026.02"
},
"slides": [
{
"type": "cover",
"notes": "오프닝: 오늘은 참여형 활동 없이, 사례/체크리스트 중심으로 진행합니다."
},
{
"type": "agenda",
"title": "오늘의 흐름 (30분)",
"items": [
"1) 왜 필요한가",
"2) 핵심 개념/원칙",
"3) 사례로 이해하는 적용 가이드",
"4) 리스크/체크리스트",
"5) 요약 & 다음 행동"
],
"notes": "전체 흐름을 10초로 안내하고 바로 본론으로 들어갑니다."
},
{
"type": "section",
"title": "1. 왜 필요한가",
"subtitle": "리더십부터 실무자까지",
"notes": "리더 관점(성과/리스크)과 실무 관점(시간/품질)을 연결해 설명합니다."
},
{
"type": "bullets",
"chapter": "Part 1",
"title": "기대 효과(정량/정성)",
"bullets": [
"시간 절감(반복 업무)",
"품질 표준화(템플릿)",
"리스크 감소(검증/승인)",
"온보딩 가속",
"의사결정 리드타임 단축"
],
"notes": "조직 사례가 있다면 1개만 붙여 설득력을 높입니다."
},
{
"type": "section",
"title": "2. 핵심 개념과 원칙",
"subtitle": "이것만 지키면 실패 확률이 줄어든다",
"notes": "핵심 개념은 3~6개로 제한하고, 각각 1문장으로 정의합니다."
},
{
"type": "two_column",
"chapter": "Part 2",
"title": "오해 vs 현실",
"left_title": "오해",
"left_bullets": ["AI는 만능", "한 번 도입하면 끝"],
"right_title": "현실",
"right_bullets": ["사람 검증이 필수", "운영/거버넌스가 성패를 좌우"],
"notes": "오해를 정리한 뒤, 현실 기준을 '팀 표준'으로 제시합니다."
},
{
"type": "process",
"chapter": "Part 3",
"title": "적용 루틴(강의형 가이드)",
"steps": [
"목표/대상/제약 정의",
"입력 데이터 정리",
"출력 형식 지정",
"검증/리스크 체크",
"공유/표준화",
"지표로 개선"
],
"notes": "참여자에게 '지금 해보라'가 아니라, 기준과 사례를 설명합니다."
},
{
"type": "table",
"chapter": "Part 3",
"title": "Before / After (예시)",
"columns": ["업무", "기존", "개선", "절감"],
"rows": [
["회의록", "40분", "12분", "28분"],
["메일", "20분", "5분", "15분"],
["보고 1p", "60분+", "20분", "40분"]
],
"notes": "표는 정의/기간을 같이 확인하며 읽습니다."
},
{
"type": "two_column",
"chapter": "Part 4",
"title": "리스크와 완화",
"left_title": "리스크",
"left_bullets": ["환각/오류", "보안/기밀", "품질 편차", "운영 장애"],
"right_title": "완화",
"right_bullets": ["원문 대조", "입력 금지/가명화", "승인/리뷰", "로그/모니터링"],
"notes": "리스크는 '기술'이 아니라 '프로세스'로 줄입니다."
},
{
"type": "bullets",
"chapter": "Part 5",
"title": "요약 & 다음 행동",
"bullets": [
"목적·맥락·형식 + 검증",
"작게 시작해 표준화",
"지표로 개선",
"오늘 행동: 템플릿 1개를 팀 표준으로 정하기"
],
"notes": "마무리는 '오늘부터 무엇을 할지' 한 문장으로 정리합니다."
}
]
}

View File

@@ -0,0 +1,306 @@
{
"meta": {
"title": "엑셀 함수 몰라도 괜찮아 - 말로 하는 데이터 분석",
"subtitle": "AX 전환 교육 (30분 / 20+ Slides)",
"badge": "데이터 활용 트랙",
"duration_minutes": 30,
"audience": "리더십 + 실무자",
"tone": "명확하고 실용적, 예시 중심",
"footer_left": "AX 전환 교육 | 2026.02"
},
"slides": [
{
"type": "cover",
"notes": "오프닝(10초): 오늘 주제는 '엑셀 함수 몰라도 괜찮아 - 말로 하는 데이터 분석'입니다.\n운영 안내(10초): 오늘은 참여형 활동 없이, 사례와 체크리스트 중심으로 정리합니다.\n목표(10초): 왜 중요한지 → 핵심 원칙 → 사례 해설 → 리스크/대응 → 다음 행동까지 30분에 끝냅니다."
},
{
"type": "agenda",
"title": "오늘의 흐름 (30분)",
"items": [
"1) 왜 필요한가",
"2) 핵심 개념/원칙",
"3) 사례로 이해하는 적용 가이드",
"4) 리스크/체크리스트",
"5) 요약 & 다음 행동"
],
"notes": "전체 구성(20초): 5파트로 진행합니다.\n- 1) 왜 필요한가\n- 2) 핵심 개념/원칙\n- 3) 사례로 이해하는 적용 가이드\n- 4) 리스크/체크리스트\n- 5) 요약 & 다음 행동\n안내(10초): 참여형 활동 없이, 바로 가져가 쓸 수 있는 요약/체크리스트 중심입니다."
},
{
"type": "section",
"title": "1. 왜 이 주제를 이해해야 하나",
"subtitle": "리더십부터 실무자까지",
"notes": "전환(10초): 이제 '1. 왜 이 주제를 이해해야 하나' 파트로 넘어갑니다.\n안내(15초): 핵심 메시지를 먼저 잡고, 사례/체크리스트로 연결하겠습니다."
},
{
"type": "bullets",
"chapter": "Part 1",
"title": "리더십 관점: 왜 중요한가",
"bullets": [
"현장 데이터가 의사결정으로 이어지려면 분석 장벽을 낮춰야 함",
"간단한 분석 자동화로 보고 리드타임이 줄어듦",
"분석 표준(정의/단위/기간)이 중요해짐",
"잘못된 해석(환각/오류)은 리스크",
"데이터 기반 문화는 도구보다 습관"
],
"notes": "핵심(10초): '리더십 관점: 왜 중요한가' 슬라이드입니다.\n포인트(20초): 현장 데이터가 의사결정으로 이어지려면 분석 장벽을 낮춰야 함 / 간단한 분석 자동화로 보고 리드타임이 줄어듦\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "bullets",
"chapter": "Part 1",
"title": "실무자 관점: 무엇이 달라지나",
"bullets": [
"함수/피벗 없이도 ‘질문’으로 시작 가능",
"그래프/요약/이상치 탐지가 빠르게 됨",
"보고서에 넣을 문장까지 자동 초안",
"데이터 정의만 잘 주면 오류가 크게 줄어듦",
"작게 분석 루틴을 만들면 자신감↑"
],
"notes": "핵심(10초): '실무자 관점: 무엇이 달라지나' 슬라이드입니다.\n포인트(20초): 함수/피벗 없이도 ‘질문’으로 시작 가능 / 그래프/요약/이상치 탐지가 빠르게 됨\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "two_column",
"chapter": "Part 1",
"title": "흔한 오해 vs 현실",
"left_title": "오해",
"left_bullets": [
"데이터 분석은 코딩을 해야 한다",
"AI가 알아서 정확히 분석한다",
"데이터가 조금만 있어도 인사이트가 나온다",
"그래프는 전문가 영역이다"
],
"right_title": "현실",
"right_bullets": [
"질문(목표/정의/기간)이 핵심",
"AI는 오류 가능: 검증이 필요",
"데이터 품질/정의가 결과를 좌우",
"기본 차트는 누구나 만들 수 있다"
],
"notes": "의도(10초): 좌/우 대비로 메시지를 빠르게 정렬합니다.\n정리(10초): 오른쪽(권장/현실/완화) 기준으로 팀 표준을 잡는 것이 목표입니다."
},
{
"type": "bullets",
"chapter": "Part 1",
"title": "기대 효과(정량/정성)",
"bullets": [
"리포트 초안 작성 시간 단축",
"반복 지표(월간/주간) 자동화",
"이상치/트렌드 조기 발견",
"시각화로 커뮤니케이션 개선",
"데이터 활용 자신감 상승"
],
"notes": "핵심(10초): '기대 효과(정량/정성)' 슬라이드입니다.\n포인트(20초): 리포트 초안 작성 시간 단축 / 반복 지표(월간/주간) 자동화\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "section",
"title": "2. 핵심 개념과 원칙",
"subtitle": "이것만 지키면 실패 확률이 줄어든다",
"notes": "전환(10초): 이제 '2. 핵심 개념과 원칙' 파트로 넘어갑니다.\n안내(15초): 핵심 메시지를 먼저 잡고, 사례/체크리스트로 연결하겠습니다."
},
{
"type": "bullets",
"chapter": "Part 2",
"title": "핵심 개념 6가지",
"bullets": [
"지표 정의(분모/분자/단위)",
"기간/범위 명시",
"데이터 품질 체크(누락/중복)",
"기본 통계(평균/중앙값/추세)",
"시각화(막대/선/분포)",
"해석(가설→근거→다음 행동)"
],
"notes": "핵심(10초): '핵심 개념 6가지' 슬라이드입니다.\n포인트(20초): 지표 정의(분모/분자/단위) / 기간/범위 명시\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "process",
"chapter": "Part 2",
"title": "실행 프레임워크(권장 루틴)",
"steps": [
"목표 질문 1개 정하기",
"데이터 컬럼/정의 확인",
"품질 체크(누락/중복/이상치)",
"그래프 1개로 트렌드 보기",
"인사이트 3개 + 가설 2개",
"다음 액션(추가 데이터/실험)"
],
"notes": "핵심(10초): '실행 프레임워크(권장 루틴)'는 실행 흐름(루틴)을 제시합니다.\n요약(20초): 목표 질문 1개 정하기 → 데이터 컬럼/정의 확인 → 품질 체크(누락/중복/이상치) …\n팁(10초): 이 순서를 팀 템플릿으로 고정하면 재작업이 크게 줄어듭니다."
},
{
"type": "two_column",
"chapter": "Part 2",
"title": "좋은 예 vs 나쁜 예 (짧은 비교)",
"left_title": "좋은 예",
"left_bullets": [
"컬럼/단위/기간을 지정",
"보고 목적(누가/왜) 명시",
"그래프 종류를 지정",
"인사이트+가설+액션까지 요청"
],
"right_title": "나쁜 예",
"right_bullets": [
"‘분석해줘’만 요청",
"데이터 정의 없이 수치 해석",
"기간이 섞인 데이터로 비교",
"검증 없이 결론 확정"
],
"notes": "의도(10초): 좌/우 대비로 메시지를 빠르게 정렬합니다.\n정리(10초): 오른쪽(권장/현실/완화) 기준으로 팀 표준을 잡는 것이 목표입니다."
},
{
"type": "bullets",
"chapter": "Part 2",
"title": "자주 하는 실수",
"bullets": [
"컬럼 의미(정의) 누락",
"단위 혼동",
"결측/이상치 미처리",
"상관/인과 혼동",
"결론만 뽑고 다음 행동이 없음"
],
"notes": "핵심(10초): '자주 하는 실수' 슬라이드입니다.\n포인트(20초): 컬럼 의미(정의) 누락 / 단위 혼동\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "section",
"title": "3. 사례로 이해하는 적용 가이드",
"subtitle": "참여형 활동 없이도 이해되는 예시 중심",
"notes": "전환(10초): 이제 '3. 사례로 이해하는 적용 가이드' 파트로 넘어갑니다.\n안내(15초): 핵심 메시지를 먼저 잡고, 사례/체크리스트로 연결하겠습니다."
},
{
"type": "bullets",
"chapter": "Part 3",
"title": "사례 1) 데이터 품질 체크 요청",
"bullets": [
"요청의 역할/관점: 데이터 분석가",
"핵심 입력 요소: 목적·대상·제약·데이터·출력 형식(표/목차/분량)",
"출력 통제: 결론 먼저, 근거/리스크를 함께 요청하면 품질이 안정화됨",
"짧은 예시 문장(참고): \"아래 표 데이터를 보고 먼저 '품질 체크'를 해줘. / - 누락/중복/이상치 가능성\"",
"포인트: 품질 체크가 먼저",
"포인트: 정의 질문을 받아서 오류를 줄이기",
"포인트: 전처리 제안을 기록"
],
"notes": "핵심(10초): '사례 1) 데이터 품질 체크 요청' 슬라이드입니다.\n포인트(20초): 요청의 역할/관점: 데이터 분석가 / 핵심 입력 요소: 목적·대상·제약·데이터·출력 형식(표/목차/분량)\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "bullets",
"chapter": "Part 3",
"title": "사례 2) 그래프 + 인사이트 + 다음 행동",
"bullets": [
"요청의 역할/관점: 비전공자를 돕는 분석 코치",
"핵심 입력 요소: 목적·대상·제약·데이터·출력 형식(표/목차/분량)",
"출력 통제: 결론 먼저, 근거/리스크를 함께 요청하면 품질이 안정화됨",
"짧은 예시 문장(참고): \"목표: [목표] / 데이터 컬럼: [컬럼명/정의/단위]\"",
"포인트: ‘왜 이 그래프인지’가 중요",
"포인트: 가설과 검증방법을 같이",
"포인트: 마지막은 의사결정 행동으로"
],
"notes": "핵심(10초): '사례 2) 그래프 + 인사이트 + 다음 행동' 슬라이드입니다.\n포인트(20초): 요청의 역할/관점: 비전공자를 돕는 분석 코치 / 핵심 입력 요소: 목적·대상·제약·데이터·출력 형식(표/목차/분량)\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "table",
"chapter": "Part 3",
"title": "자연어 분석 질문 예시(초보용)",
"columns": [
"내가 묻는 말",
"AI가 해주는 일",
"주의"
],
"rows": [
[
"이번 달이 왜 떨어졌어?",
"요약+원인 후보",
"인과로 확정 금지"
],
[
"이상치가 있나?",
"이상치 탐지",
"원문 확인"
],
[
"보고서 문장 써줘",
"1p 요약",
"수치 대조"
]
],
"notes": "읽는 법(15초): 표는 내가 묻는 말, AI가 해주는 일, 주의 기준으로 비교합니다.\n포인트(15초): 수치/정의/기간을 같이 확인해 오해를 줄입니다."
},
{
"type": "bullets",
"chapter": "Part 3",
"title": "결과 품질 검증 체크",
"bullets": [
"사실/수치/고유명사는 원문 대조",
"누락된 가정이 없는지 질문",
"대안 2개 이상 비교 요청",
"리스크/반론을 함께 요청"
],
"notes": "핵심(10초): '결과 품질 검증 체크' 슬라이드입니다.\n포인트(20초): 사실/수치/고유명사는 원문 대조 / 누락된 가정이 없는지 질문\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "section",
"title": "4. 리스크 & 체크리스트",
"subtitle": "안전하게, 팀 단위로 굴리기",
"notes": "전환(10초): 이제 '4. 리스크 & 체크리스트' 파트로 넘어갑니다.\n안내(15초): 핵심 메시지를 먼저 잡고, 사례/체크리스트로 연결하겠습니다."
},
{
"type": "two_column",
"chapter": "Part 4",
"title": "리스크와 완화 전략",
"left_title": "리스크",
"left_bullets": [
"단위/정의 오류로 오해",
"환각으로 근거 없는 결론",
"민감 데이터 입력",
"상관/인과 혼동"
],
"right_title": "완화",
"right_bullets": [
"정의/단위/기간을 강제 입력",
"가설+검증 절차 포함",
"가명화/요약 후 입력",
"결론은 ‘가설’로 표현"
],
"notes": "의도(10초): 좌/우 대비로 메시지를 빠르게 정렬합니다.\n정리(10초): 오른쪽(권장/현실/완화) 기준으로 팀 표준을 잡는 것이 목표입니다."
},
{
"type": "bullets",
"chapter": "Part 4",
"title": "체크리스트(현업 적용용)",
"bullets": [
"지표 정의/단위/기간이 명확한가",
"결측/중복/이상치 확인했나",
"그래프가 목적과 맞나",
"인사이트가 ‘근거’와 연결되나",
"다음 행동이 있는가"
],
"notes": "핵심(10초): '체크리스트(현업 적용용)' 슬라이드입니다.\n포인트(20초): 지표 정의/단위/기간이 명확한가 / 결측/중복/이상치 확인했나\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "bullets",
"chapter": "Part 4",
"title": "팀 적용(롤아웃) 방법",
"bullets": [
"팀 공통 ‘지표 정의’ 템플릿 배포",
"월간 리포트 질문 템플릿화",
"분석 결과는 가설/근거/액션 포맷",
"민감 데이터 처리 규칙 공유"
],
"notes": "핵심(10초): '팀 적용(롤아웃) 방법' 슬라이드입니다.\n포인트(20초): 팀 공통 ‘지표 정의’ 템플릿 배포 / 월간 리포트 질문 템플릿화\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
},
{
"type": "section",
"title": "5. 요약 & 다음 행동",
"subtitle": "오늘부터 1개만 실행",
"notes": "전환(10초): 이제 '5. 요약 & 다음 행동' 파트로 넘어갑니다.\n안내(15초): 핵심 메시지를 먼저 잡고, 사례/체크리스트로 연결하겠습니다."
},
{
"type": "bullets",
"chapter": "Part 5",
"title": "핵심 요약",
"bullets": [
"분석은 코딩이 아니라 ‘질문+정의’",
"품질 체크→그래프→인사이트→액션 루틴",
"결론은 가설로 두고 검증",
"오늘 행동: 내 지표 1개 정의(단위/기간) 쓰기"
],
"notes": "핵심(10초): '핵심 요약' 슬라이드입니다.\n포인트(20초): 분석은 코딩이 아니라 ‘질문+정의’ / 품질 체크→그래프→인사이트→액션 루틴\n연결(10초): 다음 슬라이드에서 구조(원칙/사례/리스크)로 이어갑니다."
}
]
}

View File

@@ -0,0 +1,218 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "AX Curriculum Slides Spec",
"type": "object",
"required": ["meta", "slides"],
"properties": {
"meta": {
"type": "object",
"required": ["title", "duration_minutes"],
"properties": {
"title": { "type": "string", "minLength": 1 },
"subtitle": { "type": "string" },
"badge": { "type": "string" },
"duration_minutes": { "type": "integer", "minimum": 1 },
"audience": { "type": "string" },
"tone": { "type": "string" },
"footer_left": { "type": "string" }
},
"additionalProperties": true
},
"slides": {
"type": "array",
"minItems": 20,
"items": {
"type": "object",
"required": ["type"],
"properties": {
"type": {
"type": "string",
"enum": ["cover", "agenda", "section", "bullets", "two_column", "process", "prompt", "table"]
},
"chapter": { "type": "string" },
"title": { "type": "string" },
"subtitle": { "type": "string" },
"items": { "type": "array", "items": { "type": "string" } },
"bullets": { "type": "array", "items": { "type": "string" } },
"left_title": { "type": "string" },
"left_bullets": { "type": "array", "items": { "type": "string" } },
"right_title": { "type": "string" },
"right_bullets": { "type": "array", "items": { "type": "string" } },
"steps": { "type": "array", "items": { "type": "string" } },
"prompt": { "type": "string" },
"tips": { "type": "array", "items": { "type": "string" } },
"columns": { "type": "array", "items": { "type": "string" } },
"rows": { "type": "array", "items": { "type": "array", "items": { "type": "string" } } }
},
"additionalProperties": true
}
}
},
"additionalProperties": true
}
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "AX Deck Slides JSON Schema",
"type": "object",
"additionalProperties": false,
"required": ["meta", "slides"],
"properties": {
"meta": {
"type": "object",
"additionalProperties": false,
"required": ["title", "language"],
"properties": {
"title": { "type": "string", "minLength": 1 },
"subtitle": { "type": "string" },
"author": { "type": "string" },
"date": { "type": "string" },
"language": { "type": "string", "default": "ko-KR" },
"duration_minutes": { "type": "integer", "minimum": 1 },
"audience": { "type": "string" },
"version": { "type": "string" }
}
},
"slides": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/definitions/slide" }
}
},
"definitions": {
"bulletItem": {
"oneOf": [
{ "type": "string" },
{
"type": "object",
"additionalProperties": false,
"required": ["text"],
"properties": {
"text": { "type": "string" },
"children": {
"type": "array",
"items": { "$ref": "#/definitions/bulletItem" }
}
}
}
]
},
"column": {
"type": "object",
"additionalProperties": false,
"required": ["heading", "bullets"],
"properties": {
"heading": { "type": "string" },
"bullets": {
"type": "array",
"items": { "$ref": "#/definitions/bulletItem" }
}
}
},
"slide": {
"type": "object",
"additionalProperties": false,
"required": ["type", "title"],
"properties": {
"type": {
"type": "string",
"enum": [
"title",
"section",
"agenda",
"bullets",
"two_column_bullets",
"quote",
"table",
"exercise",
"closing",
"blank"
]
},
"title": { "type": "string" },
"subtitle": { "type": "string" },
"bullets": {
"type": "array",
"items": { "$ref": "#/definitions/bulletItem" }
},
"items": { "type": "array", "items": { "type": "string" } },
"left": { "$ref": "#/definitions/column" },
"right": { "$ref": "#/definitions/column" },
"quote": { "type": "string" },
"attribution": { "type": "string" },
"headers": { "type": "array", "minItems": 1, "items": { "type": "string" } },
"rows": { "type": "array", "items": { "type": "array", "items": { "type": "string" } } },
"steps": { "type": "array", "items": { "type": "string" } },
"timebox_minutes": { "type": "integer", "minimum": 1 },
"notes": { "type": "string" }
},
"allOf": [
{ "if": { "properties": { "type": { "const": "agenda" } } }, "then": { "required": ["items"] } },
{ "if": { "properties": { "type": { "const": "bullets" } } }, "then": { "required": ["bullets"] } },
{
"if": { "properties": { "type": { "const": "two_column_bullets" } } },
"then": { "required": ["left", "right"] }
},
{ "if": { "properties": { "type": { "const": "quote" } } }, "then": { "required": ["quote"] } },
{ "if": { "properties": { "type": { "const": "table" } } }, "then": { "required": ["headers", "rows"] } },
{ "if": { "properties": { "type": { "const": "exercise" } } }, "then": { "required": ["steps"] } }
]
}
}
}
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "AX 교육용 slides.json 스키마",
"type": "object",
"required": ["meta", "slides"],
"properties": {
"meta": {
"type": "object",
"required": ["title", "duration_minutes", "language"],
"properties": {
"title": { "type": "string", "minLength": 1 },
"subtitle": { "type": "string" },
"duration_minutes": { "type": "integer", "minimum": 5, "maximum": 180 },
"audience": { "type": "string" },
"language": { "type": "string", "enum": ["ko"] },
"version": { "type": "integer", "minimum": 1 }
},
"additionalProperties": true
},
"slides": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["type"],
"properties": {
"type": { "type": "string", "enum": ["title", "section", "content", "two_content"] },
"title": { "type": "string" },
"subtitle": { "type": "string" },
"bullets": {
"type": "array",
"items": {
"oneOf": [
{ "type": "string" },
{
"type": "object",
"required": ["text"],
"properties": {
"text": { "type": "string" },
"level": { "type": "integer", "minimum": 0, "maximum": 5 }
},
"additionalProperties": false
}
]
}
},
"left_bullets": { "$ref": "#/properties/slides/items/properties/bullets" },
"right_bullets": { "$ref": "#/properties/slides/items/properties/bullets" },
"notes": { "type": "string" }
},
"additionalProperties": true
}
}
},
"additionalProperties": false
}