andrud 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +295 -306
  2. package/dist/__tests__/context.test.d.ts +5 -0
  3. package/dist/__tests__/context.test.d.ts.map +1 -0
  4. package/dist/__tests__/context.test.js +86 -0
  5. package/dist/__tests__/context.test.js.map +1 -0
  6. package/dist/__tests__/generator.test.d.ts +5 -0
  7. package/dist/__tests__/generator.test.d.ts.map +1 -0
  8. package/dist/__tests__/generator.test.js +83 -0
  9. package/dist/__tests__/generator.test.js.map +1 -0
  10. package/dist/__tests__/validation.test.d.ts +5 -0
  11. package/dist/__tests__/validation.test.d.ts.map +1 -0
  12. package/dist/__tests__/validation.test.js +81 -0
  13. package/dist/__tests__/validation.test.js.map +1 -0
  14. package/dist/cli/commands/create.d.ts +10 -0
  15. package/dist/cli/commands/create.d.ts.map +1 -0
  16. package/dist/cli/commands/create.js +203 -0
  17. package/dist/cli/commands/create.js.map +1 -0
  18. package/dist/cli/commands/info.d.ts +13 -0
  19. package/dist/cli/commands/info.d.ts.map +1 -0
  20. package/dist/cli/commands/info.js +153 -0
  21. package/dist/cli/commands/info.js.map +1 -0
  22. package/dist/cli/commands/init.d.ts +15 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -0
  24. package/dist/cli/commands/init.js +141 -0
  25. package/dist/cli/commands/init.js.map +1 -0
  26. package/dist/cli/commands/list.d.ts +18 -0
  27. package/dist/cli/commands/list.d.ts.map +1 -0
  28. package/dist/cli/commands/list.js +122 -0
  29. package/dist/cli/commands/list.js.map +1 -0
  30. package/dist/cli/commands/new.d.ts +22 -0
  31. package/dist/cli/commands/new.d.ts.map +1 -0
  32. package/dist/cli/commands/new.js +245 -0
  33. package/dist/cli/commands/new.js.map +1 -0
  34. package/dist/cli/index.d.ts +5 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +157 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/core/config.d.ts +89 -0
  39. package/dist/core/config.d.ts.map +1 -0
  40. package/dist/core/config.js +151 -0
  41. package/dist/core/config.js.map +1 -0
  42. package/dist/core/context.d.ts +47 -0
  43. package/dist/core/context.d.ts.map +1 -0
  44. package/dist/core/context.js +175 -0
  45. package/dist/core/context.js.map +1 -0
  46. package/dist/core/generator.d.ts +44 -0
  47. package/dist/core/generator.d.ts.map +1 -0
  48. package/{src/core/generator.ts → dist/core/generator.js} +394 -484
  49. package/dist/core/generator.js.map +1 -0
  50. package/dist/core/types.d.ts +125 -0
  51. package/dist/core/types.d.ts.map +1 -0
  52. package/dist/core/types.js +22 -0
  53. package/dist/core/types.js.map +1 -0
  54. package/dist/templates/index.d.ts +36 -0
  55. package/dist/templates/index.d.ts.map +1 -0
  56. package/dist/templates/index.js +141 -0
  57. package/dist/templates/index.js.map +1 -0
  58. package/dist/ui/colors.d.ts +40 -0
  59. package/dist/ui/colors.d.ts.map +1 -0
  60. package/dist/ui/colors.js +117 -0
  61. package/dist/ui/colors.js.map +1 -0
  62. package/dist/ui/output.d.ts +69 -0
  63. package/dist/ui/output.d.ts.map +1 -0
  64. package/dist/ui/output.js +199 -0
  65. package/dist/ui/output.js.map +1 -0
  66. package/dist/ui/prompts.d.ts +20 -0
  67. package/dist/ui/prompts.d.ts.map +1 -0
  68. package/dist/ui/prompts.js +118 -0
  69. package/dist/ui/prompts.js.map +1 -0
  70. package/dist/ui/spinners.d.ts +30 -0
  71. package/dist/ui/spinners.d.ts.map +1 -0
  72. package/dist/ui/spinners.js +74 -0
  73. package/dist/ui/spinners.js.map +1 -0
  74. package/dist/ui/types.d.ts +35 -0
  75. package/dist/ui/types.d.ts.map +1 -0
  76. package/dist/ui/types.js +5 -0
  77. package/dist/ui/types.js.map +1 -0
  78. package/dist/utils/filesystem.d.ts +38 -0
  79. package/dist/utils/filesystem.d.ts.map +1 -0
  80. package/dist/utils/filesystem.js +181 -0
  81. package/dist/utils/filesystem.js.map +1 -0
  82. package/dist/utils/logger.d.ts +27 -0
  83. package/dist/utils/logger.d.ts.map +1 -0
  84. package/dist/utils/logger.js +52 -0
  85. package/dist/utils/logger.js.map +1 -0
  86. package/dist/utils/object.d.ts +140 -0
  87. package/dist/utils/object.d.ts.map +1 -0
  88. package/dist/utils/object.js +385 -0
  89. package/dist/utils/object.js.map +1 -0
  90. package/dist/utils/validation.d.ts +35 -0
  91. package/dist/utils/validation.d.ts.map +1 -0
  92. package/dist/utils/validation.js +270 -0
  93. package/dist/utils/validation.js.map +1 -0
  94. package/package.json +10 -21
  95. package/CHANGELOG.md +0 -70
  96. package/CONTRIBUTING.md +0 -132
  97. package/sc.png +0 -0
  98. package/src/__tests__/context.test.ts +0 -133
  99. package/src/__tests__/generator.test.ts +0 -107
  100. package/src/__tests__/validation.test.ts +0 -105
  101. package/src/cli/commands/create.ts +0 -252
  102. package/src/cli/commands/info.ts +0 -178
  103. package/src/cli/commands/init.ts +0 -186
  104. package/src/cli/commands/list.ts +0 -156
  105. package/src/cli/commands/new.ts +0 -316
  106. package/src/cli/index.ts +0 -116
  107. package/src/core/config.ts +0 -172
  108. package/src/core/context.ts +0 -212
  109. package/src/core/types.ts +0 -184
  110. package/src/templates/index.ts +0 -162
  111. package/src/types/gradient-string.d.ts +0 -25
  112. package/src/ui/colors.ts +0 -139
  113. package/src/ui/output.ts +0 -230
  114. package/src/ui/prompts.ts +0 -170
  115. package/src/ui/spinners.ts +0 -95
  116. package/src/ui/types.ts +0 -41
  117. package/src/utils/filesystem.ts +0 -222
  118. package/src/utils/logger.ts +0 -67
  119. package/src/utils/object.ts +0 -456
  120. package/src/utils/validation.ts +0 -345
  121. package/tsconfig.json +0 -25
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Template info command - shows detailed information about templates
3
+ */
4
+ import { printSection, printKeyValue } from '../../ui/output.js';
5
+ import { gradientTeen, bold, primary, muted } from '../../ui/colors.js';
6
+ import { getTemplateMetadata, getAllTemplates, getTemplatePreview } from '../../templates/index.js';
7
+ import { GRADLE_VERSIONS, TEMPLATE_CONFIGS } from '../../core/config.js';
8
+ import pc from 'picocolors';
9
+ /**
10
+ * Show detailed info about a template
11
+ */
12
+ export async function createInfoCommand(template, options = { json: false }) {
13
+ if (options.json) {
14
+ if (template) {
15
+ const meta = getTemplateMetadata(template);
16
+ if (!meta) {
17
+ console.log(JSON.stringify({ error: `Template "${template}" not found` }, null, 2));
18
+ return;
19
+ }
20
+ printInfoJson(meta);
21
+ }
22
+ else {
23
+ // Show info for all templates
24
+ const templates = getAllTemplates();
25
+ console.log(JSON.stringify(templates, null, 2));
26
+ }
27
+ return;
28
+ }
29
+ if (template) {
30
+ await showTemplateInfo(template);
31
+ }
32
+ else {
33
+ // Show brief info for all templates
34
+ console.log('');
35
+ console.log(gradientTeen('Available Templates'));
36
+ console.log('');
37
+ const templates = getAllTemplates();
38
+ const maxNameLength = Math.max(...templates.map(t => t.name.length));
39
+ const maxIdLength = Math.max(...templates.map(t => t.id.length));
40
+ templates.forEach((t, index) => {
41
+ const paddedName = t.name.padEnd(maxNameLength);
42
+ const paddedId = t.id.padEnd(maxIdLength);
43
+ console.log(` ${primary(`${index + 1}.`)} ${bold(paddedName)} ${muted(`(${paddedId})`)}`);
44
+ console.log(` ${t.description}`);
45
+ console.log('');
46
+ });
47
+ console.log('Usage: andrud info <template-name>');
48
+ console.log('Example: andrud info kotlin-compose');
49
+ }
50
+ }
51
+ /**
52
+ * Show detailed info for a specific template
53
+ */
54
+ async function showTemplateInfo(templateId) {
55
+ const meta = getTemplateMetadata(templateId);
56
+ if (!meta) {
57
+ console.log(pc.red(`Template "${templateId}" not found.`));
58
+ console.log('Available templates:');
59
+ getAllTemplates().forEach(t => console.log(` - ${t.id}`));
60
+ return;
61
+ }
62
+ // Get template config for version info
63
+ const config = TEMPLATE_CONFIGS[templateId];
64
+ if (!config) {
65
+ console.log(pc.red(`Template configuration not found for "${templateId}".`));
66
+ return;
67
+ }
68
+ const isCompose = templateId === 'kotlin-compose';
69
+ console.log('');
70
+ console.log(gradientTeen(`═══ ${meta.name} ═══`));
71
+ console.log('');
72
+ console.log(bold(meta.description));
73
+ console.log('');
74
+ // Key information
75
+ printSection('Configuration');
76
+ printKeyValue([
77
+ { key: 'Template ID', value: meta.id },
78
+ { key: 'Language', value: config.language === 'kotlin' ? pc.green('Kotlin') : pc.yellow('Java') },
79
+ { key: 'UI Framework', value: isCompose ? pc.cyan('Jetpack Compose') : pc.gray('XML Layouts') },
80
+ { key: 'Min SDK', value: `API ${config.minSdk}` },
81
+ { key: 'Target SDK', value: `API ${config.targetSdk}` },
82
+ { key: 'Compile SDK', value: `API ${config.compileSdk}` }
83
+ ]);
84
+ // Version information
85
+ printSection('Versions');
86
+ printKeyValue([
87
+ { key: 'Gradle', value: config.gradleVersion },
88
+ { key: 'Android Gradle Plugin', value: config.agpVersion },
89
+ { key: 'Kotlin', value: config.kotlinVersion || 'N/A' },
90
+ ...(isCompose ? [
91
+ { key: 'Compose BOM', value: GRADLE_VERSIONS.COMPOSE_BOM },
92
+ { key: 'Compose Compiler', value: GRADLE_VERSIONS.COMPOSE_COMPILER }
93
+ ] : []),
94
+ ...(templateId === 'native-cpp' ? [
95
+ { key: 'NDK', value: config.ndkVersion || GRADLE_VERSIONS.NDK }
96
+ ] : [])
97
+ ]);
98
+ // Features
99
+ printSection('Features');
100
+ meta.features.forEach((feature, i) => {
101
+ console.log(` ${pc.green('+')} ${feature}`);
102
+ });
103
+ // Keywords
104
+ printSection('Keywords');
105
+ console.log(` ${meta.keywords.map(k => pc.cyan(k)).join(', ')}`);
106
+ // Code preview
107
+ const preview = getTemplatePreview(templateId);
108
+ if (preview) {
109
+ printSection('Code Preview');
110
+ console.log(pc.gray('─'.repeat(60)));
111
+ console.log(pc.dim(preview.split('\n').slice(0, 15).join('\n')));
112
+ if (preview.split('\n').length > 15) {
113
+ console.log(pc.gray('...'));
114
+ }
115
+ }
116
+ console.log('');
117
+ }
118
+ /**
119
+ * Print template info as JSON
120
+ */
121
+ function printInfoJson(meta) {
122
+ const config = TEMPLATE_CONFIGS[meta.id];
123
+ if (!config)
124
+ return;
125
+ const isCompose = meta.id === 'kotlin-compose';
126
+ const info = {
127
+ id: meta.id,
128
+ name: meta.name,
129
+ description: meta.description,
130
+ language: config.language,
131
+ uiFramework: config.uiFramework === 'compose' ? 'Jetpack Compose' : 'XML Layouts',
132
+ keywords: meta.keywords,
133
+ features: meta.features,
134
+ versions: {
135
+ gradle: config.gradleVersion,
136
+ agp: config.agpVersion,
137
+ kotlin: config.kotlinVersion || null,
138
+ compose: config.composeEnabled ? {
139
+ bom: GRADLE_VERSIONS.COMPOSE_BOM,
140
+ compiler: GRADLE_VERSIONS.COMPOSE_COMPILER
141
+ } : null,
142
+ ndk: config.ndkVersion || null
143
+ },
144
+ sdk: {
145
+ min: config.minSdk,
146
+ target: config.targetSdk,
147
+ compile: config.compileSdk
148
+ },
149
+ codePreview: getTemplatePreview(meta.id)
150
+ };
151
+ console.log(JSON.stringify(info, null, 2));
152
+ }
153
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Init project command - initialize Android project in current directory
3
+ */
4
+ interface InitCommandOptions {
5
+ force: boolean;
6
+ template?: string;
7
+ }
8
+ /**
9
+ * Initialize Android project in current directory
10
+ */
11
+ export declare function createInitCommand(_options: InitCommandOptions, args?: {
12
+ template?: string;
13
+ }): Promise<void>;
14
+ export {};
15
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmJf"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Init project command - initialize Android project in current directory
3
+ */
4
+ import { select, text, confirm, isCancel, cancel } from '@clack/prompts';
5
+ import { printWelcome, printSuccess, printError, printSection, printKeyValue, printGoodbye } from '../../ui/output.js';
6
+ import { validatePackageStructure } from '../../utils/validation.js';
7
+ import { generateProject } from '../../core/generator.js';
8
+ import { buildDefaultProjectContext, buildTemplateContext } from '../../core/context.js';
9
+ import { getCurrentWorkingDirectory } from '../../utils/filesystem.js';
10
+ import { getTemplateMetadata, getAllTemplates } from '../../templates/index.js';
11
+ import pc from 'picocolors';
12
+ /**
13
+ * Initialize Android project in current directory
14
+ */
15
+ export async function createInitCommand(_options, args) {
16
+ try {
17
+ printWelcome();
18
+ const cwd = getCurrentWorkingDirectory();
19
+ const projectName = cwd.split(/[\\/]/).pop() ?? 'MyApp';
20
+ printSection('Initialize Android Project');
21
+ console.log(`Current directory: ${pc.cyan(cwd)}`);
22
+ console.log('');
23
+ // Get templates
24
+ const templates = getAllTemplates();
25
+ // Step 1: Select template
26
+ let selectedTemplate;
27
+ if (args?.template) {
28
+ const meta = getTemplateMetadata(args.template);
29
+ if (!meta) {
30
+ printError(`Unknown template: ${args.template}`);
31
+ return;
32
+ }
33
+ selectedTemplate = args.template;
34
+ }
35
+ else {
36
+ const templateOptions = templates.map(t => ({
37
+ label: t.name,
38
+ value: t.id,
39
+ hint: t.keywords.slice(0, 2).join(', ')
40
+ }));
41
+ const templateResult = await select({
42
+ message: '? Select a project template',
43
+ options: templateOptions
44
+ });
45
+ if (isCancel(templateResult)) {
46
+ cancel();
47
+ return;
48
+ }
49
+ selectedTemplate = templateResult;
50
+ }
51
+ // Step 2: Get package name
52
+ const defaultPackage = `com.example.${projectName.toLowerCase().replace(/[^a-z0-9]/g, '')}`;
53
+ const packageResult = await text({
54
+ message: '? What is the package name?',
55
+ placeholder: 'com.example.myapp',
56
+ defaultValue: defaultPackage,
57
+ validate: (value) => {
58
+ const result = validatePackageStructure(value);
59
+ if (!result.valid) {
60
+ return result.errors[0];
61
+ }
62
+ return undefined;
63
+ }
64
+ });
65
+ if (isCancel(packageResult)) {
66
+ cancel();
67
+ return;
68
+ }
69
+ const packageName = packageResult;
70
+ const validation = validatePackageStructure(packageName);
71
+ if (!validation.valid) {
72
+ printError('Invalid package name', validation.errors.join(', '));
73
+ return;
74
+ }
75
+ // Confirm initialization
76
+ const confirmInit = await confirm({
77
+ message: `? Initialize Android project in ${cwd}?`,
78
+ initialValue: true
79
+ });
80
+ if (isCancel(confirmInit)) {
81
+ cancel();
82
+ return;
83
+ }
84
+ if (!confirmInit) {
85
+ console.log('Initialization cancelled.');
86
+ return;
87
+ }
88
+ // Build context
89
+ const baseContext = buildDefaultProjectContext(projectName, packageName, cwd, selectedTemplate, {
90
+ git: true,
91
+ readme: true,
92
+ androidX: true,
93
+ kotlinDsl: true
94
+ });
95
+ const context = buildTemplateContext({
96
+ appName: baseContext.appName,
97
+ packageName: baseContext.packageName,
98
+ projectDirectory: baseContext.projectDirectory,
99
+ template: baseContext.template,
100
+ uiFramework: baseContext.uiFramework,
101
+ language: baseContext.language,
102
+ android: baseContext.android,
103
+ gradle: baseContext.gradle,
104
+ features: baseContext,
105
+ nativeCpp: baseContext.nativeCpp
106
+ });
107
+ // Generate project
108
+ printSection('Generating Project');
109
+ const result = await generateProject(context, {
110
+ overwrite: true,
111
+ dryRun: false,
112
+ skipInstall: false,
113
+ verbose: false
114
+ });
115
+ if (result.success) {
116
+ printSuccess('Project initialized successfully!');
117
+ printKeyValue([
118
+ { key: 'Package', value: packageName },
119
+ { key: 'Template', value: selectedTemplate },
120
+ { key: 'Location', value: cwd },
121
+ { key: 'Files created', value: result.generatedFiles.length.toString() }
122
+ ]);
123
+ printGoodbye(true);
124
+ }
125
+ else {
126
+ printError('Project initialization failed');
127
+ if (result.errors.length > 0) {
128
+ result.errors.forEach(err => {
129
+ console.log(` ${pc.red('•')} ${err.file ? `${err.file}: ` : ''}${err.message}`);
130
+ });
131
+ }
132
+ printGoodbye(false);
133
+ }
134
+ }
135
+ catch (error) {
136
+ printError('An unexpected error occurred', error.message);
137
+ printGoodbye(false);
138
+ process.exit(1);
139
+ }
140
+ }
141
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * List templates command - shows all available templates
3
+ */
4
+ import type { TemplateMetadata } from '../../core/types.js';
5
+ interface ListCommandOptions {
6
+ json: boolean;
7
+ search?: string;
8
+ }
9
+ /**
10
+ * List all available templates
11
+ */
12
+ export declare function createListCommand(options?: ListCommandOptions): Promise<void>;
13
+ /**
14
+ * Print templates as a compact list
15
+ */
16
+ export declare function printTemplateList(templates: TemplateMetadata[]): void;
17
+ export {};
18
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,kBAAoC,GAC5C,OAAO,CAAC,IAAI,CAAC,CA4Df;AAwDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAerE"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * List templates command - shows all available templates
3
+ */
4
+ import { gradientTeen, bold, primary, muted } from '../../ui/colors.js';
5
+ import { printSection } from '../../ui/output.js';
6
+ import { getAllTemplates, getTemplatePreview, searchTemplates } from '../../templates/index.js';
7
+ import { TEMPLATE_CONFIGS } from '../../core/config.js';
8
+ import pc from 'picocolors';
9
+ /**
10
+ * List all available templates
11
+ */
12
+ export async function createListCommand(options = { json: false }) {
13
+ // Validate search input
14
+ if (options.search && typeof options.search !== 'string') {
15
+ console.log(pc.red('Error: Search query must be a string'));
16
+ return;
17
+ }
18
+ if (options.search && options.search.length > 100) {
19
+ console.log(pc.red('Error: Search query is too long (maximum 100 characters)'));
20
+ return;
21
+ }
22
+ // Filter templates based on search
23
+ const templates = options.search?.trim()
24
+ ? searchTemplates(options.search.trim())
25
+ : getAllTemplates();
26
+ if (options.json) {
27
+ const templateList = templates.map(t => ({
28
+ id: t.id,
29
+ name: t.name,
30
+ description: t.description,
31
+ language: TEMPLATE_CONFIGS[t.id]?.language === 'kotlin' ? 'Kotlin' : 'Java',
32
+ uiFramework: TEMPLATE_CONFIGS[t.id]?.uiFramework === 'compose' ? 'Compose' : 'XML'
33
+ }));
34
+ console.log(JSON.stringify(templateList, null, 2));
35
+ return;
36
+ }
37
+ if (templates.length === 0) {
38
+ console.log(pc.yellow('No templates found.'));
39
+ return;
40
+ }
41
+ console.log('');
42
+ console.log(gradientTeen('╔══════════════════════════════════════════════════════════════╗'));
43
+ console.log(gradientTeen('║ Android Project Templates ║'));
44
+ console.log(gradientTeen('╚══════════════════════════════════════════════════════════════╝'));
45
+ console.log('');
46
+ templates.forEach((template, index) => {
47
+ printTemplateCard(template, index + 1);
48
+ });
49
+ // Summary
50
+ printSection('Summary');
51
+ console.log(` Total templates: ${bold(templates.length.toString())}`);
52
+ console.log(` Kotlin templates: ${bold(templates.filter(t => TEMPLATE_CONFIGS[t.id]?.language === 'kotlin').length.toString())}`);
53
+ console.log(` Java templates: ${bold(templates.filter(t => TEMPLATE_CONFIGS[t.id]?.language === 'java').length.toString())}`);
54
+ console.log(` Compose templates: ${bold(templates.filter(t => TEMPLATE_CONFIGS[t.id]?.uiFramework === 'compose').length.toString())}`);
55
+ console.log('');
56
+ console.log(muted(' Use ') + primary('andrud info <template>') + muted(' for more details'));
57
+ console.log('');
58
+ }
59
+ /**
60
+ * Print a template as a card
61
+ */
62
+ function printTemplateCard(template, number) {
63
+ const config = TEMPLATE_CONFIGS[template.id];
64
+ if (!config)
65
+ return;
66
+ const isKotlin = config.language === 'kotlin';
67
+ const isCompose = config.uiFramework === 'compose';
68
+ // Template header
69
+ console.log(primary(` ${number}. `) + bold(template.name));
70
+ console.log(` ${template.description}`);
71
+ console.log('');
72
+ // Tags
73
+ const tags = [];
74
+ tags.push(isKotlin ? pc.green('Kotlin') : pc.yellow('Java'));
75
+ tags.push(isCompose ? pc.cyan('Compose') : pc.gray('XML'));
76
+ if (template.id === 'native-cpp') {
77
+ tags.push(pc.magenta('NDK'));
78
+ }
79
+ console.log(` ${tags.join(' ')}`);
80
+ // Key features
81
+ const features = template.features.slice(0, 3);
82
+ console.log(` ${muted('Features:')} ${features.join(pc.gray(', '))}`);
83
+ // Version info
84
+ console.log(` ${muted('Gradle:')} ${config.gradleVersion} ${muted('AGP:')} ${config.agpVersion}`);
85
+ // Command example
86
+ console.log('');
87
+ console.log(` ${muted('Run:')} ${primary(`andrud new MyApp -t ${template.id}`)}`);
88
+ // Code preview snippet
89
+ const preview = getTemplatePreview(template.id);
90
+ if (preview) {
91
+ const lines = preview.split('\n').slice(0, 4);
92
+ console.log('');
93
+ console.log(' ' + pc.gray('┌─ Code preview'));
94
+ lines.forEach((line, i) => {
95
+ const isLast = i === lines.length - 1;
96
+ const prefix = isLast ? ' ' : ' ';
97
+ const linePrefix = isLast ? '└─' : '│ ';
98
+ console.log(prefix + pc.gray(linePrefix) + pc.dim(line.substring(0, 50) + (line.length > 50 ? '...' : '')));
99
+ });
100
+ }
101
+ console.log('');
102
+ console.log(pc.gray(' ' + '─'.repeat(60)));
103
+ console.log('');
104
+ }
105
+ /**
106
+ * Print templates as a compact list
107
+ */
108
+ export function printTemplateList(templates) {
109
+ const maxIdLength = Math.max(...templates.map(t => t.id.length));
110
+ const maxNameLength = Math.max(...templates.map(t => t.name.length));
111
+ templates.forEach((t, i) => {
112
+ const config = TEMPLATE_CONFIGS[t.id];
113
+ if (!config)
114
+ return;
115
+ const id = t.id.padEnd(maxIdLength);
116
+ const name = t.name.padEnd(maxNameLength);
117
+ const lang = config.language === 'kotlin' ? pc.green('K') : pc.yellow('J');
118
+ const ui = config.uiFramework === 'compose' ? pc.cyan('C') : pc.gray('X');
119
+ console.log(` ${primary(String(i + 1).padStart(2))} ${bold(id)} ${name} ${lang}${ui} ${muted(t.description.substring(0, 40))}`);
120
+ });
121
+ }
122
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * New project creation command with interactive prompts
3
+ */
4
+ interface NewCommandOptions {
5
+ name?: string;
6
+ template?: string;
7
+ packageName?: string;
8
+ directory?: string;
9
+ minSdk?: number;
10
+ targetSdk?: number;
11
+ force?: boolean;
12
+ skipInstall?: boolean;
13
+ git?: boolean;
14
+ kotlin?: boolean;
15
+ verbose?: boolean;
16
+ }
17
+ /**
18
+ * Create a new Android project
19
+ */
20
+ export declare function createNewCommand(name?: string, options?: NewCommandOptions): Promise<void>;
21
+ export type { NewCommandOptions };
22
+ //# sourceMappingURL=new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/new.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4BH,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAsQf;AAGD,YAAY,EAAE,iBAAiB,EAAE,CAAC"}