andrud 1.0.0 → 1.0.2

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 (122) hide show
  1. package/README.md +69 -83
  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 +99 -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 +8 -19
  95. package/CHANGELOG.md +0 -70
  96. package/CODE_REVIEW_ANALYSIS.md +0 -177
  97. package/CONTRIBUTING.md +0 -132
  98. package/FIXES_IMPLEMENTED.md +0 -546
  99. package/src/__tests__/context.test.ts +0 -133
  100. package/src/__tests__/generator.test.ts +0 -107
  101. package/src/__tests__/validation.test.ts +0 -105
  102. package/src/cli/commands/create.ts +0 -252
  103. package/src/cli/commands/info.ts +0 -178
  104. package/src/cli/commands/init.ts +0 -186
  105. package/src/cli/commands/list.ts +0 -156
  106. package/src/cli/commands/new.ts +0 -316
  107. package/src/cli/index.ts +0 -116
  108. package/src/core/config.ts +0 -172
  109. package/src/core/context.ts +0 -212
  110. package/src/core/types.ts +0 -184
  111. package/src/templates/index.ts +0 -162
  112. package/src/types/gradient-string.d.ts +0 -25
  113. package/src/ui/colors.ts +0 -139
  114. package/src/ui/output.ts +0 -230
  115. package/src/ui/prompts.ts +0 -170
  116. package/src/ui/spinners.ts +0 -95
  117. package/src/ui/types.ts +0 -41
  118. package/src/utils/filesystem.ts +0 -222
  119. package/src/utils/logger.ts +0 -67
  120. package/src/utils/object.ts +0 -456
  121. package/src/utils/validation.ts +0 -345
  122. package/tsconfig.json +0 -25
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Clean, minimal Vite-style project creation command
3
+ */
4
+ import { text, select, confirm, isCancel, cancel, spinner } from '@clack/prompts';
5
+ import { generateProject } from '../../core/generator.js';
6
+ import { buildDefaultProjectContext, buildTemplateContext } from '../../core/context.js';
7
+ import { exists } from '../../utils/filesystem.js';
8
+ import { getAllTemplates, getTemplateMetadata } from '../../templates/index.js';
9
+ import pc from 'picocolors';
10
+ import { resolve, isAbsolute } from 'path';
11
+ import { platform } from 'os';
12
+ /**
13
+ * Normalize path for cross-platform compatibility
14
+ */
15
+ function normalizePath(path) {
16
+ if (!path || path.trim() === '') {
17
+ return path;
18
+ }
19
+ const trimmed = path.trim();
20
+ // On Windows, convert Unix-style paths like /d/... to D:\...
21
+ if (platform() === 'win32') {
22
+ const unixPathMatch = trimmed.match(/^\/([a-zA-Z])\/(.*)$/);
23
+ if (unixPathMatch && unixPathMatch[1] && unixPathMatch[2]) {
24
+ return `${unixPathMatch[1].toUpperCase()}:\\${unixPathMatch[2].replace(/\//g, '\\')}`;
25
+ }
26
+ }
27
+ // Force relative paths to be relative to current directory
28
+ if (!isAbsolute(trimmed)) {
29
+ return resolve(trimmed);
30
+ }
31
+ return trimmed;
32
+ }
33
+ /**
34
+ * Create a new Android project with clean minimal UI
35
+ */
36
+ export async function createCommand(options = {}) {
37
+ // ============================================
38
+ // Step 1: App Name
39
+ // ============================================
40
+ console.log('');
41
+ let appName;
42
+ const nameResult = await text({
43
+ message: ' ? Project name:',
44
+ placeholder: 'MyApp',
45
+ defaultValue: 'MyApp',
46
+ });
47
+ if (isCancel(nameResult)) {
48
+ cancel();
49
+ return;
50
+ }
51
+ appName = nameResult.trim();
52
+ if (!appName || !/^[a-zA-Z]/.test(appName)) {
53
+ console.log(pc.red('\n ✘ Project name must start with a letter\n'));
54
+ return;
55
+ }
56
+ // ============================================
57
+ // Step 2: Template Selection
58
+ // ============================================
59
+ const templates = getAllTemplates();
60
+ const templateOptions = templates.map(t => ({
61
+ label: t.name,
62
+ value: t.id,
63
+ hint: t.language === 'kotlin' ? 'Kotlin' : 'Java'
64
+ }));
65
+ const templateResult = await select({
66
+ message: ' ? Select template:',
67
+ options: templateOptions
68
+ });
69
+ if (isCancel(templateResult)) {
70
+ cancel();
71
+ return;
72
+ }
73
+ const selectedTemplate = templateResult;
74
+ const selectedMeta = getTemplateMetadata(selectedTemplate);
75
+ // ============================================
76
+ // Step 3: Package Name
77
+ // ============================================
78
+ const defaultPackage = `com.example.${appName.toLowerCase().replace(/[^a-z0-9]/g, '')}`;
79
+ const packageResult = await text({
80
+ message: ' ? Package name:',
81
+ placeholder: defaultPackage,
82
+ defaultValue: defaultPackage,
83
+ });
84
+ if (isCancel(packageResult)) {
85
+ cancel();
86
+ return;
87
+ }
88
+ const packageName = packageResult.trim().toLowerCase();
89
+ if (!packageName || !/^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$/.test(packageName)) {
90
+ console.log(pc.red('\n ✘ Invalid package name format (e.g., com.example.myapp)\n'));
91
+ return;
92
+ }
93
+ // ============================================
94
+ // Step 4: Directory
95
+ // ============================================
96
+ const dirResult = await text({
97
+ message: ' ? Where to create the project:',
98
+ placeholder: 'D:\\Projects\\Android',
99
+ defaultValue: 'D:\\Projects\\Android',
100
+ });
101
+ if (isCancel(dirResult)) {
102
+ cancel();
103
+ return;
104
+ }
105
+ // Normalize and append app name as project folder
106
+ let baseDir = dirResult.trim();
107
+ if (!baseDir) {
108
+ console.log(pc.red('\n ✘ Directory path cannot be empty\n'));
109
+ return;
110
+ }
111
+ baseDir = normalizePath(baseDir);
112
+ // Ensure the directory path ends properly (no trailing slash issues)
113
+ let projectDirectory;
114
+ // If the path is ./something, append app name
115
+ if (baseDir.startsWith('./') || baseDir === '.') {
116
+ const baseName = baseDir === '.' ? '' : baseDir.slice(1).replace(/^[\\\/]/, '');
117
+ projectDirectory = baseName
118
+ ? `${baseName}/${appName.toLowerCase().replace(/[^a-z0-9]/g, '-')}`
119
+ : `./${appName.toLowerCase().replace(/[^a-z0-9]/g, '-')}`;
120
+ }
121
+ else {
122
+ // For absolute paths, append app name + sanitize
123
+ projectDirectory = `${baseDir}\\${appName.toLowerCase().replace(/[^a-z0-9]/g, '-')}`;
124
+ }
125
+ // Check if directory exists
126
+ const dirExists = await exists(projectDirectory);
127
+ if (dirExists) {
128
+ if (!options.force) {
129
+ console.log(pc.red(`\n ✘ Directory already exists: ${projectDirectory}`));
130
+ console.log(pc.gray(' Use --force to overwrite\n'));
131
+ return;
132
+ }
133
+ }
134
+ // ============================================
135
+ // Step 5: Summary & Confirm
136
+ // ============================================
137
+ console.log('');
138
+ console.log(pc.gray('─').repeat(50));
139
+ console.log('');
140
+ console.log(` ${pc.cyan('Project:')} ${pc.bold(appName)}`);
141
+ console.log(` ${pc.cyan('Template:')} ${selectedMeta?.name}`);
142
+ console.log(` ${pc.cyan('Package:')} ${packageName}`);
143
+ console.log(` ${pc.cyan('Path:')} ${projectDirectory}`);
144
+ console.log('');
145
+ const shouldCreate = await confirm({
146
+ message: ' Create project?',
147
+ initialValue: true
148
+ });
149
+ if (isCancel(shouldCreate)) {
150
+ cancel();
151
+ return;
152
+ }
153
+ if (!shouldCreate) {
154
+ console.log(pc.gray('\n Cancelled.\n'));
155
+ return;
156
+ }
157
+ // ============================================
158
+ // Generate Project
159
+ // ============================================
160
+ console.log('');
161
+ const s = spinner();
162
+ s.start(' Creating project...');
163
+ // Build context
164
+ const baseContext = buildDefaultProjectContext(appName, packageName, projectDirectory, selectedTemplate, { git: true, readme: true, androidX: true, kotlinDsl: true });
165
+ const context = buildTemplateContext({
166
+ appName: baseContext.appName,
167
+ packageName: baseContext.packageName,
168
+ projectDirectory: baseContext.projectDirectory,
169
+ template: baseContext.template,
170
+ uiFramework: baseContext.uiFramework,
171
+ language: baseContext.language,
172
+ android: baseContext.android,
173
+ gradle: baseContext.gradle,
174
+ features: baseContext,
175
+ nativeCpp: baseContext.nativeCpp
176
+ });
177
+ // Generate the project
178
+ const result = await generateProject(context, {
179
+ overwrite: options.force ?? false,
180
+ dryRun: false,
181
+ skipInstall: false,
182
+ verbose: false
183
+ });
184
+ s.stop(' Done!');
185
+ if (result.success) {
186
+ console.log('');
187
+ console.log(pc.green(` ✓ Project "${appName}" created`));
188
+ console.log(pc.gray('─'.repeat(50)));
189
+ console.log('');
190
+ console.log(pc.gray(` cd ${projectDirectory}`));
191
+ console.log(pc.gray(' ./gradlew assembleDebug'));
192
+ console.log(pc.gray(' studio .'));
193
+ console.log('');
194
+ }
195
+ else {
196
+ console.log(pc.red('\n ✘ Failed to create project'));
197
+ result.errors.forEach(err => {
198
+ console.log(` ${pc.red('•')} ${err.file ? `${err.file}: ` : ''}${err.message}`);
199
+ });
200
+ console.log('');
201
+ }
202
+ }
203
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,IAAI,EACJ,MAAM,EACN,OAAO,EACP,QAAQ,EACR,MAAM,EACN,OAAO,EACR,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,MAAM,EAAmB,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEhF,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAE9B;;GAEG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,6DAA6D;IAC7D,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC5D,IAAI,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QACxF,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAA+B,EAAE;IACnE,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,OAAe,CAAC;IACpB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;QAC5B,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,OAAO;QACpB,YAAY,EAAE,OAAO;KACtB,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACzB,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,6BAA6B;IAC7B,+CAA+C;IAC/C,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IAEpC,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1C,KAAK,EAAE,CAAC,CAAC,IAAI;QACb,KAAK,EAAE,CAAC,CAAC,EAAE;QACX,IAAI,EAAE,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;KAClD,CAAC,CAAC,CAAC;IAEJ,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC;QAClC,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC7B,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,cAA8B,CAAC;IACxD,MAAM,YAAY,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAE3D,+CAA+C;IAC/C,uBAAuB;IACvB,+CAA+C;IAC/C,MAAM,cAAc,GAAG,eAAe,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC;IAExF,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC;QAC/B,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,cAAc;QAC3B,YAAY,EAAE,cAAc;KAC7B,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5B,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvD,IAAI,CAAC,WAAW,IAAI,CAAC,uCAAuC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,oBAAoB;IACpB,+CAA+C;IAC/C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC;QAC3B,OAAO,EAAE,kCAAkC;QAC3C,WAAW,EAAE,uBAAuB;QACpC,YAAY,EAAE,uBAAuB;KACtC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED,kDAAkD;IAClD,IAAI,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAE/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEjC,qEAAqE;IACrE,IAAI,gBAAwB,CAAC;IAE7B,8CAA8C;IAC9C,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAChF,gBAAgB,GAAG,QAAQ;YACzB,CAAC,CAAC,GAAG,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE;YACnE,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,iDAAiD;QACjD,gBAAgB,GAAG,GAAG,OAAO,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC;IACvF,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACjD,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,mCAAmC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,4BAA4B;IAC5B,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;QACjC,OAAO,EAAE,mBAAmB;QAC5B,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3B,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAEjC,gBAAgB;IAChB,MAAM,WAAW,GAAG,0BAA0B,CAC5C,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAC7D,CAAC;IAEF,MAAM,OAAO,GAAG,oBAAoB,CAAC;QACnC,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;QAC9C,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;QAC1B,QAAQ,EAAE,WAAiD;QAC3D,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE;QAC5C,SAAS,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;QACjC,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAElB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,OAAO,WAAW,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Template info command - shows detailed information about templates
3
+ */
4
+ interface InfoCommandOptions {
5
+ template?: string;
6
+ json: boolean;
7
+ }
8
+ /**
9
+ * Show detailed info about a template
10
+ */
11
+ export declare function createInfoCommand(template?: string, options?: InfoCommandOptions): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,GAAE,kBAAoC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAyCf"}
@@ -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"}