project-compass 2.9.1 โ 3.0.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/README.md +12 -5
- package/commands.md +72 -0
- package/package.json +1 -1
- package/src/cli.js +33 -11
- package/src/projectDetection.js +58 -27
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Project Compass (v2.
|
|
1
|
+
# Project Compass (v2.9.2)
|
|
2
2
|
|
|
3
3
|
Project Compass is a futuristic CLI navigator built with [Ink](https://github.com/vadimdemedes/ink) that scans your current folder tree for familiar code projects and gives you one-keystroke access to build, test, or run them.
|
|
4
4
|
|
|
@@ -14,6 +14,7 @@ Project Compass is a futuristic CLI navigator built with [Ink](https://github.co
|
|
|
14
14
|
- ๐ **Omni-Studio**: A new interactive environment intelligence mode to see all installed runtimes and versions.
|
|
15
15
|
- ๐ **Log Management**: Clear output with **Shift+X** or export logs to a text file with **Shift+E**.
|
|
16
16
|
- ๐ **Extensible**: Add custom commands with **Shift+C** and frameworks via `plugins.json`.
|
|
17
|
+
- ๐พ **Persistence**: Saves your UI preferences (Art Board, Help, Structure Guide) globally in `~/.project-compass/config.json`.
|
|
17
18
|
|
|
18
19
|
## Installation
|
|
19
20
|
|
|
@@ -37,20 +38,26 @@ project-compass [--dir /path/to/workspace] [--studio]
|
|
|
37
38
|
| **Shift+T** | Open **Orbit Task Manager** |
|
|
38
39
|
| **Shift+D** | **Detach** from active task (runs in background) |
|
|
39
40
|
| **Shift+A** | Open **Omni-Studio** (Environment View) |
|
|
41
|
+
| **Shift+B** | Toggle **Art Board** visibility |
|
|
42
|
+
| **Shift+H** | Toggle **Help Cards** visibility |
|
|
43
|
+
| **Shift+S** | Toggle **Structure Guide** visibility |
|
|
40
44
|
| **Shift+C** | Add a custom command (`label|cmd`) |
|
|
41
45
|
| **Shift+X** | **Clear output logs** |
|
|
42
46
|
| **Shift+E** | **Export logs to .txt** |
|
|
43
47
|
| **Shift โ / โ** | Scroll output buffer |
|
|
44
48
|
| **Shift+L** | Rerun last command |
|
|
45
|
-
| **Shift+
|
|
46
|
-
| **Shift+S** | Toggle structure guide |
|
|
47
|
-
| **Shift+Q** | Quit app |
|
|
49
|
+
| **Shift+Q** | Quit app (with confirmation if tasks run) |
|
|
48
50
|
| ? | Toggle help overlay |
|
|
49
51
|
| Ctrl+C | Interrupt running command |
|
|
50
52
|
|
|
51
53
|
## Orbit Task Manager
|
|
52
54
|
|
|
53
|
-
Project Compass
|
|
55
|
+
Project Compass introduces background task management. You can start a build, press **Shift+D** to detach and return to the navigator, then start another task.
|
|
56
|
+
|
|
57
|
+
Inside the Task Manager (**Shift+T**):
|
|
58
|
+
- **Shift+K**: Kill a running process or remove a task from history.
|
|
59
|
+
- **Shift+R**: Rename a task for better organization.
|
|
60
|
+
- **Enter**: Switch back to the Navigator with the selected task's logs.
|
|
54
61
|
|
|
55
62
|
## Omni-Studio
|
|
56
63
|
|
package/commands.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Project Compass ยท Commands & Shortcuts
|
|
2
|
+
|
|
3
|
+
This document lists all supported languages, frameworks, and their built-in commands and keyboard shortcuts.
|
|
4
|
+
|
|
5
|
+
## Keyboard Guide (Navigator)
|
|
6
|
+
|
|
7
|
+
| Key | Action |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| โ / โ | Move project focus |
|
|
10
|
+
| Enter | Toggle detail view for selected project / Switch back from Tasks |
|
|
11
|
+
| **Shift+A** | Open **Omni-Studio** (Environment intelligence) |
|
|
12
|
+
| **Shift+T** | Open **Orbit Task Manager** |
|
|
13
|
+
| **Shift+D** | **Detach** from active task (runs in background) |
|
|
14
|
+
| **Shift+B** | Toggle **Art Board** visibility (Saved to config) |
|
|
15
|
+
| **Shift+H** | Toggle **Help Cards** visibility (Saved to config) |
|
|
16
|
+
| **Shift+S** | Toggle **Structure Guide** visibility (Saved to config) |
|
|
17
|
+
| **Shift+X** | **Clear** active task output logs |
|
|
18
|
+
| **Shift+E** | **Export** logs to a timestamped `.txt` file |
|
|
19
|
+
| **Shift+L** | **Rerun** the last executed command |
|
|
20
|
+
| **Shift+C** | Add a **Custom Command** (`label|cmd`) in detail view |
|
|
21
|
+
| **Shift+Q** | **Quit** application (Confirms if tasks are running) |
|
|
22
|
+
| Shift+โ / โ | Scroll output logs (Intuitive direction) |
|
|
23
|
+
| ? | Toggle help overlay |
|
|
24
|
+
| Ctrl+C | Interrupt running command |
|
|
25
|
+
|
|
26
|
+
## Supported Languages & Runtimes
|
|
27
|
+
|
|
28
|
+
Compass scans for the following manifests and requires their binaries in your PATH:
|
|
29
|
+
|
|
30
|
+
- **Node.js** (`node`, `npm`): `package.json`
|
|
31
|
+
- **Python** (`python3`, `pip`): `pyproject.toml`, `requirements.txt`, `Pipfile`, `setup.py`
|
|
32
|
+
- **Rust** (`cargo`): `Cargo.toml`
|
|
33
|
+
- **Go** (`go`): `go.mod`
|
|
34
|
+
- **Java/Kotlin** (`java`, `mvn`, `gradle`): `pom.xml`, `build.gradle`
|
|
35
|
+
- **Scala** (`sbt`): `build.sbt`
|
|
36
|
+
- **PHP** (`php`, `composer`): `composer.json`
|
|
37
|
+
- **Ruby** (`ruby`, `bundle`): `Gemfile`
|
|
38
|
+
- **.NET** (`dotnet`): `*.csproj`
|
|
39
|
+
- **Shell** (`sh`, `make`): `Makefile`, `build.sh`
|
|
40
|
+
|
|
41
|
+
## Built-in Framework Intelligence
|
|
42
|
+
|
|
43
|
+
When a framework is detected, specialized commands are injected automatically:
|
|
44
|
+
|
|
45
|
+
| Framework | Icon | Commands |
|
|
46
|
+
| --- | --- | --- |
|
|
47
|
+
| **Next.js** | ๐งญ | install, dev, build, test, start |
|
|
48
|
+
| **React** | โ๏ธ | install, dev, build, test |
|
|
49
|
+
| **Vue.js** | ๐ฉ | install, dev, build, test |
|
|
50
|
+
| **NestJS** | ๐ก๏ธ | install, dev (start:dev), build, test |
|
|
51
|
+
| **Angular** | ๐
ฐ๏ธ | install, serve, build, test |
|
|
52
|
+
| **SvelteKit** | ๐ | install, dev, build, test, preview |
|
|
53
|
+
| **Nuxt** | ๐ช | install, dev, build, start |
|
|
54
|
+
| **Astro** | โจ | install, dev, build, preview |
|
|
55
|
+
| **Django** | ๐ฟ | pip install, runserver, test, migrate |
|
|
56
|
+
| **Flask** | ๐ถ | pip install, run, pytest |
|
|
57
|
+
| **FastAPI** | โก | pip install, uvicorn reload, pytest |
|
|
58
|
+
| **Vite** | โก | install, dev, build, preview |
|
|
59
|
+
| **Spring Boot** | ๐ฑ | bootRun (Gradle) / spring-boot:run (Maven), build, test |
|
|
60
|
+
| **ASP.NET Core**| ๐ | restore, run, watch, test |
|
|
61
|
+
| **Laravel** | ๐งก | composer install, artisan serve, test, migrate |
|
|
62
|
+
| **Rocket** | ๐ | cargo fetch, run, test |
|
|
63
|
+
| **Actix Web** | ๐ฆ | cargo fetch, run, test |
|
|
64
|
+
| **Prisma** | โฎ | install, generate, studio |
|
|
65
|
+
| **Tailwind** | ๐จ | install |
|
|
66
|
+
|
|
67
|
+
## Task Manager Shortcuts (Shift+T)
|
|
68
|
+
|
|
69
|
+
- **Shift+K**: Kill a running process or remove a finished task from history.
|
|
70
|
+
- **Shift+R**: Rename a task for better organization.
|
|
71
|
+
- **Arrows**: Move focus between tasks.
|
|
72
|
+
- **Enter**: Jump to the selected task's logs in Navigator.
|
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -39,13 +39,15 @@ function loadConfig() {
|
|
|
39
39
|
return {
|
|
40
40
|
customCommands: {},
|
|
41
41
|
showArtBoard: true,
|
|
42
|
+
showHelpCards: false,
|
|
43
|
+
showStructureGuide: false,
|
|
42
44
|
...parsed,
|
|
43
45
|
};
|
|
44
46
|
}
|
|
45
47
|
} catch (error) {
|
|
46
48
|
console.error(`Ignoring corrupt config: ${error.message}`);
|
|
47
49
|
}
|
|
48
|
-
return {customCommands: {}, showArtBoard: true};
|
|
50
|
+
return {customCommands: {}, showArtBoard: true, showHelpCards: false, showStructureGuide: false};
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
function useScanner(rootPath) {
|
|
@@ -176,8 +178,6 @@ function Compass({rootPath, initialView = 'navigator'}) {
|
|
|
176
178
|
const [renameCursor, setRenameCursor] = useState(0);
|
|
177
179
|
const [quitConfirm, setQuitConfirm] = useState(false);
|
|
178
180
|
const [config, setConfig] = useState(() => loadConfig());
|
|
179
|
-
const [showHelpCards, setShowHelpCards] = useState(false);
|
|
180
|
-
const [showStructureGuide, setShowStructureGuide] = useState(false);
|
|
181
181
|
const [stdinBuffer, setStdinBuffer] = useState('');
|
|
182
182
|
const [stdinCursor, setStdinCursor] = useState(0);
|
|
183
183
|
const [showHelp, setShowHelp] = useState(false);
|
|
@@ -354,8 +354,22 @@ function Compass({rootPath, initialView = 'navigator'}) {
|
|
|
354
354
|
const normalizedInput = input?.toLowerCase();
|
|
355
355
|
const shiftCombo = (char) => key.shift && normalizedInput === char;
|
|
356
356
|
|
|
357
|
-
if (shiftCombo('h')) {
|
|
358
|
-
|
|
357
|
+
if (shiftCombo('h')) {
|
|
358
|
+
setConfig(prev => {
|
|
359
|
+
const next = {...prev, showHelpCards: !prev.showHelpCards};
|
|
360
|
+
saveConfig(next);
|
|
361
|
+
return next;
|
|
362
|
+
});
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
if (shiftCombo('s')) {
|
|
366
|
+
setConfig(prev => {
|
|
367
|
+
const next = {...prev, showStructureGuide: !prev.showStructureGuide};
|
|
368
|
+
saveConfig(next);
|
|
369
|
+
return next;
|
|
370
|
+
});
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
359
373
|
if (shiftCombo('a')) { setMainView((prev) => (prev === 'navigator' ? 'studio' : 'navigator')); return; }
|
|
360
374
|
if (shiftCombo('x')) { setTasks(prev => prev.map(t => t.id === activeTaskId ? {...t, logs: []} : t)); setLogOffset(0); return; }
|
|
361
375
|
if (shiftCombo('e')) { exportLogs(); return; }
|
|
@@ -451,6 +465,10 @@ function Compass({rootPath, initialView = 'navigator'}) {
|
|
|
451
465
|
});
|
|
452
466
|
|
|
453
467
|
const projectCountLabel = `${projects.length} project${projects.length === 1 ? '' : 's'}`;
|
|
468
|
+
const toggleHint = config.showHelpCards ? 'Shift+H hide help' : 'Shift+H show help';
|
|
469
|
+
const statusHint = activeTask ? `[${activeTask.status.toUpperCase()}] ${activeTask.name}` : 'Idle Navigator';
|
|
470
|
+
const orbitHint = mainView === 'tasks' ? 'Tasks View' : `Orbit: ${tasks.length} tasks`;
|
|
471
|
+
const artHint = config.showArtBoard ? 'Shift+B hide art' : 'Shift+B show art';
|
|
454
472
|
|
|
455
473
|
if (quitConfirm) {
|
|
456
474
|
return create(Box, {flexDirection: 'column', borderStyle: 'round', borderColor: 'red', padding: 1}, create(Text, {bold: true, color: 'red'}, 'โ ๏ธ Confirm Exit'), create(Text, null, `There are ${tasks.filter(t=>t.status==='running').length} tasks still running in the background.`), create(Text, null, 'Are you sure you want to quit and stop all processes?'), create(Text, {marginTop: 1}, kleur.bold('Y') + ' to Quit, ' + kleur.bold('N') + ' to Cancel'));
|
|
@@ -561,14 +579,16 @@ function Compass({rootPath, initialView = 'navigator'}) {
|
|
|
561
579
|
const helpCards = [
|
|
562
580
|
{label: 'Navigation', color: 'magenta', body: ['โ / โ move focus, Enter: details', 'Shift+โ / โ scroll output', 'Shift+H toggle help cards', 'Shift+D detach from task']},
|
|
563
581
|
{label: 'Commands', color: 'cyan', body: ['B / T / R build/test/run', '1-9 run detail commands', 'Shift+L rerun last command', 'Shift+X clear / Shift+E export']},
|
|
564
|
-
{label: 'Orbit & Studio', color: 'yellow', body: ['Shift+T task manager', 'Shift+A studio / Shift+B art', 'Shift+
|
|
582
|
+
{label: 'Orbit & Studio', color: 'yellow', body: ['Shift+T task manager', 'Shift+A studio / Shift+B art board', 'Shift+S structure / Shift+Q quit']}
|
|
565
583
|
];
|
|
566
584
|
|
|
567
|
-
const toggleHint = showHelpCards ? 'Shift+H hide help' : 'Shift+H show help';
|
|
568
585
|
return create(Box, {flexDirection: 'column', padding: 1},
|
|
569
586
|
create(Box, {justifyContent: 'space-between'},
|
|
570
587
|
create(Box, {flexDirection: 'column'}, create(Text, {color: 'magenta', bold: true}, 'Project Compass'), create(Text, {dimColor: true}, `${projectCountLabel} detected in ${rootPath}`)),
|
|
571
|
-
create(Box, {flexDirection: 'column', alignItems: 'flex-end'},
|
|
588
|
+
create(Box, {flexDirection: 'column', alignItems: 'flex-end'},
|
|
589
|
+
create(Text, {color: running ? 'yellow' : 'green'}, statusHint),
|
|
590
|
+
create(Text, {dimColor: true}, `${toggleHint} ยท ${orbitHint} ยท ${artHint} ยท Shift+Q: Quit`)
|
|
591
|
+
)
|
|
572
592
|
),
|
|
573
593
|
artBoard,
|
|
574
594
|
create(Box, {marginTop: 1, flexDirection: 'row', alignItems: 'stretch', width: '100%', flexWrap: 'wrap'},
|
|
@@ -581,9 +601,9 @@ function Compass({rootPath, initialView = 'navigator'}) {
|
|
|
581
601
|
create(Box, {marginTop: 1, flexDirection: 'row', justifyContent: 'space-between'}, create(Text, {dimColor: true}, running ? 'Type to feed stdin; Enter: submit, Ctrl+C: abort.' : 'Run a command or press Shift+T to switch tasks.'), create(Text, {dimColor: true}, `${toggleHint}, Shift+S: Structure Guide`)),
|
|
582
602
|
create(Box, {marginTop: 1, flexDirection: 'row', borderStyle: 'round', borderColor: running ? 'green' : 'gray', paddingX: 1}, create(Text, {bold: true, color: running ? 'green' : 'white'}, running ? ' Stdin buffer ' : ' Input ready '), create(Box, {marginLeft: 1}, create(CursorText, {value: stdinBuffer || (running ? '' : 'Start a command to feed stdin'), cursorIndex: stdinCursor, active: running})))
|
|
583
603
|
),
|
|
584
|
-
showHelpCards && create(Box, {marginTop: 1, flexDirection: 'row', justifyContent: 'space-between', flexWrap: 'wrap'}, ...helpCards.map((card, idx) => create(Box, {key: card.label, flexGrow: 1, flexBasis: 0, minWidth: HELP_CARD_MIN_WIDTH, marginRight: idx < 2 ? 1 : 0, marginBottom: 1, borderStyle: 'round', borderColor: card.color, padding: 1, flexDirection: 'column'}, create(Text, {color: card.color, bold: true, marginBottom: 1}, card.label), ...card.body.map((line, lidx) => create(Text, {key: lidx, dimColor: card.color === 'yellow'}, line))))),
|
|
585
|
-
showStructureGuide && create(Box, {flexDirection: 'column', borderStyle: 'round', borderColor: 'blue', marginTop: 1, padding: 1}, create(Text, {color: 'cyan', bold: true}, 'Structure guide ยท press Shift+S to hide'), ...SCHEMA_GUIDE.map(e => create(Text, {key: e.type, dimColor: true}, `โข ${e.icon} ${e.label}: ${e.files.join(', ')}`))),
|
|
586
|
-
showHelp && create(Box, {flexDirection: 'column', borderStyle: 'double', borderColor: 'cyan', marginTop: 1, padding: 1}, create(Text, {color: 'cyan', bold: true}, 'Help overlay'), create(Text, null, 'Shift+โ/โ scrolls logs; Shift+X clears; Shift+E exports; Shift+A Studio; Shift+T Tasks; Shift+D Detach; Shift+B Toggle Art.'))
|
|
604
|
+
config.showHelpCards && create(Box, {marginTop: 1, flexDirection: 'row', justifyContent: 'space-between', flexWrap: 'wrap'}, ...helpCards.map((card, idx) => create(Box, {key: card.label, flexGrow: 1, flexBasis: 0, minWidth: HELP_CARD_MIN_WIDTH, marginRight: idx < 2 ? 1 : 0, marginBottom: 1, borderStyle: 'round', borderColor: card.color, padding: 1, flexDirection: 'column'}, create(Text, {color: card.color, bold: true, marginBottom: 1}, card.label), ...card.body.map((line, lidx) => create(Text, {key: lidx, dimColor: card.color === 'yellow'}, line))))),
|
|
605
|
+
config.showStructureGuide && create(Box, {flexDirection: 'column', borderStyle: 'round', borderColor: 'blue', marginTop: 1, padding: 1}, create(Text, {color: 'cyan', bold: true}, 'Structure guide ยท press Shift+S to hide'), ...SCHEMA_GUIDE.map(e => create(Text, {key: e.type, dimColor: true}, `โข ${e.icon} ${e.label}: ${e.files.join(', ')}`))),
|
|
606
|
+
showHelp && create(Box, {flexDirection: 'column', borderStyle: 'double', borderColor: 'cyan', marginTop: 1, padding: 1}, create(Text, {color: 'cyan', bold: true}, 'Help overlay'), create(Text, null, 'Shift+โ/โ scrolls logs; Shift+X clears; Shift+E exports; Shift+A Studio; Shift+T Tasks; Shift+D Detach; Shift+B Toggle Art Board.'))
|
|
587
607
|
);
|
|
588
608
|
}
|
|
589
609
|
|
|
@@ -621,6 +641,8 @@ async function main() {
|
|
|
621
641
|
console.log(' Shift+T Open Orbit Task Manager (Manage background processes)');
|
|
622
642
|
console.log(' Shift+D Detach from active task (Keep it running in background)');
|
|
623
643
|
console.log(' Shift+B Toggle Art Board visibility');
|
|
644
|
+
console.log(' Shift+H Toggle Help Cards visibility');
|
|
645
|
+
console.log(' Shift+S Toggle Structure Guide visibility');
|
|
624
646
|
console.log(' Shift+X Clear active task output log');
|
|
625
647
|
console.log(' Shift+E Export current logs to a .txt file');
|
|
626
648
|
console.log(' Shift+โ / โ Scroll the output logs');
|
package/src/projectDetection.js
CHANGED
|
@@ -123,13 +123,11 @@ const builtInFrameworks = [
|
|
|
123
123
|
commands[key] = {label, command: tokens, source: 'framework'};
|
|
124
124
|
}
|
|
125
125
|
};
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
add('run', 'Next dev', devFallback);
|
|
130
|
-
add('build', 'Next build', buildFallback);
|
|
126
|
+
add('install', 'Next install', () => ['npm', 'install']);
|
|
127
|
+
add('run', 'Next dev', () => ['npx', 'next', 'dev']);
|
|
128
|
+
add('build', 'Next build', () => ['npx', 'next', 'build']);
|
|
131
129
|
add('test', 'Next test', () => ['npm', 'run', 'test']);
|
|
132
|
-
add('start', 'Next start',
|
|
130
|
+
add('start', 'Next start', () => ['npx', 'next', 'start']);
|
|
133
131
|
return commands;
|
|
134
132
|
}
|
|
135
133
|
},
|
|
@@ -151,6 +149,7 @@ const builtInFrameworks = [
|
|
|
151
149
|
commands[key] = {label, command: tokens, source: 'framework'};
|
|
152
150
|
}
|
|
153
151
|
};
|
|
152
|
+
add('install', 'React install', () => ['npm', 'install']);
|
|
154
153
|
add('run', 'React dev', () => ['npm', 'run', 'dev']);
|
|
155
154
|
add('build', 'React build', () => ['npm', 'run', 'build']);
|
|
156
155
|
add('test', 'React test', () => ['npm', 'run', 'test']);
|
|
@@ -175,6 +174,7 @@ const builtInFrameworks = [
|
|
|
175
174
|
commands[key] = {label, command: tokens, source: 'framework'};
|
|
176
175
|
}
|
|
177
176
|
};
|
|
177
|
+
add('install', 'Vue install', () => ['npm', 'install']);
|
|
178
178
|
add('run', 'Vue dev', () => ['npm', 'run', 'dev']);
|
|
179
179
|
add('build', 'Vue build', () => ['npm', 'run', 'build']);
|
|
180
180
|
add('test', 'Vue test', () => ['npm', 'run', 'test']);
|
|
@@ -199,6 +199,7 @@ const builtInFrameworks = [
|
|
|
199
199
|
commands[key] = {label, command: tokens, source: 'framework'};
|
|
200
200
|
}
|
|
201
201
|
};
|
|
202
|
+
add('install', 'Nest install', () => ['npm', 'install']);
|
|
202
203
|
add('run', 'Nest dev', () => ['npm', 'run', 'start:dev']);
|
|
203
204
|
add('build', 'Nest build', () => ['npm', 'run', 'build']);
|
|
204
205
|
add('test', 'Nest test', () => ['npm', 'run', 'test']);
|
|
@@ -223,6 +224,7 @@ const builtInFrameworks = [
|
|
|
223
224
|
commands[key] = {label, command: tokens, source: 'framework'};
|
|
224
225
|
}
|
|
225
226
|
};
|
|
227
|
+
add('install', 'Angular install', () => ['npm', 'install']);
|
|
226
228
|
add('run', 'Angular serve', () => ['npm', 'run', 'start']);
|
|
227
229
|
add('build', 'Angular build', () => ['npm', 'run', 'build']);
|
|
228
230
|
add('test', 'Angular test', () => ['npm', 'run', 'test']);
|
|
@@ -247,6 +249,7 @@ const builtInFrameworks = [
|
|
|
247
249
|
commands[key] = {label, command: tokens, source: 'framework'};
|
|
248
250
|
}
|
|
249
251
|
};
|
|
252
|
+
add('install', 'SvelteKit install', () => ['npm', 'install']);
|
|
250
253
|
add('run', 'SvelteKit dev', () => ['npm', 'run', 'dev']);
|
|
251
254
|
add('build', 'SvelteKit build', () => ['npm', 'run', 'build']);
|
|
252
255
|
add('test', 'SvelteKit test', () => ['npm', 'run', 'test']);
|
|
@@ -272,6 +275,7 @@ const builtInFrameworks = [
|
|
|
272
275
|
commands[key] = {label, command: tokens, source: 'framework'};
|
|
273
276
|
}
|
|
274
277
|
};
|
|
278
|
+
add('install', 'Nuxt install', () => ['npm', 'install']);
|
|
275
279
|
add('run', 'Nuxt dev', () => ['npm', 'run', 'dev']);
|
|
276
280
|
add('build', 'Nuxt build', () => ['npm', 'run', 'build']);
|
|
277
281
|
add('start', 'Nuxt start', () => ['npm', 'run', 'start']);
|
|
@@ -297,6 +301,7 @@ const builtInFrameworks = [
|
|
|
297
301
|
commands[key] = {label, command: tokens, source: 'framework'};
|
|
298
302
|
}
|
|
299
303
|
};
|
|
304
|
+
add('install', 'Astro install', () => ['npm', 'install']);
|
|
300
305
|
add('run', 'Astro dev', () => ['npm', 'run', 'dev']);
|
|
301
306
|
add('build', 'Astro build', () => ['npm', 'run', 'build']);
|
|
302
307
|
add('preview', 'Astro preview', () => ['npm', 'run', 'preview']);
|
|
@@ -315,14 +320,16 @@ const builtInFrameworks = [
|
|
|
315
320
|
},
|
|
316
321
|
commands(project) {
|
|
317
322
|
const managePath = path.join(project.path, 'manage.py');
|
|
318
|
-
|
|
319
|
-
|
|
323
|
+
const commands = {};
|
|
324
|
+
if (hasProjectFile(project.path, 'requirements.txt')) {
|
|
325
|
+
commands.install = {label: 'Pip install', command: ['pip', 'install', '-r', 'requirements.txt'], source: 'framework'};
|
|
320
326
|
}
|
|
321
|
-
|
|
322
|
-
run
|
|
323
|
-
test
|
|
324
|
-
migrate
|
|
325
|
-
}
|
|
327
|
+
if (fs.existsSync(managePath)) {
|
|
328
|
+
commands.run = {label: 'Django runserver', command: ['python', 'manage.py', 'runserver'], source: 'framework'};
|
|
329
|
+
commands.test = {label: 'Django test', command: ['python', 'manage.py', 'test'], source: 'framework'};
|
|
330
|
+
commands.migrate = {label: 'Django migrate', command: ['python', 'manage.py', 'migrate'], source: 'framework'};
|
|
331
|
+
}
|
|
332
|
+
return commands;
|
|
326
333
|
}
|
|
327
334
|
},
|
|
328
335
|
{
|
|
@@ -338,13 +345,15 @@ const builtInFrameworks = [
|
|
|
338
345
|
},
|
|
339
346
|
commands(project) {
|
|
340
347
|
const entry = findPythonEntry(project.path);
|
|
341
|
-
|
|
342
|
-
|
|
348
|
+
const commands = {};
|
|
349
|
+
if (hasProjectFile(project.path, 'requirements.txt')) {
|
|
350
|
+
commands.install = {label: 'Pip install', command: ['pip', 'install', '-r', 'requirements.txt'], source: 'framework'};
|
|
343
351
|
}
|
|
344
|
-
|
|
345
|
-
run
|
|
346
|
-
test
|
|
347
|
-
}
|
|
352
|
+
if (entry) {
|
|
353
|
+
commands.run = {label: 'Flask app', command: ['python', entry], source: 'framework'};
|
|
354
|
+
commands.test = {label: 'Pytest', command: ['pytest'], source: 'framework'};
|
|
355
|
+
}
|
|
356
|
+
return commands;
|
|
348
357
|
}
|
|
349
358
|
},
|
|
350
359
|
{
|
|
@@ -360,14 +369,16 @@ const builtInFrameworks = [
|
|
|
360
369
|
},
|
|
361
370
|
commands(project) {
|
|
362
371
|
const entry = findPythonEntry(project.path);
|
|
363
|
-
|
|
364
|
-
|
|
372
|
+
const commands = {};
|
|
373
|
+
if (hasProjectFile(project.path, 'requirements.txt')) {
|
|
374
|
+
commands.install = {label: 'Pip install', command: ['pip', 'install', '-r', 'requirements.txt'], source: 'framework'};
|
|
365
375
|
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
run
|
|
369
|
-
test
|
|
370
|
-
}
|
|
376
|
+
if (entry) {
|
|
377
|
+
const moduleName = entry.split('.').slice(0, -1).join('.') || entry;
|
|
378
|
+
commands.run = {label: 'Uvicorn reload', command: ['uvicorn', `${moduleName}:app`, '--reload'], source: 'framework'};
|
|
379
|
+
commands.test = {label: 'Pytest', command: ['pytest'], source: 'framework'};
|
|
380
|
+
}
|
|
381
|
+
return commands;
|
|
371
382
|
}
|
|
372
383
|
},
|
|
373
384
|
{
|
|
@@ -388,6 +399,7 @@ const builtInFrameworks = [
|
|
|
388
399
|
commands[key] = {label, command: tokens, source: 'framework'};
|
|
389
400
|
}
|
|
390
401
|
};
|
|
402
|
+
add('install', 'Vite install', () => ['npm', 'install']);
|
|
391
403
|
add('run', 'Vite dev', () => ['npx', 'vite']);
|
|
392
404
|
add('build', 'Vite build', () => ['npx', 'vite', 'build']);
|
|
393
405
|
add('preview', 'Vite preview', () => ['npx', 'vite', 'preview']);
|
|
@@ -404,7 +416,7 @@ const builtInFrameworks = [
|
|
|
404
416
|
match(project) {
|
|
405
417
|
return hasProjectFile(project.path, 'tailwind.config.js') || hasProjectFile(project.path, 'tailwind.config.ts') || dependencyMatches(project, 'tailwindcss');
|
|
406
418
|
},
|
|
407
|
-
commands() { return {}; }
|
|
419
|
+
commands() { return { install: {label: 'Tailwind install', command: ['npm', 'install', '-D', 'tailwindcss'], source: 'framework'} }; }
|
|
408
420
|
},
|
|
409
421
|
{
|
|
410
422
|
id: 'prisma',
|
|
@@ -418,6 +430,7 @@ const builtInFrameworks = [
|
|
|
418
430
|
},
|
|
419
431
|
commands() {
|
|
420
432
|
return {
|
|
433
|
+
install: {label: 'Prisma install', command: ['npm', 'install', '@prisma/client'], source: 'framework'},
|
|
421
434
|
generate: {label: 'Prisma generate', command: ['npx', 'prisma', 'generate'], source: 'framework'},
|
|
422
435
|
studio: {label: 'Prisma studio', command: ['npx', 'prisma', 'studio'], source: 'framework'}
|
|
423
436
|
};
|
|
@@ -441,6 +454,7 @@ const builtInFrameworks = [
|
|
|
441
454
|
const hasGradlew = hasProjectFile(project.path, 'gradlew');
|
|
442
455
|
if (hasGradlew) {
|
|
443
456
|
return {
|
|
457
|
+
install: {label: 'Gradle Resolve', command: ['./gradlew', 'dependencies'], source: 'framework'},
|
|
444
458
|
run: {label: 'Gradle BootRun', command: ['./gradlew', 'bootRun'], source: 'framework'},
|
|
445
459
|
build: {label: 'Gradle Build', command: ['./gradlew', 'build'], source: 'framework'},
|
|
446
460
|
test: {label: 'Gradle Test', command: ['./gradlew', 'test'], source: 'framework'}
|
|
@@ -448,6 +462,7 @@ const builtInFrameworks = [
|
|
|
448
462
|
}
|
|
449
463
|
const base = hasMvnw ? './mvnw' : 'mvn';
|
|
450
464
|
return {
|
|
465
|
+
install: {label: 'Maven Install', command: [base, 'install'], source: 'framework'},
|
|
451
466
|
run: {label: 'Spring Boot run', command: [base, 'spring-boot:run'], source: 'framework'},
|
|
452
467
|
build: {label: 'Maven package', command: [base, 'package'], source: 'framework'},
|
|
453
468
|
test: {label: 'Maven test', command: [base, 'test'], source: 'framework'}
|
|
@@ -466,6 +481,7 @@ const builtInFrameworks = [
|
|
|
466
481
|
},
|
|
467
482
|
commands() {
|
|
468
483
|
return {
|
|
484
|
+
install: {label: 'Cargo Fetch', command: ['cargo', 'fetch'], source: 'framework'},
|
|
469
485
|
run: {label: 'Rocket Run', command: ['cargo', 'run'], source: 'framework'},
|
|
470
486
|
test: {label: 'Rocket Test', command: ['cargo', 'test'], source: 'framework'}
|
|
471
487
|
};
|
|
@@ -483,6 +499,7 @@ const builtInFrameworks = [
|
|
|
483
499
|
},
|
|
484
500
|
commands() {
|
|
485
501
|
return {
|
|
502
|
+
install: {label: 'Cargo Fetch', command: ['cargo', 'fetch'], source: 'framework'},
|
|
486
503
|
run: {label: 'Actix Run', command: ['cargo', 'run'], source: 'framework'},
|
|
487
504
|
test: {label: 'Actix Test', command: ['cargo', 'test'], source: 'framework'}
|
|
488
505
|
};
|
|
@@ -501,6 +518,7 @@ const builtInFrameworks = [
|
|
|
501
518
|
},
|
|
502
519
|
commands() {
|
|
503
520
|
return {
|
|
521
|
+
install: {label: 'dotnet restore', command: ['dotnet', 'restore'], source: 'framework'},
|
|
504
522
|
run: {label: 'dotnet run', command: ['dotnet', 'run'], source: 'framework'},
|
|
505
523
|
watch: {label: 'dotnet watch', command: ['dotnet', 'watch', 'run'], source: 'framework'},
|
|
506
524
|
test: {label: 'dotnet test', command: ['dotnet', 'test'], source: 'framework'}
|
|
@@ -519,6 +537,7 @@ const builtInFrameworks = [
|
|
|
519
537
|
},
|
|
520
538
|
commands() {
|
|
521
539
|
return {
|
|
540
|
+
install: {label: 'Composer install', command: ['composer', 'install'], source: 'framework'},
|
|
522
541
|
run: {label: 'Artisan Serve', command: ['php', 'artisan', 'serve'], source: 'framework'},
|
|
523
542
|
test: {label: 'Artisan Test', command: ['php', 'artisan', 'test'], source: 'framework'},
|
|
524
543
|
migrate: {label: 'Artisan Migrate', command: ['php', 'artisan', 'migrate'], source: 'framework'}
|
|
@@ -568,6 +587,7 @@ class SchemaRegistry {
|
|
|
568
587
|
}
|
|
569
588
|
}
|
|
570
589
|
};
|
|
590
|
+
commands.install = {label: 'Install', command: ['npm', 'install']};
|
|
571
591
|
preferScript('build', ['build', 'compile', 'dist'], 'Build');
|
|
572
592
|
preferScript('test', ['test', 'check', 'spec'], 'Test');
|
|
573
593
|
preferScript('run', ['start', 'dev', 'serve', 'run'], 'Start');
|
|
@@ -618,6 +638,9 @@ class SchemaRegistry {
|
|
|
618
638
|
async build(projectPath, manifest) {
|
|
619
639
|
const missingBinaries = this.binaries.filter(b => !checkBinary(b));
|
|
620
640
|
const commands = {};
|
|
641
|
+
if (hasProjectFile(projectPath, 'requirements.txt')) {
|
|
642
|
+
commands.install = {label: 'Pip Install', command: ['pip', 'install', '-r', 'requirements.txt']};
|
|
643
|
+
}
|
|
621
644
|
if (hasProjectFile(projectPath, 'pyproject.toml')) {
|
|
622
645
|
commands.test = {label: 'Pytest', command: ['pytest']};
|
|
623
646
|
} else {
|
|
@@ -677,6 +700,7 @@ class SchemaRegistry {
|
|
|
677
700
|
icon: '๐ฆ',
|
|
678
701
|
priority: this.priority,
|
|
679
702
|
commands: {
|
|
703
|
+
install: {label: 'Cargo fetch', command: ['cargo', 'fetch']},
|
|
680
704
|
build: {label: 'Cargo build', command: ['cargo', 'build']},
|
|
681
705
|
test: {label: 'Cargo test', command: ['cargo', 'test']},
|
|
682
706
|
run: {label: 'Cargo run', command: ['cargo', 'run']}
|
|
@@ -708,6 +732,7 @@ class SchemaRegistry {
|
|
|
708
732
|
icon: '๐น',
|
|
709
733
|
priority: this.priority,
|
|
710
734
|
commands: {
|
|
735
|
+
install: {label: 'Go tidy', command: ['go', 'mod', 'tidy']},
|
|
711
736
|
build: {label: 'Go build', command: ['go', 'build', './...']},
|
|
712
737
|
test: {label: 'Go test', command: ['go', 'test', './...']},
|
|
713
738
|
run: {label: 'Go run', command: ['go', 'run', '.']}
|
|
@@ -735,9 +760,11 @@ class SchemaRegistry {
|
|
|
735
760
|
const hasGradlew = hasProjectFile(projectPath, 'gradlew');
|
|
736
761
|
const commands = {};
|
|
737
762
|
if (hasGradlew) {
|
|
763
|
+
commands.install = {label: 'Gradle resolve', command: ['./gradlew', 'dependencies']};
|
|
738
764
|
commands.build = {label: 'Gradle build', command: ['./gradlew', 'build']};
|
|
739
765
|
commands.test = {label: 'Gradle test', command: ['./gradlew', 'test']};
|
|
740
766
|
} else if (hasMvnw) {
|
|
767
|
+
commands.install = {label: 'Maven install', command: ['./mvnw', 'install']};
|
|
741
768
|
commands.build = {label: 'Maven package', command: ['./mvnw', 'package']};
|
|
742
769
|
commands.test = {label: 'Maven test', command: ['./mvnw', 'test']};
|
|
743
770
|
} else {
|
|
@@ -780,6 +807,7 @@ class SchemaRegistry {
|
|
|
780
807
|
icon: '๐ต',
|
|
781
808
|
priority: this.priority,
|
|
782
809
|
commands: {
|
|
810
|
+
install: {label: 'sbt update', command: ['sbt', 'update']},
|
|
783
811
|
build: {label: 'sbt compile', command: ['sbt', 'compile']},
|
|
784
812
|
test: {label: 'sbt test', command: ['sbt', 'test']},
|
|
785
813
|
run: {label: 'sbt run', command: ['sbt', 'run']}
|
|
@@ -811,6 +839,7 @@ class SchemaRegistry {
|
|
|
811
839
|
icon: '๐',
|
|
812
840
|
priority: this.priority,
|
|
813
841
|
commands: {
|
|
842
|
+
install: {label: 'Composer install', command: ['composer', 'install']},
|
|
814
843
|
test: {label: 'PHP -v', command: ['php', '-v']}
|
|
815
844
|
},
|
|
816
845
|
metadata: {},
|
|
@@ -840,6 +869,7 @@ class SchemaRegistry {
|
|
|
840
869
|
icon: '๐',
|
|
841
870
|
priority: this.priority,
|
|
842
871
|
commands: {
|
|
872
|
+
install: {label: 'Bundle install', command: ['bundle', 'install']},
|
|
843
873
|
run: {label: 'Ruby console', command: ['ruby', 'app.rb']},
|
|
844
874
|
test: {label: 'Ruby test', command: ['bundle', 'exec', 'rspec']}
|
|
845
875
|
},
|
|
@@ -870,6 +900,7 @@ class SchemaRegistry {
|
|
|
870
900
|
icon: '๐ท',
|
|
871
901
|
priority: this.priority,
|
|
872
902
|
commands: {
|
|
903
|
+
install: {label: 'dotnet restore', command: ['dotnet', 'restore']},
|
|
873
904
|
build: {label: 'dotnet build', command: ['dotnet', 'build']},
|
|
874
905
|
test: {label: 'dotnet test', command: ['dotnet', 'test']},
|
|
875
906
|
run: {label: 'dotnet run', command: ['dotnet', 'run']}
|