@simplysm/sd-claude 13.0.67 → 13.0.68
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 +4 -1
- 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,6 +1,7 @@
|
|
|
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
|
|
|
@@ -35,6 +36,7 @@ Analyze user request from ARGUMENTS, select the best matching sd-\* skill or age
|
|
|
35
36
|
| `sd-api-name-review` | Review public API naming consistency |
|
|
36
37
|
| `sd-worktree` | Start new work in branch isolation |
|
|
37
38
|
| `sd-skill` | Create or edit skills |
|
|
39
|
+
| `sd-email-analyze` | Analyze, read, or summarize email files (`.eml` or `.msg`) — parsing and attachment extraction |
|
|
38
40
|
|
|
39
41
|
### Agents (execute via `Task` tool with matching `subagent_type`)
|
|
40
42
|
|
|
@@ -43,6 +45,7 @@ Analyze user request from ARGUMENTS, select the best matching sd-\* skill or age
|
|
|
43
45
|
| `sd-code-reviewer` | Quick/focused review — specific files, recent changes, bugs, security, quality issues. **Default choice for most review requests** |
|
|
44
46
|
| `sd-code-simplifier` | Simplify, clean up, improve code readability |
|
|
45
47
|
| `sd-api-reviewer` | Review library public API for DX quality |
|
|
48
|
+
| `sd-security-reviewer` | ORM SQL injection and input validation vulnerability review |
|
|
46
49
|
|
|
47
50
|
## Selection Rules
|
|
48
51
|
|
|
@@ -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.68",
|
|
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
|