minimal-workflow 0.2.0
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/index.html +12 -0
- package/package.json +44 -0
- package/public/manifest.fallback.json +482 -0
- package/scripts/cli.ts +318 -0
- package/scripts/server.ts +131 -0
- package/src/App.tsx +119 -0
- package/src/api/files.ts +32 -0
- package/src/api/manifest.ts +17 -0
- package/src/canvas/WorkflowCanvas.tsx +161 -0
- package/src/canvas/edges/SequentialEdge.tsx +14 -0
- package/src/canvas/nodes/AssertNode.tsx +17 -0
- package/src/canvas/nodes/BaseNode.tsx +55 -0
- package/src/canvas/nodes/BranchNode.tsx +21 -0
- package/src/canvas/nodes/LlmNode.tsx +29 -0
- package/src/canvas/nodes/LoopNode.tsx +22 -0
- package/src/canvas/nodes/PauseNode.tsx +17 -0
- package/src/canvas/nodes/SkillNode.tsx +27 -0
- package/src/canvas/nodes/ToolNode.tsx +27 -0
- package/src/index.css +379 -0
- package/src/inspector/Inspector.tsx +224 -0
- package/src/inspector/LlmNodeForm.tsx +59 -0
- package/src/inspector/SkillNodeForm.tsx +62 -0
- package/src/inspector/ToolNodeForm.tsx +120 -0
- package/src/main.tsx +10 -0
- package/src/palette/ControlFlowSection.tsx +45 -0
- package/src/palette/Palette.tsx +65 -0
- package/src/palette/SkillPaletteSection.tsx +31 -0
- package/src/palette/ToolPaletteSection.tsx +31 -0
- package/src/store/filesStore.ts +29 -0
- package/src/store/manifestStore.ts +25 -0
- package/src/store/workflowStore.ts +140 -0
- package/src/types.ts +83 -0
- package/src/utils/safePath.ts +49 -0
- package/src/yaml-view/YamlEditor.tsx +71 -0
- package/src/yaml-view/sync.ts +246 -0
- package/tsconfig.json +24 -0
- package/vite.config.ts +21 -0
package/index.html
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>workflow-ui — minimal-agent</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="root"></div>
|
|
10
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "minimal-workflow",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Visual editor for minimal-agent workflow YAML files",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"workflow-ui": "./scripts/cli.ts"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"bun": ">=1.1"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"scripts",
|
|
14
|
+
"src",
|
|
15
|
+
"public",
|
|
16
|
+
"index.html",
|
|
17
|
+
"vite.config.ts",
|
|
18
|
+
"tsconfig.json",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "bunx --bun vite",
|
|
23
|
+
"build": "bunx --bun vite build",
|
|
24
|
+
"preview": "bunx --bun vite preview",
|
|
25
|
+
"server": "bun scripts/server.ts",
|
|
26
|
+
"start": "bun scripts/cli.ts",
|
|
27
|
+
"test": "bun test",
|
|
28
|
+
"typecheck": "tsc --noEmit"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@xyflow/react": "^12.3.5",
|
|
32
|
+
"react": "^18.3.1",
|
|
33
|
+
"react-dom": "^18.3.1",
|
|
34
|
+
"yaml": "^2.6.1",
|
|
35
|
+
"zustand": "^5.0.2"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/react": "^18.3.12",
|
|
39
|
+
"@types/react-dom": "^18.3.1",
|
|
40
|
+
"@vitejs/plugin-react-swc": "^3.7.2",
|
|
41
|
+
"typescript": "^5.7.2",
|
|
42
|
+
"vite": "^6.0.3"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.1.0",
|
|
3
|
+
"generatedAt": "2026-05-20T09:19:52.663Z",
|
|
4
|
+
"tools": [
|
|
5
|
+
{
|
|
6
|
+
"name": "Read",
|
|
7
|
+
"description": "Reads a file from the local filesystem. You can access any file directly by using this tool.\nAssume this tool is able to read all files on the machine. If the User provides a path to a file assume that path is valid. It is okay to read a file that does not exist; an error will be returned.\n\nUsage:\n- The file_path parameter is preferably an absolute path. Relative paths are accepted and will be resolved against the agent's working directory (locked at startup via `-d <dir>` or process cwd).\n- By default, it reads up to 2000 lines starting from the beginning of the file\n- You can optionally specify a line offset and limit (especially handy for long files)\n- Results are returned using cat -n format, with line numbers starting at 1\n- This tool can only read text files, not directories. To read a directory, use the Glob tool.\n- If you read a file that exists but has empty contents you will receive a warning in place of file contents.\n- This tool cannot read binary files. Files whose extensions are on the binary blocklist (images: .png/.jpg/.gif/.webp/..., documents: .pdf/.docx/.xlsx/..., executables: .exe/.dll/.so/..., archives: .zip/.tar/.gz/..., and others) will be rejected with a clear error. If the file is actually text despite the extension (e.g., a misnamed log), rename it or use Bash `cat` to read it directly — do not retry Read with the same path.",
|
|
8
|
+
"parameters": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"file_path": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"minLength": 1,
|
|
14
|
+
"description": "要读取的文件路径(绝对路径优先,相对路径基于 working dir 解析)"
|
|
15
|
+
},
|
|
16
|
+
"offset": {
|
|
17
|
+
"type": "integer",
|
|
18
|
+
"exclusiveMinimum": true,
|
|
19
|
+
"minimum": 0,
|
|
20
|
+
"description": "起始行号(1-indexed);不填则从文件开头读"
|
|
21
|
+
},
|
|
22
|
+
"limit": {
|
|
23
|
+
"type": "integer",
|
|
24
|
+
"exclusiveMinimum": true,
|
|
25
|
+
"minimum": 0,
|
|
26
|
+
"description": "最多读多少行;不填则用默认值 2000"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"required": [
|
|
30
|
+
"file_path"
|
|
31
|
+
],
|
|
32
|
+
"additionalProperties": false
|
|
33
|
+
},
|
|
34
|
+
"isReadOnly": true,
|
|
35
|
+
"isConcurrencySafe": true
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "Edit",
|
|
39
|
+
"description": "Performs exact string replacements in files.\n\nUsage:\n- You MUST use your `Read` tool to read the current content of the file BEFORE calling Edit.\n Memory is unreliable — if you think you \"remember\" how the code looks, you are probably wrong.\n Re-read the relevant sections (function, module, or area you plan to change) every time.\n- To create a new file, pass an empty `old_string` and the desired contents as `new_string`. When creating a new file (path does not yet exist), you may call Edit directly — no prior Read is needed.\n- If the file already exists and you pass an empty `old_string`, the edit is rejected with a clear error. To replace the entire content of an existing file, use the Write tool instead.\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.\n- The edit will FAIL if `old_string` is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use `replace_all` to change every instance of `old_string`.\n- Use `replace_all` for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.\n- Preserve exact indentation (tabs/spaces).",
|
|
40
|
+
"parameters": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"properties": {
|
|
43
|
+
"file_path": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"minLength": 1,
|
|
46
|
+
"description": "要编辑的文件路径(绝对路径优先,相对路径基于 working dir 解析)"
|
|
47
|
+
},
|
|
48
|
+
"old_string": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"description": "要替换的原文本(必须在文件中唯一,除非 replace_all=true);为空字符串且文件不存在时创建新文件"
|
|
51
|
+
},
|
|
52
|
+
"new_string": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"description": "替换为的新文本(与 old_string 必须不同)"
|
|
55
|
+
},
|
|
56
|
+
"replace_all": {
|
|
57
|
+
"type": "boolean",
|
|
58
|
+
"description": "是否替换所有出现位置(默认 false)"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"required": [
|
|
62
|
+
"file_path",
|
|
63
|
+
"old_string",
|
|
64
|
+
"new_string"
|
|
65
|
+
],
|
|
66
|
+
"additionalProperties": false
|
|
67
|
+
},
|
|
68
|
+
"isReadOnly": false,
|
|
69
|
+
"isConcurrencySafe": false
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "MultiEdit",
|
|
73
|
+
"description": "Performs multiple exact string replacements in a single file, applied atomically (all-or-nothing).\n\nUsage:\n- You MUST use your `Read` tool to read the current content of the file BEFORE calling MultiEdit.\n- Provide a list of `edits`, each with `old_string`, `new_string`, and optional `replace_all`.\n- All edits are applied sequentially in memory; if ANY edit fails (string not found, ambiguous match, or dependency conflict), the file on disk is UNTOUCHED.\n- Order matters: later edits operate on the result of earlier edits. If a later edit's `old_string` is a substring of an earlier edit's `new_string`, MultiEdit refuses (reorder or merge instead).\n- Each `old_string` must be unique in the current content (after prior edits) unless `replace_all=true`.\n- Empty `old_string` is NOT allowed in MultiEdit. To create a new file, use the `Edit` tool with a single empty-old_string call.\n- Preserve exact indentation (tabs/spaces).",
|
|
74
|
+
"parameters": {
|
|
75
|
+
"type": "object",
|
|
76
|
+
"properties": {
|
|
77
|
+
"file_path": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"minLength": 1,
|
|
80
|
+
"description": "要编辑的文件路径(绝对路径优先,相对路径基于 working dir 解析)"
|
|
81
|
+
},
|
|
82
|
+
"edits": {
|
|
83
|
+
"type": "array",
|
|
84
|
+
"items": {
|
|
85
|
+
"type": "object",
|
|
86
|
+
"properties": {
|
|
87
|
+
"old_string": {
|
|
88
|
+
"type": "string",
|
|
89
|
+
"minLength": 1,
|
|
90
|
+
"description": "要替换的原文本(不允许为空 —— 创建新文件请用 Edit 工具)"
|
|
91
|
+
},
|
|
92
|
+
"new_string": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"description": "替换为的新文本"
|
|
95
|
+
},
|
|
96
|
+
"replace_all": {
|
|
97
|
+
"type": "boolean",
|
|
98
|
+
"description": "是否替换所有出现位置(默认 false,要求 old_string 在当前内容中唯一)"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"required": [
|
|
102
|
+
"old_string",
|
|
103
|
+
"new_string"
|
|
104
|
+
],
|
|
105
|
+
"additionalProperties": false
|
|
106
|
+
},
|
|
107
|
+
"minItems": 1,
|
|
108
|
+
"maxItems": 50,
|
|
109
|
+
"description": "按顺序应用的 edit 列表(1-50 条),原子化执行:全部成功才落盘"
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"required": [
|
|
113
|
+
"file_path",
|
|
114
|
+
"edits"
|
|
115
|
+
],
|
|
116
|
+
"additionalProperties": false
|
|
117
|
+
},
|
|
118
|
+
"isReadOnly": false,
|
|
119
|
+
"isConcurrencySafe": false
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"name": "Write",
|
|
123
|
+
"description": "Writes a file to the local filesystem.\n\nUsage:\n- This tool will overwrite the existing file if there is one at the provided path.\n- If you intend to overwrite an existing file, you MUST use your `Read` tool to read its current content at least once in the current session BEFORE calling Write. This tool will error with a \"请先 Read\" message if you attempt to overwrite a file that has not been read. To create a new file (path does not yet exist), you can call Write directly without a prior Read.\n- If the parent directory does not exist, it will be created recursively.\n- ALWAYS prefer editing existing files in the codebase via the Edit tool. NEVER write new files unless explicitly required.\n- NEVER create documentation files (*.md) or README files unless explicitly requested by the User.",
|
|
124
|
+
"parameters": {
|
|
125
|
+
"type": "object",
|
|
126
|
+
"properties": {
|
|
127
|
+
"file_path": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"minLength": 1,
|
|
130
|
+
"description": "要写入的文件路径(绝对路径优先,相对路径基于 working dir 解析)"
|
|
131
|
+
},
|
|
132
|
+
"content": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"description": "文件完整内容(会覆盖既有内容)"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"required": [
|
|
138
|
+
"file_path",
|
|
139
|
+
"content"
|
|
140
|
+
],
|
|
141
|
+
"additionalProperties": false
|
|
142
|
+
},
|
|
143
|
+
"isReadOnly": false,
|
|
144
|
+
"isConcurrencySafe": false
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"name": "Glob",
|
|
148
|
+
"description": "- Fast file pattern matching tool that works with any codebase size\n- Supports glob patterns like \"**/*.js\" or \"src/**/*.ts\"\n- Returns matching file paths sorted by modification time (oldest first)\n- Use this tool when you need to find files by name patterns\n- When you need to do an open ended search that may require multiple rounds, prefer the Grep tool for content search",
|
|
149
|
+
"parameters": {
|
|
150
|
+
"type": "object",
|
|
151
|
+
"properties": {
|
|
152
|
+
"pattern": {
|
|
153
|
+
"type": "string",
|
|
154
|
+
"minLength": 1,
|
|
155
|
+
"description": "glob 模式,例如 \"**/*.ts\" 或 \"src/components/**/*.tsx\""
|
|
156
|
+
},
|
|
157
|
+
"path": {
|
|
158
|
+
"type": "string",
|
|
159
|
+
"description": "搜索的根目录(默认当前工作目录);省略时不要传 \"undefined\" 字符串"
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"required": [
|
|
163
|
+
"pattern"
|
|
164
|
+
],
|
|
165
|
+
"additionalProperties": false
|
|
166
|
+
},
|
|
167
|
+
"isReadOnly": true,
|
|
168
|
+
"isConcurrencySafe": true
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"name": "Grep",
|
|
172
|
+
"description": "A powerful search tool built on ripgrep.\n\nUsage:\n- ALWAYS use Grep for content search tasks. Do NOT invoke `grep` or `rg` directly via Bash.\n- Supports full regex syntax (e.g., \"log.*Error\", \"function\\s+\\w+\")\n- Filter files with glob parameter (e.g., \"*.js\", \"**/*.tsx\") or type parameter (e.g., \"js\", \"py\", \"rust\")\n- Output modes: \"content\" shows matching lines, \"files_with_matches\" shows only file paths (default), \"count\" shows match counts\n- Pattern syntax: Uses ripgrep (not classic grep)",
|
|
173
|
+
"parameters": {
|
|
174
|
+
"type": "object",
|
|
175
|
+
"properties": {
|
|
176
|
+
"pattern": {
|
|
177
|
+
"type": "string",
|
|
178
|
+
"minLength": 1,
|
|
179
|
+
"description": "正则表达式(ripgrep 兼容语法)"
|
|
180
|
+
},
|
|
181
|
+
"path": {
|
|
182
|
+
"type": "string",
|
|
183
|
+
"description": "搜索的根目录或文件(默认当前工作目录)"
|
|
184
|
+
},
|
|
185
|
+
"glob": {
|
|
186
|
+
"type": "string",
|
|
187
|
+
"description": "文件名 glob 过滤,如 \"*.ts\""
|
|
188
|
+
},
|
|
189
|
+
"type": {
|
|
190
|
+
"type": "string",
|
|
191
|
+
"description": "rg 的文件类型快捷名,如 \"py\"、\"rust\"、\"js\""
|
|
192
|
+
},
|
|
193
|
+
"output_mode": {
|
|
194
|
+
"type": "string",
|
|
195
|
+
"enum": [
|
|
196
|
+
"content",
|
|
197
|
+
"files_with_matches",
|
|
198
|
+
"count"
|
|
199
|
+
],
|
|
200
|
+
"description": "输出模式:content=匹配行;files_with_matches=只列文件;count=每文件计数"
|
|
201
|
+
},
|
|
202
|
+
"-i": {
|
|
203
|
+
"type": "boolean",
|
|
204
|
+
"description": "忽略大小写"
|
|
205
|
+
},
|
|
206
|
+
"-n": {
|
|
207
|
+
"type": "boolean",
|
|
208
|
+
"description": "显示行号(仅 content 模式)"
|
|
209
|
+
},
|
|
210
|
+
"-A": {
|
|
211
|
+
"type": "integer",
|
|
212
|
+
"minimum": 0,
|
|
213
|
+
"description": "匹配后展示几行上下文"
|
|
214
|
+
},
|
|
215
|
+
"-B": {
|
|
216
|
+
"type": "integer",
|
|
217
|
+
"minimum": 0,
|
|
218
|
+
"description": "匹配前展示几行上下文"
|
|
219
|
+
},
|
|
220
|
+
"-C": {
|
|
221
|
+
"type": "integer",
|
|
222
|
+
"minimum": 0,
|
|
223
|
+
"description": "匹配前后各展示几行(覆盖 -A/-B)"
|
|
224
|
+
},
|
|
225
|
+
"head_limit": {
|
|
226
|
+
"type": "integer",
|
|
227
|
+
"exclusiveMinimum": true,
|
|
228
|
+
"minimum": 0,
|
|
229
|
+
"description": "输出最多保留前 N 行(防止结果过大)"
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"required": [
|
|
233
|
+
"pattern"
|
|
234
|
+
],
|
|
235
|
+
"additionalProperties": false
|
|
236
|
+
},
|
|
237
|
+
"isReadOnly": true,
|
|
238
|
+
"isConcurrencySafe": true
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"name": "WebSearch",
|
|
242
|
+
"description": "- Searches the public web via the Tavily Search API and returns structured results.\n- Use this when you need up-to-date information that is not in your training data, or when the user asks for recent news / docs / API references.\n- Returns the top N results, each with a title, URL, and content snippet. With `search_depth: \"advanced\"` Tavily also returns a synthesized answer at the top.\n- Prefer specific natural-language queries over keyword soup (e.g. \"how does Bun handle .env files in version 1.1\").\n- Requires the TAVILY_API_KEY environment variable to be set; if missing the tool returns a friendly error.",
|
|
243
|
+
"parameters": {
|
|
244
|
+
"type": "object",
|
|
245
|
+
"properties": {
|
|
246
|
+
"query": {
|
|
247
|
+
"type": "string",
|
|
248
|
+
"minLength": 1,
|
|
249
|
+
"maxLength": 400,
|
|
250
|
+
"description": "搜索关键词,建议自然语言描述需要查的信息"
|
|
251
|
+
},
|
|
252
|
+
"max_results": {
|
|
253
|
+
"type": "integer",
|
|
254
|
+
"minimum": 1,
|
|
255
|
+
"maximum": 20,
|
|
256
|
+
"description": "返回结果数量,1-20,默认 5"
|
|
257
|
+
},
|
|
258
|
+
"search_depth": {
|
|
259
|
+
"type": "string",
|
|
260
|
+
"enum": [
|
|
261
|
+
"basic",
|
|
262
|
+
"advanced"
|
|
263
|
+
],
|
|
264
|
+
"description": "basic 快但浅;advanced 慢但深(含 answer 摘要),默认 basic"
|
|
265
|
+
},
|
|
266
|
+
"topic": {
|
|
267
|
+
"type": "string",
|
|
268
|
+
"enum": [
|
|
269
|
+
"general",
|
|
270
|
+
"news"
|
|
271
|
+
],
|
|
272
|
+
"description": "general=通用网页;news=偏新闻源;默认 general"
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
"required": [
|
|
276
|
+
"query"
|
|
277
|
+
],
|
|
278
|
+
"additionalProperties": false
|
|
279
|
+
},
|
|
280
|
+
"isReadOnly": true,
|
|
281
|
+
"isConcurrencySafe": true
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"name": "WebFetch",
|
|
285
|
+
"description": "- Fetches content from a specified URL and processes it using an AI model.\n- Takes a URL and a prompt as input.\n- Fetches the URL content, converts HTML to markdown.\n- Processes the content with the prompt (e.g., extract summary, find specific info).\n- Returns the processed result.\n- HTTP URLs are automatically upgraded to HTTPS.\n- When a URL redirects to a different host, returns a warning with the redirect URL.\n- This tool is read-only and does not modify any files.\n- Results may be summarized if the content is very large.\n- ⚠️ IMPORTANT: This tool WILL FAIL for authenticated or private URLs.\n Before using this tool, check if the URL points to an authenticated service\n (e.g. Google Docs, Confluence, Jira, GitHub private repos). If so, look for\n a specialized MCP tool that provides authenticated access.\n- 💡 For GitHub URLs (repos, issues, PRs), prefer using the `gh` CLI via Bash\n instead (e.g. `gh pr view <pr-number>`, `gh issue view <number>`, `gh api <endpoint>`).\n- ⚡ If an MCP-provided web fetch tool is available, prefer using that tool instead,\n as it may have fewer restrictions and better performance.\n- 🔒 Domain preapproved list includes common documentation sites (MDN, TypeScript,\n React, Vue, Angular, Node.js, Bun, Rust, Go, Python, etc.). Other domains\n will work but results may be less reliable.\n- 📝 This tool includes a self-cleaning 15-minute cache for faster repeated access\n to the same URL.\n- ⚠️ For PDF files, the tool will attempt to extract readable text but results may\n be limited. Binary images cannot be processed.",
|
|
286
|
+
"parameters": {
|
|
287
|
+
"type": "object",
|
|
288
|
+
"properties": {
|
|
289
|
+
"url": {
|
|
290
|
+
"type": "string",
|
|
291
|
+
"description": "要获取内容的 URL"
|
|
292
|
+
},
|
|
293
|
+
"prompt": {
|
|
294
|
+
"type": "string",
|
|
295
|
+
"description": "对内容进行处理的指令,描述你想从页面提取什么信息"
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
"required": [
|
|
299
|
+
"url",
|
|
300
|
+
"prompt"
|
|
301
|
+
],
|
|
302
|
+
"additionalProperties": false
|
|
303
|
+
},
|
|
304
|
+
"isReadOnly": true,
|
|
305
|
+
"isConcurrencySafe": true
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
"name": "WebBrowser",
|
|
309
|
+
"description": "Control a headless web browser. Navigate to URLs, take screenshots, and interact with web pages.\n\nWhen to use WebBrowser vs WebSearch:\n- WebSearch: When you need to find information or discover URLs through search\n- WebBrowser: When you need to interact with a specific web page (navigate, click, fill forms, get content, take screenshots)\n\nInput parameters:\n - action (required): The browser action. One of:\n - navigate: Go to a URL (requires url parameter)\n - screenshot: Take a screenshot of the current page\n - getContent: Extract text content from the current page\n - click: Click an element (requires selector parameter)\n - fill: Fill an input field (requires selector and value parameters)\n - submit: Submit a form (requires selector parameter)\n - url (optional): URL to navigate to (required for navigate action, must be a valid URL)\n - selector (optional): CSS selector for click/fill/submit actions\n - value (optional): Value to fill in input fields\n - timeout (optional): Timeout in milliseconds for actions (default: 30000)\n\nUsage notes:\n - The browser runs headless (no visible window)\n - Screenshots are saved to temporary files (/tmp/browser-*.png)\n - Content is truncated to 50000 characters max\n - Only one browser instance is maintained per session\n - Requires: npm install playwright-core && npx playwright install chromium\n\nExample actions:\n - Navigate and get content: { action: \"navigate\", url: \"https://example.com\" }\n - Take screenshot: { action: \"screenshot\" }\n - Click element: { action: \"click\", selector: \"#submit-btn\" }\n - Fill form field: { action: \"fill\", selector: \"input[name='email']\", value: \"user@example.com\" }",
|
|
310
|
+
"parameters": {
|
|
311
|
+
"type": "object",
|
|
312
|
+
"properties": {
|
|
313
|
+
"action": {
|
|
314
|
+
"type": "string",
|
|
315
|
+
"enum": [
|
|
316
|
+
"navigate",
|
|
317
|
+
"screenshot",
|
|
318
|
+
"getContent",
|
|
319
|
+
"click",
|
|
320
|
+
"fill",
|
|
321
|
+
"submit"
|
|
322
|
+
],
|
|
323
|
+
"description": "Browser action to perform"
|
|
324
|
+
},
|
|
325
|
+
"url": {
|
|
326
|
+
"type": "string",
|
|
327
|
+
"format": "uri",
|
|
328
|
+
"description": "URL to navigate to (required for navigate action)"
|
|
329
|
+
},
|
|
330
|
+
"selector": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"description": "CSS selector for click/fill/submit actions"
|
|
333
|
+
},
|
|
334
|
+
"value": {
|
|
335
|
+
"type": "string",
|
|
336
|
+
"description": "Value to fill in input fields"
|
|
337
|
+
},
|
|
338
|
+
"timeout": {
|
|
339
|
+
"type": "integer",
|
|
340
|
+
"exclusiveMinimum": true,
|
|
341
|
+
"minimum": 0,
|
|
342
|
+
"description": "Timeout in milliseconds (default: 30000)"
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
"required": [
|
|
346
|
+
"action"
|
|
347
|
+
],
|
|
348
|
+
"additionalProperties": false
|
|
349
|
+
},
|
|
350
|
+
"isReadOnly": false,
|
|
351
|
+
"isConcurrencySafe": false
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"name": "Bash",
|
|
355
|
+
"description": "Executes a given bash command and returns its output.\n\nThe working directory persists between commands, but shell state does not. The shell environment is initialized from the user's profile.\n\nIMPORTANT: Avoid using this tool to run `find`, `grep`, `cat`, `head`, `tail`, `sed`, `awk`, or `echo` commands, unless explicitly instructed or after you have verified that a dedicated tool cannot accomplish your task. Instead, use the appropriate dedicated tool as this will provide a much better experience for the user:\n\n - File search: Use Glob (NOT find or ls)\n - Content search: Use Grep (NOT grep or rg)\n - Read files: Use Read (NOT cat/head/tail)\n - Edit files: Use Edit (NOT sed/awk)\n - Write files: Use Write (NOT echo >/cat <<EOF)\n - Communication: Output text directly (NOT echo/printf)\nWhile the Bash tool can do similar things, it's better to use the built-in tools as they provide a better user experience and make it easier to review tool calls and give permission.\n\n# Instructions\n - If your command will create new directories or files, first use this tool to run `ls` to verify the parent directory exists and is the correct location.\n - Always quote file paths that contain spaces with double quotes in your command (e.g., cd \"path with spaces/file.txt\").\n - Try to maintain your current working directory throughout the session by using absolute paths and avoiding usage of `cd`. You may use `cd` if the User explicitly requests it.\n - You may specify an optional timeout in milliseconds (up to 600000ms / 10 minutes). By default, your command will timeout after 120000ms (2 minutes).\n - When issuing multiple commands:\n - If the commands are independent and can run in parallel, make multiple Bash tool calls in a single message.\n - If the commands depend on each other and must run sequentially, use a single Bash call with '&&' to chain them.\n - Use ';' only when you need to run commands sequentially but don't care if earlier commands fail.\n - DO NOT use newlines to separate commands (newlines are ok in quoted strings and here-strings).\n - For git commands:\n - Prefer to create a new commit rather than amending an existing commit.\n - Before running destructive operations (e.g., git reset --hard, git push --force, git checkout --), consider whether there is a safer alternative that achieves the same goal. Only use destructive operations when they are truly the best approach.\n - Never skip hooks (--no-verify) or bypass signing (--no-gpg-sign, -c commit.gpgsign=false) unless the user has explicitly asked for it. If a hook fails, investigate and fix the underlying issue.\n - Avoid unnecessary `sleep` commands; do not retry failing commands in a sleep loop — diagnose the root cause.\n\n# Exit code semantics\nSome commands return non-zero exit codes for informational (non-error) reasons. Bash recognizes these and reports them as success (ok=true) — do NOT retry just because exit code is 1:\n - `grep` / `rg` exit 1 → no match found (not an error)\n - `find` exit 1 → some directories inaccessible (non-fatal, partial results still returned)\n - `diff` / `cmp` exit 1 → files differ (informational, not an error)\n - `test` / `[` exit 1 → condition is false (the answer to a question, not a failure)\nOnly exit codes ≥ 2 from these commands indicate a real failure. For all other commands, non-zero exit codes are treated as failures normally.\n\n# Safety\nThe following command patterns are blocked at the tool level and will fail before execution (no need to try them):\n - `rm -rf /` and variants targeting root, $HOME, ~, or system directories (/etc, /usr, /bin, /Windows, /Users, /home, ...)\n - Filesystem destruction: `mkfs`, `format X:`, `dd of=/dev/sdX`, redirects to raw block devices\n - Power management: `shutdown`, `reboot`, `halt`, `poweroff`, `init 0/6`\n - Fork bombs\n - Pipe-to-shell from network: `curl ... | sh`, `wget ... | bash`, etc.\n - `chmod 777 /`, Windows full-disk `del /s` / `rmdir /s`, `diskpart`\n\nIf you have a legitimate use case that requires one of the above patterns, ask the user to run the command themselves in their terminal — do not try to bypass the check.\n\nSeparately, Bash scans for common destructive-but-recoverable patterns (`git reset --hard`, `git push -f` / `--force` / `--force-with-lease`, `git checkout .`, `git restore .`, `git clean -f`, `git stash drop/clear`, `git branch -D`, `git commit --amend` / `--no-verify`, `rm -rf <path>`, `DROP TABLE`, `TRUNCATE`, `DELETE FROM`, `kubectl delete`, `terraform destroy`, etc.) and prepends a `⚠️ 警告:` line to the output. These commands are NOT blocked — the warning is informational. Treat it as a signal to double-check intent and surface the warning to the user when relevant.",
|
|
356
|
+
"parameters": {
|
|
357
|
+
"type": "object",
|
|
358
|
+
"properties": {
|
|
359
|
+
"command": {
|
|
360
|
+
"type": "string",
|
|
361
|
+
"minLength": 1,
|
|
362
|
+
"description": "要执行的 shell 命令(假定 bash 语法)"
|
|
363
|
+
},
|
|
364
|
+
"timeout": {
|
|
365
|
+
"type": "integer",
|
|
366
|
+
"exclusiveMinimum": true,
|
|
367
|
+
"minimum": 0,
|
|
368
|
+
"maximum": 600000,
|
|
369
|
+
"description": "超时(毫秒),最多 600000(10 分钟);不填默认 120000"
|
|
370
|
+
},
|
|
371
|
+
"description": {
|
|
372
|
+
"type": "string",
|
|
373
|
+
"description": "用一句话主动语态描述命令做什么(5-10 词),如 \"List files in current directory\""
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
"required": [
|
|
377
|
+
"command"
|
|
378
|
+
],
|
|
379
|
+
"additionalProperties": false
|
|
380
|
+
},
|
|
381
|
+
"isReadOnly": false,
|
|
382
|
+
"isConcurrencySafe": false
|
|
383
|
+
}
|
|
384
|
+
],
|
|
385
|
+
"skills": [
|
|
386
|
+
{
|
|
387
|
+
"name": "algorithmic-art",
|
|
388
|
+
"description": "Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.",
|
|
389
|
+
"skillMdPreview": "\r\nAlgorithmic philosophies are computational aesthetic movements that are then expressed through code. Output .md files (philosophy), .html files (interactive viewer), and .js files (generative algorithms).\r\n\r\nThis happens in two steps:\r\n1. Algorithmic Philosophy Creation (.md file)\r\n2. Express by creating p5.js generative art (.html + .js files)\r\n\r\nFirst, undertake this task:\r\n\r\n## ALGORITHMIC PHILOSOPHY CREATION\r\n\r\nTo begin, create an ALGORITHMIC PHILOSOPHY (not static images or templates) tha"
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
"name": "batch",
|
|
393
|
+
"description": "当用户说\"批量处理\"、\"对每个文件...\"、\"批量修改\"、\"parallel\"、\"并行处理\"、\"每个组件都加日志\"时使用。将同一操作应用到多个文件或目录,支持并行执行+独立测试+自动提交。",
|
|
394
|
+
"skillMdPreview": "\r\n# /batch —— 批量任务执行\r\n\r\n## Quick Reference\r\n\r\n| 步骤 | 操作 |\r\n|------|------|\r\n| 1 | 用 Glob 工具找出所有目标文件 |\r\n| 2 | 确认文件列表(排除 node_modules/.git/dist) |\r\n| 3 | 对每个文件执行相同的修改操作(Read → Edit/Write) |\r\n| 4 | 每个文件修改后验证(Bash 测试 / Grep 确认) |\r\n| 5 | 可选:批量 git add + commit |\r\n\r\n## 执行策略\r\n\r\n### 串行模式(默认,安全)\r\n```\r\nfor file in [file_list]:\r\n Read(file) → Edit(file) → 验证\r\n```\r\n- 适合有依赖关系的修改\r\n- 出错时容易定位问题\r\n\r\n### 并行模式(快速,高风险)\r\n```\r\n同时处理 file_1, file_2, ..., file_N\r\n```\r\n- 适合无依赖关系的独立修改\r\n- 需要 ForkAgent 能力\r\n\r\n## 注意事项\r\n- 先用"
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"name": "canvas-design",
|
|
398
|
+
"description": "Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.",
|
|
399
|
+
"skillMdPreview": "\r\nThese are instructions for creating design philosophies - aesthetic movements that are then EXPRESSED VISUALLY. Output only .md files, .pdf files, and .png files.\r\n\r\nComplete this in two steps:\r\n1. Design Philosophy Creation (.md file)\r\n2. Express by creating it on a canvas (.pdf file or .png file)\r\n\r\nFirst, undertake this task:\r\n\r\n## DESIGN PHILOSOPHY CREATION\r\n\r\nTo begin, create a VISUAL PHILOSOPHY (not layouts or templates) that will be interpreted through:\r\n- Form, space, color, compositio"
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
"name": "commit",
|
|
403
|
+
"description": "当用户说\"提交\"、\"commit\"、\"git commit\"、\"保存改动\"、\"帮我提交代码\"、\"生成提交信息\"时使用。自动分析 git diff,生成规范的 Conventional Commit message,支持 feat/fix/docs/refactor/chore/style/test 等类型前缀。",
|
|
404
|
+
"skillMdPreview": "\r\n# /commit —— Git 提交规范化\r\n\r\n## Quick Reference\r\n\r\n| 步骤 | 操作 |\r\n|------|------|\r\n| 1 | 用 Bash 工具执行 `git status` 查看变更文件 |\r\n| 2 | 用 Bash 工具执行 `git diff --staged` 或 `git diff` 查看具体改动 |\r\n| 3 | 分析改动内容,推断 commit 类型(feat/fix/docs/refactor/chore/style/test) |\r\n| 4 | 生成符合 Conventional Commits 规范的 message:`<type>(<scope>): <subject>` |\r\n| 5 | 用 Bash 工具执行 `git commit -m \"<message>\"` |\r\n\r\n## Commit 类型指南\r\n\r\n- **feat**: 新功能\r\n- **fix**: 修复 bug\r\n- **docs**: 文档变更\r\n- **refactor**: 重构(不修复 bug、不添加功能)\r\n- **style**: 代"
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"name": "compact",
|
|
408
|
+
"description": "当用户说\"压缩\"、\"清理上下文\"、\"对话太长了\"、\"慢了\"、\"token 快满了\"、\"compact\"时使用。立即触发 autocompact,释放 context window 空间,让后续对话更流畅。",
|
|
409
|
+
"skillMdPreview": "\r\n# /compact —— 手动上下文压缩\r\n\r\n## Quick Reference\r\n\r\n| 步骤 | 操作 |\r\n|------|------|\r\n| 1 | 检查当前 token 使用量(StatusLine 显示) |\r\n| 2 | 触发 autocompact:将历史消息发给 LLM 生成摘要 |\r\n| 3 | 验证摘要质量:关键决策和代码变更是否保留 |\r\n| 4 | 压缩后继续对话(上下文大幅缩小) |\r\n\r\n## 触发时机建议\r\n- 对话超过 15 轮\r\n- StatusLine 显示 \"距压缩 < 5K tokens\"\r\n- 用户明确请求压缩\r\n- 切换到不相关的新任务前(释放旧任务占用的上下文)\r\n\r\n## 压缩后的效果\r\n- system prompt: 保留不变\r\n- 历史对话: 替换为结构化摘要(9 段式)\r\n- 最近 N 条消息: 原样保留(保证 tool_call/tool_result 配对完整)\r\n- 总 token 数: 通常减少 50-70%\r\n"
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
"name": "config",
|
|
413
|
+
"description": "配置向导技能。当用户输入 \"/config\" 且没有任何其他内容时触发。用于重新配置 LLM provider(BASE_URL / API_KEY / MODEL)。",
|
|
414
|
+
"skillMdPreview": "\n# Config Skill\n\n当用户**只输入 `/config`** 时(不带任何其他内容)触发,引导用户重新配置 LLM provider。\n\n使用 Read 读现有配置(如有),逐项询问用户新值(允许保留旧值),最后用 Write 工具写入 `~/.minimal-agent/config.json`,并提示用户重启 minimal-agent 使新配置生效。\n\n⚠️ 重要:本技能仅在用户**精确输入 `/config`**(前后无任何其他文字)时触发。如果用户的消息里包含其他内容(例如 \"/config 帮我看下\"、\"我想 /config 一下\"),不要触发,按普通对话回应。\n\n---\n\n## 执行步骤\n\n### Step 1: 读取现有配置\n\n调用 Read 工具:\n\n```\nRead({ file_path: \"~/.minimal-agent/config.json\" })\n```\n\n- 文件存在 → 解析 JSON,记住当前的 `baseURL` / `apiKey` / `model` / `provider` / `contextWindow` 字段\n- 文件不"
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
"name": "diff",
|
|
418
|
+
"description": "当用户问\"改了什么\"、\"有什么变化\"、\"show me changes\"、\"看看改动\"、\"diff\"、\"差异\"时使用。显示工作区或暂存区的变更内容,帮助用户理解当前代码状态。",
|
|
419
|
+
"skillMdPreview": "\r\n# /diff —— 查看 Git 变更\r\n\r\n## Quick Reference\r\n\r\n| 步骤 | 操作 |\r\n|------|------|\r\n| 1 | 用 Bash 工具执行 `git status` 查看变更概览 |\r\n| 2 | 用 Bash 工具执行 `git diff` 查看未暂存变更 |\r\n| 3 | 或用 Bash 工具执行 `git diff --staged` 查看已暂存变更 |\r\n| 4 | 如需单文件详情:`git diff -- <file_path>` |\r\n\r\n## 常用变体\r\n\r\n| 需求 | 命令 |\r\n|------|------|\r\n| 只看文件名(不改动内容) | `git diff --name-only` |\r\n| 看统计(增删行数) | `git diff --stat` |\r\n| 看某个文件的函数级变更 | `git diff -p -- <file> \\| grep -A5 \"func_name\"` |\r\n| 对比两次提交之间 | `git diff <commit_a> <commit_b>` |\r\n| 看暂存 vs 上次"
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
"name": "docx",
|
|
423
|
+
"description": "Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.",
|
|
424
|
+
"skillMdPreview": "\r\n# DOCX creation, editing, and analysis\r\n\r\n## Overview\r\n\r\nA .docx file is a ZIP archive containing XML files.\r\n\r\n## Quick Reference\r\n\r\n| Task | Approach |\r\n|------|----------|\r\n| Read/analyze content | `pandoc` or unpack for raw XML |\r\n| Create new document | Use `docx-js` - see Creating New Documents below |\r\n| Edit existing document | Unpack → edit XML → repack - see Editing Existing Documents below |\r\n\r\n### Converting .doc to .docx\r\n\r\nLegacy `.doc` files must be converted before editing:\r\n\r\n"
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"name": "frontend-design",
|
|
428
|
+
"description": "Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.",
|
|
429
|
+
"skillMdPreview": "\r\nThis skill guides creation of distinctive, production-grade frontend interfaces that avoid generic \"AI slop\" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.\r\n\r\nThe user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints.\r\n\r\n## Design Thinking\r\n\r\nBefore coding, understand the context and commit to a BOLD aesthetic direct"
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"name": "init",
|
|
433
|
+
"description": "项目初始化技能。当用户输入 \"/init\" 且没有任何其他内容时触发。用于分析当前项目结构并生成 minimal-agent.md 项目文档。",
|
|
434
|
+
"skillMdPreview": "\r\n# Init Skill\r\n\r\n当用户输入 `/init` 时触发,执行以下任务:\r\n\r\n1. 分析项目目录结构\r\n2. 识别技术栈和框架\r\n3. 提取关键配置文件和入口点\r\n4. 深入理解核心模块的运作机制\r\n5. 生成或更新 `minimal-agent.md` 项目文档\r\n\r\n---\r\n\r\n## 执行步骤\r\n\r\n### Step 1: 分析项目结构\r\n\r\n使用 Glob 扫描项目,识别:\r\n- 源码目录结构(src/、lib/、app/ 等)\r\n- 配置文件\r\n- 根目录的文档文件\r\n- 测试文件位置\r\n\r\n扫描策略:\r\n- 根据语言类型选择对应的源码目录(TS/JS 用 src/,Python 用 lib/ 或直接是 .py 文件)\r\n- 根据语言类型识别配置文件(TS 用 tsconfig.json,Python 用 pyproject.toml 或 requirements.txt)\r\n\r\n### Step 2: 识别技术栈\r\n\r\n读取项目根目录的配置文件(根据语言类型选择):\r\n- `package.json` → Node.js/Bun 项目\r\n- `pyproje"
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
"name": "mcp-builder",
|
|
438
|
+
"description": "Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).",
|
|
439
|
+
"skillMdPreview": "\r\n# MCP Server Development Guide\r\n\r\n## Overview\r\n\r\nCreate MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. The quality of an MCP server is measured by how well it enables LLMs to accomplish real-world tasks.\r\n\r\n---\r\n\r\n# Process\r\n\r\n## 🚀 High-Level Workflow\r\n\r\nCreating a high-quality MCP server involves four main phases:\r\n\r\n### Phase 1: Deep Research and Planning\r\n\r\n#### 1.1 Understand Modern MCP Design\r\n\r\n**API Coverage vs. Wor"
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
"name": "pdf",
|
|
443
|
+
"description": "Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",
|
|
444
|
+
"skillMdPreview": "\r\n# PDF Processing Guide\r\n\r\n## Overview\r\n\r\nThis guide covers essential PDF processing operations using Python libraries and command-line tools. For advanced features, JavaScript libraries, and detailed examples, see REFERENCE.md. If you need to fill out a PDF form, read FORMS.md and follow its instructions.\r\n\r\n## Quick Start\r\n\r\n```python\r\nfrom pypdf import PdfReader, PdfWriter\r\n\r\n# Read a PDF\r\nreader = PdfReader(\"document.pdf\")\r\nprint(f\"Pages: {len(reader.pages)}\")\r\n\r\n# Extract text\r\ntext = \"\"\r\n"
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
"name": "pptx",
|
|
448
|
+
"description": "Use this skill any time a .pptx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions \\\"deck,\\\" \\\"slides,\\\" \\\"presentation,\\\" or references a .pptx filename, regardless of what they plan to do with the content afterward. If a .pptx file needs to be opened, created, or touched, use this skill.",
|
|
449
|
+
"skillMdPreview": "\r\n# PPTX Skill\r\n\r\n## Quick Reference\r\n\r\n| Task | Guide |\r\n|------|-------|\r\n| Read/analyze content | `python -m markitdown presentation.pptx` |\r\n| Edit or create from template | Read [editing.md](editing.md) |\r\n| Create from scratch | Read [pptxgenjs.md](pptxgenjs.md) |\r\n\r\n---\r\n\r\n## Reading Content\r\n\r\n```bash\r\n# Text extraction\r\npython -m markitdown presentation.pptx\r\n\r\n# Visual overview\r\npython scripts/thumbnail.py presentation.pptx\r\n\r\n# Raw XML\r\npython scripts/office/unpack.py presentation.ppt"
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"name": "simplify",
|
|
453
|
+
"description": "当用户说\"简化\"、\"审查\"、\"review\"、\"优化这段代码\"、\"太复杂了\"、\"能不能更简洁\"、\"代码质量\"时使用。启动多维度代码审查,识别冗余、反模式、性能问题,给出具体修改建议。",
|
|
454
|
+
"skillMdPreview": "\r\n# /simplify —— 代码审查与简化\r\n\r\n## Quick Reference\r\n\r\n| 步骤 | 操作 |\r\n|------|------|\r\n| 1 | 用 Read 工具读取目标文件(或用户指定的代码段) |\r\n| 2 | 从三个维度分析:可读性、正确性、效率 |\r\n| 3 | 输出结构化审查报告:问题列表 + 每个问题的修复建议 |\r\n\r\n## 审查维度\r\n\r\n### 1. 可读性(Readability)\r\n- 命名是否清晰表达意图?\r\n- 函数/方法是否过长(>30 行)?\r\n- 嵌套层级是否过深(>3 层)?\r\n- 是否有重复逻辑可以提取?\r\n- 注释是否必要且准确?\r\n\r\n### 2. 正确性(Correctness)\r\n- 边界条件处理(空值、零、负数)?\r\n- 异步操作是否有正确的错误处理?\r\n- 类型安全(TypeScript 严格模式)?\r\n- 是否有潜在的竞态条件?\r\n\r\n### 3. 效率(Efficiency)\r\n- 不必要的循环或重复计算?\r\n- 可以用更高效的数据结构替代?\r\n- I/O 操作是否可以批量合并?\r\n- 内存使用是否合理(大"
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
"name": "skill-creator",
|
|
458
|
+
"description": "Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.",
|
|
459
|
+
"skillMdPreview": "\r\n# Skill Creator\r\n\r\nA skill for creating new skills and iteratively improving them.\r\n\r\nAt a high level, the process of creating a skill goes like this:\r\n\r\n- Decide what you want the skill to do and roughly how it should do it\r\n- Write a draft of the skill\r\n- Create a few test prompts and run claude-with-access-to-the-skill on them\r\n- Help the user evaluate the results both qualitatively and quantitatively\r\n - While the runs happen in the background, draft some quantitative evals if there aren'"
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
"name": "theme-factory",
|
|
463
|
+
"description": "Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.",
|
|
464
|
+
"skillMdPreview": "\r\n\r\n# Theme Factory Skill\r\n\r\nThis skill provides a curated collection of professional font and color themes themes, each with carefully selected color palettes and font pairings. Once a theme is chosen, it can be applied to any artifact.\r\n\r\n## Purpose\r\n\r\nTo apply consistent, professional styling to presentation slide decks, use this skill. Each theme includes:\r\n- A cohesive color palette with hex codes\r\n- Complementary font pairings for headers and body text\r\n- A distinct visual identity suitabl"
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
"name": "web-artifacts-builder",
|
|
468
|
+
"description": "Suite of tools for creating elaborate, multi-component web artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts. Trigger when user asks to build a web app, React component, interactive UI, landing page, dashboard, or any frontend project.",
|
|
469
|
+
"skillMdPreview": "\r\n# Web Artifacts Builder\r\n\r\nTo build powerful frontend web artifacts, follow these steps:\r\n1. Initialize the frontend repo using `scripts/init-artifact.sh`\r\n2. Develop your artifact by editing the generated code\r\n3. Bundle all code into a single HTML file using `scripts/bundle-artifact.sh`\r\n4. Save the bundle (use Write tool to write `bundle.html` to disk)\r\n5. (Optional) Test the artifact locally in browser\r\n\r\n**Stack**: React 18 + TypeScript + Vite + Parcel (bundling) + Tailwind CSS + shadcn/u"
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
"name": "webapp-testing",
|
|
473
|
+
"description": "Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.",
|
|
474
|
+
"skillMdPreview": "\r\n# Web Application Testing\r\n\r\nTo test local web applications, write native Python Playwright scripts.\r\n\r\n**Helper Scripts Available**:\r\n- `scripts/with_server.py` - Manages server lifecycle (supports multiple servers)\r\n\r\n**Always run scripts with `--help` first** to see usage. DO NOT read the source until you try running the script first and find that a customized solution is abslutely necessary. These scripts can be very large and thus pollute your context window. They exist to be called direc"
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"name": "xlsx",
|
|
478
|
+
"description": "Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \\\"the xlsx in my downloads\\\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.",
|
|
479
|
+
"skillMdPreview": "\r\n# Requirements for Outputs\r\n\r\n## All Excel files\r\n\r\n### Professional Font\r\n- Use a consistent, professional font (e.g., Arial, Times New Roman) for all deliverables unless otherwise instructed by the user\r\n\r\n### Zero Formula Errors\r\n- Every Excel model MUST be delivered with ZERO formula errors (#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)\r\n\r\n### Preserve Existing Templates (when updating templates)\r\n- Study and EXACTLY match existing format, style, and conventions when modifying files\r\n- Never impo"
|
|
480
|
+
}
|
|
481
|
+
]
|
|
482
|
+
}
|