@danceiny/gotry 0.0.1-rc.21 → 0.0.1-rc.24

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 (327) hide show
  1. package/README.md +102 -194
  2. package/README.zh-CN.md +115 -210
  3. package/bin/gotry-backend.js +53 -0
  4. package/bin/gotry-bootstrap.js +466 -35
  5. package/bin/gotry-inner.js +255 -36
  6. package/bin/gotry-process-liveness.d.ts +27 -0
  7. package/bin/gotry-process-liveness.js +97 -0
  8. package/bin/gotry-runtime-resolution.d.ts +1 -1
  9. package/bin/gotry-runtime-resolution.js +2 -2
  10. package/client/client.js +174 -0
  11. package/cordis.gotry-patch.yml +70 -93
  12. package/dist/capabilities/agent-reach-deep.js +45 -122
  13. package/dist/capabilities/agent-reach.js +63 -148
  14. package/dist/capabilities/anything.js +89 -75
  15. package/dist/capabilities/artifacts.js +123 -104
  16. package/dist/capabilities/channel-health.js +65 -45
  17. package/dist/capabilities/channel-registry.js +108 -87
  18. package/dist/capabilities/doctor.js +357 -235
  19. package/dist/capabilities/effect.js +223 -309
  20. package/dist/capabilities/fact-log.js +28 -14
  21. package/dist/capabilities/flyai.js +245 -156
  22. package/dist/capabilities/ground-transfer.js +509 -0
  23. package/dist/capabilities/hbcli.js +144 -148
  24. package/dist/capabilities/hotelbyte-transaction.js +194 -0
  25. package/dist/capabilities/incident-log.js +131 -61
  26. package/dist/capabilities/model-override.js +30 -10
  27. package/dist/capabilities/opensky.js +54 -43
  28. package/dist/capabilities/resilience.js +50 -32
  29. package/dist/capabilities/session/action-cache.js +50 -44
  30. package/dist/capabilities/session/adapters/ctrip-flight.js +119 -62
  31. package/dist/capabilities/session/adapters/ctrip-hotel.js +125 -110
  32. package/dist/capabilities/session/adapters/dida-portal.js +206 -0
  33. package/dist/capabilities/session/adapters/meituan-local.js +35 -54
  34. package/dist/capabilities/session/adapters/rail-12306.js +169 -112
  35. package/dist/capabilities/session/benchmark.js +85 -149
  36. package/dist/capabilities/session/extension-bridge.js +320 -259
  37. package/dist/capabilities/session/extension-channel.js +57 -76
  38. package/dist/capabilities/session/extension-distribution.js +115 -119
  39. package/dist/capabilities/session/extract.js +31 -21
  40. package/dist/capabilities/session/golden-score.js +55 -33
  41. package/dist/capabilities/session/health-watch.js +146 -154
  42. package/dist/capabilities/session/read-guard.js +55 -47
  43. package/dist/capabilities/session/static-flight-golden.js +49 -36
  44. package/dist/capabilities/session/transport.js +54 -61
  45. package/dist/capabilities/session/wizard.js +63 -93
  46. package/dist/capabilities/session-consent.js +143 -47
  47. package/dist/capabilities/session-login.js +95 -126
  48. package/dist/capabilities/session-search.js +391 -253
  49. package/dist/capabilities/sponsor-plugin.js +341 -0
  50. package/dist/capabilities/visa-policy.js +87 -73
  51. package/dist/capabilities/weather.js +163 -235
  52. package/dist/scripts/action-cache-tests.js +24 -59
  53. package/dist/scripts/agent-planning-turn-deadline-e2e.js +91 -142
  54. package/dist/scripts/agent-planning-turn-deadline-tests.js +80 -176
  55. package/dist/scripts/agent-reach-deep-tests.js +30 -40
  56. package/dist/scripts/agent-reach-tests.js +26 -18
  57. package/dist/scripts/agent-reach-wrapper-tests.js +46 -50
  58. package/dist/scripts/anything-tests.js +58 -62
  59. package/dist/scripts/artifact-client-contract-tests.js +69 -0
  60. package/dist/scripts/artifacts-capability-tests.js +235 -0
  61. package/dist/scripts/async-collect.js +26 -15
  62. package/dist/scripts/benchmark-environment-bridge-e2e.js +287 -684
  63. package/dist/scripts/benchmark-environment-bridge-tests.js +818 -3123
  64. package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +66 -279
  65. package/dist/scripts/booking-copilot-availability-policy-tests.js +153 -1257
  66. package/dist/scripts/booking-copilot-bin-proof-tests.js +22 -45
  67. package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +64 -76
  68. package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +69 -199
  69. package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +393 -759
  70. package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +33 -75
  71. package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +60 -110
  72. package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +28 -66
  73. package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +72 -271
  74. package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +73 -275
  75. package/dist/scripts/booking-copilot-runtime-proof-tests.js +784 -3398
  76. package/dist/scripts/booking-copilot-server-proof-tests.js +63 -168
  77. package/dist/scripts/booking-copilot-startup-proof-tests.js +38 -124
  78. package/dist/scripts/booking-executor-tests.js +80 -0
  79. package/dist/scripts/booking-recovery-chain-tests.js +182 -0
  80. package/dist/scripts/booking-saga-tests.js +61 -123
  81. package/dist/scripts/booking-surface-contract-proof-tests.js +152 -1167
  82. package/dist/scripts/bootstrap-tests.js +1383 -128
  83. package/dist/scripts/build-changelog.js +89 -130
  84. package/dist/scripts/build-metrics-report.js +135 -143
  85. package/dist/scripts/changelog-tests.js +35 -82
  86. package/dist/scripts/channel-probe-tests.js +44 -116
  87. package/dist/scripts/channel-probe.js +84 -167
  88. package/dist/scripts/channel-registry-tests.js +97 -185
  89. package/dist/scripts/companion-tests.js +25 -70
  90. package/dist/scripts/dida-cookie-probe.js +87 -0
  91. package/dist/scripts/dida-sw-probe.js +114 -0
  92. package/dist/scripts/diff-test.js +17 -12
  93. package/dist/scripts/doctor-tests.js +428 -120
  94. package/dist/scripts/dsh-artifact-e2e.js +150 -0
  95. package/dist/scripts/dsh-artifact-web-e2e.js +443 -0
  96. package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
  97. package/dist/scripts/dsh-runtime-closure-tests.js +110 -153
  98. package/dist/scripts/dsh-runtime-closure.js +75 -63
  99. package/dist/scripts/dsh-session-v3-migration-proof.js +106 -0
  100. package/dist/scripts/dsh-subprocess-local-proof.js +149 -0
  101. package/dist/scripts/dsh-target-closure-proof.js +178 -0
  102. package/dist/scripts/effect-tests.js +165 -552
  103. package/dist/scripts/engine-run.js +1 -3
  104. package/dist/scripts/engine-tests.js +16 -10
  105. package/dist/scripts/evaluation-cadence-tests.js +69 -242
  106. package/dist/scripts/evaluation-contract-tests.js +193 -499
  107. package/dist/scripts/extension-distribution-cli.js +19 -15
  108. package/dist/scripts/extension-distribution-tests.js +98 -211
  109. package/dist/scripts/extension-tests.js +366 -389
  110. package/dist/scripts/fact-gate-tests.js +725 -263
  111. package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
  112. package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
  113. package/dist/scripts/flight-malformed-tests.js +159 -0
  114. package/dist/scripts/flyai-tests.js +325 -68
  115. package/dist/scripts/g5-guard-tests.js +131 -0
  116. package/dist/scripts/g5-guard.js +189 -0
  117. package/dist/scripts/gen-lunar-anchors.js +106 -0
  118. package/dist/scripts/gotry-backend-kernel-tests.js +79 -0
  119. package/dist/scripts/ground-transfer-tests.js +956 -0
  120. package/dist/scripts/hbcli-e2e-tests.js +71 -90
  121. package/dist/scripts/hbcli-live-optin-tests.js +96 -0
  122. package/dist/scripts/hbcli-release-contract-tests.js +122 -0
  123. package/dist/scripts/hbcli-tests.js +41 -115
  124. package/dist/scripts/health-watch-cli.js +42 -28
  125. package/dist/scripts/hotel-date-gate-tests.js +496 -0
  126. package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
  127. package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
  128. package/dist/scripts/i18n-tests.js +16 -9
  129. package/dist/scripts/incident-tests.js +281 -87
  130. package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
  131. package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
  132. package/dist/scripts/issue-271-liveness-tests.js +547 -0
  133. package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
  134. package/dist/scripts/issue-289-model-retry-tests.js +441 -0
  135. package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
  136. package/dist/scripts/issue-338-home-city-e2e.js +577 -0
  137. package/dist/scripts/issue343-real-entry-e2e.js +160 -0
  138. package/dist/scripts/journey-tests.js +22 -27
  139. package/dist/scripts/kernel-manifest-evidence.js +109 -0
  140. package/dist/scripts/kernel-manifest-gate.js +126 -0
  141. package/dist/scripts/kernel-manifest-tests.js +212 -0
  142. package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
  143. package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
  144. package/dist/scripts/kernel-manifest.js +369 -0
  145. package/dist/scripts/ledger-repair-apply-tests.js +316 -0
  146. package/dist/scripts/ledger-repair-plan-tests.js +375 -0
  147. package/dist/scripts/ledger-tests.js +325 -340
  148. package/dist/scripts/ledger-workflow-crash.js +10 -20
  149. package/dist/scripts/map-tools-vendor-package-proof.js +206 -134
  150. package/dist/scripts/memory-capture-tests.js +242 -61
  151. package/dist/scripts/memory-decay-tests.js +18 -52
  152. package/dist/scripts/memory-lifecycle-tests.js +657 -0
  153. package/dist/scripts/memory-lifecycle.js +196 -0
  154. package/dist/scripts/memory-metrics.js +24 -12
  155. package/dist/scripts/memory-value-report.js +474 -222
  156. package/dist/scripts/memory-value-tests.js +328 -0
  157. package/dist/scripts/metrics-report-tests.js +62 -199
  158. package/dist/scripts/model-override-e2e.js +66 -105
  159. package/dist/scripts/nightly-evidence-tests.js +64 -89
  160. package/dist/scripts/nightly-evidence.js +108 -111
  161. package/dist/scripts/nudge-digest.js +39 -28
  162. package/dist/scripts/onboarding-tests.js +63 -88
  163. package/dist/scripts/opensky-check.js +18 -13
  164. package/dist/scripts/opensky-tests.js +28 -28
  165. package/dist/scripts/persona-surface-guard-tests.js +37 -12
  166. package/dist/scripts/pnpm-dsh-closure-proof.js +2 -5
  167. package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
  168. package/dist/scripts/price-drift-tests.js +126 -227
  169. package/dist/scripts/price-drift-watch.js +209 -253
  170. package/dist/scripts/probe-poi-tests.js +52 -45
  171. package/dist/scripts/product-metrics.js +187 -273
  172. package/dist/scripts/publish-preverify.js +47 -41
  173. package/dist/scripts/realtime-pricing-tests.js +37 -76
  174. package/dist/scripts/replay-async.js +20 -18
  175. package/dist/scripts/replay-real.js +16 -18
  176. package/dist/scripts/replay.js +52 -82
  177. package/dist/scripts/session-attach-diagnose.js +16 -12
  178. package/dist/scripts/session-attach-poc.js +34 -37
  179. package/dist/scripts/session-benchmark.js +66 -147
  180. package/dist/scripts/session-dida-live-e2e.js +151 -0
  181. package/dist/scripts/session-extract-tests.js +14 -35
  182. package/dist/scripts/session-login.js +14 -13
  183. package/dist/scripts/session-tests.js +545 -583
  184. package/dist/scripts/sf-live-benchmark.js +92 -110
  185. package/dist/scripts/sf-live-cli-tests.js +2 -9
  186. package/dist/scripts/sf-soft-score-tests.js +19 -60
  187. package/dist/scripts/sf-summary-tests.js +149 -0
  188. package/dist/scripts/sf-summary.js +466 -84
  189. package/dist/scripts/skeleton-check.js +16 -14
  190. package/dist/scripts/skeleton-integration-test.js +11 -10
  191. package/dist/scripts/skills-contract-tests.js +51 -46
  192. package/dist/scripts/smoke-session-gate-tests.js +12 -20
  193. package/dist/scripts/smoke.js +541 -422
  194. package/dist/scripts/sponsor-reuse-tests.js +262 -0
  195. package/dist/scripts/state-cli-tests.js +226 -101
  196. package/dist/scripts/state-cli.js +549 -212
  197. package/dist/scripts/static-golden-tests.js +46 -180
  198. package/dist/scripts/time-eval-tests.js +210 -192
  199. package/dist/scripts/travel-timeline-tests.js +29 -93
  200. package/dist/scripts/turn-handoff-collect-tests.js +46 -93
  201. package/dist/scripts/turn-handoff-collect.js +71 -99
  202. package/dist/scripts/turn-policy-tests.js +28 -29
  203. package/dist/scripts/typed-contract-canary.js +77 -162
  204. package/dist/scripts/tz-resolver-sanity.js +50 -0
  205. package/dist/scripts/tz-resolver-tests.js +584 -0
  206. package/dist/scripts/unified-tests.js +23 -19
  207. package/dist/scripts/visa-policy-tests.js +31 -44
  208. package/dist/scripts/weather-tests.js +121 -543
  209. package/dist/scripts/wish-channel-gate-tests.js +29 -86
  210. package/dist/scripts/write-gate-tests.js +522 -0
  211. package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
  212. package/dist/scripts/z3-lifecycle-tests.js +170 -0
  213. package/dist/scripts/z3-race-repeat-tests.js +39 -0
  214. package/dist/scripts/z3-race-tests.js +18 -12
  215. package/dist/src/artifact-gate.js +652 -221
  216. package/dist/src/backend/kernel.js +91 -0
  217. package/dist/src/backend/modules/booking-copilot.js +55 -0
  218. package/dist/src/backend/modules/booking-executor.js +124 -0
  219. package/dist/src/backend/modules/session-search.js +194 -0
  220. package/dist/src/benchmark-agent-conformance.js +296 -262
  221. package/dist/src/benchmark-environment-bridge.js +298 -413
  222. package/dist/src/benchmark-headless-child-diagnostics.js +93 -100
  223. package/dist/src/benchmark-tool-isolation.js +94 -67
  224. package/dist/src/bookable-facts.js +299 -174
  225. package/dist/src/booking-saga.js +64 -120
  226. package/dist/src/booking-surface/availability-policy.js +443 -576
  227. package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
  228. package/dist/src/booking-surface/contracts.js +24 -80
  229. package/dist/src/booking-surface/dsh-planner.js +510 -281
  230. package/dist/src/booking-surface/dsh-plugin.js +17 -1
  231. package/dist/src/booking-surface/error-codes.js +82 -10
  232. package/dist/src/booking-surface/index.js +0 -3
  233. package/dist/src/booking-surface/profile.js +10 -54
  234. package/dist/src/booking-surface/recovery-chain.js +367 -0
  235. package/dist/src/booking-surface/runtime.js +765 -891
  236. package/dist/src/booking-surface/server.js +200 -251
  237. package/dist/src/booking-surface/startup.js +58 -54
  238. package/dist/src/booking-surface/validation.js +150 -218
  239. package/dist/src/bridge.js +20 -13
  240. package/dist/src/companions.js +48 -74
  241. package/dist/src/contracts.js +21 -43
  242. package/dist/src/dsh-llm.js +82 -120
  243. package/dist/src/engine.js +253 -239
  244. package/dist/src/evaluation-cadence.js +72 -209
  245. package/dist/src/evaluation-contracts.js +220 -843
  246. package/dist/src/flight-pack-adapter.js +54 -0
  247. package/dist/src/flight-pack-contract.js +2 -0
  248. package/dist/src/gotry-backend.js +70 -0
  249. package/dist/src/hotel-date-gate.js +118 -0
  250. package/dist/src/i18n.js +18 -7
  251. package/dist/src/index.js +1425 -1629
  252. package/dist/src/journey.js +132 -81
  253. package/dist/src/ledger-repair-apply.js +538 -0
  254. package/dist/src/ledger-repair-plan.js +463 -0
  255. package/dist/src/loop.js +257 -166
  256. package/dist/src/memory-capture.js +180 -32
  257. package/dist/src/memory-decay.js +30 -14
  258. package/dist/src/memory-lifecycle.js +1310 -0
  259. package/dist/src/memory-utility.js +27 -40
  260. package/dist/src/mock-llm.js +36 -61
  261. package/dist/src/model.js +81 -36
  262. package/dist/src/realtime-pricing.js +63 -72
  263. package/dist/src/slot-spec.js +84 -106
  264. package/dist/src/state-ledger.js +310 -471
  265. package/dist/src/subagent-job-id-guard.js +58 -0
  266. package/dist/src/time-anchor.js +231 -33
  267. package/dist/src/tool-packet.js +20 -8
  268. package/dist/src/travel-slots.js +58 -35
  269. package/dist/src/travel-timeline.js +44 -63
  270. package/dist/src/turn-deadline.js +121 -127
  271. package/dist/src/turn-policy.js +61 -89
  272. package/dist/src/tz-resolver.js +143 -0
  273. package/dist/src/unified.js +504 -381
  274. package/dist/src/wish-pool.js +39 -14
  275. package/dist/src/write-gate.js +495 -0
  276. package/dist/src/z3-shared.js +273 -7
  277. package/extension/README.md +4 -3
  278. package/extension/background.js +125 -14
  279. package/extension/content-bridge.js +23 -1
  280. package/extension/content-main.js +15 -4
  281. package/extension/manifest.json +16 -8
  282. package/package.json +251 -220
  283. package/ts/capabilities/agent-reach.ts +4 -4
  284. package/ts/capabilities/anything.ts +1 -1
  285. package/ts/capabilities/artifacts.ts +46 -9
  286. package/ts/capabilities/flyai.ts +156 -37
  287. package/ts/capabilities/hbcli.ts +1 -1
  288. package/ts/capabilities/incident-log.ts +88 -59
  289. package/ts/capabilities/session/adapters/ctrip-flight.ts +99 -36
  290. package/ts/capabilities/session/adapters/dida-portal.ts +250 -0
  291. package/ts/capabilities/session/adapters/rail-12306.ts +123 -24
  292. package/ts/capabilities/session/extension-bridge.ts +226 -101
  293. package/ts/capabilities/session/extension-channel.ts +22 -9
  294. package/ts/capabilities/session/wizard.ts +2 -2
  295. package/ts/capabilities/session-consent.ts +98 -14
  296. package/ts/capabilities/session-login.ts +1 -0
  297. package/ts/capabilities/session-search.ts +315 -31
  298. package/ts/dsh-runtime/vendor/README.md +8 -4
  299. package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +7 -1
  300. package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +5 -3
  301. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +1 -1
  302. package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +1 -1
  303. package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +6 -6
  304. package/ts/package.json +236 -16
  305. package/ts/scripts/map-tools-vendor-package-proof.ts +152 -31
  306. package/ts/scripts/state-cli.ts +418 -51
  307. package/ts/src/artifact-gate.ts +561 -15
  308. package/ts/src/benchmark-environment-bridge.ts +37 -20
  309. package/ts/src/bookable-facts.ts +183 -7
  310. package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
  311. package/ts/src/booking-surface/dsh-planner.ts +240 -32
  312. package/ts/src/booking-surface/dsh-plugin.js +17 -1
  313. package/ts/src/booking-surface/error-codes.ts +75 -0
  314. package/ts/src/booking-surface/recovery-chain.ts +409 -0
  315. package/ts/src/booking-surface/server.ts +84 -51
  316. package/ts/src/booking-surface/validation.ts +2 -0
  317. package/ts/src/contracts.ts +12 -2
  318. package/ts/src/dsh-llm.ts +4 -8
  319. package/ts/src/index.ts +609 -90
  320. package/ts/src/loop.ts +116 -7
  321. package/ts/src/memory-capture.ts +227 -3
  322. package/ts/src/mock-llm.ts +4 -8
  323. package/ts/src/model.ts +88 -2
  324. package/ts/src/state-ledger.ts +47 -29
  325. package/ts/src/subagent-job-id-guard.ts +72 -0
  326. package/ts/src/time-anchor.ts +217 -13
  327. package/ts/src/unified.ts +316 -54
@@ -1,3 +1,23 @@
1
+ /**
2
+ * CHANGELOG.md 自动生成器(Keep a Changelog 1.1.0 + Conventional Commits 解析)
3
+ *
4
+ * 设计(2026-08-30 owner 拍板:AGENTS.md 「发布闸」+ 「doc-only 同步纪律」延伸):
5
+ * - 输入:`git log <prev-tag>..HEAD --no-merges`,从 package.json 锁定当前版本号;
6
+ * - 解析 Conventional Commits:feat/fix/perf/refactor/docs/test/build/ci/chore/revert
7
+ * + 可选 scope(`feat(scope):`)——scope 用于同一节内归类;
8
+ * - 输出:Keep a Changelog 1.1.0 节结构(Added/Changed/Fixed/Removed/Security),
9
+ * 在 `CHANGELOG.md` 顶部插入新版本段;**已有 CHANGELOG.md 的历史段原样保留**(不重写)。
10
+ * - PR 引用 `#NN` 写入条目尾(支持自动跨 commit 链接)。
11
+ *
12
+ * 运行(在 ts/ 下):
13
+ * npx tsx scripts/build-changelog.ts # 从上一 tag 到 HEAD 生成段,stdout 打印 diff 提示
14
+ * npx tsx scripts/build-changelog.ts --write # 写入 CHANGELOG.md(覆盖顶部新版本段)
15
+ * npx tsx scripts/build-changelog.ts --since v0.0.1-rc.15
16
+ * npx tsx scripts/build-changelog.ts --version 0.0.1-rc.16 --date 2026-08-30
17
+ *
18
+ * 不接 Conventional Commits 严格门:commit subject 不一定全符合(历史 commit 多为长中文),
19
+ * parser 容错——只把带 type: 前缀的归类,其余落入「Other(未分类)」,保持版本段完整可读。
20
+ */
1
21
  import { execFileSync } from 'node:child_process';
2
22
  import { readFileSync, writeFileSync, existsSync } from 'node:fs';
3
23
  import { join } from 'node:path';
@@ -11,26 +31,19 @@ const TYPE_TO_KEEP_A_CHANGELOG = {
11
31
  build: 'Build',
12
32
  ci: 'CI',
13
33
  chore: 'Chore',
14
- revert: 'Reverted'
34
+ revert: 'Reverted',
15
35
  };
16
36
  const DISPLAY_ORDER = [
17
- 'feat',
18
- 'fix',
19
- 'perf',
20
- 'refactor',
21
- 'revert',
22
- 'docs',
23
- 'test',
24
- 'build',
25
- 'ci',
26
- 'chore',
27
- 'other'
37
+ 'feat', 'fix', 'perf', 'refactor', 'revert', 'docs', 'test', 'build', 'ci', 'chore', 'other',
28
38
  ];
29
39
  const CONVENTIONAL_RE = /^(feat|fix|perf|refactor|docs|test|build|ci|chore|revert)(?:\(([^)]+)\))?(!)?:\s*(.+)$/;
30
40
  export function parseCommit(raw) {
31
41
  const lines = raw.split('\n');
32
42
  const firstLine = lines[0] ?? '';
33
- if (!firstLine) return null;
43
+ if (!firstLine)
44
+ return null;
45
+ // Conventional Commits 形如: "feat(scope)!: subject (#PR)" — 把尾 (#NN) 单独拆出来,
46
+ // 防 subject 内的 (xxx) 被 CONVENTIONAL_RE 的 scope-group (\\([^)]+\\)) 误吞。
34
47
  const { head, prRef } = splitSubjectAndPr(firstLine);
35
48
  const match = head.match(CONVENTIONAL_RE);
36
49
  if (!match) {
@@ -40,10 +53,11 @@ export function parseCommit(raw) {
40
53
  scope: null,
41
54
  subject: head,
42
55
  prRef,
43
- raw
56
+ raw,
44
57
  };
45
58
  }
46
59
  const [, type, scope] = match;
60
+ // subject:从 ": " 之后到行尾(已被 splitSubjectAndPr 切过尾)
47
61
  const colonIdx = head.indexOf(': ');
48
62
  const subject = colonIdx >= 0 ? head.slice(colonIdx + 2).trim() : head;
49
63
  return {
@@ -52,62 +66,46 @@ export function parseCommit(raw) {
52
66
  scope: scope ?? null,
53
67
  subject,
54
68
  prRef,
55
- raw
69
+ raw,
56
70
  };
57
71
  }
58
72
  function splitSubjectAndPr(text) {
73
+ // 行尾的 " (#NN)" 拆出来;中文长 subject 中也可能有"(...)"形态,只切最后那个
59
74
  const m = text.match(/\s+\(#(\d+)\)\s*$/);
60
- if (m) return {
61
- head: text.slice(0, m.index).trim(),
62
- prRef: m[1]
63
- };
64
- return {
65
- head: text.trim(),
66
- prRef: null
67
- };
75
+ if (m)
76
+ return { head: text.slice(0, m.index).trim(), prRef: m[1] };
77
+ return { head: text.trim(), prRef: null };
68
78
  }
69
79
  function extractPrRef(text) {
70
80
  const m = text.match(/\(#(\d+)\)/);
71
81
  return m ? m[1] : null;
72
82
  }
73
83
  export function listCommits(opts) {
74
- const args = [
75
- 'log',
76
- '--no-merges',
77
- '--pretty=format:%H%x00%s%x00%b%x00%x1e'
78
- ];
79
- if (opts.since) args.push(`${opts.since}..HEAD`);
80
- const out = execFileSync('git', args, {
81
- cwd: opts.cwd,
82
- encoding: 'utf8'
83
- });
84
- if (!out) return [];
85
- return out.split('\u001e').filter(Boolean).map((raw)=>{
86
- const [sha, subject, body] = raw.split('\u0000').map((s)=>(s ?? '').trim());
87
- return {
88
- sha: sha ?? '',
89
- subject: subject ?? '',
90
- body: body ?? ''
91
- };
84
+ const args = ['log', '--no-merges', '--pretty=format:%H%x00%s%x00%b%x00%x1e'];
85
+ if (opts.since)
86
+ args.push(`${opts.since}..HEAD`);
87
+ const out = execFileSync('git', args, { cwd: opts.cwd, encoding: 'utf8' });
88
+ if (!out)
89
+ return [];
90
+ return out.split('\u001e').filter(Boolean).map((raw) => {
91
+ const [sha, subject, body] = raw.split('\u0000').map((s) => (s ?? '').trim());
92
+ return { sha: sha ?? '', subject: subject ?? '', body: body ?? '' };
92
93
  });
93
94
  }
95
+ /** 把 commit 列表分类成 sections;相同 type 合并,scope 作为 sub-group(同 type 内) */
94
96
  export function groupCommits(commits) {
95
97
  const sections = new Map();
96
- for (const c of commits){
97
- if (!sections.has(c.type)) sections.set(c.type, {
98
- type: c.type,
99
- items: []
100
- });
101
- sections.get(c.type).items.push({
102
- subject: c.subject,
103
- sha: c.sha,
104
- prRef: c.prRef
105
- });
98
+ for (const c of commits) {
99
+ if (!sections.has(c.type))
100
+ sections.set(c.type, { type: c.type, items: [] });
101
+ sections.get(c.type).items.push({ subject: c.subject, sha: c.sha, prRef: c.prRef });
106
102
  }
103
+ // 按 DISPLAY_ORDER 输出
107
104
  const out = [];
108
- for (const t of DISPLAY_ORDER){
105
+ for (const t of DISPLAY_ORDER) {
109
106
  const sec = sections.get(t);
110
- if (sec && sec.items.length > 0) out.push(sec);
107
+ if (sec && sec.items.length > 0)
108
+ out.push(sec);
111
109
  }
112
110
  return out;
113
111
  }
@@ -115,42 +113,34 @@ export function renderMarkdownEntry(entry) {
115
113
  const lines = [];
116
114
  lines.push(`## [${entry.version}] - ${entry.date}`);
117
115
  lines.push('');
118
- for (const sec of entry.sections){
119
- const header = sec.type === 'other' ? 'Other' : TYPE_TO_KEEP_A_CHANGELOG[sec.type] ?? sec.type;
116
+ for (const sec of entry.sections) {
117
+ const header = sec.type === 'other' ? 'Other' : (TYPE_TO_KEEP_A_CHANGELOG[sec.type] ?? sec.type);
120
118
  lines.push(`### ${header}`);
121
119
  lines.push('');
122
- for (const item of sec.items){
120
+ for (const item of sec.items) {
123
121
  const subject = truncateSubject(item.subject, 120);
124
- const suffix = item.prRef ? ` (#${item.prRef})` : item.sha ? ` (${item.sha.slice(0, 7)})` : '';
122
+ const suffix = item.prRef ? ` (#${item.prRef})` : (item.sha ? ` (${item.sha.slice(0, 7)})` : '');
125
123
  lines.push(`- ${subject}${suffix}`);
126
124
  }
127
125
  lines.push('');
128
126
  }
129
127
  return lines.join('\n');
130
128
  }
129
+ /** 长 subject 在第一个「。」/「——」/「;」处截断,防历史超长 commit message 把 CHANGELOG 撑爆;
130
+ * 失败兜底:超过 2×max 字符直接切 + …(短 breaker 优先;超长用纯字符切片) */
131
131
  function truncateSubject(text, max) {
132
132
  if (text.length <= max * 2) {
133
- const breakers = [
134
- '。',
135
- '——',
136
- '; ',
137
- ' — ',
138
- ',',
139
- ','
140
- ];
141
- for (const b of breakers){
133
+ const breakers = ['。', '——', '; ', ' — ', ',', ','];
134
+ for (const b of breakers) {
142
135
  const i = text.indexOf(b);
143
- if (i > 30 && i <= max * 2) return `${text.slice(0, i).trim()}…`;
136
+ if (i > 30 && i <= max * 2)
137
+ return `${text.slice(0, i).trim()}…`;
144
138
  }
145
139
  }
146
140
  return `${text.slice(0, max).trim()}…`;
147
141
  }
148
142
  export function buildEntry(opts) {
149
- return {
150
- version: opts.version,
151
- date: opts.date,
152
- sections: groupCommits(opts.commits)
153
- };
143
+ return { version: opts.version, date: opts.date, sections: groupCommits(opts.commits) };
154
144
  }
155
145
  const CHANGELOG_HEADER = `# Changelog
156
146
 
@@ -161,25 +151,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
161
151
 
162
152
  `;
163
153
  export function splitChangelog(raw) {
154
+ // 找第一个 "## [" 位置——之前的全是 preamble
164
155
  const firstSection = raw.indexOf('\n## [');
165
- if (firstSection < 0) return {
166
- preamble: raw.endsWith('\n') ? raw : `${raw}\n`,
167
- history: []
168
- };
169
- const preamble = raw.slice(0, firstSection + 1);
156
+ if (firstSection < 0)
157
+ return { preamble: raw.endsWith('\n') ? raw : `${raw}\n`, history: [] };
158
+ const preamble = raw.slice(0, firstSection + 1); // 含末尾换行
170
159
  const history = raw.slice(firstSection + 1);
171
- return {
172
- preamble,
173
- history: [
174
- history
175
- ]
176
- };
160
+ return { preamble, history: [history] };
177
161
  }
178
162
  export function prependEntry(raw, entryMarkdown) {
179
163
  if (!existsSync(join('..', 'CHANGELOG.md')) && !raw) {
180
164
  return CHANGELOG_HEADER + entryMarkdown;
181
165
  }
182
- const split = splitChangelog(raw || CHANGELOG_HEADER + '');
166
+ const split = splitChangelog(raw || (CHANGELOG_HEADER + ''));
167
+ // 头:preamble + 新版本段 + 历史段(history 中已含首个 "\n## [")
183
168
  return split.preamble + entryMarkdown + '\n' + split.history.join('').replace(/^\n/, '');
184
169
  }
185
170
  function arg(name) {
@@ -188,40 +173,27 @@ function arg(name) {
188
173
  }
189
174
  function readPackageVersion() {
190
175
  const raw = JSON.parse(readFileSync(join('..', 'package.json'), 'utf8'));
191
- if (!raw.version) throw new Error('package.json 缺 version 字段');
176
+ if (!raw.version)
177
+ throw new Error('package.json 缺 version 字段');
192
178
  return raw.version;
193
179
  }
194
180
  function gitHeadSha() {
195
- return execFileSync('git', [
196
- 'rev-parse',
197
- 'HEAD'
198
- ], {
199
- encoding: 'utf8'
200
- }).trim();
181
+ return execFileSync('git', ['rev-parse', 'HEAD'], { encoding: 'utf8' }).trim();
201
182
  }
202
183
  export function buildFromGit(opts) {
203
- const rawCommits = listCommits({
204
- cwd: opts.cwd,
205
- since: opts.since
206
- });
184
+ const rawCommits = listCommits({ cwd: opts.cwd, since: opts.since });
207
185
  const parsed = [];
208
- for (const r of rawCommits){
186
+ for (const r of rawCommits) {
209
187
  const m = parseCommit(r.subject);
210
- if (!m) continue;
188
+ if (!m)
189
+ continue;
211
190
  m.sha = r.sha;
212
191
  m.raw = r.body;
213
192
  parsed.push(m);
214
193
  }
215
- const entry = buildEntry({
216
- version: opts.version,
217
- date: opts.date,
218
- commits: parsed
219
- });
194
+ const entry = buildEntry({ version: opts.version, date: opts.date, commits: parsed });
220
195
  const markdown = renderMarkdownEntry(entry);
221
- return {
222
- entry,
223
- markdown
224
- };
196
+ return { entry, markdown };
225
197
  }
226
198
  async function main() {
227
199
  const cwd = join('..');
@@ -231,34 +203,23 @@ async function main() {
231
203
  const write = process.argv.includes('--write');
232
204
  let sinceTag = since;
233
205
  if (!sinceTag) {
234
- const out = execFileSync('git', [
235
- 'tag',
236
- '-l',
237
- 'v*',
238
- '--sort=-v:refname'
239
- ], {
240
- cwd,
241
- encoding: 'utf8'
242
- });
243
- const tags = out.split('\n').map((t)=>t.trim()).filter(Boolean);
244
- sinceTag = tags.find((t)=>t !== `v${version}` && tagsAreLessThan(t, `v${version}`)) ?? tags[tags.length - 1];
206
+ // 自动推断:取 tags < version 的最高 tag
207
+ const out = execFileSync('git', ['tag', '-l', 'v*', '--sort=-v:refname'], { cwd, encoding: 'utf8' });
208
+ const tags = out.split('\n').map((t) => t.trim()).filter(Boolean);
209
+ sinceTag = tags.find((t) => t !== `v${version}` && tagsAreLessThan(t, `v${version}`)) ?? tags[tags.length - 1];
245
210
  }
246
211
  if (!sinceTag) {
247
212
  console.error('build-changelog: 找不到起始 tag;传 --since <tag> 显式指定');
248
213
  process.exit(2);
249
214
  }
250
- const { entry, markdown } = buildFromGit({
251
- cwd,
252
- version,
253
- date,
254
- since: sinceTag
255
- });
215
+ const { entry, markdown } = buildFromGit({ cwd, version, date, since: sinceTag });
256
216
  const existing = existsSync(join(cwd, 'CHANGELOG.md')) ? readFileSync(join(cwd, 'CHANGELOG.md'), 'utf8') : '';
257
217
  const next = write ? prependEntry(existing, markdown) : markdown;
258
- console.log(`# build-changelog: ${entry.sections.length} sections / ${entry.sections.reduce((n, s)=>n + s.items.length, 0)} commits since ${sinceTag}`);
259
- for (const sec of entry.sections){
218
+ console.log(`# build-changelog: ${entry.sections.length} sections / ${entry.sections.reduce((n, s) => n + s.items.length, 0)} commits since ${sinceTag}`);
219
+ for (const sec of entry.sections) {
260
220
  console.log(`## ${sec.type} (${sec.items.length})`);
261
- for (const it of sec.items)console.log(` - ${it.subject}${it.prRef ? ` (#${it.prRef})` : ''}`);
221
+ for (const it of sec.items)
222
+ console.log(` - ${it.subject}${it.prRef ? ` (#${it.prRef})` : ''}`);
262
223
  }
263
224
  if (write) {
264
225
  writeFileSync(join(cwd, 'CHANGELOG.md'), next, 'utf8');
@@ -266,14 +227,12 @@ async function main() {
266
227
  }
267
228
  }
268
229
  function tagsAreLessThan(a, b) {
230
+ // 简化:字符串字典序比较(对 v0.0.1-rc.N 系列足够;复杂语义版本需 semver 库)
269
231
  return a < b;
270
232
  }
271
233
  if (process.argv[1]?.endsWith('build-changelog.ts')) {
272
- main().catch((e)=>{
234
+ main().catch((e) => {
273
235
  console.error(`build-changelog error: ${e.message}`);
274
236
  process.exit(1);
275
237
  });
276
238
  }
277
-
278
-
279
- //# sourceURL=ts/scripts/build-changelog.ts