myagent-ai 1.10.3 → 1.10.5
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/agents/main_agent.py +65 -18
- package/main.py +3 -3
- package/package.json +1 -1
- package/requirements.txt +6 -4
- package/skills/VLM/SKILL.md +34 -1
- package/skills/agent-browser/SKILL.md +0 -1
- package/skills/ai-news-collectors/SKILL.md +2 -2
- package/skills/auto-target-tracker/SKILL.md +6 -7
- package/skills/browser_skill.py +3 -2
- package/skills/coding-agent/SKILL.md +1 -2
- package/skills/contentanalysis/ExtractWisdom/SKILL.md +2 -5
- package/skills/docx/references/docx-js-advanced.md +1 -1
- package/skills/gui_skill.py +31 -56
- package/skills/market-research-reports/scripts/generate_market_visuals.py +1 -1
- package/skills/marketing-mode/SKILL.md +0 -16
- package/skills/marketing-mode/skill.json +1 -32
- package/skills/pdf/briefs/report.md +1 -1
- package/skills/podcast-generate/generate.ts +1 -1
- package/skills/ppt/SKILL.md +1 -1
- package/skills/ppt/ooxml/scripts/unpack.py +16 -32
- package/skills/ppt/ooxml/scripts/validate.py +5 -6
- package/skills/ppt/ooxml/scripts/validation/base.py +5 -2
- package/skills/ppt/ooxml/scripts/validation/pptx.py +8 -2
- package/skills/ppt/ooxml/scripts/validation/redlining.py +20 -20
- package/skills/ppt/scripts/pdf.py +917 -4
- package/skills/search_skill.py +156 -55
- package/skills/seo-content-writer/SKILL.md +4 -40
- package/skills/stock-analysis-skill/src/watchlist.ts +21 -5
- package/skills/web-shader-extractor/SKILL.md +1 -1
- package/skills/writing-plans/SKILL.md +1 -4
- package/web/__pycache__/api_server.cpython-312.pyc +0 -0
- package/web/api_server.py +18 -11
- package/web/ui/chat/chat.css +124 -5
- package/web/ui/chat/chat_main.js +66 -4
- package/web/ui/chat/flow_engine.js +186 -39
- package/skills/blog-writer/2024-02-17-radical-transparency-sales.md +0 -35
- package/skills/blog-writer/2024-02-17-raycast-spotlight-superpowers.md +0 -33
- package/skills/blog-writer/2024-02-17-short-form-content-marketing.md +0 -47
- package/skills/blog-writer/2024-02-17-typing-speed-benefits.md +0 -33
- package/skills/blog-writer/2024-03-14-effective-ai-prompts.md +0 -55
- package/skills/blog-writer/2024-11-08-ai-revolutionizing-entry-level-sales.md +0 -43
- package/skills/blog-writer/2025-11-12-why-ai-art-is-useless.md +0 -49
- package/skills/blog-writer/README.md +0 -2
- package/skills/blog-writer/SKILL.md +0 -158
- package/skills/blog-writer/_meta.json +0 -6
- package/skills/blog-writer/manage_examples.py +0 -90
- package/skills/blog-writer/style-guide.md +0 -160
- package/skills/content-strategy/SKILL.md +0 -181
- package/skills/content-strategy/_meta.json +0 -6
- package/skills/dream-interpreter/SKILL.md +0 -88
- package/skills/dream-interpreter/assets/example_asset.txt +0 -24
- package/skills/dream-interpreter/references/api_reference.md +0 -34
- package/skills/dream-interpreter/references/interpretation-guide.md +0 -83
- package/skills/dream-interpreter/references/output-schema.md +0 -65
- package/skills/dream-interpreter/references/questioning-strategy.md +0 -62
- package/skills/dream-interpreter/references/visual-mapping.md +0 -81
- package/skills/dream-interpreter/scripts/example.py +0 -19
- package/skills/dream-interpreter/skill.json +0 -7
- package/skills/example-skill/SKILL.md +0 -33
- package/skills/example-skill/run.sh +0 -11
- package/skills/fullstack-dev/SKILL.md +0 -205
- package/skills/get-fortune-analysis/SKILL.md +0 -370
- package/skills/get-fortune-analysis/lunar_python.py +0 -91
- package/skills/image-understand/LICENSE.txt +0 -21
- package/skills/image-understand/SKILL.md +0 -855
- package/skills/image-understand/scripts/image-understand.ts +0 -41
- package/skills/interview-designer/README.md +0 -70
- package/skills/interview-designer/SKILL.md +0 -53
- package/skills/interview-designer/_meta.json +0 -6
- package/skills/interview-designer/references/design_rationale.md +0 -43
- package/skills/interview-designer/templates/interview_guide_template.md +0 -62
- package/skills/mindfulness-meditation/SKILL.md +0 -65
- package/skills/mindfulness-meditation/_meta.json +0 -6
- package/skills/multi-search-engine/CHANGELOG.md +0 -15
- package/skills/multi-search-engine/CHANNELLOG.md +0 -48
- package/skills/multi-search-engine/SKILL.md +0 -78
- package/skills/multi-search-engine/_meta.json +0 -6
- package/skills/multi-search-engine/config.json +0 -14
- package/skills/multi-search-engine/metadata.json +0 -7
- package/skills/multi-search-engine/references/international-search.md +0 -651
- package/skills/skill-finder-cn/SKILL.md +0 -66
- package/skills/skill-finder-cn/_meta.json +0 -6
- package/skills/skill-finder-cn/package.json +0 -5
- package/skills/skill-finder-cn/scripts/search.sh +0 -15
- package/skills/skill-vetter/SKILL.md +0 -137
- package/skills/ui-ux-pro-max/data/charts.csv +0 -26
- package/skills/ui-ux-pro-max/data/colors.csv +0 -97
- package/skills/ui-ux-pro-max/data/icons.csv +0 -101
- package/skills/ui-ux-pro-max/data/landing.csv +0 -31
- package/skills/ui-ux-pro-max/data/products.csv +0 -97
- package/skills/ui-ux-pro-max/data/react-performance.csv +0 -45
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +0 -54
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -51
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
- package/skills/ui-ux-pro-max/data/stacks/react.csv +0 -54
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +0 -50
- package/skills/ui-ux-pro-max/data/styles.csv +0 -68
- package/skills/ui-ux-pro-max/data/typography.csv +0 -58
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
- package/skills/ui-ux-pro-max/data/web-interface.csv +0 -31
- package/skills/video-understand/LICENSE.txt +0 -21
- package/skills/video-understand/SKILL.md +0 -916
- package/skills/video-understand/scripts/video-understand.ts +0 -41
- package/skills/visual-design-foundations/SKILL.md +0 -318
- package/skills/visual-design-foundations/references/color-systems.md +0 -417
- package/skills/visual-design-foundations/references/spacing-iconography.md +0 -425
- package/skills/visual-design-foundations/references/typography-systems.md +0 -432
- /package/skills/TTS/{tts.ts → scripts/tts.ts} +0 -0
package/agents/main_agent.py
CHANGED
|
@@ -46,9 +46,7 @@ class MainAgent(BaseAgent):
|
|
|
46
46
|
<task_plan>如"context"包含非空"task_plan",则更新它,变为当前输出。否则,根据"context", 以MD 的格式,制定新任务列表。</task_plan>
|
|
47
47
|
|
|
48
48
|
<toolstocal>
|
|
49
|
-
<tool><beforecalltext
|
|
50
|
-
|
|
51
|
-
<tool><beforecalltext>连接词,介绍调用什么工具,达到什么目的。示例:接下来,要调用命令行工具,获得ip地址。</beforecalltext><toolname>工具名</toolname><parms>参数</parms><timeout>预估超时时限</timeout><callback>true/false</callback></tool>
|
|
49
|
+
<tool><beforecalltext>连接词,介绍调用什么工具,达到什么目的。</beforecalltext><toolname>工具名</toolname><parms>JSON格式的参数对象,例如: {"query": "搜索关键词", "num": 5}</parms><timeout>预估超时时限(秒)</timeout><callback>true/false,要求解析器在该工具执行完后是否要回调llm大模型,将所有工具输出结果+新构造的"context"输入给llm</callback></tool>
|
|
52
50
|
</toolstocal>
|
|
53
51
|
<remember>仅从最新用户输入(userprint 或 usersays_correct)中提炼值得长期记忆的信息(如用户偏好、重要结论、错误经验等)。不要从历史对话中重复提炼旧记忆。如果本轮用户输入没有新信息需要记忆,则为空。</remember>
|
|
54
52
|
<recall>下一轮执行需要调取的记忆,这里要设计接上记忆库</recall>
|
|
@@ -64,15 +62,23 @@ class MainAgent(BaseAgent):
|
|
|
64
62
|
3. <usersays_correct>: 如果 context 中 usersays 非空,则根据对话语境优化为更准确的用户意图表达
|
|
65
63
|
4. <task_plan>: 使用 Markdown 列表格式,每项包含任务描述和完成状态标记 [x]/[ ]
|
|
66
64
|
5. <toolstocal>: 列出所有需要执行的工具调用,每个工具包含完整的参数说明
|
|
67
|
-
6. <
|
|
68
|
-
7. <
|
|
69
|
-
8. <
|
|
70
|
-
9. <
|
|
71
|
-
10. <
|
|
72
|
-
11. <
|
|
73
|
-
12. <
|
|
74
|
-
13.
|
|
75
|
-
14.
|
|
65
|
+
6. <parms>: **必须使用严格合法的JSON格式**,例如 {"query": "关键词", "num": 10},不要使用其他格式
|
|
66
|
+
7. <timeout>: 预估超时秒数(简单操作10-30s,文件操作30-60s,网络请求60-120s,数据处理120-300s)
|
|
67
|
+
8. <callback>: 如果该工具的执行结果对后续决策有影响,设为 true;否则设为 false
|
|
68
|
+
9. <remember>: 仅从最新用户输入(userprint 或 usersays_correct)中提炼值得长期记忆的关键信息,不要重复提炼历史对话中已有的记忆。如果本轮没有新信息需要记忆,则为空
|
|
69
|
+
10. <recall>: 描述下一轮执行时需要从记忆库中检索的内容关键词
|
|
70
|
+
11. <get_knowledge>: 如果当前 <knowledge> 内容不足以完成任务,填写需要从知识库搜索的关键词;否则为空
|
|
71
|
+
12. <askuser>: 当信息不足需要用户补充时,在此填写要问的问题
|
|
72
|
+
13. <finish>: 当任务已完成或需要等待用户回应时为 true;否则为 false 继续执行
|
|
73
|
+
14. 使用中文输出所有内容
|
|
74
|
+
|
|
75
|
+
## 工具选择指南
|
|
76
|
+
- **搜索信息**: 用 `web_search`(返回标题+URL+摘要),不要用 browser_open
|
|
77
|
+
- **读取网页内容**: 用 `web_read`(传入URL,提取正文)
|
|
78
|
+
- **浏览器交互**(填表、点击、截图等): 才使用 browser_open / browser_click 等
|
|
79
|
+
- **执行代码**: 用 `code` 工具(language: python/javascript/shell)
|
|
80
|
+
- **执行命令**: 用 `command` 或 `command_run` 工具
|
|
81
|
+
- **文件操作**: 用 `file_read` / `file_write` / `file_list` 等文件工具
|
|
76
82
|
"""
|
|
77
83
|
|
|
78
84
|
def __init__(self, tool_agent=None, memory_agent=None, **kwargs):
|
|
@@ -414,7 +420,7 @@ class MainAgent(BaseAgent):
|
|
|
414
420
|
if all_tool_outputs:
|
|
415
421
|
messages.append(Message(
|
|
416
422
|
role="user",
|
|
417
|
-
content=f"[上一轮工具执行结果汇总]\n{truncate_str(all_tool_outputs,
|
|
423
|
+
content=f"[上一轮工具执行结果汇总]\n{truncate_str(all_tool_outputs, 30000)}"
|
|
418
424
|
))
|
|
419
425
|
all_tool_outputs = ""
|
|
420
426
|
|
|
@@ -694,20 +700,59 @@ class MainAgent(BaseAgent):
|
|
|
694
700
|
|
|
695
701
|
# 发送工具结果事件
|
|
696
702
|
# 提取实际输出:SkillResult 有 output/message/data,ExecResult 有 stdout/stderr
|
|
703
|
+
def _format_data_for_llm(data):
|
|
704
|
+
"""将结构化 data 格式化为 LLM 可读的文本"""
|
|
705
|
+
if data is None:
|
|
706
|
+
return ""
|
|
707
|
+
if isinstance(data, str):
|
|
708
|
+
return data
|
|
709
|
+
if isinstance(data, dict):
|
|
710
|
+
# 搜索结果列表格式 (web_search)
|
|
711
|
+
results = data.get("results")
|
|
712
|
+
if isinstance(results, list):
|
|
713
|
+
lines = []
|
|
714
|
+
for i, r in enumerate(results, 1):
|
|
715
|
+
title = r.get("title", "")
|
|
716
|
+
url = r.get("url", "")
|
|
717
|
+
snippet = r.get("snippet", "")
|
|
718
|
+
lines.append(f"{i}. {title}\n URL: {url}\n {snippet}")
|
|
719
|
+
return "\n".join(lines)
|
|
720
|
+
# 网页内容格式 (web_read)
|
|
721
|
+
if "url" in data and "content" in data:
|
|
722
|
+
title = data.get("title", "")
|
|
723
|
+
content = data.get("content", "")
|
|
724
|
+
lines = [f"标题: {title}", f"URL: {data['url']}", f"内容:\n{content}"]
|
|
725
|
+
return "\n".join(lines)
|
|
726
|
+
# 通用 dict: key-value 格式
|
|
727
|
+
parts = []
|
|
728
|
+
for k, v in data.items():
|
|
729
|
+
if k == "results":
|
|
730
|
+
continue # 已在上面处理
|
|
731
|
+
parts.append(f"{k}: {v}")
|
|
732
|
+
return "\n".join(parts) if parts else str(data)
|
|
733
|
+
if isinstance(data, list):
|
|
734
|
+
return "\n".join(str(item) for item in data)
|
|
735
|
+
return str(data)
|
|
736
|
+
|
|
697
737
|
def _extract_tool_output(tr):
|
|
698
738
|
"""从工具结果中提取实际输出文本"""
|
|
739
|
+
# 优先使用 output 字段 (技能明确设置的输出)
|
|
699
740
|
out = tr.get("output", "")
|
|
700
741
|
if out:
|
|
701
742
|
return out
|
|
743
|
+
# 如果 output 为空,尝试智能格式化 data 字段
|
|
744
|
+
data = tr.get("data")
|
|
745
|
+
if data is not None:
|
|
746
|
+
formatted = _format_data_for_llm(data)
|
|
747
|
+
if formatted:
|
|
748
|
+
return formatted
|
|
749
|
+
# 降级到 message / stdout / error
|
|
702
750
|
out = tr.get("message", "")
|
|
703
751
|
if out:
|
|
704
752
|
return out
|
|
705
753
|
out = tr.get("stdout", "")
|
|
706
754
|
if out:
|
|
707
755
|
return out
|
|
708
|
-
data = tr.get("data")
|
|
709
|
-
if data is not None:
|
|
710
|
-
return str(data) if not isinstance(data, str) else data
|
|
711
756
|
return tr.get("error", "")
|
|
712
757
|
|
|
713
758
|
tool_output_text = _extract_tool_output(tool_result)
|
|
@@ -739,16 +784,18 @@ class MainAgent(BaseAgent):
|
|
|
739
784
|
need_callback = True
|
|
740
785
|
|
|
741
786
|
output_str = tool_output_text
|
|
787
|
+
# 搜索和网页读取类工具允许更长的输出
|
|
788
|
+
_max_output = 6000 if tool_name in ("web_search", "web_read", "url_read") else 3000
|
|
742
789
|
tool_outputs_parts.append(
|
|
743
790
|
f"### {before_call}\n"
|
|
744
791
|
f"**工具**: {tool_name}\n"
|
|
745
792
|
f"**结果**: {'成功' if tool_result.get('success') else '失败'}\n"
|
|
746
|
-
f"{truncate_str(output_str,
|
|
793
|
+
f"{truncate_str(output_str, _max_output)}\n"
|
|
747
794
|
)
|
|
748
795
|
|
|
749
796
|
conversation_history.append(Message(
|
|
750
797
|
role="assistant",
|
|
751
|
-
content=f"执行工具 {tool_name}:\n{truncate_str(output_str,
|
|
798
|
+
content=f"执行工具 {tool_name}:\n{truncate_str(output_str, _max_output)}",
|
|
752
799
|
))
|
|
753
800
|
conversation_history.append(Message(
|
|
754
801
|
role="user",
|
package/main.py
CHANGED
|
@@ -702,8 +702,8 @@ def create_tray_icon(app: MyAgentApp, web_port: int = 8767):
|
|
|
702
702
|
try:
|
|
703
703
|
import pystray
|
|
704
704
|
from PIL import Image, ImageDraw, ImageFont
|
|
705
|
-
except
|
|
706
|
-
#
|
|
705
|
+
except Exception:
|
|
706
|
+
# pystray 可能因缺少 GUI 环境 (X11/Wayland) 或未安装而失败
|
|
707
707
|
try:
|
|
708
708
|
from core.deps_checker import _pip_install
|
|
709
709
|
logger.info("pystray/PIL 未安装,正在自动安装...")
|
|
@@ -719,7 +719,7 @@ def create_tray_icon(app: MyAgentApp, web_port: int = 8767):
|
|
|
719
719
|
logger.warning(f"pystray/PIL 自动安装失败: {msg}")
|
|
720
720
|
return None
|
|
721
721
|
except Exception as e:
|
|
722
|
-
logger.warning(f"pystray
|
|
722
|
+
logger.warning(f"pystray 初始化失败 (可能缺少 GUI 环境): {e}")
|
|
723
723
|
return None
|
|
724
724
|
|
|
725
725
|
# ── 图标颜色主题 ──
|
package/package.json
CHANGED
package/requirements.txt
CHANGED
|
@@ -22,18 +22,20 @@ psutil>=5.9.0
|
|
|
22
22
|
playwright>=1.41.0
|
|
23
23
|
|
|
24
24
|
# ============================================================
|
|
25
|
-
# 技能系统 - 桌面 GUI 自动化
|
|
25
|
+
# 技能系统 - 桌面 GUI 自动化 (可选,无头服务器不需要)
|
|
26
26
|
# ============================================================
|
|
27
27
|
# 注意: pynput 在 Linux 上会自动拉取 evdev 作为依赖
|
|
28
28
|
# 如果 evdev 编译失败(缺少 linux-headers),不影响核心功能
|
|
29
29
|
pynput>=1.7.6
|
|
30
|
-
pygetwindow
|
|
30
|
+
# pygetwindow 仅支持 Windows 和 macOS,Linux 不需要
|
|
31
|
+
# pygetwindow>=0.0.9
|
|
31
32
|
mss>=9.0.0
|
|
32
33
|
|
|
33
34
|
# ============================================================
|
|
34
|
-
# 系统托盘 (
|
|
35
|
+
# 系统托盘 (可选,需要 GUI 桌面环境)
|
|
35
36
|
# ============================================================
|
|
36
|
-
pystray
|
|
37
|
+
# pystray 需要 X11/Wayland 显示环境,无头服务器不需要
|
|
38
|
+
# pystray>=0.19.5
|
|
37
39
|
Pillow>=10.0.0
|
|
38
40
|
|
|
39
41
|
# ============================================================
|
package/skills/VLM/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: VLM
|
|
3
|
-
description: Implement vision-based AI chat capabilities using the z-ai-web-dev-sdk. Use this skill when the user needs to analyze images, describe visual content, or create applications that combine image understanding with conversational AI. Supports image URLs
|
|
3
|
+
description: "Implement vision-based AI chat capabilities using the z-ai-web-dev-sdk. Use this skill when the user needs to analyze images, describe visual content, analyze video content, or create applications that combine image/video understanding with conversational AI. Also supports image editing use cases. Supports image URLs, video URLs, base64 encoded images, and document files for multimodal interactions."
|
|
4
4
|
license: MIT
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -20,6 +20,8 @@ this skill is located at above path in your project.
|
|
|
20
20
|
|
|
21
21
|
Vision Chat allows you to build applications that can analyze images, extract information from visual content, and answer questions about images through natural language conversation.
|
|
22
22
|
|
|
23
|
+
> **Unified Vision Skill**: VLM is the single skill for all vision-based AI use cases. It handles **image understanding** (`image_url`), **video understanding** (`video_url`), and **image editing** — the previously separate `image-understand`, `video-understand`, and `image-edit` skills are now consolidated here.
|
|
24
|
+
|
|
23
25
|
**IMPORTANT**: z-ai-web-dev-sdk MUST be used in backend code only. Never use it in client-side code.
|
|
24
26
|
|
|
25
27
|
## Prerequisites
|
|
@@ -284,6 +286,37 @@ async function analyzeLocalImage(imagePath, question) {
|
|
|
284
286
|
}
|
|
285
287
|
```
|
|
286
288
|
|
|
289
|
+
### Video Analysis
|
|
290
|
+
|
|
291
|
+
```javascript
|
|
292
|
+
import ZAI from 'z-ai-web-dev-sdk';
|
|
293
|
+
|
|
294
|
+
async function analyzeVideo(videoUrl, prompt) {
|
|
295
|
+
const zai = await ZAI.create();
|
|
296
|
+
|
|
297
|
+
const response = await zai.chat.completions.createVision({
|
|
298
|
+
messages: [
|
|
299
|
+
{
|
|
300
|
+
role: 'user',
|
|
301
|
+
content: [
|
|
302
|
+
{ type: 'text', text: prompt },
|
|
303
|
+
{ type: 'video_url', video_url: { url: videoUrl } }
|
|
304
|
+
]
|
|
305
|
+
}
|
|
306
|
+
],
|
|
307
|
+
thinking: { type: 'disabled' }
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
return response.choices[0]?.message?.content;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Usage
|
|
314
|
+
const summary = await analyzeVideo(
|
|
315
|
+
'https://example.com/presentation.mp4',
|
|
316
|
+
'Summarize the key points presented in this video'
|
|
317
|
+
);
|
|
318
|
+
```
|
|
319
|
+
|
|
287
320
|
## Advanced Use Cases
|
|
288
321
|
|
|
289
322
|
### Conversational Vision Chat
|
|
@@ -29,7 +29,7 @@ description: AI 新闻聚合与热度排序工具。当用户询问 AI 领域最
|
|
|
29
29
|
- site:substack.com AI news [当前月份]
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
发现周报后,用
|
|
32
|
+
发现周报后,用 web-reader 获取全文,从中提取所有新闻线索。
|
|
33
33
|
|
|
34
34
|
#### 维度 B:社区热度/病毒传播(关键维度 🔑)
|
|
35
35
|
|
|
@@ -142,7 +142,7 @@ description: AI 新闻聚合与热度排序工具。当用户询问 AI 领域最
|
|
|
142
142
|
|
|
143
143
|
- 同一事件被多家报道时,合并为一条,选择最权威/详细的来源
|
|
144
144
|
- 在摘要中注明"多家媒体报道"以体现热度
|
|
145
|
-
-
|
|
145
|
+
- 改名/更名的项目视为同一事件
|
|
146
146
|
|
|
147
147
|
## 推荐新闻源
|
|
148
148
|
|
|
@@ -58,7 +58,7 @@ description: 自动目标进度追踪器。在对话中检测到目标相关图
|
|
|
58
58
|
|
|
59
59
|
### 4. 记录到目标日记
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
将识别结果保存到当天的日常笔记文件中(JSON 或 Markdown 格式)
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
### 5. 反馈给用户
|
|
@@ -269,7 +269,7 @@ This skill NEVER:
|
|
|
269
269
|
|
|
270
270
|
**Data that stays local:**
|
|
271
271
|
- 识别后的结构化结果
|
|
272
|
-
-
|
|
272
|
+
- 记录到日常笔记的内容
|
|
273
273
|
- 打卡历史数据
|
|
274
274
|
|
|
275
275
|
**This skill does NOT:**
|
|
@@ -291,7 +291,7 @@ This skill NEVER:
|
|
|
291
291
|
|
|
292
292
|
## 集成建议
|
|
293
293
|
|
|
294
|
-
###
|
|
294
|
+
### 与日常工作流配合
|
|
295
295
|
|
|
296
296
|
将自动追踪器整合到目标管理日常工作流中:
|
|
297
297
|
|
|
@@ -302,16 +302,15 @@ This skill NEVER:
|
|
|
302
302
|
1. 自动调用 auto-target-tracker 识别内容
|
|
303
303
|
2. 提取关键信息并估算进度
|
|
304
304
|
3. 立刻记录到日常笔记中
|
|
305
|
-
4. 同步更新 USER.md 的目标进度
|
|
306
305
|
```
|
|
307
306
|
|
|
308
|
-
###
|
|
307
|
+
### 与定期汇总配合
|
|
309
308
|
|
|
310
|
-
|
|
309
|
+
在定期汇总中包含:
|
|
311
310
|
|
|
312
311
|
```markdown
|
|
313
312
|
## 每日汇总
|
|
314
|
-
-
|
|
313
|
+
- 自动读取今日所有打卡记录
|
|
315
314
|
- 生成目标进度报告
|
|
316
315
|
- 发送给用户
|
|
317
316
|
```
|
package/skills/browser_skill.py
CHANGED
|
@@ -163,8 +163,9 @@ class BrowserOpenSkill(Skill):
|
|
|
163
163
|
|
|
164
164
|
name = "browser_open"
|
|
165
165
|
description = (
|
|
166
|
-
"
|
|
167
|
-
"
|
|
166
|
+
"【仅用于需要浏览器交互的场景】打开网页并返回结构化页面信息(标题、文本、链接、表单等)。"
|
|
167
|
+
"注意:单纯搜索信息请用 web_search,读取网页正文请用 web_read。"
|
|
168
|
+
"仅在需要填写表单、点击按钮、截图、执行JavaScript等浏览器交互时才使用此工具。"
|
|
168
169
|
)
|
|
169
170
|
category = "browser"
|
|
170
171
|
parameters = [
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
name: coding-agent
|
|
3
3
|
slug: code
|
|
4
4
|
version: 1.0.4
|
|
5
|
-
homepage: https://clawic.com/skills/code
|
|
6
5
|
description: Coding workflow with planning, implementation, verification, and testing for clean software development.
|
|
7
6
|
changelog: Improved description for better discoverability
|
|
8
|
-
metadata: {"
|
|
7
|
+
metadata: {"emoji":"💻","requires":{"bins":[]},"os":["linux","darwin","win32"]}
|
|
9
8
|
---
|
|
10
9
|
|
|
11
10
|
## When to Use
|
|
@@ -5,10 +5,7 @@ description: Content-adaptive wisdom extraction — detects what domains exist i
|
|
|
5
5
|
|
|
6
6
|
## Customization
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
`~/.claude/PAI/USER/SKILLCUSTOMIZATIONS/ExtractWisdom/`
|
|
10
|
-
|
|
11
|
-
If this directory exists, load and apply any PREFERENCES.md, configurations, or resources found there. These override default behavior. If the directory does not exist, proceed with skill defaults.
|
|
8
|
+
Before executing, check for user customizations in the skill's local configuration directory. If custom PREFERENCES.md or configuration files exist, load and apply them. These override default behavior. If no customizations exist, proceed with skill defaults.
|
|
12
9
|
|
|
13
10
|
# ExtractWisdom — Dynamic Content Extraction
|
|
14
11
|
|
|
@@ -60,7 +57,7 @@ The output should feel like your smartest friend watched/read the thing and is t
|
|
|
60
57
|
|
|
61
58
|
## Tone Rules (CRITICAL)
|
|
62
59
|
|
|
63
|
-
**
|
|
60
|
+
**Voice reference:** Use a conversational, natural tone. The bullets should sound like someone telling a friend about it over coffee. Not compressed info nuggets. Not clever one-liners. Actual spoken observations.
|
|
64
61
|
|
|
65
62
|
**THREE LEVELS — we're aiming for Level 3:**
|
|
66
63
|
|
package/skills/gui_skill.py
CHANGED
|
@@ -176,19 +176,14 @@ class MouseClickSkill(Skill):
|
|
|
176
176
|
"""执行:鼠标点击"""
|
|
177
177
|
try:
|
|
178
178
|
from pynput.mouse import Controller, Button
|
|
179
|
-
except
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
error="pynput 安装失败,请手动运行: pip install pynput",
|
|
185
|
-
)
|
|
186
|
-
from pynput.mouse import Controller, Button
|
|
179
|
+
except Exception:
|
|
180
|
+
return SkillResult(
|
|
181
|
+
success=False,
|
|
182
|
+
error="pynput 不可用(当前平台缺少 GUI 环境或未安装)。仅在 Windows/macOS 桌面环境支持鼠标操作。",
|
|
183
|
+
)
|
|
187
184
|
|
|
188
185
|
try:
|
|
189
186
|
mouse = Controller()
|
|
190
|
-
|
|
191
|
-
# 映射按钮名称
|
|
192
187
|
button_map = {
|
|
193
188
|
"left": Button.left,
|
|
194
189
|
"right": Button.right,
|
|
@@ -259,14 +254,11 @@ class MouseDragSkill(Skill):
|
|
|
259
254
|
"""执行:鼠标拖拽"""
|
|
260
255
|
try:
|
|
261
256
|
from pynput.mouse import Controller, Button
|
|
262
|
-
except
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
error="pynput 安装失败,请手动运行: pip install pynput",
|
|
268
|
-
)
|
|
269
|
-
from pynput.mouse import Controller, Button
|
|
257
|
+
except Exception:
|
|
258
|
+
return SkillResult(
|
|
259
|
+
success=False,
|
|
260
|
+
error="pynput 不可用(当前平台缺少 GUI 环境或未安装)",
|
|
261
|
+
)
|
|
270
262
|
|
|
271
263
|
try:
|
|
272
264
|
mouse = Controller()
|
|
@@ -346,14 +338,11 @@ class TypeTextSkill(Skill):
|
|
|
346
338
|
"""执行:输入文本"""
|
|
347
339
|
try:
|
|
348
340
|
from pynput.keyboard import Controller
|
|
349
|
-
except
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
error="pynput 安装失败,请手动运行: pip install pynput",
|
|
355
|
-
)
|
|
356
|
-
from pynput.keyboard import Controller
|
|
341
|
+
except Exception:
|
|
342
|
+
return SkillResult(
|
|
343
|
+
success=False,
|
|
344
|
+
error="pynput 不可用(当前平台缺少 GUI 环境或未安装)",
|
|
345
|
+
)
|
|
357
346
|
|
|
358
347
|
if not text:
|
|
359
348
|
return SkillResult(success=False, error="缺少必需参数: text")
|
|
@@ -444,14 +433,11 @@ class HotkeySkill(Skill):
|
|
|
444
433
|
"""执行:按下快捷键"""
|
|
445
434
|
try:
|
|
446
435
|
from pynput.keyboard import Controller, Key, KeyCode
|
|
447
|
-
except
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
error="pynput 安装失败,请手动运行: pip install pynput",
|
|
453
|
-
)
|
|
454
|
-
from pynput.keyboard import Controller, Key, KeyCode
|
|
436
|
+
except Exception:
|
|
437
|
+
return SkillResult(
|
|
438
|
+
success=False,
|
|
439
|
+
error="pynput 不可用(当前平台缺少 GUI 环境或未安装)",
|
|
440
|
+
)
|
|
455
441
|
|
|
456
442
|
if not action:
|
|
457
443
|
return SkillResult(success=False, error="缺少必需参数: action")
|
|
@@ -558,13 +544,9 @@ class WindowListSkill(Skill):
|
|
|
558
544
|
try:
|
|
559
545
|
import pygetwindow as gw
|
|
560
546
|
except ImportError:
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
success=False,
|
|
565
|
-
error="pygetwindow 安装失败,请手动运行: pip install pygetwindow",
|
|
566
|
-
)
|
|
567
|
-
import pygetwindow as gw
|
|
547
|
+
return SkillResult(success=False, error="pygetwindow 未安装,请运行: pip install pygetwindow")
|
|
548
|
+
except NotImplementedError:
|
|
549
|
+
return SkillResult(success=False, error="当前平台不支持窗口管理(pygetwindow 仅支持 Windows 和 macOS)")
|
|
568
550
|
|
|
569
551
|
try:
|
|
570
552
|
windows = gw.getAllWindows()
|
|
@@ -632,13 +614,9 @@ class WindowFocusSkill(Skill):
|
|
|
632
614
|
try:
|
|
633
615
|
import pygetwindow as gw
|
|
634
616
|
except ImportError:
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
success=False,
|
|
639
|
-
error="pygetwindow 安装失败,请手动运行: pip install pygetwindow",
|
|
640
|
-
)
|
|
641
|
-
import pygetwindow as gw
|
|
617
|
+
return SkillResult(success=False, error="pygetwindow 未安装,请运行: pip install pygetwindow")
|
|
618
|
+
except NotImplementedError:
|
|
619
|
+
return SkillResult(success=False, error="当前平台不支持窗口管理(pygetwindow 仅支持 Windows 和 macOS)")
|
|
642
620
|
|
|
643
621
|
if not title:
|
|
644
622
|
return SkillResult(success=False, error="缺少必需参数: title")
|
|
@@ -728,14 +706,11 @@ class ScreenElementSkill(Skill):
|
|
|
728
706
|
# 第一步:截图
|
|
729
707
|
try:
|
|
730
708
|
import mss
|
|
731
|
-
except
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
error="mss 安装失败,请手动运行: pip install mss",
|
|
737
|
-
)
|
|
738
|
-
import mss
|
|
709
|
+
except Exception:
|
|
710
|
+
return SkillResult(
|
|
711
|
+
success=False,
|
|
712
|
+
error="mss 不可用(当前平台缺少 GUI 环境或未安装)",
|
|
713
|
+
)
|
|
739
714
|
|
|
740
715
|
try:
|
|
741
716
|
screenshot_path = _generate_screenshot_path()
|
|
@@ -465,7 +465,7 @@ def main():
|
|
|
465
465
|
if args.only:
|
|
466
466
|
pattern = args.only.lower()
|
|
467
467
|
visuals_to_generate = [
|
|
468
|
-
v for v in
|
|
468
|
+
v for v in CORE_VISUALS + EXTENDED_VISUALS
|
|
469
469
|
if pattern in v[0].lower() or pattern in v[2].lower()
|
|
470
470
|
]
|
|
471
471
|
print(f"Filtered to {len(visuals_to_generate)} visuals matching '{args.only}'\n")
|
|
@@ -4,22 +4,6 @@ description: "Marketing Mode combines 23 comprehensive marketing skills covering
|
|
|
4
4
|
metadata:
|
|
5
5
|
version: 1.0.0
|
|
6
6
|
tags: ["marketing", "growth", "seo", "copywriting", "cro", "paid-ads", "strategy", "psychology", "launch", "pricing", "email", "social"]
|
|
7
|
-
clawdbot:
|
|
8
|
-
mode:
|
|
9
|
-
name: "Mark the Marketer"
|
|
10
|
-
role: "Growth & Marketing Strategist"
|
|
11
|
-
emoji: "📈"
|
|
12
|
-
personality: |
|
|
13
|
-
Mark is a growth-obsessed marketing strategist who lives for the next conversion. He speaks in marketing frameworks, funnels, and metrics. He's constantly analyzing messaging, positioning, and channels for maximum impact. Mark doesn't just "post content" - he builds systems that convert.
|
|
14
|
-
requires:
|
|
15
|
-
bins: ["node"]
|
|
16
|
-
npm: true
|
|
17
|
-
install:
|
|
18
|
-
- id: "skill-install"
|
|
19
|
-
kind: "skill"
|
|
20
|
-
source: "clawdhub"
|
|
21
|
-
slug: "marketing-mode"
|
|
22
|
-
label: "Activate Marketing Mode"
|
|
23
7
|
---
|
|
24
8
|
|
|
25
9
|
# Marketing Mode - Complete Marketing Knowledge Base
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
"tags": ["marketing", "growth", "founder", "positioning", "messaging", "funnel"],
|
|
6
6
|
"author": "Seth Rose",
|
|
7
7
|
"license": "MIT",
|
|
8
|
-
"repository": "https://github.com/TheSethRose/clawdbot-skills",
|
|
9
8
|
"documentation": "SKILL.md",
|
|
10
9
|
"keywords": [
|
|
11
10
|
"marketing",
|
|
@@ -17,35 +16,5 @@
|
|
|
17
16
|
"conversion",
|
|
18
17
|
"cta",
|
|
19
18
|
"hooks"
|
|
20
|
-
]
|
|
21
|
-
"engines": {
|
|
22
|
-
"node": ">=18.0.0"
|
|
23
|
-
},
|
|
24
|
-
"install": {
|
|
25
|
-
"npm": "npm install -g @thesethrose/marketing-mode"
|
|
26
|
-
},
|
|
27
|
-
"usage": {
|
|
28
|
-
"cli": "clawdhub install marketing-mode"
|
|
29
|
-
},
|
|
30
|
-
"clawdbot": {
|
|
31
|
-
"requires": {
|
|
32
|
-
"node": true,
|
|
33
|
-
"npm": true
|
|
34
|
-
},
|
|
35
|
-
"mode": {
|
|
36
|
-
"name": "Mark the Marketer",
|
|
37
|
-
"role": "Marketing Strategist",
|
|
38
|
-
"emoji": "📈",
|
|
39
|
-
"personality": "Growth-obsessed marketing strategist focused on funnels, positioning, and conversion.",
|
|
40
|
-
"system_prompt_path": "mode-prompt.md"
|
|
41
|
-
},
|
|
42
|
-
"install": [
|
|
43
|
-
{
|
|
44
|
-
"id": "npm-pkg",
|
|
45
|
-
"kind": "npm",
|
|
46
|
-
"package": "@thesethrose/marketing-mode",
|
|
47
|
-
"label": "Install Marketing Mode (npm)"
|
|
48
|
-
}
|
|
49
|
-
]
|
|
50
|
-
}
|
|
19
|
+
]
|
|
51
20
|
}
|
|
@@ -306,7 +306,7 @@ Run `fc-list` to get more fonts. Font files are typically located under:
|
|
|
306
306
|
|
|
307
307
|
### Page Breaks
|
|
308
308
|
|
|
309
|
-
Follow the document type strategy defined in
|
|
309
|
+
Follow the document type strategy defined in skill guidelines Rule 1.
|
|
310
310
|
|
|
311
311
|
**Structural breaks (always - MANDATORY):**
|
|
312
312
|
- Between cover page and TOC - **cover must NEVER share a page with anything else**
|
|
@@ -238,7 +238,7 @@ async function callZAI(
|
|
|
238
238
|
|
|
239
239
|
const completion = await zai.chat.completions.create({
|
|
240
240
|
messages: [
|
|
241
|
-
{ role: '
|
|
241
|
+
{ role: 'system', content: systemPrompt },
|
|
242
242
|
{ role: 'user', content: userPrompt },
|
|
243
243
|
],
|
|
244
244
|
thinking: { type: 'disabled' },
|
package/skills/ppt/SKILL.md
CHANGED
|
@@ -67,7 +67,7 @@ For comments, speaker notes, slide layouts, animations, design elements, or comp
|
|
|
67
67
|
python ooxml/scripts/unpack.py <office_file> <output_dir>
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
-
**Note**: `unpack.py` is at `skills/
|
|
70
|
+
**Note**: `unpack.py` is at `skills/ppt/ooxml/scripts/unpack.py` relative to the project root. If not found, run `find . -name "unpack.py"` to locate it.
|
|
71
71
|
|
|
72
72
|
#### Key file structures
|
|
73
73
|
|