@tachles/starter 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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/bin/tachles.js +2 -0
  4. package/dist/api/client.d.ts +18 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +94 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/types.d.ts +100 -0
  9. package/dist/api/types.d.ts.map +1 -0
  10. package/dist/api/types.js +19 -0
  11. package/dist/api/types.js.map +1 -0
  12. package/dist/commands/install.d.ts +9 -0
  13. package/dist/commands/install.d.ts.map +1 -0
  14. package/dist/commands/install.js +155 -0
  15. package/dist/commands/install.js.map +1 -0
  16. package/dist/constants.d.ts +4 -0
  17. package/dist/constants.d.ts.map +1 -0
  18. package/dist/constants.js +4 -0
  19. package/dist/constants.js.map +1 -0
  20. package/dist/index.d.ts +3 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +62 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/recipe/executor.d.ts +12 -0
  25. package/dist/recipe/executor.d.ts.map +1 -0
  26. package/dist/recipe/executor.js +115 -0
  27. package/dist/recipe/executor.js.map +1 -0
  28. package/dist/recipe/prompter.d.ts +7 -0
  29. package/dist/recipe/prompter.d.ts.map +1 -0
  30. package/dist/recipe/prompter.js +41 -0
  31. package/dist/recipe/prompter.js.map +1 -0
  32. package/dist/utils/auth.d.ts +5 -0
  33. package/dist/utils/auth.d.ts.map +1 -0
  34. package/dist/utils/auth.js +15 -0
  35. package/dist/utils/auth.js.map +1 -0
  36. package/dist/utils/logger.d.ts +5 -0
  37. package/dist/utils/logger.d.ts.map +1 -0
  38. package/dist/utils/logger.js +14 -0
  39. package/dist/utils/logger.js.map +1 -0
  40. package/dist/utils/package-manager.d.ts +2 -0
  41. package/dist/utils/package-manager.d.ts.map +1 -0
  42. package/dist/utils/package-manager.js +15 -0
  43. package/dist/utils/package-manager.js.map +1 -0
  44. package/package.json +54 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Yedidya Newlander
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,132 @@
1
+ # @tachles/starter
2
+
3
+ Official CLI tool for installing [Tachles](https://your-app.vercel.app) templates.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # Use directly with npx (recommended)
9
+ npx @tachles/starter <template-id>
10
+
11
+ # Or install globally
12
+ npm install -g @tachles/starter
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ### Install a Template
18
+
19
+ ```bash
20
+ # Basic usage
21
+ npx @tachles/starter <template-id>
22
+
23
+ # With version
24
+ npx @tachles/starter <template-id>@1.2.0
25
+
26
+ # Examples
27
+ npx @tachles/starter nextjs-prisma-shadcn
28
+ npx @tachles/starter nextjs-prisma-shadcn@1.2.0
29
+ ```
30
+
31
+ ### Get Template Information
32
+
33
+ ```bash
34
+ npx @tachles/starter <template-id> --template-help
35
+ ```
36
+
37
+ This will display:
38
+ - Template name and description
39
+ - Available configuration options
40
+ - Default values
41
+ - Usage examples
42
+
43
+ ### Skip Prompts (Use Defaults)
44
+
45
+ ```bash
46
+ npx @tachles/starter <template-id> -y
47
+ ```
48
+
49
+ ### Advanced Options
50
+
51
+ #### Install Specific Version (@ syntax)
52
+ ```bash
53
+ # Using @ syntax
54
+ npx @tachles/starter nextjs-prisma-shadcn@1.2.0
55
+
56
+ # Still works with --version flag
57
+ npx @tachles/starter nextjs-prisma-shadcn --version 1.2.0
58
+ ```
59
+
60
+ #### Force Refresh from Database (Bypass Cache)
61
+ ```bash
62
+ npx @tachles/starter <template-id> --force-refresh
63
+ ```
64
+
65
+ Use this when:
66
+ - You want the absolute latest version from the database
67
+ - Cache might be stale
68
+ - Testing template updates
69
+
70
+ #### Verbose Mode (Show Cache Information)
71
+ ```bash
72
+ npx @tachles/starter <template-id> --verbose
73
+ ```
74
+
75
+ Shows:
76
+ - Cache status (HIT/MISS)
77
+ - Cache source (redis/database)
78
+ - Cache age and TTL
79
+ - API response details
80
+
81
+ ## Examples
82
+
83
+ ```bash
84
+ # Install Next.js + Prisma + shadcn/ui template
85
+ npx @tachles/starter nextjs-prisma-shadcn
86
+
87
+ # Install specific version with @ syntax
88
+ npx @tachles/starter nextjs-prisma-shadcn@1.2.0
89
+
90
+ # Get information about the template first
91
+ npx @tachles/starter nextjs-prisma-shadcn --template-help
92
+
93
+ # Install with default answers
94
+ npx @tachles/starter nextjs-prisma-shadcn -y
95
+
96
+ # Force refresh from database (bypass Redis cache)
97
+ npx @tachles/starter nextjs-prisma-shadcn --force-refresh
98
+
99
+ # Show detailed cache information
100
+ npx @tachles/starter nextjs-prisma-shadcn --verbose
101
+
102
+ # Combine options
103
+ npx @tachles/starter nextjs-prisma-shadcn@1.2.0 -y --verbose
104
+ ```
105
+
106
+ # Combine options
107
+ npx @tachles/starter nextjs-prisma-shadcn -y --verbose --force-refresh
108
+ ```
109
+
110
+ ## What It Does
111
+
112
+ 1. Fetches template recipe from Tachles platform
113
+ 2. Asks setup questions interactively
114
+ 3. Installs packages based on your answers
115
+ 4. Runs commands (prisma init, etc.)
116
+ 5. Sets up environment variables
117
+ 6. Reports installation statistics
118
+
119
+ ## Requirements
120
+
121
+ - Node.js 18 or higher
122
+ - npm, yarn, or pnpm
123
+
124
+ ## Support
125
+
126
+ - Browse Templates: https://your-app.vercel.app/templates
127
+ - Documentation: https://your-app.vercel.app/docs
128
+ - Issues: https://github.com/your-org/tachles-cli/issues
129
+
130
+ ## License
131
+
132
+ MIT
package/bin/tachles.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/index.js';
@@ -0,0 +1,18 @@
1
+ import { FetchTemplateResponse, InstallationReport, CacheInfo } from './types.js';
2
+ export interface FetchOptions {
3
+ forceRefresh?: boolean;
4
+ version?: string;
5
+ }
6
+ export declare class TachlesAPIClient {
7
+ private client;
8
+ private baseURL;
9
+ private verbose;
10
+ constructor(baseURL?: string, verbose?: boolean);
11
+ private logCacheInfo;
12
+ fetchTemplate(templateId: string, options?: FetchOptions): Promise<FetchTemplateResponse & {
13
+ cacheInfo?: CacheInfo;
14
+ }>;
15
+ reportInstallation(data: InstallationReport): Promise<any>;
16
+ setVerbose(verbose: boolean): void;
17
+ }
18
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGlF,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,UAAQ;IAuC7C,OAAO,CAAC,YAAY;IAmBd,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,qBAAqB,GAAG;QAAE,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IAsCvD,kBAAkB,CAAC,IAAI,EAAE,kBAAkB;IAKjD,UAAU,CAAC,OAAO,EAAE,OAAO;CAG5B"}
@@ -0,0 +1,94 @@
1
+ import axios from 'axios';
2
+ import { getAuthToken } from '../utils/auth.js';
3
+ import { API_BASE_URL } from '../constants.js';
4
+ import { logInfo, logWarning } from '../utils/logger.js';
5
+ export class TachlesAPIClient {
6
+ client;
7
+ baseURL;
8
+ verbose;
9
+ constructor(baseURL, verbose = false) {
10
+ this.baseURL = baseURL || API_BASE_URL;
11
+ this.verbose = verbose;
12
+ this.client = axios.create({
13
+ baseURL: this.baseURL,
14
+ timeout: 30000,
15
+ headers: {
16
+ 'Content-Type': 'application/json',
17
+ 'User-Agent': '@tachles/starter-cli/1.0.0',
18
+ },
19
+ });
20
+ // Add auth interceptor
21
+ this.client.interceptors.request.use((config) => {
22
+ const token = getAuthToken();
23
+ if (token) {
24
+ config.headers.Authorization = `Bearer ${token}`;
25
+ }
26
+ return config;
27
+ });
28
+ // Add response interceptor for cache logging
29
+ this.client.interceptors.response.use((response) => {
30
+ if (this.verbose) {
31
+ this.logCacheInfo(response);
32
+ }
33
+ return response;
34
+ }, (error) => {
35
+ if (this.verbose && error.response) {
36
+ this.logCacheInfo(error.response);
37
+ }
38
+ throw error;
39
+ });
40
+ }
41
+ logCacheInfo(response) {
42
+ const cacheStatus = response.headers['x-cache-status'];
43
+ const cacheSource = response.headers['x-cache-source'];
44
+ const cacheKey = response.headers['x-cache-key'];
45
+ const cacheAge = response.headers['x-cache-age'];
46
+ if (cacheStatus) {
47
+ const statusColor = cacheStatus === 'HIT' ? '✅' : '⚠️';
48
+ logInfo(`${statusColor} Cache: ${cacheStatus} from ${cacheSource || 'unknown'}`);
49
+ if (cacheKey) {
50
+ logInfo(` Key: ${cacheKey}`);
51
+ }
52
+ if (cacheAge) {
53
+ logInfo(` Age: ${cacheAge}s`);
54
+ }
55
+ }
56
+ }
57
+ async fetchTemplate(templateId, options = {}) {
58
+ const params = {};
59
+ const headers = {};
60
+ // Add version parameter if specified
61
+ if (options.version) {
62
+ params.version = options.version;
63
+ }
64
+ // Add cache control headers
65
+ if (options.forceRefresh) {
66
+ headers['Cache-Control'] = 'no-cache';
67
+ headers['X-Force-Refresh'] = 'true';
68
+ if (this.verbose) {
69
+ logWarning('⚡ Forcing cache refresh from database');
70
+ }
71
+ }
72
+ const response = await this.client.get(`/api/cli/templates/${templateId}`, { params, headers });
73
+ // Extract cache information from response headers
74
+ const cacheInfo = {
75
+ status: response.headers['x-cache-status'] || 'UNKNOWN',
76
+ source: response.headers['x-cache-source'] || 'unknown',
77
+ key: response.headers['x-cache-key'],
78
+ age: response.headers['x-cache-age'] ? parseInt(response.headers['x-cache-age']) : undefined,
79
+ ttl: response.headers['x-cache-ttl'] ? parseInt(response.headers['x-cache-ttl']) : undefined,
80
+ };
81
+ return {
82
+ ...response.data,
83
+ cacheInfo,
84
+ };
85
+ }
86
+ async reportInstallation(data) {
87
+ const response = await this.client.post('/api/cli/installations', data);
88
+ return response.data;
89
+ }
90
+ setVerbose(verbose) {
91
+ this.verbose = verbose;
92
+ }
93
+ }
94
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import { z } from 'zod';
2
+ export interface CacheInfo {
3
+ status: string;
4
+ source: string;
5
+ key?: string;
6
+ age?: number;
7
+ ttl?: number;
8
+ }
9
+ export interface TemplateMetadata {
10
+ templateId: string;
11
+ version: string;
12
+ name: string;
13
+ description: string;
14
+ author?: string;
15
+ homepage?: string;
16
+ }
17
+ export interface FetchTemplateResponse {
18
+ success: boolean;
19
+ data: {
20
+ templateId: string;
21
+ version: string;
22
+ recipe: Recipe;
23
+ metadata?: TemplateMetadata;
24
+ };
25
+ }
26
+ export interface InstallationReport {
27
+ templateId: string;
28
+ templateVersion: string;
29
+ projectId: string;
30
+ originUrl?: string;
31
+ selections: Record<string, string | boolean>;
32
+ }
33
+ export declare const WhenConditionSchema: z.ZodType<WhenCondition>;
34
+ export type WhenCondition = {
35
+ type: 'always';
36
+ } | {
37
+ type: 'varEquals';
38
+ key: string;
39
+ value: string | boolean;
40
+ } | {
41
+ type: 'and';
42
+ items: WhenCondition[];
43
+ } | {
44
+ type: 'or';
45
+ items: WhenCondition[];
46
+ };
47
+ export interface Package {
48
+ name: string;
49
+ version: string;
50
+ }
51
+ export interface EnvVariable {
52
+ key: string;
53
+ description: string;
54
+ required?: boolean;
55
+ }
56
+ export interface Command {
57
+ runner?: 'npx' | 'npm' | 'yarn' | 'pnpm' | 'custom';
58
+ packageName: string;
59
+ commandArgs: string;
60
+ customCommand?: string;
61
+ description?: string;
62
+ }
63
+ export interface Operations {
64
+ packages?: Package[];
65
+ envVariables?: EnvVariable[];
66
+ commands?: Command[];
67
+ }
68
+ export interface ConfirmVariable {
69
+ type: 'confirm';
70
+ key: string;
71
+ label: string;
72
+ defaultValue?: boolean;
73
+ onTrue?: Operations;
74
+ onFalse?: Operations;
75
+ }
76
+ export interface SelectOption {
77
+ label: string;
78
+ value: string;
79
+ operations?: Operations;
80
+ }
81
+ export interface SelectVariable {
82
+ type: 'select';
83
+ key: string;
84
+ label: string;
85
+ options: SelectOption[];
86
+ defaultValue?: string;
87
+ }
88
+ export type Variable = ConfirmVariable | SelectVariable;
89
+ export interface Recipe {
90
+ engine: string;
91
+ variables: Variable[];
92
+ steps?: any[];
93
+ installationGroups?: any[];
94
+ verifiedPackages?: string[];
95
+ envKeys?: Array<{
96
+ key: string;
97
+ description: string;
98
+ }>;
99
+ }
100
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ // Recipe types
3
+ export const WhenConditionSchema = z.lazy(() => z.discriminatedUnion('type', [
4
+ z.object({ type: z.literal('always') }),
5
+ z.object({
6
+ type: z.literal('varEquals'),
7
+ key: z.string(),
8
+ value: z.union([z.string(), z.boolean()]),
9
+ }),
10
+ z.object({
11
+ type: z.literal('and'),
12
+ items: z.array(WhenConditionSchema),
13
+ }),
14
+ z.object({
15
+ type: z.literal('or'),
16
+ items: z.array(WhenConditionSchema),
17
+ }),
18
+ ]));
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqCxB,eAAe;AACf,MAAM,CAAC,MAAM,mBAAmB,GAA6B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CACvE,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC3B,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvC,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QAC5B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KAC1C,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QACtB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;KACpC,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACrB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;KACpC,CAAC;CACH,CAAC,CACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface InstallOptions {
2
+ yes?: boolean;
3
+ forceRefresh?: boolean;
4
+ verbose?: boolean;
5
+ templateHelp?: boolean;
6
+ }
7
+ export declare function installTemplate(templateArg: string, options: InstallOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAQA,UAAU,cAAc;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,iBAoFjF"}
@@ -0,0 +1,155 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { createHash } from 'crypto';
4
+ import { TachlesAPIClient } from '../api/client.js';
5
+ import { RecipePrompter } from '../recipe/prompter.js';
6
+ import { RecipeExecutor } from '../recipe/executor.js';
7
+ export async function installTemplate(templateArg, options) {
8
+ // Parse template@version syntax
9
+ const { templateId, version } = parseTemplateArg(templateArg);
10
+ const spinner = ora('Fetching template...').start();
11
+ try {
12
+ const api = new TachlesAPIClient(undefined, options.verbose);
13
+ // Fetch template with options
14
+ const response = await api.fetchTemplate(templateId, {
15
+ version,
16
+ forceRefresh: options.forceRefresh,
17
+ });
18
+ // Show cache information
19
+ if (response.cacheInfo) {
20
+ const cacheStatus = response.cacheInfo.status;
21
+ const cacheIcon = cacheStatus === 'HIT' ? '⚡' : cacheStatus === 'MISS' ? '💾' : '📡';
22
+ const versionStr = response.data.version ? `(v${response.data.version})` : '';
23
+ spinner.succeed(`${cacheIcon} Fetched template: ${templateId} ${versionStr} [Cache: ${cacheStatus}]`);
24
+ }
25
+ else {
26
+ const versionStr = response.data.version ? `(v${response.data.version})` : '';
27
+ spinner.succeed(`Fetched template: ${templateId} ${versionStr}`);
28
+ }
29
+ const recipe = response.data.recipe;
30
+ const metadata = response.data.metadata;
31
+ // If --template-help flag is provided, show template information
32
+ if (options.templateHelp) {
33
+ displayTemplateHelp(templateId, response.data.version, metadata, recipe.variables);
34
+ return;
35
+ }
36
+ // Prompt user for selections
37
+ const prompter = new RecipePrompter();
38
+ const selections = options.yes
39
+ ? getDefaultSelections(recipe.variables)
40
+ : await prompter.prompt(recipe.variables);
41
+ // Execute recipe
42
+ const executor = new RecipeExecutor(selections, options.yes);
43
+ await executor.execute(recipe);
44
+ // Report installation
45
+ const projectId = createHash('sha256')
46
+ .update(process.cwd())
47
+ .digest('hex');
48
+ await api.reportInstallation({
49
+ templateId,
50
+ templateVersion: response.data.version,
51
+ projectId,
52
+ selections,
53
+ });
54
+ console.log(chalk.green('\\n✨ Template installed successfully!\\n'));
55
+ // Show next steps
56
+ if (recipe.envKeys && recipe.envKeys.length > 0) {
57
+ console.log(chalk.blue('Next steps:'));
58
+ console.log(chalk.dim('1. Configure your environment variables in .env'));
59
+ console.log(chalk.dim('2. Start your development server'));
60
+ console.log();
61
+ }
62
+ }
63
+ catch (error) {
64
+ spinner.fail('Installation failed');
65
+ if (error.response?.status === 404) {
66
+ console.error(chalk.red(`\\n❌ Template "${templateId}" not found\\n`));
67
+ console.log(chalk.dim('Visit https://your-app.vercel.app/templates to browse available templates\\n'));
68
+ }
69
+ else if (error.response?.status === 401) {
70
+ console.error(chalk.red('\\n❌ Authentication required for this template\\n'));
71
+ console.log(chalk.dim('Run: npx @tachles/starter login\\n'));
72
+ }
73
+ else {
74
+ console.error(chalk.red(`\\n❌ ${error.message}\\n`));
75
+ }
76
+ throw error;
77
+ }
78
+ }
79
+ /**
80
+ * Parse template argument to extract template ID and version
81
+ * Supports: "template-name" or "template-name@1.2.0"
82
+ */
83
+ function parseTemplateArg(templateArg) {
84
+ const atIndex = templateArg.lastIndexOf('@');
85
+ // No @ symbol, just template ID
86
+ if (atIndex === -1) {
87
+ return { templateId: templateArg };
88
+ }
89
+ // Has @ symbol - split into template ID and version
90
+ const templateId = templateArg.substring(0, atIndex);
91
+ const version = templateArg.substring(atIndex + 1);
92
+ // Validate version format (basic check)
93
+ if (!version || version.trim() === '') {
94
+ return { templateId: templateArg }; // Treat as no version
95
+ }
96
+ return { templateId, version };
97
+ }
98
+ function getDefaultSelections(variables) {
99
+ const selections = {};
100
+ for (const variable of variables) {
101
+ if (variable.type === 'confirm') {
102
+ selections[variable.key] = variable.defaultValue ?? true;
103
+ }
104
+ else if (variable.type === 'select') {
105
+ selections[variable.key] = variable.defaultValue || variable.options[0].value;
106
+ }
107
+ }
108
+ return selections;
109
+ }
110
+ function displayTemplateHelp(templateId, version, metadata, variables) {
111
+ console.log(chalk.blue(`\\n📦 Template: ${templateId}`));
112
+ console.log(chalk.dim(`Version: ${version}\\n`));
113
+ if (metadata) {
114
+ if (metadata.name) {
115
+ console.log(chalk.bold(metadata.name));
116
+ }
117
+ if (metadata.description) {
118
+ console.log(chalk.dim(metadata.description));
119
+ console.log();
120
+ }
121
+ if (metadata.author) {
122
+ console.log(chalk.dim(`Author: ${metadata.author}`));
123
+ }
124
+ if (metadata.homepage) {
125
+ console.log(chalk.dim(`Homepage: ${metadata.homepage}`));
126
+ }
127
+ console.log();
128
+ }
129
+ console.log(chalk.blue('Configuration Options:\\n'));
130
+ for (const variable of variables) {
131
+ if (variable.type === 'confirm') {
132
+ console.log(chalk.bold(` ${variable.label}`));
133
+ console.log(chalk.dim(` Type: Yes/No`));
134
+ console.log(chalk.dim(` Default: ${variable.defaultValue ? 'Yes' : 'No'}`));
135
+ console.log();
136
+ }
137
+ else if (variable.type === 'select') {
138
+ console.log(chalk.bold(` ${variable.label}`));
139
+ console.log(chalk.dim(` Type: Select one`));
140
+ console.log(chalk.dim(` Options:`));
141
+ variable.options.forEach((opt) => {
142
+ const isDefault = opt.value === variable.defaultValue ? ' (default)' : '';
143
+ console.log(chalk.dim(` - ${opt.label}${isDefault}`));
144
+ });
145
+ console.log();
146
+ }
147
+ }
148
+ console.log(chalk.blue('Usage:\\n'));
149
+ console.log(chalk.dim(` npx @tachles/starter ${templateId}`));
150
+ console.log(chalk.dim(` npx @tachles/starter ${templateId}@${version}`));
151
+ console.log(chalk.dim(` npx @tachles/starter ${templateId} -y # Use defaults`));
152
+ console.log(chalk.dim(` npx @tachles/starter ${templateId} --verbose # Show cache info`));
153
+ console.log();
154
+ }
155
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const API_BASE_URL: string;
2
+ export declare const CLI_NAME = "@tachles/starter";
3
+ export declare const CLI_VERSION = "1.0.0";
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,QAAmE,CAAC;AAC7F,eAAO,MAAM,QAAQ,qBAAqB,CAAC;AAC3C,eAAO,MAAM,WAAW,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const API_BASE_URL = process.env.TACHLES_API_URL || 'https://starter.tachles.dev/api';
2
+ export const CLI_NAME = '@tachles/starter';
3
+ export const CLI_VERSION = '1.0.0';
4
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,iCAAiC,CAAC;AAC7F,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+ import chalk from 'chalk';
3
+ import updateNotifier from 'update-notifier';
4
+ import { readFileSync } from 'fs';
5
+ import { fileURLToPath } from 'url';
6
+ import { dirname, join } from 'path';
7
+ import { installTemplate } from './commands/install';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+ // Read package.json for version
11
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));
12
+ // Check for updates
13
+ updateNotifier({ pkg: packageJson }).notify();
14
+ // Parse command line arguments
15
+ const args = process.argv.slice(2);
16
+ // Handle --version flag
17
+ if (args.includes('--version') || args.includes('-v')) {
18
+ console.log(packageJson.version);
19
+ process.exit(0);
20
+ }
21
+ // Handle --help flag (no template specified)
22
+ if ((args.includes('--help') || args.includes('-h')) && args.length === 1) {
23
+ console.log(chalk.blue('\n@tachles/starter - CLI tool for installing Tachles templates\n'));
24
+ console.log(chalk.bold('Usage:'));
25
+ console.log(chalk.dim(' npx @tachles/starter <template-id>[@version] [options]\n'));
26
+ console.log(chalk.bold('Examples:'));
27
+ console.log(chalk.dim(' npx @tachles/starter nextjs-prisma-shadcn'));
28
+ console.log(chalk.dim(' npx @tachles/starter nextjs-prisma-shadcn@1.2.0'));
29
+ console.log(chalk.dim(' npx @tachles/starter my-template -y'));
30
+ console.log(chalk.dim(' npx @tachles/starter my-template --verbose\n'));
31
+ console.log(chalk.bold('Options:'));
32
+ console.log(chalk.dim(' -y, --yes Skip all prompts and use defaults'));
33
+ console.log(chalk.dim(' --force-refresh Force refresh from database (bypass cache)'));
34
+ console.log(chalk.dim(' --verbose Show detailed cache and API information'));
35
+ console.log(chalk.dim(' --template-help Display help information for the template'));
36
+ console.log(chalk.dim(' -h, --help Display this help message'));
37
+ console.log(chalk.dim(' -v, --version Display version number\n'));
38
+ process.exit(0);
39
+ }
40
+ // Extract template ID (first non-flag argument)
41
+ const templateArg = args.find(arg => !arg.startsWith('-'));
42
+ if (!templateArg) {
43
+ console.error(chalk.red('\n❌ Error: Template ID is required\n'));
44
+ console.log(chalk.blue('Usage: npx @tachles/starter <template-id>[@version] [options]\n'));
45
+ console.log(chalk.dim('Example: npx @tachles/starter nextjs-prisma-shadcn'));
46
+ console.log(chalk.dim('Example: npx @tachles/starter nextjs-prisma-shadcn@1.2.0\n'));
47
+ console.log(chalk.dim('Run "npx @tachles/starter --help" for more information\n'));
48
+ process.exit(1);
49
+ }
50
+ // Parse options
51
+ const options = {
52
+ yes: args.includes('-y') || args.includes('--yes'),
53
+ forceRefresh: args.includes('--force-refresh'),
54
+ verbose: args.includes('--verbose'),
55
+ templateHelp: args.includes('--template-help'),
56
+ };
57
+ // Run installation
58
+ installTemplate(templateArg, options).catch((error) => {
59
+ console.error(chalk.red(`\n❌ ${error.message}\n`));
60
+ process.exit(1);
61
+ });
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Recipe } from '../api/types.js';
2
+ export declare class RecipeExecutor {
3
+ private selections;
4
+ private skipYes;
5
+ constructor(selections: Record<string, string | boolean>, skipYes?: boolean);
6
+ execute(recipe: Recipe): Promise<void>;
7
+ private executeOperations;
8
+ private installPackages;
9
+ private setupEnvVariables;
10
+ private runCommands;
11
+ }
12
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/recipe/executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAuD,MAAM,iBAAiB,CAAC;AAG9F,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,OAAO,CAAU;gBAEb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,OAAO,UAAQ;IAKnE,OAAO,CAAC,MAAM,EAAE,MAAM;YAwBd,iBAAiB;YAiBjB,eAAe;YAsBf,iBAAiB;YAUjB,WAAW;CA+C1B"}
@@ -0,0 +1,115 @@
1
+ import { execa } from 'execa';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { detectPackageManager } from '../utils/package-manager.js';
5
+ export class RecipeExecutor {
6
+ selections;
7
+ skipYes;
8
+ constructor(selections, skipYes = false) {
9
+ this.selections = selections;
10
+ this.skipYes = skipYes;
11
+ }
12
+ async execute(recipe) {
13
+ console.log(chalk.blue('\n📦 Installing dependencies...\n'));
14
+ for (const variable of recipe.variables) {
15
+ if (variable.type === 'confirm') {
16
+ const answer = this.selections[variable.key];
17
+ const operations = answer ? variable.onTrue : variable.onFalse;
18
+ if (operations) {
19
+ await this.executeOperations(operations);
20
+ }
21
+ }
22
+ else if (variable.type === 'select') {
23
+ const answer = this.selections[variable.key];
24
+ const option = variable.options.find((opt) => opt.value === answer);
25
+ if (option?.operations) {
26
+ await this.executeOperations(option.operations);
27
+ }
28
+ }
29
+ }
30
+ console.log(chalk.green('\n✅ Installation complete!\n'));
31
+ }
32
+ async executeOperations(operations) {
33
+ // Install packages
34
+ if (operations.packages && operations.packages.length > 0) {
35
+ await this.installPackages(operations.packages);
36
+ }
37
+ // Set env variables
38
+ if (operations.envVariables && operations.envVariables.length > 0) {
39
+ await this.setupEnvVariables(operations.envVariables);
40
+ }
41
+ // Run commands
42
+ if (operations.commands && operations.commands.length > 0) {
43
+ await this.runCommands(operations.commands);
44
+ }
45
+ }
46
+ async installPackages(packages) {
47
+ const pm = detectPackageManager();
48
+ const spinner = ora('Installing packages...').start();
49
+ try {
50
+ const packageStrings = packages.map((pkg) => pkg.version === 'latest' ? pkg.name : `${pkg.name}@${pkg.version}`);
51
+ const installCmd = pm === 'npm' ? 'install' : 'add';
52
+ await execa(pm, [installCmd, ...packageStrings], {
53
+ stdio: 'inherit',
54
+ cwd: process.cwd(),
55
+ });
56
+ spinner.succeed(`Installed: ${packageStrings.join(', ')}`);
57
+ }
58
+ catch (error) {
59
+ spinner.fail('Package installation failed');
60
+ throw error;
61
+ }
62
+ }
63
+ async setupEnvVariables(envVars) {
64
+ console.log(chalk.yellow('\n⚙️ Environment Variables Setup\n'));
65
+ for (const envVar of envVars) {
66
+ console.log(chalk.dim(`${envVar.key}: ${envVar.description}`));
67
+ }
68
+ console.log(chalk.dim('\nPlease add these variables to your .env file manually.\n'));
69
+ }
70
+ async runCommands(commands) {
71
+ for (const cmd of commands) {
72
+ const spinner = ora(cmd.description || 'Running command...').start();
73
+ try {
74
+ if (cmd.runner === 'custom' && cmd.customCommand) {
75
+ // Execute custom shell command
76
+ await execa(cmd.customCommand, {
77
+ shell: true,
78
+ stdio: this.skipYes ? 'pipe' : 'inherit',
79
+ cwd: process.cwd(),
80
+ });
81
+ }
82
+ else {
83
+ // Execute package manager command
84
+ const runner = cmd.runner || 'npx';
85
+ const fullCommand = `${cmd.packageName} ${cmd.commandArgs}`.trim();
86
+ const args = fullCommand.split(' ');
87
+ await execa(runner, args, {
88
+ stdio: this.skipYes ? 'pipe' : 'inherit',
89
+ cwd: process.cwd(),
90
+ });
91
+ }
92
+ spinner.succeed(cmd.description || 'Command completed');
93
+ }
94
+ catch (error) {
95
+ spinner.fail('Command failed');
96
+ // Ask user if they want to continue
97
+ if (!this.skipYes) {
98
+ const inquirer = (await import('inquirer')).default;
99
+ const answer = await inquirer.prompt([
100
+ {
101
+ type: 'confirm',
102
+ name: 'continue',
103
+ message: 'Continue with remaining steps?',
104
+ default: true,
105
+ },
106
+ ]);
107
+ if (!answer.continue) {
108
+ throw new Error('Installation aborted by user');
109
+ }
110
+ }
111
+ }
112
+ }
113
+ }
114
+ }
115
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/recipe/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Variable } from '../api/types.js';
2
+ export declare class RecipePrompter {
3
+ private selections;
4
+ prompt(variables: Variable[]): Promise<Record<string, string | boolean>>;
5
+ getSelections(): Record<string, string | boolean>;
6
+ }
7
+ //# sourceMappingURL=prompter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompter.d.ts","sourceRoot":"","sources":["../../src/recipe/prompter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAwC;IAEpD,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IAkC9E,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CAGlD"}
@@ -0,0 +1,41 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ export class RecipePrompter {
4
+ selections = {};
5
+ async prompt(variables) {
6
+ console.log(chalk.blue('\n🎯 Template Setup\n'));
7
+ for (const variable of variables) {
8
+ if (variable.type === 'confirm') {
9
+ const answer = await inquirer.prompt([
10
+ {
11
+ type: 'confirm',
12
+ name: 'value',
13
+ message: variable.label,
14
+ default: variable.defaultValue ?? true,
15
+ },
16
+ ]);
17
+ this.selections[variable.key] = answer.value;
18
+ }
19
+ else if (variable.type === 'select') {
20
+ const answer = await inquirer.prompt([
21
+ {
22
+ type: 'list',
23
+ name: 'value',
24
+ message: variable.label,
25
+ choices: variable.options.map((opt) => ({
26
+ name: opt.label,
27
+ value: opt.value,
28
+ })),
29
+ default: variable.defaultValue,
30
+ },
31
+ ]);
32
+ this.selections[variable.key] = answer.value;
33
+ }
34
+ }
35
+ return this.selections;
36
+ }
37
+ getSelections() {
38
+ return this.selections;
39
+ }
40
+ }
41
+ //# sourceMappingURL=prompter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompter.js","sourceRoot":"","sources":["../../src/recipe/prompter.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,OAAO,cAAc;IACjB,UAAU,GAAqC,EAAE,CAAC;IAE1D,KAAK,CAAC,MAAM,CAAC,SAAqB;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAEjD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;oBACnC;wBACE,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,QAAQ,CAAC,KAAK;wBACvB,OAAO,EAAE,QAAQ,CAAC,YAAY,IAAI,IAAI;qBACvC;iBACF,CAAC,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YAC/C,CAAC;iBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;oBACnC;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,QAAQ,CAAC,KAAK;wBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;4BACtC,IAAI,EAAE,GAAG,CAAC,KAAK;4BACf,KAAK,EAAE,GAAG,CAAC,KAAK;yBACjB,CAAC,CAAC;wBACH,OAAO,EAAE,QAAQ,CAAC,YAAY;qBAC/B;iBACF,CAAC,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export declare function setAuthToken(token: string): void;
2
+ export declare function getAuthToken(): string | undefined;
3
+ export declare function clearAuthToken(): void;
4
+ export declare function isAuthenticated(): boolean;
5
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,QAEzC;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED,wBAAgB,cAAc,SAE7B;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
@@ -0,0 +1,15 @@
1
+ import Conf from 'conf';
2
+ const config = new Conf({ projectName: 'tachles-cli' });
3
+ export function setAuthToken(token) {
4
+ config.set('authToken', token);
5
+ }
6
+ export function getAuthToken() {
7
+ return config.get('authToken');
8
+ }
9
+ export function clearAuthToken() {
10
+ config.delete('authToken');
11
+ }
12
+ export function isAuthenticated() {
13
+ return !!getAuthToken();
14
+ }
15
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;AAExD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,CAAuB,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function logInfo(message: string): void;
2
+ export declare function logSuccess(message: string): void;
3
+ export declare function logError(message: string): void;
4
+ export declare function logWarning(message: string): void;
5
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,QAEtC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,QAEzC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,QAEvC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,QAEzC"}
@@ -0,0 +1,14 @@
1
+ import chalk from 'chalk';
2
+ export function logInfo(message) {
3
+ console.log(chalk.blue(message));
4
+ }
5
+ export function logSuccess(message) {
6
+ console.log(chalk.green(message));
7
+ }
8
+ export function logError(message) {
9
+ console.error(chalk.red(message));
10
+ }
11
+ export function logWarning(message) {
12
+ console.warn(chalk.yellow(message));
13
+ }
14
+ //# 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,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function detectPackageManager(): 'npm' | 'yarn' | 'pnpm';
2
+ //# sourceMappingURL=package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,IAAI,KAAK,GAAG,MAAM,GAAG,MAAM,CAa9D"}
@@ -0,0 +1,15 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ export function detectPackageManager() {
4
+ const cwd = process.cwd();
5
+ // Check for lockfiles
6
+ if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) {
7
+ return 'pnpm';
8
+ }
9
+ if (fs.existsSync(path.join(cwd, 'yarn.lock'))) {
10
+ return 'yarn';
11
+ }
12
+ // Default to npm
13
+ return 'npm';
14
+ }
15
+ //# sourceMappingURL=package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,sBAAsB;IACtB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iBAAiB;IACjB,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@tachles/starter",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool for installing Tachles templates",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "tachles": "./bin/tachles.js"
8
+ },
9
+ "type": "module",
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "bin"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "prepublishOnly": "npm run build",
21
+ "test": "jest"
22
+ },
23
+ "keywords": ["cli", "template", "starter", "setup", "tachles", "scaffolding"],
24
+ "author": "Tachles",
25
+ "license": "MIT",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/DiDiTech-IL/starter-npm"
29
+ },
30
+ "homepage": "https://starter.tachles.dev",
31
+ "bugs": {
32
+ "url": "https://github.com/DiDiTech-IL/starter-npm/issues"
33
+ },
34
+ "dependencies": {
35
+ "commander": "^12.0.0",
36
+ "inquirer": "^10.0.0",
37
+ "chalk": "^5.3.0",
38
+ "ora": "^8.0.0",
39
+ "axios": "^1.7.0",
40
+ "zod": "^3.23.8",
41
+ "execa": "^9.0.0",
42
+ "conf": "^13.0.0",
43
+ "update-notifier": "^7.0.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^22.0.0",
47
+ "@types/inquirer": "^9.0.0",
48
+ "typescript": "^5.7.0",
49
+ "jest": "^29.0.0"
50
+ },
51
+ "engines": {
52
+ "node": ">=18.0.0"
53
+ }
54
+ }