kappmaker 1.0.0

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 (103) hide show
  1. package/README.md +545 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +195 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/adapty-setup.d.ts +2 -0
  6. package/dist/commands/adapty-setup.js +240 -0
  7. package/dist/commands/adapty-setup.js.map +1 -0
  8. package/dist/commands/config.d.ts +12 -0
  9. package/dist/commands/config.js +230 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/create-appstore-app.d.ts +2 -0
  12. package/dist/commands/create-appstore-app.js +261 -0
  13. package/dist/commands/create-appstore-app.js.map +1 -0
  14. package/dist/commands/create-logo.d.ts +2 -0
  15. package/dist/commands/create-logo.js +93 -0
  16. package/dist/commands/create-logo.js.map +1 -0
  17. package/dist/commands/create.d.ts +2 -0
  18. package/dist/commands/create.js +143 -0
  19. package/dist/commands/create.js.map +1 -0
  20. package/dist/commands/enhance.d.ts +2 -0
  21. package/dist/commands/enhance.js +55 -0
  22. package/dist/commands/enhance.js.map +1 -0
  23. package/dist/commands/generate-screenshots.d.ts +2 -0
  24. package/dist/commands/generate-screenshots.js +174 -0
  25. package/dist/commands/generate-screenshots.js.map +1 -0
  26. package/dist/commands/remove-bg.d.ts +2 -0
  27. package/dist/commands/remove-bg.js +41 -0
  28. package/dist/commands/remove-bg.js.map +1 -0
  29. package/dist/commands/split.d.ts +2 -0
  30. package/dist/commands/split.js +37 -0
  31. package/dist/commands/split.js.map +1 -0
  32. package/dist/commands/translate-screenshots.d.ts +2 -0
  33. package/dist/commands/translate-screenshots.js +224 -0
  34. package/dist/commands/translate-screenshots.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.js +12 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/services/adapty.service.d.ts +26 -0
  39. package/dist/services/adapty.service.js +230 -0
  40. package/dist/services/adapty.service.js.map +1 -0
  41. package/dist/services/asc-monetization.service.d.ts +3 -0
  42. package/dist/services/asc-monetization.service.js +223 -0
  43. package/dist/services/asc-monetization.service.js.map +1 -0
  44. package/dist/services/asc.service.d.ts +14 -0
  45. package/dist/services/asc.service.js +321 -0
  46. package/dist/services/asc.service.js.map +1 -0
  47. package/dist/services/fal.service.d.ts +15 -0
  48. package/dist/services/fal.service.js +236 -0
  49. package/dist/services/fal.service.js.map +1 -0
  50. package/dist/services/fastlane.service.d.ts +2 -0
  51. package/dist/services/fastlane.service.js +32 -0
  52. package/dist/services/fastlane.service.js.map +1 -0
  53. package/dist/services/firebase.service.d.ts +7 -0
  54. package/dist/services/firebase.service.js +176 -0
  55. package/dist/services/firebase.service.js.map +1 -0
  56. package/dist/services/git.service.d.ts +3 -0
  57. package/dist/services/git.service.js +13 -0
  58. package/dist/services/git.service.js.map +1 -0
  59. package/dist/services/gradle.service.d.ts +4 -0
  60. package/dist/services/gradle.service.js +31 -0
  61. package/dist/services/gradle.service.js.map +1 -0
  62. package/dist/services/ios.service.d.ts +1 -0
  63. package/dist/services/ios.service.js +9 -0
  64. package/dist/services/ios.service.js.map +1 -0
  65. package/dist/services/logo.service.d.ts +12 -0
  66. package/dist/services/logo.service.js +168 -0
  67. package/dist/services/logo.service.js.map +1 -0
  68. package/dist/services/openai.service.d.ts +2 -0
  69. package/dist/services/openai.service.js +42 -0
  70. package/dist/services/openai.service.js.map +1 -0
  71. package/dist/services/screenshot-styles.d.ts +1 -0
  72. package/dist/services/screenshot-styles.js +1050 -0
  73. package/dist/services/screenshot-styles.js.map +1 -0
  74. package/dist/services/screenshot.service.d.ts +14 -0
  75. package/dist/services/screenshot.service.js +136 -0
  76. package/dist/services/screenshot.service.js.map +1 -0
  77. package/dist/templates/adapty-config.json +50 -0
  78. package/dist/templates/appstore-config.json +188 -0
  79. package/dist/types/adapty.d.ts +38 -0
  80. package/dist/types/adapty.js +2 -0
  81. package/dist/types/adapty.js.map +1 -0
  82. package/dist/types/appstore.d.ts +150 -0
  83. package/dist/types/appstore.js +2 -0
  84. package/dist/types/appstore.js.map +1 -0
  85. package/dist/types/index.d.ts +80 -0
  86. package/dist/types/index.js +2 -0
  87. package/dist/types/index.js.map +1 -0
  88. package/dist/utils/config.d.ts +18 -0
  89. package/dist/utils/config.js +107 -0
  90. package/dist/utils/config.js.map +1 -0
  91. package/dist/utils/exec.d.ts +17 -0
  92. package/dist/utils/exec.js +62 -0
  93. package/dist/utils/exec.js.map +1 -0
  94. package/dist/utils/logger.d.ts +10 -0
  95. package/dist/utils/logger.js +29 -0
  96. package/dist/utils/logger.js.map +1 -0
  97. package/dist/utils/prompt.d.ts +2 -0
  98. package/dist/utils/prompt.js +26 -0
  99. package/dist/utils/prompt.js.map +1 -0
  100. package/dist/utils/validator.d.ts +2 -0
  101. package/dist/utils/validator.js +93 -0
  102. package/dist/utils/validator.js.map +1 -0
  103. package/package.json +35 -0
@@ -0,0 +1,80 @@
1
+ export interface CreateOptions {
2
+ templateRepo?: string;
3
+ organization?: string;
4
+ }
5
+ export interface DerivedConfig {
6
+ appName: string;
7
+ appIdLower: string;
8
+ packageName: string;
9
+ firebaseProject: string;
10
+ targetDir: string;
11
+ templateRepo: string;
12
+ }
13
+ export interface FirebaseAppResult {
14
+ appId: string;
15
+ platform: 'ANDROID' | 'IOS';
16
+ }
17
+ export interface StepContext {
18
+ config: DerivedConfig;
19
+ mobileDir: string;
20
+ }
21
+ export interface KAppMakerConfig {
22
+ templateRepo: string;
23
+ bundleIdPrefix: string;
24
+ androidSdkPath: string;
25
+ organization: string;
26
+ falApiKey: string;
27
+ imgbbApiKey: string;
28
+ openaiApiKey: string;
29
+ ascAuthName: string;
30
+ ascKeyId: string;
31
+ ascIssuerId: string;
32
+ ascPrivateKeyPath: string;
33
+ appleId: string;
34
+ }
35
+ export interface CreateLogoOptions {
36
+ output?: string;
37
+ }
38
+ export interface SplitOptions {
39
+ rows?: number;
40
+ cols?: number;
41
+ zoom?: number;
42
+ gap?: number;
43
+ outputDir?: string;
44
+ width?: number;
45
+ height?: number;
46
+ keep?: number[];
47
+ }
48
+ export interface ExtractOptions {
49
+ zoom?: number;
50
+ gap?: number;
51
+ }
52
+ export interface RemoveBgOptions {
53
+ output?: string;
54
+ }
55
+ export interface EnhanceOptions {
56
+ output?: string;
57
+ }
58
+ export interface TranslateScreenshotsOptions {
59
+ output?: string;
60
+ locales?: string[];
61
+ rows?: number;
62
+ cols?: number;
63
+ resolution?: string;
64
+ pollInterval?: number;
65
+ }
66
+ export interface GenerateScreenshotsOptions {
67
+ prompt: string;
68
+ input?: string;
69
+ style?: number;
70
+ output?: string;
71
+ resolution?: string;
72
+ rows?: number;
73
+ cols?: number;
74
+ pollInterval?: number;
75
+ }
76
+ export interface FalQueueResponse {
77
+ request_id: string;
78
+ status_url: string;
79
+ response_url: string;
80
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import type { KAppMakerConfig } from '../types/index.js';
2
+ export declare function getConfigDir(): string;
3
+ export declare function getConfigPath(): string;
4
+ export declare function getDefaultConfig(): KAppMakerConfig;
5
+ export declare function loadConfig(): Promise<KAppMakerConfig>;
6
+ export declare function saveConfig(config: KAppMakerConfig): Promise<void>;
7
+ export declare function getConfigValue(key: keyof KAppMakerConfig): Promise<string>;
8
+ export declare function setConfigValue(key: keyof KAppMakerConfig, value: string): Promise<void>;
9
+ export declare function isValidConfigKey(key: string): key is keyof KAppMakerConfig;
10
+ export declare function getConfigKeys(): (keyof KAppMakerConfig)[];
11
+ export declare function getAppStoreDefaultsPath(): string;
12
+ export declare function getAppStoreTemplate(): Record<string, unknown>;
13
+ export declare function loadAppStoreDefaults(): Promise<Record<string, unknown> | null>;
14
+ export declare function saveAppStoreDefaults(defaults: Record<string, unknown>): Promise<void>;
15
+ export declare function getAdaptyDefaultsPath(): string;
16
+ export declare function getAdaptyTemplate(): Record<string, unknown>;
17
+ export declare function loadAdaptyDefaults(): Promise<Record<string, unknown> | null>;
18
+ export declare function saveAdaptyDefaults(defaults: Record<string, unknown>): Promise<void>;
@@ -0,0 +1,107 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ import fs from 'fs-extra';
4
+ import appStoreTemplate from '../templates/appstore-config.json' with { type: 'json' };
5
+ import adaptyTemplate from '../templates/adapty-config.json' with { type: 'json' };
6
+ const CONFIG_DIR = path.join(os.homedir(), '.config', 'kappmaker');
7
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
8
+ const APPSTORE_DEFAULTS_FILE = path.join(CONFIG_DIR, 'appstore-defaults.json');
9
+ const ADAPTY_DEFAULTS_FILE = path.join(CONFIG_DIR, 'adapty-defaults.json');
10
+ const DEFAULT_CONFIG = {
11
+ templateRepo: 'git@github.com:KAppMaker/KAppMaker-MobileAppAndWeb.git',
12
+ bundleIdPrefix: '',
13
+ androidSdkPath: path.join(os.homedir(), 'Library', 'Android', 'sdk'),
14
+ organization: '',
15
+ falApiKey: '',
16
+ imgbbApiKey: '',
17
+ openaiApiKey: '',
18
+ ascAuthName: 'KAppMaker',
19
+ ascKeyId: '',
20
+ ascIssuerId: '',
21
+ ascPrivateKeyPath: '',
22
+ appleId: '',
23
+ };
24
+ export function getConfigDir() {
25
+ return CONFIG_DIR;
26
+ }
27
+ export function getConfigPath() {
28
+ return CONFIG_FILE;
29
+ }
30
+ export function getDefaultConfig() {
31
+ return { ...DEFAULT_CONFIG };
32
+ }
33
+ export async function loadConfig() {
34
+ try {
35
+ if (await fs.pathExists(CONFIG_FILE)) {
36
+ const raw = await fs.readJson(CONFIG_FILE);
37
+ return { ...DEFAULT_CONFIG, ...raw };
38
+ }
39
+ }
40
+ catch {
41
+ // Corrupt or unreadable config — fall back to defaults
42
+ }
43
+ return { ...DEFAULT_CONFIG };
44
+ }
45
+ export async function saveConfig(config) {
46
+ await fs.ensureDir(CONFIG_DIR);
47
+ await fs.writeJson(CONFIG_FILE, config, { spaces: 2 });
48
+ }
49
+ export async function getConfigValue(key) {
50
+ const config = await loadConfig();
51
+ return config[key];
52
+ }
53
+ export async function setConfigValue(key, value) {
54
+ const config = await loadConfig();
55
+ config[key] = value;
56
+ await saveConfig(config);
57
+ }
58
+ export function isValidConfigKey(key) {
59
+ return key in DEFAULT_CONFIG;
60
+ }
61
+ export function getConfigKeys() {
62
+ return Object.keys(DEFAULT_CONFIG);
63
+ }
64
+ export function getAppStoreDefaultsPath() {
65
+ return APPSTORE_DEFAULTS_FILE;
66
+ }
67
+ export function getAppStoreTemplate() {
68
+ return JSON.parse(JSON.stringify(appStoreTemplate));
69
+ }
70
+ export async function loadAppStoreDefaults() {
71
+ try {
72
+ if (await fs.pathExists(APPSTORE_DEFAULTS_FILE)) {
73
+ return await fs.readJson(APPSTORE_DEFAULTS_FILE);
74
+ }
75
+ }
76
+ catch {
77
+ // Corrupt or unreadable — return null
78
+ }
79
+ return null;
80
+ }
81
+ export async function saveAppStoreDefaults(defaults) {
82
+ await fs.ensureDir(CONFIG_DIR);
83
+ await fs.writeJson(APPSTORE_DEFAULTS_FILE, defaults, { spaces: 2 });
84
+ }
85
+ // ── Adapty defaults ───────────────────────────────────────────────────
86
+ export function getAdaptyDefaultsPath() {
87
+ return ADAPTY_DEFAULTS_FILE;
88
+ }
89
+ export function getAdaptyTemplate() {
90
+ return JSON.parse(JSON.stringify(adaptyTemplate));
91
+ }
92
+ export async function loadAdaptyDefaults() {
93
+ try {
94
+ if (await fs.pathExists(ADAPTY_DEFAULTS_FILE)) {
95
+ return await fs.readJson(ADAPTY_DEFAULTS_FILE);
96
+ }
97
+ }
98
+ catch {
99
+ // Corrupt or unreadable — return null
100
+ }
101
+ return null;
102
+ }
103
+ export async function saveAdaptyDefaults(defaults) {
104
+ await fs.ensureDir(CONFIG_DIR);
105
+ await fs.writeJson(ADAPTY_DEFAULTS_FILE, defaults, { spaces: 2 });
106
+ }
107
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface ExecResult {
2
+ stdout: string;
3
+ stderr: string;
4
+ exitCode: number;
5
+ }
6
+ export declare function run(command: string, args: string[], options?: {
7
+ cwd?: string;
8
+ label?: string;
9
+ allowFailure?: boolean;
10
+ timeout?: number;
11
+ env?: Record<string, string>;
12
+ }): Promise<ExecResult>;
13
+ export declare function runStreaming(command: string, args: string[], options?: {
14
+ cwd?: string;
15
+ label?: string;
16
+ allowFailure?: boolean;
17
+ }): Promise<number>;
@@ -0,0 +1,62 @@
1
+ import { execa } from 'execa';
2
+ import ora from 'ora';
3
+ import { logger } from './logger.js';
4
+ function wasSignaled(result) {
5
+ return result.signal === 'SIGINT' || result.signal === 'SIGTERM' || result.killed === true;
6
+ }
7
+ export async function run(command, args, options) {
8
+ const label = options?.label ?? `${command} ${args.join(' ')}`;
9
+ const spinner = ora({ text: label, indent: 4 }).start();
10
+ try {
11
+ const result = await execa(command, args, {
12
+ cwd: options?.cwd,
13
+ reject: false,
14
+ timeout: options?.timeout ?? 10 * 60_000,
15
+ env: options?.env ? { ...process.env, ...options.env } : undefined,
16
+ });
17
+ if (wasSignaled(result)) {
18
+ spinner.stop();
19
+ process.exit(130);
20
+ }
21
+ if (result.exitCode !== 0 && !options?.allowFailure) {
22
+ spinner.fail(label);
23
+ if (result.stderr)
24
+ logger.error(result.stderr);
25
+ if (result.stdout)
26
+ logger.error(result.stdout);
27
+ process.exit(1);
28
+ }
29
+ spinner.succeed(label);
30
+ return {
31
+ stdout: result.stdout,
32
+ stderr: result.stderr,
33
+ exitCode: result.exitCode ?? 0,
34
+ };
35
+ }
36
+ catch (error) {
37
+ spinner.fail(label);
38
+ const message = error instanceof Error ? error.message : String(error);
39
+ logger.error(message);
40
+ process.exit(1);
41
+ }
42
+ }
43
+ export async function runStreaming(command, args, options) {
44
+ if (options?.label) {
45
+ logger.info(options.label);
46
+ }
47
+ const result = await execa(command, args, {
48
+ cwd: options?.cwd,
49
+ stdio: 'inherit',
50
+ reject: false,
51
+ });
52
+ if (wasSignaled(result)) {
53
+ process.exit(130);
54
+ }
55
+ const exitCode = result.exitCode ?? 1;
56
+ if (exitCode !== 0 && !options?.allowFailure) {
57
+ logger.error(`Command failed: ${command} ${args.join(' ')}`);
58
+ process.exit(1);
59
+ }
60
+ return exitCode;
61
+ }
62
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQrC,SAAS,WAAW,CAAC,MAA6C;IAChE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;AAC7F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,OAAe,EACf,IAAc,EACd,OAMC;IAED,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACxC,GAAG,EAAE,OAAO,EAAE,GAAG;YACjB,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,GAAG,MAAM;YACxC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;SACnE,CAAC,CAAC;QAEH,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,MAAM,CAAC,MAAM;gBAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,MAAM;gBAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;SAC/B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,IAAc,EACd,OAAkE;IAElE,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QACxC,GAAG,EAAE,OAAO,EAAE,GAAG;QACjB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAEtC,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const logger: {
2
+ step(number: number, total: number, message: string): void;
3
+ success(message: string): void;
4
+ info(message: string): void;
5
+ warn(message: string): void;
6
+ error(message: string): void;
7
+ fatal(message: string): void;
8
+ banner(appName: string): void;
9
+ done(): void;
10
+ };
@@ -0,0 +1,29 @@
1
+ import chalk from 'chalk';
2
+ export const logger = {
3
+ step(number, total, message) {
4
+ console.log(chalk.blue(`\n[${number}/${total}]`) + ` ${message}`);
5
+ },
6
+ success(message) {
7
+ console.log(chalk.green(' OK ') + message);
8
+ },
9
+ info(message) {
10
+ console.log(chalk.gray(' -- ') + message);
11
+ },
12
+ warn(message) {
13
+ console.log(chalk.yellow(' WARN ') + message);
14
+ },
15
+ error(message) {
16
+ console.error(chalk.red(' ERROR ') + message);
17
+ },
18
+ fatal(message) {
19
+ console.error(chalk.bgRed.white(' FATAL ') + ' ' + message);
20
+ },
21
+ banner(appName) {
22
+ console.log(chalk.bold.cyan('\n KAppMaker CLI'));
23
+ console.log(chalk.gray(` Creating app: ${appName}\n`));
24
+ },
25
+ done() {
26
+ console.log(chalk.green.bold('\n Done! Your app is ready.\n'));
27
+ },
28
+ };
29
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,CAAC,MAAc,EAAE,KAAa,EAAE,OAAe;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAClE,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function confirm(message: string): Promise<boolean>;
2
+ export declare function promptInput(message: string): Promise<string>;
@@ -0,0 +1,26 @@
1
+ import readline from 'node:readline';
2
+ export async function confirm(message) {
3
+ const rl = readline.createInterface({
4
+ input: process.stdin,
5
+ output: process.stdout,
6
+ });
7
+ return new Promise((resolve) => {
8
+ rl.question(`${message} (y/n) `, (answer) => {
9
+ rl.close();
10
+ resolve(answer.trim().toLowerCase() === 'y');
11
+ });
12
+ });
13
+ }
14
+ export async function promptInput(message) {
15
+ const rl = readline.createInterface({
16
+ input: process.stdin,
17
+ output: process.stdout,
18
+ });
19
+ return new Promise((resolve) => {
20
+ rl.question(message, (answer) => {
21
+ rl.close();
22
+ resolve(answer.trim());
23
+ });
24
+ });
25
+ }
26
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YAC9B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function validateDependencies(): Promise<void>;
2
+ export declare function validateAppName(name: string): void;
@@ -0,0 +1,93 @@
1
+ import { execa } from 'execa';
2
+ import chalk from 'chalk';
3
+ import { logger } from './logger.js';
4
+ import { confirm } from './prompt.js';
5
+ const REQUIRED_DEPS = [
6
+ {
7
+ command: 'git',
8
+ versionArg: '--version',
9
+ name: 'Git',
10
+ installCommand: 'xcode-select --install',
11
+ canAutoInstall: false,
12
+ },
13
+ {
14
+ command: 'firebase',
15
+ versionArg: '--version',
16
+ name: 'Firebase CLI',
17
+ installCommand: 'npm install -g firebase-tools',
18
+ canAutoInstall: true,
19
+ },
20
+ {
21
+ command: 'pod',
22
+ versionArg: '--version',
23
+ name: 'CocoaPods',
24
+ installCommand: 'sudo gem install cocoapods',
25
+ canAutoInstall: true,
26
+ },
27
+ {
28
+ command: 'bundle',
29
+ versionArg: '--version',
30
+ name: 'Bundler (for Fastlane)',
31
+ installCommand: 'gem install bundler',
32
+ canAutoInstall: true,
33
+ },
34
+ ];
35
+ async function tryInstall(dep) {
36
+ console.log('');
37
+ console.log(` ${chalk.red('x')} ${chalk.bold(dep.name)} is not installed.`);
38
+ if (!dep.canAutoInstall) {
39
+ console.log(` Please install it manually: ${chalk.cyan(dep.installCommand)}`);
40
+ return false;
41
+ }
42
+ console.log(` To install, this command will be run:`);
43
+ console.log(` ${chalk.cyan(dep.installCommand)}`);
44
+ console.log('');
45
+ const shouldInstall = await confirm(` Install ${dep.name}?`);
46
+ if (!shouldInstall) {
47
+ logger.warn(`Skipped installing ${dep.name}`);
48
+ return false;
49
+ }
50
+ const [cmd, ...args] = dep.installCommand.split(' ');
51
+ try {
52
+ logger.info(`Running: ${dep.installCommand}`);
53
+ await execa(cmd, args, { stdio: 'inherit' });
54
+ logger.success(`${dep.name} installed successfully`);
55
+ return true;
56
+ }
57
+ catch {
58
+ logger.error(`Failed to install ${dep.name}`);
59
+ console.log(` Try running manually: ${chalk.cyan(dep.installCommand)}`);
60
+ return false;
61
+ }
62
+ }
63
+ export async function validateDependencies() {
64
+ let hasFailure = false;
65
+ for (const dep of REQUIRED_DEPS) {
66
+ try {
67
+ await execa(dep.command, [dep.versionArg]);
68
+ }
69
+ catch {
70
+ const installed = await tryInstall(dep);
71
+ if (!installed) {
72
+ hasFailure = true;
73
+ }
74
+ }
75
+ }
76
+ if (hasFailure) {
77
+ console.log('');
78
+ logger.fatal('Some dependencies are missing. Please install them and try again.');
79
+ process.exit(1);
80
+ }
81
+ logger.success('All dependencies found');
82
+ }
83
+ export function validateAppName(name) {
84
+ if (!name || name.trim().length === 0) {
85
+ logger.fatal('App name is required.');
86
+ process.exit(1);
87
+ }
88
+ if (!/^[A-Z][a-zA-Z0-9]+$/.test(name)) {
89
+ logger.fatal('App name must start with an uppercase letter and contain only alphanumeric characters (e.g., "Remimi").');
90
+ process.exit(1);
91
+ }
92
+ }
93
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAUtC,MAAM,aAAa,GAAiB;IAClC;QACE,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,WAAW;QACvB,IAAI,EAAE,KAAK;QACX,cAAc,EAAE,wBAAwB;QACxC,cAAc,EAAE,KAAK;KACtB;IACD;QACE,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,WAAW;QACvB,IAAI,EAAE,cAAc;QACpB,cAAc,EAAE,+BAA+B;QAC/C,cAAc,EAAE,IAAI;KACrB;IACD;QACE,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,WAAW;QACvB,IAAI,EAAE,WAAW;QACjB,cAAc,EAAE,4BAA4B;QAC5C,cAAc,EAAE,IAAI;KACrB;IACD;QACE,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,WAAW;QACvB,IAAI,EAAE,wBAAwB;QAC9B,cAAc,EAAE,qBAAqB;QACrC,cAAc,EAAE,IAAI;KACrB;CACF,CAAC;AAEF,KAAK,UAAU,UAAU,CAAC,GAAe;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAE/E,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,qCAAqC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,iBAAiB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,IAAI,yBAAyB,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CACV,yGAAyG,CAC1G,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "kappmaker",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool for bootstrapping KAppMaker mobile apps",
5
+ "type": "module",
6
+ "bin": {
7
+ "kappmaker": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsx src/index.ts",
15
+ "start": "node dist/index.js"
16
+ },
17
+ "dependencies": {
18
+ "chalk": "^5.4.1",
19
+ "commander": "^13.1.0",
20
+ "execa": "^9.5.2",
21
+ "fs-extra": "^11.3.0",
22
+ "ora": "^8.2.0",
23
+ "sharp": "^0.34.5"
24
+ },
25
+ "devDependencies": {
26
+ "@types/fs-extra": "^11.0.4",
27
+ "@types/node": "^22.13.10",
28
+ "@types/sharp": "^0.31.1",
29
+ "tsx": "^4.19.3",
30
+ "typescript": "^5.8.2"
31
+ },
32
+ "engines": {
33
+ "node": ">=20"
34
+ }
35
+ }