agileflow 2.90.0 → 2.90.1

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.
@@ -28,7 +28,7 @@ const DEFAULT_BINDINGS = {
28
28
  session6: { key: '6', description: 'Session 6' },
29
29
  session7: { key: '7', description: 'Session 7' },
30
30
  session8: { key: '8', description: 'Session 8' },
31
- session9: { key: '9', description: 'Session 9' }
31
+ session9: { key: '9', description: 'Session 9' },
32
32
  };
33
33
 
34
34
  /**
@@ -104,7 +104,7 @@ class KeyboardHandler extends EventEmitter {
104
104
  this.keyHistory.push({
105
105
  input,
106
106
  key,
107
- timestamp: Date.now()
107
+ timestamp: Date.now(),
108
108
  });
109
109
 
110
110
  // Trim history
@@ -198,10 +198,19 @@ function formatHelp(bindings = DEFAULT_BINDINGS) {
198
198
  // Group bindings
199
199
  const groups = {
200
200
  'Loop Control': ['start', 'pause', 'resume'],
201
- 'View': ['trace', 'help'],
202
- 'Navigation': ['quit'],
203
- 'Sessions': ['session1', 'session2', 'session3', 'session4', 'session5',
204
- 'session6', 'session7', 'session8', 'session9']
201
+ View: ['trace', 'help'],
202
+ Navigation: ['quit'],
203
+ Sessions: [
204
+ 'session1',
205
+ 'session2',
206
+ 'session3',
207
+ 'session4',
208
+ 'session5',
209
+ 'session6',
210
+ 'session7',
211
+ 'session8',
212
+ 'session9',
213
+ ],
205
214
  };
206
215
 
207
216
  for (const [groupName, actions] of Object.entries(groups)) {
@@ -248,5 +257,5 @@ module.exports = {
248
257
  formatBindings,
249
258
  formatHelp,
250
259
  getDefaultHandler,
251
- createKeyHandler
260
+ createKeyHandler,
252
261
  };
@@ -87,7 +87,7 @@ function pause(sessionId = 'default', reason = 'user_request') {
87
87
  const pauseData = {
88
88
  paused_at: new Date().toISOString(),
89
89
  reason,
90
- session_id: sessionId
90
+ session_id: sessionId,
91
91
  };
92
92
 
93
93
  fs.writeFileSync(pauseFile, JSON.stringify(pauseData, null, 2));
@@ -141,7 +141,7 @@ function resume(sessionId = 'default') {
141
141
  return {
142
142
  resumed_at: new Date().toISOString(),
143
143
  was_paused: pauseData !== null,
144
- pause_data: pauseData
144
+ pause_data: pauseData,
145
145
  };
146
146
  }
147
147
 
@@ -158,7 +158,7 @@ function getLoopStatus() {
158
158
  return {
159
159
  active: false,
160
160
  paused: false,
161
- message: 'Loop not active'
161
+ message: 'Loop not active',
162
162
  };
163
163
  }
164
164
 
@@ -177,7 +177,7 @@ function getLoopStatus() {
177
177
  coverageCurrent: loop.coverage_current || 0,
178
178
  pausedAt: loop.paused_at,
179
179
  pauseReason: loop.pause_reason,
180
- startedAt: loop.started_at
180
+ startedAt: loop.started_at,
181
181
  };
182
182
  }
183
183
 
@@ -205,7 +205,7 @@ function stopLoop(reason = 'user_request') {
205
205
  return {
206
206
  stopped: true,
207
207
  reason,
208
- stopped_at: new Date().toISOString()
208
+ stopped_at: new Date().toISOString(),
209
209
  };
210
210
  }
211
211
 
@@ -276,7 +276,7 @@ class LoopController extends EventEmitter {
276
276
  if (newStatus.paused) {
277
277
  this.emit('paused', {
278
278
  pausedAt: newStatus.pausedAt,
279
- reason: newStatus.pauseReason
279
+ reason: newStatus.pauseReason,
280
280
  });
281
281
  } else {
282
282
  this.emit('resumed');
@@ -292,14 +292,14 @@ class LoopController extends EventEmitter {
292
292
  if (this.lastStatus.iteration !== newStatus.iteration) {
293
293
  this.emit('iteration', {
294
294
  iteration: newStatus.iteration,
295
- maxIterations: newStatus.maxIterations
295
+ maxIterations: newStatus.maxIterations,
296
296
  });
297
297
  }
298
298
 
299
299
  if (this.lastStatus.currentStory !== newStatus.currentStory) {
300
300
  this.emit('storyChange', {
301
301
  previousStory: this.lastStatus.currentStory,
302
- currentStory: newStatus.currentStory
302
+ currentStory: newStatus.currentStory,
303
303
  });
304
304
  }
305
305
 
@@ -367,5 +367,5 @@ module.exports = {
367
367
  stopLoop,
368
368
  getPauseFilePath,
369
369
  LoopController,
370
- getDefaultController
370
+ getDefaultController,
371
371
  };
@@ -24,7 +24,7 @@ function getAgentColor(agent) {
24
24
  'agileflow-devops': 'blue',
25
25
  'agileflow-database': 'white',
26
26
  'agileflow-performance': 'cyan',
27
- 'agileflow-documentation': 'gray'
27
+ 'agileflow-documentation': 'gray',
28
28
  };
29
29
 
30
30
  // Check for partial matches
@@ -69,29 +69,15 @@ function OutputRow({ event, showTimestamp = true }) {
69
69
  Box,
70
70
  { flexDirection: 'row' },
71
71
  // Timestamp
72
- showTimestamp && formatted.timestamp && React.createElement(
73
- Text,
74
- { dimColor: true },
75
- `[${formatted.timestamp}] `
76
- ),
72
+ showTimestamp &&
73
+ formatted.timestamp &&
74
+ React.createElement(Text, { dimColor: true }, `[${formatted.timestamp}] `),
77
75
  // Status indicator
78
- React.createElement(
79
- Text,
80
- { color: status.color },
81
- `${status.symbol} `
82
- ),
76
+ React.createElement(Text, { color: status.color }, `${status.symbol} `),
83
77
  // Agent name
84
- React.createElement(
85
- Text,
86
- { color: agentColor, bold: true },
87
- `[${formatted.agent}] `
88
- ),
78
+ React.createElement(Text, { color: agentColor, bold: true }, `[${formatted.agent}] `),
89
79
  // Message
90
- React.createElement(
91
- Text,
92
- null,
93
- formatted.message
94
- )
80
+ React.createElement(Text, null, formatted.message)
95
81
  );
96
82
  }
97
83
 
@@ -102,7 +88,7 @@ function OutputPanel({
102
88
  maxMessages = 100,
103
89
  showTimestamp = true,
104
90
  logPath = null,
105
- title = 'AGENT OUTPUT'
91
+ title = 'AGENT OUTPUT',
106
92
  }) {
107
93
  const [messages, setMessages] = React.useState([]);
108
94
  const [isConnected, setIsConnected] = React.useState(false);
@@ -111,13 +97,15 @@ function OutputPanel({
111
97
 
112
98
  React.useEffect(() => {
113
99
  // Create event stream
114
- const options = logPath ? { logPath, emitHistory: true, historyLimit: 10 } : { emitHistory: true, historyLimit: 10 };
100
+ const options = logPath
101
+ ? { logPath, emitHistory: true, historyLimit: 10 }
102
+ : { emitHistory: true, historyLimit: 10 };
115
103
  const stream = new EventStream(options);
116
104
  streamRef.current = stream;
117
105
 
118
106
  // Handle events
119
- stream.on('event', (event) => {
120
- setMessages((prev) => {
107
+ stream.on('event', event => {
108
+ setMessages(prev => {
121
109
  const newMessages = [...prev, event];
122
110
  // Limit to maxMessages
123
111
  if (newMessages.length > maxMessages) {
@@ -136,7 +124,7 @@ function OutputPanel({
136
124
  setIsConnected(false);
137
125
  });
138
126
 
139
- stream.on('error', (err) => {
127
+ stream.on('error', err => {
140
128
  setError(err.message);
141
129
  });
142
130
 
@@ -164,37 +152,17 @@ function OutputPanel({
164
152
  borderStyle: 'single',
165
153
  borderColor: isConnected ? 'green' : 'gray',
166
154
  padding: 1,
167
- flexGrow: 1
155
+ flexGrow: 1,
168
156
  },
169
157
  // Header
170
158
  React.createElement(
171
159
  Box,
172
160
  { marginBottom: 1 },
173
- React.createElement(
174
- Text,
175
- { bold: true, color: 'cyan' },
176
- title
177
- ),
178
- React.createElement(
179
- Text,
180
- { dimColor: true },
181
- ` (${messages.length}/${maxMessages})`
182
- ),
183
- isConnected && React.createElement(
184
- Text,
185
- { color: 'green' },
186
- ' ●'
187
- ),
188
- !isConnected && !error && React.createElement(
189
- Text,
190
- { color: 'yellow' },
191
- ' ○'
192
- ),
193
- error && React.createElement(
194
- Text,
195
- { color: 'red' },
196
- ' ✗'
197
- )
161
+ React.createElement(Text, { bold: true, color: 'cyan' }, title),
162
+ React.createElement(Text, { dimColor: true }, ` (${messages.length}/${maxMessages})`),
163
+ isConnected && React.createElement(Text, { color: 'green' }, ' ●'),
164
+ !isConnected && !error && React.createElement(Text, { color: 'yellow' }, ' ○'),
165
+ error && React.createElement(Text, { color: 'red' }, ' ✗')
198
166
  ),
199
167
  // Messages or placeholder
200
168
  messages.length === 0
@@ -207,7 +175,7 @@ function OutputPanel({
207
175
  React.createElement(OutputRow, {
208
176
  key: `msg-${index}`,
209
177
  event,
210
- showTimestamp
178
+ showTimestamp,
211
179
  })
212
180
  )
213
181
  );
@@ -225,8 +193,8 @@ function CompactOutput({ maxLines = 5, logPath = null }) {
225
193
  const stream = new EventStream(options);
226
194
  streamRef.current = stream;
227
195
 
228
- stream.on('event', (event) => {
229
- setMessages((prev) => {
196
+ stream.on('event', event => {
197
+ setMessages(prev => {
230
198
  const newMessages = [...prev, event];
231
199
  return newMessages.slice(-maxLines);
232
200
  });
@@ -242,11 +210,7 @@ function CompactOutput({ maxLines = 5, logPath = null }) {
242
210
  }, [logPath, maxLines]);
243
211
 
244
212
  if (messages.length === 0) {
245
- return React.createElement(
246
- Text,
247
- { dimColor: true },
248
- 'No recent activity'
249
- );
213
+ return React.createElement(Text, { dimColor: true }, 'No recent activity');
250
214
  }
251
215
 
252
216
  return React.createElement(
@@ -274,5 +238,5 @@ module.exports = {
274
238
  OutputRow,
275
239
  CompactOutput,
276
240
  getAgentColor,
277
- getStatusIndicator
241
+ getStatusIndicator,
278
242
  };
@@ -25,7 +25,7 @@ function getThreadColor(threadType) {
25
25
  chained: 'yellow',
26
26
  fusion: 'magenta',
27
27
  big: 'blue',
28
- long: 'white'
28
+ long: 'white',
29
29
  };
30
30
  return colors[threadType] || 'gray';
31
31
  }
@@ -56,7 +56,7 @@ function formatSession(session) {
56
56
  story: story || 'none',
57
57
  threadType: thread_type || 'base',
58
58
  active,
59
- current
59
+ current,
60
60
  };
61
61
  }
62
62
 
@@ -135,16 +135,8 @@ function SessionPanel({ refreshInterval = 5000 }) {
135
135
  return React.createElement(
136
136
  Box,
137
137
  { flexDirection: 'column', borderStyle: 'single', borderColor: 'gray', padding: 1 },
138
- React.createElement(
139
- Text,
140
- { bold: true, color: 'cyan' },
141
- 'SESSIONS'
142
- ),
143
- React.createElement(
144
- Text,
145
- { dimColor: true, italic: true },
146
- 'No active sessions'
147
- )
138
+ React.createElement(Text, { bold: true, color: 'cyan' }, 'SESSIONS'),
139
+ React.createElement(Text, { dimColor: true, italic: true }, 'No active sessions')
148
140
  );
149
141
  }
150
142
 
@@ -22,7 +22,7 @@ const QUALITY_GATES = {
22
22
  coverage: { name: 'Coverage', color: 'magenta', icon: '%' },
23
23
  lint: { name: 'Lint', color: 'yellow', icon: '◆' },
24
24
  types: { name: 'Types', color: 'blue', icon: '⬡' },
25
- visual: { name: 'Visual', color: 'cyan', icon: '◉' }
25
+ visual: { name: 'Visual', color: 'cyan', icon: '◉' },
26
26
  };
27
27
 
28
28
  /**
@@ -111,26 +111,10 @@ function GateRow({ gate, status, value }) {
111
111
  return React.createElement(
112
112
  Box,
113
113
  { flexDirection: 'row', marginLeft: 2 },
114
- React.createElement(
115
- Text,
116
- { color: gateConfig.color },
117
- `${gateConfig.icon} `
118
- ),
119
- React.createElement(
120
- Text,
121
- { color: statusColor },
122
- `${statusSymbol} `
123
- ),
124
- React.createElement(
125
- Text,
126
- null,
127
- `${gateConfig.name}`
128
- ),
129
- value !== undefined && React.createElement(
130
- Text,
131
- { dimColor: true },
132
- `: ${value}`
133
- )
114
+ React.createElement(Text, { color: gateConfig.color }, `${gateConfig.icon} `),
115
+ React.createElement(Text, { color: statusColor }, `${statusSymbol} `),
116
+ React.createElement(Text, null, `${gateConfig.name}`),
117
+ value !== undefined && React.createElement(Text, { dimColor: true }, `: ${value}`)
134
118
  );
135
119
  }
136
120
 
@@ -139,11 +123,7 @@ function GateRow({ gate, status, value }) {
139
123
  */
140
124
  function LoopTrace({ loopStatus }) {
141
125
  if (!loopStatus || !loopStatus.active) {
142
- return React.createElement(
143
- Text,
144
- { dimColor: true, italic: true },
145
- 'No active loop'
146
- );
126
+ return React.createElement(Text, { dimColor: true, italic: true }, 'No active loop');
147
127
  }
148
128
 
149
129
  const {
@@ -155,7 +135,7 @@ function LoopTrace({ loopStatus }) {
155
135
  coverageMode,
156
136
  coverageThreshold,
157
137
  coverageCurrent,
158
- visualMode
138
+ visualMode,
159
139
  } = loopStatus;
160
140
 
161
141
  // Build gates list
@@ -165,7 +145,7 @@ function LoopTrace({ loopStatus }) {
165
145
  gates.push({
166
146
  gate: 'tests',
167
147
  status: 'running',
168
- value: null
148
+ value: null,
169
149
  });
170
150
 
171
151
  // Coverage if enabled
@@ -173,7 +153,7 @@ function LoopTrace({ loopStatus }) {
173
153
  gates.push({
174
154
  gate: 'coverage',
175
155
  status: coverageCurrent >= coverageThreshold ? 'passed' : 'running',
176
- value: `${coverageCurrent?.toFixed(1) || 0}% / ${coverageThreshold}%`
156
+ value: `${coverageCurrent?.toFixed(1) || 0}% / ${coverageThreshold}%`,
177
157
  });
178
158
  }
179
159
 
@@ -182,7 +162,7 @@ function LoopTrace({ loopStatus }) {
182
162
  gates.push({
183
163
  gate: 'visual',
184
164
  status: 'pending',
185
- value: null
165
+ value: null,
186
166
  });
187
167
  }
188
168
 
@@ -212,30 +192,27 @@ function LoopTrace({ loopStatus }) {
212
192
  Box,
213
193
  { flexDirection: 'row', marginY: 1 },
214
194
  React.createElement(Text, { dimColor: true }, 'Iteration: '),
215
- React.createElement(
216
- ProgressBar,
217
- { value: iteration || 0, max: maxIterations || 20, width: 15 }
218
- ),
195
+ React.createElement(ProgressBar, {
196
+ value: iteration || 0,
197
+ max: maxIterations || 20,
198
+ width: 15,
199
+ }),
219
200
  React.createElement(Text, { dimColor: true }, ` ${iteration || 0}/${maxIterations || 20}`)
220
201
  ),
221
202
  // Coverage progress (if enabled)
222
- coverageMode && React.createElement(
223
- Box,
224
- { flexDirection: 'row', marginBottom: 1 },
225
- React.createElement(Text, { dimColor: true }, 'Coverage: '),
203
+ coverageMode &&
226
204
  React.createElement(
227
- ProgressBar,
228
- { value: coverageCurrent || 0, max: 100, width: 15 }
229
- )
230
- ),
205
+ Box,
206
+ { flexDirection: 'row', marginBottom: 1 },
207
+ React.createElement(Text, { dimColor: true }, 'Coverage: '),
208
+ React.createElement(ProgressBar, { value: coverageCurrent || 0, max: 100, width: 15 })
209
+ ),
231
210
  // Quality gates
232
211
  React.createElement(
233
212
  Box,
234
213
  { flexDirection: 'column', marginTop: 1 },
235
214
  React.createElement(Text, { dimColor: true }, 'Quality Gates:'),
236
- gates.map((g, i) =>
237
- React.createElement(GateRow, { key: `gate-${i}`, ...g })
238
- )
215
+ gates.map((g, i) => React.createElement(GateRow, { key: `gate-${i}`, ...g }))
239
216
  )
240
217
  );
241
218
  }
@@ -274,22 +251,14 @@ function TracePanel({ visible = true, refreshInterval = 2000 }) {
274
251
  flexDirection: 'column',
275
252
  borderStyle: 'single',
276
253
  borderColor: 'blue',
277
- padding: 1
254
+ padding: 1,
278
255
  },
279
256
  // Header
280
257
  React.createElement(
281
258
  Box,
282
259
  { marginBottom: 1 },
283
- React.createElement(
284
- Text,
285
- { bold: true, color: 'blue' },
286
- 'AGENT TRACE'
287
- ),
288
- React.createElement(
289
- Text,
290
- { dimColor: true },
291
- ' (T to toggle)'
292
- )
260
+ React.createElement(Text, { bold: true, color: 'blue' }, 'AGENT TRACE'),
261
+ React.createElement(Text, { dimColor: true }, ' (T to toggle)')
293
262
  ),
294
263
  // Loop trace
295
264
  React.createElement(LoopTrace, { loopStatus })
@@ -301,11 +270,7 @@ function TracePanel({ visible = true, refreshInterval = 2000 }) {
301
270
  */
302
271
  function CompactTrace({ loopStatus }) {
303
272
  if (!loopStatus || !loopStatus.active) {
304
- return React.createElement(
305
- Text,
306
- { dimColor: true },
307
- 'Loop: inactive'
308
- );
273
+ return React.createElement(Text, { dimColor: true }, 'Loop: inactive');
309
274
  }
310
275
 
311
276
  const { iteration, maxIterations, paused, currentStory } = loopStatus;
@@ -329,5 +294,5 @@ module.exports = {
329
294
  CompactTrace,
330
295
  getStatusColor,
331
296
  getStatusSymbol,
332
- QUALITY_GATES
297
+ QUALITY_GATES,
333
298
  };