From 75adb6200dca4b6bf5b95c1d94d210df7dd25473 Mon Sep 17 00:00:00 2001 From: Prad Date: Thu, 26 Dec 2024 19:20:32 +0000 Subject: [PATCH] refactor(scopes): simplify scopes.json structure --- .github/scopes.json | 1057 ++++++++++++++++------------------ .github/scripts/new_issue.sh | 155 +++-- 2 files changed, 598 insertions(+), 614 deletions(-) diff --git a/.github/scopes.json b/.github/scopes.json index 91ada7202..886f6bb1c 100644 --- a/.github/scopes.json +++ b/.github/scopes.json @@ -1,556 +1,501 @@ -[ - { - "name": "core-chain", - "docs": [ - { - "keywords": [ - "sdk", - "modules", - "cosmos", - "manager" - ], - "url": "https://docs.cosmos.network/v0.50/build/building-modules/module-manager" - }, - { - "keywords": [ - "sdk", - "modules", - "cosmos", - "messages", - "queries" - ], - "url": "https://docs.cosmos.network/v0.50/build/building-modules/messages-and-queries" - }, - { - "keywords": [ - "sdk", - "modules", - "messages", - "service", - "cosmos" - ], - "url": "https://docs.cosmos.network/v0.50/build/building-modules/msg-services" - }, - { - "keywords": [ - "sdk", - "modules", - "services", - "cosmos", - "query" - ], - "url": "https://docs.cosmos.network/v0.50/build/building-modules/query-services" - }, - { - "keywords": [ - "cosmos", - "depinject", - "modules", - "sdk" - ], - "url": "https://docs.cosmos.network/v0.50/build/building-modules/depinject" - } - ] - }, - { - "name": "core-ibc", - "docs": [ - { - "keywords": [ - "ibc", - "apps", - "sdk", - "interchain-accounts" - ], - "url": "https://ibc.cosmos.network/v8/apps/interchain-accounts/overview/" - }, - { - "keywords": [ - "ibc", - "apps", - "sdk", - "transfer" - ], - "url": "https://ibc.cosmos.network/v8/apps/transfer/overview/" - }, - { - "keywords": [ - "osmosis", - "modules", - "ibc", - "assets" - ], - "url": "https://docs.osmosis.zone/osmosis-core/asset-info/" - }, - { - "keywords": [ - "ibc", - "osmosis", - "tokenfactory", - "modules", - "assets" - ], - "url": "https://docs.osmosis.zone/osmosis-core/modules/tokenfactory" - }, - { - "keywords": [ - "ibc", - "mint", - "cctp", - "noble", - "assets" - ], - "url": "https://docs.noble.xyz/cctp/mint" - }, - { - "keywords": [ - "ibc", - "relayer", - "nomic", - "assets" - ], - "url": "https://docs.nomic.io/network/ibc-relayer" - }, - { - "keywords": [ - "ibc", - "cctp", - "noble", - "mint_forward", - "assets" - ], - "url": "https://docs.noble.xyz/cctp/mint_forward" - }, - { - "keywords": [ - "evmos", - "erc20", - "assets" - ], - "url": "https://docs.evmos.org/protocol/modules/erc20" - }, - { - "keywords": [ - "nomic", - "nbtc", - "assets" - ], - "url": "https://docs.nomic.io/nbtc" - } - ] - }, - { - "name": "crypto-mpc", - "docs": [ - { - "keywords": [ - "mpc", - "wallet", - "cryptography", - "capability", - "invokation" - ], - "url": "https://csrc.nist.gov/CSRC/media/Events/NTCW19/papers/paper-DKLS.pdf" - } - ] - }, - { - "name": "crypto-ucan", - "docs": [ - { - "keywords": [ - "ucan", - "spec", - "cryptography", - "authorization" - ], - "url": "https://raw.githubusercontent.com/ucan-wg/spec/refs/heads/main/README.md" - } - ] - }, - { - "name": "crypto-zkp", - "docs": [ - { - "keywords": [ - "zero-knowledge", - "proofs", - "cryptography", - "privacy" - ], - "url": "https://eprint.iacr.org/2021/1672.pdf" - } - ] - }, - { - "name": "sonr-hway", - "docs": [ - { - "keywords": [ - "gateway", - "http", - "sse", - ], - "url": "https://echo.labstack.com/docs/cookbook/sse" - }, - { - "keywords": [ - "gateway", - "http", - "websocket", - ], - "url": "https://echo.labstack.com/docs/cookbook/websocket" - }, - { - "keywords": [ - "gateway", - "http", - "subdomain", - ], - "url": "https://echo.labstack.com/docs/cookbook/subdomain" - } - ] - }, - { - "name": "sonr-orm", - "docs": [ - { - "keywords": [ - "tigerbeetle", - "models", - "oracle" - ], - "url": "https://docs.tigerbeetle.com/coding/data-modeling" - }, - { - "keywords": [ - "tigerbeetle", - "two=phase", - "transfers", - "oracle" - ], - "url": "https://docs.tigerbeetle.com/coding/two-phase-transfers" - }, - { - "keywords": [ - "tigerbeetle", - "oracle", - "reliable", - "transaction", - "submission" - ], - "url": "https://docs.tigerbeetle.com/coding/reliable-transaction-submission" - }, - { - "keywords": [ - "currency", - "exchange", - "tigerbeetle", - "oracle" - ], - "url": "https://docs.tigerbeetle.com/coding/recipes/currency-exchange" - }, - { - "keywords": [ - "balance", - "tigerbeetle", - "oracle", - "conditional", - "transfers" - ], - "url": "https://docs.tigerbeetle.com/coding/recipes/balance-conditional-transfers" - }, - { - "keywords": [ - "tigerbeetle", - "account", - "oracle" - ], - "url": "https://docs.tigerbeetle.com/reference/account" - }, - { - "keywords": [ - "tigerbeetle", - "transfer", - "oracle" - ], - "url": "https://docs.tigerbeetle.com/reference/transfer" - }, - { - "keywords": [ - "substreams", - "packages", - "consumer", - "oracle" - ], - "url": "https://docs.substreams.dev/documentation/consume/packages" - }, - { - "keywords": [ - "substreams", - "deploy", - "service", - "oracle" - ], - "url": "https://docs.substreams.dev/documentation/consume/sql/deployable-services/local-service" - }, - { - "keywords": [ - "substreams", - "tutorial", - "cosmos", - "injective" - ], - "url": "https://docs.substreams.dev/tutorials/cosmos/injective/foundational" - } - ] - }, - { - "name": "sonr-motr", - "docs": [ - { - "keywords": [ - "worker", - "http", - "jwt" - ], - "url": "https://echo.labstack.com/docs/cookbook/jwt" - }, - { - "keywords": [ - "worker", - "http", - "secure" - ], - "url": "https://echo.labstack.com/docs/middleware/secure" - }, - { - "keywords": [ - "worker", - "http", - "service-workers", - "web", - "api" - ], - "url": "https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API" - } - ] - }, - { - "name": "sonr-chat", - "docs": [ - { - "keywords": [ - "synapse", - "matrix", - "configuration", - "usage" - ], - "url": "https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html" - } - ] - }, - { - "name": "x-did", - "docs": [ - { - "keywords": [ - "cosmos", - "protobuf", - "orm", - "sdk" - ], - "url": "https://docs.cosmos.network/v0.50/build/packages/orm" - }, - { - "keywords": [ - "cosmos", - "sdk", - "modules", - "auth" - ], - "url": "https://docs.cosmos.network/v0.50/build/modules/auth" - }, - { - "keywords": [ - "cosmos", - "sdk", - "modules", - "bank" - ], - "url": "https://docs.cosmos.network/v0.50/build/modules/bank" - } - ] - }, - { - "name": "x-dwn", - "docs": [ - { - "keywords": [ - "cosmos", - "modules", - "authz", - "sdk" - ], - "url": "https://docs.cosmos.network/v0.50/build/modules/authz" - }, - { - "keywords": [ - "cosmos", - "protobuf", - "collections", - "sdk" - ], - "url": "https://docs.cosmos.network/v0.50/build/packages/collections" - }, - { - "keywords": [ - "cosmos", - "modules", - "gov", - "sdk" - ], - "url": "https://docs.cosmos.network/v0.50/build/modules/gov" - }, - { - "keywords": [ - "cosmos", - "modules", - "staking", - "sdk" - ], - "url": "https://docs.cosmos.network/v0.50/build/modules/staking" - } - ] - }, - { - "name": "x-svc", - "docs": [ - { - "keywords": [ - "cosmos", - "protobuf", - "annotations", - "sdk" - ], - "url": "https://docs.cosmos.network/v0.50/build/building-modules/protobuf-annotations" - }, - { - "keywords": [ - "cosmos", - "sdk", - "modules", - "group" - ], - "url": "https://docs.cosmos.network/v0.50/build/modules/group" - }, - { - "keywords": [ - "cosmos", - "sdk", - "modules", - "nft" - ], - "url": "https://docs.cosmos.network/v0.50/build/modules/nft" - } - ] - }, - { - "name": "ci-cd", - "docs": [ - { - "keywords": [ - "github", - "actions", - "workflows", - "syntax" - ], - "url": "https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions" - }, - { - "keywords": [ - "cosmos", - "tooling", - "cosmovisor" - ], - "url": "https://docs.cosmos.network/v0.50/build/tooling/cosmovisor" - }, - { - "keywords": [ - "process-compose", - "configuration" - ], - "url": "https://f1bonacc1.github.io/process-compose/configuration/" - }, - { - "keywords": [ - "taskfile", - "cli", - "reference" - ], - "url": "https://taskfile.dev/reference/cli" - }, - { - "keywords": [], - "url": "https://taskfile.dev/reference/schema" - }, - { - "keywords": [ - "taskfile", - "templating", - "reference" - ], - "url": "https://taskfile.dev/reference/templating/" - } - ] - }, - { - "name": "dev-ops", - "docs": [ - { - "keywords": [ - "mkdocs", - "material", - "reference" - ], - "url": "https://squidfunk.github.io/mkdocs-material/reference/" - }, - { - "keywords": [ - "pkl", - "language", - "reference" - ], - "url": "https://pkl-lang.org/main/current/language-reference/index.html" - } - ] - }, - { - "name": "wasm-worker", - "docs": [ - { - "keywords": [ - "pwa", - "service-workers", - "web" - ], - "url": "https://web.dev/learn/pwa/service-workers/" - }, - { - "keywords": [ - "service-workers", - "web", - "api" - ], - "url": "https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API" - }, - { - "keywords": [ - "web-authentication", - "web", - "api" - ], - "url": "https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API" - ] - } -] +{ + "scopes": [ + "core-chain", + "core-ibc", + "crypto-mpc", + "crypto-ucan", + "crypto-zkp", + "sonr-hway", + "sonr-orm", + "sonr-motr", + "sonr-chat", + "x-did", + "x-dwn", + "x-svc", + "ci-cd", + "dev-ops", + "wasm-worker" + ], + "docs": [ + { + "keywords": [ + "github", + "actions", + "workflows", + "syntax" + ], + "url": "https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions" + }, + { + "keywords": [ + "cosmos", + "tooling", + "cosmovisor" + ], + "url": "https://docs.cosmos.network/v0.50/build/tooling/cosmovisor" + }, + { + "keywords": [ + "process-compose", + "configuration" + ], + "url": "https://f1bonacc1.github.io/process-compose/configuration/" + }, + { + "keywords": [ + "taskfile", + "cli", + "reference" + ], + "url": "https://taskfile.dev/reference/cli" + }, + { + "keywords": [], + "url": "https://taskfile.dev/reference/schema" + }, + { + "keywords": [ + "taskfile", + "templating", + "reference" + ], + "url": "https://taskfile.dev/reference/templating/" + }, + { + "keywords": [ + "mkdocs", + "material", + "reference" + ], + "url": "https://squidfunk.github.io/mkdocs-material/reference/" + }, + { + "keywords": [ + "pkl", + "language", + "reference" + ], + "url": "https://pkl-lang.org/main/current/language-reference/index.html" + }, + { + "keywords": [ + "pwa", + "service-workers", + "web" + ], + "url": "https://web.dev/learn/pwa/service-workers/" + }, + { + "keywords": [ + "service-workers", + "web", + "api" + ], + "url": "https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API" + }, + { + "keywords": [ + "web-authentication", + "web", + "api" + ], + "url": "https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API" + }, + { + "keywords": [ + "sdk", + "modules", + "cosmos", + "manager" + ], + "url": "https://docs.cosmos.network/v0.50/build/building-modules/module-manager" + }, + { + "keywords": [ + "sdk", + "modules", + "cosmos", + "messages", + "queries" + ], + "url": "https://docs.cosmos.network/v0.50/build/building-modules/messages-and-queries" + }, + { + "keywords": [ + "sdk", + "modules", + "messages", + "service", + "cosmos" + ], + "url": "https://docs.cosmos.network/v0.50/build/building-modules/msg-services" + }, + { + "keywords": [ + "sdk", + "modules", + "services", + "cosmos", + "query" + ], + "url": "https://docs.cosmos.network/v0.50/build/building-modules/query-services" + }, + { + "keywords": [ + "cosmos", + "depinject", + "modules", + "sdk" + ], + "url": "https://docs.cosmos.network/v0.50/build/building-modules/depinject" + }, + { + "keywords": [ + "ibc", + "apps", + "sdk", + "interchain-accounts" + ], + "url": "https://ibc.cosmos.network/v8/apps/interchain-accounts/overview/" + }, + { + "keywords": [ + "ibc", + "apps", + "sdk", + "transfer" + ], + "url": "https://ibc.cosmos.network/v8/apps/transfer/overview/" + }, + { + "keywords": [ + "osmosis", + "modules", + "ibc", + "assets" + ], + "url": "https://docs.osmosis.zone/osmosis-core/asset-info/" + }, + { + "keywords": [ + "ibc", + "osmosis", + "tokenfactory", + "modules", + "assets" + ], + "url": "https://docs.osmosis.zone/osmosis-core/modules/tokenfactory" + }, + { + "keywords": [ + "ibc", + "mint", + "cctp", + "noble", + "assets" + ], + "url": "https://docs.noble.xyz/cctp/mint" + }, + { + "keywords": [ + "ibc", + "relayer", + "nomic", + "assets" + ], + "url": "https://docs.nomic.io/network/ibc-relayer" + }, + { + "keywords": [ + "ibc", + "cctp", + "noble", + "mint_forward", + "assets" + ], + "url": "https://docs.noble.xyz/cctp/mint_forward" + }, + { + "keywords": [ + "evmos", + "erc20", + "assets" + ], + "url": "https://docs.evmos.org/protocol/modules/erc20" + }, + { + "keywords": [ + "nomic", + "nbtc", + "assets" + ], + "url": "https://docs.nomic.io/nbtc" + }, + { + "keywords": [ + "mpc", + "wallet", + "cryptography", + "capability", + "invokation" + ], + "url": "https://csrc.nist.gov/CSRC/media/Events/NTCW19/papers/paper-DKLS.pdf" + }, + { + "keywords": [ + "ucan", + "spec", + "cryptography", + "authorization" + ], + "url": "https://raw.githubusercontent.com/ucan-wg/spec/refs/heads/main/README.md" + }, + { + "keywords": [ + "zero-knowledge", + "proofs", + "cryptography", + "privacy" + ], + "url": "https://eprint.iacr.org/2021/1672.pdf" + }, + { + "keywords": [ + "gateway", + "http", + "sse" + ], + "url": "https://echo.labstack.com/docs/cookbook/sse" + }, + { + "keywords": [ + "gateway", + "http", + "websocket" + ], + "url": "https://echo.labstack.com/docs/cookbook/websocket" + }, + { + "keywords": [ + "gateway", + "http", + "subdomain" + ], + "url": "https://echo.labstack.com/docs/cookbook/subdomain" + }, + { + "keywords": [ + "tigerbeetle", + "models", + "oracle" + ], + "url": "https://docs.tigerbeetle.com/coding/data-modeling" + }, + { + "keywords": [ + "tigerbeetle", + "two=phase", + "transfers", + "oracle" + ], + "url": "https://docs.tigerbeetle.com/coding/two-phase-transfers" + }, + { + "keywords": [ + "tigerbeetle", + "oracle", + "reliable", + "transaction", + "submission" + ], + "url": "https://docs.tigerbeetle.com/coding/reliable-transaction-submission" + }, + { + "keywords": [ + "currency", + "exchange", + "tigerbeetle", + "oracle" + ], + "url": "https://docs.tigerbeetle.com/coding/recipes/currency-exchange" + }, + { + "keywords": [ + "balance", + "tigerbeetle", + "oracle", + "conditional", + "transfers" + ], + "url": "https://docs.tigerbeetle.com/coding/recipes/balance-conditional-transfers" + }, + { + "keywords": [ + "tigerbeetle", + "account", + "oracle" + ], + "url": "https://docs.tigerbeetle.com/reference/account" + }, + { + "keywords": [ + "tigerbeetle", + "transfer", + "oracle" + ], + "url": "https://docs.tigerbeetle.com/reference/transfer" + }, + { + "keywords": [ + "substreams", + "packages", + "consumer", + "oracle" + ], + "url": "https://docs.substreams.dev/documentation/consume/packages" + }, + { + "keywords": [ + "substreams", + "deploy", + "service", + "oracle" + ], + "url": "https://docs.substreams.dev/documentation/consume/sql/deployable-services/local-service" + }, + { + "keywords": [ + "substreams", + "tutorial", + "cosmos", + "injective" + ], + "url": "https://docs.substreams.dev/tutorials/cosmos/injective/foundational" + }, + { + "keywords": [ + "worker", + "http", + "jwt" + ], + "url": "https://echo.labstack.com/docs/cookbook/jwt" + }, + { + "keywords": [ + "worker", + "http", + "secure" + ], + "url": "https://echo.labstack.com/docs/middleware/secure" + }, + { + "keywords": [ + "worker", + "http", + "service-workers", + "web", + "api" + ], + "url": "https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API" + }, + { + "keywords": [ + "synapse", + "matrix", + "configuration", + "usage" + ], + "url": "https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html" + }, + { + "keywords": [ + "cosmos", + "protobuf", + "orm", + "sdk" + ], + "url": "https://docs.cosmos.network/v0.50/build/packages/orm" + }, + { + "keywords": [ + "cosmos", + "sdk", + "modules", + "auth" + ], + "url": "https://docs.cosmos.network/v0.50/build/modules/auth" + }, + { + "keywords": [ + "cosmos", + "sdk", + "modules", + "bank" + ], + "url": "https://docs.cosmos.network/v0.50/build/modules/bank" + }, + { + "keywords": [ + "cosmos", + "modules", + "authz", + "sdk" + ], + "url": "https://docs.cosmos.network/v0.50/build/modules/authz" + }, + { + "keywords": [ + "cosmos", + "protobuf", + "collections", + "sdk" + ], + "url": "https://docs.cosmos.network/v0.50/build/packages/collections" + }, + { + "keywords": [ + "cosmos", + "modules", + "gov", + "sdk" + ], + "url": "https://docs.cosmos.network/v0.50/build/modules/gov" + }, + { + "keywords": [ + "cosmos", + "modules", + "staking", + "sdk" + ], + "url": "https://docs.cosmos.network/v0.50/build/modules/staking" + }, + { + "keywords": [ + "cosmos", + "protobuf", + "annotations", + "sdk" + ], + "url": "https://docs.cosmos.network/v0.50/build/building-modules/protobuf-annotations" + }, + { + "keywords": [ + "cosmos", + "sdk", + "modules", + "group" + ], + "url": "https://docs.cosmos.network/v0.50/build/modules/group" + }, + { + "keywords": [ + "cosmos", + "sdk", + "modules", + "nft" + ], + "url": "https://docs.cosmos.network/v0.50/build/modules/nft" + } + ] +} diff --git a/.github/scripts/new_issue.sh b/.github/scripts/new_issue.sh index e28414117..bcd2a8bcd 100755 --- a/.github/scripts/new_issue.sh +++ b/.github/scripts/new_issue.sh @@ -1,70 +1,109 @@ -#!/bin/bash - -set -e +#!/bin/sh ROOT_DIR=$(git rev-parse --show-toplevel) -# Extract scope name and path using jq, and pass it to fzf for selection -SCOPE=$(cat "$ROOT_DIR/.github/scopes.json" | jq -r '.[] | "\(.name)"' | fzf --prompt "Select scope:") -DOCS=$(cat "$ROOT_DIR/.github/scopes.json" | jq -r ".[] | select(.name == \"$SCOPE\") | .docs[].url") - -# Write Title -TITLE=$(gum input --placeholder "Issue Title...") - -# Write Goal -GOAL=$(mods --role "determine-issue-goal" "$SCOPE $TITLE") - -# Input Requirements -REQUIREMENTS=() -while true; do - if [ ${#REQUIREMENTS[@]} -ge 2 ]; then - if ! gum confirm "Do you want to add another requirement?"; then - break - fi - fi - REQUIREMENT=$(gum input --placeholder "Add a requirement...") - if [ -n "$REQUIREMENT" ]; then - REQUIREMENTS+=("$REQUIREMENT") - else - echo "Requirement cannot be empty. Please enter a valid requirement." - fi -done - -create_body() { - echo "### Goal(s):" - echo "$GOAL" - echo "### Requirements:" - for i in "${!REQUIREMENTS[@]}"; do - echo "$(($i + 1)). ${REQUIREMENTS[$i]}" - done - echo "### Resources:" - while IFS= read -r doc; do - echo "- $doc" - done <<< "$DOCS" +select_scope() { + cat "$ROOT_DIR/.github/scopes.json" | jq -r '.scopes[]' | fzf --prompt "Select scope:" } -ISSUE_BODY=$(create_body) +get_title() { + gum input --placeholder "Issue Title..." +} -# Function to collect output -preview_output() { +add_requirement() { + requirement=$(gum input --placeholder "Add a requirement...") + if [ -n "$requirement" ]; then + REQUIREMENTS="$REQUIREMENTS +$requirement" + return 0 + fi + return 1 +} + +collect_requirements() { + REQUIREMENTS="" + req_count=0 + while true; do + if add_requirement; then + req_count=$((req_count + 1)) + if [ $req_count -ge 2 ] && ! gum confirm "Do you want to add another requirement?"; then + break + fi + else + if [ $req_count -ge 2 ]; then + break + else + echo "Requirement cannot be empty. Please enter a valid requirement." + fi + fi + done +} + +get_docs() { + docs=$(cat "$ROOT_DIR/.github/scopes.json" | jq -c '.docs') + mods --role "determine-issue-docs" "$SCOPE" "$TITLE" "$docs" +} + +get_goal() { + mods --role "determine-issue-goal" "$SCOPE $TITLE" +} + +format_requirements() { + i=1 + echo "$REQUIREMENTS" | while IFS= read -r req; do + if [ -n "$req" ]; then + echo "$i. $req" + i=$((i + 1)) + fi + done +} + +create_body() { + goal=$(get_goal) + docs=$(get_docs) + + echo "### Goal(s):" + echo "$goal" + echo + echo "### Requirements:" + format_requirements + echo + echo "### Resources:" + echo "$docs" +} + +preview_issue() { echo "# ($SCOPE) $TITLE" echo "$ISSUE_BODY" } -# Display the formatted output -preview_output | gum format - -# Confirm to create a GitHub issue -if gum confirm "Do you want to create a new GitHub issue with this information?"; then - # Ask if this should be a draft issue - if gum confirm "Create as draft issue?"; then - # Create a draft GitHub issue - gh issue create --repo onsonr/sonr --title "($SCOPE) $TITLE" --body "$ISSUE_BODY" - else - # Create a regular GitHub issue - gh issue create --repo onsonr/sonr --title "($SCOPE) $TITLE" --body "$ISSUE_BODY" -a @me +create_github_issue() { + draft_flag="" + if gum confirm "Assign this issue to yourself?"; then + draft_flag="-a @me" fi -else - exit 1 -fi + + gh issue create \ + --repo onsonr/sonr \ + --title "[$SCOPE] $TITLE" \ + --body "$ISSUE_BODY" \ + $draft_flag +} + +main() { + SCOPE=$(select_scope) + TITLE=$(get_title) + collect_requirements + ISSUE_BODY=$(create_body) + + preview_issue | gum format + + if gum confirm "Do you want to create a new GitHub issue with this information?"; then + create_github_issue + else + exit 1 + fi +} + +main