@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,193 @@
|
|
|
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
|
+
import { readdir, readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { join, dirname } from 'node:path';
|
|
13
|
+
import chalk from 'chalk';
|
|
14
|
+
import ora from 'ora';
|
|
15
|
+
import { validateManifest } from '@trikhub/manifest';
|
|
16
|
+
const NPM_CONFIG_DIR = '.trikhub';
|
|
17
|
+
const NPM_CONFIG_FILE = 'config.json';
|
|
18
|
+
/**
|
|
19
|
+
* Get the path to the npm-based config file
|
|
20
|
+
*/
|
|
21
|
+
function getNpmConfigPath(baseDir = process.cwd()) {
|
|
22
|
+
return join(baseDir, NPM_CONFIG_DIR, NPM_CONFIG_FILE);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read the npm-based trik config
|
|
26
|
+
*/
|
|
27
|
+
async function readNpmConfig(baseDir = process.cwd()) {
|
|
28
|
+
const configPath = getNpmConfigPath(baseDir);
|
|
29
|
+
if (!existsSync(configPath)) {
|
|
30
|
+
return { triks: [] };
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const content = await readFile(configPath, 'utf-8');
|
|
34
|
+
const config = JSON.parse(content);
|
|
35
|
+
return {
|
|
36
|
+
triks: Array.isArray(config.triks) ? config.triks : [],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return { triks: [] };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Write the npm-based trik config
|
|
45
|
+
*/
|
|
46
|
+
async function writeNpmConfig(config, baseDir = process.cwd()) {
|
|
47
|
+
const configPath = getNpmConfigPath(baseDir);
|
|
48
|
+
const configDir = dirname(configPath);
|
|
49
|
+
if (!existsSync(configDir)) {
|
|
50
|
+
await mkdir(configDir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a package directory contains a valid trik manifest
|
|
56
|
+
*/
|
|
57
|
+
async function isTrikPackage(packagePath) {
|
|
58
|
+
const manifestPath = join(packagePath, 'manifest.json');
|
|
59
|
+
if (!existsSync(manifestPath)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const content = await readFile(manifestPath, 'utf-8');
|
|
64
|
+
const manifest = JSON.parse(content);
|
|
65
|
+
// Use the manifest validator from @trikhub/manifest
|
|
66
|
+
const validation = validateManifest(manifest);
|
|
67
|
+
return validation.valid;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Scan node_modules for packages that are triks
|
|
75
|
+
*/
|
|
76
|
+
async function discoverTriksInNodeModules(nodeModulesPath) {
|
|
77
|
+
const triks = [];
|
|
78
|
+
if (!existsSync(nodeModulesPath)) {
|
|
79
|
+
return triks;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const entries = await readdir(nodeModulesPath, { withFileTypes: true });
|
|
83
|
+
for (const entry of entries) {
|
|
84
|
+
if (!entry.isDirectory())
|
|
85
|
+
continue;
|
|
86
|
+
if (entry.name === '.bin' || entry.name === '.cache')
|
|
87
|
+
continue;
|
|
88
|
+
const entryPath = join(nodeModulesPath, entry.name);
|
|
89
|
+
// Handle scoped packages (@scope/package)
|
|
90
|
+
if (entry.name.startsWith('@')) {
|
|
91
|
+
try {
|
|
92
|
+
const scopedEntries = await readdir(entryPath, { withFileTypes: true });
|
|
93
|
+
for (const scopedEntry of scopedEntries) {
|
|
94
|
+
if (!scopedEntry.isDirectory())
|
|
95
|
+
continue;
|
|
96
|
+
const packageName = `${entry.name}/${scopedEntry.name}`;
|
|
97
|
+
const packagePath = join(entryPath, scopedEntry.name);
|
|
98
|
+
if (await isTrikPackage(packagePath)) {
|
|
99
|
+
triks.push(packageName);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Skip unreadable scope directories
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Regular package
|
|
109
|
+
if (await isTrikPackage(entryPath)) {
|
|
110
|
+
triks.push(entry.name);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// node_modules doesn't exist or isn't readable
|
|
117
|
+
}
|
|
118
|
+
return triks;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Sync command implementation
|
|
122
|
+
*/
|
|
123
|
+
export async function syncCommand(options) {
|
|
124
|
+
const spinner = ora();
|
|
125
|
+
const baseDir = process.cwd();
|
|
126
|
+
const nodeModulesPath = join(baseDir, 'node_modules');
|
|
127
|
+
try {
|
|
128
|
+
spinner.start('Scanning node_modules for triks...');
|
|
129
|
+
// Discover triks in node_modules
|
|
130
|
+
const discoveredTriks = await discoverTriksInNodeModules(nodeModulesPath);
|
|
131
|
+
if (discoveredTriks.length === 0) {
|
|
132
|
+
spinner.info('No triks found in node_modules.');
|
|
133
|
+
console.log(chalk.dim('\nTriks are npm packages with a manifest.json file.'));
|
|
134
|
+
console.log(chalk.dim('Install a trik package and run sync again.'));
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
spinner.succeed(`Found ${discoveredTriks.length} trik(s) in node_modules`);
|
|
138
|
+
// Read current config
|
|
139
|
+
const config = await readNpmConfig(baseDir);
|
|
140
|
+
const currentTriks = new Set(config.triks);
|
|
141
|
+
const result = {
|
|
142
|
+
added: [],
|
|
143
|
+
alreadyConfigured: [],
|
|
144
|
+
total: discoveredTriks.length,
|
|
145
|
+
};
|
|
146
|
+
for (const trik of discoveredTriks) {
|
|
147
|
+
if (currentTriks.has(trik)) {
|
|
148
|
+
result.alreadyConfigured.push(trik);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
result.added.push(trik);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (options.json) {
|
|
155
|
+
console.log(JSON.stringify(result, null, 2));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (result.added.length === 0) {
|
|
159
|
+
console.log(chalk.green('\n✓ All discovered triks are already configured.'));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (options.dryRun) {
|
|
163
|
+
console.log(chalk.yellow('\nDry run - would add the following triks to config:\n'));
|
|
164
|
+
for (const trik of result.added) {
|
|
165
|
+
console.log(chalk.cyan(` + ${trik}`));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Update config
|
|
170
|
+
config.triks = [...config.triks, ...result.added].sort();
|
|
171
|
+
await writeNpmConfig(config, baseDir);
|
|
172
|
+
console.log(chalk.green('\nAdded to .trikhub/config.json:\n'));
|
|
173
|
+
for (const trik of result.added) {
|
|
174
|
+
console.log(chalk.cyan(` + ${trik}`));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (result.alreadyConfigured.length > 0) {
|
|
178
|
+
console.log(chalk.dim('\nAlready configured:'));
|
|
179
|
+
for (const trik of result.alreadyConfigured) {
|
|
180
|
+
console.log(chalk.dim(` = ${trik}`));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
console.log(chalk.dim(`\nTotal: ${result.total} trik(s), ${result.added.length} added`));
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
spinner.fail('Sync failed');
|
|
187
|
+
if (error instanceof Error) {
|
|
188
|
+
console.error(chalk.red(error.message));
|
|
189
|
+
}
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trik uninstall command
|
|
3
|
+
*
|
|
4
|
+
* Removes a trik from both package.json and .trikhub/config.json.
|
|
5
|
+
*
|
|
6
|
+
* Workflow:
|
|
7
|
+
* 1. Remove from .trikhub/config.json
|
|
8
|
+
* 2. Run npm/pnpm/yarn uninstall
|
|
9
|
+
*/
|
|
10
|
+
export declare function uninstallCommand(trikInput: string): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2GH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEvE"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trik uninstall command
|
|
3
|
+
*
|
|
4
|
+
* Removes a trik from both package.json and .trikhub/config.json.
|
|
5
|
+
*
|
|
6
|
+
* Workflow:
|
|
7
|
+
* 1. Remove from .trikhub/config.json
|
|
8
|
+
* 2. Run npm/pnpm/yarn uninstall
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { spawn } from 'node:child_process';
|
|
14
|
+
import chalk from 'chalk';
|
|
15
|
+
import ora from 'ora';
|
|
16
|
+
const NPM_CONFIG_DIR = '.trikhub';
|
|
17
|
+
const NPM_CONFIG_FILE = 'config.json';
|
|
18
|
+
/**
|
|
19
|
+
* Detect which package manager is being used in the project
|
|
20
|
+
*/
|
|
21
|
+
function detectPackageManager(baseDir) {
|
|
22
|
+
if (existsSync(join(baseDir, 'pnpm-lock.yaml'))) {
|
|
23
|
+
return 'pnpm';
|
|
24
|
+
}
|
|
25
|
+
if (existsSync(join(baseDir, 'yarn.lock'))) {
|
|
26
|
+
return 'yarn';
|
|
27
|
+
}
|
|
28
|
+
return 'npm';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run a command and return a promise
|
|
32
|
+
*/
|
|
33
|
+
function runCommand(command, args, cwd) {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
const proc = spawn(command, args, {
|
|
36
|
+
cwd,
|
|
37
|
+
stdio: 'inherit',
|
|
38
|
+
shell: true,
|
|
39
|
+
});
|
|
40
|
+
proc.on('close', (code) => {
|
|
41
|
+
if (code === 0) {
|
|
42
|
+
resolve();
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
reject(new Error(`Command failed with exit code ${code}`));
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
proc.on('error', (err) => {
|
|
49
|
+
reject(err);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the path to the npm-based config file
|
|
55
|
+
*/
|
|
56
|
+
function getNpmConfigPath(baseDir) {
|
|
57
|
+
return join(baseDir, NPM_CONFIG_DIR, NPM_CONFIG_FILE);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Read the npm-based trik config
|
|
61
|
+
*/
|
|
62
|
+
async function readNpmConfig(baseDir) {
|
|
63
|
+
const configPath = getNpmConfigPath(baseDir);
|
|
64
|
+
if (!existsSync(configPath)) {
|
|
65
|
+
return { triks: [] };
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const content = await readFile(configPath, 'utf-8');
|
|
69
|
+
const config = JSON.parse(content);
|
|
70
|
+
return {
|
|
71
|
+
triks: Array.isArray(config.triks) ? config.triks : [],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return { triks: [] };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Write the npm-based trik config
|
|
80
|
+
*/
|
|
81
|
+
async function writeNpmConfig(config, baseDir) {
|
|
82
|
+
const configPath = getNpmConfigPath(baseDir);
|
|
83
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Remove a trik from the config
|
|
87
|
+
*/
|
|
88
|
+
async function removeTrikFromConfig(packageName, baseDir) {
|
|
89
|
+
const config = await readNpmConfig(baseDir);
|
|
90
|
+
if (!config.triks.includes(packageName)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
config.triks = config.triks.filter((t) => t !== packageName);
|
|
94
|
+
await writeNpmConfig(config, baseDir);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
export async function uninstallCommand(trikInput) {
|
|
98
|
+
const spinner = ora();
|
|
99
|
+
const baseDir = process.cwd();
|
|
100
|
+
try {
|
|
101
|
+
// Parse package name (remove @ version suffix if present)
|
|
102
|
+
let packageName = trikInput;
|
|
103
|
+
const atIndex = trikInput.lastIndexOf('@');
|
|
104
|
+
if (atIndex > 0) {
|
|
105
|
+
packageName = trikInput.substring(0, atIndex);
|
|
106
|
+
}
|
|
107
|
+
// Check if package.json exists
|
|
108
|
+
const packageJsonPath = join(baseDir, 'package.json');
|
|
109
|
+
if (!existsSync(packageJsonPath)) {
|
|
110
|
+
console.log(chalk.red('No package.json found in current directory.'));
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
// Remove from config first
|
|
114
|
+
spinner.start(`Removing ${chalk.cyan(packageName)} from config...`);
|
|
115
|
+
const wasInConfig = await removeTrikFromConfig(packageName, baseDir);
|
|
116
|
+
if (!wasInConfig) {
|
|
117
|
+
spinner.info(`${chalk.yellow(packageName)} was not in .trikhub/config.json`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
spinner.succeed(`Removed ${chalk.green(packageName)} from .trikhub/config.json`);
|
|
121
|
+
}
|
|
122
|
+
// Detect package manager
|
|
123
|
+
const pm = detectPackageManager(baseDir);
|
|
124
|
+
// Build uninstall command
|
|
125
|
+
const uninstallArgs = [];
|
|
126
|
+
switch (pm) {
|
|
127
|
+
case 'pnpm':
|
|
128
|
+
uninstallArgs.push('remove', packageName);
|
|
129
|
+
break;
|
|
130
|
+
case 'yarn':
|
|
131
|
+
uninstallArgs.push('remove', packageName);
|
|
132
|
+
break;
|
|
133
|
+
case 'npm':
|
|
134
|
+
default:
|
|
135
|
+
uninstallArgs.push('uninstall', packageName);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
// Run package manager uninstall
|
|
139
|
+
spinner.start(`Uninstalling ${chalk.cyan(packageName)}...`);
|
|
140
|
+
spinner.stopAndPersist({ symbol: '📦', text: `Uninstalling ${chalk.cyan(packageName)}...` });
|
|
141
|
+
await runCommand(pm, uninstallArgs, baseDir);
|
|
142
|
+
console.log();
|
|
143
|
+
console.log(chalk.green(`✓ Uninstalled ${packageName}`));
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
spinner.fail('Uninstall failed');
|
|
147
|
+
if (error instanceof Error) {
|
|
148
|
+
console.error(chalk.red(error.message));
|
|
149
|
+
}
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAQtB,MAAM,cAAc,GAAG,UAAU,CAAC;AAClC,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC;;GAEG;AACH,SAAS,oBAAoB,CAAC,OAAe;IAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,OAAe,EAAE,IAAc,EAAE,GAAW;IAC9D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YAChC,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,OAAe;IAC1C,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;QACrD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;SACvD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,MAAsB,EAAE,OAAe;IACnE,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CAAC,WAAmB,EAAE,OAAe;IACtE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;IAC7D,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,0DAA0D;QAC1D,IAAI,WAAW,GAAG,SAAS,CAAC;QAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,+BAA+B;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,2BAA2B;QAC3B,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAErE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;QACnF,CAAC;QAED,yBAAyB;QACzB,MAAM,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAEzC,0BAA0B;QAC1B,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,QAAQ,EAAE,EAAE,CAAC;YACX,KAAK,MAAM;gBACT,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,MAAM;gBACT,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,KAAK,CAAC;YACX;gBACE,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBAC7C,MAAM;QACV,CAAC;QAED,gCAAgC;QAChC,OAAO,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5D,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QAE7F,MAAM,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAE7C,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC,CAAC;IAE3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trik upgrade command
|
|
3
|
+
*
|
|
4
|
+
* Upgrades an installed trik to the latest version.
|
|
5
|
+
*/
|
|
6
|
+
interface UpgradeOptions {
|
|
7
|
+
force?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function upgradeCommand(trikInput: string, options: UpgradeOptions): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Upgrade all installed triks
|
|
12
|
+
*/
|
|
13
|
+
export declare function upgradeAllCommand(options: UpgradeOptions): Promise<void>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=upgrade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAsEf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkF9E"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trik upgrade command
|
|
3
|
+
*
|
|
4
|
+
* Upgrades an installed trik to the latest version.
|
|
5
|
+
*/
|
|
6
|
+
import { rmSync } from 'node:fs';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import ora from 'ora';
|
|
9
|
+
import * as semver from 'semver';
|
|
10
|
+
import { parseTrikName } from '../types.js';
|
|
11
|
+
import { registry } from '../lib/registry.js';
|
|
12
|
+
import { getConfigContext } from '../lib/config.js';
|
|
13
|
+
import { getInstalledTrik, getInstalledTriks, isTrikInstalled, removeFromLockfile, getTrikPath, } from '../lib/storage.js';
|
|
14
|
+
import { installCommand } from './install.js';
|
|
15
|
+
export async function upgradeCommand(trikInput, options) {
|
|
16
|
+
const spinner = ora();
|
|
17
|
+
try {
|
|
18
|
+
// Get the current config context (local if available, otherwise global)
|
|
19
|
+
const ctx = getConfigContext();
|
|
20
|
+
// Parse the trik name
|
|
21
|
+
const { fullName } = parseTrikName(trikInput);
|
|
22
|
+
// Check if installed in this scope
|
|
23
|
+
if (!isTrikInstalled(fullName, ctx)) {
|
|
24
|
+
console.log(chalk.red(`${fullName} is not installed`));
|
|
25
|
+
if (ctx.scope === 'local') {
|
|
26
|
+
console.log(chalk.dim(` (checked in ${ctx.trikhubDir})`));
|
|
27
|
+
}
|
|
28
|
+
console.log(chalk.dim(`Use 'trik install ${fullName}' to install it`));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const installed = getInstalledTrik(fullName, ctx);
|
|
32
|
+
if (!installed) {
|
|
33
|
+
console.log(chalk.red(`Could not find installation info for ${fullName}`));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
// Fetch latest version from registry
|
|
37
|
+
spinner.start(`Checking for updates to ${chalk.cyan(fullName)}...`);
|
|
38
|
+
const trikInfo = await registry.getTrik(fullName);
|
|
39
|
+
if (!trikInfo) {
|
|
40
|
+
spinner.fail(`Trik ${chalk.red(fullName)} not found in registry`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const currentVersion = installed.version;
|
|
44
|
+
const latestVersion = trikInfo.latestVersion;
|
|
45
|
+
// Compare versions
|
|
46
|
+
if (!options.force && semver.gte(currentVersion, latestVersion)) {
|
|
47
|
+
spinner.succeed(`${chalk.green(fullName)} is already up to date (v${currentVersion})`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
spinner.text = `Upgrading ${chalk.cyan(fullName)} from v${currentVersion} to v${latestVersion}...`;
|
|
51
|
+
// Remove current installation
|
|
52
|
+
const installPath = getTrikPath(fullName, ctx);
|
|
53
|
+
rmSync(installPath, { recursive: true, force: true });
|
|
54
|
+
removeFromLockfile(fullName, ctx);
|
|
55
|
+
spinner.stop();
|
|
56
|
+
// Reinstall with latest version
|
|
57
|
+
// Note: installCommand will resolve config and should find the same context
|
|
58
|
+
await installCommand(fullName, { version: latestVersion });
|
|
59
|
+
console.log();
|
|
60
|
+
console.log(chalk.green(`✓ Upgraded ${fullName} from v${currentVersion} → v${latestVersion}`));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
spinner.fail('Upgrade failed');
|
|
64
|
+
if (error instanceof Error) {
|
|
65
|
+
console.error(chalk.red(error.message));
|
|
66
|
+
}
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Upgrade all installed triks
|
|
72
|
+
*/
|
|
73
|
+
export async function upgradeAllCommand(options) {
|
|
74
|
+
const spinner = ora();
|
|
75
|
+
try {
|
|
76
|
+
// Get the current config context (local if available, otherwise global)
|
|
77
|
+
const ctx = getConfigContext();
|
|
78
|
+
// Get all installed triks in this scope
|
|
79
|
+
const installedTriks = getInstalledTriks(ctx);
|
|
80
|
+
if (installedTriks.length === 0) {
|
|
81
|
+
console.log(chalk.yellow('No triks installed'));
|
|
82
|
+
if (ctx.scope === 'local') {
|
|
83
|
+
console.log(chalk.dim(` (in ${ctx.trikhubDir})`));
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const scopeLabel = ctx.scope === 'local'
|
|
88
|
+
? ` (local: ${ctx.trikhubDir})`
|
|
89
|
+
: '';
|
|
90
|
+
console.log(chalk.cyan(`Checking ${installedTriks.length} installed trik(s) for updates...${scopeLabel}\n`));
|
|
91
|
+
let upgraded = 0;
|
|
92
|
+
let upToDate = 0;
|
|
93
|
+
let failed = 0;
|
|
94
|
+
for (const installed of installedTriks) {
|
|
95
|
+
spinner.start(`Checking ${chalk.cyan(installed.fullName)}...`);
|
|
96
|
+
try {
|
|
97
|
+
const trikInfo = await registry.getTrik(installed.fullName);
|
|
98
|
+
if (!trikInfo) {
|
|
99
|
+
spinner.warn(`${installed.fullName} not found in registry`);
|
|
100
|
+
failed++;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const currentVersion = installed.version;
|
|
104
|
+
const latestVersion = trikInfo.latestVersion;
|
|
105
|
+
if (!options.force && semver.gte(currentVersion, latestVersion)) {
|
|
106
|
+
spinner.succeed(`${installed.fullName} is up to date (v${currentVersion})`);
|
|
107
|
+
upToDate++;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
spinner.text = `Upgrading ${installed.fullName} v${currentVersion} → v${latestVersion}...`;
|
|
111
|
+
// Remove and reinstall
|
|
112
|
+
const installPath = getTrikPath(installed.fullName, ctx);
|
|
113
|
+
rmSync(installPath, { recursive: true, force: true });
|
|
114
|
+
removeFromLockfile(installed.fullName, ctx);
|
|
115
|
+
spinner.stop();
|
|
116
|
+
await installCommand(installed.fullName, { version: latestVersion });
|
|
117
|
+
upgraded++;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
spinner.fail(`Failed to upgrade ${installed.fullName}`);
|
|
121
|
+
if (error instanceof Error) {
|
|
122
|
+
console.error(chalk.dim(` ${error.message}`));
|
|
123
|
+
}
|
|
124
|
+
failed++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
console.log();
|
|
128
|
+
console.log(chalk.bold('Summary:'));
|
|
129
|
+
if (upgraded > 0)
|
|
130
|
+
console.log(chalk.green(` ${upgraded} upgraded`));
|
|
131
|
+
if (upToDate > 0)
|
|
132
|
+
console.log(chalk.dim(` ${upToDate} up to date`));
|
|
133
|
+
if (failed > 0)
|
|
134
|
+
console.log(chalk.red(` ${failed} failed`));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
spinner.fail('Upgrade failed');
|
|
138
|
+
if (error instanceof Error) {
|
|
139
|
+
console.error(chalk.red(error.message));
|
|
140
|
+
}
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=upgrade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrikHub CLI Library Exports
|
|
3
|
+
*
|
|
4
|
+
* These exports can be used programmatically.
|
|
5
|
+
*/
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
export { loadConfig, saveConfig, loadLockfile, saveLockfile, getInstalledTriks, getInstalledTrik, isTrikInstalled, getTrikPath, TRIKHUB_DIR, TRIKS_DIR, CONFIG_PATH, LOCKFILE_PATH, } from './lib/storage.js';
|
|
8
|
+
export { RegistryClient, registry } from './lib/registry.js';
|
|
9
|
+
export { syncCommand } from './commands/sync.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TrikHub CLI Library Exports
|
|
3
|
+
*
|
|
4
|
+
* These exports can be used programmatically.
|
|
5
|
+
*/
|
|
6
|
+
// Types
|
|
7
|
+
export * from './types.js';
|
|
8
|
+
// Storage utilities
|
|
9
|
+
export { loadConfig, saveConfig, loadLockfile, saveLockfile, getInstalledTriks, getInstalledTrik, isTrikInstalled, getTrikPath, TRIKHUB_DIR, TRIKS_DIR, CONFIG_PATH, LOCKFILE_PATH, } from './lib/storage.js';
|
|
10
|
+
// Registry client
|
|
11
|
+
export { RegistryClient, registry } from './lib/registry.js';
|
|
12
|
+
// Commands (for programmatic use)
|
|
13
|
+
export { syncCommand } from './commands/sync.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,oBAAoB;AACpB,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7D,kCAAkC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|