codewave-openclaw-installer 2.1.12 → 2.2.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 (221) hide show
  1. package/bin/install-lib.mjs +11 -0
  2. package/bin/install.mjs +59 -1
  3. package/package.json +12 -1
  4. package/skills/acceptance-doc-entry/SKILL.md +54 -1
  5. package/skills/ppt-master/SKILL.md +17 -390
  6. package/skills/ppt-master/projects/.gitkeep +0 -0
  7. package/skills/ppt-master/references/executor-base.md +4 -3
  8. package/skills/ppt-master/references/image-generator.md +6 -93
  9. package/skills/ppt-master/references/strategist.md +5 -8
  10. package/skills/ppt-master/scripts/README.md +1 -1
  11. package/skills/ppt-master/scripts/finalize_svg.py +0 -14
  12. package/skills/ppt-master/scripts/svg_quality_checker.py +8 -169
  13. package/skills/ppt-master/scripts/svg_to_pptx/pptx_builder.py +1 -7
  14. package/skills/ppt-master/scripts/svg_to_pptx/pptx_cli.py +0 -14
  15. package/skills/risk-alert/SKILL.md +110 -0
  16. package/skills/risk-alert/config.example.json +21 -0
  17. package/skills/risk-alert/scheduler.sh +74 -0
  18. package/skills/risk-alert/scripts/analyze-risk.js +414 -0
  19. package/skills/risk-alert/scripts/config-manager.js +241 -0
  20. package/skills/risk-alert/scripts/push-beautiful.js +225 -0
  21. package/skills/risk-alert/scripts/risk-alert.js +136 -0
  22. package/skills/risk-alert/scripts/run-full.js +60 -0
  23. package/skills/risk-alert/trigger-risk-alert.sh +35 -0
  24. package/skills/ppt-master/.env.example +0 -35
  25. package/skills/ppt-master/README.md +0 -90
  26. package/skills/ppt-master/audit_report_model_perf.md +0 -213
  27. package/skills/ppt-master/audit_report_portability.md +0 -90
  28. package/skills/ppt-master/audit_report_robustness.md +0 -192
  29. package/skills/ppt-master/audit_report_workflow.md +0 -233
  30. package/skills/ppt-master/fix_report_bid.md +0 -51
  31. package/skills/ppt-master/fix_report_scripts.md +0 -41
  32. package/skills/ppt-master/references/bid-content-example-netease.md +0 -815
  33. package/skills/ppt-master/references/bid-content-template.md +0 -390
  34. package/skills/ppt-master/references/bid-example-netease.md +0 -339
  35. package/skills/ppt-master/references/bid-presentation.md +0 -384
  36. package/skills/ppt-master/references/bid-svgs/03_toc.svg +0 -38
  37. package/skills/ppt-master/references/bid-svgs/04_chapter_company.svg +0 -7
  38. package/skills/ppt-master/references/bid-svgs/05_company_overview.svg +0 -28
  39. package/skills/ppt-master/references/bid-svgs/06_vision_business.svg +0 -45
  40. package/skills/ppt-master/references/bid-svgs/07_product_system.svg +0 -52
  41. package/skills/ppt-master/references/bid-svgs/08_codewave_timeline.svg +0 -29
  42. package/skills/ppt-master/references/bid-svgs/09_certifications.svg +0 -33
  43. package/skills/ppt-master/references/bid-svgs/10_client_logos.svg +0 -25
  44. package/skills/ppt-master/references/bid-svgs/11_brand_mission.svg +0 -14
  45. package/skills/ppt-master/references/bid-svgs/12_chapter_demand.svg +0 -7
  46. package/skills/ppt-master/references/bid-svgs/16_chapter_advantages.svg +0 -7
  47. package/skills/ppt-master/references/bid-svgs/18_platform_arch.svg +0 -24
  48. package/skills/ppt-master/references/bid-svgs/19_function_matrix.svg +0 -35
  49. package/skills/ppt-master/references/bid-svgs/20_dev_arch.svg +0 -29
  50. package/skills/ppt-master/references/bid-svgs/21_source_code.svg +0 -25
  51. package/skills/ppt-master/references/bid-svgs/22_ai_dev.svg +0 -27
  52. package/skills/ppt-master/references/bid-svgs/23_asset_market.svg +0 -33
  53. package/skills/ppt-master/references/bid-svgs/24_multi_org.svg +0 -28
  54. package/skills/ppt-master/references/bid-svgs/25_i18n.svg +0 -22
  55. package/skills/ppt-master/references/bid-svgs/26_multi_tenant.svg +0 -25
  56. package/skills/ppt-master/references/bid-svgs/27_integration.svg +0 -27
  57. package/skills/ppt-master/references/bid-svgs/28_permission.svg +0 -31
  58. package/skills/ppt-master/references/bid-svgs/29_security.svg +0 -25
  59. package/skills/ppt-master/references/bid-svgs/30_ai_capabilities.svg +0 -21
  60. package/skills/ppt-master/references/bid-svgs/31_product_combo.svg +0 -25
  61. package/skills/ppt-master/references/bid-svgs/32_digital_transform.svg +0 -28
  62. package/skills/ppt-master/references/bid-svgs/33_chapter_cases.svg +0 -7
  63. package/skills/ppt-master/references/bid-svgs/34_cummins_case.svg +0 -23
  64. package/skills/ppt-master/references/bid-svgs/35_cpq_cost.svg +0 -22
  65. package/skills/ppt-master/references/bid-svgs/36_tech_platform.svg +0 -18
  66. package/skills/ppt-master/references/bid-svgs/37_platform_value.svg +0 -24
  67. package/skills/ppt-master/references/bid-svgs/38_operation_plan.svg +0 -25
  68. package/skills/ppt-master/references/bid-svgs/39_zpmc_case.svg +0 -21
  69. package/skills/ppt-master/references/bid-svgs/40_zpmc_apps.svg +0 -23
  70. package/skills/ppt-master/references/bid-svgs/41_chapter_service.svg +0 -7
  71. package/skills/ppt-master/references/bid-svgs/42_tech_support.svg +0 -24
  72. package/skills/ppt-master/references/bid-svgs/43_knowledge_transfer.svg +0 -25
  73. package/skills/ppt-master/references/bid-svgs/44_operation_promotion.svg +0 -20
  74. package/skills/ppt-master/references/bid-svgs/45_custom_dev_guide.svg +0 -24
  75. package/skills/ppt-master/references/bid-svgs/46_sla_guarantee.svg +0 -18
  76. package/skills/ppt-master/references/bid-svgs/47_strategic_cooperation.svg +0 -25
  77. package/skills/ppt-master/references/bid-svgs/48_ecosystem.svg +0 -24
  78. package/skills/ppt-master/references/bid-svgs/49_chapter_delivery.svg +0 -23
  79. package/skills/ppt-master/references/bid-svgs/53_pm_intro.svg +0 -24
  80. package/skills/ppt-master/references/bid-svgs/54_after_sales.svg +0 -27
  81. package/skills/ppt-master/references/bid-svgs/55_ending.svg +0 -8
  82. package/skills/ppt-master/references/company_intro.md +0 -93
  83. package/skills/ppt-master/references/company_intro_images/slide1_img00.png +0 -0
  84. package/skills/ppt-master/references/company_intro_images/slide1_img01.png +0 -0
  85. package/skills/ppt-master/references/company_intro_images/slide1_img02.png +0 -0
  86. package/skills/ppt-master/references/company_intro_images/slide1_img03.png +0 -0
  87. package/skills/ppt-master/references/company_intro_images/slide1_img04.png +0 -0
  88. package/skills/ppt-master/references/company_intro_images/slide1_img05.png +0 -0
  89. package/skills/ppt-master/references/company_intro_images/slide1_img06.png +0 -0
  90. package/skills/ppt-master/references/company_intro_images/slide1_img07.png +0 -0
  91. package/skills/ppt-master/references/company_intro_images/slide1_img08.png +0 -0
  92. package/skills/ppt-master/references/company_intro_images/slide1_img09.png +0 -0
  93. package/skills/ppt-master/references/company_intro_images/slide1_img10.png +0 -0
  94. package/skills/ppt-master/references/company_intro_images/slide1_img11.png +0 -0
  95. package/skills/ppt-master/references/company_intro_images/slide1_img12.png +0 -0
  96. package/skills/ppt-master/references/company_intro_images/slide1_img13.png +0 -0
  97. package/skills/ppt-master/references/company_intro_images/slide1_img14.png +0 -0
  98. package/skills/ppt-master/references/company_intro_images/slide1_img15.png +0 -0
  99. package/skills/ppt-master/references/company_intro_images/slide1_img16.png +0 -0
  100. package/skills/ppt-master/references/company_intro_images/slide1_img17.png +0 -0
  101. package/skills/ppt-master/references/company_intro_images/slide1_img18.png +0 -0
  102. package/skills/ppt-master/references/company_intro_images/slide1_img19.png +0 -0
  103. package/skills/ppt-master/references/company_intro_images/slide1_img20.png +0 -0
  104. package/skills/ppt-master/references/company_intro_images/slide1_img21.png +0 -0
  105. package/skills/ppt-master/references/company_intro_images/slide1_img22.png +0 -0
  106. package/skills/ppt-master/references/company_intro_images/slide1_img23.png +0 -0
  107. package/skills/ppt-master/references/company_intro_images/slide1_img24.png +0 -0
  108. package/skills/ppt-master/references/company_intro_images/slide1_img25.png +0 -0
  109. package/skills/ppt-master/references/company_intro_images/slide1_img26.png +0 -0
  110. package/skills/ppt-master/references/company_intro_images/slide1_img27.png +0 -0
  111. package/skills/ppt-master/references/company_intro_images/slide1_img28.png +0 -0
  112. package/skills/ppt-master/references/company_intro_images/slide1_img29.png +0 -0
  113. package/skills/ppt-master/references/company_intro_images/slide2_img30.png +0 -0
  114. package/skills/ppt-master/references/company_intro_images/slide2_img31.jpg +0 -0
  115. package/skills/ppt-master/references/company_intro_images/slide3_img32.png +0 -0
  116. package/skills/ppt-master/references/company_intro_images/slide3_img33.png +0 -0
  117. package/skills/ppt-master/references/drawio-integration.md +0 -144
  118. package/skills/ppt-master/requirements.txt +0 -19
  119. package/skills/ppt-master/resources/backgrounds/chapter_bg.png +0 -0
  120. package/skills/ppt-master/resources/backgrounds/company_bg.png +0 -0
  121. package/skills/ppt-master/resources/backgrounds/cover_bg.png +0 -0
  122. package/skills/ppt-master/resources/backgrounds/index.json +0 -40
  123. package/skills/ppt-master/resources/backgrounds/tech_bg.png +0 -0
  124. package/skills/ppt-master/scripts/__pycache__/config.cpython-314.pyc +0 -0
  125. package/skills/ppt-master/scripts/__pycache__/error_helper.cpython-314.pyc +0 -0
  126. package/skills/ppt-master/scripts/__pycache__/pptx_animations.cpython-314.pyc +0 -0
  127. package/skills/ppt-master/scripts/__pycache__/project_utils.cpython-314.pyc +0 -0
  128. package/skills/ppt-master/scripts/arch_diagram.py +0 -370
  129. package/skills/ppt-master/scripts/bid_init.py +0 -79
  130. package/skills/ppt-master/scripts/drawio_gen.py +0 -366
  131. package/skills/ppt-master/scripts/drawio_to_svg.py +0 -458
  132. package/skills/ppt-master/scripts/image_backends/__pycache__/__init__.cpython-314.pyc +0 -0
  133. package/skills/ppt-master/scripts/image_backends/__pycache__/backend_aigw_gemini.cpython-314.pyc +0 -0
  134. package/skills/ppt-master/scripts/image_backends/__pycache__/backend_common.cpython-314.pyc +0 -0
  135. package/skills/ppt-master/scripts/svg_finalize/__pycache__/__init__.cpython-314.pyc +0 -0
  136. package/skills/ppt-master/scripts/svg_finalize/__pycache__/crop_images.cpython-314.pyc +0 -0
  137. package/skills/ppt-master/scripts/svg_finalize/__pycache__/embed_icons.cpython-314.pyc +0 -0
  138. package/skills/ppt-master/scripts/svg_finalize/__pycache__/embed_images.cpython-314.pyc +0 -0
  139. package/skills/ppt-master/scripts/svg_finalize/__pycache__/fix_image_aspect.cpython-314.pyc +0 -0
  140. package/skills/ppt-master/scripts/svg_finalize/__pycache__/flatten_tspan.cpython-314.pyc +0 -0
  141. package/skills/ppt-master/scripts/svg_finalize/__pycache__/svg_rect_to_path.cpython-314.pyc +0 -0
  142. package/skills/ppt-master/scripts/svg_page_gen.py +0 -871
  143. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/__init__.cpython-314.pyc +0 -0
  144. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_context.cpython-314.pyc +0 -0
  145. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_converter.cpython-314.pyc +0 -0
  146. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_elements.cpython-314.pyc +0 -0
  147. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_paths.cpython-314.pyc +0 -0
  148. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_styles.cpython-314.pyc +0 -0
  149. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_utils.cpython-314.pyc +0 -0
  150. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_builder.cpython-314.pyc +0 -0
  151. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_cli.cpython-314.pyc +0 -0
  152. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_dimensions.cpython-314.pyc +0 -0
  153. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_discovery.cpython-314.pyc +0 -0
  154. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_media.cpython-314.pyc +0 -0
  155. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_notes.cpython-314.pyc +0 -0
  156. package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_slide_xml.cpython-314.pyc +0 -0
  157. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204}/01_cover.svg" +0 -0
  158. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204}/02_chapter.svg" +0 -0
  159. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204}/02_toc.svg" +0 -0
  160. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204}/03_content.svg" +0 -0
  161. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204}/04_ending.svg" +0 -0
  162. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204}/design_spec.md" +0 -0
  163. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210//316/243/342/225/225/302/241/317/203/302/242/342/225/234/302/265/342/226/221/342/224/244/317/203e/314/200i/314/201logo.png" → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204//344/270/255/345/233/275/346/260/264/345/212/241logo.png"} +0 -0
  164. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210//317/203i/314/200A/314/210/316/243/342/225/225/302/243/316/230O/314/210o/314/201logo.png" → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204//345/215/216/344/270/234/351/231/242logo.png"} +0 -0
  165. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210//302/265/342/226/221/342/224/244/317/204o/314/210/342/225/241/316/243/342/225/225e/314/210/317/203/342/226/222C/314/247logo.png" → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204//346/260/264/347/224/265/344/270/211/345/261/200logo.png"} +0 -0
  166. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210//317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221logo.png" → 344/270/255/345/233/275/347/224/265/345/273/272_/345/270/270/350/247/204//347/224/265/345/273/272logo.png"} +0 -0
  167. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243}/01_cover.svg" +0 -0
  168. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243}/02_chapter.svg" +0 -0
  169. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243}/02_toc.svg" +0 -0
  170. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243}/03_content.svg" +0 -0
  171. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243}/04_ending.svg" +0 -0
  172. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243}/design_spec.md" +0 -0
  173. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201//316/243/342/225/225/302/241/317/203/302/242/342/225/234/302/265/342/226/221/342/224/244/317/203e/314/200i/314/201logo.png" → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243//344/270/255/345/233/275/346/260/264/345/212/241logo.png"} +0 -0
  174. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201//317/203i/314/200A/314/210/316/243/342/225/225/302/243/316/230O/314/210o/314/201logo.png" → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243//345/215/216/344/270/234/351/231/242logo.png"} +0 -0
  175. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201//302/265/342/226/221/342/224/244/317/204o/314/210/342/225/241/316/243/342/225/225e/314/210/317/203/342/226/222C/314/247logo.png" → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243//346/260/264/347/224/265/344/270/211/345/261/200logo.png"} +0 -0
  176. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/317/203/302/242/342/225/234/317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201//317/204o/314/210/342/225/241/317/203/342/225/227/342/225/221logo.png" → 344/270/255/345/233/275/347/224/265/345/273/272_/347/216/260/344/273/243//347/224/265/345/273/272logo.png"} +0 -0
  177. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241}/01_cover.svg" +0 -0
  178. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241}/02_chapter.svg" +0 -0
  179. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241}/02_toc.svg" +0 -0
  180. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241}/03_content.svg" +0 -0
  181. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241}/04_ending.svg" +0 -0
  182. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241}/design_spec.md" +0 -0
  183. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203o/314/200a/314/212/317/203e/314/200i/314/201//317/203A/314/212/342/224/202/316/243/342/225/225e/314/200/316/246/302/272/303/206 logo.png" → 344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241//345/217/263/344/270/212/350/247/222 logo.png"} +0 -0
  184. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203o/314/200a/314/212/317/203e/314/200i/314/201//317/203n/314/203/302/272/317/203/342/202/247i/314/210 logo.png" → 344/270/255/346/261/275/347/240/224_/345/225/206/345/212/241//345/244/247/345/236/213 logo.png"} +0 -0
  185. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204}/01_cover.svg" +0 -0
  186. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204}/02_chapter.svg" +0 -0
  187. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204}/02_toc.svg" +0 -0
  188. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204}/03_content.svg" +0 -0
  189. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204}/04_ending.svg" +0 -0
  190. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210 → 344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204}/design_spec.md" +0 -0
  191. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210//317/203A/314/212/342/224/202/316/243/342/225/225e/314/200/316/246/302/272/303/206 logo.png" → 344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204//345/217/263/344/270/212/350/247/222 logo.png"} +0 -0
  192. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/203/342/225/225/342/225/225/316/246/302/272a/314/210//317/203n/314/203/302/272/317/203/342/202/247i/314/210 logo.png" → 344/270/255/346/261/275/347/240/224_/345/270/270/350/247/204//345/244/247/345/236/213 logo.png"} +0 -0
  193. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243}/01_cover.svg" +0 -0
  194. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243}/02_chapter.svg" +0 -0
  195. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243}/02_toc.svg" +0 -0
  196. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243}/03_content.svg" +0 -0
  197. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243}/04_ending.svg" +0 -0
  198. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201 → 344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243}/design_spec.md" +0 -0
  199. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201//317/203A/314/212/342/224/202/316/243/342/225/225e/314/200/316/246/302/272/303/206 logo.png" → 344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243//345/217/263/344/270/212/350/247/222 logo.png"} +0 -0
  200. /package/skills/ppt-master/templates/layouts//{316/243/342/225/225/302/241/302/265/342/226/222/342/225/234/317/204a/314/201o/314/210_/317/204A/314/210/342/226/221/316/243/342/225/227u/314/201//317/203n/314/203/302/272/317/203/342/202/247i/314/210 logo.png" → 344/270/255/346/261/275/347/240/224_/347/216/260/344/273/243//345/244/247/345/236/213 logo.png"} +0 -0
  201. /package/skills/ppt-master/templates/layouts//{302/265i/314/210/302/242/317/203o/314/200a/314/212/316/230o/314/202/342/225/242/316/246i/314/201i/314/202 → 346/213/233/345/225/206/351/223/266/350/241/214}/01_cover.svg" +0 -0
  202. /package/skills/ppt-master/templates/layouts//{302/265i/314/210/302/242/317/203o/314/200a/314/212/316/230o/314/202/342/225/242/316/246i/314/201i/314/202 → 346/213/233/345/225/206/351/223/266/350/241/214}/02_chapter.svg" +0 -0
  203. /package/skills/ppt-master/templates/layouts//{302/265i/314/210/302/242/317/203o/314/200a/314/212/316/230o/314/202/342/225/242/316/246i/314/201i/314/202 → 346/213/233/345/225/206/351/223/266/350/241/214}/02_toc.svg" +0 -0
  204. /package/skills/ppt-master/templates/layouts//{302/265i/314/210/302/242/317/203o/314/200a/314/212/316/230o/314/202/342/225/242/316/246i/314/201i/314/202 → 346/213/233/345/225/206/351/223/266/350/241/214}/03_content.svg" +0 -0
  205. /package/skills/ppt-master/templates/layouts//{302/265i/314/210/302/242/317/203o/314/200a/314/212/316/230o/314/202/342/225/242/316/246i/314/201i/314/202 → 346/213/233/345/225/206/351/223/266/350/241/214}/04_ending.svg" +0 -0
  206. /package/skills/ppt-master/templates/layouts//{302/265i/314/210/302/242/317/203o/314/200a/314/212/316/230o/314/202/342/225/242/316/246i/314/201i/314/202 → 346/213/233/345/225/206/351/223/266/350/241/214}/design_spec.md" +0 -0
  207. /package/skills/ppt-master/templates/layouts//{302/265i/314/210/302/242/317/203o/314/200a/314/212/316/230o/314/202/342/225/242/316/246i/314/201i/314/202//302/265i/314/210/302/242/317/203o/314/200a/314/212/316/230o/314/202/342/225/242/316/246i/314/201i/314/202/317/203a/314/200/302/274/317/203A/314/212/342/225/225/316/230c/314/247/303/246/316/246/342/202/247i/314/200.png" → 346/213/233/345/225/206/351/223/266/350/241/214//346/213/233/345/225/206/351/223/266/350/241/214/345/205/254/345/217/270/351/207/221/350/236/215.png"} +0 -0
  208. /package/skills/ppt-master/templates/layouts//{317/204/302/272/303/246/302/265e/314/200C/314/247/316/246o/314/202/302/245/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 347/247/221/346/212/200/350/223/235/345/225/206/345/212/241}/01_cover.svg" +0 -0
  209. /package/skills/ppt-master/templates/layouts//{317/204/302/272/303/246/302/265e/314/200C/314/247/316/246o/314/202/302/245/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 347/247/221/346/212/200/350/223/235/345/225/206/345/212/241}/02_chapter.svg" +0 -0
  210. /package/skills/ppt-master/templates/layouts//{317/204/302/272/303/246/302/265e/314/200C/314/247/316/246o/314/202/302/245/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 347/247/221/346/212/200/350/223/235/345/225/206/345/212/241}/02_toc.svg" +0 -0
  211. /package/skills/ppt-master/templates/layouts//{317/204/302/272/303/246/302/265e/314/200C/314/247/316/246o/314/202/302/245/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 347/247/221/346/212/200/350/223/235/345/225/206/345/212/241}/03_content.svg" +0 -0
  212. /package/skills/ppt-master/templates/layouts//{317/204/302/272/303/246/302/265e/314/200C/314/247/316/246o/314/202/302/245/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 347/247/221/346/212/200/350/223/235/345/225/206/345/212/241}/04_ending.svg" +0 -0
  213. /package/skills/ppt-master/templates/layouts//{317/204/302/272/303/246/302/265e/314/200C/314/247/316/246o/314/202/302/245/317/203o/314/200a/314/212/317/203e/314/200i/314/201 → 347/247/221/346/212/200/350/223/235/345/225/206/345/212/241}/design_spec.md" +0 -0
  214. /package/skills/ppt-master/templates/layouts/{Technology Blue Business/01_cover.svg → /351/207/215/345/272/206/345/244/247/345/255/246/01_cover.svg"} +0 -0
  215. /package/skills/ppt-master/templates/layouts/{Technology Blue Business/02_chapter.svg → /351/207/215/345/272/206/345/244/247/345/255/246/02_chapter.svg"} +0 -0
  216. /package/skills/ppt-master/templates/layouts/{Technology Blue Business/02_toc.svg → /351/207/215/345/272/206/345/244/247/345/255/246/02_toc.svg"} +0 -0
  217. /package/skills/ppt-master/templates/layouts/{Technology Blue Business/03_content.svg → /351/207/215/345/272/206/345/244/247/345/255/246/03_content.svg"} +0 -0
  218. /package/skills/ppt-master/templates/layouts/{Technology Blue Business/04_ending.svg → /351/207/215/345/272/206/345/244/247/345/255/246/04_ending.svg"} +0 -0
  219. /package/skills/ppt-master/templates/layouts/{Technology Blue Business/design_spec.md → /351/207/215/345/272/206/345/244/247/345/255/246/design_spec.md"} +0 -0
  220. /package/skills/ppt-master/templates/layouts/{Technology Blue Business//316/230c/314/247i/314/200/317/203/342/225/221a/314/212/317/203n/314/203/302/272/317/203/302/241/302/252logo.png" → /351/207/215/345/272/206/345/244/247/345/255/246//351/207/215/345/272/206/345/244/247/345/255/246logo.png"} +0 -0
  221. /package/skills/ppt-master/templates/layouts/{Technology Blue Business//316/230c/314/247i/314/200/317/203/342/225/221a/314/212/317/203n/314/203/302/272/317/203/302/241/302/252logo2.png" → /351/207/215/345/272/206/345/244/247/345/255/246//351/207/215/345/272/206/345/244/247/345/255/246logo2.png"} +0 -0
@@ -0,0 +1,225 @@
1
+ #!/usr/bin/env node
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const https = require('https');
5
+ const { loadConfig, getCredentials } = require('./config-manager');
6
+
7
+ // 加载配置
8
+ const CONFIG = loadConfig();
9
+ const CREDENTIALS = getCredentials(CONFIG);
10
+
11
+ async function getAccessToken() {
12
+ return new Promise((resolve, reject) => {
13
+ const req = https.request({
14
+ hostname: 'open.feishu.cn',
15
+ path: '/open-apis/auth/v3/tenant_access_token/internal',
16
+ method: 'POST',
17
+ headers: { 'Content-Type': 'application/json; charset=utf-8' }
18
+ }, res => {
19
+ let data = '';
20
+ res.on('data', chunk => data += chunk);
21
+ res.on('end', () => {
22
+ try {
23
+ const r = JSON.parse(data);
24
+ r.code === 0 ? resolve(r.tenant_access_token) : reject(new Error(r.msg));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ });
29
+ });
30
+ req.on('error', reject);
31
+ req.write(JSON.stringify({
32
+ app_id: CREDENTIALS.appId,
33
+ app_secret: CREDENTIALS.appSecret
34
+ }));
35
+ req.end();
36
+ });
37
+ }
38
+
39
+ async function sendCard(token, card, targetType, targetId) {
40
+ const receive_id_type = targetType === 'chat' ? 'chat_id' : 'open_id';
41
+ const receive_id = targetId;
42
+ const payload = JSON.stringify({
43
+ receive_id: receive_id,
44
+ msg_type: 'interactive',
45
+ content: JSON.stringify(card)
46
+ });
47
+
48
+ return new Promise((resolve, reject) => {
49
+ const req = https.request({
50
+ hostname: 'open.feishu.cn',
51
+ path: `/open-apis/im/v1/messages?receive_id_type=${receive_id_type}`,
52
+ method: 'POST',
53
+ headers: {
54
+ 'Authorization': `Bearer ${token}`,
55
+ 'Content-Type': 'application/json; charset=utf-8'
56
+ }
57
+ }, res => {
58
+ let data = '';
59
+ res.on('data', chunk => data += chunk);
60
+ res.on('end', () => {
61
+ try {
62
+ const r = JSON.parse(data);
63
+ r.code === 0 ? resolve(r) : reject(new Error(r.msg));
64
+ } catch (e) {
65
+ reject(e);
66
+ }
67
+ });
68
+ });
69
+ req.on('error', reject);
70
+ req.write(payload);
71
+ req.end();
72
+ });
73
+ }
74
+
75
+ function generateCard(data) {
76
+ if (!data || !data.riskCount) {
77
+ return {
78
+ config: { wide_screen_mode: true },
79
+ header: {
80
+ template: "red",
81
+ title: { content: "❌ 报告生成失败", tag: "plain_text" }
82
+ },
83
+ elements: [{ tag: "div", text: { content: "未能加载风险数据。", tag: "lark_md" } }]
84
+ };
85
+ }
86
+
87
+ const headerTemplate = data.riskCount.high > 0 ? "red" : (data.riskCount.medium > 0 ? "yellow" : "green");
88
+ const rc = data.riskCount;
89
+ const headerTitle = `风险预警报告 (${data.checkTime}) 🔴${rc.high} 🟡${rc.medium} 🟢${rc.low}`;
90
+ const elements = [];
91
+
92
+ // 1. 风险详情
93
+ elements.push({ tag: "div", text: { content: "**🚨 风险详情**", tag: "lark_md" } });
94
+ if (!data.hasRisk) {
95
+ elements.push({ tag: "div", text: { content: "未发现需关注的风险。", tag: "lark_md" } });
96
+ } else {
97
+ const allRisks = [...data.highRisks, ...data.mediumRisks, ...data.lowRisks];
98
+ allRisks.forEach((risk, idx) => {
99
+ const levelIcon = risk.level === 'high' ? '🔴' : (risk.level === 'medium' ? '🟡' : '🟢');
100
+ let riskTitle = `${levelIcon} **风险${idx + 1}:${risk.dangers.join('、')}**`;
101
+ if (risk.conclusion.includes("【升级】")) riskTitle += " 【升级】";
102
+ if (risk.conclusion.includes("【降级】")) riskTitle += " 【降级】";
103
+ if (risk.conclusion.includes("合并")) riskTitle += ` (${risk.conclusion.match(/合并\d+条/)[0]})`;
104
+ elements.push({ tag: "div", text: { content: riskTitle, tag: "lark_md" } });
105
+ let handledText = '暂无人回复,建议跟进';
106
+ if (risk.handledInfo.handled) handledText = `✅ 由 **${risk.handledInfo.handler}** 跟进`;
107
+ const finalConclusion = risk.level === 'high' ? '🔴 高风险 - 需立即处理' : (risk.level === 'medium' ? '🟡 中风险 - 建议跟进' : '🟢 低风险 - 已有响应');
108
+ elements.push({ tag: "div", text: { content: `**群聊:** ${risk.chat}`, tag: "lark_md" } });
109
+ elements.push({ tag: "div", text: { content: `<font color='red'>**原因:** ${risk.cause}</font>`, tag: "lark_md" } });
110
+ elements.push({ tag: "div", text: { content: `**处理状态:** ${handledText}`, tag: "lark_md" } });
111
+ elements.push({ tag: "div", text: { content: `**发送者:** ${risk.sender} | **时间:** ${risk.time}`, tag: "lark_md" } });
112
+ elements.push({ tag: "div", text: { content: `**内容:** ${risk.content.length > 200 ? risk.content.substring(0, 200) + '...' : risk.content}`, tag: "lark_md" } });
113
+ elements.push({ tag: "div", text: { content: `**结论:** ${finalConclusion}`, tag: "lark_md" } });
114
+ if (idx < allRisks.length - 1) elements.push({ tag: "hr" });
115
+ });
116
+ }
117
+
118
+ elements.push({ tag: "hr" });
119
+
120
+ // 2. 风险概览
121
+ elements.push({ tag: "div", text: { content: "**📊 风险概览**", tag: "lark_md" } });
122
+ const chatList = (data.chatDetails || []).map((chat, i) => `${i+1}. ${chat.name} (${chat.count}条消息)`).join('\n');
123
+ elements.push({ tag: "div", text: { content: `**📋 检测群聊(${data.chatDetails.length}个):**\n${chatList}`, tag: "lark_md" } });
124
+ elements.push({ tag: "column_set", flex_mode: "none", background_style: "default", columns: [
125
+ { tag: "column", width: "weighted", weight: 1, vertical_align: "top", elements: [{ tag: "div", text: { content: `🔴 ${rc.high}高风险`, tag: "lark_md" } }] },
126
+ { tag: "column", width: "weighted", weight: 1, vertical_align: "top", elements: [{ tag: "div", text: { content: `🟡 ${rc.medium}中风险`, tag: "lark_md" } }] },
127
+ { tag: "column", width: "weighted", weight: 1, vertical_align: "top", elements: [{ tag: "div", text: { content: `🟢 ${rc.low}低风险`, tag: "lark_md" } }] },
128
+ ]});
129
+
130
+ // 3. 已解决风险
131
+ if (data.resolvedRisks && data.resolvedRisks.length > 0) {
132
+ elements.push({ tag: "hr" });
133
+ elements.push({ tag: "div", text: { content: "**✅ 已解决/已解除的风险**", tag: "lark_md" } });
134
+ data.resolvedRisks.forEach((resolved, idx) => {
135
+ elements.push({ tag: "div", text: { content: `${idx + 1}. **${resolved.chat}**`, tag: "lark_md" } });
136
+ elements.push({ tag: "div", text: { content: ` 🚨 风险报告:**${resolved.riskReporter || '未知'}**`, tag: "lark_md" } });
137
+ elements.push({ tag: "div", text: { content: ` 📋 原风险:${resolved.originalRisk}`, tag: "lark_md" } });
138
+ elements.push({ tag: "div", text: { content: ` ✅ 解除人:**${resolved.resolver || '未知'}**`, tag: "lark_md" } });
139
+ elements.push({ tag: "div", text: { content: ` 📝 解除说明:${resolved.resolution} (${resolved.resolutionTime})`, tag: "lark_md" } });
140
+ if (idx < data.resolvedRisks.length - 1) elements.push({ tag: "hr" });
141
+ });
142
+ }
143
+
144
+ // 4. 非风险记录
145
+ const nonRisks = [];
146
+ if (data.lowRisks) {
147
+ data.lowRisks.forEach(risk => {
148
+ if (risk.cause && (risk.cause.includes('测试') || risk.cause.includes('澄清') || risk.conclusion.includes('已说明'))) {
149
+ nonRisks.push(risk);
150
+ }
151
+ });
152
+ }
153
+ if (nonRisks.length > 0) {
154
+ elements.push({ tag: "hr" });
155
+ elements.push({ tag: "div", text: { content: "**🚫 已排除的非风险记录**", tag: "lark_md" } });
156
+ nonRisks.forEach((item, idx) => {
157
+ elements.push({ tag: "div", text: { content: `${idx + 1}. **${item.chat}** - ${item.cause}`, tag: "lark_md" } });
158
+ });
159
+ }
160
+
161
+ return {
162
+ config: { wide_screen_mode: true },
163
+ header: {
164
+ template: headerTemplate,
165
+ title: { content: headerTitle, tag: "plain_text" }
166
+ },
167
+ elements: elements
168
+ };
169
+ }
170
+
171
+ function getCurrentTime() {
172
+ const now = new Date();
173
+ return now.toLocaleString('zh-CN', {
174
+ year: 'numeric',
175
+ month: '2-digit',
176
+ day: '2-digit',
177
+ hour: '2-digit',
178
+ minute: '2-digit'
179
+ });
180
+ }
181
+
182
+ async function main() {
183
+ // 检查凭证
184
+ if (!CREDENTIALS.appId || !CREDENTIALS.appSecret) {
185
+ console.error('❌ 未配置飞书应用凭证');
186
+ console.log('请设置环境变量 FEISHU_APP_ID 和 FEISHU_APP_SECRET,或运行配置向导');
187
+ process.exit(1);
188
+ }
189
+
190
+ // 检查推送目标
191
+ if (!CONFIG.pushTarget.chatId && !CONFIG.pushTarget.userId) {
192
+ console.error('❌ 未配置推送目标');
193
+ process.exit(1);
194
+ }
195
+
196
+ try {
197
+ const token = await getAccessToken();
198
+ const data = JSON.parse(fs.readFileSync(path.join(__dirname, 'risk-data.json'), 'utf8'));
199
+ data.checkTime = getCurrentTime();
200
+ const card = generateCard(data);
201
+
202
+ // 根据配置推送
203
+ const { type, chatId, userId } = CONFIG.pushTarget;
204
+
205
+ if ((type === 'chat' || type === 'both') && chatId) {
206
+ await sendCard(token, card, 'chat', chatId);
207
+ console.log(`✅ 卡片已推送到群聊: ${chatId}`);
208
+ }
209
+
210
+ if ((type === 'user' || type === 'both') && userId) {
211
+ await sendCard(token, card, 'user', userId);
212
+ console.log(`✅ 卡片已推送到用户: ${userId}`);
213
+ }
214
+ } catch (e) {
215
+ console.error("❌ 推送失败:", e.message);
216
+ try {
217
+ const token = await getAccessToken();
218
+ if (token) await sendCard(token, generateCard(null), CONFIG.pushTarget.type, CONFIG.pushTarget.chatId || CONFIG.pushTarget.userId);
219
+ } catch (finalErr) {
220
+ console.error("Failed to send failure notification:", finalErr.message);
221
+ }
222
+ }
223
+ }
224
+
225
+ main();
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Risk Alert 全自动流程
4
+ *
5
+ * 执行步骤:
6
+ * 1. 抓取群聊消息
7
+ * 2. AI 分析(通过调用 OpenClaw AI)
8
+ * 3. 推送预警卡片
9
+ */
10
+
11
+ const { execSync, spawn } = require('child_process');
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+
15
+ const SCRIPTS_DIR = path.join(__dirname);
16
+ const RAW_MESSAGES_MD = path.join(SCRIPTS_DIR, 'raw-messages.md');
17
+ const RAW_MESSAGES_JSON = path.join(SCRIPTS_DIR, 'raw-messages.json');
18
+ const RISK_DATA_JSON = path.join(SCRIPTS_DIR, 'risk-data.json');
19
+
20
+ const command = process.argv[2];
21
+
22
+ // 辅助函数:执行命令并返回输出
23
+ function execCommand(cmd, args, options = {}) {
24
+ return new Promise((resolve, reject) => {
25
+ const child = spawn(cmd, args, {
26
+ cwd: SCRIPTS_DIR,
27
+ stdio: options.silent ? 'pipe' : 'inherit',
28
+ ...options
29
+ });
30
+
31
+ let output = '';
32
+ if (options.silent && child.stdout) {
33
+ child.stdout.on('data', (data) => {
34
+ output += data.toString();
35
+ });
36
+ }
37
+
38
+ child.on('close', (code) => {
39
+ if (code === 0) {
40
+ resolve(output);
41
+ } else {
42
+ reject(new Error(`Command failed with code ${code}`));
43
+ }
44
+ });
45
+
46
+ child.on('error', reject);
47
+ });
48
+ }
49
+
50
+ // 仅抓取模式
51
+ if (command === 'fetch') {
52
+ console.log('📥 抓取消息...');
53
+ execCommand('node', ['analyze-risk.js'])
54
+ .then(() => {
55
+ console.log('✅ 抓取完成');
56
+ process.exit(0);
57
+ })
58
+ .catch((e) => {
59
+ console.error('❌ 抓取失败:', e.message);
60
+ process.exit(1);
61
+ });
62
+ return;
63
+ }
64
+
65
+ // 仅推送模式
66
+ if (command === 'push') {
67
+ console.log('📤 推送卡片...');
68
+ execCommand('node', ['push-beautiful.js'])
69
+ .then(() => {
70
+ console.log('✅ 推送完成');
71
+ process.exit(0);
72
+ })
73
+ .catch((e) => {
74
+ console.error('❌ 推送失败:', e.message);
75
+ process.exit(1);
76
+ });
77
+ return;
78
+ }
79
+
80
+ // 完整自动化流程
81
+ async function runFullWorkflow() {
82
+ console.log('🚀 启动 Risk Alert 全自动流程\n');
83
+
84
+ // Step 1: 抓取消息
85
+ console.log('📥 Step 1: 抓取群聊消息...');
86
+ try {
87
+ await execCommand('node', ['analyze-risk.js']);
88
+ console.log('✅ 消息抓取完成\n');
89
+ } catch (e) {
90
+ console.error('❌ 消息抓取失败:', e.message);
91
+ process.exit(1);
92
+ }
93
+
94
+ // 检查是否有新消息
95
+ if (!fs.existsSync(RAW_MESSAGES_JSON)) {
96
+ console.error('❌ 未找到 raw-messages.json');
97
+ process.exit(1);
98
+ }
99
+
100
+ const rawData = JSON.parse(fs.readFileSync(RAW_MESSAGES_JSON, 'utf8'));
101
+ if (rawData.newMessagesCount === 0) {
102
+ console.log('ℹ️ 没有新消息');
103
+
104
+ // 推送无风险状态
105
+ const emptyRiskData = {
106
+ checkTime: new Date().toLocaleString('zh-CN'),
107
+ hasRisk: false,
108
+ riskCount: { high: 0, medium: 0, low: 0 },
109
+ chatDetails: (rawData.chats || []).map(c => ({ name: c.name, count: 0 })),
110
+ highRisks: [],
111
+ mediumRisks: [],
112
+ lowRisks: []
113
+ };
114
+ fs.writeFileSync(RISK_DATA_JSON, JSON.stringify(emptyRiskData, null, 2));
115
+
116
+ console.log('📤 推送无风险状态...');
117
+ await execCommand('node', ['push-beautiful.js']);
118
+ console.log('✅ 完成');
119
+ return;
120
+ }
121
+
122
+ console.log(`📊 新增 ${rawData.newMessagesCount} 条消息\n`);
123
+
124
+ // Step 2: 输出提示,让 AI 继续执行
125
+ console.log('🧠 Step 2: 需要 AI 分析风险');
126
+ console.log('─────────────────────────────────');
127
+ console.log('\n⚠️ 自动分析需要 AI 介入');
128
+ console.log('请确保 AI 助手完成以下步骤:');
129
+ console.log(' 1. 读取 raw-messages.md');
130
+ console.log(' 2. 分析风险并生成 risk-data.json');
131
+ console.log(' 3. 调用: node risk-alert.js push');
132
+ console.log('\n或者手动执行完整流程...');
133
+ }
134
+
135
+ // 运行
136
+ runFullWorkflow().catch(console.error);
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ const { execSync } = require('child_process');
3
+ const path = require('path');
4
+
5
+ const SKILL_DIR = path.join(__dirname, '..');
6
+ const SCRIPTS_DIR = path.join(SKILL_DIR, 'scripts');
7
+
8
+ console.log('🚀 启动 Risk Alert 完整流程...\n');
9
+
10
+ // Step 1: 抓取消息
11
+ console.log('📥 Step 1: 抓取群聊消息...');
12
+ try {
13
+ execSync('node analyze-risk.js', {
14
+ cwd: SCRIPTS_DIR,
15
+ stdio: 'inherit'
16
+ });
17
+ console.log('✅ 消息抓取完成\n');
18
+ } catch (e) {
19
+ console.error('❌ 消息抓取失败:', e.message);
20
+ process.exit(1);
21
+ }
22
+
23
+ // Step 2: AI 分析(提示用户)
24
+ console.log('🧠 Step 2: AI 风险分析');
25
+ console.log('─────────────────────────────────');
26
+ console.log('请让 AI 助手执行以下操作:');
27
+ console.log('1. 读取 scripts/raw-messages.md');
28
+ console.log('2. 分析风险并更新 scripts/risk-data.json');
29
+ console.log('3. 完成后继续 Step 3');
30
+ console.log('─────────────────────────────────\n');
31
+ console.log('等待 AI 分析完成...(按 Ctrl+C 跳过,手动执行)\n');
32
+
33
+ // 等待用户确认
34
+ const readline = require('readline');
35
+ const rl = readline.createInterface({
36
+ input: process.stdin,
37
+ output: process.stdout
38
+ });
39
+
40
+ rl.question('AI 分析完成后,按 Enter 继续推送,或输入 "skip" 跳过: ', (answer) => {
41
+ rl.close();
42
+
43
+ if (answer.toLowerCase() === 'skip') {
44
+ console.log('⏭️ 已跳过,请手动执行: node push-beautiful.js');
45
+ process.exit(0);
46
+ }
47
+
48
+ // Step 3: 推送卡片
49
+ console.log('\n📤 Step 3: 推送风险预警卡片...');
50
+ try {
51
+ execSync('node push-beautiful.js', {
52
+ cwd: SCRIPTS_DIR,
53
+ stdio: 'inherit'
54
+ });
55
+ console.log('\n✅ 完整流程执行完毕!');
56
+ } catch (e) {
57
+ console.error('❌ 推送失败:', e.message);
58
+ process.exit(1);
59
+ }
60
+ });
@@ -0,0 +1,35 @@
1
+ #!/bin/bash
2
+ # 触发 Risk Alert 工作流
3
+ # 读取配置中的用户 ID 发送触发指令
4
+
5
+ CONFIG_FILE="$(dirname "$0")/config.json"
6
+
7
+ # 默认用户 ID(如果配置不存在)
8
+ DEFAULT_USER_ID=""
9
+
10
+ # 尝试从配置文件中读取用户 ID
11
+ if [ -f "$CONFIG_FILE" ]; then
12
+ # 使用 node 读取 JSON 配置
13
+ USER_ID=$(node -e "
14
+ try {
15
+ const config = require('$CONFIG_FILE');
16
+ console.log(config.pushTarget?.userId || '');
17
+ } catch(e) {
18
+ console.log('');
19
+ }
20
+ " 2>/dev/null)
21
+ fi
22
+
23
+ # 如果没有配置用户 ID,使用默认值
24
+ if [ -z "$USER_ID" ]; then
25
+ USER_ID="$DEFAULT_USER_ID"
26
+ fi
27
+
28
+ if [ -z "$USER_ID" ]; then
29
+ echo "❌ 未配置推送用户 ID"
30
+ echo "请先运行: node scripts/analyze-risk.js 进行配置"
31
+ exit 1
32
+ fi
33
+
34
+ # 使用 openclaw 工具发送消息
35
+ /usr/local/bin/openclaw message send --channel feishu --target "user:$USER_ID" --message "[[internal_trigger:run_risk_alert_workflow]]"
@@ -1,35 +0,0 @@
1
- # PPT Master - Image Generation Configuration
2
- # Copy this file to the parent directory of the skill as `.env` and fill in your API keys.
3
- # Path: place at `${SKILL_DIR}/../.env`
4
- #
5
- # Architecture diagram generation (core feature) requires at least one provider configured.
6
-
7
- # === Backend Selection (required) ===
8
- # Choose one: gemini | openai | qwen | zhipu | volcengine | stability | bfl | ideogram | siliconflow | fal | replicate
9
- IMAGE_BACKEND=gemini
10
-
11
- # === Provider API Keys (configure the one matching IMAGE_BACKEND) ===
12
-
13
- # Gemini (Google)
14
- # GEMINI_API_KEY=your_key_here
15
- # GEMINI_BASE_URL=https://generativelanguage.googleapis.com/v1beta
16
- # GEMINI_MODEL=gemini-2.0-flash-exp-image-generation
17
-
18
- # OpenAI / Compatible
19
- # OPENAI_API_KEY=your_key_here
20
- # OPENAI_BASE_URL=https://api.openai.com/v1
21
- # OPENAI_MODEL=dall-e-3
22
-
23
- # Alibaba Qwen
24
- # QWEN_API_KEY=your_key_here
25
-
26
- # Zhipu (智谱)
27
- # ZHIPU_API_KEY=your_key_here
28
-
29
- # Volcengine (火山引擎)
30
- # VOLCENGINE_API_KEY=your_key_here
31
-
32
- # AIGW Gemini (NetEase internal)
33
- # AIGW_GEMINI_API_KEY=your_key_here
34
- # AIGW_GEMINI_BASE_URL=https://aigw.netease.com/v1
35
- # AIGW_GEMINI_MODEL=gemini-3.1-flash-image
@@ -1,90 +0,0 @@
1
- # PPT Master
2
-
3
- AI-driven PPT generation system. Converts source documents (PDF/DOCX/URL/Markdown) into professional PPTX presentations through multi-role collaboration.
4
-
5
- ## Quick Start
6
-
7
- ### 1. Install Dependencies
8
-
9
- ```bash
10
- pip install -r requirements.txt
11
- ```
12
-
13
- ### 2. Configure Environment (Optional)
14
-
15
- Copy `.env.example` to `../.env` (parent directory) and configure if you need:
16
- - **AI image generation** (decorative backgrounds) — requires API key
17
- - **Document conversion** (PDF/DOCX) — works out of the box
18
-
19
- ```bash
20
- cp .env.example ../.env
21
- # Edit ../.env with your API keys
22
- ```
23
-
24
- > 💡 Architecture diagrams (`arch_diagram.py`) and all core SVG generation work **without any API key**.
25
-
26
- ### 3. Model Requirements
27
-
28
- | Requirement | Minimum | Recommended |
29
- |-------------|---------|-------------|
30
- | Context window | 128K tokens | 200K+ tokens |
31
- | Model tier | Claude Sonnet 4 / GPT-4o | Claude Opus |
32
- | Cost (55 pages) | ~$11 | ~$48 |
33
-
34
- > ⚠️ Lightweight models (Haiku, GPT-3.5, GPT-4o-mini) are **not suitable** — SVG generation requires strong reasoning.
35
-
36
- ## Features
37
-
38
- - **21 templates** with customizable color schemes
39
- - **33 chart types** (SVG vector)
40
- - **640+ icons** (Lucide SVG)
41
- - **Architecture diagram generator** (`arch_diagram.py`) — local, no API needed
42
- - **Flow diagram generator** (`drawio_gen.py`) — local
43
- - **AI background images** — optional, category-based reuse for cost efficiency
44
- - **SVG quality checker** with auto-fix (`svg_quality_checker.py --fix`)
45
- - **Native PPTX export** — fully editable text and shapes
46
- - **Speaker notes** auto-generated for every slide
47
- - **Bid presentation mode** — structured proposal PPT generation
48
-
49
- ## Usage
50
-
51
- This is an OpenClaw Agent Skill. It's designed to be used via natural language:
52
-
53
- ```
54
- "帮我把这个文档做成PPT" (+ attach a document)
55
- "Create a 20-page presentation about cloud computing"
56
- "根据这个招标文件生成述标PPT"
57
- ```
58
-
59
- The AI will guide you through template selection, design confirmation, and generation.
60
-
61
- ## Directory Structure
62
-
63
- ```
64
- ppt-master/
65
- ├── SKILL.md # Main skill definition (read by AI)
66
- ├── requirements.txt # Python dependencies
67
- ├── .env.example # API key configuration template
68
- ├── scripts/ # Python automation scripts
69
- ├── templates/ # PPT templates and layouts
70
- ├── references/ # Role definitions and guides
71
- ├── resources/ # Shared resources (backgrounds, icons)
72
- └── projects/ # Generated project directories
73
- ```
74
-
75
- ## Scripts
76
-
77
- | Script | Purpose |
78
- |--------|---------|
79
- | `arch_diagram.py` | Architecture diagram generator (zones/layers) |
80
- | `svg_page_gen.py` | Batch SVG page generator |
81
- | `drawio_gen.py` | Draw.io XML generator |
82
- | `image_gen.py` | AI decorative image generator |
83
- | `finalize_svg.py` | SVG post-processing |
84
- | `svg_quality_checker.py` | Quality check + auto-fix |
85
- | `svg_to_pptx.py` | PPTX export |
86
- | `total_md_split.py` | Speaker notes splitter |
87
-
88
- ## License
89
-
90
- Internal use.