@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.
Files changed (42) hide show
  1. package/README.md +5 -19
  2. package/claude/refs/sd-code-conventions.md +6 -0
  3. package/claude/refs/sd-migration.md +7 -0
  4. package/claude/rules/sd-claude-rules.md +2 -20
  5. package/claude/rules/sd-refs-linker.md +1 -0
  6. package/claude/skills/sd-api-name-review/SKILL.md +2 -1
  7. package/claude/skills/sd-brainstorm/SKILL.md +2 -1
  8. package/claude/skills/sd-check/SKILL.md +2 -1
  9. package/claude/skills/sd-commit/SKILL.md +2 -1
  10. package/claude/skills/sd-debug/SKILL.md +2 -1
  11. package/claude/skills/sd-discuss/SKILL.md +2 -1
  12. package/claude/skills/sd-email-analyze/SKILL.md +52 -0
  13. package/claude/skills/sd-email-analyze/email-analyzer.py +393 -0
  14. package/claude/skills/sd-explore/SKILL.md +2 -1
  15. package/claude/skills/sd-plan/SKILL.md +2 -1
  16. package/claude/skills/sd-plan-dev/SKILL.md +2 -1
  17. package/claude/skills/sd-readme/SKILL.md +2 -1
  18. package/claude/skills/sd-review/SKILL.md +2 -1
  19. package/claude/skills/sd-skill/SKILL.md +2 -1
  20. package/claude/skills/sd-tdd/SKILL.md +2 -1
  21. package/claude/skills/sd-use/SKILL.md +28 -23
  22. package/claude/skills/sd-worktree/SKILL.md +2 -1
  23. package/dist/commands/install.d.ts.map +1 -1
  24. package/dist/commands/install.js +0 -31
  25. package/dist/commands/install.js.map +1 -1
  26. package/dist/index.d.ts +0 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +0 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/sd-claude.js +8 -14
  31. package/dist/sd-claude.js.map +1 -1
  32. package/package.json +2 -2
  33. package/src/commands/install.ts +0 -40
  34. package/src/index.ts +0 -1
  35. package/src/sd-claude.ts +14 -23
  36. package/claude/skills/sd-eml-analyze/SKILL.md +0 -48
  37. package/claude/skills/sd-eml-analyze/eml-analyzer.py +0 -335
  38. package/dist/commands/npx.d.ts +0 -2
  39. package/dist/commands/npx.d.ts.map +0 -1
  40. package/dist/commands/npx.js +0 -16
  41. package/dist/commands/npx.js.map +0 -6
  42. package/src/commands/npx.ts +0 -19
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: sd-review
3
- description: Use when performing a comprehensive code review of a package or path for bugs, security issues, code quality, DX, and simplification opportunities
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-skill
3
- description: Use when creating new skills, editing existing skills, or verifying skills work before deployment
3
+ description: Skill creation and editing with TDD methodology
4
+ disable-model-invocation: true
4
5
  model: opus
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: sd-tdd
3
- description: Use when implementing any feature or bugfix, before writing implementation code
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: You MUST invoke this for any user request that does not explicitly use a /sd-* slash command. Do not bypass by selecting other sd-* skills directly, even when the match seems obvious.
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, then execute it.
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 | When to select |
42
- | -------------------- | ----------------------------------------------------------------- |
43
- | `sd-code-reviewer` | Quick/focused review — specific files, recent changes, bugs, security, quality issues. **Default choice for most review requests** |
44
- | `sd-code-simplifier` | Simplify, clean up, improve code readability |
45
- | `sd-api-reviewer` | Review library public API for DX quality |
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 user explicitly asks for a full/comprehensive/deep review of an entire package
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: Use when starting new feature work, bug fixes, or any task that benefits from branch isolation - creates a git worktree under .worktrees/ and guides to next planning step
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,CA2CjC"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,IAAI,IAAI,CA0CjC"}
@@ -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": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  export * from "./commands/install.js";
2
- export * from "./commands/npx.js";
3
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,2 @@
1
1
  export * from "./commands/install.js";
2
- export * from "./commands/npx.js";
3
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "mappings": "AACA,cAAc;AACd,cAAc;",
4
+ "mappings": "AACA,cAAc;",
5
5
  "names": []
6
6
  }
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
- import { runNpx } from "./commands/npx.js";
6
- const argv = hideBin(process.argv);
7
- if (argv[0] === "npx") {
8
- runNpx(argv.slice(1));
9
- } else {
10
- await yargs(argv).help("help", "\uB3C4\uC6C0\uB9D0").alias("help", "h").command(
11
- "install",
12
- "Claude Code \uC5D0\uC14B\uC744 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC124\uCE58\uD55C\uB2E4.",
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
@@ -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;AAC3B,SAAS,cAAc;AAEvB,MAAM,OAAO,QAAQ,QAAQ,IAAI;AAGjC,IAAI,KAAK,CAAC,MAAM,OAAO;AACrB,SAAO,KAAK,MAAM,CAAC,CAAC;AACtB,OAAO;AACL,QAAM,MAAM,IAAI,EACb,KAAK,QAAQ,oBAAK,EAClB,MAAM,QAAQ,GAAG,EACjB;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,QAAQ,IAAI,QAAQ,KAAK,EAAE,KAAK,MAAM;AAAA,IACvC,MAAM;AACJ,iBAAW;AAAA,IACb;AAAA,EACF,EACC,QAAQ,OAAO,yDAAiB,CAAC,QAAQ,IAAI,QAAQ,KAAK,EAAE,KAAK,MAAM,CAAC,EACxE,cAAc,GAAG,gEAAc,EAC/B,OAAO,EACP,MAAM;AACX;",
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.67",
4
- "description": "Simplysm Claude Code CLI — asset installer and cross-platform npx wrapper",
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": {
@@ -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
@@ -1,3 +1,2 @@
1
1
  // Commands
2
2
  export * from "./commands/install.js";
3
- export * from "./commands/npx.js";
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
- const argv = hideBin(process.argv);
9
-
10
- // npx 커맨드는 모든 인자를 그대로 전달해야 하므로 yargs 파싱을 우회
11
- if (argv[0] === "npx") {
12
- runNpx(argv.slice(1));
13
- } else {
14
- await yargs(argv)
15
- .help("help", "도움말")
16
- .alias("help", "h")
17
- .command(
18
- "install",
19
- "Claude Code 에셋을 프로젝트에 설치한다.",
20
- (cmd) => cmd.version(false).hide("help"),
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