@trikhub/cli 0.2.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 +389 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +105 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/info.d.ts +11 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +101 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/install.d.ts +17 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +358 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +11 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +96 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +19 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +154 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/publish.d.ts +13 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +285 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/search.d.ts +12 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +60 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/sync.d.ts +19 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +193 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/uninstall.d.ts +11 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +153 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/upgrade.d.ts +15 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +144 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +79 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +202 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/registry.d.ts +90 -0
- package/dist/lib/registry.d.ts.map +1 -0
- package/dist/lib/registry.js +294 -0
- package/dist/lib/registry.js.map +1 -0
- package/dist/lib/storage.d.ts +82 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +177 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/validator.d.ts +24 -0
- package/dist/lib/validator.d.ts.map +1 -0
- package/dist/lib/validator.js +181 -0
- package/dist/lib/validator.js.map +1 -0
- package/dist/types.d.ts +187 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +36 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trik install command
|
|
3
|
+
*
|
|
4
|
+
* Installs a trik as an npm dependency and registers it in .trikhub/config.json.
|
|
5
|
+
*
|
|
6
|
+
* Workflow:
|
|
7
|
+
* 1. Try npm registry first
|
|
8
|
+
* 2. If not found, fall back to TrikHub registry (GitHub releases)
|
|
9
|
+
* 3. Download and install
|
|
10
|
+
* 4. Update .trikhub/config.json with the trik
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, createWriteStream, rmSync, mkdirSync } from 'node:fs';
|
|
13
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
14
|
+
import { join, dirname } from 'node:path';
|
|
15
|
+
import { spawn } from 'node:child_process';
|
|
16
|
+
import { pipeline } from 'node:stream/promises';
|
|
17
|
+
import { Readable } from 'node:stream';
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import ora from 'ora';
|
|
20
|
+
import * as semver from 'semver';
|
|
21
|
+
import * as tar from 'tar';
|
|
22
|
+
import { validateManifest } from '@trikhub/manifest';
|
|
23
|
+
import { registry } from '../lib/registry.js';
|
|
24
|
+
const NPM_CONFIG_DIR = '.trikhub';
|
|
25
|
+
const NPM_CONFIG_FILE = 'config.json';
|
|
26
|
+
/**
|
|
27
|
+
* Detect which package manager is being used in the project
|
|
28
|
+
*/
|
|
29
|
+
function detectPackageManager(baseDir) {
|
|
30
|
+
if (existsSync(join(baseDir, 'pnpm-lock.yaml'))) {
|
|
31
|
+
return 'pnpm';
|
|
32
|
+
}
|
|
33
|
+
if (existsSync(join(baseDir, 'yarn.lock'))) {
|
|
34
|
+
return 'yarn';
|
|
35
|
+
}
|
|
36
|
+
return 'npm';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Run a command and capture output
|
|
40
|
+
*/
|
|
41
|
+
function runCommand(command, args, cwd, options = {}) {
|
|
42
|
+
return new Promise((resolve) => {
|
|
43
|
+
const proc = spawn(command, args, {
|
|
44
|
+
cwd,
|
|
45
|
+
shell: true,
|
|
46
|
+
stdio: options.silent ? 'pipe' : 'inherit',
|
|
47
|
+
});
|
|
48
|
+
let stdout = '';
|
|
49
|
+
let stderr = '';
|
|
50
|
+
if (options.silent) {
|
|
51
|
+
proc.stdout?.on('data', (data) => { stdout += data.toString(); });
|
|
52
|
+
proc.stderr?.on('data', (data) => { stderr += data.toString(); });
|
|
53
|
+
}
|
|
54
|
+
proc.on('close', (code) => {
|
|
55
|
+
resolve({ code: code ?? 1, stdout, stderr });
|
|
56
|
+
});
|
|
57
|
+
proc.on('error', (err) => {
|
|
58
|
+
resolve({ code: 1, stdout, stderr: err.message });
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the path to the npm-based config file
|
|
64
|
+
*/
|
|
65
|
+
function getNpmConfigPath(baseDir) {
|
|
66
|
+
return join(baseDir, NPM_CONFIG_DIR, NPM_CONFIG_FILE);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Read the npm-based trik config
|
|
70
|
+
*/
|
|
71
|
+
async function readNpmConfig(baseDir) {
|
|
72
|
+
const configPath = getNpmConfigPath(baseDir);
|
|
73
|
+
if (!existsSync(configPath)) {
|
|
74
|
+
return { triks: [] };
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const content = await readFile(configPath, 'utf-8');
|
|
78
|
+
const config = JSON.parse(content);
|
|
79
|
+
return {
|
|
80
|
+
triks: Array.isArray(config.triks) ? config.triks : [],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return { triks: [] };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Write the npm-based trik config
|
|
89
|
+
*/
|
|
90
|
+
async function writeNpmConfig(config, baseDir) {
|
|
91
|
+
const configPath = getNpmConfigPath(baseDir);
|
|
92
|
+
const configDir = dirname(configPath);
|
|
93
|
+
if (!existsSync(configDir)) {
|
|
94
|
+
await mkdir(configDir, { recursive: true });
|
|
95
|
+
}
|
|
96
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if a package in node_modules is a valid trik
|
|
100
|
+
*/
|
|
101
|
+
async function isTrikPackage(packagePath) {
|
|
102
|
+
const manifestPath = join(packagePath, 'manifest.json');
|
|
103
|
+
if (!existsSync(manifestPath)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const content = await readFile(manifestPath, 'utf-8');
|
|
108
|
+
const manifest = JSON.parse(content);
|
|
109
|
+
const validation = validateManifest(manifest);
|
|
110
|
+
return validation.valid;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Add a trik to the config
|
|
118
|
+
*/
|
|
119
|
+
async function addTrikToConfig(packageName, baseDir) {
|
|
120
|
+
const config = await readNpmConfig(baseDir);
|
|
121
|
+
if (!config.triks.includes(packageName)) {
|
|
122
|
+
config.triks = [...config.triks, packageName].sort();
|
|
123
|
+
await writeNpmConfig(config, baseDir);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Download a file from a URL
|
|
128
|
+
*/
|
|
129
|
+
async function downloadFile(url, destPath) {
|
|
130
|
+
const response = await fetch(url);
|
|
131
|
+
if (!response.ok) {
|
|
132
|
+
throw new Error(`Failed to download: ${response.status} ${response.statusText}`);
|
|
133
|
+
}
|
|
134
|
+
if (!response.body) {
|
|
135
|
+
throw new Error('No response body');
|
|
136
|
+
}
|
|
137
|
+
const dir = dirname(destPath);
|
|
138
|
+
if (!existsSync(dir)) {
|
|
139
|
+
await mkdir(dir, { recursive: true });
|
|
140
|
+
}
|
|
141
|
+
const fileStream = createWriteStream(destPath);
|
|
142
|
+
await pipeline(Readable.fromWeb(response.body), fileStream);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Add a dependency to package.json
|
|
146
|
+
*/
|
|
147
|
+
async function addToPackageJson(packageName, version, baseDir) {
|
|
148
|
+
const packageJsonPath = join(baseDir, 'package.json');
|
|
149
|
+
const content = await readFile(packageJsonPath, 'utf-8');
|
|
150
|
+
const pkg = JSON.parse(content);
|
|
151
|
+
if (!pkg.dependencies) {
|
|
152
|
+
pkg.dependencies = {};
|
|
153
|
+
}
|
|
154
|
+
// Use a special prefix to indicate it's a TrikHub package
|
|
155
|
+
pkg.dependencies[packageName] = `trikhub:${version}`;
|
|
156
|
+
await writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Try to install from npm registry
|
|
160
|
+
*/
|
|
161
|
+
async function tryNpmInstall(pm, packageSpec, baseDir) {
|
|
162
|
+
const args = pm === 'npm' ? ['install', packageSpec] : ['add', packageSpec];
|
|
163
|
+
// Run silently to capture output
|
|
164
|
+
const result = await runCommand(pm, args, baseDir, { silent: true });
|
|
165
|
+
if (result.code === 0) {
|
|
166
|
+
return { success: true, notFound: false };
|
|
167
|
+
}
|
|
168
|
+
// Check if it's a 404 (not found) error
|
|
169
|
+
const isNotFound = result.stderr.includes('404') ||
|
|
170
|
+
result.stderr.includes('Not found') ||
|
|
171
|
+
result.stderr.includes('is not in this registry');
|
|
172
|
+
return { success: false, notFound: isNotFound };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Install from TrikHub registry (GitHub releases)
|
|
176
|
+
* Extracts directly to node_modules since TrikHub tarballs may not be npm-compatible
|
|
177
|
+
*/
|
|
178
|
+
async function installFromTrikhub(packageName, requestedVersion, baseDir, spinner) {
|
|
179
|
+
// Fetch trik info from TrikHub registry
|
|
180
|
+
spinner.text = `Fetching ${chalk.cyan(packageName)} from TrikHub registry...`;
|
|
181
|
+
const trikInfo = await registry.getTrik(packageName);
|
|
182
|
+
if (!trikInfo) {
|
|
183
|
+
return { success: false };
|
|
184
|
+
}
|
|
185
|
+
// Determine version to install
|
|
186
|
+
let versionToInstall;
|
|
187
|
+
let versionInfo;
|
|
188
|
+
if (!requestedVersion) {
|
|
189
|
+
versionToInstall = trikInfo.latestVersion;
|
|
190
|
+
versionInfo = trikInfo.versions.find((v) => v.version === versionToInstall);
|
|
191
|
+
}
|
|
192
|
+
else if (semver.valid(requestedVersion)) {
|
|
193
|
+
versionToInstall = requestedVersion;
|
|
194
|
+
versionInfo = trikInfo.versions.find((v) => v.version === versionToInstall);
|
|
195
|
+
}
|
|
196
|
+
else if (semver.validRange(requestedVersion)) {
|
|
197
|
+
const availableVersions = trikInfo.versions.map((v) => v.version);
|
|
198
|
+
const resolvedVersion = semver.maxSatisfying(availableVersions, requestedVersion);
|
|
199
|
+
if (!resolvedVersion) {
|
|
200
|
+
spinner.fail(`No version matching ${chalk.red(requestedVersion)} found for ${packageName}`);
|
|
201
|
+
console.log(chalk.dim(`Available versions: ${availableVersions.join(', ')}`));
|
|
202
|
+
return { success: false };
|
|
203
|
+
}
|
|
204
|
+
versionToInstall = resolvedVersion;
|
|
205
|
+
versionInfo = trikInfo.versions.find((v) => v.version === resolvedVersion);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
spinner.fail(`Invalid version: ${chalk.red(requestedVersion)}`);
|
|
209
|
+
return { success: false };
|
|
210
|
+
}
|
|
211
|
+
if (!versionInfo) {
|
|
212
|
+
spinner.fail(`Version ${chalk.red(versionToInstall)} not found for ${packageName}`);
|
|
213
|
+
return { success: false };
|
|
214
|
+
}
|
|
215
|
+
// Download the tarball
|
|
216
|
+
spinner.text = `Downloading ${chalk.cyan(packageName)}@${versionToInstall}...`;
|
|
217
|
+
const tempDir = join(baseDir, '.trikhub', '.tmp');
|
|
218
|
+
const tarballPath = join(tempDir, `${packageName.replace('/', '-')}-${versionToInstall}.tgz`);
|
|
219
|
+
try {
|
|
220
|
+
await downloadFile(versionInfo.tarballUrl, tarballPath);
|
|
221
|
+
// Extract directly to node_modules
|
|
222
|
+
spinner.text = `Installing ${chalk.cyan(packageName)}@${versionToInstall}...`;
|
|
223
|
+
// Create the target directory in node_modules
|
|
224
|
+
const nodeModulesPath = join(baseDir, 'node_modules');
|
|
225
|
+
const packagePath = join(nodeModulesPath, ...packageName.split('/'));
|
|
226
|
+
// Ensure parent directories exist (for scoped packages)
|
|
227
|
+
if (packageName.startsWith('@')) {
|
|
228
|
+
const scopeDir = join(nodeModulesPath, packageName.split('/')[0]);
|
|
229
|
+
if (!existsSync(scopeDir)) {
|
|
230
|
+
mkdirSync(scopeDir, { recursive: true });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// Remove existing installation if present
|
|
234
|
+
if (existsSync(packagePath)) {
|
|
235
|
+
rmSync(packagePath, { recursive: true, force: true });
|
|
236
|
+
}
|
|
237
|
+
// Create target directory
|
|
238
|
+
mkdirSync(packagePath, { recursive: true });
|
|
239
|
+
// Extract tarball to the package directory
|
|
240
|
+
await tar.extract({
|
|
241
|
+
file: tarballPath,
|
|
242
|
+
cwd: packagePath,
|
|
243
|
+
});
|
|
244
|
+
// Create a minimal package.json if one doesn't exist
|
|
245
|
+
const pkgJsonPath = join(packagePath, 'package.json');
|
|
246
|
+
if (!existsSync(pkgJsonPath)) {
|
|
247
|
+
const minimalPkg = {
|
|
248
|
+
name: packageName,
|
|
249
|
+
version: versionToInstall,
|
|
250
|
+
description: trikInfo.description || `TrikHub package: ${packageName}`,
|
|
251
|
+
};
|
|
252
|
+
await writeFile(pkgJsonPath, JSON.stringify(minimalPkg, null, 2) + '\n', 'utf-8');
|
|
253
|
+
}
|
|
254
|
+
// Add to package.json dependencies
|
|
255
|
+
await addToPackageJson(packageName, versionToInstall, baseDir);
|
|
256
|
+
// Report download for analytics
|
|
257
|
+
registry.reportDownload(packageName, versionToInstall);
|
|
258
|
+
return { success: true, version: versionToInstall };
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
// Clean up tarball
|
|
262
|
+
if (existsSync(tarballPath)) {
|
|
263
|
+
rmSync(tarballPath, { force: true });
|
|
264
|
+
}
|
|
265
|
+
// Clean up temp dir if empty
|
|
266
|
+
if (existsSync(tempDir)) {
|
|
267
|
+
try {
|
|
268
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
// Ignore cleanup errors
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
export async function installCommand(trikInput, options) {
|
|
277
|
+
const spinner = ora();
|
|
278
|
+
const baseDir = process.cwd();
|
|
279
|
+
try {
|
|
280
|
+
// Check for package.json
|
|
281
|
+
const packageJsonPath = join(baseDir, 'package.json');
|
|
282
|
+
if (!existsSync(packageJsonPath)) {
|
|
283
|
+
console.log(chalk.red('No package.json found in current directory.'));
|
|
284
|
+
console.log(chalk.dim('Run `npm init` or `pnpm init` first.'));
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
// Ensure node_modules exists
|
|
288
|
+
const nodeModulesPath = join(baseDir, 'node_modules');
|
|
289
|
+
if (!existsSync(nodeModulesPath)) {
|
|
290
|
+
mkdirSync(nodeModulesPath, { recursive: true });
|
|
291
|
+
}
|
|
292
|
+
// Parse package name and version
|
|
293
|
+
let packageName = trikInput;
|
|
294
|
+
let versionSpec = options.version;
|
|
295
|
+
// Handle @scope/name@version format
|
|
296
|
+
const atIndex = trikInput.lastIndexOf('@');
|
|
297
|
+
if (atIndex > 0 && !trikInput.startsWith('@', atIndex)) {
|
|
298
|
+
packageName = trikInput.substring(0, atIndex);
|
|
299
|
+
versionSpec = versionSpec ?? trikInput.substring(atIndex + 1);
|
|
300
|
+
}
|
|
301
|
+
// Detect package manager
|
|
302
|
+
const pm = detectPackageManager(baseDir);
|
|
303
|
+
spinner.info(`Using ${chalk.cyan(pm)} as package manager`);
|
|
304
|
+
const packageSpec = versionSpec ? `${packageName}@${versionSpec}` : packageName;
|
|
305
|
+
// First, try npm registry
|
|
306
|
+
spinner.start(`Looking for ${chalk.cyan(packageSpec)} on npm...`);
|
|
307
|
+
const npmResult = await tryNpmInstall(pm, packageSpec, baseDir);
|
|
308
|
+
let installed = false;
|
|
309
|
+
let installedVersion;
|
|
310
|
+
if (npmResult.success) {
|
|
311
|
+
spinner.succeed(`Installed ${chalk.green(packageName)} from npm`);
|
|
312
|
+
installed = true;
|
|
313
|
+
}
|
|
314
|
+
else if (npmResult.notFound) {
|
|
315
|
+
// Not on npm, try TrikHub registry
|
|
316
|
+
spinner.text = `Not found on npm, checking TrikHub registry...`;
|
|
317
|
+
const trikhubResult = await installFromTrikhub(packageName, versionSpec, baseDir, spinner);
|
|
318
|
+
if (trikhubResult.success) {
|
|
319
|
+
spinner.succeed(`Installed ${chalk.green(packageName)}@${trikhubResult.version} from TrikHub`);
|
|
320
|
+
installed = true;
|
|
321
|
+
installedVersion = trikhubResult.version;
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
spinner.fail(`${chalk.red(packageName)} not found on npm or TrikHub registry`);
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
// npm failed for other reasons
|
|
330
|
+
spinner.fail(`Failed to install ${chalk.red(packageName)}`);
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
// Check if the installed package is a trik and register it
|
|
334
|
+
spinner.start('Checking if package is a trik...');
|
|
335
|
+
const packagePath = join(baseDir, 'node_modules', ...packageName.split('/'));
|
|
336
|
+
if (await isTrikPackage(packagePath)) {
|
|
337
|
+
await addTrikToConfig(packageName, baseDir);
|
|
338
|
+
spinner.succeed(`Registered ${chalk.green(packageName)} as a trik`);
|
|
339
|
+
console.log();
|
|
340
|
+
console.log(chalk.dim(` Added to: package.json`));
|
|
341
|
+
console.log(chalk.dim(` Registered in: .trikhub/config.json`));
|
|
342
|
+
console.log();
|
|
343
|
+
console.log(chalk.dim('The trik will be available to your AI agent.'));
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
spinner.info(`${chalk.yellow(packageName)} installed but is not a trik (no manifest.json)`);
|
|
347
|
+
console.log(chalk.dim('\nThe package was added to your dependencies.'));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
spinner.fail('Installation failed');
|
|
352
|
+
if (error instanceof Error) {
|
|
353
|
+
console.error(chalk.red(error.message));
|
|
354
|
+
}
|
|
355
|
+
process.exit(1);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
//# 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,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trik list command
|
|
3
|
+
*
|
|
4
|
+
* Lists all installed triks from .trikhub/config.json.
|
|
5
|
+
*/
|
|
6
|
+
interface ListOptions {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function listCommand(options: ListOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAuED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CrE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trik list command
|
|
3
|
+
*
|
|
4
|
+
* Lists all installed triks from .trikhub/config.json.
|
|
5
|
+
*/
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { readFile } from 'node:fs/promises';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
const NPM_CONFIG_DIR = '.trikhub';
|
|
11
|
+
const NPM_CONFIG_FILE = 'config.json';
|
|
12
|
+
/**
|
|
13
|
+
* Get the path to the npm-based config file
|
|
14
|
+
*/
|
|
15
|
+
function getNpmConfigPath(baseDir) {
|
|
16
|
+
return join(baseDir, NPM_CONFIG_DIR, NPM_CONFIG_FILE);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Read the npm-based trik config
|
|
20
|
+
*/
|
|
21
|
+
async function readNpmConfig(baseDir) {
|
|
22
|
+
const configPath = getNpmConfigPath(baseDir);
|
|
23
|
+
if (!existsSync(configPath)) {
|
|
24
|
+
return { triks: [] };
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const content = await readFile(configPath, 'utf-8');
|
|
28
|
+
const config = JSON.parse(content);
|
|
29
|
+
return {
|
|
30
|
+
triks: Array.isArray(config.triks) ? config.triks : [],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return { triks: [] };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get info about an installed trik from node_modules
|
|
39
|
+
*/
|
|
40
|
+
async function getTrikInfo(packageName, baseDir) {
|
|
41
|
+
const packagePath = join(baseDir, 'node_modules', ...packageName.split('/'));
|
|
42
|
+
const packageJsonPath = join(packagePath, 'package.json');
|
|
43
|
+
const info = {
|
|
44
|
+
name: packageName,
|
|
45
|
+
version: 'unknown',
|
|
46
|
+
exists: existsSync(packagePath),
|
|
47
|
+
};
|
|
48
|
+
if (info.exists && existsSync(packageJsonPath)) {
|
|
49
|
+
try {
|
|
50
|
+
const content = await readFile(packageJsonPath, 'utf-8');
|
|
51
|
+
const pkg = JSON.parse(content);
|
|
52
|
+
info.version = pkg.version || 'unknown';
|
|
53
|
+
info.description = pkg.description;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Ignore errors reading package.json
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return info;
|
|
60
|
+
}
|
|
61
|
+
export async function listCommand(options) {
|
|
62
|
+
const baseDir = process.cwd();
|
|
63
|
+
const config = await readNpmConfig(baseDir);
|
|
64
|
+
if (options.json) {
|
|
65
|
+
const triks = await Promise.all(config.triks.map((name) => getTrikInfo(name, baseDir)));
|
|
66
|
+
console.log(JSON.stringify({
|
|
67
|
+
configPath: getNpmConfigPath(baseDir),
|
|
68
|
+
triks,
|
|
69
|
+
}, null, 2));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (config.triks.length === 0) {
|
|
73
|
+
console.log(chalk.yellow('No triks installed.'));
|
|
74
|
+
console.log(chalk.dim('\nUse `trik install @scope/name` to install a trik'));
|
|
75
|
+
console.log(chalk.dim('Use `trik sync` to discover triks in node_modules'));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
console.log(chalk.bold(`\nInstalled triks (${config.triks.length}):\n`));
|
|
79
|
+
for (const trikName of config.triks) {
|
|
80
|
+
const info = await getTrikInfo(trikName, baseDir);
|
|
81
|
+
const status = info.exists
|
|
82
|
+
? chalk.green('●')
|
|
83
|
+
: chalk.red('○');
|
|
84
|
+
const name = chalk.cyan(trikName);
|
|
85
|
+
const version = chalk.dim(`v${info.version}`);
|
|
86
|
+
console.log(` ${status} ${name} ${version}`);
|
|
87
|
+
if (info.description) {
|
|
88
|
+
console.log(chalk.dim(` ${info.description}`));
|
|
89
|
+
}
|
|
90
|
+
if (!info.exists) {
|
|
91
|
+
console.log(chalk.red(` ⚠ Not in node_modules! Run 'npm install' or 'trik install ${trikName}'`));
|
|
92
|
+
}
|
|
93
|
+
console.log();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trik login command
|
|
3
|
+
*
|
|
4
|
+
* Authenticates with the TrikHub registry using GitHub's device flow.
|
|
5
|
+
*/
|
|
6
|
+
export declare function loginCommand(): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* trik logout command
|
|
9
|
+
*
|
|
10
|
+
* Removes saved authentication credentials.
|
|
11
|
+
*/
|
|
12
|
+
export declare function logoutCommand(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* trik whoami command
|
|
15
|
+
*
|
|
16
|
+
* Shows the current authenticated user.
|
|
17
|
+
*/
|
|
18
|
+
export declare function whoamiCommand(): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAmFlD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBnD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqCnD"}
|