Skip to content
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

Support Default Values for Arguments in Custom Commands #905

Merged
merged 6 commits into from
Jan 3, 2025
Merged

Conversation

Listener430
Copy link
Collaborator

@Listener430 Listener430 commented Jan 1, 2025

what

The task is was "If a default is provided for a custom command, and required is true, then it shouldn't error."

before

before

a custom cli-command is defined

custom_cli_command

after

after

why

Provide a deafult value in atmos.yaml for a custom CLI command, so it doesn't error out (before it did).

references

Link to the ticket - https://linear.app/cloudposse/issue/DEV-2327/default-value-for-demo-argument-should-not-cause-an-error

Summary by CodeRabbit

  • New Features

    • Enhanced custom command argument handling with required and default value support.
    • Added new "greet" command with a configurable name argument.
  • Documentation

    • Updated documentation for custom commands, including command name change from "hello" to "greet".
    • Clarified positional argument requirements and default value handling.
  • Bug Fixes

    • Improved argument validation logic for custom commands.
    • Added more robust error messaging for invalid command configurations.
  • Tests

    • Introduced new test cases for the "greet" command to validate argument handling and default values.

@Listener430 Listener430 requested a review from a team as a code owner January 1, 2025 16:51
@Listener430 Listener430 requested a review from osterman January 1, 2025 16:52
@Listener430 Listener430 self-assigned this Jan 1, 2025
@mergify mergify bot added the triage Needs triage label Jan 1, 2025
@Listener430 Listener430 added enhancement New feature or request and removed triage Needs triage labels Jan 1, 2025
@mergify mergify bot added the triage Needs triage label Jan 1, 2025
Copy link
Contributor

coderabbitai bot commented Jan 1, 2025

📝 Walkthrough

Walkthrough

This pull request enhances the Atmos CLI's custom command argument handling by modifying the validation logic for command arguments. The changes include a new approach to checking required arguments and their defaults, ensuring commands execute correctly based on provided configurations. Additionally, a new custom command named "greet" is introduced, which requires a positional argument. The documentation is updated to reflect these changes in command usage and argument handling.

Changes

File Change Summary
cmd/cmd_utils.go Enhanced argument validation logic in preCustomCommand and executeCustomCommand functions
pkg/schema/schema.go Added Required and Default fields to CommandArgument struct
examples/demo-custom-command/atmos.yaml Introduced new greet command with a required name argument
website/docs/core-concepts/custom-commands/custom-commands.mdx Updated documentation to reflect new command and argument handling
tests/test_cases.yaml Added test cases for the new greet command with and without arguments

Assessment against linked issues

Objective Addressed Explanation
Default value for required argument [DEV-2327]

Possibly related PRs

Suggested Labels

minor

Suggested Reviewers

  • Gowiem
  • aknysh
  • osterman

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary or @auto-summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or @auto-title anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
cmd/cmd_utils.go (2)

224-245: Thoughtful merging of supplied arguments with defaults.

Storing final parameters in resolvedArgs is practical, but using commas as a delimiter may break if any argument includes commas. Consider a safer serialization approach (e.g. JSON-encoding).

- cmd.Annotations["resolvedArgs"] = strings.Join(finalArgs, ",")
+ data, err := json.Marshal(finalArgs)
+ if err == nil {
+     cmd.Annotations["resolvedArgs"] = string(data)
+ }

278-284: Split-by-comma might misread arguments containing commas.

If an argument includes a comma, it splits incorrectly. Storing arguments in JSON (or a similar technique) would avoid confusion when reconstructing them here.

website/docs/core-concepts/custom-commands/custom-commands.mdx (2)

44-45: Recommend removing or adjusting the trailing punctuation.

Avoiding multiple punctuation marks maintains style consistency.

🧰 Tools
🪛 LanguageTool

[typographical] ~45-~45: Consider using typographic quotation marks here.
Context: ... name argument, but uses a default of "John Doe" if none is provided:. ```yaml # subco...

(EN_QUOTES)


[formatting] ~45-~45: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...efault of "John Doe" if none is provided:. ```yaml # subcommands commands: - n...

(DOUBLE_PUNCTUATION_PREMIUM)


66-67: Use consistent quotes around "John Doe".

Keeping quotation usage consistent improves readability.

🧰 Tools
🪛 LanguageTool

[typographical] ~66-~66: Consider using typographic quotation marks here.
Context: ... atmos greet Alice or defaulting to "John Doe" shell atmos greet ``` ## Passing F...

(EN_QUOTES)

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2763512 and 144e909.

📒 Files selected for processing (4)
  • cmd/cmd_utils.go (2 hunks)
  • examples/demo-custom-command/atmos.yaml (1 hunks)
  • pkg/schema/schema.go (1 hunks)
  • website/docs/core-concepts/custom-commands/custom-commands.mdx (1 hunks)
🧰 Additional context used
🪛 LanguageTool
website/docs/core-concepts/custom-commands/custom-commands.mdx

[typographical] ~45-~45: Consider using typographic quotation marks here.
Context: ... name argument, but uses a default of "John Doe" if none is provided:. ```yaml # subco...

(EN_QUOTES)


[formatting] ~45-~45: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...efault of "John Doe" if none is provided:. ```yaml # subcommands commands: - n...

(DOUBLE_PUNCTUATION_PREMIUM)


[typographical] ~66-~66: Consider using typographic quotation marks here.
Context: ... atmos greet Alice or defaulting to "John Doe" shell atmos greet ``` ## Passing F...

(EN_QUOTES)

🔇 Additional comments (6)
cmd/cmd_utils.go (4)

172-195: Solid check for commands lacking arguments.

This block correctly handles zero-argument commands by validating whether they have steps or sub-commands. The approach sets user expectations appropriately by exiting when nothing is avaialble to execute.


196-203: Clear count of required arguments without defaults.

The loop neatly identifies how many mandatory arguments lack defaults. This is logically sound for subsequent checks.


204-223: Comprehensive error messaging for missing arguments.

When the user provides fewer arguments than the required count, the error message lists the missing arguments by name, which simplifies debugging.


290-290: Access to merged arguments is correct.

Index-based mapping to argumentsData is valid here, thanks to prior validations.

pkg/schema/schema.go (1)

346-347: New fields enable default values for required arguments.

This cleanly captures both the Required and Default properties. Ensure documentation clarifies that “required” arguments can also have default values.

examples/demo-custom-command/atmos.yaml (1)

60-71: Good demonstration of a required arg with a default value.

This example will help users see how to provide flexible defaults for mandatory arguments. Nicely done.

coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 1, 2025
@mergify mergify bot removed the triage Needs triage label Jan 1, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
website/docs/core-concepts/custom-commands/custom-commands.mdx (2)

42-43: Enhance clarity of positional arguments description.

The sentence structure could be improved for better readability.

-Atmos also can support positional arguments. If a positional argument is required but not provided by the user, 
+Atmos supports positional arguments. If a required positional argument is not provided by the user, 
🧰 Tools
🪛 LanguageTool

[uncategorized] ~42-~42: A different word order might sound more natural.
Context: ...llo ``` ## Positional Arguments Atmos also can support positional arguments. If a posi...

(AI_HYDRA_LEO_WORD_ORDER)


64-69: Command usage examples are comprehensive.

The examples demonstrate both cases:

  1. Explicit argument passing
  2. Using the default value

Consider adding a note about the error case that this PR fixes.

Add a comment explaining that previously, this configuration would have caused an error, but now works as expected:

 atmos greet Alice

or defaulting to "John Doe"

atmos greet
+```
+
+Previously, marking an argument as required while providing a default value would cause an error.
+Now, the default value is correctly used when no argument is provided.
+
+```shell
🧰 Tools
🪛 LanguageTool

[typographical] ~66-~66: Consider using typographic quotation marks here.
Context: ... atmos greet Alice or defaulting to "John Doe" shell atmos greet ``` ## Passing F...

(EN_QUOTES)

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 144e909 and 144141e.

📒 Files selected for processing (1)
  • website/docs/core-concepts/custom-commands/custom-commands.mdx (1 hunks)
🧰 Additional context used
🪛 LanguageTool
website/docs/core-concepts/custom-commands/custom-commands.mdx

[uncategorized] ~42-~42: A different word order might sound more natural.
Context: ...llo ``` ## Positional Arguments Atmos also can support positional arguments. If a posi...

(AI_HYDRA_LEO_WORD_ORDER)


[typographical] ~45-~45: Consider using typographic quotation marks here.
Context: ... name argument, but uses a default of "John Doe" if none is provided. ```yaml # subcom...

(EN_QUOTES)


[typographical] ~66-~66: Consider using typographic quotation marks here.
Context: ... atmos greet Alice or defaulting to "John Doe" shell atmos greet ``` ## Passing F...

(EN_QUOTES)

🔇 Additional comments (2)
website/docs/core-concepts/custom-commands/custom-commands.mdx (2)

44-45: Documentation aligns well with PR objectives.

The introduction of the greet command example effectively demonstrates how to handle required arguments with default values.

🧰 Tools
🪛 LanguageTool

[typographical] ~45-~45: Consider using typographic quotation marks here.
Context: ... name argument, but uses a default of "John Doe" if none is provided. ```yaml # subcom...

(EN_QUOTES)


50-56: Well-structured command configuration example.

The configuration clearly shows how to:

  1. Mark an argument as required
  2. Provide a default value
  3. Include a description

This example effectively addresses the PR's main objective.

coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 1, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
cmd/cmd_utils.go (3)

171-193: Enhance error messages and sub-command display for better user experience.

The validation logic is solid, but we can improve the user experience with better messaging:

 if len(commandConfig.Commands) > 0 {
   // show sub-commands
-  sb.WriteString("Available command(s):\n")
+  sb.WriteString("Available sub-commands:\n")
   for i, c := range commandConfig.Commands {
     sb.WriteString(
-      fmt.Sprintf("%d. %s %s %s\n", i+1, parentCommand.Use, commandConfig.Name, c.Name),
+      fmt.Sprintf("%d. %s %s %s\t\t%s\n", 
+        i+1, 
+        parentCommand.Use, 
+        commandConfig.Name, 
+        c.Name,
+        c.Description),
     )
   }
 } else {
   // truly invalid, nothing to do
   u.LogError(schema.AtmosConfiguration{}, errors.New(
-    "invalid command: no args, no steps, no sub-commands",
+    fmt.Sprintf("invalid command '%s': command must define arguments, steps, or sub-commands", commandConfig.Name),
   ))
 }

223-244: Define constant for annotation key and improve error message.

The argument merging logic is solid, but we can improve maintainability and error handling:

+// Define constants for annotation keys
+const (
+  resolvedArgsAnnotationKey = "resolvedArgs"
+)

 // Merge user-supplied arguments with defaults
 finalArgs := make([]string, len(commandConfig.Arguments))

 for i, arg := range commandConfig.Arguments {
   if i < len(args) {
     finalArgs[i] = args[i]
   } else {
     if arg.Default != "" {
       finalArgs[i] = fmt.Sprintf("%v", arg.Default)
     } else {
       // This theoretically shouldn't happen:
-      sb.WriteString(fmt.Sprintf("Missing required argument '%s' with no default!\n", arg.Name))
+      sb.WriteString(fmt.Sprintf(
+        "Internal error: Required argument '%s' is missing and has no default value. "+
+        "This should have been caught by earlier validation.\n", 
+        arg.Name))
       u.LogErrorAndExit(schema.AtmosConfiguration{}, errors.New(sb.String()))
     }
   }
 }
 
 if cmd.Annotations == nil {
   cmd.Annotations = make(map[string]string)
 }
-cmd.Annotations["resolvedArgs"] = strings.Join(finalArgs, ",")
+cmd.Annotations[resolvedArgsAnnotationKey] = strings.Join(finalArgs, ",")

277-282: Add warning for fallback and define separator constant.

The argument retrieval logic is correct, but we can improve error handling and maintainability:

+const (
+  resolvedArgsAnnotationKey = "resolvedArgs"
+  resolvedArgsSeparator    = ","
+)

-mergedArgsStr := cmd.Annotations["resolvedArgs"]
+mergedArgsStr := cmd.Annotations[resolvedArgsAnnotationKey]
-finalArgs := strings.Split(mergedArgsStr, ",")
+finalArgs := strings.Split(mergedArgsStr, resolvedArgsSeparator)
 if mergedArgsStr == "" {
   // If for some reason no annotation was set, just fallback
+  u.LogWarning(atmosConfig, "No resolved arguments found in annotations, falling back to original args")
   finalArgs = args
 }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 144141e and ec3d547.

📒 Files selected for processing (1)
  • cmd/cmd_utils.go (2 hunks)
🔇 Additional comments (1)
cmd/cmd_utils.go (1)

195-222: Strengthen argument validation with type checking.

The current validation ensures required arguments are provided, but we can make it more robust:

 // Check if the number of arguments provided is less than the required number of arguments
 if len(args) < requiredNoDefaultCount {
   sb.WriteString(
-    fmt.Sprintf("Command requires at least %d argument(s) (no defaults provided for them):\n",
-      requiredNoDefaultCount))
+    fmt.Sprintf("Command '%s' requires %d argument(s):\n",
+      commandConfig.Name, requiredNoDefaultCount))

   // List out which arguments are missing
   missingIndex := 1
   for _, arg := range commandConfig.Arguments {
     if arg.Required && arg.Default == "" {
-      sb.WriteString(fmt.Sprintf("  %d. %s\n", missingIndex, arg.Name))
+      sb.WriteString(fmt.Sprintf("  %d. %s (%s)\n", 
+        missingIndex, 
+        arg.Name,
+        arg.Type))
       missingIndex++
     }
   }

Let's verify if argument types are defined in the schema:

coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 1, 2025
@osterman osterman changed the title Default value for demo argument should not cause an error Support Default Values for Arguments in Custom Commands Jan 1, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
website/docs/core-concepts/custom-commands/custom-commands.mdx (2)

50-56: Example configuration is well structured and clear!

The YAML configuration example effectively demonstrates:

  • Setting a required argument with required: true
  • Providing a default value with default: John Doe

Consider using typographic quotation marks for "John Doe" to improve readability:

-        default: John Doe
+        default: "John Doe"

64-69: Usage examples are comprehensive!

The documentation includes both cases:

  1. Explicit argument: atmos greet Alice
  2. Default value: atmos greet

This helps users understand how the default value works in practice.

Consider using typographic quotation marks for "John Doe" in the explanatory text:

-or defaulting to "John Doe"
+or defaulting to "John Doe"
🧰 Tools
🪛 LanguageTool

[typographical] ~66-~66: Consider using typographic quotation marks here.
Context: ... atmos greet Alice or defaulting to "John Doe" shell atmos greet ``` ## Passing F...

(EN_QUOTES)

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ec3d547 and 8ece10c.

📒 Files selected for processing (1)
  • website/docs/core-concepts/custom-commands/custom-commands.mdx (1 hunks)
🧰 Additional context used
🪛 LanguageTool
website/docs/core-concepts/custom-commands/custom-commands.mdx

[typographical] ~45-~45: Consider using typographic quotation marks here.
Context: ... name argument, but uses a default of "John Doe" if none is provided. ```yaml # subcom...

(EN_QUOTES)


[typographical] ~66-~66: Consider using typographic quotation marks here.
Context: ... atmos greet Alice or defaulting to "John Doe" shell atmos greet ``` ## Passing F...

(EN_QUOTES)

🔇 Additional comments (1)
website/docs/core-concepts/custom-commands/custom-commands.mdx (1)

42-45: Documentation accurately describes the new behavior!

The explanation clearly communicates how required arguments and default values work together, which directly addresses the PR's objective.

🧰 Tools
🪛 LanguageTool

[typographical] ~45-~45: Consider using typographic quotation marks here.
Context: ... name argument, but uses a default of "John Doe" if none is provided. ```yaml # subcom...

(EN_QUOTES)

coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 1, 2025
@Listener430 Listener430 requested a review from osterman January 1, 2025 19:50
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
tests/test_cases.yaml (2)

172-185: LGTM! Well-structured test case for explicit argument passing.

The test case effectively validates the custom command's behavior when an argument is provided. The expectations are clear and comprehensive.

Consider adding a comment in the description to clarify that this test validates the override of the default value, making the test's purpose more explicit:

-    description: "Validate atmos custom command greet runs with argument provided."
+    description: "Validate atmos custom command greet runs with explicit argument, overriding the default value."

171-199: Consider adding error case test coverage.

While the current test cases effectively cover the happy paths (explicit argument and default value), consider adding test cases for error scenarios:

  1. Invalid argument validation
  2. Required argument missing (when no default is set)

Example test case structure:

  - name: atmos greet with invalid argument
    enabled: true
    description: "Validate atmos custom command greet fails gracefully with invalid input."
    workdir: "../examples/demo-custom-command/"
    command: "atmos"
    args:
      - "greet"
      - ""  # or some invalid input
    expect:
      stderr:
        - "Invalid argument provided"  # adjust based on actual error message
      exit_code: 1
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8ece10c and 6a318bd.

📒 Files selected for processing (1)
  • tests/test_cases.yaml (1 hunks)
🔇 Additional comments (1)
tests/test_cases.yaml (1)

187-199: LGTM! Solid test coverage for default value behavior.

The test case effectively validates that the command falls back to the default value ("John Doe") when no argument is provided. This is crucial for verifying the new default value support feature.

coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 2, 2025
Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
website/docs/core-concepts/custom-commands/custom-commands.mdx (3)

42-43: Consider clarifying the relationship between required arguments and defaults.

The explanation is good, but we could make it even clearer by explicitly stating that providing a default value satisfies the "required" constraint.

-Atmos also supports positional arguments. If a positional argument is required but not provided by the user, 
-the command will fail—unless you define a default in your config. 
+Atmos also supports positional arguments. A required positional argument must either be provided by the user
+or have a default value defined in your config—otherwise, the command will fail.

45-46: Enhance readability with typographic quotation marks.

Consider using typographic quotation marks for better readability.

-but uses a default of "John Doe" if none is provided. 
+but uses a default of "John Doe" if none is provided. 
🧰 Tools
🪛 LanguageTool

[typographical] ~46-~46: Consider using typographic quotation marks here.
Context: ... name argument, but uses a default of "John Doe" if none is provided. ```yaml # subcom...

(EN_QUOTES)


65-70: Consider enhancing the examples with expected output.

The examples are clear, but would be even more helpful if they showed the expected output. Also, consider using typographic quotation marks for consistency.

 atmos greet Alice
+# Output: Hello Alice!

or defaulting to "John Doe"

atmos greet
+# Output: Hello John Doe!
🧰 Tools
🪛 LanguageTool

[typographical] ~67-~67: Consider using typographic quotation marks here.
Context: ... atmos greet Alice or defaulting to "John Doe" shell atmos greet ``` ## Passing F...

(EN_QUOTES)

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6a318bd and cbe14a0.

📒 Files selected for processing (1)
  • website/docs/core-concepts/custom-commands/custom-commands.mdx (1 hunks)
🧰 Additional context used
🪛 LanguageTool
website/docs/core-concepts/custom-commands/custom-commands.mdx

[typographical] ~46-~46: Consider using typographic quotation marks here.
Context: ... name argument, but uses a default of "John Doe" if none is provided. ```yaml # subcom...

(EN_QUOTES)


[typographical] ~67-~67: Consider using typographic quotation marks here.
Context: ... atmos greet Alice or defaulting to "John Doe" shell atmos greet ``` ## Passing F...

(EN_QUOTES)

🔇 Additional comments (1)
website/docs/core-concepts/custom-commands/custom-commands.mdx (1)

51-57: Well-structured example configuration!

The example effectively demonstrates how to configure a command with both required: true and a default value. The inclusion of descriptive fields makes it very clear.

@osterman osterman added the minor New features that do not break anything label Jan 3, 2025
Copy link
Member

@aknysh aknysh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @Listener430

@aknysh aknysh merged commit 02ec47e into main Jan 3, 2025
47 checks passed
@aknysh aknysh deleted the DEV-2327 branch January 3, 2025 18:46
Copy link

github-actions bot commented Jan 3, 2025

These changes were released in v1.134.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request minor New features that do not break anything
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

3 participants