Repository: VeryGoodOpenSource/very_good_cli (dart)

Issue:
fix: Updating the CLI template to guide the user towards opening the project after creating
**Description**
Currently after creating an application, it doesn't guide users to go into the respective directly and run the code.


**Additional Context**

BEFORE
```
Created a Very Good App! 🦄

+----------------------------------------------------+
| Looking for more features?                         |
| We have an enterprise-grade solution for companies |
| called Very Good Start.                            |
|                                                    |
| For more info visit:                               |
| https://verygood.ventures/solution/very-good-start |
+----------------------------------------------------+
```
AFTER
```
Created a Very Good App! 🦄

In order to open your project, type:
       $ cd app_name
       $ code .
+----------------------------------------------------+
| Looking for more features?                         |
| We have an enterprise-grade solution for companies |
| called Very Good Start.                            |
|                                                    |
| For more info visit:                               |
| https://verygood.ventures/solution/very-good-start |
+----------------------------------------------------+
```

Pull request description:
Resolves #921

Updated CLI template output for 
``` very_good create flutter_app my_app```
for more clarity on hoe to open the project.

```
Created a Very Good App! 🦄

In order to open your project, type:
       $ cd app_name
       $ code .
+----------------------------------------------------+
| Looking for more features?                         |
| We have an enterprise-grade solution for companies |
| called Very Good Start.                            |
|                                                    |
| For more info visit:                               |
| https://verygood.ventures/solution/very-good-start |
+----------------------------------------------------+
```


## Type of Change

<!--- Put an `x` in all the boxes that apply: -->

- [ ] ✨ New feature (non-breaking change which adds functionality)
- [ ] 🛠️ Bug fix (non-breaking change which fixes an issue)
- [ ] ❌ Breaking change (fix or feature that would cause existing functionality to change)
- [x] 🧹 Code refactor
- [ ] ✅ Build configuration change
- [ ] 📝 Documentation
- [x] 🗑️ Chore

Patch:
diff --git a/lib/src/commands/create/templates/very_good_core/very_good_core_template.dart b/lib/src/commands/create/templates/very_good_core/very_good_core_template.dart
index bcab07cb2..c77fdaa82 100644
--- a/lib/src/commands/create/templates/very_good_core/very_good_core_template.dart
+++ b/lib/src/commands/create/templates/very_good_core/very_good_core_template.dart
@@ -1,4 +1,5 @@
 import 'package:mason/mason.dart';
+import 'package:path/path.dart' as path;
 import 'package:universal_io/io.dart';
 import 'package:very_good_cli/src/commands/create/templates/templates.dart';
 import 'package:very_good_cli/src/logger_extension.dart';
@@ -19,14 +20,32 @@ class VeryGoodCoreTemplate extends Template {
   Future<void> onGenerateComplete(Logger logger, Directory outputDir) async {
     await installFlutterPackages(logger, outputDir);
     await applyDartFixes(logger, outputDir);
-    _logSummary(logger);
+    _logSummary(logger, outputDir);
   }
 
-  void _logSummary(Logger logger) {
+  void _logSummary(Logger logger, Directory outputDir) {
+    final relativePath = path.relative(
+      outputDir.path,
+      from: Directory.current.path,
+    );
+
+    final projectPath = relativePath;
+    final projectPathLink =
+        link(uri: Uri.parse(projectPath), message: projectPath);
+
+    final readmePath = path.join(relativePath, 'README.md');
+    final readmePathLink =
+        link(uri: Uri.parse(readmePath), message: readmePath);
+
+    final details = '''
+  • To get started refer to $readmePathLink
+  • Your project code is in $projectPathLink
+''';
+
     logger
       ..info('\n')
       ..created('Created a Very Good App! 🦄')
-      ..info('\n')
+      ..info(details)
       ..info(
         lightGray.wrap(
           '''


Test patch:
diff --git a/test/helpers/test_multi_template_commands.dart b/test/helpers/test_multi_template_commands.dart
index c48f6188f..1ce0167a6 100644
--- a/test/helpers/test_multi_template_commands.dart
+++ b/test/helpers/test_multi_template_commands.dart
@@ -16,20 +16,24 @@ Future<void> testMultiTemplateCommand({
   required MasonGenerator generator,
   required Logger logger,
   required GeneratorHooks hooks,
-
-  // expected
   required Map<String, dynamic> expectedVars,
   required String expectedLogSummary,
+  Directory? outputDirectoryOverride,
 }) async {
-  final tempDirectory = Directory.systemTemp.createTempSync();
-  addTearDown(() => tempDirectory.deleteSync(recursive: true));
+  late final Directory outputDirectory;
+  if (outputDirectoryOverride == null) {
+    outputDirectory = Directory.systemTemp.createTempSync();
+    addTearDown(() => outputDirectory.deleteSync(recursive: true));
+  } else {
+    outputDirectory = outputDirectoryOverride;
+  }
 
   final argResults = _MockArgResults();
   final command = multiTemplatesCommand..argResultOverrides = argResults;
 
   when(() => argResults['template'] as String?).thenReturn(templateName);
   when(() => argResults['output-directory'] as String?)
-      .thenReturn(tempDirectory.path);
+      .thenReturn(outputDirectory.path);
 
   for (final entry in mockArgs.entries) {
     when(() => argResults[entry.key]).thenReturn(entry.value);
diff --git a/test/src/commands/create/commands/flutter_app_test.dart b/test/src/commands/create/commands/flutter_app_test.dart
index 4bde545db..5cf40ffb4 100644
--- a/test/src/commands/create/commands/flutter_app_test.dart
+++ b/test/src/commands/create/commands/flutter_app_test.dart
@@ -152,26 +152,72 @@ void main() {
       });
 
       group('templates', () {
-        test('core', () async {
-          await testMultiTemplateCommand(
-            multiTemplatesCommand: CreateFlutterApp(
+        group('core', () {
+          test('generates successfully', () async {
+            await testMultiTemplateCommand(
+              multiTemplatesCommand: CreateFlutterApp(
+                logger: logger,
+                generatorFromBundle: (_) async => throw Exception('oops'),
+                generatorFromBrick: (_) async => generator,
+              ),
               logger: logger,
-              generatorFromBundle: (_) async => throw Exception('oops'),
-              generatorFromBrick: (_) async => generator,
-            ),
-            logger: logger,
-            hooks: hooks,
-            generator: generator,
-            templateName: 'core',
-            mockArgs: {'application-id': 'xyz.app.my_app'},
-            expectedVars: {
-              'project_name': 'my_app',
-              'description': '',
-              'org_name': 'com.example.verygoodcore',
-              'application_id': 'xyz.app.my_app',
-            },
-            expectedLogSummary: 'Created a Very Good App! 🦄',
-          );
+              hooks: hooks,
+              generator: generator,
+              templateName: 'core',
+              mockArgs: {'application-id': 'xyz.app.my_app'},
+              expectedVars: {
+                'project_name': 'my_app',
+                'description': '',
+                'org_name': 'com.example.verygoodcore',
+                'application_id': 'xyz.app.my_app',
+              },
+              expectedLogSummary: 'Created a Very Good App! 🦄',
+            );
+          });
+
+          test('logs getting started information', () async {
+            final tempDirectory = Directory.systemTemp.createTempSync();
+            addTearDown(() => tempDirectory.deleteSync(recursive: true));
+
+            await testMultiTemplateCommand(
+              outputDirectoryOverride: tempDirectory,
+              multiTemplatesCommand: CreateFlutterApp(
+                logger: logger,
+                generatorFromBundle: (_) async => throw Exception('oops'),
+                generatorFromBrick: (_) async => generator,
+              ),
+              logger: logger,
+              hooks: hooks,
+              generator: generator,
+              templateName: 'core',
+              mockArgs: {'application-id': 'xyz.app.my_app'},
+              expectedVars: {
+                'project_name': 'my_app',
+                'description': '',
+                'org_name': 'com.example.verygoodcore',
+                'application_id': 'xyz.app.my_app',
+              },
+              expectedLogSummary: 'Created a Very Good App! 🦄',
+            );
+
+            final outputPath = path.join(tempDirectory.path, 'my_app');
+            final relativePath =
+                path.relative(outputPath, from: Directory.current.path);
+
+            final projectPath = relativePath;
+            final projectPathLink =
+                link(uri: Uri.parse(projectPath), message: projectPath);
+
+            final readmePath = path.join(relativePath, 'README.md');
+            final readmePathLink =
+                link(uri: Uri.parse(readmePath), message: readmePath);
+
+            final details = '''
+  • To get started refer to $readmePathLink
+  • Your project code is in $projectPathLink
+''';
+            verify(() => logger.info(details)).called(1);
+          });
         });
 
         test('wear', () async {