sumulige-claude 1.2.1 → 1.3.1

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 (55) hide show
  1. package/.claude/.kickoff-hint.txt +1 -1
  2. package/.claude/AGENTS.md +6 -6
  3. package/.claude/USAGE.md +175 -0
  4. package/.claude/commands/audit.md +147 -0
  5. package/.claude/commands/fix.md +83 -0
  6. package/.claude/commands/gha.md +136 -0
  7. package/.claude/commands/handoff.md +93 -0
  8. package/.claude/commands/plan.md +88 -0
  9. package/.claude/commands/refactor.md +102 -0
  10. package/.claude/hooks/pre-push.cjs +3 -2
  11. package/.claude/rules/coding-style.md +119 -0
  12. package/.claude/rules/hooks.md +288 -0
  13. package/.claude/rules/performance.md +78 -0
  14. package/.claude/rules/security.md +56 -0
  15. package/.claude/rules/testing.md +89 -0
  16. package/.claude/settings.local.json +24 -1
  17. package/.claude/skills/design-brain/SKILL.md +190 -0
  18. package/.claude/skills/design-brain/metadata.yaml +26 -0
  19. package/.claude/skills/quality-guard/SKILL.md +138 -0
  20. package/.claude/skills/quality-guard/metadata.yaml +27 -0
  21. package/.claude/skills/quick-fix/SKILL.md +138 -0
  22. package/.claude/skills/quick-fix/metadata.yaml +26 -0
  23. package/.claude/skills/test-master/SKILL.md +186 -0
  24. package/.claude/skills/test-master/metadata.yaml +29 -0
  25. package/AGENTS.md +25 -7
  26. package/CHANGELOG.md +64 -3
  27. package/README.md +57 -0
  28. package/cli.js +4 -0
  29. package/config/official-skills.json +1 -1
  30. package/development/knowledge-base/.index.clean.json +1 -0
  31. package/lib/commands.js +51 -0
  32. package/lib/permission-audit.js +255 -0
  33. package/package.json +1 -1
  34. package/.claude/skills/123-skill/SKILL.md +0 -61
  35. package/.claude/skills/123-skill/examples/basic.md +0 -3
  36. package/.claude/skills/123-skill/metadata.yaml +0 -30
  37. package/.claude/skills/123-skill/templates/default.md +0 -3
  38. package/.claude/skills/api-tester/SKILL.md +0 -90
  39. package/.claude/skills/api-tester/examples/basic.md +0 -3
  40. package/.claude/skills/api-tester/metadata.yaml +0 -30
  41. package/.claude/skills/api-tester/templates/default.md +0 -3
  42. package/.claude/skills/code-reviewer-123/SKILL.md +0 -61
  43. package/.claude/skills/code-reviewer-123/examples/basic.md +0 -3
  44. package/.claude/skills/code-reviewer-123/metadata.yaml +0 -30
  45. package/.claude/skills/code-reviewer-123/templates/default.md +0 -3
  46. package/.claude/skills/my-skill/SKILL.md +0 -61
  47. package/.claude/skills/my-skill/examples/basic.md +0 -3
  48. package/.claude/skills/my-skill/metadata.yaml +0 -30
  49. package/.claude/skills/my-skill/templates/default.md +0 -3
  50. package/.claude/skills/template/SKILL.md +0 -6
  51. package/.claude/skills/template/metadata.yaml +0 -30
  52. package/.claude/skills/test-skill-name/SKILL.md +0 -61
  53. package/.claude/skills/test-skill-name/examples/basic.md +0 -3
  54. package/.claude/skills/test-skill-name/metadata.yaml +0 -30
  55. package/.claude/skills/test-skill-name/templates/default.md +0 -3
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Permission Audit - Security scanner for approved commands
3
+ * Inspired by cc-safe from ykdojo/claude-code-tips
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+ const os = require('os');
9
+
10
+ // Dangerous patterns with severity levels
11
+ const DANGEROUS_PATTERNS = [
12
+ // Critical - Must remove
13
+ { pattern: /rm\s+-rf\s+\/(?!\w)/, level: 'critical', desc: 'Delete root directory' },
14
+ { pattern: />\s*\/dev\/sd[a-z]/, level: 'critical', desc: 'Overwrite disk device' },
15
+ { pattern: /mkfs/, level: 'critical', desc: 'Format disk' },
16
+ { pattern: /dd\s+if=\/dev\/zero/, level: 'critical', desc: 'Overwrite with zeros' },
17
+ { pattern: /:\(\)\s*\{\s*:\|:&\s*\}\s*;:/, level: 'critical', desc: 'Fork bomb' },
18
+
19
+ // High - Should review
20
+ { pattern: /sudo/, level: 'high', desc: 'Privilege escalation' },
21
+ { pattern: /rm\s+-rf/, level: 'high', desc: 'Recursive force delete' },
22
+ { pattern: /chmod\s+777/, level: 'high', desc: 'World-writable permissions' },
23
+ { pattern: /--privileged/, level: 'high', desc: 'Privileged container' },
24
+ { pattern: /curl.*\|\s*(sh|bash)/, level: 'high', desc: 'Remote script execution' },
25
+ { pattern: /wget.*\|\s*(sh|bash)/, level: 'high', desc: 'Remote script execution' },
26
+ { pattern: /eval\s/, level: 'high', desc: 'Dynamic code execution' },
27
+ { pattern: /--no-verify/, level: 'high', desc: 'Skip verification hooks' },
28
+
29
+ // Medium - Optional review
30
+ { pattern: /npm\s+install\s+-g/, level: 'medium', desc: 'Global npm install' },
31
+ { pattern: /pip\s+install/, level: 'medium', desc: 'Python package install' },
32
+ { pattern: /git\s+push\s+--force/, level: 'medium', desc: 'Force push' },
33
+ { pattern: /git\s+reset\s+--hard/, level: 'medium', desc: 'Hard reset' },
34
+ { pattern: /DROP\s+(TABLE|DATABASE)/i, level: 'medium', desc: 'Drop database objects' },
35
+ { pattern: /TRUNCATE/i, level: 'medium', desc: 'Truncate table' },
36
+ ];
37
+
38
+ /**
39
+ * Find all settings files to scan
40
+ */
41
+ function findSettingsFiles(projectDir) {
42
+ const files = [];
43
+ const homeDir = os.homedir();
44
+
45
+ // Global settings
46
+ const globalSettings = path.join(homeDir, '.claude', 'settings.local.json');
47
+ if (fs.existsSync(globalSettings)) {
48
+ files.push({ path: globalSettings, scope: 'global' });
49
+ }
50
+
51
+ // Project settings
52
+ if (projectDir) {
53
+ const projectSettings = path.join(projectDir, '.claude', 'settings.local.json');
54
+ if (fs.existsSync(projectSettings)) {
55
+ files.push({ path: projectSettings, scope: 'project' });
56
+ }
57
+ }
58
+
59
+ // All project settings in ~/.claude/projects/
60
+ const projectsDir = path.join(homeDir, '.claude', 'projects');
61
+ if (fs.existsSync(projectsDir)) {
62
+ try {
63
+ const projects = fs.readdirSync(projectsDir);
64
+ for (const proj of projects) {
65
+ const projSettings = path.join(projectsDir, proj, 'settings.local.json');
66
+ if (fs.existsSync(projSettings)) {
67
+ files.push({ path: projSettings, scope: `project:${proj}` });
68
+ }
69
+ }
70
+ } catch (e) {
71
+ // Ignore read errors
72
+ }
73
+ }
74
+
75
+ return files;
76
+ }
77
+
78
+ /**
79
+ * Extract permissions from settings file
80
+ */
81
+ function extractPermissions(settingsPath) {
82
+ try {
83
+ const content = fs.readFileSync(settingsPath, 'utf-8');
84
+ const settings = JSON.parse(content);
85
+
86
+ const permissions = [];
87
+
88
+ // Check permissions.allow array
89
+ if (settings.permissions?.allow) {
90
+ permissions.push(...settings.permissions.allow);
91
+ }
92
+
93
+ // Check allowedTools (older format)
94
+ if (settings.allowedTools) {
95
+ permissions.push(...settings.allowedTools);
96
+ }
97
+
98
+ return permissions;
99
+ } catch (e) {
100
+ return [];
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Scan a permission string for dangerous patterns
106
+ */
107
+ function scanPermission(permission) {
108
+ const issues = [];
109
+
110
+ for (const { pattern, level, desc } of DANGEROUS_PATTERNS) {
111
+ if (pattern.test(permission)) {
112
+ issues.push({ level, desc, pattern: pattern.toString(), match: permission });
113
+ }
114
+ }
115
+
116
+ return issues;
117
+ }
118
+
119
+ /**
120
+ * Run full audit
121
+ */
122
+ function audit(options = {}) {
123
+ const { projectDir = process.cwd(), global: scanGlobal = true } = options;
124
+
125
+ const results = {
126
+ scanned: 0,
127
+ issues: {
128
+ critical: [],
129
+ high: [],
130
+ medium: [],
131
+ },
132
+ files: [],
133
+ };
134
+
135
+ const files = findSettingsFiles(scanGlobal ? projectDir : null);
136
+ results.scanned = files.length;
137
+ results.files = files.map(f => f.path);
138
+
139
+ for (const { path: filePath, scope } of files) {
140
+ const permissions = extractPermissions(filePath);
141
+
142
+ for (const perm of permissions) {
143
+ const issues = scanPermission(perm);
144
+
145
+ for (const issue of issues) {
146
+ const entry = {
147
+ ...issue,
148
+ file: filePath,
149
+ scope,
150
+ permission: perm,
151
+ };
152
+
153
+ results.issues[issue.level].push(entry);
154
+ }
155
+ }
156
+ }
157
+
158
+ return results;
159
+ }
160
+
161
+ /**
162
+ * Generate markdown report
163
+ */
164
+ function generateReport(results) {
165
+ const { scanned, issues, files } = results;
166
+ const totalIssues = issues.critical.length + issues.high.length + issues.medium.length;
167
+
168
+ let report = `# Permission Audit Report
169
+
170
+ **Date**: ${new Date().toISOString().split('T')[0]}
171
+ **Scanned**: ${scanned} files
172
+ **Issues**: ${totalIssues} found
173
+
174
+ `;
175
+
176
+ // Critical issues
177
+ report += `## 🔴 Critical Issues (${issues.critical.length})\n\n`;
178
+ if (issues.critical.length === 0) {
179
+ report += 'None found.\n\n';
180
+ } else {
181
+ issues.critical.forEach((issue, i) => {
182
+ report += `### ${i + 1}. ${issue.desc}
183
+ **Location**: ${issue.file}
184
+ **Pattern**: \`${issue.permission}\`
185
+ **Risk**: ${issue.desc}
186
+
187
+ `;
188
+ });
189
+ }
190
+
191
+ // High risk
192
+ report += `## 🟠 High Risk (${issues.high.length})\n\n`;
193
+ if (issues.high.length === 0) {
194
+ report += 'None found.\n\n';
195
+ } else {
196
+ issues.high.forEach((issue, i) => {
197
+ report += `### ${i + 1}. ${issue.desc}
198
+ **Location**: ${issue.file}
199
+ **Pattern**: \`${issue.permission}\`
200
+ **Risk**: ${issue.desc}
201
+
202
+ `;
203
+ });
204
+ }
205
+
206
+ // Medium risk
207
+ report += `## 🟡 Medium Risk (${issues.medium.length})\n\n`;
208
+ if (issues.medium.length === 0) {
209
+ report += 'None found.\n\n';
210
+ } else {
211
+ issues.medium.forEach((issue, i) => {
212
+ report += `### ${i + 1}. ${issue.desc}
213
+ **Location**: ${issue.file}
214
+ **Pattern**: \`${issue.permission}\`
215
+
216
+ `;
217
+ });
218
+ }
219
+
220
+ // Summary
221
+ report += `## Summary
222
+
223
+ | Level | Count | Action |
224
+ |-------|-------|--------|
225
+ | 🔴 Critical | ${issues.critical.length} | Must remove |
226
+ | 🟠 High | ${issues.high.length} | Should review |
227
+ | 🟡 Medium | ${issues.medium.length} | Optional review |
228
+
229
+ `;
230
+
231
+ return report;
232
+ }
233
+
234
+ /**
235
+ * Check if audit passes (for CI)
236
+ */
237
+ function passes(results, options = {}) {
238
+ const { allowMedium = true, allowHigh = false } = options;
239
+
240
+ if (results.issues.critical.length > 0) return false;
241
+ if (!allowHigh && results.issues.high.length > 0) return false;
242
+ if (!allowMedium && results.issues.medium.length > 0) return false;
243
+
244
+ return true;
245
+ }
246
+
247
+ module.exports = {
248
+ audit,
249
+ generateReport,
250
+ passes,
251
+ DANGEROUS_PATTERNS,
252
+ findSettingsFiles,
253
+ extractPermissions,
254
+ scanPermission,
255
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sumulige-claude",
3
- "version": "1.2.1",
3
+ "version": "1.3.1",
4
4
  "description": "The Best Agent Harness for Claude Code",
5
5
  "main": "cli.js",
6
6
  "bin": {
@@ -1,61 +0,0 @@
1
- # 123 Skill
2
-
3
- > 简短描述这个技能的作用(一句话)
4
-
5
- **版本**: 1.0.0
6
- **作者**: @username
7
- **标签**: [category1, category2]
8
- **难度**: 初级/中级/高级
9
-
10
- ---
11
-
12
- ## 概述
13
-
14
- 详细描述这个技能的功能和用途。
15
-
16
- ## 适用场景
17
-
18
- - 场景 1
19
- - 场景 2
20
- - 场景 3
21
-
22
- ## 触发关键词
23
-
24
- ```
25
- keyword1, keyword2, "exact phrase"
26
- ```
27
-
28
- ## 使用方法
29
-
30
- ### 基础用法
31
-
32
- ```bash
33
- # 示例命令
34
- your-command-here
35
- ```
36
-
37
- ### 高级用法
38
-
39
- ```yaml
40
- # 配置示例
41
- key: value
42
- ```
43
-
44
- ## 输出格式
45
-
46
- 描述这个技能的输出结果格式。
47
-
48
- ## 注意事项
49
-
50
- - 注意事项 1
51
- - 注意事项 2
52
-
53
- ## 相关技能
54
-
55
- - [related-skill](../related-skill/)
56
- - [another-skill](../another-skill/)
57
-
58
- ## 更新日志
59
-
60
- ### 1.0.0 (YYYY-MM-DD)
61
- - 初始版本
@@ -1,3 +0,0 @@
1
- # Basic Example for 123-skill
2
-
3
- Replace this with your actual example.
@@ -1,30 +0,0 @@
1
- # Skill Metadata
2
- # 这个文件定义技能的基本信息,用于自动发现和索引
3
-
4
- name: 123-skill
5
- version: 1.0.0
6
- author: @username
7
- description: 简短描述技能功能
8
-
9
- tags:
10
- - category1
11
- - category2
12
-
13
- triggers:
14
- - keyword1
15
- - keyword2
16
- - "exact phrase"
17
-
18
- dependencies: [] # 依赖的其他技能
19
-
20
- difficulty: beginner # beginner | intermediate | advanced
21
-
22
- # 模板文件
23
- templates:
24
- - name: default
25
- file: templates/default.md
26
-
27
- # 示例文件
28
- examples:
29
- - name: basic
30
- file: examples/basic.md
@@ -1,3 +0,0 @@
1
- # Default Template for 123-skill
2
-
3
- Replace this with your actual template.
@@ -1,90 +0,0 @@
1
- ---
2
- name: api-tester
3
- description: API testing and HTTP request validation tool for REST/GraphQL endpoints
4
- see_also:
5
- - mcp-builder
6
- - webapp-testing
7
- ---
8
-
9
- # API Tester
10
-
11
- > Test and validate REST/GraphQL APIs with automated request/response checking
12
-
13
- **Version**: 1.0.0
14
- **Author**: sumulige
15
- **Tags**: [api, testing, http, rest, graphql]
16
- **Difficulty**: 中级
17
-
18
- ---
19
-
20
- ## 概述
21
-
22
- API Tester 是一个用于测试和验证 API 接口的技能。支持 REST 和 GraphQL,可以自动检查响应状态码、数据结构和性能指标。
23
-
24
- ## 适用场景
25
-
26
- - 测试 REST API 端点
27
- - 验证 API 响应格式
28
- - 检查 HTTP 状态码
29
- - 测试 API 认证
30
- - 性能基准测试
31
-
32
- ## 触发关键词
33
-
34
- ```
35
- api test, "test the api", "check endpoint", http request, "validate api",
36
- graphql query, rest api, postman, curl
37
- ```
38
-
39
- ## 使用方法
40
-
41
- ### 基础用法
42
-
43
- ```bash
44
- # 测试 GET 请求
45
- curl -X GET https://api.example.com/users
46
-
47
- # 测试 POST 请求
48
- curl -X POST https://api.example.com/users \
49
- -H "Content-Type: application/json" \
50
- -d '{"name": "John"}'
51
- ```
52
-
53
- ### 验证响应
54
-
55
- ```javascript
56
- // 检查状态码
57
- response.status === 200
58
-
59
- // 验证数据结构
60
- response.data.users.forEach(user => {
61
- assert(user.id, 'User must have id');
62
- assert(user.email, 'User must have email');
63
- });
64
- ```
65
-
66
- ## 输出格式
67
-
68
- ```
69
- ✅ GET /api/users - 200 OK (142ms)
70
- ✅ POST /api/users - 201 Created (89ms)
71
- ❌ GET /api/users/999 - 404 Not Found (45ms)
72
- ```
73
-
74
- ## 注意事项
75
-
76
- - 使用测试环境 API,避免生产数据修改
77
- - 检查 API 速率限制
78
- - 验证认证 Token 有效性
79
- - 处理分页响应
80
-
81
- ## 相关技能
82
-
83
- - [mcp-builder](../mcp-builder/) - MCP 服务器构建
84
- - [webapp-testing](../webapp-testing/) - Web 应用测试
85
-
86
- ## 更新日志
87
-
88
- ### 1.0.0 (2026-01-15)
89
- - 初始版本
90
- - 添加 REST/GraphQL 支持
@@ -1,3 +0,0 @@
1
- # Basic Example for api-tester
2
-
3
- Replace this with your actual example.
@@ -1,30 +0,0 @@
1
- # Skill Metadata
2
- # 这个文件定义技能的基本信息,用于自动发现和索引
3
-
4
- name: api-tester
5
- version: 1.0.0
6
- author: @username
7
- description: 简短描述技能功能
8
-
9
- tags:
10
- - category1
11
- - category2
12
-
13
- triggers:
14
- - keyword1
15
- - keyword2
16
- - "exact phrase"
17
-
18
- dependencies: [] # 依赖的其他技能
19
-
20
- difficulty: beginner # beginner | intermediate | advanced
21
-
22
- # 模板文件
23
- templates:
24
- - name: default
25
- file: templates/default.md
26
-
27
- # 示例文件
28
- examples:
29
- - name: basic
30
- file: examples/basic.md
@@ -1,3 +0,0 @@
1
- # Default Template for api-tester
2
-
3
- Replace this with your actual template.
@@ -1,61 +0,0 @@
1
- # Code Reviewer 123
2
-
3
- > 简短描述这个技能的作用(一句话)
4
-
5
- **版本**: 1.0.0
6
- **作者**: @username
7
- **标签**: [category1, category2]
8
- **难度**: 初级/中级/高级
9
-
10
- ---
11
-
12
- ## 概述
13
-
14
- 详细描述这个技能的功能和用途。
15
-
16
- ## 适用场景
17
-
18
- - 场景 1
19
- - 场景 2
20
- - 场景 3
21
-
22
- ## 触发关键词
23
-
24
- ```
25
- keyword1, keyword2, "exact phrase"
26
- ```
27
-
28
- ## 使用方法
29
-
30
- ### 基础用法
31
-
32
- ```bash
33
- # 示例命令
34
- your-command-here
35
- ```
36
-
37
- ### 高级用法
38
-
39
- ```yaml
40
- # 配置示例
41
- key: value
42
- ```
43
-
44
- ## 输出格式
45
-
46
- 描述这个技能的输出结果格式。
47
-
48
- ## 注意事项
49
-
50
- - 注意事项 1
51
- - 注意事项 2
52
-
53
- ## 相关技能
54
-
55
- - [related-skill](../related-skill/)
56
- - [another-skill](../another-skill/)
57
-
58
- ## 更新日志
59
-
60
- ### 1.0.0 (YYYY-MM-DD)
61
- - 初始版本
@@ -1,3 +0,0 @@
1
- # Basic Example for code-reviewer-123
2
-
3
- Replace this with your actual example.
@@ -1,30 +0,0 @@
1
- # Skill Metadata
2
- # 这个文件定义技能的基本信息,用于自动发现和索引
3
-
4
- name: code-reviewer-123
5
- version: 1.0.0
6
- author: @username
7
- description: 简短描述技能功能
8
-
9
- tags:
10
- - category1
11
- - category2
12
-
13
- triggers:
14
- - keyword1
15
- - keyword2
16
- - "exact phrase"
17
-
18
- dependencies: [] # 依赖的其他技能
19
-
20
- difficulty: beginner # beginner | intermediate | advanced
21
-
22
- # 模板文件
23
- templates:
24
- - name: default
25
- file: templates/default.md
26
-
27
- # 示例文件
28
- examples:
29
- - name: basic
30
- file: examples/basic.md
@@ -1,3 +0,0 @@
1
- # Default Template for code-reviewer-123
2
-
3
- Replace this with your actual template.
@@ -1,61 +0,0 @@
1
- # My Skill
2
-
3
- > 简短描述这个技能的作用(一句话)
4
-
5
- **版本**: 1.0.0
6
- **作者**: @username
7
- **标签**: [category1, category2]
8
- **难度**: 初级/中级/高级
9
-
10
- ---
11
-
12
- ## 概述
13
-
14
- 详细描述这个技能的功能和用途。
15
-
16
- ## 适用场景
17
-
18
- - 场景 1
19
- - 场景 2
20
- - 场景 3
21
-
22
- ## 触发关键词
23
-
24
- ```
25
- keyword1, keyword2, "exact phrase"
26
- ```
27
-
28
- ## 使用方法
29
-
30
- ### 基础用法
31
-
32
- ```bash
33
- # 示例命令
34
- your-command-here
35
- ```
36
-
37
- ### 高级用法
38
-
39
- ```yaml
40
- # 配置示例
41
- key: value
42
- ```
43
-
44
- ## 输出格式
45
-
46
- 描述这个技能的输出结果格式。
47
-
48
- ## 注意事项
49
-
50
- - 注意事项 1
51
- - 注意事项 2
52
-
53
- ## 相关技能
54
-
55
- - [related-skill](../related-skill/)
56
- - [another-skill](../another-skill/)
57
-
58
- ## 更新日志
59
-
60
- ### 1.0.0 (YYYY-MM-DD)
61
- - 初始版本
@@ -1,3 +0,0 @@
1
- # Basic Example for my-skill
2
-
3
- Replace this with your actual example.
@@ -1,30 +0,0 @@
1
- # Skill Metadata
2
- # 这个文件定义技能的基本信息,用于自动发现和索引
3
-
4
- name: my-skill
5
- version: 1.0.0
6
- author: @username
7
- description: 简短描述技能功能
8
-
9
- tags:
10
- - category1
11
- - category2
12
-
13
- triggers:
14
- - keyword1
15
- - keyword2
16
- - "exact phrase"
17
-
18
- dependencies: [] # 依赖的其他技能
19
-
20
- difficulty: beginner # beginner | intermediate | advanced
21
-
22
- # 模板文件
23
- templates:
24
- - name: default
25
- file: templates/default.md
26
-
27
- # 示例文件
28
- examples:
29
- - name: basic
30
- file: examples/basic.md
@@ -1,3 +0,0 @@
1
- # Default Template for my-skill
2
-
3
- Replace this with your actual template.
@@ -1,6 +0,0 @@
1
- ---
2
- name: template-skill
3
- description: Replace with description of the skill and when Claude should use it.
4
- ---
5
-
6
- # Insert instructions below