@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.
- package/README.md +102 -194
- package/README.zh-CN.md +115 -210
- package/bin/gotry-backend.js +53 -0
- package/bin/gotry-bootstrap.js +466 -35
- package/bin/gotry-inner.js +255 -36
- package/bin/gotry-process-liveness.d.ts +27 -0
- package/bin/gotry-process-liveness.js +97 -0
- package/bin/gotry-runtime-resolution.d.ts +1 -1
- package/bin/gotry-runtime-resolution.js +2 -2
- package/client/client.js +174 -0
- package/cordis.gotry-patch.yml +70 -93
- package/dist/capabilities/agent-reach-deep.js +45 -122
- package/dist/capabilities/agent-reach.js +63 -148
- package/dist/capabilities/anything.js +89 -75
- package/dist/capabilities/artifacts.js +123 -104
- package/dist/capabilities/channel-health.js +65 -45
- package/dist/capabilities/channel-registry.js +108 -87
- package/dist/capabilities/doctor.js +357 -235
- package/dist/capabilities/effect.js +223 -309
- package/dist/capabilities/fact-log.js +28 -14
- package/dist/capabilities/flyai.js +245 -156
- package/dist/capabilities/ground-transfer.js +509 -0
- package/dist/capabilities/hbcli.js +144 -148
- package/dist/capabilities/hotelbyte-transaction.js +194 -0
- package/dist/capabilities/incident-log.js +131 -61
- package/dist/capabilities/model-override.js +30 -10
- package/dist/capabilities/opensky.js +54 -43
- package/dist/capabilities/resilience.js +50 -32
- package/dist/capabilities/session/action-cache.js +50 -44
- package/dist/capabilities/session/adapters/ctrip-flight.js +119 -62
- package/dist/capabilities/session/adapters/ctrip-hotel.js +125 -110
- package/dist/capabilities/session/adapters/dida-portal.js +206 -0
- package/dist/capabilities/session/adapters/meituan-local.js +35 -54
- package/dist/capabilities/session/adapters/rail-12306.js +169 -112
- package/dist/capabilities/session/benchmark.js +85 -149
- package/dist/capabilities/session/extension-bridge.js +320 -259
- package/dist/capabilities/session/extension-channel.js +57 -76
- package/dist/capabilities/session/extension-distribution.js +115 -119
- package/dist/capabilities/session/extract.js +31 -21
- package/dist/capabilities/session/golden-score.js +55 -33
- package/dist/capabilities/session/health-watch.js +146 -154
- package/dist/capabilities/session/read-guard.js +55 -47
- package/dist/capabilities/session/static-flight-golden.js +49 -36
- package/dist/capabilities/session/transport.js +54 -61
- package/dist/capabilities/session/wizard.js +63 -93
- package/dist/capabilities/session-consent.js +143 -47
- package/dist/capabilities/session-login.js +95 -126
- package/dist/capabilities/session-search.js +391 -253
- package/dist/capabilities/sponsor-plugin.js +341 -0
- package/dist/capabilities/visa-policy.js +87 -73
- package/dist/capabilities/weather.js +163 -235
- package/dist/scripts/action-cache-tests.js +24 -59
- package/dist/scripts/agent-planning-turn-deadline-e2e.js +91 -142
- package/dist/scripts/agent-planning-turn-deadline-tests.js +80 -176
- package/dist/scripts/agent-reach-deep-tests.js +30 -40
- package/dist/scripts/agent-reach-tests.js +26 -18
- package/dist/scripts/agent-reach-wrapper-tests.js +46 -50
- package/dist/scripts/anything-tests.js +58 -62
- package/dist/scripts/artifact-client-contract-tests.js +69 -0
- package/dist/scripts/artifacts-capability-tests.js +235 -0
- package/dist/scripts/async-collect.js +26 -15
- package/dist/scripts/benchmark-environment-bridge-e2e.js +287 -684
- package/dist/scripts/benchmark-environment-bridge-tests.js +818 -3123
- package/dist/scripts/booking-copilot-availability-ledger-binding-tests.js +66 -279
- package/dist/scripts/booking-copilot-availability-policy-tests.js +153 -1257
- package/dist/scripts/booking-copilot-bin-proof-tests.js +22 -45
- package/dist/scripts/booking-copilot-crossrepo-fixture-server.js +64 -76
- package/dist/scripts/booking-copilot-dsh-core-proof-tests.js +69 -199
- package/dist/scripts/booking-copilot-dsh-planner-proof-tests.js +393 -759
- package/dist/scripts/booking-copilot-dsh-plugin-proof-tests.js +33 -75
- package/dist/scripts/booking-copilot-event-sequence-concurrency-proof-tests.js +60 -110
- package/dist/scripts/booking-copilot-gap-code-contract-proof-tests.js +28 -66
- package/dist/scripts/booking-copilot-operation-ledger-concurrency-proof-tests.js +72 -271
- package/dist/scripts/booking-copilot-receipt-ledger-concurrency-proof-tests.js +73 -275
- package/dist/scripts/booking-copilot-runtime-proof-tests.js +784 -3398
- package/dist/scripts/booking-copilot-server-proof-tests.js +63 -168
- package/dist/scripts/booking-copilot-startup-proof-tests.js +38 -124
- package/dist/scripts/booking-executor-tests.js +80 -0
- package/dist/scripts/booking-recovery-chain-tests.js +182 -0
- package/dist/scripts/booking-saga-tests.js +61 -123
- package/dist/scripts/booking-surface-contract-proof-tests.js +152 -1167
- package/dist/scripts/bootstrap-tests.js +1383 -128
- package/dist/scripts/build-changelog.js +89 -130
- package/dist/scripts/build-metrics-report.js +135 -143
- package/dist/scripts/changelog-tests.js +35 -82
- package/dist/scripts/channel-probe-tests.js +44 -116
- package/dist/scripts/channel-probe.js +84 -167
- package/dist/scripts/channel-registry-tests.js +97 -185
- package/dist/scripts/companion-tests.js +25 -70
- package/dist/scripts/dida-cookie-probe.js +87 -0
- package/dist/scripts/dida-sw-probe.js +114 -0
- package/dist/scripts/diff-test.js +17 -12
- package/dist/scripts/doctor-tests.js +428 -120
- package/dist/scripts/dsh-artifact-e2e.js +150 -0
- package/dist/scripts/dsh-artifact-web-e2e.js +443 -0
- package/dist/scripts/dsh-http-proxy-sse-proof.js +90 -0
- package/dist/scripts/dsh-runtime-closure-tests.js +110 -153
- package/dist/scripts/dsh-runtime-closure.js +75 -63
- package/dist/scripts/dsh-session-v3-migration-proof.js +106 -0
- package/dist/scripts/dsh-subprocess-local-proof.js +149 -0
- package/dist/scripts/dsh-target-closure-proof.js +178 -0
- package/dist/scripts/effect-tests.js +165 -552
- package/dist/scripts/engine-run.js +1 -3
- package/dist/scripts/engine-tests.js +16 -10
- package/dist/scripts/evaluation-cadence-tests.js +69 -242
- package/dist/scripts/evaluation-contract-tests.js +193 -499
- package/dist/scripts/extension-distribution-cli.js +19 -15
- package/dist/scripts/extension-distribution-tests.js +98 -211
- package/dist/scripts/extension-tests.js +366 -389
- package/dist/scripts/fact-gate-tests.js +725 -263
- package/dist/scripts/fixtures/extension-bridge-unref-child.mjs +21 -0
- package/dist/scripts/flight-hotel-anchor-363-registered-e2e.js +169 -0
- package/dist/scripts/flight-malformed-tests.js +159 -0
- package/dist/scripts/flyai-tests.js +325 -68
- package/dist/scripts/g5-guard-tests.js +131 -0
- package/dist/scripts/g5-guard.js +189 -0
- package/dist/scripts/gen-lunar-anchors.js +106 -0
- package/dist/scripts/gotry-backend-kernel-tests.js +79 -0
- package/dist/scripts/ground-transfer-tests.js +956 -0
- package/dist/scripts/hbcli-e2e-tests.js +71 -90
- package/dist/scripts/hbcli-live-optin-tests.js +96 -0
- package/dist/scripts/hbcli-release-contract-tests.js +122 -0
- package/dist/scripts/hbcli-tests.js +41 -115
- package/dist/scripts/health-watch-cli.js +42 -28
- package/dist/scripts/hotel-date-gate-tests.js +496 -0
- package/dist/scripts/hotelbyte-reconcile-tests.js +141 -0
- package/dist/scripts/hotelbyte-spawn-e2e-tests.js +373 -0
- package/dist/scripts/i18n-tests.js +16 -9
- package/dist/scripts/incident-tests.js +281 -87
- package/dist/scripts/issue-194-job-id-guard-tests.js +106 -0
- package/dist/scripts/issue-233-cancel-refund-commission-tests.js +392 -0
- package/dist/scripts/issue-271-liveness-tests.js +547 -0
- package/dist/scripts/issue-289-model-retry-real-tests.js +296 -0
- package/dist/scripts/issue-289-model-retry-tests.js +441 -0
- package/dist/scripts/issue-289-web-retry-e2e.js +630 -0
- package/dist/scripts/issue-338-home-city-e2e.js +577 -0
- package/dist/scripts/issue343-real-entry-e2e.js +160 -0
- package/dist/scripts/journey-tests.js +22 -27
- package/dist/scripts/kernel-manifest-evidence.js +109 -0
- package/dist/scripts/kernel-manifest-gate.js +126 -0
- package/dist/scripts/kernel-manifest-tests.js +212 -0
- package/dist/scripts/kernel-manifest-trace-entry.js +7 -0
- package/dist/scripts/kernel-manifest-trace-hook.mjs +28 -0
- package/dist/scripts/kernel-manifest.js +369 -0
- package/dist/scripts/ledger-repair-apply-tests.js +316 -0
- package/dist/scripts/ledger-repair-plan-tests.js +375 -0
- package/dist/scripts/ledger-tests.js +325 -340
- package/dist/scripts/ledger-workflow-crash.js +10 -20
- package/dist/scripts/map-tools-vendor-package-proof.js +206 -134
- package/dist/scripts/memory-capture-tests.js +242 -61
- package/dist/scripts/memory-decay-tests.js +18 -52
- package/dist/scripts/memory-lifecycle-tests.js +657 -0
- package/dist/scripts/memory-lifecycle.js +196 -0
- package/dist/scripts/memory-metrics.js +24 -12
- package/dist/scripts/memory-value-report.js +474 -222
- package/dist/scripts/memory-value-tests.js +328 -0
- package/dist/scripts/metrics-report-tests.js +62 -199
- package/dist/scripts/model-override-e2e.js +66 -105
- package/dist/scripts/nightly-evidence-tests.js +64 -89
- package/dist/scripts/nightly-evidence.js +108 -111
- package/dist/scripts/nudge-digest.js +39 -28
- package/dist/scripts/onboarding-tests.js +63 -88
- package/dist/scripts/opensky-check.js +18 -13
- package/dist/scripts/opensky-tests.js +28 -28
- package/dist/scripts/persona-surface-guard-tests.js +37 -12
- package/dist/scripts/pnpm-dsh-closure-proof.js +2 -5
- package/dist/scripts/policy-anchor-359-registered-e2e.js +214 -0
- package/dist/scripts/price-drift-tests.js +126 -227
- package/dist/scripts/price-drift-watch.js +209 -253
- package/dist/scripts/probe-poi-tests.js +52 -45
- package/dist/scripts/product-metrics.js +187 -273
- package/dist/scripts/publish-preverify.js +47 -41
- package/dist/scripts/realtime-pricing-tests.js +37 -76
- package/dist/scripts/replay-async.js +20 -18
- package/dist/scripts/replay-real.js +16 -18
- package/dist/scripts/replay.js +52 -82
- package/dist/scripts/session-attach-diagnose.js +16 -12
- package/dist/scripts/session-attach-poc.js +34 -37
- package/dist/scripts/session-benchmark.js +66 -147
- package/dist/scripts/session-dida-live-e2e.js +151 -0
- package/dist/scripts/session-extract-tests.js +14 -35
- package/dist/scripts/session-login.js +14 -13
- package/dist/scripts/session-tests.js +545 -583
- package/dist/scripts/sf-live-benchmark.js +92 -110
- package/dist/scripts/sf-live-cli-tests.js +2 -9
- package/dist/scripts/sf-soft-score-tests.js +19 -60
- package/dist/scripts/sf-summary-tests.js +149 -0
- package/dist/scripts/sf-summary.js +466 -84
- package/dist/scripts/skeleton-check.js +16 -14
- package/dist/scripts/skeleton-integration-test.js +11 -10
- package/dist/scripts/skills-contract-tests.js +51 -46
- package/dist/scripts/smoke-session-gate-tests.js +12 -20
- package/dist/scripts/smoke.js +541 -422
- package/dist/scripts/sponsor-reuse-tests.js +262 -0
- package/dist/scripts/state-cli-tests.js +226 -101
- package/dist/scripts/state-cli.js +549 -212
- package/dist/scripts/static-golden-tests.js +46 -180
- package/dist/scripts/time-eval-tests.js +210 -192
- package/dist/scripts/travel-timeline-tests.js +29 -93
- package/dist/scripts/turn-handoff-collect-tests.js +46 -93
- package/dist/scripts/turn-handoff-collect.js +71 -99
- package/dist/scripts/turn-policy-tests.js +28 -29
- package/dist/scripts/typed-contract-canary.js +77 -162
- package/dist/scripts/tz-resolver-sanity.js +50 -0
- package/dist/scripts/tz-resolver-tests.js +584 -0
- package/dist/scripts/unified-tests.js +23 -19
- package/dist/scripts/visa-policy-tests.js +31 -44
- package/dist/scripts/weather-tests.js +121 -543
- package/dist/scripts/wish-channel-gate-tests.js +29 -86
- package/dist/scripts/write-gate-tests.js +522 -0
- package/dist/scripts/z3-lifecycle-fault-tests.js +188 -0
- package/dist/scripts/z3-lifecycle-tests.js +170 -0
- package/dist/scripts/z3-race-repeat-tests.js +39 -0
- package/dist/scripts/z3-race-tests.js +18 -12
- package/dist/src/artifact-gate.js +652 -221
- package/dist/src/backend/kernel.js +91 -0
- package/dist/src/backend/modules/booking-copilot.js +55 -0
- package/dist/src/backend/modules/booking-executor.js +124 -0
- package/dist/src/backend/modules/session-search.js +194 -0
- package/dist/src/benchmark-agent-conformance.js +296 -262
- package/dist/src/benchmark-environment-bridge.js +298 -413
- package/dist/src/benchmark-headless-child-diagnostics.js +93 -100
- package/dist/src/benchmark-tool-isolation.js +94 -67
- package/dist/src/bookable-facts.js +299 -174
- package/dist/src/booking-saga.js +64 -120
- package/dist/src/booking-surface/availability-policy.js +443 -576
- package/dist/src/booking-surface/cancel-refund-commission.js +379 -0
- package/dist/src/booking-surface/contracts.js +24 -80
- package/dist/src/booking-surface/dsh-planner.js +510 -281
- package/dist/src/booking-surface/dsh-plugin.js +17 -1
- package/dist/src/booking-surface/error-codes.js +82 -10
- package/dist/src/booking-surface/index.js +0 -3
- package/dist/src/booking-surface/profile.js +10 -54
- package/dist/src/booking-surface/recovery-chain.js +367 -0
- package/dist/src/booking-surface/runtime.js +765 -891
- package/dist/src/booking-surface/server.js +200 -251
- package/dist/src/booking-surface/startup.js +58 -54
- package/dist/src/booking-surface/validation.js +150 -218
- package/dist/src/bridge.js +20 -13
- package/dist/src/companions.js +48 -74
- package/dist/src/contracts.js +21 -43
- package/dist/src/dsh-llm.js +82 -120
- package/dist/src/engine.js +253 -239
- package/dist/src/evaluation-cadence.js +72 -209
- package/dist/src/evaluation-contracts.js +220 -843
- package/dist/src/flight-pack-adapter.js +54 -0
- package/dist/src/flight-pack-contract.js +2 -0
- package/dist/src/gotry-backend.js +70 -0
- package/dist/src/hotel-date-gate.js +118 -0
- package/dist/src/i18n.js +18 -7
- package/dist/src/index.js +1425 -1629
- package/dist/src/journey.js +132 -81
- package/dist/src/ledger-repair-apply.js +538 -0
- package/dist/src/ledger-repair-plan.js +463 -0
- package/dist/src/loop.js +257 -166
- package/dist/src/memory-capture.js +180 -32
- package/dist/src/memory-decay.js +30 -14
- package/dist/src/memory-lifecycle.js +1310 -0
- package/dist/src/memory-utility.js +27 -40
- package/dist/src/mock-llm.js +36 -61
- package/dist/src/model.js +81 -36
- package/dist/src/realtime-pricing.js +63 -72
- package/dist/src/slot-spec.js +84 -106
- package/dist/src/state-ledger.js +310 -471
- package/dist/src/subagent-job-id-guard.js +58 -0
- package/dist/src/time-anchor.js +231 -33
- package/dist/src/tool-packet.js +20 -8
- package/dist/src/travel-slots.js +58 -35
- package/dist/src/travel-timeline.js +44 -63
- package/dist/src/turn-deadline.js +121 -127
- package/dist/src/turn-policy.js +61 -89
- package/dist/src/tz-resolver.js +143 -0
- package/dist/src/unified.js +504 -381
- package/dist/src/wish-pool.js +39 -14
- package/dist/src/write-gate.js +495 -0
- package/dist/src/z3-shared.js +273 -7
- package/extension/README.md +4 -3
- package/extension/background.js +125 -14
- package/extension/content-bridge.js +23 -1
- package/extension/content-main.js +15 -4
- package/extension/manifest.json +16 -8
- package/package.json +251 -220
- package/ts/capabilities/agent-reach.ts +4 -4
- package/ts/capabilities/anything.ts +1 -1
- package/ts/capabilities/artifacts.ts +46 -9
- package/ts/capabilities/flyai.ts +156 -37
- package/ts/capabilities/hbcli.ts +1 -1
- package/ts/capabilities/incident-log.ts +88 -59
- package/ts/capabilities/session/adapters/ctrip-flight.ts +99 -36
- package/ts/capabilities/session/adapters/dida-portal.ts +250 -0
- package/ts/capabilities/session/adapters/rail-12306.ts +123 -24
- package/ts/capabilities/session/extension-bridge.ts +226 -101
- package/ts/capabilities/session/extension-channel.ts +22 -9
- package/ts/capabilities/session/wizard.ts +2 -2
- package/ts/capabilities/session-consent.ts +98 -14
- package/ts/capabilities/session-login.ts +1 -0
- package/ts/capabilities/session-search.ts +315 -31
- package/ts/dsh-runtime/vendor/README.md +8 -4
- package/ts/dsh-runtime/vendor/dsh-map-tools/README.en.md +7 -1
- package/ts/dsh-runtime/vendor/dsh-map-tools/README.md +5 -3
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/settings-ns.js +1 -1
- package/ts/dsh-runtime/vendor/dsh-map-tools/lib/types/settings-ns.d.ts +1 -1
- package/ts/dsh-runtime/vendor/dsh-map-tools/package.json +6 -6
- package/ts/package.json +236 -16
- package/ts/scripts/map-tools-vendor-package-proof.ts +152 -31
- package/ts/scripts/state-cli.ts +418 -51
- package/ts/src/artifact-gate.ts +561 -15
- package/ts/src/benchmark-environment-bridge.ts +37 -20
- package/ts/src/bookable-facts.ts +183 -7
- package/ts/src/booking-surface/cancel-refund-commission.ts +488 -0
- package/ts/src/booking-surface/dsh-planner.ts +240 -32
- package/ts/src/booking-surface/dsh-plugin.js +17 -1
- package/ts/src/booking-surface/error-codes.ts +75 -0
- package/ts/src/booking-surface/recovery-chain.ts +409 -0
- package/ts/src/booking-surface/server.ts +84 -51
- package/ts/src/booking-surface/validation.ts +2 -0
- package/ts/src/contracts.ts +12 -2
- package/ts/src/dsh-llm.ts +4 -8
- package/ts/src/index.ts +609 -90
- package/ts/src/loop.ts +116 -7
- package/ts/src/memory-capture.ts +227 -3
- package/ts/src/mock-llm.ts +4 -8
- package/ts/src/model.ts +88 -2
- package/ts/src/state-ledger.ts +47 -29
- package/ts/src/subagent-job-id-guard.ts +72 -0
- package/ts/src/time-anchor.ts +217 -13
- 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)
|
|
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)
|
|
61
|
-
head: text.slice(0, m.index).trim(),
|
|
62
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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))
|
|
98
|
-
type: c.type,
|
|
99
|
-
|
|
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)
|
|
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)
|
|
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)
|
|
166
|
-
preamble: raw.endsWith('\n') ? raw : `${raw}\n`,
|
|
167
|
-
|
|
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)
|
|
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)
|
|
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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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)
|
|
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
|