Files
clide/test/goldens/conversation_card_goldens_test.dart
T
jpmschweitzerandClaude Opus 4.8 7a98cbae4b frame the context / thinking / agent-prompt meta cards (T-306)
The injected context block and the thinking / agent-prompt blocks
rendered as frameless `bare` cards, reading as unfinished `> context …`
rows next to the framed tool cards. Switch them to the bordered variant —
same panel border + left chevron + label as the surrounding cards — while
keeping the D-78 de-emphasis (muted accent, collapsed by default,
first-line summary; thinking gains a summary for parity). Adds a
conversation_card_meta golden.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 13:16:41 +02:00

185 lines
6.5 KiB
Dart

import 'package:alchemist/alchemist.dart';
import 'package:clide/builtin/claude/src/conversation_card.dart';
import 'package:clide/builtin/claude/src/conversation_view.dart' show claudeAccent;
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import '../helpers/kernel_fixture.dart';
import '../helpers/widget_harness.dart';
void main() {
late KernelFixture f;
setUp(() async => f = await KernelFixture.create());
tearDown(() async => f.dispose());
goldenTest(
'ConversationCard attribution (T-265): agent prose is muted, claude prose is coral',
fileName: 'conversation_card_attribution',
builder: () => GoldenTestGroup(
columns: 1,
children: [
GoldenTestScenario(
name: 'claude (main thread) — coral brand stripe',
child: _wrap(
f,
const ConversationCard(
accent: claudeAccent,
label: 'claude',
body: Text('Here is the main-thread answer.', textDirection: TextDirection.ltr),
),
),
),
GoldenTestScenario(
name: 'agent (sidechain) — muted stripe, not coral',
child: _wrap(
f,
ConversationCard(
accent: const Color(0xFF8B8B8B),
label: 'agent',
body: const Text('Here is the sub-agent answer.', textDirection: TextDirection.ltr),
),
),
),
],
),
);
goldenTest(
'ConversationCard merged tool card (T-262): status mark + folded result segment',
fileName: 'conversation_card_merged',
builder: () => GoldenTestGroup(
columns: 1,
children: [
GoldenTestScenario(
name: 'success / collapsed (check + summary)',
child: _wrap(
f,
const ConversationCard(
variant: ConversationCardVariant.bordered,
accent: Color(0xFF4C9AFF),
label: 'Read',
status: ConversationCardStatus.success,
collapsible: true,
collapsedByDefault: true,
collapsedSummary: '/lib/main.dart',
body: Text('/lib/main.dart', textDirection: TextDirection.ltr),
extraSegments: [CardSegment(label: 'result', child: Text('void main() {}', textDirection: TextDirection.ltr))],
),
),
),
GoldenTestScenario(
name: 'success / expanded (call → result segment)',
child: _wrap(
f,
const ConversationCard(
variant: ConversationCardVariant.bordered,
accent: Color(0xFF4C9AFF),
label: 'Read',
status: ConversationCardStatus.success,
collapsible: true,
collapsedByDefault: false,
body: Text('/lib/main.dart', textDirection: TextDirection.ltr),
extraSegments: [CardSegment(label: 'result', child: Text('void main() {}', textDirection: TextDirection.ltr))],
),
),
),
GoldenTestScenario(
name: 'agent / expanded (call → prompt → result layering, T-263)',
child: _wrap(
f,
const ConversationCard(
variant: ConversationCardVariant.bordered,
accent: Color(0xFF4C9AFF),
label: 'Task',
status: ConversationCardStatus.success,
collapsible: true,
collapsedByDefault: false,
body: Text('{ "description": "explore the codebase" }', textDirection: TextDirection.ltr),
extraSegments: [
CardSegment(label: 'prompt', child: Text('find all the widgets and summarise', textDirection: TextDirection.ltr)),
CardSegment(label: 'result', child: Text('found 42 widgets', textDirection: TextDirection.ltr)),
],
),
),
),
GoldenTestScenario(
name: 'error / header mark (call card stays separate from the red result card)',
child: _wrap(
f,
const ConversationCard(
variant: ConversationCardVariant.bordered,
accent: Color(0xFF4C9AFF),
label: 'Bash',
status: ConversationCardStatus.error,
collapsible: true,
collapsedByDefault: true,
collapsedSummary: 'cat nonexistent',
body: Text('cat nonexistent', textDirection: TextDirection.ltr),
),
),
),
],
),
);
goldenTest(
'ConversationCard meta cards (T-306): context / thinking are framed + muted',
fileName: 'conversation_card_meta',
builder: () => GoldenTestGroup(
columns: 1,
children: [
GoldenTestScenario(
name: 'context — framed, muted, collapsed with first-line summary',
child: _wrap(
f,
const ConversationCard(
variant: ConversationCardVariant.bordered,
accent: Color(0xFF6A7280),
label: 'context',
collapsible: true,
collapsedByDefault: true,
collapsedSummary: 'Base directory for this skill: /var/mnt/…',
body: Text('Base directory for this skill: /var/mnt/data/projects/clide', textDirection: TextDirection.ltr),
),
),
),
GoldenTestScenario(
name: 'thinking — framed, muted, collapsed with first-line summary',
child: _wrap(
f,
const ConversationCard(
variant: ConversationCardVariant.bordered,
accent: Color(0xFF6A7280),
label: 'thinking',
collapsible: true,
collapsedByDefault: true,
collapsedSummary: 'Let me check the layout chain first…',
body: Text('Let me check the layout chain first…', textDirection: TextDirection.ltr),
),
),
),
GoldenTestScenario(
name: 'context — expanded body',
child: _wrap(
f,
const ConversationCard(
variant: ConversationCardVariant.bordered,
accent: Color(0xFF6A7280),
label: 'context',
collapsible: true,
collapsedByDefault: false,
body: Text('Base directory for this skill: /var/mnt/data/projects/clide', textDirection: TextDirection.ltr),
),
),
),
],
),
);
}
Widget _wrap(KernelFixture f, Widget child) => SizedBox(
width: 360,
child: harness(f, child),
);