[System]
You are a helpful assistant that answers strictly in JSON. Here's the JSON schema you must adhere to:
<schema>
{"$defs":{"removed-include-module":{"markdownDescription":"See [include module](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/include_module.html)","not":{},"title":"Replace 'include' with either 'ansible.builtin.include_tasks' or 'ansible.builtin.import_tasks'"},"ansible.builtin.import_playbook":{"additionalProperties":false,"oneOf":[{"not":{"required":["import_playbook"]},"required":["ansible.builtin.import_playbook"]},{"not":{"required":["ansible.builtin.import_playbook"]},"required":["import_playbook"]}],"patternProperties":{"^(ansible\\.builtin\\.)?import_playbook$":{"markdownDescription":"* Includes a file with a list of plays to be executed.\n *  Files with a list of plays can only be included at the top level.\n * You cannot use this action inside a play.\n\nSee [import_playbook](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/import_playbook_module.html)","title":"Import Playbook","type":"string"},"name":{"title":"Name","type":"string"},"tags":{"$ref":"#/$defs/tags"},"vars":{"title":"Vars","type":"object"},"when":{"$ref":"#/$defs/complex_conditional","title":"When"}},"type":"object"},"become_method":{"anyOf":[{"enum":["ansible.builtin.sudo","ansible.builtin.su","community.general.pbrun","community.general.pfexec","ansible.builtin.runas","community.general.dzdo","community.general.ksu","community.general.doas","community.general.machinectl","community.general.pmrun","community.general.sesu","community.general.sudosu"],"type":"string"},{"$ref":"#/$defs/full-jinja"},{"pattern":"[A-Za-z0-9_\\.]+","type":"string"}],"markdownDescription":"See [become](https://docs.ansible.com/ansible/latest/user_guide/become.html)","title":"Become Method"},"block":{"properties":{"always":{"items":{"anyOf":[{"$ref":"#/$defs/task"},{"$ref":"#/$defs/block"}]},"title":"Always","type":"array"},"any_errors_fatal":{"$ref":"#/$defs/templated-boolean","title":"Any Errors Fatal"},"become":{"$ref":"#/$defs/templated-boolean","title":"Become"},"become_exe":{"title":"Become Exe","type":"string"},"become_flags":{"title":"Become Flags","type":"string"},"become_method":{"$ref":"#/$defs/become_method"},"become_user":{"title":"Become User","type":"string"},"block":{"items":{"anyOf":[{"$ref":"#/$defs/task"},{"$ref":"#/$defs/block"}]},"markdownDescription":"Blocks create logical groups of tasks. Blocks also offer ways to handle task errors, similar to exception handling in many programming languages. See [blocks](https://docs.ansible.com/ansible/latest/user_guide/playbooks_blocks.html)","title":"Block","type":"array"},"check_mode":{"$ref":"#/$defs/complex_conditional","title":"Check Mode"},"collections":{"items":{"type":"string"},"title":"Collections","type":"array"},"connection":{"title":"Connection","type":"string"},"debugger":{"title":"Debugger","type":"string"},"delegate_facts":{"title":"Delegate Facts","type":"boolean"},"delegate_to":{"title":"Delegate To","type":"string"},"diff":{"$ref":"#/$defs/templated-boolean","title":"Diff"},"environment":{"$ref":"#/$defs/environment"},"ignore_errors":{"$ref":"#/$defs/ignore_errors"},"ignore_unreachable":{"title":"Ignore Unreachable","$ref":"#/$defs/templated-boolean"},"module_defaults":{"title":"Module Defaults"},"name":{"title":"Name","type":"string"},"no_log":{"$ref":"#/$defs/templated-boolean"},"port":{"$ref":"#/$defs/templated-integer"},"remote_user":{"title":"Remote User","type":"string"},"rescue":{"items":{"anyOf":[{"$ref":"#/$defs/task"},{"$ref":"#/$defs/block"}]},"title":"Rescue","type":"array"},"run_once":{"$ref":"#/$defs/templated-boolean","title":"Run Once"},"tags":{"$ref":"#/$defs/tags","title":"Tags"},"throttle":{"$ref":"#/$defs/templated-integer","title":"Throttle"},"timeout":{"$ref":"#/$defs/templated-integer","title":"Timeout"},"vars":{"title":"Vars","type":"object"},"when":{"$ref":"#/$defs/complex_conditional","title":"When"}},"required":["block"],"type":"object"},"complex_conditional":{"oneOf":[{"type":"boolean"},{"type":"string"},{"items":{"anyOf":[{"type":"boolean"},{"type":"string"}]},"type":"array"}]},"environment":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"$ref":"#/$defs/full-jinja"}],"title":"Environment"},"full-jinja":{"pattern":"^\\{[\\{%](.|[\r\n])*[\\}%]\\}$","type":"string"},"ignore_errors":{"$ref":"#/$defs/templated-boolean","markdownDescription":"See [ignore_errors](https://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html#ignoring-failed-commands)","title":"Ignore Errors"},"no_log":{"$ref":"#/$defs/templated-boolean","markdownDescription":"Use for protecting sensitive data. See [no_log](https://docs.ansible.com/ansible/latest/reference_appendices/logging.html)","title":"no_log"},"play":{"additionalProperties":false,"allOf":[{"not":{"required":["ansible.builtin.import_playbook"]}},{"not":{"required":["import_playbook"]}}],"properties":{"any_errors_fatal":{"$ref":"#/$defs/templated-boolean","title":"Any Errors Fatal"},"become":{"$ref":"#/$defs/templated-boolean","title":"Become"},"become_exe":{"title":"Become Exe","type":"string"},"become_flags":{"title":"Become Flags","type":"string"},"become_method":{"$ref":"#/$defs/become_method"},"become_user":{"title":"Become User","type":"string"},"check_mode":{"$ref":"#/$defs/complex_conditional","title":"Check Mode"},"collections":{"items":{"type":"string"},"title":"Collections","type":"array"},"connection":{"title":"Connection","type":"string"},"debugger":{"title":"Debugger","type":"string"},"diff":{"$ref":"#/$defs/templated-boolean","title":"Diff"},"environment":{"$ref":"#/$defs/environment"},"fact_path":{"title":"Fact Path","type":"string"},"force_handlers":{"title":"Force Handlers","type":"boolean"},"gather_facts":{"$ref":"#/$defs/templated-boolean","title":"Gather Facts"},"gather_subset":{"items":{"anyOf":[{"enum":["all","min","all_ipv4_addresses","all_ipv6_addresses","apparmor","architecture","caps","chroot,cmdline","date_time","default_ipv4","default_ipv6","devices","distribution","distribution_major_version","distribution_release","distribution_version","dns","effective_group_ids","effective_user_id","env","facter","fips","hardware","interfaces","is_chroot","iscsi","kernel","local","lsb","machine","machine_id","mounts","network","ohai","os_family","pkg_mgr","platform","processor","processor_cores","processor_count","python","python_version","real_user_id","selinux","service_mgr","ssh_host_key_dsa_public","ssh_host_key_ecdsa_public","ssh_host_key_ed25519_public","ssh_host_key_rsa_public","ssh_host_pub_keys","ssh_pub_keys","system","system_capabilities","system_capabilities_enforced","systemd","user","user_dir","user_gecos","user_gid","user_id","user_shell","user_uid","virtual","virtualization_role","virtualization_type"],"type":"string"},{"enum":["!all","!min","!all_ipv4_addresses","!all_ipv6_addresses","!apparmor","!architecture","!caps","!chroot,cmdline","!date_time","!default_ipv4","!default_ipv6","!devices","!distribution","!distribution_major_version","!distribution_release","!distribution_version","!dns","!effective_group_ids","!effective_user_id","!env","!facter","!fips","!hardware","!interfaces","!is_chroot","!iscsi","!kernel","!local","!lsb","!machine","!machine_id","!mounts","!network","!ohai","!os_family","!pkg_mgr","!platform","!processor","!processor_cores","!processor_count","!python","!python_version","!real_user_id","!selinux","!service_mgr","!ssh_host_key_dsa_public","!ssh_host_key_ecdsa_public","!ssh_host_key_ed25519_public","!ssh_host_key_rsa_public","!ssh_host_pub_keys","!ssh_pub_keys","!system","!system_capabilities","!system_capabilities_enforced","!systemd","!user","!user_dir","!user_gecos","!user_gid","!user_id","!user_shell","!user_uid","!virtual","!virtualization_role","!virtualization_type"],"type":"string"}]},"title":"Gather Subset","type":"array"},"gather_timeout":{"$ref":"#/$defs/templated-integer","title":"Gather Timeout"},"handlers":{"$ref":"#/$defs/tasks"},"hosts":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Hosts"},"ignore_errors":{"$ref":"#/$defs/ignore_errors"},"ignore_unreachable":{"title":"Ignore Unreachable","$ref":"#/$defs/templated-boolean"},"max_fail_percentage":{"title":"Max Fail Percentage","$ref":"#/$defs/templated-integer"},"module_defaults":{"title":"Module Defaults"},"name":{"title":"Name","type":"string"},"no_log":{"$ref":"#/$defs/templated-boolean"},"order":{"oneOf":[{"enum":["inventory","reverse_inventory","reverse_sorted","shuffle","sorted"],"type":"string"},{"$ref":"#/$defs/full-jinja"}],"title":"Order","markdownDescription":"See https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_strategies.html#ordering-execution-based-on-inventory"},"port":{"$ref":"#/$defs/templated-integer","title":"Port"},"post_tasks":{"$ref":"#/$defs/tasks"},"pre_tasks":{"$ref":"#/$defs/tasks"},"remote_user":{"title":"Remote User","type":"string"},"roles":{"items":{"anyOf":[{"$ref":"#/$defs/play-role"},{"type":"string"}]},"markdownDescription":"Roles let you automatically load related vars, files, tasks, handlers, and other Ansible artifacts based on a known file structure. After you group your content in roles, you can easily reuse them and share them with other users.\n See [roles](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#roles)","title":"Roles","type":"array"},"run_once":{"$ref":"#/$defs/templated-boolean","title":"Run Once"},"serial":{"anyOf":[{"$ref":"#/$defs/templated-integer-or-percent"},{"items":{"$ref":"#/$defs/templated-integer-or-percent"},"type":"array"}],"markdownDescription":"Integer, percentage or list of those. See [Setting the batch size with serial](https://docs.ansible.com/ansible/latest/user_guide/playbooks_strategies.html#setting-the-batch-size-with-serial)","title":"Batch size"},"strategy":{"title":"Strategy","type":"string"},"tags":{"$ref":"#/$defs/tags","title":"Tags"},"tasks":{"$ref":"#/$defs/tasks"},"throttle":{"$ref":"#/$defs/templated-integer","title":"Throttle"},"timeout":{"$ref":"#/$defs/templated-integer","title":"Timeout"},"user":{"title":"Remote User","type":"string"},"vars":{"title":"Vars","type":"object"},"vars_files":{"items":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"title":"Vars Files","type":["array","string","null"]},"vars_prompt":{"items":{"$ref":"#/$defs/vars_prompt"},"markdownDescription":"See [vars_prompt](https://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html)","title":"vars_prompt","type":"array"},"when":{"$ref":"#/$defs/complex_conditional","title":"When"}},"required":["hosts"],"title":"play","type":"object"},"play-role":{"markdownDescription":"See [roles](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#roles)","properties":{"any_errors_fatal":{"$ref":"#/$defs/templated-boolean","title":"Any Errors Fatal"},"become":{"$ref":"#/$defs/templated-boolean","title":"Become"},"become_exe":{"title":"Become Exe","type":"string"},"become_flags":{"title":"Become Flags","type":"string"},"become_method":{"$ref":"#/$defs/become_method"},"become_user":{"title":"Become User","type":"string"},"check_mode":{"$ref":"#/$defs/complex_conditional","title":"Check Mode"},"collections":{"items":{"type":"string"},"title":"Collections","type":"array"},"connection":{"title":"Connection","type":"string"},"debugger":{"title":"Debugger","type":"string"},"delegate_to":{"title":"Delegate To","type":"string"},"diff":{"$ref":"#/$defs/templated-boolean","title":"Diff"},"environment":{"$ref":"#/$defs/environment"},"ignore_errors":{"$ref":"#/$defs/ignore_errors"},"ignore_unreachable":{"title":"Ignore Unreachable","$ref":"#/$defs/templated-boolean"},"module_defaults":{"title":"Module Defaults"},"name":{"title":"Name","type":"string"},"no_log":{"$ref":"#/$defs/templated-boolean"},"port":{"$ref":"#/$defs/templated-integer","title":"Port"},"remote_user":{"title":"Remote User","type":"string"},"role":{"title":"Role","type":"string"},"run_once":{"$ref":"#/$defs/templated-boolean","title":"Run Once"},"tags":{"$ref":"#/$defs/tags","title":"Tags"},"throttle":{"$ref":"#/$defs/templated-integer","title":"Throttle"},"timeout":{"$ref":"#/$defs/templated-integer","title":"Timeout"},"vars":{"title":"Vars","type":"object"},"when":{"$ref":"#/$defs/complex_conditional","title":"When"}},"required":["role"],"title":"play-role","type":"object"},"playbook":{"examples":["playbooks/*.yml","playbooks/*.yaml"],"items":{"oneOf":[{"$ref":"#/$defs/ansible.builtin.import_playbook"},{"$ref":"#/$defs/play"}]},"title":"Ansible Playbook","type":"array"},"tags":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Tags"},"task":{"additionalProperties":true,"allOf":[{"not":{"required":["hosts"]}},{"not":{"required":["tasks"]}},{"not":{"required":["import_playbook"]}},{"not":{"required":["block"]}}],"properties":{"action":{"title":"Action","type":"string"},"ansible.builtin.include":{"$ref":"#/$defs/removed-include-module"},"include":{"$ref":"#/$defs/removed-include-module"},"ansible.legacy.include":{"$ref":"#/$defs/removed-include-module"},"any_errors_fatal":{"$ref":"#/$defs/templated-boolean","title":"Any Errors Fatal"},"args":{"$ref":"#/$defs/templated-object","title":"Args"},"async":{"$ref":"#/$defs/templated-integer","title":"Async"},"become":{"$ref":"#/$defs/templated-boolean","title":"Become"},"become_exe":{"title":"Become Exe","type":"string"},"become_flags":{"title":"Become Flags","type":"string"},"become_method":{"$ref":"#/$defs/become_method"},"become_user":{"title":"Become User","type":"string"},"changed_when":{"$ref":"#/$defs/complex_conditional","markdownDescription":"See [changed_when](https://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html#defining-changed)","title":"Changed When"},"check_mode":{"$ref":"#/$defs/complex_conditional","title":"Check Mode"},"collections":{"items":{"type":"string"},"title":"Collections","type":"array"},"connection":{"title":"Connection","type":"string"},"debugger":{"title":"Debugger","type":"string"},"delay":{"$ref":"#/$defs/templated-integer","title":"Delay"},"delegate_facts":{"title":"Delegate Facts","type":"boolean"},"delegate_to":{"title":"Delegate To","type":"string"},"diff":{"$ref":"#/$defs/templated-boolean","title":"Diff"},"environment":{"$ref":"#/$defs/environment"},"failed_when":{"$ref":"#/$defs/complex_conditional","title":"Failed When"},"ignore_errors":{"$ref":"#/$defs/ignore_errors"},"ignore_unreachable":{"title":"Ignore Unreachable","$ref":"#/$defs/templated-boolean"},"listen":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"markdownDescription":"Applies only to handlers. See [listen](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_handlers.html)","title":"Listen"},"local_action":{"title":"Local Action","type":["string","object"]},"loop":{"title":"Loop","type":["string","array"]},"loop_control":{"title":"Loop Control"},"module_defaults":{"title":"Module Defaults"},"name":{"title":"Name","type":"string"},"no_log":{"$ref":"#/$defs/no_log"},"notify":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Notify"},"poll":{"$ref":"#/$defs/templated-integer","title":"Poll"},"port":{"$ref":"#/$defs/templated-integer","title":"Port"},"register":{"title":"Register","type":"string"},"remote_user":{"title":"Remote User","type":"string"},"retries":{"$ref":"#/$defs/templated-integer","title":"Retries"},"run_once":{"$ref":"#/$defs/templated-boolean","title":"Run Once"},"tags":{"$ref":"#/$defs/tags","title":"Tags"},"throttle":{"$ref":"#/$defs/templated-integer","title":"Throttle"},"timeout":{"$ref":"#/$defs/templated-integer","title":"Timeout"},"until":{"$ref":"#/$defs/complex_conditional","title":"Until"},"vars":{"title":"Vars","type":"object"},"when":{"$ref":"#/$defs/complex_conditional","title":"When"},"with_dict":{"title":"With Dict"},"with_fileglob":{"title":"With Fileglob"},"with_filetree":{"title":"With Filetree"},"with_first_found":{"title":"With First Found"},"with_indexed_items":{"title":"With Indexed Items"},"with_ini":{"title":"With Ini"},"with_inventory_hostnames":{"title":"With Inventory Hostnames"},"with_items":{"anyOf":[{"$ref":"#/$defs/full-jinja"},{"type":"array"}],"markdownDescription":"See [loops](https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#loops)","title":"With Items"},"with_lines":{"title":"With Lines"},"with_random_choice":{"title":"With Random Choice"},"with_sequence":{"title":"With Sequence"},"with_subelements":{"title":"With Subelements"},"with_together":{"title":"With Together"}},"title":"task","type":"object"},"tasks":{"$schema":"http://json-schema.org/draft-07/schema","examples":["tasks/*.yml","handlers/*.yml"],"items":{"anyOf":[{"$ref":"#/$defs/block"},{"$ref":"#/$defs/task"}]},"title":"Ansible Tasks Schema","type":["array","null"]},"templated-boolean":{"oneOf":[{"type":"boolean"},{"$ref":"#/$defs/full-jinja","type":"string"}]},"templated-integer":{"oneOf":[{"type":"integer"},{"$ref":"#/$defs/full-jinja","type":"string"}]},"templated-integer-or-percent":{"oneOf":[{"type":"integer"},{"pattern":"^\\d+\\.?\\d*%?$","type":"string"},{"$ref":"#/$defs/full-jinja","type":"string"}]},"templated-object":{"oneOf":[{"type":"object"},{"$ref":"#/$defs/full-jinja","type":"string"}]},"vars_prompt":{"additionalProperties":false,"properties":{"confirm":{"title":"Confirm","type":"boolean"},"default":{"title":"Default","type":"string"},"encrypt":{"enum":["des_crypt","bsdi_crypt","bigcrypt","crypt16","md5_crypt","bcrypt","sha1_crypt","sun_md5_crypt","sha256_crypt","sha512_crypt","apr_md5_crypt","phpass","pbkdf2_digest","cta_pbkdf2_sha1","dlitz_pbkdf2_sha1","scram","bsd_nthash"],"title":"Encrypt","type":"string"},"name":{"title":"Name","type":"string"},"private":{"default":true,"title":"Private","type":"boolean"},"prompt":{"title":"Prompt","type":"string"},"salt_size":{"default":8,"title":"Salt Size","type":"integer"},"unsafe":{"default":false,"markdownDescription":"See [unsafe](https://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html#allowing-special-characters-in-vars-prompt-values)","title":"Unsafe","type":"boolean"}},"required":["name","prompt"],"type":"object"}},"$id":"https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/ansible.json","$schema":"http://json-schema.org/draft-07/schema","additionalProperties":false,"description":"https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html","examples":[],"title":"Ansible Schemas Bundle 22.4","type":["array","object"]}
</schema>

[User] Provide a JSON object that satisfies the schema "Ansible Schemas Bundle 22.4". Here are the required top‑level fields: none (all optional). Return only the valid JSON object.

Replace 'include' with either 'ansible.builtin.include_tasks' or 'ansible.builtin.import_tasks'

* Includes a file with a list of plays to be executed.
 *  Files with a list of plays can only be included at the top level.
 * You cannot use this action inside a play.

See [import_playbook](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/import_playbook_module.html)

Import Playbook

Name

Vars

When

Become Method

Always

Any Errors Fatal

Become

Become Exe

Become Flags

Become User

Blocks create logical groups of tasks. Blocks also offer ways to handle task errors, similar to exception handling in many programming languages. See [blocks](https://docs.ansible.com/ansible/latest/user_guide/playbooks_blocks.html)

Block

Check Mode

Collections

Connection

Debugger

Delegate Facts

Delegate To

Diff

Ignore Unreachable

Module Defaults

Name

Remote User

Rescue

Run Once

Tags

Throttle

Timeout

Vars

When

Environment

Ignore Errors

Use for protecting sensitive data. See [no_log](https://docs.ansible.com/ansible/latest/reference_appendices/logging.html)

no_log

Any Errors Fatal

Become

Become Exe

Become Flags

Become User

Check Mode

Collections

Connection

Debugger

Diff

Fact Path

Force Handlers

Gather Facts

Gather Subset

Gather Timeout

Hosts

Ignore Unreachable

Max Fail Percentage

Module Defaults

Name

Order

Port

Remote User

Roles let you automatically load related vars, files, tasks, handlers, and other Ansible artifacts based on a known file structure. After you group your content in roles, you can easily reuse them and share them with other users.
 See [roles](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html#roles)

Roles

Run Once

Integer, percentage or list of those. See [Setting the batch size with serial](https://docs.ansible.com/ansible/latest/user_guide/playbooks_strategies.html#setting-the-batch-size-with-serial)

Batch size

Strategy

Tags

Throttle

Timeout

Remote User

Vars

Vars Files

vars_prompt

When

play

Any Errors Fatal

Become

Become Exe

Become Flags

Become User

Check Mode

Collections

Connection

Debugger

Delegate To

Diff

Ignore Unreachable

Module Defaults

Name

Port

Remote User

Role

Run Once

Tags

Throttle

Timeout

Vars

When

play-role

Ansible Playbook

Tags

Action

Any Errors Fatal

Args

Async

Become

Become Exe

Become Flags

Become User

Changed When

Check Mode

Collections

Connection

Debugger

Delay

Delegate Facts

Delegate To

Diff

Failed When

Ignore Unreachable

Applies only to handlers. See [listen](https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_handlers.html)

Listen

Local Action

Loop

Loop Control

Module Defaults

Name

Notify

Poll

Port

Register

Remote User

Retries

Run Once

Tags

Throttle

Timeout

Until

Vars

When

With Dict

With Fileglob

With Filetree

With First Found

With Indexed Items

With Ini

With Inventory Hostnames

With Items

With Lines

With Random Choice

With Sequence

With Subelements

With Together

task

Ansible Tasks Schema

Confirm

Default

Encrypt

Name

Private

Prompt

Salt Size

Unsafe

Ansible Schemas Bundle 22.4

Provide a JSON object that satisfies the schema "Ansible Schemas Bundle 22.4". Here are the required top‑level fields: none (all optional). Return only the valid JSON object.


[User] Provide a JSON object that satisfies the schema "taurus". Here are the required top‑level fields: none (all optional). Return only the valid JSON object.

ab apiritif gatling grinder jmeter junit locust mocha molotov newman nunit pbench pytest rspec selenium siege tsung wdio

final-stats console blazemeter junit-xml

Provide a JSON object that satisfies the schema "taurus". Here are the required top‑level fields: none (all optional). Return only the valid JSON object.


[System]
You are a helpful assistant that answers strictly in JSON. Here's the JSON schema you must adhere to:
<schema>
{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://json.schemastore.org/telefonistka.json","title":"Schema for repo-level telefonistka.yaml files","type":"object","additionalProperties":false,"definitions":{"path":{"type":"object","description":"A promotion flow","properties":{"sourcePath":{"type":"string","description":"The directory that holds components(subdirectories) to be synced, can include a regex"},"componentPathExtraDepth":{"type":"integer","description":"The number of extra nesting levels to add to the 'components' being promoted, this allows nesting components in subdirectories while keeping them distinct. A 2 value will mean the component name includes the 3 subdirectories under the sourcePath"},"conditions":{"type":"object","description":"Conditions for triggering a specific promotion flows. Flows are evaluated in order, first one to match is triggered","properties":{"prHasLabels":{"type":"array","description":"Array of PR labels, if the triggering PR has any of these labels the condition is considered fulfilled","items":{"type":"string"}},"autoMerge":{"type":"boolean","description":"If set to true, PR will be automatically merged after it is created"}}},"promotionPrs":{"type":"array","description":"List of PR that will be opened when files are changed under sourcePath","items":{"$ref":"#/definitions/pr"}}}},"pr":{"type":"object","description":"A PR that will be opened when files are changed under sourcePath","properties":{"targetPaths":{"type":"array","description":"A directory to be synced from the changed component under sourcePath","items":{"type":"string"}},"targetDescription":{"type":"string","description":"An optional string that describes the target paths, will be used in the promotion PR titles"}}},"regex":{"type":"object","description":"Regex to configure Github event forwarding","properties":{"expression":{"type":"string","description":"Directory in the repo to watch for watch"},"replacements":{"type":"array","description":"List of webhook endpoint to send the Github event. You can use capture groups from the regex expression","items":{"type":"string"}}}}},"properties":{"promotionPaths":{"type":"array","description":"List of promotion flow","items":{"$ref":"#/definitions/path"}},"promtionPRlables":{"type":"array","description":"List of labels to apply on PR","items":{"type":"string"}},"dryRunMode":{"type":"boolean","description":"If true, the bot will comment the planned promotion on the merged PR"},"autoApprovePromotionPrs":{"type":"boolean","description":"If true the bot will auto-approve all promotion PRs, with the assumption the original PR was peer reviewed and is promoted verbatim. Required additional GH token via APPROVER_GITHUB_OAUTH_TOKEN env variable"},"toggleCommitStatus":{"type":"object","description":"Map of strings, allow (non-repo-admin) users to change the Github commit status state(from failure to success and back). This can be used to continue promotion of a change that doesn't pass repo checks. the keys are strings commented in the PRs, values are Github commit status context to be overridden"},"webhookEndpointRegexs":{"type":"array","description":"List of configuration for Github event forwarding","items":{"$ref":"#/definitions/regex"}},"whProxtSkipTLSVerifyUpstream":{"type":"boolean","description":"This disables upstream TLS server certificate validation for the webhook proxy functionality. Default is false"},"argocd":{"type":"object","description":"ArgoCD configuration","properties":{"commentDiffonPR":{"type":"boolean","description":"Uses ArgoCD API to calculate expected changes to k8s state and comment the resulting 'diff' as comment in the PR"},"autoMergeNoDiffPRs":{"type":"boolean","description":"If true, Telefonistka will merge promotion PRs that are not expected to change the target clusters"},"useSHALabelForAppDiscovery":{"type":"boolean","description":"Use SHA1 of the application path as a label and rely on ArgoCD server-side filtering, label name is telefonistka.io/component-path-sha1"},"allowSyncfromBranchPathRegex":{"type":"string","description":"This controls which component(=ArgoCD apps) are allowed to be 'applied' from a PR branch, by setting the ArgoCD application Target Revision to PR branch"},"createTempAppObjectFromNewApps":{"type":"boolean","description":"For application created in PR Telefonistka needs to create a temporary ArgoCD Application Object to render the manifests, this key enables this behavior"}}},"promotionTargetBlockList":{"type":"array","description":"Component-level configuration only. Highest priority. List of target paths blocked from promoting. Can be regex","items":{"type":"string"}},"promotionTargetAllowList":{"type":"array","description":"Component-level configuration only. List of target paths allowed to be promoted. Can be regex","items":{"type":"string"}},"disableArgoCDDiff":{"type":"boolean","description":"Component-level configuration only. If true, no sensitive information stored outside kind:Secret objects is persisted to PR comments"}}}
</schema>

[User] Provide a JSON object that satisfies the schema "Schema for repo-level telefonistka.yaml files". Here are the required top‑level fields: none (all optional). Return only the valid JSON object.

A promotion flow

The directory that holds components(subdirectories) to be synced, can include a regex

The number of extra nesting levels to add to the 'components' being promoted, this allows nesting components in subdirectories while keeping them distinct. A 2 value will mean the component name includes the 3 subdirectories under the sourcePath

Conditions for triggering a specific promotion flows. Flows are evaluated in order, first one to match is triggered

Array of PR labels, if the triggering PR has any of these labels the condition is considered fulfilled

If set to true, PR will be automatically merged after it is created

List of PR that will be opened when files are changed under sourcePath

A PR that will be opened when files are changed under sourcePath

A directory to be synced from the changed component under sourcePath

An optional string that describes the target paths, will be used in the promotion PR titles

Regex to configure Github event forwarding

Directory in the repo to watch for watch

List of webhook endpoint to send the Github event. You can use capture groups from the regex expression

List of promotion flow

List of labels to apply on PR

If true, the bot will comment the planned promotion on the merged PR

If true the bot will auto-approve all promotion PRs, with the assumption the original PR was peer reviewed and is promoted verbatim. Required additional GH token via APPROVER_GITHUB_OAUTH_TOKEN env variable

Map of strings, allow (non-repo-admin) users to change the Github commit status state(from failure to success and back). This can be used to continue promotion of a change that doesn't pass repo checks. the keys are strings commented in the PRs, values are Github commit status context to be overridden

List of configuration for Github event forwarding

This disables upstream TLS server certificate validation for the webhook proxy functionality. Default is false

ArgoCD configuration

Uses ArgoCD API to calculate expected changes to k8s state and comment the resulting 'diff' as comment in the PR

If true, Telefonistka will merge promotion PRs that are not expected to change the target clusters

Use SHA1 of the application path as a label and rely on ArgoCD server-side filtering, label name is telefonistka.io/component-path-sha1

This controls which component(=ArgoCD apps) are allowed to be 'applied' from a PR branch, by setting the ArgoCD application Target Revision to PR branch

For application created in PR Telefonistka needs to create a temporary ArgoCD Application Object to render the manifests, this key enables this behavior

Component-level configuration only. Highest priority. List of target paths blocked from promoting. Can be regex

Component-level configuration only. List of target paths allowed to be promoted. Can be regex

Component-level configuration only. If true, no sensitive information stored outside kind:Secret objects is persisted to PR comments

Provide a JSON object that satisfies the schema "Schema for repo-level telefonistka.yaml files". Here are the required top‑level fields: none (all optional). Return only the valid JSON object.


[System]
You are a helpful assistant that answers strictly in JSON. Here's the JSON schema you must adhere to:
<schema>
{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"supportedPlatforms":{"type":"array","items":{"type":"string","enum":["android","wasm","js","jvm","native"]},"minItems":1,"uniqueItems":true},"propertyDefinitions":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"propertyType":{"type":"string","enum":["String","Boolean"]},"nullable":{"type":"boolean"},"supportedPlatforms":{"type":"array","items":{"type":"string","enum":["android","wasm","js","jvm","native"]},"uniqueItems":true}},"required":["name","propertyType"]},"minItems":1,"uniqueItems":true}},"required":["supportedPlatforms","propertyDefinitions"]}
</schema>

[User] Provide a JSON object that satisfies the schema "template-schema". Here are the required top‑level fields: supportedPlatforms, propertyDefinitions. Return only the valid JSON object.

Provide a JSON object that satisfies the schema "template-schema". Here are the required top‑level fields: supportedPlatforms, propertyDefinitions. Return only the valid JSON object.


[System]
You are a helpful assistant that answers strictly in JSON. Here's the JSON schema you must adhere to:
<schema>
{"$schema":"http://json-schema.org/draft-07/schema#","$id":"https://json.schemastore.org/template.json","definitions":{"datatype":{"description":"Indicates limitations on the valid values a symbol may be assigned. When specified, the symbol value is attempted to be converted to this type. The datatype \"choice\" is supported only for parameter symbols and requires providing symbols.choices configuration for the symbol.","anyOf":[{"enum":["choice","bool","float","int","hex","text"]},{"pattern":"^(integer|string)$"}]},"generatorConstant":{"properties":{"generator":{"enum":["constant"]},"parameters":{"properties":{"value":{"description":"The constant value to be assigned to the symbol.","type":"string"}}}}},"generatorGuid":{"properties":{"generator":{"enum":["guid"]},"parameters":{"properties":{"format":{"deprecated":true,"deprecationMessage":"This property is not maintained and may be removed in the future. Use defaultFormat instead, or use 'guids' section.","description":"This property is not maintained and may be removed in the future. Use defaultFormat instead, or use 'guids' section.","type":"string"},"defaultFormat":{"description":"The format of guid to be generated. Accepts a single value from ('n', 'd', 'b', 'p', 'x') for lowercase output or ('N', 'D', 'B', 'P', 'X') for uppercase output. The formats are defined in Guid.ToString() method documentation.","type":"string"}}}}},"generatorNow":{"properties":{"generator":{"enum":["now"]},"parameters":{"properties":{"format":{"description":"The format string to use when converting the date-time to a string representation.","type":"string"},"utc":{"description":"If true, use UTC time. If false, use local time.","type":"boolean"}}}}},"generatorRandom":{"properties":{"generator":{"enum":["random"]},"parameters":{"required":["low"],"properties":{"low":{"description":"An integer value indicating the low-end of the range to generate the random number in.","type":"integer"},"high":{"description":"An integer value indicating the high-end of the range to generate the random number in. If not explicitly provided, defaults to int.MaxValue.","type":"integer"}}}}},"generatorRegex":{"properties":{"generator":{"enum":["regex"]},"parameters":{"properties":{"source":{"description":"The name of a different parameter in the template configuration. A copy of its value will be used by this generator's regex to generate the value for this parameter. The value of the source parameter is not modified.","type":"string"},"steps":{"description":"An ordered list of key-value pairs indicating the regex replacement actions. Each element of the list must contain exactly the keys 'regex' and 'replacement' - along with their values. These replacements will be applied to the result of the previous replacement (except the first, which acts on the original value from the source).","type":"array","items":{"required":["regex","replacement"],"properties":{"regex":{"description":"The regular expression to use to locate the sequence to replace.","type":"string"},"replacement":{"description":"The replacement for any sequences matched by the supplied regular expression.","type":"string"}}}}}}}},"generatorRegexMatch":{"properties":{"generator":{"enum":["regexMatch"]},"datatype":{"enum":["bool"]},"parameters":{"properties":{"source":{"description":"The symbol to search for a match. Its value will be used by this generator's regex to evaluate if there is a match. The value of the source parameter is not modified.","type":"string"},"pattern":{"description":"The regular expression to use to match.","type":"string"}}}}},"generatorCoalesce":{"properties":{"generator":{"enum":["coalesce"]},"parameters":{"type":"object","required":["sourceVariableName","fallbackVariableName"],"properties":{"sourceVariableName":{"type":"string","description":"The name of the symbol whose value will be inspected - if the value is effectively equal to the default value, the value of the symbol referred to by fallbackVariableName is used, otherwise the value of this symbol."},"defaultValue":{"type":"string","description":"The value to consider as being the default - if the value of the symbol referred to by sourceVariableName is equal to this, the value of the symbol referred to in fallbackVariableName is used instead.","default":""},"fallbackVariableName":{"type":"string","description":"The name of the symbol to return the value of if the symbol referred to by sourceVariableName has a value equal to the value of defaultValue."}}}}},"generatorCasing":{"properties":{"generator":{"enum":["casing"]},"parameters":{"required":["source"],"properties":{"source":{"description":"The name of the symbol whose value should have its case changed.","type":"string"},"toLower":{"description":"Whether the case changed to should be lower case, if false, the value is made to be uppercase instead.","type":"boolean","default":true}}}}},"generatorPort":{"properties":{"generator":{"enum":["port"]},"parameters":{"properties":{"low":{"description":"The lower bound of acceptable port numbers.","type":"integer","default":1024},"high":{"description":"The upper bound of acceptable port numbers.","type":"integer","default":65535},"fallback":{"description":"The port number to use if no free ports could be found.","type":"integer","default":0}}}}},"generatorSwitch":{"properties":{"generator":{"enum":["switch"]},"parameters":{"properties":{"evaluator":{"description":"The style of evaluator to use.","enum":["C++","C++2","MSBUILD","VB"],"default":"C++"},"datatype":{"$ref":"#/definitions/datatype"},"cases":{"description":"The set of cases to test for. The first one, in document order, to return true's value is used, if none return true, empty string is returned.","type":"array","items":{"type":"object","required":["condition","value"],"properties":{"condition":{"description":"An expression to be interpreted by the specified evaluator type.","type":"string"},"value":{"description":"The value to return if the condition evaluates to true.","type":"string"}}}}}}}},"generatorJoin":{"properties":{"generator":{"enum":["join"]},"parameters":{"properties":{"separator":{"description":"The value used as the separator between the values to be concatenated, notice that you can use \"/\" as folder separator also on Windows since File API will convert it into \"\\\".","default":"","type":"string"},"removeEmptyValues":{"description":"Indication whether null and empty strings should be removed from joining to prevent repetitive separators.","default":"false","type":"boolean"},"symbols":{"description":"All values to concatenate.","type":"array","items":{"type":"object","required":["value"],"properties":{"type":{"description":"\"ref\" to reference value from another symbol or \"const\" for string constant, defaults to \"const\".","enum":["ref","const"]},"value":{"description":"Either name of another symbol or string constant.","type":"string"}}}}}}}},"guid":{"pattern":"^\\{?[0-9A-Fa-f]{8}[-]?([0-9A-Fa-f]{4}[-]?){3}[0-9A-Fa-f]{12}\\}?$","description":"A guid string to be replaced in source files. Format and casing is not significant in the config as format and casing is preserved based on the particular guid in processed file(s).","type":"string"},"ice":{"anyOf":[{"type":"array","uniqueItems":true,"items":{"type":"string"}},{"type":"string"}]},"modifier":{"type":"object","properties":{"condition":{"description":"Boolean condition to indicate if the sources configuration should be included or ignored. If the condition evaluates to true or is not provided, the sources config will be used for creating the template. If it evaluates to false, the sources config will be ignored.","type":"string"},"exclude":{"description":"The set of globbing patterns indicating the content that was included by sources.include that should not be processed.","allOf":[{"$ref":"#/definitions/ice"}],"default":["**/[Bb]in/**","**/[Oo]bj/**",".template.config/**/*","**/*.filelist","**/*.user","**/*.lock.json"]},"include":{"description":"The set of globbing patterns indicating the content to process in the path referred to by the source.","allOf":[{"$ref":"#/definitions/ice"}],"default":["**/*"]},"copyOnly":{"description":"The set of globbing patterns indicating the content that was included by sources.include, that hasn't been excluded by sources.exclude that should be placed in the user's directory without modification.","allOf":[{"$ref":"#/definitions/ice"}],"default":["**/node_modules/**/*"]},"rename":{"description":"The set of explicit renames to perform. Each key is a path to a file in the source, each value is a path to the target location.","type":"object","additionalProperties":{"type":"string"}}}},"source":{"type":"object","allOf":[{"$ref":"#/definitions/modifier"}],"properties":{"modifiers":{"description":"A list of additional source information which gets added to the top-level source information, based on evaluation the corresponding source.modifiers.condition.","type":"array","items":{"$ref":"#/definitions/modifier"}},"source":{"description":"The path in the template content (relative to the directory containing the .template.config folder) that should be processed.","type":"string","default":"./"},"target":{"description":"The path (relative to the directory the user has specified) that content should be written to.","type":"string","default":"./"}}}},"properties":{"author":{"description":"The author of the template.","type":"string"},"classifications":{"description":"Zero or more characteristics of the template that a user might search for it by.","type":"array","items":{"type":"string","minLength":1}},"defaultName":{"description":"The name to use during creation if no name has been specified by the user or provided from the host.","type":"string","minLength":1},"generatorVersions":{"description":"The semantic version range of the Microsoft.TemplateEngine.Orchestrator.RunnableProjects package that this template is usable with. In older versions of the engine, the four octet version string is used but is matched against a constant which was never changed from 1.0.0.0 - either syntax is now accepted, however the four octet string will not be changed from 1.0.0.0.","type":"string","default":"[1.0.0.0-*)"},"groupIdentity":{"description":"The ID of the group this template belongs to. When combined with the \"tags\" section, this allows multiple templates to be displayed as one, with the the decision for which one to use being presented as a choice in each one of the pivot categories (keys).","type":"string","minLength":1},"guids":{"description":"A list of guids which appear in the template source and should be replaced in the template output. For each guid listed, a replacement guid is generated, and replaces all occurrences of the source guid in the output.","type":"array","uniqueItems":true,"items":{"$ref":"#/definitions/guid"}},"identity":{"description":"A unique name for this template.","type":"string","minLength":1},"name":{"description":"The name for the template that users should see.","type":"string","minLength":1},"placeholderFilename":{"description":"A filename that will be completely ignored except to indicate that its containing directory should be copied. This allows creation of an empty directory in the created template, by having a corresponding source directory containing just the placeholder file. Completely empty directories are ignored.","type":"string","default":"-.-"},"postActions":{"description":"Defines an ordered list of actions to perform after template generation. The post action information is provided to the creation broker, to act on as appropriate.","type":"array","items":{"type":"object","allOf":[{"required":["actionId","manualInstructions"],"properties":{"actionId":{"description":"A guid uniquely defining the action. The value must correspond to a post-action known by the broker.","allOf":[{"$ref":"#/definitions/guid"}]},"args":{"description":"A list of key-value pairs to use when performing the action. The specific parameters required / allowed are defined by the action itself.","type":"object"},"condition":{"description":"A C++ style expression that, if it evaluates to 'false' causes the post-action to be skipped. This expression may refer to any symbols that have been defined.","type":"string"},"continueOnError":{"description":"If this action fails, the value of continueOnError indicates whether to attempt the next action, or stop processing the post actions. Should be set to true when subsequent actions rely on the success of the current action.","type":"boolean","default":false},"description":{"description":"A human-readable description of the action.","type":"string"},"id":{"description":"Defines identifier to be used when localizing the post action artifacts.","type":"string"},"applyFileRenamesToArgs":{"type":"array","items":{"type":"string"},"description":"A list of arguments names from 'args' to which the file renames configured in symbols should be applied."},"applyFileRenamesToManualInstructions":{"description":"If set to true, the file renames configured in symbols should be applied to manual instructions.","type":"boolean","default":false},"manualInstructions":{"description":"An ordered list of possible instructions to display if the action cannot be performed. Each element in the list must contain a key named \"text\", whose value contains the instructions. Each element may also optionally provide a key named \"condition\" - a Boolean evaluate-able string. The first instruction whose condition is false or blank will be considered valid, all others are ignored.","type":"array","items":{"type":"object","required":["text"],"properties":{"condition":{"type":"string"},"text":{"type":"string"},"id":{"description":"Defines identifier to be used when localizing the manual instructions.","type":"string"}}}}}},{"oneOf":[{"not":{"required":["actionId"],"properties":{"actionId":{"enum":["AC1156F7-BB77-4DB8-B28F-24EEBCCA1E5C","3A7C4B45-1F5D-4A30-959A-51B88E82B5D2","B17581D1-C5C9-4489-8F0A-004BE667B814","cb9a6cf3-4f5c-4860-b9d2-03a574959774","210D431B-A78B-4D2F-B762-4ED3E3EA9025","D396686C-DE0E-4DE6-906D-291CD29FC5DE","84C0DA21-51C8-4541-9940-6CA19AF04EE6"]}}}},{"description":"Instruction display - shows a message given by description and manualInstructions as well as an optional command line to ask the user to execute.","properties":{"actionId":{"enum":["AC1156F7-BB77-4DB8-B28F-24EEBCCA1E5C"]},"args":{"properties":{"executable":{"description":"The executable to instruct the user to run.","type":"string"},"args":{"description":"The arguments to instruct the user to run the executable with - if executable is not specified, this value is unused.","type":"string"}}}}},{"description":"Process start - starts a process.","properties":{"actionId":{"enum":["3A7C4B45-1F5D-4A30-959A-51B88E82B5D2"]},"args":{"required":["executable"],"properties":{"redirectStandardOutput":{"description":"Whether or not to redirect stdout for the process (prevents output from being displayed if true).","type":"boolean","default":true},"redirectStandardError":{"description":"Defines whether or not the stderr should be redirected. If the output is redirected, it prevents it from being displayed.","type":"boolean","default":true},"executable":{"description":"The executable to run.","type":"string"},"args":{"description":"The arguments to supply to the executable.","type":"string"}}}}},{"description":"Add reference - adds a reference to a project, package or framework assembly.","properties":{"actionId":{"enum":["B17581D1-C5C9-4489-8F0A-004BE667B814"]},"args":{"required":["referenceType","reference"],"properties":{"referenceType":{"description":"The type of reference to add. project = A project to project reference. package = A NuGet package reference. framework - A framework assembly reference.","type":"string","enum":["project","package","framework"],"default":"false"},"projectFileExtensions":{"description":"Must be a literal extension for the project file(s) of interest, may be a semicolon delimited list. If unspecified, any project file (*.*proj) is allowed.","type":"string"},"reference":{"description":"The reference to be added (if referenceType=package, this is the package ID; if referenceType=framework, this is the path or assembly name; if referenceType=project, this is the path to the project reference to add).","type":"string"},"version":{"description":"The version of the package reference to add, applicable only if referenceType=package.","type":"string"},"targetFiles":{"oneOf":[{"type":"array","items":{"type":"string","uniqueItems":true},"description":"An array of files that should be processed. If not specified, the project file in output directory or its closest parent directory will be used."},{"type":"string","description":"A semicolon delimited list of files that should be processed. If not specified, the project file in output directory or its closest parent directory will be used."}]}}}}},{"description":"chmod - runs chmod on a particular file.","properties":{"actionId":{"enum":["cb9a6cf3-4f5c-4860-b9d2-03a574959774"]},"args":{"type":"object","description":"The permissions to set: the key-value pairs, where the key is a permission, and the value is a file or array of files to apply the permission to.","additionalProperties":{"oneOf":[{"type":"array","items":{"type":"string","uniqueItems":true},"description":"The set of files (or patterns) to apply the permission specified in the property name to."},{"type":"string","description":"The file (or pattern) to apply the permission specified in the property name to."}]}}}},{"description":"NuGet package restore - restores NuGet packages for all primary outputs with file extensions *.proj or *.sln.","properties":{"actionId":{"enum":["210D431B-A78B-4D2F-B762-4ED3E3EA9025"]},"args":{"properties":{"files":{"oneOf":[{"type":"array","items":{"type":"string","uniqueItems":true},"description":"An array of files that should be restored. If not specified, all primary outputs are restored."},{"type":"string","description":"A semicolon delimited list of files that should be restored. If not specified, all primary outputs are restored."}]}}}}},{"description":"Add to solution - Adds one or more of the primary outputs to the first sln file found (searches up the directory tree from the output folder).","properties":{"actionId":{"enum":["D396686C-DE0E-4DE6-906D-291CD29FC5DE"]},"args":{"properties":{"primaryOutputIndexes":{"type":"string","description":"A semicolon delimited list of indexes of the primary outputs that should be added to the solution, if not specified, all primary outputs are used."},"solutionFolder":{"type":"string","description":"The destination solution folder path to add the projects to. Can't be used with 'inRoot'. Optional."},"inRoot":{"type":"boolean","description":"Places the projects in the root of the solution, rather than creating a solution folder. Cannot be used with 'solutionFolder'. Optional. Available since .NET SDK 7.0.200."},"projectFiles":{"oneOf":[{"type":"array","items":{"type":"string","uniqueItems":true},"description":"An array of project files that should be added to solution. If not specified, primary outputs will be used instead."},{"type":"string","description":"A semicolon delimited list of files that should be added to solution. If not specified, primary outputs will be used instead."}]}}}}},{"description":"Open in editor - Adds one or more of the primary outputs to the first sln file found (searches up the directory tree from the output folder).","properties":{"actionId":{"enum":["84C0DA21-51C8-4541-9940-6CA19AF04EE6"]},"args":{"properties":{"files":{"type":"string","description":"A semicolon delimited list of indexes of the primary outputs that should be opened in the editor."}}}}}]}]}},"precedence":{"description":"A value used to determine how preferred this template is among the other templates with the same groupIdentity (higher values are more preferred).","type":["integer","string"],"pattern":"^([0-9]+)$","default":0},"preferDefaultName":{"description":"Indicated which behaviour to use when no `--name` is specified during template creation. If `true` it will use the template's `defaultName`. If no `defaultName` is found, or `preferDefaultName` is `false` it uses the fallback (output folder).","type":["boolean"]},"preferNameDirectory":{"description":"Indicates whether to create a directory for the template if name is specified but an output directory is not set (instead of creating the content directly in the current directory).","type":"boolean"},"primaryOutputs":{"description":"A list of important output paths created during template generation. These paths need to be added to the newly created project at the end of template creation.","type":"array","items":{"type":"object","required":["path"],"properties":{"path":{"description":"The path to the file in the template content whose corresponding output file should be included as a primary output.","type":"string"},"condition":{"description":"The condition for including the specified path in the primary outputs set.","type":"string","default":"true"}}}},"shortName":{"oneOf":[{"description":"A shorthand name for selecting the template in CLI environment. The template short name should be unique across all the installed templates.","type":"string"},{"type":"array","description":"A shorthand name for selecting the template in CLI environment. The first element is a primary choice, and will be used in scenarios which allow only single value for the short name. The template short name should be unique across all the installed templates.","items":{"type":"string"}}],"minLength":1},"sourceName":{"description":"The text in the source content to replace with the name the user specifies. The value of the 'sourceName' is available in built-in 'name' symbol that can be used as the source for creating other symbols and condition expressions. See important information about how to select correct 'sourceName' in https://github.com/dotnet/templating/wiki/Naming-and-default-value-forms.","type":"string"},"sources":{"description":"The set of mappings in the template content to user directories.","type":"array","items":{"$ref":"#/definitions/source"},"default":{"source":"./","target":"./"}},"forms":{"type":"object","description":"Custom value forms used by the template.","additionalProperties":{"type":"object","properties":{"identifier":{"type":"string","description":"The identifier for the value form component that will be used to transform the value."}},"oneOf":[{"not":{"required":["identifier"],"properties":{"identifier":{"enum":["lowerCaseInvariant","xmlEncode","safe_name","lower_safe_name","upperCaseInvariant","replace","safe_namespace","lower_safe_namespace","chain","lowerCase","identity","upperCase","jsonEncode","firstLowerCase","firstLowerCaseInvariant","firstUpperCase","firstUpperCaseInvariant","titleCase","kebabCase","snakeCase"]}}}},{"description":"Lowercases the source value in a culture invariant way.","properties":{"identifier":{"enum":["lowerCaseInvariant"]}}},{"description":"XML encodes the source value.","properties":{"identifier":{"enum":["xmlEncode"]}}},{"description":"Converts the source value to a string suitable for a C# identifier.","properties":{"identifier":{"enum":["safe_name"]}}},{"description":"Converts the source value to a lowercase string suitable for a C# identifier.","properties":{"identifier":{"enum":["lower_safe_name"]}}},{"required":["pattern","replacement"],"description":"Performs a regular expression replacement on the source value.","properties":{"identifier":{"enum":["replace"]},"pattern":{"description":"A regular expression whose matches will be replaced with the literal value specified in replacement.","type":"string"},"replacement":{"description":"The value to replace the matches of the specified pattern in the source value with.","type":"string"}}},{"description":"Converts the source value to a string suitable for a C# namespace.","properties":{"identifier":{"enum":["safe_namespace"]}}},{"description":"Converts the source value to a lowercase string suitable for a C# namespace.","properties":{"identifier":{"enum":["lower_safe_namespace"]}}},{"required":["steps"],"description":"Performs a series of transforms.","properties":{"identifier":{"enum":["chain"]},"steps":{"type":"array","items":{"type":"string","description":"The name of the form to apply to the previous step (or source value if this is the first step)."}}}},{"description":"Changes the case of source value to lower-case.","properties":{"identifier":{"enum":["lowerCase"]}}},{"description":"Returns the source value.","properties":{"identifier":{"enum":["identity"]}}},{"description":"Converts the source value to upper-case using the casing rules of the current culture.","properties":{"identifier":{"enum":["upperCase"]}}},{"description":"Converts the source value to upper-case using the casing rules of the invariant culture.","properties":{"identifier":{"enum":["upperCaseInvariant"]}}},{"description":"JSON encodes the source value.","properties":{"identifier":{"enum":["jsonEncode"]}}},{"description":"Converts the first letter of the value to lowercase using the casing rules of the current culture.","properties":{"identifier":{"enum":["firstLowerCase"]}}},{"description":"Converts the first letter of the value to lowercase using the casing rules of the invariant culture.","properties":{"identifier":{"enum":["firstLowerCaseInvariant"]}}},{"description":"Converts the first letter of the value to uppercase using the casing rules of the current culture.","properties":{"identifier":{"enum":["firstUpperCase"]}}},{"description":"Converts the first letter of the value to uppercase using the casing rules of the invariant culture.","properties":{"identifier":{"enum":["firstUpperCaseInvariant"]}}},{"description":"Converts the value to title case using the casing rules of the current culture.","properties":{"identifier":{"enum":["titleCase"]}}},{"description":"Converts the value to kebab case using the casing rules of the invariant culture.","properties":{"identifier":{"enum":["kebabCase"]}}},{"description":"Converts the value to snake case using the casing rules of the invariant culture.","properties":{"identifier":{"enum":["snakeCase"]}}}]}},"symbols":{"description":"The symbols section defines variables and their values, the values may be the defined in terms of other symbols. When a defined symbol name is encountered anywhere in the template definition, it is replaced by the value defined in this configuration. The symbols configuration is a collection of key-value pairs. The keys are the symbol names, and the value contains key-value-pair configuration information on how to assign the symbol a value.","type":"object","additionalProperties":{"type":"object","required":["type"],"properties":{"datatype":{"$ref":"#/definitions/datatype"},"type":{"type":"string","enum":["bind","derived","generated","parameter","computed"]}},"oneOf":[{"required":["binding"],"properties":{"type":{"description":"The symbol binds value from external sources.","enum":["bind"]},"binding":{"description":"The source and the name of parameter to take the value from. The syntax is: <external source>:<parameter name>. Well known external sources are: host - a value that is defined by the template engine host; env - environment variable.","type":"string"},"defaultValue":{"description":"The value assigned to the symbol if no value was provided from external source(s).","type":"string"},"replaces":{"type":"string","description":"The text to replace with the value of this symbol."},"fileRename":{"type":"string","description":"Defines the portion of file names which will be replaced by symbol value."},"onlyIf":{"type":"array","items":{"type":"object","properties":{"after":{"description":"The replacement string occurs after this value.","type":"string"},"before":{"description":"The replacement string occurs before this value.","type":"string"}}}}}},{"required":["valueSource","valueTransform"],"properties":{"type":{"description":"The value of this symbol is derived from the value of another symbol by the application of value forms.","enum":["derived"]},"valueSource":{"type":"string","description":"The name of the symbol that the value should be derived from."},"valueTransform":{"type":"string","description":"The name of the value form that should be applied to the source value to use as the value of this symbol."},"defaultValue":{"description":"The value assigned to the symbol if no value was provided.","type":"string"},"replaces":{"type":"string","description":"The text to replace with the value of this symbol."},"fileRename":{"type":"string","description":"Defines the portion of file names which will be replaced by symbol value."},"onlyIf":{"type":"array","items":{"type":"object","properties":{"after":{"description":"The replacement string occurs after this value.","type":"string"},"before":{"description":"The replacement string occurs before this value.","type":"string"}}}}}},{"required":["generator"],"properties":{"type":{"description":"Defines the high level configuration of symbol.","enum":["generated"]},"replaces":{"type":"string","description":"The text to replace with the value of this symbol."},"fileRename":{"type":"string","description":"Defines the portion of file names which will be replaced by symbol value."},"onlyIf":{"type":"array","items":{"type":"object","properties":{"after":{"description":"The replacement string occurs after this value.","type":"string"},"before":{"description":"The replacement string occurs before this value.","type":"string"}}}}},"oneOf":[{"$ref":"#/definitions/generatorCasing"},{"$ref":"#/definitions/generatorCoalesce"},{"$ref":"#/definitions/generatorConstant"},{"$ref":"#/definitions/generatorGuid"},{"$ref":"#/definitions/generatorNow"},{"$ref":"#/definitions/generatorPort"},{"$ref":"#/definitions/generatorRandom"},{"$ref":"#/definitions/generatorRegex"},{"$ref":"#/definitions/generatorRegexMatch"},{"$ref":"#/definitions/generatorSwitch"},{"$ref":"#/definitions/generatorJoin"}]},{"properties":{"type":{"description":"Defines the high level configuration of symbol.","enum":["parameter"]},"isRequired":{"oneOf":[{"type":"boolean","description":"Flag indicating whether the parameter has to be specified on the input."},{"type":"string","description":"Condition indicating whether the parameter has to be specified on the input."}]},"isEnabled":{"oneOf":[{"type":"boolean","description":"Flag indicating parameter visibility."},{"type":"string","description":"Condition indicating parameter visibility."}]},"choices":{"description":"An array listing the valid choices for a symbol whose datatype = choice. If not provided, there are no valid choices for the symbol, so it can never be assigned a value.","type":"array","items":{"required":["choice"],"properties":{"choice":{"description":"A valid value for the symbol.","type":"string"},"description":{"description":"Help text describing the meaning of the corresponding value.","type":"string"},"displayName":{"type":"string","description":"The friendly name of the choice to be displayed to the user. This property can be localized."}}}},"defaultValue":{"description":"The value assigned to the symbol if no value for it is provided by the user or host.","type":"string"},"description":{"description":"The description of the parameter.","type":"string"},"replaces":{"type":"string","description":"The text to replace with the value of this symbol."},"fileRename":{"type":"string","description":"The element defines the portion of file names which will be replaced by symbol value."},"onlyIf":{"type":"array","items":{"type":"object","properties":{"after":{"description":"The replacement string occurs after this value.","type":"string"},"before":{"description":"The replacement string occurs before this value.","type":"string"}}}},"allowMultipleValues":{"description":"Indication whether multiple values can be specified for a parameter. Valid only for datatype = choice.","type":"boolean","default":false},"enableQuotelessLiterals":{"description":"Indication whether implicit symbols for each choice value should be added to parameter collection. This allows condition syntax without using quotes for choice literals. Valid only for datatype = choice.","type":"boolean","default":false},"displayName":{"type":"string","description":"The friendly name of the symbol to be displayed to the user. This property can be localized."},"forms":{"type":"object","properties":{"global":{"oneOf":[{"type":"array","items":{"type":"string","uniqueItems":true},"description":"An array of the forms applied to the parameter symbol. Note that the forms should produce the different result on the value of 'replaces' and 'fileRename' properties. Use the form in the template content to apply corresponding transformation to the value given by the user as the parameter."},{"type":"string","description":"The form applied to the parameter symbol. Note that the forms should produce the different result on the value of 'replaces' and 'fileRename' properties. Use the form in the template content to apply corresponding transformation to the value given by the user as the parameter."}]}}}}},{"properties":{"type":{"description":"Defines the high level configuration of symbol.","enum":["computed"]},"value":{"description":"An evaluate-able condition whose result defines the value of the symbol.","type":"string"}}}]}},"baselines":{"description":"Alternate sets of defaults for symbols.","type":"object","additionalProperties":{"type":"object","description":"A named set of alternate defaults.","properties":{"description":{"type":"string","description":"A string to use to indicate the intent of the baseline."},"defaultOverrides":{"description":"A lookup of symbol names to new defaults.","type":"object","additionalProperties":{"type":"string","description":"An updated default value for the specified symbol."}}}}},"tags":{"description":"Common information about templates, these are effectively interchangeable with choice type parameter symbols.","type":"object","required":["type"],"properties":{"language":{"description":"The programming language the template primarily contains or is intended for use with.","type":"string"},"type":{"description":"The type of template: project or item.","enum":["project","item","solution"]}}},"thirdPartyNotices":{"description":"An URL for a document indicating any libraries used by the template that are not owned/provided by the template author.","type":"string"},"description":{"type":"string","description":"A description of the template's purpose or contents for use in help."},"constraints":{"description":"The constraints section defines the restrictions when the template can be run. Available since .NET SDK 7.0.100.","type":"object","additionalProperties":{"type":"object","required":["type"],"properties":{"type":{"type":"string","description":"Constraint type."},"args":{"description":"Constraints arguments."}},"oneOf":[{"not":{"required":["type"],"properties":{"type":{"enum":["os","host","workload","sdk-version","project-capability"]}}},"properties":{"args":{"type":["array","object","string"]}}},{"description":"Operating system constraint. Allows to restrict the template to be run only on specific operating systems.","properties":{"type":{"enum":["os"]},"args":{"oneOf":[{"type":"string","enum":["Windows","Linux","OSX"]},{"type":"array","items":{"type":"string","enum":["Windows","Linux","OSX"]}}]}}},{"description":"Host constraint. Allows to restrict the template to be run only on specific applications using template engine.","properties":{"type":{"enum":["host"]},"args":{"type":"array","items":{"type":"object","required":["hostname"],"properties":{"hostname":{"type":"string","description":"The identifier of supported host. Commonly used identifiers are: 'dotnetcli'' - .NET SDK, 'vs' - Visual Studio, 'vs-mac' - Visual Studio for Mac, 'ide' - Visual Studio (any platform).","oneOf":[{"not":{"enum":["dotnetcli","vs","vs-mac","ide"]}},{"enum":["dotnetcli","vs","vs-mac","ide"]}]},"version":{"type":"string","description":"The supported version of the host. May be an exact version, float version or version range. Refer to https://docs.microsoft.com/en-us/nuget/concepts/package-versioning for more info."}}}}}},{"description":"Installed workload constraint. Allows to restrict the template to be run only on host with specific workloads installed.","properties":{"type":{"enum":["workload"]},"args":{"oneOf":[{"type":"string","description":"supported workload (running host need to have at least one of the requested workloads installed)."},{"type":"array","items":{"type":"string","description":"supported workload (running host need to have at least one of the requested workloads installed)."}}]}}},{"description":"SDK version constraint. Allows to restrict the template to be run only on specific .NET SDK version(s).","properties":{"type":{"enum":["sdk-version"]},"args":{"oneOf":[{"type":"string","description":"The supported version of the SDK. May be an exact version, float version or version range. Refer to https://docs.microsoft.com/en-us/nuget/concepts/package-versioning for more info."},{"type":"array","items":{"type":"string","description":"The supported version of the SDK. May be an exact version, float version or version range. Refer to https://docs.microsoft.com/en-us/nuget/concepts/package-versioning for more info."}}]}}},{"description":"The project context constraint. Allows to restrict the item template to be run only on inside .NET project with certain capabilities.","properties":{"type":{"enum":["project-capability"]},"args":{"type":"string","description":"Project capability expression that should be satisfied by the project. Refer to https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.shell.interop.vsprojectcapabilityexpressionmatcher for more info."}}}]}}},"required":["author","classifications","identity","name","shortName","tags"],"title":"JSON schema .NET template configuration (template.json).","type":"object"}
</schema>

[User] Provide a JSON object that satisfies the schema "JSON schema .NET template configuration (template.json).". Here are the required top‑level fields: author, classifications, identity, name, shortName, tags. Return only the valid JSON object.

Indicates limitations on the valid values a symbol may be assigned. When specified, the symbol value is attempted to be converted to this type. The datatype "choice" is supported only for parameter symbols and requires providing symbols.choices configuration for the symbol.

The constant value to be assigned to the symbol.

This property is not maintained and may be removed in the future. Use defaultFormat instead, or use 'guids' section.

This property is not maintained and may be removed in the future. Use defaultFormat instead, or use 'guids' section.

The format of guid to be generated. Accepts a single value from ('n', 'd', 'b', 'p', 'x') for lowercase output or ('N', 'D', 'B', 'P', 'X') for uppercase output. The formats are defined in Guid.ToString() method documentation.

The format string to use when converting the date-time to a string representation.

If true, use UTC time. If false, use local time.

An integer value indicating the low-end of the range to generate the random number in.

An integer value indicating the high-end of the range to generate the random number in. If not explicitly provided, defaults to int.MaxValue.

The name of a different parameter in the template configuration. A copy of its value will be used by this generator's regex to generate the value for this parameter. The value of the source parameter is not modified.

An ordered list of key-value pairs indicating the regex replacement actions. Each element of the list must contain exactly the keys 'regex' and 'replacement' - along with their values. These replacements will be applied to the result of the previous replacement (except the first, which acts on the original value from the source).

The regular expression to use to locate the sequence to replace.

The replacement for any sequences matched by the supplied regular expression.

The symbol to search for a match. Its value will be used by this generator's regex to evaluate if there is a match. The value of the source parameter is not modified.

The regular expression to use to match.

The name of the symbol whose value will be inspected - if the value is effectively equal to the default value, the value of the symbol referred to by fallbackVariableName is used, otherwise the value of this symbol.

The value to consider as being the default - if the value of the symbol referred to by sourceVariableName is equal to this, the value of the symbol referred to in fallbackVariableName is used instead.

The name of the symbol to return the value of if the symbol referred to by sourceVariableName has a value equal to the value of defaultValue.

The name of the symbol whose value should have its case changed.

Whether the case changed to should be lower case, if false, the value is made to be uppercase instead.

The lower bound of acceptable port numbers.

The upper bound of acceptable port numbers.

The port number to use if no free ports could be found.

The style of evaluator to use.

The set of cases to test for. The first one, in document order, to return true's value is used, if none return true, empty string is returned.

An expression to be interpreted by the specified evaluator type.

The value to return if the condition evaluates to true.

The value used as the separator between the values to be concatenated, notice that you can use "/" as folder separator also on Windows since File API will convert it into "\".

Indication whether null and empty strings should be removed from joining to prevent repetitive separators.

All values to concatenate.

"ref" to reference value from another symbol or "const" for string constant, defaults to "const".

Either name of another symbol or string constant.

A guid string to be replaced in source files. Format and casing is not significant in the config as format and casing is preserved based on the particular guid in processed file(s).

Boolean condition to indicate if the sources configuration should be included or ignored. If the condition evaluates to true or is not provided, the sources config will be used for creating the template. If it evaluates to false, the sources config will be ignored.

The set of globbing patterns indicating the content that was included by sources.include that should not be processed.

The set of globbing patterns indicating the content to process in the path referred to by the source.

The set of globbing patterns indicating the content that was included by sources.include, that hasn't been excluded by sources.exclude that should be placed in the user's directory without modification.

The set of explicit renames to perform. Each key is a path to a file in the source, each value is a path to the target location.

A list of additional source information which gets added to the top-level source information, based on evaluation the corresponding source.modifiers.condition.

The path in the template content (relative to the directory containing the .template.config folder) that should be processed.

The path (relative to the directory the user has specified) that content should be written to.

The author of the template.

Zero or more characteristics of the template that a user might search for it by.

The name to use during creation if no name has been specified by the user or provided from the host.

The semantic version range of the Microsoft.TemplateEngine.Orchestrator.RunnableProjects package that this template is usable with. In older versions of the engine, the four octet version string is used but is matched against a constant which was never changed from 1.0.0.0 - either syntax is now accepted, however the four octet string will not be changed from 1.0.0.0.

The ID of the group this template belongs to. When combined with the "tags" section, this allows multiple templates to be displayed as one, with the the decision for which one to use being presented as a choice in each one of the pivot categories (keys).

A list of guids which appear in the template source and should be replaced in the template output. For each guid listed, a replacement guid is generated, and replaces all occurrences of the source guid in the output.

A unique name for this template.

The name for the template that users should see.

A filename that will be completely ignored except to indicate that its containing directory should be copied. This allows creation of an empty directory in the created template, by having a corresponding source directory containing just the placeholder file. Completely empty directories are ignored.

Defines an ordered list of actions to perform after template generation. The post action information is provided to the creation broker, to act on as appropriate.

A guid uniquely defining the action. The value must correspond to a post-action known by the broker.

A list of key-value pairs to use when performing the action. The specific parameters required / allowed are defined by the action itself.

A C++ style expression that, if it evaluates to 'false' causes the post-action to be skipped. This expression may refer to any symbols that have been defined.

If this action fails, the value of continueOnError indicates whether to attempt the next action, or stop processing the post actions. Should be set to true when subsequent actions rely on the success of the current action.

A human-readable description of the action.

Defines identifier to be used when localizing the post action artifacts.

A list of arguments names from 'args' to which the file renames configured in symbols should be applied.

If set to true, the file renames configured in symbols should be applied to manual instructions.

An ordered list of possible instructions to display if the action cannot be performed. Each element in the list must contain a key named "text", whose value contains the instructions. Each element may also optionally provide a key named "condition" - a Boolean evaluate-able string. The first instruction whose condition is false or blank will be considered valid, all others are ignored.

Defines identifier to be used when localizing the manual instructions.

Instruction display - shows a message given by description and manualInstructions as well as an optional command line to ask the user to execute.

The executable to instruct the user to run.

The arguments to instruct the user to run the executable with - if executable is not specified, this value is unused.

Process start - starts a process.

Whether or not to redirect stdout for the process (prevents output from being displayed if true).

Defines whether or not the stderr should be redirected. If the output is redirected, it prevents it from being displayed.

The executable to run.

The arguments to supply to the executable.

Add reference - adds a reference to a project, package or framework assembly.

The type of reference to add. project = A project to project reference. package = A NuGet package reference. framework - A framework assembly reference.

Must be a literal extension for the project file(s) of interest, may be a semicolon delimited list. If unspecified, any project file (*.*proj) is allowed.

The reference to be added (if referenceType=package, this is the package ID; if referenceType=framework, this is the path or assembly name; if referenceType=project, this is the path to the project reference to add).

The version of the package reference to add, applicable only if referenceType=package.

An array of files that should be processed. If not specified, the project file in output directory or its closest parent directory will be used.

A semicolon delimited list of files that should be processed. If not specified, the project file in output directory or its closest parent directory will be used.

chmod - runs chmod on a particular file.

The permissions to set: the key-value pairs, where the key is a permission, and the value is a file or array of files to apply the permission to.

The set of files (or patterns) to apply the permission specified in the property name to.

The file (or pattern) to apply the permission specified in the property name to.

NuGet package restore - restores NuGet packages for all primary outputs with file extensions *.proj or *.sln.

An array of files that should be restored. If not specified, all primary outputs are restored.

A semicolon delimited list of files that should be restored. If not specified, all primary outputs are restored.

Add to solution - Adds one or more of the primary outputs to the first sln file found (searches up the directory tree from the output folder).

A semicolon delimited list of indexes of the primary outputs that should be added to the solution, if not specified, all primary outputs are used.

The destination solution folder path to add the projects to. Can't be used with 'inRoot'. Optional.

Places the projects in the root of the solution, rather than creating a solution folder. Cannot be used with 'solutionFolder'. Optional. Available since .NET SDK 7.0.200.

An array of project files that should be added to solution. If not specified, primary outputs will be used instead.

A semicolon delimited list of files that should be added to solution. If not specified, primary outputs will be used instead.

Open in editor - Adds one or more of the primary outputs to the first sln file found (searches up the directory tree from the output folder).

A semicolon delimited list of indexes of the primary outputs that should be opened in the editor.

A value used to determine how preferred this template is among the other templates with the same groupIdentity (higher values are more preferred).

Indicated which behaviour to use when no `--name` is specified during template creation. If `true` it will use the template's `defaultName`. If no `defaultName` is found, or `preferDefaultName` is `false` it uses the fallback (output folder).

Indicates whether to create a directory for the template if name is specified but an output directory is not set (instead of creating the content directly in the current directory).

A list of important output paths created during template generation. These paths need to be added to the newly created project at the end of template creation.

The path to the file in the template content whose corresponding output file should be included as a primary output.

The condition for including the specified path in the primary outputs set.

A shorthand name for selecting the template in CLI environment. The template short name should be unique across all the installed templates.

A shorthand name for selecting the template in CLI environment. The first element is a primary choice, and will be used in scenarios which allow only single value for the short name. The template short name should be unique across all the installed templates.

The text in the source content to replace with the name the user specifies. The value of the 'sourceName' is available in built-in 'name' symbol that can be used as the source for creating other symbols and condition expressions. See important information about how to select correct 'sourceName' in https://github.com/dotnet/templating/wiki/Naming-and-default-value-forms.

The set of mappings in the template content to user directories.

Custom value forms used by the template.

The identifier for the value form component that will be used to transform the value.

lowerCaseInvariant xmlEncode safe_name lower_safe_name upperCaseInvariant replace safe_namespace lower_safe_namespace chain lowerCase identity upperCase jsonEncode firstLowerCase firstLowerCaseInvariant firstUpperCase firstUpperCaseInvariant titleCase kebabCase snakeCase

Lowercases the source value in a culture invariant way.

XML encodes the source value.

Converts the source value to a string suitable for a C# identifier.

Converts the source value to a lowercase string suitable for a C# identifier.

Performs a regular expression replacement on the source value.

A regular expression whose matches will be replaced with the literal value specified in replacement.

The value to replace the matches of the specified pattern in the source value with.

Converts the source value to a string suitable for a C# namespace.

Converts the source value to a lowercase string suitable for a C# namespace.

Performs a series of transforms.

The name of the form to apply to the previous step (or source value if this is the first step).

Changes the case of source value to lower-case.

Returns the source value.

Converts the source value to upper-case using the casing rules of the current culture.

Converts the source value to upper-case using the casing rules of the invariant culture.

JSON encodes the source value.

Converts the first letter of the value to lowercase using the casing rules of the current culture.

Converts the first letter of the value to lowercase using the casing rules of the invariant culture.

Converts the first letter of the value to uppercase using the casing rules of the current culture.

Converts the first letter of the value to uppercase using the casing rules of the invariant culture.

Converts the value to title case using the casing rules of the current culture.

Converts the value to kebab case using the casing rules of the invariant culture.

Converts the value to snake case using the casing rules of the invariant culture.

The symbols section defines variables and their values, the values may be the defined in terms of other symbols. When a defined symbol name is encountered anywhere in the template definition, it is replaced by the value defined in this configuration. The symbols configuration is a collection of key-value pairs. The keys are the symbol names, and the value contains key-value-pair configuration information on how to assign the symbol a value.

bind derived generated parameter computed

The symbol binds value from external sources.

The source and the name of parameter to take the value from. The syntax is: <external source>:<parameter name>. Well known external sources are: host - a value that is defined by the template engine host; env - environment variable.

The value assigned to the symbol if no value was provided from external source(s).

The text to replace with the value of this symbol.

Defines the portion of file names which will be replaced by symbol value.

The replacement string occurs after this value.

The replacement string occurs before this value.

The value of this symbol is derived from the value of another symbol by the application of value forms.

The name of the symbol that the value should be derived from.

The name of the value form that should be applied to the source value to use as the value of this symbol.

The value assigned to the symbol if no value was provided.

Defines the high level configuration of symbol.

Flag indicating whether the parameter has to be specified on the input.

Condition indicating whether the parameter has to be specified on the input.

Flag indicating parameter visibility.

Condition indicating parameter visibility.

An array listing the valid choices for a symbol whose datatype = choice. If not provided, there are no valid choices for the symbol, so it can never be assigned a value.

A valid value for the symbol.

Help text describing the meaning of the corresponding value.

The friendly name of the choice to be displayed to the user. This property can be localized.

The value assigned to the symbol if no value for it is provided by the user or host.

The description of the parameter.

The element defines the portion of file names which will be replaced by symbol value.

Indication whether multiple values can be specified for a parameter. Valid only for datatype = choice.

Indication whether implicit symbols for each choice value should be added to parameter collection. This allows condition syntax without using quotes for choice literals. Valid only for datatype = choice.

The friendly name of the symbol to be displayed to the user. This property can be localized.

An array of the forms applied to the parameter symbol. Note that the forms should produce the different result on the value of 'replaces' and 'fileRename' properties. Use the form in the template content to apply corresponding transformation to the value given by the user as the parameter.

The form applied to the parameter symbol. Note that the forms should produce the different result on the value of 'replaces' and 'fileRename' properties. Use the form in the template content to apply corresponding transformation to the value given by the user as the parameter.

An evaluate-able condition whose result defines the value of the symbol.

Alternate sets of defaults for symbols.

A named set of alternate defaults.

A string to use to indicate the intent of the baseline.

A lookup of symbol names to new defaults.

An updated default value for the specified symbol.

Common information about templates, these are effectively interchangeable with choice type parameter symbols.

The programming language the template primarily contains or is intended for use with.

The type of template: project or item.

An URL for a document indicating any libraries used by the template that are not owned/provided by the template author.

A description of the template's purpose or contents for use in help.

The constraints section defines the restrictions when the template can be run. Available since .NET SDK 7.0.100.

Constraint type.

Constraints arguments.

os host workload sdk-version project-capability

Operating system constraint. Allows to restrict the template to be run only on specific operating systems.

Host constraint. Allows to restrict the template to be run only on specific applications using template engine.

The identifier of supported host. Commonly used identifiers are: 'dotnetcli'' - .NET SDK, 'vs' - Visual Studio, 'vs-mac' - Visual Studio for Mac, 'ide' - Visual Studio (any platform).

The supported version of the host. May be an exact version, float version or version range. Refer to https://docs.microsoft.com/en-us/nuget/concepts/package-versioning for more info.

Installed workload constraint. Allows to restrict the template to be run only on host with specific workloads installed.

supported workload (running host need to have at least one of the requested workloads installed).

SDK version constraint. Allows to restrict the template to be run only on specific .NET SDK version(s).

The supported version of the SDK. May be an exact version, float version or version range. Refer to https://docs.microsoft.com/en-us/nuget/concepts/package-versioning for more info.

The project context constraint. Allows to restrict the item template to be run only on inside .NET project with certain capabilities.

Project capability expression that should be satisfied by the project. Refer to https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.shell.interop.vsprojectcapabilityexpressionmatcher for more info.

author classifications identity name shortName tags

JSON schema .NET template configuration (template.json).

Provide a JSON object that satisfies the schema "JSON schema .NET template configuration (template.json).". Here are the required top‑level fields: author, classifications, identity, name, shortName, tags. Return only the valid JSON object.

JSON schema .NET template configuration (template.json).