From c23b62a8c82dc9a44661f4972c97e6afd2c1066d Mon Sep 17 00:00:00 2001 From: wangyunlong <3080433063@qq.com> Date: Tue, 28 Jul 2026 14:51:15 +0800 Subject: [PATCH] feat: consolidate legacy workflows into gyxx-flow --- .gitignore | 34 + README.md | 88 + config/runtime-bindings.json | 143 + config/schedules.json | 30 + config/secrets.example.env | 5 + .../source-manifests/content_marketing.json | 886 +++ config/source-manifests/product_commerce.json | 972 +++ .../source-manifests/shop_intelligence.json | 305 + config/source-manifests/supply_chain.json | 535 ++ config/workflows.json | 38 + design.md | 157 + docs/deployment.md | 39 + docs/migration-runbook.md | 29 + docs/operations.md | 29 + docs/rollback.md | 17 + final_report.md | 72 + plan.md | 126 + pyproject.toml | 63 + review.md | 90 + src/gyxx_flow/__init__.py | 3 + src/gyxx_flow/__main__.py | 6 + src/gyxx_flow/acceptance.py | 211 + src/gyxx_flow/adapters/__init__.py | 45 + src/gyxx_flow/adapters/bootstrap.py | 83 + src/gyxx_flow/adapters/browser.py | 97 + src/gyxx_flow/adapters/external.py | 132 + src/gyxx_flow/adapters/integration.py | 344 + src/gyxx_flow/adapters/native.py | 209 + src/gyxx_flow/baseline/__init__.py | 31 + src/gyxx_flow/baseline/inventory.py | 168 + src/gyxx_flow/baseline/manifest.py | 82 + src/gyxx_flow/baseline/models.py | 113 + src/gyxx_flow/baseline/tasks.py | 115 + src/gyxx_flow/catalog.py | 219 + src/gyxx_flow/cli.py | 545 ++ src/gyxx_flow/core/__init__.py | 7 + src/gyxx_flow/core/artifacts.py | 87 + src/gyxx_flow/core/config.py | 30 + src/gyxx_flow/core/context.py | 56 + src/gyxx_flow/core/layout.py | 147 + src/gyxx_flow/core/locks.py | 88 + src/gyxx_flow/core/records.py | 135 + src/gyxx_flow/diagnostics.py | 94 + src/gyxx_flow/migration/__init__.py | 33 + src/gyxx_flow/migration/data.py | 556 ++ src/gyxx_flow/migration/legacy.py | 173 + src/gyxx_flow/migration/shadow.py | 489 ++ src/gyxx_flow/modules/__init__.py | 77 + .../modules/content_marketing/__init__.py | 103 + .../runtime/bilibili_comment_scraper.py | 500 ++ .../runtime/bilibili_scraper.py | 854 +++ .../runtime/chanmama_scraper.py | 1293 ++++ .../runtime/collection_completeness.py | 583 ++ .../runtime/creator_task_grouping.py | 53 + .../runtime/daily_marketing_report.py | 1270 ++++ .../runtime/data/config/analyze.env.example | 8 + .../runtime/data/config/db.env.example | 8 + .../data/config/款式_多维表格_对照.json | 6154 +++++++++++++++++ .../data/config/款式_多维表格_对照_自营.json | 1807 +++++ .../runtime/data/tools/analyze_comments.py | 863 +++ .../runtime/data/tools/analyze_note.py | 868 +++ .../data/tools/batch_rescrape_bilibili.py | 204 + .../data/tools/batch_rescrape_douyin.py | 252 + .../data/tools/batch_rescrape_xiaohongshu.py | 200 + .../runtime/data/tools/check_id_filled.py | 42 + .../runtime/data/tools/check_status.py | 179 + .../data/tools/collect_note_metrics.py | 188 + .../data/tools/daily_dashboard_analytics.py | 321 + .../data/tools/daily_marketing_report.bat | 57 + .../runtime/data/tools/daily_report_card.py | 328 + .../runtime/data/tools/daily_report_charts.py | 518 ++ .../runtime/data/tools/daily_run.bat | 61 + .../data/tools/daily_run_with_backfill.bat | 61 + .../runtime/data/tools/db.py | 515 ++ .../data/tools/feishu_comment_batch.py | 716 ++ .../runtime/data/tools/feishu_doc_writer.py | 787 +++ .../runtime/data/tools/friday_relogin.bat | 39 + .../data/tools/friday_relogin_parallel.py | 408 ++ .../data/tools/generate_creator_report.py | 910 +++ .../runtime/data/tools/init_db.py | 29 + .../data/tools/kill_project_chrome.ps1 | 7 + .../data/tools/list_project_chrome.ps1 | 4 + .../001_creators_and_cooperations.sql | 132 + .../tools/migrations/003_creator_report.sql | 43 + .../tools/migrations/004_style_category.sql | 4 + .../migrations/005_style_product_profile.sql | 23 + .../runtime/data/tools/monday_self_run.bat | 55 + .../data/tools/monthly_creator_report.bat | 41 + .../runtime/data/tools/monthly_summary.bat | 41 + .../runtime/data/tools/pull_all_tables.py | 163 + .../runtime/data/tools/rebuild_mapping.py | 132 + .../runtime/data/tools/relogin_bilibili.py | 87 + .../runtime/data/tools/relogin_douyin.py | 93 + .../runtime/data/tools/relogin_pgy.py | 106 + .../runtime/data/tools/relogin_transaction.py | 47 + .../runtime/data/tools/relogin_xiaohongshu.py | 90 + .../runtime/data/tools/relogin_xingtu.py | 299 + .../runtime/data/tools/retry_failed.py | 507 ++ .../data/tools/schema_gyxx_super_data.sql | 342 + .../runtime/data/tools/style_analyzer.py | 362 + .../runtime/data/tools/sync_cooperations.bat | 37 + .../runtime/data/tools/sync_cooperations.py | 463 ++ .../data/tools/sync_metrics_to_cmt_notes.py | 472 ++ .../data/tools/sync_style_categories.py | 142 + .../runtime/data/tools/v2_filename.py | 50 + .../runtime/data/tools/validate_mapping.py | 105 + .../data/tools/weekly_comment_scrape.bat | 80 + .../runtime/data/tools/weekly_summary.bat | 42 + .../runtime/data/tools/write_notes_to_doc.py | 437 ++ .../runtime/douyin_comment_scraper.py | 766 ++ .../runtime/feishu_mapping.py | 427 ++ .../content_marketing/runtime/login_helper.py | 112 + .../runtime/monthly_summary_all.py | 450 ++ .../runtime/pgy_xhs_scraper.py | 424 ++ .../runtime/pgy_xhs_scraper_v2.py | 1683 +++++ .../runtime/requirements.txt | 4 + .../content_marketing/runtime/run_all.py | 622 ++ .../runtime/runtime_paths.py | 87 + .../runtime/self_bilibili_scraper.py | 455 ++ .../runtime/self_douyin_scraper.py | 692 ++ .../runtime/sitecustomize.py | 5 + .../tests/test_analyze_note_no_comments.py | 57 + .../tests/test_batch_rescrape_douyin.py | 9 + .../tests/test_collection_completeness.py | 840 +++ .../tests/test_daily_dashboard_analytics.py | 103 + .../tests/test_daily_marketing_report.py | 429 ++ .../test_daily_marketing_report_schedule.py | 18 + .../runtime/tests/test_daily_report_card.py | 189 + .../runtime/tests/test_daily_report_charts.py | 104 + .../tests/test_friday_relogin_parallel.py | 130 + .../tests/test_global_creator_scraping.py | 305 + .../runtime/tests/test_relogin_rollback.py | 240 + .../tests/test_remote_database_config.py | 72 + .../tests/test_retry_failed_completeness.py | 385 ++ .../tests/test_sync_style_categories.py | 55 + .../tests/test_weekly_tmall_persona.py | 70 + .../runtime/weekly_summary_all.py | 766 ++ .../runtime/weekly_summary_xingyun2.py | 244 + .../runtime/xiaohongshu_comment_scraper.py | 695 ++ .../runtime/xingtu_scraper.py | 479 ++ .../runtime/xingtu_scraper_v2.py | 2004 ++++++ src/gyxx_flow/modules/contracts.py | 20 + .../modules/product_commerce/__init__.py | 97 + .../product_commerce/runtime/.env.example | 19 + .../runtime/MIGRATION_STATUS.md | 20 + .../product_commerce/runtime/__init__.py | 6 + .../runtime/aggregate_daily_final.py | 280 + .../runtime/analyze_style_with_hermes.py | 1097 +++ .../runtime/backfill_collect.py | 208 + .../runtime/backfill_one_day.py | 219 + .../runtime/backfill_poseidon_sales.py | 526 ++ .../runtime/bitable_main_image_map.json | 195 + .../runtime/bitable_style_map.json | 597 ++ .../runtime/check_nine_day_decline.py | 458 ++ .../runtime/collect_dy_market_rank.py | 949 +++ .../runtime/collect_dy_persona_to_bitable.py | 414 ++ .../runtime/collect_erp_yesterday_metrics.py | 1466 ++++ .../runtime/collect_jd_market_rank.py | 1530 ++++ .../runtime/collect_jd_persona_to_bitable.py | 579 ++ .../runtime/collect_persona_to_bitable.py | 328 + .../runtime/collect_retry_utils.py | 166 + .../runtime/collect_sycm_market_rank.py | 1784 +++++ .../runtime/commands/__init__.py | 1 + .../runtime/commands/import_daily.py | 22 + .../runtime/commands/run_alerts.py | 23 + .../runtime/config/__init__.py | 0 .../config/auto-flow-config.example.json | 17 + .../runtime/config/style_config_loader.py | 994 +++ .../product_commerce/runtime/db/__init__.py | 1251 ++++ .../product_commerce/runtime/db/schema.sql | 768 ++ .../runtime/db/sync_dim_style.py | 342 + .../runtime/db/sync_sku_master.py | 210 + .../runtime/dy_audience_profile_collect.py | 475 ++ .../runtime/dy_product_scraping.py | 3375 +++++++++ .../runtime/erp_login_product_analysis.py | 744 ++ .../runtime/erp_metric_overrides.py | 145 + .../runtime/export_bitable_records.py | 200 + .../runtime/feishu_doc_native.py | 657 ++ .../runtime/import_product_daily.py | 579 ++ .../runtime/import_product_reviews.py | 331 + .../runtime/insert_bitable_records.py | 309 + .../runtime/jd_main_image_collector.py | 595 ++ .../runtime/jd_product_data_collector.py | 4482 ++++++++++++ .../jd_self_inventory_sales_collector.py | 708 ++ .../runtime/lark_cli_runtime.py | 114 + .../runtime/launchers_reference/README.md | 8 + .../launchers_reference/run_alerts.bat | 35 + .../launchers_reference/run_daily_collect.bat | 17 + .../launchers_reference/run_daily_import.bat | 38 + .../launchers_reference/run_daily_import.ps1 | 49 + .../launchers_reference/run_daily_persona.bat | 16 + .../run_style_analysis_3d.bat | 13 + .../run_weekly_jd_main_image.bat | 12 + .../run_weekly_main_image.bat | 12 + .../run_weekly_market_rank.bat | 14 + .../product_commerce/runtime/main_image_db.py | 23 + .../runtime/main_image_paths.py | 21 + .../market_rank_hermes_notification.py | 219 + .../runtime/market_rank_report_archive.py | 78 + .../runtime/orchestrate_daily_collection.py | 407 ++ .../orchestrate_market_rank_collection.py | 373 + .../runtime/orchestrate_review_collection.py | 189 + .../runtime/reapply_erp_override.py | 133 + .../runtime/rebuild_market_rank_documents.py | 178 + .../runtime/run_alerts_with_retry.py | 91 + .../runtime/run_daily_persona.py | 53 + .../runtime/run_weekly_jd_main_image.py | 168 + .../runtime/run_weekly_main_image.py | 172 + .../product_commerce/runtime/runtime_paths.py | 144 + .../test_backfill_poseidon_sales.py | 212 + .../runtime/runtime_tests/test_db_config.py | 42 + .../runtime_tests/test_dy_market_rank.py | 239 + .../runtime_tests/test_dy_session_reuse.py | 82 + .../test_erp_metric_overrides.py | 92 + .../test_erp_no_data_freshness.py | 42 + .../runtime_tests/test_erp_slow_skip_codes.py | 33 + .../runtime_tests/test_feishu_doc_native.py | 53 + .../runtime_tests/test_guanghe_metadata.py | 469 ++ .../test_guanghe_store_routing.py | 118 + .../test_import_product_daily.py | 111 + .../runtime_tests/test_jd_enter_shangzhi.py | 314 + .../runtime_tests/test_jd_market_rank.py | 247 + .../test_main_image_concurrency.py | 99 + .../test_market_rank_hermes_notification.py | 199 + .../test_market_rank_report_archive.py | 115 + .../test_market_rank_workflow.py | 208 + .../runtime_tests/test_persona_launcher.py | 20 + .../test_style_analysis_orchestration.py | 358 + .../test_style_config_loader_erp_source.py | 45 + .../runtime_tests/test_sycm_market_rank.py | 537 ++ .../runtime_tests/test_tm_persona_recovery.py | 64 + .../test_wanxiang_report_template.py | 136 + .../scripts/insert_jd_main_image_records.py | 294 + .../scripts/insert_main_image_records.py | 586 ++ .../product_commerce/runtime/sitecustomize.py | 5 + .../runtime/styles_input.json | 27 + ...obao_dmp_item_crowd_insight_screenshots.py | 3407 +++++++++ .../runtime/taobao_sycm_collect.py | 160 + .../runtime/taobao_sycm_collect_backfill.py | 702 ++ .../runtime/taobao_sycm_products.py | 1353 ++++ .../taobao_wanxiang_ai_creative_report.py | 1704 +++++ .../runtime/upload_video_to_guanghe.py | 3048 ++++++++ .../dy-data-flow/adaptive_selectors.py | 310 + .../dy_store_competitor_store_scraping.py | 2307 ++++++ .../dy-data-flow/dynamic_session_src.py | 191 + .../jd-data-flow/collection_progress.py | 55 + .../runtime/vendors/jd-data-flow/config.py | 125 + .../vendors/jd-data-flow/jd_data_collector.py | 2448 +++++++ .../jd_peer_product_data_collector.py | 2401 +++++++ .../jd-data-flow/jd_product_data_collector.py | 3604 ++++++++++ .../runtime/vendors/jd-data-flow/state.py | 15 + .../runtime/weekly_aggregate.py | 362 + src/gyxx_flow/modules/registry.py | 69 + .../modules/shop_intelligence/__init__.py | 82 + .../shop_intelligence/runtime/__init__.py | 2 + .../runtime/adaptive_selectors.py | 312 + .../runtime/collectors/__init__.py | 0 .../dy_store_competitor_store_scraping.py | 2501 +++++++ .../runtime/collectors/jd_data_collector.py | 2257 ++++++ .../jd_peer_store_data_collector.py | 1026 +++ .../runtime/collectors/taobao_sycm.py | 1110 +++ .../runtime/config.example.env | 32 + .../shop_intelligence/runtime/config.py | 118 + .../shop_intelligence/runtime/db/__init__.py | 33 + .../shop_intelligence/runtime/db/db.py | 622 ++ .../shop_intelligence/runtime/db/schema.sql | 235 + .../runtime/dependencies.toml | 10 + .../shop_intelligence/runtime/lark_cli.py | 289 + .../shop_intelligence/runtime/paths.py | 52 + .../runtime/runners/__init__.py | 6 + .../runtime/runners/run_peer_store.py | 200 + .../runtime/runners/run_shop.py | 221 + .../runtime/runners/utils.py | 123 + .../runtime/scripts/remove_scheduler.ps1 | 9 + .../runtime/scripts/setup_scheduler.ps1 | 26 + .../runtime/sitecustomize.py | 5 + .../runtime/writers/__init__.py | 6 + .../runtime/writers/peer_store_writer.py | 418 ++ .../runtime/writers/shop_base_writer.py | 415 ++ .../modules/supply_chain/__init__.py | 106 + .../modules/supply_chain/runtime/__init__.py | 2 + .../supply_chain/runtime/config.example.env | 5 + .../supply_chain/runtime/dependencies.txt | 29 + .../runtime/orchestrator/__init__.py | 7 + .../runtime/orchestrator/config.py | 135 + .../runtime/orchestrator/feishu_sheets.py | 171 + .../runtime/orchestrator/mcp_workflow.py | 1196 ++++ .../runtime/orchestrator/monitor.py | 96 + .../runtime/orchestrator/pg_writer.py | 720 ++ .../runtime/orchestrator/runner.py | 54 + .../scripts/ProductReplenishment.py | 1053 +++ .../scripts/PurchaseConfirmation.py | 1209 ++++ .../scripts/PurchaseOrderUpdate.py | 1011 +++ .../orchestrator/scripts/batch_process.py | 881 +++ .../scripts/collect_confirmation.ps1 | 296 + .../scripts/collect_purchase_order_update.ps1 | 285 + .../scripts/collect_replenishment.ps1 | 319 + .../orchestrator/scripts/config.example.json | 13 + .../scripts/insert_replenishment_bitable.py | 521 ++ .../scripts/send_card_notification.py | 178 + .../scripts/trigger_purchase_order_update.py | 281 + .../runtime/orchestrator/sql/001_init.sql | 120 + .../orchestrator/sql/002_workflow_v2.sql | 92 + .../orchestrator/sql/backfill_history.py | 157 + .../runtime/orchestrator/state.py | 74 + .../runtime/orchestrator/workflows.py | 51 + .../modules/supply_chain/runtime/paths.py | 29 + .../modules/supply_chain/runtime/run.py | 81 + .../runtime/scripts/purchase-confirmation.bat | 6 + .../runtime/scripts/replenishment-alert.bat | 6 + .../runtime/scripts/replenishment.bat | 6 + .../supply_chain/runtime/sitecustomize.py | 5 + .../runtime/skills/analyzer/SKILL.md | 190 + .../workflow/purchase-order-update/SKILL.md | 151 + .../runtime/skills/collector/SKILL.md | 88 + .../purchase-confirmation-workflow/SKILL.md | 58 + .../purchase-order-update-workflow/SKILL.md | 34 + .../replenishment-alert-workflow/SKILL.md | 41 + .../workflow/replenishment-workflow/SKILL.md | 54 + .../workflow/workflow-trigger-only/SKILL.md | 57 + src/gyxx_flow/ops/__init__.py | 22 + src/gyxx_flow/ops/effects.py | 150 + src/gyxx_flow/ops/index.py | 241 + src/gyxx_flow/ops/outbox.py | 287 + src/gyxx_flow/runtime_bootstrap.py | 8 + src/gyxx_flow/runtime_exec.py | 74 + src/gyxx_flow/scheduler.py | 384 + src/gyxx_flow/script_catalog.py | 139 + src/gyxx_flow/security/__init__.py | 5 + src/gyxx_flow/security/scanner.py | 174 + src/gyxx_flow/workflow/__init__.py | 15 + src/gyxx_flow/workflow/engine.py | 322 + src/gyxx_flow/workflow/model.py | 153 + src/gyxx_flow/workflow/registry.py | 77 + src/gyxx_flow/workflow/selection.py | 50 + src/gyxx_flow/workflow/steps.py | 101 + tests/test_baseline.py | 276 + tests/test_business_modules.py | 156 + tests/test_catalog.py | 86 + tests/test_cli.py | 58 + tests/test_cli_workflows.py | 358 + tests/test_content_data_layout.py | 122 + tests/test_content_marketing_module.py | 43 + tests/test_content_source_snapshot.py | 200 + tests/test_core_foundation.py | 117 + tests/test_core_runtime.py | 98 + tests/test_cross_project_decoupling.py | 42 + tests/test_data_migration.py | 339 + tests/test_diagnostics_acceptance.py | 77 + tests/test_effect_ledger.py | 66 + tests/test_legacy_adapter.py | 221 + tests/test_module_command_adapter.py | 133 + tests/test_native_source_runtime.py | 82 + tests/test_ops.py | 242 + tests/test_product_commerce_module.py | 42 + tests/test_product_runtime_data_boundaries.py | 148 + tests/test_product_source_migration.py | 429 ++ tests/test_relocated_project.py | 81 + tests/test_runtime_integrations.py | 252 + tests/test_runtime_output_boundaries.py | 47 + tests/test_scheduler.py | 147 + tests/test_scheduler_cli.py | 85 + tests/test_script_catalog.py | 93 + tests/test_security_scanner.py | 133 + tests/test_shadow_comparison.py | 270 + tests/test_shared_adapters.py | 93 + tests/test_shop_intelligence_module.py | 38 + tests/test_shop_supply_data_routing.py | 240 + tests/test_shop_supply_source_snapshot.py | 201 + tests/test_source_migration_acceptance.py | 62 + tests/test_supply_chain_module.py | 42 + tests/test_unified_module_data_paths.py | 144 + tests/test_workflow_engine.py | 365 + uv.lock | 2872 ++++++++ 374 files changed, 132990 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 config/runtime-bindings.json create mode 100644 config/schedules.json create mode 100644 config/secrets.example.env create mode 100644 config/source-manifests/content_marketing.json create mode 100644 config/source-manifests/product_commerce.json create mode 100644 config/source-manifests/shop_intelligence.json create mode 100644 config/source-manifests/supply_chain.json create mode 100644 config/workflows.json create mode 100644 design.md create mode 100644 docs/deployment.md create mode 100644 docs/migration-runbook.md create mode 100644 docs/operations.md create mode 100644 docs/rollback.md create mode 100644 final_report.md create mode 100644 plan.md create mode 100644 pyproject.toml create mode 100644 review.md create mode 100644 src/gyxx_flow/__init__.py create mode 100644 src/gyxx_flow/__main__.py create mode 100644 src/gyxx_flow/acceptance.py create mode 100644 src/gyxx_flow/adapters/__init__.py create mode 100644 src/gyxx_flow/adapters/bootstrap.py create mode 100644 src/gyxx_flow/adapters/browser.py create mode 100644 src/gyxx_flow/adapters/external.py create mode 100644 src/gyxx_flow/adapters/integration.py create mode 100644 src/gyxx_flow/adapters/native.py create mode 100644 src/gyxx_flow/baseline/__init__.py create mode 100644 src/gyxx_flow/baseline/inventory.py create mode 100644 src/gyxx_flow/baseline/manifest.py create mode 100644 src/gyxx_flow/baseline/models.py create mode 100644 src/gyxx_flow/baseline/tasks.py create mode 100644 src/gyxx_flow/catalog.py create mode 100644 src/gyxx_flow/cli.py create mode 100644 src/gyxx_flow/core/__init__.py create mode 100644 src/gyxx_flow/core/artifacts.py create mode 100644 src/gyxx_flow/core/config.py create mode 100644 src/gyxx_flow/core/context.py create mode 100644 src/gyxx_flow/core/layout.py create mode 100644 src/gyxx_flow/core/locks.py create mode 100644 src/gyxx_flow/core/records.py create mode 100644 src/gyxx_flow/diagnostics.py create mode 100644 src/gyxx_flow/migration/__init__.py create mode 100644 src/gyxx_flow/migration/data.py create mode 100644 src/gyxx_flow/migration/legacy.py create mode 100644 src/gyxx_flow/migration/shadow.py create mode 100644 src/gyxx_flow/modules/__init__.py create mode 100644 src/gyxx_flow/modules/content_marketing/__init__.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/bilibili_comment_scraper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/bilibili_scraper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/chanmama_scraper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/collection_completeness.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/creator_task_grouping.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/daily_marketing_report.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/config/analyze.env.example create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/config/db.env.example create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/config/款式_多维表格_对照.json create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/config/款式_多维表格_对照_自营.json create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/analyze_comments.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/analyze_note.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/batch_rescrape_bilibili.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/batch_rescrape_douyin.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/batch_rescrape_xiaohongshu.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/check_id_filled.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/check_status.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/collect_note_metrics.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/daily_dashboard_analytics.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/daily_marketing_report.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/daily_report_card.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/daily_report_charts.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/daily_run.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/daily_run_with_backfill.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/db.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/feishu_comment_batch.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/feishu_doc_writer.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/friday_relogin.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/friday_relogin_parallel.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/generate_creator_report.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/init_db.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/kill_project_chrome.ps1 create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/list_project_chrome.ps1 create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/migrations/001_creators_and_cooperations.sql create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/migrations/003_creator_report.sql create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/migrations/004_style_category.sql create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/migrations/005_style_product_profile.sql create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/monday_self_run.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/monthly_creator_report.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/monthly_summary.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/pull_all_tables.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/rebuild_mapping.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/relogin_bilibili.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/relogin_douyin.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/relogin_pgy.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/relogin_transaction.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/relogin_xiaohongshu.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/relogin_xingtu.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/retry_failed.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/schema_gyxx_super_data.sql create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/style_analyzer.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/sync_cooperations.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/sync_cooperations.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/sync_metrics_to_cmt_notes.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/sync_style_categories.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/v2_filename.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/validate_mapping.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/weekly_comment_scrape.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/weekly_summary.bat create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/data/tools/write_notes_to_doc.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/douyin_comment_scraper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/feishu_mapping.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/login_helper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/monthly_summary_all.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/pgy_xhs_scraper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/pgy_xhs_scraper_v2.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/requirements.txt create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/run_all.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/runtime_paths.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/self_bilibili_scraper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/self_douyin_scraper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/sitecustomize.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_analyze_note_no_comments.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_batch_rescrape_douyin.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_collection_completeness.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_daily_dashboard_analytics.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_daily_marketing_report.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_daily_marketing_report_schedule.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_daily_report_card.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_daily_report_charts.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_friday_relogin_parallel.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_global_creator_scraping.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_relogin_rollback.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_remote_database_config.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_retry_failed_completeness.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_sync_style_categories.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/tests/test_weekly_tmall_persona.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/weekly_summary_all.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/weekly_summary_xingyun2.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/xiaohongshu_comment_scraper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/xingtu_scraper.py create mode 100644 src/gyxx_flow/modules/content_marketing/runtime/xingtu_scraper_v2.py create mode 100644 src/gyxx_flow/modules/contracts.py create mode 100644 src/gyxx_flow/modules/product_commerce/__init__.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/.env.example create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/MIGRATION_STATUS.md create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/__init__.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/aggregate_daily_final.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/analyze_style_with_hermes.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/backfill_collect.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/backfill_one_day.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/backfill_poseidon_sales.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/bitable_main_image_map.json create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/bitable_style_map.json create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/check_nine_day_decline.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/collect_dy_market_rank.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/collect_dy_persona_to_bitable.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/collect_erp_yesterday_metrics.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/collect_jd_market_rank.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/collect_jd_persona_to_bitable.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/collect_persona_to_bitable.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/collect_retry_utils.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/collect_sycm_market_rank.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/commands/__init__.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/commands/import_daily.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/commands/run_alerts.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/config/__init__.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/config/auto-flow-config.example.json create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/config/style_config_loader.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/db/__init__.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/db/schema.sql create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/db/sync_dim_style.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/db/sync_sku_master.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/dy_audience_profile_collect.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/dy_product_scraping.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/erp_login_product_analysis.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/erp_metric_overrides.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/export_bitable_records.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/feishu_doc_native.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/import_product_daily.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/import_product_reviews.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/insert_bitable_records.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/jd_main_image_collector.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/jd_product_data_collector.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/jd_self_inventory_sales_collector.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/lark_cli_runtime.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/README.md create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/run_alerts.bat create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/run_daily_collect.bat create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/run_daily_import.bat create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/run_daily_import.ps1 create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/run_daily_persona.bat create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/run_style_analysis_3d.bat create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/run_weekly_jd_main_image.bat create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/run_weekly_main_image.bat create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/launchers_reference/run_weekly_market_rank.bat create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/main_image_db.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/main_image_paths.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/market_rank_hermes_notification.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/market_rank_report_archive.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/orchestrate_daily_collection.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/orchestrate_market_rank_collection.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/orchestrate_review_collection.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/reapply_erp_override.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/rebuild_market_rank_documents.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/run_alerts_with_retry.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/run_daily_persona.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/run_weekly_jd_main_image.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/run_weekly_main_image.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_paths.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_backfill_poseidon_sales.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_db_config.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_dy_market_rank.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_dy_session_reuse.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_erp_metric_overrides.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_erp_no_data_freshness.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_erp_slow_skip_codes.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_feishu_doc_native.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_guanghe_metadata.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_guanghe_store_routing.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_import_product_daily.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_jd_enter_shangzhi.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_jd_market_rank.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_main_image_concurrency.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_market_rank_hermes_notification.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_market_rank_report_archive.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_market_rank_workflow.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_persona_launcher.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_style_analysis_orchestration.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_style_config_loader_erp_source.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_sycm_market_rank.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_tm_persona_recovery.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/runtime_tests/test_wanxiang_report_template.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/scripts/insert_jd_main_image_records.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/scripts/insert_main_image_records.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/sitecustomize.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/styles_input.json create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/taobao_dmp_item_crowd_insight_screenshots.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/taobao_sycm_collect.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/taobao_sycm_collect_backfill.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/taobao_sycm_products.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/taobao_wanxiang_ai_creative_report.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/upload_video_to_guanghe.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/vendors/dy-data-flow/adaptive_selectors.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/vendors/dy-data-flow/dy_store_competitor_store_scraping.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/vendors/dy-data-flow/dynamic_session_src.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/vendors/jd-data-flow/collection_progress.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/vendors/jd-data-flow/config.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/vendors/jd-data-flow/jd_data_collector.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/vendors/jd-data-flow/jd_peer_product_data_collector.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/vendors/jd-data-flow/jd_product_data_collector.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/vendors/jd-data-flow/state.py create mode 100644 src/gyxx_flow/modules/product_commerce/runtime/weekly_aggregate.py create mode 100644 src/gyxx_flow/modules/registry.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/__init__.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/__init__.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/adaptive_selectors.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/collectors/__init__.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/collectors/dy_store_competitor_store_scraping.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/collectors/jd_data_collector.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/collectors/jd_peer_store_data_collector.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/collectors/taobao_sycm.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/config.example.env create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/config.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/db/__init__.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/db/db.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/db/schema.sql create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/dependencies.toml create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/lark_cli.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/paths.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/runners/__init__.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/runners/run_peer_store.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/runners/run_shop.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/runners/utils.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/scripts/remove_scheduler.ps1 create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/scripts/setup_scheduler.ps1 create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/sitecustomize.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/writers/__init__.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/writers/peer_store_writer.py create mode 100644 src/gyxx_flow/modules/shop_intelligence/runtime/writers/shop_base_writer.py create mode 100644 src/gyxx_flow/modules/supply_chain/__init__.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/__init__.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/config.example.env create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/dependencies.txt create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/__init__.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/config.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/feishu_sheets.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/mcp_workflow.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/monitor.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/pg_writer.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/runner.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/ProductReplenishment.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/PurchaseConfirmation.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/PurchaseOrderUpdate.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/batch_process.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/collect_confirmation.ps1 create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/collect_purchase_order_update.ps1 create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/collect_replenishment.ps1 create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/config.example.json create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/insert_replenishment_bitable.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/send_card_notification.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/scripts/trigger_purchase_order_update.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/sql/001_init.sql create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/sql/002_workflow_v2.sql create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/sql/backfill_history.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/state.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/orchestrator/workflows.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/paths.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/run.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/scripts/purchase-confirmation.bat create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/scripts/replenishment-alert.bat create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/scripts/replenishment.bat create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/sitecustomize.py create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/skills/analyzer/SKILL.md create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/skills/analyzer/workflow/purchase-order-update/SKILL.md create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/skills/collector/SKILL.md create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/skills/collector/workflow/purchase-confirmation-workflow/SKILL.md create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/skills/collector/workflow/purchase-order-update-workflow/SKILL.md create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/skills/collector/workflow/replenishment-alert-workflow/SKILL.md create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/skills/collector/workflow/replenishment-workflow/SKILL.md create mode 100644 src/gyxx_flow/modules/supply_chain/runtime/skills/collector/workflow/workflow-trigger-only/SKILL.md create mode 100644 src/gyxx_flow/ops/__init__.py create mode 100644 src/gyxx_flow/ops/effects.py create mode 100644 src/gyxx_flow/ops/index.py create mode 100644 src/gyxx_flow/ops/outbox.py create mode 100644 src/gyxx_flow/runtime_bootstrap.py create mode 100644 src/gyxx_flow/runtime_exec.py create mode 100644 src/gyxx_flow/scheduler.py create mode 100644 src/gyxx_flow/script_catalog.py create mode 100644 src/gyxx_flow/security/__init__.py create mode 100644 src/gyxx_flow/security/scanner.py create mode 100644 src/gyxx_flow/workflow/__init__.py create mode 100644 src/gyxx_flow/workflow/engine.py create mode 100644 src/gyxx_flow/workflow/model.py create mode 100644 src/gyxx_flow/workflow/registry.py create mode 100644 src/gyxx_flow/workflow/selection.py create mode 100644 src/gyxx_flow/workflow/steps.py create mode 100644 tests/test_baseline.py create mode 100644 tests/test_business_modules.py create mode 100644 tests/test_catalog.py create mode 100644 tests/test_cli.py create mode 100644 tests/test_cli_workflows.py create mode 100644 tests/test_content_data_layout.py create mode 100644 tests/test_content_marketing_module.py create mode 100644 tests/test_content_source_snapshot.py create mode 100644 tests/test_core_foundation.py create mode 100644 tests/test_core_runtime.py create mode 100644 tests/test_cross_project_decoupling.py create mode 100644 tests/test_data_migration.py create mode 100644 tests/test_diagnostics_acceptance.py create mode 100644 tests/test_effect_ledger.py create mode 100644 tests/test_legacy_adapter.py create mode 100644 tests/test_module_command_adapter.py create mode 100644 tests/test_native_source_runtime.py create mode 100644 tests/test_ops.py create mode 100644 tests/test_product_commerce_module.py create mode 100644 tests/test_product_runtime_data_boundaries.py create mode 100644 tests/test_product_source_migration.py create mode 100644 tests/test_relocated_project.py create mode 100644 tests/test_runtime_integrations.py create mode 100644 tests/test_runtime_output_boundaries.py create mode 100644 tests/test_scheduler.py create mode 100644 tests/test_scheduler_cli.py create mode 100644 tests/test_script_catalog.py create mode 100644 tests/test_security_scanner.py create mode 100644 tests/test_shadow_comparison.py create mode 100644 tests/test_shared_adapters.py create mode 100644 tests/test_shop_intelligence_module.py create mode 100644 tests/test_shop_supply_data_routing.py create mode 100644 tests/test_shop_supply_source_snapshot.py create mode 100644 tests/test_source_migration_acceptance.py create mode 100644 tests/test_supply_chain_module.py create mode 100644 tests/test_unified_module_data_paths.py create mode 100644 tests/test_workflow_engine.py create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c0d00c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# Python bytecode and tooling +__pycache__/ +*.py[cod] +*.egg-info/ +.pytest_cache/ +.coverage +htmlcov/ + +# Build and virtual environments +build/ +dist/ +.venv/ +venv/ + +# Runtime data, local state, and logs +/var/ +*.log + +# Local credentials and machine-specific configuration +.env +.env.* +!.env.example +config/local/ +config/secrets.* +!config/secrets.example.env + +# IDE and operating-system files +.idea/ +.vscode/ +.DS_Store +Thumbs.db + +# Agent-local learning logs +.learnings/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..d2c1103 --- /dev/null +++ b/README.md @@ -0,0 +1,88 @@ +# GYXX Flow + +GYXX Flow 将原来分散在四个项目中的定时工作流和可执行脚本迁入一个可安装、可迁移的模块化项目: + +- `content_marketing`:内容与营销采集 +- `product_commerce`:商品、平台和经营分析 +- `shop_intelligence`:店铺与竞店采集 +- `supply_chain`:供应链采集与通知 + +运行时源码全部位于 `src/gyxx_flow/modules//runtime`。新项目不会从 +`D:\yingxiaoyunying`、`D:\shop-data-flow`、`D:\product-collector-analyze-flow` +或 `E:\auto-flow` 导入或启动代码;这些旧项目仅保留为只读迁移来源和回滚基线。 + +## 安装与验证 + +要求 Python 3.12,推荐使用 `uv`: + +```powershell +cd D:\gyxx-flow +uv sync --python 3.12 --extra test +uv run pytest +uv run gyxx doctor --json +uv run gyxx acceptance status --json +``` + +## 运行工作流 + +```powershell +uv run gyxx list +uv run gyxx run product.daily --date 2026-07-27 +uv run gyxx run product.daily --date 2026-07-27 --execute +``` + +`run`、`backfill` 和 `scripts run` 默认都是无副作用 dry-run;只有显式加 +`--execute` 才会启动迁入后的本地脚本。 + +## 运行任意迁入脚本 + +```powershell +uv run gyxx scripts list +uv run gyxx scripts list --module content_marketing +uv run gyxx scripts run content_marketing:run_all.py --date 2026-07-27 +uv run gyxx scripts run content_marketing:run_all.py --date 2026-07-27 --execute +``` + +脚本 ID 格式为 `:`。Python、BAT/CMD 和 +PowerShell 入口均受统一项目根、数据根、业务日期、run_id 和 shadow 环境约束。 + +## 浏览器与外部系统绑定 + +`config/runtime-bindings.json` 为当前 131 个脚本各自分配固定且唯一的 CDP 端口。 +无论从 workflow、`scripts run` 还是嵌套脚本启动,目标脚本都会重新取得自己的端口和 +`state/browser//