@ketrics/ketrics-cli 0.5.0 → 0.6.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/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +6 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/create.d.ts +1 -0
- package/dist/src/commands/create.d.ts.map +1 -1
- package/dist/src/commands/create.js +44 -13
- package/dist/src/commands/create.js.map +1 -1
- package/dist/src/services/local-template-service.d.ts +52 -0
- package/dist/src/services/local-template-service.d.ts.map +1 -0
- package/dist/src/services/local-template-service.js +216 -0
- package/dist/src/services/local-template-service.js.map +1 -0
- package/dist/src/services/remote-template-service.d.ts +41 -0
- package/dist/src/services/remote-template-service.d.ts.map +1 -0
- package/dist/src/services/remote-template-service.js +232 -0
- package/dist/src/services/remote-template-service.js.map +1 -0
- package/dist/src/services/template-cache-service.d.ts +44 -0
- package/dist/src/services/template-cache-service.d.ts.map +1 -0
- package/dist/src/services/template-cache-service.js +193 -0
- package/dist/src/services/template-cache-service.js.map +1 -0
- package/dist/src/services/template-service.d.ts +25 -31
- package/dist/src/services/template-service.d.ts.map +1 -1
- package/dist/src/services/template-service.js +136 -132
- package/dist/src/services/template-service.js.map +1 -1
- package/dist/src/types/index.d.ts +46 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/package.json +5 -1
- package/templates/HelloWorld/.claude/skills/ketrics-app/BACKEND_REFERENCE.md +693 -0
- package/templates/HelloWorld/.claude/skills/ketrics-app/CONFIG_AND_DEPLOY.md +278 -0
- package/templates/HelloWorld/.claude/skills/ketrics-app/FRONTEND_REFERENCE.md +325 -0
- package/templates/HelloWorld/.claude/skills/ketrics-app/SKILL.md +348 -0
- package/templates/HelloWorld/.env.example +20 -0
- package/templates/HelloWorld/.github/workflows/deploy.yml +51 -0
- package/templates/HelloWorld/backend/package.json +1 -1
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Remote Template Service
|
|
4
|
+
*
|
|
5
|
+
* Fetches templates from the public ketrics-application-templates GitHub repository.
|
|
6
|
+
* Uses GitHub tarball download for efficient single-request fetching.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.fetchManifest = fetchManifest;
|
|
46
|
+
exports.downloadAndExtractTarball = downloadAndExtractTarball;
|
|
47
|
+
exports.extractTemplate = extractTemplate;
|
|
48
|
+
exports.readTemplateConfig = readTemplateConfig;
|
|
49
|
+
exports.applyPlaceholders = applyPlaceholders;
|
|
50
|
+
exports.manifestToTemplateInfos = manifestToTemplateInfos;
|
|
51
|
+
exports.getTemplateFilesFromDir = getTemplateFilesFromDir;
|
|
52
|
+
exports.cleanupTmpDir = cleanupTmpDir;
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
const os = __importStar(require("os"));
|
|
56
|
+
const zlib = __importStar(require("zlib"));
|
|
57
|
+
const promises_1 = require("stream/promises");
|
|
58
|
+
const axios_1 = __importDefault(require("axios"));
|
|
59
|
+
const tar = __importStar(require("tar"));
|
|
60
|
+
const TEMPLATE_REPO_OWNER = 'ketrics';
|
|
61
|
+
const TEMPLATE_REPO_NAME = 'ketrics-application-templates';
|
|
62
|
+
const TEMPLATE_BRANCH = 'main';
|
|
63
|
+
const MANIFEST_URL = `https://raw.githubusercontent.com/${TEMPLATE_REPO_OWNER}/${TEMPLATE_REPO_NAME}/${TEMPLATE_BRANCH}/templates.json`;
|
|
64
|
+
const TARBALL_URL = `https://api.github.com/repos/${TEMPLATE_REPO_OWNER}/${TEMPLATE_REPO_NAME}/tarball/${TEMPLATE_BRANCH}`;
|
|
65
|
+
/**
|
|
66
|
+
* Fetch the templates.json manifest from the remote repository
|
|
67
|
+
*/
|
|
68
|
+
async function fetchManifest() {
|
|
69
|
+
const response = await axios_1.default.get(MANIFEST_URL, {
|
|
70
|
+
timeout: 15000,
|
|
71
|
+
headers: {
|
|
72
|
+
'Accept': 'application/json',
|
|
73
|
+
'User-Agent': 'ketrics-cli',
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
const manifest = response.data;
|
|
77
|
+
if (typeof manifest.version !== 'number' || !Array.isArray(manifest.templates)) {
|
|
78
|
+
throw new Error('Invalid manifest format');
|
|
79
|
+
}
|
|
80
|
+
return manifest;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Download and extract the repo tarball to a temporary directory.
|
|
84
|
+
* Returns the path to the extracted repo root.
|
|
85
|
+
*/
|
|
86
|
+
async function downloadAndExtractTarball() {
|
|
87
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ketrics-templates-'));
|
|
88
|
+
const response = await axios_1.default.get(TARBALL_URL, {
|
|
89
|
+
responseType: 'stream',
|
|
90
|
+
timeout: 60000,
|
|
91
|
+
headers: {
|
|
92
|
+
'Accept': 'application/vnd.github+json',
|
|
93
|
+
'User-Agent': 'ketrics-cli',
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
await (0, promises_1.pipeline)(response.data, zlib.createGunzip(), tar.extract({ cwd: tmpDir }));
|
|
97
|
+
// GitHub tarball extracts into a directory like: ketrics-ketrics-application-templates-<sha>/
|
|
98
|
+
const entries = fs.readdirSync(tmpDir);
|
|
99
|
+
const repoDir = entries.find((e) => fs.statSync(path.join(tmpDir, e)).isDirectory());
|
|
100
|
+
if (!repoDir) {
|
|
101
|
+
throw new Error('Failed to find extracted repository directory');
|
|
102
|
+
}
|
|
103
|
+
return path.join(tmpDir, repoDir);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Extract a specific template from the downloaded repo to a destination directory.
|
|
107
|
+
*/
|
|
108
|
+
function extractTemplate(repoDir, templateEntry, destDir, ignorePatterns = []) {
|
|
109
|
+
const templateSrc = path.join(repoDir, templateEntry.path);
|
|
110
|
+
if (!fs.existsSync(templateSrc)) {
|
|
111
|
+
throw new Error(`Template directory not found in repository: ${templateEntry.path}`);
|
|
112
|
+
}
|
|
113
|
+
copyDirRecursive(templateSrc, destDir, ignorePatterns);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Read template.json config from a template directory
|
|
117
|
+
*/
|
|
118
|
+
function readTemplateConfig(templateDir) {
|
|
119
|
+
const configPath = path.join(templateDir, 'template.json');
|
|
120
|
+
if (!fs.existsSync(configPath)) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
125
|
+
return JSON.parse(content);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Apply placeholders defined in template.json
|
|
133
|
+
*/
|
|
134
|
+
function applyPlaceholders(projectDir, templateConfig, values) {
|
|
135
|
+
for (const [key, placeholder] of Object.entries(templateConfig.placeholders)) {
|
|
136
|
+
const value = values[key];
|
|
137
|
+
if (!value)
|
|
138
|
+
continue;
|
|
139
|
+
for (const filePath of placeholder.files) {
|
|
140
|
+
const fullPath = path.join(projectDir, filePath);
|
|
141
|
+
if (!fs.existsSync(fullPath))
|
|
142
|
+
continue;
|
|
143
|
+
if (placeholder.jsonField) {
|
|
144
|
+
try {
|
|
145
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
146
|
+
const json = JSON.parse(content);
|
|
147
|
+
json[placeholder.jsonField] = value;
|
|
148
|
+
fs.writeFileSync(fullPath, JSON.stringify(json, null, 2) + '\n', 'utf-8');
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Skip files that can't be parsed
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Convert manifest entries to TemplateInfo objects for display
|
|
159
|
+
*/
|
|
160
|
+
function manifestToTemplateInfos(manifest, basePath) {
|
|
161
|
+
return manifest.templates.map((entry) => ({
|
|
162
|
+
name: entry.name,
|
|
163
|
+
path: path.join(basePath, entry.path),
|
|
164
|
+
description: entry.description,
|
|
165
|
+
source: 'remote',
|
|
166
|
+
minCliVersion: entry.minCliVersion,
|
|
167
|
+
minSdkVersion: entry.minSdkVersion,
|
|
168
|
+
tags: entry.tags,
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get files that will be copied from a directory (for display)
|
|
173
|
+
*/
|
|
174
|
+
function getTemplateFilesFromDir(templateDir, ignorePatterns = []) {
|
|
175
|
+
const files = [];
|
|
176
|
+
function collectFiles(dir, relativePath = '') {
|
|
177
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
178
|
+
for (const entry of entries) {
|
|
179
|
+
const relPath = relativePath ? path.join(relativePath, entry.name) : entry.name;
|
|
180
|
+
if (shouldIgnore(entry.name, ignorePatterns))
|
|
181
|
+
continue;
|
|
182
|
+
if (entry.isDirectory()) {
|
|
183
|
+
collectFiles(path.join(dir, entry.name), relPath);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
files.push(relPath);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
collectFiles(templateDir);
|
|
191
|
+
return files;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Clean up temporary directory
|
|
195
|
+
*/
|
|
196
|
+
function cleanupTmpDir(tmpDir) {
|
|
197
|
+
try {
|
|
198
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// Best effort cleanup
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// ---- Internal helpers ----
|
|
205
|
+
function shouldIgnore(name, ignorePatterns) {
|
|
206
|
+
return ignorePatterns.some((pattern) => {
|
|
207
|
+
if (pattern === name)
|
|
208
|
+
return true;
|
|
209
|
+
if (pattern.endsWith('*') && name.startsWith(pattern.slice(0, -1)))
|
|
210
|
+
return true;
|
|
211
|
+
return false;
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
function copyDirRecursive(src, dest, ignorePatterns = []) {
|
|
215
|
+
if (!fs.existsSync(dest)) {
|
|
216
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
217
|
+
}
|
|
218
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
219
|
+
for (const entry of entries) {
|
|
220
|
+
if (shouldIgnore(entry.name, ignorePatterns))
|
|
221
|
+
continue;
|
|
222
|
+
const srcPath = path.join(src, entry.name);
|
|
223
|
+
const destPath = path.join(dest, entry.name);
|
|
224
|
+
if (entry.isDirectory()) {
|
|
225
|
+
copyDirRecursive(srcPath, destPath, ignorePatterns);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
fs.copyFileSync(srcPath, destPath);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=remote-template-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-template-service.js","sourceRoot":"","sources":["../../../src/services/remote-template-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Cache Service
|
|
3
|
+
*
|
|
4
|
+
* Manages local caching of fetched remote templates.
|
|
5
|
+
* Cache location: ~/.ketrics/templates-cache/
|
|
6
|
+
*/
|
|
7
|
+
import type { TemplateManifest } from '../types';
|
|
8
|
+
/**
|
|
9
|
+
* Check if the cached manifest is still fresh
|
|
10
|
+
*/
|
|
11
|
+
export declare function isCacheFresh(): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Read cached manifest
|
|
14
|
+
*/
|
|
15
|
+
export declare function getCachedManifest(): TemplateManifest | null;
|
|
16
|
+
/**
|
|
17
|
+
* Save manifest to cache
|
|
18
|
+
*/
|
|
19
|
+
export declare function saveCachedManifest(manifest: TemplateManifest): void;
|
|
20
|
+
/**
|
|
21
|
+
* Get the path to a cached template directory
|
|
22
|
+
*/
|
|
23
|
+
export declare function getCachedTemplatePath(templateName: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a template is cached
|
|
26
|
+
*/
|
|
27
|
+
export declare function isTemplateCached(templateName: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Save a template to the cache by copying from a source directory
|
|
30
|
+
*/
|
|
31
|
+
export declare function cacheTemplate(templateName: string, sourceDir: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get the cache directory path
|
|
34
|
+
*/
|
|
35
|
+
export declare function getCacheDir(): string;
|
|
36
|
+
/**
|
|
37
|
+
* Get the cached templates directory path
|
|
38
|
+
*/
|
|
39
|
+
export declare function getCachedTemplatesDir(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Clear all cached templates
|
|
42
|
+
*/
|
|
43
|
+
export declare function clearCache(): void;
|
|
44
|
+
//# sourceMappingURL=template-cache-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-cache-service.d.ts","sourceRoot":"","sources":["../../../src/services/template-cache-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,UAAU,CAAC;AAkCjE;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAmBtC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,gBAAgB,GAAG,IAAI,CAY3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAUnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAW3E;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAIjC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Template Cache Service
|
|
4
|
+
*
|
|
5
|
+
* Manages local caching of fetched remote templates.
|
|
6
|
+
* Cache location: ~/.ketrics/templates-cache/
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.isCacheFresh = isCacheFresh;
|
|
43
|
+
exports.getCachedManifest = getCachedManifest;
|
|
44
|
+
exports.saveCachedManifest = saveCachedManifest;
|
|
45
|
+
exports.getCachedTemplatePath = getCachedTemplatePath;
|
|
46
|
+
exports.isTemplateCached = isTemplateCached;
|
|
47
|
+
exports.cacheTemplate = cacheTemplate;
|
|
48
|
+
exports.getCacheDir = getCacheDir;
|
|
49
|
+
exports.getCachedTemplatesDir = getCachedTemplatesDir;
|
|
50
|
+
exports.clearCache = clearCache;
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const os = __importStar(require("os"));
|
|
54
|
+
const version_1 = require("../version");
|
|
55
|
+
const CACHE_BASE_DIR = path.join(os.homedir(), '.ketrics');
|
|
56
|
+
const CACHE_DIR = path.join(CACHE_BASE_DIR, 'templates-cache');
|
|
57
|
+
const MANIFEST_CACHE_FILE = path.join(CACHE_DIR, 'manifest.json');
|
|
58
|
+
const TEMPLATES_CACHE_DIR = path.join(CACHE_DIR, 'templates');
|
|
59
|
+
/** Default cache TTL: 24 hours */
|
|
60
|
+
const DEFAULT_CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
61
|
+
/**
|
|
62
|
+
* Get the cache TTL in milliseconds. Can be overridden via KETRICS_TEMPLATE_CACHE_TTL env var (in seconds).
|
|
63
|
+
*/
|
|
64
|
+
function getCacheTtlMs() {
|
|
65
|
+
const envTtl = process.env.KETRICS_TEMPLATE_CACHE_TTL;
|
|
66
|
+
if (envTtl) {
|
|
67
|
+
const seconds = parseInt(envTtl, 10);
|
|
68
|
+
if (!isNaN(seconds) && seconds > 0) {
|
|
69
|
+
return seconds * 1000;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return DEFAULT_CACHE_TTL_MS;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Ensure the cache directories exist
|
|
76
|
+
*/
|
|
77
|
+
function ensureCacheDir() {
|
|
78
|
+
if (!fs.existsSync(TEMPLATES_CACHE_DIR)) {
|
|
79
|
+
fs.mkdirSync(TEMPLATES_CACHE_DIR, { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if the cached manifest is still fresh
|
|
84
|
+
*/
|
|
85
|
+
function isCacheFresh() {
|
|
86
|
+
if (!fs.existsSync(MANIFEST_CACHE_FILE)) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const content = fs.readFileSync(MANIFEST_CACHE_FILE, 'utf-8');
|
|
91
|
+
const cached = JSON.parse(content);
|
|
92
|
+
// Invalidate if CLI version changed (manifest format may differ)
|
|
93
|
+
if (cached.cliVersion !== version_1.VERSION) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
const age = Date.now() - cached.fetchedAt;
|
|
97
|
+
return age < getCacheTtlMs();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Read cached manifest
|
|
105
|
+
*/
|
|
106
|
+
function getCachedManifest() {
|
|
107
|
+
if (!fs.existsSync(MANIFEST_CACHE_FILE)) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const content = fs.readFileSync(MANIFEST_CACHE_FILE, 'utf-8');
|
|
112
|
+
const cached = JSON.parse(content);
|
|
113
|
+
return cached.manifest;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Save manifest to cache
|
|
121
|
+
*/
|
|
122
|
+
function saveCachedManifest(manifest) {
|
|
123
|
+
ensureCacheDir();
|
|
124
|
+
const cached = {
|
|
125
|
+
manifest,
|
|
126
|
+
fetchedAt: Date.now(),
|
|
127
|
+
cliVersion: version_1.VERSION,
|
|
128
|
+
};
|
|
129
|
+
fs.writeFileSync(MANIFEST_CACHE_FILE, JSON.stringify(cached, null, 2), 'utf-8');
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get the path to a cached template directory
|
|
133
|
+
*/
|
|
134
|
+
function getCachedTemplatePath(templateName) {
|
|
135
|
+
return path.join(TEMPLATES_CACHE_DIR, templateName);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check if a template is cached
|
|
139
|
+
*/
|
|
140
|
+
function isTemplateCached(templateName) {
|
|
141
|
+
const templatePath = getCachedTemplatePath(templateName);
|
|
142
|
+
return fs.existsSync(templatePath) && fs.existsSync(path.join(templatePath, 'ketrics.config.json'));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Save a template to the cache by copying from a source directory
|
|
146
|
+
*/
|
|
147
|
+
function cacheTemplate(templateName, sourceDir) {
|
|
148
|
+
ensureCacheDir();
|
|
149
|
+
const destDir = getCachedTemplatePath(templateName);
|
|
150
|
+
// Remove old cached version
|
|
151
|
+
if (fs.existsSync(destDir)) {
|
|
152
|
+
fs.rmSync(destDir, { recursive: true, force: true });
|
|
153
|
+
}
|
|
154
|
+
copyDirRecursive(sourceDir, destDir);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get the cache directory path
|
|
158
|
+
*/
|
|
159
|
+
function getCacheDir() {
|
|
160
|
+
return CACHE_DIR;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get the cached templates directory path
|
|
164
|
+
*/
|
|
165
|
+
function getCachedTemplatesDir() {
|
|
166
|
+
return TEMPLATES_CACHE_DIR;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Clear all cached templates
|
|
170
|
+
*/
|
|
171
|
+
function clearCache() {
|
|
172
|
+
if (fs.existsSync(CACHE_DIR)) {
|
|
173
|
+
fs.rmSync(CACHE_DIR, { recursive: true, force: true });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// ---- Internal helpers ----
|
|
177
|
+
function copyDirRecursive(src, dest) {
|
|
178
|
+
if (!fs.existsSync(dest)) {
|
|
179
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
180
|
+
}
|
|
181
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
182
|
+
for (const entry of entries) {
|
|
183
|
+
const srcPath = path.join(src, entry.name);
|
|
184
|
+
const destPath = path.join(dest, entry.name);
|
|
185
|
+
if (entry.isDirectory()) {
|
|
186
|
+
copyDirRecursive(srcPath, destPath);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
fs.copyFileSync(srcPath, destPath);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=template-cache-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-cache-service.js","sourceRoot":"","sources":["../../../src/services/template-cache-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,51 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Template Service
|
|
2
|
+
* Template Service (Orchestrator)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Coordinates between remote and local template sources.
|
|
5
|
+
* Strategy: remote-first with cache, falling back to bundled local templates.
|
|
5
6
|
*/
|
|
6
|
-
import type { TemplateInfo } from '../types';
|
|
7
|
+
import type { TemplateInfo, TemplateConfig } from '../types';
|
|
7
8
|
/**
|
|
8
|
-
* Get
|
|
9
|
+
* Get available templates, preferring remote with local fallback.
|
|
9
10
|
*/
|
|
10
|
-
export declare function getAvailableTemplates(
|
|
11
|
+
export declare function getAvailableTemplates(options: {
|
|
12
|
+
refresh?: boolean;
|
|
13
|
+
local?: boolean;
|
|
14
|
+
}): Promise<TemplateInfo[]>;
|
|
11
15
|
/**
|
|
12
16
|
* Get a specific template by name
|
|
13
17
|
*/
|
|
14
|
-
export declare function getTemplate(name: string
|
|
18
|
+
export declare function getTemplate(name: string, options: {
|
|
19
|
+
refresh?: boolean;
|
|
20
|
+
local?: boolean;
|
|
21
|
+
}): Promise<TemplateInfo | undefined>;
|
|
15
22
|
/**
|
|
16
|
-
*
|
|
23
|
+
* Copy a template to the destination directory.
|
|
24
|
+
* For remote templates: downloads, extracts, and copies from tarball.
|
|
25
|
+
* For local templates: copies from bundled directory.
|
|
17
26
|
*/
|
|
18
|
-
export
|
|
19
|
-
valid: boolean;
|
|
20
|
-
errors: string[];
|
|
21
|
-
}
|
|
27
|
+
export declare function copyTemplateToDestination(template: TemplateInfo, destDir: string): Promise<TemplateConfig | null>;
|
|
22
28
|
/**
|
|
23
|
-
*
|
|
29
|
+
* Apply customizations to a copied template.
|
|
30
|
+
* Uses template.json placeholders if available, falls back to hardcoded updateAppName.
|
|
24
31
|
*/
|
|
25
|
-
export declare function
|
|
32
|
+
export declare function applyCustomizations(projectDir: string, appName: string, templateConfig: TemplateConfig | null): void;
|
|
26
33
|
/**
|
|
27
|
-
*
|
|
28
|
-
*/
|
|
29
|
-
export declare function copyTemplate(template: TemplateInfo, destDir: string): void;
|
|
30
|
-
/**
|
|
31
|
-
* Get files that will be copied from template
|
|
34
|
+
* Get the list of files in a template (for display purposes)
|
|
32
35
|
*/
|
|
33
36
|
export declare function getTemplateFiles(template: TemplateInfo): string[];
|
|
34
37
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* Updates the name field in:
|
|
38
|
-
* - ketrics.config.json
|
|
39
|
-
* - frontend/package.json
|
|
40
|
-
* - backend/package.json
|
|
41
|
-
*/
|
|
42
|
-
export declare function updateAppName(projectDir: string, appName: string): void;
|
|
43
|
-
/**
|
|
44
|
-
* Check if a directory exists
|
|
38
|
+
* Clear the template cache
|
|
45
39
|
*/
|
|
46
|
-
export declare function
|
|
40
|
+
export declare function clearCache(): void;
|
|
47
41
|
/**
|
|
48
|
-
*
|
|
42
|
+
* Re-export utilities needed by create command
|
|
49
43
|
*/
|
|
50
|
-
export
|
|
44
|
+
export { directoryExists, createDirectory } from './local-template-service';
|
|
51
45
|
//# sourceMappingURL=template-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-service.d.ts","sourceRoot":"","sources":["../../../src/services/template-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"template-service.d.ts","sourceRoot":"","sources":["../../../src/services/template-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EACV,YAAY,EAGZ,cAAc,EAEf,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA8B1B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9C,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAGnC;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAqChC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,cAAc,GAAG,IAAI,GACpC,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAajE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAGjC;AAED;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC"}
|