@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 +104 -0
- package/README.md +11 -2
- package/package.json +1 -1
- package/skills/project-init/SKILL.md +47 -16
- package/skills/project-init/build.mjs +98 -13
- package/skills/project-init/templates/script/_purpose.md +29 -0
- package/skills/project-init/templates/script/_scope.md +35 -0
- package/skills/project-init/templates/script/csv.md +16 -29
- package/skills/project-init/templates/script/docx.md +20 -20
- package/skills/project-init/templates/script/excel.md +46 -22
- package/skills/project-init/templates/script/pdf.md +29 -22
- package/skills/project-init/templates/script/pptx.md +26 -24
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
|
@@ -411,27 +411,58 @@ npm view react versions --json # 선택지가 필요하면
|
|
|
411
411
|
|
|
412
412
|
## 파일 스크립트 — 산출물 생성 대본
|
|
413
413
|
|
|
414
|
-
빌드한 HTML 의 각 문서 우측
|
|
415
|
-
|
|
416
|
-
복사해서 에이전트에 붙여 넣으면 그 형식으로 산출물을 만든다.
|
|
414
|
+
빌드한 HTML 의 각 문서 우측 상단 **`파일 스크립트`** 버튼을 누르면 형식(PDF ·
|
|
415
|
+
Excel · PowerPoint · Word · CSV)을 고를 수 있고, **AI 에게 줄 지시문(대본)** 이
|
|
416
|
+
나온다. 코드가 아니다. 복사해서 에이전트에 붙여 넣으면 그 형식으로 산출물을 만든다.
|
|
417
417
|
|
|
418
|
-
|
|
418
|
+
**전제: 이 산출물은 고객사에 송부된다.** 그래서 대본은 네 겹으로 쌓인다.
|
|
419
419
|
|
|
420
|
-
|
|
421
|
-
|
|
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
|
-
|
|
426
|
-
라고 지시한다. 그래서 문서를 고친 뒤 같은 대본을 다시 써도 최신 내용으로 만들어지고,
|
|
427
|
-
HTML 크기가 문서 수와 무관하다.
|
|
457
|
+
### 대본은 내용을 품지 않는다
|
|
428
458
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
`
|
|
459
|
+
원본 `.md` 경로만 가리키고 "이 파일을 먼저 읽어라" 라고 지시한다. 그래서 문서를
|
|
460
|
+
고친 뒤 같은 대본을 다시 써도 최신 내용으로 만들어지고, HTML 크기가 문서 수와
|
|
461
|
+
무관하다. 치환(`__DOC_FILE__` · `__DOC_TITLE__` · `__DOC_STEM__` · `__SHAPE__`)은
|
|
462
|
+
모달을 열 때 브라우저에서 일어난다.
|
|
432
463
|
|
|
433
|
-
|
|
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
|
-
* 그 형식으로 산출물을 만든다.
|
|
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
|
|
1317
|
-
|
|
1318
|
-
|
|
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({
|
|
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
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
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
|
|
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__` 프로젝트의
|
|
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
|
-
한글이 깨집니다.
|
|
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__` 프로젝트의
|
|
3
|
+
`__PROJECT__` 프로젝트의 **`__DOC_TITLE__`** 을 고객 송부용 워드로 만들어 주세요.
|
|
4
4
|
|
|
5
5
|
## 원본
|
|
6
6
|
|
|
@@ -9,27 +9,27 @@
|
|
|
9
9
|
|
|
10
10
|
## 결과물
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
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.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
1. **첫 쪽에 목적 블록.** 제목 22pt 굵게 → 답하는 질문 → 핵심 수치를 1행 표로
|
|
25
|
+
가로 나열(테두리 없이, 숫자 24pt 굵게 + 이름표 9pt) → 받는 분이 할 일.
|
|
26
|
+
그 뒤 쪽 나누기.
|
|
27
|
+
2. **머리글 스타일(제목 1/2/3)을 실제로 적용**해서 탐색 창과 목차가 동작하게
|
|
23
28
|
합니다. 글자 크기만 키우지 마세요.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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__` 프로젝트의
|
|
3
|
+
`__PROJECT__` 프로젝트의 **`__DOC_TITLE__`** 을 고객 송부용 엑셀로 만들어 주세요.
|
|
4
4
|
|
|
5
5
|
## 원본
|
|
6
6
|
|
|
@@ -9,30 +9,54 @@
|
|
|
9
9
|
|
|
10
10
|
## 결과물
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
-
|
|
38
|
-
-
|
|
57
|
+
- 행 순서를 바꾸지 마세요. 원본 순서가 곧 의미입니다
|
|
58
|
+
- 칸 수가 행마다 다르면 가장 넓은 행에 맞춰 빈 칸으로 채웁니다
|
|
59
|
+
- 열 너비는 내용에 맞춰 12~52 사이
|
|
60
|
+
- 짝수 행 얼룩무늬, 머리행 먹 배경 흰 글자
|
|
61
|
+
- 상태·구분처럼 값이 몇 가지로 정해진 열은 **글자 그대로** 두세요.
|
|
62
|
+
색 알약이나 아이콘으로 바꾸지 마세요
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 산출물 생성 지시 — PDF
|
|
2
2
|
|
|
3
|
-
`__PROJECT__` 프로젝트의
|
|
3
|
+
`__PROJECT__` 프로젝트의 **`__DOC_TITLE__`** 을 고객 송부용 PDF로 만들어 주세요.
|
|
4
4
|
|
|
5
5
|
## 원본
|
|
6
6
|
|
|
@@ -9,27 +9,34 @@
|
|
|
9
9
|
|
|
10
10
|
## 결과물
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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__` 프로젝트의
|
|
3
|
+
`__PROJECT__` 프로젝트의 **`__DOC_TITLE__`** 을 고객 보고용 발표자료로 만들어 주세요.
|
|
4
4
|
|
|
5
5
|
## 원본
|
|
6
6
|
|
|
@@ -9,29 +9,31 @@
|
|
|
9
9
|
|
|
10
10
|
## 결과물
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
2. **2
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
+
만든 뒤 슬라이드 수와, 글자가 도형 밖으로 넘친 곳이 없는지 확인해 알려주세요.
|