rrce-workflow 0.2.56 → 0.2.58

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 +175 -55
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1152,6 +1152,7 @@ function installAgentPrompts(config, workspacePath, dataPaths) {
1152
1152
  const agentCoreDir = getAgentCoreDir();
1153
1153
  syncMetadataToAll(agentCoreDir, dataPaths);
1154
1154
  copyDirToAllStoragePaths(path10.join(agentCoreDir, "templates"), "templates", dataPaths);
1155
+ copyDirToAllStoragePaths(path10.join(agentCoreDir, "prompts"), "prompts", dataPaths);
1155
1156
  if (config.storageMode === "workspace") {
1156
1157
  const prompts = loadPromptsFromDir(getAgentCorePromptsDir());
1157
1158
  if (config.tools.includes("copilot")) {
@@ -1184,9 +1185,15 @@ project:
1184
1185
  name: "${workspaceName}"
1185
1186
 
1186
1187
  tools:
1187
- copilot: ${config.tools.includes("copilot")}
1188
- antigravity: ${config.tools.includes("antigravity")}
1188
+ copilot: ${config.storageMode === "workspace" && config.tools.includes("copilot")}
1189
+ antigravity: ${config.storageMode === "workspace" && config.tools.includes("antigravity")}
1189
1190
  `;
1191
+ if (config.enableRAG) {
1192
+ content += `
1193
+ semantic_search:
1194
+ enabled: true
1195
+ `;
1196
+ }
1190
1197
  if (config.linkedProjects.length > 0) {
1191
1198
  content += `
1192
1199
  linked_projects:
@@ -1662,6 +1669,10 @@ function getExposedProjects() {
1662
1669
  }
1663
1670
  return [...globalProjects, ...linkedProjects];
1664
1671
  }
1672
+ function getRAGIndexPath(project) {
1673
+ const scanRoot = project.path || project.dataPath;
1674
+ return path14.join(project.knowledgePath || path14.join(scanRoot, ".rrce-workflow", "knowledge"), "embeddings.json");
1675
+ }
1665
1676
  function detectActiveProject(knownProjects) {
1666
1677
  let scanList = knownProjects;
1667
1678
  if (!scanList) {
@@ -2756,7 +2767,7 @@ var init_Header = __esm({
2756
2767
  });
2757
2768
 
2758
2769
  // src/mcp/ui/Overview.tsx
2759
- import "react";
2770
+ import { useMemo } from "react";
2760
2771
  import { Box as Box2, Text as Text2 } from "ink";
2761
2772
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
2762
2773
  var Overview;
@@ -2764,7 +2775,9 @@ var init_Overview = __esm({
2764
2775
  "src/mcp/ui/Overview.tsx"() {
2765
2776
  "use strict";
2766
2777
  init_Header();
2778
+ init_prompts2();
2767
2779
  Overview = ({ serverStatus, stats }) => {
2780
+ const agents = useMemo(() => getAllPrompts(), []);
2768
2781
  return /* @__PURE__ */ jsxs(Box2, { flexDirection: "column", flexGrow: 1, children: [
2769
2782
  /* @__PURE__ */ jsx2(Header, {}),
2770
2783
  /* @__PURE__ */ jsxs(Box2, { borderStyle: "round", padding: 1, borderColor: "white", flexDirection: "column", flexGrow: 1, children: [
@@ -2791,23 +2804,33 @@ var init_Overview = __esm({
2791
2804
  ] })
2792
2805
  ] })
2793
2806
  ] }),
2794
- /* @__PURE__ */ jsxs(Box2, { marginTop: 1, borderStyle: "single", borderColor: "gray", flexDirection: "column", paddingX: 1, children: [
2795
- /* @__PURE__ */ jsx2(Text2, { bold: true, children: "Usage Tips:" }),
2796
- /* @__PURE__ */ jsxs(Text2, { children: [
2797
- "\u2022 ",
2798
- /* @__PURE__ */ jsx2(Text2, { color: "yellow", children: "init" }),
2799
- ': "Initialize project context"'
2800
- ] }),
2801
- /* @__PURE__ */ jsxs(Text2, { children: [
2802
- "\u2022 ",
2803
- /* @__PURE__ */ jsx2(Text2, { color: "yellow", children: "plan" }),
2804
- ': "Create a plan for [task]"'
2805
- ] }),
2806
- /* @__PURE__ */ jsxs(Text2, { children: [
2807
- "\u2022 ",
2808
- /* @__PURE__ */ jsx2(Text2, { color: "yellow", children: "doctor" }),
2809
- ': "Check project health"'
2810
- ] })
2807
+ /* @__PURE__ */ jsxs(Box2, { marginTop: 1, borderStyle: "single", borderColor: "gray", flexDirection: "column", paddingX: 1, flexGrow: 1, children: [
2808
+ /* @__PURE__ */ jsx2(Text2, { bold: true, children: "Available Agents & Instructions:" }),
2809
+ agents.map((agent) => /* @__PURE__ */ jsxs(Box2, { flexDirection: "column", marginTop: 1, children: [
2810
+ /* @__PURE__ */ jsxs(Text2, { color: "yellow", children: [
2811
+ "\u27A4 ",
2812
+ agent.name,
2813
+ " ",
2814
+ /* @__PURE__ */ jsxs(Text2, { color: "dim", children: [
2815
+ "(",
2816
+ agent.id,
2817
+ ")"
2818
+ ] })
2819
+ ] }),
2820
+ /* @__PURE__ */ jsxs(Text2, { color: "white", children: [
2821
+ " ",
2822
+ agent.description
2823
+ ] }),
2824
+ agent.arguments.length > 0 && /* @__PURE__ */ jsxs(Text2, { color: "dim", children: [
2825
+ " Args: ",
2826
+ agent.arguments.map((a) => a.name + (a.required ? "*" : "")).join(", ")
2827
+ ] }),
2828
+ /* @__PURE__ */ jsxs(Text2, { color: "cyan", children: [
2829
+ ' Instruction: "Use the ',
2830
+ agent.name,
2831
+ ' to..."'
2832
+ ] })
2833
+ ] }, agent.id))
2811
2834
  ] }),
2812
2835
  /* @__PURE__ */ jsxs(Box2, { marginTop: 1, flexDirection: "column", children: [
2813
2836
  /* @__PURE__ */ jsx2(Text2, { color: "dim", children: "Controls:" }),
@@ -3120,10 +3143,93 @@ var init_StatusBoard = __esm({
3120
3143
  }
3121
3144
  });
3122
3145
 
3146
+ // src/mcp/ui/IndexingStatus.tsx
3147
+ import { useState as useState4, useEffect as useEffect3 } from "react";
3148
+ import { Box as Box9, Text as Text9 } from "ink";
3149
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
3150
+ var IndexingStatus;
3151
+ var init_IndexingStatus = __esm({
3152
+ "src/mcp/ui/IndexingStatus.tsx"() {
3153
+ "use strict";
3154
+ init_rag();
3155
+ init_resources();
3156
+ init_config_utils();
3157
+ IndexingStatus = ({ projects, config }) => {
3158
+ const [stats, setStats] = useState4([]);
3159
+ const [loading, setLoading] = useState4(true);
3160
+ useEffect3(() => {
3161
+ const fetchStats = async () => {
3162
+ const newStats = [];
3163
+ for (const project of projects) {
3164
+ const projConfig = findProjectConfig(config, { name: project.name, path: project.path });
3165
+ const enabled = projConfig?.semanticSearch?.enabled ?? false;
3166
+ if (!enabled) {
3167
+ newStats.push({
3168
+ projectName: project.name,
3169
+ enabled: false,
3170
+ totalFiles: 0,
3171
+ totalChunks: 0
3172
+ });
3173
+ continue;
3174
+ }
3175
+ try {
3176
+ const indexPath = getRAGIndexPath(project);
3177
+ const rag = new RAGService(indexPath, "dummy");
3178
+ const s = rag.getStats();
3179
+ newStats.push({
3180
+ projectName: project.name,
3181
+ enabled: true,
3182
+ totalFiles: s.totalFiles,
3183
+ totalChunks: s.totalChunks,
3184
+ lastFullIndex: s.lastFullIndex
3185
+ });
3186
+ } catch (e) {
3187
+ newStats.push({
3188
+ projectName: project.name,
3189
+ enabled: true,
3190
+ totalFiles: 0,
3191
+ totalChunks: 0,
3192
+ error: String(e)
3193
+ });
3194
+ }
3195
+ }
3196
+ setStats(newStats);
3197
+ setLoading(false);
3198
+ };
3199
+ fetchStats();
3200
+ const interval = setInterval(fetchStats, 5e3);
3201
+ return () => clearInterval(interval);
3202
+ }, [projects, config]);
3203
+ if (loading && stats.length === 0) {
3204
+ return /* @__PURE__ */ jsx9(Text9, { children: "Loading indexing status..." });
3205
+ }
3206
+ return /* @__PURE__ */ jsxs8(Box9, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "blue", flexGrow: 1, children: [
3207
+ /* @__PURE__ */ jsx9(Text9, { bold: true, color: "blue", children: " RAG Indexing Status " }),
3208
+ /* @__PURE__ */ jsxs8(Box9, { marginTop: 1, flexDirection: "column", children: [
3209
+ /* @__PURE__ */ jsxs8(Box9, { children: [
3210
+ /* @__PURE__ */ jsx9(Box9, { width: 25, children: /* @__PURE__ */ jsx9(Text9, { underline: true, children: "Project" }) }),
3211
+ /* @__PURE__ */ jsx9(Box9, { width: 15, children: /* @__PURE__ */ jsx9(Text9, { underline: true, children: "Status" }) }),
3212
+ /* @__PURE__ */ jsx9(Box9, { width: 15, children: /* @__PURE__ */ jsx9(Text9, { underline: true, children: "Indexed Files" }) }),
3213
+ /* @__PURE__ */ jsx9(Box9, { width: 15, children: /* @__PURE__ */ jsx9(Text9, { underline: true, children: "Total Chunks" }) }),
3214
+ /* @__PURE__ */ jsx9(Box9, { children: /* @__PURE__ */ jsx9(Text9, { underline: true, children: "Last Index" }) })
3215
+ ] }),
3216
+ stats.length === 0 ? /* @__PURE__ */ jsx9(Text9, { color: "dim", children: "No exposed projects found." }) : stats.map((s) => /* @__PURE__ */ jsxs8(Box9, { marginTop: 0, children: [
3217
+ /* @__PURE__ */ jsx9(Box9, { width: 25, children: /* @__PURE__ */ jsx9(Text9, { color: "white", children: s.projectName }) }),
3218
+ /* @__PURE__ */ jsx9(Box9, { width: 15, children: /* @__PURE__ */ jsx9(Text9, { color: s.enabled ? "green" : "dim", children: s.enabled ? "Enabled" : "Disabled" }) }),
3219
+ /* @__PURE__ */ jsx9(Box9, { width: 15, children: /* @__PURE__ */ jsx9(Text9, { children: s.enabled ? s.totalFiles : "-" }) }),
3220
+ /* @__PURE__ */ jsx9(Box9, { width: 15, children: /* @__PURE__ */ jsx9(Text9, { children: s.enabled ? s.totalChunks : "-" }) }),
3221
+ /* @__PURE__ */ jsx9(Box9, { children: /* @__PURE__ */ jsx9(Text9, { children: s.lastFullIndex ? new Date(s.lastFullIndex).toLocaleTimeString() : "-" }) })
3222
+ ] }, s.projectName))
3223
+ ] })
3224
+ ] });
3225
+ };
3226
+ }
3227
+ });
3228
+
3123
3229
  // src/mcp/ui/components/TabBar.tsx
3124
3230
  import "react";
3125
- import { Box as Box9, Text as Text9, useInput as useInput2 } from "ink";
3126
- import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
3231
+ import { Box as Box10, Text as Text10, useInput as useInput2 } from "ink";
3232
+ import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
3127
3233
  var TabBar;
3128
3234
  var init_TabBar = __esm({
3129
3235
  "src/mcp/ui/components/TabBar.tsx"() {
@@ -3150,11 +3256,11 @@ var init_TabBar = __esm({
3150
3256
  if (tab) onChange(tab.id);
3151
3257
  }
3152
3258
  });
3153
- return /* @__PURE__ */ jsxs8(Box9, { borderStyle: "single", paddingX: 1, borderColor: "gray", children: [
3259
+ return /* @__PURE__ */ jsxs9(Box10, { borderStyle: "single", paddingX: 1, borderColor: "gray", children: [
3154
3260
  tabs.map((tab, index) => {
3155
3261
  const isActive = tab.id === activeTab;
3156
- return /* @__PURE__ */ jsx9(Box9, { marginRight: 2, children: /* @__PURE__ */ jsx9(
3157
- Text9,
3262
+ return /* @__PURE__ */ jsx10(Box10, { marginRight: 2, children: /* @__PURE__ */ jsx10(
3263
+ Text10,
3158
3264
  {
3159
3265
  color: isActive ? "cyan" : "white",
3160
3266
  bold: isActive,
@@ -3163,8 +3269,8 @@ var init_TabBar = __esm({
3163
3269
  }
3164
3270
  ) }, tab.id);
3165
3271
  }),
3166
- /* @__PURE__ */ jsx9(Box9, { flexGrow: 1 }),
3167
- /* @__PURE__ */ jsx9(Text9, { color: "dim", children: "Use \u25C4/\u25BA arrows to navigate" })
3272
+ /* @__PURE__ */ jsx10(Box10, { flexGrow: 1 }),
3273
+ /* @__PURE__ */ jsx10(Text10, { color: "dim", children: "Use \u25C4/\u25BA arrows to navigate" })
3168
3274
  ] });
3169
3275
  };
3170
3276
  }
@@ -3175,11 +3281,11 @@ var App_exports = {};
3175
3281
  __export(App_exports, {
3176
3282
  App: () => App
3177
3283
  });
3178
- import { useState as useState4, useEffect as useEffect3, useMemo, useCallback } from "react";
3179
- import { Box as Box10, useInput as useInput3, useApp } from "ink";
3284
+ import { useState as useState5, useEffect as useEffect4, useMemo as useMemo2, useCallback } from "react";
3285
+ import { Box as Box11, useInput as useInput3, useApp } from "ink";
3180
3286
  import fs15 from "fs";
3181
- import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
3182
- var TABS, App;
3287
+ import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
3288
+ var App;
3183
3289
  var init_App = __esm({
3184
3290
  "src/mcp/ui/App.tsx"() {
3185
3291
  "use strict";
@@ -3188,6 +3294,7 @@ var init_App = __esm({
3188
3294
  init_InstallView();
3189
3295
  init_LogViewer();
3190
3296
  init_StatusBoard();
3297
+ init_IndexingStatus();
3191
3298
  init_TabBar();
3192
3299
  init_config();
3193
3300
  init_config_utils();
@@ -3196,28 +3303,22 @@ var init_App = __esm({
3196
3303
  init_server();
3197
3304
  init_install();
3198
3305
  init_paths();
3199
- TABS = [
3200
- { id: "overview", label: "Overview" },
3201
- { id: "logs", label: "Logs" },
3202
- { id: "projects", label: "Projects" },
3203
- { id: "install", label: "Install" }
3204
- ];
3205
3306
  App = ({ onExit, initialPort }) => {
3206
3307
  const { exit } = useApp();
3207
- const [activeTab, setActiveTab] = useState4("overview");
3208
- const [logs, setLogs] = useState4([]);
3209
- const [serverInfo, setServerInfo] = useState4({
3308
+ const [activeTab, setActiveTab] = useState5("overview");
3309
+ const [logs, setLogs] = useState5([]);
3310
+ const [serverInfo, setServerInfo] = useState5({
3210
3311
  port: initialPort,
3211
3312
  pid: process.pid,
3212
3313
  running: false
3213
3314
  });
3214
- const [config, setConfig] = useState4(() => loadMCPConfig());
3215
- const [projects, setProjects] = useState4(() => scanForProjects());
3315
+ const [config, setConfig] = useState5(() => loadMCPConfig());
3316
+ const [projects, setProjects] = useState5(() => scanForProjects());
3216
3317
  const refreshData = useCallback(() => {
3217
3318
  setConfig(loadMCPConfig());
3218
3319
  setProjects(scanForProjects());
3219
3320
  }, []);
3220
- const exposedProjects = useMemo(
3321
+ const exposedProjects = useMemo2(
3221
3322
  () => projects.filter((p) => {
3222
3323
  const cfg = config.projects.find(
3223
3324
  (c) => c.path && c.path === p.path || !c.path && c.name === p.name
@@ -3226,6 +3327,24 @@ var init_App = __esm({
3226
3327
  }),
3227
3328
  [projects, config]
3228
3329
  );
3330
+ const isRAGEnabled = useMemo2(() => {
3331
+ return exposedProjects.some((p) => {
3332
+ const cfg = findProjectConfig(config, { name: p.name, path: p.path });
3333
+ return cfg?.semanticSearch?.enabled;
3334
+ });
3335
+ }, [exposedProjects, config]);
3336
+ const tabs = useMemo2(() => {
3337
+ const baseTabs = [
3338
+ { id: "overview", label: "Overview" },
3339
+ { id: "logs", label: "Logs" },
3340
+ { id: "projects", label: "Projects" },
3341
+ { id: "install", label: "Install" }
3342
+ ];
3343
+ if (isRAGEnabled) {
3344
+ baseTabs.splice(3, 0, { id: "indexing", label: "Indexing" });
3345
+ }
3346
+ return baseTabs;
3347
+ }, [isRAGEnabled]);
3229
3348
  const workspacePath = detectWorkspaceRoot();
3230
3349
  const installStatus = checkInstallStatus(workspacePath);
3231
3350
  const installedCount = [
@@ -3234,7 +3353,7 @@ var init_App = __esm({
3234
3353
  installStatus.vscodeGlobal,
3235
3354
  installStatus.vscodeWorkspace
3236
3355
  ].filter(Boolean).length;
3237
- useEffect3(() => {
3356
+ useEffect4(() => {
3238
3357
  const start = async () => {
3239
3358
  const status = getMCPServerStatus();
3240
3359
  if (!status.running) {
@@ -3250,7 +3369,7 @@ var init_App = __esm({
3250
3369
  };
3251
3370
  start();
3252
3371
  }, []);
3253
- useEffect3(() => {
3372
+ useEffect4(() => {
3254
3373
  const logPath = getLogFilePath();
3255
3374
  let lastSize = 0;
3256
3375
  if (fs15.existsSync(logPath)) {
@@ -3301,10 +3420,10 @@ var init_App = __esm({
3301
3420
  const handleConfigChange = useCallback(() => {
3302
3421
  refreshData();
3303
3422
  }, [refreshData]);
3304
- return /* @__PURE__ */ jsxs9(Box10, { flexDirection: "column", padding: 0, height: termHeight, children: [
3305
- /* @__PURE__ */ jsx10(TabBar, { tabs: TABS, activeTab, onChange: setActiveTab }),
3306
- /* @__PURE__ */ jsxs9(Box10, { marginTop: 1, flexGrow: 1, children: [
3307
- activeTab === "overview" && /* @__PURE__ */ jsx10(
3423
+ return /* @__PURE__ */ jsxs10(Box11, { flexDirection: "column", padding: 0, height: termHeight, children: [
3424
+ /* @__PURE__ */ jsx11(TabBar, { tabs, activeTab, onChange: setActiveTab }),
3425
+ /* @__PURE__ */ jsxs10(Box11, { marginTop: 1, flexGrow: 1, children: [
3426
+ activeTab === "overview" && /* @__PURE__ */ jsx11(
3308
3427
  Overview,
3309
3428
  {
3310
3429
  serverStatus: serverInfo,
@@ -3315,11 +3434,12 @@ var init_App = __esm({
3315
3434
  }
3316
3435
  }
3317
3436
  ),
3318
- activeTab === "projects" && /* @__PURE__ */ jsx10(ProjectsView, { config, projects, onConfigChange: handleConfigChange }),
3319
- activeTab === "install" && /* @__PURE__ */ jsx10(InstallView, {}),
3320
- activeTab === "logs" && /* @__PURE__ */ jsx10(LogViewer, { logs, height: contentHeight })
3437
+ activeTab === "projects" && /* @__PURE__ */ jsx11(ProjectsView, { config, projects, onConfigChange: handleConfigChange }),
3438
+ activeTab === "indexing" && /* @__PURE__ */ jsx11(IndexingStatus, { config, projects: exposedProjects }),
3439
+ activeTab === "install" && /* @__PURE__ */ jsx11(InstallView, {}),
3440
+ activeTab === "logs" && /* @__PURE__ */ jsx11(LogViewer, { logs, height: contentHeight })
3321
3441
  ] }),
3322
- /* @__PURE__ */ jsx10(Box10, { marginTop: 0, children: /* @__PURE__ */ jsx10(
3442
+ /* @__PURE__ */ jsx11(Box11, { marginTop: 0, children: /* @__PURE__ */ jsx11(
3323
3443
  StatusBoard,
3324
3444
  {
3325
3445
  exposedLabel: `${exposedProjects.length} / ${projects.length} projects`,
@@ -3336,7 +3456,7 @@ var init_App = __esm({
3336
3456
  // src/mcp/commands/start.ts
3337
3457
  import { confirm as confirm3, isCancel as isCancel5, text } from "@clack/prompts";
3338
3458
  async function handleStartServer() {
3339
- const React11 = await import("react");
3459
+ const React12 = await import("react");
3340
3460
  const { render } = await import("ink");
3341
3461
  const { App: App2 } = await Promise.resolve().then(() => (init_App(), App_exports));
3342
3462
  const config = loadMCPConfig();
@@ -3377,7 +3497,7 @@ async function handleStartServer() {
3377
3497
  }
3378
3498
  }
3379
3499
  process.stdin.resume();
3380
- const app = render(React11.createElement(App2, {
3500
+ const app = render(React12.createElement(App2, {
3381
3501
  initialPort,
3382
3502
  onExit: () => {
3383
3503
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rrce-workflow",
3
- "version": "0.2.56",
3
+ "version": "0.2.58",
4
4
  "description": "RRCE-Workflow TUI - Agentic code workflow generator for AI-assisted development",
5
5
  "author": "RRCE Team",
6
6
  "license": "MIT",