rrce-workflow 0.2.19 → 0.2.21

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 CHANGED
@@ -31,7 +31,7 @@ npx rrce-workflow
31
31
  ```
32
32
 
33
33
  The wizard will:
34
- 1. Ask where to store workflow data (global, workspace, or both)
34
+ 1. Ask where to store workflow data (global or workspace)
35
35
  2. Let you choose a custom global path if the default isn't writable
36
36
  3. Ask which AI tools you use (GitHub Copilot, Antigravity)
37
37
  4. Set up prompts and knowledge folders
@@ -89,7 +89,7 @@ All agents read `.rrce-workflow/config.yaml` to resolve paths:
89
89
 
90
90
  ```yaml
91
91
  storage:
92
- mode: workspace # or: global, both
92
+ mode: workspace # or: global
93
93
  globalPath: "~/.rrce-workflow" # optional custom path
94
94
 
95
95
  project:
@@ -97,13 +97,11 @@ project:
97
97
  ```
98
98
 
99
99
  Agents resolve `{{RRCE_DATA}}` based on storage mode:
100
- - `workspace` → `.rrce-workflow/`
101
100
  - `global` → `~/.rrce-workflow/workspaces/my-project/`
102
- - `both` → `.rrce-workflow/` (primary, synced to global)
103
101
 
104
102
  ### Cross-Project References
105
103
 
106
- When using `global` or `both` mode, you can reference other projects:
104
+ When using `global` mode, you can reference other projects:
107
105
 
108
106
  ```
109
107
  ~/.rrce-workflow/workspaces/other-project/knowledge/project-context.md
@@ -151,7 +149,6 @@ When you run the wizard on an already-configured project, you'll see:
151
149
  |------|----------|----------|
152
150
  | `global` | `~/.rrce-workflow/workspaces/<name>/` | Clean workspace, cross-project references |
153
151
  | `workspace` | `.rrce-workflow/` | Team sharing, portable with repo |
154
- | `both` | Both locations (synced) | Full redundancy + cross-project access |
155
152
 
156
153
  ---
157
154
 
@@ -24,7 +24,7 @@ You are the Documentation Lead for the project. Operate like a senior engineerin
24
24
  Before doing ANY work, read `.rrce-workflow/config.yaml` and resolve these variables:
25
25
  ```
26
26
  RRCE_HOME = config.storage.globalPath OR "~/.rrce-workflow"
27
- RRCE_DATA = (config.storage.mode == "workspace" or "both") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
27
+ RRCE_DATA = (config.storage.mode == "workspace") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
28
28
  ```
29
29
  Use these resolved paths for ALL subsequent file operations.
30
30
 
@@ -60,7 +60,7 @@ Path Resolution
60
60
 
61
61
  **How to resolve `{{RRCE_DATA}}`**:
62
62
  1. Read `config.yaml` → get `storage.mode` and `project.name`
63
- 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/` | `both` → `.rrce-workflow/`
63
+ 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/`
64
64
 
65
65
  **How to resolve `{{RRCE_HOME}}`**: `config.yaml` → `storage.globalPath` or default `~/.rrce-workflow`
66
66
 
@@ -20,7 +20,7 @@ You are the Executor for the project. Operate like a senior individual contribut
20
20
  Before doing ANY work, read `.rrce-workflow/config.yaml` and resolve these variables:
21
21
  ```
22
22
  RRCE_HOME = config.storage.globalPath OR "~/.rrce-workflow"
23
- RRCE_DATA = (config.storage.mode == "workspace" or "both") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
23
+ RRCE_DATA = (config.storage.mode == "workspace") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
24
24
  ```
25
25
  Use these resolved paths for ALL subsequent file operations.
26
26
 
@@ -64,7 +64,7 @@ Path Resolution
64
64
 
65
65
  **How to resolve `{{RRCE_DATA}}`**:
66
66
  1. Read `config.yaml` → get `storage.mode` and `project.name`
67
- 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/` | `both` → `.rrce-workflow/`
67
+ 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/`
68
68
 
69
69
  **How to resolve `{{RRCE_HOME}}`**: `config.yaml` → `storage.globalPath` or default `~/.rrce-workflow`
70
70
 
@@ -19,7 +19,7 @@ You are the Project Initializer for RRCE-Workflow. Operate like a senior archite
19
19
  Before doing ANY work, read `.rrce-workflow/config.yaml` (if it exists) and resolve these variables:
20
20
  ```
21
21
  RRCE_HOME = config.storage.globalPath OR "~/.rrce-workflow"
22
- RRCE_DATA = (config.storage.mode == "workspace" or "both") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
22
+ RRCE_DATA = (config.storage.mode == "workspace") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
23
23
  ```
24
24
  If config doesn't exist yet (new project), use defaults: `RRCE_HOME=~/.rrce-workflow`, `RRCE_DATA=.rrce-workflow/`
25
25
 
@@ -50,7 +50,6 @@ Path Resolution
50
50
  3. Resolve based on mode:
51
51
  - `workspace` → `<workspace>/.rrce-workflow/`
52
52
  - `global` → `{{RRCE_HOME}}/workspaces/<project.name>/`
53
- - `both` → `<workspace>/.rrce-workflow/` (primary), synced to global
54
53
 
55
54
  **How to resolve `{{RRCE_HOME}}`** (global home):
56
55
  1. Read `.rrce-workflow/config.yaml`
@@ -17,7 +17,7 @@ You are the Planning & Task Orchestrator for the project. Operate like an engine
17
17
  Before doing ANY work, read `.rrce-workflow/config.yaml` and resolve these variables:
18
18
  ```
19
19
  RRCE_HOME = config.storage.globalPath OR "~/.rrce-workflow"
20
- RRCE_DATA = (config.storage.mode == "workspace" or "both") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
20
+ RRCE_DATA = (config.storage.mode == "workspace") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
21
21
  ```
22
22
  Use these resolved paths for ALL subsequent file operations.
23
23
 
@@ -56,7 +56,7 @@ Path Resolution
56
56
 
57
57
  **How to resolve `{{RRCE_DATA}}`**:
58
58
  1. Read `config.yaml` → get `storage.mode` and `project.name`
59
- 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/` | `both` → `.rrce-workflow/`
59
+ 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/`
60
60
 
61
61
  **How to resolve `{{RRCE_HOME}}`**: `config.yaml` → `storage.globalPath` or default `~/.rrce-workflow`
62
62
 
@@ -24,7 +24,7 @@ You are the Research & Discussion Lead for the project. Operate like a staff-lev
24
24
  Before doing ANY work, read `.rrce-workflow/config.yaml` and resolve these variables:
25
25
  ```
26
26
  RRCE_HOME = config.storage.globalPath OR "~/.rrce-workflow"
27
- RRCE_DATA = (config.storage.mode == "workspace" or "both") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
27
+ RRCE_DATA = (config.storage.mode == "workspace") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
28
28
  ```
29
29
  Use these resolved paths for ALL subsequent file operations.
30
30
 
@@ -50,7 +50,7 @@ Path Resolution
50
50
 
51
51
  **How to resolve `{{RRCE_DATA}}`**:
52
52
  1. Read `config.yaml` → get `storage.mode` and `project.name`
53
- 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/` | `both` → `.rrce-workflow/`
53
+ 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/`
54
54
 
55
55
  **How to resolve `{{RRCE_HOME}}`**: `config.yaml` → `storage.globalPath` or default `~/.rrce-workflow`
56
56
 
@@ -18,7 +18,7 @@ You are the Knowledge Sync Lead. Act like a senior architect charged with keepin
18
18
  Before doing ANY work, read `.rrce-workflow/config.yaml` and resolve these variables:
19
19
  ```
20
20
  RRCE_HOME = config.storage.globalPath OR "~/.rrce-workflow"
21
- RRCE_DATA = (config.storage.mode == "workspace" or "both") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
21
+ RRCE_DATA = (config.storage.mode == "workspace") ? ".rrce-workflow/" : "${RRCE_HOME}/workspaces/${config.project.name}/"
22
22
  ```
23
23
  Use these resolved paths for ALL subsequent file operations.
24
24
 
@@ -50,7 +50,7 @@ Path Resolution
50
50
 
51
51
  **How to resolve `{{RRCE_DATA}}`**:
52
52
  1. Read `config.yaml` → get `storage.mode` and `project.name`
53
- 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/` | `both` → `.rrce-workflow/`
53
+ 2. Resolve: `workspace` → `.rrce-workflow/` | `global` → `{{RRCE_HOME}}/workspaces/<name>/`
54
54
 
55
55
  **How to resolve `{{RRCE_HOME}}`**: `config.yaml` → `storage.globalPath` or default `~/.rrce-workflow`
56
56
 
@@ -3,7 +3,6 @@
3
3
  - {{RRCE_DATA}}: Primary storage path (resolves based on storage mode in .rrce-workflow/config.yaml)
4
4
  - global: {{RRCE_HOME}}/workspaces/<workspace-name>/
5
5
  - workspace: <workspace>/.rrce-workflow/
6
- - both: <workspace>/.rrce-workflow/ (primary, auto-synced to global)
7
6
  - {{RRCE_HOME}}: Global home (default: ~/.rrce-workflow, customizable via storage.globalPath in config)
8
7
  - {{WORKSPACE_ROOT}}: Workspace root directory
9
8
  - {{WORKSPACE_NAME}}: Workspace name from config or directory name
@@ -3,7 +3,6 @@
3
3
  - {{RRCE_DATA}}: Primary storage path (resolves based on storage mode in .rrce-workflow/config.yaml)
4
4
  - global: {{RRCE_HOME}}/workspaces/<workspace-name>/
5
5
  - workspace: <workspace>/.rrce-workflow/
6
- - both: <workspace>/.rrce-workflow/ (primary, auto-synced to global)
7
6
  - {{RRCE_HOME}}: Global home (default: ~/.rrce-workflow, customizable via storage.globalPath in config)
8
7
  - {{WORKSPACE_ROOT}}: Workspace root directory
9
8
  - {{WORKSPACE_NAME}}: Workspace name from config or directory name
@@ -3,7 +3,6 @@
3
3
  - {{RRCE_DATA}}: Primary storage path (resolves based on storage mode in .rrce-workflow/config.yaml)
4
4
  - global: {{RRCE_HOME}}/workspaces/<workspace-name>/
5
5
  - workspace: <workspace>/.rrce-workflow/
6
- - both: <workspace>/.rrce-workflow/ (primary, auto-synced to global)
7
6
  - {{RRCE_HOME}}: Global home (default: ~/.rrce-workflow, customizable via storage.globalPath in config)
8
7
  - {{WORKSPACE_ROOT}}: Workspace root directory
9
8
  - {{WORKSPACE_NAME}}: Workspace name from config or directory name
@@ -3,7 +3,6 @@
3
3
  - {{RRCE_DATA}}: Primary storage path (resolves based on storage mode in .rrce-workflow/config.yaml)
4
4
  - global: {{RRCE_HOME}}/workspaces/<workspace-name>/
5
5
  - workspace: <workspace>/.rrce-workflow/
6
- - both: <workspace>/.rrce-workflow/ (primary, auto-synced to global)
7
6
  - {{RRCE_HOME}}: Global home (default: ~/.rrce-workflow, customizable via storage.globalPath in config)
8
7
  - {{WORKSPACE_ROOT}}: Workspace root directory
9
8
  - {{WORKSPACE_NAME}}: Workspace name from config or directory name
@@ -3,7 +3,6 @@
3
3
  - {{RRCE_DATA}}: Primary storage path (resolves based on storage mode in .rrce-workflow/config.yaml)
4
4
  - global: {{RRCE_HOME}}/workspaces/<workspace-name>/
5
5
  - workspace: <workspace>/.rrce-workflow/
6
- - both: <workspace>/.rrce-workflow/ (primary, auto-synced to global)
7
6
  - {{RRCE_HOME}}: Global home (default: ~/.rrce-workflow, customizable via storage.globalPath in config)
8
7
  - {{WORKSPACE_ROOT}}: Workspace root directory
9
8
  - {{WORKSPACE_NAME}}: Workspace name from config or directory name
package/dist/index.js CHANGED
@@ -256,7 +256,7 @@ function parseWorkspaceConfig(configPath) {
256
256
  try {
257
257
  const content = fs2.readFileSync(configPath, "utf-8");
258
258
  const nameMatch = content.match(/name:\s*["']?([^"'\n]+)["']?/);
259
- const modeMatch = content.match(/mode:\s*(global|workspace|both)/);
259
+ const modeMatch = content.match(/mode:\s*(global|workspace)/);
260
260
  const linkedProjects = [];
261
261
  const linkedMatch = content.match(/linked_projects:\s*\n((?:\s+-\s+[^\n]+\n?)+)/);
262
262
  if (linkedMatch && linkedMatch[1]) {
@@ -348,7 +348,7 @@ function loadPromptsFromDir(dirPath) {
348
348
  return prompts;
349
349
  }
350
350
  function getAgentCoreDir() {
351
- return path3.join(__dirname, "..", "..", "agent-core");
351
+ return path3.join(__dirname, "..", "agent-core");
352
352
  }
353
353
  function getAgentCorePromptsDir() {
354
354
  return path3.join(getAgentCoreDir(), "prompts");
@@ -578,9 +578,8 @@ async function runSetupFlow(workspacePath, workspaceName, existingProjects) {
578
578
  storageMode: () => select({
579
579
  message: "Where should workflow data be stored?",
580
580
  options: [
581
- { value: "global", label: "Global (~/.rrce-workflow/)" },
582
- { value: "workspace", label: "Workspace (.rrce-workflow/)" },
583
- { value: "both", label: "Both" }
581
+ { value: "global", label: "Global (~/.rrce-workflow/)", hint: "Cross-project access, clean workspace" },
582
+ { value: "workspace", label: "Workspace (.rrce-workflow/)", hint: "Self-contained, version with repo" }
584
583
  ],
585
584
  initialValue: "global"
586
585
  }),
@@ -609,6 +608,10 @@ async function runSetupFlow(workspacePath, workspaceName, existingProjects) {
609
608
  required: false
610
609
  });
611
610
  },
611
+ addToGitignore: () => confirm({
612
+ message: "Add generated folders to .gitignore?",
613
+ initialValue: true
614
+ }),
612
615
  confirm: () => confirm({
613
616
  message: "Create configuration?",
614
617
  initialValue: true
@@ -626,7 +629,7 @@ async function runSetupFlow(workspacePath, workspaceName, existingProjects) {
626
629
  process.exit(0);
627
630
  }
628
631
  let customGlobalPath;
629
- if (config.storageMode === "global" || config.storageMode === "both") {
632
+ if (config.storageMode === "global") {
630
633
  customGlobalPath = await resolveGlobalPath();
631
634
  if (!customGlobalPath) {
632
635
  cancel("Setup cancelled - no writable global path available.");
@@ -639,7 +642,8 @@ async function runSetupFlow(workspacePath, workspaceName, existingProjects) {
639
642
  storageMode: config.storageMode,
640
643
  globalPath: customGlobalPath,
641
644
  tools: config.tools,
642
- linkedProjects: config.linkedProjects
645
+ linkedProjects: config.linkedProjects,
646
+ addToGitignore: config.addToGitignore
643
647
  }, workspacePath, workspaceName, existingProjects);
644
648
  s.stop("Configuration generated");
645
649
  const dataPaths = getDataPaths(
@@ -649,7 +653,7 @@ async function runSetupFlow(workspacePath, workspaceName, existingProjects) {
649
653
  customGlobalPath
650
654
  );
651
655
  const summary = [
652
- `Storage: ${config.storageMode === "both" ? "global + workspace" : config.storageMode}`
656
+ `Storage: ${config.storageMode}`
653
657
  ];
654
658
  if (customGlobalPath && customGlobalPath !== getDefaultRRCEHome()) {
655
659
  summary.push(`Global path: ${pc2.cyan(customGlobalPath)}`);
@@ -791,6 +795,9 @@ linked_projects:
791
795
  });
792
796
  }
793
797
  fs7.writeFileSync(workspaceConfigPath, configContent);
798
+ if (config.addToGitignore) {
799
+ updateGitignore(workspacePath, config.storageMode, config.tools);
800
+ }
794
801
  if (config.tools.includes("copilot") || config.linkedProjects.length > 0) {
795
802
  const selectedProjects = allProjects.filter(
796
803
  (p) => config.linkedProjects.includes(`${p.name}:${p.source}`)
@@ -806,12 +813,55 @@ function getDataPaths(mode, workspaceName, workspaceRoot, customGlobalPath) {
806
813
  return [globalPath];
807
814
  case "workspace":
808
815
  return [workspacePath];
809
- case "both":
810
- return [workspacePath, globalPath];
811
816
  default:
812
817
  return [globalPath];
813
818
  }
814
819
  }
820
+ function updateGitignore(workspacePath, storageMode, tools) {
821
+ const gitignorePath = path7.join(workspacePath, ".gitignore");
822
+ const entries = [];
823
+ if (storageMode === "workspace") {
824
+ entries.push(".rrce-workflow/");
825
+ }
826
+ if (tools.includes("copilot")) {
827
+ entries.push(".github/agents/");
828
+ }
829
+ if (tools.includes("antigravity")) {
830
+ entries.push(".agent/");
831
+ }
832
+ if (entries.length === 0) {
833
+ return false;
834
+ }
835
+ try {
836
+ let content = "";
837
+ if (fs7.existsSync(gitignorePath)) {
838
+ content = fs7.readFileSync(gitignorePath, "utf-8");
839
+ }
840
+ const lines = content.split("\n").map((line) => line.trim());
841
+ const newEntries = [];
842
+ for (const entry of entries) {
843
+ const entryWithoutSlash = entry.replace(/\/$/, "");
844
+ if (!lines.some((line) => line === entry || line === entryWithoutSlash)) {
845
+ newEntries.push(entry);
846
+ }
847
+ }
848
+ if (newEntries.length === 0) {
849
+ return false;
850
+ }
851
+ let newContent = content;
852
+ if (!newContent.endsWith("\n") && newContent !== "") {
853
+ newContent += "\n";
854
+ }
855
+ if (newContent === "" || !content.includes("# rrce-workflow")) {
856
+ newContent += "\n# rrce-workflow generated folders\n";
857
+ }
858
+ newContent += newEntries.join("\n") + "\n";
859
+ fs7.writeFileSync(gitignorePath, newContent);
860
+ return true;
861
+ } catch {
862
+ return false;
863
+ }
864
+ }
815
865
 
816
866
  // src/commands/wizard/link-flow.ts
817
867
  import { multiselect as multiselect2, spinner as spinner2, note as note2, outro as outro2, cancel as cancel2, isCancel as isCancel2 } from "@clack/prompts";
@@ -937,17 +987,12 @@ Destination: ${pc4.cyan(globalPath)}`,
937
987
  ensureDir(destDir);
938
988
  copyDirRecursive(srcDir, destDir);
939
989
  }
940
- const configFilePath = getConfigPath(workspacePath);
941
- let configContent = fs9.readFileSync(configFilePath, "utf-8");
942
- configContent = configContent.replace(/mode:\s*workspace/, "mode: both");
943
- fs9.writeFileSync(configFilePath, configContent);
944
990
  s.stop("Sync complete");
945
991
  const summary = [
946
992
  `Synced directories:`,
947
993
  ...existingDirs.map((d) => ` \u2713 ${d}/`),
948
994
  ``,
949
995
  `Global path: ${pc4.cyan(globalPath)}`,
950
- `Storage mode updated to: ${pc4.bold("both")}`,
951
996
  ``,
952
997
  `Other projects can now link this knowledge!`
953
998
  ];
@@ -1032,8 +1077,6 @@ function resolveAllDataPathsWithCustomGlobal(mode, workspaceName, workspaceRoot,
1032
1077
  return [globalPath];
1033
1078
  case "workspace":
1034
1079
  return [workspacePath];
1035
- case "both":
1036
- return [workspacePath, globalPath];
1037
1080
  default:
1038
1081
  return [globalPath];
1039
1082
  }
@@ -1064,7 +1107,7 @@ Workspace: ${pc6.bold(workspaceName)}`,
1064
1107
  if (isAlreadyConfigured) {
1065
1108
  try {
1066
1109
  const configContent = fs11.readFileSync(configFilePath, "utf-8");
1067
- const modeMatch = configContent.match(/mode:\s*(global|workspace|both)/);
1110
+ const modeMatch = configContent.match(/mode:\s*(global|workspace)/);
1068
1111
  currentStorageMode = modeMatch?.[1] ?? null;
1069
1112
  } catch {
1070
1113
  }
@@ -66,12 +66,11 @@ The system provides a structured multi-agent pipeline for software development t
66
66
  |------|----------|----------|
67
67
  | `global` (default) | `~/.rrce-workflow/workspaces/<workspace-name>/` | Non-intrusive, survives repo deletion |
68
68
  | `workspace` | `<workspace>/.rrce-workflow/` | Portable, team-shareable |
69
- | `both` | Both locations with sync | Redundancy, flexibility |
70
69
 
71
70
  Configure via `.rrce-workflow.yaml`:
72
71
  ```yaml
73
72
  storage:
74
- mode: global # or: workspace, both
73
+ mode: global # or: workspace
75
74
  ```
76
75
 
77
76
  ### Environment Variables
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rrce-workflow",
3
- "version": "0.2.19",
3
+ "version": "0.2.21",
4
4
  "description": "RRCE-Workflow TUI - Agentic code workflow generator for AI-assisted development",
5
5
  "author": "RRCE Team",
6
6
  "license": "MIT",