Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions workout-logger/android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ plugins {

android {
namespace = "com.devasy.repforge"
compileSdk = 36
compileSdk = 37
compileSdkExtension = 19
ndkVersion = flutter.ndkVersion

Expand Down Expand Up @@ -53,7 +53,7 @@ android {
// supported. If downgrading, remove the health_connector dependency and
// all HealthConnectService usages, then restore minSdk to flutter.minSdkVersion.
minSdk = 26
targetSdk = 36
targetSdk = 37
versionCode = flutter.versionCode
versionName = flutter.versionName
// App display name; overridden per build type below so debug installs
Expand Down
65 changes: 65 additions & 0 deletions workout-logger/calculate_coverage.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import 'dart:io';

void main() {
final file = File('coverage/lcov.info');
if (!file.existsSync()) {
print('No coverage/lcov.info found.');
return;
}

final lines = file.readAsLinesSync();
int totalLines = 0;
int hitLines = 0;

Map<String, List<int>> fileCoverage = {};
String currentFile = '';

for (final line in lines) {
if (line.startsWith('SF:')) {
currentFile = line.substring(3);
final normalized = currentFile.replaceAll('\\', '/');
if (normalized.contains('lib/services/ai/')) {
fileCoverage[currentFile] = [0, 0]; // hits, total
}
} else if (line.startsWith('DA:')) {
final normalized = currentFile.replaceAll('\\', '/');
if (normalized.contains('lib/services/ai/')) {
final parts = line.substring(3).split(',');
if (parts.length == 2) {
totalLines++;
fileCoverage[currentFile]![1]++;
final hits = int.tryParse(parts[1]) ?? 0;
if (hits > 0) {
hitLines++;
fileCoverage[currentFile]![0]++;
}
}
}
}
}

if (totalLines == 0) {
print('No executable lines found.');
} else {
final coverage = (hitLines / totalLines) * 100;
print('Total AI Coverage: ${coverage.toStringAsFixed(2)}% ($hitLines/$totalLines lines)');

// Sort files by missed lines (descending)
var entries = fileCoverage.entries.toList()
..sort((a, b) {
var missedA = a.value[1] - a.value[0];
var missedB = b.value[1] - b.value[0];
return missedB.compareTo(missedA);
});

print('\nBiggest files and their coverage:');
for (var i = 0; i < 30 && i < entries.length; i++) {
var entry = entries[i];
var hits = entry.value[0];
var total = entry.value[1];
var pct = total > 0 ? (hits / total) * 100 : 0;
var missed = total - hits;
print('${entry.key}: ${pct.toStringAsFixed(1)}% ($hits/$total) - Missed: $missed lines');
}
}
}
18 changes: 18 additions & 0 deletions workout-logger/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ import 'services/storage_service.dart';
import 'services/ml_service.dart';
import 'services/ai/gemini_ai_service.dart';
import 'services/ai/coach_tool_service.dart';
import 'services/ai/adapters/coach_tool_service_adapter.dart';
import 'services/ai/tools/tool_registry.dart';
import 'services/ai/runtime/agent_runtime.dart';
import 'services/health_connect_service.dart';
import 'services/interfaces/storage_service_interface.dart';
import 'services/interfaces/ml_service_interface.dart';
Expand Down Expand Up @@ -138,6 +141,21 @@ class WorkoutLoggerApp extends StatelessWidget {
ctx.read<PRManager>(),
),
),
// ToolRegistry provides typed AgentTools wrapping the CoachToolService.
Provider<ToolRegistry>(
create: (ctx) => CoachToolServiceAdapter.buildRegistry(
ctx.read<CoachToolService>(),
includeAskUser: true,
includeShowGraph: true,
),
),
// AgentRuntime executes agent graphs (coach, optimizer).
Provider<DefaultAgentRuntime>(
create: (ctx) => DefaultAgentRuntime(
model: ctx.read<GeminiAiService>().providerAdapter,
tools: ctx.read<ToolRegistry>(),
),
),
],
child: MaterialApp(
title: 'Workout Logger',
Expand Down
Loading
Loading