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.
Files changed (3) hide show
  1. package/README.md +15 -8
  2. package/package.json +1 -1
  3. 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 + help tiles keep logs in one pane, support smooth refresh (Shift+↑/↓ or mouse wheel to scroll, typing feeds stdin, Ctrl+C aborts, L reruns the last command) and include a `?` overlay for quick navigation tips.
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
- | ↑ / ↓ | Navigate the project list |
33
- | Enter | Toggle the detail view with icons, commands, frameworks, and info |
34
- | B / T / R | Quick build / test / run actions (when available) |
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 (Shift+arrows or mouse wheel) |
38
- | L | Rerun the last executed command |
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), accepts keystrokes to feed stdin while a command runs, and honors Ctrl+C to abort. A trio of help tiles underneath highlights navigation cues, command flow, and recent runs, and pressing `?` opens an overlay with extra tips (for example, left-click cycles the project focus, L reruns the last command, and the help overlay reminds you about the new shortcuts).
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-compass",
3
- "version": "1.0.5",
3
+ "version": "1.0.8",
4
4
  "description": "Ink-based project explorer that detects local repos and lets you build/test/run them without memorizing commands.",
5
5
  "main": "src/cli.js",
6
6
  "type": "module",
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 = 10;
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 next = [...prev, normalized];
842
- return next.length > 250 ? next.slice(next.length - 250) : next;
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
- useInput((input, key) => {
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
- const maxScroll = Math.max(0, logLines.length - OUTPUT_WINDOW_SIZE);
1011
- setLogOffset((prev) => Math.min(maxScroll, prev + 1));
1039
+ scrollLogs(1);
1012
1040
  return;
1013
1041
  }
1014
1042
  if (key.shift && key.downArrow) {
1015
- setLogOffset((prev) => Math.max(0, prev - 1));
1043
+ scrollLogs(-1);
1016
1044
  return;
1017
1045
  }
1018
1046
 
1019
- if (input === '?') {
1047
+ if (normalizedInput === '?') {
1020
1048
  setShowHelp((prev) => !prev);
1021
1049
  return;
1022
1050
  }
1023
- if (input === 'l' && lastCommandRef.current) {
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 (input === 'q') {
1071
+ if (normalizedInput === 'q') {
1044
1072
  exit();
1045
1073
  return;
1046
1074
  }
1047
- if (input === 'c' && viewMode === 'detail' && selectedProject) {
1075
+ if (normalizedInput === 'c' && viewMode === 'detail' && selectedProject) {
1048
1076
  setCustomMode(true);
1049
1077
  setCustomInput('');
1050
1078
  return;
1051
1079
  }
1052
- if (ACTION_MAP[input]) {
1053
- const commandMeta = selectedProject?.commands?.[ACTION_MAP[input]];
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(input)) {
1058
- runProjectCommand(detailShortcutMap.get(input), selectedProject);
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: `${logWindowStart + index}-${line}`}, line))
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
- const helpCards = [
1247
+
1248
+ // Using global SCHEMA_GUIDE
1249
+
1250
+ const helpCards = [
1220
1251
  {
1221
1252
  label: 'Navigation',
1222
1253
  color: 'magenta',
1223
1254
  body: [
1224
- '↑/↓ select projects, Enter toggles detail view',
1225
- 'Shift+↑/↓ or mouse wheel scrolls logs',
1226
- '? toggles this overlay, left click cycles the list'
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 run build/test/run for the focused project',
1234
- '1-9 execute the numbered detail commands',
1235
- 'L reruns the last command, Ctrl+C aborts it',
1236
- 'Type while a command is running to feed stdin'
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: recentRuns.length
1243
- ? recentRuns.map((run) => `${run.time} Β· ${run.project}: ${run.command}`)
1244
- : ['No runs yet. Start one with B/T/R.']
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 = create(
1249
- Box,
1250
- {marginTop: 1, flexDirection: 'row', justifyContent: 'space-between'},
1251
- ...helpCards.map((card, index) =>
1252
- create(
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
- key: card.label,
1256
- flexGrow: 1,
1257
- flexBasis: 0,
1258
- marginRight: index < helpCards.length - 1 ? 1 : 0,
1311
+ flexDirection: 'column',
1259
1312
  borderStyle: 'round',
1260
- borderColor: card.color,
1313
+ borderColor: 'blue',
1314
+ marginTop: 1,
1261
1315
  padding: 1
1262
1316
  },
1263
- create(Text, {color: card.color, bold: true}, card.label),
1264
- ...card.body.map((line, lineIndex) =>
1265
- create(Text, {key: `${card.label}-${lineIndex}`, dimColor: card.color === 'yellow'}, line)
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, 'Clicking cycles selections and scrolling the mouse wheel moves the output view.'),
1283
- create(Text, null, 'When a command is running you can type to feed stdin, Enter sends newline, Ctrl+C aborts.'),
1284
- create(Text, null, 'Layout now keeps Projects and Details side-by-side with Output below so nothing stretches.'),
1285
- create(Text, null, 'Use L to rerun the previous command and Shift + arrows or the mouse wheel to scroll the output window.')
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}, 'Mouse support: click to cycle, wheel to scroll output.')
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: 'nowrap'},
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: 28,
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: 36,
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
- Text,
1373
- {dimColor: true, marginTop: 1},
1374
- running
1375
- ? 'Type to feed stdin, Enter submits, Ctrl+C aborts, Shift+Arrows or mouse wheel scrolls the buffer.'
1376
- : 'Run a command or press ? for extra help.'
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
  }