@qualisoft/ai-skills 1.3.0 → 1.4.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,109 @@
1
1
  # 변경 이력
2
2
 
3
+ ## 1.4.1 — 2026-09-14
4
+
5
+ `비활성 관리` 를 켰을 때 체크박스가 상태 점에 붙어 보이던 것을 고쳤습니다.
6
+
7
+ 체크박스를 절대 배치해서 상태 점과 **1px 겹쳐 있었습니다.**
8
+
9
+ ```
10
+ 체크박스 left 7px + 폭 12 → 7 ~ 19
11
+ 상태 점 left 18px + 폭 5 → 18 ~ 23 ← 겹침
12
+ ```
13
+
14
+ 행은 이미 `flex` + `gap:8px` 이므로, 체크박스를 절대 배치하지 않고 **흐름 안에
15
+ 두면 간격이 저절로 맞습니다.** 절대 배치와 `padding-left` 로 억지로 맞추던 것을
16
+ 걷어냈습니다.
17
+
18
+ 체크박스가 없는 행(홈 · 가이드 · 추적성 매트릭스)도 같은 만큼 밀어 주어, 관리
19
+ 모드에서 왼쪽 끝이 들쭉날쭉하지 않습니다. 어느 행에 체크박스가 있는지는 JS 가
20
+ `has-check` 클래스로 표시합니다 — `:has()` 선택자에 기대지 않아 브라우저를 가리지
21
+ 않습니다.
22
+
23
+ 곁들여: 체크박스 12px → 13px, 관리 모드에서 행 hover 표시, 상단 관리 줄 여백 정리.
24
+
25
+ ### 검증
26
+
27
+ ```
28
+ 체크박스 16~29 · 상태 점 37~42 · 이름표 50~
29
+ 간격 8px 균일 · 겹침 없음
30
+ 체크박스 없는 행과 점·이름표 좌표 일치 (37 / 50)
31
+ 모드 해제 시 원래 정렬로 복귀 (16 / 16)
32
+ ```
33
+
34
+
35
+ ## 1.4.0 — 2026-09-14
36
+
37
+ 대본을 **고객 송부용**으로 다시 세웠습니다. 세 가지 문제를 고쳤습니다.
38
+
39
+ ### ① 불필요한 정보가 산출물에 섞여 들어갔습니다
40
+
41
+ 산출물은 고객사에 송부되는데, 원본 문서는 우리 작업용이라 고객이 볼 필요가 없는
42
+ 것이 섞여 있습니다. `_scope.md` 에서 걸러냅니다.
43
+
44
+ 프론트매터 전체 · **담당자 이메일** · `미결정` 섹션 · `변경 이력` · `[[문서-id]]`
45
+ 링크 표기 · 원본 파일명·경로 · 템플릿 작성 지침 · 빈 표와 빈 섹션.
46
+
47
+ `TODO(...)` 는 **지우지 않습니다.** 본문에서는 `협의 중` 으로 바꾸고, 마지막에
48
+ `고객 확인 필요 항목` 으로 모아 보여줍니다. 없는 척하면 고객이 나중에 발견합니다.
49
+
50
+ ### ② 엑셀을 열면 "파일에 오류가 있습니다 — 복구했습니다"
51
+
52
+ `openpyxl` 로 엑셀 표 기능을 쓸 때 **머리행 이름이 비거나 중복되면** 엑셀이 파일을
53
+ 복구합니다. 마크다운 표를 그대로 옮기면 자주 걸립니다. 재현해서 확인했습니다:
54
+
55
+ ```
56
+ | | | → tableColumn name="" ×2 → 복구
57
+ | 구분 | 구분 | → tableColumn name="구분" ×2 → 복구
58
+ | 항목 | 값 | (데이터 행 없음) → 복구
59
+ ```
60
+
61
+ `excel.md` 에 네 가지를 규칙으로 못박았습니다 — 빈 머리행 채우기, 중복 이름 구분,
62
+ 데이터 없는 표에는 표 기능 적용 금지, `displayName` 은 공백 없이 유일하게.
63
+
64
+ ### ③ 파일을 봐도 무슨 문서인지 몰랐습니다
65
+
66
+ 서식만 고정하면 **"예쁘지만 목적을 모르는 파일"** 이 나옵니다. 두 겹을 더 넣었습니다.
67
+
68
+ **`_purpose.md` — 목적 블록을 맨 앞에 강제합니다.**
69
+ 답하는 질문 한 줄 → 핵심 수치 3~4개(원본에서 세어서) → 받는 분이 할 일.
70
+ 그 뒤 가장 중요한 표 하나, 그 다음 상세. **원본 섹션 순서를 그대로 따르지
71
+ 않습니다** — 원본은 우리가 쓰기 좋은 순서이고 산출물은 받는 사람이 읽기 좋은
72
+ 순서여야 합니다.
73
+
74
+ **문서 종류별 구성 지침(`DOC_SHAPE`)** — 같은 서식이어도 뼈대는 문서마다 다릅니다.
75
+
76
+ | 문서 | 앞에 세우는 것 |
77
+ | --- | --- |
78
+ | 산출물 정의서 | 공정별 납품 목록 · 제외한 산출물 |
79
+ | WBS · 일정 | **마일스톤을 본표와 분리** · 지연 과업 강조 |
80
+ | 요구사항 정의서 | 요구사항 ↔ 과업 ↔ 산출물이 같은 행 · 미수용 사유 |
81
+ | 화면 설계서 | 화면 목록 먼저, 화면마다 한 줄 설명 |
82
+ | 데이터 모델 | 한글 논리명을 물리명보다 앞에 |
83
+ | QA · 테스트 | 고객이 하는 확인(UAT)과 우리가 하는 확인을 구분 |
84
+ | 그 밖 | 결론을 앞으로, 행 수가 가장 많은 표를 본표로 |
85
+
86
+ 새 문서 종류는 `DOC_SHAPE` 에 한 줄 추가하면 됩니다.
87
+
88
+ ### 대본 구조
89
+
90
+ ```
91
+ DOC_SHAPE 이 문서는 무엇을 앞에 세우는가 (build.mjs)
92
+ _purpose 받는 사람이 첫 화면에서 알 것 (templates/script/)
93
+ _scope 무엇을 빼는가
94
+ _style 색 · 글자 · 표 — 값 고정
95
+ ```
96
+
97
+ ### 검증
98
+
99
+ ```
100
+ 치환 잔여 0건 · 문서별 구성 지침 다르게 주입 확인
101
+ 01-project-brief → "이 문서는 **사업 개요**"
102
+ 07-screen-spec → "이 문서는 **화면 설계서**"
103
+ 정제 규칙 · 목적 블록 · 표 손상 규칙 모두 대본에 포함 확인
104
+ ```
105
+
106
+
3
107
  ## 1.3.0 — 2026-09-14
4
108
 
5
109
  ### 파일 스크립트를 **대본**으로 바꿨습니다
package/README.md CHANGED
@@ -165,11 +165,20 @@ large 19~21개 다인원, 6개월 이상
165
165
  **비유하자면** — 택배 배송 알림과 같습니다.
166
166
  ```
167
167
 
168
- ### 5. 산출물은 매번 같은 모양으로 나온다
168
+ ### 5. 산출물은 고객에게 바로 보낼 수 있게 나온다
169
169
 
170
170
  각 문서 우측 상단 **`파일 스크립트`** 버튼 → 형식(PDF · Excel · PPT · Word · CSV)을 고르면 **AI 에게 줄 대본**이 나옵니다. 복사해서 에이전트에 붙여 넣으면 됩니다. 코드가 아니라 지시문이라 설치할 것이 없습니다.
171
171
 
172
- 서식 규격 — 색 여섯 개, 글자 위계 단계, 표 스타일, 하지 말 것 — 이 대본 안에 박혀 있습니다. **착수 때 만들든 중간에 만들든 같은 모양이 나옵니다.** 매번 "모던하게 만들어 줘" 라고 말하면 매번 다른 것이 나오니까요.
172
+ 대본은겹으로 쌓입니다.
173
+
174
+ | 겹 | 정하는 것 |
175
+ | --- | --- |
176
+ | 구성 | **이 문서는 무엇을 앞에 세우는가** — 일정표는 마일스톤을, 요구사항은 추적 관계를 |
177
+ | 목적 | 답하는 질문 한 줄 · 핵심 수치 · 받는 분이 할 일을 맨 앞에 |
178
+ | 정제 | 담당자 이메일 · 미결정 · 변경 이력 · 내부 표기를 걸러냄 |
179
+ | 서식 | 색 여섯 개 · 글자 위계 네 단계 · 표 스타일. 값이 고정 |
180
+
181
+ **서식만 고정하면 "예쁘지만 목적을 모르는 파일"이 나옵니다.** 그래서 목적 블록을 강제하고, 문서 종류마다 본표로 세울 것을 따로 정합니다. 착수 때 만들든 중간에 만들든 같은 모양이 나옵니다.
173
182
 
174
183
  대본은 원본 `.md` 를 가리킬 뿐 내용을 품지 않습니다. 문서를 고친 뒤 같은 대본을 다시 써도 최신 내용으로 만들어집니다.
175
184
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qualisoft/ai-skills",
3
- "version": "1.3.0",
3
+ "version": "1.4.1",
4
4
  "description": "기획 인터뷰부터 문서 체계·디자인 시안·구현까지 이어지는 AI 에이전트 스킬 5종. Claude Code · Codex · Gemini 등 어느 도구에서나 쓴다. 외부 의존성 없음.",
5
5
  "keywords": [
6
6
  "ai-skills",
@@ -411,27 +411,58 @@ npm view react versions --json # 선택지가 필요하면
411
411
 
412
412
  ## 파일 스크립트 — 산출물 생성 대본
413
413
 
414
- 빌드한 HTML 의 각 문서 우측 상단에 **`파일 스크립트`** 버튼이 있다. 누르면 모달이
415
- 열리고, 형식을 고르면 **AI 에게 줄 지시문(대본)** 이 나온다. 코드가 아니라 대본이다.
416
- 복사해서 에이전트에 붙여 넣으면 그 형식으로 산출물을 만든다.
414
+ 빌드한 HTML 의 각 문서 우측 상단 **`파일 스크립트`** 버튼을 누르면 형식(PDF ·
415
+ Excel · PowerPoint · Word · CSV)을 고를 수 있고, **AI 에게 줄 지시문(대본)** 이
416
+ 나온다. 코드가 아니다. 복사해서 에이전트에 붙여 넣으면 그 형식으로 산출물을 만든다.
417
417
 
418
- 형식은 PDF · Excel · PowerPoint · Word · CSV 다섯이다.
418
+ **전제: 산출물은 고객사에 송부된다.** 그래서 대본은 겹으로 쌓인다.
419
419
 
420
- **서식 규격이 대본 안에 박혀 있다.** 여섯 개, 글자 위계 네 단계, 표 스타일,
421
- 하지 목록이 `_style.md` 고정되어 모든 대본에 들어간다. 그래서 착수 때
422
- 만들든 중간에 만들든, 누가 어떤 도구로 만들든 **같은 모양이 나온다.** 이게 대본을
423
- 쓰는 이유다 매번 "모던하게 만들어 줘" 라고 말하면 매번 다른 것이 나온다.
420
+ | | 파일 | 정하는 |
421
+ | --- | --- | --- |
422
+ | 구성 | `DOC_SHAPE` (build.mjs) | **이 문서는 무엇을 앞에 세우는가** — 문서 종류마다 다르다 |
423
+ | 목적 | `_purpose.md` | 받는 사람이 화면에서 무엇을 알아야 하는가 |
424
+ | 정제 | `_scope.md` | 무엇을 빼는가 — 내부 정보·개인정보·미결정·이력 |
425
+ | 서식 | `_style.md` | 색·글자·표. 값이 고정이라 매번 같은 모양이 나온다 |
426
+
427
+ ### 왜 네 겹인가
428
+
429
+ **서식만 고정하면 "예쁘지만 무슨 문서인지 모르는 파일"이 나온다.** 원본 순서대로
430
+ 옮기면 우리가 쓰기 좋은 순서가 그대로 고객에게 간다. 그래서 목적 블록(답하는 질문 ·
431
+ 핵심 수치 · 받는 분이 할 일)을 맨 앞에 강제하고, 문서 종류별 구성 지침으로 무엇을
432
+ 본표로 세울지 정한다.
433
+
434
+ `DOC_SHAPE` 는 문서 `name` 으로 찾는다. 예를 들어 `wbs-schedule` 은 마일스톤을
435
+ 본표와 분리해 세우게 하고, `requirements` 는 요구사항 ↔ 과업 ↔ 산출물이 같은 행에
436
+ 보이게 한다. 없는 문서는 `DOC_SHAPE_DEFAULT` 를 쓴다 — 결론을 앞으로 올리고,
437
+ 행 수가 가장 많은 표를 본표로 삼는다.
438
+
439
+ **새 문서 종류를 넣으면 `DOC_SHAPE` 에 한 줄 추가한다.** 안 넣어도 동작하지만,
440
+ 그 문서는 "원본 순서대로"가 된다.
441
+
442
+ ### 엑셀 표 손상 — 대본이 막는다
443
+
444
+ `openpyxl` 로 엑셀 표 기능을 쓰면 머리행 이름이 **비거나 중복될 때** 엑셀이
445
+ 파일을 열며 *"파일에 오류가 있습니다 — 복구했습니다"* 를 띄운다. 마크다운 표를
446
+ 그대로 옮기면 자주 걸린다. 실제로 재현해 확인했다:
447
+
448
+ ```
449
+ | | | → tableColumn name="" ×2 → 복구
450
+ | 구분 | 구분 | → tableColumn name="구분" ×2 → 복구
451
+ | 항목 | 값 | (데이터 행 없음) → 복구
452
+ ```
453
+
454
+ 그래서 `excel.md` 에 네 가지를 규칙으로 못박았다 — 빈 머리행 채우기, 중복 이름
455
+ 구분, 데이터 없는 표에는 표 기능 적용 금지, `displayName` 은 공백 없이 유일하게.
424
456
 
425
- **대본은 내용을 품지 않는다.** 원본 `.md` 경로만 가리키고 "이 파일을 먼저 읽어라"
426
- 라고 지시한다. 그래서 문서를 고친 뒤 같은 대본을 다시 써도 최신 내용으로 만들어지고,
427
- HTML 크기가 문서 수와 무관하다.
457
+ ### 대본은 내용을 품지 않는다
428
458
 
429
- 대본은 `templates/script/*.md` 있다. `_style.md` 공통 서식 규격이고 빌드할
430
- 형식 대본의 `__STYLE__` 자리에 끼워진다. `__DOC_FILE__` · `__DOC_TITLE__` ·
431
- `__DOC_STEM__` 모달을 브라우저에서 치환된다.
459
+ 원본 `.md` 경로만 가리키고 "이 파일을 먼저 읽어라" 라고 지시한다. 그래서 문서를
460
+ 고친 같은 대본을 다시 써도 최신 내용으로 만들어지고, HTML 크기가 문서 수와
461
+ 무관하다. 치환(`__DOC_FILE__` · `__DOC_TITLE__` · `__DOC_STEM__` · `__SHAPE__`)은
462
+ 모달을 열 때 브라우저에서 일어난다.
432
463
 
433
- 서식을 바꾸려면 **`templates/script/` 의 마크다운을 고친다.** `build.mjs` 는 파일을
434
- 읽어 나르기만 한다.
464
+ 서식이나 구성을 바꾸려면 **`templates/script/` 의 마크다운**과 **`DOC_SHAPE`**
465
+ 고친다. 다른 곳은 건드리지 않는다.
435
466
 
436
467
  ## 비활성 메뉴 — 안 쓴 메뉴를 죽여 둔다
437
468
 
@@ -1298,8 +1298,13 @@ function render(docs, config, trace, discovery = [], design = [], mockups = [],
1298
1298
  /* 산출물 대본.
1299
1299
  *
1300
1300
  * 코드가 아니라 **AI 에게 주는 지시문**이다. 복사해서 에이전트에 붙여 넣으면
1301
- * 그 형식으로 산출물을 만든다. 서식 규격(`_style.md`)이 대본 안에 박혀 있으므로
1302
- * 착수 때 만들든 중간에 만들든, 누가 어떤 도구로 만들든 같은 모양이 나온다.
1301
+ * 그 형식으로 산출물을 만든다.
1302
+ *
1303
+ * 대본은 네 겹으로 쌓인다:
1304
+ * _shape 문서 종류별 구성 — 이 문서는 무엇을 앞에 세워야 하는가
1305
+ * _purpose 목적 블록 — 받는 사람이 첫 화면에서 무엇을 알아야 하는가
1306
+ * _scope 고객 송부용 정제 — 무엇을 빼는가
1307
+ * _style 시각 규격 — 색·글자·표. 값이 고정이라 매번 같은 모양이 나온다
1303
1308
  *
1304
1309
  * 대본은 원본 .md 경로만 가리킨다. 내용을 품지 않으므로 문서를 고친 뒤 같은
1305
1310
  * 대본을 다시 쓰면 최신 내용으로 만들어진다. HTML 크기도 문서 수와 무관하다. */
@@ -1311,22 +1316,87 @@ const SCRIPT_FORMATS = [
1311
1316
  { id: "csv", label: "CSV", ext: "csv" },
1312
1317
  ];
1313
1318
 
1319
+ /* 문서 종류별 구성 지침.
1320
+ *
1321
+ * 같은 서식이어도 산출물의 뼈대는 문서마다 다르다. 일정표는 기간이 보여야 하고
1322
+ * 요구사항 대장은 무엇이 어디로 이어지는지가 보여야 한다. 이 지침이 없으면
1323
+ * "원본 순서대로 옮긴 파일"이 나오고, 받는 사람은 무엇을 보라는 것인지 모른다.
1324
+ *
1325
+ * 키는 문서 name(모듈에 적힌 것)이다. 없으면 기본 지침을 쓴다. */
1326
+ const DOC_SHAPE = {
1327
+ "deliverable-register":
1328
+ "이 문서는 **납품 목록**입니다. 공정별로 묶고, 각 산출물의 `필수 여부`·" +
1329
+ "`고객 공유`·`상태`가 한눈에 보이게 하세요. 맨 앞 수치는 `전체 종수`, " +
1330
+ "`필수`, `작성 완료`, `미착수` 입니다. **제외한 산출물** 목록을 빠뜨리지 " +
1331
+ "마세요 — 고객이 '이건 왜 없냐'고 묻는 지점입니다. 버전 이력은 맨 뒤에 둡니다.",
1332
+ "wbs-schedule":
1333
+ "이 문서는 **일정표**입니다. 공정 → 과업 2단으로 묶고, 각 과업의 시작·종료·" +
1334
+ "담당·진척이 한 행에 보이게 하세요. 맨 앞 수치는 `전체 과업`, `종합 진척률`, " +
1335
+ "`진행 중`, `지연` 입니다. **마일스톤은 본표와 분리해 따로 세우세요** — " +
1336
+ "고객이 가장 먼저 보는 것이 보고·승인 시점입니다. 지연 과업은 굵게 표시합니다.",
1337
+ requirements:
1338
+ "이 문서는 **요구사항 추적표**입니다. 각 요구사항이 `어느 과업`으로 가고 " +
1339
+ "`어느 산출물`로 확인되는지가 같은 행에 보여야 합니다. 맨 앞 수치는 " +
1340
+ "`전체 요구사항`, `수용`, `추가 검토`, `미수용` 입니다. 부서별로 묶으면 " +
1341
+ "현업이 자기 것을 찾기 쉽습니다. **수용하지 않은 요구사항과 그 이유**를 " +
1342
+ "반드시 포함하세요.",
1343
+ "project-brief":
1344
+ "이 문서는 **사업 개요**입니다. 목표와 범위가 먼저이고, 특히 `범위 제외`를 " +
1345
+ "분명히 세우세요. 맨 앞 수치는 `목표 수`, `기간`, `이해관계자 수` 입니다. " +
1346
+ "이해관계자는 이름과 역할만 남기고 연락처는 뺍니다.",
1347
+ "screen-spec":
1348
+ "이 문서는 **화면 설계서**입니다. 화면 목록을 먼저 보여주고, 그 뒤에 화면별 " +
1349
+ "상세를 둡니다. 맨 앞 수치는 `전체 화면 수`와 구분별 개수입니다. " +
1350
+ "화면마다 **무엇을 하는 화면인지 한 줄**을 앞에 붙이세요.",
1351
+ "data-model":
1352
+ "이 문서는 **데이터 구조**입니다. 테이블 목록을 먼저, 그 뒤 테이블별 칼럼. " +
1353
+ "맨 앞 수치는 `테이블 수`, `관계 수` 입니다. 고객이 읽을 것이므로 " +
1354
+ "**한글 논리명을 물리명보다 앞에** 두세요.",
1355
+ "qa-test-plan":
1356
+ "이 문서는 **검증 계획**입니다. 무엇을 어떤 기준으로 통과시키는지가 핵심입니다. " +
1357
+ "맨 앞 수치는 `시나리오 수`, `필수 통과 항목`, `일정` 입니다. " +
1358
+ "고객이 직접 하는 확인(UAT)과 우리가 하는 확인을 **구분해서** 세우세요.",
1359
+ "release-ops":
1360
+ "이 문서는 **오픈·운영 안내**입니다. 오픈 절차와 이후 지원 체계가 핵심입니다. " +
1361
+ "맨 앞 수치는 `오픈 예정일`, `교육 대상 인원`, `지원 기간` 입니다. " +
1362
+ "고객이 해야 할 준비를 따로 묶어 세우세요.",
1363
+ };
1364
+
1365
+ const DOC_SHAPE_DEFAULT =
1366
+ "원본의 절 구성을 따르되, **결론과 전체 그림을 앞으로 올리세요.** " +
1367
+ "표가 여러 개면 가장 중요한 것 하나를 먼저 세우고 나머지를 뒤로 보냅니다. " +
1368
+ "무엇이 가장 중요한지 판단이 안 서면, 행 수가 가장 많은 표가 보통 본표입니다.";
1369
+
1314
1370
  function loadScripts(project) {
1315
1371
  const dir = join(SKILL_DIR, "templates", "script");
1316
- const stylePath = join(dir, "_style.md");
1317
- if (!existsSync(stylePath)) return null;
1318
- const style = readFileSync(stylePath, "utf8").trim();
1372
+ const part = (name) => {
1373
+ const path = join(dir, name + ".md");
1374
+ return existsSync(path) ? readFileSync(path, "utf8").trim() : "";
1375
+ };
1376
+ const style = part("_style");
1377
+ if (!style) return null;
1378
+ const purpose = part("_purpose");
1379
+ const scope = part("_scope");
1319
1380
  const out = {};
1320
1381
  for (const f of SCRIPT_FORMATS) {
1321
1382
  const path = join(dir, f.id + ".md");
1322
1383
  if (!existsSync(path)) continue;
1323
1384
  out[f.id] = readFileSync(path, "utf8")
1324
1385
  .replace("__STYLE__", style)
1386
+ .replace("__PURPOSE__", purpose)
1387
+ .replace("__SCOPE__", scope)
1325
1388
  .split("__PROJECT__").join(project || "이");
1326
1389
  }
1327
1390
  return Object.keys(out).length ? out : null;
1328
1391
  }
1329
1392
 
1393
+ /** 문서 id(`07-screen-spec`)에서 구성 지침을 찾는다. */
1394
+ function docShape(id = "") {
1395
+ const name = id.replace(/^\d+-/, "");
1396
+ return "## 이 문서의 구성\n\n" + (DOC_SHAPE[name] || DOC_SHAPE_DEFAULT);
1397
+ }
1398
+
1399
+
1330
1400
  /* --- 문서 본문 (1단계 기록 + 2단계 문서) --- */
1331
1401
  const scripts = loadScripts(config.project);
1332
1402
  const searchIndex = [];
@@ -1416,6 +1486,8 @@ function loadScripts(project) {
1416
1486
  escapeHtml(d.file) +
1417
1487
  '" data-export-title="' +
1418
1488
  escapeHtml(d.meta.title || d.id) +
1489
+ '" data-export-id="' +
1490
+ escapeHtml(d.id) +
1419
1491
  '">파일 스크립트</button>') +
1420
1492
  "</div>" +
1421
1493
  html +
@@ -1707,7 +1779,11 @@ function loadScripts(project) {
1707
1779
  "문서를 고친 뒤 같은 대본을 다시 써도 최신 내용으로 만들어집니다." +
1708
1780
  "</div></div></div>" +
1709
1781
  '<script id="exportScripts" type="application/json">' +
1710
- JSON.stringify({ scripts: scripts, formats: SCRIPT_FORMATS })
1782
+ JSON.stringify({
1783
+ scripts: scripts,
1784
+ formats: SCRIPT_FORMATS,
1785
+ shapes: Object.fromEntries(docs.map((d) => [d.id, docShape(d.id)])),
1786
+ })
1711
1787
  .replace(/</g, "\\u003c") +
1712
1788
  "<\/script>"
1713
1789
  : "") +
@@ -1813,15 +1889,21 @@ const CSS = `
1813
1889
  background:#000; box-shadow:0 0 0 1px rgba(255,255,255,.22)}
1814
1890
  .nav-item.unused .nav-label{color:var(--tx-faint)}
1815
1891
  .nav-item.unused:hover .nav-label{color:var(--tx-dim)}
1816
- /* 관리 모드 */
1817
- body.inactive-mode .nav-item{position:relative; padding-left:30px}
1818
- body.inactive-mode .nav-item .nav-dot{position:absolute; left:18px}
1819
- .nav-check{position:absolute; left:7px; top:50%; transform:translateY(-50%);
1820
- width:12px; height:12px; margin:0; cursor:pointer; accent-color:var(--accent);
1821
- display:none}
1892
+ /* 관리 모드
1893
+ *
1894
+ * 체크박스를 절대 배치하면 상태 점과 겹친다(7~19 vs 18~23). 행은 이미
1895
+ * flex + gap 이므로 흐름 안에 두면 간격이 저절로 맞는다. */
1896
+ .nav-check{display:none; flex:none; width:13px; height:13px; margin:0;
1897
+ cursor:pointer; accent-color:var(--accent)}
1822
1898
  body.inactive-mode .nav-check{display:block}
1899
+ /* 체크박스가 없는 행(홈·가이드·추적성)도 왼쪽을 맞춘다.
1900
+ * 8 + 13 + 8 = 29 — 체크박스가 차지하는 폭만큼 밀어 준다. */
1901
+ body.inactive-mode .nav-item{padding-left:29px}
1902
+ body.inactive-mode .nav-item.has-check{padding-left:8px}
1903
+ body.inactive-mode .nav-item:hover{background:var(--hover)}
1823
1904
  body.inactive-mode .nav-tools{background:var(--hover); border-radius:7px;
1824
- margin:0 6px 6px; padding:6px 8px}
1905
+ margin:0 6px 8px; padding:7px 9px}
1906
+ body.inactive-mode .nav-toggle{color:var(--tx)}
1825
1907
  html{-webkit-text-size-adjust:100%}
1826
1908
  body{
1827
1909
  margin:0; background:var(--bg); color:var(--tx);
@@ -2224,6 +2306,7 @@ const JS = `
2224
2306
  cb.className = 'nav-check';
2225
2307
  cb.title = '비활성으로 표시';
2226
2308
  item.insertBefore(cb, item.firstChild);
2309
+ item.classList.add('has-check');
2227
2310
  });
2228
2311
 
2229
2312
  /* 체크박스가 <a> 안에 있어 클릭이 그대로 두면 문서 이동까지 간다.
@@ -2285,6 +2368,7 @@ const JS = `
2285
2368
  var f = fmt(sel.value);
2286
2369
  var src = data.scripts[f.id] || '';
2287
2370
  code.textContent = src
2371
+ .split('__SHAPE__').join((data.shapes && data.shapes[cur.id]) || '')
2288
2372
  .split('__DOC_FILE__').join(cur.file)
2289
2373
  .split('__DOC_TITLE__').join(cur.title)
2290
2374
  .split('__DOC_STEM__').join(stem(cur.file));
@@ -2295,6 +2379,7 @@ const JS = `
2295
2379
  function open(btn){
2296
2380
  cur.file = btn.getAttribute('data-export-file') || '';
2297
2381
  cur.title = btn.getAttribute('data-export-title') || '';
2382
+ cur.id = btn.getAttribute('data-export-id') || '';
2298
2383
  sub.textContent = cur.title;
2299
2384
  fileEl.textContent = cur.file;
2300
2385
  try {
@@ -0,0 +1,29 @@
1
+ ## 목적을 맨 앞에 — 이게 가장 중요합니다
2
+
3
+ 받는 사람은 이 파일을 **처음 봅니다.** 제목만 보고는 무슨 문서인지, 무엇을
4
+ 확인해야 하는지 모릅니다. 그래서 본문에 들어가기 전에 **목적 블록**을 넣습니다.
5
+
6
+ ### 목적 블록에 담을 것
7
+
8
+ 1. **이 문서가 답하는 질문** — 한 문장. 전문용어 없이.
9
+ > "이번 사업에서 무엇을 어디까지 만들고, 언제 무엇을 납품하는가"
10
+
11
+ 2. **핵심 수치 3~4개** — 원본에서 **세어서** 뽑습니다. 지어내지 않습니다.
12
+ 표의 행 수, 완료·진행·미착수 건수, 시작·종료일, 마일스톤 수 같은 것.
13
+ 숫자를 크게, 이름표를 작게 두어 한눈에 들어오게 합니다.
14
+
15
+ 3. **받는 분이 할 일** — 한 줄.
16
+ > "굵게 표시된 5개 항목을 확인해 주시면 다음 단계로 넘어갑니다"
17
+
18
+ ### 그 다음 순서
19
+
20
+ 목적 블록 → **가장 중요한 표 하나** → 나머지 상세.
21
+
22
+ 원본의 섹션 순서를 그대로 따르지 마세요. 원본은 우리가 쓰기 좋은 순서이고,
23
+ 산출물은 **받는 사람이 읽기 좋은 순서**여야 합니다. 결론과 전체 그림이 앞에
24
+ 오고, 근거와 세부가 뒤에 옵니다.
25
+
26
+ ### 한 화면에 하나만
27
+
28
+ 한 시트·한 쪽·한 슬라이드는 **한 가지만** 말합니다. 표 두 개를 나란히 놓아
29
+ 무엇을 봐야 할지 헷갈리게 하지 마세요.
@@ -0,0 +1,35 @@
1
+ ## 무엇을 담고 무엇을 뺄 것인가
2
+
3
+ 이 산출물은 **고객사에 송부됩니다.** 원본 문서는 우리 작업용이라 고객이 볼 필요가
4
+ 없는 것이 섞여 있습니다. 아래를 반드시 걸러내세요.
5
+
6
+ ### 빼야 하는 것
7
+
8
+ | 대상 | 이유 |
9
+ | --- | --- |
10
+ | 프론트매터 전체 (`id`, `status`, `template`, `updated` 등) | 내부 관리용 |
11
+ | **담당자 이메일·계정** | 개인정보. 이름과 역할만 남깁니다 |
12
+ | `## 미결정` 섹션 | 우리 내부의 열린 항목 |
13
+ | `## 변경 이력` 섹션 | 내부 작업 이력 |
14
+ | `[[문서-id]]` 링크 표기 | 링크는 벗기고 문서 이름만 남깁니다 |
15
+ | 추적 ID (`R-01`, `B-01`, `D-001`) | 표의 한 칸을 차지할 뿐 고객에게 뜻이 없습니다. **단, 표 안에서 항목을 가리키는 열이면 남깁니다** |
16
+ | 원본 파일명·경로 | 내부 구조 노출 |
17
+ | 작성 지침 인용문 | `>` 로 시작하고 "~한다", "~적는다" 로 끝나는 템플릿 안내문. 우리에게 주는 지시이지 내용이 아닙니다 |
18
+ | 빈 표·빈 섹션 | 내용이 없으면 그 섹션 자체를 빼세요 |
19
+
20
+ ### `TODO(...)` 처리 — 지우지 말고 드러내세요
21
+
22
+ 본문에서는 `협의 중` 으로 바꿔 씁니다. **없는 척하지 않습니다.**
23
+ 그리고 **마지막에 `고객 확인 필요 항목` 을 따로 만들어** 무엇이 미정인지 모아
24
+ 보여주세요. 항목이 없으면 이 부분은 넣지 않습니다.
25
+
26
+ ### 지어내지 마세요
27
+
28
+ 빠진 칸을 메우려고 숫자·일정·담당자·수치를 만들지 않습니다.
29
+ 비어 있으면 `협의 중` 이고, 그게 정직한 상태입니다.
30
+
31
+ ### 다 만든 뒤 보고할 것
32
+
33
+ - 뺀 항목: 무엇을 몇 개 걸러냈는지
34
+ - `협의 중` 으로 표시한 개수
35
+ - 원본의 절 제목 개수와 산출물에 들어간 개수
@@ -1,49 +1,36 @@
1
1
  # 산출물 생성 지시 — CSV
2
2
 
3
- `__PROJECT__` 프로젝트의 문서 **`__DOC_TITLE__`** 을 CSV 로 만들어 주세요.
3
+ `__PROJECT__` 프로젝트의 **`__DOC_TITLE__`** 을 CSV 로 만들어 주세요.
4
+
5
+ CSV 는 **데이터를 넘기는 형식**입니다. 목적 설명이나 서식이 들어가지 않으므로,
6
+ 고객이 표를 바로 쓸 수 있게 만드는 것에 집중합니다.
4
7
 
5
8
  ## 원본
6
9
 
7
10
  `__DOC_FILE__` — **이 파일을 먼저 읽고**, 그 내용만으로 만듭니다.
8
- 읽을 수 없으면 만들지 말고 파일을 달라고 요청하세요.
9
11
 
10
12
  ## 결과물
11
13
 
12
- 파일 여러 개로 나눕니다.
14
+ 원본의 표를 하나씩 파일로 떨어뜨립니다. **파일명은 내용을 말하게** 지으세요 —
15
+ `__DOC_STEM___구축범위.csv` 처럼. `표1.csv` 같은 이름은 쓰지 마세요.
16
+
17
+ 본문 설명은 CSV 로 만들지 않습니다. 설명이 필요하면 PDF·엑셀을 쓰세요.
13
18
 
14
- | 파일 | 내용 |
15
- | --- | --- |
16
- | `__DOC_STEM___개요.csv` | 본문 전체를 구조화한 것 |
17
- | `__DOC_STEM___표1.csv`, `표2.csv` … | 원본의 표를 순서대로 하나씩 |
19
+ __SCOPE__
18
20
 
19
21
  ## 인코딩 — 이것만은 반드시
20
22
 
21
23
  **UTF-8 with BOM(`utf-8-sig`) 으로 저장합니다.** BOM 이 없으면 엑셀에서 열 때
22
- 한글이 깨집니다. 이 한 가지가 CSV 산출물에서 가장 자주 나는 사고입니다.
23
-
24
- 줄바꿈은 `\r\n`, 값에 쉼표·따옴표·줄바꿈이 있으면 큰따옴표로 감싸고 내부
25
- 따옴표는 두 번 씁니다 (표준 CSV 규칙).
26
-
27
- ## 개요 CSV 형식
24
+ 한글이 깨집니다. CSV 산출물에서 가장 자주 나는 사고입니다.
28
25
 
29
- 머리행은 `구분,섹션,하위,내용` 고정입니다.
26
+ 줄바꿈은 `\r\n`. 값에 쉼표·따옴표·줄바꿈이 있으면 큰따옴표로 감싸고 내부 따옴표는
27
+ 두 번 씁니다 (표준 CSV 규칙).
30
28
 
31
- | 구분 | 언제 |
32
- | --- | --- |
33
- | `본문` | 문단·인용 |
34
- | `목록` | 불릿 항목 하나당 한 줄 |
35
- | `코드` | 코드 블록. 줄바꿈은 ` ⏎ ` 로 바꿔 한 줄에 |
29
+ ## 형식
36
30
 
37
- `섹션` 가장 가까운 `##`, `하위` 가장 가까운 `###`/`####` 입니다.
38
-
39
- ## 표 CSV 형식
40
-
41
- - 원본 표의 **머리행과 행 순서를 그대로** 옮깁니다
31
+ - 머리행이 **비어 있거나 중복되면 이름을 붙여 고칩니다** (`항목`, `구분 2`)
32
+ - 행 순서를 바꾸지 마세요. 원본 순서가 곧 의미입니다
42
33
  - 칸 수가 행마다 다르면 가장 넓은 행에 맞춰 빈 칸으로 채웁니다
43
34
  - 마크다운 기호(`**`, 백틱, `[[링크]]`)는 벗겨내고 글자만 남깁니다
44
35
 
45
- ## 지켜야
46
-
47
- - 값을 정렬하거나 합치지 마세요. 원본 순서가 곧 의미입니다.
48
- - 원본의 `TODO(...)` 는 그대로 남깁니다.
49
- - 다 만든 뒤, 만든 파일 목록과 각 파일의 행 수를 알려주세요.
36
+ 만든 파일 목록과 각 파일의 행 수를 알려주세요.
@@ -1,6 +1,6 @@
1
1
  # 산출물 생성 지시 — 워드 (DOCX)
2
2
 
3
- `__PROJECT__` 프로젝트의 문서 **`__DOC_TITLE__`** 을 워드 산출물로 만들어 주세요.
3
+ `__PROJECT__` 프로젝트의 **`__DOC_TITLE__`** 을 고객 송부용 워드로 만들어 주세요.
4
4
 
5
5
  ## 원본
6
6
 
@@ -9,27 +9,27 @@
9
9
 
10
10
  ## 결과물
11
11
 
12
- - 파일명: `__DOC_STEM__.docx`
13
- - A4 세로, 위아래 여백 2.2cm, 좌우 2.4cm
12
+ `__DOC_STEM__.docx` — A4 세로, 위아래 2.2cm, 좌우 2.4cm
13
+
14
+ __SHAPE__
15
+
16
+ __PURPOSE__
17
+
18
+ __SCOPE__
14
19
 
15
20
  __STYLE__
16
21
 
17
- ## 워드 고유 규칙
22
+ ## 워드 구성
18
23
 
19
- 1. 본문 기본 10pt, 줄간격 1.5, 문단 간격 6pt.
20
- 2. 제목 22pt 굵게 바로 아래 메타 9pt 보조색 빈 줄.
21
- 3. `##` 15pt 굵게(앞 간격 16pt), `###` 12pt 굵게, `####` 10.5pt 보조색.
22
- 4. **머리글 스타일(Heading 1/2/3)을 실제로 적용**해서 목차와 탐색 창이 동작하게
24
+ 1. **첫 쪽에 목적 블록.** 제목 22pt 굵게 답하는 질문 → 핵심 수치를 1행 표로
25
+ 가로 나열(테두리 없이, 숫자 24pt 굵게 + 이름표 9pt) 받는 분이 일.
26
+ 나누기.
27
+ 2. **머리글 스타일(제목 1/2/3)을 실제로 적용**해서 탐색 창과 목차가 동작하게
23
28
  합니다. 글자 크기만 키우지 마세요.
24
- 5. 목록은 워드 글머리 기호 스타일을 씁니다.
25
- 6. 표는 `Table Grid` 기반에 공통 규격의 음영을 입힙니다. 뒤에 빈 문단 하나.
26
- 7. 인용(`>`)은 왼쪽 들여쓰기 0.6cm + 보조 글자색.
27
- 8. 한글 서체를 **동아시아 글꼴 속성에도 함께 지정**합니다. 이걸 빠뜨리면 한글만
28
- 다른 서체로 보입니다.
29
-
30
- ## 지켜야
31
-
32
- - **원본의 문장을 바꾸지 마세요.** 서식만 입힙니다.
33
- - 원본의 `TODO(...)` 는 그대로 남깁니다.
34
- - 표지·목차 페이지를 임의로 추가하지 마세요. 필요하면 따로 요청합니다.
35
- - 다 만든 뒤, 적용한 머리글 수준별 개수를 알려주세요.
29
+ 3. 본문 10pt, 줄간격 1.5, 문단 뒤 6pt.
30
+ 4. 표는 `Table Grid` 기반에 공통 규격 음영. 머리행 반복 속성을 켜세요.
31
+ 5. 한글 서체를 **동아시아 글꼴 속성에도 함께 지정**합니다. 빠뜨리면 한글만 다른
32
+ 서체로 보입니다.
33
+ 6. 목차는 넣지 않습니다. 필요하면 따로 요청합니다.
34
+
35
+ 만든 적용한 머리글 수준별 개수를 알려주세요.
@@ -1,6 +1,6 @@
1
1
  # 산출물 생성 지시 — 엑셀 (XLSX)
2
2
 
3
- `__PROJECT__` 프로젝트의 문서 **`__DOC_TITLE__`** 을 엑셀 산출물로 만들어 주세요.
3
+ `__PROJECT__` 프로젝트의 **`__DOC_TITLE__`** 을 고객 송부용 엑셀로 만들어 주세요.
4
4
 
5
5
  ## 원본
6
6
 
@@ -9,30 +9,54 @@
9
9
 
10
10
  ## 결과물
11
11
 
12
- - 파일명: `__DOC_STEM__.xlsx`
12
+ `__DOC_STEM__.xlsx`
13
+
14
+ __SHAPE__
15
+
16
+ __PURPOSE__
17
+
18
+ __SCOPE__
13
19
 
14
20
  __STYLE__
15
21
 
16
- ## 시트 구성 규칙
17
-
18
- 1. **첫 시트 `문서`**본문이 위에서 아래로 흐릅니다.
19
- - A열은 폭 3(여백용), B열은 폭 110내용을 담고 자동 줄바꿈
20
- - 제목 20pt 굵게 메타 한 줄 9pt 보조색 → 빈 줄 → 본문
21
- - `##` 14pt 굵게, `###` 12pt 굵게, `####` 11pt 보조색
22
- - 목록은 `•` 붙이고 칸 들여쓰기
23
- 2. **표는 각각 별도 시트** (`표1`, `표2`, …) 로 뺍니다.
24
- `문서` 시트의 자리에는 `→ 표1 시트 참조` 라고 강조색으로 적습니다.
25
- 3. 시트마다:
26
- - 엑셀 **표 기능(Ctrl+T)** 적용해 정렬·필터가 켜지게 합니다
27
- - 머리행 고정(고정 A2)
28
- - 열 너비는 내용에 맞춰 12~52 사이로
29
- - 얼룩무늬 켜기
30
- 4. **모든 시트에서 눈금선을 끕니다.**
22
+ ## 시트 구성
23
+
24
+ 1. **첫 시트 `요약`**목적 블록이 여기 들어갑니다.
25
+ - B2문서 제목 20pt 굵게
26
+ - 아래 답하는 질문 한 줄 11pt
27
+ - 아래 핵심 수치를 **가로로 나열**: 각 칸에 숫자 24pt 굵게, 아래 이름표
28
+ 9pt 보조색. 사이는 열로 띄웁니다
29
+ - 아래 "받는 분이 일"
30
+ 2. **그 다음 시트부터 본표** 시트 이름은 내용을 말하게 짓습니다.
31
+ `표1` `표2` 같은 이름을 쓰지 마세요. `구축범위`, `마일스톤`, `요구사항` 처럼.
32
+ 3. 시트가 다섯 개를 넘으면 성격이 가까운 표를 합치세요.
33
+ 4. **모든 시트에서 눈금선을 끕니다.** 고정은 머리행 아래(A2).
31
34
  5. 수식을 넣지 않습니다. 값만 씁니다.
32
35
 
33
- ## 지켜야
36
+ ## 표를 만들 때 — 파일 손상을 막는 규칙
37
+
38
+ 엑셀 **표 기능**(정렬·필터가 붙는 그것)을 쓸 때, 아래를 어기면 엑셀이 파일을 열며
39
+ **"파일에 오류가 있습니다 — 복구했습니다"** 를 띄웁니다. 마크다운 표를 그대로
40
+ 옮기면 자주 걸립니다.
41
+
42
+ | 규칙 | 안 지키면 |
43
+ | --- | --- |
44
+ | 머리행 셀이 **비어 있으면 안 됩니다** | 복구 발생. `항목`, `구분`, `값` 처럼 채우세요 |
45
+ | 머리행 이름이 **중복되면 안 됩니다** | 복구 발생. `구분`, `구분 2` 로 구분하세요 |
46
+ | 데이터 행이 **한 줄도 없으면** 표 기능을 적용하지 마세요 | 복구 발생. 머리행만 있으면 일반 셀로 두세요 |
47
+ | 표 이름(`displayName`)은 영문·숫자·밑줄만, 공백 없이, 파일 안에서 유일하게 | 복구 발생 |
48
+ | 표 범위(`ref`)가 실제 채운 칸과 정확히 같아야 합니다 | 복구 발생 |
49
+
50
+ 원본 표의 머리행이 비어 있거나 겹치면 **고쳐서 넣으세요.** 그대로 옮기는 것보다
51
+ 읽을 수 있는 이름을 붙이는 편이 낫습니다.
52
+
53
+ 만든 뒤 **파일을 다시 열어 경고가 없는지 확인**하고 결과를 알려주세요.
54
+
55
+ ## 표 내용
34
56
 
35
- - **표의 순서·칸 수·값을 바꾸지 마세요.** 정렬하거나 합치지 마세요.
36
- - 칸을 임의로 채우지 마세요. 원본이 비어 있으면 비워 둡니다.
37
- - 원본의 `TODO(...)` 그대로 남깁니다.
38
- - 만든 뒤, 시트 수와 표의 행 수를 알려주세요.
57
+ - 행 순서를 바꾸지 마세요. 원본 순서가 곧 의미입니다
58
+ - 수가 행마다 다르면 가장 넓은 행에 맞춰 칸으로 채웁니다
59
+ - 너비는 내용에 맞춰 12~52 사이
60
+ - 짝수 얼룩무늬, 머리행 배경 글자
61
+ - 상태·구분처럼 값이 몇 가지로 정해진 열은 **글자 그대로** 두세요.
62
+ 색 알약이나 아이콘으로 바꾸지 마세요
@@ -1,6 +1,6 @@
1
1
  # 산출물 생성 지시 — PDF
2
2
 
3
- `__PROJECT__` 프로젝트의 문서 **`__DOC_TITLE__`** 을 PDF 산출물로 만들어 주세요.
3
+ `__PROJECT__` 프로젝트의 **`__DOC_TITLE__`** 을 고객 송부용 PDF 만들어 주세요.
4
4
 
5
5
  ## 원본
6
6
 
@@ -9,27 +9,34 @@
9
9
 
10
10
  ## 결과물
11
11
 
12
- - 파일명: `__DOC_STEM__.pdf`
13
- - 용지 A4 세로, 바깥 여백 20mm
12
+ `__DOC_STEM__.pdf` — A4 세로, 바깥 여백 20mm
13
+
14
+ __SHAPE__
15
+
16
+ __PURPOSE__
17
+
18
+ __SCOPE__
14
19
 
15
20
  __STYLE__
16
21
 
17
- ## PDF 고유 규칙
18
-
19
- 1. **표지 없이 본문부터** 시작합니다. 줄이 문서 제목입니다.
20
- 2. 제목 바로 아래 줄로 메타를 넣습니다 `문서ID · 상태 · 담당 · 수정일`,
21
- 보조 글자색 9pt.
22
- 3. 모든 상단에 머리말: 왼쪽에 문서 제목, 오른쪽에 문서 ID, 그 아래 얇은 구분선.
23
- 4. 모든 쪽 하단 가운데에 쪽번호.
24
- 5. 제목(`##`)은 앞에 쪽을 강제하지 않습니다. 다만 **제목만 남고 내용이 다음
25
- 쪽으로 넘어가는 일은 없게** 합니다.
26
- 6. 인용(`>`)은 왼쪽에 강조색 세로 막대를 두고 보조 글자색으로 씁니다.
27
- 7. 코드 블록은 `#FAFAF8` 배경에 고정폭, 줄바꿈하지 말고 넘치면 줄여 씁니다.
28
- 8. 표가 쪽에 들어가면 머리행을 반복하며 나눕니다.
29
-
30
- ## 지켜야 할 것
31
-
32
- - **원본의 문장을 바꾸지 마세요.** 서식만 입힙니다. 요약·윤색·보완 금지.
33
- - 원본에 `TODO(...)` 있으면 **그대로 남깁니다.** 채우지 마세요.
34
- - 표의 순서와 수를 바꾸지 마세요.
35
- - 만든 뒤, 원본의 제목이 모두 들어갔는지 세어서 알려주세요.
22
+ ## PDF 구성
23
+
24
+ 1. **1쪽은 목적 쪽입니다.** 제목, 답하는 질문, 핵심 수치, 받는 분이 할 일.
25
+ 수치는 가로로 나란히 놓고 숫자 28pt 굵게, 이름표 9pt 보조색.
26
+ 쪽에 본문을 섞지 마세요.
27
+ 2. **2쪽부터 본문.** 가장 중요한 표가 먼저 옵니다.
28
+ 3. 모든 쪽 상단에 머리말 — 왼쪽 문서 제목, 오른쪽 프로젝트명, 아래 얇은 구분선.
29
+ **문서 ID 머리말에 넣지 마세요** (내부 표기입니다).
30
+ 4. 모든 하단 가운데 `n / 전체` 쪽번호.
31
+ 5. 제목만 남고 내용이 다음 쪽으로 넘어가지 않게 합니다.
32
+ 6. 표가 쪽에 들어가면 **머리행을 반복하며** 나눕니다.
33
+ 7. 인용은 왼쪽에 강조색 세로 막대 + 보조 글자색. 단, `_scope.md` 에서 걸러내라고
34
+ 한 작성 지침 인용문은 아예 빼세요.
35
+
36
+ ## 한글 폰트
37
+
38
+ `reportlab` 쓴다면 내장 CID 폰트 `HYGothic-Medium` 을 등록해 쓰세요.
39
+ 폰트 파일을 따로 받지 않아도 되고 한글이 깨지지 않습니다.
40
+ HTML→PDF 변환을 쓴다면 `맑은 고딕`·`Apple SD Gothic Neo` 대체 순서를 지정하세요.
41
+
42
+ 만든 뒤 **PDF 를 열어 한글이 깨지지 않았는지, 빈 쪽이 없는지** 확인하고 알려주세요.
@@ -1,6 +1,6 @@
1
1
  # 산출물 생성 지시 — 발표자료 (PPTX)
2
2
 
3
- `__PROJECT__` 프로젝트의 문서 **`__DOC_TITLE__`** 을 발표자료로 만들어 주세요.
3
+ `__PROJECT__` 프로젝트의 **`__DOC_TITLE__`** 을 고객 보고용 발표자료로 만들어 주세요.
4
4
 
5
5
  ## 원본
6
6
 
@@ -9,29 +9,31 @@
9
9
 
10
10
  ## 결과물
11
11
 
12
- - 파일명: `__DOC_STEM__.pptx`
13
- - 16:9 (13.333 × 7.5 inch)
12
+ `__DOC_STEM__.pptx` — 16:9 (13.333 × 7.5 inch)
13
+
14
+ __SHAPE__
15
+
16
+ __PURPOSE__
17
+
18
+ __SCOPE__
14
19
 
15
20
  __STYLE__
16
21
 
17
- ## 슬라이드 구성 규칙
18
-
19
- 1. **1장: 표지** — 왼쪽 끝에 강조색 세로 막대(폭 0.18in, 높이 전체).
20
- 제목은 40pt 굵게, 아래 `문서ID · 단계 · 담당 · 수정일` 13pt 보조색,
21
- 아래 문서 요약 15pt.
22
- 2. **2장부터: 원본의 `##` 하나가 슬라이드 하나.** 제목을 임의로 합치거나 쪼개지
23
- 마세요.
24
- 3. 슬라이드 제목은 24pt 굵게, 제목 왼쪽에 강조색 짧은 막대.
25
- 4. 슬라이드에 **불릿 7개, 14행을 넘기지 않습니다.** 넘치면
26
- `(이어서)` 제목으로 다음 슬라이드에 잇습니다.
27
- 5. 본문은 12pt. **문장을 통째로 넣지 말고 구(句) 단위로 끊습니다.**
28
- 단, 원본에 없는 말을 만들지는 마세요 자르기만 합니다.
29
- 6. 표는 공통 규격의 스타일 그대로. 머리행 먹 배경 흰 글자.
30
- 7. 애니메이션·화면전환 효과는 넣지 않습니다.
31
-
32
- ## 지켜야
33
-
34
- - **원본에 없는 내용을 만들지 마세요.** 특히 숫자·일정·담당자.
35
- - 원본의 `TODO(...)` 는 그대로 남깁니다. 발표자료라고 숨기지 마세요.
36
- - 마지막에 "감사합니다" 같은 빈 슬라이드를 붙이지 마세요.
37
- - 다 만든 뒤, 슬라이드 수와 원본 `##` 개수가 맞는지 알려주세요.
22
+ ## 슬라이드 구성
23
+
24
+ 1. **1 표지** — 왼쪽 끝에 강조색 세로 막대(폭 0.18in, 전체 높이).
25
+ 제목 40pt 굵게, 아래 프로젝트명과 날짜 13pt 보조색.
26
+ **담당자 이메일·문서 ID·상태를 넣지 마세요.**
27
+ 2. **2 요약** 목적 블록입니다. 답하는 질문 한 줄 + 핵심 수치 가로 나열
28
+ (숫자 44pt 굵게, 이름표 11pt) + 받는 분이 할 일.
29
+ **이 장만 봐도 무슨 문서인지 알아야 합니다.**
30
+ 3. **3장부터 본문.** 가장 중요한 표·목록이 먼저.
31
+ 4. 한 슬라이드에 **불릿 6개, 표 12행**을 넘기지 않습니다. 넘치면 `(이어서)`
32
+ 잇습니다. 글자를 줄여 억지로 맞추지 마세요.
33
+ 5. 본문 12pt 이상. **문장을 통째로 넣지 말고 구 단위로 끊습니다.**
34
+ 단, 없는 말을 만들지는 마세요 자르기만 합니다.
35
+ 6. 애니메이션·화면전환·발표자 노트 없음.
36
+ 7. 마지막에 "감사합니다" 빈 장을 붙이지 마세요. 마지막 장은
37
+ `고객 확인 필요 항목` 이거나, 없으면 본문 마지막입니다.
38
+
39
+ 만든 슬라이드 수와, 글자가 도형 밖으로 넘친 곳이 없는지 확인해 알려주세요.