-
-
Notifications
You must be signed in to change notification settings - Fork 14
[#406] Added datetime handling. #409
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -15,6 +15,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* - Set field values for various input types including selects and WYSIWYG. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* - Assert field existence, state, and selected options. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* - Support for specialized widgets like color pickers and rich text editors. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* - Support for datetime field widgets with date, time, and datetime options. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
trait FieldTrait { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -207,6 +208,61 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Fill a datetime field with both date and time values. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @code | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* When I fill in the datetime field "Event datetime" with date "2024-07-15" and time "14:30:00" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @endcode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @When I fill in the datetime field :label with date :date and time :time | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public function fieldFillDateTime(string $label, string $date, string $time): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$this->fieldFillDateTimeField($label, 'date', $date); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$this->fieldFillDateTimeField($label, 'time', $time); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Fill a datetime field with date value. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @code | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* When I fill in the date field "Event datetime" with date "2024-07-15" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @endcode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @When I fill in the date field :label with date :date | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public function fieldFillDate(string $label, string $date): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$this->fieldFillDateTimeField($label, 'date', $date); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Helper method to fill datetime field components. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param string $label | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* The field label. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param string $field | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* The field component: 'date' or 'time'. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param string $value | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* The value to set. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @throws \Exception | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* If the field is not found. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
protected function fieldFillDateTimeField(string $label, string $field, string $value): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$xpath = sprintf( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'//*[self::span or self::label or self::h4][contains(normalize-space(.), "%s")]/ancestor::div[contains(@class,"form-item") or contains(@class,"field--widget-datetime-default")]//input[contains(@name,"[%s]")]', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$label, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$field | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$page = $this->getSession()->getPage(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$element = $page->find('xpath', $xpath); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!$element) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new \Exception(sprintf('Date field with label "%s" value not found', $label)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$element->setValue($value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+238
to
+264
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Helper method implementation is solid but could use additional validation. The protected function fieldFillDateTimeField(string $label, string $field, string $value): void {
+ // Validate that field is either 'date' or 'time'
+ if (!in_array($field, ['date', 'time'])) {
+ throw new \InvalidArgumentException(sprintf('Invalid field type "%s". Expected "date" or "time".', $field));
+ }
+
$xpath = sprintf(
'//*[self::span or self::label or self::h4][contains(normalize-space(.), "%s")]/ancestor::div[contains(@class,"form-item") or contains(@class,"field--widget-datetime-default")]//input[contains(@name,"[%s]")]',
$label,
$field
); 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Assert that a select has an option. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
Feature: Check that datetime fields are handled correctly in FieldTrait | ||
As a Behat Steps library developer | ||
I want to provide tools to interact with datetime fields | ||
So that users can set date, time, or both values in their tests | ||
|
||
@api @datetime | ||
Scenario: Set both date and time values on a datetime field | ||
Given I am logged in as a user with the "administrator" role | ||
When I go to "node/add/article" | ||
And I fill in "Title" with "[TEST] Article with datetime field" | ||
And I fill in the datetime field "Date and time" with date "2024-03-15" and time "14:30:00" | ||
And I select "Published" from "edit-moderation-state-0-state" | ||
And I press "Save" | ||
Then the response status code should be 200 | ||
And I should see the text "[TEST] Article with datetime field" | ||
And I should see the text "Date and time" | ||
And I should see the text "03/15/2024 - 14:30" | ||
|
||
@api @datetime | ||
Scenario: Set date value on a date field | ||
Given I am logged in as a user with the "administrator" role | ||
When I go to "node/add/article" | ||
And I fill in "Title" with "[TEST] Article with datetime field" | ||
And I fill in the date field "Date only" with date "2024-03-15" | ||
And I select "Published" from "edit-moderation-state-0-state" | ||
And I press "Save" | ||
Then the response status code should be 200 | ||
And I should see the text "[TEST] Article with datetime field" | ||
And I should see the text "Date" | ||
And I should see the text "03/15/2024" |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -6,13 +6,16 @@ dependencies: | |||||||||||||||||||||||||||||||||
- core.entity_view_display.comment.comment.default | ||||||||||||||||||||||||||||||||||
- field.field.node.article.body | ||||||||||||||||||||||||||||||||||
- field.field.node.article.comment | ||||||||||||||||||||||||||||||||||
- field.field.node.article.field_date_and_time | ||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Validate configuration dependencies for field storage. The new view display adds a dependency on the field config Apply this diff to add the storage dependency: dependencies:
config:
- core.entity_view_display.comment.comment.default
- field.field.node.article.body
- field.field.node.article.comment
+ - field.storage.node.field_date_and_time
- field.field.node.article.field_date_and_time 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
- field.field.node.article.field_date_only | ||||||||||||||||||||||||||||||||||
Comment on lines
+9
to
+10
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add missing storage dependencies for datetime fields. dependencies:
config:
- field.field.node.article.field_date_and_time
+ - field.storage.node.field_date_and_time
- field.field.node.article.field_date_only
+ - field.storage.node.field_date_only 🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
- field.field.node.article.field_file | ||||||||||||||||||||||||||||||||||
- field.field.node.article.field_image | ||||||||||||||||||||||||||||||||||
- field.field.node.article.field_tags | ||||||||||||||||||||||||||||||||||
- image.style.wide | ||||||||||||||||||||||||||||||||||
- node.type.article | ||||||||||||||||||||||||||||||||||
module: | ||||||||||||||||||||||||||||||||||
- comment | ||||||||||||||||||||||||||||||||||
- datetime | ||||||||||||||||||||||||||||||||||
- file | ||||||||||||||||||||||||||||||||||
- image | ||||||||||||||||||||||||||||||||||
- text | ||||||||||||||||||||||||||||||||||
|
@@ -45,6 +48,24 @@ content: | |||||||||||||||||||||||||||||||||
third_party_settings: { } | ||||||||||||||||||||||||||||||||||
weight: 0 | ||||||||||||||||||||||||||||||||||
region: content | ||||||||||||||||||||||||||||||||||
field_date_and_time: | ||||||||||||||||||||||||||||||||||
type: datetime_default | ||||||||||||||||||||||||||||||||||
label: above | ||||||||||||||||||||||||||||||||||
settings: | ||||||||||||||||||||||||||||||||||
timezone_override: '' | ||||||||||||||||||||||||||||||||||
format_type: medium | ||||||||||||||||||||||||||||||||||
third_party_settings: { } | ||||||||||||||||||||||||||||||||||
weight: 7 | ||||||||||||||||||||||||||||||||||
region: content | ||||||||||||||||||||||||||||||||||
Comment on lines
+51
to
+59
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Review view display settings for the datetime field. The
@@ content:
- field_date_and_time:
- type: datetime_default
- label: above
- settings:
- timezone_override: ''
- format_type: medium
- third_party_settings: { }
- weight: 7
- region: content
+ field_date_and_time:
+ type: datetime_default
+ label: above
+ settings:
+ format_type: medium
+ weight: 7 # ensure this ordering matches UX requirements
+ region: content 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
field_date_only: | ||||||||||||||||||||||||||||||||||
type: datetime_default | ||||||||||||||||||||||||||||||||||
label: above | ||||||||||||||||||||||||||||||||||
settings: | ||||||||||||||||||||||||||||||||||
timezone_override: '' | ||||||||||||||||||||||||||||||||||
format_type: medium | ||||||||||||||||||||||||||||||||||
third_party_settings: { } | ||||||||||||||||||||||||||||||||||
weight: 8 | ||||||||||||||||||||||||||||||||||
region: content | ||||||||||||||||||||||||||||||||||
Comment on lines
+60
to
+68
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Cleanup unnecessary empty settings. field_date_only:
- settings:
- timezone_override: ''
- format_type: medium
- third_party_settings: { }
+ settings:
+ format_type: medium 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||
field_file: | ||||||||||||||||||||||||||||||||||
type: file_default | ||||||||||||||||||||||||||||||||||
label: above | ||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
uuid: 330488f2-c295-406b-8c67-1b979f1d41ec | ||
langcode: en | ||
status: true | ||
dependencies: | ||
config: | ||
- field.storage.node.field_date_and_time | ||
- node.type.article | ||
module: | ||
- datetime | ||
id: node.article.field_date_and_time | ||
field_name: field_date_and_time | ||
entity_type: node | ||
bundle: article | ||
label: 'Date and time' | ||
description: '' | ||
required: false | ||
translatable: false | ||
default_value: { } | ||
default_value_callback: '' | ||
settings: { } | ||
field_type: datetime |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
uuid: 60dc4216-4910-400f-bb93-e66186384875 | ||
langcode: en | ||
status: true | ||
dependencies: | ||
config: | ||
- field.storage.node.field_date_only | ||
- node.type.article | ||
module: | ||
- datetime | ||
id: node.article.field_date_only | ||
field_name: field_date_only | ||
entity_type: node | ||
bundle: article | ||
label: 'Date only' | ||
description: '' | ||
required: false | ||
translatable: false | ||
default_value: { } | ||
default_value_callback: '' | ||
settings: { } | ||
field_type: datetime |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
uuid: 8c4bc0be-50c6-4722-b3a3-087e28686c89 | ||
langcode: en | ||
status: true | ||
dependencies: | ||
module: | ||
- datetime | ||
- node | ||
id: node.field_date_and_time | ||
field_name: field_date_and_time | ||
entity_type: node | ||
type: datetime | ||
settings: | ||
datetime_type: datetime | ||
module: datetime | ||
locked: false | ||
cardinality: 1 | ||
translatable: true | ||
indexes: { } | ||
persist_with_no_fields: false | ||
custom_storage: false |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
uuid: 7d5ec932-bb3f-4e6b-b4bb-1a703177286c | ||
langcode: en | ||
status: true | ||
dependencies: | ||
module: | ||
- datetime | ||
- node | ||
id: node.field_date_only | ||
field_name: field_date_only | ||
entity_type: node | ||
type: datetime | ||
settings: | ||
datetime_type: date | ||
module: datetime | ||
locked: false | ||
cardinality: 1 | ||
translatable: true | ||
indexes: { } | ||
persist_with_no_fields: false | ||
custom_storage: false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧹 Nitpick (assertive)
Error message could be more specific.
The error message only mentions "Date field" even when the method might be looking for a time input element.
Consider making the error message reflect the actual field type being searched:
🤖 Prompt for AI Agents