Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions .airules/GENERATE_CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Changelog Generation Prompt

You are an expert technical writer and release manager. Your task is to generate or update a `CHANGELOG.md` file based on a list of git commit messages.

## Input Data

You will be provided with a list of git commits. Each entry typically contains a hash, author, date, and the commit message.

## Output Format

Follow the [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) standard.

### Section Header

Create a header for the new changes. If a version number is not provided, use the date.
`## YYYY-MM-DD`

### Categories

Group changes into the following sections:

- `### Added` for new features.
- `### Changed` for changes in existing functionality.
- `### Deprecated` for soon-to-be removed features.
- `### Removed` for now removed features.
- `### Fixed` for any bug fixes.
- `### Security` in case of vulnerabilities.

## Processing Rules

1. **Analyze Commit Messages**: Look for Conventional Commits prefixes:
- `feat`: Map to **Added**.
- `fix`: Map to **Fixed**.
- `docs`: Map to **Changed** (or **Documentation** if many).
- `style`, `refactor`, `perf`: Map to **Changed**.
- `test`, `chore`, `ci`, `build`: Generally **exclude** these unless they constitute a significant user-facing change or developer experience improvement.
2. **Merge Handling**: Ignore standard "Merge pull request" messages unless they contain unique descriptions not covered by individual commits.
3. **Refining Descriptions**:
- Rewrite commit messages to be consumer-friendly.
- Remove technical jargon where possible.
- Combine related commits into a single summary line.
- Capitalize the first letter and end with a period.
4. **Exclusions**:
- Exclude "WIP" (Work In Progress) commits.
- Exclude formatting fixes (unless significant).

## Example

**Input:**

- `feat: added dark mode support`
- `fix: login button alignment issue`
- `chore: update dependencies`
- `docs: update readme`

**Output:**

```markdown
## [Unreleased] - 2023-10-27

### Added

- Dark mode support for better accessibility.

### Changed

- Updated README documentation.

### Fixed

- Corrected alignment issues on the login button.
```
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 2025-12-09

### Added

- Feature instructions for non-scratch orgs.

### Fixed

- Removed unnecessary flows and updated `actionDescriptionOverrides` action parameters.
- Added `complex_data_type_name` to flow action output.
- Updated flow output to correct type in `actionDefinitions` agent.
- Removed Trailhead Playground references.
- Resolved deployment issue with custom objects.
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ get_forecast:
days: number
description: "Number of days to include in the forecast (1-10)"
outputs:
forecast_data: list[object]
forecast_data: list[string]
description: "List of daily forecast objects containing temperature, conditions, and precipitation data"
target: "flow://GetWeatherForecast"
```
Expand Down Expand Up @@ -259,6 +259,16 @@ reasoning:
else:
| - Location: None specified

if @variables.current_temperature > 0:
| - Temperature: {[email protected]_temperature}
else:
| - Temperature: Not fetched

if @variables.conditions:
| - Conditions: {[email protected]}
else:
| - Conditions: Not fetched

| When a user asks about weather:
1. Identify the location they're asking about
2. Use {[email protected]_current_weather} to fetch current conditions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ topic weather_lookup:
days: number
description: "Number of days to include in the forecast (1-10)"
outputs:
forecast_data: list[object]
forecast_data: list[string]
description: "List of daily forecast objects containing temperature, conditions, and precipitation data"
target: "flow://GetWeatherForecast"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ Agent: [Calls perform_search with query="API" and complex filters]
### Example: Context-Aware

```text
User: Search for John Smith
User: Search for contact John Smith

[Context: search_context = "accounts"]
Agent sees: search_accounts action available
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,23 +40,12 @@ topic beginner_mode:
inputs:
query: string
description: "Search query text to find relevant knowledge base articles"
filters: object
filters: string
description: "Filter criteria object to refine search results (e.g., type, date range, tags)"
outputs:
results: list[object]
results: list[string]
description: "List of search result objects containing matching knowledge base articles"
target: "flow://PerformSearch"
create_record:
description: "Create a new record"
inputs:
record_type: string
description: "Type of record to create (e.g., Account, Contact, Case, Custom__c)"
data: object
description: "Record data object containing field-value pairs for the new record"
outputs:
record_id: string
description: "Unique identifier of the newly created record"
target: "flow://CreateRecord"

reasoning:
instructions:->
Expand All @@ -68,9 +57,6 @@ topic beginner_mode:
simple_search: @actions.perform_search
with query=...
with filters=...
create_new_item: @actions.create_record
with record_type=...
with data=...

switch_to_advanced: @utils.transition to @topic.advanced_mode

Expand All @@ -84,34 +70,12 @@ topic advanced_mode:
inputs:
query: string
description: "Search query text with support for advanced syntax and operators"
filters: object
filters: string
description: "Advanced filter criteria object with type, date range, tags, and custom field filters"
outputs:
results: list[object]
results: list[string]
description: "Paginated list of search result objects with relevance scores"
target: "flow://PerformSearch"
create_record:
description: "Create new database record. Specify record_type (Account, Contact, Case, Custom__c) and provide data object with field-value pairs. Returns record ID on success."
inputs:
record_type: string
description: "Database record type (Account, Contact, Case, Custom__c, etc.)"
data: object
description: "Record data object with field-value pairs matching the specified record type schema"
outputs:
record_id: string
description: "Unique 18-character Salesforce record ID"
target: "flow://CreateRecord"
generate_report:
description: "Generate analytics report. Available types: sales_summary, user_activity, performance_metrics. Accepts parameters object for date ranges, filters, and aggregation options."
inputs:
report_type: string
description: "Report type (sales_summary, user_activity, performance_metrics, etc.)"
parameters: object
description: "Report parameters object with date ranges, filters, and aggregation options"
outputs:
report_url: string
description: "URL to access or download the generated report"
target: "flow://GenerateReport"

reasoning:
instructions:->
Expand All @@ -123,12 +87,6 @@ topic advanced_mode:
advanced_search: @actions.perform_search
with query=...
with filters=...
create_record_advanced: @actions.create_record
with record_type=...
with data=...
generate_analytics: @actions.generate_report
with report_type=...
with parameters=...

switch_to_beginner: @utils.transition to @topic.beginner_mode

Expand All @@ -142,34 +100,12 @@ topic contextual_search:
inputs:
query: string
description: "Search query text adapted to the current search context"
filters: object
filters: string
description: "Context-specific filter criteria object"
outputs:
results: list[object]
results: list[string]
description: "List of context-relevant search result objects"
target: "flow://PerformSearch"
create_record:
description: "Create a new record"
inputs:
record_type: string
description: "Type of record to create based on current context"
data: object
description: "Record data object with fields relevant to the current context"
outputs:
record_id: string
description: "Unique identifier of the newly created record"
target: "flow://CreateRecord"
generate_report:
description: "Generate an analytics report"
inputs:
report_type: string
description: "Type of analytics report to generate"
parameters: object
description: "Report parameters object for customization"
outputs:
report_url: string
description: "URL to access the generated report"
target: "flow://GenerateReport"

reasoning:
instructions:->
Expand All @@ -179,19 +115,6 @@ topic contextual_search:

actions:
# When searching for accounts
search_accounts: @actions.perform_search
available when @variables.search_context == "accounts"
with query=...
with filters=...

# When searching for contacts
search_contacts: @actions.perform_search
available when @variables.search_context == "contacts"
with query=...
with filters=...

# When searching for cases
search_cases: @actions.perform_search
available when @variables.search_context == "cases"
contextual_search: @actions.perform_search
with query=...
with filters=...
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,6 @@
*/
@IsTest
private class ActionDescriptionOverridesFlowTest {
@IsTest
static void testCreateRecord() {
// Set input variables for the flow
Map<String, Object> inputs = new Map<String, Object>();
inputs.put('record_type', 'Account');
inputs.put('data', '{"Name":"Test Account"}');

// Run the flow
Test.startTest();
Flow.Interview.CreateRecord flowInterview = new Flow.Interview.CreateRecord(
inputs
);
flowInterview.start();
Test.stopTest();

// Verify the expected outcome
String recordId = (String) flowInterview.getVariableValue('record_id');
Assert.areNotEqual(null, recordId, 'Record ID should be returned');
}

@IsTest
static void testPerformSearch() {
// Set input variables for the flow
Expand All @@ -46,34 +26,4 @@ private class ActionDescriptionOverridesFlowTest {
Assert.areNotEqual(null, results, 'Results should be returned');
Assert.areEqual(1, results.size(), 'Should return at least one result');
}

@IsTest
static void testGenerateReport() {
// Set input variables for the flow
Map<String, Object> inputs = new Map<String, Object>();
inputs.put('report_type', 'Sales Report');
inputs.put('include_charts', true);
inputs.put('user_id', UserInfo.getUserId());
inputs.put('format', 'PDF');
inputs.put('start_date', '2024-01-01');
inputs.put('end_date', '2024-12-31');

// Run the flow
Test.startTest();
Flow.Interview.GenerateReport flowInterview = new Flow.Interview.GenerateReport(
inputs
);
flowInterview.start();
Test.stopTest();

// Verify the expected outcome
String reportUrl = (String) flowInterview.getVariableValue(
'report_url'
);
Assert.areNotEqual(null, reportUrl, 'Report URL should be returned');
Assert.isTrue(
reportUrl.startsWith('https://'),
'Report URL should be a valid URL'
);
}
}
Loading