Skip to content
This repository was archived by the owner on Apr 7, 2026. It is now read-only.

Commit 7e562cd

Browse files
authored
chore: Capture template usage & show next steps (#311)
1 parent 4822a29 commit 7e562cd

File tree

4 files changed

+57
-11
lines changed

4 files changed

+57
-11
lines changed

packages/globe_cli/lib/src/commands/create_project_command.dart

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import 'package:mason_logger/mason_logger.dart';
55
import 'package:path/path.dart' as p;
66
import '../command.dart';
77

8+
const _templateRepo = 'https://github.com/invertase/globe';
9+
810
class CreateProjectFromTemplate extends BaseGlobeCommand {
911
CreateProjectFromTemplate() {
1012
argParser.addOption(
@@ -73,7 +75,7 @@ class CreateProjectFromTemplate extends BaseGlobeCommand {
7375
// Initialize a new Git repository
7476
await _runGitCommand(['init'], processWorkingDir: directory.path);
7577
await _runGitCommand(
76-
const ['remote', 'add', 'origin', 'https://github.com/invertase/globe'],
78+
const ['remote', 'add', 'origin', _templateRepo],
7779
processWorkingDir: directory.path,
7880
);
7981

@@ -106,11 +108,32 @@ class CreateProjectFromTemplate extends BaseGlobeCommand {
106108
throw Exception('Template: $template does not exist');
107109
}
108110

109-
await _copyPath(
110-
templateDir.path,
111+
final projectDir = Directory(
111112
p.join(Directory.current.path, projectDirName),
112113
);
113114

115+
await _copyPath(templateDir.path, projectDir.path);
116+
117+
// set current directory to the new project directory
118+
Directory.current = projectDir;
119+
120+
scope.setTemplatePath(template, _templateRepo);
121+
122+
progress.complete('Project created successfully.');
123+
124+
// add next steps and let user to run globe deploy
125+
logger.info('');
126+
logger.info(styleBold.wrap('🚀 Next steps'));
127+
logger.info('────────────────────────────────────────');
128+
logger.info(' 1. Navigate to your project');
129+
logger.info(' ${cyan.wrap('cd $projectDirName')}');
130+
logger.info('');
131+
logger.info(' 2. Deploy your project');
132+
logger.info(' ${cyan.wrap('globe deploy')}');
133+
logger.info('');
134+
logger.info('${lightGray.wrap('✨ Happy building with Globe!')}');
135+
logger.info('');
136+
114137
return ExitCode.success.code;
115138
} on ProcessException catch (e) {
116139
progress.fail('Failed to create project from template.');

packages/globe_cli/lib/src/utils/api.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:async';
22
import 'dart:convert';
33
import 'dart:io';
44

5+
import 'package:get_it/get_it.dart';
56
import 'package:http/http.dart' as http;
67
import 'package:mason_logger/mason_logger.dart';
78
import 'package:path/path.dart';
@@ -39,6 +40,7 @@ class GlobeApi {
3940
Map<String, String> get headers {
4041
final currentSession = auth.currentSession;
4142
final currentScope = GlobeScope.value;
43+
final templateInfo = GetIt.instance.get<GlobeScope>().templateInfo;
4244

4345
return {
4446
'X-Globe-Platform': 'globe_cli',
@@ -48,6 +50,10 @@ class GlobeApi {
4850
'X-Globe-Project-Id': currentScope.projectId,
4951
'X-Globe-Project-Slug': currentScope.projectSlug,
5052
},
53+
if (templateInfo != null) ...{
54+
'X-Globe-Template-Id': templateInfo.$1,
55+
'X-Globe-Template-Source': templateInfo.$2,
56+
},
5157
if (currentSession != null &&
5258
currentSession.authenticationMethod == AuthenticationMethod.jwt)
5359
'Authorization': 'Bearer ${currentSession.jwt}',

packages/globe_cli/lib/src/utils/metadata.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class GlobeMetadata {
2222
String get projectFileName =>
2323
_isLocal ? 'project.local.json' : 'project.json';
2424

25+
static const String templateFileName = '.template';
26+
2527
String get sessionFileName =>
2628
_isLocal ? 'dart_globe_auth.local.json' : 'dart_globe_auth.json';
2729

packages/globe_cli/lib/src/utils/scope.dart

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@ class GlobeScope {
1919
required this.metadata,
2020
});
2121

22-
File get _projectFile {
23-
return File(
24-
p.join(
25-
_projectDirectory.path,
26-
metadata.projectFileName,
27-
),
28-
);
29-
}
22+
late final _projectFile = File(
23+
p.join(_projectDirectory.path, metadata.projectFileName),
24+
);
25+
26+
late final _maybeTemplateFile = File(
27+
p.join(_projectDirectory.path, GlobeMetadata.templateFileName),
28+
);
3029

3130
late final List<ScopeMetadata> workspace;
3231

@@ -59,6 +58,22 @@ class GlobeScope {
5958
..writeAsStringSync(const JsonEncoder.withIndent(' ').convert(workspace));
6059
}
6160

61+
void setTemplatePath(String templateName, String templateRepoUrl) {
62+
_maybeTemplateFile
63+
..createSync(recursive: true)
64+
..writeAsStringSync('$templateName\n$templateRepoUrl');
65+
}
66+
67+
// First param is template name, second param is template repo url
68+
(String, String)? get templateInfo {
69+
if (!_maybeTemplateFile.existsSync()) return null;
70+
71+
final template = _maybeTemplateFile.readAsLinesSync();
72+
if (template.isEmpty) return null;
73+
74+
return (template[0], template[1]);
75+
}
76+
6277
/// Sets the current project scope.
6378
ScopeMetadata setScope(ScopeMetadata scope) {
6479
workspace

0 commit comments

Comments
 (0)