codemie-test-harness 0.1.168__py3-none-any.whl → 0.1.169__py3-none-any.whl

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.

Potentially problematic release.


This version of codemie-test-harness might be problematic. Click here for more details.

@@ -0,0 +1,367 @@
1
+ import logging
2
+
3
+ from playwright.sync_api import Page, expect
4
+
5
+ logger = logging.getLogger(__name__)
6
+
7
+
8
+ class AIAssistantGeneratorPage:
9
+ """
10
+ Page Object Model for the Generate Assistant with AI form.
11
+
12
+ This form allows users to create AI assistants by describing their requirements
13
+ and configuring various options including tool integrations.
14
+ """
15
+
16
+ def __init__(self, page: Page):
17
+ """
18
+ Initialize the AI Assistant Generator page object.
19
+
20
+ Args:
21
+ page: Playwright page instance
22
+ """
23
+ self.page = page
24
+ self._setup_locators()
25
+
26
+ def _setup_locators(self) -> None:
27
+ """Define all locators for the AI Assistant Generator form based on actual HTML structure."""
28
+
29
+ # Modal container
30
+ self.modal_container = self.page.locator(".popup").filter(
31
+ has_text="Generate Assistant with AI"
32
+ )
33
+
34
+ # Header elements
35
+ self.modal_header = self.modal_container.locator(".popup-header.withBorder")
36
+ self.modal_title = self.modal_header.locator("h4")
37
+ self.close_button = self.modal_header.locator(
38
+ 'button[aria-label="Close popup"]'
39
+ )
40
+
41
+ # Modal body
42
+ self.modal_body = self.modal_container.locator(".popup-body")
43
+
44
+ # Description elements - Updated based on actual structure
45
+ self.description_text = self.modal_body.locator("p").first
46
+ self.assistant_description_label = self.modal_body.locator("p").nth(1)
47
+
48
+ # Main textarea - Updated with actual name attribute
49
+ self.assistant_description_textarea = (
50
+ self.modal_body.locator('textarea[name="ai_generation_prompt"]')
51
+ .or_(self.modal_body.locator(".textarea-wrapper textarea"))
52
+ .or_(self.modal_body.locator("textarea.textarea"))
53
+ )
54
+
55
+ # Checkbox elements - Updated with actual IDs
56
+ self.do_not_show_checkbox = (
57
+ self.modal_body.locator('input#dont_show[type="checkbox"]')
58
+ .or_(self.modal_body.locator('input[name="dont_show"]'))
59
+ .or_(self.modal_body.locator('.p-checkbox input[type="checkbox"]'))
60
+ )
61
+ self.do_not_show_label = self.modal_body.locator('label[for="dont_show"]')
62
+
63
+ # Include tools toggle - Updated with actual ID
64
+ self.include_tools_toggle = (
65
+ self.modal_body.locator('input#include_tools[type="checkbox"]')
66
+ .or_(self.modal_body.locator('input[name="include_tools"]'))
67
+ .or_(self.modal_body.locator('.switch-wrapper input[type="checkbox"]'))
68
+ )
69
+ self.include_tools_label = self.modal_body.locator(".switch-wrapper .label")
70
+
71
+ # Action buttons - Updated based on actual button classes
72
+ self.create_manually_button = (
73
+ self.modal_body.locator(
74
+ 'button.button.secondary:has-text("Create Manualy")'
75
+ )
76
+ .or_(self.modal_body.locator('button:has-text("Create Manualy")'))
77
+ .or_(self.modal_body.locator(".button.secondary"))
78
+ )
79
+ self.generate_with_ai_button = (
80
+ self.modal_body.locator(
81
+ 'button.button.primary:has-text("Generate with AI")'
82
+ )
83
+ .or_(self.modal_body.locator('button:has-text("Generate with AI")'))
84
+ .or_(self.modal_body.locator(".button.primary"))
85
+ )
86
+
87
+ # Note text - Updated based on actual structure
88
+ self.integration_note = self.modal_body.locator(".text-text-secondary.text-xs")
89
+ self.info_icon = self.modal_body.locator(".flex.w-full.px-2 svg").first
90
+
91
+ # Navigation and state methods
92
+
93
+ def wait_for_modal_to_load(self, timeout: float = 10000) -> None:
94
+ """
95
+ Wait for the AI Assistant Generator modal to be fully loaded and visible.
96
+
97
+ Args:
98
+ timeout: Maximum time to wait in milliseconds
99
+ """
100
+ logger.info("Waiting for AI Assistant Generator modal to load")
101
+ expect(self.modal_container).to_be_visible(timeout=timeout)
102
+ expect(self.modal_title).to_be_visible()
103
+ expect(self.assistant_description_textarea).to_be_visible()
104
+ logger.info("AI Assistant Generator modal loaded successfully")
105
+
106
+ def is_modal_visible(self) -> bool:
107
+ """
108
+ Check if the AI Assistant Generator modal is currently visible.
109
+
110
+ Returns:
111
+ True if modal is visible, False otherwise
112
+ """
113
+ return self.modal_container.is_visible()
114
+
115
+ def close_modal(self) -> None:
116
+ """Close the AI Assistant Generator modal using the close button."""
117
+ logger.info("Closing AI Assistant Generator modal")
118
+ self.close_button.click()
119
+ expect(self.modal_container).not_to_be_visible()
120
+ logger.info("AI Assistant Generator modal closed successfully")
121
+
122
+ # Form interaction methods
123
+
124
+ def enter_assistant_description(self, description: str) -> None:
125
+ """
126
+ Enter description text in the assistant description textarea.
127
+
128
+ Args:
129
+ description: The assistant description text to enter
130
+ """
131
+ logger.info(f"Entering assistant description: {description[:50]}...")
132
+ self.assistant_description_textarea.click()
133
+ self.assistant_description_textarea.clear()
134
+ self.assistant_description_textarea.fill(description)
135
+
136
+ # Verify the text was entered correctly
137
+ expect(self.assistant_description_textarea).to_have_value(description)
138
+ logger.info("Assistant description entered successfully")
139
+
140
+ def get_assistant_description(self) -> str:
141
+ """
142
+ Get the current value of the assistant description textarea.
143
+
144
+ Returns:
145
+ Current text value in the description textarea
146
+ """
147
+ return self.assistant_description_textarea.input_value()
148
+
149
+ def toggle_do_not_show_popup(self, enabled: bool = True) -> None:
150
+ """
151
+ Toggle the "Do not show this popup" checkbox.
152
+
153
+ Args:
154
+ enabled: True to check the checkbox, False to uncheck
155
+ """
156
+ logger.info(f"Setting 'Do not show popup' to: {enabled}")
157
+
158
+ if enabled and not self.do_not_show_checkbox.is_checked():
159
+ self.do_not_show_checkbox.check()
160
+ elif not enabled and self.do_not_show_checkbox.is_checked():
161
+ self.do_not_show_checkbox.uncheck()
162
+
163
+ # Verify the state
164
+ if enabled:
165
+ expect(self.do_not_show_checkbox).to_be_checked()
166
+ else:
167
+ expect(self.do_not_show_checkbox).not_to_be_checked()
168
+
169
+ logger.info(f"'Do not show popup' checkbox set to: {enabled}")
170
+
171
+ def is_do_not_show_popup_checked(self) -> bool:
172
+ """
173
+ Check if the "Do not show this popup" checkbox is checked.
174
+
175
+ Returns:
176
+ True if checkbox is checked, False otherwise
177
+ """
178
+ return self.do_not_show_checkbox.is_checked()
179
+
180
+ def toggle_include_tools(self, enabled: bool = True) -> None:
181
+ """
182
+ Toggle the "Include Tools" option.
183
+
184
+ Args:
185
+ enabled: True to enable tools inclusion, False to disable
186
+ """
187
+ logger.info(f"Setting 'Include Tools' to: {enabled}")
188
+
189
+ if enabled and not self.include_tools_toggle.is_checked():
190
+ self.include_tools_toggle.check()
191
+ elif not enabled and self.include_tools_toggle.is_checked():
192
+ self.include_tools_toggle.uncheck()
193
+
194
+ # Verify the state
195
+ if enabled:
196
+ expect(self.include_tools_toggle).to_be_checked()
197
+ else:
198
+ expect(self.include_tools_toggle).not_to_be_checked()
199
+
200
+ logger.info(f"'Include Tools' toggle set to: {enabled}")
201
+
202
+ def is_include_tools_enabled(self) -> bool:
203
+ """
204
+ Check if the "Include Tools" toggle is enabled.
205
+
206
+ Returns:
207
+ True if toggle is enabled, False otherwise
208
+ """
209
+ return self.include_tools_toggle.is_checked()
210
+
211
+ # Action methods
212
+
213
+ def click_create_manually(self) -> None:
214
+ """Click the 'Create Manually' button."""
215
+ logger.info("Clicking 'Create Manually' button")
216
+ expect(self.create_manually_button).to_be_enabled()
217
+ self.create_manually_button.click()
218
+ logger.info("'Create Manually' button clicked")
219
+
220
+ def click_generate_with_ai(self) -> None:
221
+ """Click the 'Generate with AI' button."""
222
+ logger.info("Clicking 'Generate with AI' button")
223
+ expect(self.generate_with_ai_button).to_be_enabled()
224
+ self.generate_with_ai_button.click()
225
+ logger.info("'Generate with AI' button clicked")
226
+
227
+ # Validation methods
228
+
229
+ def is_generate_button_enabled(self) -> bool:
230
+ """
231
+ Check if the 'Generate with AI' button is enabled.
232
+
233
+ Returns:
234
+ True if button is enabled, False otherwise
235
+ """
236
+ return self.generate_with_ai_button.is_enabled()
237
+
238
+ def is_create_manually_button_enabled(self) -> bool:
239
+ """
240
+ Check if the 'Create Manually' button is enabled.
241
+
242
+ Returns:
243
+ True if button is enabled, False otherwise
244
+ """
245
+ return self.create_manually_button.is_enabled()
246
+
247
+ def validate_form_elements_visible(self) -> None:
248
+ """Validate that all expected form elements are visible and accessible."""
249
+ logger.info("Validating AI Assistant Generator form elements visibility")
250
+
251
+ # Check modal structure
252
+ expect(self.modal_container).to_be_visible()
253
+ expect(self.modal_title).to_be_visible()
254
+ expect(self.close_button).to_be_visible()
255
+
256
+ # Check form elements
257
+ expect(self.assistant_description_label).to_be_visible()
258
+ expect(self.assistant_description_textarea).to_be_visible()
259
+ expect(self.do_not_show_label).to_be_visible()
260
+ expect(self.do_not_show_checkbox).to_be_visible()
261
+ expect(self.include_tools_label).to_be_visible()
262
+ expect(self.include_tools_toggle).to_be_visible()
263
+
264
+ # Check action buttons
265
+ expect(self.create_manually_button).to_be_visible()
266
+ expect(self.generate_with_ai_button).to_be_visible()
267
+
268
+ # Check note text
269
+ expect(self.integration_note).to_be_visible()
270
+
271
+ logger.info("All form elements are visible and accessible")
272
+
273
+ def validate_textarea_placeholder(self) -> None:
274
+ """Validate that the textarea has the expected placeholder text."""
275
+ placeholder_text = self.assistant_description_textarea.get_attribute(
276
+ "placeholder"
277
+ )
278
+ expected_text = "For example: I need a project assistant that helps track deadlines, work with Jira and help with business requirements"
279
+
280
+ assert expected_text in placeholder_text, (
281
+ f"Placeholder text mismatch. Expected: {expected_text}, Got: {placeholder_text}"
282
+ )
283
+ logger.info("Textarea placeholder validation passed")
284
+
285
+ def verify_modal_title(self) -> None:
286
+ """Verify the modal has the correct title."""
287
+ expect(self.modal_title).to_have_text("Generate Assistant with AI")
288
+ logger.info("Modal title verification passed")
289
+
290
+ def verify_description_text(self) -> None:
291
+ """Verify the main description text is present."""
292
+ expect(self.description_text).to_contain_text("Describe your ideal assistant")
293
+ logger.info("Description text verification passed")
294
+
295
+ def verify_prompt_label(self) -> None:
296
+ """Verify the prompt question is displayed."""
297
+ expect(self.assistant_description_label).to_have_text(
298
+ "What should your assistant do?"
299
+ )
300
+ logger.info("Prompt label verification passed")
301
+
302
+ def verify_note_text(self) -> None:
303
+ """Verify the note about tool integrations."""
304
+ expect(self.integration_note).to_contain_text(
305
+ "Note: Please select tool integrations after generation"
306
+ )
307
+ logger.info("Note text verification passed")
308
+
309
+ # Composite action methods
310
+
311
+ def fill_and_generate_assistant(
312
+ self,
313
+ description: str,
314
+ include_tools: bool = True,
315
+ do_not_show_again: bool = False,
316
+ ) -> None:
317
+ """
318
+ Complete workflow to fill the form and generate an AI assistant.
319
+
320
+ Args:
321
+ description: Assistant description text
322
+ include_tools: Whether to include tools in the assistant
323
+ do_not_show_again: Whether to check "do not show popup" option
324
+ """
325
+ logger.info("Starting complete assistant generation workflow")
326
+
327
+ # Wait for modal to be ready
328
+ self.wait_for_modal_to_load()
329
+
330
+ # Fill form fields
331
+ self.enter_assistant_description(description)
332
+ self.toggle_include_tools(include_tools)
333
+ self.toggle_do_not_show_popup(do_not_show_again)
334
+
335
+ # Generate the assistant
336
+ self.click_generate_with_ai()
337
+
338
+ logger.info("Assistant generation workflow completed")
339
+
340
+ def fill_and_create_manually(
341
+ self,
342
+ description: str,
343
+ include_tools: bool = True,
344
+ do_not_show_again: bool = False,
345
+ ) -> None:
346
+ """
347
+ Complete workflow to fill the form and create assistant manually.
348
+
349
+ Args:
350
+ description: Assistant description text
351
+ include_tools: Whether to include tools in the assistant
352
+ do_not_show_again: Whether to check "do not show popup" option
353
+ """
354
+ logger.info("Starting manual assistant creation workflow")
355
+
356
+ # Wait for modal to be ready
357
+ self.wait_for_modal_to_load()
358
+
359
+ # Fill form fields
360
+ self.enter_assistant_description(description)
361
+ self.toggle_include_tools(include_tools)
362
+ self.toggle_do_not_show_popup(do_not_show_again)
363
+
364
+ # Create manually
365
+ self.click_create_manually()
366
+
367
+ logger.info("Manual assistant creation workflow completed")
@@ -3,8 +3,8 @@ import re
3
3
  from playwright.sync_api import expect
4
4
  from reportportal_client import step
5
5
 
6
- from codemie_test_harness.tests.ui.pageobject.components.pop_up import PopUp
7
6
  from codemie_test_harness.tests.ui.pageobject.components.menu import Menu
7
+ from codemie_test_harness.tests.ui.pageobject.components.pop_up import PopUp
8
8
 
9
9
 
10
10
  class BasePage:
@@ -167,7 +167,7 @@ class BasePage:
167
167
  expect(self.pop_up.menu).to_have_text("New CodeMie Release")
168
168
  expect(self.pop_up.body).to_have_text(
169
169
  re.compile(
170
- r"Great news! We've rolled out new CodeMie version 2.\d.\d+ to enhance your experience. Take a moment to "
170
+ r"Great news! We've rolled out new CodeMie version \d.\d.\d+ to enhance your experience. Take a moment to "
171
171
  "explore what's new and discover how these changes can benefit you! Please review Release Notes!"
172
172
  )
173
173
  )
@@ -0,0 +1,18 @@
1
+ [pytest]
2
+ addopts = -v --tb=short
3
+ markers =
4
+ ui: UI test cases
5
+ assistant_ui: Assistant-related UI test cases
6
+ workflow_ui: Workflow-related UI test cases
7
+ slow: Slow-running test cases
8
+ critical: Critical path test cases
9
+ smoke: Smoke test cases
10
+ filterwarnings =
11
+ ignore::pytest.PytestUnknownMarkWarning
12
+ ignore::urllib3.exceptions.InsecureRequestWarning
13
+ ignore::pydantic.warnings.PydanticDeprecatedSince20
14
+ ignore::DeprecationWarning
15
+ testpaths = .
16
+ python_files = test_*.py
17
+ python_classes = Test*
18
+ python_functions = test_*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: codemie-test-harness
3
- Version: 0.1.168
3
+ Version: 0.1.169
4
4
  Summary: Autotest for CodeMie backend and UI
5
5
  Author: Anton Yeromin
6
6
  Author-email: anton_yeromin@epam.com
@@ -13,7 +13,7 @@ Requires-Dist: aws-assume-role-lib (>=2.10.0,<3.0.0)
13
13
  Requires-Dist: boto3 (>=1.39.8,<2.0.0)
14
14
  Requires-Dist: click (>=8.1.7,<9.0.0)
15
15
  Requires-Dist: codemie-plugins (>=0.1.123,<0.2.0)
16
- Requires-Dist: codemie-sdk-python (==0.1.168)
16
+ Requires-Dist: codemie-sdk-python (==0.1.169)
17
17
  Requires-Dist: pytest (>=8.4.1,<9.0.0)
18
18
  Requires-Dist: pytest-playwright (>=0.7.0,<0.8.0)
19
19
  Requires-Dist: pytest-reportportal (>=5.5.2,<6.0.0)
@@ -101,6 +101,7 @@ codemie_test_harness/tests/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
101
101
  codemie_test_harness/tests/test_data/ado_test_plan_tools_test_data.py,sha256=Al5u4HNfrcoj-b072uEGsqUqjKqwXLGJXKQ0QeJT3PI,5778
102
102
  codemie_test_harness/tests/test_data/ado_wiki_tools_test_data.py,sha256=xvgEja5vE0l41sP4fE0stdFLQ0M201FWynOCEcRYufE,3188
103
103
  codemie_test_harness/tests/test_data/ado_work_item_tools_test_data.py,sha256=MHou6QGjufyX5t1oexnq2Y4UCjlE17eeyMuIz6Ml62s,5693
104
+ codemie_test_harness/tests/test_data/assistant_test_data.py,sha256=DRfungbLNwbFQf6qTNOVjR3l2v7fBDzgUq1v9fwXw78,6829
104
105
  codemie_test_harness/tests/test_data/cloud_tools_test_data.py,sha256=SWz-VTNcWteCvVupl2xksv4eEFkmtWMdRIqrZxjpFYk,6200
105
106
  codemie_test_harness/tests/test_data/codebase_tools_test_data.py,sha256=xbnIlDbiZTibGekrodmhO7bOg7kilsoKSlfHAhcmyIQ,3312
106
107
  codemie_test_harness/tests/test_data/data_management_tools_test_data.py,sha256=e5Cfqza3GUE3hRElm1bxgQO4PaN-jOiNd38OX9299Kc,2793
@@ -190,11 +191,15 @@ codemie_test_harness/tests/test_data/workflow/invalid_config/missing_required_to
190
191
  codemie_test_harness/tests/test_data/workflow/invalid_config/missing_required_tools_name.yaml,sha256=Xh6TKSAGZyD2-gCxaW7BRW_9-_7-5EQA75djCc3FwLI,263
191
192
  codemie_test_harness/tests/test_data/workflow_validation_messages.py,sha256=zg5BhMJ_tbzEeLSYJEnspHTuWar1qgoxqTfIXltlSPg,3282
192
193
  codemie_test_harness/tests/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
- codemie_test_harness/tests/ui/conftest.py,sha256=1b8s--q2sAXjqHZKFi075Yqpq-fKLXOMlHHibSHKNrU,2490
194
+ codemie_test_harness/tests/ui/assistants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
+ codemie_test_harness/tests/ui/assistants/test_create_assistant.py,sha256=8W7J4y4IVZhnqvoitDhLFCg2ut3NKnErfipULwT-azE,14556
196
+ codemie_test_harness/tests/ui/conftest.py,sha256=7u5eaLozXRzuB_a8NCm92sd5Axefs-UpVEg1mIPQ_r0,3436
194
197
  codemie_test_harness/tests/ui/pageobject/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
198
  codemie_test_harness/tests/ui/pageobject/assistants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
- codemie_test_harness/tests/ui/pageobject/assistants/assistants_page.py,sha256=wCg1jLVUl02szz_FGostVaOGe-QFzkE7ClBtD1HOHgg,6038
197
- codemie_test_harness/tests/ui/pageobject/base_page.py,sha256=a4jCnb633jyax2Cws4kJirCO2Y2eqHI_DnPT5XOFK2I,7471
199
+ codemie_test_harness/tests/ui/pageobject/assistants/assistants_page.py,sha256=pYUhVRGZhCVX5EILCTkqjvOBPfD9u2qc5Rsa54up5IA,6036
200
+ codemie_test_harness/tests/ui/pageobject/assistants/create_assistant_page.py,sha256=wwn-6vU43NYjbAokZmi6gxBnBApWNapkAkPGjBfjKYI,22502
201
+ codemie_test_harness/tests/ui/pageobject/assistants/generate_with_ai_modal.py,sha256=rsavzWxmawKzI4wHxixp49IN6m_ZUZNFTJTSnE8jBr8,13732
202
+ codemie_test_harness/tests/ui/pageobject/base_page.py,sha256=9sdQe14Oh7p475zswlgXGnM1WXzTB_x6OxlbVtzJ-U0,7472
198
203
  codemie_test_harness/tests/ui/pageobject/components/__init__.py,sha256=6scUFCL2StHbKIoNgGGZdpeDZUwbCrKIH7hwaskAB4E,577
199
204
  codemie_test_harness/tests/ui/pageobject/components/execution_history_row.py,sha256=aGHc5AOpGR0tlfmLQfk8272TN6TWiuiXHUcg6PtB1Iw,6499
200
205
  codemie_test_harness/tests/ui/pageobject/components/menu.py,sha256=llTWAbJHldo1-wY86k_2Dvs8iSEmMWzrw26AhQJ1kis,10501
@@ -214,6 +219,7 @@ codemie_test_harness/tests/ui/pageobject/workflows/workflow_executions_page.py,s
214
219
  codemie_test_harness/tests/ui/pageobject/workflows/workflow_template_details.py,sha256=6Su0yLA8wDybCPVE2WFhV6l6r_38aYaRY0mEYnLHlYg,3556
215
220
  codemie_test_harness/tests/ui/pageobject/workflows/workflow_templates_page.py,sha256=J5jxdZ2aQ9k15ghyRKYACxX2F9NiR6dXYBw0EaYlaN0,2645
216
221
  codemie_test_harness/tests/ui/pageobject/workflows/workflows_page.py,sha256=yqdaSTA4aUeD-8A9Or0OgJZhMr2tDvDWWP_f4uPL5dw,11186
222
+ codemie_test_harness/tests/ui/pytest.ini,sha256=5LM3ib1yTB4jUHrC8Ksas_k8Li6RBuuUTAWCPRx-4MY,554
217
223
  codemie_test_harness/tests/ui/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
218
224
  codemie_test_harness/tests/ui/workflows/test_create_workflow.py,sha256=zX_6-pcYGCLiU6FUAvP-uo3jXy0PEEPBc_eqbP0FLV0,10522
219
225
  codemie_test_harness/tests/ui/workflows/test_edit_workflow.py,sha256=RQIV5fSd3xv3tdGidpF8mMwkoHJ57Xn1HzeXnFq4eB0,12913
@@ -352,7 +358,7 @@ codemie_test_harness/tests/workflow/virtual_assistant_tools/servicenow/__init__.
352
358
  codemie_test_harness/tests/workflow/virtual_assistant_tools/servicenow/test_workflow_with_servicenow_tools.py,sha256=vq6tucNBxiNIQSmIj_pYiiPm0lipU9X3kzeCd6xEbRM,966
353
359
  codemie_test_harness/tests/workflow/virtual_assistant_tools/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
354
360
  codemie_test_harness/tests/workflow/virtual_assistant_tools/vcs/test_workflow_with_vcs_tools.py,sha256=uD2qs361j6Egp4UumfoQ4gC24-NioXfiW0IF53N9hVA,1175
355
- codemie_test_harness-0.1.168.dist-info/METADATA,sha256=1XRD5UokSB8bPu0xnZXqhAmqbe40bCt7chx0L1kcx1g,8998
356
- codemie_test_harness-0.1.168.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
357
- codemie_test_harness-0.1.168.dist-info/entry_points.txt,sha256=n98t-EOM5M1mnMl_j2X4siyeO9zr0WD9a5LF7JyElIM,73
358
- codemie_test_harness-0.1.168.dist-info/RECORD,,
361
+ codemie_test_harness-0.1.169.dist-info/METADATA,sha256=PffHy-1ACIQtG2AsNfKTzekxNj-cUh92rs4sKbAd2iw,8998
362
+ codemie_test_harness-0.1.169.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
363
+ codemie_test_harness-0.1.169.dist-info/entry_points.txt,sha256=n98t-EOM5M1mnMl_j2X4siyeO9zr0WD9a5LF7JyElIM,73
364
+ codemie_test_harness-0.1.169.dist-info/RECORD,,