fix(analyst): steps устойчив к строке — не роняет decide при string-steps (аналог repos)
This commit is contained in:
@@ -266,6 +266,47 @@ func TestDecideProposeSteps(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestDecideProposeStringSteps — модель вернула steps строкой (а не массивом):
|
||||
// парсер должен нормализовать и не падать (аналог string-repos).
|
||||
func TestDecideProposeStringSteps(t *testing.T) {
|
||||
a := &Analyst{Runner: &mockRunner{result: &opencode.Result{
|
||||
RC: 0,
|
||||
Stdout: `{"type":"text","part":{"text":"{\"phase\":\"propose\",\"title\":\"Калькулятор\",\"steps\":\"\"}"}}`,
|
||||
}}, Worktree: "/tmp"}
|
||||
|
||||
history := []core.Message{{Role: "user", Content: "Сделай калькулятор"}}
|
||||
dec, err := a.Decide(context.Background(), history, storage.Task{}, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Decide err: %v", err)
|
||||
}
|
||||
if dec.Phase != "propose" {
|
||||
t.Errorf("Phase = %q, want propose", dec.Phase)
|
||||
}
|
||||
if len(dec.Draft.Steps) != 0 {
|
||||
t.Errorf("len(Steps) = %d, want 0 (пустая строка игнорируется)", len(dec.Draft.Steps))
|
||||
}
|
||||
}
|
||||
|
||||
// TestDecideProposeJSONStepsString — steps пришли строкой с вложенным JSON-массивом.
|
||||
func TestDecideProposeJSONStepsString(t *testing.T) {
|
||||
a := &Analyst{Runner: &mockRunner{result: &opencode.Result{
|
||||
RC: 0,
|
||||
Stdout: `{"type":"text","part":{"text":"{\"phase\":\"propose\",\"steps\":\"[{\\\"title\\\":\\\"Модель\\\",\\\"ac\\\":\\\"ок\\\"}]\"}"}}`,
|
||||
}}, Worktree: "/tmp"}
|
||||
|
||||
history := []core.Message{{Role: "user", Content: "test"}}
|
||||
dec, err := a.Decide(context.Background(), history, storage.Task{}, false)
|
||||
if err != nil {
|
||||
t.Fatalf("Decide err: %v", err)
|
||||
}
|
||||
if dec.Phase != "propose" {
|
||||
t.Errorf("Phase = %q, want propose", dec.Phase)
|
||||
}
|
||||
if len(dec.Draft.Steps) != 1 || dec.Draft.Steps[0].Title != "Модель" {
|
||||
t.Errorf("Steps = %#v, want [Модель]", dec.Draft.Steps)
|
||||
}
|
||||
}
|
||||
|
||||
// TestProposeOnlyStepsValid — propose меняет только steps → валидно.
|
||||
func TestProposeOnlyStepsValid(t *testing.T) {
|
||||
a := &Analyst{Runner: &mockRunner{result: &opencode.Result{
|
||||
|
||||
Reference in New Issue
Block a user