12 imports flagged by `unnecessary_import` because the symbols
they bring in are also re-exported by the umbrella import already
present in the same file:
- bin/clide.dart: src/git/client.dart, src/pql/client.dart
(covered by package:clide/clide.dart).
- lib/builtin/decisions/, lib/builtin/tickets/ (4 files):
kernel/src/events/message_bus.dart (covered by kernel.dart).
- lib/kernel/src/ipc/in_process.dart: src/daemon/dispatcher.dart
(covered by clide.dart).
- lib/main.dart: kernel/src/toolchain.dart (covered by kernel.dart).
- test/builtin/ipc_status/widget_test.dart:
builtin/ipc_status/src/status_item.dart (covered by
ipc_status.dart).
- test/daemon/{git,pql}_commands_test.dart: src/git/client.dart and
src/pql/client.dart (covered by clide.dart).
- test/widgets/multitab_pane_test.dart: widgets/src/icons/x.dart
(covered by widgets.dart).
Mechanical change — every removed line was already a no-op for
symbol resolution; the umbrella imports define the public surface
each file is actually using.
Co-Authored-By: Claude <noreply@anthropic.com>
63 lines
1.9 KiB
Dart
63 lines
1.9 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:clide/builtin/decisions/src/decision_detail_view.dart';
|
|
import 'package:clide/builtin/decisions/src/decisions_view.dart';
|
|
import 'package:clide/extension/extension.dart';
|
|
import 'package:clide/kernel/kernel.dart';
|
|
import 'package:clide/widgets/widgets.dart';
|
|
|
|
class DecisionsExtension extends ClideExtension {
|
|
@override
|
|
String get id => 'builtin.decisions';
|
|
@override
|
|
String get title => 'Decisions';
|
|
@override
|
|
String get version => '0.6.0';
|
|
@override
|
|
List<String> get dependsOn => const [];
|
|
|
|
StreamSubscription<Message>? _sub;
|
|
|
|
@override
|
|
Future<void> activate(ClideExtensionContext ctx) async {
|
|
_sub = ctx.messages.subscribe(publisher: id, channel: 'selection').listen((msg) {
|
|
final selectedId = msg.data['id'] as String?;
|
|
if (selectedId == null) return;
|
|
ctx.panels.uncontribute('decisions.detail');
|
|
ctx.panels.contribute(TabContribution(
|
|
id: 'decisions.detail',
|
|
slot: Slots.contextPanel,
|
|
title: 'Decision',
|
|
icon: PhosphorIcons.lightbulb,
|
|
build: (_) => DecisionDetailView(initialId: selectedId),
|
|
));
|
|
ctx.arrangement.setVisible(Slots.contextPanel, true);
|
|
ctx.arrangement.setCollapsed(Slots.contextPanel, false);
|
|
ctx.panels.activateTab(Slots.contextPanel, 'decisions.detail');
|
|
});
|
|
}
|
|
|
|
@override
|
|
Future<void> deactivate() async => _sub?.cancel();
|
|
|
|
@override
|
|
List<ContributionPoint> get contributions => [
|
|
TabContribution(
|
|
id: 'decisions.panel',
|
|
slot: Slots.sidebar,
|
|
title: 'Decisions',
|
|
titleKey: 'tab.title',
|
|
i18nNamespace: id,
|
|
icon: PhosphorIcons.lightbulb,
|
|
build: (_) => const DecisionsView(),
|
|
),
|
|
TabContribution(
|
|
id: 'decisions.detail',
|
|
slot: Slots.contextPanel,
|
|
title: 'Decision',
|
|
icon: PhosphorIcons.lightbulb,
|
|
build: (_) => const DecisionDetailView(),
|
|
),
|
|
];
|
|
}
|