feat(analyst): этапы задачи — аналитик раскладывает на steps с критериями готовности, dev идёт по ним
This commit is contained in:
@@ -725,6 +725,7 @@ func TestWorkerBadStatus(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestWorkerPromptRendered — dev-промпт собирается из полей задачи.
|
||||
func TestWorkerPromptRendered(t *testing.T) {
|
||||
s := setupWorkerDB(t)
|
||||
task := createReadyTask(t, s, "prompt-test")
|
||||
@@ -758,6 +759,63 @@ func TestWorkerPromptRendered(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestWorkerPromptIncludesSteps — этапы задачи попадают в dev-промпт по порядку
|
||||
// с критериями готовности.
|
||||
func TestWorkerPromptIncludesSteps(t *testing.T) {
|
||||
s := setupWorkerDB(t)
|
||||
task := createReadyTask(t, s, "steps-test")
|
||||
|
||||
ctx := context.Background()
|
||||
task.Steps = []storage.Step{
|
||||
{Title: "Модель", AC: "операции готовы"},
|
||||
{Title: "UI"},
|
||||
}
|
||||
if err := s.UpdateTask(ctx, task); err != nil {
|
||||
t.Fatalf("update steps: %v", err)
|
||||
}
|
||||
|
||||
w := &Worker{
|
||||
Store: s,
|
||||
Runner: &mockRunnerWorker{result: &opencode.Result{RC: 0, Stdout: "ok", SessionID: "s"}},
|
||||
Worktree: t.TempDir(),
|
||||
}
|
||||
seedFakeRepo(t, w.Worktree, "steps-test")
|
||||
|
||||
_ = w.runTask(ctx, task)
|
||||
|
||||
traces, err := s.GetTraces(ctx, task.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("get traces: %v", err)
|
||||
}
|
||||
tr := traces[0]
|
||||
for _, want := range []string{"Этапы", "Модель", "операции готовы", "UI"} {
|
||||
if !strings.Contains(tr.Prompt, want) {
|
||||
t.Errorf("dev-промпт не содержит %q", want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestRenderDevPromptSteps — прямой рендер dev-промпта с этапами.
|
||||
func TestRenderDevPromptSteps(t *testing.T) {
|
||||
prompt, err := RenderDevPrompt(DevPromptData{
|
||||
Title: "Калькулятор",
|
||||
AC: "работает",
|
||||
Steps: []storage.Step{
|
||||
{Title: "Модель", AC: "операции готовы"},
|
||||
{Title: "UI"},
|
||||
},
|
||||
Branch: "feat/abc",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("render: %v", err)
|
||||
}
|
||||
for _, want := range []string{"Этапы", "Модель — готово, когда: операции готовы", "UI"} {
|
||||
if !strings.Contains(prompt, want) {
|
||||
t.Errorf("prompt не содержит %q", want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestFeatureBranchName(t *testing.T) {
|
||||
cases := []struct {
|
||||
tag string
|
||||
|
||||
Reference in New Issue
Block a user