@simplysm/sd-claude 13.0.67 → 13.0.69
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 +5 -19
- package/claude/refs/sd-code-conventions.md +6 -0
- package/claude/refs/sd-migration.md +7 -0
- package/claude/rules/sd-claude-rules.md +2 -20
- package/claude/rules/sd-refs-linker.md +1 -0
- package/claude/skills/sd-api-name-review/SKILL.md +2 -1
- package/claude/skills/sd-brainstorm/SKILL.md +2 -1
- package/claude/skills/sd-check/SKILL.md +2 -1
- package/claude/skills/sd-commit/SKILL.md +2 -1
- package/claude/skills/sd-debug/SKILL.md +2 -1
- package/claude/skills/sd-discuss/SKILL.md +2 -1
- package/claude/skills/sd-email-analyze/SKILL.md +52 -0
- package/claude/skills/sd-email-analyze/email-analyzer.py +393 -0
- package/claude/skills/sd-explore/SKILL.md +2 -1
- package/claude/skills/sd-plan/SKILL.md +2 -1
- package/claude/skills/sd-plan-dev/SKILL.md +2 -1
- package/claude/skills/sd-readme/SKILL.md +2 -1
- package/claude/skills/sd-review/SKILL.md +2 -1
- package/claude/skills/sd-skill/SKILL.md +2 -1
- package/claude/skills/sd-tdd/SKILL.md +2 -1
- package/claude/skills/sd-use/SKILL.md +28 -23
- package/claude/skills/sd-worktree/SKILL.md +2 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +0 -31
- package/dist/commands/install.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/sd-claude.js +8 -14
- package/dist/sd-claude.js.map +1 -1
- package/package.json +2 -2
- package/src/commands/install.ts +0 -40
- package/src/index.ts +0 -1
- package/src/sd-claude.ts +14 -23
- package/claude/skills/sd-eml-analyze/SKILL.md +0 -48
- package/claude/skills/sd-eml-analyze/eml-analyzer.py +0 -335
- package/dist/commands/npx.d.ts +0 -2
- package/dist/commands/npx.d.ts.map +0 -1
- package/dist/commands/npx.js +0 -16
- package/dist/commands/npx.js.map +0 -6
- package/src/commands/npx.ts +0 -19
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sd-review
|
|
3
|
-
description:
|
|
3
|
+
description: Multi-perspective comprehensive code review
|
|
4
|
+
disable-model-invocation: true
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# sd-review
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sd-tdd
|
|
3
|
-
description:
|
|
3
|
+
description: Test-Driven Development - write failing test first, then implement
|
|
4
|
+
disable-model-invocation: true
|
|
4
5
|
user-invocable: false
|
|
5
6
|
model: opus
|
|
6
7
|
---
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sd-use
|
|
3
|
-
description:
|
|
3
|
+
description: Auto router that matches user requests to the appropriate sd-* skill or agent
|
|
4
|
+
disable-model-invocation: true
|
|
4
5
|
model: haiku
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# sd-use - Auto Skill/Agent Router
|
|
8
9
|
|
|
9
|
-
Analyze user request from ARGUMENTS, select the best matching sd-\* skill or agent, explain why,
|
|
10
|
+
Analyze user request from ARGUMENTS, select the best matching sd-\* skill or agent, explain why,
|
|
11
|
+
then execute it.
|
|
10
12
|
|
|
11
13
|
## Execution Flow
|
|
12
14
|
|
|
@@ -19,35 +21,38 @@ Analyze user request from ARGUMENTS, select the best matching sd-\* skill or age
|
|
|
19
21
|
|
|
20
22
|
### Skills (execute via `Skill` tool)
|
|
21
23
|
|
|
22
|
-
| Skill | When to select
|
|
23
|
-
|
|
24
|
-
| `sd-brainstorm` | New feature, component, or behavior change — **creative work before implementation**
|
|
25
|
-
| `sd-debug` | Bug, test failure, unexpected behavior — **systematic root cause investigation**
|
|
26
|
-
| `sd-tdd` | Implementing a feature or fixing a bug — **before writing code**
|
|
27
|
-
| `sd-plan` | Multi-step task with spec/requirements — **planning before code**
|
|
28
|
-
| `sd-plan-dev` | Already have a plan — **executing implementation plan**
|
|
29
|
-
| `sd-explore` | Deep codebase analysis — tracing execution paths, architecture, dependencies
|
|
24
|
+
| Skill | When to select |
|
|
25
|
+
|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
26
|
+
| `sd-brainstorm` | New feature, component, or behavior change — **creative work before implementation** |
|
|
27
|
+
| `sd-debug` | Bug, test failure, unexpected behavior — **systematic root cause investigation** |
|
|
28
|
+
| `sd-tdd` | Implementing a feature or fixing a bug — **before writing code** |
|
|
29
|
+
| `sd-plan` | Multi-step task with spec/requirements — **planning before code** |
|
|
30
|
+
| `sd-plan-dev` | Already have a plan — **executing implementation plan** |
|
|
31
|
+
| `sd-explore` | Deep codebase analysis — tracing execution paths, architecture, dependencies |
|
|
30
32
|
| `sd-review` | **Large-scale** comprehensive review of an entire package or broad path — use only when user explicitly requests full/deep/comprehensive review |
|
|
31
|
-
| `sd-check` | Verify code — typecheck, lint, tests
|
|
32
|
-
| `sd-commit` | Create a git commit
|
|
33
|
-
| `sd-readme` | Update a package README.md
|
|
34
|
-
| `sd-discuss` | Evaluate code design decisions against industry standards and project conventions
|
|
35
|
-
| `sd-api-name-review` | Review public API naming consistency
|
|
36
|
-
| `sd-worktree` | Start new work in branch isolation
|
|
37
|
-
| `sd-skill` | Create or edit skills
|
|
33
|
+
| `sd-check` | Verify code — typecheck, lint, tests |
|
|
34
|
+
| `sd-commit` | Create a git commit |
|
|
35
|
+
| `sd-readme` | Update a package README.md |
|
|
36
|
+
| `sd-discuss` | Evaluate code design decisions against industry standards and project conventions |
|
|
37
|
+
| `sd-api-name-review` | Review public API naming consistency |
|
|
38
|
+
| `sd-worktree` | Start new work in branch isolation |
|
|
39
|
+
| `sd-skill` | Create or edit skills |
|
|
40
|
+
| `sd-email-analyze` | Analyze, read, or summarize email files (`.eml` or `.msg`) — parsing and attachment extraction |
|
|
38
41
|
|
|
39
42
|
### Agents (execute via `Task` tool with matching `subagent_type`)
|
|
40
43
|
|
|
41
|
-
| Agent
|
|
42
|
-
|
|
43
|
-
| `sd-code-reviewer`
|
|
44
|
-
| `sd-code-simplifier`
|
|
45
|
-
| `sd-api-reviewer`
|
|
44
|
+
| Agent | When to select |
|
|
45
|
+
|------------------------|------------------------------------------------------------------------------------------------------------------------------------|
|
|
46
|
+
| `sd-code-reviewer` | Quick/focused review — specific files, recent changes, bugs, security, quality issues. **Default choice for most review requests** |
|
|
47
|
+
| `sd-code-simplifier` | Simplify, clean up, improve code readability |
|
|
48
|
+
| `sd-api-reviewer` | Review library public API for DX quality |
|
|
49
|
+
| `sd-security-reviewer` | ORM SQL injection and input validation vulnerability review |
|
|
46
50
|
|
|
47
51
|
## Selection Rules
|
|
48
52
|
|
|
49
53
|
1. Select **exactly one** skill or agent — the most specific match wins
|
|
50
|
-
2. **Review requests**: Default to `sd-code-reviewer` agent. Only use `sd-review` skill when the
|
|
54
|
+
2. **Review requests**: Default to `sd-code-reviewer` agent. Only use `sd-review` skill when the
|
|
55
|
+
user explicitly asks for a full/comprehensive/deep review of an entire package
|
|
51
56
|
3. If nothing matches, use **default LLM behavior** and handle the request directly
|
|
52
57
|
4. Pass ARGUMENTS through as the skill/agent's input
|
|
53
58
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sd-worktree
|
|
3
|
-
description:
|
|
3
|
+
description: Git worktree management for branch isolation
|
|
4
|
+
disable-model-invocation: true
|
|
4
5
|
model: haiku
|
|
5
6
|
---
|
|
6
7
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,IAAI,IAAI,CA0CjC"}
|
package/dist/commands/install.js
CHANGED
|
@@ -25,7 +25,6 @@ function runInstall() {
|
|
|
25
25
|
cleanSdEntries(targetDir);
|
|
26
26
|
copySdEntries(sourceDir, targetDir, sourceEntries);
|
|
27
27
|
setupStatusLine(targetDir);
|
|
28
|
-
setupMcpConfig(projectRoot);
|
|
29
28
|
console.log(`[@simplysm/sd-claude] ${sourceEntries.length}\uAC1C\uC758 sd-* \uD56D\uBAA9\uC744 \uC124\uCE58\uD588\uC2B5\uB2C8\uB2E4.`);
|
|
30
29
|
} catch (err) {
|
|
31
30
|
console.warn("[@simplysm/sd-claude] postinstall \uACBD\uACE0:", err.message);
|
|
@@ -108,36 +107,6 @@ function setupStatusLine(targetDir) {
|
|
|
108
107
|
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
109
108
|
}
|
|
110
109
|
}
|
|
111
|
-
function setupMcpConfig(projectRoot) {
|
|
112
|
-
const mcpPath = path.join(projectRoot, ".mcp.json");
|
|
113
|
-
let mcpConfig = { mcpServers: {} };
|
|
114
|
-
if (fs.existsSync(mcpPath)) {
|
|
115
|
-
const parsed = JSON.parse(fs.readFileSync(mcpPath, "utf-8"));
|
|
116
|
-
mcpConfig.mcpServers = parsed.mcpServers ?? {};
|
|
117
|
-
}
|
|
118
|
-
const sdClaudeBin = "node_modules/@simplysm/sd-claude/dist/sd-claude.js";
|
|
119
|
-
let changed = false;
|
|
120
|
-
if (mcpConfig.mcpServers["context7"] == null) {
|
|
121
|
-
mcpConfig.mcpServers["context7"] = {
|
|
122
|
-
command: "node",
|
|
123
|
-
args: [sdClaudeBin, "npx", "-y", "@upstash/context7-mcp"]
|
|
124
|
-
};
|
|
125
|
-
changed = true;
|
|
126
|
-
}
|
|
127
|
-
if (mcpConfig.mcpServers["playwright"] == null) {
|
|
128
|
-
mcpConfig.mcpServers["playwright"] = {
|
|
129
|
-
command: "node",
|
|
130
|
-
args: [sdClaudeBin, "npx", "@playwright/mcp@latest", "--headless"],
|
|
131
|
-
env: {
|
|
132
|
-
PLAYWRIGHT_OUTPUT_DIR: ".tmp/playwright"
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
changed = true;
|
|
136
|
-
}
|
|
137
|
-
if (changed) {
|
|
138
|
-
fs.writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2) + "\n");
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
110
|
export {
|
|
142
111
|
runInstall
|
|
143
112
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/install.ts"],
|
|
4
|
-
"mappings": "AAIA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAEvB,SAAS,aAAmB;AACjC,MAAI;AACF,UAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAE7D,UAAM,UAAU,KAAK,QAAQ,WAAW,OAAO;AAC/C,UAAM,YAAY,KAAK,KAAK,SAAS,QAAQ;AAE7C,UAAM,cAAc,gBAAgB,SAAS;AAC7C,QAAI,eAAe,MAAM;AAEvB,cAAQ,IAAI,oIAA+C;AAC3D;AAAA,IACF;AAGA,QAAI,4BAA4B,aAAa,OAAO,GAAG;AACrD;AAAA,IACF;AAGA,QAAI,CAAC,GAAG,WAAW,SAAS,GAAG;AAC7B;AAAA,IACF;AAEA,UAAM,gBAAgB,iBAAiB,SAAS;AAChD,QAAI,cAAc,WAAW,GAAG;AAC9B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,KAAK,aAAa,SAAS;AAElD,mBAAe,SAAS;AACxB,kBAAc,WAAW,WAAW,aAAa;AACjD,oBAAgB,SAAS;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,uBAAuB,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
package/dist/sd-claude.js
CHANGED
|
@@ -2,18 +2,12 @@
|
|
|
2
2
|
import yargs from "yargs";
|
|
3
3
|
import { hideBin } from "yargs/helpers";
|
|
4
4
|
import { runInstall } from "./commands/install.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
(cmd) => cmd.version(false).hide("help"),
|
|
14
|
-
() => {
|
|
15
|
-
runInstall();
|
|
16
|
-
}
|
|
17
|
-
).command("npx", "\uD06C\uB85C\uC2A4\uD50C\uB7AB\uD3FC npx \uB798\uD37C", (cmd) => cmd.version(false).hide("help")).demandCommand(1, "\uBA85\uB839\uC5B4\uB97C \uC9C0\uC815\uD574\uC8FC\uC138\uC694.").strict().parse();
|
|
18
|
-
}
|
|
5
|
+
await yargs(hideBin(process.argv)).help("help", "\uB3C4\uC6C0\uB9D0").alias("help", "h").command(
|
|
6
|
+
"install",
|
|
7
|
+
"Claude Code \uC5D0\uC14B\uC744 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC124\uCE58\uD55C\uB2E4.",
|
|
8
|
+
(cmd) => cmd.version(false).hide("help"),
|
|
9
|
+
() => {
|
|
10
|
+
runInstall();
|
|
11
|
+
}
|
|
12
|
+
).demandCommand(1, "\uBA85\uB839\uC5B4\uB97C \uC9C0\uC815\uD574\uC8FC\uC138\uC694.").strict().parse();
|
|
19
13
|
//# sourceMappingURL=sd-claude.js.map
|
package/dist/sd-claude.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/sd-claude.ts"],
|
|
4
|
-
"mappings": ";AAEA,OAAO,WAAW;AAClB,SAAS,eAAe;AACxB,SAAS,kBAAkB;
|
|
4
|
+
"mappings": ";AAEA,OAAO,WAAW;AAClB,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAE3B,MAAM,MAAM,QAAQ,QAAQ,IAAI,CAAC,EAC9B,KAAK,QAAQ,oBAAK,EAClB,MAAM,QAAQ,GAAG,EACjB;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC,QAAQ,IAAI,QAAQ,KAAK,EAAE,KAAK,MAAM;AAAA,EACvC,MAAM;AACJ,eAAW;AAAA,EACb;AACF,EACC,cAAc,GAAG,gEAAc,EAC/B,OAAO,EACP,MAAM;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-claude",
|
|
3
|
-
"version": "13.0.
|
|
4
|
-
"description": "Simplysm Claude Code CLI — asset installer
|
|
3
|
+
"version": "13.0.69",
|
|
4
|
+
"description": "Simplysm Claude Code CLI — asset installer",
|
|
5
5
|
"author": "김석래",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"repository": {
|
package/src/commands/install.ts
CHANGED
|
@@ -40,7 +40,6 @@ export function runInstall(): void {
|
|
|
40
40
|
cleanSdEntries(targetDir);
|
|
41
41
|
copySdEntries(sourceDir, targetDir, sourceEntries);
|
|
42
42
|
setupStatusLine(targetDir);
|
|
43
|
-
setupMcpConfig(projectRoot);
|
|
44
43
|
|
|
45
44
|
// eslint-disable-next-line no-console
|
|
46
45
|
console.log(`[@simplysm/sd-claude] ${sourceEntries.length}개의 sd-* 항목을 설치했습니다.`);
|
|
@@ -160,42 +159,3 @@ function setupStatusLine(targetDir: string): void {
|
|
|
160
159
|
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
161
160
|
}
|
|
162
161
|
}
|
|
163
|
-
|
|
164
|
-
/** .mcp.json에 MCP 서버 설정을 추가한다. sd-claude npx를 사용하여 크로스플랫폼 지원. */
|
|
165
|
-
function setupMcpConfig(projectRoot: string): void {
|
|
166
|
-
const mcpPath = path.join(projectRoot, ".mcp.json");
|
|
167
|
-
|
|
168
|
-
let mcpConfig = { mcpServers: {} as Record<string, unknown> };
|
|
169
|
-
if (fs.existsSync(mcpPath)) {
|
|
170
|
-
const parsed = JSON.parse(fs.readFileSync(mcpPath, "utf-8")) as {
|
|
171
|
-
mcpServers?: Record<string, unknown>;
|
|
172
|
-
};
|
|
173
|
-
mcpConfig.mcpServers = parsed.mcpServers ?? {};
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
const sdClaudeBin = "node_modules/@simplysm/sd-claude/dist/sd-claude.js";
|
|
177
|
-
let changed = false;
|
|
178
|
-
|
|
179
|
-
if (mcpConfig.mcpServers["context7"] == null) {
|
|
180
|
-
mcpConfig.mcpServers["context7"] = {
|
|
181
|
-
command: "node",
|
|
182
|
-
args: [sdClaudeBin, "npx", "-y", "@upstash/context7-mcp"],
|
|
183
|
-
};
|
|
184
|
-
changed = true;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if (mcpConfig.mcpServers["playwright"] == null) {
|
|
188
|
-
mcpConfig.mcpServers["playwright"] = {
|
|
189
|
-
command: "node",
|
|
190
|
-
args: [sdClaudeBin, "npx", "@playwright/mcp@latest", "--headless"],
|
|
191
|
-
env: {
|
|
192
|
-
PLAYWRIGHT_OUTPUT_DIR: ".tmp/playwright",
|
|
193
|
-
},
|
|
194
|
-
};
|
|
195
|
-
changed = true;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
if (changed) {
|
|
199
|
-
fs.writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2) + "\n");
|
|
200
|
-
}
|
|
201
|
-
}
|
package/src/index.ts
CHANGED
package/src/sd-claude.ts
CHANGED
|
@@ -3,27 +3,18 @@
|
|
|
3
3
|
import yargs from "yargs";
|
|
4
4
|
import { hideBin } from "yargs/helpers";
|
|
5
5
|
import { runInstall } from "./commands/install.js";
|
|
6
|
-
import { runNpx } from "./commands/npx.js";
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
runInstall();
|
|
23
|
-
},
|
|
24
|
-
)
|
|
25
|
-
.command("npx", "크로스플랫폼 npx 래퍼", (cmd) => cmd.version(false).hide("help"))
|
|
26
|
-
.demandCommand(1, "명령어를 지정해주세요.")
|
|
27
|
-
.strict()
|
|
28
|
-
.parse();
|
|
29
|
-
}
|
|
7
|
+
await yargs(hideBin(process.argv))
|
|
8
|
+
.help("help", "도움말")
|
|
9
|
+
.alias("help", "h")
|
|
10
|
+
.command(
|
|
11
|
+
"install",
|
|
12
|
+
"Claude Code 에셋을 프로젝트에 설치한다.",
|
|
13
|
+
(cmd) => cmd.version(false).hide("help"),
|
|
14
|
+
() => {
|
|
15
|
+
runInstall();
|
|
16
|
+
},
|
|
17
|
+
)
|
|
18
|
+
.demandCommand(1, "명령어를 지정해주세요.")
|
|
19
|
+
.strict()
|
|
20
|
+
.parse();
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sd-eml-analyze
|
|
3
|
-
description: Use when user asks to analyze, read, or summarize .eml email files, or when encountering .eml attachments that need content extraction including embedded PDF, XLSX, PPTX files
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# EML Email Analyzer
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
Python script that parses .eml files and extracts content from all attachments (PDF, XLSX, PPTX) into a single structured markdown report. Handles Korean encodings (EUC-KR, CP949, ks_c_5601-1987) automatically.
|
|
11
|
-
|
|
12
|
-
## When to Use
|
|
13
|
-
|
|
14
|
-
- User provides a `.eml` file to analyze or summarize
|
|
15
|
-
- Need to extract text from email attachments (PDF, XLSX, PPTX)
|
|
16
|
-
- Korean email content needs proper decoding
|
|
17
|
-
|
|
18
|
-
## Usage
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
python .claude/skills/sd-eml-analyze/eml-analyzer.py <eml_file_path>
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
First run auto-installs: `pdfminer.six`, `python-pptx`, `openpyxl`.
|
|
25
|
-
|
|
26
|
-
## Output Format
|
|
27
|
-
|
|
28
|
-
Markdown report with sections:
|
|
29
|
-
|
|
30
|
-
1. **Mail info table**: Subject, From, To, Cc, Date, attachment count
|
|
31
|
-
2. **Body text**: Plain text (HTML stripped if no plain text)
|
|
32
|
-
3. **Attachment analysis**: Summary table + extracted text per file
|
|
33
|
-
|
|
34
|
-
## Supported Attachments
|
|
35
|
-
|
|
36
|
-
| Format | Method |
|
|
37
|
-
| ------------------------------------------------ | --------------------------------------- |
|
|
38
|
-
| PDF | pdfminer.six text extraction |
|
|
39
|
-
| XLSX/XLS | openpyxl cell data as markdown table |
|
|
40
|
-
| PPTX | python-pptx slide text + tables + notes |
|
|
41
|
-
| Text files (.txt, .csv, .json, .xml, .html, .md) | UTF-8/CP949 decode |
|
|
42
|
-
| Images | Filename and size only |
|
|
43
|
-
|
|
44
|
-
## Common Mistakes
|
|
45
|
-
|
|
46
|
-
- **Wrong Python**: Ensure `python` points to Python 3.8+
|
|
47
|
-
- **Firewall blocking pip**: First run needs internet for package install
|
|
48
|
-
- **Legacy .ppt/.xls**: Only modern Office formats (.pptx/.xlsx) supported
|