Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
25 changes: 25 additions & 0 deletions AGENT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Raygun CLI - Agent Guide

## Build/Test Commands
- `dart test` - Run all tests
- `dart test test/config_props_test.dart` - Run single test file
- `dart analyze` - Run linter/analysis (uses package:lints/recommended.yaml)
- `dart compile exe bin/raygun_cli.dart -o raygun-cli` - Build executable
- `dart run bin/raygun_cli.dart` - Run CLI locally
- `dart format .` - Format code

## Architecture
- **CLI Tool**: Uploads sourcemaps, manages obfuscation symbols, tracks deployments for Raygun.com
- **Main Entry**: `bin/raygun_cli.dart` - CLI argument parsing and command routing
- **Commands**: `lib/src/` - Four main command modules: sourcemap, symbols, deployments, proguard
- **APIs**: Each command has corresponding API client (`*_api.dart`) for Raygun REST API calls
- **Config**: `config_props.dart` handles arg parsing with env var fallbacks (RAYGUN_APP_ID, RAYGUN_TOKEN, RAYGUN_API_KEY)

## Code Style
- **Imports**: Standard library first, then package imports, then relative imports
- **Naming**: Snake_case for files/dirs, camelCase for variables, PascalCase for classes
- **Functions**: Use `Future<bool>` for async operations, return success/failure status
- **Errors**: Print error messages to console, return false on failure
- **Types**: Use explicit types for public APIs, required named parameters preferred
- **Strings**: Use single quotes, string interpolation with $variable or ${expression}
- **Comments**: Use /// for public API documentation, avoid inline comments
8 changes: 4 additions & 4 deletions bin/raygun_cli.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ ArgParser buildParser() {
buildParserSourcemap(),
)
..addCommand(
kSymbolsCommand,
buildParserSymbols(),
symbolsCommand.name,
symbolsCommand.buildParserSymbols(),
)
..addCommand(
kDeploymentsCommand,
Expand Down Expand Up @@ -76,8 +76,8 @@ void main(List<String> arguments) {
return;
}

if (results.command?.name == kSymbolsCommand) {
parseSymbolsCommand(results.command!, verbose);
if (results.command?.name == symbolsCommand.name) {
symbolsCommand.execute(results.command!, verbose);
return;
}

Expand Down
2 changes: 1 addition & 1 deletion lib/raygun_cli.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export 'src/deployments/deployments_command.dart';
export 'src/proguard/proguard_command.dart';
export 'src/sourcemap/sourcemap_command.dart';
export 'src/symbols/flutter_symbols.dart';
export 'src/symbols/symbols_command.dart';
42 changes: 42 additions & 0 deletions lib/src/core/raygun_api.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import 'dart:io';

import 'package:http/http.dart';

class RaygunMultipartRequestBuilder {
late final MultipartRequest _request;

RaygunMultipartRequestBuilder(String url, String requestType) {
_request = MultipartRequest(requestType, Uri.parse(url));
}

RaygunMultipartRequestBuilder addBearerToken(String token) {
_request.headers['Authorization'] = 'Bearer $token';
return this;
}

RaygunMultipartRequestBuilder addFile(String field, String filePath) {
final file = File(filePath);
if (!file.existsSync()) {
throw Exception('File not found: $filePath');
}
_request.files.add(
MultipartFile(
field,
file.readAsBytes().asStream(),
file.lengthSync(),
filename: filePath.split("/").last,
),
);

return this;
}

RaygunMultipartRequestBuilder addField(String field, String value) {
_request.fields[field] = value;
return this;
}

MultipartRequest build() {
return _request;
}
}
17 changes: 17 additions & 0 deletions lib/src/core/raygun_command.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:args/args.dart';

abstract class RaygunCommand {
const RaygunCommand();

String get name;

void execute(ArgResults command, bool verbose);

Future<bool> run({
required ArgResults command,
required appId,
required token,
});

ArgParser buildParserSymbols();
}
115 changes: 0 additions & 115 deletions lib/src/symbols/flutter_symbols.dart

This file was deleted.

98 changes: 0 additions & 98 deletions lib/src/symbols/flutter_symbols_api.dart

This file was deleted.

Loading