rrce-workflow 0.2.40 → 0.2.41

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 (2) hide show
  1. package/dist/index.js +109 -100
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -2113,67 +2113,29 @@ var init_Header = __esm({
2113
2113
  }
2114
2114
  });
2115
2115
 
2116
- // src/mcp/ui/StatusBoard.tsx
2116
+ // src/mcp/ui/Overview.tsx
2117
2117
  import "react";
2118
2118
  import { Box as Box2, Text as Text2 } from "ink";
2119
2119
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
2120
- var StatusBoard;
2121
- var init_StatusBoard = __esm({
2122
- "src/mcp/ui/StatusBoard.tsx"() {
2123
- "use strict";
2124
- StatusBoard = ({ exposedLabel, port, pid, running }) => {
2125
- return /* @__PURE__ */ jsx2(Box2, { borderStyle: "single", borderColor: "cyan", paddingX: 1, children: /* @__PURE__ */ jsxs(Text2, { children: [
2126
- running ? /* @__PURE__ */ jsx2(Text2, { color: "green", children: "\u25CF RUNNING" }) : /* @__PURE__ */ jsx2(Text2, { color: "red", children: "\u25CF STOPPED" }),
2127
- " ",
2128
- "\u2502",
2129
- " \u{1F4CB} ",
2130
- /* @__PURE__ */ jsx2(Text2, { color: "yellow", children: exposedLabel }),
2131
- " ",
2132
- "\u2502",
2133
- " Port: ",
2134
- /* @__PURE__ */ jsx2(Text2, { color: "green", children: port }),
2135
- " ",
2136
- "\u2502",
2137
- " PID: ",
2138
- /* @__PURE__ */ jsx2(Text2, { color: "green", children: pid })
2139
- ] }) });
2140
- };
2141
- }
2142
- });
2143
-
2144
- // src/mcp/ui/Overview.tsx
2145
- import "react";
2146
- import { Box as Box3, Text as Text3 } from "ink";
2147
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
2148
2120
  var Overview;
2149
2121
  var init_Overview = __esm({
2150
2122
  "src/mcp/ui/Overview.tsx"() {
2151
2123
  "use strict";
2152
2124
  init_Header();
2153
- init_StatusBoard();
2154
2125
  Overview = ({ serverStatus, stats }) => {
2155
- return /* @__PURE__ */ jsxs2(Box3, { flexDirection: "column", children: [
2156
- /* @__PURE__ */ jsx3(Header, {}),
2157
- /* @__PURE__ */ jsx3(Box3, { marginTop: 1, marginBottom: 1, children: /* @__PURE__ */ jsx3(
2158
- StatusBoard,
2159
- {
2160
- exposedLabel: `${stats.exposedProjects} / ${stats.totalProjects} projects`,
2161
- port: serverStatus.port,
2162
- pid: serverStatus.pid,
2163
- running: serverStatus.running
2164
- }
2165
- ) }),
2166
- /* @__PURE__ */ jsxs2(Box3, { borderStyle: "round", padding: 1, borderColor: "white", flexDirection: "column", children: [
2167
- /* @__PURE__ */ jsx3(Text3, { bold: true, underline: true, children: "System Status" }),
2168
- /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, children: [
2169
- /* @__PURE__ */ jsx3(Text3, { children: "Integrations Installed: " }),
2170
- /* @__PURE__ */ jsx3(Text3, { color: stats.installedIntegrations > 0 ? "green" : "yellow", children: stats.installedIntegrations })
2126
+ return /* @__PURE__ */ jsxs(Box2, { flexDirection: "column", flexGrow: 1, children: [
2127
+ /* @__PURE__ */ jsx2(Header, {}),
2128
+ /* @__PURE__ */ jsxs(Box2, { borderStyle: "round", padding: 1, borderColor: "white", flexDirection: "column", flexGrow: 1, children: [
2129
+ /* @__PURE__ */ jsx2(Text2, { bold: true, underline: true, children: "System Status" }),
2130
+ /* @__PURE__ */ jsxs(Box2, { marginTop: 1, children: [
2131
+ /* @__PURE__ */ jsx2(Text2, { children: "Integrations Installed: " }),
2132
+ /* @__PURE__ */ jsx2(Text2, { color: stats.installedIntegrations > 0 ? "green" : "yellow", children: stats.installedIntegrations })
2171
2133
  ] }),
2172
- /* @__PURE__ */ jsxs2(Box3, { children: [
2173
- /* @__PURE__ */ jsx3(Text3, { children: "Server Port: " }),
2174
- /* @__PURE__ */ jsx3(Text3, { color: "cyan", children: serverStatus.port })
2134
+ /* @__PURE__ */ jsxs(Box2, { children: [
2135
+ /* @__PURE__ */ jsx2(Text2, { children: "Server Port: " }),
2136
+ /* @__PURE__ */ jsx2(Text2, { color: "cyan", children: serverStatus.port })
2175
2137
  ] }),
2176
- /* @__PURE__ */ jsx3(Box3, { marginTop: 1, children: /* @__PURE__ */ jsx3(Text3, { color: "dim", children: "Press 'q' to stop server and exit." }) })
2138
+ /* @__PURE__ */ jsx2(Box2, { marginTop: 1, children: /* @__PURE__ */ jsx2(Text2, { color: "dim", children: "Press 'q' to stop server and exit." }) })
2177
2139
  ] })
2178
2140
  ] });
2179
2141
  };
@@ -2182,8 +2144,8 @@ var init_Overview = __esm({
2182
2144
 
2183
2145
  // src/mcp/ui/components/SimpleSelect.tsx
2184
2146
  import { useState } from "react";
2185
- import { Box as Box4, Text as Text4, useInput } from "ink";
2186
- import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
2147
+ import { Box as Box3, Text as Text3, useInput } from "ink";
2148
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
2187
2149
  function SimpleSelect({
2188
2150
  items,
2189
2151
  onSelect,
@@ -2226,18 +2188,18 @@ function SimpleSelect({
2226
2188
  onCancel?.();
2227
2189
  }
2228
2190
  });
2229
- return /* @__PURE__ */ jsxs3(Box4, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", padding: 1, children: [
2230
- message && /* @__PURE__ */ jsx4(Box4, { marginBottom: 1, children: /* @__PURE__ */ jsx4(Text4, { bold: true, children: message }) }),
2191
+ return /* @__PURE__ */ jsxs2(Box3, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", padding: 1, children: [
2192
+ message && /* @__PURE__ */ jsx3(Box3, { marginBottom: 1, children: /* @__PURE__ */ jsx3(Text3, { bold: true, children: message }) }),
2231
2193
  items.map((item, index) => {
2232
2194
  const isSelected = index === selectedIndex;
2233
2195
  const isChecked = isMulti && selectedValues.has(item.value);
2234
- return /* @__PURE__ */ jsxs3(Box4, { children: [
2235
- /* @__PURE__ */ jsx4(Text4, { color: isSelected ? "cyan" : "white", children: isSelected ? "> " : " " }),
2236
- isMulti && /* @__PURE__ */ jsx4(Text4, { color: isChecked ? "green" : "gray", children: isChecked ? "[x] " : "[ ] " }),
2237
- /* @__PURE__ */ jsx4(Text4, { color: isSelected ? "cyan" : "white", children: item.label })
2196
+ return /* @__PURE__ */ jsxs2(Box3, { children: [
2197
+ /* @__PURE__ */ jsx3(Text3, { color: isSelected ? "cyan" : "white", children: isSelected ? "> " : " " }),
2198
+ isMulti && /* @__PURE__ */ jsx3(Text3, { color: isChecked ? "green" : "gray", children: isChecked ? "[x] " : "[ ] " }),
2199
+ /* @__PURE__ */ jsx3(Text3, { color: isSelected ? "cyan" : "white", children: item.label })
2238
2200
  ] }, item.key || String(item.value));
2239
2201
  }),
2240
- /* @__PURE__ */ jsx4(Box4, { marginTop: 1, children: /* @__PURE__ */ jsx4(Text4, { color: "gray", children: isMulti ? "Space to toggle, Enter to confirm, Esc to cancel" : "Enter to select, Esc to cancel" }) })
2202
+ /* @__PURE__ */ jsx3(Box3, { marginTop: 1, children: /* @__PURE__ */ jsx3(Text3, { color: "gray", children: isMulti ? "Space to toggle, Enter to confirm, Esc to cancel" : "Enter to select, Esc to cancel" }) })
2241
2203
  ] });
2242
2204
  }
2243
2205
  var init_SimpleSelect = __esm({
@@ -2248,8 +2210,8 @@ var init_SimpleSelect = __esm({
2248
2210
 
2249
2211
  // src/mcp/ui/ProjectsView.tsx
2250
2212
  import { useState as useState2 } from "react";
2251
- import { Box as Box5, Text as Text5 } from "ink";
2252
- import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
2213
+ import { Box as Box4, Text as Text4 } from "ink";
2214
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
2253
2215
  var ProjectsView;
2254
2216
  var init_ProjectsView = __esm({
2255
2217
  "src/mcp/ui/ProjectsView.tsx"() {
@@ -2257,7 +2219,7 @@ var init_ProjectsView = __esm({
2257
2219
  init_SimpleSelect();
2258
2220
  init_config();
2259
2221
  init_detection();
2260
- ProjectsView = () => {
2222
+ ProjectsView = ({ onConfigChange }) => {
2261
2223
  const [config, setConfig] = useState2(loadMCPConfig());
2262
2224
  const allProjects = scanForProjects();
2263
2225
  const projectItems = allProjects.map((p) => {
@@ -2291,11 +2253,12 @@ var init_ProjectsView = __esm({
2291
2253
  });
2292
2254
  saveMCPConfig(newConfig);
2293
2255
  setConfig(newConfig);
2256
+ if (onConfigChange) onConfigChange();
2294
2257
  };
2295
- return /* @__PURE__ */ jsxs4(Box5, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "cyan", children: [
2296
- /* @__PURE__ */ jsx5(Text5, { bold: true, color: "cyan", children: " Exposed Projects " }),
2297
- /* @__PURE__ */ jsx5(Text5, { color: "dim", children: " Select projects to expose via the MCP server. Use Space to toggle, Enter to save." }),
2298
- /* @__PURE__ */ jsx5(Box5, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx5(
2258
+ return /* @__PURE__ */ jsxs3(Box4, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "cyan", children: [
2259
+ /* @__PURE__ */ jsx4(Text4, { bold: true, color: "cyan", children: " Exposed Projects " }),
2260
+ /* @__PURE__ */ jsx4(Text4, { color: "dim", children: " Select projects to expose via the MCP server. Use Space to toggle, Enter to save." }),
2261
+ /* @__PURE__ */ jsx4(Box4, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx4(
2299
2262
  SimpleSelect,
2300
2263
  {
2301
2264
  message: "",
@@ -2306,8 +2269,7 @@ var init_ProjectsView = __esm({
2306
2269
  },
2307
2270
  onSubmit: handleSubmit,
2308
2271
  onCancel: () => {
2309
- },
2310
- itemLimit: 10
2272
+ }
2311
2273
  },
2312
2274
  JSON.stringify(initialSelected)
2313
2275
  ) })
@@ -2318,8 +2280,8 @@ var init_ProjectsView = __esm({
2318
2280
 
2319
2281
  // src/mcp/ui/components/InstallWizard.tsx
2320
2282
  import { useState as useState3 } from "react";
2321
- import { Box as Box6, Text as Text6 } from "ink";
2322
- import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
2283
+ import { Box as Box5, Text as Text5 } from "ink";
2284
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
2323
2285
  var InstallWizard;
2324
2286
  var init_InstallWizard = __esm({
2325
2287
  "src/mcp/ui/components/InstallWizard.tsx"() {
@@ -2372,9 +2334,9 @@ var init_InstallWizard = __esm({
2372
2334
  onComplete();
2373
2335
  }, 2e3);
2374
2336
  };
2375
- return /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", children: [
2376
- message && /* @__PURE__ */ jsx6(Text6, { color: "green", children: message }),
2377
- /* @__PURE__ */ jsx6(
2337
+ return /* @__PURE__ */ jsxs4(Box5, { flexDirection: "column", children: [
2338
+ message && /* @__PURE__ */ jsx5(Text5, { color: "green", children: message }),
2339
+ /* @__PURE__ */ jsx5(
2378
2340
  SimpleSelect,
2379
2341
  {
2380
2342
  message: "Select integrations to install:",
@@ -2398,8 +2360,8 @@ var init_InstallWizard = __esm({
2398
2360
 
2399
2361
  // src/mcp/ui/InstallView.tsx
2400
2362
  import "react";
2401
- import { Box as Box7, Text as Text7 } from "ink";
2402
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
2363
+ import { Box as Box6, Text as Text6 } from "ink";
2364
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
2403
2365
  var InstallView;
2404
2366
  var init_InstallView = __esm({
2405
2367
  "src/mcp/ui/InstallView.tsx"() {
@@ -2408,10 +2370,10 @@ var init_InstallView = __esm({
2408
2370
  init_paths();
2409
2371
  InstallView = () => {
2410
2372
  const workspacePath = detectWorkspaceRoot();
2411
- return /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "magenta", children: [
2412
- /* @__PURE__ */ jsx7(Text7, { bold: true, color: "magenta", children: " Installation & Configuration " }),
2413
- /* @__PURE__ */ jsx7(Text7, { color: "dim", children: " Configure IDE integrations for VSCode, Claude, and Antigravity." }),
2414
- /* @__PURE__ */ jsx7(Box7, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx7(
2373
+ return /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "magenta", children: [
2374
+ /* @__PURE__ */ jsx6(Text6, { bold: true, color: "magenta", children: " Installation & Configuration " }),
2375
+ /* @__PURE__ */ jsx6(Text6, { color: "dim", children: " Configure IDE integrations for VSCode, Claude, and Antigravity." }),
2376
+ /* @__PURE__ */ jsx6(Box6, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx6(
2415
2377
  InstallWizard,
2416
2378
  {
2417
2379
  workspacePath,
@@ -2428,8 +2390,8 @@ var init_InstallView = __esm({
2428
2390
 
2429
2391
  // src/mcp/ui/LogViewer.tsx
2430
2392
  import "react";
2431
- import { Box as Box8, Text as Text8 } from "ink";
2432
- import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
2393
+ import { Box as Box7, Text as Text7 } from "ink";
2394
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
2433
2395
  var LogViewer;
2434
2396
  var init_LogViewer = __esm({
2435
2397
  "src/mcp/ui/LogViewer.tsx"() {
@@ -2439,20 +2401,48 @@ var init_LogViewer = __esm({
2439
2401
  const emptyLines = Math.max(0, height - visibleLogs.length);
2440
2402
  const padding = Array(emptyLines).fill("");
2441
2403
  const formatLog = (log) => {
2442
- if (log.includes("[ERROR]")) return /* @__PURE__ */ jsx8(Text8, { color: "red", children: log });
2443
- if (log.includes("[WARN]")) return /* @__PURE__ */ jsx8(Text8, { color: "yellow", children: log });
2444
- if (log.includes("[INFO]")) return /* @__PURE__ */ jsx8(Text8, { color: "green", children: log });
2445
- if (log.includes("Success")) return /* @__PURE__ */ jsx8(Text8, { color: "green", children: log });
2446
- return /* @__PURE__ */ jsx8(Text8, { children: log });
2404
+ if (log.includes("[ERROR]")) return /* @__PURE__ */ jsx7(Text7, { color: "red", children: log });
2405
+ if (log.includes("[WARN]")) return /* @__PURE__ */ jsx7(Text7, { color: "yellow", children: log });
2406
+ if (log.includes("[INFO]")) return /* @__PURE__ */ jsx7(Text7, { color: "green", children: log });
2407
+ if (log.includes("Success")) return /* @__PURE__ */ jsx7(Text7, { color: "green", children: log });
2408
+ return /* @__PURE__ */ jsx7(Text7, { children: log });
2447
2409
  };
2448
- return /* @__PURE__ */ jsxs7(Box8, { flexDirection: "column", borderStyle: "round", borderColor: "dim", paddingX: 1, height: height + 2, flexGrow: 1, children: [
2449
- padding.map((_, i) => /* @__PURE__ */ jsx8(Text8, { children: " " }, `empty-${i}`)),
2450
- visibleLogs.map((log, i) => /* @__PURE__ */ jsx8(Box8, { children: formatLog(log) }, `log-${i}`))
2410
+ return /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", borderStyle: "round", borderColor: "dim", paddingX: 1, height: height + 2, flexGrow: 1, children: [
2411
+ padding.map((_, i) => /* @__PURE__ */ jsx7(Text7, { children: " " }, `empty-${i}`)),
2412
+ visibleLogs.map((log, i) => /* @__PURE__ */ jsx7(Box7, { children: formatLog(log) }, `log-${i}`))
2451
2413
  ] });
2452
2414
  };
2453
2415
  }
2454
2416
  });
2455
2417
 
2418
+ // src/mcp/ui/StatusBoard.tsx
2419
+ import "react";
2420
+ import { Box as Box8, Text as Text8 } from "ink";
2421
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
2422
+ var StatusBoard;
2423
+ var init_StatusBoard = __esm({
2424
+ "src/mcp/ui/StatusBoard.tsx"() {
2425
+ "use strict";
2426
+ StatusBoard = ({ exposedLabel, port, pid, running }) => {
2427
+ return /* @__PURE__ */ jsx8(Box8, { borderStyle: "single", borderColor: "cyan", paddingX: 1, children: /* @__PURE__ */ jsxs7(Text8, { children: [
2428
+ running ? /* @__PURE__ */ jsx8(Text8, { color: "green", children: "\u25CF RUNNING" }) : /* @__PURE__ */ jsx8(Text8, { color: "red", children: "\u25CF STOPPED" }),
2429
+ " ",
2430
+ "\u2502",
2431
+ " \u{1F4CB} ",
2432
+ /* @__PURE__ */ jsx8(Text8, { color: "yellow", children: exposedLabel }),
2433
+ " ",
2434
+ "\u2502",
2435
+ " Port: ",
2436
+ /* @__PURE__ */ jsx8(Text8, { color: "green", children: port }),
2437
+ " ",
2438
+ "\u2502",
2439
+ " PID: ",
2440
+ /* @__PURE__ */ jsx8(Text8, { color: "green", children: pid })
2441
+ ] }) });
2442
+ };
2443
+ }
2444
+ });
2445
+
2456
2446
  // src/mcp/ui/components/TabBar.tsx
2457
2447
  import "react";
2458
2448
  import { Box as Box9, Text as Text9, useInput as useInput2 } from "ink";
@@ -2465,17 +2455,22 @@ var init_TabBar = __esm({
2465
2455
  useInput2((input, key) => {
2466
2456
  if (key.leftArrow) {
2467
2457
  const index = tabs.findIndex((t) => t.id === activeTab);
2468
- const nextIndex = (index - 1 + tabs.length) % tabs.length;
2469
- onChange(tabs[nextIndex].id);
2458
+ if (index !== -1) {
2459
+ const nextIndex = (index - 1 + tabs.length) % tabs.length;
2460
+ onChange(tabs[nextIndex]?.id || tabs[0].id);
2461
+ }
2470
2462
  }
2471
2463
  if (key.rightArrow) {
2472
2464
  const index = tabs.findIndex((t) => t.id === activeTab);
2473
- const nextIndex = (index + 1) % tabs.length;
2474
- onChange(tabs[nextIndex].id);
2465
+ if (index !== -1) {
2466
+ const nextIndex = (index + 1) % tabs.length;
2467
+ onChange(tabs[nextIndex]?.id || tabs[0].id);
2468
+ }
2475
2469
  }
2476
2470
  const num = parseInt(input);
2477
2471
  if (!isNaN(num) && num > 0 && num <= tabs.length) {
2478
- onChange(tabs[num - 1].id);
2472
+ const tab = tabs[num - 1];
2473
+ if (tab) onChange(tab.id);
2479
2474
  }
2480
2475
  });
2481
2476
  return /* @__PURE__ */ jsxs8(Box9, { borderStyle: "single", paddingX: 1, borderColor: "gray", children: [
@@ -2484,7 +2479,7 @@ var init_TabBar = __esm({
2484
2479
  return /* @__PURE__ */ jsx9(Box9, { marginRight: 2, children: /* @__PURE__ */ jsx9(
2485
2480
  Text9,
2486
2481
  {
2487
- color: isActive ? "cyan" : "gray",
2482
+ color: isActive ? "cyan" : "white",
2488
2483
  bold: isActive,
2489
2484
  backgroundColor: isActive ? "black" : void 0,
2490
2485
  children: isActive ? `[ ${tab.label} ]` : ` ${tab.label} `
@@ -2515,6 +2510,7 @@ var init_App = __esm({
2515
2510
  init_ProjectsView();
2516
2511
  init_InstallView();
2517
2512
  init_LogViewer();
2513
+ init_StatusBoard();
2518
2514
  init_TabBar();
2519
2515
  init_config();
2520
2516
  init_detection();
@@ -2524,19 +2520,20 @@ var init_App = __esm({
2524
2520
  init_paths();
2525
2521
  TABS = [
2526
2522
  { id: "overview", label: "Overview" },
2523
+ { id: "logs", label: "Logs" },
2527
2524
  { id: "projects", label: "Projects" },
2528
- { id: "install", label: "Install" },
2529
- { id: "logs", label: "Logs" }
2525
+ { id: "install", label: "Install" }
2530
2526
  ];
2531
2527
  App = ({ onExit, initialPort }) => {
2532
2528
  const { exit } = useApp();
2533
- const [activeTab, setActiveTab] = useState4("overview");
2529
+ const [activeTab, setActiveTab] = useState4("logs");
2534
2530
  const [logs, setLogs] = useState4([]);
2535
2531
  const [serverInfo, setServerInfo] = useState4({
2536
2532
  port: initialPort,
2537
2533
  pid: process.pid,
2538
2534
  running: false
2539
2535
  });
2536
+ const [configVersion, setConfigVersion] = useState4(0);
2540
2537
  const config = loadMCPConfig();
2541
2538
  const projects = scanForProjects();
2542
2539
  const exposedProjects = projects.filter((p) => {
@@ -2605,6 +2602,9 @@ var init_App = __esm({
2605
2602
  });
2606
2603
  const termHeight = process.stdout.rows || 24;
2607
2604
  const contentHeight = termHeight - 8;
2605
+ const handleConfigChange = () => {
2606
+ setConfigVersion((prev) => prev + 1);
2607
+ };
2608
2608
  return /* @__PURE__ */ jsxs9(Box10, { flexDirection: "column", padding: 0, height: termHeight, children: [
2609
2609
  /* @__PURE__ */ jsx10(TabBar, { tabs: TABS, activeTab, onChange: setActiveTab }),
2610
2610
  /* @__PURE__ */ jsxs9(Box10, { marginTop: 1, flexGrow: 1, children: [
@@ -2619,10 +2619,19 @@ var init_App = __esm({
2619
2619
  }
2620
2620
  }
2621
2621
  ),
2622
- activeTab === "projects" && /* @__PURE__ */ jsx10(ProjectsView, {}),
2622
+ activeTab === "projects" && /* @__PURE__ */ jsx10(ProjectsView, { onConfigChange: handleConfigChange }),
2623
2623
  activeTab === "install" && /* @__PURE__ */ jsx10(InstallView, {}),
2624
2624
  activeTab === "logs" && /* @__PURE__ */ jsx10(LogViewer, { logs, height: contentHeight })
2625
- ] })
2625
+ ] }),
2626
+ /* @__PURE__ */ jsx10(Box10, { marginTop: 0, children: /* @__PURE__ */ jsx10(
2627
+ StatusBoard,
2628
+ {
2629
+ exposedLabel: `${exposedProjects.length} / ${projects.length} projects`,
2630
+ port: serverInfo.port,
2631
+ pid: serverInfo.pid,
2632
+ running: serverInfo.running
2633
+ }
2634
+ ) })
2626
2635
  ] });
2627
2636
  };
2628
2637
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rrce-workflow",
3
- "version": "0.2.40",
3
+ "version": "0.2.41",
4
4
  "description": "RRCE-Workflow TUI - Agentic code workflow generator for AI-assisted development",
5
5
  "author": "RRCE Team",
6
6
  "license": "MIT",