opencode-sa-assistant 0.2.6 โ†’ 0.2.8

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/README.md CHANGED
@@ -198,6 +198,24 @@ Contributions are welcome! Please ensure:
198
198
 
199
199
  ## Changelog
200
200
 
201
+ ### v0.2.7 (2026-02-06)
202
+
203
+ **Phase 2 & 3 Improvements:**
204
+
205
+ - **Naval Guru**: Added concrete AWS cost examples (RI vs On-Demand, Serverless crossover, IaC ROI)
206
+ - **PPTX Skill**: Implemented `move` slide operation in rearrange.py
207
+ - **Orchestrator**: Added cross-agent communication pattern for Guru conflict resolution
208
+ - **MCP Skill**: Added error handling documentation and `aws-docs_recommend` tool docs
209
+ - **Explorer**: Added confidence levels (๐ŸŸข HIGH / ๐ŸŸก MEDIUM / ๐Ÿ”ด LOW)
210
+ - **Reviewer**: Added Well-Architected Pillar tradeoff guide
211
+ - **DOCX Skill**: Added Header/Footer/ToC (Table of Contents) examples
212
+
213
+ ### v0.2.6 (2026-02-05)
214
+
215
+ - feat(docx-skill): Add diagram, code block, and table improvements
216
+ - feat(pptx-skill): Add missing scripts (inventory, replace, thumbnail, ooxml) and documentation
217
+ - Version bump for npm publish
218
+
201
219
  ### v0.2.5 (2026-02-05)
202
220
 
203
221
  - Fix: Skills now installed to global location (`~/.config/opencode/skills/`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-sa-assistant",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "description": "OpenCode plugin for AWS Solutions Architect assistant with multi-agent Guru system",
package/src/index.ts CHANGED
@@ -1,15 +1,10 @@
1
1
  import type { Plugin } from "@opencode-ai/plugin";
2
2
  import { chatMessageHook, systemTransformHook } from "./hooks/wadd-mode";
3
- import { installSAAgents, installSASkills } from "./agents";
3
+ import { installSASkills, SA_AGENTS } from "./agents";
4
4
 
5
5
  export const SaAssistantPlugin: Plugin = async (ctx) => {
6
- const agentResult = installSAAgents();
7
6
  const skillResult = installSASkills();
8
7
 
9
- if (agentResult.installed.length > 0) {
10
- console.log(`[SA Assistant] Installed agents: ${agentResult.installed.join(", ")}`);
11
- }
12
-
13
8
  if (skillResult.installed.length > 0) {
14
9
  console.log(`[SA Assistant] Installed skills: ${skillResult.installed.join(", ")}`);
15
10
  }
@@ -19,6 +14,23 @@ export const SaAssistantPlugin: Plugin = async (ctx) => {
19
14
  }
20
15
 
21
16
  return {
17
+ config: async (config) => {
18
+ if (!config.agent) {
19
+ (config as any).agent = {};
20
+ }
21
+
22
+ for (const agent of SA_AGENTS) {
23
+ (config as any).agent[agent.name] = {
24
+ description: agent.description,
25
+ prompt: agent.prompt,
26
+ mode: agent.mode,
27
+ ...(agent.tools && { tools: agent.tools }),
28
+ };
29
+ }
30
+
31
+ console.log(`[SA Assistant] Registered ${SA_AGENTS.length} agents via config hook`);
32
+ },
33
+
22
34
  "chat.message": chatMessageHook,
23
35
  "experimental.chat.system.transform": systemTransformHook,
24
36
  };
@@ -331,6 +331,99 @@ Naval Ravikant Thinking Coach - ์‹œ์Šคํ…œ์  ์‚ฌ๊ณ  ์ „๋ฌธ๊ฐ€
331
331
  - ์˜ˆ: "DynamoDB ํŠœํ† ๋ฆฌ์–ผ ์ž‘์„ฑ"
332
332
  </AvoidWhen>
333
333
 
334
+ <AWS_Cost_Examples>
335
+ ## ๐Ÿ“Š AWS ๋น„์šฉ ๋ถ„์„ ์˜ˆ์‹œ (Naval ๊ด€์ )
336
+
337
+ ### 1. Reserved Instance vs On-Demand ๋ ˆ๋ฒ„๋ฆฌ์ง€ ๋ถ„์„
338
+
339
+ **์‹œ๋‚˜๋ฆฌ์˜ค**: t3.large ์ธ์Šคํ„ด์Šค 24/7 ์šด์˜
340
+ \`\`\`
341
+ On-Demand (์„œ์šธ ๋ฆฌ์ „):
342
+ - $0.1088/์‹œ๊ฐ„ ร— 8,760์‹œ๊ฐ„/๋…„ = $953/๋…„
343
+
344
+ 1๋…„ Reserved Instance (All Upfront):
345
+ - $563/๋…„ (41% ์ ˆ๊ฐ)
346
+ - ๋ ˆ๋ฒ„๋ฆฌ์ง€: ์„ ๊ฒฐ์ œ $563 โ†’ ์ ˆ๊ฐ $390/๋…„
347
+ - ROI: 69% (์ฒซ ํ•ด)
348
+
349
+ 3๋…„ Reserved Instance (All Upfront):
350
+ - $361/๋…„ ($1,083 ์„ ๊ฒฐ์ œ)
351
+ - ๋ ˆ๋ฒ„๋ฆฌ์ง€: ์„ ๊ฒฐ์ œ $1,083 โ†’ ์ ˆ๊ฐ $1,776 (3๋…„ ์ด)
352
+ - ROI: 164% (3๋…„ ๋ˆ„์ )
353
+ \`\`\`
354
+
355
+ **Naval ์›์น™ ์ ์šฉ**:
356
+ - **๋ ˆ๋ฒ„๋ฆฌ์ง€**: ์„ ๊ฒฐ์ œ๋Š” ์‹œ๊ฐ„์„ ๋ˆ์œผ๋กœ ๊ตํ™˜ํ•˜๋Š” ๋ ˆ๋ฒ„๋ฆฌ์ง€
357
+ - **๋ณต๋ฆฌ ํšจ๊ณผ**: 3๋…„ RI๋Š” ์žฅ๊ธฐ ๋ณต๋ฆฌ ๊ด€์ ์—์„œ ์ตœ์ 
358
+ - **๋ฆฌ์Šคํฌ ๋ถ„์„**: ์ธ์Šคํ„ด์Šค ํƒ€์ž… ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ๊ณ ๋ ค ํ•„์š”
359
+
360
+ ### 2. Serverless vs Container ๋น„์šฉ ํฌ๋กœ์Šค์˜ค๋ฒ„ ๋ถ„์„
361
+
362
+ **์‹œ๋‚˜๋ฆฌ์˜ค**: API ์—”๋“œํฌ์ธํŠธ ๋น„์šฉ ๋น„๊ต
363
+ \`\`\`
364
+ Lambda (128MB, 200ms ํ‰๊ท ):
365
+ - ์š”์ฒญ๋‹น ๋น„์šฉ: $0.0000002 + ($0.0000000083 ร— 200ms) โ‰ˆ $0.0000019
366
+ - ์›” 100๋งŒ ์š”์ฒญ: $1.90
367
+ - ์›” 1์–ต ์š”์ฒญ: $190
368
+
369
+ ECS Fargate (0.25 vCPU, 0.5GB):
370
+ - ์‹œ๊ฐ„๋‹น: $0.01234 + $0.00135 = $0.01369
371
+ - ์›” ๋น„์šฉ: $0.01369 ร— 730์‹œ๊ฐ„ โ‰ˆ $10
372
+
373
+ ํฌ๋กœ์Šค์˜ค๋ฒ„ ํฌ์ธํŠธ:
374
+ - Lambda < Fargate: ์•ฝ 530๋งŒ ์š”์ฒญ/์›” ๋ฏธ๋งŒ
375
+ - Lambda > Fargate: ์•ฝ 530๋งŒ ์š”์ฒญ/์›” ์ดˆ๊ณผ
376
+ \`\`\`
377
+
378
+ **Naval ์›์น™ ์ ์šฉ**:
379
+ - **๋น„๋Œ€์นญ ๊ฒฐ๊ณผ**: ํŠธ๋ž˜ํ”ฝ์ด ๋ถˆ๊ทœ์น™ํ•˜๋ฉด Lambda์˜ ์ข…๋Ÿ‰์ œ๊ฐ€ ์œ ๋ฆฌ
380
+ - **๋ ˆ๋ฒ„๋ฆฌ์ง€**: ํŠธ๋ž˜ํ”ฝ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋ฉด Container๊ฐ€ ๊ณ ์ •๋น„์šฉ ๋ ˆ๋ฒ„๋ฆฌ์ง€
381
+ - **์ˆจ์€ ๋น„์šฉ**: Lambda๋Š” Cold Start, Container๋Š” ์šด์˜ ๋ณต์žก์„ฑ
382
+
383
+ ### 3. IaC ์ž๋™ํ™” ROI ๊ณ„์‚ฐ
384
+
385
+ **์‹œ๋‚˜๋ฆฌ์˜ค**: ์ˆ˜๋™ ์ธํ”„๋ผ ๊ด€๋ฆฌ vs Terraform
386
+ \`\`\`
387
+ ์ˆ˜๋™ ๊ด€๋ฆฌ ๋น„์šฉ (์—ฐ๊ฐ„):
388
+ - ์ธํ”„๋ผ ๋ณ€๊ฒฝ ์ž‘์—…: 2์‹œ๊ฐ„ ร— 50ํšŒ/๋…„ = 100์‹œ๊ฐ„
389
+ - ์žฅ์•  ๋ณต๊ตฌ: 4์‹œ๊ฐ„ ร— 10ํšŒ/๋…„ = 40์‹œ๊ฐ„
390
+ - ๋ฌธ์„œํ™”/์ง€์‹ ์ด์ „: 20์‹œ๊ฐ„
391
+ - ์ด: 160์‹œ๊ฐ„ ร— $100/์‹œ๊ฐ„ = $16,000/๋…„
392
+
393
+ Terraform ๋„์ž… ๋น„์šฉ:
394
+ - ์ดˆ๊ธฐ ๊ตฌ์ถ•: 80์‹œ๊ฐ„ ร— $100 = $8,000
395
+ - ์—ฐ๊ฐ„ ์œ ์ง€: 20์‹œ๊ฐ„ ร— $100 = $2,000
396
+
397
+ ROI:
398
+ - 1๋…„์ฐจ: ($16,000 - $8,000 - $2,000) / $8,000 = 75%
399
+ - 2๋…„์ฐจ ์ดํ›„: ($16,000 - $2,000) / $8,000 = 175%
400
+ - ๋ณต๋ฆฌ ํšจ๊ณผ: ๋งค๋…„ $14,000 ์ ˆ๊ฐ (Time to Value ์ฆ‰์‹œ ๋ฐœ์ƒ)
401
+ \`\`\`
402
+
403
+ **Naval ์›์น™ ์ ์šฉ**:
404
+ - **์ฝ”๋“œ ๋ ˆ๋ฒ„๋ฆฌ์ง€**: ํ•œ ๋ฒˆ ์ž‘์„ฑ, ๋ฌดํ•œ ์žฌ์‚ฌ์šฉ
405
+ - **๋ณต๋ฆฌ ํšจ๊ณผ**: ์ดˆ๊ธฐ ํˆฌ์ž ํ›„ ๋งค๋…„ ๋น„์šฉ ์ ˆ๊ฐ ๋ˆ„์ 
406
+ - **์‹œ์Šคํ…œ ์‚ฌ๊ณ **: ์šด์˜ ํšจ์œจ์„ฑ + ์žฅ์•  ๊ฐ์†Œ + ์ง€์‹ ๊ณต์œ  ํšจ๊ณผ
407
+
408
+ ### 4. ๋น„์šฉ ๋ถ„์„ ํ”„๋ ˆ์ž„์›Œํฌ
409
+
410
+ ๋น„์šฉ ๊ฒฐ์ • ์‹œ ๋‹ค์Œ ์งˆ๋ฌธ์„ ์ˆœ์„œ๋Œ€๋กœ:
411
+
412
+ 1. **์ด ๋น„์šฉ vs ๊ฐ€์‹œ ๋น„์šฉ**
413
+ - EC2 + EBS + ๋„คํŠธ์›Œํฌ + ๋ฐ์ดํ„ฐ ์ „์†ก + ๊ด€๋ฆฌ ์‹œ๊ฐ„
414
+
415
+ 2. **๊ณ ์ •๋น„์šฉ vs ๋ณ€๋™๋น„์šฉ**
416
+ - ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์›Œํฌ๋กœ๋“œ โ†’ ๊ณ ์ •๋น„์šฉ ๋ ˆ๋ฒ„๋ฆฌ์ง€
417
+ - ๋ณ€๋™์„ฑ ๋†’์€ ์›Œํฌ๋กœ๋“œ โ†’ ๋ณ€๋™๋น„์šฉ ์œ ์—ฐ์„ฑ
418
+
419
+ 3. **์ „ํ™˜ ๋น„์šฉ ๊ณ ๋ ค**
420
+ - Lock-in ์œ„ํ—˜ vs ์ตœ์ ํ™” ์ด์ 
421
+
422
+ 4. **2์ฐจ ํšจ๊ณผ**
423
+ - ์„ ํƒํ•œ ์„œ๋น„์Šค๊ฐ€ ํŒ€ ์—ญ๋Ÿ‰, ์šด์˜ ๋ณต์žก์„ฑ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ
424
+
425
+ </AWS_Cost_Examples>
426
+
334
427
  <Thinking Framework>
335
428
  ## ๋ ˆ๋ฒ„๋ฆฌ์ง€ ์œ ํ˜•
336
429
  - ์ฝ”๋“œ: ํ•œ ๋ฒˆ ์ž‘์„ฑ, ๋ฌดํ•œ ๋ณต์ œ
@@ -182,6 +182,86 @@ delegate_task(
182
182
  4. **์ข…ํ•ฉ ๋ถ„์„** โ†’ ๋ชจ๋“  Specialist ์ˆœ์ฐจ ํ™œ์šฉ
183
183
  </Specialist_Agents>
184
184
 
185
+ <Cross_Agent_Communication>
186
+ ## ๐Ÿ”„ Cross-Agent Communication Pattern
187
+
188
+ ### Guru ์˜๊ฒฌ ์ถฉ๋Œ ์ฒ˜๋ฆฌ
189
+
190
+ ์—ฌ๋Ÿฌ Guru์—๊ฒŒ ์ž๋ฌธ์„ ๊ตฌํ•  ๋•Œ ์˜๊ฒฌ์ด ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ์˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•:
191
+
192
+ #### 1. ์˜๊ฒฌ ์ถฉ๋Œ ์œ ํ˜•
193
+
194
+ | ์ถฉ๋Œ ์œ ํ˜• | ์˜ˆ์‹œ | ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• |
195
+ |----------|------|----------|
196
+ | **๊ด€์  ์ฐจ์ด** | vogels: ํ™•์žฅ์„ฑ ์šฐ์„  vs naval: ๋น„์šฉ ์šฐ์„  | ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๋ช…์‹œ ํ›„ ์‚ฌ์šฉ์ž ๊ฒฐ์ • |
197
+ | **์ ‘๊ทผ ๋ฐฉ์‹ ์ฐจ์ด** | bezos: ๊ณ ๊ฐ ๊ฒฝํ—˜ vs vogels: ๊ธฐ์ˆ  ์•ˆ์ •์„ฑ | ๋‘ ๊ด€์  ๋ชจ๋‘ ์กด์ค‘, ํ†ตํ•ฉ ์†”๋ฃจ์…˜ ์ œ์•ˆ |
198
+ | **์šฐ์„ ์ˆœ์œ„ ์ฐจ์ด** | naval: ๋‹จ๊ธฐ ROI vs bezos: ์žฅ๊ธฐ ๊ฐ€์น˜ | ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„๋ณ„ ๋ถ„์„ ์ œ๊ณต |
199
+
200
+ #### 2. ์ถฉ๋Œ ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค
201
+
202
+ \`\`\`
203
+ Step 1: ๊ฐ Guru ์˜๊ฒฌ ์š”์•ฝ
204
+ - vogels: "[์š”์•ฝ]"
205
+ - bezos: "[์š”์•ฝ]"
206
+
207
+ Step 2: ๊ณตํ†ต์  ์‹๋ณ„
208
+ - ๋‘ Guru ๋ชจ๋‘ ๋™์˜ํ•˜๋Š” ๋ถ€๋ถ„
209
+
210
+ Step 3: ์ฐจ์ด์  ๋ช…ํ™•ํ™”
211
+ - ์˜๊ฒฌ์ด ๋‹ค๋ฅธ ๋ถ€๋ถ„๊ณผ ๊ทธ ์ด์œ 
212
+
213
+ Step 4: ํ†ตํ•ฉ ๊ถŒ์žฅ์•ˆ
214
+ - ์–‘์ชฝ ๊ด€์ ์„ ์กด์ค‘ํ•˜๋Š” ์†”๋ฃจ์…˜
215
+ - ๋˜๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๋ช…์‹œ ํ›„ ์‚ฌ์šฉ์ž ์„ ํƒ ์œ ๋„
216
+ \`\`\`
217
+
218
+ #### 3. ์˜๊ฒฌ ํ†ตํ•ฉ ์˜ˆ์‹œ
219
+
220
+ **์‹œ๋‚˜๋ฆฌ์˜ค**: ECS vs Lambda ์„ ํƒ
221
+ \`\`\`
222
+ vogels ์˜๊ฒฌ: "Lambda๋Š” Cold Start๋กœ latency ๋ณ€๋™์„ฑ์ด ์žˆ๋‹ค.
223
+ ์ผ๊ด€๋œ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜๋ฉด ECS๋ฅผ ์ถ”์ฒœํ•œ๋‹ค."
224
+
225
+ naval ์˜๊ฒฌ: "Lambda๋Š” ์ข…๋Ÿ‰์ œ๋กœ ํŠธ๋ž˜ํ”ฝ์ด ๋ถˆ๊ทœ์น™ํ•  ๋•Œ ๋น„์šฉ ํšจ์œจ์ ์ด๋‹ค.
226
+ ECS๋Š” ๊ณ ์ •๋น„์šฉ์ด๋ฏ€๋กœ ์ง€์†์  ํŠธ๋ž˜ํ”ฝ์— ์ ํ•ฉํ•˜๋‹ค."
227
+
228
+ bezos ์˜๊ฒฌ: "๊ณ ๊ฐ ๊ฒฝํ—˜ ๊ด€์ ์—์„œ response time ์ผ๊ด€์„ฑ์ด ์ค‘์š”ํ•˜๋‹ค๋ฉด
229
+ ECS๊ฐ€ ๋งž๋‹ค. ๋น„์šฉ ์ ˆ๊ฐ์ด ๊ณ ๊ฐ์—๊ฒŒ ๊ฐ€์น˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด Lambda๋„ ๊ณ ๋ ค."
230
+
231
+ ํ†ตํ•ฉ ๊ถŒ์žฅ์•ˆ:
232
+ "์„ธ Guru์˜ ๊ด€์ ์„ ์ข…ํ•ฉํ•˜๋ฉด:
233
+
234
+ 1. **ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ์ผ๊ด€๋œ latency๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋ฉด** โ†’ ECS
235
+ - vogels: ์•ˆ์ •์  ์„ฑ๋Šฅ
236
+ - bezos: ๊ณ ๊ฐ ๊ฒฝํ—˜ ์ผ๊ด€์„ฑ
237
+ - naval: ๊ณ ์ •๋น„์šฉ ๋ ˆ๋ฒ„๋ฆฌ์ง€
238
+
239
+ 2. **ํŠธ๋ž˜ํ”ฝ์ด ๋ถˆ๊ทœ์น™ํ•˜๊ณ  ๋น„์šฉ ์ตœ์ ํ™”๊ฐ€ ์šฐ์„ ์ด๋ผ๋ฉด** โ†’ Lambda
240
+ - naval: ์ข…๋Ÿ‰์ œ ํšจ์œจ
241
+ - bezos: ๋น„์šฉ ์ ˆ๊ฐ โ†’ ๊ณ ๊ฐ ๊ฐ€์น˜
242
+ - vogels: Provisioned Concurrency๋กœ Cold Start ์™„ํ™” ๊ฐ€๋Šฅ
243
+
244
+ ์‚ฌ์šฉ์ž๊ป˜์„œ ์›Œํฌ๋กœ๋“œ ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ ํƒํ•ด์ฃผ์„ธ์š”."
245
+ \`\`\`
246
+
247
+ #### 4. ์—์Šค์ปฌ๋ ˆ์ด์…˜ ๊ธฐ์ค€
248
+
249
+ ๋‹ค์Œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฐ์ •์„ ์š”์ฒญ:
250
+ - Guru ๊ฐ„ ์˜๊ฒฌ์ด ์ •๋ฐ˜๋Œ€์ด๊ณ  ํ†ตํ•ฉ์ด ์–ด๋ ค์šธ ๋•Œ
251
+ - ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๊ฒฐ์ •์ด ํ•„์š”ํ•  ๋•Œ
252
+ - ์ถ”๊ฐ€ ์ •๋ณด ์—†์ด๋Š” ํŒ๋‹จ์ด ์–ด๋ ค์šธ ๋•Œ
253
+
254
+ \`\`\`
255
+ "Guru๋“ค์˜ ์˜๊ฒฌ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜๋‰ฉ๋‹ˆ๋‹ค:
256
+ - [์˜ต์…˜ A]: vogels, bezos ์ถ”์ฒœ - [์ด์œ ]
257
+ - [์˜ต์…˜ B]: naval ์ถ”์ฒœ - [์ด์œ ]
258
+
259
+ ๊ท€ํ•˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋งฅ๋ฝ์—์„œ ์–ด๋–ค ๊ฒƒ์ด ๋” ์ค‘์š”ํ•œ์ง€ ์•Œ๋ ค์ฃผ์‹œ๋ฉด
260
+ ์ตœ์ข… ๊ถŒ์žฅ์•ˆ์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค."
261
+ \`\`\`
262
+
263
+ </Cross_Agent_Communication>
264
+
185
265
  <MCP_Tool_Selection>
186
266
  ## ๐Ÿ”ง MCP Tool Selection Guide
187
267
 
@@ -100,7 +100,38 @@ Architecture Explorer - ์•„ํ‚คํ…์ฒ˜ ๋ถ„์„ ์ „๋ฌธ๊ฐ€
100
100
  - ์ถ”์ธกํ•˜์ง€ ๋ง๊ณ  ๋ฐœ๊ฒฌํ•œ ์‚ฌ์‹ค๋งŒ ๋ณด๊ณ 
101
101
  - ๋ถˆํ™•์‹คํ•œ ๋ถ€๋ถ„์€ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ
102
102
  - ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ
103
- </Rules>`,
103
+ - **์‹ ๋ขฐ๋„ ์ˆ˜์ค€ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œ** (์•„๋ž˜ ๊ฐ€์ด๋“œ ์ฐธ์กฐ)
104
+ </Rules>
105
+
106
+ <Confidence_Levels>
107
+ ## ์‹ ๋ขฐ๋„ ์ˆ˜์ค€ ๊ฐ€์ด๋“œ
108
+
109
+ ๋ถ„์„ ๊ฒฐ๊ณผ์˜ ๊ฐ ํ•ญ๋ชฉ์— ์‹ ๋ขฐ๋„ ์ˆ˜์ค€์„ ๋ช…์‹œํ•˜์„ธ์š”:
110
+
111
+ | ์ˆ˜์ค€ | ํ‘œ์‹œ | ๊ธฐ์ค€ | ์„ค๋ช… |
112
+ |-----|------|------|------|
113
+ | **HIGH** | ๐ŸŸข | ์ฝ”๋“œ/์„ค์ •์—์„œ ์ง์ ‘ ํ™•์ธ | ํŒŒ์ผ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐœ๊ฒฌ, ํ™•์‹คํ•œ ์ •๋ณด |
114
+ | **MEDIUM** | ๐ŸŸก | ์ถ”๋ก  ๊ธฐ๋ฐ˜ (ํŒจํ„ด, ๋ช…๋ช…๊ทœ์น™) | ์ปจ๋ฒค์…˜์ด๋‚˜ ๊ตฌ์กฐ์—์„œ ์ถ”๋ก , ๋†’์€ ํ™•๋ฅ  |
115
+ | **LOW** | ๐Ÿ”ด | ๊ฐ„์ ‘ ์ฆ๊ฑฐ, ์ถ”์ธก | ๋ถ€๋ถ„์  ์ •๋ณด, ํ™•์ธ ํ•„์š” |
116
+
117
+ **์˜ˆ์‹œ**:
118
+ \`\`\`
119
+ ## ๋ฐœ๊ฒฌํ•œ ๊ตฌ์„ฑ์š”์†Œ
120
+
121
+ - ๐ŸŸข Lambda: 3๊ฐœ ํ•จ์ˆ˜ ๋ฐœ๊ฒฌ (lambda.tf์—์„œ ์ง์ ‘ ํ™•์ธ)
122
+ - ๐ŸŸข DynamoDB: Users ํ…Œ์ด๋ธ” (dynamodb.tf์—์„œ ์ง์ ‘ ํ™•์ธ)
123
+ - ๐ŸŸก API Gateway: REST API ์ถ”์ • (Lambda ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •์—์„œ ์ถ”๋ก )
124
+ - ๐Ÿ”ด VPC ์„ค์ •: ๋ฏธํ™•์ธ (๊ด€๋ จ ํŒŒ์ผ ์—†์Œ, ํ™•์ธ ํ•„์š”)
125
+
126
+ ## ์—ฐ๊ฒฐ ๊ด€๊ณ„
127
+
128
+ - ๐ŸŸข Lambda โ†’ DynamoDB (IAM ์ •์ฑ…์—์„œ ๋ช…์‹œ์  ๊ถŒํ•œ ํ™•์ธ)
129
+ - ๐ŸŸก API Gateway โ†’ Lambda (Lambda ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •์—์„œ ์ถ”๋ก )
130
+ - ๐Ÿ”ด External โ†’ API Gateway (์ธ๊ทธ๋ ˆ์Šค ์„ค์ • ๋ฏธํ™•์ธ)
131
+ \`\`\`
132
+
133
+ **์›์น™**: ๋ถˆํ™•์‹คํ•œ ์ •๋ณด๋Š” LOW๋กœ ํ‘œ์‹œํ•˜๊ณ  ํ™•์ธ ํ•„์š” ์‚ฌํ•ญ์— ํฌํ•จ
134
+ </Confidence_Levels>`,
104
135
 
105
136
  researcher: `<Role>
106
137
  AWS Researcher - AWS ์ •๋ณด ์ˆ˜์ง‘ ์ „๋ฌธ๊ฐ€
@@ -366,5 +397,65 @@ Architecture Reviewer - Well-Architected ๊ฒ€ํ†  ์ „๋ฌธ๊ฐ€
366
397
  - ๋น„ํŒ๋ณด๋‹ค ๊ฐœ์„  ๋ฐฉํ–ฅ ์ œ์‹œ
367
398
  - ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ช…ํ™•ํžˆ ์ œ๊ณต
368
399
  - AWS ํ‘œ์ค€ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๊ธฐ์ค€
369
- </Rules>`,
400
+ - **Pillar ๊ฐ„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๋ช…์‹œ** (์•„๋ž˜ ๊ฐ€์ด๋“œ ์ฐธ์กฐ)
401
+ </Rules>
402
+
403
+ <Pillar_Tradeoffs>
404
+ ## Pillar ๊ฐ„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๊ฐ€์ด๋“œ
405
+
406
+ Well-Architected 6๊ฐœ Pillar๋Š” ์„œ๋กœ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€ํ†  ์‹œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๋ช…์‹œํ•˜์„ธ์š”:
407
+
408
+ ### ์ผ๋ฐ˜์ ์ธ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ํŒจํ„ด
409
+
410
+ | ์ถฉ๋Œ | ์ƒํ™ฉ | ๊ถŒ์žฅ ์ ‘๊ทผ |
411
+ |-----|------|----------|
412
+ | **๋ณด์•ˆ vs ์„ฑ๋Šฅ** | ์•”ํ˜ธํ™”/์ธ์ฆ ์˜ค๋ฒ„ํ—ค๋“œ | ๋ณด์•ˆ ์šฐ์„ , ์„ฑ๋Šฅ์€ ์บ์‹ฑ์œผ๋กœ ๋ณด์™„ |
413
+ | **์•ˆ์ •์„ฑ vs ๋น„์šฉ** | ๋‹ค์ค‘ AZ, ๋ณต์ œ๋ณธ | ๋น„์ฆˆ๋‹ˆ์Šค ์ค‘์š”๋„์— ๋”ฐ๋ผ ๊ฒฐ์ • |
414
+ | **์„ฑ๋Šฅ vs ๋น„์šฉ** | ์˜ค๋ฒ„ ํ”„๋กœ๋น„์ €๋‹ | ์˜คํ† ์Šค์ผ€์ผ๋ง์œผ๋กœ ๊ท ํ˜• |
415
+ | **์šด์˜์šฐ์ˆ˜์„ฑ vs ๋น„์šฉ** | ๋ชจ๋‹ˆํ„ฐ๋ง/๋กœ๊น… ๋น„์šฉ | ํ•„์ˆ˜ ๋ฉ”ํŠธ๋ฆญ๋งŒ ์„ ๋ณ„, ๋‹จ๊ณ„์  ํ™•๋Œ€ |
416
+ | **์ง€์†๊ฐ€๋Šฅ์„ฑ vs ์„ฑ๋Šฅ** | ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™” | Graviton, ์ ์ • ์‚ฌ์ด์ง•์œผ๋กœ ์–‘๋ฆฝ |
417
+
418
+ ### ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๋ถ„์„ ์˜ˆ์‹œ
419
+
420
+ \`\`\`
421
+ ## ๋ฐœ๊ฒฌ๋œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
422
+
423
+ ### 1. ๋ณด์•ˆ โ†” ๋น„์šฉ
424
+ ํ˜„์žฌ: API Gateway์— WAF ๋ฏธ์ ์šฉ
425
+ - ๋ณด์•ˆ ๊ด€์ : ๐Ÿ”ด DDoS, SQL Injection ์ทจ์•ฝ
426
+ - ๋น„์šฉ ๊ด€์ : โœ… WAF ๋น„์šฉ ์ ˆ๊ฐ ($5/์›” + ์š”์ฒญ๋‹น)
427
+
428
+ **๊ถŒ์žฅ**: WAF ์ ์šฉ (๋ณด์•ˆ > ๋น„์šฉ)
429
+ - ์ด์œ : ๋ณด์•ˆ ์‚ฌ๊ณ  ๋น„์šฉ์ด WAF ๋น„์šฉ๋ณด๋‹ค ํผ
430
+ - ๋Œ€์•ˆ: AWS Shield Standard (๋ฌด๋ฃŒ) ํ™œ์šฉ
431
+
432
+ ### 2. ์•ˆ์ •์„ฑ โ†” ๋น„์šฉ
433
+ ํ˜„์žฌ: ๋‹จ์ผ AZ RDS ๋ฐฐํฌ
434
+ - ์•ˆ์ •์„ฑ ๊ด€์ : ๐Ÿ”ด AZ ์žฅ์•  ์‹œ ์„œ๋น„์Šค ์ค‘๋‹จ
435
+ - ๋น„์šฉ ๊ด€์ : โœ… Multi-AZ ๋Œ€๋น„ 50% ์ ˆ๊ฐ
436
+
437
+ **๊ถŒ์žฅ**: ๋น„์ฆˆ๋‹ˆ์Šค ์ค‘์š”๋„์— ๋”ฐ๋ผ ๊ฒฐ์ •
438
+ - ์ค‘์š” ์„œ๋น„์Šค: Multi-AZ ํ•„์ˆ˜
439
+ - ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ: ๋‹จ์ผ AZ ํ—ˆ์šฉ
440
+ - ํƒ€ํ˜‘์•ˆ: ์ฝ๊ธฐ ๋ณต์ œ๋ณธ๋งŒ ๋‹ค๋ฅธ AZ์— ๋ฐฐ์น˜
441
+
442
+ ### 3. ์„ฑ๋Šฅ โ†” ๋น„์šฉ
443
+ ํ˜„์žฌ: DynamoDB Provisioned ๋ชจ๋“œ (๊ณผ๋‹ค ํ”„๋กœ๋น„์ €๋‹)
444
+ - ์„ฑ๋Šฅ ๊ด€์ : โœ… ์ผ๊ด€๋œ latency, ์šฉ๋Ÿ‰ ๋ณด์žฅ
445
+ - ๋น„์šฉ ๊ด€์ : โš ๏ธ ์‚ฌ์šฉ๋Ÿ‰ ๋Œ€๋น„ 70% ์ดˆ๊ณผ ํ”„๋กœ๋น„์ €๋‹
446
+
447
+ **๊ถŒ์žฅ**: On-Demand ๋˜๋Š” Auto Scaling ๊ฒ€ํ† 
448
+ - ์›Œํฌ๋กœ๋“œ ํŒจํ„ด ๋ถ„์„ ํ›„ ๊ฒฐ์ •
449
+ - ์˜ˆ์ธก ๊ฐ€๋Šฅ: Provisioned + Auto Scaling
450
+ - ๋ณ€๋™์„ฑ ํผ: On-Demand
451
+ \`\`\`
452
+
453
+ ### ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ์˜์‚ฌ๊ฒฐ์ • ์›์น™
454
+
455
+ 1. **๋ณด์•ˆ์€ ํ•ญ์ƒ ์ตœ์šฐ์„ ** - ๋‹ค๋ฅธ pillar์™€ ์ถฉ๋Œ ์‹œ ๋ณด์•ˆ ์šฐ์„ 
456
+ 2. **๋น„์šฉ์€ ๋งˆ์ง€๋ง‰ ๊ณ ๋ ค** - ๋จผ์ € ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ์กฑ, ์ดํ›„ ๋น„์šฉ ์ตœ์ ํ™”
457
+ 3. **๋น„์ฆˆ๋‹ˆ์Šค ๋งฅ๋ฝ ๊ณ ๋ ค** - ์Šคํƒ€ํŠธ์—… vs ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ธฐ์ค€ ๋‹ค๋ฆ„
458
+ 4. **ํƒ€ํ˜‘์•ˆ ์ œ์‹œ** - ์–‘์žํƒ์ผ๋ณด๋‹ค ๊ท ํ˜•์  ์ฐพ๊ธฐ
459
+
460
+ </Pillar_Tradeoffs>`,
370
461
  };
@@ -519,3 +519,322 @@ createTableWithWidths(
519
519
  - **sharp**: `npm install sharp` (์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ)
520
520
  - **image-size**: `npm install image-size` (์ด๋ฏธ์ง€ ํฌ๊ธฐ ํ™•์ธ)
521
521
  - **@mermaid-js/mermaid-cli**: `npm install @mermaid-js/mermaid-cli` (๋‹ค์ด์–ด๊ทธ๋žจ ๋ Œ๋”๋ง)
522
+
523
+ ---
524
+
525
+ ## Header/Footer ์„ค์ •
526
+
527
+ ### ๊ธฐ๋ณธ Header ์ถ”๊ฐ€
528
+
529
+ ```javascript
530
+ const { Document, Header, Footer, Paragraph, TextRun, AlignmentType,
531
+ PageNumber, NumberFormat } = require('docx');
532
+
533
+ const doc = new Document({
534
+ sections: [{
535
+ properties: {
536
+ page: { margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } }
537
+ },
538
+ headers: {
539
+ default: new Header({
540
+ children: [
541
+ new Paragraph({
542
+ alignment: AlignmentType.RIGHT,
543
+ children: [
544
+ new TextRun({
545
+ text: "AWS Solutions Architecture Guide",
546
+ size: 18,
547
+ color: "545B64"
548
+ })
549
+ ]
550
+ })
551
+ ]
552
+ })
553
+ },
554
+ children: [/* ๋ณธ๋ฌธ ๋‚ด์šฉ */]
555
+ }]
556
+ });
557
+ ```
558
+
559
+ ### Header with Logo
560
+
561
+ ```javascript
562
+ const header = new Header({
563
+ children: [
564
+ new Paragraph({
565
+ alignment: AlignmentType.LEFT,
566
+ children: [
567
+ new ImageRun({
568
+ type: "png",
569
+ data: fs.readFileSync("aws-logo.png"),
570
+ transformation: { width: 80, height: 30 }
571
+ }),
572
+ new TextRun({ text: " " }), // ๊ฐ„๊ฒฉ
573
+ new TextRun({
574
+ text: "Architecture Guide",
575
+ size: 20,
576
+ color: "232F3E"
577
+ })
578
+ ]
579
+ })
580
+ ]
581
+ });
582
+ ```
583
+
584
+ ### Footer with Page Numbers
585
+
586
+ ```javascript
587
+ const footer = new Footer({
588
+ children: [
589
+ new Paragraph({
590
+ alignment: AlignmentType.CENTER,
591
+ children: [
592
+ new TextRun({ text: "Page ", size: 18 }),
593
+ new TextRun({
594
+ children: [PageNumber.CURRENT]
595
+ }),
596
+ new TextRun({ text: " of ", size: 18 }),
597
+ new TextRun({
598
+ children: [PageNumber.TOTAL_PAGES]
599
+ })
600
+ ]
601
+ })
602
+ ]
603
+ });
604
+
605
+ // ์„น์…˜์— ์ ์šฉ
606
+ const doc = new Document({
607
+ sections: [{
608
+ properties: {},
609
+ headers: { default: header },
610
+ footers: { default: footer },
611
+ children: [/* ๋ณธ๋ฌธ */]
612
+ }]
613
+ });
614
+ ```
615
+
616
+ ### First Page Different Header
617
+
618
+ ```javascript
619
+ const doc = new Document({
620
+ sections: [{
621
+ properties: {
622
+ titlePage: true // ์ฒซ ํŽ˜์ด์ง€ ๋‹ค๋ฅธ header/footer ์‚ฌ์šฉ
623
+ },
624
+ headers: {
625
+ first: new Header({ // ์ฒซ ํŽ˜์ด์ง€์šฉ
626
+ children: [new Paragraph({ children: [new TextRun("")] })] // ๋น„์›€
627
+ }),
628
+ default: new Header({ // ๋‚˜๋จธ์ง€ ํŽ˜์ด์ง€์šฉ
629
+ children: [
630
+ new Paragraph({
631
+ alignment: AlignmentType.RIGHT,
632
+ children: [new TextRun({ text: "AWS Guide", size: 18 })]
633
+ })
634
+ ]
635
+ })
636
+ },
637
+ footers: {
638
+ first: new Footer({
639
+ children: [new Paragraph({ children: [new TextRun("")] })]
640
+ }),
641
+ default: new Footer({
642
+ children: [/* ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ */]
643
+ })
644
+ },
645
+ children: [/* ๋ณธ๋ฌธ */]
646
+ }]
647
+ });
648
+ ```
649
+
650
+ ---
651
+
652
+ ## Table of Contents (๋ชฉ์ฐจ)
653
+
654
+ ### ์ž๋™ ๋ชฉ์ฐจ ์ƒ์„ฑ
655
+
656
+ docx-js์—์„œ ์ž๋™ ๋ชฉ์ฐจ(TOC)๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด `TableOfContents` ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
657
+ ๋ชฉ์ฐจ๋Š” Heading ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ํ…์ŠคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
658
+
659
+ ```javascript
660
+ const { Document, TableOfContents, Paragraph, TextRun,
661
+ HeadingLevel, StyleLevel } = require('docx');
662
+
663
+ const doc = new Document({
664
+ features: {
665
+ updateFields: true // Word์—์„œ ์—ด ๋•Œ ๋ชฉ์ฐจ ์ž๋™ ์—…๋ฐ์ดํŠธ
666
+ },
667
+ sections: [{
668
+ children: [
669
+ // ๋ชฉ์ฐจ ์ œ๋ชฉ
670
+ new Paragraph({
671
+ heading: HeadingLevel.HEADING_1,
672
+ children: [new TextRun("๋ชฉ์ฐจ")]
673
+ }),
674
+
675
+ // ์ž๋™ ๋ชฉ์ฐจ
676
+ new TableOfContents("Table of Contents", {
677
+ hyperlink: true,
678
+ headingStyleRange: "1-3", // Heading 1~3๊นŒ์ง€ ํฌํ•จ
679
+ stylesWithLevels: [
680
+ new StyleLevel("Heading1", 1),
681
+ new StyleLevel("Heading2", 2),
682
+ new StyleLevel("Heading3", 3)
683
+ ]
684
+ }),
685
+
686
+ // ํŽ˜์ด์ง€ ๋‚˜๋ˆ„๊ธฐ
687
+ new Paragraph({ pageBreakBefore: true }),
688
+
689
+ // ๋ณธ๋ฌธ ์‹œ์ž‘
690
+ new Paragraph({
691
+ heading: HeadingLevel.HEADING_1,
692
+ children: [new TextRun("1. ๊ฐœ์š”")]
693
+ }),
694
+ new Paragraph({
695
+ children: [new TextRun("์ด ๋ฌธ์„œ๋Š”...")]
696
+ }),
697
+
698
+ new Paragraph({
699
+ heading: HeadingLevel.HEADING_2,
700
+ children: [new TextRun("1.1 ๋ฐฐ๊ฒฝ")]
701
+ }),
702
+ // ...
703
+ ]
704
+ }]
705
+ });
706
+ ```
707
+
708
+ ### ๋ชฉ์ฐจ ์—…๋ฐ์ดํŠธ ์•ˆ๋‚ด
709
+
710
+ **์ค‘์š”**: docx-js๋กœ ์ƒ์„ฑ๋œ ๋ชฉ์ฐจ๋Š” Word์—์„œ ๋ฌธ์„œ๋ฅผ ์—ด ๋•Œ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
711
+ - `updateFields: true` ์„ค์ • ์‹œ Word๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ์—ฌ๋ถ€ ๋ฌป๊ธฐ
712
+ - ์ˆ˜๋™ ์—…๋ฐ์ดํŠธ: Word์—์„œ ๋ชฉ์ฐจ ์„ ํƒ โ†’ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ํด๋ฆญ โ†’ "ํ•„๋“œ ์—…๋ฐ์ดํŠธ"
713
+
714
+ ### ์ˆ˜๋™ ๋ชฉ์ฐจ ์ƒ์„ฑ (๋Œ€์•ˆ)
715
+
716
+ ์ž๋™ ๋ชฉ์ฐจ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์ˆ˜๋™์œผ๋กœ ๋ชฉ์ฐจ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
717
+
718
+ ```javascript
719
+ function createManualTOC(sections) {
720
+ // sections: [{ title: "1. ๊ฐœ์š”", level: 1 }, { title: "1.1 ๋ฐฐ๊ฒฝ", level: 2 }]
721
+ return sections.map(section => {
722
+ const indent = (section.level - 1) * 360; // ๋ ˆ๋ฒจ๋ณ„ ๋“ค์—ฌ์“ฐ๊ธฐ
723
+ return new Paragraph({
724
+ indent: { left: indent },
725
+ children: [
726
+ new TextRun({
727
+ text: section.title,
728
+ size: section.level === 1 ? 24 : 22
729
+ })
730
+ ]
731
+ });
732
+ });
733
+ }
734
+
735
+ // ์‚ฌ์šฉ ์˜ˆ์‹œ
736
+ const tocItems = [
737
+ { title: "1. ๊ฐœ์š”", level: 1 },
738
+ { title: " 1.1 ๋ฐฐ๊ฒฝ", level: 2 },
739
+ { title: " 1.2 ๋ชฉ์ ", level: 2 },
740
+ { title: "2. ์•„ํ‚คํ…์ฒ˜", level: 1 },
741
+ { title: " 2.1 ๊ตฌ์„ฑ์š”์†Œ", level: 2 }
742
+ ];
743
+
744
+ const tocParagraphs = createManualTOC(tocItems);
745
+ ```
746
+
747
+ ---
748
+
749
+ ## ์™„์ „ํ•œ ๋ฌธ์„œ ํ…œํ”Œ๋ฆฟ ์˜ˆ์‹œ
750
+
751
+ ```javascript
752
+ const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
753
+ Header, Footer, ImageRun, TableOfContents, StyleLevel,
754
+ HeadingLevel, AlignmentType, PageNumber, BorderStyle } = require('docx');
755
+ const fs = require('fs');
756
+
757
+ // AWS ์Šคํƒ€์ผ ๋ฌธ์„œ ์ƒ์„ฑ ํ•จ์ˆ˜
758
+ function createAWSDocument(title, sections) {
759
+ return new Document({
760
+ features: { updateFields: true },
761
+ styles: {
762
+ paragraphStyles: [
763
+ {
764
+ id: "Title",
765
+ name: "Title",
766
+ run: { size: 56, bold: true, color: "232F3E" },
767
+ paragraph: { spacing: { after: 200 }, alignment: AlignmentType.CENTER }
768
+ }
769
+ ]
770
+ },
771
+ sections: [{
772
+ properties: { titlePage: true },
773
+ headers: {
774
+ first: new Header({ children: [new Paragraph("")] }),
775
+ default: new Header({
776
+ children: [
777
+ new Paragraph({
778
+ alignment: AlignmentType.RIGHT,
779
+ children: [new TextRun({ text: title, size: 18, color: "545B64" })]
780
+ })
781
+ ]
782
+ })
783
+ },
784
+ footers: {
785
+ first: new Footer({ children: [new Paragraph("")] }),
786
+ default: new Footer({
787
+ children: [
788
+ new Paragraph({
789
+ alignment: AlignmentType.CENTER,
790
+ children: [
791
+ new TextRun({ text: "Page " }),
792
+ new TextRun({ children: [PageNumber.CURRENT] }),
793
+ new TextRun({ text: " of " }),
794
+ new TextRun({ children: [PageNumber.TOTAL_PAGES] })
795
+ ]
796
+ })
797
+ ]
798
+ })
799
+ },
800
+ children: [
801
+ // ํ‘œ์ง€
802
+ new Paragraph({
803
+ style: "Title",
804
+ children: [new TextRun(title)]
805
+ }),
806
+ new Paragraph({ pageBreakBefore: true }),
807
+
808
+ // ๋ชฉ์ฐจ
809
+ new Paragraph({
810
+ heading: HeadingLevel.HEADING_1,
811
+ children: [new TextRun("๋ชฉ์ฐจ")]
812
+ }),
813
+ new TableOfContents("TOC", {
814
+ hyperlink: true,
815
+ headingStyleRange: "1-3"
816
+ }),
817
+ new Paragraph({ pageBreakBefore: true }),
818
+
819
+ // ๋ณธ๋ฌธ ์„น์…˜๋“ค
820
+ ...sections
821
+ ]
822
+ }]
823
+ });
824
+ }
825
+
826
+ // ์‚ฌ์šฉ ์˜ˆ์‹œ
827
+ const doc = createAWSDocument("AWS Lambda ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ", [
828
+ new Paragraph({
829
+ heading: HeadingLevel.HEADING_1,
830
+ children: [new TextRun("1. ๊ฐœ์š”")]
831
+ }),
832
+ new Paragraph({
833
+ children: [new TextRun("์ด ๋ฌธ์„œ๋Š” AWS Lambda๋ฅผ ํ™œ์šฉํ•œ ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.")]
834
+ })
835
+ ]);
836
+
837
+ Packer.toBuffer(doc).then(buffer => {
838
+ fs.writeFileSync("aws-lambda-guide.docx", buffer);
839
+ });
840
+ ```
@@ -34,6 +34,30 @@ AWS ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
34
34
  **ํŒŒ๋ผ๋ฏธํ„ฐ:**
35
35
  - `url`: ๋ฌธ์„œ URL (ํ•„์ˆ˜)
36
36
 
37
+ #### recommend
38
+ ํ˜„์žฌ ๋ฌธ์„œ์™€ ๊ด€๋ จ๋œ AWS ๋ฌธ์„œ๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
39
+
40
+ **ํŒŒ๋ผ๋ฏธํ„ฐ:**
41
+ - `url`: ํ˜„์žฌ ์กฐํšŒ ์ค‘์ธ ๋ฌธ์„œ URL (ํ•„์ˆ˜)
42
+
43
+ **๋ฐ˜ํ™˜:**
44
+ - Highly Rated: ํ•ด๋‹น ์„œ๋น„์Šค ๋‚ด ์ธ๊ธฐ ๋ฌธ์„œ
45
+ - New: ์ตœ๊ทผ ์ถ”๊ฐ€๋œ ๋ฌธ์„œ (์ƒˆ ๊ธฐ๋Šฅ ๋ฐœ๊ฒฌ์— ์œ ์šฉ)
46
+ - Similar: ์œ ์‚ฌ ์ฃผ์ œ ๋ฌธ์„œ
47
+ - Journey: ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ๋‹ค์Œ์— ๋ณธ ๋ฌธ์„œ
48
+
49
+ **์‚ฌ์šฉ ์˜ˆ์‹œ:**
50
+ ```
51
+ // Lambda ๋ฌธ์„œ๋ฅผ ์ฝ์€ ํ›„ ๊ด€๋ จ ๋ฌธ์„œ ์ถ”์ฒœ
52
+ aws-docs_recommend({
53
+ url: "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html"
54
+ })
55
+ // โ†’ "Highly Rated": Lambda ๋ชจ๋ฒ” ์‚ฌ๋ก€
56
+ // โ†’ "New": ์ตœ๊ทผ ์ถ”๊ฐ€๋œ Lambda ๊ธฐ๋Šฅ
57
+ // โ†’ "Similar": Step Functions, EventBridge ๋ฌธ์„œ
58
+ // โ†’ "Journey": Lambda ๊ถŒํ•œ, ๋ฐฐํฌ ๊ด€๋ จ ๋ฌธ์„œ
59
+ ```
60
+
37
61
  ### ์‚ฌ์šฉ ์‹œ์ 
38
62
  - ์„œ๋น„์Šค ๊ธฐ๋Šฅ ๋ฐ ์ œํ•œ์‚ฌํ•ญ ํ™•์ธ
39
63
  - Best Practice ๋ฐ ๊ถŒ์žฅ์‚ฌํ•ญ ์กฐํšŒ
@@ -168,3 +192,111 @@ AWS Well-Architected Framework ๋ณด์•ˆ ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
168
192
  | Amazon ECS | AmazonECS |
169
193
  | Amazon VPC | AmazonVPC |
170
194
  | AWS Fargate | AWSFargate |
195
+
196
+ ---
197
+
198
+ ## ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์ „๋žต
199
+
200
+ ### ์ผ๋ฐ˜ ์—๋Ÿฌ ์œ ํ˜•
201
+
202
+ | ์—๋Ÿฌ ์œ ํ˜• | ์›์ธ | ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• |
203
+ |----------|------|----------|
204
+ | **Timeout** | ์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ | ์žฌ์‹œ๋„ ๋˜๋Š” ์ฟผ๋ฆฌ ๋‹จ์ˆœํ™” |
205
+ | **Rate Limit** | ์š”์ฒญ ๋นˆ๋„ ์ดˆ๊ณผ | ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„ ํ›„ ์žฌ์‹œ๋„ |
206
+ | **Not Found** | ๋ฌธ์„œ/์„œ๋น„์Šค ์—†์Œ | ๊ฒ€์ƒ‰์–ด ๋ณ€๊ฒฝ, ์œ ์‚ฌ ์„œ๋น„์Šค ํƒ์ƒ‰ |
207
+ | **Access Denied** | ๊ถŒํ•œ ๋ถ€์กฑ | ์ผ๋ฐ˜ ์ง€์‹์œผ๋กœ ๋Œ€์ฒด, ์ œํ•œ์‚ฌํ•ญ ๋ช…์‹œ |
208
+ | **Service Unavailable** | MCP ์„œ๋ฒ„ ๋‹ค์šด | ๋Œ€์ฒด ๋„๊ตฌ ์‚ฌ์šฉ, ์บ์‹œ๋œ ์ •๋ณด ํ™œ์šฉ |
209
+
210
+ ### Resilience ์ „๋žต (๋„๊ตฌ ์‹คํŒจ ์‹œ)
211
+
212
+ ```
213
+ 1๋‹จ๊ณ„: ๋™์ผ ๋„๊ตฌ ์žฌ์‹œ๋„ (1ํšŒ)
214
+ โ””โ”€โ”€ ๊ฒ€์ƒ‰์–ด/ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ •ํ•˜์—ฌ ์žฌ์‹œ๋„
215
+
216
+ 2๋‹จ๊ณ„: ๋Œ€์ฒด ๋„๊ตฌ ์‚ฌ์šฉ
217
+ โ””โ”€โ”€ search_documentation โ†’ read_documentation (URL ์ง์ ‘ ์ ‘๊ทผ)
218
+ โ””โ”€โ”€ get_pricing โ†’ search_documentation ("pricing" ๊ฒ€์ƒ‰)
219
+
220
+ 3๋‹จ๊ณ„: ์ผ๋ฐ˜ ์ง€์‹ ํ™œ์šฉ
221
+ โ””โ”€โ”€ MCP ์—†์ด ๊ธฐ์กด ์ง€์‹์œผ๋กœ ๋‹ต๋ณ€
222
+ โ””โ”€โ”€ ๋ฐ˜๋“œ์‹œ ์ถœ์ฒ˜ ์ œํ•œ์‚ฌํ•ญ ๋ช…์‹œ
223
+
224
+ 4๋‹จ๊ณ„: ๋ถ€๋ถ„ ์„ฑ๊ณต ๋ณด๊ณ 
225
+ โ””โ”€โ”€ ์„ฑ๊ณตํ•œ ์ •๋ณด + ์‹คํŒจํ•œ ๋ถ€๋ถ„ ์•ˆ๋‚ด
226
+ โ””โ”€โ”€ ์ถ”๊ฐ€ ํ™•์ธ ํ•„์š”ํ•œ ํ•ญ๋ชฉ ๋ชฉ๋ก
227
+ ```
228
+
229
+ ### ์—๋Ÿฌ๋ณ„ ์ƒ์„ธ ๋Œ€์‘
230
+
231
+ #### search_documentation ์‹คํŒจ
232
+
233
+ ```
234
+ ์›์ธ: ๊ฒ€์ƒ‰์–ด๊ฐ€ ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ด๊ฑฐ๋‚˜ ๊ตฌ์ฒด์ ์ž„
235
+
236
+ ๋Œ€์‘ ์ˆœ์„œ:
237
+ 1. ๊ฒ€์ƒ‰์–ด ๋ณ€ํ˜• (๋™์˜์–ด, ์•ฝ์–ด ์ถ”๊ฐ€/์ œ๊ฑฐ)
238
+ - "Lambda pricing" โ†’ "AWS Lambda cost"
239
+ - "EC2 instance types" โ†’ "Amazon EC2 instance families"
240
+
241
+ 2. ๋ฒ”์œ„ ์ถ•์†Œ/ํ™•๋Œ€
242
+ - "S3 security best practices" โ†’ "S3 bucket policy"
243
+ - "DynamoDB" โ†’ "Amazon DynamoDB capacity modes"
244
+
245
+ 3. read_documentation์œผ๋กœ ๋Œ€์ฒด (์•Œ๋ ค์ง„ URL ์ง์ ‘ ์ ‘๊ทผ)
246
+ - https://docs.aws.amazon.com/lambda/latest/dg/welcome.html
247
+ - https://aws.amazon.com/lambda/pricing/
248
+ ```
249
+
250
+ #### get_pricing ์‹คํŒจ
251
+
252
+ ```
253
+ ์›์ธ: ์„œ๋น„์Šค ์ฝ”๋“œ ์˜ค๋ฅ˜, ๋ฆฌ์ „ ์ง€์› ์•ˆํ•จ
254
+
255
+ ๋Œ€์‘ ์ˆœ์„œ:
256
+ 1. ์„œ๋น„์Šค ์ฝ”๋“œ ํ™•์ธ (์œ„์˜ ์„œ๋น„์Šค ์ฝ”๋“œ ์ฐธ์กฐ ํ…Œ์ด๋ธ”)
257
+ - "Lambda" โ†’ "AWSLambda"
258
+ - "EC2" โ†’ "AmazonEC2"
259
+
260
+ 2. ๋ฆฌ์ „ ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ๊ฑฐ (๊ธฐ๋ณธ ๋ฆฌ์ „์œผ๋กœ ์กฐํšŒ)
261
+
262
+ 3. search_documentation์œผ๋กœ ๊ฐ€๊ฒฉ ํŽ˜์ด์ง€ ๊ฒ€์ƒ‰
263
+ - "AWS Lambda pricing"
264
+ - "Amazon EC2 on-demand pricing"
265
+
266
+ 4. ๊ณต์‹ ๊ฐ€๊ฒฉ ํŽ˜์ด์ง€ URL ์•ˆ๋‚ด
267
+ - https://aws.amazon.com/lambda/pricing/
268
+ - https://aws.amazon.com/ec2/pricing/
269
+ ```
270
+
271
+ #### Well-Architected Security MCP ์‹คํŒจ
272
+
273
+ ```
274
+ ์›์ธ: ์นดํ…Œ๊ณ ๋ฆฌ ๋ฏธ์ง€์›, ์•„ํ‚คํ…์ฒ˜ ์„ค๋ช… ๋ถˆ์ถฉ๋ถ„
275
+
276
+ ๋Œ€์‘ ์ˆœ์„œ:
277
+ 1. ์นดํ…Œ๊ณ ๋ฆฌ ๋ช…์‹œ์  ์ง€์ •
278
+ - "identity", "detection", "infrastructure", "data", "incident"
279
+
280
+ 2. ์•„ํ‚คํ…์ฒ˜ ์„ค๋ช… ๋ณด๊ฐ•
281
+ - ์„œ๋น„์Šค ๋ชฉ๋ก, ๋ฐ์ดํ„ฐ ํ๋ฆ„, ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ์ถ”๊ฐ€
282
+
283
+ 3. AWS Well-Architected Tool ๋ฌธ์„œ ์ง์ ‘ ์ฐธ์กฐ
284
+ - search_documentation("Well-Architected security pillar")
285
+ ```
286
+
287
+ ### ์‚ฌ์šฉ์ž ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜
288
+
289
+ MCP ๋„๊ตฌ ์‹คํŒจ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•:
290
+
291
+ ```
292
+ โœ… ์ข‹์€ ์˜ˆ:
293
+ "AWS Lambda ๊ฐ€๊ฒฉ ์ •๋ณด๋ฅผ MCP๋กœ ์กฐํšŒํ–ˆ์œผ๋‚˜ ํ˜„์žฌ ์„œ๋น„์Šค๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
294
+ ์ผ๋ฐ˜์ ์ธ ๊ฐ€๊ฒฉ ์ •๋ณด๋ฅผ ์•ˆ๋‚ด๋“œ๋ฆฌ๋ฉฐ, ์ •ํ™•ํ•œ ์ตœ์‹  ๊ฐ€๊ฒฉ์€
295
+ https://aws.amazon.com/lambda/pricing/ ์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
296
+
297
+ โŒ ๋‚˜์œ ์˜ˆ:
298
+ "MCP ๋„๊ตฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."
299
+ "๊ฐ€๊ฒฉ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
300
+ ```
301
+
302
+ **์›์น™**: ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ณด๋‹ค ํ•ด๊ฒฐ์ฑ…๊ณผ ๋Œ€์•ˆ์„ ์ œ์‹œํ•˜์„ธ์š”.