project-compass 1.0.5 β 1.0.8
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 +15 -8
- package/package.json +1 -1
- package/src/cli.js +142 -73
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Project Compass is a futuristic CLI navigator built with [Ink](https://github.co
|
|
|
7
7
|
- π Scans directories for Node.js, Python, Rust, Go, Java, and Scala projects by looking at their manifest files.
|
|
8
8
|
- π¨ Combines the glyph-based art board with a Projects/Details row that keeps everything inside the viewport, while live stdout/stderr logs stay in their own band below.
|
|
9
9
|
- π Press **Enter** on any project to open the detail view, where you can inspect the type, manifest, frameworks, commands, and save custom actions.
|
|
10
|
-
- π‘ A dedicated output row
|
|
10
|
+
- π‘ A dedicated output row with an interactive stdin buffer, plus help tiles that stay in their own band; Shift+β/β or mouse wheel scrolls logs, typing feeds stdin (Enter submits, Ctrl+C aborts), L reruns the last command, H hides the cards, S opens the structure guide, and `?` pops an overlay with quick tips.
|
|
11
11
|
- π― Built-in shortcuts (B/T/R) run the canonical build/test/run workflow, while numeric hotkeys (1, 2, 3...) execute whichever command is listed in the detail view.
|
|
12
12
|
- π§ Add bespoke commands via **C** in detail view and store them globally (`~/.project-compass/config.json`) so every workspace remembers your favorite invocations.
|
|
13
13
|
- π Extend detection via plugins (JSON specs under `~/.project-compass/plugins.json`) to teach Project Compass about extra frameworks or command sets.
|
|
@@ -29,14 +29,16 @@ project-compass [--dir /path/to/workspace]
|
|
|
29
29
|
|
|
30
30
|
| Key | Action |
|
|
31
31
|
| --- | --- |
|
|
32
|
-
| β / β |
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
| 1β9 | Execute the numbered command inside the detail view |
|
|
32
|
+
| β / β | Move the project focus, Enter toggles the detail view |
|
|
33
|
+
| B / T / R | Run the workspace build/test/run shortcuts |
|
|
34
|
+
| 1β9 | Execute the numbered commands listed in detail view |
|
|
36
35
|
| C | Add a custom command (`label|cmd`) that saves to `~/.project-compass/config.json` |
|
|
37
|
-
| Shift β / β | Scroll the output buffer (
|
|
38
|
-
| L | Rerun the
|
|
36
|
+
| Shift β / β | Scroll the output buffer (or use the mouse wheel) |
|
|
37
|
+
| L | Rerun the most recent command |
|
|
39
38
|
| ? | Toggle the help overlay with navigation tips |
|
|
39
|
+
| h | Hide/show the navigation/help cards beneath the logs |
|
|
40
|
+
| s | Toggle the structure guide listing the manifests per language |
|
|
41
|
+
| Typing while running | Sends stdin to the running command (Enter submits, Ctrl+C aborts) |
|
|
40
42
|
| Ctrl+C | Interrupt a running command (works while streaming output) |
|
|
41
43
|
| Q | Quit |
|
|
42
44
|
|
|
@@ -72,7 +74,12 @@ Project Compass now opens with a rounded art board that shuffles your glyph row
|
|
|
72
74
|
|
|
73
75
|
## Layout, output & help
|
|
74
76
|
|
|
75
|
-
Projects and details now occupy the same row, while the output panel takes its own full-width band beneath so long logs no longer stretch the rest of the UI. The output pane scrolls independently (Shift+β/β or mouse wheel),
|
|
77
|
+
Projects and details now occupy the same row, while the output panel takes its own full-width band beneath so long logs no longer stretch the rest of the UI. The output pane scrolls independently (Shift+β/β or mouse wheel), feeds keystrokes into stdin while a command runs (type like normal, Enter submits, Ctrl+C aborts), and the buffer below shows exactly what you are typing. A trio of help tiles highlights navigation cues, command flow, and recent runs; press H to hide/show those tiles if you need more space, S to open the structure guide that lists the manifest files for each language detection, `?` to open the overlay with extra tips, and L to rerun the previous command.
|
|
78
|
+
|
|
79
|
+
## Structure guide
|
|
80
|
+
|
|
81
|
+
Press `S` to reveal the structure guide that lists which manifest files trigger each language detection (Node.js looks for `package.json`, Python looks for `pyproject.toml` or `requirements.txt`, Rust needs `Cargo.toml`, etc.). Use `H` to hide the help cards if you need every pixel for your output, then bring them back when you want a refresher.
|
|
82
|
+
|
|
76
83
|
|
|
77
84
|
## Developer notes
|
|
78
85
|
|
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -764,6 +764,14 @@ async function discoverProjects(root) {
|
|
|
764
764
|
return Array.from(projectMap.values()).sort((a, b) => b.priority - a.priority);
|
|
765
765
|
}
|
|
766
766
|
|
|
767
|
+
const SCHEMA_GUIDE = SCHEMAS.map((schema) => ({
|
|
768
|
+
type: schema.type,
|
|
769
|
+
label: schema.label || schema.type,
|
|
770
|
+
icon: schema.icon || 'β',
|
|
771
|
+
files: schema.files,
|
|
772
|
+
hint: schema.label || schema.type
|
|
773
|
+
}));
|
|
774
|
+
|
|
767
775
|
const ACTION_MAP = {
|
|
768
776
|
b: 'build',
|
|
769
777
|
t: 'test',
|
|
@@ -771,8 +779,11 @@ const ACTION_MAP = {
|
|
|
771
779
|
};
|
|
772
780
|
const ART_CHARS = ['β', 'β', 'β', 'β
', 'β'];
|
|
773
781
|
const ART_COLORS = ['magenta', 'blue', 'cyan', 'yellow', 'red'];
|
|
774
|
-
const OUTPUT_WINDOW_SIZE =
|
|
782
|
+
const OUTPUT_WINDOW_SIZE = 8;
|
|
775
783
|
const OUTPUT_WINDOW_HEIGHT = OUTPUT_WINDOW_SIZE + 2;
|
|
784
|
+
const PROJECTS_MIN_WIDTH = 32;
|
|
785
|
+
const DETAILS_MIN_WIDTH = 44;
|
|
786
|
+
const HELP_CARD_MIN_WIDTH = 28;
|
|
776
787
|
const RECENT_RUN_LIMIT = 5;
|
|
777
788
|
|
|
778
789
|
function useScanner(rootPath) {
|
|
@@ -829,6 +840,9 @@ function Compass({rootPath}) {
|
|
|
829
840
|
const [customMode, setCustomMode] = useState(false);
|
|
830
841
|
const [customInput, setCustomInput] = useState('');
|
|
831
842
|
const [config, setConfig] = useState(() => loadConfig());
|
|
843
|
+
const [showHelpCards, setShowHelpCards] = useState(true);
|
|
844
|
+
const [showStructureGuide, setShowStructureGuide] = useState(false);
|
|
845
|
+
const [stdinBuffer, setStdinBuffer] = useState('');
|
|
832
846
|
const [showHelp, setShowHelp] = useState(false);
|
|
833
847
|
const [recentRuns, setRecentRuns] = useState([]);
|
|
834
848
|
const selectedProject = projects[selectedIndex] || null;
|
|
@@ -838,10 +852,17 @@ function Compass({rootPath}) {
|
|
|
838
852
|
const addLog = useCallback((line) => {
|
|
839
853
|
setLogLines((prev) => {
|
|
840
854
|
const normalized = typeof line === 'string' ? line : JSON.stringify(line);
|
|
841
|
-
const
|
|
842
|
-
|
|
855
|
+
const appended = [...prev, normalized];
|
|
856
|
+
const next = appended.length > 250 ? appended.slice(appended.length - 250) : appended;
|
|
857
|
+
setLogOffset((prevOffset) => {
|
|
858
|
+
const maxScroll = Math.max(0, next.length - OUTPUT_WINDOW_SIZE);
|
|
859
|
+
if (prevOffset === 0) {
|
|
860
|
+
return 0;
|
|
861
|
+
}
|
|
862
|
+
return Math.min(maxScroll, prevOffset + 1);
|
|
863
|
+
});
|
|
864
|
+
return next;
|
|
843
865
|
});
|
|
844
|
-
setLogOffset(0);
|
|
845
866
|
}, []);
|
|
846
867
|
|
|
847
868
|
const detailCommands = useMemo(() => buildDetailCommands(selectedProject, config), [selectedProject, config]);
|
|
@@ -901,6 +922,7 @@ function Compass({rootPath}) {
|
|
|
901
922
|
addLog(kleur.red(`β ${commandLabel} failed: ${error.shortMessage || error.message}`));
|
|
902
923
|
} finally {
|
|
903
924
|
setRunning(false);
|
|
925
|
+
setStdinBuffer('');
|
|
904
926
|
runningProcessRef.current = null;
|
|
905
927
|
}
|
|
906
928
|
}, [addLog, running, selectedProject]);
|
|
@@ -952,7 +974,7 @@ function Compass({rootPath}) {
|
|
|
952
974
|
setCustomInput('');
|
|
953
975
|
}, [customInput, selectedProject, handleAddCustomCommand, addLog]);
|
|
954
976
|
|
|
955
|
-
|
|
977
|
+
useInput((input, key) => {
|
|
956
978
|
if (customMode) {
|
|
957
979
|
if (key.return) {
|
|
958
980
|
handleCustomSubmit();
|
|
@@ -973,6 +995,16 @@ function Compass({rootPath}) {
|
|
|
973
995
|
return;
|
|
974
996
|
}
|
|
975
997
|
|
|
998
|
+
const normalizedInput = input?.toLowerCase();
|
|
999
|
+
if (normalizedInput === 'h') {
|
|
1000
|
+
setShowHelpCards((prev) => !prev);
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
if (normalizedInput === 's') {
|
|
1004
|
+
setShowStructureGuide((prev) => !prev);
|
|
1005
|
+
return;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
976
1008
|
const scrollLogs = (delta) => {
|
|
977
1009
|
setLogOffset((prev) => {
|
|
978
1010
|
const maxScroll = Math.max(0, logLines.length - OUTPUT_WINDOW_SIZE);
|
|
@@ -980,47 +1012,43 @@ function Compass({rootPath}) {
|
|
|
980
1012
|
});
|
|
981
1013
|
};
|
|
982
1014
|
|
|
983
|
-
if (key.mouse) {
|
|
984
|
-
if (key.mouse === 'left' && projects.length > 0) {
|
|
985
|
-
setSelectedIndex((prev) => (prev + 1) % projects.length);
|
|
986
|
-
} else if (key.mouse === 'scrollUp' || key.mouse === 'wheelUp') {
|
|
987
|
-
scrollLogs(1);
|
|
988
|
-
} else if (key.mouse === 'scrollDown' || key.mouse === 'wheelDown') {
|
|
989
|
-
scrollLogs(-1);
|
|
990
|
-
}
|
|
991
|
-
return;
|
|
992
|
-
}
|
|
993
|
-
|
|
994
1015
|
if (running && runningProcessRef.current) {
|
|
995
1016
|
if (key.ctrl && input === 'c') {
|
|
996
1017
|
runningProcessRef.current.kill('SIGINT');
|
|
1018
|
+
setStdinBuffer('');
|
|
997
1019
|
return;
|
|
998
1020
|
}
|
|
999
1021
|
if (key.return) {
|
|
1000
1022
|
runningProcessRef.current.stdin?.write('\n');
|
|
1023
|
+
setStdinBuffer('');
|
|
1024
|
+
return;
|
|
1025
|
+
}
|
|
1026
|
+
if (key.backspace) {
|
|
1027
|
+
runningProcessRef.current.stdin?.write('\x08');
|
|
1028
|
+
setStdinBuffer((prev) => prev.slice(0, -1));
|
|
1001
1029
|
return;
|
|
1002
1030
|
}
|
|
1003
1031
|
if (input) {
|
|
1004
1032
|
runningProcessRef.current.stdin?.write(input);
|
|
1033
|
+
setStdinBuffer((prev) => prev + input);
|
|
1005
1034
|
}
|
|
1006
1035
|
return;
|
|
1007
1036
|
}
|
|
1008
1037
|
|
|
1009
1038
|
if (key.shift && key.upArrow) {
|
|
1010
|
-
|
|
1011
|
-
setLogOffset((prev) => Math.min(maxScroll, prev + 1));
|
|
1039
|
+
scrollLogs(1);
|
|
1012
1040
|
return;
|
|
1013
1041
|
}
|
|
1014
1042
|
if (key.shift && key.downArrow) {
|
|
1015
|
-
|
|
1043
|
+
scrollLogs(-1);
|
|
1016
1044
|
return;
|
|
1017
1045
|
}
|
|
1018
1046
|
|
|
1019
|
-
if (
|
|
1047
|
+
if (normalizedInput === '?') {
|
|
1020
1048
|
setShowHelp((prev) => !prev);
|
|
1021
1049
|
return;
|
|
1022
1050
|
}
|
|
1023
|
-
if (
|
|
1051
|
+
if (normalizedInput === 'l' && lastCommandRef.current) {
|
|
1024
1052
|
runProjectCommand(lastCommandRef.current.commandMeta, lastCommandRef.current.project);
|
|
1025
1053
|
return;
|
|
1026
1054
|
}
|
|
@@ -1040,26 +1068,26 @@ function Compass({rootPath}) {
|
|
|
1040
1068
|
setViewMode((prev) => (prev === 'detail' ? 'list' : 'detail'));
|
|
1041
1069
|
return;
|
|
1042
1070
|
}
|
|
1043
|
-
if (
|
|
1071
|
+
if (normalizedInput === 'q') {
|
|
1044
1072
|
exit();
|
|
1045
1073
|
return;
|
|
1046
1074
|
}
|
|
1047
|
-
if (
|
|
1075
|
+
if (normalizedInput === 'c' && viewMode === 'detail' && selectedProject) {
|
|
1048
1076
|
setCustomMode(true);
|
|
1049
1077
|
setCustomInput('');
|
|
1050
1078
|
return;
|
|
1051
1079
|
}
|
|
1052
|
-
|
|
1053
|
-
|
|
1080
|
+
const actionKey = normalizedInput && ACTION_MAP[normalizedInput];
|
|
1081
|
+
if (actionKey) {
|
|
1082
|
+
const commandMeta = selectedProject?.commands?.[actionKey];
|
|
1054
1083
|
runProjectCommand(commandMeta, selectedProject);
|
|
1055
1084
|
return;
|
|
1056
1085
|
}
|
|
1057
|
-
if (viewMode === 'detail' && detailShortcutMap.has(
|
|
1058
|
-
runProjectCommand(detailShortcutMap.get(
|
|
1086
|
+
if (viewMode === 'detail' && normalizedInput && detailShortcutMap.has(normalizedInput)) {
|
|
1087
|
+
runProjectCommand(detailShortcutMap.get(normalizedInput), selectedProject);
|
|
1059
1088
|
}
|
|
1060
1089
|
});
|
|
1061
|
-
|
|
1062
|
-
const projectRows = [];
|
|
1090
|
+
const projectRows = [];
|
|
1063
1091
|
if (loading) {
|
|
1064
1092
|
projectRows.push(create(Text, {dimColor: true}, 'Scanning projectsβ¦'));
|
|
1065
1093
|
}
|
|
@@ -1213,60 +1241,86 @@ function Compass({rootPath}) {
|
|
|
1213
1241
|
const logWindowEnd = Math.max(0, logLines.length - logOffset);
|
|
1214
1242
|
const visibleLogs = logLines.slice(logWindowStart, logWindowEnd);
|
|
1215
1243
|
const logNodes = visibleLogs.length
|
|
1216
|
-
? visibleLogs.map((line, index) => create(Text, {key:
|
|
1244
|
+
? visibleLogs.map((line, index) => create(Text, {key: index}, line))
|
|
1217
1245
|
: [create(Text, {dimColor: true}, 'Logs will appear here once you run a command.')];
|
|
1218
1246
|
|
|
1219
|
-
|
|
1247
|
+
|
|
1248
|
+
// Using global SCHEMA_GUIDE
|
|
1249
|
+
|
|
1250
|
+
const helpCards = [
|
|
1220
1251
|
{
|
|
1221
1252
|
label: 'Navigation',
|
|
1222
1253
|
color: 'magenta',
|
|
1223
1254
|
body: [
|
|
1224
|
-
'β/β
|
|
1225
|
-
'Shift
|
|
1226
|
-
'
|
|
1255
|
+
'β/β move projects, Enter toggles detail view',
|
|
1256
|
+
'Shift+arrows scroll logs',
|
|
1257
|
+
'H hides/shows cards, ? opens overlay'
|
|
1227
1258
|
]
|
|
1228
1259
|
},
|
|
1229
1260
|
{
|
|
1230
1261
|
label: 'Command flow',
|
|
1231
1262
|
color: 'cyan',
|
|
1232
1263
|
body: [
|
|
1233
|
-
'B/T/R
|
|
1234
|
-
'1-9 execute
|
|
1235
|
-
'L reruns
|
|
1236
|
-
'Type while
|
|
1264
|
+
'B/T/R runs build/test/run quickly',
|
|
1265
|
+
'1-9 execute detail commands',
|
|
1266
|
+
'L reruns last command, Ctrl+C aborts',
|
|
1267
|
+
'Type while running to feed stdin'
|
|
1237
1268
|
]
|
|
1238
1269
|
},
|
|
1239
1270
|
{
|
|
1240
1271
|
label: 'Recent runs',
|
|
1241
1272
|
color: 'yellow',
|
|
1242
|
-
body:
|
|
1243
|
-
|
|
1244
|
-
|
|
1273
|
+
body: [
|
|
1274
|
+
recentRuns.length ? `${recentRuns.length} runs recorded` : 'No runs yet Β· start with B/T/R',
|
|
1275
|
+
'Press S for structure guide when you doubt the project layout'
|
|
1276
|
+
]
|
|
1245
1277
|
}
|
|
1246
1278
|
];
|
|
1247
1279
|
|
|
1248
|
-
const helpSection =
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1280
|
+
const helpSection = showHelpCards
|
|
1281
|
+
? create(
|
|
1282
|
+
Box,
|
|
1283
|
+
{marginTop: 1, flexDirection: 'row', justifyContent: 'space-between', flexWrap: 'wrap'},
|
|
1284
|
+
...helpCards.map((card, index) =>
|
|
1285
|
+
create(
|
|
1286
|
+
Box,
|
|
1287
|
+
{
|
|
1288
|
+
key: card.label,
|
|
1289
|
+
flexGrow: 1,
|
|
1290
|
+
flexBasis: 0,
|
|
1291
|
+
minWidth: HELP_CARD_MIN_WIDTH,
|
|
1292
|
+
marginRight: index < helpCards.length - 1 ? 1 : 0,
|
|
1293
|
+
marginBottom: 1,
|
|
1294
|
+
borderStyle: 'round',
|
|
1295
|
+
borderColor: card.color,
|
|
1296
|
+
padding: 1
|
|
1297
|
+
},
|
|
1298
|
+
create(Text, {color: card.color, bold: true}, card.label),
|
|
1299
|
+
...card.body.map((line, lineIndex) =>
|
|
1300
|
+
create(Text, {key: `${card.label}-${lineIndex}`, dimColor: card.color === 'yellow'}, line)
|
|
1301
|
+
)
|
|
1302
|
+
)
|
|
1303
|
+
)
|
|
1304
|
+
)
|
|
1305
|
+
: create(Text, {dimColor: true, marginTop: 1}, 'Help cards hidden Β· press H to show navigation, command flow, and recent runs.');
|
|
1306
|
+
|
|
1307
|
+
const structureGuide = showStructureGuide
|
|
1308
|
+
? create(
|
|
1253
1309
|
Box,
|
|
1254
1310
|
{
|
|
1255
|
-
|
|
1256
|
-
flexGrow: 1,
|
|
1257
|
-
flexBasis: 0,
|
|
1258
|
-
marginRight: index < helpCards.length - 1 ? 1 : 0,
|
|
1311
|
+
flexDirection: 'column',
|
|
1259
1312
|
borderStyle: 'round',
|
|
1260
|
-
borderColor:
|
|
1313
|
+
borderColor: 'blue',
|
|
1314
|
+
marginTop: 1,
|
|
1261
1315
|
padding: 1
|
|
1262
1316
|
},
|
|
1263
|
-
create(Text, {color:
|
|
1264
|
-
...
|
|
1265
|
-
create(Text, {key:
|
|
1266
|
-
)
|
|
1317
|
+
create(Text, {color: 'cyan', bold: true}, 'Project structure guide Β· press S to hide'),
|
|
1318
|
+
...SCHEMA_GUIDE.map((entry) =>
|
|
1319
|
+
create(Text, {key: entry.type, dimColor: true}, `β’ ${entry.icon} ${entry.label}: ${entry.files.join(', ')}`)
|
|
1320
|
+
),
|
|
1321
|
+
create(Text, {dimColor: true, marginTop: 1}, 'SCHEMAS describe the manifests that trigger each language type.')
|
|
1267
1322
|
)
|
|
1268
|
-
|
|
1269
|
-
);
|
|
1323
|
+
: null;
|
|
1270
1324
|
|
|
1271
1325
|
const helpOverlay = showHelp
|
|
1272
1326
|
? create(
|
|
@@ -1279,16 +1333,18 @@ function Compass({rootPath}) {
|
|
|
1279
1333
|
padding: 1
|
|
1280
1334
|
},
|
|
1281
1335
|
create(Text, {color: 'cyan', bold: true}, 'Help overlay Β· press ? to hide'),
|
|
1282
|
-
create(Text, null, '
|
|
1283
|
-
create(Text, null, '
|
|
1284
|
-
create(Text, null, '
|
|
1285
|
-
create(Text, null, '
|
|
1336
|
+
create(Text, null, 'Shift+arrows scroll the output buffer.'),
|
|
1337
|
+
create(Text, null, 'Run commands and type to feed stdin (Enter submits, Ctrl+C aborts).'),
|
|
1338
|
+
create(Text, null, 'H hides/shows the navigation cards, S shows structure tips, and L reruns the previous command.'),
|
|
1339
|
+
create(Text, null, 'Projects + Details stay side-by-side while Output and the log buffer stay fixed in their own band.'),
|
|
1340
|
+
create(Text, null, 'Structure guide lists the manifests that trigger each language detection (press S to toggle).')
|
|
1286
1341
|
)
|
|
1287
1342
|
: null;
|
|
1288
1343
|
|
|
1344
|
+
const toggleHint = showHelpCards ? 'H hides the help cards' : 'H shows the help cards';
|
|
1289
1345
|
const headerHint = viewMode === 'detail'
|
|
1290
|
-
? `Detail mode Β· 1-${Math.max(detailedIndexed.length, 1)} to execute, C: add custom commands, Enter: back to list, q: quit`
|
|
1291
|
-
: `Quick run Β· B/T/R to build/test/run, Enter: view details, q: quit`;
|
|
1346
|
+
? `Detail mode Β· 1-${Math.max(detailedIndexed.length, 1)} to execute, C: add custom commands, Enter: back to list, q: quit Β· ${toggleHint}, S shows structure guide`
|
|
1347
|
+
: `Quick run Β· B/T/R to build/test/run, Enter: view details, q: quit Β· ${toggleHint}, S shows structure guide`;
|
|
1292
1348
|
|
|
1293
1349
|
return create(
|
|
1294
1350
|
Box,
|
|
@@ -1301,7 +1357,7 @@ function Compass({rootPath}) {
|
|
|
1301
1357
|
{flexDirection: 'column'},
|
|
1302
1358
|
create(Text, {color: 'magenta', bold: true}, 'Project Compass'),
|
|
1303
1359
|
create(Text, {dimColor: true}, loading ? 'Scanning workspacesβ¦' : `${projectCountLabel} detected in ${rootPath}`),
|
|
1304
|
-
create(Text, {dimColor: true}, '
|
|
1360
|
+
create(Text, {dimColor: true}, 'Use keyboard arrows to navigate, ? for help.')
|
|
1305
1361
|
),
|
|
1306
1362
|
create(
|
|
1307
1363
|
Box,
|
|
@@ -1313,14 +1369,14 @@ function Compass({rootPath}) {
|
|
|
1313
1369
|
artBoard,
|
|
1314
1370
|
create(
|
|
1315
1371
|
Box,
|
|
1316
|
-
{marginTop: 1, flexDirection: 'row', alignItems: 'stretch', width: '100%', flexWrap: '
|
|
1372
|
+
{marginTop: 1, flexDirection: 'row', alignItems: 'stretch', width: '100%', flexWrap: 'wrap'},
|
|
1317
1373
|
create(
|
|
1318
1374
|
Box,
|
|
1319
1375
|
{
|
|
1320
1376
|
flexGrow: 1,
|
|
1321
1377
|
flexBasis: 0,
|
|
1322
1378
|
flexShrink: 1,
|
|
1323
|
-
minWidth:
|
|
1379
|
+
minWidth: PROJECTS_MIN_WIDTH,
|
|
1324
1380
|
marginRight: 1,
|
|
1325
1381
|
borderStyle: 'round',
|
|
1326
1382
|
borderColor: 'magenta',
|
|
@@ -1335,10 +1391,11 @@ function Compass({rootPath}) {
|
|
|
1335
1391
|
flexGrow: 1.3,
|
|
1336
1392
|
flexBasis: 0,
|
|
1337
1393
|
flexShrink: 1,
|
|
1338
|
-
minWidth:
|
|
1394
|
+
minWidth: DETAILS_MIN_WIDTH,
|
|
1339
1395
|
borderStyle: 'round',
|
|
1340
1396
|
borderColor: 'cyan',
|
|
1341
|
-
padding: 1
|
|
1397
|
+
padding: 1,
|
|
1398
|
+
flexDirection: 'column'
|
|
1342
1399
|
},
|
|
1343
1400
|
create(Text, {bold: true, color: 'cyan'}, 'Details'),
|
|
1344
1401
|
...detailContent
|
|
@@ -1369,14 +1426,26 @@ function Compass({rootPath}) {
|
|
|
1369
1426
|
...logNodes
|
|
1370
1427
|
),
|
|
1371
1428
|
create(
|
|
1372
|
-
|
|
1373
|
-
{
|
|
1374
|
-
running
|
|
1375
|
-
|
|
1376
|
-
|
|
1429
|
+
Box,
|
|
1430
|
+
{marginTop: 1, flexDirection: 'row', justifyContent: 'space-between'},
|
|
1431
|
+
create(Text, {dimColor: true}, running ? 'Type to feed stdin; Enter submits, Ctrl+C aborts.' : 'Run a command or press ? for extra help.'),
|
|
1432
|
+
create(Text, {dimColor: true}, `${toggleHint}, S toggles the structure guide`)
|
|
1433
|
+
),
|
|
1434
|
+
create(
|
|
1435
|
+
Box,
|
|
1436
|
+
{
|
|
1437
|
+
marginTop: 1,
|
|
1438
|
+
flexDirection: 'row',
|
|
1439
|
+
borderStyle: 'round',
|
|
1440
|
+
borderColor: running ? 'green' : 'gray',
|
|
1441
|
+
padding: 1
|
|
1442
|
+
},
|
|
1443
|
+
create(Text, {bold: true, color: running ? 'green' : 'white'}, running ? 'Stdin buffer' : 'Input ready'),
|
|
1444
|
+
create(Text, {dimColor: true, marginLeft: 1}, running ? (stdinBuffer || '(type to send)') : 'Start a command to feed stdin')
|
|
1377
1445
|
)
|
|
1378
1446
|
),
|
|
1379
1447
|
helpSection,
|
|
1448
|
+
structureGuide,
|
|
1380
1449
|
helpOverlay
|
|
1381
1450
|
);
|
|
1382
1451
|
}
|