@ranger-testing/ranger-cli 2.0.4 → 2.0.6

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 (115) hide show
  1. package/build/cli.js +1 -914
  2. package/build/commands/addEnv.js +1 -1
  3. package/build/commands/authEncrypt.js +1 -36
  4. package/build/commands/clean.js +1 -1
  5. package/build/commands/config.js +1 -93
  6. package/build/commands/env.js +1 -98
  7. package/build/commands/feature.js +1 -653
  8. package/build/commands/hook.js +1 -33
  9. package/build/commands/hooks/autoPrompt.js +1 -32
  10. package/build/commands/hooks/disable.js +1 -33
  11. package/build/commands/hooks/enable.js +1 -58
  12. package/build/commands/hooks/exitPlanMode.js +1 -35
  13. package/build/commands/hooks/index.js +1 -12
  14. package/build/commands/hooks/output.js +1 -71
  15. package/build/commands/hooks/planReminder.js +1 -46
  16. package/build/commands/hooks/planStart.js +1 -30
  17. package/build/commands/hooks/postEdit.js +1 -43
  18. package/build/commands/hooks/preCompact.js +1 -30
  19. package/build/commands/hooks/sessionEnd.js +1 -25
  20. package/build/commands/hooks/sessionStart.js +1 -93
  21. package/build/commands/hooks/stopHook.js +1 -155
  22. package/build/commands/index.js +1 -12
  23. package/build/commands/login.js +1 -26
  24. package/build/commands/setupCi.js +1 -189
  25. package/build/commands/skillup.js +1 -80
  26. package/build/commands/start.js +1 -1
  27. package/build/commands/status.js +1 -198
  28. package/build/commands/update.js +1 -182
  29. package/build/commands/updateEnv.js +1 -1
  30. package/build/commands/useEnv.js +1 -1
  31. package/build/commands/utils/activeProfile.js +1 -76
  32. package/build/commands/utils/browserSessionsApi.js +1 -1
  33. package/build/commands/utils/claudeConfig.js +1 -73
  34. package/build/commands/utils/claudePlugin.js +1 -85
  35. package/build/commands/utils/crypto.js +1 -42
  36. package/build/commands/utils/desirePathLog.js +1 -139
  37. package/build/commands/utils/deviceAuth.js +1 -232
  38. package/build/commands/utils/environment.js +1 -65
  39. package/build/commands/utils/featureApi.js +1 -371
  40. package/build/commands/utils/featureReportGenerator.js +1 -204
  41. package/build/commands/utils/git.js +1 -44
  42. package/build/commands/utils/keychain.js +1 -1
  43. package/build/commands/utils/localAgentInstallationsApi.js +1 -1
  44. package/build/commands/utils/profileMessages.js +1 -8
  45. package/build/commands/utils/profileSetupBanner.js +1 -167
  46. package/build/commands/utils/rangerRoot.js +1 -60
  47. package/build/commands/utils/reportGenerator.js +1 -130
  48. package/build/commands/utils/retry.js +1 -25
  49. package/build/commands/utils/sessionCache.js +1 -299
  50. package/build/commands/utils/settings.js +1 -313
  51. package/build/commands/utils/skillContent.js +1 -28
  52. package/build/commands/utils/skills.js +1 -1
  53. package/build/commands/utils/telemetry.js +1 -254
  54. package/build/commands/utils/userApi.js +1 -32
  55. package/build/commands/utils/version.js +1 -62
  56. package/build/commands/verifyFeature.js +1 -1343
  57. package/build/commands/verifyInBrowser.js +1 -1
  58. package/package.json +1 -1
  59. package/build/cli.js.map +0 -1
  60. package/build/commands/addEnv.js.map +0 -1
  61. package/build/commands/authEncrypt.js.map +0 -1
  62. package/build/commands/clean.js.map +0 -1
  63. package/build/commands/config.js.map +0 -1
  64. package/build/commands/env.js.map +0 -1
  65. package/build/commands/feature.js.map +0 -1
  66. package/build/commands/hook.js.map +0 -1
  67. package/build/commands/hooks/autoPrompt.js.map +0 -1
  68. package/build/commands/hooks/disable.js.map +0 -1
  69. package/build/commands/hooks/enable.js.map +0 -1
  70. package/build/commands/hooks/exitPlanMode.js.map +0 -1
  71. package/build/commands/hooks/index.js.map +0 -1
  72. package/build/commands/hooks/output.js.map +0 -1
  73. package/build/commands/hooks/planReminder.js.map +0 -1
  74. package/build/commands/hooks/planStart.js.map +0 -1
  75. package/build/commands/hooks/postEdit.js.map +0 -1
  76. package/build/commands/hooks/preCompact.js.map +0 -1
  77. package/build/commands/hooks/sessionEnd.js.map +0 -1
  78. package/build/commands/hooks/sessionStart.js.map +0 -1
  79. package/build/commands/hooks/stopHook.js.map +0 -1
  80. package/build/commands/index.js.map +0 -1
  81. package/build/commands/login.js.map +0 -1
  82. package/build/commands/setupCi.js.map +0 -1
  83. package/build/commands/skillup.js.map +0 -1
  84. package/build/commands/start.js.map +0 -1
  85. package/build/commands/status.js.map +0 -1
  86. package/build/commands/update.js.map +0 -1
  87. package/build/commands/updateEnv.js.map +0 -1
  88. package/build/commands/useEnv.js.map +0 -1
  89. package/build/commands/utils/activeProfile.js.map +0 -1
  90. package/build/commands/utils/browserSessionsApi.js.map +0 -1
  91. package/build/commands/utils/claudeConfig.js.map +0 -1
  92. package/build/commands/utils/claudePlugin.js.map +0 -1
  93. package/build/commands/utils/crypto.js.map +0 -1
  94. package/build/commands/utils/desirePathLog.js.map +0 -1
  95. package/build/commands/utils/deviceAuth.js.map +0 -1
  96. package/build/commands/utils/environment.js.map +0 -1
  97. package/build/commands/utils/featureApi.js.map +0 -1
  98. package/build/commands/utils/featureReportGenerator.js.map +0 -1
  99. package/build/commands/utils/git.js.map +0 -1
  100. package/build/commands/utils/keychain.js.map +0 -1
  101. package/build/commands/utils/localAgentInstallationsApi.js.map +0 -1
  102. package/build/commands/utils/profileMessages.js.map +0 -1
  103. package/build/commands/utils/profileSetupBanner.js.map +0 -1
  104. package/build/commands/utils/rangerRoot.js.map +0 -1
  105. package/build/commands/utils/reportGenerator.js.map +0 -1
  106. package/build/commands/utils/retry.js.map +0 -1
  107. package/build/commands/utils/sessionCache.js.map +0 -1
  108. package/build/commands/utils/settings.js.map +0 -1
  109. package/build/commands/utils/skillContent.js.map +0 -1
  110. package/build/commands/utils/skills.js.map +0 -1
  111. package/build/commands/utils/telemetry.js.map +0 -1
  112. package/build/commands/utils/userApi.js.map +0 -1
  113. package/build/commands/utils/version.js.map +0 -1
  114. package/build/commands/verifyFeature.js.map +0 -1
  115. package/build/commands/verifyInBrowser.js.map +0 -1
@@ -1,371 +1 @@
1
- import { getToken } from './keychain.js';
2
- import { getApiBaseUrl } from './environment.js';
3
- import { withRetry } from './retry.js';
4
- /**
5
- * Create a new feature with optional scenarios
6
- */
7
- export async function createFeature(data) {
8
- const token = await getToken();
9
- if (!token) {
10
- throw new Error('No API token configured. Run: ranger setup [token]');
11
- }
12
- const baseUrl = getApiBaseUrl();
13
- const response = await fetch(`${baseUrl}/api/v1/mcp/features`, {
14
- method: 'POST',
15
- headers: {
16
- Authorization: `Bearer ${token}`,
17
- 'Content-Type': 'application/json',
18
- },
19
- body: JSON.stringify(data),
20
- });
21
- if (!response.ok) {
22
- const error = await response.text();
23
- throw new Error(`Failed to create feature review: ${error}`);
24
- }
25
- return response.json();
26
- }
27
- /**
28
- * List features with optional filters
29
- */
30
- export async function listFeatures(options) {
31
- const token = await getToken();
32
- if (!token) {
33
- throw new Error('No API token configured. Run: ranger setup [token]');
34
- }
35
- const baseUrl = getApiBaseUrl();
36
- const params = new URLSearchParams();
37
- if (options?.gitRepoUrl)
38
- params.set('gitRepoUrl', options.gitRepoUrl);
39
- if (options?.gitBranch)
40
- params.set('gitBranch', options.gitBranch);
41
- if (options?.limit)
42
- params.set('limit', options.limit.toString());
43
- if (options?.offset)
44
- params.set('offset', options.offset.toString());
45
- if (options?.includeDeleted)
46
- params.set('includeDeleted', 'true');
47
- const url = `${baseUrl}/api/v1/mcp/features${params.toString() ? `?${params.toString()}` : ''}`;
48
- const response = await fetch(url, {
49
- method: 'GET',
50
- headers: {
51
- Authorization: `Bearer ${token}`,
52
- },
53
- });
54
- if (!response.ok) {
55
- const error = await response.text();
56
- throw new Error(`Failed to list feature reviews: ${error}`);
57
- }
58
- return response.json();
59
- }
60
- /**
61
- * Get a feature by ID with scenarios and sessions
62
- */
63
- export async function getFeature(id) {
64
- const token = await getToken();
65
- if (!token) {
66
- throw new Error('No API token configured. Run: ranger setup [token]');
67
- }
68
- const baseUrl = getApiBaseUrl();
69
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${id}`, {
70
- method: 'GET',
71
- headers: {
72
- Authorization: `Bearer ${token}`,
73
- },
74
- });
75
- if (!response.ok) {
76
- const error = await response.text();
77
- throw new Error(`Failed to get feature review: ${error}`);
78
- }
79
- return response.json();
80
- }
81
- /**
82
- * Update a feature
83
- */
84
- export async function updateFeature(id, updates) {
85
- const token = await getToken();
86
- if (!token) {
87
- throw new Error('No API token configured. Run: ranger setup [token]');
88
- }
89
- const baseUrl = getApiBaseUrl();
90
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${id}`, {
91
- method: 'PATCH',
92
- headers: {
93
- Authorization: `Bearer ${token}`,
94
- 'Content-Type': 'application/json',
95
- },
96
- body: JSON.stringify(updates),
97
- });
98
- if (!response.ok) {
99
- const error = await response.text();
100
- throw new Error(`Failed to update feature review: ${error}`);
101
- }
102
- return response.json();
103
- }
104
- /**
105
- * Create a new scenario
106
- */
107
- export async function createChecklistItem(featureId, description, position) {
108
- const token = await getToken();
109
- if (!token) {
110
- throw new Error('No API token configured. Run: ranger setup [token]');
111
- }
112
- const baseUrl = getApiBaseUrl();
113
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${featureId}/checklist`, {
114
- method: 'POST',
115
- headers: {
116
- Authorization: `Bearer ${token}`,
117
- 'Content-Type': 'application/json',
118
- },
119
- body: JSON.stringify({ description, position }),
120
- });
121
- if (!response.ok) {
122
- const error = await response.text();
123
- throw new Error(`Failed to create scenario: ${error}`);
124
- }
125
- return response.json();
126
- }
127
- /**
128
- * Update a scenario
129
- */
130
- export async function updateChecklistItem(featureId, itemId, updates) {
131
- return withRetry(async () => {
132
- const token = await getToken();
133
- if (!token) {
134
- throw new Error('No API token configured. Run: ranger setup [token]');
135
- }
136
- const baseUrl = getApiBaseUrl();
137
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${featureId}/checklist/${itemId}`, {
138
- method: 'PATCH',
139
- headers: {
140
- Authorization: `Bearer ${token}`,
141
- 'Content-Type': 'application/json',
142
- },
143
- body: JSON.stringify(updates),
144
- });
145
- if (!response.ok) {
146
- const error = await response.text();
147
- throw new Error(`Failed to update scenario: ${error}`);
148
- }
149
- return response.json();
150
- }, { label: 'updateChecklistItem' });
151
- }
152
- /**
153
- * Get feature report data
154
- */
155
- export async function getFeatureReport(id) {
156
- const token = await getToken();
157
- if (!token) {
158
- throw new Error('No API token configured. Run: ranger setup [token]');
159
- }
160
- const baseUrl = getApiBaseUrl();
161
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${id}/report`, {
162
- method: 'GET',
163
- headers: {
164
- Authorization: `Bearer ${token}`,
165
- },
166
- });
167
- if (!response.ok) {
168
- const error = await response.text();
169
- throw new Error(`Failed to get feature review report: ${error}`);
170
- }
171
- return response.json();
172
- }
173
- /**
174
- * Get feature report as markdown with embedded screenshots
175
- */
176
- export async function getFeatureReportMarkdown(id, options) {
177
- const token = await getToken();
178
- if (!token) {
179
- throw new Error('No API token configured. Run: ranger setup [token]');
180
- }
181
- const baseUrl = getApiBaseUrl();
182
- const params = new URLSearchParams();
183
- if (options?.style) {
184
- params.set('style', options.style);
185
- }
186
- const url = `${baseUrl}/api/v1/mcp/features/${id}/report/markdown${params.toString() ? `?${params.toString()}` : ''}`;
187
- const response = await fetch(url, {
188
- method: 'GET',
189
- headers: {
190
- Authorization: `Bearer ${token}`,
191
- },
192
- });
193
- if (!response.ok) {
194
- const error = await response.text();
195
- throw new Error(`Failed to get feature review report markdown: ${error}`);
196
- }
197
- return response.text();
198
- }
199
- /**
200
- * List sessions for a feature
201
- */
202
- export async function listFeatureSessions(featureId) {
203
- const token = await getToken();
204
- if (!token) {
205
- throw new Error('No API token configured. Run: ranger setup [token]');
206
- }
207
- const baseUrl = getApiBaseUrl();
208
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${featureId}/sessions`, {
209
- method: 'GET',
210
- headers: {
211
- Authorization: `Bearer ${token}`,
212
- },
213
- });
214
- if (!response.ok) {
215
- const error = await response.text();
216
- throw new Error(`Failed to list sessions: ${error}`);
217
- }
218
- return response.json();
219
- }
220
- /**
221
- * Start a session (changes status from ready to in_progress)
222
- */
223
- export async function startSession(featureId, sessionId) {
224
- const token = await getToken();
225
- if (!token) {
226
- throw new Error('No API token configured. Run: ranger setup [token]');
227
- }
228
- const baseUrl = getApiBaseUrl();
229
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${featureId}/sessions/${sessionId}/start`, {
230
- method: 'POST',
231
- headers: {
232
- Authorization: `Bearer ${token}`,
233
- },
234
- });
235
- if (!response.ok) {
236
- const error = await response.text();
237
- throw new Error(`Failed to start session: ${error}`);
238
- }
239
- return response.json();
240
- }
241
- /**
242
- * Conclude a session (end even with incomplete items)
243
- */
244
- export async function concludeSession(featureId, sessionId) {
245
- const token = await getToken();
246
- if (!token) {
247
- throw new Error('No API token configured. Run: ranger setup [token]');
248
- }
249
- const baseUrl = getApiBaseUrl();
250
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${featureId}/sessions/${sessionId}/conclude`, {
251
- method: 'POST',
252
- headers: {
253
- Authorization: `Bearer ${token}`,
254
- },
255
- });
256
- if (!response.ok) {
257
- const error = await response.text();
258
- throw new Error(`Failed to conclude session: ${error}`);
259
- }
260
- return response.json();
261
- }
262
- /**
263
- * Get action items for a feature - leaf items that can be verified.
264
- * Returns non-closed items with no non-closed children, plus unaddressed comment counts.
265
- */
266
- export async function getActionItems(featureId) {
267
- const token = await getToken();
268
- if (!token) {
269
- throw new Error('No API token configured. Run: ranger setup [token]');
270
- }
271
- const baseUrl = getApiBaseUrl();
272
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${featureId}/action-items`, {
273
- method: 'GET',
274
- headers: {
275
- Authorization: `Bearer ${token}`,
276
- },
277
- });
278
- if (!response.ok) {
279
- const error = await response.text();
280
- throw new Error(`Failed to get action items: ${error}`);
281
- }
282
- return response.json();
283
- }
284
- /**
285
- * Get feedback and verification instructions for a scenario.
286
- * Returns unaddressed comments, parent description, and canonical flow.
287
- */
288
- export async function getItemFeedback(featureId, itemId) {
289
- const token = await getToken();
290
- if (!token) {
291
- throw new Error('No API token configured. Run: ranger setup [token]');
292
- }
293
- const baseUrl = getApiBaseUrl();
294
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${featureId}/checklist-items/${itemId}/feedback`, {
295
- method: 'GET',
296
- headers: {
297
- Authorization: `Bearer ${token}`,
298
- },
299
- });
300
- if (!response.ok) {
301
- const error = await response.text();
302
- throw new Error(`Failed to get item feedback: ${error}`);
303
- }
304
- return response.json();
305
- }
306
- /**
307
- * Mark specific comments as addressed by a checklist item.
308
- */
309
- export async function markCommentsAddressed(featureId, checklistItemId, commentIds) {
310
- const token = await getToken();
311
- if (!token) {
312
- throw new Error('No API token configured. Run: ranger setup [token]');
313
- }
314
- const baseUrl = getApiBaseUrl();
315
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${featureId}/comments/address`, {
316
- method: 'POST',
317
- headers: {
318
- Authorization: `Bearer ${token}`,
319
- 'Content-Type': 'application/json',
320
- },
321
- body: JSON.stringify({
322
- checklistItemId,
323
- commentIds,
324
- }),
325
- });
326
- if (!response.ok) {
327
- const error = await response.text();
328
- throw new Error(`Failed to mark comments as addressed: ${error}`);
329
- }
330
- }
331
- /**
332
- * Soft delete a feature
333
- */
334
- export async function softDeleteFeature(id) {
335
- const token = await getToken();
336
- if (!token) {
337
- throw new Error('No API token configured. Run: ranger setup [token]');
338
- }
339
- const baseUrl = getApiBaseUrl();
340
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${id}`, {
341
- method: 'DELETE',
342
- headers: {
343
- Authorization: `Bearer ${token}`,
344
- },
345
- });
346
- if (!response.ok) {
347
- const error = await response.text();
348
- throw new Error(`Failed to delete feature review: ${error}`);
349
- }
350
- }
351
- /**
352
- * Restore a soft-deleted feature
353
- */
354
- export async function restoreFeature(id) {
355
- const token = await getToken();
356
- if (!token) {
357
- throw new Error('No API token configured. Run: ranger setup [token]');
358
- }
359
- const baseUrl = getApiBaseUrl();
360
- const response = await fetch(`${baseUrl}/api/v1/mcp/features/${id}/restore`, {
361
- method: 'POST',
362
- headers: {
363
- Authorization: `Bearer ${token}`,
364
- },
365
- });
366
- if (!response.ok) {
367
- const error = await response.text();
368
- throw new Error(`Failed to restore feature review: ${error}`);
369
- }
370
- }
371
- //# sourceMappingURL=featureApi.js.map
1
+ (function(_0x104d23,_0x348198){const _0x46e04a=_0x1940,_0x5d6e03=_0x104d23();while(!![]){try{const _0x1dcdb3=-parseInt(_0x46e04a(0x1ac))/0x1+-parseInt(_0x46e04a(0x1b4))/0x2+-parseInt(_0x46e04a(0x1ae))/0x3+parseInt(_0x46e04a(0x1b0))/0x4+-parseInt(_0x46e04a(0x1c0))/0x5*(parseInt(_0x46e04a(0x190))/0x6)+parseInt(_0x46e04a(0x19d))/0x7+-parseInt(_0x46e04a(0x1ba))/0x8*(-parseInt(_0x46e04a(0x18e))/0x9);if(_0x1dcdb3===_0x348198)break;else _0x5d6e03['push'](_0x5d6e03['shift']());}catch(_0x5c288a){_0x5d6e03['push'](_0x5d6e03['shift']());}}}(_0x2294,0x3d949));import{getToken}from'./keychain.js';function _0x2294(){const _0x56e71a=['2543317ORkwHk','/feedback','limit','Failed\x20to\x20update\x20feature\x20review:\x20','Failed\x20to\x20get\x20feature\x20review\x20report\x20markdown:\x20','/restore','gitBranch','UJVHF','bOMGr','Failed\x20to\x20create\x20scenario:\x20','application/json','gitRepoUrl','/sessions/','Failed\x20to\x20create\x20feature\x20review:\x20','zFidN','426590AHmFXV','kZOgT','451803EORTeQ','pFsnR','966664zCVbMN','/report','GeDng','updateChecklistItem','318270FMXqyH','CRIGt','rhtoq','/sessions','No\x20API\x20token\x20configured.\x20Run:\x20ranger\x20setup\x20[token]','/checklist-items/','1546952VCWgZv','qknMX','text','xSVpy','qdCno','UwKDU','5ScnlUk','ypeEB','set','VTXUl','FQcaZ','json','GET','PATCH','bZXVY','tRmYa','PSBUe','POST','offset','/api/v1/mcp/features/','Failed\x20to\x20conclude\x20session:\x20','DELETE','toString','bFAYx','Failed\x20to\x20get\x20action\x20items:\x20','Failed\x20to\x20restore\x20feature\x20review:\x20','Failed\x20to\x20start\x20session:\x20','36fazjtQ','Failed\x20to\x20list\x20sessions:\x20','2339484JvMUGo','rXHXy','/conclude','Bearer\x20','leFwB','bHICK','OTUmb','OfRQp','style','ICabb','Failed\x20to\x20get\x20feature\x20review:\x20','stringify','Failed\x20to\x20mark\x20comments\x20as\x20addressed:\x20'];_0x2294=function(){return _0x56e71a;};return _0x2294();}import{getApiBaseUrl}from'./environment.js';import{withRetry}from'./retry.js';export async function createFeature(_0x2e579e){const _0x1f5367=_0x1940,_0x23703c={'kZOgT':_0x1f5367(0x184)},_0x650856=await getToken();if(!_0x650856)throw new Error('No\x20API\x20token\x20configured.\x20Run:\x20ranger\x20setup\x20[token]');const _0x5737ba=getApiBaseUrl(),_0x41c754=await fetch(_0x5737ba+'/api/v1/mcp/features',{'method':_0x23703c[_0x1f5367(0x1ad)],'headers':{'Authorization':_0x1f5367(0x193)+_0x650856,'Content-Type':_0x1f5367(0x1a7)},'body':JSON[_0x1f5367(0x19b)](_0x2e579e)});if(!_0x41c754['ok']){const _0x31fdf7=await _0x41c754['text']();throw new Error(_0x1f5367(0x1aa)+_0x31fdf7);}return _0x41c754[_0x1f5367(0x1c5)]();}export async function listFeatures(_0x195b7b){const _0x26098c=_0x1940,_0x419c0b={'OTUmb':'No\x20API\x20token\x20configured.\x20Run:\x20ranger\x20setup\x20[token]','oowBH':function(_0x54a3de){return _0x54a3de();},'VTXUl':'gitRepoUrl','RwHwV':'limit','tSXWI':'offset','ExhtG':'true','TULqn':'GET'},_0xeb0d4f=await getToken();if(!_0xeb0d4f)throw new Error(_0x419c0b[_0x26098c(0x196)]);const _0x1b9482=_0x419c0b['oowBH'](getApiBaseUrl),_0x3eb192=new URLSearchParams();if(_0x195b7b?.[_0x26098c(0x1a8)])_0x3eb192[_0x26098c(0x1c2)](_0x419c0b[_0x26098c(0x1c3)],_0x195b7b['gitRepoUrl']);if(_0x195b7b?.['gitBranch'])_0x3eb192['set'](_0x26098c(0x1a3),_0x195b7b[_0x26098c(0x1a3)]);if(_0x195b7b?.[_0x26098c(0x19f)])_0x3eb192['set'](_0x419c0b['RwHwV'],_0x195b7b[_0x26098c(0x19f)][_0x26098c(0x189)]());if(_0x195b7b?.[_0x26098c(0x185)])_0x3eb192['set'](_0x419c0b['tSXWI'],_0x195b7b[_0x26098c(0x185)][_0x26098c(0x189)]());if(_0x195b7b?.['includeDeleted'])_0x3eb192['set']('includeDeleted',_0x419c0b['ExhtG']);const _0x316aaa=_0x1b9482+'/api/v1/mcp/features'+(_0x3eb192['toString']()?'?'+_0x3eb192[_0x26098c(0x189)]():''),_0x5a7966=await fetch(_0x316aaa,{'method':_0x419c0b['TULqn'],'headers':{'Authorization':'Bearer\x20'+_0xeb0d4f}});if(!_0x5a7966['ok']){const _0x38a0ea=await _0x5a7966['text']();throw new Error('Failed\x20to\x20list\x20feature\x20reviews:\x20'+_0x38a0ea);}return _0x5a7966['json']();}export async function getFeature(_0x3e9278){const _0x1b4948=_0x1940,_0x50efe7={'ICabb':function(_0x27db73){return _0x27db73();},'CRIGt':_0x1b4948(0x1b8),'zFidN':_0x1b4948(0x1c6)},_0x2aab7e=await _0x50efe7[_0x1b4948(0x199)](getToken);if(!_0x2aab7e)throw new Error(_0x50efe7[_0x1b4948(0x1b5)]);const _0x48f35f=_0x50efe7[_0x1b4948(0x199)](getApiBaseUrl),_0x285745=await fetch(_0x48f35f+_0x1b4948(0x186)+_0x3e9278,{'method':_0x50efe7[_0x1b4948(0x1ab)],'headers':{'Authorization':'Bearer\x20'+_0x2aab7e}});if(!_0x285745['ok']){const _0x1d2451=await _0x285745[_0x1b4948(0x1bc)]();throw new Error(_0x1b4948(0x19a)+_0x1d2451);}return _0x285745[_0x1b4948(0x1c5)]();}export async function updateFeature(_0x1efa55,_0x2ea7c1){const _0x56e093=_0x1940,_0x499ae9={'ypeEB':function(_0x1a698e){return _0x1a698e();},'tRmYa':function(_0x97aac9,_0x35b43d,_0x3118d3){return _0x97aac9(_0x35b43d,_0x3118d3);},'bOMGr':_0x56e093(0x1a7)},_0x1f7273=await _0x499ae9[_0x56e093(0x1c1)](getToken);if(!_0x1f7273)throw new Error(_0x56e093(0x1b8));const _0x1b097c=getApiBaseUrl(),_0x2c0952=await _0x499ae9[_0x56e093(0x182)](fetch,_0x1b097c+'/api/v1/mcp/features/'+_0x1efa55,{'method':_0x56e093(0x1c7),'headers':{'Authorization':'Bearer\x20'+_0x1f7273,'Content-Type':_0x499ae9[_0x56e093(0x1a5)]},'body':JSON[_0x56e093(0x19b)](_0x2ea7c1)});if(!_0x2c0952['ok']){const _0x492ef2=await _0x2c0952['text']();throw new Error(_0x56e093(0x1a0)+_0x492ef2);}return _0x2c0952['json']();}export async function createChecklistItem(_0x378819,_0x58a57d,_0x53c9e5){const _0x1664fd=_0x1940,_0x2acb7f={'leFwB':function(_0x2a9064){return _0x2a9064();},'uiLph':_0x1664fd(0x1b8),'gtynX':function(_0x3322cd,_0x1d663d,_0x33ee95){return _0x3322cd(_0x1d663d,_0x33ee95);}},_0x3297e2=await _0x2acb7f[_0x1664fd(0x194)](getToken);if(!_0x3297e2)throw new Error(_0x2acb7f['uiLph']);const _0x15a092=getApiBaseUrl(),_0x6c7665=await _0x2acb7f['gtynX'](fetch,_0x15a092+_0x1664fd(0x186)+_0x378819+'/checklist',{'method':'POST','headers':{'Authorization':_0x1664fd(0x193)+_0x3297e2,'Content-Type':_0x1664fd(0x1a7)},'body':JSON['stringify']({'description':_0x58a57d,'position':_0x53c9e5})});if(!_0x6c7665['ok']){const _0x35fd46=await _0x6c7665[_0x1664fd(0x1bc)]();throw new Error(_0x1664fd(0x1a6)+_0x35fd46);}return _0x6c7665[_0x1664fd(0x1c5)]();}export async function updateChecklistItem(_0x47a85a,_0x53418f,_0x32d01c){const _0x5478f5=_0x1940,_0x34c652={'xSVpy':function(_0x2d2a5c,_0x54c7f3,_0x1182d4){return _0x2d2a5c(_0x54c7f3,_0x1182d4);},'cHLJf':_0x5478f5(0x1a7),'smsgz':_0x5478f5(0x1b3)};return withRetry(async()=>{const _0x22824f=_0x5478f5,_0x4f03aa=await getToken();if(!_0x4f03aa)throw new Error('No\x20API\x20token\x20configured.\x20Run:\x20ranger\x20setup\x20[token]');const _0xca4149=getApiBaseUrl(),_0x11f120=await _0x34c652[_0x22824f(0x1bd)](fetch,_0xca4149+'/api/v1/mcp/features/'+_0x47a85a+'/checklist/'+_0x53418f,{'method':_0x22824f(0x1c7),'headers':{'Authorization':'Bearer\x20'+_0x4f03aa,'Content-Type':_0x34c652['cHLJf']},'body':JSON[_0x22824f(0x19b)](_0x32d01c)});if(!_0x11f120['ok']){const _0x28d5f9=await _0x11f120['text']();throw new Error('Failed\x20to\x20update\x20scenario:\x20'+_0x28d5f9);}return _0x11f120[_0x22824f(0x1c5)]();},{'label':_0x34c652['smsgz']});}export async function getFeatureReport(_0x5da1b1){const _0x175717=_0x1940,_0x14821f={'bFAYx':function(_0x3af392){return _0x3af392();},'vzXtB':'No\x20API\x20token\x20configured.\x20Run:\x20ranger\x20setup\x20[token]','UwKDU':_0x175717(0x1c6)},_0x50677f=await _0x14821f[_0x175717(0x18a)](getToken);if(!_0x50677f)throw new Error(_0x14821f['vzXtB']);const _0x2ef89b=getApiBaseUrl(),_0x5848a8=await fetch(_0x2ef89b+'/api/v1/mcp/features/'+_0x5da1b1+_0x175717(0x1b1),{'method':_0x14821f[_0x175717(0x1bf)],'headers':{'Authorization':'Bearer\x20'+_0x50677f}});if(!_0x5848a8['ok']){const _0x5a6f19=await _0x5848a8[_0x175717(0x1bc)]();throw new Error('Failed\x20to\x20get\x20feature\x20review\x20report:\x20'+_0x5a6f19);}return _0x5848a8[_0x175717(0x1c5)]();}export async function getFeatureReportMarkdown(_0x3e4eef,_0x5ac32a){const _0x6c2b8=_0x1940,_0x5352e0={'rXHXy':function(_0x3789e1){return _0x3789e1();},'qknMX':_0x6c2b8(0x1b8)},_0x18690b=await _0x5352e0[_0x6c2b8(0x191)](getToken);if(!_0x18690b)throw new Error(_0x5352e0[_0x6c2b8(0x1bb)]);const _0x4a252f=getApiBaseUrl(),_0x98eebf=new URLSearchParams();_0x5ac32a?.[_0x6c2b8(0x198)]&&_0x98eebf['set']('style',_0x5ac32a['style']);const _0x34ea02=_0x4a252f+'/api/v1/mcp/features/'+_0x3e4eef+'/report/markdown'+(_0x98eebf[_0x6c2b8(0x189)]()?'?'+_0x98eebf[_0x6c2b8(0x189)]():''),_0x4a8022=await fetch(_0x34ea02,{'method':_0x6c2b8(0x1c6),'headers':{'Authorization':_0x6c2b8(0x193)+_0x18690b}});if(!_0x4a8022['ok']){const _0x2f4d91=await _0x4a8022[_0x6c2b8(0x1bc)]();throw new Error(_0x6c2b8(0x1a1)+_0x2f4d91);}return _0x4a8022['text']();}export async function listFeatureSessions(_0x30eea8){const _0x36d8ae=_0x1940,_0x4fde87={'FQcaZ':function(_0x37ec32){return _0x37ec32();},'FOqwa':'No\x20API\x20token\x20configured.\x20Run:\x20ranger\x20setup\x20[token]','RkUFq':function(_0x2bbe8b){return _0x2bbe8b();},'VoejP':function(_0x2339f1,_0x47fd1e,_0xab4f7){return _0x2339f1(_0x47fd1e,_0xab4f7);}},_0x274b2b=await _0x4fde87[_0x36d8ae(0x1c4)](getToken);if(!_0x274b2b)throw new Error(_0x4fde87['FOqwa']);const _0x233f4d=_0x4fde87['RkUFq'](getApiBaseUrl),_0x55a0c3=await _0x4fde87['VoejP'](fetch,_0x233f4d+_0x36d8ae(0x186)+_0x30eea8+_0x36d8ae(0x1b7),{'method':'GET','headers':{'Authorization':_0x36d8ae(0x193)+_0x274b2b}});if(!_0x55a0c3['ok']){const _0x490d71=await _0x55a0c3['text']();throw new Error(_0x36d8ae(0x18f)+_0x490d71);}return _0x55a0c3['json']();}function _0x1940(_0x1c8576,_0x4a3d42){_0x1c8576=_0x1c8576-0x182;const _0x229486=_0x2294();let _0x194075=_0x229486[_0x1c8576];return _0x194075;}export async function startSession(_0x1ac229,_0x9fbfbb){const _0x405fca=_0x1940,_0x2cc7cc={'QMZQD':_0x405fca(0x1b8),'GLkgf':function(_0x20c3ea){return _0x20c3ea();},'PSBUe':function(_0x4d6993,_0x1626f2,_0x4efe71){return _0x4d6993(_0x1626f2,_0x4efe71);}},_0x395a30=await getToken();if(!_0x395a30)throw new Error(_0x2cc7cc['QMZQD']);const _0x5dc9aa=_0x2cc7cc['GLkgf'](getApiBaseUrl),_0x26820f=await _0x2cc7cc[_0x405fca(0x183)](fetch,_0x5dc9aa+'/api/v1/mcp/features/'+_0x1ac229+'/sessions/'+_0x9fbfbb+'/start',{'method':'POST','headers':{'Authorization':'Bearer\x20'+_0x395a30}});if(!_0x26820f['ok']){const _0x513d7f=await _0x26820f['text']();throw new Error(_0x405fca(0x18d)+_0x513d7f);}return _0x26820f[_0x405fca(0x1c5)]();}export async function concludeSession(_0x3108d1,_0x59ffaf){const _0x3e8418=_0x1940,_0x55fc85={'GeDng':function(_0x537311){return _0x537311();},'LaBPg':_0x3e8418(0x1b8)},_0x3e7168=await _0x55fc85[_0x3e8418(0x1b2)](getToken);if(!_0x3e7168)throw new Error(_0x55fc85['LaBPg']);const _0x1dd63a=getApiBaseUrl(),_0x154e6b=await fetch(_0x1dd63a+_0x3e8418(0x186)+_0x3108d1+_0x3e8418(0x1a9)+_0x59ffaf+_0x3e8418(0x192),{'method':_0x3e8418(0x184),'headers':{'Authorization':'Bearer\x20'+_0x3e7168}});if(!_0x154e6b['ok']){const _0x56aec9=await _0x154e6b['text']();throw new Error(_0x3e8418(0x187)+_0x56aec9);}return _0x154e6b['json']();}export async function getActionItems(_0x41dd5d){const _0x14e808=_0x1940,_0x5c5f91={'qdCno':function(_0x3d1296){return _0x3d1296();},'OFDYy':_0x14e808(0x1b8)},_0x2b7ea0=await _0x5c5f91[_0x14e808(0x1be)](getToken);if(!_0x2b7ea0)throw new Error(_0x5c5f91['OFDYy']);const _0x37bca9=getApiBaseUrl(),_0x318c22=await fetch(_0x37bca9+_0x14e808(0x186)+_0x41dd5d+'/action-items',{'method':_0x14e808(0x1c6),'headers':{'Authorization':_0x14e808(0x193)+_0x2b7ea0}});if(!_0x318c22['ok']){const _0x2a5680=await _0x318c22[_0x14e808(0x1bc)]();throw new Error(_0x14e808(0x18b)+_0x2a5680);}return _0x318c22['json']();}export async function getItemFeedback(_0x1f2c75,_0x292b79){const _0x2bc612=_0x1940,_0x57928a={'rqsfn':function(_0x5f4757){return _0x5f4757();},'axgTi':'No\x20API\x20token\x20configured.\x20Run:\x20ranger\x20setup\x20[token]'},_0x5ab203=await _0x57928a['rqsfn'](getToken);if(!_0x5ab203)throw new Error(_0x57928a['axgTi']);const _0x21ebbb=getApiBaseUrl(),_0x444137=await fetch(_0x21ebbb+'/api/v1/mcp/features/'+_0x1f2c75+_0x2bc612(0x1b9)+_0x292b79+_0x2bc612(0x19e),{'method':_0x2bc612(0x1c6),'headers':{'Authorization':'Bearer\x20'+_0x5ab203}});if(!_0x444137['ok']){const _0x5d6325=await _0x444137['text']();throw new Error('Failed\x20to\x20get\x20item\x20feedback:\x20'+_0x5d6325);}return _0x444137[_0x2bc612(0x1c5)]();}export async function markCommentsAddressed(_0x526354,_0x433b2a,_0x517744){const _0x1992a2=_0x1940,_0x16fc8d={'OfRQp':function(_0x55fc24){return _0x55fc24();},'bHICK':_0x1992a2(0x1b8),'BdRwd':_0x1992a2(0x1a7)},_0x153e5e=await _0x16fc8d['OfRQp'](getToken);if(!_0x153e5e)throw new Error(_0x16fc8d[_0x1992a2(0x195)]);const _0x1d4969=_0x16fc8d[_0x1992a2(0x197)](getApiBaseUrl),_0x3a8546=await fetch(_0x1d4969+_0x1992a2(0x186)+_0x526354+'/comments/address',{'method':'POST','headers':{'Authorization':_0x1992a2(0x193)+_0x153e5e,'Content-Type':_0x16fc8d['BdRwd']},'body':JSON['stringify']({'checklistItemId':_0x433b2a,'commentIds':_0x517744})});if(!_0x3a8546['ok']){const _0x4596fa=await _0x3a8546['text']();throw new Error(_0x1992a2(0x19c)+_0x4596fa);}}export async function softDeleteFeature(_0x33b665){const _0x574ebb=_0x1940,_0x44ad7b={'qCKmr':function(_0x5cda3f){return _0x5cda3f();},'Ernuk':_0x574ebb(0x1b8),'rhtoq':function(_0x233dac,_0x4a3365,_0x415c60){return _0x233dac(_0x4a3365,_0x415c60);}},_0x339b8f=await _0x44ad7b['qCKmr'](getToken);if(!_0x339b8f)throw new Error(_0x44ad7b['Ernuk']);const _0xd94ba7=_0x44ad7b['qCKmr'](getApiBaseUrl),_0x1f8c40=await _0x44ad7b[_0x574ebb(0x1b6)](fetch,_0xd94ba7+'/api/v1/mcp/features/'+_0x33b665,{'method':_0x574ebb(0x188),'headers':{'Authorization':_0x574ebb(0x193)+_0x339b8f}});if(!_0x1f8c40['ok']){const _0x8164e3=await _0x1f8c40[_0x574ebb(0x1bc)]();throw new Error('Failed\x20to\x20delete\x20feature\x20review:\x20'+_0x8164e3);}}export async function restoreFeature(_0x341515){const _0x5ac486=_0x1940,_0x55832e={'UJVHF':'No\x20API\x20token\x20configured.\x20Run:\x20ranger\x20setup\x20[token]','bZXVY':function(_0x234dad){return _0x234dad();},'pFsnR':_0x5ac486(0x184)},_0x2077f6=await getToken();if(!_0x2077f6)throw new Error(_0x55832e[_0x5ac486(0x1a4)]);const _0x2f4044=_0x55832e[_0x5ac486(0x1c8)](getApiBaseUrl),_0x148259=await fetch(_0x2f4044+'/api/v1/mcp/features/'+_0x341515+_0x5ac486(0x1a2),{'method':_0x55832e[_0x5ac486(0x1af)],'headers':{'Authorization':_0x5ac486(0x193)+_0x2077f6}});if(!_0x148259['ok']){const _0x1ce25e=await _0x148259['text']();throw new Error(_0x5ac486(0x18c)+_0x1ce25e);}}
@@ -1,204 +1 @@
1
- /**
2
- * Build the Playwright trace viewer URL
3
- */
4
- export function buildTraceViewerUrl(traceUrl) {
5
- const encodedUrl = encodeURIComponent(traceUrl);
6
- return `https://trace.playwright.dev/?trace=${encodedUrl}`;
7
- }
8
- /**
9
- * Get status emoji
10
- */
11
- function getStatusEmoji(status) {
12
- switch (status) {
13
- case 'verified':
14
- case 'completed':
15
- return '\u2705'; // green check
16
- case 'pending':
17
- case 'in_progress':
18
- return '\ud83d\udd04'; // rotating arrows
19
- case 'incomplete':
20
- return '\ud83d\udfe0'; // orange circle 🟠
21
- case 'blocked':
22
- return '\ud83d\uded1'; // stop sign
23
- case 'closed':
24
- return '\u26d4'; // no entry
25
- default:
26
- return '\u2753'; // question mark
27
- }
28
- }
29
- /**
30
- * Format duration in human-readable form
31
- */
32
- function formatDuration(ms) {
33
- if (ms === null || ms === undefined)
34
- return 'N/A';
35
- if (ms < 1000)
36
- return `${ms}ms`;
37
- const seconds = Math.floor(ms / 1000);
38
- if (seconds < 60)
39
- return `${seconds}s`;
40
- const minutes = Math.floor(seconds / 60);
41
- const remainingSeconds = seconds % 60;
42
- return `${minutes}m ${remainingSeconds}s`;
43
- }
44
- /**
45
- * Format date for display
46
- */
47
- function formatDate(dateStr) {
48
- if (!dateStr)
49
- return 'N/A';
50
- return new Date(dateStr).toLocaleDateString('en-US', {
51
- year: 'numeric',
52
- month: 'short',
53
- day: 'numeric',
54
- });
55
- }
56
- /**
57
- * Generate a markdown report for a feature review
58
- */
59
- export function generateFeatureReport(data) {
60
- const { feature, stats, checklistItems, sessions } = data;
61
- const lines = [];
62
- // Header
63
- lines.push(`# Feature Review Report: ${feature.name}`);
64
- lines.push('');
65
- // Status - derive from completedAt and currentSession
66
- let statusLabel;
67
- let statusEmoji;
68
- if (feature.completedAt) {
69
- statusLabel = 'Completed';
70
- statusEmoji = '\u2705'; // green check
71
- }
72
- else if (feature.currentSession) {
73
- const sessionStatus = feature.currentSession.status;
74
- switch (sessionStatus) {
75
- case 'ready':
76
- statusLabel = `Session ${feature.currentSession.iteration}: Ready`;
77
- statusEmoji = '\u25b6\ufe0f'; // ▶️
78
- break;
79
- case 'in_progress':
80
- statusLabel = `Session ${feature.currentSession.iteration}: In Progress`;
81
- statusEmoji = '\ud83d\udd04'; // 🔄
82
- break;
83
- case 'completed':
84
- statusLabel = `Session ${feature.currentSession.iteration}: Awaiting Review`;
85
- statusEmoji = '\ud83d\udcca'; // 📊
86
- break;
87
- default:
88
- statusLabel = 'Unknown';
89
- statusEmoji = '\u2753';
90
- }
91
- }
92
- else {
93
- statusLabel = 'No Session';
94
- statusEmoji = '\u2b1c'; // white square
95
- }
96
- lines.push(`**Status:** ${statusEmoji} ${statusLabel}`);
97
- lines.push(`**Created:** ${formatDate(feature.createdAt)}`);
98
- if (feature.completedAt) {
99
- lines.push(`**Completed:** ${formatDate(feature.completedAt)}`);
100
- }
101
- if (feature.gitRepoUrl) {
102
- lines.push(`**Repository:** ${feature.gitRepoUrl}`);
103
- }
104
- if (feature.gitBranch) {
105
- lines.push(`**Branch:** ${feature.gitBranch}`);
106
- }
107
- lines.push('');
108
- // Description
109
- if (feature.description) {
110
- lines.push('## Description');
111
- lines.push('');
112
- lines.push(feature.description);
113
- lines.push('');
114
- }
115
- // Scenario Progress
116
- const nonClosedItems = checklistItems.filter((i) => i.status !== 'closed');
117
- const verifiedCount = checklistItems.filter((i) => i.status === 'verified').length;
118
- lines.push(`## Scenario Progress (${verifiedCount}/${nonClosedItems.length} verified)`);
119
- lines.push('');
120
- // Sort items by position
121
- const sortedItems = [...checklistItems].sort((a, b) => a.position - b.position);
122
- for (const item of sortedItems) {
123
- const emoji = getStatusEmoji(item.status);
124
- const isClosed = item.status === 'closed';
125
- const prefix = isClosed ? '~~' : '';
126
- const suffix = isClosed ? '~~' : '';
127
- lines.push(`### ${emoji} ${prefix}${item.description}${suffix}`);
128
- lines.push('');
129
- if (item.status === 'verified' && item.verifiedAt) {
130
- lines.push(`- **Verified:** ${formatDate(item.verifiedAt)}`);
131
- }
132
- if (item.status === 'blocked' && item.blockedAt) {
133
- lines.push(`- **Blocked:** ${formatDate(item.blockedAt)}`);
134
- if (item.blockedReason) {
135
- lines.push(`- **Reason:** ${item.blockedReason}`);
136
- }
137
- }
138
- if (item.status === 'closed' && item.closedAt) {
139
- lines.push(`- **Closed:** ${formatDate(item.closedAt)}`);
140
- if (item.canceledReason) {
141
- lines.push(`- **Reason:** ${item.canceledReason}`);
142
- }
143
- }
144
- if (item.status === 'incomplete') {
145
- lines.push(`- **Status:** Incomplete - requires further work`);
146
- }
147
- // Link to session if available
148
- if (item.browserSessionId) {
149
- lines.push(`- **Session:** ${item.browserSessionId}`);
150
- // Find the session and add trace link
151
- const session = sessions.find((s) => s.id === item.browserSessionId);
152
- if (session) {
153
- if (session.agentResponse) {
154
- lines.push(`- **Summary:** ${session.agentResponse}`);
155
- }
156
- if (session.traceUrl) {
157
- lines.push(`- **Trace:** [View in Playwright](${buildTraceViewerUrl(session.traceUrl)})`);
158
- }
159
- }
160
- }
161
- lines.push('');
162
- }
163
- // Blocking Issues section
164
- const blockedItems = checklistItems.filter((i) => i.status === 'blocked');
165
- if (blockedItems.length > 0) {
166
- lines.push('## Blocking Issues');
167
- lines.push('');
168
- for (const item of blockedItems) {
169
- lines.push(`- **${item.description}**: ${item.blockedReason || 'No reason provided'}`);
170
- }
171
- lines.push('');
172
- }
173
- else {
174
- lines.push('## Blocking Issues');
175
- lines.push('');
176
- lines.push('None');
177
- lines.push('');
178
- }
179
- // All Verification Sessions table
180
- if (sessions.length > 0) {
181
- lines.push('## All Verification Sessions');
182
- lines.push('');
183
- lines.push('| Session | Scenario | Status | Duration | Date |');
184
- lines.push('|---------|----------|--------|----------|------|');
185
- for (const session of sessions) {
186
- const linkedItem = session.checklistItemId
187
- ? checklistItems.find((i) => i.id === session.checklistItemId)
188
- : null;
189
- const itemDesc = linkedItem
190
- ? linkedItem.description.substring(0, 30) +
191
- (linkedItem.description.length > 30 ? '...' : '')
192
- : 'N/A';
193
- const statusEmoji = session.status === 'completed'
194
- ? '\u2705'
195
- : session.status === 'failed'
196
- ? '\u274c'
197
- : '\ud83d\udd04';
198
- lines.push(`| ${session.id} | ${itemDesc} | ${statusEmoji} ${session.status} | ${formatDuration(session.durationMs)} | ${formatDate(session.createdAt)} |`);
199
- }
200
- lines.push('');
201
- }
202
- return lines.join('\n');
203
- }
204
- //# sourceMappingURL=featureReportGenerator.js.map
1
+ function _0x1bec(){const _0x4edc5=['11gCDYJo','QFbnl','hQyyE','pending','##\x20Blocking\x20Issues','HKzdk','checklistItemId','blockedAt','No\x20reason\x20provided','-\x20**Blocked:**\x20','closedAt','52zTmvQH','floor','status','filter','pAPAL','vksNc','gitBranch','nQuJK','9562KtgfgQ','sort','None','**Branch:**\x20','canceledReason','completedAt','-\x20**Trace:**\x20[View\x20in\x20Playwright](','failed','push','1158ridbgu','ready','Completed','rPAgZ','completed','iteration','zUYNd','977841fZxhiL','**Repository:**\x20','verifiedAt','-\x20**Closed:**\x20','blockedReason','description','-\x20**Reason:**\x20','Session\x20','pPlAe','length','12755310BOdOtU','4wfhbqU','\x20verified)','THrOS','\x20|\x20','7620440cdcXNn','**Created:**\x20','gitRepoUrl','###\x20','currentSession','63jHWUGk','19202sVcyUa','uiypC','9478572lBSAGS','traceUrl','numeric','closed','UbhST','join','|\x20Session\x20|\x20Scenario\x20|\x20Status\x20|\x20Duration\x20|\x20Date\x20|','N/A','9CtlJGZ','verified','blocked','toLocaleDateString','150840PWDzcn'];_0x1bec=function(){return _0x4edc5;};return _0x1bec();}function _0x4fde(_0x2bc128,_0x271a4d){_0x2bc128=_0x2bc128-0x1c2;const _0x1bec51=_0x1bec();let _0x4fde89=_0x1bec51[_0x2bc128];return _0x4fde89;}(function(_0x13b85a,_0xeb426f){const _0xe63c15=_0x4fde,_0x41ff4f=_0x13b85a();while(!![]){try{const _0x158864=parseInt(_0xe63c15(0x205))/0x1*(parseInt(_0xe63c15(0x206))/0x2)+parseInt(_0xe63c15(0x1f1))/0x3*(-parseInt(_0xe63c15(0x1fc))/0x4)+-parseInt(_0xe63c15(0x200))/0x5+parseInt(_0xe63c15(0x1ea))/0x6*(parseInt(_0xe63c15(0x1e1))/0x7)+-parseInt(_0xe63c15(0x1cd))/0x8*(parseInt(_0xe63c15(0x1c9))/0x9)+parseInt(_0xe63c15(0x1fb))/0xa*(-parseInt(_0xe63c15(0x1ce))/0xb)+parseInt(_0xe63c15(0x208))/0xc*(parseInt(_0xe63c15(0x1d9))/0xd);if(_0x158864===_0xeb426f)break;else _0x41ff4f['push'](_0x41ff4f['shift']());}catch(_0x3a320d){_0x41ff4f['push'](_0x41ff4f['shift']());}}}(_0x1bec,0xd7b94));export function buildTraceViewerUrl(_0x13d601){const _0x2a97cf=encodeURIComponent(_0x13d601);return'https://trace.playwright.dev/?trace='+_0x2a97cf;}function getStatusEmoji(_0x37ecb6){const _0x21a3d1=_0x4fde,_0x153bf3={'THrOS':'verified','icNnX':'in_progress','GRvhM':'incomplete','rPAgZ':_0x21a3d1(0x1c4)};switch(_0x37ecb6){case _0x153bf3[_0x21a3d1(0x1fe)]:case _0x21a3d1(0x1ee):return'✅';case _0x21a3d1(0x1d1):case _0x153bf3['icNnX']:return'🔄';case _0x153bf3['GRvhM']:return'🟠';case'blocked':return'🛑';case _0x153bf3[_0x21a3d1(0x1ed)]:return'⛔';default:return'❓';}}function formatDuration(_0x95e325){const _0x436a60=_0x4fde,_0xa88535={'dZKzQ':function(_0x2c4646,_0x22e13a){return _0x2c4646===_0x22e13a;},'HKzdk':function(_0x46ac5e,_0x290bd7){return _0x46ac5e<_0x290bd7;},'JmGOP':function(_0x35eccb,_0x36992a){return _0x35eccb/_0x36992a;},'uvcdq':function(_0x328e69,_0x2a2532){return _0x328e69<_0x2a2532;},'zUYNd':function(_0x5b13d3,_0xff890){return _0x5b13d3%_0xff890;}};if(_0xa88535['dZKzQ'](_0x95e325,null)||_0xa88535['dZKzQ'](_0x95e325,undefined))return _0x436a60(0x1c8);if(_0xa88535[_0x436a60(0x1d3)](_0x95e325,0x3e8))return _0x95e325+'ms';const _0x12b66f=Math['floor'](_0xa88535['JmGOP'](_0x95e325,0x3e8));if(_0xa88535['uvcdq'](_0x12b66f,0x3c))return _0x12b66f+'s';const _0x1b3710=Math[_0x436a60(0x1da)](_0xa88535['JmGOP'](_0x12b66f,0x3c)),_0x49c7fd=_0xa88535[_0x436a60(0x1f0)](_0x12b66f,0x3c);return _0x1b3710+'m\x20'+_0x49c7fd+'s';}function formatDate(_0x2139da){const _0x59c0bf=_0x4fde,_0x45fed0={'hQyyE':_0x59c0bf(0x1c3),'ZoWkr':'short'};if(!_0x2139da)return _0x59c0bf(0x1c8);return new Date(_0x2139da)[_0x59c0bf(0x1cc)]('en-US',{'year':_0x45fed0[_0x59c0bf(0x1d0)],'month':_0x45fed0['ZoWkr'],'day':_0x59c0bf(0x1c3)});}export function generateFeatureReport(_0x5140f5){const _0x5ace28=_0x4fde,_0x3bfee4={'SOkBD':_0x5ace28(0x1eb),'pAPAL':_0x5ace28(0x1ee),'nQuJK':function(_0x7209f0,_0x18fe05){return _0x7209f0(_0x18fe05);},'UbhST':_0x5ace28(0x1c4),'vksNc':function(_0x779520,_0x291d4b){return _0x779520===_0x291d4b;},'MHSfB':function(_0x4352c3,_0x3b7a62){return _0x4352c3(_0x3b7a62);},'QFbnl':'##\x20Blocking\x20Issues','QDpdb':_0x5ace28(0x1e3),'fVUSW':'##\x20All\x20Verification\x20Sessions','pPlAe':_0x5ace28(0x1c7),'uiypC':'|---------|----------|--------|----------|------|','gRsVU':function(_0x1e3439,_0x58e689){return _0x1e3439===_0x58e689;},'YmKNf':_0x5ace28(0x1e8),'EIUed':function(_0xdb5c79,_0x4cf33f){return _0xdb5c79(_0x4cf33f);}},{feature:_0x29cdc6,stats:_0x59518b,checklistItems:_0x448e91,sessions:_0x44ff7b}=_0x5140f5,_0x1fde71=[];_0x1fde71[_0x5ace28(0x1e9)]('#\x20Feature\x20Review\x20Report:\x20'+_0x29cdc6['name']),_0x1fde71[_0x5ace28(0x1e9)]('');let _0x2daf4b,_0x1f450a;if(_0x29cdc6['completedAt'])_0x2daf4b=_0x5ace28(0x1ec),_0x1f450a='✅';else{if(_0x29cdc6['currentSession']){const _0x20c6ed=_0x29cdc6['currentSession'][_0x5ace28(0x1db)];switch(_0x20c6ed){case _0x3bfee4['SOkBD']:_0x2daf4b=_0x5ace28(0x1f8)+_0x29cdc6[_0x5ace28(0x204)]['iteration']+':\x20Ready',_0x1f450a='▶️';break;case'in_progress':_0x2daf4b='Session\x20'+_0x29cdc6[_0x5ace28(0x204)]['iteration']+':\x20In\x20Progress',_0x1f450a='🔄';break;case _0x3bfee4['pAPAL']:_0x2daf4b='Session\x20'+_0x29cdc6['currentSession'][_0x5ace28(0x1ef)]+':\x20Awaiting\x20Review',_0x1f450a='📊';break;default:_0x2daf4b='Unknown',_0x1f450a='❓';}}else _0x2daf4b='No\x20Session',_0x1f450a='⬜';}_0x1fde71[_0x5ace28(0x1e9)]('**Status:**\x20'+_0x1f450a+'\x20'+_0x2daf4b),_0x1fde71['push'](_0x5ace28(0x201)+_0x3bfee4[_0x5ace28(0x1e0)](formatDate,_0x29cdc6['createdAt']));_0x29cdc6[_0x5ace28(0x1e6)]&&_0x1fde71[_0x5ace28(0x1e9)]('**Completed:**\x20'+_0x3bfee4[_0x5ace28(0x1e0)](formatDate,_0x29cdc6['completedAt']));_0x29cdc6[_0x5ace28(0x202)]&&_0x1fde71[_0x5ace28(0x1e9)](_0x5ace28(0x1f2)+_0x29cdc6['gitRepoUrl']);_0x29cdc6['gitBranch']&&_0x1fde71['push'](_0x5ace28(0x1e4)+_0x29cdc6[_0x5ace28(0x1df)]);_0x1fde71[_0x5ace28(0x1e9)]('');_0x29cdc6[_0x5ace28(0x1f6)]&&(_0x1fde71['push']('##\x20Description'),_0x1fde71['push'](''),_0x1fde71['push'](_0x29cdc6['description']),_0x1fde71[_0x5ace28(0x1e9)](''));const _0x4b3a4a=_0x448e91['filter'](_0x5f3e11=>_0x5f3e11[_0x5ace28(0x1db)]!==_0x5ace28(0x1c4)),_0x22286d=_0x448e91[_0x5ace28(0x1dc)](_0x1b8701=>_0x1b8701['status']===_0x5ace28(0x1ca))['length'];_0x1fde71['push']('##\x20Scenario\x20Progress\x20('+_0x22286d+'/'+_0x4b3a4a[_0x5ace28(0x1fa)]+_0x5ace28(0x1fd)),_0x1fde71[_0x5ace28(0x1e9)]('');const _0x572ad0=[..._0x448e91][_0x5ace28(0x1e2)]((_0x1d69be,_0x1d4361)=>_0x1d69be['position']-_0x1d4361['position']);for(const _0x2f5686 of _0x572ad0){const _0x3311f8=getStatusEmoji(_0x2f5686[_0x5ace28(0x1db)]),_0x36ddf4=_0x2f5686['status']===_0x3bfee4[_0x5ace28(0x1c5)],_0x3042a1=_0x36ddf4?'~~':'',_0x190a2c=_0x36ddf4?'~~':'';_0x1fde71['push'](_0x5ace28(0x203)+_0x3311f8+'\x20'+_0x3042a1+_0x2f5686['description']+_0x190a2c),_0x1fde71[_0x5ace28(0x1e9)]('');_0x2f5686['status']===_0x5ace28(0x1ca)&&_0x2f5686['verifiedAt']&&_0x1fde71[_0x5ace28(0x1e9)]('-\x20**Verified:**\x20'+formatDate(_0x2f5686[_0x5ace28(0x1f3)]));_0x3bfee4[_0x5ace28(0x1de)](_0x2f5686[_0x5ace28(0x1db)],_0x5ace28(0x1cb))&&_0x2f5686['blockedAt']&&(_0x1fde71[_0x5ace28(0x1e9)](_0x5ace28(0x1d7)+_0x3bfee4['MHSfB'](formatDate,_0x2f5686[_0x5ace28(0x1d5)])),_0x2f5686['blockedReason']&&_0x1fde71[_0x5ace28(0x1e9)]('-\x20**Reason:**\x20'+_0x2f5686[_0x5ace28(0x1f5)]));_0x2f5686[_0x5ace28(0x1db)]===_0x3bfee4['UbhST']&&_0x2f5686[_0x5ace28(0x1d8)]&&(_0x1fde71['push'](_0x5ace28(0x1f4)+formatDate(_0x2f5686['closedAt'])),_0x2f5686[_0x5ace28(0x1e5)]&&_0x1fde71[_0x5ace28(0x1e9)](_0x5ace28(0x1f7)+_0x2f5686[_0x5ace28(0x1e5)]));_0x3bfee4[_0x5ace28(0x1de)](_0x2f5686[_0x5ace28(0x1db)],'incomplete')&&_0x1fde71['push']('-\x20**Status:**\x20Incomplete\x20-\x20requires\x20further\x20work');if(_0x2f5686['browserSessionId']){_0x1fde71['push']('-\x20**Session:**\x20'+_0x2f5686['browserSessionId']);const _0x4b63f1=_0x44ff7b['find'](_0x2171c8=>_0x2171c8['id']===_0x2f5686['browserSessionId']);_0x4b63f1&&(_0x4b63f1['agentResponse']&&_0x1fde71['push']('-\x20**Summary:**\x20'+_0x4b63f1['agentResponse']),_0x4b63f1[_0x5ace28(0x1c2)]&&_0x1fde71[_0x5ace28(0x1e9)](_0x5ace28(0x1e7)+_0x3bfee4[_0x5ace28(0x1e0)](buildTraceViewerUrl,_0x4b63f1['traceUrl'])+')'));}_0x1fde71['push']('');}const _0x5d39a3=_0x448e91[_0x5ace28(0x1dc)](_0x1ff7eb=>_0x1ff7eb['status']===_0x5ace28(0x1cb));if(_0x5d39a3['length']>0x0){_0x1fde71[_0x5ace28(0x1e9)](_0x3bfee4[_0x5ace28(0x1cf)]),_0x1fde71[_0x5ace28(0x1e9)]('');for(const _0x40843c of _0x5d39a3){_0x1fde71[_0x5ace28(0x1e9)]('-\x20**'+_0x40843c[_0x5ace28(0x1f6)]+'**:\x20'+(_0x40843c['blockedReason']||_0x5ace28(0x1d6)));}_0x1fde71[_0x5ace28(0x1e9)]('');}else _0x1fde71['push'](_0x5ace28(0x1d2)),_0x1fde71['push'](''),_0x1fde71['push'](_0x3bfee4['QDpdb']),_0x1fde71['push']('');if(_0x44ff7b['length']>0x0){_0x1fde71[_0x5ace28(0x1e9)](_0x3bfee4['fVUSW']),_0x1fde71[_0x5ace28(0x1e9)](''),_0x1fde71[_0x5ace28(0x1e9)](_0x3bfee4[_0x5ace28(0x1f9)]),_0x1fde71[_0x5ace28(0x1e9)](_0x3bfee4[_0x5ace28(0x207)]);for(const _0x58ccdc of _0x44ff7b){const _0x3b9100=_0x58ccdc['checklistItemId']?_0x448e91['find'](_0x4a343c=>_0x4a343c['id']===_0x58ccdc[_0x5ace28(0x1d4)]):null,_0x56cd1e=_0x3b9100?_0x3b9100['description']['substring'](0x0,0x1e)+(_0x3b9100['description'][_0x5ace28(0x1fa)]>0x1e?'...':''):_0x5ace28(0x1c8),_0x360428=_0x58ccdc[_0x5ace28(0x1db)]===_0x3bfee4[_0x5ace28(0x1dd)]?'✅':_0x3bfee4['gRsVU'](_0x58ccdc['status'],_0x3bfee4['YmKNf'])?'❌':'🔄';_0x1fde71['push']('|\x20'+_0x58ccdc['id']+_0x5ace28(0x1ff)+_0x56cd1e+'\x20|\x20'+_0x360428+'\x20'+_0x58ccdc['status']+_0x5ace28(0x1ff)+_0x3bfee4['EIUed'](formatDuration,_0x58ccdc['durationMs'])+_0x5ace28(0x1ff)+_0x3bfee4['nQuJK'](formatDate,_0x58ccdc['createdAt'])+'\x20|');}_0x1fde71[_0x5ace28(0x1e9)]('');}return _0x1fde71[_0x5ace28(0x1c6)]('\x0a');}