@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,154 @@
1
+ /**
2
+ * trik login command
3
+ *
4
+ * Authenticates with the TrikHub registry using GitHub's device flow.
5
+ */
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { RegistryClient } from '../lib/registry.js';
9
+ import { loadConfig, saveConfig } from '../lib/storage.js';
10
+ export async function loginCommand() {
11
+ const spinner = ora();
12
+ const config = loadConfig();
13
+ // Check if already logged in
14
+ if (config.authToken && config.authExpiresAt) {
15
+ const expiresAt = new Date(config.authExpiresAt);
16
+ if (expiresAt > new Date()) {
17
+ console.log(chalk.yellow(`Already logged in as ${chalk.cyan(config.publisherUsername)}`));
18
+ console.log(chalk.dim('Use `trik logout` to sign out first'));
19
+ return;
20
+ }
21
+ }
22
+ const registry = new RegistryClient();
23
+ try {
24
+ // Start device flow
25
+ spinner.start('Initializing authentication...');
26
+ const deviceAuth = await registry.startDeviceAuth();
27
+ spinner.stop();
28
+ // Display instructions to user
29
+ console.log();
30
+ console.log(chalk.bold(' To authenticate, please:'));
31
+ console.log();
32
+ console.log(` 1. Visit: ${chalk.cyan(deviceAuth.verificationUrl)}`);
33
+ console.log(` 2. Enter code: ${chalk.yellow.bold(deviceAuth.userCode)}`);
34
+ console.log();
35
+ console.log(chalk.dim(` This code expires in ${Math.floor(deviceAuth.expiresIn / 60)} minutes`));
36
+ console.log();
37
+ // Poll for authorization
38
+ spinner.start('Waiting for authorization...');
39
+ const pollInterval = (deviceAuth.interval || 5) * 1000; // Convert to ms
40
+ const maxAttempts = Math.ceil(deviceAuth.expiresIn / (pollInterval / 1000));
41
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
42
+ await sleep(pollInterval);
43
+ try {
44
+ const result = await registry.pollDeviceAuth(deviceAuth.deviceCode);
45
+ if (result) {
46
+ // Authorization complete - save credentials
47
+ config.authToken = result.accessToken;
48
+ config.authExpiresAt = result.expiresAt;
49
+ config.publisherUsername = result.publisher.username;
50
+ saveConfig(config);
51
+ spinner.succeed(`Authenticated as ${chalk.green(result.publisher.displayName)} (${chalk.cyan('@' + result.publisher.username)})`);
52
+ console.log();
53
+ console.log(chalk.dim('You can now publish triks with `trik publish`'));
54
+ return;
55
+ }
56
+ // Still pending, continue polling
57
+ }
58
+ catch (error) {
59
+ if (error instanceof Error) {
60
+ if (error.message.includes('expired')) {
61
+ spinner.fail('Authorization expired');
62
+ console.log(chalk.dim('Please run `trik login` again'));
63
+ process.exit(1);
64
+ }
65
+ if (error.message.includes('denied') || error.message.includes('access_denied')) {
66
+ spinner.fail('Authorization denied');
67
+ process.exit(1);
68
+ }
69
+ }
70
+ throw error;
71
+ }
72
+ }
73
+ spinner.fail('Authorization timeout');
74
+ console.log(chalk.dim('Please run `trik login` again'));
75
+ process.exit(1);
76
+ }
77
+ catch (error) {
78
+ spinner.fail('Authentication failed');
79
+ if (error instanceof Error) {
80
+ console.error(chalk.red(error.message));
81
+ }
82
+ process.exit(1);
83
+ }
84
+ }
85
+ /**
86
+ * trik logout command
87
+ *
88
+ * Removes saved authentication credentials.
89
+ */
90
+ export async function logoutCommand() {
91
+ const config = loadConfig();
92
+ if (!config.authToken) {
93
+ console.log(chalk.yellow('Not logged in'));
94
+ return;
95
+ }
96
+ const username = config.publisherUsername;
97
+ // Try to invalidate session on server
98
+ try {
99
+ const registry = new RegistryClient();
100
+ await registry.logout();
101
+ }
102
+ catch {
103
+ // Ignore errors - we'll clear local credentials anyway
104
+ }
105
+ // Clear local credentials
106
+ delete config.authToken;
107
+ delete config.authExpiresAt;
108
+ delete config.publisherUsername;
109
+ saveConfig(config);
110
+ console.log(chalk.green(`Logged out${username ? ` from @${username}` : ''}`));
111
+ }
112
+ /**
113
+ * trik whoami command
114
+ *
115
+ * Shows the current authenticated user.
116
+ */
117
+ export async function whoamiCommand() {
118
+ const config = loadConfig();
119
+ if (!config.authToken) {
120
+ console.log(chalk.yellow('Not logged in'));
121
+ console.log(chalk.dim('Run `trik login` to authenticate'));
122
+ return;
123
+ }
124
+ // Check if token is expired
125
+ if (config.authExpiresAt && new Date(config.authExpiresAt) < new Date()) {
126
+ console.log(chalk.yellow('Session expired'));
127
+ console.log(chalk.dim('Run `trik login` to re-authenticate'));
128
+ return;
129
+ }
130
+ const spinner = ora('Fetching user info...').start();
131
+ try {
132
+ const registry = new RegistryClient();
133
+ const user = await registry.getCurrentUser();
134
+ spinner.stop();
135
+ console.log();
136
+ console.log(` ${chalk.bold(user.displayName)}`);
137
+ console.log(` ${chalk.cyan('@' + user.username)}`);
138
+ if (user.verified) {
139
+ console.log(` ${chalk.green('✓')} Verified publisher`);
140
+ }
141
+ console.log();
142
+ }
143
+ catch (error) {
144
+ spinner.fail('Failed to fetch user info');
145
+ if (error instanceof Error) {
146
+ console.error(chalk.red(error.message));
147
+ }
148
+ process.exit(1);
149
+ }
150
+ }
151
+ function sleep(ms) {
152
+ return new Promise((resolve) => setTimeout(resolve, ms));
153
+ }
154
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * trik publish command
3
+ *
4
+ * Publishes a trik to the TrikHub registry.
5
+ */
6
+ interface PublishOptions {
7
+ directory?: string;
8
+ tag?: string;
9
+ skipRelease?: boolean;
10
+ }
11
+ export declare function publishCommand(options: PublishOptions): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAgBD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAuT3E"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * trik publish command
3
+ *
4
+ * Publishes a trik to the TrikHub registry.
5
+ */
6
+ import { existsSync, readFileSync, mkdirSync, rmSync } from 'node:fs';
7
+ import { join, resolve } from 'node:path';
8
+ import { createHash } from 'node:crypto';
9
+ import { spawnSync } from 'node:child_process';
10
+ import { tmpdir } from 'node:os';
11
+ import chalk from 'chalk';
12
+ import ora from 'ora';
13
+ import * as tar from 'tar';
14
+ import { RegistryClient } from '../lib/registry.js';
15
+ import { loadConfig } from '../lib/storage.js';
16
+ import { validateTrik, formatValidationResult } from '../lib/validator.js';
17
+ export async function publishCommand(options) {
18
+ const spinner = ora();
19
+ const config = loadConfig();
20
+ // Check if logged in
21
+ if (!config.authToken) {
22
+ console.log(chalk.red('Not logged in'));
23
+ console.log(chalk.dim('Run `trik login` to authenticate first'));
24
+ process.exit(1);
25
+ }
26
+ // Check if token is expired
27
+ if (config.authExpiresAt && new Date(config.authExpiresAt) < new Date()) {
28
+ console.log(chalk.red('Session expired'));
29
+ console.log(chalk.dim('Run `trik login` to re-authenticate'));
30
+ process.exit(1);
31
+ }
32
+ const trikDir = resolve(options.directory || '.');
33
+ try {
34
+ // Step 1: Validate trik structure
35
+ spinner.start('Validating trik structure...');
36
+ // Check required files exist
37
+ const manifestPath = join(trikDir, 'manifest.json');
38
+ const trikhubPath = join(trikDir, 'trikhub.json');
39
+ if (!existsSync(manifestPath)) {
40
+ spinner.fail('Missing manifest.json');
41
+ console.log(chalk.dim('Create a manifest.json file with your trik definition'));
42
+ process.exit(1);
43
+ }
44
+ if (!existsSync(trikhubPath)) {
45
+ spinner.fail('Missing trikhub.json');
46
+ console.log(chalk.dim('Create a trikhub.json file with registry metadata'));
47
+ process.exit(1);
48
+ }
49
+ // Read manifest
50
+ let manifest;
51
+ try {
52
+ manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
53
+ }
54
+ catch (error) {
55
+ spinner.fail('Invalid manifest.json');
56
+ console.log(chalk.red(error instanceof Error ? error.message : 'Parse error'));
57
+ process.exit(1);
58
+ }
59
+ // Read trikhub.json
60
+ let trikhubMeta;
61
+ try {
62
+ trikhubMeta = JSON.parse(readFileSync(trikhubPath, 'utf-8'));
63
+ }
64
+ catch (error) {
65
+ spinner.fail('Invalid trikhub.json');
66
+ console.log(chalk.red(error instanceof Error ? error.message : 'Parse error'));
67
+ process.exit(1);
68
+ }
69
+ // Check entry point exists
70
+ const entryPath = join(trikDir, manifest.entry.module);
71
+ if (!existsSync(entryPath)) {
72
+ spinner.fail(`Missing entry point: ${manifest.entry.module}`);
73
+ console.log(chalk.dim('Build your trik first (e.g., npm run build)'));
74
+ process.exit(1);
75
+ }
76
+ // Run validation
77
+ const validation = validateTrik(trikDir);
78
+ if (!validation.valid) {
79
+ spinner.fail('Validation failed');
80
+ console.log(formatValidationResult(validation));
81
+ process.exit(1);
82
+ }
83
+ if (validation.warnings.length > 0) {
84
+ spinner.warn('Validation passed with warnings');
85
+ console.log(formatValidationResult(validation));
86
+ }
87
+ else {
88
+ spinner.succeed('Validation passed');
89
+ }
90
+ // Step 2: Determine version
91
+ const version = options.tag?.replace(/^v/, '') || manifest.version;
92
+ console.log(chalk.dim(` Version: ${version}`));
93
+ // Step 3: Get GitHub repo from trikhub.json
94
+ const repoUrl = trikhubMeta.repository;
95
+ const repoMatch = repoUrl.match(/github\.com\/([^/]+\/[^/]+)/);
96
+ if (!repoMatch) {
97
+ console.log(chalk.red('Invalid repository URL in trikhub.json'));
98
+ console.log(chalk.dim('Expected format: https://github.com/owner/repo'));
99
+ process.exit(1);
100
+ }
101
+ const githubRepo = repoMatch[1].replace(/\.git$/, '');
102
+ const [owner] = githubRepo.split('/');
103
+ const trikName = manifest.id || manifest.name;
104
+ const fullName = `@${owner}/${trikName}`;
105
+ console.log(chalk.dim(` Trik: ${fullName}`));
106
+ console.log(chalk.dim(` Repo: ${githubRepo}`));
107
+ // Step 4: Create tarball
108
+ spinner.start('Creating tarball...');
109
+ const tarballName = `${trikName}-${version}.tar.gz`;
110
+ const tarballDir = join(tmpdir(), `trikhub-publish-${Date.now()}`);
111
+ mkdirSync(tarballDir, { recursive: true });
112
+ const tarballPath = join(tarballDir, tarballName);
113
+ // Files to include in tarball
114
+ const filesToInclude = [
115
+ 'manifest.json',
116
+ 'trikhub.json',
117
+ manifest.entry.module,
118
+ ];
119
+ // Add dist directory if it exists
120
+ const distDir = join(trikDir, 'dist');
121
+ if (existsSync(distDir)) {
122
+ filesToInclude.push('dist');
123
+ }
124
+ // Add README if it exists
125
+ for (const readme of ['README.md', 'README.txt', 'README']) {
126
+ if (existsSync(join(trikDir, readme))) {
127
+ filesToInclude.push(readme);
128
+ break;
129
+ }
130
+ }
131
+ // Add LICENSE if it exists
132
+ for (const license of ['LICENSE', 'LICENSE.md', 'LICENSE.txt']) {
133
+ if (existsSync(join(trikDir, license))) {
134
+ filesToInclude.push(license);
135
+ break;
136
+ }
137
+ }
138
+ await tar.create({
139
+ gzip: true,
140
+ file: tarballPath,
141
+ cwd: trikDir,
142
+ }, filesToInclude.filter((f) => existsSync(join(trikDir, f))));
143
+ // Compute SHA-256
144
+ const tarballBuffer = readFileSync(tarballPath);
145
+ const sha256 = createHash('sha256').update(tarballBuffer).digest('hex');
146
+ spinner.succeed(`Tarball created (${(tarballBuffer.length / 1024).toFixed(1)} KB)`);
147
+ console.log(chalk.dim(` SHA-256: ${sha256.slice(0, 16)}...`));
148
+ // Step 5: Create GitHub Release (unless skipped)
149
+ let tarballUrl;
150
+ if (options.skipRelease) {
151
+ // User must provide tarball URL manually
152
+ console.log(chalk.yellow('\nSkipping GitHub release creation.'));
153
+ console.log('Please create a release manually and provide the tarball URL.');
154
+ console.log(chalk.dim(`Tarball saved at: ${tarballPath}`));
155
+ // For now, construct expected URL
156
+ tarballUrl = `https://github.com/${githubRepo}/releases/download/v${version}/${tarballName}`;
157
+ console.log(chalk.dim(`Expected tarball URL: ${tarballUrl}`));
158
+ }
159
+ else {
160
+ spinner.start('Creating GitHub release...');
161
+ // Check if gh CLI is available
162
+ const ghCheck = spawnSync('gh', ['--version'], { encoding: 'utf-8' });
163
+ if (ghCheck.status !== 0) {
164
+ spinner.fail('GitHub CLI (gh) not found');
165
+ console.log(chalk.dim('Install: https://cli.github.com/'));
166
+ console.log(chalk.dim('Or use --skip-release to create the release manually'));
167
+ // Cleanup
168
+ rmSync(tarballDir, { recursive: true, force: true });
169
+ process.exit(1);
170
+ }
171
+ // Check gh auth status
172
+ const authCheck = spawnSync('gh', ['auth', 'status'], { encoding: 'utf-8' });
173
+ if (authCheck.status !== 0) {
174
+ spinner.fail('GitHub CLI not authenticated');
175
+ console.log(chalk.dim('Run: gh auth login'));
176
+ rmSync(tarballDir, { recursive: true, force: true });
177
+ process.exit(1);
178
+ }
179
+ // Create release
180
+ try {
181
+ const releaseResult = spawnSync('gh', [
182
+ 'release',
183
+ 'create',
184
+ `v${version}`,
185
+ tarballPath,
186
+ '--repo',
187
+ githubRepo,
188
+ '--title',
189
+ `v${version}`,
190
+ '--notes',
191
+ `Release v${version}\n\nPublished via TrikHub CLI`,
192
+ ], { encoding: 'utf-8', cwd: trikDir });
193
+ if (releaseResult.status !== 0) {
194
+ // Check if release already exists
195
+ if (releaseResult.stderr?.includes('already exists')) {
196
+ spinner.info('Release already exists, uploading asset...');
197
+ // Upload asset to existing release
198
+ const uploadResult = spawnSync('gh', [
199
+ 'release',
200
+ 'upload',
201
+ `v${version}`,
202
+ tarballPath,
203
+ '--repo',
204
+ githubRepo,
205
+ '--clobber',
206
+ ], { encoding: 'utf-8', cwd: trikDir });
207
+ if (uploadResult.status !== 0) {
208
+ throw new Error(uploadResult.stderr || 'Failed to upload asset');
209
+ }
210
+ }
211
+ else {
212
+ throw new Error(releaseResult.stderr || 'Failed to create release');
213
+ }
214
+ }
215
+ tarballUrl = `https://github.com/${githubRepo}/releases/download/v${version}/${tarballName}`;
216
+ spinner.succeed('GitHub release created');
217
+ }
218
+ catch (error) {
219
+ spinner.fail('Failed to create GitHub release');
220
+ console.log(chalk.red(error instanceof Error ? error.message : String(error)));
221
+ rmSync(tarballDir, { recursive: true, force: true });
222
+ process.exit(1);
223
+ }
224
+ }
225
+ // Step 6: Register with registry
226
+ spinner.start('Publishing to TrikHub registry...');
227
+ const registry = new RegistryClient();
228
+ try {
229
+ // Check if trik exists, if not register it
230
+ const existingTrik = await registry.getTrik(fullName);
231
+ if (!existingTrik) {
232
+ // Register new trik
233
+ try {
234
+ await registry.registerTrik({
235
+ githubRepo,
236
+ name: trikName, // Explicit name from manifest.id
237
+ description: trikhubMeta.shortDescription || manifest.description,
238
+ categories: trikhubMeta.categories,
239
+ keywords: trikhubMeta.keywords,
240
+ });
241
+ console.log(chalk.dim(` Registered new trik: ${fullName}`));
242
+ }
243
+ catch (regError) {
244
+ // If trik already exists (409), that's fine - continue to publish version
245
+ // This can happen if the trik was registered but GET didn't find it
246
+ if (regError instanceof Error && !regError.message.includes('already exists')) {
247
+ throw regError;
248
+ }
249
+ console.log(chalk.dim(` Trik already registered: ${fullName}`));
250
+ }
251
+ }
252
+ // Publish version
253
+ await registry.publishVersion(fullName, {
254
+ version,
255
+ tarballUrl,
256
+ sha256,
257
+ manifest: manifest,
258
+ });
259
+ spinner.succeed('Published to TrikHub registry');
260
+ }
261
+ catch (error) {
262
+ spinner.fail('Failed to publish to registry');
263
+ console.log(chalk.red(error instanceof Error ? error.message : String(error)));
264
+ rmSync(tarballDir, { recursive: true, force: true });
265
+ process.exit(1);
266
+ }
267
+ // Cleanup
268
+ rmSync(tarballDir, { recursive: true, force: true });
269
+ // Success message
270
+ console.log();
271
+ console.log(chalk.green.bold(' Published successfully!'));
272
+ console.log();
273
+ console.log(` ${chalk.dim('Install with:')} trik install ${fullName}@${version}`);
274
+ console.log(` ${chalk.dim('View at:')} https://trikhub.com/triks/${encodeURIComponent(fullName)}`);
275
+ console.log();
276
+ }
277
+ catch (error) {
278
+ spinner.fail('Publish failed');
279
+ if (error instanceof Error) {
280
+ console.error(chalk.red(error.message));
281
+ }
282
+ process.exit(1);
283
+ }
284
+ }
285
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * trik search command
3
+ *
4
+ * Searches the registry for triks.
5
+ */
6
+ interface SearchOptions {
7
+ json?: boolean;
8
+ limit?: string;
9
+ }
10
+ export declare function searchCommand(query: string, options: SearchOptions): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAyDf"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * trik search command
3
+ *
4
+ * Searches the registry for triks.
5
+ */
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { registry } from '../lib/registry.js';
9
+ import { isTrikInstalled } from '../lib/storage.js';
10
+ export async function searchCommand(query, options) {
11
+ const spinner = ora(`Searching for "${query}"...`).start();
12
+ try {
13
+ const limit = parseInt(options.limit ?? '10', 10);
14
+ const results = await registry.search(query, { perPage: limit });
15
+ spinner.stop();
16
+ if (options.json) {
17
+ console.log(JSON.stringify(results, null, 2));
18
+ return;
19
+ }
20
+ if (results.total === 0) {
21
+ console.log(chalk.yellow(`\nNo triks found for "${query}"\n`));
22
+ console.log(chalk.dim('Try a different search term or browse all triks at https://trikhub.com'));
23
+ return;
24
+ }
25
+ console.log(chalk.bold(`\nFound ${results.total} trik${results.total === 1 ? '' : 's'}:\n`));
26
+ for (const trik of results.results) {
27
+ const installed = isTrikInstalled(trik.fullName);
28
+ const installedBadge = installed ? chalk.green(' [installed]') : '';
29
+ const verifiedBadge = trik.verified ? chalk.blue(' ✓') : '';
30
+ console.log(` ${chalk.cyan(trik.fullName)}${verifiedBadge}${installedBadge}`);
31
+ console.log(` ${chalk.dim(trik.description)}`);
32
+ console.log(chalk.dim(` v${trik.latestVersion} · ⬇ ${formatNumber(trik.downloads)} · ⭐ ${trik.stars}`));
33
+ console.log();
34
+ }
35
+ if (results.total > results.results.length) {
36
+ console.log(chalk.dim(`Showing ${results.results.length} of ${results.total} results. Use --limit to see more.`));
37
+ }
38
+ console.log(chalk.dim(`\nInstall with: trik install @scope/name`));
39
+ }
40
+ catch (error) {
41
+ spinner.fail('Search failed');
42
+ if (error instanceof Error) {
43
+ console.error(chalk.red(error.message));
44
+ }
45
+ process.exit(1);
46
+ }
47
+ }
48
+ /**
49
+ * Format a number with K/M suffixes
50
+ */
51
+ function formatNumber(num) {
52
+ if (num >= 1_000_000) {
53
+ return `${(num / 1_000_000).toFixed(1)}M`;
54
+ }
55
+ if (num >= 1_000) {
56
+ return `${(num / 1_000).toFixed(1)}K`;
57
+ }
58
+ return num.toString();
59
+ }
60
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * trik sync command
3
+ *
4
+ * Discovers trik packages in node_modules and adds them to the config.
5
+ * This enables npm-based trik installation:
6
+ * 1. Add trik to package.json dependencies
7
+ * 2. Run npm install
8
+ * 3. Run trik sync to register the trik
9
+ */
10
+ interface SyncOptions {
11
+ dryRun?: boolean;
12
+ json?: boolean;
13
+ }
14
+ /**
15
+ * Sync command implementation
16
+ */
17
+ export declare function syncCommand(options: SyncOptions): Promise<void>;
18
+ export {};
19
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAmID;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFrE"}