magicpath-ai 1.3.0-beta.2 → 1.3.0-beta.4
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/README.md +63 -8
- package/dist/cli.js +28 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts +49 -0
- package/dist/commands/add.js +129 -25
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/auth.js +33 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/clone.js +112 -86
- package/dist/commands/clone.js.map +1 -1
- package/dist/commands/info.d.ts +2 -0
- package/dist/commands/info.js +124 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +280 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/integrate.js +282 -81
- package/dist/commands/integrate.js.map +1 -1
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.js +138 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/schema.d.ts +2 -0
- package/dist/commands/schema.js +213 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +120 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skills.d.ts +2 -0
- package/dist/commands/skills.js +55 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/view.d.ts +2 -0
- package/dist/commands/view.js +27 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.js +58 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/util/api.d.ts +4 -0
- package/dist/util/api.js +12 -0
- package/dist/util/api.js.map +1 -1
- package/dist/util/auth.js +5 -0
- package/dist/util/auth.js.map +1 -1
- package/dist/util/component.d.ts +8 -8
- package/dist/util/diff.d.ts +4 -0
- package/dist/util/diff.js +11 -3
- package/dist/util/diff.js.map +1 -1
- package/dist/util/integrate.d.ts +13 -2
- package/dist/util/integrate.js +111 -9
- package/dist/util/integrate.js.map +1 -1
- package/dist/util/output.d.ts +14 -0
- package/dist/util/output.js +27 -0
- package/dist/util/output.js.map +1 -0
- package/package.json +3 -2
- package/skills/magicpath-add-component/SKILL.md +49 -0
- package/skills/magicpath-integrate/SKILL.md +50 -0
- package/skills/magicpath-list/SKILL.md +38 -0
- package/skills/magicpath-shared/SKILL.md +34 -0
package/dist/commands/clone.js
CHANGED
|
@@ -6,6 +6,7 @@ import os from 'os';
|
|
|
6
6
|
import fs from 'fs-extra';
|
|
7
7
|
import { enableDebugLogger, logger } from '../util/logger.js';
|
|
8
8
|
import { MagicPathError } from '../util/error.js';
|
|
9
|
+
import { isJsonMode, jsonResult, jsonError } from '../util/output.js';
|
|
9
10
|
import { downloadProject, releaseProject, unpackProject, } from '../util/project.js';
|
|
10
11
|
import { installDependencies } from '../util/dependencies.js';
|
|
11
12
|
import { openInIDE, openInFileManager } from '../util/ide.js';
|
|
@@ -13,6 +14,8 @@ const cloneOptionsSchema = z.object({
|
|
|
13
14
|
key: z.string(),
|
|
14
15
|
debug: z.boolean().default(false),
|
|
15
16
|
ide: z.enum(['cursor', 'antigravity', 'vscode', 'webstorm']).optional(),
|
|
17
|
+
dir: z.string().optional(),
|
|
18
|
+
name: z.string().optional(),
|
|
16
19
|
});
|
|
17
20
|
export function registerCloneCommand(program) {
|
|
18
21
|
program
|
|
@@ -21,6 +24,8 @@ export function registerCloneCommand(program) {
|
|
|
21
24
|
.requiredOption('-k, --key <accessKey>', '🔑 One-time magic access key to unlock and download your project')
|
|
22
25
|
.option('-d, --debug', 'Get verbose debug logs in the CLI')
|
|
23
26
|
.option('-i, --ide <ide>', 'Pre-select IDE to open project in (cursor, antigravity, vscode, webstorm)')
|
|
27
|
+
.option('--dir <directory>', 'Target directory for non-interactive use')
|
|
28
|
+
.option('--name <projectName>', 'Project name for non-interactive use')
|
|
24
29
|
.action(async (options) => {
|
|
25
30
|
let cloneOptions;
|
|
26
31
|
try {
|
|
@@ -31,103 +36,119 @@ export function registerCloneCommand(program) {
|
|
|
31
36
|
}
|
|
32
37
|
if (cloneOptions.debug)
|
|
33
38
|
enableDebugLogger();
|
|
39
|
+
const json = isJsonMode();
|
|
40
|
+
// In JSON mode, require --dir and --name
|
|
41
|
+
if (json && (!cloneOptions.dir || !cloneOptions.name)) {
|
|
42
|
+
jsonError(new Error('In JSON mode, --dir and --name are required for clone.'));
|
|
43
|
+
}
|
|
34
44
|
logger.debug({ options });
|
|
35
45
|
logger.debug({ options: cloneOptions });
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
let finalTargetDir;
|
|
47
|
+
let projectName;
|
|
48
|
+
if (cloneOptions.dir && cloneOptions.name) {
|
|
49
|
+
// Non-interactive mode
|
|
50
|
+
finalTargetDir = path.resolve(cloneOptions.dir);
|
|
51
|
+
projectName = cloneOptions.name;
|
|
52
|
+
await fs.ensureDir(finalTargetDir);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Step 1: Ask the user where to drop their fresh code
|
|
56
|
+
const homeDir = os.homedir();
|
|
57
|
+
const commonDirs = [
|
|
58
|
+
{ name: 'Documents', path: path.join(homeDir, 'Documents') },
|
|
59
|
+
{ name: 'Desktop', path: path.join(homeDir, 'Desktop') },
|
|
60
|
+
{ name: 'Downloads', path: path.join(homeDir, 'Downloads') },
|
|
61
|
+
];
|
|
62
|
+
// Filter to only include directories that actually exist
|
|
63
|
+
const existingDirs = await Promise.all(commonDirs.map(async (dir) => {
|
|
64
|
+
try {
|
|
65
|
+
const exists = await fs.pathExists(dir.path);
|
|
66
|
+
return exists ? dir : null;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}));
|
|
72
|
+
const validDirs = existingDirs.filter((dir) => dir !== null);
|
|
73
|
+
// Build choices array starting with current directory and home directory
|
|
74
|
+
const choices = [
|
|
75
|
+
{
|
|
76
|
+
title: `Right here (current folder: ${process.cwd()})`,
|
|
77
|
+
value: process.cwd(),
|
|
78
|
+
},
|
|
79
|
+
{ title: `Home directory (${homeDir})`, value: homeDir },
|
|
80
|
+
];
|
|
81
|
+
// Add existing standard directories
|
|
82
|
+
validDirs.forEach((dir) => {
|
|
83
|
+
choices.push({ title: dir.name, value: dir.path });
|
|
84
|
+
});
|
|
85
|
+
// Add option for custom directory
|
|
86
|
+
choices.push({ title: 'Other (specify custom path)', value: 'custom' });
|
|
87
|
+
const { targetDir } = await prompts({
|
|
88
|
+
type: 'select',
|
|
89
|
+
name: 'targetDir',
|
|
90
|
+
message: 'Where should we put your code?',
|
|
91
|
+
choices,
|
|
92
|
+
initial: 0,
|
|
93
|
+
});
|
|
94
|
+
finalTargetDir = targetDir;
|
|
95
|
+
// Handle custom directory selection
|
|
96
|
+
if (targetDir === 'custom') {
|
|
97
|
+
const { customPath } = await prompts({
|
|
98
|
+
type: 'text',
|
|
99
|
+
name: 'customPath',
|
|
100
|
+
message: 'Enter the full path where you want to create your project:',
|
|
101
|
+
initial: homeDir,
|
|
102
|
+
validate: (value) => {
|
|
103
|
+
if (!value)
|
|
104
|
+
return 'Please enter a path';
|
|
105
|
+
try {
|
|
106
|
+
path.resolve(value);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return 'Please enter a valid path';
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
if (!customPath) {
|
|
115
|
+
throw new MagicPathError('Project creation cancelled');
|
|
116
|
+
}
|
|
117
|
+
finalTargetDir = path.resolve(customPath);
|
|
118
|
+
try {
|
|
119
|
+
await fs.ensureDir(finalTargetDir);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
throw new MagicPathError(`Failed to create or access directory: ${finalTargetDir}`);
|
|
123
|
+
}
|
|
48
124
|
}
|
|
49
|
-
|
|
50
|
-
|
|
125
|
+
if (!finalTargetDir) {
|
|
126
|
+
throw new MagicPathError('Download cancelled');
|
|
51
127
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Build choices array starting with current directory and home directory
|
|
55
|
-
const choices = [
|
|
56
|
-
{
|
|
57
|
-
title: `Right here (current folder: ${process.cwd()})`,
|
|
58
|
-
value: process.cwd(),
|
|
59
|
-
},
|
|
60
|
-
{ title: `Home directory (${homeDir})`, value: homeDir },
|
|
61
|
-
];
|
|
62
|
-
// Add existing standard directories
|
|
63
|
-
validDirs.forEach((dir) => {
|
|
64
|
-
choices.push({ title: dir.name, value: dir.path });
|
|
65
|
-
});
|
|
66
|
-
// Add option for custom directory
|
|
67
|
-
choices.push({ title: 'Other (specify custom path)', value: 'custom' });
|
|
68
|
-
const { targetDir } = await prompts({
|
|
69
|
-
type: 'select',
|
|
70
|
-
name: 'targetDir',
|
|
71
|
-
message: 'Where should we put your code?',
|
|
72
|
-
choices,
|
|
73
|
-
initial: 0,
|
|
74
|
-
});
|
|
75
|
-
let finalTargetDir = targetDir;
|
|
76
|
-
// Handle custom directory selection
|
|
77
|
-
if (targetDir === 'custom') {
|
|
78
|
-
const { customPath } = await prompts({
|
|
128
|
+
// Step 2: Ask for project name
|
|
129
|
+
const nameResult = await prompts({
|
|
79
130
|
type: 'text',
|
|
80
|
-
name: '
|
|
81
|
-
message: '
|
|
82
|
-
initial:
|
|
83
|
-
validate: (value) => {
|
|
84
|
-
if (!value)
|
|
85
|
-
return 'Please enter a path';
|
|
86
|
-
try {
|
|
87
|
-
// Try to resolve the path to check if it's valid
|
|
88
|
-
const resolvedPath = path.resolve(value);
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
return 'Please enter a valid path';
|
|
93
|
-
}
|
|
94
|
-
},
|
|
131
|
+
name: 'projectName',
|
|
132
|
+
message: 'What would you like to name your project?',
|
|
133
|
+
initial: 'magicpath-project',
|
|
95
134
|
});
|
|
96
|
-
|
|
135
|
+
projectName = nameResult.projectName;
|
|
136
|
+
if (!projectName) {
|
|
97
137
|
throw new MagicPathError('Project creation cancelled');
|
|
98
138
|
}
|
|
99
|
-
finalTargetDir = path.resolve(customPath);
|
|
100
|
-
// Ensure the custom directory exists, create if it doesn't
|
|
101
|
-
try {
|
|
102
|
-
await fs.ensureDir(finalTargetDir);
|
|
103
|
-
}
|
|
104
|
-
catch (err) {
|
|
105
|
-
throw new MagicPathError(`Failed to create or access directory: ${finalTargetDir}`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
if (!finalTargetDir) {
|
|
109
|
-
throw new MagicPathError('Download cancelled');
|
|
110
|
-
}
|
|
111
|
-
// Step 2: Ask for project name
|
|
112
|
-
const { projectName } = await prompts({
|
|
113
|
-
type: 'text',
|
|
114
|
-
name: 'projectName',
|
|
115
|
-
message: 'What would you like to name your project?',
|
|
116
|
-
initial: 'magicpath-project',
|
|
117
|
-
});
|
|
118
|
-
if (!projectName) {
|
|
119
|
-
throw new MagicPathError('Project creation cancelled');
|
|
120
139
|
}
|
|
121
140
|
let filename;
|
|
122
141
|
// Step 3: Download project
|
|
123
|
-
const downloadSpinner =
|
|
142
|
+
const downloadSpinner = json
|
|
143
|
+
? null
|
|
144
|
+
: ora('📥 Downloading project...').start();
|
|
124
145
|
try {
|
|
125
146
|
filename = await downloadProject(cloneOptions.key);
|
|
126
147
|
logger.debug({ filename });
|
|
127
|
-
downloadSpinner
|
|
148
|
+
downloadSpinner?.succeed('Project downloaded');
|
|
128
149
|
}
|
|
129
150
|
catch (err) {
|
|
130
|
-
downloadSpinner
|
|
151
|
+
downloadSpinner?.fail('Download failed');
|
|
131
152
|
if (err instanceof MagicPathError) {
|
|
132
153
|
throw err;
|
|
133
154
|
}
|
|
@@ -135,15 +156,17 @@ export function registerCloneCommand(program) {
|
|
|
135
156
|
throw new MagicPathError('Something went wrong!');
|
|
136
157
|
}
|
|
137
158
|
}
|
|
138
|
-
// Step
|
|
139
|
-
const unpackSpinner =
|
|
159
|
+
// Step 4: Unpack project
|
|
160
|
+
const unpackSpinner = json
|
|
161
|
+
? null
|
|
162
|
+
: ora('📦 Unpacking project...').start();
|
|
140
163
|
let projectDir;
|
|
141
164
|
try {
|
|
142
165
|
projectDir = unpackProject(filename, projectName, finalTargetDir);
|
|
143
|
-
unpackSpinner
|
|
166
|
+
unpackSpinner?.succeed(`Project unpacked to ${projectName}`);
|
|
144
167
|
}
|
|
145
168
|
catch (err) {
|
|
146
|
-
unpackSpinner
|
|
169
|
+
unpackSpinner?.fail('Failed to unpack project');
|
|
147
170
|
releaseProject(filename);
|
|
148
171
|
if (err instanceof MagicPathError) {
|
|
149
172
|
throw err;
|
|
@@ -164,6 +187,10 @@ export function registerCloneCommand(program) {
|
|
|
164
187
|
throw new MagicPathError('Something went wrong!');
|
|
165
188
|
}
|
|
166
189
|
}
|
|
190
|
+
// JSON mode: return result
|
|
191
|
+
if (json) {
|
|
192
|
+
jsonResult({ projectDir });
|
|
193
|
+
}
|
|
167
194
|
// Step 6: Ask which IDE to open the project in (or use pre-selected one)
|
|
168
195
|
const ideChoices = [
|
|
169
196
|
{ title: 'Cursor', value: 'cursor' },
|
|
@@ -200,7 +227,6 @@ export function registerCloneCommand(program) {
|
|
|
200
227
|
}
|
|
201
228
|
catch (err) {
|
|
202
229
|
logger.debug({ err });
|
|
203
|
-
// Don't throw error if opening fails, just continue
|
|
204
230
|
if (err instanceof MagicPathError) {
|
|
205
231
|
console.log(err.message);
|
|
206
232
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/commands/clone.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAU,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEtE,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACjC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"clone.js","sourceRoot":"","sources":["../../src/commands/clone.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { getAuthHeaders, loadTokens } from '../util/auth.js';
|
|
4
|
+
import { getUserUrl, getUserProjectsUrl } from '../util/api.js';
|
|
5
|
+
import { isJsonMode, jsonResult, jsonError } from '../util/output.js';
|
|
6
|
+
const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
|
|
7
|
+
export function registerInfoCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('info')
|
|
10
|
+
.description('Show project and auth status (useful for agent context injection)')
|
|
11
|
+
.action(async () => {
|
|
12
|
+
const json = isJsonMode();
|
|
13
|
+
try {
|
|
14
|
+
// Determine auth method
|
|
15
|
+
let authMethod = null;
|
|
16
|
+
let authenticated = false;
|
|
17
|
+
let headers = null;
|
|
18
|
+
if (process.env.MAGICPATH_TOKEN) {
|
|
19
|
+
authMethod = 'environment';
|
|
20
|
+
authenticated = true;
|
|
21
|
+
headers = getAuthHeaders();
|
|
22
|
+
}
|
|
23
|
+
else if (loadTokens()) {
|
|
24
|
+
authMethod = 'stored';
|
|
25
|
+
authenticated = true;
|
|
26
|
+
headers = getAuthHeaders();
|
|
27
|
+
}
|
|
28
|
+
// Fetch user info
|
|
29
|
+
let user = null;
|
|
30
|
+
if (authenticated && headers) {
|
|
31
|
+
try {
|
|
32
|
+
const response = await axios.get(getUserUrl(), { headers });
|
|
33
|
+
const u = response.data.user ?? response.data;
|
|
34
|
+
user = { id: u.id, name: u.name, email: u.email };
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// user fetch failed, leave null
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Fetch projects
|
|
41
|
+
let projects = null;
|
|
42
|
+
if (authenticated && headers) {
|
|
43
|
+
try {
|
|
44
|
+
const response = await axios.get(getUserProjectsUrl(), { headers });
|
|
45
|
+
const raw = response.data.data?.projects ??
|
|
46
|
+
response.data.projects ??
|
|
47
|
+
response.data;
|
|
48
|
+
if (Array.isArray(raw)) {
|
|
49
|
+
projects = raw.map((p) => ({
|
|
50
|
+
id: p.id,
|
|
51
|
+
name: p.name,
|
|
52
|
+
componentCount: p.componentCount ?? p._count?.components ?? 0,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// projects fetch failed, leave null
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const result = {
|
|
61
|
+
auth: {
|
|
62
|
+
authenticated,
|
|
63
|
+
method: authMethod,
|
|
64
|
+
user,
|
|
65
|
+
},
|
|
66
|
+
projects,
|
|
67
|
+
cli: {
|
|
68
|
+
version: pkg.version,
|
|
69
|
+
commands: [
|
|
70
|
+
'add',
|
|
71
|
+
'view',
|
|
72
|
+
'search',
|
|
73
|
+
'list-projects',
|
|
74
|
+
'list-components',
|
|
75
|
+
'integrate',
|
|
76
|
+
'login',
|
|
77
|
+
'logout',
|
|
78
|
+
'whoami',
|
|
79
|
+
'info',
|
|
80
|
+
'init',
|
|
81
|
+
'schema',
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
if (json) {
|
|
86
|
+
jsonResult(result);
|
|
87
|
+
}
|
|
88
|
+
// Human-readable output
|
|
89
|
+
console.log('');
|
|
90
|
+
console.log(` MagicPath CLI v${pkg.version}`);
|
|
91
|
+
console.log('');
|
|
92
|
+
if (authenticated && user) {
|
|
93
|
+
console.log(` Authenticated: yes (${authMethod})`);
|
|
94
|
+
console.log(` User: ${user.name} <${user.email}>`);
|
|
95
|
+
}
|
|
96
|
+
else if (authenticated) {
|
|
97
|
+
console.log(` Authenticated: yes (${authMethod})`);
|
|
98
|
+
console.log(' User: (could not fetch)');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.log(' Authenticated: no');
|
|
102
|
+
console.log(' Run `magicpath-ai login` to authenticate.');
|
|
103
|
+
}
|
|
104
|
+
console.log('');
|
|
105
|
+
if (projects && projects.length > 0) {
|
|
106
|
+
console.log(` Projects: ${projects.length}`);
|
|
107
|
+
for (const p of projects) {
|
|
108
|
+
console.log(` - ${p.name} (${p.componentCount} components)`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (authenticated) {
|
|
112
|
+
console.log(' Projects: none');
|
|
113
|
+
}
|
|
114
|
+
console.log('');
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
if (json)
|
|
118
|
+
jsonError(err);
|
|
119
|
+
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
|