diff --git a/plugins/cjysa-documents/.codex-plugin/plugin.json b/plugins/cjysa-documents/.codex-plugin/plugin.json
index 2eae077..9089c16 100644
--- a/plugins/cjysa-documents/.codex-plugin/plugin.json
+++ b/plugins/cjysa-documents/.codex-plugin/plugin.json
@@ -20,6 +20,8 @@
"capabilities": ["Interactive", "Read", "Write"],
"websiteURL": "https://git.cjysa.top/CJYSA/codex-free-market",
"brandColor": "#2563EB",
+ "composerIcon": "./assets/icon.png",
+ "logo": "./assets/logo.png",
"defaultPrompt": [
"把这份内容整理成一份专业的 Word 文档。",
"在保留格式的前提下修改这个 DOCX。",
diff --git a/plugins/cjysa-documents/assets/icon.png b/plugins/cjysa-documents/assets/icon.png
new file mode 100644
index 0000000..10f8386
Binary files /dev/null and b/plugins/cjysa-documents/assets/icon.png differ
diff --git a/plugins/cjysa-documents/assets/icon.svg b/plugins/cjysa-documents/assets/icon.svg
new file mode 100644
index 0000000..35d54bd
--- /dev/null
+++ b/plugins/cjysa-documents/assets/icon.svg
@@ -0,0 +1,6 @@
+
diff --git a/plugins/cjysa-documents/assets/logo.png b/plugins/cjysa-documents/assets/logo.png
new file mode 100644
index 0000000..10f8386
Binary files /dev/null and b/plugins/cjysa-documents/assets/logo.png differ
diff --git a/plugins/cjysa-pdf/.codex-plugin/plugin.json b/plugins/cjysa-pdf/.codex-plugin/plugin.json
index 2046564..fbc3944 100644
--- a/plugins/cjysa-pdf/.codex-plugin/plugin.json
+++ b/plugins/cjysa-pdf/.codex-plugin/plugin.json
@@ -20,6 +20,8 @@
"capabilities": ["Interactive", "Read", "Write"],
"websiteURL": "https://git.cjysa.top/CJYSA/codex-free-market",
"brandColor": "#DC2626",
+ "composerIcon": "./assets/icon.png",
+ "logo": "./assets/logo.png",
"defaultPrompt": [
"提取并总结这个 PDF 的内容。",
"把这些 PDF 合并并检查页面是否正常。",
diff --git a/plugins/cjysa-pdf/assets/icon.png b/plugins/cjysa-pdf/assets/icon.png
new file mode 100644
index 0000000..68696f8
Binary files /dev/null and b/plugins/cjysa-pdf/assets/icon.png differ
diff --git a/plugins/cjysa-pdf/assets/icon.svg b/plugins/cjysa-pdf/assets/icon.svg
new file mode 100644
index 0000000..6da3c78
--- /dev/null
+++ b/plugins/cjysa-pdf/assets/icon.svg
@@ -0,0 +1,7 @@
+
diff --git a/plugins/cjysa-pdf/assets/logo.png b/plugins/cjysa-pdf/assets/logo.png
new file mode 100644
index 0000000..68696f8
Binary files /dev/null and b/plugins/cjysa-pdf/assets/logo.png differ
diff --git a/plugins/cjysa-presentations/.codex-plugin/plugin.json b/plugins/cjysa-presentations/.codex-plugin/plugin.json
index 0569ad4..4eebdcc 100644
--- a/plugins/cjysa-presentations/.codex-plugin/plugin.json
+++ b/plugins/cjysa-presentations/.codex-plugin/plugin.json
@@ -20,6 +20,8 @@
"capabilities": ["Interactive", "Read", "Write"],
"websiteURL": "https://git.cjysa.top/CJYSA/codex-free-market",
"brandColor": "#C43E1C",
+ "composerIcon": "./assets/icon.png",
+ "logo": "./assets/logo.png",
"defaultPrompt": [
"根据这份材料制作一套结构清晰的 PPT。",
"保留模板风格并修改这个演示文稿。",
diff --git a/plugins/cjysa-presentations/assets/icon.png b/plugins/cjysa-presentations/assets/icon.png
new file mode 100644
index 0000000..6fbd6e3
Binary files /dev/null and b/plugins/cjysa-presentations/assets/icon.png differ
diff --git a/plugins/cjysa-presentations/assets/icon.svg b/plugins/cjysa-presentations/assets/icon.svg
new file mode 100644
index 0000000..9c20184
--- /dev/null
+++ b/plugins/cjysa-presentations/assets/icon.svg
@@ -0,0 +1,7 @@
+
diff --git a/plugins/cjysa-presentations/assets/logo.png b/plugins/cjysa-presentations/assets/logo.png
new file mode 100644
index 0000000..6fbd6e3
Binary files /dev/null and b/plugins/cjysa-presentations/assets/logo.png differ
diff --git a/plugins/cjysa-spreadsheets/.codex-plugin/plugin.json b/plugins/cjysa-spreadsheets/.codex-plugin/plugin.json
index 77f29d9..a0c9b73 100644
--- a/plugins/cjysa-spreadsheets/.codex-plugin/plugin.json
+++ b/plugins/cjysa-spreadsheets/.codex-plugin/plugin.json
@@ -20,6 +20,8 @@
"capabilities": ["Interactive", "Read", "Write"],
"websiteURL": "https://git.cjysa.top/CJYSA/codex-free-market",
"brandColor": "#107C41",
+ "composerIcon": "./assets/icon.png",
+ "logo": "./assets/logo.png",
"defaultPrompt": [
"把这份 CSV 整理成带公式和格式的 Excel。",
"分析这个工作簿并解释关键指标。",
diff --git a/plugins/cjysa-spreadsheets/assets/icon.png b/plugins/cjysa-spreadsheets/assets/icon.png
new file mode 100644
index 0000000..9c86914
Binary files /dev/null and b/plugins/cjysa-spreadsheets/assets/icon.png differ
diff --git a/plugins/cjysa-spreadsheets/assets/icon.svg b/plugins/cjysa-spreadsheets/assets/icon.svg
new file mode 100644
index 0000000..c725808
--- /dev/null
+++ b/plugins/cjysa-spreadsheets/assets/icon.svg
@@ -0,0 +1,7 @@
+
diff --git a/plugins/cjysa-spreadsheets/assets/logo.png b/plugins/cjysa-spreadsheets/assets/logo.png
new file mode 100644
index 0000000..9c86914
Binary files /dev/null and b/plugins/cjysa-spreadsheets/assets/logo.png differ
diff --git a/tools/render_plugin_icons.py b/tools/render_plugin_icons.py
new file mode 100644
index 0000000..fc40bf0
--- /dev/null
+++ b/tools/render_plugin_icons.py
@@ -0,0 +1,80 @@
+from pathlib import Path
+
+from PIL import Image, ImageDraw
+
+
+ROOT = Path(__file__).resolve().parents[1]
+SIZE = 512
+
+
+def rounded(draw, box, radius, fill):
+ draw.rounded_rectangle(box, radius=radius, fill=fill)
+
+
+def document(path, color):
+ image = Image.new("RGBA", (SIZE, SIZE), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(image)
+ rounded(draw, (0, 0, 511, 511), 112, color)
+ draw.polygon([(146, 92), (312, 92), (366, 146), (366, 420), (146, 420)], fill="white")
+ draw.polygon([(312, 92), (312, 162), (366, 162)], fill="#BFDBFE")
+ for y, width in [(232, 144), (286, 144), (340, 102)]:
+ draw.line((184, y, 184 + width, y), fill=color, width=24)
+ image.save(path)
+
+
+def pdf(path, color):
+ image = Image.new("RGBA", (SIZE, SIZE), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(image)
+ rounded(draw, (0, 0, 511, 511), 112, color)
+ draw.polygon([(146, 92), (312, 92), (366, 146), (366, 420), (146, 420)], fill="white")
+ draw.polygon([(312, 92), (312, 162), (366, 162)], fill="#FECACA")
+ draw.arc((180, 198, 318, 338), 205, 345, fill=color, width=22)
+ draw.line((184, 350, 328, 350), fill=color, width=22)
+ image.save(path)
+
+
+def spreadsheet(path, color):
+ image = Image.new("RGBA", (SIZE, SIZE), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(image)
+ rounded(draw, (0, 0, 511, 511), 112, color)
+ rounded(draw, (112, 106, 400, 406), 20, "white")
+ draw.rectangle((144, 164, 368, 362), fill="#DCFCE7")
+ for y in (230, 296):
+ draw.line((144, y, 368, y), fill=color, width=18)
+ for x in (218, 292):
+ draw.line((x, 164, x, 362), fill=color, width=18)
+ draw.line((144, 132, 368, 132), fill="#86EFAC", width=26)
+ image.save(path)
+
+
+def presentation(path, color):
+ image = Image.new("RGBA", (SIZE, SIZE), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(image)
+ rounded(draw, (0, 0, 511, 511), 112, color)
+ rounded(draw, (104, 114, 408, 340), 18, "white")
+ draw.line((256, 340, 256, 398), fill="white", width=24)
+ draw.line((188, 398, 324, 398), fill="white", width=24)
+ draw.rectangle((154, 230, 202, 292), fill="#FED7AA", outline=color, width=12)
+ draw.rectangle((232, 180, 280, 292), fill="#FED7AA", outline=color, width=12)
+ draw.rectangle((310, 204, 358, 292), fill="#FED7AA", outline=color, width=12)
+ draw.line((138, 340, 374, 340), fill="#FED7AA", width=14)
+ image.save(path)
+
+
+def main():
+ assets = {
+ "cjysa-documents": (document, "#2563EB"),
+ "cjysa-pdf": (pdf, "#DC2626"),
+ "cjysa-spreadsheets": (spreadsheet, "#107C41"),
+ "cjysa-presentations": (presentation, "#C43E1C"),
+ }
+ for plugin, (builder, color) in assets.items():
+ target = ROOT / "plugins" / plugin / "assets"
+ target.mkdir(parents=True, exist_ok=True)
+ builder(target / "icon.png", color)
+ builder(target / "logo.png", color)
+ print(target / "icon.png")
+
+
+if __name__ == "__main__":
+ main()