@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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +389 -0
  3. package/dist/cli.d.ts +8 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +105 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/info.d.ts +11 -0
  8. package/dist/commands/info.d.ts.map +1 -0
  9. package/dist/commands/info.js +101 -0
  10. package/dist/commands/info.js.map +1 -0
  11. package/dist/commands/install.d.ts +17 -0
  12. package/dist/commands/install.d.ts.map +1 -0
  13. package/dist/commands/install.js +358 -0
  14. package/dist/commands/install.js.map +1 -0
  15. package/dist/commands/list.d.ts +11 -0
  16. package/dist/commands/list.d.ts.map +1 -0
  17. package/dist/commands/list.js +96 -0
  18. package/dist/commands/list.js.map +1 -0
  19. package/dist/commands/login.d.ts +19 -0
  20. package/dist/commands/login.d.ts.map +1 -0
  21. package/dist/commands/login.js +154 -0
  22. package/dist/commands/login.js.map +1 -0
  23. package/dist/commands/publish.d.ts +13 -0
  24. package/dist/commands/publish.d.ts.map +1 -0
  25. package/dist/commands/publish.js +285 -0
  26. package/dist/commands/publish.js.map +1 -0
  27. package/dist/commands/search.d.ts +12 -0
  28. package/dist/commands/search.d.ts.map +1 -0
  29. package/dist/commands/search.js +60 -0
  30. package/dist/commands/search.js.map +1 -0
  31. package/dist/commands/sync.d.ts +19 -0
  32. package/dist/commands/sync.d.ts.map +1 -0
  33. package/dist/commands/sync.js +193 -0
  34. package/dist/commands/sync.js.map +1 -0
  35. package/dist/commands/uninstall.d.ts +11 -0
  36. package/dist/commands/uninstall.d.ts.map +1 -0
  37. package/dist/commands/uninstall.js +153 -0
  38. package/dist/commands/uninstall.js.map +1 -0
  39. package/dist/commands/upgrade.d.ts +15 -0
  40. package/dist/commands/upgrade.d.ts.map +1 -0
  41. package/dist/commands/upgrade.js +144 -0
  42. package/dist/commands/upgrade.js.map +1 -0
  43. package/dist/index.d.ts +10 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +14 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/lib/config.d.ts +79 -0
  48. package/dist/lib/config.d.ts.map +1 -0
  49. package/dist/lib/config.js +202 -0
  50. package/dist/lib/config.js.map +1 -0
  51. package/dist/lib/registry.d.ts +90 -0
  52. package/dist/lib/registry.d.ts.map +1 -0
  53. package/dist/lib/registry.js +294 -0
  54. package/dist/lib/registry.js.map +1 -0
  55. package/dist/lib/storage.d.ts +82 -0
  56. package/dist/lib/storage.d.ts.map +1 -0
  57. package/dist/lib/storage.js +177 -0
  58. package/dist/lib/storage.js.map +1 -0
  59. package/dist/lib/validator.d.ts +24 -0
  60. package/dist/lib/validator.d.ts.map +1 -0
  61. package/dist/lib/validator.js +181 -0
  62. package/dist/lib/validator.js.map +1 -0
  63. package/dist/types.d.ts +187 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +36 -0
  66. package/dist/types.js.map +1 -0
  67. 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"}