sophhub 0.4.19 → 0.4.21

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 (633) hide show
  1. package/README.md +199 -187
  2. package/agents/ai-cs-admin/.config.json +51 -51
  3. package/agents/ai-cs-admin/AGENTS.md +293 -293
  4. package/agents/ai-cs-admin/HEARTBEAT.md +18 -18
  5. package/agents/ai-cs-qa/.config.json +47 -47
  6. package/agents/ai-cs-qa/BOOTSTRAP.md +22 -22
  7. package/agents/ai-cs-qa/scripts/setup_links.sh +39 -39
  8. package/agents/beauty/.config.json +17 -17
  9. package/agents/beauty/AGENTS.md +234 -234
  10. package/agents/beauty/BOOTSTRAP.md +55 -55
  11. package/agents/beauty/HEARTBEAT.md +5 -5
  12. package/agents/beauty/IDENTITY.md +5 -5
  13. package/agents/beauty/MEMORY.md +44 -44
  14. package/agents/beauty/SOUL.md +64 -64
  15. package/agents/beauty/TOOLS.md +160 -160
  16. package/agents/beauty/USER.md +114 -114
  17. package/agents/intern-admin/.config.json +60 -60
  18. package/agents/intern-admin/AGENTS.md +267 -267
  19. package/agents/intern-admin/BOOTSTRAP.md +21 -21
  20. package/agents/intern-admin/HEARTBEAT.md +3 -3
  21. package/agents/intern-admin/IDENTITY.md +6 -6
  22. package/agents/intern-admin/MEMORY.md +21 -21
  23. package/agents/intern-admin/SOUL.md +23 -23
  24. package/agents/intern-admin/TOOLS.md +93 -93
  25. package/agents/intern-admin/USER.md +16 -16
  26. package/agents/intern-admin/scripts/init_workspace.sh +27 -27
  27. package/agents/intern-qa/.config.json +46 -46
  28. package/agents/intern-qa/AGENTS.md +303 -303
  29. package/agents/intern-qa/BOOTSTRAP.md +16 -16
  30. package/agents/intern-qa/HEARTBEAT.md +3 -3
  31. package/agents/intern-qa/IDENTITY.md +6 -6
  32. package/agents/intern-qa/MEMORY.md +22 -22
  33. package/agents/intern-qa/SOUL.md +24 -24
  34. package/agents/intern-qa/TOOLS.md +24 -24
  35. package/agents/intern-qa/USER.md +27 -27
  36. package/agents/intern-qa/scripts/setup_links.sh +54 -54
  37. package/agents/parent-toddler/.config.json +37 -37
  38. package/agents/parent-toddler/AGENTS.md +51 -51
  39. package/agents/parent-toddler/BOOTSTRAP.md +55 -55
  40. package/agents/parent-toddler/HEARTBEAT.md +5 -5
  41. package/agents/parent-toddler/IDENTITY.md +5 -5
  42. package/agents/parent-toddler/MEMORY.md +22 -22
  43. package/agents/parent-toddler/SOUL.md +35 -35
  44. package/agents/parent-toddler/TOOLS.md +31 -31
  45. package/agents/parent-toddler/USER.md +44 -44
  46. package/agents/vip-admin/.config.json +51 -51
  47. package/agents/vip-admin/AGENTS.md +314 -314
  48. package/agents/vip-admin/BOOTSTRAP.md +21 -21
  49. package/agents/vip-admin/HEARTBEAT.md +19 -19
  50. package/agents/vip-admin/IDENTITY.md +6 -6
  51. package/agents/vip-admin/MEMORY.md +30 -30
  52. package/agents/vip-admin/SOUL.md +25 -25
  53. package/agents/vip-admin/TOOLS.md +108 -108
  54. package/agents/vip-admin/USER.md +31 -31
  55. package/agents/vip-qa/.config.json +58 -58
  56. package/agents/vip-qa/AGENTS.md +319 -319
  57. package/agents/vip-qa/BOOTSTRAP.md +73 -73
  58. package/agents/vip-qa/HEARTBEAT.md +23 -23
  59. package/agents/vip-qa/IDENTITY.md +7 -7
  60. package/agents/vip-qa/MEMORY.md +23 -23
  61. package/agents/vip-qa/SOUL.md +34 -34
  62. package/agents/vip-qa/TOOLS.md +41 -41
  63. package/agents/vip-qa/USER.md +16 -16
  64. package/agents/vip-qa/scripts/setup_links.sh +39 -39
  65. package/bin/sophhub.js +25 -25
  66. package/package.json +35 -33
  67. package/skills/agent-install/skill.json +34 -34
  68. package/skills/agent-install/src/SKILL.md +240 -240
  69. package/skills/agent-install/src/pyproject.toml +6 -6
  70. package/skills/agent-install/src/scripts/backup_agent.py +120 -120
  71. package/skills/agent-install/src/scripts/check_installed.py +479 -479
  72. package/skills/agent-install/src/scripts/common.py +568 -568
  73. package/skills/agent-install/src/scripts/copy_agent_files.py +59 -59
  74. package/skills/agent-install/src/scripts/list_agents.py +285 -285
  75. package/skills/agent-install/src/scripts/resolve_install_params.py +90 -90
  76. package/skills/agent-install/src/scripts/update_agent_md.py +76 -76
  77. package/skills/agent-install/src/scripts/update_openclaw.py +193 -193
  78. package/skills/agent-install/src/scripts/verify_download.py +148 -148
  79. package/skills/aippt/skill.json +20 -20
  80. package/skills/aippt/src/SKILL.md +235 -235
  81. package/skills/aippt/src/pyproject.toml +8 -8
  82. package/skills/aippt/src/scripts/auth.py +122 -122
  83. package/skills/aippt/src/scripts/ppt.py +361 -361
  84. package/skills/aippt/src/scripts/provider_docmee.py +299 -299
  85. package/skills/beauty-salon-inventory/skill.json +16 -16
  86. package/skills/beauty-salon-inventory/src/SKILL.md +69 -69
  87. package/skills/beauty-salon-inventory/src/scripts/init_salon_inventory.py +39 -39
  88. package/skills/beauty-salon-inventory/src/scripts/init_salon_inventory.sh +4 -4
  89. package/skills/beauty-salon-inventory/src/scripts/salon_inventory_cli.py +244 -244
  90. package/skills/beauty-salon-marketing/skill.json +10 -10
  91. package/skills/beauty-salon-marketing/src/SKILL.md +36 -36
  92. package/skills/beauty-salon-marketing/src/playbooks/beauty-salon-festival.md +19 -19
  93. package/skills/beauty-salon-marketing/src/playbooks/beauty-salon-segment.md +18 -18
  94. package/skills/beauty-salon-marketing/src/scripts/beauty_marketing_cli.py +99 -99
  95. package/skills/beauty-salon-marketing/src/scripts/member_segment.py +114 -114
  96. package/skills/beauty-salon-member-appointment/skill.json +10 -10
  97. package/skills/beauty-salon-member-appointment/src/SKILL.md +36 -36
  98. package/skills/beauty-salon-member-appointment/src/pyproject.toml +9 -9
  99. package/skills/beauty-salon-member-appointment/src/scripts/run_e2e_smoke.py +160 -160
  100. package/skills/beauty-salon-member-appointment/src/src/member_appt_cli/__init__.py +1 -1
  101. package/skills/beauty-salon-member-appointment/src/src/member_appt_cli/__main__.py +4 -4
  102. package/skills/beauty-salon-member-appointment/src/src/member_appt_cli/cli.py +921 -921
  103. package/skills/beauty-salon-member-appointment/src/src/member_appt_cli/db.py +30 -30
  104. package/skills/beauty-salon-membership/skill.json +20 -20
  105. package/skills/beauty-salon-membership/src/SKILL.md +67 -67
  106. package/skills/beauty-salon-product-service/skill.json +12 -12
  107. package/skills/beauty-salon-product-service/src/SKILL.md +42 -42
  108. package/skills/beauty-salon-product-service/src/pyproject.toml +9 -9
  109. package/skills/beauty-salon-product-service/src/src/product_service_cli/__init__.py +1 -1
  110. package/skills/beauty-salon-product-service/src/src/product_service_cli/__main__.py +4 -4
  111. package/skills/beauty-salon-product-service/src/src/product_service_cli/cli.py +329 -329
  112. package/skills/beauty-salon-product-service/src/src/product_service_cli/db.py +29 -29
  113. package/skills/beauty-salon-staff/skill.json +10 -10
  114. package/skills/beauty-salon-staff/src/SKILL.md +37 -37
  115. package/skills/beauty-salon-staff/src/pyproject.toml +9 -9
  116. package/skills/beauty-salon-staff/src/src/staff_cli/__init__.py +1 -1
  117. package/skills/beauty-salon-staff/src/src/staff_cli/__main__.py +4 -4
  118. package/skills/beauty-salon-staff/src/src/staff_cli/cli.py +479 -479
  119. package/skills/beauty-salon-staff/src/src/staff_cli/db.py +28 -28
  120. package/skills/beauty-salon-suite/skill.json +13 -13
  121. package/skills/beauty-salon-suite/src/SKILL.md +18 -18
  122. package/skills/beauty-salon-suite/src/beauty_db/__init__.py +2 -2
  123. package/skills/beauty-salon-suite/src/beauty_db/db.py +249 -249
  124. package/skills/beauty-salon-traffic/skill.json +20 -20
  125. package/skills/beauty-salon-traffic/src/SKILL.md +84 -84
  126. package/skills/bing-image-search/skill.json +20 -20
  127. package/skills/bing-image-search/src/SKILL.md +105 -105
  128. package/skills/bot-api-status/skill.json +44 -44
  129. package/skills/bot-api-status/src/SKILL.md +99 -99
  130. package/skills/bot-api-status/src/pyproject.toml +5 -5
  131. package/skills/bot-api-status/src/scripts/secret.py +496 -496
  132. package/skills/bot-secret/skill.json +35 -35
  133. package/skills/bot-secret/src/SKILL.md +51 -51
  134. package/skills/bot-secret/src/pyproject.toml +5 -5
  135. package/skills/bot-secret/src/scripts/secret.py +120 -120
  136. package/skills/cake-flower-holiday-campaign/skill.json +20 -20
  137. package/skills/cake-flower-holiday-campaign/src/SKILL.md +68 -68
  138. package/skills/cake-flower-order-sop/skill.json +20 -20
  139. package/skills/cake-flower-order-sop/src/SKILL.md +65 -65
  140. package/skills/claw-agent-get-send/skill.json +32 -32
  141. package/skills/claw-agent-get-send/src/SKILL.md +43 -43
  142. package/skills/claw-agent-get-send/src/pyproject.toml +5 -5
  143. package/skills/claw-agent-get-send/src/scripts/appia_claw.py +379 -379
  144. package/skills/compact-context/skill.json +20 -20
  145. package/skills/compact-context/src/SKILL.md +133 -133
  146. package/skills/compact-context/src/scripts/check.sh +381 -381
  147. package/skills/compact-context/src/scripts/set-keep-recent.mjs +1337 -1337
  148. package/skills/compact-context/src/scripts/setup.sh +96 -96
  149. package/skills/consensus/skill.json +20 -20
  150. package/skills/consensus/src/SKILL.md +93 -93
  151. package/skills/deepwiki/skill.json +20 -20
  152. package/skills/deepwiki/src/SKILL.md +45 -45
  153. package/skills/deepwiki/src/_meta.json +5 -5
  154. package/skills/deepwiki/src/scripts/deepwiki.js +135 -135
  155. package/skills/didi-ride/skill.json +20 -20
  156. package/skills/didi-ride/src/SKILL.md +309 -309
  157. package/skills/didi-ride/src/_meta.json +5 -5
  158. package/skills/didi-ride/src/assets/PREFERENCE.md +58 -58
  159. package/skills/didi-ride/src/package.json +15 -15
  160. package/skills/didi-ride/src/references/api_references.md +171 -171
  161. package/skills/didi-ride/src/references/error_handling.md +68 -68
  162. package/skills/didi-ride/src/references/setup.md +73 -73
  163. package/skills/didi-ride/src/references/workflow.md +150 -150
  164. package/skills/feishu-bitable/skill.json +20 -20
  165. package/skills/feishu-bitable/src/CHECKLIST.md +149 -149
  166. package/skills/feishu-bitable/src/README.md +177 -177
  167. package/skills/feishu-bitable/src/SKILL.md +113 -113
  168. package/skills/feishu-bitable/src/_meta.json +5 -5
  169. package/skills/feishu-bitable/src/api.js +380 -380
  170. package/skills/feishu-bitable/src/bin/cli.js +283 -283
  171. package/skills/feishu-bitable/src/description.md +142 -142
  172. package/skills/feishu-bitable/src/examples/create-records.json +51 -51
  173. package/skills/feishu-bitable/src/examples/create-table.json +63 -63
  174. package/skills/feishu-bitable/src/package-lock.json +324 -324
  175. package/skills/feishu-bitable/src/package.json +32 -32
  176. package/skills/feishu-bitable/src/publish-config.json +13 -13
  177. package/skills/feishu-bitable/src/test-simple.js +60 -60
  178. package/skills/feishu-bitable/src/utils.js +260 -260
  179. package/skills/feishu-notes-assistant-universal/skill.json +20 -20
  180. package/skills/feishu-notes-assistant-universal/src/README.md +55 -55
  181. package/skills/feishu-notes-assistant-universal/src/SKILL.md +159 -159
  182. package/skills/feishu-notes-assistant-universal/src/scripts/_resolve_lark_cli.py +58 -58
  183. package/skills/feishu-notes-assistant-universal/src/scripts/openclaw_meeting_minutes.py +462 -462
  184. package/skills/feishu-notes-assistant-universal/src/scripts/openclaw_notes_crud.py +547 -547
  185. package/skills/feishu-notes-assistant-universal/src/scripts/openclaw_notes_crud_test.py +181 -181
  186. package/skills/feishu-notes-assistant-universal/src/scripts/run_meeting_minutes.py +80 -80
  187. package/skills/feishu-notes-assistant-universal/src/scripts/run_meeting_minutes.sh +5 -5
  188. package/skills/feishu-notes-assistant-universal/src/scripts/run_note_crud.py +32 -32
  189. package/skills/feishu-notes-assistant-universal/src/scripts/run_note_crud.sh +5 -5
  190. package/skills/flight-booking/skill.json +36 -36
  191. package/skills/flight-booking/src/SKILL.md +288 -288
  192. package/skills/flight-booking/src/scripts/flight_booking.py +1237 -1237
  193. package/skills/flyai/skill.json +20 -20
  194. package/skills/flyai/src/SKILL.md +119 -119
  195. package/skills/flyai/src/references/fliggy-fast-search.md +53 -53
  196. package/skills/flyai/src/references/search-flight.md +89 -89
  197. package/skills/flyai/src/references/search-hotels.md +57 -57
  198. package/skills/flyai/src/references/search-poi.md +48 -48
  199. package/skills/google-maps/skill.json +20 -20
  200. package/skills/google-maps/src/SKILL.md +237 -237
  201. package/skills/google-maps/src/_meta.json +5 -5
  202. package/skills/google-maps/src/lib/map_helper.py +912 -912
  203. package/skills/image-classify/skill.json +42 -42
  204. package/skills/image-classify/src/SKILL.md +368 -368
  205. package/skills/image-classify/src/references/config.json +4 -4
  206. package/skills/image-classify/src/scripts/face_search.py +1276 -1276
  207. package/skills/image-description/skill.json +34 -34
  208. package/skills/image-description/src/SKILL.md +33 -33
  209. package/skills/image-description/src/pyproject.toml +8 -8
  210. package/skills/image-description/src/scripts/ana_image.py +112 -112
  211. package/skills/image-identify-world/skill.json +20 -20
  212. package/skills/image-identify-world/src/SKILL.md +40 -40
  213. package/skills/image-identify-world/src/pyproject.toml +8 -8
  214. package/skills/image-identify-world/src/scripts/identify_world.py +115 -115
  215. package/skills/insurance-policy-review/skill.json +27 -27
  216. package/skills/insurance-policy-review/src/SKILL.md +75 -75
  217. package/skills/insurance-sales-playbook/skill.json +20 -20
  218. package/skills/insurance-sales-playbook/src/SKILL.md +58 -58
  219. package/skills/inventory-management/skill.json +20 -20
  220. package/skills/inventory-management/src/SKILL.md +241 -241
  221. package/skills/inventory-management/src/scripts/inventory.py +1844 -1844
  222. package/skills/large-task-router/skill.json +20 -20
  223. package/skills/large-task-router/src/SKILL.md +79 -79
  224. package/skills/large-task-router/src/templates/plan.md +74 -74
  225. package/skills/lawding-contract-review/skill.json +20 -20
  226. package/skills/lawding-contract-review/src/SKILL.md +284 -284
  227. package/skills/lawding-contract-review/src/references/legal-language-library.md +1385 -1385
  228. package/skills/lawding-contract-review/src/scripts/build_reminders.py +471 -471
  229. package/skills/lawding-contract-review/src/scripts/register_contract_cron.py +457 -457
  230. package/skills/md2pdf-converter/skill.json +20 -20
  231. package/skills/md2pdf-converter/src/SKILL.md +244 -244
  232. package/skills/md2pdf-converter/src/_meta.json +5 -5
  233. package/skills/md2pdf-converter/src/scripts/generate_emoji_mapping.py +74 -74
  234. package/skills/md2pdf-converter/src/scripts/md2pdf-local.sh +291 -291
  235. package/skills/notes-hub-assistant/skill.json +20 -20
  236. package/skills/notes-hub-assistant/src/SKILL.md +233 -233
  237. package/skills/notes-hub-assistant/src/scripts/_resolve_lark_cli.py +48 -48
  238. package/skills/notes-hub-assistant/src/scripts/openclaw_meeting_minutes.py +473 -473
  239. package/skills/notes-hub-assistant/src/scripts/openclaw_notes_crud.py +596 -596
  240. package/skills/notes-hub-assistant/src/scripts/openclaw_wolai_notes_crud.py +364 -364
  241. package/skills/notes-hub-assistant/src/scripts/run_meeting_minutes.py +79 -79
  242. package/skills/notes-hub-assistant/src/scripts/run_note_crud.py +37 -37
  243. package/skills/notes-hub-assistant/src/scripts/run_notionbot.py +36 -36
  244. package/skills/notes-hub-assistant/src/scripts/run_wolai_note_crud.py +27 -27
  245. package/skills/schedule-reminder/skill.json +20 -20
  246. package/skills/schedule-reminder/src/SKILL.md +619 -619
  247. package/skills/schedule-reminder/src/schedule_template.md +68 -68
  248. package/skills/schedule-reminder/src/scripts/append_event.py +204 -204
  249. package/skills/schedule-reminder/src/scripts/create_reminders.sh +163 -163
  250. package/skills/schedule-reminder/src/scripts/daily_activate.sh +175 -175
  251. package/skills/schedule-reminder/src/scripts/parse_schedule.py +704 -704
  252. package/skills/schedule-reminder/src/scripts/setup.sh +242 -242
  253. package/skills/schedule-reminder/src//347/224/250/346/210/267/346/214/207/345/215/227.md +311 -311
  254. package/skills/sessions-analysis/skill.json +34 -34
  255. package/skills/sessions-analysis/src/SKILL.md +81 -81
  256. package/skills/sessions-analysis/src/pyproject.toml +5 -5
  257. package/skills/sessions-analysis/src/scripts/ana_logs.py +205 -205
  258. package/skills/share-skill/skill.json +20 -20
  259. package/skills/share-skill/src/SKILL.md +261 -261
  260. package/skills/share-skill/src/scripts/share_skill_to_friend.py +1031 -1031
  261. package/skills/skill-creator/skill.json +20 -20
  262. package/skills/skill-creator/src/SKILL.md +370 -370
  263. package/skills/skill-creator/src/license.txt +202 -202
  264. package/skills/skill-creator/src/scripts/init_skill.py +378 -378
  265. package/skills/skill-creator/src/scripts/package_skill.py +111 -111
  266. package/skills/skill-creator/src/scripts/quick_validate.py +101 -101
  267. package/skills/skillhub/skill.json +27 -27
  268. package/skills/skillhub/src/SKILL.md +121 -121
  269. package/skills/sophnet-age-appearance/skill.json +20 -20
  270. package/skills/sophnet-age-appearance/src/SKILL.md +83 -83
  271. package/skills/sophnet-age-appearance/src/pyproject.toml +10 -10
  272. package/skills/sophnet-age-appearance/src/scripts/age_appearance.py +395 -395
  273. package/skills/sophnet-age-appearance/src/scripts/age_face_crop.py +313 -313
  274. package/skills/sophnet-bot-client/skill.json +20 -20
  275. package/skills/sophnet-bot-client/src/SKILL.md +255 -255
  276. package/skills/sophnet-bot-client/src/pyproject.toml +13 -13
  277. package/skills/sophnet-bot-client/src/scripts/bot_client_proxy.py +165 -165
  278. package/skills/sophnet-bot-client/src/scripts/bot_client_safe.sh +29 -29
  279. package/skills/sophnet-bot-client/src/scripts/bot_client_setup.py +502 -502
  280. package/skills/sophnet-bot-client/src/tests/test_bot_client_proxy.py +255 -255
  281. package/skills/sophnet-bot-client/src/tests/test_bot_client_setup.py +679 -679
  282. package/skills/sophnet-bot-client/src/uv.lock +8 -8
  283. package/skills/sophnet-customer-management/skill.json +20 -20
  284. package/skills/sophnet-customer-management/src/SKILL.md +270 -270
  285. package/skills/sophnet-customer-management/src/pyproject.toml +15 -15
  286. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/__init__.py +2 -2
  287. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/__main__.py +5 -5
  288. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/cli.py +67 -67
  289. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/commands/__init__.py +2 -2
  290. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/commands/customer.py +60 -60
  291. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/commands/export_file.py +18 -18
  292. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/commands/import_file.py +15 -15
  293. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/commands/reminder.py +26 -26
  294. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/commands/schema.py +28 -28
  295. package/skills/sophnet-customer-management/src/src/customer_mgmt_cli/config.py +54 -54
  296. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/__init__.py +2 -2
  297. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/exporter.py +85 -85
  298. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/models.py +84 -84
  299. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/normalizer.py +144 -144
  300. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/parser.py +241 -241
  301. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/query.py +109 -109
  302. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/reminder.py +121 -121
  303. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/repository.py +397 -397
  304. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/schema.py +106 -106
  305. package/skills/sophnet-customer-management/src/src/customer_mgmt_core/service.py +565 -565
  306. package/skills/sophnet-customer-management/src/uv.lock +48 -48
  307. package/skills/sophnet-customized-marketing/skill.json +28 -28
  308. package/skills/sophnet-customized-marketing/src/SKILL.md +144 -144
  309. package/skills/sophnet-customized-marketing/src/playbooks/campaign-planning.md +187 -187
  310. package/skills/sophnet-customized-marketing/src/playbooks/content-generation.md +124 -124
  311. package/skills/sophnet-customized-marketing/src/playbooks/marketing-calendar.md +59 -59
  312. package/skills/sophnet-customized-marketing/src/playbooks/multi-channel-bundle.md +94 -94
  313. package/skills/sophnet-customized-marketing/src/playbooks/poster-generation.md +182 -182
  314. package/skills/sophnet-customized-marketing/src/playbooks/style-profile-workflow.md +103 -103
  315. package/skills/sophnet-customized-marketing/src/pyproject.toml +8 -8
  316. package/skills/sophnet-customized-marketing/src/references/campaign-mechanics.md +168 -168
  317. package/skills/sophnet-customized-marketing/src/references/content-safety.md +26 -26
  318. package/skills/sophnet-customized-marketing/src/references/marketing-date-checklist.md +99 -99
  319. package/skills/sophnet-customized-marketing/src/references/platform-writing-guidelines.md +88 -88
  320. package/skills/sophnet-customized-marketing/src/references/quality-checklist.md +44 -44
  321. package/skills/sophnet-customized-marketing/src/scripts/generate_poster.py +572 -572
  322. package/skills/sophnet-customized-marketing/src/scripts/style_profile.py +215 -215
  323. package/skills/sophnet-dailynews/skill.json +20 -20
  324. package/skills/sophnet-dailynews/src/SKILL.md +179 -179
  325. package/skills/sophnet-dailynews/src/cache.json +150 -150
  326. package/skills/sophnet-dailynews/src/sources.json +230 -230
  327. package/skills/sophnet-docx/skill.json +20 -20
  328. package/skills/sophnet-docx/src/SKILL.md +463 -463
  329. package/skills/sophnet-docx/src/package-lock.json +208 -208
  330. package/skills/sophnet-docx/src/package.json +16 -16
  331. package/skills/sophnet-docx/src/pyproject.toml +11 -11
  332. package/skills/sophnet-docx/src/scripts/__init__.py +1 -1
  333. package/skills/sophnet-docx/src/scripts/accept_changes.py +135 -135
  334. package/skills/sophnet-docx/src/scripts/comment.py +318 -318
  335. package/skills/sophnet-docx/src/scripts/ensure_uv_env.sh +68 -68
  336. package/skills/sophnet-docx/src/scripts/office/helpers/merge_runs.py +199 -199
  337. package/skills/sophnet-docx/src/scripts/office/helpers/simplify_redlines.py +197 -197
  338. package/skills/sophnet-docx/src/scripts/office/pack.py +159 -159
  339. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -1499
  340. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -146
  341. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -1085
  342. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -11
  343. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -3081
  344. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -23
  345. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -185
  346. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -287
  347. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -1676
  348. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -28
  349. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -144
  350. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -174
  351. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -25
  352. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -18
  353. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -59
  354. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -56
  355. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -195
  356. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -582
  357. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -25
  358. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -4439
  359. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -570
  360. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -509
  361. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -12
  362. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -108
  363. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -96
  364. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -3646
  365. package/skills/sophnet-docx/src/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -116
  366. package/skills/sophnet-docx/src/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -42
  367. package/skills/sophnet-docx/src/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -50
  368. package/skills/sophnet-docx/src/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -49
  369. package/skills/sophnet-docx/src/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -33
  370. package/skills/sophnet-docx/src/scripts/office/schemas/mce/mc.xsd +75 -75
  371. package/skills/sophnet-docx/src/scripts/office/schemas/microsoft/wml-2010.xsd +560 -560
  372. package/skills/sophnet-docx/src/scripts/office/schemas/microsoft/wml-2012.xsd +67 -67
  373. package/skills/sophnet-docx/src/scripts/office/schemas/microsoft/wml-2018.xsd +14 -14
  374. package/skills/sophnet-docx/src/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -20
  375. package/skills/sophnet-docx/src/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -13
  376. package/skills/sophnet-docx/src/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -4
  377. package/skills/sophnet-docx/src/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -8
  378. package/skills/sophnet-docx/src/scripts/office/soffice.py +183 -183
  379. package/skills/sophnet-docx/src/scripts/office/unpack.py +132 -132
  380. package/skills/sophnet-docx/src/scripts/office/validate.py +111 -111
  381. package/skills/sophnet-docx/src/scripts/office/validators/__init__.py +15 -15
  382. package/skills/sophnet-docx/src/scripts/office/validators/base.py +847 -847
  383. package/skills/sophnet-docx/src/scripts/office/validators/docx.py +446 -446
  384. package/skills/sophnet-docx/src/scripts/office/validators/pptx.py +275 -275
  385. package/skills/sophnet-docx/src/scripts/office/validators/redlining.py +247 -247
  386. package/skills/sophnet-docx/src/scripts/templates/comments.xml +3 -3
  387. package/skills/sophnet-docx/src/scripts/templates/commentsExtended.xml +3 -3
  388. package/skills/sophnet-docx/src/scripts/templates/commentsExtensible.xml +3 -3
  389. package/skills/sophnet-docx/src/scripts/templates/commentsIds.xml +3 -3
  390. package/skills/sophnet-docx/src/scripts/templates/people.xml +3 -3
  391. package/skills/sophnet-docx/src/scripts/upload_file.sh +96 -96
  392. package/skills/sophnet-docx/src/uv.lock +320 -320
  393. package/skills/sophnet-face-search/skill.json +20 -20
  394. package/skills/sophnet-face-search/src/SKILL.md +115 -115
  395. package/skills/sophnet-face-search/src/pyproject.toml +11 -11
  396. package/skills/sophnet-face-search/src/scripts/face_search.py +335 -335
  397. package/skills/sophnet-face-search/src/uv.lock +508 -508
  398. package/skills/sophnet-id-photo/skill.json +20 -20
  399. package/skills/sophnet-id-photo/src/SKILL.md +107 -107
  400. package/skills/sophnet-id-photo/src/pyproject.toml +10 -10
  401. package/skills/sophnet-id-photo/src/scripts/id_photo.py +540 -540
  402. package/skills/sophnet-id-photo/src/scripts/id_photo_compliance.py +215 -215
  403. package/skills/sophnet-id-photo/src/scripts/id_photo_face_crop.py +313 -313
  404. package/skills/sophnet-image-edit/skill.json +20 -20
  405. package/skills/sophnet-image-edit/src/SKILL.md +140 -140
  406. package/skills/sophnet-image-edit/src/pyproject.toml +9 -9
  407. package/skills/sophnet-image-edit/src/scripts/edit_and_preview.sh +68 -68
  408. package/skills/sophnet-image-edit/src/scripts/edit_image.py +279 -279
  409. package/skills/sophnet-image-edit/src/uv.lock +234 -234
  410. package/skills/sophnet-image-generate/skill.json +20 -20
  411. package/skills/sophnet-image-generate/src/SKILL.md +62 -62
  412. package/skills/sophnet-image-generate/src/pyproject.toml +9 -9
  413. package/skills/sophnet-image-generate/src/scripts/generate_image.py +156 -156
  414. package/skills/sophnet-image-generate/src/uv.lock +234 -234
  415. package/skills/sophnet-image-ocr/skill.json +20 -20
  416. package/skills/sophnet-image-ocr/src/SKILL.md +167 -167
  417. package/skills/sophnet-image-ocr/src/pyproject.toml +13 -13
  418. package/skills/sophnet-image-ocr/src/scripts/ocr.py +225 -225
  419. package/skills/sophnet-image-ocr/src/uv.lock +234 -234
  420. package/skills/sophnet-infinite-talk/skill.json +20 -20
  421. package/skills/sophnet-infinite-talk/src/SKILL.md +140 -140
  422. package/skills/sophnet-infinite-talk/src/pyproject.toml +9 -9
  423. package/skills/sophnet-infinite-talk/src/scripts/gen.py +172 -172
  424. package/skills/sophnet-oss/skill.json +27 -27
  425. package/skills/sophnet-oss/src/SKILL.md +118 -118
  426. package/skills/sophnet-oss/src/pyproject.toml +8 -8
  427. package/skills/sophnet-oss/src/scripts/upload_file.py +43 -43
  428. package/skills/sophnet-pdf/skill.json +20 -20
  429. package/skills/sophnet-pdf/src/SKILL.md +413 -413
  430. package/skills/sophnet-pdf/src/forms.md +297 -297
  431. package/skills/sophnet-pdf/src/pyproject.toml +14 -14
  432. package/skills/sophnet-pdf/src/reference.md +611 -611
  433. package/skills/sophnet-pdf/src/scripts/check_bounding_boxes.py +65 -65
  434. package/skills/sophnet-pdf/src/scripts/check_fillable_fields.py +11 -11
  435. package/skills/sophnet-pdf/src/scripts/convert_pdf_to_images.py +33 -33
  436. package/skills/sophnet-pdf/src/scripts/create_validation_image.py +37 -37
  437. package/skills/sophnet-pdf/src/scripts/enhance_tutorial.py +557 -557
  438. package/skills/sophnet-pdf/src/scripts/ensure_uv_env.sh +68 -68
  439. package/skills/sophnet-pdf/src/scripts/extract_form_field_info.py +122 -122
  440. package/skills/sophnet-pdf/src/scripts/extract_form_structure.py +115 -115
  441. package/skills/sophnet-pdf/src/scripts/extract_pdf_content.py +34 -34
  442. package/skills/sophnet-pdf/src/scripts/fill_fillable_fields.py +98 -98
  443. package/skills/sophnet-pdf/src/scripts/fill_pdf_form_with_annotations.py +107 -107
  444. package/skills/sophnet-pdf/src/scripts/upload_file.sh +88 -88
  445. package/skills/sophnet-pdf/src/uv.lock +537 -537
  446. package/skills/sophnet-qa-install/skill.json +27 -27
  447. package/skills/sophnet-qa-install/src/SKILL.md +210 -210
  448. package/skills/sophnet-qa-install/src/pyproject.toml +6 -6
  449. package/skills/sophnet-qa-install/src/scripts/backup_md.py +35 -35
  450. package/skills/sophnet-qa-install/src/scripts/check_installed.py +143 -143
  451. package/skills/sophnet-qa-install/src/scripts/update_config.py +142 -142
  452. package/skills/sophnet-qa-install/src/scripts/update_md.py +73 -73
  453. package/skills/sophnet-schedule/skill.json +20 -20
  454. package/skills/sophnet-schedule/src/ARCHITECTURE.md +321 -321
  455. package/skills/sophnet-schedule/src/IMPROVEMENTS.md +145 -145
  456. package/skills/sophnet-schedule/src/SKILL.md +1050 -1050
  457. package/skills/sophnet-schedule/src/_meta.json +6 -6
  458. package/skills/sophnet-schedule/src/api/models.py +245 -245
  459. package/skills/sophnet-schedule/src/apps/add_event.py +237 -237
  460. package/skills/sophnet-schedule/src/apps/check_reminders.py +112 -112
  461. package/skills/sophnet-schedule/src/apps/check_roc.py +246 -246
  462. package/skills/sophnet-schedule/src/apps/generate_daily_plan.py +342 -342
  463. package/skills/sophnet-schedule/src/apps/import_events.py +216 -216
  464. package/skills/sophnet-schedule/src/apps/monitor_calendar_changes.py +140 -140
  465. package/skills/sophnet-schedule/src/apps/register_tasks.py +169 -169
  466. package/skills/sophnet-schedule/src/apps/sync_roc_to_gcal.py +174 -174
  467. package/skills/sophnet-schedule/src/compat.py +66 -66
  468. package/skills/sophnet-schedule/src/config/reminder_rules.yaml +96 -96
  469. package/skills/sophnet-schedule/src/config/roc_events.yaml +44 -44
  470. package/skills/sophnet-schedule/src/config/settings.py +133 -133
  471. package/skills/sophnet-schedule/src/config/task_registry.yaml +92 -92
  472. package/skills/sophnet-schedule/src/docs/FRONTEND_INTEGRATION_GUIDE.md +437 -437
  473. package/skills/sophnet-schedule/src/gcal/client.py +374 -374
  474. package/skills/sophnet-schedule/src/gcal/models.py +91 -91
  475. package/skills/sophnet-schedule/src/requirements.txt +6 -6
  476. package/skills/sophnet-schedule/src/scripts/setup_gcal_token.py +85 -85
  477. package/skills/sophnet-schedule/src/server.py +669 -669
  478. package/skills/sophnet-schedule/src/services/calendar_backend.py +139 -139
  479. package/skills/sophnet-schedule/src/services/conflict_detector.py +96 -96
  480. package/skills/sophnet-schedule/src/services/datetime_utils.py +117 -117
  481. package/skills/sophnet-schedule/src/services/event_classifier.py +100 -100
  482. package/skills/sophnet-schedule/src/services/event_diff.py +160 -160
  483. package/skills/sophnet-schedule/src/services/google_integration.py +500 -500
  484. package/skills/sophnet-schedule/src/services/job_store.py +100 -100
  485. package/skills/sophnet-schedule/src/services/local_event_store.py +266 -266
  486. package/skills/sophnet-schedule/src/services/reminder_planner.py +116 -116
  487. package/skills/sophnet-schedule/src/services/runtime_utils.py +31 -31
  488. package/skills/sophnet-schedule/src/services/table_parser.py +286 -286
  489. package/skills/sophnet-schedule/src/services/task_builder.py +167 -167
  490. package/skills/sophnet-schedule/src/services/time_window.py +72 -72
  491. package/skills/sophnet-sticker-edit/skill.json +27 -27
  492. package/skills/sophnet-sticker-edit/src/SKILL.md +80 -80
  493. package/skills/sophnet-sticker-edit/src/pyproject.toml +9 -9
  494. package/skills/sophnet-sticker-edit/src/scripts/edit_sticker_image.py +403 -403
  495. package/skills/sophnet-stock/skill.json +20 -20
  496. package/skills/sophnet-stock/src/App-Plan.md +442 -442
  497. package/skills/sophnet-stock/src/README.md +214 -214
  498. package/skills/sophnet-stock/src/SKILL.md +236 -236
  499. package/skills/sophnet-stock/src/TODO.md +394 -394
  500. package/skills/sophnet-stock/src/_meta.json +5 -5
  501. package/skills/sophnet-stock/src/docs/ARCHITECTURE.md +408 -408
  502. package/skills/sophnet-stock/src/docs/CONCEPT.md +233 -233
  503. package/skills/sophnet-stock/src/docs/HOT_SCANNER.md +288 -288
  504. package/skills/sophnet-stock/src/docs/README.md +95 -95
  505. package/skills/sophnet-stock/src/docs/USAGE.md +465 -465
  506. package/skills/sophnet-stock/src/scripts/analyze_stock.py +2565 -2565
  507. package/skills/sophnet-stock/src/scripts/dividends.py +365 -365
  508. package/skills/sophnet-stock/src/scripts/hot_scanner.py +582 -582
  509. package/skills/sophnet-stock/src/scripts/portfolio.py +548 -548
  510. package/skills/sophnet-stock/src/scripts/rumor_scanner.py +342 -342
  511. package/skills/sophnet-stock/src/scripts/test_stock_analysis.py +409 -409
  512. package/skills/sophnet-stock/src/scripts/watchlist.py +336 -336
  513. package/skills/sophnet-training-install/skill.json +27 -27
  514. package/skills/sophnet-training-install/src/SKILL.md +211 -211
  515. package/skills/sophnet-training-install/src/pyproject.toml +6 -6
  516. package/skills/sophnet-training-install/src/scripts/backup_md.py +35 -35
  517. package/skills/sophnet-training-install/src/scripts/check_installed.py +144 -144
  518. package/skills/sophnet-training-install/src/scripts/update_config.py +142 -142
  519. package/skills/sophnet-training-install/src/scripts/update_md.py +73 -73
  520. package/skills/sophnet-tts/skill.json +20 -20
  521. package/skills/sophnet-tts/src/SKILL.md +79 -79
  522. package/skills/sophnet-tts/src/pyproject.toml +9 -9
  523. package/skills/sophnet-tts/src/scripts/gen_tts.py +130 -130
  524. package/skills/sophnet-video-generate/skill.json +37 -37
  525. package/skills/sophnet-video-generate/src/SKILL.md +117 -117
  526. package/skills/sophnet-video-generate/src/scripts/gen_video.py +321 -321
  527. package/skills/sophnet-xlsx/skill.json +20 -20
  528. package/skills/sophnet-xlsx/src/SKILL.md +399 -399
  529. package/skills/sophnet-xlsx/src/pyproject.toml +11 -11
  530. package/skills/sophnet-xlsx/src/scripts/ensure_uv_env.sh +68 -68
  531. package/skills/sophnet-xlsx/src/scripts/office/helpers/merge_runs.py +199 -199
  532. package/skills/sophnet-xlsx/src/scripts/office/helpers/simplify_redlines.py +197 -197
  533. package/skills/sophnet-xlsx/src/scripts/office/pack.py +159 -159
  534. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -1499
  535. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -146
  536. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -1085
  537. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -11
  538. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -3081
  539. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -23
  540. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -185
  541. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -287
  542. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -1676
  543. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -28
  544. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -144
  545. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -174
  546. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -25
  547. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -18
  548. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -59
  549. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -56
  550. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -195
  551. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -582
  552. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -25
  553. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -4439
  554. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -570
  555. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -509
  556. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -12
  557. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -108
  558. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -96
  559. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -3646
  560. package/skills/sophnet-xlsx/src/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -116
  561. package/skills/sophnet-xlsx/src/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -42
  562. package/skills/sophnet-xlsx/src/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -50
  563. package/skills/sophnet-xlsx/src/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -49
  564. package/skills/sophnet-xlsx/src/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -33
  565. package/skills/sophnet-xlsx/src/scripts/office/schemas/mce/mc.xsd +75 -75
  566. package/skills/sophnet-xlsx/src/scripts/office/schemas/microsoft/wml-2010.xsd +560 -560
  567. package/skills/sophnet-xlsx/src/scripts/office/schemas/microsoft/wml-2012.xsd +67 -67
  568. package/skills/sophnet-xlsx/src/scripts/office/schemas/microsoft/wml-2018.xsd +14 -14
  569. package/skills/sophnet-xlsx/src/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -20
  570. package/skills/sophnet-xlsx/src/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -13
  571. package/skills/sophnet-xlsx/src/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -4
  572. package/skills/sophnet-xlsx/src/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -8
  573. package/skills/sophnet-xlsx/src/scripts/office/soffice.py +183 -183
  574. package/skills/sophnet-xlsx/src/scripts/office/unpack.py +132 -132
  575. package/skills/sophnet-xlsx/src/scripts/office/validate.py +111 -111
  576. package/skills/sophnet-xlsx/src/scripts/office/validators/__init__.py +15 -15
  577. package/skills/sophnet-xlsx/src/scripts/office/validators/base.py +847 -847
  578. package/skills/sophnet-xlsx/src/scripts/office/validators/docx.py +446 -446
  579. package/skills/sophnet-xlsx/src/scripts/office/validators/pptx.py +275 -275
  580. package/skills/sophnet-xlsx/src/scripts/office/validators/redlining.py +247 -247
  581. package/skills/sophnet-xlsx/src/scripts/recalc.py +184 -184
  582. package/skills/sophnet-xlsx/src/scripts/upload_file.sh +96 -96
  583. package/skills/sophnet-xlsx/src/uv.lock +319 -319
  584. package/skills/ui-ux-pro-max/skill.json +20 -20
  585. package/skills/ui-ux-pro-max/src/SKILL.md +377 -377
  586. package/skills/ui-ux-pro-max/src/data/icons.csv +101 -101
  587. package/skills/ui-ux-pro-max/src/data/react-performance.csv +45 -45
  588. package/skills/ui-ux-pro-max/src/data/stacks/astro.csv +54 -54
  589. package/skills/ui-ux-pro-max/src/data/stacks/jetpack-compose.csv +53 -53
  590. package/skills/ui-ux-pro-max/src/data/stacks/nuxt-ui.csv +51 -51
  591. package/skills/ui-ux-pro-max/src/data/stacks/nuxtjs.csv +59 -59
  592. package/skills/ui-ux-pro-max/src/data/stacks/shadcn.csv +61 -61
  593. package/skills/ui-ux-pro-max/src/data/typography.csv +57 -57
  594. package/skills/ui-ux-pro-max/src/data/ui-reasoning.csv +101 -101
  595. package/skills/ui-ux-pro-max/src/data/web-interface.csv +31 -31
  596. package/skills/ui-ux-pro-max/src/scripts/core.py +253 -253
  597. package/skills/ui-ux-pro-max/src/scripts/design_system.py +1067 -1067
  598. package/skills/video-understand/skill.json +20 -20
  599. package/skills/video-understand/src/SKILL.md +79 -79
  600. package/skills/video-understand/src/scripts/video_understand.py +204 -204
  601. package/skills/weather/skill.json +19 -19
  602. package/skills/weather/src/SKILL.md +112 -112
  603. package/skills/web-scraper/skill.json +20 -20
  604. package/skills/web-scraper/src/SKILL.md +101 -101
  605. package/skills/web-scraper/src/scripts/scrape.py +270 -270
  606. package/skills/website-builder/skill.json +20 -20
  607. package/skills/website-builder/src/SKILL.md +266 -266
  608. package/skills/website-builder/src/scripts/deploy_site.sh +46 -46
  609. package/skills/wechat-article-publisher/skill.json +20 -20
  610. package/skills/wechat-article-publisher/src/SKILL.md +60 -60
  611. package/skills/wechat-article-publisher/src/config.json +6 -6
  612. package/skills/wechat-article-publisher/src/pyproject.toml +12 -12
  613. package/skills/wechat-article-publisher/src/scripts/publish_wechat.py +825 -825
  614. package/skills/xiaohongshu/skill.json +20 -20
  615. package/skills/xiaohongshu/src/SKILL.md +91 -91
  616. package/skills/xiaohongshu/src/_meta.json +5 -5
  617. package/skills/xiaohongshu/src/assets/card.html +216 -216
  618. package/skills/xiaohongshu/src/assets/cover.html +82 -82
  619. package/skills/xiaohongshu/src/assets/example.md +84 -84
  620. package/skills/xiaohongshu/src/assets/styles.css +318 -318
  621. package/skills/xiaohongshu/src/scripts/render_xhs_v2.py +737 -737
  622. package/skills/xiaohongshu/src/scripts/sign_server.py +158 -158
  623. package/skills/xiaohongshu/src/scripts/stealth.min.js +6 -6
  624. package/skills/xiaohongshu/src/scripts/xhs_tool.py +186 -186
  625. package/skills/xiaohongshu/src/workflow.py +185 -185
  626. package/src/commands/agent.js +112 -112
  627. package/src/commands/download.js +101 -101
  628. package/src/commands/info.js +58 -58
  629. package/src/commands/list.js +71 -71
  630. package/src/utils/agents.js +36 -36
  631. package/src/utils/config.js +22 -22
  632. package/src/utils/paths.js +31 -31
  633. package/src/utils/versions.js +57 -57
@@ -1,619 +1,619 @@
1
- ---
2
- name: schedule-reminder
3
- description: >
4
- 智能日程提醒助手:从 Markdown 日程表中读取事项,自动筛选今日及近期需要提醒的任务,
5
- 检测时间冲突,并发送定时提醒。
6
- 默认通过当前对话界面回复提醒(用户在哪里发消息,提醒就回到哪里),无需任何渠道配置,开箱即用;
7
- 触发场景:用户发送日程表文件、粘贴 Markdown 日程表内容、发送截图/Excel 文件、
8
- 说"帮我看今天的日程"、"设置日程提醒"、"检查日程冲突"、"提醒我今天的会议"等。
9
- 商业场景:团队日报/周报提醒、会议通知、任务截止提醒、个人日程管理。
10
- metadata:
11
- {
12
- "openclaw":
13
- { "emoji": "📅", "requires": { "tools": ["cron"], "bins": ["python3", "jq", "uv"] } },
14
- }
15
- ---
16
-
17
- > **内置能力**:本 skill 已内置文件转换功能(基于 `markitdown`),支持直接发送 Excel、CSV、Word、PDF、PowerPoint 等文件作为日程输入,无需单独安装其他 skill。
18
- > **图片/截图 OCR**:依赖 `sophnet-image-ocr` skill,请确保已安装。
19
- > **⭐ 零配置提醒**:cron 提醒任务使用 `--system-event --session main`,直接在当前 agent session 中触发,兼容 Web 界面、钉钉、飞书、企业微信、Telegram 等所有渠道,无需填写任何渠道或 ID。
20
-
21
- ## 加载时说明
22
-
23
- 当用户启用此 skill 时,向用户发送以下欢迎语(语气友好,使用 Markdown):
24
-
25
- > 📅 **日程管理助手已就绪!** 支持:
26
- >
27
- > - 用自然语言添加事项(如"明天下午3点开会"、"下周五提交报告")
28
- > - 上传截图或图片,自动 OCR 识别日程内容
29
- > - 发送表格或直接粘贴内容导入日程
30
-
31
- > - 查看今日/近期日程、检测时间冲突、设置定时提醒
32
- > - 提醒直接发到当前对话,无需任何配置
33
- >
34
- > 你想怎么开始?
35
-
36
- ---
37
-
38
- # 日程提醒助手 (Schedule Reminder)
39
-
40
- 从 Markdown 日程表中读取事项,智能筛选待提醒项,检测冲突,并发送提醒。**用户在哪里对话,提醒就发回哪里,无需额外配置。**
41
-
42
- ---
43
-
44
- ## 一、日程表标准格式(入口文件)
45
-
46
- 用户的日程表存放在一个 Markdown 文件中(通常命名为 `schedule.md` 或 `日程.md`),
47
- 格式固定如下:
48
-
49
- ```markdown
50
- # 我的日程
51
-
52
- > 文件路径:/home/node/.openclaw/workspace/日程.md
53
- > 提醒渠道:current(可选:dingtalk / feishu / wecom / telegram)
54
- > 默认提前提醒:15(分钟)
55
-
56
- | 日期 | 开始时间 | 结束时间 | 事项 | 地点 | 参与者 | 优先级 | 提前(分钟) | 备注 |
57
- | ---------- | -------- | -------- | ------------ | ---------- | --------- | ------ | ---------- | ----------- |
58
- | 2026-03-02 | 09:00 | 10:00 | 周一全员周会 | 会议室A | 全员 | 高 | 15 | 带Q1目标PPT |
59
- | 2026-03-02 | 10:30 | 11:30 | 客户方案评审 | 线上 | 张三,李四 | 高 | 30 | |
60
- | 2026-03-02 | 14:00 | 14:30 | 1on1 与老板 | 老板办公室 | 我,老板 | 中 | 10 | |
61
- | 2026-03-03 | 09:30 | 10:00 | 产品需求评审 | 会议室B | 产品组 | 中 | 15 | |
62
- ```
63
-
64
- ### 字段说明
65
-
66
- | 字段 | 必填 | 格式 | 说明 |
67
- | ---------- | ---- | ----------------- | ---------------------------------------- |
68
- | 日期 | ✅ | YYYY-MM-DD | 事项日期 |
69
- | 开始时间 | ✅ | HH:MM(24小时制) | 事项开始时间 |
70
- | 结束时间 | ✅ | HH:MM | 事项结束时间(用于冲突检测) |
71
- | 事项 | ✅ | 文字 | 事项名称,简短明了 |
72
- | 地点 | ❌ | 文字 | 线下填地点,线上填"线上"或会议链接 |
73
- | 参与者 | ❌ | 逗号分隔 | 相关人员,可留空 |
74
- | 优先级 | ❌ | 高/中/低 | 默认"中";"高"必须提醒,"低"可跳过 |
75
- | 提前(分钟) | ❌ | 数字 | 提前多少分钟发送提醒,留空则用全局默认值 |
76
- | 备注 | ❌ | 文字 | 额外信息 |
77
-
78
- ---
79
-
80
- ## 二、Agent 工作流程
81
-
82
- ### Step 1:读取并解析日程表
83
-
84
- 当用户提供日程表文件路径或粘贴内容时,调用解析脚本:
85
-
86
- ```bash
87
- python3 /app/skills/schedule-reminder/scripts/parse_schedule.py \
88
- --file <schedule_file> \
89
- --mode today # today / tomorrow / week / all
90
- ```
91
-
92
- 脚本输出 JSON,包含:
93
-
94
- - `events`:解析后的所有事项
95
- - `upcoming`:需要提醒的事项(按时间排序)
96
- - `conflicts`:时间冲突列表
97
-
98
- ### Step 2:展示筛选结果给用户
99
-
100
- 解析后,**向用户展示**以下信息:
101
-
102
- #### 今日日程预览
103
-
104
- 用 Markdown 表格展示今日事项(时间升序):
105
-
106
- ```
107
- 📅 **今日日程(3月2日)**
108
-
109
- | 时间 | 事项 | 地点 | 优先级 | 提前提醒 |
110
- |---------------|----------------|----------|--------|----------|
111
- | 09:00–10:00 | 周一全员周会 | 会议室A | 🔴 高 | 15分钟 |
112
- | 10:30–11:30 | 客户方案评审 | 线上 | 🔴 高 | 30分钟 |
113
- | 14:00–14:30 | 1on1 与老板 | 老板办公室 | 🟡 中 | 10分钟 |
114
- ```
115
-
116
- #### 冲突提示(如有)
117
-
118
- ```
119
- ⚠️ **发现时间冲突:**
120
- - 09:30–10:30 "产品需求评审" 与 09:00–10:00 "周会" 时间重叠 30 分钟
121
- 建议:调整其中一项,或确认是否同时参加。
122
- ```
123
-
124
- #### 确认提醒设置
125
-
126
- ```
127
- 以下事项将设置提醒,将在提醒时间直接发回此对话:
128
- - ⏰ 08:45 提醒 → 09:00 周一全员周会(提前15分钟)
129
- - ⏰ 10:00 提醒 → 10:30 客户方案评审(提前30分钟)
130
- - ⏰ 13:50 提醒 → 14:00 1on1(提前10分钟)
131
-
132
- 是否确认创建提醒?(可调整某项的提前时间或跳过)
133
- ```
134
-
135
- **等待用户确认**后再执行 Step 3。
136
-
137
- ### Step 3:创建提醒任务
138
-
139
- 用户确认后,为每个事项创建 cron 任务:
140
-
141
- ```bash
142
- bash /app/skills/schedule-reminder/scripts/create_reminders.sh \
143
- --events-json '/tmp/schedule_upcoming.json' \
144
- --to "{{sender}}"
145
- ```
146
-
147
- > `--channel` 和 `--to` 均为可选,不传时默认回到最后一次对话渠道(`channel=last`)。需要推送给其他用户时再显式指定。
148
-
149
- ---
150
-
151
- ## 三、支持的提醒渠道
152
-
153
- **cron 提醒任务使用 `--system-event + --session main`,在当前对话的 main session 中直接触发,无需任何渠道配置,天然兼容 Web 界面、钉钉、飞书、企业微信、Telegram 等所有渠道。**
154
-
155
- > ✅ **为什么用 `--system-event` 而不是 `--message + --announce`?**
156
- > `--message + --announce` 会启动 isolated subagent,结束后需要把结果推送(announce)回目标渠道。
157
- > 但 webchat(Web 界面)不支持被 agent 主动推送,会报 `Unsupported channel: webchat` 错误。
158
- > `--system-event + --session main` 直接在 main session 中注入事件,不走推送流程,所有渠道均可用。
159
-
160
- **交互式提醒**(用户发消息触发):直接在当前对话中回复,零配置。
161
-
162
- **cron 定时提醒**(`create_reminders.sh` 创建):使用 `--system-event --session main`,自动在当前 agent session 中显示提醒,无需指定渠道或收件人。
163
-
164
- ---
165
-
166
- ## 四、筛选逻辑
167
-
168
- 优先筛选以下事项:
169
-
170
- 1. **今日**所有未过期的事项(当前时间之后的事项)
171
- 2. **明日**优先级为"高"的事项
172
- 3. 优先级为"高"且**距今 ≤ 24 小时**的所有事项
173
- 4. 有**截止时间/提交要求**的任务型事项(备注含"提交"、"截止"、"deadline"关键词)
174
-
175
- 跳过以下事项:
176
-
177
- - 优先级为"低"且用户没有明确要求提醒的
178
- - 已过期(结束时间早于当前时间)的事项
179
-
180
- ---
181
-
182
- ## 五、冲突检测规则
183
-
184
- 两个事项满足以下任一条件即视为**冲突**:
185
-
186
- - 同一天,A 的开始时间 < B 的结束时间,且 A 的结束时间 > B 的开始时间(时间重叠)
187
- - 同一天,两个事项开始时间相差 < 5 分钟(紧接场景,没有缓冲时间)
188
-
189
- **冲突提示格式**:
190
-
191
- ```
192
- ⚠️ 冲突:[事项A](09:00-10:00)与 [事项B](09:30-11:00)重叠 30 分钟
193
- 建议:将 [事项B] 改为 10:00 后开始,或确认是否线上可同时参与。
194
- ```
195
-
196
- ---
197
-
198
- ## 六、提醒消息模板
199
-
200
- 发送给用户的提醒消息格式:
201
-
202
- ```
203
- ⏰ 日程提醒
204
-
205
- 📌 【周一全员周会】即将在 15 分钟后开始
206
- 🕐 09:00 – 10:00
207
- 📍 会议室A
208
- 👥 参与者:全员
209
- 📝 带Q1目标PPT
210
-
211
- 祝会议顺利!
212
- ```
213
-
214
- ---
215
-
216
- ## 七、一次性 vs 周期性提醒
217
-
218
- | 场景 | 类型 | 说明 |
219
- | ---------------------- | ------ | -------------------------------------------- |
220
- | 单次会议/事项 | 一次性 | cron 执行后自动删除(`--delete-after-run`) |
221
- | 每周固定会议(如周会) | 周期性 | 使用 `* * * * 1`(每周一)等周期 cron 表达式 |
222
- | 每日站会 | 周期性 | 使用 `0 9 * * 1-5`(工作日每天) |
223
-
224
- 检测规则:若同一事项在日程表中连续出现超过 2 次且时间规律,自动建议设置为周期性提醒。
225
-
226
- ---
227
-
228
- ## 八、主动激活方式(推荐用于商用)
229
-
230
- ### 方式 A:一次性 Setup → 每天自动运行(推荐)
231
-
232
- 管理员或用户**运行一次** setup.sh,之后每天自动激活,不需要任何手动触发:
233
-
234
- ```bash
235
- bash /app/skills/schedule-reminder/scripts/setup.sh
236
- ```
237
-
238
- 交互式引导:
239
-
240
- 1. 输入日程文件路径(如 `/home/node/.openclaw/workspace/日程.md`)
241
- 2. 选择推送渠道(dingtalk / feishu / wecom / telegram,仅在需要推送给特定用户时填写)
242
- 3. 输入接收者 ID(可留空,留空则回到最后一次对话渠道)
243
- 4. 设置每日激活时间(如 7 表示每天早上 7:00)
244
-
245
- Setup 完成后自动注册 `schedule-reminder-daily-activate` cron 任务:
246
-
247
- - **每天定时**运行 `daily_activate.sh`
248
- - 自动解析日程文件 → 建今日提醒 → 发日报
249
- - 用户无需操作,提醒准时到达
250
-
251
- **带参数快速配置(脚本化部署,需要推送给特定渠道用户时):**
252
-
253
- ```bash
254
- bash /app/skills/schedule-reminder/scripts/setup.sh \
255
- --file /home/node/.openclaw/workspace/日程.md \
256
- --channel dingtalk \
257
- --to "user_staff_id" \
258
- --hour 7 \
259
- --yes
260
- ```
261
-
262
- > 不指定 `--channel`/`--to` 时,提醒默认回到最后一次对话渠道,无需填写接收者 ID。
263
-
264
- **手动立即触发(测试用):**
265
-
266
- ```bash
267
- bash /app/skills/schedule-reminder/scripts/daily_activate.sh
268
- ```
269
-
270
- **停止每日激活:**
271
-
272
- ```bash
273
- openclaw cron remove schedule-reminder-daily-activate
274
- ```
275
-
276
- ---
277
-
278
- ### 方式 B:发送日程截图(sophnet-image-ocr)
279
-
280
- 用户发送日程截图(手机截图、扫描件、PDF 等),Agent 使用 `sophnet-image-ocr` skill 提取表格文字,再写入日程文件。
281
-
282
- #### ⚠️ 图片路径获取
283
-
284
- **用户上传图片时,系统会自动对图片进行理解,结果以文字描述(`[Image] Description: ...`)出现在消息上下文中,Agent 可以直接读取描述内容。但如果需要对图片做 OCR(提取表格原文),则必须拿到图片文件的本地路径。**
285
-
286
- 图片路径的获取策略(按优先级):
287
-
288
- **优先级 1:主动搜索常见位置**
289
-
290
- 收到图片消息后立即搜索最近修改的图片文件,**不要等用户提供路径**。上传的图片会先下载到 workspace 的 `media/inbound/` 目录,优先搜这里:
291
-
292
- ```bash
293
- # 1. workspace 的 media/inbound 目录(钉钉/飞书等渠道上传必在此处)
294
- ls -t <workspace>/media/inbound/ 2>/dev/null | grep -iE '\.(jpg|jpeg|png|webp|bmp|gif|pdf)$' | head -3
295
-
296
- # 2. 用户常见目录兜底
297
- ls -t ~/Downloads/ ~/Pictures/ ~/Desktop/ 2>/dev/null \
298
- | grep -iE '\.(jpg|jpeg|png|webp|bmp|gif|pdf)$' | head -3
299
- ```
300
-
301
- 找到候选文件后,展示给用户确认:"找到以下文件,是您刚上传的吗?",确认后再调用 OCR。
302
-
303
- **优先级 2:用户补充提供**
304
-
305
- 若搜索无结果,提示用户直接告知文件路径或粘贴到对话中。
306
-
307
- **收到图片消息时,Agent 必须立即执行以下步骤,不要等待用户再次说明:**
308
-
309
- 1. 按上述优先级确定图片绝对路径
310
- 2. 用该路径调用 OCR,输出 Markdown
311
- 3. 从 Markdown 中提取日程事项,展示给用户确认
312
-
313
- #### 完整流程
314
-
315
- **Step 1:确定图片路径,调用 OCR**
316
-
317
- ```bash
318
- # <image_path> 替换为搜索到的实际绝对路径
319
- uv run /app/skills/sophnet-image-ocr/scripts/ocr.py <image_path>
320
- ```
321
-
322
- **Step 2:Agent 读取 OCR 输出的 Markdown,理解表格结构,提取日程事项**
323
-
324
- 列名不标准、版式混乱 → Agent 根据上下文理解,直接提取日期、时间、事项等字段。
325
-
326
- **Step 3:展示识别结果,用户确认后逐条写入日程文件**
327
-
328
- ```bash
329
- # <schedule_file> 替换为用户日程文件的实际路径(优先用用户告知的路径,否则用 workspace 下的 日程.md)
330
- python3 /app/skills/schedule-reminder/scripts/append_event.py \
331
- --file <schedule_file> \
332
- --date "..." --start "..." --end "..." --title "..."
333
- ```
334
-
335
- **支持格式**:JPEG、PNG、WebP、BMP、GIF、PDF(多页自动合并)
336
-
337
- ### 方式 C:指定本地文件路径
338
-
339
- ```
340
- 帮我看一下 ~/Documents/日程.md 今天的提醒
341
- ```
342
-
343
- ### 方式 D:通过入口文件触发
344
-
345
- 在工作区根目录放置 `日程.md`,文件第一行包含触发指令:
346
-
347
- ```markdown
348
- <!-- skill: schedule-reminder -->
349
-
350
- # 我的日程
351
-
352
- ...(表格内容)
353
- ```
354
-
355
- Agent 检测到此文件时自动激活本 skill。
356
-
357
- ### 方式 E:发送 Excel / CSV / Word / PDF 文件
358
-
359
- 用户发送文件后,Agent 执行以下流程:
360
-
361
- #### ⚠️ 文件路径获取
362
-
363
- 上传的文件与图片走同一套机制,渠道(钉钉/飞书等)会将文件下载到 workspace 的 `media/inbound/` 目录,文件名为 `<timestamp>_<random>.<ext>`,**agent 无法提前知道文件名,必须主动搜索**。
364
-
365
- **收到文件消息后立即搜索,不要等用户提供路径:**
366
-
367
- ```bash
368
- # 1. workspace 的 media/inbound 目录(渠道上传文件必在此处)
369
- ls -t <workspace>/media/inbound/ 2>/dev/null \
370
- | grep -iE '\.(xlsx|xls|csv|docx|pptx|pdf|html)$' | head -3
371
-
372
- # 2. 用户常见目录兜底
373
- ls -t ~/Downloads/ ~/Desktop/ 2>/dev/null \
374
- | grep -iE '\.(xlsx|xls|csv|docx|pptx|pdf|html)$' | head -3
375
- ```
376
-
377
- 找到候选文件后,展示给用户确认是否是刚上传的文件,确认后再转换。若搜索无结果,提示用户告知文件路径。
378
-
379
- #### Step 1:文件转 Markdown
380
-
381
- ```bash
382
- # <file_path> 替换为上面搜索到的实际绝对路径
383
- uvx "markitdown[all]" <file_path> -o /tmp/schedule_converted.md
384
- ```
385
-
386
- 支持格式:Excel(`.xlsx/.xls`)、CSV(`.csv`)、Word(`.docx`)、PowerPoint(`.pptx`)、PDF(`.pdf`)、HTML(`.html`)
387
-
388
- > ⚠️ 需要服务器安装 `uv`
389
-
390
- #### Step 2:Agent 直接读取 Markdown 内容,提取日程事项
391
-
392
- Agent 读取 `/tmp/schedule_converted.md` 的内容,**直接理解表格结构**,无需关心列名是否标准。
393
-
394
- 从中提取每行事项的:日期、开始时间、结束时间、事项名称、地点、参与者、优先级、备注。
395
-
396
- - 列名不标准(如"会期"、"主旨"、"时段开始")→ Agent 根据上下文理解含义,直接提取
397
- - 缺少某些字段 → 使用默认值(优先级默认"中",提前提醒默认15分钟)
398
- - 内容模糊 → Agent 在展示确认卡片时标注"待确认"
399
-
400
- #### Step 3:展示识别结果,用户确认
401
-
402
- ```
403
- 📋 从文件中识别到以下日程,确认写入日程文件?
404
-
405
- | 日期 | 时间 | 事项 | 地点 | 优先级 |
406
- |------------|---------------|----------|-------|--------|
407
- | 2026-03-10 | 10:00–11:30 | 季度复盘 | A101 | 中 |
408
- | 2026-03-11 | 14:00–16:00 | 产品发布 | 线上 | 中 |
409
-
410
- ✅ 全部写入 ✏️ 修改某项 ❌ 取消
411
- ```
412
-
413
- #### Step 4:逐条写入日程文件
414
-
415
- 用户确认后,逐条调用 `append_event.py` 追加到日程文件(路径以用户告知为准,未告知则用 workspace 下的 `日程.md`):
416
-
417
- ```bash
418
- # <schedule_file> 替换为实际日程文件路径
419
- python3 /app/skills/schedule-reminder/scripts/append_event.py \
420
- --file <schedule_file> \
421
- --date "2026-03-10" \
422
- --start "10:00" \
423
- --end "11:30" \
424
- --title "季度复盘" \
425
- --location "A101"
426
- ```
427
-
428
- 写入完成后,询问是否为今日/近期事项立即设置提醒。
429
-
430
- ---
431
-
432
- ## 九、间接日程:从他人时间表推导用户自己的行动
433
-
434
- 用户有时发送的是**别人的时间表**(孩子课程表、配偶班次、会议室日历等),但用户真正需要记录的是**自己的关联行动**,不是对方的内容本身。
435
-
436
- ### 识别特征
437
-
438
- 以下情况属于"间接日程",Agent 需要主动推导用户行动,而不是原样照搬表格内容:
439
-
440
- - 发送孩子课程表 + 说"我要接孩子"→ 记录的是**接送时间**,不是课程
441
- - 发送他人会议日程 + 说"我要旁听/参与" → 记录的是**用户自己要出席**的事项
442
- - 发送班次/排班表 + 说"这是我老婆的班,我负责接送" → 记录的是接送行动
443
- - 发送活动日程 + 说"这些我都要去" → 逐条转化为用户自己的日程
444
-
445
- ### 处理规则
446
-
447
- **Agent 必须优先理解用户的意图,而不是照搬原表格内容。**
448
-
449
- 1. **识别用户的行动**:从用户说的话中提取"我要做什么"(接送、旁听、参与、安排等)
450
- 2. **推算用户行动的时间**:
451
- - 接送场景:课程/活动结束时间 → 用户出发/到达时间(默认提前15分钟出发)
452
- - 旁听/参与场景:直接使用对方事项的开始时间
453
- 3. **记录用户自己的事项**,标注来源(如"备注:女儿课程表 周三 9:40-10:20")
454
- 4. **不要把对方的课程/事项原样写入用户日程**,除非用户明确要求存档参考
455
-
456
- ### 示例
457
-
458
- 用户发课程表截图,说"我要接女儿,下课后15分钟内到":
459
-
460
- ```
461
- 📅 根据课程表,为您生成接送日程,请确认:
462
-
463
- | 日期 | 出发时间 | 事项 | 备注 |
464
- |---------|----------|-------------------|-------------------------|
465
- | 每周一 | 10:15 | 接女儿放学 | 课程:语文 8:50-9:30 |
466
- | 每周二 | 9:15 | 接女儿放学 | 课程:数学 8:50-9:30 |
467
- | 每周三 | 14:25 | 接女儿放学 | 课程:体育 10:30-14:10 |
468
- | 每周四 | 10:35 | 接女儿放学 | 课程:科学 10:30-? |
469
- | 每周五 | 15:45 | 接女儿放学 | 课程:手工 14:50-15:30 |
470
-
471
- ✅ 全部写入 ✏️ 修改某项 ❌ 取消
472
- ```
473
-
474
- ---
475
-
476
- ## 十、自然语言快速创建日程
477
-
478
- 用户可以直接用自然语言描述一个日程,Agent 自动解析并追加到日程文件。
479
-
480
- ### 触发关键词
481
-
482
- 用户说的话包含以下任意模式时,进入"创建日程"流程:
483
-
484
- - 时间词 + 事项:`明天下午3点开会`、`下周五10点产品评审`
485
- - 截止日期描述:`3月5号截止提交季度报告`
486
- - 明确创建意图:`帮我加一条日程`、`记一下`、`加个提醒`
487
-
488
- ### 解析规则
489
-
490
- | 用户说的内容 | 解析结果 |
491
- | -------------------- | ------------------------- |
492
- | `明天` | 明天的日期(当前日期 +1) |
493
- | `下周五` | 下一个周五的日期 |
494
- | `3月5号` / `3/5` | 当年对应日期 |
495
- | `上午10点` / `10:00` | 开始时间 10:00 |
496
- | `下午3点` | 开始时间 15:00 |
497
- | `两小时` / `1小时` | 推算结束时间 |
498
- | 未说结束时间 | 默认事项时长 1 小时 |
499
- | 未说优先级 | 默认"中" |
500
- | 未说地点/参与者 | 留空 |
501
-
502
- ### 工作流程
503
-
504
- **Step 1:解析用户输入,展示确认卡片**
505
-
506
- ```
507
- 📅 我帮你记录了这条日程,请确认:
508
-
509
- | 字段 | 内容 |
510
- |----------|-------------------|
511
- | 日期 | 2026-03-03(明天)|
512
- | 时间 | 15:00 – 16:00 |
513
- | 事项 | 客户会议 |
514
- | 地点 |(未填) |
515
- | 优先级 | 中 |
516
- | 提前提醒 | 15 分钟 |
517
-
518
- ✅ 确认写入 ✏️ 修改某项 ❌ 取消
519
- ```
520
-
521
- **Step 2:用户确认后,追加到日程文件**
522
-
523
- 将新事项追加到用户的日程文件(优先使用用户告知的路径,未告知则推荐存放在 workspace 下,如 `日程.md`):
524
-
525
- ```bash
526
- # <schedule_file> 替换为实际日程文件路径
527
- python3 /app/skills/schedule-reminder/scripts/append_event.py \
528
- --file <schedule_file> \
529
- --date "2026-03-03" \
530
- --start "15:00" \
531
- --end "16:00" \
532
- --title "客户会议" \
533
- --priority "中" \
534
- --advance 15
535
- ```
536
-
537
- **Step 3:询问是否立即设置提醒**
538
-
539
- ```
540
- 已写入日程 ✅
541
-
542
- 要现在就设置提醒吗?
543
- ⏰ 14:45 提醒你「客户会议」将在15分钟后开始
544
- ```
545
-
546
- ### 示例对话
547
-
548
- **用户**:明天下午3点有个客户会议,提前半小时提醒我
549
-
550
- **Bot**:
551
-
552
- ```
553
- 📅 确认日程:
554
- - 日期:2026-03-03(明天)
555
- - 时间:15:00 – 16:00
556
- - 事项:客户会议
557
- - 提前提醒:30 分钟(14:30 提醒)
558
-
559
- 确认写入日程?
560
- ```
561
-
562
- ---
563
-
564
- **用户**:下周五上午10点产品评审,会议室B,高优先级
565
-
566
- **Bot**:
567
-
568
- ```
569
- 📅 确认日程:
570
- - 日期:2026-03-06(下周五)
571
- - 时间:10:00 – 11:00
572
- - 事项:产品评审
573
- - 地点:会议室B
574
- - 优先级:🔴 高
575
- - 提前提醒:15 分钟
576
-
577
- 确认写入日程?
578
- ```
579
-
580
- ---
581
-
582
- **用户**:3月5号截止提交季度报告
583
-
584
- **Bot**:
585
-
586
- ```
587
- 📋 确认任务截止提醒:
588
- - 截止日期:2026-03-05
589
- - 事项:提交季度报告
590
- - 提前提醒:提前1天(3月4日早9点提醒)
591
-
592
- 确认写入?
593
- ```
594
-
595
- ---
596
-
597
- ## 十一、常用操作指令
598
-
599
- 用户可通过自然语言发出以下指令:
600
-
601
- | 用户说 | Agent 动作 |
602
- | ---------------------------- | ------------------------------------------ |
603
- | "明天下午3点客户会议" | 解析时间事项,确认后写入日程文件并可设提醒 |
604
- | "帮我加一条日程" | 引导用户输入时间、事项等信息 |
605
- | "帮我看今天的日程" | 解析日程表,展示今日预览,列出建议提醒 |
606
- | "设置今天所有日程的提醒" | 确认后批量创建今日提醒 cron 任务 |
607
- | "检查日程有没有冲突" | 仅运行冲突检测,输出冲突报告 |
608
- | "取消今天的所有提醒" | 列出并删除今日相关 cron 任务 |
609
- | "提前30分钟提醒我下午的会议" | 修改对应事项的提前时间后重新创建提醒 |
610
- | "帮我看明天的日程" | 筛选并展示明日事项 |
611
-
612
- ---
613
-
614
- ## 十二、安全与商用注意事项
615
-
616
- - 日程表中**不要填写密码、API Key、敏感合同金额**等信息。
617
- - 提醒消息只发送给**当前会话的发送者**(`{{sender}}`),不广播。
618
- - 提醒任务由 OpenClaw cron 管理,可通过 `openclaw cron list` 查看和删除。
619
- - 本 skill 仅负责**读取和调度**,不上传任何数据到第三方服务器。
1
+ ---
2
+ name: schedule-reminder
3
+ description: >
4
+ 智能日程提醒助手:从 Markdown 日程表中读取事项,自动筛选今日及近期需要提醒的任务,
5
+ 检测时间冲突,并发送定时提醒。
6
+ 默认通过当前对话界面回复提醒(用户在哪里发消息,提醒就回到哪里),无需任何渠道配置,开箱即用;
7
+ 触发场景:用户发送日程表文件、粘贴 Markdown 日程表内容、发送截图/Excel 文件、
8
+ 说"帮我看今天的日程"、"设置日程提醒"、"检查日程冲突"、"提醒我今天的会议"等。
9
+ 商业场景:团队日报/周报提醒、会议通知、任务截止提醒、个人日程管理。
10
+ metadata:
11
+ {
12
+ "openclaw":
13
+ { "emoji": "📅", "requires": { "tools": ["cron"], "bins": ["python3", "jq", "uv"] } },
14
+ }
15
+ ---
16
+
17
+ > **内置能力**:本 skill 已内置文件转换功能(基于 `markitdown`),支持直接发送 Excel、CSV、Word、PDF、PowerPoint 等文件作为日程输入,无需单独安装其他 skill。
18
+ > **图片/截图 OCR**:依赖 `sophnet-image-ocr` skill,请确保已安装。
19
+ > **⭐ 零配置提醒**:cron 提醒任务使用 `--system-event --session main`,直接在当前 agent session 中触发,兼容 Web 界面、钉钉、飞书、企业微信、Telegram 等所有渠道,无需填写任何渠道或 ID。
20
+
21
+ ## 加载时说明
22
+
23
+ 当用户启用此 skill 时,向用户发送以下欢迎语(语气友好,使用 Markdown):
24
+
25
+ > 📅 **日程管理助手已就绪!** 支持:
26
+ >
27
+ > - 用自然语言添加事项(如"明天下午3点开会"、"下周五提交报告")
28
+ > - 上传截图或图片,自动 OCR 识别日程内容
29
+ > - 发送表格或直接粘贴内容导入日程
30
+
31
+ > - 查看今日/近期日程、检测时间冲突、设置定时提醒
32
+ > - 提醒直接发到当前对话,无需任何配置
33
+ >
34
+ > 你想怎么开始?
35
+
36
+ ---
37
+
38
+ # 日程提醒助手 (Schedule Reminder)
39
+
40
+ 从 Markdown 日程表中读取事项,智能筛选待提醒项,检测冲突,并发送提醒。**用户在哪里对话,提醒就发回哪里,无需额外配置。**
41
+
42
+ ---
43
+
44
+ ## 一、日程表标准格式(入口文件)
45
+
46
+ 用户的日程表存放在一个 Markdown 文件中(通常命名为 `schedule.md` 或 `日程.md`),
47
+ 格式固定如下:
48
+
49
+ ```markdown
50
+ # 我的日程
51
+
52
+ > 文件路径:/home/node/.openclaw/workspace/日程.md
53
+ > 提醒渠道:current(可选:dingtalk / feishu / wecom / telegram)
54
+ > 默认提前提醒:15(分钟)
55
+
56
+ | 日期 | 开始时间 | 结束时间 | 事项 | 地点 | 参与者 | 优先级 | 提前(分钟) | 备注 |
57
+ | ---------- | -------- | -------- | ------------ | ---------- | --------- | ------ | ---------- | ----------- |
58
+ | 2026-03-02 | 09:00 | 10:00 | 周一全员周会 | 会议室A | 全员 | 高 | 15 | 带Q1目标PPT |
59
+ | 2026-03-02 | 10:30 | 11:30 | 客户方案评审 | 线上 | 张三,李四 | 高 | 30 | |
60
+ | 2026-03-02 | 14:00 | 14:30 | 1on1 与老板 | 老板办公室 | 我,老板 | 中 | 10 | |
61
+ | 2026-03-03 | 09:30 | 10:00 | 产品需求评审 | 会议室B | 产品组 | 中 | 15 | |
62
+ ```
63
+
64
+ ### 字段说明
65
+
66
+ | 字段 | 必填 | 格式 | 说明 |
67
+ | ---------- | ---- | ----------------- | ---------------------------------------- |
68
+ | 日期 | ✅ | YYYY-MM-DD | 事项日期 |
69
+ | 开始时间 | ✅ | HH:MM(24小时制) | 事项开始时间 |
70
+ | 结束时间 | ✅ | HH:MM | 事项结束时间(用于冲突检测) |
71
+ | 事项 | ✅ | 文字 | 事项名称,简短明了 |
72
+ | 地点 | ❌ | 文字 | 线下填地点,线上填"线上"或会议链接 |
73
+ | 参与者 | ❌ | 逗号分隔 | 相关人员,可留空 |
74
+ | 优先级 | ❌ | 高/中/低 | 默认"中";"高"必须提醒,"低"可跳过 |
75
+ | 提前(分钟) | ❌ | 数字 | 提前多少分钟发送提醒,留空则用全局默认值 |
76
+ | 备注 | ❌ | 文字 | 额外信息 |
77
+
78
+ ---
79
+
80
+ ## 二、Agent 工作流程
81
+
82
+ ### Step 1:读取并解析日程表
83
+
84
+ 当用户提供日程表文件路径或粘贴内容时,调用解析脚本:
85
+
86
+ ```bash
87
+ python3 /app/skills/schedule-reminder/scripts/parse_schedule.py \
88
+ --file <schedule_file> \
89
+ --mode today # today / tomorrow / week / all
90
+ ```
91
+
92
+ 脚本输出 JSON,包含:
93
+
94
+ - `events`:解析后的所有事项
95
+ - `upcoming`:需要提醒的事项(按时间排序)
96
+ - `conflicts`:时间冲突列表
97
+
98
+ ### Step 2:展示筛选结果给用户
99
+
100
+ 解析后,**向用户展示**以下信息:
101
+
102
+ #### 今日日程预览
103
+
104
+ 用 Markdown 表格展示今日事项(时间升序):
105
+
106
+ ```
107
+ 📅 **今日日程(3月2日)**
108
+
109
+ | 时间 | 事项 | 地点 | 优先级 | 提前提醒 |
110
+ |---------------|----------------|----------|--------|----------|
111
+ | 09:00–10:00 | 周一全员周会 | 会议室A | 🔴 高 | 15分钟 |
112
+ | 10:30–11:30 | 客户方案评审 | 线上 | 🔴 高 | 30分钟 |
113
+ | 14:00–14:30 | 1on1 与老板 | 老板办公室 | 🟡 中 | 10分钟 |
114
+ ```
115
+
116
+ #### 冲突提示(如有)
117
+
118
+ ```
119
+ ⚠️ **发现时间冲突:**
120
+ - 09:30–10:30 "产品需求评审" 与 09:00–10:00 "周会" 时间重叠 30 分钟
121
+ 建议:调整其中一项,或确认是否同时参加。
122
+ ```
123
+
124
+ #### 确认提醒设置
125
+
126
+ ```
127
+ 以下事项将设置提醒,将在提醒时间直接发回此对话:
128
+ - ⏰ 08:45 提醒 → 09:00 周一全员周会(提前15分钟)
129
+ - ⏰ 10:00 提醒 → 10:30 客户方案评审(提前30分钟)
130
+ - ⏰ 13:50 提醒 → 14:00 1on1(提前10分钟)
131
+
132
+ 是否确认创建提醒?(可调整某项的提前时间或跳过)
133
+ ```
134
+
135
+ **等待用户确认**后再执行 Step 3。
136
+
137
+ ### Step 3:创建提醒任务
138
+
139
+ 用户确认后,为每个事项创建 cron 任务:
140
+
141
+ ```bash
142
+ bash /app/skills/schedule-reminder/scripts/create_reminders.sh \
143
+ --events-json '/tmp/schedule_upcoming.json' \
144
+ --to "{{sender}}"
145
+ ```
146
+
147
+ > `--channel` 和 `--to` 均为可选,不传时默认回到最后一次对话渠道(`channel=last`)。需要推送给其他用户时再显式指定。
148
+
149
+ ---
150
+
151
+ ## 三、支持的提醒渠道
152
+
153
+ **cron 提醒任务使用 `--system-event + --session main`,在当前对话的 main session 中直接触发,无需任何渠道配置,天然兼容 Web 界面、钉钉、飞书、企业微信、Telegram 等所有渠道。**
154
+
155
+ > ✅ **为什么用 `--system-event` 而不是 `--message + --announce`?**
156
+ > `--message + --announce` 会启动 isolated subagent,结束后需要把结果推送(announce)回目标渠道。
157
+ > 但 webchat(Web 界面)不支持被 agent 主动推送,会报 `Unsupported channel: webchat` 错误。
158
+ > `--system-event + --session main` 直接在 main session 中注入事件,不走推送流程,所有渠道均可用。
159
+
160
+ **交互式提醒**(用户发消息触发):直接在当前对话中回复,零配置。
161
+
162
+ **cron 定时提醒**(`create_reminders.sh` 创建):使用 `--system-event --session main`,自动在当前 agent session 中显示提醒,无需指定渠道或收件人。
163
+
164
+ ---
165
+
166
+ ## 四、筛选逻辑
167
+
168
+ 优先筛选以下事项:
169
+
170
+ 1. **今日**所有未过期的事项(当前时间之后的事项)
171
+ 2. **明日**优先级为"高"的事项
172
+ 3. 优先级为"高"且**距今 ≤ 24 小时**的所有事项
173
+ 4. 有**截止时间/提交要求**的任务型事项(备注含"提交"、"截止"、"deadline"关键词)
174
+
175
+ 跳过以下事项:
176
+
177
+ - 优先级为"低"且用户没有明确要求提醒的
178
+ - 已过期(结束时间早于当前时间)的事项
179
+
180
+ ---
181
+
182
+ ## 五、冲突检测规则
183
+
184
+ 两个事项满足以下任一条件即视为**冲突**:
185
+
186
+ - 同一天,A 的开始时间 < B 的结束时间,且 A 的结束时间 > B 的开始时间(时间重叠)
187
+ - 同一天,两个事项开始时间相差 < 5 分钟(紧接场景,没有缓冲时间)
188
+
189
+ **冲突提示格式**:
190
+
191
+ ```
192
+ ⚠️ 冲突:[事项A](09:00-10:00)与 [事项B](09:30-11:00)重叠 30 分钟
193
+ 建议:将 [事项B] 改为 10:00 后开始,或确认是否线上可同时参与。
194
+ ```
195
+
196
+ ---
197
+
198
+ ## 六、提醒消息模板
199
+
200
+ 发送给用户的提醒消息格式:
201
+
202
+ ```
203
+ ⏰ 日程提醒
204
+
205
+ 📌 【周一全员周会】即将在 15 分钟后开始
206
+ 🕐 09:00 – 10:00
207
+ 📍 会议室A
208
+ 👥 参与者:全员
209
+ 📝 带Q1目标PPT
210
+
211
+ 祝会议顺利!
212
+ ```
213
+
214
+ ---
215
+
216
+ ## 七、一次性 vs 周期性提醒
217
+
218
+ | 场景 | 类型 | 说明 |
219
+ | ---------------------- | ------ | -------------------------------------------- |
220
+ | 单次会议/事项 | 一次性 | cron 执行后自动删除(`--delete-after-run`) |
221
+ | 每周固定会议(如周会) | 周期性 | 使用 `* * * * 1`(每周一)等周期 cron 表达式 |
222
+ | 每日站会 | 周期性 | 使用 `0 9 * * 1-5`(工作日每天) |
223
+
224
+ 检测规则:若同一事项在日程表中连续出现超过 2 次且时间规律,自动建议设置为周期性提醒。
225
+
226
+ ---
227
+
228
+ ## 八、主动激活方式(推荐用于商用)
229
+
230
+ ### 方式 A:一次性 Setup → 每天自动运行(推荐)
231
+
232
+ 管理员或用户**运行一次** setup.sh,之后每天自动激活,不需要任何手动触发:
233
+
234
+ ```bash
235
+ bash /app/skills/schedule-reminder/scripts/setup.sh
236
+ ```
237
+
238
+ 交互式引导:
239
+
240
+ 1. 输入日程文件路径(如 `/home/node/.openclaw/workspace/日程.md`)
241
+ 2. 选择推送渠道(dingtalk / feishu / wecom / telegram,仅在需要推送给特定用户时填写)
242
+ 3. 输入接收者 ID(可留空,留空则回到最后一次对话渠道)
243
+ 4. 设置每日激活时间(如 7 表示每天早上 7:00)
244
+
245
+ Setup 完成后自动注册 `schedule-reminder-daily-activate` cron 任务:
246
+
247
+ - **每天定时**运行 `daily_activate.sh`
248
+ - 自动解析日程文件 → 建今日提醒 → 发日报
249
+ - 用户无需操作,提醒准时到达
250
+
251
+ **带参数快速配置(脚本化部署,需要推送给特定渠道用户时):**
252
+
253
+ ```bash
254
+ bash /app/skills/schedule-reminder/scripts/setup.sh \
255
+ --file /home/node/.openclaw/workspace/日程.md \
256
+ --channel dingtalk \
257
+ --to "user_staff_id" \
258
+ --hour 7 \
259
+ --yes
260
+ ```
261
+
262
+ > 不指定 `--channel`/`--to` 时,提醒默认回到最后一次对话渠道,无需填写接收者 ID。
263
+
264
+ **手动立即触发(测试用):**
265
+
266
+ ```bash
267
+ bash /app/skills/schedule-reminder/scripts/daily_activate.sh
268
+ ```
269
+
270
+ **停止每日激活:**
271
+
272
+ ```bash
273
+ openclaw cron remove schedule-reminder-daily-activate
274
+ ```
275
+
276
+ ---
277
+
278
+ ### 方式 B:发送日程截图(sophnet-image-ocr)
279
+
280
+ 用户发送日程截图(手机截图、扫描件、PDF 等),Agent 使用 `sophnet-image-ocr` skill 提取表格文字,再写入日程文件。
281
+
282
+ #### ⚠️ 图片路径获取
283
+
284
+ **用户上传图片时,系统会自动对图片进行理解,结果以文字描述(`[Image] Description: ...`)出现在消息上下文中,Agent 可以直接读取描述内容。但如果需要对图片做 OCR(提取表格原文),则必须拿到图片文件的本地路径。**
285
+
286
+ 图片路径的获取策略(按优先级):
287
+
288
+ **优先级 1:主动搜索常见位置**
289
+
290
+ 收到图片消息后立即搜索最近修改的图片文件,**不要等用户提供路径**。上传的图片会先下载到 workspace 的 `media/inbound/` 目录,优先搜这里:
291
+
292
+ ```bash
293
+ # 1. workspace 的 media/inbound 目录(钉钉/飞书等渠道上传必在此处)
294
+ ls -t <workspace>/media/inbound/ 2>/dev/null | grep -iE '\.(jpg|jpeg|png|webp|bmp|gif|pdf)$' | head -3
295
+
296
+ # 2. 用户常见目录兜底
297
+ ls -t ~/Downloads/ ~/Pictures/ ~/Desktop/ 2>/dev/null \
298
+ | grep -iE '\.(jpg|jpeg|png|webp|bmp|gif|pdf)$' | head -3
299
+ ```
300
+
301
+ 找到候选文件后,展示给用户确认:"找到以下文件,是您刚上传的吗?",确认后再调用 OCR。
302
+
303
+ **优先级 2:用户补充提供**
304
+
305
+ 若搜索无结果,提示用户直接告知文件路径或粘贴到对话中。
306
+
307
+ **收到图片消息时,Agent 必须立即执行以下步骤,不要等待用户再次说明:**
308
+
309
+ 1. 按上述优先级确定图片绝对路径
310
+ 2. 用该路径调用 OCR,输出 Markdown
311
+ 3. 从 Markdown 中提取日程事项,展示给用户确认
312
+
313
+ #### 完整流程
314
+
315
+ **Step 1:确定图片路径,调用 OCR**
316
+
317
+ ```bash
318
+ # <image_path> 替换为搜索到的实际绝对路径
319
+ uv run /app/skills/sophnet-image-ocr/scripts/ocr.py <image_path>
320
+ ```
321
+
322
+ **Step 2:Agent 读取 OCR 输出的 Markdown,理解表格结构,提取日程事项**
323
+
324
+ 列名不标准、版式混乱 → Agent 根据上下文理解,直接提取日期、时间、事项等字段。
325
+
326
+ **Step 3:展示识别结果,用户确认后逐条写入日程文件**
327
+
328
+ ```bash
329
+ # <schedule_file> 替换为用户日程文件的实际路径(优先用用户告知的路径,否则用 workspace 下的 日程.md)
330
+ python3 /app/skills/schedule-reminder/scripts/append_event.py \
331
+ --file <schedule_file> \
332
+ --date "..." --start "..." --end "..." --title "..."
333
+ ```
334
+
335
+ **支持格式**:JPEG、PNG、WebP、BMP、GIF、PDF(多页自动合并)
336
+
337
+ ### 方式 C:指定本地文件路径
338
+
339
+ ```
340
+ 帮我看一下 ~/Documents/日程.md 今天的提醒
341
+ ```
342
+
343
+ ### 方式 D:通过入口文件触发
344
+
345
+ 在工作区根目录放置 `日程.md`,文件第一行包含触发指令:
346
+
347
+ ```markdown
348
+ <!-- skill: schedule-reminder -->
349
+
350
+ # 我的日程
351
+
352
+ ...(表格内容)
353
+ ```
354
+
355
+ Agent 检测到此文件时自动激活本 skill。
356
+
357
+ ### 方式 E:发送 Excel / CSV / Word / PDF 文件
358
+
359
+ 用户发送文件后,Agent 执行以下流程:
360
+
361
+ #### ⚠️ 文件路径获取
362
+
363
+ 上传的文件与图片走同一套机制,渠道(钉钉/飞书等)会将文件下载到 workspace 的 `media/inbound/` 目录,文件名为 `<timestamp>_<random>.<ext>`,**agent 无法提前知道文件名,必须主动搜索**。
364
+
365
+ **收到文件消息后立即搜索,不要等用户提供路径:**
366
+
367
+ ```bash
368
+ # 1. workspace 的 media/inbound 目录(渠道上传文件必在此处)
369
+ ls -t <workspace>/media/inbound/ 2>/dev/null \
370
+ | grep -iE '\.(xlsx|xls|csv|docx|pptx|pdf|html)$' | head -3
371
+
372
+ # 2. 用户常见目录兜底
373
+ ls -t ~/Downloads/ ~/Desktop/ 2>/dev/null \
374
+ | grep -iE '\.(xlsx|xls|csv|docx|pptx|pdf|html)$' | head -3
375
+ ```
376
+
377
+ 找到候选文件后,展示给用户确认是否是刚上传的文件,确认后再转换。若搜索无结果,提示用户告知文件路径。
378
+
379
+ #### Step 1:文件转 Markdown
380
+
381
+ ```bash
382
+ # <file_path> 替换为上面搜索到的实际绝对路径
383
+ uvx "markitdown[all]" <file_path> -o /tmp/schedule_converted.md
384
+ ```
385
+
386
+ 支持格式:Excel(`.xlsx/.xls`)、CSV(`.csv`)、Word(`.docx`)、PowerPoint(`.pptx`)、PDF(`.pdf`)、HTML(`.html`)
387
+
388
+ > ⚠️ 需要服务器安装 `uv`
389
+
390
+ #### Step 2:Agent 直接读取 Markdown 内容,提取日程事项
391
+
392
+ Agent 读取 `/tmp/schedule_converted.md` 的内容,**直接理解表格结构**,无需关心列名是否标准。
393
+
394
+ 从中提取每行事项的:日期、开始时间、结束时间、事项名称、地点、参与者、优先级、备注。
395
+
396
+ - 列名不标准(如"会期"、"主旨"、"时段开始")→ Agent 根据上下文理解含义,直接提取
397
+ - 缺少某些字段 → 使用默认值(优先级默认"中",提前提醒默认15分钟)
398
+ - 内容模糊 → Agent 在展示确认卡片时标注"待确认"
399
+
400
+ #### Step 3:展示识别结果,用户确认
401
+
402
+ ```
403
+ 📋 从文件中识别到以下日程,确认写入日程文件?
404
+
405
+ | 日期 | 时间 | 事项 | 地点 | 优先级 |
406
+ |------------|---------------|----------|-------|--------|
407
+ | 2026-03-10 | 10:00–11:30 | 季度复盘 | A101 | 中 |
408
+ | 2026-03-11 | 14:00–16:00 | 产品发布 | 线上 | 中 |
409
+
410
+ ✅ 全部写入 ✏️ 修改某项 ❌ 取消
411
+ ```
412
+
413
+ #### Step 4:逐条写入日程文件
414
+
415
+ 用户确认后,逐条调用 `append_event.py` 追加到日程文件(路径以用户告知为准,未告知则用 workspace 下的 `日程.md`):
416
+
417
+ ```bash
418
+ # <schedule_file> 替换为实际日程文件路径
419
+ python3 /app/skills/schedule-reminder/scripts/append_event.py \
420
+ --file <schedule_file> \
421
+ --date "2026-03-10" \
422
+ --start "10:00" \
423
+ --end "11:30" \
424
+ --title "季度复盘" \
425
+ --location "A101"
426
+ ```
427
+
428
+ 写入完成后,询问是否为今日/近期事项立即设置提醒。
429
+
430
+ ---
431
+
432
+ ## 九、间接日程:从他人时间表推导用户自己的行动
433
+
434
+ 用户有时发送的是**别人的时间表**(孩子课程表、配偶班次、会议室日历等),但用户真正需要记录的是**自己的关联行动**,不是对方的内容本身。
435
+
436
+ ### 识别特征
437
+
438
+ 以下情况属于"间接日程",Agent 需要主动推导用户行动,而不是原样照搬表格内容:
439
+
440
+ - 发送孩子课程表 + 说"我要接孩子"→ 记录的是**接送时间**,不是课程
441
+ - 发送他人会议日程 + 说"我要旁听/参与" → 记录的是**用户自己要出席**的事项
442
+ - 发送班次/排班表 + 说"这是我老婆的班,我负责接送" → 记录的是接送行动
443
+ - 发送活动日程 + 说"这些我都要去" → 逐条转化为用户自己的日程
444
+
445
+ ### 处理规则
446
+
447
+ **Agent 必须优先理解用户的意图,而不是照搬原表格内容。**
448
+
449
+ 1. **识别用户的行动**:从用户说的话中提取"我要做什么"(接送、旁听、参与、安排等)
450
+ 2. **推算用户行动的时间**:
451
+ - 接送场景:课程/活动结束时间 → 用户出发/到达时间(默认提前15分钟出发)
452
+ - 旁听/参与场景:直接使用对方事项的开始时间
453
+ 3. **记录用户自己的事项**,标注来源(如"备注:女儿课程表 周三 9:40-10:20")
454
+ 4. **不要把对方的课程/事项原样写入用户日程**,除非用户明确要求存档参考
455
+
456
+ ### 示例
457
+
458
+ 用户发课程表截图,说"我要接女儿,下课后15分钟内到":
459
+
460
+ ```
461
+ 📅 根据课程表,为您生成接送日程,请确认:
462
+
463
+ | 日期 | 出发时间 | 事项 | 备注 |
464
+ |---------|----------|-------------------|-------------------------|
465
+ | 每周一 | 10:15 | 接女儿放学 | 课程:语文 8:50-9:30 |
466
+ | 每周二 | 9:15 | 接女儿放学 | 课程:数学 8:50-9:30 |
467
+ | 每周三 | 14:25 | 接女儿放学 | 课程:体育 10:30-14:10 |
468
+ | 每周四 | 10:35 | 接女儿放学 | 课程:科学 10:30-? |
469
+ | 每周五 | 15:45 | 接女儿放学 | 课程:手工 14:50-15:30 |
470
+
471
+ ✅ 全部写入 ✏️ 修改某项 ❌ 取消
472
+ ```
473
+
474
+ ---
475
+
476
+ ## 十、自然语言快速创建日程
477
+
478
+ 用户可以直接用自然语言描述一个日程,Agent 自动解析并追加到日程文件。
479
+
480
+ ### 触发关键词
481
+
482
+ 用户说的话包含以下任意模式时,进入"创建日程"流程:
483
+
484
+ - 时间词 + 事项:`明天下午3点开会`、`下周五10点产品评审`
485
+ - 截止日期描述:`3月5号截止提交季度报告`
486
+ - 明确创建意图:`帮我加一条日程`、`记一下`、`加个提醒`
487
+
488
+ ### 解析规则
489
+
490
+ | 用户说的内容 | 解析结果 |
491
+ | -------------------- | ------------------------- |
492
+ | `明天` | 明天的日期(当前日期 +1) |
493
+ | `下周五` | 下一个周五的日期 |
494
+ | `3月5号` / `3/5` | 当年对应日期 |
495
+ | `上午10点` / `10:00` | 开始时间 10:00 |
496
+ | `下午3点` | 开始时间 15:00 |
497
+ | `两小时` / `1小时` | 推算结束时间 |
498
+ | 未说结束时间 | 默认事项时长 1 小时 |
499
+ | 未说优先级 | 默认"中" |
500
+ | 未说地点/参与者 | 留空 |
501
+
502
+ ### 工作流程
503
+
504
+ **Step 1:解析用户输入,展示确认卡片**
505
+
506
+ ```
507
+ 📅 我帮你记录了这条日程,请确认:
508
+
509
+ | 字段 | 内容 |
510
+ |----------|-------------------|
511
+ | 日期 | 2026-03-03(明天)|
512
+ | 时间 | 15:00 – 16:00 |
513
+ | 事项 | 客户会议 |
514
+ | 地点 |(未填) |
515
+ | 优先级 | 中 |
516
+ | 提前提醒 | 15 分钟 |
517
+
518
+ ✅ 确认写入 ✏️ 修改某项 ❌ 取消
519
+ ```
520
+
521
+ **Step 2:用户确认后,追加到日程文件**
522
+
523
+ 将新事项追加到用户的日程文件(优先使用用户告知的路径,未告知则推荐存放在 workspace 下,如 `日程.md`):
524
+
525
+ ```bash
526
+ # <schedule_file> 替换为实际日程文件路径
527
+ python3 /app/skills/schedule-reminder/scripts/append_event.py \
528
+ --file <schedule_file> \
529
+ --date "2026-03-03" \
530
+ --start "15:00" \
531
+ --end "16:00" \
532
+ --title "客户会议" \
533
+ --priority "中" \
534
+ --advance 15
535
+ ```
536
+
537
+ **Step 3:询问是否立即设置提醒**
538
+
539
+ ```
540
+ 已写入日程 ✅
541
+
542
+ 要现在就设置提醒吗?
543
+ ⏰ 14:45 提醒你「客户会议」将在15分钟后开始
544
+ ```
545
+
546
+ ### 示例对话
547
+
548
+ **用户**:明天下午3点有个客户会议,提前半小时提醒我
549
+
550
+ **Bot**:
551
+
552
+ ```
553
+ 📅 确认日程:
554
+ - 日期:2026-03-03(明天)
555
+ - 时间:15:00 – 16:00
556
+ - 事项:客户会议
557
+ - 提前提醒:30 分钟(14:30 提醒)
558
+
559
+ 确认写入日程?
560
+ ```
561
+
562
+ ---
563
+
564
+ **用户**:下周五上午10点产品评审,会议室B,高优先级
565
+
566
+ **Bot**:
567
+
568
+ ```
569
+ 📅 确认日程:
570
+ - 日期:2026-03-06(下周五)
571
+ - 时间:10:00 – 11:00
572
+ - 事项:产品评审
573
+ - 地点:会议室B
574
+ - 优先级:🔴 高
575
+ - 提前提醒:15 分钟
576
+
577
+ 确认写入日程?
578
+ ```
579
+
580
+ ---
581
+
582
+ **用户**:3月5号截止提交季度报告
583
+
584
+ **Bot**:
585
+
586
+ ```
587
+ 📋 确认任务截止提醒:
588
+ - 截止日期:2026-03-05
589
+ - 事项:提交季度报告
590
+ - 提前提醒:提前1天(3月4日早9点提醒)
591
+
592
+ 确认写入?
593
+ ```
594
+
595
+ ---
596
+
597
+ ## 十一、常用操作指令
598
+
599
+ 用户可通过自然语言发出以下指令:
600
+
601
+ | 用户说 | Agent 动作 |
602
+ | ---------------------------- | ------------------------------------------ |
603
+ | "明天下午3点客户会议" | 解析时间事项,确认后写入日程文件并可设提醒 |
604
+ | "帮我加一条日程" | 引导用户输入时间、事项等信息 |
605
+ | "帮我看今天的日程" | 解析日程表,展示今日预览,列出建议提醒 |
606
+ | "设置今天所有日程的提醒" | 确认后批量创建今日提醒 cron 任务 |
607
+ | "检查日程有没有冲突" | 仅运行冲突检测,输出冲突报告 |
608
+ | "取消今天的所有提醒" | 列出并删除今日相关 cron 任务 |
609
+ | "提前30分钟提醒我下午的会议" | 修改对应事项的提前时间后重新创建提醒 |
610
+ | "帮我看明天的日程" | 筛选并展示明日事项 |
611
+
612
+ ---
613
+
614
+ ## 十二、安全与商用注意事项
615
+
616
+ - 日程表中**不要填写密码、API Key、敏感合同金额**等信息。
617
+ - 提醒消息只发送给**当前会话的发送者**(`{{sender}}`),不广播。
618
+ - 提醒任务由 OpenClaw cron 管理,可通过 `openclaw cron list` 查看和删除。
619
+ - 本 skill 仅负责**读取和调度**,不上传任何数据到第三方服务器。