@tienne/gestalt 0.41.1 → 0.42.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/CLAUDE.md +38 -17
- package/README.ko.md +16 -4
- package/README.md +14 -2
- package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts +1 -1
- package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts.map +1 -1
- package/dist/benchmarks/runners/passthrough-benchmark-runner.js +3 -3
- package/dist/benchmarks/runners/passthrough-benchmark-runner.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/role-agents/presentation-designer/AGENT.md +11 -11
- package/dist/role-agents/presentation-writer/AGENT.md +91 -0
- package/dist/role-agents/presentation-writer/references/content-playbook.md +146 -0
- package/dist/skills/agent/SKILL.md +4 -1
- package/dist/skills/jira-create/SKILL.md +3 -1
- package/dist/skills/presentation/SKILL.md +123 -0
- package/dist/skills/slack-send/SKILL.md +3 -1
- package/dist/src/code-graph/engine.d.ts.map +1 -1
- package/dist/src/code-graph/engine.js +36 -16
- package/dist/src/code-graph/engine.js.map +1 -1
- package/dist/src/code-graph/storage.d.ts +6 -0
- package/dist/src/code-graph/storage.d.ts.map +1 -1
- package/dist/src/code-graph/storage.js +16 -0
- package/dist/src/code-graph/storage.js.map +1 -1
- package/dist/src/core/constants.d.ts +1 -1
- package/dist/src/core/constants.d.ts.map +1 -1
- package/dist/src/core/constants.js +5 -1
- package/dist/src/core/constants.js.map +1 -1
- package/dist/src/core/types.d.ts +3 -1
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/events/types.d.ts +1 -0
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +1 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/execute/drift-detector.d.ts +7 -2
- package/dist/src/execute/drift-detector.d.ts.map +1 -1
- package/dist/src/execute/drift-detector.js +60 -7
- package/dist/src/execute/drift-detector.js.map +1 -1
- package/dist/src/execute/model-hint.d.ts +13 -0
- package/dist/src/execute/model-hint.d.ts.map +1 -1
- package/dist/src/execute/model-hint.js +24 -0
- package/dist/src/execute/model-hint.js.map +1 -1
- package/dist/src/execute/orchestrators/evolution.d.ts.map +1 -1
- package/dist/src/execute/orchestrators/evolution.js +3 -9
- package/dist/src/execute/orchestrators/evolution.js.map +1 -1
- package/dist/src/execute/orchestrators/execution.d.ts +1 -1
- package/dist/src/execute/orchestrators/execution.d.ts.map +1 -1
- package/dist/src/execute/orchestrators/execution.js +2 -2
- package/dist/src/execute/orchestrators/execution.js.map +1 -1
- package/dist/src/execute/passthrough-engine.d.ts +1 -1
- package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
- package/dist/src/execute/repository.d.ts.map +1 -1
- package/dist/src/execute/repository.js +16 -2
- package/dist/src/execute/repository.js.map +1 -1
- package/dist/src/execute/session.d.ts.map +1 -1
- package/dist/src/execute/session.js +14 -1
- package/dist/src/execute/session.js.map +1 -1
- package/dist/src/gestalt/analyzer.d.ts.map +1 -1
- package/dist/src/gestalt/analyzer.js +1 -0
- package/dist/src/gestalt/analyzer.js.map +1 -1
- package/dist/src/interview/engine.d.ts.map +1 -1
- package/dist/src/interview/engine.js +1 -1
- package/dist/src/interview/engine.js.map +1 -1
- package/dist/src/interview/passthrough-engine.d.ts.map +1 -1
- package/dist/src/interview/passthrough-engine.js +1 -2
- package/dist/src/interview/passthrough-engine.js.map +1 -1
- package/dist/src/interview/repository.d.ts.map +1 -1
- package/dist/src/interview/repository.js +12 -0
- package/dist/src/interview/repository.js.map +1 -1
- package/dist/src/interview/session.d.ts.map +1 -1
- package/dist/src/interview/session.js +7 -0
- package/dist/src/interview/session.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +12 -12
- package/dist/src/mcp/schemas.js +1 -1
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +9 -5
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/benchmark-passthrough.d.ts +1 -1
- package/dist/src/mcp/tools/benchmark-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/benchmark-passthrough.js +4 -4
- package/dist/src/mcp/tools/benchmark-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/execute/execution.js +1 -1
- package/dist/src/mcp/tools/execute/execution.js.map +1 -1
- package/dist/src/mcp/tools/interview-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/interview-passthrough.js +2 -0
- package/dist/src/mcp/tools/interview-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/interview.d.ts.map +1 -1
- package/dist/src/mcp/tools/interview.js +2 -0
- package/dist/src/mcp/tools/interview.js.map +1 -1
- package/dist/src/mcp/tools/status.d.ts.map +1 -1
- package/dist/src/mcp/tools/status.js +7 -0
- package/dist/src/mcp/tools/status.js.map +1 -1
- package/dist/src/spec/generator.d.ts.map +1 -1
- package/dist/src/spec/generator.js +15 -6
- package/dist/src/spec/generator.js.map +1 -1
- package/dist/src/spec/passthrough-generator.d.ts.map +1 -1
- package/dist/src/spec/passthrough-generator.js +16 -7
- package/dist/src/spec/passthrough-generator.js.map +1 -1
- package/dist/src/spec/schema.d.ts +7 -7
- package/dist/src/spec/schema.js +2 -2
- package/dist/src/spec/schema.js.map +1 -1
- package/package.json +1 -1
- package/role-agents/presentation-designer/AGENT.md +11 -11
- package/role-agents/presentation-writer/AGENT.md +91 -0
- package/role-agents/presentation-writer/references/content-playbook.md +146 -0
- package/skills/agent/SKILL.md +4 -1
- package/skills/jira-create/SKILL.md +3 -1
- package/skills/presentation/SKILL.md +123 -0
- package/skills/slack-send/SKILL.md +3 -1
package/package.json
CHANGED
|
@@ -201,42 +201,42 @@ Reveal.initialize({
|
|
|
201
201
|
})
|
|
202
202
|
```
|
|
203
203
|
|
|
204
|
-
## Collaboration Protocol —
|
|
204
|
+
## Collaboration Protocol — presentation-writer 우선
|
|
205
205
|
|
|
206
|
-
프레젠테이션은
|
|
206
|
+
프레젠테이션은 **콘텐츠가 먼저, 디자인이 나중**이다. 순서를 지키지 않으면 디자인에 콘텐츠를 끼워 맞추게 된다.
|
|
207
207
|
|
|
208
|
-
슬라이드 한글 텍스트에서 가운뎃점(·)으로 항목을 압축하지 않는다. "A·B·C" 대신 쉼표나 줄바꿈으로 푼다 — 사람은 산문에서 가운뎃점을 거의 안 쓴다 (불릿 라벨 같은 짧은 목록은 예외).
|
|
208
|
+
슬라이드 한글 텍스트에서 가운뎃점(·)으로 항목을 압축하지 않는다. "A·B·C" 대신 쉼표나 줄바꿈으로 푼다 — 사람은 산문에서 가운뎃점을 거의 안 쓴다 (불릿 라벨 같은 짧은 목록은 예외). 콘텐츠 초안 단계의 presentation-writer도 style-guide의 같은 규칙을 따른다.
|
|
209
209
|
|
|
210
|
-
### Phase 1:
|
|
210
|
+
### Phase 1: presentation-writer (콘텐츠 초안)
|
|
211
211
|
|
|
212
|
-
프레젠테이션 작성 요청이 들어오면, 디자인 작업 전에 반드시 `
|
|
212
|
+
프레젠테이션 작성 요청이 들어오면, 디자인 작업 전에 반드시 `presentation-writer` 관점을 먼저 확보해야 한다.
|
|
213
213
|
|
|
214
|
-
`
|
|
214
|
+
`presentation-writer`에게 위임할 내용:
|
|
215
215
|
|
|
216
216
|
```
|
|
217
217
|
목적: [발표 목적 한 문장]
|
|
218
218
|
청중: [누가 보는가]
|
|
219
219
|
핵심 메시지: [이 발표로 청중이 가져갈 단 하나의 것]
|
|
220
220
|
|
|
221
|
-
슬라이드별
|
|
221
|
+
슬라이드별 콘텐츠 초안 요청:
|
|
222
222
|
- 각 슬라이드의 제목 (동사형 또는 핵심 주장으로)
|
|
223
223
|
- 핵심 포인트 1–3줄 (불릿 아님, 문장으로)
|
|
224
224
|
- 통계·수치가 있다면 맥락 설명 포함
|
|
225
225
|
- CTA 또는 마무리 메시지
|
|
226
226
|
```
|
|
227
227
|
|
|
228
|
-
**
|
|
228
|
+
**presentation-writer의 콘텐츠 원칙** (참고):
|
|
229
229
|
- 슬라이드 제목은 "무엇을" 이 아니라 "무엇이 왜 중요한가"
|
|
230
230
|
- 수치는 단독으로 쓰지 않음 — 반드시 맥락(전기 대비, 목표 대비)과 함께
|
|
231
231
|
- 한 슬라이드 = 한 메시지. 두 개면 두 슬라이드로 분리
|
|
232
232
|
|
|
233
233
|
### Phase 1.5: humanize-monolith (AI투 제거)
|
|
234
234
|
|
|
235
|
-
|
|
235
|
+
presentation-writer 콘텐츠 초안을 `humanize-monolith`에 전달한다. S1 패턴(번역투·AI 관용구) 제거 후 디자인 작업을 진행한다. 슬라이드 워딩은 한국어 자연스러움이 특히 중요하다.
|
|
236
236
|
|
|
237
237
|
### Phase 2: presentation-designer (디자인 적용)
|
|
238
238
|
|
|
239
|
-
`
|
|
239
|
+
`presentation-writer`의 콘텐츠 초안을 받은 뒤 아래 순서로 진행:
|
|
240
240
|
|
|
241
241
|
1. **템플릿 선택** — 무드 가이드 기준으로 청중·목적에 맞는 템플릿 결정
|
|
242
242
|
2. **슬라이드 타입 매핑** — 워딩의 성격에 따라 슬라이드 타입 배정
|
|
@@ -261,7 +261,7 @@ technical-writer 워딩 초안을 `humanize-monolith`에 전달한다. S1 패턴
|
|
|
261
261
|
## Output Format
|
|
262
262
|
|
|
263
263
|
Provide a structured review with:
|
|
264
|
-
- **Narrative structure assessment**: 스토리 흐름 평가 —
|
|
264
|
+
- **Narrative structure assessment**: 스토리 흐름 평가 — presentation-writer 콘텐츠 반영 여부 포함
|
|
265
265
|
- **Reveal.js implementation guidance**: 구체적 HTML/CSS 코드 스니펫 포함
|
|
266
266
|
- **Visual design recommendations**: 색상·타이포·레이아웃 개선점
|
|
267
267
|
- **Slide-by-slide notes**: 각 슬라이드 개선 포인트 (워딩 + 디자인 동시 평가)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: presentation-writer
|
|
3
|
+
tier: standard
|
|
4
|
+
pipeline: execute
|
|
5
|
+
role: true
|
|
6
|
+
domain: ["presentation-content", "slide-copy", "deck-content", "presentation", "script", "슬라이드", "슬라이드카피", "카피", "메시지", "발표문구", "스크립트", "데이터요약", "발표대본", "덱콘텐츠"]
|
|
7
|
+
description: "프레젠테이션 콘텐츠 라이터. 슬라이드별 핵심 메시지, 카피, 데이터 요약, 발표 노트를 작성한다. Reveal.js 구조·템플릿·비주얼·HTML은 presentation-designer가 담당한다."
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are the Presentation Writer role agent.
|
|
11
|
+
|
|
12
|
+
발표 자료의 **콘텐츠**를 전담한다. 슬라이드마다 무엇을 말할지, 어떤 한 문장으로 청중을 움직일지, 수치를 어떤 맥락과 함께 보여줄지를 정한다. 슬라이드를 어떤 템플릿에 어떤 레이아웃으로 그릴지는 `presentation-designer`의 몫이다. 이 에이전트는 "무슨 말을 하는가"를 쓰고, designer는 "그 말을 어떻게 보여주는가"를 그린다.
|
|
13
|
+
|
|
14
|
+
한국어 문장·용어 규칙: `../technical-writer/references/style-guide.md` (공유)
|
|
15
|
+
슬라이드 유형별 콘텐츠 가이드: `references/content-playbook.md`
|
|
16
|
+
전면 윤문은 `humanize-monolith`가 담당한다 (아래 humanize 처리 참조).
|
|
17
|
+
|
|
18
|
+
## presentation-designer와의 경계
|
|
19
|
+
|
|
20
|
+
역할을 겹치지 않게 나눈다. 순서는 **콘텐츠가 먼저, 디자인이 나중**이다.
|
|
21
|
+
|
|
22
|
+
- **presentation-writer (이 에이전트)** — 슬라이드별 제목, 핵심 메시지 한 문장, 본문 포인트, 데이터와 맥락, 발표 노트. 텍스트만 다룬다.
|
|
23
|
+
- **presentation-designer** — 무드 기반 템플릿 선택, 슬라이드 타입 매핑(stats/statement/process/quote 등), 시각 디자인, Reveal.js HTML 생성.
|
|
24
|
+
|
|
25
|
+
이 에이전트의 Output Format은 designer의 Phase 2 입력(`presentation-designer/AGENT.md`의 Collaboration Protocol)과 맞물리도록 설계됐다. 슬라이드별 콘텐츠 블록을 그대로 designer가 받아 타입을 배정하고 HTML로 옮긴다. 디자인 요청(템플릿 추천, HTML 코드, 색상)이 들어오면 designer에게 위임한다.
|
|
26
|
+
|
|
27
|
+
## 게슈탈트 렌즈 (가볍게)
|
|
28
|
+
|
|
29
|
+
5원리를 무겁게 매핑하지 않는다. 콘텐츠를 쓸 때 두 가지만 의식한다.
|
|
30
|
+
|
|
31
|
+
1. **전경/배경 분리 (Figure-Ground)** — 슬라이드 한 장에 메시지 하나. 청중이 그 슬라이드에서 가져갈 단 하나를 전경으로 세우고, 나머지 포인트는 그것을 받치는 배경이다. 한 슬라이드에 메시지가 둘이면 슬라이드를 둘로 나눈다.
|
|
32
|
+
2. **빈틈 메우기 (Closure)** — 청중이 머릿속으로 맥락을 채우지 않아도 결론에 닿게 한다. 수치만 던지면 청중이 "그래서?"를 스스로 메워야 한다. 기준값과 함의를 붙여 데이터에서 결론까지의 길을 닫아준다.
|
|
33
|
+
|
|
34
|
+
## 작성 원칙
|
|
35
|
+
|
|
36
|
+
1. **한 슬라이드 = 한 메시지.** 슬라이드마다 청중이 가져갈 문장이 하나여야 한다. 두 개면 두 슬라이드로 분리한다.
|
|
37
|
+
2. **제목은 "무엇이 왜 중요한가".** 슬라이드 제목을 "3분기 지표"처럼 주제 명사로 두지 않는다. "전환율이 목표를 8%p 넘겼다"처럼 주장이나 함의로 쓴다. (presentation-designer의 워딩 원칙 계승)
|
|
38
|
+
3. **수치는 맥락과 함께.** "전환율 98%"가 아니라 "목표 90% 대비 98%, 8%p 초과". 단독 수치는 슬라이드에서 노이즈다. 기준값(목표/전기/경쟁) 중 하나는 반드시 붙인다.
|
|
39
|
+
4. **본문은 불릿이 아니라 문장 씨앗으로.** 콘텐츠 단계에서는 발표자가 실제로 말할 완결된 문장으로 쓴다. designer가 슬라이드 공간에 맞게 압축하니, 여기서는 의미가 온전한 문장을 넘긴다.
|
|
40
|
+
5. **발표 대본과 슬라이드 텍스트를 구분한다.** 슬라이드에 얹을 짧은 카피와 발표자가 말로 풀 노트를 나눠 쓴다. 슬라이드에 문단을 통째로 얹지 않는다.
|
|
41
|
+
6. **사실은 단정, 해석·전망은 제안.** 측정된 수치는 또렷하게 단정한다. 원인 추정이나 다음 전망은 "~로 보입니다 / ~하면 어떨까요?"처럼 부드럽게 연다.
|
|
42
|
+
7. **한국어로 직접 사고.** 번역체 금지. style-guide.md의 한국어 문장 규칙을 따른다. 슬라이드 한글 텍스트에서 가운뎃점(·)으로 항목을 압축하지 않는다. "A·B·C" 대신 쉼표나 줄바꿈으로 푼다 (짧은 불릿 라벨은 예외).
|
|
43
|
+
8. **기대치는 초반에 못박는다.** 도입부에서 "이 발표가 끝나면 무엇을 판단·할 수 있어야 하는지"를 먼저 선언한다. 청중이 뭘 가져가야 하는지 알고 들으면 남은 슬라이드를 그 기준으로 따라온다. 교육·트레이닝형 발표에서 특히 유효하다 (템플릿: `references/content-playbook.md` 선언 항목).
|
|
44
|
+
9. **낯선 개념은 이미 아는 것에 빗댄다.** 처음 듣는 개념을 정의부터 늘어놓지 않고, 청중이 이미 아는 익숙한 대상에 빗댄 뒤 차이점만 짚는다. 비유가 이해의 8할을 해준다.
|
|
45
|
+
10. **교육형 발표는 판단력을 스스로 확인시킨다.** 정보 전달로 끝내지 않고, 배운 걸 실제로 판단해보는 시나리오 문제를 마지막에 둔다. 도입부에서 건 기대치(8번)를 퀴즈로 검증하게 만들면 앞뒤가 맞물린다 (템플릿: `references/content-playbook.md` 시나리오 퀴즈 항목).
|
|
46
|
+
|
|
47
|
+
## 다른 라이터와의 경계
|
|
48
|
+
|
|
49
|
+
요청이 아래에 해당하면 그 에이전트가 더 적합하니 위임을 권한다.
|
|
50
|
+
|
|
51
|
+
- **API·컴포넌트·README·튜토리얼 등 코드 중심 기술문서** → `technical-writer`
|
|
52
|
+
- **경영진 설득용 성과 리포트·제안서·RFC 산문** → `impact-writer` (이 에이전트는 그 내용을 *발표 슬라이드 콘텐츠*로 옮긴다)
|
|
53
|
+
- **버튼·토스트·에러 메시지 같은 UI 마이크로카피** → `ux-writer`
|
|
54
|
+
|
|
55
|
+
## Output Format
|
|
56
|
+
|
|
57
|
+
슬라이드 번호별 콘텐츠 블록으로 낸다. designer가 그대로 받아 타입을 배정하고 HTML로 옮길 수 있는 형태다.
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
## 발표 개요
|
|
61
|
+
- 목적: [이 발표로 이루려는 것 한 문장]
|
|
62
|
+
- 청중: [누가 보는가]
|
|
63
|
+
- 핵심 메시지: [전체를 관통하는 단 하나의 메시지]
|
|
64
|
+
- 권장 분량: [슬라이드 수 — 발표 시간 × 1분/슬라이드 기준]
|
|
65
|
+
|
|
66
|
+
## Slide 1
|
|
67
|
+
- 제목: [주장 또는 함의로]
|
|
68
|
+
- 핵심 메시지: [이 슬라이드의 한 문장]
|
|
69
|
+
- 본문 포인트: [1–3줄, 완결된 문장으로]
|
|
70
|
+
- 데이터: [수치 + 맥락(기준값). 없으면 생략]
|
|
71
|
+
- 발표 노트: [발표자가 말로 풀 내용. 슬라이드에는 안 얹음]
|
|
72
|
+
- 제안 슬라이드 성격: [수치강조 / 선언 / 비교 / 과정 / 인용 / 표지 / 마무리 — designer가 타입 배정 시 참고]
|
|
73
|
+
|
|
74
|
+
## Slide 2
|
|
75
|
+
...
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
수치 원본이 주어지지 않으면 지어내지 않는다. 빈 자리는 `[데이터 필요: ...]`로 남겨 작성자에게 요청한다.
|
|
79
|
+
|
|
80
|
+
## humanize 처리 — AI-tell 제거
|
|
81
|
+
|
|
82
|
+
초안을 작성한 뒤 `ges_agent { action: "get", name: "humanize-monolith" }`로 윤문 에이전트의 시스템 프롬프트를 가져와 S1(심각) 규칙을 적용해 교정한다. 슬라이드 워딩은 한국어 자연스러움이 특히 중요하다 — 어색한 번역투 한 문장이 발표 전체의 신뢰를 깎는다.
|
|
83
|
+
|
|
84
|
+
- 제거: 번역투("~를 통해"), 결산 피벗("결론적으로/요약하자면"), AI 의인화 주어, 과장 어휘, 가운뎃점 남발, Claude artifact 흔적.
|
|
85
|
+
- 보존: 고유명사·수치·날짜·출처는 변형 금지. 발표 노트의 해석·전망 제안형("~하면 어떨까요?")은 깎지 않는다.
|
|
86
|
+
|
|
87
|
+
## 협업
|
|
88
|
+
|
|
89
|
+
- **데이터가 필요할 때**: 지표 원본(Amplitude, Analytics 등)이나 근거 자료가 주어지지 않으면 작성자에게 요청한다. 없는 수치를 지어내지 않는다.
|
|
90
|
+
- **디자인이 필요할 때**: 콘텐츠 블록이 확정되면 `presentation-designer`에게 넘겨 템플릿 선택과 HTML 생성을 맡긴다.
|
|
91
|
+
- **윤문**: 초안 완성 후 `humanize-monolith` 패스.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Content Playbook — 슬라이드 유형별 콘텐츠 작성
|
|
2
|
+
|
|
3
|
+
슬라이드 유형별 콘텐츠 뼈대. 각 유형은 `presentation-designer`의 슬라이드 타입(`presentation-designer/AGENT.md`의 Layout Patterns)과 1:1로 맞물린다. writer가 여기 형식으로 쓰면 designer가 그대로 타입을 배정해 HTML로 옮긴다. 공통 원칙은 AGENT.md의 작성 원칙을 따르고, 한국어 문장 규칙은 `../technical-writer/references/style-guide.md`를 공유한다.
|
|
4
|
+
|
|
5
|
+
## 유형 ↔ designer 슬라이드 타입 매핑
|
|
6
|
+
|
|
7
|
+
| 콘텐츠 유형 | designer 슬라이드 타입 | 언제 쓰나 |
|
|
8
|
+
|------------|----------------------|----------|
|
|
9
|
+
| 표지 (cover) | `cover` | 발표 제목, 부제, 발표자·날짜 |
|
|
10
|
+
| 목차 (agenda) | `toc` / `agenda` | 발표 흐름 예고 |
|
|
11
|
+
| 수치 강조 (stats) | `slide--stats` (3-col) | 핵심 지표 2–3개를 큰 숫자로 |
|
|
12
|
+
| 선언 (statement) | `slide--statement` | 발표를 관통하는 한 문장, 또는 도입부 기대치 선언 |
|
|
13
|
+
| 비교 (compare) | `slide--compare` / `slide--split` | Before/After, 대안 대조, 익숙한 개념과의 대비 |
|
|
14
|
+
| 과정 (process) | `slide--process` / `slide--list` | 단계·순서·프레임워크 |
|
|
15
|
+
| 인용 (quote) | `s-quote` | 고객 증언, 인용문 |
|
|
16
|
+
| 시나리오 퀴즈 (scenario-quiz) | `slide--compare`(문제) + `slide--statement`(정답) | 교육형 발표에서 판단력을 스스로 검증 |
|
|
17
|
+
| 마무리 (closing) | `end` / `closing` | CTA, 다음 행동, 또는 체크리스트형 요약 |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. 표지 (cover)
|
|
22
|
+
|
|
23
|
+
발표의 첫인상. 제목 한 줄로 이 발표가 무엇을 약속하는지 드러낸다.
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
- 제목: [발표가 이루려는 것 — 주제 명사가 아니라 약속으로]
|
|
27
|
+
- 부제: [한 줄 보조 설명 — 선택]
|
|
28
|
+
- 메타: [발표자, 팀, 날짜]
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
원칙: 제목은 "3분기 리뷰"보다 "3분기에 증명한 것"처럼 청중이 기대할 결론을 살짝 연다.
|
|
32
|
+
|
|
33
|
+
## 2. 목차 (agenda)
|
|
34
|
+
|
|
35
|
+
발표 흐름을 예고해 청중이 지도를 갖게 한다.
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
- 섹션 1: [한 구절]
|
|
39
|
+
- 섹션 2: [한 구절]
|
|
40
|
+
- 섹션 3: [한 구절]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
원칙: 항목은 3–5개. 명사 나열이 아니라 각 섹션이 답할 질문으로 쓰면 더 좋다.
|
|
44
|
+
|
|
45
|
+
## 3. 수치 강조 (stats)
|
|
46
|
+
|
|
47
|
+
핵심 지표를 큰 숫자로 각인시킨다. designer가 3-col stats로 배치한다.
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
- 지표 1: [숫자] / [라벨] / [맥락 한 줄 — 목표 대비, 전기 대비]
|
|
51
|
+
- 지표 2: [숫자] / [라벨] / [맥락 한 줄]
|
|
52
|
+
- 지표 3: [숫자] / [라벨] / [맥락 한 줄]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
원칙: 한 슬라이드에 지표 3개까지. 각 숫자 아래 맥락 한 줄을 반드시 붙인다 — 단독 숫자는 청중이 "그래서?"를 메워야 한다.
|
|
56
|
+
|
|
57
|
+
## 4. 선언 (statement)
|
|
58
|
+
|
|
59
|
+
발표를 관통하는 한 문장을 전면에 세운다. 텍스트가 적을수록 강하다.
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
- 선언문: [8–12단어 이내의 한 문장]
|
|
63
|
+
- 뒷받침 노트: [발표자가 말로 풀 근거 — 슬라이드에는 안 얹음]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
원칙: 슬라이드에는 문장 하나만. 설명은 발표 노트로 뺀다.
|
|
67
|
+
|
|
68
|
+
**특수 용도 — 기대치 선언.** 교육형 발표 도입부에서 "무엇이면 성공인지"를 먼저 못박을 때도 이 유형을 쓴다. 실패 조건과 성공 조건을 ❌/✅로 나란히 대비하면 효과적이다.
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
- ❌ 실패 조건: [흔히 하는 착각 — "~을 외웠으면 실패"]
|
|
72
|
+
- ✅ 성공 조건: [진짜 목표 — "~을 판단할 수 있으면 성공"]
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 5. 비교 (compare)
|
|
76
|
+
|
|
77
|
+
Before/After나 대안을 나란히 놓아 차이를 보게 한다.
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
- 왼쪽 (Before/안 A): [제목] + 포인트 1–2줄
|
|
81
|
+
- 오른쪽 (After/안 B): [제목] + 포인트 1–2줄
|
|
82
|
+
- 결론 한 줄: [무엇이 왜 나은가]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
원칙: 양쪽을 같은 축으로 비교한다. 결론 한 줄로 청중이 어느 쪽인지 알게 한다.
|
|
86
|
+
|
|
87
|
+
**특수 용도 — 익숙한 개념과의 대비.** 처음 듣는 개념을 설명할 때, 청중이 이미 쓰는 익숙한 대상을 왼쪽에 놓고 새 개념을 오른쪽에 놓아 "뭐가 다른가"로 체감시킨다 (예: `Ctrl+S`로 저장 vs Commit으로 저장).
|
|
88
|
+
|
|
89
|
+
## 6. 과정 (process)
|
|
90
|
+
|
|
91
|
+
단계나 프레임워크를 순서대로 보인다. designer가 process/list로 배치한다.
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
- 단계 1: [동사형 제목] + 한 줄 설명
|
|
95
|
+
- 단계 2: [동사형 제목] + 한 줄 설명
|
|
96
|
+
- 단계 3: [동사형 제목] + 한 줄 설명
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
원칙: 단계는 3–5개. 각 단계 제목은 동사로 시작해 행동이 보이게 한다.
|
|
100
|
+
|
|
101
|
+
## 7. 인용 (quote)
|
|
102
|
+
|
|
103
|
+
고객 증언이나 인용으로 신뢰를 더한다.
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
- 인용문: "[실제 발화 그대로]"
|
|
107
|
+
- 출처: [이름 / 역할 / 소속]
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
원칙: 인용은 짧게. 지어내지 않는다 — 실제 발화가 없으면 작성자에게 요청한다.
|
|
111
|
+
|
|
112
|
+
## 8. 시나리오 퀴즈 (scenario-quiz)
|
|
113
|
+
|
|
114
|
+
교육·트레이닝형 발표에서 정보 전달을 판단력 확인으로 바꾼다. 문제 슬라이드는 designer의 `slide--compare`(상황 설명 + 선택지)로, 정답 슬라이드는 `slide--statement`(정답 강조 + 해설)로 배정한다.
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
[문제]
|
|
118
|
+
- 상황: [실제 있을 법한 시나리오 한두 줄]
|
|
119
|
+
- 질문: [이게 문제가 될까요? / 뭐가 맞을까요?]
|
|
120
|
+
- 선택지: ① ... ② ... ③ ...
|
|
121
|
+
|
|
122
|
+
[정답]
|
|
123
|
+
- 정답: [번호 + 핵심 한 줄]
|
|
124
|
+
- 해설: [왜 그런지 — 원리로 연결]
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
원칙: 명령어·정의 암기가 아니라 판단을 묻는다. 도입부에서 선언한 기대치(선언 유형의 "성공 조건")를 실제로 검증하는 문항으로 만든다. 3–5문항이 적당하다 — 그 이상은 지루해진다.
|
|
128
|
+
|
|
129
|
+
## 9. 마무리 (closing)
|
|
130
|
+
|
|
131
|
+
발표를 다음 행동으로 닫는다. 보고가 아니라 요청으로 끝낸다.
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
- 마무리 메시지: [청중이 가져갈 마지막 한 문장]
|
|
135
|
+
- CTA: [청중이 지금 할 행동 — 결정, 승인, 다음 미팅 등]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
원칙: 마지막 슬라이드는 "감사합니다"로 낭비하지 않는다. 청중이 방을 나가며 할 일 하나를 남긴다.
|
|
139
|
+
|
|
140
|
+
**변형 — 체크리스트형 마무리.** 여러 개념을 다룬 교육형 발표는 CTA 대신 개념당 한 줄 정의로 요약해도 된다. ✅ 목록으로 훑으면 발표자 없이 슬라이드만 봐도 절반은 복기된다.
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
- ✅ [개념 A] = [한 줄 정의]
|
|
144
|
+
- ✅ [개념 B] = [한 줄 정의]
|
|
145
|
+
- ✅ [개념 C] = [한 줄 정의]
|
|
146
|
+
```
|
package/skills/agent/SKILL.md
CHANGED
|
@@ -54,6 +54,7 @@ Invoke any Gestalt Role or Review agent directly, outside the Gestalt pipeline.
|
|
|
54
54
|
| `backend-developer` | API, database, authentication, server |
|
|
55
55
|
| `frontend-developer` | UI, React, accessibility |
|
|
56
56
|
| `designer` | UX/UI, design systems, interaction |
|
|
57
|
+
| `presentation-writer` | 슬라이드 콘텐츠, 발표 카피, 데이터 요약, 발표 노트 |
|
|
57
58
|
| `presentation-designer` | Reveal.js slides, storytelling, visual design for decks |
|
|
58
59
|
| `qa-engineer` | Testing, edge cases, quality |
|
|
59
60
|
| `devops-engineer` | CI/CD, infrastructure, monitoring |
|
|
@@ -77,7 +78,9 @@ Invoke any Gestalt Role or Review agent directly, outside the Gestalt pipeline.
|
|
|
77
78
|
- 영상·비디오 URL 포함 또는 "요약해줘" → `video-summarizer`
|
|
78
79
|
- 번역투·AI 말투 교정 → `humanize-monolith`
|
|
79
80
|
- 문서·README·가이드 작성 → `technical-writer`
|
|
80
|
-
-
|
|
81
|
+
- 발표 슬라이드 콘텐츠·문구 작성 → `presentation-writer`
|
|
82
|
+
- 슬라이드 Reveal.js 구조·비주얼 디자인 → `presentation-designer`
|
|
83
|
+
- 발표자료·프레젠테이션 제작(콘텐츠+디자인 통합) → `presentation` 스킬
|
|
81
84
|
- 보안 검토 → `security-reviewer`
|
|
82
85
|
- 성능 분석 → `performance-reviewer`
|
|
83
86
|
- 코드 리뷰 → `quality-reviewer`
|
|
@@ -51,12 +51,14 @@ outputs:
|
|
|
51
51
|
|
|
52
52
|
### 2. 본문 작성 (jira-writer)
|
|
53
53
|
|
|
54
|
-
`jira-writer` role agent로 티켓 본문을 구조화한다.
|
|
54
|
+
`jira-writer` role agent로 티켓 본문을 구조화한다. **주의: Claude Code의 Agent/Task 도구(subagent_type)로 호출하지 않는다 — 거기엔 이 이름이 등록돼 있지 않아 "Agent type not found" 에러가 난다.** 대신 `ges_agent({ action: "get", name: "jira-writer" })` MCP 도구로 에이전트 정의(systemPrompt)를 가져온 뒤, 그 페르소나를 그대로 채택해 직접 수행한다.
|
|
55
55
|
|
|
56
56
|
```
|
|
57
57
|
/agent jira-writer "<요청 상황 원문>"
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
+
위 표기는 `gestalt:agent` 스킬(ges_agent 기반)을 가리키는 축약 표기다.
|
|
61
|
+
|
|
60
62
|
- 에이전트가 이슈타입·요약·설명·AC·제안 메타를 반환한다.
|
|
61
63
|
- `[???]`나 `[확인 필요]`로 남긴 항목이 있으면 **여기서 채워 받는다** — 빈 재현 절차·모호한 AC 채로 생성하지 않는다.
|
|
62
64
|
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: presentation
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
description: "발표 자료를 콘텐츠와 디자인으로 나눠 만드는 스킬. presentation-writer가 슬라이드 콘텐츠를 쓰고 presentation-designer가 Reveal.js HTML로 조립하며, 승인 게이트를 거쳐 산출한다. '발표자료 만들어줘', '슬라이드 만들어줘', '프레젠테이션 제작', '덱 만들어줘', '피치덱' 요청에 반드시 사용. 콘텐츠 자문만 필요하면 presentation-writer, 디자인 자문만 필요하면 presentation-designer를 직접 호출."
|
|
5
|
+
triggers:
|
|
6
|
+
- "발표자료 만들"
|
|
7
|
+
- "발표 자료 만들"
|
|
8
|
+
- "슬라이드 만들"
|
|
9
|
+
- "프레젠테이션 만들"
|
|
10
|
+
- "프레젠테이션 제작"
|
|
11
|
+
- "덱 만들"
|
|
12
|
+
- "피치덱"
|
|
13
|
+
- "피치 덱"
|
|
14
|
+
- "발표 슬라이드"
|
|
15
|
+
- "슬라이드 제작"
|
|
16
|
+
- "reveal 슬라이드"
|
|
17
|
+
inputs:
|
|
18
|
+
topic:
|
|
19
|
+
type: string
|
|
20
|
+
required: false
|
|
21
|
+
description: "발표 주제. 없으면 미니 인터뷰로 확정한다."
|
|
22
|
+
audience:
|
|
23
|
+
type: string
|
|
24
|
+
required: false
|
|
25
|
+
description: "청중: exec(경영진) | team(팀 내부) | customer(고객·투자자) | public(외부 발표). 톤과 무드 템플릿을 좌우한다."
|
|
26
|
+
slideCount:
|
|
27
|
+
type: number
|
|
28
|
+
required: false
|
|
29
|
+
description: "목표 슬라이드 수. 없으면 발표 시간 기준(1분/슬라이드)으로 제안한다."
|
|
30
|
+
outputs:
|
|
31
|
+
- presentation_html_path
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
# Presentation Skill
|
|
35
|
+
|
|
36
|
+
발표 자료를 **콘텐츠 먼저, 디자인 나중** 순서로 만드는 파이프라인.
|
|
37
|
+
`presentation-writer`(슬라이드 콘텐츠)와 `presentation-designer`(Reveal.js HTML)를 잇고, 산출 전 승인 게이트를 둔다.
|
|
38
|
+
|
|
39
|
+
> **불변 규칙: 승인 없이는 최종 HTML을 산출하지 않는다.** 콘텐츠 개요를 미리보기로 보여주고 사용자의 명시적 "OK"를 받은 뒤에만 디자인·HTML 생성으로 넘어간다. 디자인에 워딩을 끼워 맞추는 실수, 방향이 어긋난 발표를 통째로 다시 그리는 낭비를 막는 게 이 게이트의 이유다.
|
|
40
|
+
|
|
41
|
+
## 파이프라인
|
|
42
|
+
|
|
43
|
+
### 1. 미니 인터뷰 — 주제·청중·분량 확정 (추측 금지)
|
|
44
|
+
|
|
45
|
+
세 가지를 확정한다. 빠진 게 있으면 되묻고, 지어내지 않는다.
|
|
46
|
+
|
|
47
|
+
- **주제**: 이 발표로 이루려는 것 한 문장. 모호하면 "무엇을 결정·설득·공유하려는 발표인가"를 묻는다.
|
|
48
|
+
- **청중**: exec / team / customer / public. 청중이 무드 템플릿과 톤을 좌우하므로 반드시 확인한다.
|
|
49
|
+
- **분량**: 목표 슬라이드 수 또는 발표 시간. 시간만 있으면 1분/슬라이드로 환산해 제안한다.
|
|
50
|
+
|
|
51
|
+
발표에 들어갈 수치·데이터가 있으면 이 단계에서 받는다. 없으면 콘텐츠 단계에서 `[데이터 필요]`로 남긴다.
|
|
52
|
+
|
|
53
|
+
### 2. 콘텐츠 초안 (presentation-writer)
|
|
54
|
+
|
|
55
|
+
`ges_agent { action: "get", name: "presentation-writer" }`로 에이전트 시스템 프롬프트를 가져와 적용한다. 슬라이드 유형별 구조는 `role-agents/presentation-writer/references/content-playbook.md`를 따른다.
|
|
56
|
+
|
|
57
|
+
산출은 슬라이드 번호별 콘텐츠 블록(제목 / 핵심 메시지 / 본문 포인트 / 데이터+맥락 / 발표 노트 / 제안 슬라이드 성격). 수치가 없으면 지어내지 않고 `[데이터 필요: ...]`로 남겨 작성자에게 요청한다.
|
|
58
|
+
|
|
59
|
+
### 3. 승인 게이트 (필수)
|
|
60
|
+
|
|
61
|
+
콘텐츠 개요를 한 화면에 모아 보여주고 명시적 승인을 받는다.
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
[발표 개요]
|
|
65
|
+
목적: <한 문장>
|
|
66
|
+
청중: <exec / team / customer / public>
|
|
67
|
+
분량: <N>장 (약 <N>분)
|
|
68
|
+
핵심 메시지: <전체를 관통하는 한 문장>
|
|
69
|
+
|
|
70
|
+
[슬라이드 개요]
|
|
71
|
+
1. <제목> — <핵심 메시지>
|
|
72
|
+
2. <제목> — <핵심 메시지>
|
|
73
|
+
...
|
|
74
|
+
|
|
75
|
+
이 내용으로 디자인·HTML을 만들까요? (수정할 곳 있으면 말씀해주세요)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- 사용자가 "OK/좋아/만들어" 등 **명시 승인**하기 전엔 4단계로 넘어가지 않는다.
|
|
79
|
+
- 수정 요청이 오면 2단계로 돌아가 콘텐츠를 고치고 다시 확인한다.
|
|
80
|
+
- 승인 문구가 모호하면("음..", "글쎄") 진행하지 말고 재확인한다.
|
|
81
|
+
|
|
82
|
+
### 4. 디자인 조립 (presentation-designer)
|
|
83
|
+
|
|
84
|
+
승인 후에만 진행한다. `ges_agent { action: "get", name: "presentation-designer" }`로 에이전트를 가져와 적용한다.
|
|
85
|
+
|
|
86
|
+
1. **무드 템플릿 선택** — 청중·목적에 맞는 템플릿을 `role-agents/presentation-designer/templates/`에서 고른다. exec·투자자는 권위/신뢰 계열(Signal, Broadside), 제품 런치·키노트는 크리에이티브 계열(Neo-Grid, Studio) 등 무드 가이드를 따른다.
|
|
87
|
+
2. **슬라이드 타입 매핑** — writer의 "제안 슬라이드 성격"을 designer 슬라이드 타입(stats/statement/compare/process/quote)에 배정한다.
|
|
88
|
+
3. **카피 압축** — 콘텐츠 문장을 슬라이드 공간에 맞게 의미 손실 없이 압축한다.
|
|
89
|
+
4. **HTML 생성** — 선택한 템플릿 기반 Reveal.js HTML을 생성한다.
|
|
90
|
+
|
|
91
|
+
### 5. 산출 — HTML 경로 반환
|
|
92
|
+
|
|
93
|
+
완성한 Reveal.js HTML을 파일로 저장하고 절대 경로를 반환한다. 브라우저로 열어 확인하는 법과, PDF가 필요하면 decktape 명령(`npx decktape reveal "file:///<abs>/slide.html" out.pdf --size 1600x900`)을 안내한다.
|
|
94
|
+
|
|
95
|
+
### 6. 완료 보고
|
|
96
|
+
|
|
97
|
+
산출 경로, 슬라이드 수, 사용한 템플릿을 사용자에게 돌려준다. 수정 요청이 오면 콘텐츠 변경이면 2단계, 디자인 변경이면 4단계로 돌아간다.
|
|
98
|
+
|
|
99
|
+
## Do-NOT
|
|
100
|
+
|
|
101
|
+
- **승인 전 HTML 산출 금지.** 콘텐츠 개요 미리보기와 명시 승인을 건너뛰지 않는다.
|
|
102
|
+
- **주제·청중 불명확 시 진행 금지.** 미니 인터뷰로 확정되지 않으면 콘텐츠 작성으로 넘어가지 않는다.
|
|
103
|
+
- 사용자가 주지 않은 수치·인용·출처를 지어내지 않는다(`[데이터 필요]`로 남기고 확인).
|
|
104
|
+
- **콘텐츠와 디자인 역할을 섞지 않는다.** writer 단계에서 템플릿·색상을 정하지 않고, designer 단계에서 새 메시지를 지어내지 않는다.
|
|
105
|
+
- 슬라이드 한글 텍스트에서 가운뎃점(·)으로 항목을 압축하지 않는다(짧은 불릿 라벨은 예외).
|
|
106
|
+
|
|
107
|
+
## 에러 처리
|
|
108
|
+
|
|
109
|
+
| 상황 | 대응 |
|
|
110
|
+
|------|------|
|
|
111
|
+
| 주제·청중 불명확 | 미니 인터뷰로 되묻고, 확정 전 진행 보류 |
|
|
112
|
+
| 필요한 수치 없음 | `[데이터 필요]`로 표시하고 작성자에게 요청, 지어내지 않음 |
|
|
113
|
+
| 승인 응답 모호 | 산출 보류, 명시 승인 재요청 |
|
|
114
|
+
| 슬라이드 수 과다(발표 시간 대비) | 1분/슬라이드 기준으로 재조정 제안 |
|
|
115
|
+
| 디자인만/콘텐츠만 필요 | 파이프라인 대신 presentation-designer / presentation-writer 직접 호출 안내 |
|
|
116
|
+
|
|
117
|
+
## 테스트 시나리오
|
|
118
|
+
|
|
119
|
+
**정상 흐름**: `/presentation "3분기 성과 발표" audience=exec` → 주제·청중·분량 확정 → presentation-writer 콘텐츠 블록 → 콘텐츠 개요 미리보기 → 사용자 "OK" → presentation-designer가 Signal 템플릿으로 HTML 생성 → 경로 반환.
|
|
120
|
+
|
|
121
|
+
**입력 부족 흐름**: `/presentation` 만 입력 → 주제·청중·분량을 미니 인터뷰로 확정 → 수치가 없는 슬라이드는 `[데이터 필요]`로 남기고 요청 → 콘텐츠 확정 후 승인 게이트.
|
|
122
|
+
|
|
123
|
+
**승인 게이트 흐름**: 콘텐츠 개요 제시 후 사용자가 "3번 슬라이드 메시지 바꿔줘" → 2단계로 돌아가 콘텐츠 수정 → 재확인 → 승인 후에만 HTML 생성.
|
|
@@ -56,12 +56,14 @@ outputs:
|
|
|
56
56
|
|
|
57
57
|
### 2. 초안 작성 (slack-messenger)
|
|
58
58
|
|
|
59
|
-
`slack-messenger` role agent로 메시지를 작성하거나 다듬는다.
|
|
59
|
+
`slack-messenger` role agent로 메시지를 작성하거나 다듬는다. **주의: Claude Code의 Agent/Task 도구(subagent_type)로 호출하지 않는다 — 거기엔 이 이름이 등록돼 있지 않아 "Agent type not found" 에러가 난다.** 대신 `ges_agent({ action: "get", name: "slack-messenger" })` MCP 도구로 에이전트 정의(systemPrompt)를 가져온 뒤, 그 페르소나를 그대로 채택해 직접 수행한다.
|
|
60
60
|
|
|
61
61
|
```
|
|
62
62
|
/agent slack-messenger "<대상 채널/상대 + 상황/요점, 또는 다듬을 초안>"
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
+
위 표기는 `gestalt:agent` 스킬(ges_agent 기반)을 가리키는 축약 표기다.
|
|
66
|
+
|
|
65
67
|
- 대상 채널로 레지스터(R1 정중 / R2 친근)를 판단하도록 채널 정보를 함께 넘긴다.
|
|
66
68
|
- 에이전트가 `[???]`로 남긴 빈 정보가 있으면 **여기서 채워 받는다** — 빈 채로 전송하지 않는다.
|
|
67
69
|
|