Skip to content

Commit b17603b

Browse files
author
SqlRush
committed
Accept recorded script array wrappers
1 parent 777791e commit b17603b

4 files changed

Lines changed: 57 additions & 1 deletion

File tree

docs/cc-100-roadmap.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ M7 补充:prompt history `LogEntry` 读取现在接受 `sessionID`/`session`/`
454454

455455
本轮补充:interaction script 单步 JSON 现在接受 `step`/`scriptStep`/`interactionStep`/`record`/`entry`/`item`/`event` wrapper,可用于数组元素、JSONL 行和 wrapper object 中的 steps item,减少录制脚本逐行改写成本。
456456

457+
本轮补充:interaction script 顶层 wrapper 现在接受 `records`/`recordedSteps`/`events`/`entries`/`items`/`actions`/`timeline` 数组入口,并复用单步 wrapper 拆包逻辑。
458+
457459
本轮补充:snapshot corpus 支持 `.ansi` only baselines,方便复用真实终端输出 corpus,而不必预先生成 `.txt` companion 文件。
458460

459461
本轮补充:terminal lifecycle 增加可选 extended-key mode,按官方 `CSI >1u`/`CSI >4;2m` 启用 kitty keyboard protocol 和 modifyOtherKeys,退出时重置 modifyOtherKeys 并 pop kitty stack,reassert 时先 pop 再 push,避免长期会话 stack 泄漏。

docs/first-second-parity-audit.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ M7 progress now includes:
311311
- `internal/tui`: interaction script steps now accept `action`/`type`/`kind`/`name`/`operation` discriminator aliases for common actions such as key press, key sequences, text input, paste, status updates, resize, mouse/image, and focus/blur.
312312
- `internal/contracts`/`internal/session`: image content blocks now normalize source aliases such as `mediaType`/`mimeType`/`contentType` and `base64`/`payload`, including top-level image block fields, into canonical `ImageSource` values during transcript resume.
313313
- `internal/tui`: interaction script single-step JSON now unwraps `step`/`scriptStep`/`interactionStep`/`record`/`entry`/`item`/`event` objects in arrays, JSONL records, and wrapper-object step lists.
314+
- `internal/tui`: interaction script top-level wrappers now accept record-array aliases such as `records`/`recordedSteps`/`events`/`entries`/`items`/`actions`/`timeline`.
314315

315316
Still missing for full M6/M7 parity:
316317

internal/tui/script_loader.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,24 @@ func parseInteractionScriptObject(data []byte) ([]ScriptStep, bool, error) {
6666
if err := json.Unmarshal(data, &raw); err != nil {
6767
return nil, false, nil
6868
}
69-
for _, name := range []string{"steps", "script", "script_steps", "scriptSteps", "interaction_script", "interactionScript", "interaction_steps", "interactionSteps"} {
69+
for _, name := range []string{
70+
"steps",
71+
"script",
72+
"script_steps",
73+
"scriptSteps",
74+
"interaction_script",
75+
"interactionScript",
76+
"interaction_steps",
77+
"interactionSteps",
78+
"records",
79+
"recorded_steps",
80+
"recordedSteps",
81+
"events",
82+
"entries",
83+
"items",
84+
"actions",
85+
"timeline",
86+
} {
7087
value, ok := raw[name]
7188
if !ok {
7289
continue

internal/tui/tui_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5550,6 +5550,42 @@ func TestParseInteractionScriptAcceptsStepRecordWrappers(t *testing.T) {
55505550
}
55515551
}
55525552

5553+
func TestParseInteractionScriptAcceptsRecordArrayWrappers(t *testing.T) {
5554+
for name, script := range map[string]string{
5555+
"records": `{"records":[
5556+
{"event":{"action":"type","value":"go"}},
5557+
{"event":{"type":"press","value":"enter","expectEvent":{"type":"prompt_submitted","value":"go"}}}
5558+
]}`,
5559+
"events": `{"events":[
5560+
{"step":{"action":"type","value":"run"}},
5561+
{"step":{"type":"press","value":"enter","expectEvent":{"type":"prompt_submitted","value":"run"}}}
5562+
]}`,
5563+
"items": `{"items":[
5564+
{"record":{"action":"type","value":"ship"}},
5565+
{"record":{"type":"press","value":"enter","expectEvent":{"type":"prompt_submitted","value":"ship"}}}
5566+
]}`,
5567+
"timeline": `{"timeline":[
5568+
{"action":"type","value":"test"},
5569+
{"type":"press","value":"enter","expectEvent":{"type":"prompt_submitted","value":"test"}}
5570+
]}`,
5571+
} {
5572+
t.Run(name, func(t *testing.T) {
5573+
steps, err := ParseInteractionScript([]byte(script))
5574+
if err != nil {
5575+
t.Fatal(err)
5576+
}
5577+
screen := NewREPLScreen(30, 6, nil)
5578+
result, err := RunInteractionScriptChecked(&screen, steps)
5579+
if err != nil {
5580+
t.Fatal(err)
5581+
}
5582+
if len(result.Events) != 1 || result.Events[0].Type != ScreenEventPromptSubmitted {
5583+
t.Fatalf("events = %#v", result.Events)
5584+
}
5585+
})
5586+
}
5587+
}
5588+
55535589
func TestRunInteractionScriptFileCheckedLoadsAndRunsScript(t *testing.T) {
55545590
path := filepath.Join(t.TempDir(), "script.json")
55555591
script := []byte(`{"interactionScript":[

0 commit comments

Comments
 (0)