run method
Runs this command.
The return value is wrapped in a Future if necessary and returned by
CommandRunner.runCommand.
Implementation
@override
Future<void> run() async {
if (!ContextService.isInitialized()) {
print('ContextForge has not been initialized.\nRun: contextforge init');
return;
}
ContextService.ensureDataFilesExist();
// Prompt for decision details
stdout.write('Decision ID: ');
var id = stdin.readLineSync() ?? '';
id = id.trim();
if (id.isEmpty) {
print('Decision ID cannot be empty.');
return;
}
stdout.write('Decision title: ');
final title = stdin.readLineSync() ?? '';
if (title.isEmpty) {
print('Decision title cannot be empty.');
return;
}
stdout.write('Short description: ');
final description = stdin.readLineSync() ?? '';
stdout.write('Choice made: ');
final choice = stdin.readLineSync() ?? '';
stdout.write('Reason: ');
final reason = stdin.readLineSync() ?? '';
// Load existing decisions to check count
final decisions = ContextService.loadDecisions();
// Check for duplicate ID
if (decisions.any((d) => d.id == id)) {
print('Decision with ID "$id" already exists.');
return;
}
final detailFile = 'decisions/$id.md';
final decisionMarkdownPath = '.contextforge/data/decisions/$id.md';
// Ensure decisions directory exists
try {
Directory('.contextforge/data/decisions').createSync(recursive: true);
} catch (e) {
print('Error creating decisions directory: $e');
return;
}
// Create markdown file with template
final markdownContent = _createMarkdownTemplate(title, description, choice, reason);
try {
File(decisionMarkdownPath).writeAsStringSync(markdownContent);
} catch (e) {
print('Error creating decision file: $e');
return;
}
// Check if we should add to YAML (only if < 5 entries)
// Create decision
final decision = Decision(
id: id,
title: title,
reason: reason,
alternatives: [],
description: description,
choice: choice,
detailFile: detailFile,
);
// Add and save
decisions.add(decision);
ContextService.saveDecisions(decisions);
print('✔ Decision "$title" added successfully (ID: $id)');
}