rrce-workflow 0.3.17 → 0.3.18

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.
@@ -2,7 +2,7 @@
2
2
  name: RRCE Design
3
3
  description: Research requirements and create execution plan in a single interactive session. Combines clarification and task breakdown.
4
4
  argument-hint: TASK_SLUG=<slug> REQUEST="<user prompt>" [TITLE="<task title>"]
5
- tools: ['rrce_get_context_bundle', 'rrce_search_knowledge', 'rrce_search_code', 'rrce_search_symbols', 'rrce_get_file_summary', 'rrce_search_tasks', 'rrce_find_related_files', 'rrce_get_project_context', 'rrce_validate_phase', 'rrce_list_projects', 'rrce_create_task', 'rrce_update_task']
5
+ tools: ['rrce_get_context_bundle', 'rrce_search_knowledge', 'rrce_search_code', 'rrce_search_symbols', 'rrce_get_file_summary', 'rrce_search_tasks', 'rrce_find_related_files', 'rrce_get_project_context', 'rrce_validate_phase', 'rrce_list_projects', 'rrce_create_task', 'rrce_update_task', 'websearch', 'codesearch', 'write']
6
6
  required-args:
7
7
  - name: TASK_SLUG
8
8
  prompt: "Enter a task slug (kebab-case identifier)"
@@ -25,17 +25,21 @@ This agent operates in **two phases within the same session**:
25
25
  ```
26
26
  ┌─────────────────────────────────────────────────────────────────┐
27
27
  │ RESEARCH MODE │
28
- │ - Knowledge discovery
29
- │ - Clarification (max 2 rounds)
28
+ │ - Knowledge discovery (RAG + Web search)
29
+ │ - Exploration & alternatives (no round limits)
30
+ │ - Ambiguity detection │
31
+ │ - Confidence assessment │
30
32
  │ - Save research brief │
31
33
  └─────────────────────────────────────────────────────────────────┘
32
34
 
33
35
 
34
- "Proceed to planning? (y/n)"
36
+ "Confidence: [high/medium/low]. Requirements: [clear/ambiguous]. Ready to plan? (y/n)"
35
37
 
36
38
 
37
39
  ┌─────────────────────────────────────────────────────────────────┐
38
40
  │ PLANNING MODE │
41
+ │ - Read research brief (alternatives, trade-offs) │
42
+ │ - Ask which approach to plan for │
39
43
  │ - Propose task breakdown │
40
44
  │ - Refinement (max 2 rounds) │
41
45
  │ - Save plan artifact │
@@ -48,7 +52,7 @@ This agent operates in **two phases within the same session**:
48
52
  Handoff to @rrce_develop
49
53
  ```
50
54
 
51
- Phase transitions are interactive — always ask, wait for user confirmation.
55
+ Phase transitions are interactive — always ask, wait for user confirmation. Use **confidence-driven progression**, not round limits.
52
56
 
53
57
  ---
54
58
 
@@ -70,42 +74,197 @@ Optional additions:
70
74
  - `rrce_search_tasks` - find similar past tasks
71
75
  - `rrce_search_symbols` - find specific functions/classes
72
76
 
73
- ### 1.2 Clarification (Max 2 Rounds)
77
+ ### Strategic Research Guidance
74
78
 
75
- **Ask only critical questions** that can't be inferred from knowledge.
79
+ Use **different research sources strategically** based on what you're exploring:
76
80
 
77
- **Round 1 (3-4 questions):**
81
+ | Research Need | Tool | Purpose |
82
+ |----------------|-------|---------|
83
+ | **Project context** | `rrce_get_context_bundle`, `rrce_search_knowledge` | Understand current architecture, patterns, existing implementations |
84
+ | **Existing implementations** | `rrce_search_code`, `rrce_search_symbols` | Find similar code, understand patterns used in project |
85
+ | **Framework/library choices** | `websearch`, `codesearch` | Research latest versions, best practices, community adoption |
86
+ | **Architectural patterns** | `websearch` + `codesearch` | Compare industry standards with code examples |
87
+ | **API usage** | `codesearch` | Find library usage patterns and examples |
88
+ | **Project-specific constraints** | `rrce_search_knowledge`, `rrce_search_code` | Check for existing tech decisions, conventions, blockers |
89
+
90
+ **RAG comparison triggers:**
91
+ When proposing alternatives or after user feedback, query RAG to:
92
+ - Check if similar patterns already exist in codebase
93
+ - Verify proposed approach doesn't conflict with existing architecture
94
+ - Leverage existing utility functions or services if available
95
+
96
+ ### 1.2 Exploration & Alternatives (Guidance-Driven, No Round Limits)
97
+
98
+ **Goal**: Guide user to think and enrich their ideas through educational exploration. Propose alternatives, explain trade-offs, and ensure thorough understanding before planning.
99
+
100
+ #### Step 1: Initial Discovery (First Interaction)
101
+
102
+ After knowledge discovery, present your findings and ask **3-4 critical questions**:
78
103
  - Core problem being solved?
79
104
  - Success criteria (measurable)?
80
- - Hard constraints?
105
+ - Hard constraints (tech stack, performance, compatibility)?
106
+
107
+ #### Step 2: Propose Alternatives (Educational Approach)
108
+
109
+ Based on research, propose **2-3 implementation approaches** with trade-offs:
110
+
111
+ ```
112
+ | Approach | Description | Pros | Cons | Effort |
113
+ |----------|-------------|-------|-------|---------|
114
+ | A | [brief description] | [1-2 bullets] | [1-2 bullets] | S/M/L |
115
+ | B | [brief description] | [1-2 bullets] | [1-2 bullets] | S/M/L |
116
+ | C (optional) | [brief description] | [1-2 bullets] | [1-2 bullets] | S/M/L |
117
+ ```
118
+
119
+ **Ask**: "Which approach resonates? Any concerns? Or should I explore other options?"
120
+
121
+ #### Step 3: Fact-Checking & Best Practices
122
+
123
+ Use `websearch` and `codesearch` to validate approaches and provide best practices:
124
+ - Search for library/framework documentation and community best practices
125
+ - Cite sources when providing recommendations
126
+ - Compare alternatives against industry standards
127
+
128
+ #### Step 4: Explore User's Preference (Interactive Refinement)
129
+
130
+ After user indicates preference or concerns:
131
+ - Ask 1-2 follow-up questions to refine understanding
132
+ - Use `rrce_search_knowledge` and `rrce_search_code` to **check RAG** for existing implementations that might conflict with proposed approach
133
+ - **Compare proposed approach against current project state** (architecture, patterns, conventions)
134
+ - Highlight any incompatibilities or opportunities to reuse existing code
135
+
136
+ **RAG comparison checkpoints:**
137
+ 1. Before proposing alternatives: Check if similar features exist
138
+ 2. After user feedback: Check if proposed approach conflicts with existing patterns
139
+ 3. Before planning: Verify chosen approach aligns with project architecture
140
+
141
+ **Repeat Steps 2-4** as needed. **No fixed round limits**—continue until:
142
+ - User expresses clear preference
143
+ - Alternatives thoroughly explored
144
+ - Best practices considered
145
+ - RAG comparison completed
146
+
147
+ #### Step 5: Document Remaining Ambiguity as Assumptions
148
+
149
+ If questions remain unanswered after thorough exploration, document as assumptions with confidence level:
150
+ - **High**: Documented fact in RAG or widely accepted practice
151
+ - **Medium**: Reasonable inference but not explicitly confirmed
152
+ - **Low**: Guess based on pattern matching—may need clarification
153
+
154
+ ### 1.3 Ambiguity Detection
155
+
156
+ Before transitioning to planning, **detect and flag ambiguous language**:
157
+
158
+ **Hedge words to detect (user input):**
159
+ - "maybe", "probably", "possibly", "might", "could be"
160
+ - "I think", "I'm not sure", "not certain"
161
+ - "sort of", "kind of", "a bit"
162
+ - "we'll see", "decide later", "figure it out"
163
+
164
+ **If ambiguity detected:**
165
+ ```
166
+ > "I notice some requirements are still unclear (marked with †). Let's explore these before planning:
167
+ >
168
+ > † [specific ambiguous phrase] - [what needs clarification]
169
+ >
170
+ > Let's continue exploring to reach clear requirements. Ready to continue? (y/n)"
171
+ ```
172
+
173
+ **If no ambiguity detected:**
174
+ Proceed to confidence assessment (Section 1.4).
175
+
176
+ ### 1.4 Confidence Assessment
81
177
 
82
- **Round 2 (2-3 questions, if needed):**
83
- - Edge cases?
84
- - Priority if trade-offs needed?
178
+ Before asking to proceed to planning, **explicitly assess confidence** using this checklist:
179
+
180
+ ```
181
+ **Confidence Checklist:**
182
+ □ Requirements are specific and non-ambiguous
183
+ □ Success criteria are measurable and testable
184
+ □ Alternatives explored (2-3 approaches with trade-offs)
185
+ □ Best practices researched and cited
186
+ □ RAG comparison completed (checked against existing implementations)
187
+ □ User preference expressed and concerns addressed
188
+ □ No blocking questions remain
189
+
190
+ **Confidence Level:**
191
+ ```
85
192
 
86
- **STOP after 2 rounds.** Document remaining ambiguity as assumptions.
193
+ If all boxes checked **High Confidence**
194
+ If 4-6 boxes checked → **Medium Confidence** (document gaps)
195
+ If <4 boxes checked → **Low Confidence** (continue exploration)
87
196
 
88
- ### 1.3 Generate Research Brief
197
+ **State explicitly:**
198
+ ```
199
+ > "My confidence in these requirements: [high/medium/low].
200
+ >
201
+ > [If medium/low: Gaps remain: [list specific gaps]. Let's continue exploring...]
202
+ > [If high: Ready to proceed to planning?] (y/n)"
203
+ ```
204
+
205
+ **If user wants to plan but confidence is low/medium:**
206
+ ```
207
+ > "I'd like to reach higher confidence before planning. Let me explore [specific gap].
208
+ > [Continue exploration or force planning?] (c/p)"
209
+ ```
210
+
211
+ ### 1.5 Generate Research Brief
89
212
 
90
213
  Save to: `{{RRCE_DATA}}/tasks/{{TASK_SLUG}}/research/{{TASK_SLUG}}-research.md`
91
214
 
92
215
  **Sections:**
93
- - **Requirements**: What to build
216
+ - **Requirements**: What to build (specific, measurable)
94
217
  - **Success Criteria**: Measurable outcomes
218
+ - **Alternatives Explored**: 2-3 approaches with trade-offs
219
+ - **Best Practices**: Industry standards and recommendations (with citations)
220
+ - **RAG Comparison Notes**: Comparison with existing project implementations
95
221
  - **Out of Scope**: Explicit boundaries
96
222
  - **Assumptions**: With confidence (high/medium/low)
97
- - **Relevant Context**: Key findings from search
223
+ - **Relevant Context**: Key findings from RAG and web search
98
224
 
99
- ### 1.4 Phase Transition
225
+ ### 1.6 Phase Transition
100
226
 
101
227
  After saving research brief, ask:
102
228
 
103
229
  > "Research complete. Brief saved to `research/{{TASK_SLUG}}-research.md`.
104
230
  >
105
- > **Proceed to planning?** (y/n)"
231
+ > Confidence: [high/medium/low]. Requirements: [clear/ambiguous].
232
+ > **Ready to plan?** (y/n)"
233
+
234
+ **If user says "y" and confidence is high:** Continue to Phase 2
235
+ **If user says "y" but confidence is medium/low:** See Section 1.6 blocking logic
236
+ **If user says "n" or wants to stop:** Update metadata, emit completion signal, end session
237
+ - Check confidence assessment (Section 1.4)
238
+ - If **high confidence**: Continue to Phase 2
239
+ - If **medium/low confidence**:
240
+ ```
241
+ > "I notice confidence is [medium/low]. Gaps remain:
242
+ > • [gap 1]
243
+ > • [gap 2]
244
+ > Let's continue exploring to reach higher confidence. Continue? (y/n)"
245
+ ```
246
+
247
+ **If user says "n" or wants to stop:**
248
+ Update metadata, emit completion signal, end session
249
+
250
+ #### Blocking Early Pushes
251
+
252
+ If user tries to skip to planning prematurely (e.g., "let's plan", "ready for development") **before confidence is high**:
253
+
254
+ ```
255
+ > "I need more clarity before planning. Let me address these gaps:
256
+ >
257
+ > † [ambiguity detected from user input]
258
+ >
259
+ > [Specific questions to clarify gaps]
260
+ >
261
+ > Let's explore these first. Ready to continue? (y/n)"
262
+ ```
106
263
 
107
- - If user says **"y"** or similar affirmative: Continue to Phase 2
108
- - If user says **"n"** or wants to stop: Update metadata, emit completion signal, end session
264
+ **Only proceed to planning when:**
265
+ - Confidence is **high** (all checklist boxes checked)
266
+ - User explicitly confirms **"Ready to plan"** after seeing full exploration
267
+ - No blocking ambiguities remain
109
268
 
110
269
  ---
111
270
 
@@ -113,7 +272,12 @@ After saving research brief, ask:
113
272
 
114
273
  ### 2.1 Load Context
115
274
 
116
- Read the research brief you just created. Use `rrce_search_symbols` to understand code structure for implementation planning.
275
+ Read the research brief you just created. Pay special attention to:
276
+ - **Alternatives Explored section** → Which approach user preferred?
277
+ - **Best Practices** → Incorporate into task breakdown
278
+ - **RAG Comparison Notes** → Ensure tasks align with existing architecture
279
+
280
+ Use `rrce_search_symbols` to understand code structure for implementation planning based on **chosen approach**.
117
281
 
118
282
  ### 2.2 Propose Task Breakdown
119
283
 
@@ -232,11 +396,15 @@ Then tell user: "Design complete! To develop: `/rrce_develop {{TASK_SLUG}}` or a
232
396
 
233
397
  ## Completion Checklist
234
398
 
235
- - [ ] Knowledge discovery done (first turn)
236
- - [ ] Clarification complete (max 2 rounds)
237
- - [ ] Research brief saved
238
- - [ ] User confirmed to proceed to planning (or stopped early)
239
- - [ ] Task breakdown proposed + refined
399
+ - [ ] Knowledge discovery done (first turn, RAG + web search)
400
+ - [ ] Exploration complete (alternatives proposed, trade-offs explained)
401
+ - [ ] Ambiguity detection performed (flagged if found)
402
+ - [ ] Confidence assessed and stated (high/medium/low)
403
+ - [ ] Best practices researched and cited
404
+ - [ ] RAG comparison completed
405
+ - [ ] Research brief saved (includes Alternatives, Best Practices, RAG Comparison)
406
+ - [ ] User confirmed ready to plan (high confidence) or stopped early
407
+ - [ ] Task breakdown proposed based on chosen approach
240
408
  - [ ] Plan saved
241
409
  - [ ] `meta.json` updated (both research + planning)
242
410
  - [ ] `<rrce_completion>` emitted
@@ -249,9 +417,11 @@ Then tell user: "Design complete! To develop: `/rrce_develop {{TASK_SLUG}}` or a
249
417
  1. **Single session for both phases** — don't ask user to run separate commands
250
418
  2. **Always confirm before transitions** — explicit "y/n" prompts
251
419
  3. **Save artifacts at each phase** — don't lose work if user stops early
252
- 4. **Max 2 clarification/refinement rounds per phase**
253
- 5. **Use task tool for development handoff** triggers confirmation dialog
254
- 6. **Hybrid approach**: Ask critical questions, document rest as assumptions
420
+ 4. **Confidence-driven progression** No fixed round limits; continue until high confidence reached
421
+ 5. **Educational approach** Propose 2-3 alternatives with trade-offs, explain best practices
422
+ 6. **Block early pushes** If user says "let's plan" but confidence is low/medium, refuse and clarify gaps
423
+ 7. **Strategic research** — Use RAG for project context, web search for frameworks/libraries
424
+ 8. **Use task tool for development handoff** — triggers confirmation dialog
255
425
 
256
426
  ---
257
427
 
@@ -36,7 +36,12 @@ Manual verification:
36
36
 
37
37
  - Max **3 retrieval calls per turn** (develop legitimately needs more)
38
38
  - **Preferred:** `rrce_prefetch_task_context` (gets task + context in one call)
39
- - Order: `rrce_prefetch_task_context` -> `read` plan/research -> `rrce_search_symbols` -> `glob/grep` (last resort)
39
+ - Order: `rrce_prefetch_task_context` -> `read` plan/research (explicit artifact read) -> `rrce_search_code`/`rrce_search_knowledge` -> `rrce_search_symbols` -> `glob/grep` (last resort)
40
+
41
+ **Semantic Search First:**
42
+ - Use `rrce_search_code` and `rrce_search_knowledge` before direct file reads
43
+ - Semantic search finds relevant code/concepts without exact matches
44
+ - Only use `read` after semantic search has identified specific files to examine
40
45
 
41
46
  ## Plan Adherence (STRICT)
42
47
 
@@ -57,6 +62,34 @@ Manual verification:
57
62
  - Knowledge matches
58
63
  - Code matches
59
64
 
65
+ **CRITICAL: Read artifacts explicitly:**
66
+
67
+ After prefetching, you must read the research brief and plan to understand:
68
+ - **Research brief** (`{{RRCE_DATA}}/tasks/{{TASK_SLUG}}/research/{{TASK_SLUG}}-research.md`):
69
+ - Requirements and constraints
70
+ - Alternatives and trade-offs
71
+ - Best practices
72
+ - RAG comparison insights
73
+
74
+ **Focus on research brief sections:**
75
+ - **Alternatives**: What approaches were considered and why they were rejected
76
+ - **Best Practices**: Industry standards and patterns to follow
77
+ - **RAG Comparison**: Semantic search strategies vs. traditional approaches
78
+ - **Technical Constraints**: Performance, security, or architectural limitations
79
+
80
+ - **Plan** (`{{RRCE_DATA}}/tasks/{{TASK_SLUG}}/planning/{{TASK_SLUG}}-plan.md`):
81
+ - Task breakdown
82
+ - Chosen approach (if alternatives were considered)
83
+ - Implementation strategy
84
+ - Validation criteria
85
+
86
+ **If plan mentions multiple approaches:**
87
+ - Read the "Chosen Approach" section carefully
88
+ - If no clear choice is documented, ask user: "The plan lists multiple approaches. Which approach should I implement?"
89
+ - Do not assume - clarity prevents rework
90
+
91
+ Use `read` for these files to ensure you capture all details including alternatives, trade-offs, and technical decisions.
92
+
60
93
  ### 2. Setup
61
94
 
62
95
  Create: `{{RRCE_DATA}}/tasks/{{TASK_SLUG}}/execution/`
@@ -74,9 +107,20 @@ For each task:
74
107
  1. **Announce**: "Task [N]/[Total]: [description]"
75
108
  2. **Find code**: Use `rrce_search_symbols` to locate functions/classes to modify
76
109
  3. **Understand structure**: Use `rrce_get_file_summary` for quick file overview
77
- 4. **Implement**: Make code changes per plan
78
- 5. **Verify**: Run validation from plan
79
- 6. **Document**: Note what was done
110
+ 4. **Use semantic search actively**: Before implementing, use `rrce_search_code` and `rrce_search_knowledge` to:
111
+ - Find existing implementations of similar patterns
112
+ - Locate relevant code examples in the codebase
113
+ - Understand prior decisions and trade-offs
114
+ - Identify best practices already in use
115
+ 5. **Implement**: Make code changes per plan
116
+ 6. **Verify**: Run validation from plan
117
+ 7. **Document**: Note what was done
118
+
119
+ **Active RAG Usage Guidelines:**
120
+ - Search for conceptual terms (e.g., "error handling", "authentication") not just exact function names
121
+ - Use semantic search to understand patterns before reading individual files
122
+ - When unsure about implementation approach, search for similar implementations first
123
+ - Use `rrce_search_code` for code patterns, `rrce_search_knowledge` for documentation/prior decisions
80
124
 
81
125
  ### 4. Validation
82
126
 
package/dist/index.js CHANGED
@@ -5883,17 +5883,17 @@ var init_ProjectsView = __esm({
5883
5883
  }
5884
5884
  let statsRow = "";
5885
5885
  if (idx?.state === "running") {
5886
- statsRow = ` \u27F3 Indexing... ${idx.itemsDone}/${idx.itemsTotal ?? "?"}`;
5886
+ statsRow = ` \u27F3 Indexing... ${idx.itemsDone}/${idx.itemsTotal ?? "?"}`;
5887
5887
  } else if (idx?.state === "failed") {
5888
- statsRow = " \u2715 Index failed";
5888
+ statsRow = " \u2715 Index failed";
5889
5889
  } else if (stats.knowledgeCount > 0 || stats.codeCount > 0) {
5890
5890
  const parts = [];
5891
5891
  if (stats.knowledgeCount > 0) parts.push(`\u{1F4DA} ${stats.knowledgeCount} docs`);
5892
5892
  if (stats.codeCount > 0) parts.push(`\u{1F4BB} ${stats.codeCount} files`);
5893
5893
  if (stats.lastIndexed) parts.push(`\u{1F550} ${formatRelativeTime(stats.lastIndexed)}`);
5894
- statsRow = ` \u{1F4CA} ${parts.join(" \u2502 ")}`;
5894
+ statsRow = ` \u{1F4CA} ${parts.join(" \u2502 ")}`;
5895
5895
  } else if (isExposed) {
5896
- statsRow = " \u{1F4CA} Not indexed";
5896
+ statsRow = " \u{1F4CA} Not indexed";
5897
5897
  }
5898
5898
  const fullLabel = statsRow ? `${label}
5899
5899
  ${statsRow}` : label;
@@ -5931,20 +5931,20 @@ ${statsRow}` : label;
5931
5931
  setConfig(newConfig);
5932
5932
  onConfigChange?.();
5933
5933
  };
5934
- return /* @__PURE__ */ jsxs3(Box4, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "white", flexGrow: 1, children: [
5935
- /* @__PURE__ */ jsxs3(Box4, { justifyContent: "space-between", children: [
5934
+ return /* @__PURE__ */ jsxs3(Box4, { flexDirection: "column", borderStyle: "round", borderColor: "white", flexGrow: 1, children: [
5935
+ /* @__PURE__ */ jsxs3(Box4, { paddingX: 1, justifyContent: "space-between", borderBottom: true, children: [
5936
5936
  /* @__PURE__ */ jsxs3(Box4, { children: [
5937
- /* @__PURE__ */ jsx5(Text4, { bold: true, color: "cyan", children: " Projects " }),
5938
- /* @__PURE__ */ jsx5(Text4, { dimColor: true, children: " \u2022 " }),
5937
+ /* @__PURE__ */ jsx5(Text4, { bold: true, color: "cyan", children: "Projects" }),
5938
+ /* @__PURE__ */ jsx5(Text4, { color: "dim", children: " \u2502 " }),
5939
5939
  /* @__PURE__ */ jsxs3(Text4, { color: config.defaults.includeNew ? "green" : "red", children: [
5940
5940
  "Auto-expose: ",
5941
5941
  config.defaults.includeNew ? "ON" : "OFF"
5942
5942
  ] })
5943
5943
  ] }),
5944
- /* @__PURE__ */ jsx5(Box4, { children: /* @__PURE__ */ jsx5(Text4, { color: "dim", children: "a:Toggle Auto u:Drift Space:Select Enter:Save" }) })
5944
+ /* @__PURE__ */ jsx5(Text4, { color: "dim", children: "v0.3.14" })
5945
5945
  ] }),
5946
- /* @__PURE__ */ jsx5(Text4, { color: "dim", children: " Manage which projects are exposed to the MCP server." }),
5947
- /* @__PURE__ */ jsx5(Box4, { marginTop: 1, flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx5(
5946
+ /* @__PURE__ */ jsx5(Box4, { marginTop: 1, paddingX: 1, children: /* @__PURE__ */ jsx5(Text4, { color: "dim", children: "Manage which projects are exposed to the MCP server." }) }),
5947
+ /* @__PURE__ */ jsx5(Box4, { marginTop: 1, paddingX: 1, flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx5(
5948
5948
  SimpleSelect,
5949
5949
  {
5950
5950
  message: "",
@@ -5959,7 +5959,10 @@ ${statsRow}` : label;
5959
5959
  },
5960
5960
  JSON.stringify(initialSelected) + config.defaults.includeNew + JSON.stringify(indexingStats)
5961
5961
  ) }),
5962
- /* @__PURE__ */ jsx5(Box4, { marginTop: 1, borderStyle: "single", borderColor: "dim", paddingX: 1, children: /* @__PURE__ */ jsx5(Text4, { color: "dim", children: "Use 'rrce-workflow wizard' to manage project exposures and settings." }) })
5962
+ /* @__PURE__ */ jsxs3(Box4, { paddingX: 1, justifyContent: "space-between", borderTop: true, children: [
5963
+ /* @__PURE__ */ jsx5(Text4, { color: "dim", children: "Space:Select Enter:Save a:Toggle Auto u:Refresh Drift" }),
5964
+ /* @__PURE__ */ jsx5(Text4, { color: "dim", children: "Use 'rrce-workflow wizard' for advanced config" })
5965
+ ] })
5963
5966
  ] });
5964
5967
  };
5965
5968
  }
@@ -6000,8 +6003,8 @@ var init_TaskRow = __esm({
6000
6003
  isLastTask = false
6001
6004
  }) => {
6002
6005
  if (row.kind === "project") {
6003
- const projectColor = isCurrentProject ? "cyan" : isSelected ? "yellow" : "white";
6004
- const isBold = isCurrentProject || isSelected;
6006
+ const projectColor = isSelected ? "cyan" : isCurrentProject ? "yellow" : "white";
6007
+ const isBold = isSelected || isCurrentProject;
6005
6008
  return /* @__PURE__ */ jsxs4(Box5, { children: [
6006
6009
  /* @__PURE__ */ jsx6(Text5, { color: isSelected ? "cyan" : "dim", children: isSelected ? "\u25B8 " : " " }),
6007
6010
  /* @__PURE__ */ jsxs4(Text5, { bold: isBold, color: projectColor, children: [
@@ -6009,7 +6012,7 @@ var init_TaskRow = __esm({
6009
6012
  " ",
6010
6013
  formatProjectLabel(row.project)
6011
6014
  ] }),
6012
- isCurrentProject && /* @__PURE__ */ jsx6(Text5, { color: "cyan", dimColor: true, children: " (current)" }),
6015
+ isCurrentProject && /* @__PURE__ */ jsx6(Text5, { color: "yellow", dimColor: true, children: " (current)" }),
6013
6016
  hasDrift && /* @__PURE__ */ jsx6(Text5, { color: "magenta", children: " \u26A0" }),
6014
6017
  /* @__PURE__ */ jsxs4(Text5, { color: "dim", children: [
6015
6018
  " ",
@@ -6028,7 +6031,7 @@ var init_TaskRow = __esm({
6028
6031
  if (isPlaceholder) {
6029
6032
  return /* @__PURE__ */ jsxs4(Box5, { children: [
6030
6033
  /* @__PURE__ */ jsxs4(Text5, { color: "dim", children: [
6031
- " ",
6034
+ " ",
6032
6035
  branch,
6033
6036
  " "
6034
6037
  ] }),
@@ -6036,14 +6039,13 @@ var init_TaskRow = __esm({
6036
6039
  ] });
6037
6040
  }
6038
6041
  return /* @__PURE__ */ jsxs4(Box5, { children: [
6039
- /* @__PURE__ */ jsx6(Text5, { color: isSelected ? "cyan" : "dim", children: isSelected ? "\u25B8" : " " }),
6042
+ /* @__PURE__ */ jsx6(Text5, { color: isSelected ? "cyan" : "dim", children: isSelected ? "\u25B8 " : " " }),
6040
6043
  /* @__PURE__ */ jsxs4(Text5, { color: "dim", children: [
6041
- " ",
6042
6044
  branch,
6043
6045
  " "
6044
6046
  ] }),
6045
6047
  /* @__PURE__ */ jsx6(Text5, { color: isSelected ? "cyan" : "white", children: "\u{1F4CB} " }),
6046
- /* @__PURE__ */ jsx6(Text5, { bold: isSelected, color: isSelected ? "cyan" : "white", children: taskLabel.length > 25 ? taskLabel.substring(0, 22) + "..." : taskLabel }),
6048
+ /* @__PURE__ */ jsx6(Box5, { flexGrow: 1, children: /* @__PURE__ */ jsx6(Text5, { bold: isSelected, color: isSelected ? "cyan" : "white", children: taskLabel.length > 25 ? taskLabel.substring(0, 22) + "..." : taskLabel }) }),
6047
6049
  activeAgent && /* @__PURE__ */ jsxs4(Text5, { children: [
6048
6050
  /* @__PURE__ */ jsx6(Text5, { color: "dim", children: " " }),
6049
6051
  /* @__PURE__ */ jsx6(Text5, { children: getPhaseIcon(activeAgent.agent) }),
@@ -6061,7 +6063,7 @@ var init_TaskRow = __esm({
6061
6063
  " ",
6062
6064
  relativeTime
6063
6065
  ] }),
6064
- !activeAgent && status && /* @__PURE__ */ jsx6(Text5, { backgroundColor: getStatusColor(status), color: "black", children: ` ${getStatusIcon(status)} ` })
6066
+ !activeAgent && status && /* @__PURE__ */ jsx6(Text5, { color: getStatusColor(status), children: ` ${getStatusIcon(status)} ${status}` })
6065
6067
  ] });
6066
6068
  };
6067
6069
  }
@@ -6087,34 +6089,30 @@ var init_TaskDetails = __esm({
6087
6089
  }
6088
6090
  const progress = getChecklistProgress(task.checklist || []);
6089
6091
  return /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", children: [
6090
- /* @__PURE__ */ jsxs5(Box6, { marginBottom: 1, flexDirection: "column", children: [
6092
+ /* @__PURE__ */ jsxs5(Box6, { marginBottom: 0, flexDirection: "column", children: [
6091
6093
  /* @__PURE__ */ jsx7(Text6, { bold: true, color: "cyan", children: task.title || task.task_slug }),
6092
- task.summary && /* @__PURE__ */ jsx7(Text6, { color: "white", wrap: "wrap", children: task.summary.length > 100 ? task.summary.substring(0, 97) + "..." : task.summary })
6094
+ task.summary && /* @__PURE__ */ jsx7(Box6, { marginTop: 0, children: /* @__PURE__ */ jsx7(Text6, { color: "white", wrap: "wrap", children: task.summary.length > 150 ? task.summary.substring(0, 147) + "..." : task.summary }) })
6093
6095
  ] }),
6094
- /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }),
6095
- /* @__PURE__ */ jsxs5(Box6, { marginTop: 1, flexDirection: "column", children: [
6096
- /* @__PURE__ */ jsx7(Text6, { bold: true, color: "white", children: "\u{1F4CB} STATUS" }),
6096
+ /* @__PURE__ */ jsx7(Box6, { marginY: 0, children: /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }) }),
6097
+ /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", children: [
6098
+ /* @__PURE__ */ jsxs5(Box6, { justifyContent: "space-between", children: [
6099
+ /* @__PURE__ */ jsx7(Text6, { bold: true, color: "white", children: "\u{1F4CB} STATUS" }),
6100
+ /* @__PURE__ */ jsx7(Text6, { color: getStatusColor(task.status || ""), children: task.status?.toUpperCase() || "UNKNOWN" })
6101
+ ] }),
6097
6102
  /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", marginTop: 0, marginLeft: 1, children: [
6098
- /* @__PURE__ */ jsxs5(Box6, { children: [
6099
- /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "Status: " }),
6100
- /* @__PURE__ */ jsx7(Text6, { color: getStatusColor(task.status || ""), children: task.status || "unknown" })
6101
- ] }),
6102
6103
  /* @__PURE__ */ jsxs5(Box6, { children: [
6103
6104
  /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "Updated: " }),
6104
6105
  /* @__PURE__ */ jsx7(Text6, { children: formatRelativeTime(task.updated_at || "") })
6105
6106
  ] }),
6106
6107
  task.tags && task.tags.length > 0 && /* @__PURE__ */ jsxs5(Box6, { children: [
6107
6108
  /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "Tags: " }),
6108
- task.tags.map((tag, i) => /* @__PURE__ */ jsxs5(Text6, { children: [
6109
- /* @__PURE__ */ jsx7(Text6, { color: "cyan", children: tag }),
6110
- i < task.tags.length - 1 && /* @__PURE__ */ jsx7(Text6, { color: "dim", children: ", " })
6111
- ] }, tag))
6109
+ /* @__PURE__ */ jsx7(Text6, { color: "cyan", children: task.tags.join(", ") })
6112
6110
  ] })
6113
6111
  ] })
6114
6112
  ] }),
6115
- /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }),
6116
- /* @__PURE__ */ jsxs5(Box6, { marginTop: 1, flexDirection: "column", children: [
6117
- /* @__PURE__ */ jsxs5(Box6, { children: [
6113
+ /* @__PURE__ */ jsx7(Box6, { marginY: 0, children: /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }) }),
6114
+ /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", children: [
6115
+ /* @__PURE__ */ jsxs5(Box6, { justifyContent: "space-between", children: [
6118
6116
  /* @__PURE__ */ jsx7(Text6, { bold: true, color: "white", children: "\u{1F4CB} CHECKLIST " }),
6119
6117
  progress.total > 0 && /* @__PURE__ */ jsxs5(Text6, { color: "dim", children: [
6120
6118
  getProgressBar(progress.percentage, 8),
@@ -6125,26 +6123,26 @@ var init_TaskDetails = __esm({
6125
6123
  ] })
6126
6124
  ] }),
6127
6125
  /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", marginLeft: 1, children: [
6128
- (task.checklist || []).length === 0 ? /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "No checklist items" }) : (task.checklist || []).slice(0, 8).map((c, i) => {
6126
+ (task.checklist || []).length === 0 ? /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "No checklist items" }) : (task.checklist || []).slice(0, 10).map((c, i) => {
6129
6127
  const isDone = c.status === "done";
6130
6128
  return /* @__PURE__ */ jsxs5(Text6, { color: isDone ? "dim" : "white", children: [
6131
6129
  /* @__PURE__ */ jsxs5(Text6, { color: isDone ? "green" : "dim", children: [
6132
6130
  getCheckbox(c.status || "pending"),
6133
6131
  " "
6134
6132
  ] }),
6135
- (c.label || c.id || "item").substring(0, 35)
6133
+ (c.label || c.id || "item").substring(0, 40)
6136
6134
  ] }, c.id || i);
6137
6135
  }),
6138
- (task.checklist || []).length > 8 && /* @__PURE__ */ jsxs5(Text6, { color: "dim", children: [
6139
- "...and ",
6140
- (task.checklist || []).length - 8,
6136
+ (task.checklist || []).length > 10 && /* @__PURE__ */ jsxs5(Text6, { color: "dim", children: [
6137
+ " ...and ",
6138
+ (task.checklist || []).length - 10,
6141
6139
  " more"
6142
6140
  ] })
6143
6141
  ] })
6144
6142
  ] }),
6145
- /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }),
6143
+ /* @__PURE__ */ jsx7(Box6, { marginY: 0, children: /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }) }),
6146
6144
  agentTodos && agentTodos.items.length > 0 && /* @__PURE__ */ jsxs5(Fragment, { children: [
6147
- /* @__PURE__ */ jsxs5(Box6, { marginTop: 1, flexDirection: "column", children: [
6145
+ /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", children: [
6148
6146
  /* @__PURE__ */ jsxs5(Box6, { children: [
6149
6147
  /* @__PURE__ */ jsx7(Text6, { bold: true, color: "white", children: "\u{1F3AF} AGENT TODOS " }),
6150
6148
  /* @__PURE__ */ jsxs5(Text6, { color: "dim", children: [
@@ -6161,18 +6159,18 @@ var init_TaskDetails = __esm({
6161
6159
  getTodoStatusIcon(item.status),
6162
6160
  " "
6163
6161
  ] }),
6164
- /* @__PURE__ */ jsx7(Text6, { color: item.status === "completed" ? "dim" : "white", children: item.content.substring(0, 35) })
6162
+ /* @__PURE__ */ jsx7(Text6, { color: item.status === "completed" ? "dim" : "white", children: item.content.substring(0, 40) })
6165
6163
  ] }, item.id || i)),
6166
6164
  agentTodos.items.length > 5 && /* @__PURE__ */ jsxs5(Text6, { color: "dim", children: [
6167
- "...and ",
6165
+ " ...and ",
6168
6166
  agentTodos.items.length - 5,
6169
6167
  " more"
6170
6168
  ] })
6171
6169
  ] })
6172
6170
  ] }),
6173
- /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" })
6171
+ /* @__PURE__ */ jsx7(Box6, { marginY: 0, children: /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500" }) })
6174
6172
  ] }),
6175
- /* @__PURE__ */ jsxs5(Box6, { marginTop: 1, flexDirection: "column", children: [
6173
+ /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", children: [
6176
6174
  /* @__PURE__ */ jsx7(Text6, { bold: true, color: "white", children: "\u{1F916} AGENTS" }),
6177
6175
  /* @__PURE__ */ jsx7(Box6, { flexDirection: "column", marginLeft: 1, children: !task.agents || Object.keys(task.agents).length === 0 ? /* @__PURE__ */ jsx7(Text6, { color: "dim", children: "No agent activity yet" }) : Object.entries(task.agents).map(([agent, info]) => /* @__PURE__ */ jsxs5(Box6, { children: [
6178
6176
  /* @__PURE__ */ jsxs5(Text6, { children: [
@@ -6348,17 +6346,17 @@ var init_TasksView = __esm({
6348
6346
  " tasks"
6349
6347
  ] })
6350
6348
  ] }),
6351
- /* @__PURE__ */ jsx8(Text7, { color: "dim", children: "\u2191\u2193:Nav Enter:Expand s:Status R:Refresh" })
6349
+ /* @__PURE__ */ jsx8(Text7, { color: "dim", children: "v0.3.14" })
6352
6350
  ] }),
6353
- errorLine && /* @__PURE__ */ jsx8(Box7, { paddingX: 1, children: /* @__PURE__ */ jsxs6(Text7, { color: "red", children: [
6351
+ errorLine && /* @__PURE__ */ jsx8(Box7, { paddingX: 1, marginTop: 1, children: /* @__PURE__ */ jsxs6(Text7, { color: "red", children: [
6354
6352
  "\u26A0 ",
6355
6353
  errorLine
6356
6354
  ] }) }),
6357
- /* @__PURE__ */ jsxs6(Box7, { flexDirection: "row", flexGrow: 1, paddingX: 1, paddingY: 1, children: [
6358
- /* @__PURE__ */ jsx8(Box7, { flexDirection: "column", width: "55%", borderStyle: "single", borderColor: "dim", borderRight: true, paddingRight: 1, children: flattenedRows.length === 0 ? /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", alignItems: "center", justifyContent: "center", flexGrow: 1, children: [
6355
+ /* @__PURE__ */ jsxs6(Box7, { flexDirection: "row", flexGrow: 1, children: [
6356
+ /* @__PURE__ */ jsx8(Box7, { flexDirection: "column", width: "50%", borderStyle: "single", borderColor: "dim", borderRight: true, paddingX: 1, children: flattenedRows.length === 0 ? /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", alignItems: "center", justifyContent: "center", flexGrow: 1, children: [
6359
6357
  /* @__PURE__ */ jsx8(Text7, { color: "dim", children: "No projects detected." }),
6360
6358
  /* @__PURE__ */ jsx8(Text7, { color: "dim", children: "Run the wizard to set up projects." })
6361
- ] }) : /* @__PURE__ */ jsx8(Box7, { flexDirection: "column", children: flattenedRows.map((row, idx) => {
6359
+ ] }) : /* @__PURE__ */ jsx8(Box7, { flexDirection: "column", marginTop: 1, children: flattenedRows.map((row, idx) => {
6362
6360
  const k = projectKey(row.project);
6363
6361
  const isCurrentProject = row.kind === "project" ? row.isCurrentProject : false;
6364
6362
  const isLastTask = row.kind === "task" ? row.isLastTask : false;
@@ -6376,11 +6374,11 @@ var init_TasksView = __esm({
6376
6374
  row.kind === "project" ? `p:${k}` : `t:${k}:${row.task.task_slug}`
6377
6375
  );
6378
6376
  }) }) }),
6379
- /* @__PURE__ */ jsx8(Box7, { flexDirection: "column", width: "45%", paddingLeft: 1, children: /* @__PURE__ */ jsx8(TaskDetails, { task: selectedTask }) })
6377
+ /* @__PURE__ */ jsx8(Box7, { flexDirection: "column", width: "50%", paddingX: 1, marginTop: 1, children: /* @__PURE__ */ jsx8(TaskDetails, { task: selectedTask }) })
6380
6378
  ] }),
6381
6379
  /* @__PURE__ */ jsxs6(Box7, { paddingX: 1, justifyContent: "space-between", borderTop: true, children: [
6382
- /* @__PURE__ */ jsx8(Text7, { color: "dim", children: "s:Cycle Status R:Refresh ?:Help" }),
6383
- /* @__PURE__ */ jsx8(Text7, { color: "dim", children: "RRCE MCP Hub v0.3.14" })
6380
+ /* @__PURE__ */ jsx8(Text7, { color: "dim", children: "\u2191\u2193:Nav Enter:Expand s:Cycle Status R:Refresh" }),
6381
+ /* @__PURE__ */ jsx8(Text7, { color: "dim", children: "Press 'q' to exit" })
6384
6382
  ] })
6385
6383
  ] });
6386
6384
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rrce-workflow",
3
- "version": "0.3.17",
3
+ "version": "0.3.18",
4
4
  "description": "RRCE-Workflow TUI - Agentic code workflow generator for AI-assisted development",
5
5
  "author": "RRCE Team",
6
6
  "license": "MIT",