@tachles/starter 1.0.4 → 1.1.1
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/README.md +20 -0
- package/dist/api/client.d.ts +1 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +8 -0
- package/dist/api/client.js.map +1 -1
- package/dist/api/client.test.d.ts +2 -0
- package/dist/api/client.test.d.ts.map +1 -0
- package/dist/api/client.test.js +51 -0
- package/dist/api/client.test.js.map +1 -0
- package/dist/api/types.d.ts +1 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +31 -38
- package/dist/commands/install.js.map +1 -1
- package/dist/recipe/executor.d.ts +7 -1
- package/dist/recipe/executor.d.ts.map +1 -1
- package/dist/recipe/executor.js +165 -51
- package/dist/recipe/executor.js.map +1 -1
- package/dist/recipe/executor.test.d.ts +2 -0
- package/dist/recipe/executor.test.d.ts.map +1 -0
- package/dist/recipe/executor.test.js +234 -0
- package/dist/recipe/executor.test.js.map +1 -0
- package/dist/utils/security-config-guide.d.ts +93 -0
- package/dist/utils/security-config-guide.d.ts.map +1 -0
- package/dist/utils/security-config-guide.js +56 -0
- package/dist/utils/security-config-guide.js.map +1 -0
- package/dist/utils/security.d.ts +83 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +268 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/security.test.d.ts +2 -0
- package/dist/utils/security.test.d.ts.map +1 -0
- package/dist/utils/security.test.js +358 -0
- package/dist/utils/security.test.js.map +1 -0
- package/package.json +27 -14
package/README.md
CHANGED
|
@@ -32,6 +32,26 @@ npx @tachles/starter <template-id> -y
|
|
|
32
32
|
- `-y` - Skip prompts and use default values
|
|
33
33
|
- `--template-help` - Display template information without installing
|
|
34
34
|
|
|
35
|
+
## Security
|
|
36
|
+
|
|
37
|
+
This CLI includes comprehensive security measures to protect against malicious templates:
|
|
38
|
+
|
|
39
|
+
- ✅ **Command Validation** - Dangerous commands are blocked
|
|
40
|
+
- ✅ **Package Validation** - Malicious package names are rejected
|
|
41
|
+
- ✅ **Rate Limiting** - API abuse prevention
|
|
42
|
+
- ✅ **Execution Limits** - Prevents resource exhaustion
|
|
43
|
+
- ✅ **Input Sanitization** - All inputs are sanitized before execution
|
|
44
|
+
|
|
45
|
+
**Security Features:**
|
|
46
|
+
- Blocks dangerous patterns (`rm -rf`, shell injection, path traversal)
|
|
47
|
+
- Validates all packages and commands before execution
|
|
48
|
+
- Enforces timeouts on long-running operations
|
|
49
|
+
- Limits number of packages and commands per recipe
|
|
50
|
+
|
|
51
|
+
📖 **Learn more:** [Security Documentation](SECURITY.md) | [Security Quick Reference](SECURITY-QUICKSTART.md)
|
|
52
|
+
|
|
53
|
+
⚠️ **Important:** Always review templates from untrusted sources before installation.
|
|
54
|
+
|
|
35
55
|
## What It Does
|
|
36
56
|
|
|
37
57
|
1. Fetches template configuration from Tachles platform
|
package/dist/api/client.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export declare class TachlesAPIClient {
|
|
|
7
7
|
private client;
|
|
8
8
|
private baseURL;
|
|
9
9
|
private verbose;
|
|
10
|
+
private static rateLimiter;
|
|
10
11
|
constructor(baseURL?: string, verbose?: boolean);
|
|
11
12
|
private logCacheInfo;
|
|
12
13
|
fetchTemplate(templateId: string, options?: FetchOptions): Promise<FetchTemplateResponse & {
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAKlF,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;IACzB,OAAO,CAAC,MAAM,CAAC,WAAW,CAA8B;gBAE5C,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;IA+CvD,kBAAkB,CAAC,IAAI,EAAE,kBAAkB;IAKjD,UAAU,CAAC,OAAO,EAAE,OAAO;CAG5B"}
|
package/dist/api/client.js
CHANGED
|
@@ -2,10 +2,12 @@ import axios from 'axios';
|
|
|
2
2
|
import { getAuthToken } from '../utils/auth.js';
|
|
3
3
|
import { API_BASE_URL } from '../constants.js';
|
|
4
4
|
import { logInfo, logWarning } from '../utils/logger.js';
|
|
5
|
+
import { RateLimiter } from '../utils/security.js';
|
|
5
6
|
export class TachlesAPIClient {
|
|
6
7
|
client;
|
|
7
8
|
baseURL;
|
|
8
9
|
verbose;
|
|
10
|
+
static rateLimiter = new RateLimiter(60000, 20); // 20 requests per minute
|
|
9
11
|
constructor(baseURL, verbose = false) {
|
|
10
12
|
this.baseURL = baseURL || API_BASE_URL;
|
|
11
13
|
this.verbose = verbose;
|
|
@@ -55,6 +57,12 @@ export class TachlesAPIClient {
|
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
async fetchTemplate(templateId, options = {}) {
|
|
60
|
+
// Check rate limit
|
|
61
|
+
const rateLimitKey = `fetch:${templateId}`;
|
|
62
|
+
if (!TachlesAPIClient.rateLimiter.isAllowed(rateLimitKey)) {
|
|
63
|
+
const remaining = TachlesAPIClient.rateLimiter.getRemaining(rateLimitKey);
|
|
64
|
+
throw new Error(`Rate limit exceeded. Too many requests for template "${templateId}". Please wait a moment and try again.`);
|
|
65
|
+
}
|
|
58
66
|
const params = {};
|
|
59
67
|
const headers = {};
|
|
60
68
|
// Add version parameter if specified
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../src/api/client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { TachlesAPIClient } from './client.js';
|
|
2
|
+
describe('API Client Security Tests', () => {
|
|
3
|
+
let client;
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
client = new TachlesAPIClient(undefined, false);
|
|
6
|
+
});
|
|
7
|
+
describe('Rate Limiting', () => {
|
|
8
|
+
it('should enforce rate limits on template fetches', async () => {
|
|
9
|
+
const templateId = 'test-template';
|
|
10
|
+
// Make requests up to the limit
|
|
11
|
+
const promises = [];
|
|
12
|
+
for (let i = 0; i < 20; i++) {
|
|
13
|
+
promises.push(client.fetchTemplate(templateId).catch((err) => err));
|
|
14
|
+
}
|
|
15
|
+
await Promise.all(promises);
|
|
16
|
+
// Next request should be rate limited
|
|
17
|
+
await expect(client.fetchTemplate(templateId)).rejects.toThrow('Rate limit exceeded');
|
|
18
|
+
});
|
|
19
|
+
it('should track rate limits per template', async () => {
|
|
20
|
+
const promises = [];
|
|
21
|
+
// Exhaust limit for template1
|
|
22
|
+
for (let i = 0; i < 20; i++) {
|
|
23
|
+
promises.push(client.fetchTemplate('template1').catch((err) => err));
|
|
24
|
+
}
|
|
25
|
+
await Promise.all(promises);
|
|
26
|
+
// template1 should be rate limited
|
|
27
|
+
await expect(client.fetchTemplate('template1')).rejects.toThrow('Rate limit exceeded');
|
|
28
|
+
// template2 should still work
|
|
29
|
+
// This would require a mock, so we just verify the concept
|
|
30
|
+
expect(true).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('Request Timeout', () => {
|
|
34
|
+
it('should timeout long requests', async () => {
|
|
35
|
+
// The axios client is configured with a 30s timeout
|
|
36
|
+
// This test would require mocking to properly test
|
|
37
|
+
expect(true).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('Authentication', () => {
|
|
41
|
+
it('should include auth token when available', () => {
|
|
42
|
+
// This would require mocking the auth module
|
|
43
|
+
expect(true).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
it('should handle 401 responses appropriately', () => {
|
|
46
|
+
// This would require mocking axios
|
|
47
|
+
expect(true).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/api/client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,MAAwB,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,UAAU,GAAG,eAAe,CAAC;YAEnC,gCAAgC;YAChC,MAAM,QAAQ,GAAG,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CACrD,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE5B,sCAAsC;YACtC,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5D,qBAAqB,CACtB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,QAAQ,GAAG,EAAE,CAAC;YAEpB,8BAA8B;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CACtD,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE5B,mCAAmC;YACnC,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC7D,qBAAqB,CACtB,CAAC;YAEF,8BAA8B;YAC9B,2DAA2D;YAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,oDAAoD;YACpD,mDAAmD;YACnD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,6CAA6C;YAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,mCAAmC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/api/types.d.ts
CHANGED
package/dist/api/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,gBAAgB,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CAC9C;AAGD,eAAO,MAAM,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAiBxD,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,aAAa,EAAE,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAOA,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,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,iBAgFxB"}
|
package/dist/commands/install.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import chalk from
|
|
2
|
-
import ora from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { RecipeExecutor } from '../recipe/executor.js';
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { TachlesAPIClient } from "../api/client.js";
|
|
4
|
+
import { RecipePrompter } from "../recipe/prompter.js";
|
|
5
|
+
import { RecipeExecutor } from "../recipe/executor.js";
|
|
7
6
|
export async function installTemplate(templateArg, options) {
|
|
8
7
|
// Parse template@version syntax
|
|
9
8
|
const { templateId, version } = parseTemplateArg(templateArg);
|
|
10
|
-
const spinner = ora(
|
|
9
|
+
const spinner = ora("Fetching template...").start();
|
|
11
10
|
try {
|
|
12
11
|
const api = new TachlesAPIClient(undefined, options.verbose);
|
|
13
12
|
// Fetch template with options
|
|
@@ -18,12 +17,16 @@ export async function installTemplate(templateArg, options) {
|
|
|
18
17
|
// Show cache information
|
|
19
18
|
if (response.cacheInfo) {
|
|
20
19
|
const cacheStatus = response.cacheInfo.status;
|
|
21
|
-
const cacheIcon = cacheStatus ===
|
|
22
|
-
const versionStr = response.data.version
|
|
20
|
+
const cacheIcon = cacheStatus === "HIT" ? "⚡" : cacheStatus === "MISS" ? "💾" : "📡";
|
|
21
|
+
const versionStr = response.data.version
|
|
22
|
+
? `(v${response.data.version})`
|
|
23
|
+
: "";
|
|
23
24
|
spinner.succeed(`${cacheIcon} Fetched template: ${templateId} ${versionStr} [Cache: ${cacheStatus}]`);
|
|
24
25
|
}
|
|
25
26
|
else {
|
|
26
|
-
const versionStr = response.data.version
|
|
27
|
+
const versionStr = response.data.version
|
|
28
|
+
? `(v${response.data.version})`
|
|
29
|
+
: "";
|
|
27
30
|
spinner.succeed(`Fetched template: ${templateId} ${versionStr}`);
|
|
28
31
|
}
|
|
29
32
|
const recipe = response.data.recipe;
|
|
@@ -41,37 +44,26 @@ export async function installTemplate(templateArg, options) {
|
|
|
41
44
|
// Execute recipe
|
|
42
45
|
const executor = new RecipeExecutor(selections, options.yes);
|
|
43
46
|
await executor.execute(recipe);
|
|
44
|
-
|
|
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'));
|
|
47
|
+
console.log(chalk.green("\\n✨ Template installed successfully!\\n"));
|
|
55
48
|
// Show next steps
|
|
56
49
|
if (recipe.envKeys && recipe.envKeys.length > 0) {
|
|
57
|
-
console.log(chalk.blue(
|
|
58
|
-
console.log(chalk.dim(
|
|
59
|
-
console.log(chalk.dim(
|
|
50
|
+
console.log(chalk.blue("Next steps:"));
|
|
51
|
+
console.log(chalk.dim("1. Configure your environment variables in .env"));
|
|
52
|
+
console.log(chalk.dim("2. Start your development server"));
|
|
60
53
|
console.log();
|
|
61
54
|
}
|
|
62
55
|
}
|
|
63
56
|
catch (error) {
|
|
64
|
-
spinner.fail(
|
|
57
|
+
spinner.fail("Installation failed");
|
|
65
58
|
if (error.response?.status === 404) {
|
|
66
59
|
console.error(chalk.red(`\n❌ Template "${templateId}" not found`));
|
|
67
60
|
}
|
|
68
61
|
else if (error.response?.status === 401) {
|
|
69
|
-
console.error(chalk.red(
|
|
62
|
+
console.error(chalk.red("\n❌ Authentication required for this template"));
|
|
70
63
|
}
|
|
71
64
|
else {
|
|
72
65
|
console.error(chalk.red(`\n❌ ${error.message}\n`));
|
|
73
66
|
}
|
|
74
|
-
throw error;
|
|
75
67
|
}
|
|
76
68
|
}
|
|
77
69
|
/**
|
|
@@ -79,7 +71,7 @@ export async function installTemplate(templateArg, options) {
|
|
|
79
71
|
* Supports: "template-name" or "template-name@1.2.0"
|
|
80
72
|
*/
|
|
81
73
|
function parseTemplateArg(templateArg) {
|
|
82
|
-
const atIndex = templateArg.lastIndexOf(
|
|
74
|
+
const atIndex = templateArg.lastIndexOf("@");
|
|
83
75
|
// No @ symbol, just template ID
|
|
84
76
|
if (atIndex === -1) {
|
|
85
77
|
return { templateId: templateArg };
|
|
@@ -88,7 +80,7 @@ function parseTemplateArg(templateArg) {
|
|
|
88
80
|
const templateId = templateArg.substring(0, atIndex);
|
|
89
81
|
const version = templateArg.substring(atIndex + 1);
|
|
90
82
|
// Validate version format (basic check)
|
|
91
|
-
if (!version || version.trim() ===
|
|
83
|
+
if (!version || version.trim() === "") {
|
|
92
84
|
return { templateId: templateArg }; // Treat as no version
|
|
93
85
|
}
|
|
94
86
|
return { templateId, version };
|
|
@@ -96,11 +88,12 @@ function parseTemplateArg(templateArg) {
|
|
|
96
88
|
function getDefaultSelections(variables) {
|
|
97
89
|
const selections = {};
|
|
98
90
|
for (const variable of variables) {
|
|
99
|
-
if (variable.type ===
|
|
91
|
+
if (variable.type === "confirm") {
|
|
100
92
|
selections[variable.key] = variable.defaultValue ?? true;
|
|
101
93
|
}
|
|
102
|
-
else if (variable.type ===
|
|
103
|
-
selections[variable.key] =
|
|
94
|
+
else if (variable.type === "select") {
|
|
95
|
+
selections[variable.key] =
|
|
96
|
+
variable.defaultValue || variable.options[0].value;
|
|
104
97
|
}
|
|
105
98
|
}
|
|
106
99
|
return selections;
|
|
@@ -121,26 +114,26 @@ function displayTemplateHelp(templateId, version, metadata, variables) {
|
|
|
121
114
|
}
|
|
122
115
|
console.log();
|
|
123
116
|
}
|
|
124
|
-
console.log(chalk.blue(
|
|
117
|
+
console.log(chalk.blue("Configuration Options:\\n"));
|
|
125
118
|
for (const variable of variables) {
|
|
126
|
-
if (variable.type ===
|
|
119
|
+
if (variable.type === "confirm") {
|
|
127
120
|
console.log(chalk.bold(` ${variable.label}`));
|
|
128
121
|
console.log(chalk.dim(` Type: Yes/No`));
|
|
129
|
-
console.log(chalk.dim(` Default: ${variable.defaultValue ?
|
|
122
|
+
console.log(chalk.dim(` Default: ${variable.defaultValue ? "Yes" : "No"}`));
|
|
130
123
|
console.log();
|
|
131
124
|
}
|
|
132
|
-
else if (variable.type ===
|
|
125
|
+
else if (variable.type === "select") {
|
|
133
126
|
console.log(chalk.bold(` ${variable.label}`));
|
|
134
127
|
console.log(chalk.dim(` Type: Select one`));
|
|
135
128
|
console.log(chalk.dim(` Options:`));
|
|
136
129
|
variable.options.forEach((opt) => {
|
|
137
|
-
const isDefault = opt.value === variable.defaultValue ?
|
|
130
|
+
const isDefault = opt.value === variable.defaultValue ? " (default)" : "";
|
|
138
131
|
console.log(chalk.dim(` - ${opt.label}${isDefault}`));
|
|
139
132
|
});
|
|
140
133
|
console.log();
|
|
141
134
|
}
|
|
142
135
|
}
|
|
143
|
-
console.log(chalk.blue(
|
|
136
|
+
console.log(chalk.blue("Usage:\\n"));
|
|
144
137
|
console.log(chalk.dim(` npx @tachles/starter ${templateId}`));
|
|
145
138
|
console.log(chalk.dim(` npx @tachles/starter ${templateId}@${version}`));
|
|
146
139
|
console.log(chalk.dim(` npx @tachles/starter ${templateId} -y # Use defaults`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,15 @@ export declare class RecipeExecutor {
|
|
|
4
4
|
private skipYes;
|
|
5
5
|
constructor(selections: Record<string, string | boolean>, skipYes?: boolean);
|
|
6
6
|
execute(recipe: Recipe): Promise<void>;
|
|
7
|
+
private calculateTotalSteps;
|
|
8
|
+
private countOperations;
|
|
7
9
|
private executeOperations;
|
|
8
10
|
private installPackages;
|
|
9
11
|
private setupEnvVariables;
|
|
10
|
-
private
|
|
12
|
+
private runCommand;
|
|
13
|
+
/**
|
|
14
|
+
* Validate entire recipe for security concerns
|
|
15
|
+
*/
|
|
16
|
+
private validateRecipeSecurity;
|
|
11
17
|
}
|
|
12
18
|
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/recipe/executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAuD,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/recipe/executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAuD,MAAM,iBAAiB,CAAC;AAI9F,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;IA+B5B,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,eAAe;YAQT,iBAAiB;YA2BjB,eAAe;YAoCf,iBAAiB;YAWjB,UAAU;IAoExB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CA0C/B"}
|