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.
- package/bin/install-lib.mjs +11 -0
- package/bin/install.mjs +59 -1
- package/package.json +12 -1
- package/skills/acceptance-doc-entry/SKILL.md +54 -1
- package/skills/ppt-master/SKILL.md +17 -390
- package/skills/ppt-master/projects/.gitkeep +0 -0
- package/skills/ppt-master/references/executor-base.md +4 -3
- package/skills/ppt-master/references/image-generator.md +6 -93
- package/skills/ppt-master/references/strategist.md +5 -8
- package/skills/ppt-master/scripts/README.md +1 -1
- package/skills/ppt-master/scripts/finalize_svg.py +0 -14
- package/skills/ppt-master/scripts/svg_quality_checker.py +8 -169
- package/skills/ppt-master/scripts/svg_to_pptx/pptx_builder.py +1 -7
- package/skills/ppt-master/scripts/svg_to_pptx/pptx_cli.py +0 -14
- package/skills/risk-alert/SKILL.md +110 -0
- package/skills/risk-alert/config.example.json +21 -0
- package/skills/risk-alert/scheduler.sh +74 -0
- package/skills/risk-alert/scripts/analyze-risk.js +414 -0
- package/skills/risk-alert/scripts/config-manager.js +241 -0
- package/skills/risk-alert/scripts/push-beautiful.js +225 -0
- package/skills/risk-alert/scripts/risk-alert.js +136 -0
- package/skills/risk-alert/scripts/run-full.js +60 -0
- package/skills/risk-alert/trigger-risk-alert.sh +35 -0
- package/skills/ppt-master/.env.example +0 -35
- package/skills/ppt-master/README.md +0 -90
- package/skills/ppt-master/audit_report_model_perf.md +0 -213
- package/skills/ppt-master/audit_report_portability.md +0 -90
- package/skills/ppt-master/audit_report_robustness.md +0 -192
- package/skills/ppt-master/audit_report_workflow.md +0 -233
- package/skills/ppt-master/fix_report_bid.md +0 -51
- package/skills/ppt-master/fix_report_scripts.md +0 -41
- package/skills/ppt-master/references/bid-content-example-netease.md +0 -815
- package/skills/ppt-master/references/bid-content-template.md +0 -390
- package/skills/ppt-master/references/bid-example-netease.md +0 -339
- package/skills/ppt-master/references/bid-presentation.md +0 -384
- package/skills/ppt-master/references/bid-svgs/03_toc.svg +0 -38
- package/skills/ppt-master/references/bid-svgs/04_chapter_company.svg +0 -7
- package/skills/ppt-master/references/bid-svgs/05_company_overview.svg +0 -28
- package/skills/ppt-master/references/bid-svgs/06_vision_business.svg +0 -45
- package/skills/ppt-master/references/bid-svgs/07_product_system.svg +0 -52
- package/skills/ppt-master/references/bid-svgs/08_codewave_timeline.svg +0 -29
- package/skills/ppt-master/references/bid-svgs/09_certifications.svg +0 -33
- package/skills/ppt-master/references/bid-svgs/10_client_logos.svg +0 -25
- package/skills/ppt-master/references/bid-svgs/11_brand_mission.svg +0 -14
- package/skills/ppt-master/references/bid-svgs/12_chapter_demand.svg +0 -7
- package/skills/ppt-master/references/bid-svgs/16_chapter_advantages.svg +0 -7
- package/skills/ppt-master/references/bid-svgs/18_platform_arch.svg +0 -24
- package/skills/ppt-master/references/bid-svgs/19_function_matrix.svg +0 -35
- package/skills/ppt-master/references/bid-svgs/20_dev_arch.svg +0 -29
- package/skills/ppt-master/references/bid-svgs/21_source_code.svg +0 -25
- package/skills/ppt-master/references/bid-svgs/22_ai_dev.svg +0 -27
- package/skills/ppt-master/references/bid-svgs/23_asset_market.svg +0 -33
- package/skills/ppt-master/references/bid-svgs/24_multi_org.svg +0 -28
- package/skills/ppt-master/references/bid-svgs/25_i18n.svg +0 -22
- package/skills/ppt-master/references/bid-svgs/26_multi_tenant.svg +0 -25
- package/skills/ppt-master/references/bid-svgs/27_integration.svg +0 -27
- package/skills/ppt-master/references/bid-svgs/28_permission.svg +0 -31
- package/skills/ppt-master/references/bid-svgs/29_security.svg +0 -25
- package/skills/ppt-master/references/bid-svgs/30_ai_capabilities.svg +0 -21
- package/skills/ppt-master/references/bid-svgs/31_product_combo.svg +0 -25
- package/skills/ppt-master/references/bid-svgs/32_digital_transform.svg +0 -28
- package/skills/ppt-master/references/bid-svgs/33_chapter_cases.svg +0 -7
- package/skills/ppt-master/references/bid-svgs/34_cummins_case.svg +0 -23
- package/skills/ppt-master/references/bid-svgs/35_cpq_cost.svg +0 -22
- package/skills/ppt-master/references/bid-svgs/36_tech_platform.svg +0 -18
- package/skills/ppt-master/references/bid-svgs/37_platform_value.svg +0 -24
- package/skills/ppt-master/references/bid-svgs/38_operation_plan.svg +0 -25
- package/skills/ppt-master/references/bid-svgs/39_zpmc_case.svg +0 -21
- package/skills/ppt-master/references/bid-svgs/40_zpmc_apps.svg +0 -23
- package/skills/ppt-master/references/bid-svgs/41_chapter_service.svg +0 -7
- package/skills/ppt-master/references/bid-svgs/42_tech_support.svg +0 -24
- package/skills/ppt-master/references/bid-svgs/43_knowledge_transfer.svg +0 -25
- package/skills/ppt-master/references/bid-svgs/44_operation_promotion.svg +0 -20
- package/skills/ppt-master/references/bid-svgs/45_custom_dev_guide.svg +0 -24
- package/skills/ppt-master/references/bid-svgs/46_sla_guarantee.svg +0 -18
- package/skills/ppt-master/references/bid-svgs/47_strategic_cooperation.svg +0 -25
- package/skills/ppt-master/references/bid-svgs/48_ecosystem.svg +0 -24
- package/skills/ppt-master/references/bid-svgs/49_chapter_delivery.svg +0 -23
- package/skills/ppt-master/references/bid-svgs/53_pm_intro.svg +0 -24
- package/skills/ppt-master/references/bid-svgs/54_after_sales.svg +0 -27
- package/skills/ppt-master/references/bid-svgs/55_ending.svg +0 -8
- package/skills/ppt-master/references/company_intro.md +0 -93
- package/skills/ppt-master/references/company_intro_images/slide1_img00.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img01.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img02.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img03.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img04.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img05.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img06.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img07.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img08.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img09.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img10.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img11.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img12.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img13.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img14.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img15.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img16.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img17.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img18.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img19.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img20.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img21.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img22.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img23.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img24.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img25.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img26.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img27.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img28.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide1_img29.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide2_img30.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide2_img31.jpg +0 -0
- package/skills/ppt-master/references/company_intro_images/slide3_img32.png +0 -0
- package/skills/ppt-master/references/company_intro_images/slide3_img33.png +0 -0
- package/skills/ppt-master/references/drawio-integration.md +0 -144
- package/skills/ppt-master/requirements.txt +0 -19
- package/skills/ppt-master/resources/backgrounds/chapter_bg.png +0 -0
- package/skills/ppt-master/resources/backgrounds/company_bg.png +0 -0
- package/skills/ppt-master/resources/backgrounds/cover_bg.png +0 -0
- package/skills/ppt-master/resources/backgrounds/index.json +0 -40
- package/skills/ppt-master/resources/backgrounds/tech_bg.png +0 -0
- package/skills/ppt-master/scripts/__pycache__/config.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/__pycache__/error_helper.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/__pycache__/pptx_animations.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/__pycache__/project_utils.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/arch_diagram.py +0 -370
- package/skills/ppt-master/scripts/bid_init.py +0 -79
- package/skills/ppt-master/scripts/drawio_gen.py +0 -366
- package/skills/ppt-master/scripts/drawio_to_svg.py +0 -458
- package/skills/ppt-master/scripts/image_backends/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/image_backends/__pycache__/backend_aigw_gemini.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/image_backends/__pycache__/backend_common.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_finalize/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_finalize/__pycache__/crop_images.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_finalize/__pycache__/embed_icons.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_finalize/__pycache__/embed_images.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_finalize/__pycache__/fix_image_aspect.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_finalize/__pycache__/flatten_tspan.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_finalize/__pycache__/svg_rect_to_path.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_page_gen.py +0 -871
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_context.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_converter.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_elements.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_paths.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_styles.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/drawingml_utils.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_builder.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_cli.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_dimensions.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_discovery.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_media.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_notes.cpython-314.pyc +0 -0
- package/skills/ppt-master/scripts/svg_to_pptx/__pycache__/pptx_slide_xml.cpython-314.pyc +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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.
|