@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.
- package/LICENSE +21 -0
- package/README.md +132 -0
- package/bin/tachles.js +2 -0
- package/dist/api/client.d.ts +18 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +94 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/types.d.ts +100 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +19 -0
- package/dist/api/types.js.map +1 -0
- package/dist/commands/install.d.ts +9 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +155 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/recipe/executor.d.ts +12 -0
- package/dist/recipe/executor.d.ts.map +1 -0
- package/dist/recipe/executor.js +115 -0
- package/dist/recipe/executor.js.map +1 -0
- package/dist/recipe/prompter.d.ts +7 -0
- package/dist/recipe/prompter.d.ts.map +1 -0
- package/dist/recipe/prompter.js +41 -0
- package/dist/recipe/prompter.js.map +1 -0
- package/dist/utils/auth.d.ts +5 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +15 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-manager.d.ts +2 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +15 -0
- package/dist/utils/package-manager.js.map +1 -0
- 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,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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|