@qqbrowser/openclaw-qbot 0.0.105 โ 0.0.107
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/package.json +1 -1
- package/preset-config.json +2 -2
- package/skills/srt-sandbox/SKILL.md +126 -0
- package/extensions/acpx/skills/acp-router/SKILL.md +0 -219
- package/extensions/diffs/skills/diffs/SKILL.md +0 -22
- package/extensions/lobster/SKILL.md +0 -97
- package/extensions/open-prose/skills/prose/LICENSE +0 -21
- package/extensions/open-prose/skills/prose/SKILL.md +0 -323
- package/extensions/open-prose/skills/prose/alt-borges.md +0 -141
- package/extensions/open-prose/skills/prose/alts/arabian-nights.md +0 -358
- package/extensions/open-prose/skills/prose/alts/borges.md +0 -360
- package/extensions/open-prose/skills/prose/alts/folk.md +0 -322
- package/extensions/open-prose/skills/prose/alts/homer.md +0 -346
- package/extensions/open-prose/skills/prose/alts/kafka.md +0 -373
- package/extensions/open-prose/skills/prose/compiler.md +0 -2971
- package/extensions/open-prose/skills/prose/examples/01-hello-world.prose +0 -4
- package/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +0 -6
- package/extensions/open-prose/skills/prose/examples/03-code-review.prose +0 -17
- package/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +0 -14
- package/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +0 -17
- package/extensions/open-prose/skills/prose/examples/07-refactor.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/08-blog-post.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +0 -25
- package/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +0 -32
- package/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +0 -27
- package/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +0 -43
- package/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +0 -51
- package/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +0 -48
- package/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +0 -23
- package/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +0 -19
- package/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +0 -19
- package/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +0 -36
- package/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +0 -71
- package/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +0 -35
- package/extensions/open-prose/skills/prose/examples/22-error-handling.prose +0 -51
- package/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +0 -63
- package/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +0 -86
- package/extensions/open-prose/skills/prose/examples/25-conditionals.prose +0 -114
- package/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +0 -100
- package/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +0 -105
- package/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +0 -37
- package/extensions/open-prose/skills/prose/examples/28-gas-town.prose +0 -1572
- package/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +0 -218
- package/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +0 -42
- package/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +0 -145
- package/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +0 -168
- package/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +0 -204
- package/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +0 -296
- package/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +0 -237
- package/extensions/open-prose/skills/prose/examples/37-the-forge.prose +0 -1474
- package/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +0 -455
- package/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +0 -277
- package/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +0 -32
- package/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +0 -38
- package/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +0 -46
- package/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +0 -50
- package/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +0 -261
- package/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +0 -159
- package/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +0 -637
- package/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +0 -148
- package/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +0 -225
- package/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +0 -356
- package/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +0 -445
- package/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +0 -210
- package/extensions/open-prose/skills/prose/examples/README.md +0 -391
- package/extensions/open-prose/skills/prose/examples/roadmap/README.md +0 -22
- package/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +0 -18
- package/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +0 -17
- package/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +0 -223
- package/extensions/open-prose/skills/prose/guidance/antipatterns.md +0 -951
- package/extensions/open-prose/skills/prose/guidance/patterns.md +0 -700
- package/extensions/open-prose/skills/prose/guidance/system-prompt.md +0 -180
- package/extensions/open-prose/skills/prose/help.md +0 -144
- package/extensions/open-prose/skills/prose/lib/README.md +0 -108
- package/extensions/open-prose/skills/prose/lib/calibrator.prose +0 -215
- package/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +0 -174
- package/extensions/open-prose/skills/prose/lib/error-forensics.prose +0 -250
- package/extensions/open-prose/skills/prose/lib/inspector.prose +0 -196
- package/extensions/open-prose/skills/prose/lib/profiler.prose +0 -460
- package/extensions/open-prose/skills/prose/lib/program-improver.prose +0 -275
- package/extensions/open-prose/skills/prose/lib/project-memory.prose +0 -118
- package/extensions/open-prose/skills/prose/lib/user-memory.prose +0 -93
- package/extensions/open-prose/skills/prose/lib/vm-improver.prose +0 -243
- package/extensions/open-prose/skills/prose/primitives/session.md +0 -593
- package/extensions/open-prose/skills/prose/prose.md +0 -1237
- package/extensions/open-prose/skills/prose/state/filesystem.md +0 -498
- package/extensions/open-prose/skills/prose/state/in-context.md +0 -384
- package/extensions/open-prose/skills/prose/state/postgres.md +0 -880
- package/extensions/open-prose/skills/prose/state/sqlite.md +0 -574
- package/skills/model-usage/SKILL.md +0 -69
- package/skills/model-usage/references/codexbar-cli.md +0 -33
- package/skills/model-usage/scripts/model_usage.py +0 -320
- package/skills/model-usage/scripts/test_model_usage.py +0 -40
- package/skills/study-habits/SKILL.md +0 -72
- package/skills/study-habits/_meta.json +0 -6
- package/skills/xiaohongshu-mcp/SKILL.md +0 -95
- package/skills/xiaohongshu-mcp/_meta.json +0 -6
- package/skills/xiaohongshu-mcp/scripts/xhs_client.py +0 -264
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Xiaohongshu MCP Client - A Python client for xiaohongshu-mcp HTTP API.
|
|
4
|
-
|
|
5
|
-
Usage:
|
|
6
|
-
python xhs_client.py <command> [options]
|
|
7
|
-
|
|
8
|
-
Commands:
|
|
9
|
-
status Check login status
|
|
10
|
-
search <keyword> Search notes by keyword
|
|
11
|
-
detail <feed_id> <xsec_token> Get note details
|
|
12
|
-
feeds Get recommended feed list
|
|
13
|
-
publish <title> <content> <images> Publish a note
|
|
14
|
-
|
|
15
|
-
Examples:
|
|
16
|
-
python xhs_client.py status
|
|
17
|
-
python xhs_client.py search "ๅๅกๆจ่"
|
|
18
|
-
python xhs_client.py detail "abc123" "token456"
|
|
19
|
-
python xhs_client.py feeds
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
import argparse
|
|
23
|
-
import json
|
|
24
|
-
import sys
|
|
25
|
-
import requests
|
|
26
|
-
|
|
27
|
-
BASE_URL = "http://localhost:18060"
|
|
28
|
-
TIMEOUT = 60
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def check_status():
|
|
32
|
-
"""Check login status."""
|
|
33
|
-
try:
|
|
34
|
-
resp = requests.get(f"{BASE_URL}/api/v1/login/status", timeout=TIMEOUT)
|
|
35
|
-
data = resp.json()
|
|
36
|
-
if data.get("success"):
|
|
37
|
-
login_info = data.get("data", {})
|
|
38
|
-
if login_info.get("is_logged_in"):
|
|
39
|
-
print(f"โ
Logged in as: {login_info.get('username', 'Unknown')}")
|
|
40
|
-
else:
|
|
41
|
-
print("โ Not logged in. Please run the login tool first.")
|
|
42
|
-
else:
|
|
43
|
-
print(f"โ Error: {data.get('error', 'Unknown error')}")
|
|
44
|
-
return data
|
|
45
|
-
except requests.exceptions.ConnectionError:
|
|
46
|
-
print("โ Cannot connect to MCP server. Make sure xiaohongshu-mcp is running on localhost:18060")
|
|
47
|
-
sys.exit(1)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def search_notes(keyword, sort_by="็ปผๅ", note_type="ไธ้", publish_time="ไธ้"):
|
|
51
|
-
"""Search notes by keyword with optional filters."""
|
|
52
|
-
try:
|
|
53
|
-
payload = {
|
|
54
|
-
"keyword": keyword,
|
|
55
|
-
"filters": {
|
|
56
|
-
"sort_by": sort_by,
|
|
57
|
-
"note_type": note_type,
|
|
58
|
-
"publish_time": publish_time
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
resp = requests.post(
|
|
62
|
-
f"{BASE_URL}/api/v1/feeds/search",
|
|
63
|
-
json=payload,
|
|
64
|
-
timeout=TIMEOUT
|
|
65
|
-
)
|
|
66
|
-
data = resp.json()
|
|
67
|
-
|
|
68
|
-
if data.get("success"):
|
|
69
|
-
feeds = data.get("data", {}).get("feeds", [])
|
|
70
|
-
print(f"๐ Found {len(feeds)} notes for '{keyword}':\n")
|
|
71
|
-
|
|
72
|
-
for i, feed in enumerate(feeds, 1):
|
|
73
|
-
note_card = feed.get("noteCard", {})
|
|
74
|
-
user = note_card.get("user", {})
|
|
75
|
-
interact = note_card.get("interactInfo", {})
|
|
76
|
-
|
|
77
|
-
print(f"[{i}] {note_card.get('displayTitle', 'No title')}")
|
|
78
|
-
print(f" Author: {user.get('nickname', 'Unknown')}")
|
|
79
|
-
print(f" Likes: {interact.get('likedCount', '0')} | Collects: {interact.get('collectedCount', '0')} | Comments: {interact.get('commentCount', '0')}")
|
|
80
|
-
print(f" feed_id: {feed.get('id')}")
|
|
81
|
-
print(f" xsec_token: {feed.get('xsecToken')}")
|
|
82
|
-
print()
|
|
83
|
-
else:
|
|
84
|
-
print(f"โ Search failed: {data.get('error', 'Unknown error')}")
|
|
85
|
-
|
|
86
|
-
return data
|
|
87
|
-
except requests.exceptions.ConnectionError:
|
|
88
|
-
print("โ Cannot connect to MCP server.")
|
|
89
|
-
sys.exit(1)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
def get_note_detail(feed_id, xsec_token, load_comments=False):
|
|
93
|
-
"""Get detailed information about a specific note."""
|
|
94
|
-
try:
|
|
95
|
-
payload = {
|
|
96
|
-
"feed_id": feed_id,
|
|
97
|
-
"xsec_token": xsec_token,
|
|
98
|
-
"load_all_comments": load_comments
|
|
99
|
-
}
|
|
100
|
-
resp = requests.post(
|
|
101
|
-
f"{BASE_URL}/api/v1/feeds/detail",
|
|
102
|
-
json=payload,
|
|
103
|
-
timeout=TIMEOUT
|
|
104
|
-
)
|
|
105
|
-
data = resp.json()
|
|
106
|
-
|
|
107
|
-
if data.get("success"):
|
|
108
|
-
note_data = data.get("data", {}).get("data", {})
|
|
109
|
-
note = note_data.get("note", {})
|
|
110
|
-
comments = note_data.get("comments", {})
|
|
111
|
-
|
|
112
|
-
print(f"๐ Note Details:\n")
|
|
113
|
-
print(f"Title: {note.get('title', 'No title')}")
|
|
114
|
-
print(f"Author: {note.get('user', {}).get('nickname', 'Unknown')}")
|
|
115
|
-
print(f"Location: {note.get('ipLocation', 'Unknown')}")
|
|
116
|
-
print(f"\nContent:\n{note.get('desc', 'No content')}\n")
|
|
117
|
-
|
|
118
|
-
interact = note.get("interactInfo", {})
|
|
119
|
-
print(f"Likes: {interact.get('likedCount', '0')} | Collects: {interact.get('collectedCount', '0')} | Comments: {interact.get('commentCount', '0')}")
|
|
120
|
-
|
|
121
|
-
comment_list = comments.get("list", [])
|
|
122
|
-
if comment_list:
|
|
123
|
-
print(f"\n๐ฌ Top Comments ({len(comment_list)}):")
|
|
124
|
-
for c in comment_list[:5]:
|
|
125
|
-
user_info = c.get("userInfo", {})
|
|
126
|
-
print(f" - {user_info.get('nickname', 'Anonymous')}: {c.get('content', '')}")
|
|
127
|
-
else:
|
|
128
|
-
print(f"โ Failed to get details: {data.get('error', 'Unknown error')}")
|
|
129
|
-
|
|
130
|
-
return data
|
|
131
|
-
except requests.exceptions.ConnectionError:
|
|
132
|
-
print("โ Cannot connect to MCP server.")
|
|
133
|
-
sys.exit(1)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def get_feeds():
|
|
137
|
-
"""Get recommended feed list."""
|
|
138
|
-
try:
|
|
139
|
-
resp = requests.get(f"{BASE_URL}/api/v1/feeds/list", timeout=TIMEOUT)
|
|
140
|
-
data = resp.json()
|
|
141
|
-
|
|
142
|
-
if data.get("success"):
|
|
143
|
-
feeds = data.get("data", {}).get("feeds", [])
|
|
144
|
-
print(f"๐ Recommended Feeds ({len(feeds)} notes):\n")
|
|
145
|
-
|
|
146
|
-
for i, feed in enumerate(feeds, 1):
|
|
147
|
-
note_card = feed.get("noteCard", {})
|
|
148
|
-
user = note_card.get("user", {})
|
|
149
|
-
interact = note_card.get("interactInfo", {})
|
|
150
|
-
|
|
151
|
-
print(f"[{i}] {note_card.get('displayTitle', 'No title')}")
|
|
152
|
-
print(f" Author: {user.get('nickname', 'Unknown')}")
|
|
153
|
-
print(f" Likes: {interact.get('likedCount', '0')}")
|
|
154
|
-
print()
|
|
155
|
-
else:
|
|
156
|
-
print(f"โ Failed to get feeds: {data.get('error', 'Unknown error')}")
|
|
157
|
-
|
|
158
|
-
return data
|
|
159
|
-
except requests.exceptions.ConnectionError:
|
|
160
|
-
print("โ Cannot connect to MCP server.")
|
|
161
|
-
sys.exit(1)
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
def publish_note(title, content, images, tags=None):
|
|
165
|
-
"""Publish a new note."""
|
|
166
|
-
try:
|
|
167
|
-
payload = {
|
|
168
|
-
"title": title,
|
|
169
|
-
"content": content,
|
|
170
|
-
"images": images if isinstance(images, list) else [images]
|
|
171
|
-
}
|
|
172
|
-
if tags:
|
|
173
|
-
payload["tags"] = tags if isinstance(tags, list) else [tags]
|
|
174
|
-
|
|
175
|
-
resp = requests.post(
|
|
176
|
-
f"{BASE_URL}/api/v1/publish",
|
|
177
|
-
json=payload,
|
|
178
|
-
timeout=120
|
|
179
|
-
)
|
|
180
|
-
data = resp.json()
|
|
181
|
-
|
|
182
|
-
if data.get("success"):
|
|
183
|
-
print(f"โ
Note published successfully!")
|
|
184
|
-
print(f" Post ID: {data.get('data', {}).get('post_id', 'Unknown')}")
|
|
185
|
-
else:
|
|
186
|
-
print(f"โ Publish failed: {data.get('error', 'Unknown error')}")
|
|
187
|
-
|
|
188
|
-
return data
|
|
189
|
-
except requests.exceptions.ConnectionError:
|
|
190
|
-
print("โ Cannot connect to MCP server.")
|
|
191
|
-
sys.exit(1)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
def main():
|
|
195
|
-
parser = argparse.ArgumentParser(
|
|
196
|
-
description="Xiaohongshu MCP Client",
|
|
197
|
-
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
198
|
-
epilog=__doc__
|
|
199
|
-
)
|
|
200
|
-
subparsers = parser.add_subparsers(dest="command", help="Available commands")
|
|
201
|
-
|
|
202
|
-
# status command
|
|
203
|
-
subparsers.add_parser("status", help="Check login status")
|
|
204
|
-
|
|
205
|
-
# search command
|
|
206
|
-
search_parser = subparsers.add_parser("search", help="Search notes")
|
|
207
|
-
search_parser.add_argument("keyword", help="Search keyword")
|
|
208
|
-
search_parser.add_argument("--sort", default="็ปผๅ",
|
|
209
|
-
choices=["็ปผๅ", "ๆๆฐ", "ๆๅค็น่ต", "ๆๅค่ฏ่ฎบ", "ๆๅคๆถ่"],
|
|
210
|
-
help="Sort by")
|
|
211
|
-
search_parser.add_argument("--type", default="ไธ้",
|
|
212
|
-
choices=["ไธ้", "่ง้ข", "ๅพๆ"],
|
|
213
|
-
help="Note type")
|
|
214
|
-
search_parser.add_argument("--time", default="ไธ้",
|
|
215
|
-
choices=["ไธ้", "ไธๅคฉๅ
", "ไธๅจๅ
", "ๅๅนดๅ
"],
|
|
216
|
-
help="Publish time")
|
|
217
|
-
search_parser.add_argument("--json", action="store_true", help="Output raw JSON")
|
|
218
|
-
|
|
219
|
-
# detail command
|
|
220
|
-
detail_parser = subparsers.add_parser("detail", help="Get note details")
|
|
221
|
-
detail_parser.add_argument("feed_id", help="Feed ID")
|
|
222
|
-
detail_parser.add_argument("xsec_token", help="Security token")
|
|
223
|
-
detail_parser.add_argument("--comments", action="store_true", help="Load all comments")
|
|
224
|
-
detail_parser.add_argument("--json", action="store_true", help="Output raw JSON")
|
|
225
|
-
|
|
226
|
-
# feeds command
|
|
227
|
-
feeds_parser = subparsers.add_parser("feeds", help="Get recommended feeds")
|
|
228
|
-
feeds_parser.add_argument("--json", action="store_true", help="Output raw JSON")
|
|
229
|
-
|
|
230
|
-
# publish command
|
|
231
|
-
publish_parser = subparsers.add_parser("publish", help="Publish a note")
|
|
232
|
-
publish_parser.add_argument("title", help="Note title")
|
|
233
|
-
publish_parser.add_argument("content", help="Note content")
|
|
234
|
-
publish_parser.add_argument("images", help="Image URLs (comma-separated)")
|
|
235
|
-
publish_parser.add_argument("--tags", help="Tags (comma-separated)")
|
|
236
|
-
|
|
237
|
-
args = parser.parse_args()
|
|
238
|
-
|
|
239
|
-
if not args.command:
|
|
240
|
-
parser.print_help()
|
|
241
|
-
sys.exit(1)
|
|
242
|
-
|
|
243
|
-
if args.command == "status":
|
|
244
|
-
result = check_status()
|
|
245
|
-
elif args.command == "search":
|
|
246
|
-
result = search_notes(args.keyword, args.sort, args.type, args.time)
|
|
247
|
-
if hasattr(args, 'json') and args.json:
|
|
248
|
-
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
249
|
-
elif args.command == "detail":
|
|
250
|
-
result = get_note_detail(args.feed_id, args.xsec_token, args.comments)
|
|
251
|
-
if hasattr(args, 'json') and args.json:
|
|
252
|
-
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
253
|
-
elif args.command == "feeds":
|
|
254
|
-
result = get_feeds()
|
|
255
|
-
if hasattr(args, 'json') and args.json:
|
|
256
|
-
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
257
|
-
elif args.command == "publish":
|
|
258
|
-
images = args.images.split(",")
|
|
259
|
-
tags = args.tags.split(",") if args.tags else None
|
|
260
|
-
result = publish_note(args.title, args.content, images, tags)
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
if __name__ == "__main__":
|
|
264
|
-
main()
|