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 +18 -0
- package/package.json +1 -1
- package/src/index.ts +18 -6
- package/src/prompts/gurus.ts +93 -0
- package/src/prompts/orchestrator.ts +80 -0
- package/src/prompts/specialists.ts +93 -2
- package/src/skills/docx/SKILL.md +319 -0
- package/src/skills/mcp/SKILL.md +132 -0
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
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 {
|
|
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
|
};
|
package/src/prompts/gurus.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
};
|
package/src/skills/docx/SKILL.md
CHANGED
|
@@ -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
|
+
```
|
package/src/skills/mcp/SKILL.md
CHANGED
|
@@ -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
|
+
**์์น**: ์๋ฌ ๋ฉ์์ง๋ณด๋ค ํด๊ฒฐ์ฑ
๊ณผ ๋์์ ์ ์ํ์ธ์.
|