sophhub 0.2.3 → 0.3.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.
Files changed (117) hide show
  1. package/package.json +1 -1
  2. package/skills/consensus/skill.json +20 -0
  3. package/skills/consensus/src/SKILL.md +93 -0
  4. package/skills/deepwiki/skill.json +20 -0
  5. package/skills/deepwiki/src/SKILL.md +45 -0
  6. package/skills/deepwiki/src/_meta.json +6 -0
  7. package/skills/deepwiki/src/scripts/deepwiki.js +135 -0
  8. package/skills/feishu-bitable/skill.json +20 -0
  9. package/skills/feishu-bitable/src/CHECKLIST.md +150 -0
  10. package/skills/feishu-bitable/src/README.md +178 -0
  11. package/skills/feishu-bitable/src/SKILL.md +113 -0
  12. package/skills/feishu-bitable/src/_meta.json +6 -0
  13. package/skills/feishu-bitable/src/api.js +381 -0
  14. package/skills/feishu-bitable/src/bin/cli.js +284 -0
  15. package/skills/feishu-bitable/src/description.md +143 -0
  16. package/skills/feishu-bitable/src/examples/create-records.json +52 -0
  17. package/skills/feishu-bitable/src/examples/create-table.json +64 -0
  18. package/skills/feishu-bitable/src/package-lock.json +324 -0
  19. package/skills/feishu-bitable/src/package.json +33 -0
  20. package/skills/feishu-bitable/src/publish-config.json +14 -0
  21. package/skills/feishu-bitable/src/test-simple.js +61 -0
  22. package/skills/feishu-bitable/src/utils.js +261 -0
  23. package/skills/google-maps/skill.json +20 -0
  24. package/skills/google-maps/src/SKILL.md +237 -0
  25. package/skills/google-maps/src/_meta.json +6 -0
  26. package/skills/google-maps/src/lib/map_helper.py +912 -0
  27. package/skills/large-task-router/skill.json +20 -0
  28. package/skills/large-task-router/src/SKILL.md +79 -0
  29. package/skills/large-task-router/src/templates/plan.md +74 -0
  30. package/skills/notes-hub-assistant/skill.json +20 -0
  31. package/skills/notes-hub-assistant/src/SKILL.md +233 -0
  32. package/skills/notes-hub-assistant/src/scripts/_resolve_lark_cli.py +48 -0
  33. package/skills/notes-hub-assistant/src/scripts/openclaw_meeting_minutes.py +473 -0
  34. package/skills/notes-hub-assistant/src/scripts/openclaw_notes_crud.py +596 -0
  35. package/skills/notes-hub-assistant/src/scripts/openclaw_wolai_notes_crud.py +364 -0
  36. package/skills/notes-hub-assistant/src/scripts/run_meeting_minutes.py +79 -0
  37. package/skills/notes-hub-assistant/src/scripts/run_note_crud.py +37 -0
  38. package/skills/notes-hub-assistant/src/scripts/run_notionbot.py +36 -0
  39. package/skills/notes-hub-assistant/src/scripts/run_wolai_note_crud.py +27 -0
  40. package/skills/skillhub/skill.json +11 -4
  41. package/skills/skillhub/src/SKILL.md +11 -1
  42. package/skills/sophnet-dailynews/skill.json +20 -0
  43. package/skills/sophnet-dailynews/src/SKILL.md +179 -0
  44. package/skills/sophnet-dailynews/src/cache.json +151 -0
  45. package/skills/sophnet-dailynews/src/sources.json +230 -0
  46. package/skills/sophnet-schedule/skill.json +20 -0
  47. package/skills/sophnet-schedule/src/ARCHITECTURE.md +321 -0
  48. package/skills/sophnet-schedule/src/IMPROVEMENTS.md +145 -0
  49. package/skills/sophnet-schedule/src/SKILL.md +1050 -0
  50. package/skills/sophnet-schedule/src/_meta.json +6 -0
  51. package/skills/sophnet-schedule/src/api/__init__.py +0 -0
  52. package/skills/sophnet-schedule/src/api/models.py +245 -0
  53. package/skills/sophnet-schedule/src/apps/add_event.py +237 -0
  54. package/skills/sophnet-schedule/src/apps/check_reminders.py +112 -0
  55. package/skills/sophnet-schedule/src/apps/check_roc.py +246 -0
  56. package/skills/sophnet-schedule/src/apps/generate_daily_plan.py +342 -0
  57. package/skills/sophnet-schedule/src/apps/import_events.py +216 -0
  58. package/skills/sophnet-schedule/src/apps/monitor_calendar_changes.py +140 -0
  59. package/skills/sophnet-schedule/src/apps/register_tasks.py +169 -0
  60. package/skills/sophnet-schedule/src/apps/sync_roc_to_gcal.py +174 -0
  61. package/skills/sophnet-schedule/src/compat.py +66 -0
  62. package/skills/sophnet-schedule/src/config/__init__.py +0 -0
  63. package/skills/sophnet-schedule/src/config/reminder_rules.yaml +96 -0
  64. package/skills/sophnet-schedule/src/config/roc_events.yaml +44 -0
  65. package/skills/sophnet-schedule/src/config/settings.py +133 -0
  66. package/skills/sophnet-schedule/src/config/task_registry.yaml +92 -0
  67. package/skills/sophnet-schedule/src/docs/FRONTEND_INTEGRATION_GUIDE.md +437 -0
  68. package/skills/sophnet-schedule/src/gcal/__init__.py +0 -0
  69. package/skills/sophnet-schedule/src/gcal/client.py +374 -0
  70. package/skills/sophnet-schedule/src/gcal/models.py +91 -0
  71. package/skills/sophnet-schedule/src/requirements.txt +6 -0
  72. package/skills/sophnet-schedule/src/scripts/setup_gcal_token.py +85 -0
  73. package/skills/sophnet-schedule/src/server.py +669 -0
  74. package/skills/sophnet-schedule/src/services/__init__.py +0 -0
  75. package/skills/sophnet-schedule/src/services/calendar_backend.py +139 -0
  76. package/skills/sophnet-schedule/src/services/conflict_detector.py +96 -0
  77. package/skills/sophnet-schedule/src/services/datetime_utils.py +117 -0
  78. package/skills/sophnet-schedule/src/services/event_classifier.py +100 -0
  79. package/skills/sophnet-schedule/src/services/event_diff.py +160 -0
  80. package/skills/sophnet-schedule/src/services/google_integration.py +500 -0
  81. package/skills/sophnet-schedule/src/services/job_store.py +100 -0
  82. package/skills/sophnet-schedule/src/services/local_event_store.py +266 -0
  83. package/skills/sophnet-schedule/src/services/reminder_planner.py +116 -0
  84. package/skills/sophnet-schedule/src/services/runtime_utils.py +31 -0
  85. package/skills/sophnet-schedule/src/services/table_parser.py +286 -0
  86. package/skills/sophnet-schedule/src/services/task_builder.py +167 -0
  87. package/skills/sophnet-schedule/src/services/time_window.py +72 -0
  88. package/skills/sophnet-stock/skill.json +20 -0
  89. package/skills/sophnet-stock/src/App-Plan.md +442 -0
  90. package/skills/sophnet-stock/src/README.md +214 -0
  91. package/skills/sophnet-stock/src/SKILL.md +236 -0
  92. package/skills/sophnet-stock/src/TODO.md +394 -0
  93. package/skills/sophnet-stock/src/_meta.json +6 -0
  94. package/skills/sophnet-stock/src/docs/ARCHITECTURE.md +408 -0
  95. package/skills/sophnet-stock/src/docs/CONCEPT.md +233 -0
  96. package/skills/sophnet-stock/src/docs/HOT_SCANNER.md +288 -0
  97. package/skills/sophnet-stock/src/docs/README.md +95 -0
  98. package/skills/sophnet-stock/src/docs/USAGE.md +465 -0
  99. package/skills/sophnet-stock/src/scripts/analyze_stock.py +2565 -0
  100. package/skills/sophnet-stock/src/scripts/dividends.py +365 -0
  101. package/skills/sophnet-stock/src/scripts/hot_scanner.py +582 -0
  102. package/skills/sophnet-stock/src/scripts/portfolio.py +548 -0
  103. package/skills/sophnet-stock/src/scripts/rumor_scanner.py +342 -0
  104. package/skills/sophnet-stock/src/scripts/test_stock_analysis.py +409 -0
  105. package/skills/sophnet-stock/src/scripts/watchlist.py +336 -0
  106. package/skills/xiaohongshu/skill.json +20 -0
  107. package/skills/xiaohongshu/src/SKILL.md +91 -0
  108. package/skills/xiaohongshu/src/_meta.json +6 -0
  109. package/skills/xiaohongshu/src/assets/card.html +216 -0
  110. package/skills/xiaohongshu/src/assets/cover.html +82 -0
  111. package/skills/xiaohongshu/src/assets/example.md +84 -0
  112. package/skills/xiaohongshu/src/assets/styles.css +318 -0
  113. package/skills/xiaohongshu/src/scripts/render_xhs_v2.py +737 -0
  114. package/skills/xiaohongshu/src/scripts/sign_server.py +158 -0
  115. package/skills/xiaohongshu/src/scripts/stealth.min.js +7 -0
  116. package/skills/xiaohongshu/src/scripts/xhs_tool.py +186 -0
  117. package/skills/xiaohongshu/src/workflow.py +185 -0
@@ -0,0 +1,179 @@
1
+ ---
2
+ name: sophnet-dailynews
3
+ description: Generate a daily, high-signal Markdown news report by scraping preset sources, filtering and deduplicating items. Use when the user asks for daily news, tech digest, today's links, or requests an automated curated report.
4
+ ---
5
+
6
+ # Daily news report (Markdown)
7
+
8
+ ## Quick start
9
+
10
+ 1. Resolve the target date.
11
+ - Accept `YYYY-MM-DD` from the user.
12
+ - Default to local today.
13
+ 2. Read `sources.json` and `cache.json` **with explicit paths**.
14
+ - Always call the read tool with a `path` field (not `file_path`).
15
+ - Use these exact paths:
16
+ - `read(path="/Data/shutong.shan/clawd/skills/sophnet-dailynews/sources.json")`
17
+ - `read(path="/Data/shutong.shan/clawd/skills/sophnet-dailynews/cache.json")`
18
+ 3. Collect items in waves (Tier 1 → Tier 2 → Tier 3/browser) until the report has enough **high-quality** items.
19
+ 4. Write `NewsReport/YYYY-MM-DD-news-report.md`.
20
+ 5. Update `cache.json` (dedupe + historical stats).
21
+
22
+ ## Files in this skill
23
+
24
+ - `sources.json`: tiers, batches, URLs, fetch method (`webfetch`/`browser`), extraction hint, enable/disable flags, and quality thresholds.
25
+ - `cache.json`: last run metadata, per-source stats, URL/content dedupe caches, and per-day article history.
26
+
27
+ ## Common failure: `web_fetch` → `fetch failed`
28
+
29
+ This usually means the fetch tool hit one of these:
30
+
31
+ - a redirect it doesn't follow (302)
32
+ - a method mismatch (some sites don't like `HEAD`)
33
+ - bot protection / CDN quirks
34
+ - response too large / slow for the tool limits
35
+
36
+ This skill is tuned to avoid common failures:
37
+
38
+ - Prefer **HN RSS** over HTML (`https://news.ycombinator.com/rss`).
39
+ - Pin **HuggingFace Papers** to a concrete date URL to avoid redirects:
40
+ - `https://huggingface.co/papers/date/{{date}}`
41
+ - Replace `{{date}}` with the target date (`YYYY-MM-DD`) before fetching.
42
+
43
+ ## Output contract
44
+
45
+ Produce exactly one Markdown file:
46
+
47
+ - Path: `NewsReport/YYYY-MM-DD-news-report.md`
48
+ - Target: `quality_thresholds.target_items` items (default 20)
49
+ - Include only items with `quality_score >= quality_thresholds.min_score_to_include` (default 3)
50
+
51
+ Each item must include:
52
+
53
+ - `title`
54
+ - `summary` (2–4 sentences, concrete and non-hypey)
55
+ - `key_points` (max 3)
56
+ - `url` (canonical if possible)
57
+ - `source_id`
58
+ - `keywords` (2–6)
59
+ - `quality_score` (1–5, integer)
60
+
61
+ ## Collection workflow
62
+
63
+ ### 1) Initialize
64
+
65
+ - Load `sources.json` → treat it as the source of truth.
66
+ - Load `cache.json` → use it for dedupe and stats.
67
+ - Create `NewsReport/` if missing.
68
+ - If `NewsReport/YYYY-MM-DD-news-report.md` already exists, either:
69
+ - regenerate from scratch (preferred), or
70
+ - append only if explicitly requested.
71
+
72
+ ### 2) Fetch in waves (early stop)
73
+
74
+ Follow the tier order in `sources.json`:
75
+
76
+ - **Wave A (Tier 1 / batch_a + batch_b)**: high hit-rate sources first.
77
+ - If you still have fewer than ~15 included items after filtering, continue.
78
+ - **Wave B (Tier 2 / batch_a + batch_b)**: supplemental sources.
79
+ - If you still have fewer than `target_items`, continue.
80
+ - **Wave C (Tier 3 / browser sources)**: JS-rendered / blocked sources.
81
+
82
+ Stop fetching when you have:
83
+
84
+ - at least `target_items` included items, and
85
+ - at least `quality_thresholds.early_stop_threshold` total candidates evaluated (default 25), or you have exhausted all enabled sources.
86
+
87
+ ### 3) Extract and normalize
88
+
89
+ For each enabled source entry:
90
+
91
+ - Fetch the page content using the configured `fetch_method`:
92
+ - `webfetch`: normal HTTP fetch.
93
+ - `browser`: render with a headless browser when available; otherwise skip with a recorded error.
94
+ - Apply the `extract` hint from the source entry (examples: `top_10`, `latest_5`, `latest_issue`, `today_top_5`).
95
+ - For each candidate item, normalize:
96
+ - clean title (no site suffix noise)
97
+ - canonical URL (strip tracking params when safe)
98
+ - short summary + key points
99
+
100
+ **RSS-first rule (important):**
101
+
102
+ - For RSS sources, **do not** `web_fetch` the item URLs.
103
+ - Use the RSS item's title + description/summary as the source of truth.
104
+ - If the RSS description is too thin to summarize, either:
105
+ - drop the item, or
106
+ - keep it with a one-sentence, non-speculative summary based only on the RSS description.
107
+ - Only fetch item URLs if the source entry explicitly says `extract: fetch_items` (none do by default).
108
+
109
+ If a `webfetch` attempt fails:
110
+
111
+ - retry once (respect `fetch_config.webfetch.timeout_ms`)
112
+ - then mark the source as failed and continue (do not abort the whole report)
113
+
114
+ ### 4) Filter, score, and dedupe
115
+
116
+ Apply these rules in order:
117
+
118
+ 1. Reject obvious low-signal items (marketing fluff, generic science, job posts, thin announcements).
119
+ 2. Score each remaining item (`quality_score` 1–5) with a consistent rubric:
120
+ - 5: deeply useful + specific + actionable/insightful
121
+ - 4: strong signal, worth reading
122
+ - 3: decent, include only if you need more items
123
+ - 1–2: exclude
124
+ 3. Deduplicate:
125
+ - exact URL match (including `cache.json:url_cache`)
126
+ - near-duplicate title (treat ~80% similarity as duplicate; keep the higher-scored one)
127
+ - optional content hash match (when you have the full text)
128
+
129
+ ### 5) Select and sort
130
+
131
+ - Keep only items with `quality_score >= min_score_to_include`.
132
+ - Sort by `quality_score` descending.
133
+ - Break ties by source credibility (Tier 1 > Tier 2 > Tier 3) and recency.
134
+ - Take the top `target_items`.
135
+
136
+ ## Markdown template
137
+
138
+ Use this structure:
139
+
140
+ ```markdown
141
+ # Daily News Report (YYYY-MM-DD)
142
+
143
+ > Sources used: N | Candidates evaluated: M | Included: K
144
+ > Generated at: <local timestamp> | Skill: sophnet-dailynews
145
+
146
+ ---
147
+
148
+ ## 1. <Title>
149
+
150
+ - **Summary**: ...
151
+ - **Key Points**:
152
+ 1. ...
153
+ 2. ...
154
+ 3. ...
155
+ - **Source**: <source_id> — <url>
156
+ - **Keywords**: `k1` `k2` `k3`
157
+ - **Score**: 4/5
158
+ ```
159
+
160
+ ## Cache update rules (`cache.json`)
161
+
162
+ Update these fields every run:
163
+
164
+ - `last_run`: date, duration, items_collected, items_published, sources_used
165
+ - `source_stats[source_id]`: total_fetches, success_count, avg_items_per_fetch, avg_quality_score, last_fetch, last_success
166
+ - `url_cache.entries`: add included URLs (store timestamps; respect `_ttl_hours`)
167
+ - `content_hashes.entries`: add hashes when available (respect `_ttl_hours`)
168
+ - `article_history[YYYY-MM-DD]`: record the final included item list (at minimum: title + url + source_id + score)
169
+
170
+ ## Editing sources (`sources.json`)
171
+
172
+ - Disable a flaky/low-quality source by setting `enabled: false` or moving it to `disabled`.
173
+ - Prefer fixing extraction hints before adding new sources.
174
+ - Keep Tier 1 small and high-signal; use Tier 2 for "fill".
175
+
176
+ ## Failure handling
177
+
178
+ - If a source 403s on `webfetch`, try `browser` (if available) or skip and record the error.
179
+ - If all enabled sources fail, still write a report header and an explicit "no items" section; do not silently succeed.
@@ -0,0 +1,151 @@
1
+ {
2
+ "schema_version": "1.0",
3
+ "description": "Daily News Report 缓存文件,用于避免重复抓取和跟踪历史表现",
4
+
5
+ "last_run": {
6
+ "date": "2026-02-09",
7
+ "duration_seconds": 30,
8
+ "items_collected": 3,
9
+ "items_published": 3,
10
+ "sources_used": ["fs_blog", "hackernoon_pm"]
11
+ },
12
+
13
+ "source_stats": {
14
+ "_comment": "记录每个源的历史表现,用于动态调整优先级",
15
+ "hn": {
16
+ "total_fetches": 2,
17
+ "success_count": 0,
18
+ "avg_items_per_fetch": 0,
19
+ "avg_quality_score": 0,
20
+ "last_fetch": "2026-02-09T04:44:19Z",
21
+ "last_success": null,
22
+ "last_error": "fetch failed"
23
+ },
24
+ "hf_papers": {
25
+ "total_fetches": 2,
26
+ "success_count": 1,
27
+ "avg_items_per_fetch": 0,
28
+ "avg_quality_score": 0,
29
+ "last_fetch": "2026-02-09T04:44:19Z",
30
+ "last_success": "2026-02-09T04:44:19Z",
31
+ "last_error": null,
32
+ "note": "No new papers for 2026-02-09 date page"
33
+ },
34
+ "one_useful_thing": {
35
+ "total_fetches": 2,
36
+ "success_count": 1,
37
+ "avg_items_per_fetch": 0,
38
+ "avg_quality_score": 0,
39
+ "last_fetch": "2026-02-09T04:44:24Z",
40
+ "last_success": "2026-02-09T04:44:24Z",
41
+ "last_error": null,
42
+ "note": "Landing page only, newsletter content not accessible"
43
+ },
44
+ "paul_graham": {
45
+ "total_fetches": 2,
46
+ "success_count": 1,
47
+ "avg_items_per_fetch": 0,
48
+ "avg_quality_score": 0,
49
+ "last_fetch": "2026-02-09T04:44:26Z",
50
+ "last_success": "2026-02-09T04:44:26Z",
51
+ "last_error": null,
52
+ "note": "Minimal content returned from articles page"
53
+ },
54
+ "james_clear": {
55
+ "total_fetches": 2,
56
+ "success_count": 1,
57
+ "avg_items_per_fetch": 0,
58
+ "avg_quality_score": 0,
59
+ "last_fetch": "2026-02-09T04:44:32Z",
60
+ "last_success": "2026-02-09T04:44:32Z",
61
+ "last_error": null,
62
+ "note": "Main site only, newsletter requires email signup"
63
+ },
64
+ "fs_blog": {
65
+ "total_fetches": 3,
66
+ "success_count": 3,
67
+ "avg_items_per_fetch": 1.0,
68
+ "avg_quality_score": 5.0,
69
+ "last_fetch": "2026-02-09T04:44:38Z",
70
+ "last_success": "2026-02-09T04:44:38Z",
71
+ "last_error": null
72
+ },
73
+ "hackernoon_pm": {
74
+ "total_fetches": 3,
75
+ "success_count": 3,
76
+ "avg_items_per_fetch": 1.0,
77
+ "avg_quality_score": 4.0,
78
+ "last_fetch": "2026-02-09T04:44:43Z",
79
+ "last_success": "2026-02-09T04:44:43Z",
80
+ "last_error": null,
81
+ "note": "Category page fetched, extracted 2 high-quality articles"
82
+ },
83
+ "scotthyoung": {
84
+ "total_fetches": 2,
85
+ "success_count": 1,
86
+ "avg_items_per_fetch": 0,
87
+ "avg_quality_score": 0,
88
+ "last_fetch": "2026-02-09T04:44:48Z",
89
+ "last_success": "2026-02-09T04:44:48Z",
90
+ "last_error": null,
91
+ "note": "Articles page only, book and course promo without article links"
92
+ }
93
+ },
94
+
95
+ "url_cache": {
96
+ "_comment": "已处理的 URL 缓存,避免重复收录",
97
+ "_ttl_hours": 168,
98
+ "entries": {
99
+ "https://fs.blog/brain-food/january-25-2026/": {
100
+ "timestamp": "2026-02-09T04:44:38Z",
101
+ "title": "The Spectrum of Independence"
102
+ },
103
+ "https://hackernoon.com/10-proven-ways-to-reduce-misalignment-between-stakeholders-in-product-teams": {
104
+ "timestamp": "2026-02-09T04:44:43Z",
105
+ "title": "10 Proven Ways to Reduce Misalignment Between Stakeholders in Product Teams"
106
+ },
107
+ "https://hackernoon.com/why-good-products-feel-broken": {
108
+ "timestamp": "2026-02-09T04:44:43Z",
109
+ "title": "Why Good Products Feel Broken"
110
+ }
111
+ }
112
+ },
113
+
114
+ "content_hashes": {
115
+ "_comment": "内容指纹,用于去重",
116
+ "_ttl_hours": 168,
117
+ "entries": {}
118
+ },
119
+
120
+ "article_history": {
121
+ "_comment": "已收录文章的简要记录",
122
+ "2026-02-07": [
123
+ {
124
+ "title": "The Spectrum of Independence",
125
+ "url": "https://fs.blog/brain-food/january-25-2026/",
126
+ "source_id": "fs_blog",
127
+ "score": 5
128
+ }
129
+ ],
130
+ "2026-02-09": [
131
+ {
132
+ "title": "The Spectrum of Independence",
133
+ "url": "https://fs.blog/brain-food/january-25-2026/",
134
+ "source_id": "fs_blog",
135
+ "score": 5
136
+ },
137
+ {
138
+ "title": "10 Proven Ways to Reduce Misalignment Between Stakeholders in Product Teams",
139
+ "url": "https://hackernoon.com/10-proven-ways-to-reduce-misalignment-between-stakeholders-in-product-teams",
140
+ "source_id": "hackernoon_pm",
141
+ "score": 4
142
+ },
143
+ {
144
+ "title": "Why Good Products Feel Broken",
145
+ "url": "https://hackernoon.com/why-good-products-feel-broken",
146
+ "source_id": "hackernoon_pm",
147
+ "score": 4
148
+ }
149
+ ]
150
+ }
151
+ }
@@ -0,0 +1,230 @@
1
+ {
2
+ "version": "2.2",
3
+ "last_updated": "2026-02-09",
4
+
5
+ "sources": {
6
+ "tier1": {
7
+ "description": "中国大陆可直连的高信号 RSS 源",
8
+ "batch_a": [
9
+ {
10
+ "id": "ithome",
11
+ "name": "IT之家",
12
+ "url": "https://www.ithome.com/rss/",
13
+ "fetch_method": "webfetch",
14
+ "extract": "top_10_rss",
15
+ "enabled": true,
16
+ "avg_quality": 4.2,
17
+ "success_rate": 0.95
18
+ },
19
+ {
20
+ "id": "kr36",
21
+ "name": "36氪",
22
+ "url": "https://36kr.com/feed",
23
+ "fetch_method": "webfetch",
24
+ "extract": "top_10_rss",
25
+ "enabled": true,
26
+ "avg_quality": 4.3,
27
+ "success_rate": 0.94
28
+ }
29
+ ],
30
+ "batch_b": [
31
+ {
32
+ "id": "jiqizhixin",
33
+ "name": "机器之心",
34
+ "url": "https://www.jiqizhixin.com/rss",
35
+ "fetch_method": "webfetch",
36
+ "extract": "top_10_rss",
37
+ "enabled": true,
38
+ "avg_quality": 4.4,
39
+ "success_rate": 0.92
40
+ },
41
+ {
42
+ "id": "leiphone",
43
+ "name": "雷峰网",
44
+ "url": "https://www.leiphone.com/feed",
45
+ "fetch_method": "webfetch",
46
+ "extract": "top_10_rss",
47
+ "enabled": true,
48
+ "avg_quality": 4.1,
49
+ "success_rate": 0.90
50
+ }
51
+ ]
52
+ },
53
+
54
+ "tier2": {
55
+ "description": "补充覆盖面(资讯/国际/生活方式)",
56
+ "batch_a": [
57
+ {
58
+ "id": "sspai",
59
+ "name": "少数派",
60
+ "url": "https://sspai.com/feed",
61
+ "fetch_method": "webfetch",
62
+ "extract": "top_10_rss",
63
+ "enabled": true,
64
+ "avg_quality": 4.0,
65
+ "success_rate": 0.90
66
+ },
67
+ {
68
+ "id": "chinadaily_china",
69
+ "name": "China Daily - China",
70
+ "url": "https://www.chinadaily.com.cn/rss/china_rss.xml",
71
+ "fetch_method": "webfetch",
72
+ "extract": "top_10_rss",
73
+ "enabled": true,
74
+ "avg_quality": 3.8,
75
+ "success_rate": 0.88
76
+ }
77
+ ],
78
+ "batch_b": [
79
+ {
80
+ "id": "chinadaily_world",
81
+ "name": "China Daily - World",
82
+ "url": "https://www.chinadaily.com.cn/rss/world_rss.xml",
83
+ "fetch_method": "webfetch",
84
+ "extract": "top_10_rss",
85
+ "enabled": true,
86
+ "avg_quality": 3.8,
87
+ "success_rate": 0.88
88
+ },
89
+ {
90
+ "id": "chinadaily_sports",
91
+ "name": "China Daily - Sports",
92
+ "url": "https://www.chinadaily.com.cn/rss/sports_rss.xml",
93
+ "fetch_method": "webfetch",
94
+ "extract": "top_10_rss",
95
+ "enabled": true,
96
+ "avg_quality": 3.6,
97
+ "success_rate": 0.88
98
+ }
99
+ ]
100
+ },
101
+
102
+ "tier3_browser": {
103
+ "description": "JS 渲染源(当前禁用,避免浏览器依赖)",
104
+ "sources": []
105
+ },
106
+
107
+ "disabled": {
108
+ "description": "已禁用的源(海外/反爬/提取不稳定)",
109
+ "sources": [
110
+ {
111
+ "id": "hn",
112
+ "name": "Hacker News",
113
+ "url": "https://news.ycombinator.com/rss",
114
+ "reason": "海外源在中国大陆不稳定/被阻断",
115
+ "disabled_date": "2026-02-09"
116
+ },
117
+ {
118
+ "id": "hf_papers",
119
+ "name": "HuggingFace Papers",
120
+ "url": "https://huggingface.co/papers/date/{{date}}",
121
+ "reason": "海外源 + 页面提取不稳定",
122
+ "disabled_date": "2026-02-09"
123
+ },
124
+ {
125
+ "id": "one_useful_thing",
126
+ "name": "One Useful Thing",
127
+ "url": "https://www.oneusefulthing.org",
128
+ "reason": "海外源 + Substack 结构影响提取",
129
+ "disabled_date": "2026-02-09"
130
+ },
131
+ {
132
+ "id": "paul_graham",
133
+ "name": "Paul Graham Essays",
134
+ "url": "https://paulgraham.com/articles.html",
135
+ "reason": "海外源 + 提取不稳定",
136
+ "disabled_date": "2026-02-09"
137
+ },
138
+ {
139
+ "id": "james_clear",
140
+ "name": "James Clear 3-2-1",
141
+ "url": "https://jamesclear.com/3-2-1",
142
+ "reason": "海外源 + newsletter 需要订阅",
143
+ "disabled_date": "2026-02-09"
144
+ },
145
+ {
146
+ "id": "fs_blog",
147
+ "name": "Farnam Street Brain Food",
148
+ "url": "https://fs.blog/brain-food",
149
+ "reason": "海外源 + 提取不稳定",
150
+ "disabled_date": "2026-02-09"
151
+ },
152
+ {
153
+ "id": "hackernoon_pm",
154
+ "name": "HackerNoon PM",
155
+ "url": "https://hackernoon.com/c/product-management",
156
+ "reason": "海外源 + 提取不稳定",
157
+ "disabled_date": "2026-02-09"
158
+ },
159
+ {
160
+ "id": "scotthyoung",
161
+ "name": "Scott Young Blog",
162
+ "url": "https://scotthyoung.com/blog/articles",
163
+ "reason": "海外源 + 提取不稳定",
164
+ "disabled_date": "2026-02-09"
165
+ },
166
+ {
167
+ "id": "producthunt",
168
+ "name": "Product Hunt",
169
+ "url": "https://www.producthunt.com",
170
+ "reason": "需要浏览器渲染",
171
+ "disabled_date": "2026-02-09"
172
+ },
173
+ {
174
+ "id": "latent_space",
175
+ "name": "Latent Space",
176
+ "url": "https://www.latent.space",
177
+ "reason": "Substack 需要 JS 渲染",
178
+ "disabled_date": "2026-02-09"
179
+ },
180
+ {
181
+ "id": "tldr_ai",
182
+ "name": "TLDR AI",
183
+ "url": "https://tldr.tech/ai",
184
+ "reason": "订阅页面,无文章列表",
185
+ "disabled_date": "2026-01-21"
186
+ },
187
+ {
188
+ "id": "bensbites",
189
+ "name": "Ben's Bites",
190
+ "url": "https://bensbites.com/archive",
191
+ "reason": "需要登录/付费墙",
192
+ "disabled_date": "2026-01-21"
193
+ },
194
+ {
195
+ "id": "interconnects",
196
+ "name": "Interconnects AI",
197
+ "url": "https://interconnects.ai",
198
+ "reason": "内容提取失败,Substack 结构问题",
199
+ "disabled_date": "2026-01-21"
200
+ },
201
+ {
202
+ "id": "beehiiv_rss",
203
+ "name": "Beehiiv RSS feeds",
204
+ "url": "https://rss.beehiiv.com",
205
+ "reason": "RSS 抓取困难",
206
+ "disabled_date": "2026-01-21"
207
+ }
208
+ ]
209
+ }
210
+ },
211
+
212
+ "fetch_config": {
213
+ "webfetch": {
214
+ "timeout_ms": 30000,
215
+ "retry_count": 1,
216
+ "cache_ttl_minutes": 60
217
+ },
218
+ "browser": {
219
+ "timeout_ms": 45000,
220
+ "wait_for_selector": "article, .post, .item",
221
+ "screenshot_on_error": true
222
+ }
223
+ },
224
+
225
+ "quality_thresholds": {
226
+ "min_score_to_include": 3,
227
+ "target_items": 20,
228
+ "early_stop_threshold": 25
229
+ }
230
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "sophnet-schedule",
3
+ "version": "1.0.0",
4
+ "types": [
5
+ "store"
6
+ ],
7
+ "displayName": "日程管理助手",
8
+ "description": "支持本地托底与 Google Calendar 接入的日程管理 skill",
9
+ "changelog": [
10
+ {
11
+ "version": "1.0.0",
12
+ "date": "2026-04-14",
13
+ "changes": [
14
+ "初次提交"
15
+ ]
16
+ }
17
+ ],
18
+ "createdAt": "2026-04-14",
19
+ "updatedAt": "2026-04-14"
20
+ }