sophhub 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/bin/sophhub.js +21 -0
  2. package/package.json +32 -0
  3. package/skills/VERSIONS.md +27 -0
  4. package/skills/builtin/clawhub/SKILL.md +77 -0
  5. package/skills/builtin/flight-booking/SKILL.md +288 -0
  6. package/skills/builtin/flight-booking/scripts/flight_booking.py +1232 -0
  7. package/skills/builtin/inventory-management/SKILL.md +241 -0
  8. package/skills/builtin/inventory-management/scripts/inventory.py +1844 -0
  9. package/skills/builtin/schedule-reminder/SKILL.md +619 -0
  10. package/skills/builtin/schedule-reminder/schedule_template.md +68 -0
  11. package/skills/builtin/schedule-reminder/scripts/append_event.py +204 -0
  12. package/skills/builtin/schedule-reminder/scripts/create_reminders.sh +163 -0
  13. package/skills/builtin/schedule-reminder/scripts/daily_activate.sh +175 -0
  14. package/skills/builtin/schedule-reminder/scripts/parse_schedule.py +704 -0
  15. package/skills/builtin/schedule-reminder/scripts/setup.sh +242 -0
  16. package/skills/builtin/schedule-reminder//347/224/250/346/210/267/346/214/207/345/215/227.md +311 -0
  17. package/skills/builtin/skill-creator/SKILL.md +370 -0
  18. package/skills/builtin/skill-creator/license.txt +202 -0
  19. package/skills/builtin/skill-creator/scripts/init_skill.py +378 -0
  20. package/skills/builtin/skill-creator/scripts/package_skill.py +111 -0
  21. package/skills/builtin/skill-creator/scripts/quick_validate.py +101 -0
  22. package/skills/builtin/sophnet-customer-management/SKILL.md +271 -0
  23. package/skills/builtin/sophnet-customer-management/pyproject.toml +15 -0
  24. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/__init__.py +2 -0
  25. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/__main__.py +5 -0
  26. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/cli.py +67 -0
  27. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/commands/__init__.py +2 -0
  28. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/commands/customer.py +60 -0
  29. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/commands/export_file.py +18 -0
  30. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/commands/import_file.py +15 -0
  31. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/commands/reminder.py +26 -0
  32. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/commands/schema.py +28 -0
  33. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_cli/config.py +54 -0
  34. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/__init__.py +2 -0
  35. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/exporter.py +85 -0
  36. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/models.py +84 -0
  37. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/normalizer.py +144 -0
  38. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/parser.py +241 -0
  39. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/query.py +109 -0
  40. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/reminder.py +121 -0
  41. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/repository.py +397 -0
  42. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/schema.py +106 -0
  43. package/skills/builtin/sophnet-customer-management/src/customer_mgmt_core/service.py +565 -0
  44. package/skills/builtin/sophnet-customer-management/uv.lock +48 -0
  45. package/skills/builtin/sophnet-customized-marketing/SKILL.md +144 -0
  46. package/skills/builtin/sophnet-customized-marketing/playbooks/campaign-planning.md +187 -0
  47. package/skills/builtin/sophnet-customized-marketing/playbooks/content-generation.md +124 -0
  48. package/skills/builtin/sophnet-customized-marketing/playbooks/marketing-calendar.md +59 -0
  49. package/skills/builtin/sophnet-customized-marketing/playbooks/multi-channel-bundle.md +94 -0
  50. package/skills/builtin/sophnet-customized-marketing/playbooks/poster-generation.md +182 -0
  51. package/skills/builtin/sophnet-customized-marketing/playbooks/style-profile-workflow.md +103 -0
  52. package/skills/builtin/sophnet-customized-marketing/pyproject.toml +9 -0
  53. package/skills/builtin/sophnet-customized-marketing/references/campaign-mechanics.md +168 -0
  54. package/skills/builtin/sophnet-customized-marketing/references/content-safety.md +26 -0
  55. package/skills/builtin/sophnet-customized-marketing/references/marketing-date-checklist.md +99 -0
  56. package/skills/builtin/sophnet-customized-marketing/references/platform-writing-guidelines.md +88 -0
  57. package/skills/builtin/sophnet-customized-marketing/references/quality-checklist.md +44 -0
  58. package/skills/builtin/sophnet-customized-marketing/scripts/generate_poster.py +585 -0
  59. package/skills/builtin/sophnet-customized-marketing/scripts/style_profile.py +215 -0
  60. package/skills/builtin/sophnet-face-search/SKILL.md +115 -0
  61. package/skills/builtin/sophnet-face-search/pyproject.toml +11 -0
  62. package/skills/builtin/sophnet-face-search/scripts/face_search.py +336 -0
  63. package/skills/builtin/sophnet-face-search/uv.lock +508 -0
  64. package/skills/builtin/sophnet-image-edit/SKILL.md +140 -0
  65. package/skills/builtin/sophnet-image-edit/pyproject.toml +9 -0
  66. package/skills/builtin/sophnet-image-edit/scripts/edit_and_preview.sh +68 -0
  67. package/skills/builtin/sophnet-image-edit/scripts/edit_image.py +279 -0
  68. package/skills/builtin/sophnet-image-edit/uv.lock +234 -0
  69. package/skills/builtin/sophnet-image-generate/SKILL.md +62 -0
  70. package/skills/builtin/sophnet-image-generate/pyproject.toml +9 -0
  71. package/skills/builtin/sophnet-image-generate/scripts/generate_image.py +156 -0
  72. package/skills/builtin/sophnet-image-generate/uv.lock +234 -0
  73. package/skills/builtin/sophnet-image-ocr/SKILL.md +167 -0
  74. package/skills/builtin/sophnet-image-ocr/pyproject.toml +13 -0
  75. package/skills/builtin/sophnet-image-ocr/scripts/ocr.py +226 -0
  76. package/skills/builtin/sophnet-image-ocr/uv.lock +234 -0
  77. package/skills/builtin/sophnet-infinite-talk/SKILL.md +140 -0
  78. package/skills/builtin/sophnet-infinite-talk/pyproject.toml +9 -0
  79. package/skills/builtin/sophnet-infinite-talk/scripts/gen.py +172 -0
  80. package/skills/builtin/sophnet-oss/SKILL.md +109 -0
  81. package/skills/builtin/sophnet-oss/pyproject.toml +8 -0
  82. package/skills/builtin/sophnet-oss/scripts/upload_file.py +43 -0
  83. package/skills/builtin/sophnet-qa-install/SKILL.md +210 -0
  84. package/skills/builtin/sophnet-qa-install/pyproject.toml +6 -0
  85. package/skills/builtin/sophnet-qa-install/scripts/backup_md.py +35 -0
  86. package/skills/builtin/sophnet-qa-install/scripts/check_installed.py +143 -0
  87. package/skills/builtin/sophnet-qa-install/scripts/update_config.py +142 -0
  88. package/skills/builtin/sophnet-qa-install/scripts/update_md.py +73 -0
  89. package/skills/builtin/sophnet-training-install/SKILL.md +211 -0
  90. package/skills/builtin/sophnet-training-install/pyproject.toml +6 -0
  91. package/skills/builtin/sophnet-training-install/scripts/backup_md.py +35 -0
  92. package/skills/builtin/sophnet-training-install/scripts/check_installed.py +144 -0
  93. package/skills/builtin/sophnet-training-install/scripts/update_config.py +142 -0
  94. package/skills/builtin/sophnet-training-install/scripts/update_md.py +73 -0
  95. package/skills/builtin/sophnet-tts/SKILL.md +79 -0
  96. package/skills/builtin/sophnet-tts/pyproject.toml +9 -0
  97. package/skills/builtin/sophnet-tts/scripts/gen_tts.py +130 -0
  98. package/skills/builtin/sophnet-video-generate/SKILL.md +116 -0
  99. package/skills/builtin/sophnet-video-generate/scripts/gen_video.py +304 -0
  100. package/skills/builtin/video-understand/SKILL.md +79 -0
  101. package/skills/builtin/video-understand/scripts/video_understand.py +204 -0
  102. package/skills/builtin/weather/SKILL.md +112 -0
  103. package/skills/builtin/web-scraper/SKILL.md +101 -0
  104. package/skills/builtin/web-scraper/scripts/scrape.py +270 -0
  105. package/skills/builtin/website-builder/SKILL.md +266 -0
  106. package/skills/builtin/website-builder/scripts/deploy_site.sh +46 -0
  107. package/skills/store/didi-ride/SKILL.md +309 -0
  108. package/skills/store/didi-ride/_meta.json +6 -0
  109. package/skills/store/didi-ride/assets/PREFERENCE.md +58 -0
  110. package/skills/store/didi-ride/package.json +15 -0
  111. package/skills/store/didi-ride/references/api_references.md +171 -0
  112. package/skills/store/didi-ride/references/error_handling.md +68 -0
  113. package/skills/store/didi-ride/references/setup.md +73 -0
  114. package/skills/store/didi-ride/references/workflow.md +150 -0
  115. package/skills/store/flyai/SKILL.md +119 -0
  116. package/skills/store/flyai/references/fliggy-fast-search.md +53 -0
  117. package/skills/store/flyai/references/search-flight.md +89 -0
  118. package/skills/store/flyai/references/search-hotels.md +57 -0
  119. package/skills/store/flyai/references/search-poi.md +49 -0
  120. package/src/commands/download.js +103 -0
  121. package/src/commands/list.js +67 -0
  122. package/src/utils/config.js +24 -0
  123. package/src/utils/gitlab.js +67 -0
  124. package/src/utils/paths.js +19 -0
  125. package/src/utils/versions.js +38 -0
package/bin/sophhub.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { createRequire } from 'node:module';
4
+ import { Command } from 'commander';
5
+ import { registerListCommand } from '../src/commands/list.js';
6
+ import { registerDownloadCommand } from '../src/commands/download.js';
7
+
8
+ const require = createRequire(import.meta.url);
9
+ const pkg = require('../package.json');
10
+
11
+ const program = new Command();
12
+
13
+ program
14
+ .name('sophhub')
15
+ .description('SophHub CLI - Manage and download AI Agent skills')
16
+ .version(pkg.version, '-v, --version');
17
+
18
+ registerListCommand(program);
19
+ registerDownloadCommand(program);
20
+
21
+ program.parse();
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "sophhub",
3
+ "version": "0.1.0",
4
+ "description": "SophHub CLI - Manage and download AI Agent skills",
5
+ "type": "module",
6
+ "bin": {
7
+ "sophhub": "./bin/sophhub.js"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "src/",
12
+ "skills/"
13
+ ],
14
+ "scripts": {
15
+ "prepublishOnly": "bash scripts/prepublish.sh"
16
+ },
17
+ "engines": {
18
+ "node": ">=18"
19
+ },
20
+ "keywords": [
21
+ "sophhub",
22
+ "skill",
23
+ "ai-agent",
24
+ "cli"
25
+ ],
26
+ "license": "MIT",
27
+ "dependencies": {
28
+ "commander": "^14.0.0",
29
+ "chalk": "^5.0.0",
30
+ "cli-table3": "^0.6.0"
31
+ }
32
+ }
@@ -0,0 +1,27 @@
1
+ # Skill Versions
2
+
3
+ | Skill | Type | Version | Updated At |
4
+ | --- | --- | --- | --- |
5
+ | clawhub | builtin | 1.0.0 | 2026-04-08 |
6
+ | flight-booking | builtin | 1.1.0 | 2026-04-08 |
7
+ | inventory-management | builtin | 1.0.0 | 2026-04-08 |
8
+ | schedule-reminder | builtin | 1.0.0 | 2026-04-08 |
9
+ | skill-creator | builtin | 1.0.0 | 2026-04-08 |
10
+ | sophnet-customer-management | builtin | 1.0.0 | 2026-04-08 |
11
+ | sophnet-customized-marketing | builtin | 1.0.0 | 2026-04-08 |
12
+ | sophnet-face-search | builtin | 1.0.0 | 2026-04-08 |
13
+ | sophnet-image-edit | builtin | 1.0.0 | 2026-04-08 |
14
+ | sophnet-image-generate | builtin | 1.0.0 | 2026-04-08 |
15
+ | sophnet-image-ocr | builtin | 1.0.0 | 2026-04-08 |
16
+ | sophnet-infinite-talk | builtin | 1.0.0 | 2026-04-08 |
17
+ | sophnet-oss | builtin | 1.0.0 | 2026-04-08 |
18
+ | sophnet-qa-install | builtin | 2.0.0 | 2026-04-08 |
19
+ | sophnet-training-install | builtin | 2.0.0 | 2026-04-08 |
20
+ | sophnet-tts | builtin | 1.0.0 | 2026-04-08 |
21
+ | sophnet-video-generate | builtin | 1.0.0 | 2026-04-08 |
22
+ | video-understand | builtin | 1.0.0 | 2026-04-08 |
23
+ | weather | builtin | 1.0.0 | 2026-04-08 |
24
+ | web-scraper | builtin | 1.0.0 | 2026-04-08 |
25
+ | website-builder | builtin | 1.0.0 | 2026-04-08 |
26
+ | didi-ride | store | 1.0.0 | 2026-04-09 |
27
+ | flyai | store | 1.0.10 | 2026-04-09 |
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: clawhub
3
+ description: Use the ClawHub CLI to search, install, update, and publish agent skills from clawhub.com. Use when you need to fetch new skills on the fly, sync installed skills to latest or a specific version, or publish new/updated skill folders with the npm-installed clawhub CLI.
4
+ metadata:
5
+ {
6
+ "openclaw":
7
+ {
8
+ "requires": { "bins": ["clawhub"] },
9
+ "install":
10
+ [
11
+ {
12
+ "id": "node",
13
+ "kind": "node",
14
+ "package": "clawhub",
15
+ "bins": ["clawhub"],
16
+ "label": "Install ClawHub CLI (npm)",
17
+ },
18
+ ],
19
+ },
20
+ }
21
+ ---
22
+
23
+ # ClawHub CLI
24
+
25
+ Install
26
+
27
+ ```bash
28
+ npm i -g clawhub
29
+ ```
30
+
31
+ Auth (publish)
32
+
33
+ ```bash
34
+ clawhub login
35
+ clawhub whoami
36
+ ```
37
+
38
+ Search
39
+
40
+ ```bash
41
+ clawhub search "postgres backups"
42
+ ```
43
+
44
+ Install
45
+
46
+ ```bash
47
+ clawhub install my-skill
48
+ clawhub install my-skill --version 1.2.3
49
+ ```
50
+
51
+ Update (hash-based match + upgrade)
52
+
53
+ ```bash
54
+ clawhub update my-skill
55
+ clawhub update my-skill --version 1.2.3
56
+ clawhub update --all
57
+ clawhub update my-skill --force
58
+ clawhub update --all --no-input --force
59
+ ```
60
+
61
+ List
62
+
63
+ ```bash
64
+ clawhub list
65
+ ```
66
+
67
+ Publish
68
+
69
+ ```bash
70
+ clawhub publish ./my-skill --slug my-skill --name "My Skill" --version 1.2.0 --changelog "Fixes + docs"
71
+ ```
72
+
73
+ Notes
74
+
75
+ - Default registry: https://clawhub.com (override with CLAWHUB_REGISTRY or --registry)
76
+ - Default workdir: cwd (falls back to OpenClaw workspace); install dir: ./skills (override with --workdir / --dir / CLAWHUB_WORKDIR)
77
+ - Update command hashes local files, resolves matching version, and upgrades to latest unless --version is set
@@ -0,0 +1,288 @@
1
+ ---
2
+ name: flight-booking
3
+ description: "中国国内机票查询与预订。当用户需要查航班、买机票、订机票、查机票价格、查询订单状态、取消订单、退票或改签时使用。"
4
+ ---
5
+
6
+ # Flight Booking(机票查询与下单)
7
+
8
+ 国内机票查询、创建订单、支付校验与申请出票、退票与改签的全流程 skill。分步执行并在信息未确认时主动向用户确认。
9
+
10
+ > **平台说明**:当前订票通过 **Sophnet 平台**完成,支付使用平台账户余额。若余额不足导致出票失败,需提示用户前往 Sophnet 平台进行充值后再重试。
11
+
12
+ ## 重要原则
13
+
14
+ - **信息完全确定才执行**:创建订单、支付与出票涉及真实资金与行程,仅在用户已明确确认行程、航班、舱位、乘机人及联系人信息后执行。
15
+ - **信息不确定时主动确认**:若用户未提供或存在歧义(如出发/到达城市、日期、航班号、舱位、姓名、手机号、证件号、性别等),必须先向用户逐项确认,不得猜测或默认填写。
16
+ - **出票前务必再次确认**:**不得在创建订单后自动连续执行出票**。第二步创建订单完成后,应先向用户展示订单号、航程与金额,**在用户明确表示「确认出票」或「去支付/出票」后再执行第三步 pay-issue**;未得到用户确认前,不要主动执行出票。
17
+ - **退票前务必二次确认**:**绝对不得在用户未明确确认的情况下执行退票。** 退票流程必须分两步:第一步用 `--dry-run` 查询并向用户展示退改签规则和手续费,第二步**必须等用户明确说「确认退票」「退吧」等确认性语句后**才执行实际退票命令。即使用户说了「我想退票」「帮我看看退票」,也只能先执行 dry-run 展示规则,**不得直接执行退票**。
18
+ - **用户必填变量**:仅需通过**环境变量**配置乘机人 `name`、`mobile`、`credentialNo`、`gender`。联系人默认与乘机人一致,无需重复设置。
19
+ - **航班查询结果展示须完整**:向用户展示航班列表时,必须展示脚本返回的**全部条数**(最多 15 条),且每条须包含航班号、航空公司、出发/到达机场、**起飞时间**、**到达时间**(两列分开)、**经济舱价格与公务舱价格**、**机建费**、**燃油费**,不得少条数或漏列(无公务舱时显示「—」)。
20
+
21
+ ## 流程概览
22
+
23
+ | 步骤 | 说明 | 脚本子命令 |
24
+ |------|------|------------|
25
+ | 第一步 | 航班查询,按经济舱价格排序并展示前 15 条(每航班一行,含经济舱/公务舱最低价) | `search` |
26
+ | 第二步 | 创建订单:可选舱位报价查询 → 验舱验价 → 创建订单(常规) | `create-order` |
27
+ | 第三步 | 支付前校验 + 申请出票 | `pay-issue` |
28
+ | 附加 | 查询订单状态/详情 | `order-status` |
29
+ | 附加 | 取消订单(待支付等可取消状态) | `cancel-order` |
30
+ | 附加 | 退票(已出票订单,需先展示退改签规则并确认) | `refund-order` |
31
+ | 附加 | 改签(已出票订单,需先展示改签手续费,再 search 查询目标航班) | `change-order` |
32
+ | 附加 | 列出本地缓存的历史订单(用户未提供订单号时使用) | `list-orders` |
33
+ | 附加 | 保存当前乘客身份到本地文件 | `save-passenger` |
34
+ | 附加 | 列出已保存的乘客身份(未配置环境变量时选取) | `list-passengers` |
35
+
36
+ ## 第一步:航班查询
37
+
38
+ 在用户提供**出发城市**、**到达城市**、**出发日期(YYYY-MM-DD)** 后执行查询。出发/到达城市支持**三字码**或**城市名**,脚本会自动将城市名转为三字码(如 杭州→HGH、北京→BJS)。
39
+
40
+ **重要:当用户提到了具体航班号(如"查一下 CA1723"、"CA1723 这个航班多少钱"),必须在 search 命令中加上 `--flight-no` 参数,只查该航班,不要忽略用户指定的航班号。**
41
+
42
+ ```bash
43
+ # 查询所有航班
44
+ python3 {baseDir}/scripts/flight_booking.py search --from-city 杭州 --to-city 北京 --from-date 2026-02-25
45
+
46
+ # 查询特定航班(用户指定了航班号时必须使用 --flight-no)
47
+ python3 {baseDir}/scripts/flight_booking.py search --from-city 杭州 --to-city 北京 --from-date 2026-02-25 --flight-no CA1723
48
+ ```
49
+
50
+ - 支持的城市名示例:杭州、北京、上海、广州、深圳、成都、西安、重庆、南京、武汉、青岛、厦门、昆明、海口、三亚等;也可直接填三字码(如 HGH、BJS、PVG)。若用户只说「杭州到北京」,可直接用城市名执行。
51
+ - **输出**:表格列为「航班号、航空公司、出发机场(含航站楼)、到达机场(含航站楼)、起飞时间、到达时间、经济舱、公务舱、机建费、燃油费」;起飞时间与到达时间为**两列**分别展示,按经济舱价格排序的前 15 条。航站楼信息拼在机场名后(如"萧山机场T3")。机建费和燃油费为每张票的附加税费。
52
+ - **状态保存**:查询成功后会将本次结果写入 `~/.openclaw/flight-booking/.last_search.json`,供下一步创建订单时使用;用户只需选择航班号即可下单,无需再次输入出发/到达/日期。
53
+ - 将表格展示给用户后,由用户选择要预订的**航班号**(及可选舱位:经济舱 Y / 公务舱 C,默认 Y)。
54
+
55
+ **航班查询结果向用户展示时,请务必做到信息完整、条数完整:**
56
+
57
+ - **条数**:脚本返回多少条就展示多少条,不要自行删减或只展示部分条数。
58
+ - **每条航班必须包含的字段**:航班号、航空公司、出发机场(含航站楼)、到达机场(含航站楼)、**起飞时间**、**到达时间**、**经济舱价格**、**公务舱价格**、**机建费**、**燃油费**。起飞时间与到达时间为**两列**,缺一不可;若某航班无公务舱则显示「—」或「无」,不得省略该列。
59
+ - **时间**:脚本输出为「起飞时间」「到达时间」两列,向用户展示时也须保留这两列,**不得用 ? 或空白代替到达时间**;若数据中有 `toTime` 必须原样展示。
60
+ - **价格**:经济舱、公务舱两列都要展示;无该舱位时用「—」表示,不得整列不显示。
61
+ - **税费**:机建费(departureTax)、燃油费(fuelTax)为每张票的附加费用,须完整展示,便于用户了解实际总价。
62
+ - 向用户呈现时,优先以表格形式完整列出上述所有列,便于用户比价和选择航班。
63
+
64
+ ## 第二步:创建订单
65
+
66
+ 在用户从第一步表格中**已选择航班号**后执行。行程(出发/到达/日期)与航班详情从**最近一次 search 结果**自动读取,无需用户再次输入;乘机人/联系人从环境变量读取。
67
+
68
+ 必填参数(仅一项):
69
+ - `--flight-no`:用户选择的航班号(须为最近一次 search 结果中的航班)
70
+
71
+ 可选:
72
+ - `--cabin-grade`:Y(经济舱)或 C(公务舱),默认 Y
73
+
74
+ ```bash
75
+ python3 {baseDir}/scripts/flight_booking.py create-order --flight-no CA1723
76
+ # 或指定公务舱
77
+ python3 {baseDir}/scripts/flight_booking.py create-order --flight-no CA1723 --cabin-grade C
78
+ ```
79
+
80
+ - 若未执行过 search 或 `.last_search.json` 不存在/无效,会提示「请先执行 search 查询航班后再下单」。
81
+ - 可选:乘机人生日默认从**身份证号**(18 位)中自动解析,无需单独填写,也可用 `--passenger-birth-day` 覆盖;`--passenger-type`(默认 ADU)、`--credential-type`(默认 IDENTITY)。
82
+ - 输出:订单号 `orderNo`、PNR、超时取消时间、应付金额等;用于第三步。
83
+ - **重要**:创建订单成功后**不要立即执行 pay-issue**。应先向用户展示上述信息,待用户确认后再执行第三步出票。
84
+
85
+ ## 第三步:支付前校验与申请出票
86
+
87
+ **仅在用户明确确认要出票后再执行**(例如用户说「确认出票」「去支付」「可以出票了」等)。不得在创建订单后未经用户确认就自动执行本步骤。
88
+
89
+ 在用户确认后,传入订单号即可。脚本会先查询订单详情获取应付金额,再执行支付前校验与申请出票。
90
+
91
+ ```bash
92
+ python3 {baseDir}/scripts/flight_booking.py pay-issue --order-no <orderNo>
93
+ ```
94
+
95
+ - 脚本内部:先调订单详情接口取 `totalAmount`,再支付前校验,再申请出票;无需用户传入金额。
96
+ - 输出:成功/失败及接口返回信息。
97
+ - **再次强调**:仅当用户已确认订单信息并明确要求出票时,才执行本命令。
98
+
99
+ ## 查询订单状态
100
+
101
+ 用户提供订单号时,可查询订单详情与状态。
102
+
103
+ ```bash
104
+ python3 {baseDir}/scripts/flight_booking.py order-status --order-no <orderNo>
105
+ ```
106
+
107
+ - 输出:订单状态、处理状态、支付状态、乘客与航程等(JSON 或可读摘要)。
108
+
109
+ ## 取消订单
110
+
111
+ 用户提供订单号时,可取消处于可取消状态的订单(如待支付等)。
112
+
113
+ ```bash
114
+ python3 {baseDir}/scripts/flight_booking.py cancel-order --order-no <orderNo>
115
+ ```
116
+
117
+ - 参数:`--order-no`(必填)。
118
+ - 输出:成功时返回「订单 xxx 已取消」;失败时返回接口 code/msg。
119
+
120
+ ## 退票
121
+
122
+ **仅限已出票(ISSUED)的订单才能退票。** 退票前必须先向用户展示退改签规则(退票手续费),在用户了解费用并确认后再正式执行退票。
123
+
124
+ ### 退票流程(分两步)
125
+
126
+ **第一步:查询退改签规则(dry-run)**
127
+
128
+ 先使用 `--dry-run` 参数查询订单的退改签规则,不实际执行退票:
129
+
130
+ ```bash
131
+ python3 {baseDir}/scripts/flight_booking.py refund-order --order-no <orderNo> --dry-run
132
+ ```
133
+
134
+ 脚本会调用订单详情接口,校验订单是否为 ISSUED 状态,然后返回 JSON 输出,其中 `refundChangeRules` 包含每个航段的退改签规则:
135
+ - `refund_rules`:各时间阶段对应的**退票手续费**(`period` 为时间段描述,`fee` 为手续费金额)
136
+ - `change_rules`:各时间阶段对应的**改签手续费**
137
+ - `facePrice`:票面价(用于计算退款金额 = 票面价 - 手续费 + 税费)
138
+ - `baggage`:行李额说明
139
+ - `remark`:其他备注
140
+
141
+ 收到结果后,**必须**将退票手续费以表格形式展示给用户,例如:
142
+
143
+ > **退票手续费规则**(航段:济南 → 昆明 KY8208)
144
+ >
145
+ > | 时间段 | 退票手续费 |
146
+ > |--------|-----------|
147
+ > | 2026-04-09 19:35前 | ¥390 |
148
+ > | 从2026-04-09 19:35至2026-04-14 19:35 | ¥455 |
149
+ > | 从2026-04-14 19:35至2026-04-16 15:35 | ¥520 |
150
+ > | 2026-04-16 15:35后 | ¥585 |
151
+
152
+ 同时根据**当前时间**告知用户当前所处的退票阶段和对应手续费,并询问用户是否确认退票。
153
+
154
+ **第二步:用户确认后执行退票**
155
+
156
+ 在用户明确确认要退票后(如「确认退票」「退吧」等),执行退票命令(不带 `--dry-run`):
157
+
158
+ ```bash
159
+ python3 {baseDir}/scripts/flight_booking.py refund-order --order-no <orderNo>
160
+ ```
161
+
162
+ - 参数:`--order-no`(必填),为已出票的订单号。
163
+ - 输出:成功时返回「订单 xxx 退票申请已提交」及退改签规则;失败时返回接口 code/msg。
164
+
165
+ **重要:不得跳过第一步直接执行退票。必须先展示退改签规则并取得用户确认。**
166
+
167
+ ## 改签
168
+
169
+ **仅限已出票(ISSUED)的订单才能改签。** 改签前需先向用户展示改签手续费规则。
170
+
171
+ ### 改签流程
172
+
173
+ **第一步:查询改签手续费规则**
174
+
175
+ 先调用 `order-status` 或 `refund-order --dry-run` 查询订单详情,从输出中提取 `refundChangeRules` 的 `change_rules` 字段,向用户展示改签手续费表格(格式同退票规则),告知用户当前时间段对应的改签手续费。
176
+
177
+ ```bash
178
+ python3 {baseDir}/scripts/flight_booking.py refund-order --order-no <orderNo> --dry-run
179
+ ```
180
+
181
+ **第二步:用户确认后查询目标航班**
182
+
183
+ 用户确认改签意向并提供目标日期/航班后,执行 `search` 查询目标航班。
184
+
185
+ **第三步:执行改签**
186
+
187
+ 从 search 结果中选择目标航班号提交改签。行程与航班详情从**最近一次 search 结果**自动读取;乘机人信息从环境变量读取。
188
+
189
+ 必填参数:
190
+ - `--order-no`:原订单号(已出票的订单)
191
+ - `--flight-no`:改签目标航班号(须为最近一次 search 结果中的航班)
192
+
193
+ 可选:
194
+ - `--cabin-grade`:Y(经济舱)或 C(公务舱),默认 Y
195
+
196
+ ```bash
197
+ python3 {baseDir}/scripts/flight_booking.py change-order --order-no <orderNo> --flight-no CA1723
198
+ # 或指定公务舱改签
199
+ python3 {baseDir}/scripts/flight_booking.py change-order --order-no <orderNo> --flight-no CA1723 --cabin-grade C
200
+ ```
201
+
202
+ - 脚本内部会自动调用订单详情校验 ISSUED 状态。
203
+ - 若未执行过 search 或 `.last_search.json` 不存在/无效,会提示「请先执行查询航班后再改签」。
204
+ - 输出:改签订单号 `changeOrderNo`、PNR、应付金额等;失败时返回接口 code/msg。
205
+
206
+ ## 脚本与配置
207
+
208
+ - 脚本路径:`scripts/flight_booking.py`,支持子命令 `search`、`create-order`、`pay-issue`、`order-status`、`cancel-order`、`refund-order`、`change-order`、`list-orders`、`save-passenger`、`list-passengers`。
209
+ - **状态文件**:`search` 会将最近一次查询结果(含完整航班详情)写入 `~/.openclaw/flight-booking/.last_search.json`,`create-order` 和 `change-order` 仅传航班号时从该文件读取行程与舱位信息;无需用户手动维护。
210
+
211
+ ### 订单缓存与 list-orders
212
+
213
+ 每次调用 `order-status`、`pay-issue`、`refund-order`、`change-order` 成功时,脚本会自动将订单关键信息(订单号、状态、航程、乘客姓名等)缓存到 `~/.openclaw/flight-booking/.orders_cache.json`。
214
+
215
+ **当用户未提供订单号**(如「帮我退票」「查一下我的订单」)时,应先调用 `list-orders` 查看缓存的历史订单列表:
216
+
217
+ ```bash
218
+ python3 {baseDir}/scripts/flight_booking.py list-orders
219
+ ```
220
+
221
+ - 输出:JSON 格式的订单摘要列表(按最近更新时间倒序),包含 `orderNo`、`orderShowStatus`、航程、乘客等。
222
+ - 根据上下文(航程、日期、乘客姓名等)智能匹配目标订单,向用户确认后再执行后续操作。
223
+ - 若缓存为空,提示用户提供订单号或先查询订单状态。
224
+
225
+ Config(创建订单前必须设置的环境变量)
226
+
227
+ | 环境变量 | 中文说明 | 必填 |
228
+ |----------|----------|------|
229
+ | `PASSENGER_NAME` | 乘机人姓名 | 是 |
230
+ | `PASSENGER_MOBILE` | 乘机人手机号 | 是 |
231
+ | `PASSENGER_CREDENTIAL_NO` | 乘机人证件号(如身份证号) | 是 |
232
+ | `PASSENGER_GENDER` | 乘机人性别:`M` 男 / `F` 女 | 是 |
233
+
234
+ 设置方式示例(在运行脚本的环境中提前配置):
235
+
236
+ ```bash
237
+ export PASSENGER_NAME="张三" # 乘机人姓名
238
+ export PASSENGER_MOBILE="13800138000" # 乘机人手机号
239
+ export PASSENGER_CREDENTIAL_NO="310101199001011234" # 乘机人证件号
240
+ export PASSENGER_GENDER="M" # 乘机人性别 M=男 F=女
241
+ ```
242
+
243
+ 或在 `.env`、openclaw 等配置中统一管理上述变量。未设置时执行 `create-order` 会报错并提示缺失项。
244
+
245
+ **自动保存**:当用户在对话中提供了乘机人信息(姓名、手机号、证件号、性别),应自动将其保存到对应的环境变量中(通过 `export` 命令设置),无需用户手动配置。后续操作(创建订单、退票等)即可直接使用,不必重复询问。
246
+
247
+ ### 乘客身份持久化
248
+
249
+ 除了通过环境变量设置乘机人信息外,脚本还支持将乘客身份**持久化保存到本地文件**(`~/.openclaw/flight-booking/.passengers.json`),便于多次使用同一身份时无需重复输入。
250
+
251
+ **保存乘客身份**:当用户提供了新的乘机人信息并通过 `export` 设置好环境变量后,应立即调用 `save-passenger` 将其持久化:
252
+
253
+ ```bash
254
+ python3 {baseDir}/scripts/flight_booking.py save-passenger
255
+ ```
256
+
257
+ - 从环境变量 `PASSENGER_NAME`、`PASSENGER_MOBILE`、`PASSENGER_CREDENTIAL_NO`、`PASSENGER_GENDER` 读取信息并保存到 `~/.openclaw/flight-booking/.passengers.json`。
258
+ - 以证件号去重:同一证件号的记录会被更新而非重复添加。
259
+
260
+ **列出已保存的乘客身份**:当用户未提供乘机人信息(环境变量未设置)而需要创建订单、退票等操作时,应先调用 `list-passengers` 查看已保存的身份列表:
261
+
262
+ ```bash
263
+ python3 {baseDir}/scripts/flight_booking.py list-passengers
264
+ ```
265
+
266
+ - 输出:JSON 格式的乘客列表,每条包含序号、姓名、性别、脱敏证件号、脱敏手机号、保存时间。
267
+ - 输出中的 `_raw` 字段包含完整未脱敏的信息,供 Agent 读取后通过 `export` 设置环境变量。
268
+ - 向用户展示时使用脱敏信息(如 `张三,证件号 310101****1234`),用户选择后从 `_raw` 取完整值设置环境变量。
269
+
270
+ **使用流程**:
271
+
272
+ 1. 用户需要订票但未设置乘机人信息 → Agent 调用 `list-passengers` 查看是否有已保存的身份
273
+ 2. 若有已保存身份 → **必须**向用户展示列表(脱敏),让用户明确选择一个,**不得自动选取或默认使用任何一个身份**
274
+ 3. 用户明确选择后(如「用第1个」「用张三」) → Agent 从 `_raw` 读取完整信息,通过 `export` 设置环境变量,然后继续执行操作
275
+ 4. 若无已保存身份或用户需要使用新身份 → 引导用户提供信息,设置环境变量后调用 `save-passenger` 保存
276
+ 5. **即使只有一个已保存的乘客身份,也必须向用户确认是否使用该身份,不得自动填充**
277
+
278
+ ## 何时向用户确认
279
+
280
+ - 出发/到达城市不明确(如只说「北京」需确认首都/大兴)。
281
+ - 日期不明确或存在多义。
282
+ - 用户未指定航班号或舱位时,不得替用户选择。
283
+ - 若未配置乘机人环境变量(姓名、手机、证件号、性别),先调用 `list-passengers` 查看是否有已保存的身份,**必须向用户展示列表并等待用户明确选择**,不得自动将已保存身份填充到环境变量中;即使只有一条记录也需用户确认。若无已保存身份,再提示用户提供信息。
284
+ - **退票同样需要乘机人姓名和证件号**(`PASSENGER_NAME`、`PASSENGER_CREDENTIAL_NO`),若未配置则提示用户先设置后再执行退票。
285
+ - **创建订单成功后、执行 pay-issue 出票前**:必须向用户展示订单号、航程与金额,并等待用户明确确认(如「确认出票」「去支付」)后再执行出票,不得下单与出票连续自动执行。
286
+ - **退票前**:必须先通过 `refund-order --dry-run` 查询退改签规则,将退票手续费各时段金额以表格展示给用户,告知当前所处时间段和对应手续费,在用户了解费用并确认后再执行退票。
287
+ - **改签前**:必须先查询退改签规则并向用户展示改签手续费,确认原订单号、目标航班号和舱位,确认后再执行改签。改签需先执行 `search` 查询目标航班。
288
+ - **用户未提供订单号时**:先调用 `list-orders` 查看缓存订单列表,根据上下文匹配后向用户确认目标订单。