chatccc 0.2.6 → 0.2.7
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 +50 -11
- package/package.json +1 -1
- package/src/__tests__/adapter-interface.test.ts +151 -151
- package/src/__tests__/cards.test.ts +417 -413
- package/src/__tests__/claude-adapter.test.ts +528 -528
- package/src/__tests__/config.test.ts +123 -0
- package/src/__tests__/cursor-adapter.test.ts +662 -249
- package/src/__tests__/cursor-session-meta-store.test.ts +212 -0
- package/src/__tests__/fixtures/cursor_partial_only.jsonl +5 -0
- package/src/__tests__/fixtures/cursor_partial_with_final.jsonl +13 -0
- package/src/__tests__/fixtures/cursor_with_tool_call.jsonl +12 -0
- package/src/__tests__/git-command.test.ts +288 -0
- package/src/__tests__/session.test.ts +475 -296
- package/src/adapters/adapter-interface.ts +151 -126
- package/src/adapters/claude-adapter.ts +257 -257
- package/src/adapters/cursor-adapter.ts +401 -228
- package/src/adapters/cursor-session-meta-store.ts +154 -0
- package/src/cards.ts +33 -21
- package/src/config.ts +92 -2
- package/src/feishu-api.ts +1 -1
- package/src/git-command.ts +202 -0
- package/src/index.ts +58 -4
- package/src/session.ts +620 -513
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_GIT_TIMEOUT_SECONDS,
|
|
5
|
+
MAX_GIT_TIMEOUT_SECONDS,
|
|
6
|
+
MIN_GIT_TIMEOUT_SECONDS,
|
|
7
|
+
parseGitTimeoutSeconds,
|
|
8
|
+
} from "../config.ts";
|
|
9
|
+
|
|
10
|
+
describe("parseGitTimeoutSeconds", () => {
|
|
11
|
+
it("returns default when raw is undefined", () => {
|
|
12
|
+
const r = parseGitTimeoutSeconds(undefined);
|
|
13
|
+
expect(r.seconds).toBe(DEFAULT_GIT_TIMEOUT_SECONDS);
|
|
14
|
+
expect(r.valid).toBe(true);
|
|
15
|
+
expect(r.usingDefault).toBe(true);
|
|
16
|
+
expect(r.raw).toBeUndefined();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("returns default when raw is empty / whitespace only", () => {
|
|
20
|
+
expect(parseGitTimeoutSeconds("")).toMatchObject({
|
|
21
|
+
seconds: DEFAULT_GIT_TIMEOUT_SECONDS,
|
|
22
|
+
valid: true,
|
|
23
|
+
usingDefault: true,
|
|
24
|
+
});
|
|
25
|
+
expect(parseGitTimeoutSeconds(" ")).toMatchObject({
|
|
26
|
+
seconds: DEFAULT_GIT_TIMEOUT_SECONDS,
|
|
27
|
+
valid: true,
|
|
28
|
+
usingDefault: true,
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("trims and uses user value when valid integer in range", () => {
|
|
33
|
+
expect(parseGitTimeoutSeconds("90")).toMatchObject({
|
|
34
|
+
seconds: 90,
|
|
35
|
+
valid: true,
|
|
36
|
+
usingDefault: false,
|
|
37
|
+
raw: "90",
|
|
38
|
+
});
|
|
39
|
+
expect(parseGitTimeoutSeconds(" 600 ")).toMatchObject({
|
|
40
|
+
seconds: 600,
|
|
41
|
+
valid: true,
|
|
42
|
+
usingDefault: false,
|
|
43
|
+
raw: "600",
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("accepts boundary values MIN and MAX", () => {
|
|
48
|
+
expect(parseGitTimeoutSeconds(String(MIN_GIT_TIMEOUT_SECONDS))).toMatchObject({
|
|
49
|
+
seconds: MIN_GIT_TIMEOUT_SECONDS,
|
|
50
|
+
valid: true,
|
|
51
|
+
usingDefault: false,
|
|
52
|
+
});
|
|
53
|
+
expect(parseGitTimeoutSeconds(String(MAX_GIT_TIMEOUT_SECONDS))).toMatchObject({
|
|
54
|
+
seconds: MAX_GIT_TIMEOUT_SECONDS,
|
|
55
|
+
valid: true,
|
|
56
|
+
usingDefault: false,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("falls back to default for non-integer / non-numeric", () => {
|
|
61
|
+
expect(parseGitTimeoutSeconds("abc")).toMatchObject({
|
|
62
|
+
seconds: DEFAULT_GIT_TIMEOUT_SECONDS,
|
|
63
|
+
valid: false,
|
|
64
|
+
usingDefault: true,
|
|
65
|
+
raw: "abc",
|
|
66
|
+
});
|
|
67
|
+
expect(parseGitTimeoutSeconds("12.5")).toMatchObject({
|
|
68
|
+
seconds: DEFAULT_GIT_TIMEOUT_SECONDS,
|
|
69
|
+
valid: false,
|
|
70
|
+
usingDefault: true,
|
|
71
|
+
});
|
|
72
|
+
expect(parseGitTimeoutSeconds("NaN")).toMatchObject({
|
|
73
|
+
valid: false,
|
|
74
|
+
usingDefault: true,
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("falls back to default for out-of-range values", () => {
|
|
79
|
+
expect(parseGitTimeoutSeconds("0")).toMatchObject({
|
|
80
|
+
seconds: DEFAULT_GIT_TIMEOUT_SECONDS,
|
|
81
|
+
valid: false,
|
|
82
|
+
usingDefault: true,
|
|
83
|
+
});
|
|
84
|
+
expect(parseGitTimeoutSeconds("-5")).toMatchObject({
|
|
85
|
+
valid: false,
|
|
86
|
+
usingDefault: true,
|
|
87
|
+
});
|
|
88
|
+
expect(parseGitTimeoutSeconds(String(MAX_GIT_TIMEOUT_SECONDS + 1))).toMatchObject({
|
|
89
|
+
seconds: DEFAULT_GIT_TIMEOUT_SECONDS,
|
|
90
|
+
valid: false,
|
|
91
|
+
usingDefault: true,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("respects custom default parameter", () => {
|
|
96
|
+
expect(parseGitTimeoutSeconds(undefined, 30)).toMatchObject({
|
|
97
|
+
seconds: 30,
|
|
98
|
+
usingDefault: true,
|
|
99
|
+
});
|
|
100
|
+
// 用户值有效则忽略 default 参数
|
|
101
|
+
expect(parseGitTimeoutSeconds("45", 30)).toMatchObject({
|
|
102
|
+
seconds: 45,
|
|
103
|
+
usingDefault: false,
|
|
104
|
+
});
|
|
105
|
+
// 用户值非法时回退到自定义 default
|
|
106
|
+
expect(parseGitTimeoutSeconds("abc", 30)).toMatchObject({
|
|
107
|
+
seconds: 30,
|
|
108
|
+
usingDefault: true,
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe("GIT timeout constants", () => {
|
|
114
|
+
it("DEFAULT_GIT_TIMEOUT_SECONDS is 180", () => {
|
|
115
|
+
expect(DEFAULT_GIT_TIMEOUT_SECONDS).toBe(180);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("MIN < DEFAULT < MAX", () => {
|
|
119
|
+
expect(MIN_GIT_TIMEOUT_SECONDS).toBeGreaterThan(0);
|
|
120
|
+
expect(MIN_GIT_TIMEOUT_SECONDS).toBeLessThan(DEFAULT_GIT_TIMEOUT_SECONDS);
|
|
121
|
+
expect(DEFAULT_GIT_TIMEOUT_SECONDS).toBeLessThan(MAX_GIT_TIMEOUT_SECONDS);
|
|
122
|
+
});
|
|
123
|
+
});
|