Skip to content

Commit 2c86811

Browse files
author
SqlRush
committed
Accept string vim expectations
1 parent 0372ea3 commit 2c86811

4 files changed

Lines changed: 65 additions & 26 deletions

File tree

docs/cc-100-roadmap.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ M7 补充:prompt history `LogEntry` 读取现在接受 `sessionID`/`session`/`
606606

607607
本轮补充:interaction script 的 direct expectation count alias 字段现在也递归解包 wrapper;`expectEventCount``expectTotalEventCount``expectDialogResultCount``expectTotalDialogResultCount` 可从 wrapped `value`/`count`/`total` 恢复计数断言,避免 direct expectation fixture 在 int decode 阶段失败。
608608

609-
本轮补充:interaction script 的 UpperCamel step 字段现在也复用 raw/wrapper 解析;`UpsertTask``CancelAllTasks``OpenTasksDialog``ExpectPrompt``ExpectScreen``ExpectViewport``ExpectReverseSearch``ExpectTasks` 等 Go 默认字段名可直接接受 JSON:API/GraphQL-style wrapper,task status/expectation 的 ID/title/state/detail/progress、prompt expectation 的 Cursor/PastedContentCount/NextPastedID/Empty、screen expectation 的 Width/Height、viewport expectation 的 Offset/VisibleLineCount 和 reverse-search expectation 的 Cursor/ResultCount/NoResults 改为 raw-first 解码并继续接受数字字符串/非严格 bool。
609+
本轮补充:interaction script 的 UpperCamel step 字段现在也复用 raw/wrapper 解析;`UpsertTask``CancelAllTasks``OpenTasksDialog``ExpectPrompt``ExpectVim``ExpectScreen``ExpectViewport``ExpectReverseSearch``ExpectTasks` 等 Go 默认字段名可直接接受 JSON:API/GraphQL-style wrapper,task status/expectation 的 ID/title/state/detail/progress、prompt expectation 的 Cursor/PastedContentCount/NextPastedID/Empty、vim expectation 的 Enabled/Mode/Register/RegisterLinewise、screen expectation 的 Width/Height、viewport expectation 的 Offset/VisibleLineCount 和 reverse-search expectation 的 Cursor/ResultCount/NoResults 改为 raw-first 解码并继续接受数字字符串/非严格 bool。
610610

611611
本轮补充:interaction script 的 direct expectation string-list alias 字段现在也递归解包 wrapper;`expectStatusContains`/`NotContains``expectSnapshotContains`/`NotContains` 可从 wrapped `value`/`values`/`contains`/`items` 恢复断言列表,避免 direct expectation fixture 在 list decode 阶段失败。
612612

docs/claude-code-go-rewrite-plan.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ test/parity/ # golden tests against TS/official behavior
333333
- 本轮补充:interaction script 的 direct dialog 字段现在改为 raw payload 解析;`dialog`/`Dialog` 可递归解包 `resource.attributes``edge.node.attrs` 和单元素数组,`showDialog` action payload 也复用同一解析路径,避免 wrapper-only dialog 被解码成空弹窗。
334334
- 本轮补充:interaction script 的 direct image 字段现在改为 raw payload 解析;`image`/`Image` 可复用 pasteImage action 的 wrapper 解析,递归解包 `resource.attributes``edge.node.attrs` 和单元素数组,保留 filename/media/content/source-path 后再生成 prompt pasted-image。
335335
- 本轮补充:interaction script 的 direct keybinding mutation 字段现在改为 raw-only 解析;`keybindings`/`key_bindings`/`keyBindings`/`keybindingSpecs`/`Keybindings` 不再先走 `[]BindingSpec` 基础解码,统一复用 keybinding loader 的 object-map、resource wrapper 和 edge/node collection parser。
336-
- 本轮补充:interaction script 的 UpperCamel step 字段现在也进入 raw/wrapper 解析路径;`UpsertTask``CancelAllTasks``OpenTasksDialog``ExpectPrompt``ExpectScreen``ExpectViewport``ExpectReverseSearch``ExpectTasks` 等 Go 默认字段名可直接接受 JSON:API/GraphQL-style wrapper,task status/expectation 的 ID/title/state/detail/progress、prompt expectation 的 Cursor/PastedContentCount/NextPastedID/Empty、screen expectation 的 Width/Height、viewport expectation 的 Offset/VisibleLineCount 和 reverse-search expectation 的 Cursor/ResultCount/NoResults 改为 raw-first 解码并继续接受数字字符串/非严格 bool。
336+
- 本轮补充:interaction script 的 UpperCamel step 字段现在也进入 raw/wrapper 解析路径;`UpsertTask``CancelAllTasks``OpenTasksDialog``ExpectPrompt``ExpectVim``ExpectScreen``ExpectViewport``ExpectReverseSearch``ExpectTasks` 等 Go 默认字段名可直接接受 JSON:API/GraphQL-style wrapper,task status/expectation 的 ID/title/state/detail/progress、prompt expectation 的 Cursor/PastedContentCount/NextPastedID/Empty、vim expectation 的 Enabled/Mode/Register/RegisterLinewise、screen expectation 的 Width/Height、viewport expectation 的 Offset/VisibleLineCount 和 reverse-search expectation 的 Cursor/ResultCount/NoResults 改为 raw-first 解码并继续接受数字字符串/非严格 bool。
337337
- 本轮补充:terminal CSI-u/kitty keyboard parser 接受 `codepoint:alternate``modifier:event-type` 冒号字段,按主 codepoint/modifier 解析 ctrl/alt/shift/rune 键,覆盖 kitty progressive keyboard protocol 的常见变体。
338338
- 本轮补充:terminal CSI-u/kitty keyboard parser 接受无 modifier 字段或 modifier `1` 的 base key 序列,覆盖 printable rune、Enter、Tab、Esc 和 Backspace,避免 extended-key 模式下普通键序列被解析成 unknown。
339339
- 本轮补充:terminal input parser 接受 xterm modified arrow 序列(如 `CSI 1;2D``CSI 1;6C``CSI 1;7D`),把 shift-arrow 降级为方向键、alt-arrow 映射到 word-motion key、ctrl/ctrl+alt-arrow 映射到 ctrl word-motion key,避免 extended navigation 序列落入 unknown。

internal/tui/script_aliases.go

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4427,57 +4427,96 @@ func (expect *VimExpectation) UnmarshalJSON(data []byte) error {
44274427
data = normalizeBoolFields(data,
44284428
"Enabled",
44294429
"enabled",
4430+
"VimEnabled",
44304431
"vim_enabled",
44314432
"vimEnabled",
4433+
"IsEnabled",
44324434
"is_enabled",
44334435
"isEnabled",
4436+
"Active",
44344437
"active",
44354438
"RegisterLinewise",
44364439
"register_linewise",
44374440
"registerLinewise",
4441+
"Linewise",
44384442
"linewise",
4443+
"IsLinewise",
44394444
"is_linewise",
44404445
"isLinewise",
4446+
"RegisterLineWise",
44414447
"register_line_wise",
44424448
"registerLineWise",
44434449
)
44444450
type alias VimExpectation
44454451
var raw alias
4446-
if err := json.Unmarshal(data, &raw); err != nil {
4452+
if err := json.Unmarshal(stripJSONAliasFields(data,
4453+
"Enabled",
4454+
"enabled",
4455+
"VimEnabled",
4456+
"vim_enabled",
4457+
"vimEnabled",
4458+
"IsEnabled",
4459+
"is_enabled",
4460+
"isEnabled",
4461+
"Active",
4462+
"active",
4463+
"Mode",
4464+
"mode",
4465+
"VimMode",
4466+
"vim_mode",
4467+
"vimMode",
4468+
"ModeName",
4469+
"mode_name",
4470+
"modeName",
4471+
"CurrentMode",
4472+
"current_mode",
4473+
"currentMode",
4474+
"State",
4475+
"state",
4476+
"Register",
4477+
"register",
4478+
"VimRegister",
4479+
"vim_register",
4480+
"vimRegister",
4481+
"RegisterValue",
4482+
"register_value",
4483+
"registerValue",
4484+
"YankRegister",
4485+
"yank_register",
4486+
"yankRegister",
4487+
"RegisterLinewise",
4488+
"register_linewise",
4489+
"registerLinewise",
4490+
"Linewise",
4491+
"linewise",
4492+
"IsLinewise",
4493+
"is_linewise",
4494+
"isLinewise",
4495+
"RegisterLineWise",
4496+
"register_line_wise",
4497+
"registerLineWise",
4498+
), &raw); err != nil {
44474499
return err
44484500
}
44494501
*expect = VimExpectation(raw)
44504502

4451-
var fields struct {
4452-
RegisterLinewise *bool `json:"register_linewise"`
4453-
RegisterLinewiseCamel *bool `json:"registerLinewise"`
4454-
}
4455-
if err := json.Unmarshal(data, &fields); err != nil {
4456-
return err
4457-
}
44584503
fieldMap := map[string]json.RawMessage{}
44594504
if err := json.Unmarshal(data, &fieldMap); err != nil {
44604505
return err
44614506
}
44624507
if expect.Enabled == nil {
4463-
expect.Enabled = boolPtrJSONField(fieldMap, "vim_enabled", "vimEnabled", "is_enabled", "isEnabled", "enabled", "active")
4508+
expect.Enabled = boolPtrJSONField(fieldMap, "Enabled", "enabled", "VimEnabled", "vim_enabled", "vimEnabled", "IsEnabled", "is_enabled", "isEnabled", "Active", "active")
44644509
}
44654510
if expect.Mode == "" {
4466-
if mode := stringJSONField(fieldMap, "vim_mode", "vimMode", "mode_name", "modeName", "current_mode", "currentMode", "state"); mode != "" {
4511+
if mode := stringJSONField(fieldMap, "Mode", "mode", "VimMode", "vim_mode", "vimMode", "ModeName", "mode_name", "modeName", "CurrentMode", "current_mode", "currentMode", "State", "state"); mode != "" {
44674512
expect.Mode = VimMode(mode)
44684513
}
44694514
}
44704515
if expect.Register == "" {
4471-
expect.Register = stringJSONField(fieldMap, "vim_register", "vimRegister", "register_value", "registerValue", "yank_register", "yankRegister")
4472-
}
4473-
if fields.RegisterLinewise != nil {
4474-
expect.RegisterLinewise = fields.RegisterLinewise
4475-
}
4476-
if fields.RegisterLinewiseCamel != nil {
4477-
expect.RegisterLinewise = fields.RegisterLinewiseCamel
4516+
expect.Register = stringJSONField(fieldMap, "Register", "register", "VimRegister", "vim_register", "vimRegister", "RegisterValue", "register_value", "registerValue", "YankRegister", "yank_register", "yankRegister")
44784517
}
44794518
if expect.RegisterLinewise == nil {
4480-
expect.RegisterLinewise = boolPtrJSONField(fieldMap, "linewise", "is_linewise", "isLinewise", "register_line_wise", "registerLineWise")
4519+
expect.RegisterLinewise = boolPtrJSONField(fieldMap, "RegisterLinewise", "register_linewise", "registerLinewise", "Linewise", "linewise", "IsLinewise", "is_linewise", "isLinewise", "RegisterLineWise", "register_line_wise", "registerLineWise")
44814520
}
44824521
return nil
44834522
}

internal/tui/tui_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8659,8 +8659,8 @@ func TestRunInteractionScriptAcceptsWrappedVimExpectationAliasFields(t *testing.
86598659
"expectVim": {
86608660
"resource": {
86618661
"attributes": {
8662-
"vimEnabled": true,
8663-
"modeName": "insert"
8662+
"Enabled": "true",
8663+
"ModeName": "insert"
86648664
}
86658665
}
86668666
}
@@ -8671,10 +8671,10 @@ func TestRunInteractionScriptAcceptsWrappedVimExpectationAliasFields(t *testing.
86718671
"edge": {
86728672
"node": {
86738673
"attrs": {
8674-
"isEnabled": true,
8675-
"currentMode": "normal",
8676-
"vimRegister": "a",
8677-
"linewise": false
8674+
"Enabled": "true",
8675+
"CurrentMode": "normal",
8676+
"VimRegister": "a",
8677+
"Linewise": "false"
86788678
}
86798679
}
86808680
}

0 commit comments

Comments
 (0)