aidevops 2.52.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/.agent/AGENTS.md +614 -0
  2. package/.agent/accounts.md +65 -0
  3. package/.agent/aidevops/add-new-mcp-to-aidevops.md +456 -0
  4. package/.agent/aidevops/api-integrations.md +335 -0
  5. package/.agent/aidevops/architecture.md +510 -0
  6. package/.agent/aidevops/configs.md +274 -0
  7. package/.agent/aidevops/docs.md +244 -0
  8. package/.agent/aidevops/extension.md +311 -0
  9. package/.agent/aidevops/mcp-integrations.md +340 -0
  10. package/.agent/aidevops/mcp-troubleshooting.md +162 -0
  11. package/.agent/aidevops/memory-patterns.md +172 -0
  12. package/.agent/aidevops/providers.md +217 -0
  13. package/.agent/aidevops/recommendations.md +321 -0
  14. package/.agent/aidevops/requirements.md +301 -0
  15. package/.agent/aidevops/resources.md +214 -0
  16. package/.agent/aidevops/security-requirements.md +174 -0
  17. package/.agent/aidevops/security.md +350 -0
  18. package/.agent/aidevops/service-links.md +400 -0
  19. package/.agent/aidevops/services.md +357 -0
  20. package/.agent/aidevops/setup.md +153 -0
  21. package/.agent/aidevops/troubleshooting.md +389 -0
  22. package/.agent/aidevops.md +124 -0
  23. package/.agent/build-plus.md +244 -0
  24. package/.agent/content/guidelines.md +109 -0
  25. package/.agent/content.md +87 -0
  26. package/.agent/health.md +59 -0
  27. package/.agent/legal.md +59 -0
  28. package/.agent/loop-state/full-loop.local.md +16 -0
  29. package/.agent/loop-state/ralph-loop.local.md +10 -0
  30. package/.agent/marketing.md +440 -0
  31. package/.agent/memory/README.md +260 -0
  32. package/.agent/onboarding.md +796 -0
  33. package/.agent/plan-plus.md +245 -0
  34. package/.agent/research.md +100 -0
  35. package/.agent/sales.md +333 -0
  36. package/.agent/scripts/101domains-helper.sh +701 -0
  37. package/.agent/scripts/add-missing-returns.sh +140 -0
  38. package/.agent/scripts/agent-browser-helper.sh +311 -0
  39. package/.agent/scripts/agno-setup.sh +712 -0
  40. package/.agent/scripts/ahrefs-mcp-wrapper.js +168 -0
  41. package/.agent/scripts/aidevops-update-check.sh +71 -0
  42. package/.agent/scripts/ampcode-cli.sh +522 -0
  43. package/.agent/scripts/auto-version-bump.sh +156 -0
  44. package/.agent/scripts/autogen-helper.sh +512 -0
  45. package/.agent/scripts/beads-sync-helper.sh +596 -0
  46. package/.agent/scripts/closte-helper.sh +5 -0
  47. package/.agent/scripts/cloudron-helper.sh +321 -0
  48. package/.agent/scripts/codacy-cli-chunked.sh +581 -0
  49. package/.agent/scripts/codacy-cli.sh +442 -0
  50. package/.agent/scripts/code-audit-helper.sh +5 -0
  51. package/.agent/scripts/coderabbit-cli.sh +417 -0
  52. package/.agent/scripts/coderabbit-pro-analysis.sh +238 -0
  53. package/.agent/scripts/commands/code-simplifier.md +86 -0
  54. package/.agent/scripts/commands/full-loop.md +246 -0
  55. package/.agent/scripts/commands/postflight-loop.md +103 -0
  56. package/.agent/scripts/commands/recall.md +182 -0
  57. package/.agent/scripts/commands/remember.md +132 -0
  58. package/.agent/scripts/commands/save-todo.md +175 -0
  59. package/.agent/scripts/commands/session-review.md +154 -0
  60. package/.agent/scripts/comprehensive-quality-fix.sh +106 -0
  61. package/.agent/scripts/context-builder-helper.sh +522 -0
  62. package/.agent/scripts/coolify-cli-helper.sh +674 -0
  63. package/.agent/scripts/coolify-helper.sh +380 -0
  64. package/.agent/scripts/crawl4ai-examples.sh +401 -0
  65. package/.agent/scripts/crawl4ai-helper.sh +1078 -0
  66. package/.agent/scripts/crewai-helper.sh +681 -0
  67. package/.agent/scripts/dev-browser-helper.sh +513 -0
  68. package/.agent/scripts/dns-helper.sh +396 -0
  69. package/.agent/scripts/domain-research-helper.sh +917 -0
  70. package/.agent/scripts/dspy-helper.sh +285 -0
  71. package/.agent/scripts/dspyground-helper.sh +291 -0
  72. package/.agent/scripts/eeat-score-helper.sh +1242 -0
  73. package/.agent/scripts/efficient-return-fix.sh +92 -0
  74. package/.agent/scripts/extract-opencode-prompts.sh +128 -0
  75. package/.agent/scripts/find-missing-returns.sh +113 -0
  76. package/.agent/scripts/fix-auth-headers.sh +104 -0
  77. package/.agent/scripts/fix-common-strings.sh +254 -0
  78. package/.agent/scripts/fix-content-type.sh +100 -0
  79. package/.agent/scripts/fix-error-messages.sh +130 -0
  80. package/.agent/scripts/fix-misplaced-returns.sh +74 -0
  81. package/.agent/scripts/fix-remaining-literals.sh +152 -0
  82. package/.agent/scripts/fix-return-statements.sh +41 -0
  83. package/.agent/scripts/fix-s131-default-cases.sh +249 -0
  84. package/.agent/scripts/fix-sc2155-simple.sh +102 -0
  85. package/.agent/scripts/fix-shellcheck-critical.sh +187 -0
  86. package/.agent/scripts/fix-string-literals.sh +273 -0
  87. package/.agent/scripts/full-loop-helper.sh +773 -0
  88. package/.agent/scripts/generate-opencode-agents.sh +497 -0
  89. package/.agent/scripts/generate-opencode-commands.sh +1629 -0
  90. package/.agent/scripts/generate-skills.sh +366 -0
  91. package/.agent/scripts/git-platforms-helper.sh +640 -0
  92. package/.agent/scripts/gitea-cli-helper.sh +743 -0
  93. package/.agent/scripts/github-cli-helper.sh +702 -0
  94. package/.agent/scripts/gitlab-cli-helper.sh +682 -0
  95. package/.agent/scripts/gsc-add-user-helper.sh +325 -0
  96. package/.agent/scripts/gsc-sitemap-helper.sh +678 -0
  97. package/.agent/scripts/hetzner-helper.sh +485 -0
  98. package/.agent/scripts/hostinger-helper.sh +229 -0
  99. package/.agent/scripts/keyword-research-helper.sh +1815 -0
  100. package/.agent/scripts/langflow-helper.sh +544 -0
  101. package/.agent/scripts/linkedin-automation.py +241 -0
  102. package/.agent/scripts/linter-manager.sh +599 -0
  103. package/.agent/scripts/linters-local.sh +434 -0
  104. package/.agent/scripts/list-keys-helper.sh +488 -0
  105. package/.agent/scripts/local-browser-automation.py +339 -0
  106. package/.agent/scripts/localhost-helper.sh +744 -0
  107. package/.agent/scripts/loop-common.sh +806 -0
  108. package/.agent/scripts/mainwp-helper.sh +728 -0
  109. package/.agent/scripts/markdown-formatter.sh +338 -0
  110. package/.agent/scripts/markdown-lint-fix.sh +311 -0
  111. package/.agent/scripts/mass-fix-returns.sh +58 -0
  112. package/.agent/scripts/mcp-diagnose.sh +167 -0
  113. package/.agent/scripts/mcp-inspector-helper.sh +449 -0
  114. package/.agent/scripts/memory-helper.sh +650 -0
  115. package/.agent/scripts/monitor-code-review.sh +255 -0
  116. package/.agent/scripts/onboarding-helper.sh +706 -0
  117. package/.agent/scripts/opencode-github-setup-helper.sh +797 -0
  118. package/.agent/scripts/opencode-test-helper.sh +213 -0
  119. package/.agent/scripts/pagespeed-helper.sh +464 -0
  120. package/.agent/scripts/pandoc-helper.sh +362 -0
  121. package/.agent/scripts/postflight-check.sh +555 -0
  122. package/.agent/scripts/pre-commit-hook.sh +259 -0
  123. package/.agent/scripts/pre-edit-check.sh +169 -0
  124. package/.agent/scripts/qlty-cli.sh +356 -0
  125. package/.agent/scripts/quality-cli-manager.sh +525 -0
  126. package/.agent/scripts/quality-feedback-helper.sh +462 -0
  127. package/.agent/scripts/quality-fix.sh +263 -0
  128. package/.agent/scripts/quality-loop-helper.sh +1108 -0
  129. package/.agent/scripts/ralph-loop-helper.sh +836 -0
  130. package/.agent/scripts/ralph-upstream-check.sh +341 -0
  131. package/.agent/scripts/secretlint-helper.sh +847 -0
  132. package/.agent/scripts/servers-helper.sh +241 -0
  133. package/.agent/scripts/ses-helper.sh +619 -0
  134. package/.agent/scripts/session-review-helper.sh +404 -0
  135. package/.agent/scripts/setup-linters-wizard.sh +379 -0
  136. package/.agent/scripts/setup-local-api-keys.sh +330 -0
  137. package/.agent/scripts/setup-mcp-integrations.sh +472 -0
  138. package/.agent/scripts/shared-constants.sh +246 -0
  139. package/.agent/scripts/site-crawler-helper.sh +1487 -0
  140. package/.agent/scripts/snyk-helper.sh +940 -0
  141. package/.agent/scripts/sonarcloud-autofix.sh +193 -0
  142. package/.agent/scripts/sonarcloud-cli.sh +191 -0
  143. package/.agent/scripts/sonarscanner-cli.sh +455 -0
  144. package/.agent/scripts/spaceship-helper.sh +747 -0
  145. package/.agent/scripts/stagehand-helper.sh +321 -0
  146. package/.agent/scripts/stagehand-python-helper.sh +321 -0
  147. package/.agent/scripts/stagehand-python-setup.sh +441 -0
  148. package/.agent/scripts/stagehand-setup.sh +439 -0
  149. package/.agent/scripts/system-cleanup.sh +340 -0
  150. package/.agent/scripts/terminal-title-helper.sh +388 -0
  151. package/.agent/scripts/terminal-title-setup.sh +549 -0
  152. package/.agent/scripts/test-stagehand-both-integration.sh +317 -0
  153. package/.agent/scripts/test-stagehand-integration.sh +309 -0
  154. package/.agent/scripts/test-stagehand-python-integration.sh +341 -0
  155. package/.agent/scripts/todo-ready.sh +263 -0
  156. package/.agent/scripts/tool-version-check.sh +362 -0
  157. package/.agent/scripts/toon-helper.sh +469 -0
  158. package/.agent/scripts/twilio-helper.sh +917 -0
  159. package/.agent/scripts/updown-helper.sh +279 -0
  160. package/.agent/scripts/validate-mcp-integrations.sh +250 -0
  161. package/.agent/scripts/validate-version-consistency.sh +131 -0
  162. package/.agent/scripts/vaultwarden-helper.sh +597 -0
  163. package/.agent/scripts/vercel-cli-helper.sh +816 -0
  164. package/.agent/scripts/verify-mirrors.sh +169 -0
  165. package/.agent/scripts/version-manager.sh +831 -0
  166. package/.agent/scripts/webhosting-helper.sh +471 -0
  167. package/.agent/scripts/webhosting-verify.sh +238 -0
  168. package/.agent/scripts/wordpress-mcp-helper.sh +508 -0
  169. package/.agent/scripts/worktree-helper.sh +595 -0
  170. package/.agent/scripts/worktree-sessions.sh +577 -0
  171. package/.agent/seo/dataforseo.md +215 -0
  172. package/.agent/seo/domain-research.md +532 -0
  173. package/.agent/seo/eeat-score.md +659 -0
  174. package/.agent/seo/google-search-console.md +366 -0
  175. package/.agent/seo/gsc-sitemaps.md +282 -0
  176. package/.agent/seo/keyword-research.md +521 -0
  177. package/.agent/seo/serper.md +278 -0
  178. package/.agent/seo/site-crawler.md +387 -0
  179. package/.agent/seo.md +236 -0
  180. package/.agent/services/accounting/quickfile.md +159 -0
  181. package/.agent/services/communications/telfon.md +470 -0
  182. package/.agent/services/communications/twilio.md +569 -0
  183. package/.agent/services/crm/fluentcrm.md +449 -0
  184. package/.agent/services/email/ses.md +399 -0
  185. package/.agent/services/hosting/101domains.md +378 -0
  186. package/.agent/services/hosting/closte.md +177 -0
  187. package/.agent/services/hosting/cloudflare.md +251 -0
  188. package/.agent/services/hosting/cloudron.md +478 -0
  189. package/.agent/services/hosting/dns-providers.md +335 -0
  190. package/.agent/services/hosting/domain-purchasing.md +344 -0
  191. package/.agent/services/hosting/hetzner.md +327 -0
  192. package/.agent/services/hosting/hostinger.md +287 -0
  193. package/.agent/services/hosting/localhost.md +419 -0
  194. package/.agent/services/hosting/spaceship.md +353 -0
  195. package/.agent/services/hosting/webhosting.md +330 -0
  196. package/.agent/social-media.md +69 -0
  197. package/.agent/templates/plans-template.md +114 -0
  198. package/.agent/templates/prd-template.md +129 -0
  199. package/.agent/templates/tasks-template.md +108 -0
  200. package/.agent/templates/todo-template.md +89 -0
  201. package/.agent/tools/ai-assistants/agno.md +471 -0
  202. package/.agent/tools/ai-assistants/capsolver.md +326 -0
  203. package/.agent/tools/ai-assistants/configuration.md +221 -0
  204. package/.agent/tools/ai-assistants/overview.md +209 -0
  205. package/.agent/tools/ai-assistants/status.md +171 -0
  206. package/.agent/tools/ai-assistants/windsurf.md +193 -0
  207. package/.agent/tools/ai-orchestration/autogen.md +406 -0
  208. package/.agent/tools/ai-orchestration/crewai.md +445 -0
  209. package/.agent/tools/ai-orchestration/langflow.md +405 -0
  210. package/.agent/tools/ai-orchestration/openprose.md +487 -0
  211. package/.agent/tools/ai-orchestration/overview.md +362 -0
  212. package/.agent/tools/ai-orchestration/packaging.md +647 -0
  213. package/.agent/tools/browser/agent-browser.md +464 -0
  214. package/.agent/tools/browser/browser-automation.md +400 -0
  215. package/.agent/tools/browser/chrome-devtools.md +282 -0
  216. package/.agent/tools/browser/crawl4ai-integration.md +422 -0
  217. package/.agent/tools/browser/crawl4ai-resources.md +277 -0
  218. package/.agent/tools/browser/crawl4ai-usage.md +416 -0
  219. package/.agent/tools/browser/crawl4ai.md +585 -0
  220. package/.agent/tools/browser/dev-browser.md +341 -0
  221. package/.agent/tools/browser/pagespeed.md +260 -0
  222. package/.agent/tools/browser/playwright.md +266 -0
  223. package/.agent/tools/browser/playwriter.md +310 -0
  224. package/.agent/tools/browser/stagehand-examples.md +456 -0
  225. package/.agent/tools/browser/stagehand-python.md +483 -0
  226. package/.agent/tools/browser/stagehand.md +421 -0
  227. package/.agent/tools/build-agent/agent-review.md +224 -0
  228. package/.agent/tools/build-agent/build-agent.md +784 -0
  229. package/.agent/tools/build-mcp/aidevops-plugin.md +476 -0
  230. package/.agent/tools/build-mcp/api-wrapper.md +445 -0
  231. package/.agent/tools/build-mcp/build-mcp.md +240 -0
  232. package/.agent/tools/build-mcp/deployment.md +401 -0
  233. package/.agent/tools/build-mcp/server-patterns.md +632 -0
  234. package/.agent/tools/build-mcp/transports.md +366 -0
  235. package/.agent/tools/code-review/auditing.md +383 -0
  236. package/.agent/tools/code-review/automation.md +219 -0
  237. package/.agent/tools/code-review/best-practices.md +203 -0
  238. package/.agent/tools/code-review/codacy.md +151 -0
  239. package/.agent/tools/code-review/code-simplifier.md +174 -0
  240. package/.agent/tools/code-review/code-standards.md +309 -0
  241. package/.agent/tools/code-review/coderabbit.md +101 -0
  242. package/.agent/tools/code-review/management.md +155 -0
  243. package/.agent/tools/code-review/qlty.md +248 -0
  244. package/.agent/tools/code-review/secretlint.md +565 -0
  245. package/.agent/tools/code-review/setup.md +250 -0
  246. package/.agent/tools/code-review/snyk.md +563 -0
  247. package/.agent/tools/code-review/tools.md +230 -0
  248. package/.agent/tools/content/summarize.md +353 -0
  249. package/.agent/tools/context/augment-context-engine.md +468 -0
  250. package/.agent/tools/context/context-builder-agent.md +76 -0
  251. package/.agent/tools/context/context-builder.md +375 -0
  252. package/.agent/tools/context/context7.md +371 -0
  253. package/.agent/tools/context/dspy.md +302 -0
  254. package/.agent/tools/context/dspyground.md +374 -0
  255. package/.agent/tools/context/llm-tldr.md +219 -0
  256. package/.agent/tools/context/osgrep.md +488 -0
  257. package/.agent/tools/context/prompt-optimization.md +338 -0
  258. package/.agent/tools/context/toon.md +292 -0
  259. package/.agent/tools/conversion/pandoc.md +304 -0
  260. package/.agent/tools/credentials/api-key-management.md +154 -0
  261. package/.agent/tools/credentials/api-key-setup.md +224 -0
  262. package/.agent/tools/credentials/environment-variables.md +180 -0
  263. package/.agent/tools/credentials/vaultwarden.md +382 -0
  264. package/.agent/tools/data-extraction/outscraper.md +974 -0
  265. package/.agent/tools/deployment/coolify-cli.md +388 -0
  266. package/.agent/tools/deployment/coolify-setup.md +353 -0
  267. package/.agent/tools/deployment/coolify.md +345 -0
  268. package/.agent/tools/deployment/vercel.md +390 -0
  269. package/.agent/tools/git/authentication.md +132 -0
  270. package/.agent/tools/git/gitea-cli.md +193 -0
  271. package/.agent/tools/git/github-actions.md +207 -0
  272. package/.agent/tools/git/github-cli.md +223 -0
  273. package/.agent/tools/git/gitlab-cli.md +190 -0
  274. package/.agent/tools/git/opencode-github-security.md +350 -0
  275. package/.agent/tools/git/opencode-github.md +328 -0
  276. package/.agent/tools/git/opencode-gitlab.md +252 -0
  277. package/.agent/tools/git/security.md +196 -0
  278. package/.agent/tools/git.md +207 -0
  279. package/.agent/tools/opencode/oh-my-opencode.md +375 -0
  280. package/.agent/tools/opencode/opencode-anthropic-auth.md +446 -0
  281. package/.agent/tools/opencode/opencode.md +651 -0
  282. package/.agent/tools/social-media/bird.md +437 -0
  283. package/.agent/tools/task-management/beads.md +336 -0
  284. package/.agent/tools/terminal/terminal-title.md +251 -0
  285. package/.agent/tools/ui/shadcn.md +196 -0
  286. package/.agent/tools/ui/ui-skills.md +115 -0
  287. package/.agent/tools/wordpress/localwp.md +311 -0
  288. package/.agent/tools/wordpress/mainwp.md +391 -0
  289. package/.agent/tools/wordpress/scf.md +527 -0
  290. package/.agent/tools/wordpress/wp-admin.md +729 -0
  291. package/.agent/tools/wordpress/wp-dev.md +940 -0
  292. package/.agent/tools/wordpress/wp-preferred.md +398 -0
  293. package/.agent/tools/wordpress.md +95 -0
  294. package/.agent/workflows/branch/bugfix.md +63 -0
  295. package/.agent/workflows/branch/chore.md +95 -0
  296. package/.agent/workflows/branch/experiment.md +115 -0
  297. package/.agent/workflows/branch/feature.md +59 -0
  298. package/.agent/workflows/branch/hotfix.md +98 -0
  299. package/.agent/workflows/branch/refactor.md +92 -0
  300. package/.agent/workflows/branch/release.md +96 -0
  301. package/.agent/workflows/branch.md +347 -0
  302. package/.agent/workflows/bug-fixing.md +267 -0
  303. package/.agent/workflows/changelog.md +129 -0
  304. package/.agent/workflows/code-audit-remote.md +279 -0
  305. package/.agent/workflows/conversation-starter.md +69 -0
  306. package/.agent/workflows/error-feedback.md +578 -0
  307. package/.agent/workflows/feature-development.md +355 -0
  308. package/.agent/workflows/git-workflow.md +702 -0
  309. package/.agent/workflows/multi-repo-workspace.md +268 -0
  310. package/.agent/workflows/plans.md +709 -0
  311. package/.agent/workflows/postflight.md +604 -0
  312. package/.agent/workflows/pr.md +571 -0
  313. package/.agent/workflows/preflight.md +278 -0
  314. package/.agent/workflows/ralph-loop.md +773 -0
  315. package/.agent/workflows/release.md +498 -0
  316. package/.agent/workflows/session-manager.md +254 -0
  317. package/.agent/workflows/session-review.md +311 -0
  318. package/.agent/workflows/sql-migrations.md +631 -0
  319. package/.agent/workflows/version-bump.md +283 -0
  320. package/.agent/workflows/wiki-update.md +333 -0
  321. package/.agent/workflows/worktree.md +477 -0
  322. package/LICENSE +21 -0
  323. package/README.md +1446 -0
  324. package/VERSION +1 -0
  325. package/aidevops.sh +1746 -0
  326. package/bin/aidevops +21 -0
  327. package/package.json +75 -0
  328. package/scripts/npm-postinstall.js +60 -0
  329. package/setup.sh +2366 -0
@@ -0,0 +1,743 @@
1
+ #!/bin/bash
2
+ # shellcheck disable=SC2034,SC2155,SC2317,SC2329,SC2016,SC2181,SC1091,SC2154,SC2015,SC2086,SC2129,SC2030,SC2031,SC2119,SC2120,SC2001,SC2162,SC2088,SC2089,SC2090,SC2029,SC2006,SC2153
3
+
4
+ # Gitea CLI Helper Script
5
+ # Comprehensive Gitea management using tea (Gitea CLI) and API
6
+ # Managed by AI DevOps Framework
7
+
8
+ # Set strict mode
9
+ set -euo pipefail
10
+
11
+ # ------------------------------------------------------------------------------
12
+ # CONFIGURATION & CONSTANTS
13
+ # ------------------------------------------------------------------------------
14
+
15
+ script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" || exit
16
+ readonly SCRIPT_DIR="$script_dir"
17
+
18
+ repo_root="$(dirname "$SCRIPT_DIR")"
19
+ readonly REPO_ROOT="$repo_root"
20
+ readonly CONFIG_FILE="$REPO_ROOT/configs/gitea-cli-config.json"
21
+
22
+ # Colors
23
+ readonly BLUE='\033[0;34m'
24
+ readonly GREEN='\033[0;32m'
25
+ readonly YELLOW='\033[1;33m'
26
+ readonly RED='\033[0;31m'
27
+ readonly NC='\033[0m'
28
+
29
+ # Common constants
30
+ readonly ERROR_UNKNOWN_COMMAND="Unknown command:"
31
+ # Error Messages
32
+ readonly ERROR_CONFIG_MISSING="Configuration file not found at $CONFIG_FILE"
33
+ readonly ERROR_TEA_NOT_INSTALLED="Gitea CLI (tea) is required but not installed"
34
+ readonly ERROR_NOT_LOGGED_IN="Gitea CLI is not authenticated. Run 'tea login'"
35
+ readonly ERROR_ACCOUNT_MISSING="Account configuration not found"
36
+ readonly ERROR_ARGS_MISSING="Missing required arguments"
37
+ readonly ERROR_API_FAILED="Gitea API request failed"
38
+ readonly ERROR_REPO_NAME_REQUIRED="Repository name is required"
39
+ readonly ERROR_ISSUE_TITLE_REQUIRED="Issue title is required"
40
+ readonly ERROR_ISSUE_NUMBER_REQUIRED="Issue number is required"
41
+ readonly ERROR_PR_NUMBER_REQUIRED="Pull request number is required"
42
+ readonly ERROR_BRANCH_NAME_REQUIRED="Branch name is required"
43
+ readonly ERROR_REPO_NOT_FOUND="Repository not found"
44
+ readonly ERROR_OWNER_NOT_CONFIGURED="Owner not configured for account"
45
+ readonly ERROR_FAILED_TO_READ_CONFIG="Failed to read configuration"
46
+
47
+ # Success Messages
48
+ readonly SUCCESS_REPO_CREATED="Repository created successfully"
49
+ readonly SUCCESS_ISSUE_CREATED="Issue created successfully"
50
+ readonly SUCCESS_PR_CREATED="Pull request created successfully"
51
+ readonly SUCCESS_BRANCH_CREATED="Branch created successfully"
52
+ readonly SUCCESS_ISSUE_CLOSED="Issue closed successfully"
53
+ readonly SUCCESS_PR_MERGED="Pull request merged successfully"
54
+
55
+ # Common constants
56
+ readonly CONTENT_TYPE_JSON="$CONTENT_TYPE_JSON"
57
+ readonly AUTH_HEADER_TOKEN="Authorization: token"
58
+
59
+ # ------------------------------------------------------------------------------
60
+ # UTILITY FUNCTIONS
61
+ # ------------------------------------------------------------------------------
62
+
63
+ print_info() {
64
+ local msg="$1"
65
+ echo -e "${BLUE}[INFO]${NC} $msg"
66
+ return 0
67
+ }
68
+
69
+ print_success() {
70
+ local msg="$1"
71
+ echo -e "${GREEN}[SUCCESS]${NC} $msg"
72
+ return 0
73
+ }
74
+
75
+ print_warning() {
76
+ local msg="$1"
77
+ echo -e "${YELLOW}[WARNING]${NC} $msg"
78
+ return 0
79
+ }
80
+
81
+ print_error() {
82
+ local msg="$1"
83
+ echo -e "${RED}[ERROR]${NC} $msg" >&2
84
+ return 0
85
+ }
86
+
87
+ # ------------------------------------------------------------------------------
88
+ # DEPENDENCY CHECKING
89
+ # ------------------------------------------------------------------------------
90
+
91
+ check_dependencies() {
92
+ if ! command -v tea &> /dev/null; then
93
+ print_error "$ERROR_TEA_NOT_INSTALLED"
94
+ print_info "Install Gitea CLI (tea):"
95
+ print_info " Go: go install code.gitea.io/tea/cmd/tea@latest"
96
+ print_info " Binary: https://dl.gitea.io/tea/"
97
+ print_info " Homebrew: brew install tea (if available)"
98
+ exit 1
99
+ fi
100
+
101
+ # Check if logged in (tea doesn't have auth status command, so we'll check config)
102
+ if ! tea repos list --limit 1 &>/dev/null; then
103
+ print_error "$ERROR_NOT_LOGGED_IN"
104
+ print_info "Authenticate with: tea login add"
105
+ print_info "Or set TEA_TOKEN environment variable"
106
+ exit 1
107
+ fi
108
+
109
+ if ! command -v jq &> /dev/null; then
110
+ print_error "jq is required but not installed"
111
+ print_info "Install: brew install jq (macOS) or sudo apt install jq (Ubuntu)"
112
+ exit 1
113
+ fi
114
+ return 0
115
+ }
116
+
117
+ # ------------------------------------------------------------------------------
118
+ # CONFIGURATION LOADING
119
+ # ------------------------------------------------------------------------------
120
+
121
+ load_config() {
122
+ if [[ ! -f "$CONFIG_FILE" ]]; then
123
+ print_error "$ERROR_CONFIG_MISSING"
124
+ print_info "Create configuration: cp configs/gitea-cli-config.json.txt $CONFIG_FILE"
125
+ return 1
126
+ fi
127
+ return 0
128
+ }
129
+
130
+ get_account_config() {
131
+ local account_name="$1"
132
+
133
+ if [[ -z "$account_name" ]]; then
134
+ print_error "$ERROR_ARGS_MISSING"
135
+ return 1
136
+ fi
137
+
138
+ local config
139
+ if ! config=$(jq -r ".accounts.\"$account_name\"" "$CONFIG_FILE" 2>/dev/null); then
140
+ print_error "$ERROR_FAILED_TO_READ_CONFIG"
141
+ return 1
142
+ fi
143
+
144
+ if [[ "$config" == "null" ]]; then
145
+ print_error "$ERROR_ACCOUNT_MISSING: $account_name"
146
+ return 1
147
+ fi
148
+
149
+ echo "$config"
150
+ return 0
151
+ }
152
+
153
+ get_repo_full_name() {
154
+ local account_name="$1"
155
+ local repo_name="$2"
156
+ local config
157
+ config=$(get_account_config "$account_name") || exit 1
158
+
159
+ local owner
160
+ owner=$(echo "$config" | jq -r '.owner // "EMPTY"')
161
+ if [[ "$owner" == "EMPTY" || -z "$owner" ]]; then
162
+ print_error "$ERROR_OWNER_NOT_CONFIGURED: $account_name"
163
+ return 1
164
+ fi
165
+
166
+ echo "$owner/$repo_name"
167
+ return 0
168
+ }
169
+
170
+ get_repo_info() {
171
+ local account_name="$1"
172
+ local repo_name="$2"
173
+ local repo_full_name
174
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
175
+
176
+ local repo_info
177
+ if repo_info=$(tea repos list --login "$account_name" --owner "${repo_full_name%/*}" --repo "${repo_full_name#*/}" --output json 2>/dev/null); then
178
+ echo "$repo_info"
179
+ return 0
180
+ fi
181
+
182
+ print_error "$ERROR_REPO_NOT_FOUND: $repo_full_name"
183
+ return 1
184
+ }
185
+
186
+ # ------------------------------------------------------------------------------
187
+ # REPOSITORY MANAGEMENT
188
+ # ------------------------------------------------------------------------------
189
+
190
+ list_repos() {
191
+ local account_name="$1"
192
+ local owner_filter="${2:-}"
193
+
194
+ local config
195
+ config=$(get_account_config "$account_name") || exit 1
196
+
197
+ local owner
198
+ owner=$(echo "$config" | jq -r '.owner // "EMPTY"')
199
+ if [[ "$owner" == "EMPTY" || -z "$owner" ]]; then
200
+ print_error "$ERROR_OWNER_NOT_CONFIGURED: $account_name"
201
+ return 1
202
+ fi
203
+
204
+ local tea_args=()
205
+ tea_args+=("--login" "$account_name")
206
+ tea_args+=("--owner" "$owner")
207
+
208
+ if [[ -n "$owner_filter" ]]; then
209
+ tea_args+=("--search" "$owner_filter")
210
+ fi
211
+
212
+ print_info "Listing repositories for $owner..."
213
+
214
+ if ! tea repos list "${tea_args[@]}" --limit 50 --output tsb; then
215
+ print_error "$ERROR_API_FAILED"
216
+ return 1
217
+ fi
218
+ return 0
219
+ }
220
+
221
+ create_repo() {
222
+ local account_name="$1"
223
+ local repo_name="$2"
224
+ local repo_description="${3:-}"
225
+ local visibility="${4:-public}"
226
+ local auto_init="${5:-false}"
227
+
228
+ if [[ -z "$repo_name" ]]; then
229
+ print_error "$ERROR_REPO_NAME_REQUIRED"
230
+ print_info "Usage: gitea-cli-helper.sh create-repo <account> <repo-name> [description] [visibility] [init]"
231
+ return 1
232
+ fi
233
+
234
+ local config
235
+ config=$(get_account_config "$account_name") || exit 1
236
+
237
+ local owner
238
+ owner=$(echo "$config" | jq -r '.owner // "EMPTY"')
239
+ if [[ "$owner" == "EMPTY" || -z "$owner" ]]; then
240
+ print_error "$ERROR_OWNER_NOT_CONFIGURED: $account_name"
241
+ return 1
242
+ fi
243
+
244
+ print_info "Creating repository: $owner/$repo_name"
245
+
246
+ local tea_args=()
247
+ tea_args+=("--login" "$account_name")
248
+ tea_args+=("--name" "$repo_name" "--owner" "$owner")
249
+
250
+ if [[ -n "$repo_description" ]]; then
251
+ tea_args+=("--description" "$repo_description")
252
+ fi
253
+
254
+ case "$visibility" in
255
+ "private")
256
+ tea_args+=("--private")
257
+ ;;
258
+ "internal")
259
+ tea_args+=("--internal")
260
+ ;;
261
+ "public")
262
+ tea_args+=("--public")
263
+ ;;
264
+ *)
265
+ # Default to public if not specified
266
+ tea_args+=("--public")
267
+ ;;
268
+ esac
269
+
270
+ if [[ "$auto_init" == "true" ]]; then
271
+ tea_args+=("--init")
272
+ fi
273
+
274
+ if tea repos create "${tea_args[@]}"; then
275
+ print_success "$SUCCESS_REPO_CREATED: $owner/$repo_name"
276
+
277
+ # Add to configuration if not exists
278
+ local repo_full_name="$owner/$repo_name"
279
+ if ! jq -e ".repos.\"$repo_full_name\"" "$CONFIG_FILE" &>/dev/null; then
280
+ jq --arg repo "$repo_full_name" --arg account "$account_name" --arg name "$repo_name" \
281
+ '.repos[$repo] = {owner: $owner, name: $name, account: $account_name}' \
282
+ "$CONFIG_FILE" > "$CONFIG_FILE.tmp" && mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
283
+ fi
284
+ else
285
+ print_error "Failed to create repository"
286
+ return 1
287
+ fi
288
+ return 0
289
+ }
290
+
291
+ delete_repo() {
292
+ local account_name="$1"
293
+ local repo_name="$2"
294
+
295
+ if [[ -z "$repo_name" ]]; then
296
+ print_error "$ERROR_ARGS_MISSING"
297
+ return 1
298
+ fi
299
+
300
+ local repo_full_name
301
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
302
+
303
+ print_warning "This will permanently delete repository: $repo_full_name"
304
+ print_info "To confirm, type 'DELETE':"
305
+ read -r confirmation
306
+
307
+ if [[ "$confirmation" != "DELETE" ]]; then
308
+ print_info "Deletion cancelled"
309
+ return 0
310
+ fi
311
+
312
+ print_info "Deleting repository: $repo_full_name"
313
+
314
+ if tea repos delete --login "$account_name" --owner "${repo_full_name%/*}" --repo "${repo_full_name#*/}"; then
315
+ print_success "Repository deleted successfully"
316
+
317
+ # Remove from configuration
318
+ jq --arg repo "$repo_full_name" 'del(.repos[$repo])' \
319
+ "$CONFIG_FILE" > "$CONFIG_FILE.tmp" && mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
320
+ else
321
+ print_error "Failed to delete repository"
322
+ return 1
323
+ fi
324
+ return 0
325
+ }
326
+
327
+ get_repo_details() {
328
+ local account_name="$1"
329
+ local repo_name="$2"
330
+
331
+ if [[ -z "$repo_name" ]]; then
332
+ print_error "$ERROR_ARGS_MISSING"
333
+ return 1
334
+ fi
335
+
336
+ local repo_full_name
337
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
338
+
339
+ print_info "Repository details for $repo_full_name:"
340
+ tea repos show --login "$account_name" --owner "${repo_full_name%/*}" --repo "${repo_full_name#*/}" --output json | jq .
341
+ return 0
342
+ }
343
+
344
+ # ------------------------------------------------------------------------------
345
+ # ISSUE MANAGEMENT
346
+ # ------------------------------------------------------------------------------
347
+
348
+ list_issues() {
349
+ local account_name="$1"
350
+ local repo_name="$2"
351
+ local state="${3:-open}"
352
+
353
+ if [[ -z "$repo_name" ]]; then
354
+ print_error "$ERROR_ARGS_MISSING"
355
+ return 1
356
+ fi
357
+
358
+ local repo_full_name
359
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
360
+
361
+ print_info "Listing issues for $repo_full_name (state: $state)"
362
+ tea issues list --login "$account_name" --owner "${repo_full_name%/*}" --repo "${repo_full_name#*/}" --state "$state" --limit 50 --output tsb
363
+ return 0
364
+ }
365
+
366
+ create_issue() {
367
+ local account_name="$1"
368
+ local repo_name="$2"
369
+ local title="$3"
370
+ local body="${4:-}"
371
+
372
+ if [[ -z "$title" ]]; then
373
+ print_error "$ERROR_ISSUE_TITLE_REQUIRED"
374
+ return 1
375
+ fi
376
+
377
+ local repo_full_name
378
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
379
+
380
+ print_info "Creating issue in $repo_full_name"
381
+
382
+ local tea_args=()
383
+ tea_args+=("--login" "$account_name")
384
+ tea_args+=("--title" "$title" "--owner" "${repo_full_name%/*}" "--repo" "${repo_full_name#*/}")
385
+
386
+ if [[ -n "$body" ]]; then
387
+ tea_args+=("--body" "$body")
388
+ fi
389
+
390
+ if tea issues create "${tea_args[@]}" --output json; then
391
+ print_success "$SUCCESS_ISSUE_CREATED"
392
+ else
393
+ print_error "Failed to create issue"
394
+ return 1
395
+ fi
396
+ return 0
397
+ }
398
+
399
+ close_issue() {
400
+ local account_name="$1"
401
+ local repo_name="$2"
402
+ local issue_number="$3"
403
+
404
+ if [[ -z "$issue_number" ]]; then
405
+ print_error "$ERROR_ISSUE_NUMBER_REQUIRED"
406
+ return 1
407
+ fi
408
+
409
+ local repo_full_name
410
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
411
+
412
+ print_info "Closing issue #$issue_number in $repo_full_name"
413
+
414
+ if tea issues close --login "$account_name" --owner "${repo_full_name%/*}" --repo "${repo_full_name#*/}" --index "$issue_number"; then
415
+ print_success "$SUCCESS_ISSUE_CLOSED"
416
+ else
417
+ print_error "Failed to close issue"
418
+ return 1
419
+ fi
420
+ return 0
421
+ }
422
+
423
+ # ------------------------------------------------------------------------------
424
+ # PULL REQUEST MANAGEMENT
425
+ # ------------------------------------------------------------------------------
426
+
427
+ list_prs() {
428
+ local account_name="$1"
429
+ local repo_name="$2"
430
+ local state="${3:-open}"
431
+
432
+ if [[ -z "$repo_name" ]]; then
433
+ print_error "$ERROR_ARGS_MISSING"
434
+ return 1
435
+ fi
436
+
437
+ local repo_full_name
438
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
439
+
440
+ print_info "Listing pull requests for $repo_full_name (state: $state)"
441
+ tea pulls list --login "$account_name" --owner "${repo_full_name%/*}" --repo "${repo_full_name#*/}" --state "$state" --limit 50 --output tsb
442
+ return 0
443
+ }
444
+
445
+ create_pr() {
446
+ local account_name="$1"
447
+ local repo_name="$2"
448
+ local title="$3"
449
+ local head_branch="${4:-}"
450
+ local base_branch="${5:-main}"
451
+ local body="${6:-}"
452
+
453
+ if [[ -z "$title" || -z "$head_branch" ]]; then
454
+ print_error "Pull request title and head branch are required"
455
+ return 1
456
+ fi
457
+
458
+ local repo_full_name
459
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
460
+
461
+ print_info "Creating pull request in $repo_full_name"
462
+
463
+ local tea_args=()
464
+ tea_args+=("--login" "$account_name")
465
+ tea_args+=("--title" "$title" "--head" "$head_branch" "--base" "$base_branch")
466
+ tea_args+=("--owner" "${repo_full_name%/*}" "--repo" "${repo_full_name#*/}")
467
+
468
+ if [[ -n "$body" ]]; then
469
+ tea_args+=("--body" "$body")
470
+ fi
471
+
472
+ if tea pulls create "${tea_args[@]}" --output json; then
473
+ print_success "$SUCCESS_PR_CREATED"
474
+ else
475
+ print_error "Failed to create pull request"
476
+ return 1
477
+ fi
478
+ return 0
479
+ }
480
+
481
+ merge_pr() {
482
+ local account_name="$1"
483
+ local repo_name="$2"
484
+ local pr_number="$3"
485
+ local merge_method="${4:-merge}"
486
+
487
+ if [[ -z "$pr_number" ]]; then
488
+ print_error "$ERROR_PR_NUMBER_REQUIRED"
489
+ return 1
490
+ fi
491
+
492
+ local repo_full_name
493
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
494
+
495
+ print_info "Merging pull request #$pr_number in $repo_full_name"
496
+
497
+ local tea_args=()
498
+ tea_args+=("--login" "$account_name")
499
+ tea_args+=("--owner" "${repo_full_name%/*}" --repo "${repo_full_name#*/}" --index "$pr_number")
500
+
501
+ case "$merge_method" in
502
+ "squash")
503
+ tea_args+=("--squash")
504
+ ;;
505
+ "rebase")
506
+ tea_args+=("--rebase")
507
+ ;;
508
+ "merge"|*)
509
+ # Default merge behavior
510
+ ;;
511
+ esac
512
+
513
+ if tea pulls merge "${tea_args[@]}"; then
514
+ print_success "$SUCCESS_PR_MERGED"
515
+ else
516
+ print_error "Failed to merge pull request"
517
+ return 1
518
+ fi
519
+ return 0
520
+ }
521
+
522
+ # ------------------------------------------------------------------------------
523
+ # BRANCH MANAGEMENT
524
+ # ------------------------------------------------------------------------------
525
+
526
+ list_branches() {
527
+ local account_name="$1"
528
+ local repo_name="$2"
529
+
530
+ if [[ -z "$repo_name" ]]; then
531
+ print_error "$ERROR_ARGS_MISSING"
532
+ return 1
533
+ fi
534
+
535
+ local repo_full_name
536
+ repo_full_name=$(get_repo_full_name "$account_name" "$repo_name") || exit 1
537
+
538
+ print_info "Listing branches for $repo_full_name"
539
+ tea repos branches --login "$account_name" --owner "${repo_full_name%/*}" --repo "${repo_full_name#*/}" --output tsb
540
+ return 0
541
+ }
542
+
543
+ create_branch() {
544
+ local account_name="$1"
545
+ local repo_name="$2"
546
+ local branch_name="$3"
547
+ local source_branch="${4:-main}"
548
+
549
+ if [[ -z "$branch_name" ]]; then
550
+ print_error "$ERROR_BRANCH_NAME_REQUIRED"
551
+ return 1
552
+ fi
553
+
554
+ local config
555
+ config=$(get_account_config "$account_name") || exit 1
556
+
557
+ local owner
558
+ owner=$(echo "$config" | jq -r '.owner // "EMPTY"')
559
+ if [[ "$owner" == "EMPTY" || -z "$owner" ]]; then
560
+ print_error "$ERROR_OWNER_NOT_CONFIGURED: $account_name"
561
+ return 1
562
+ fi
563
+
564
+ # Get API URL from config or use default
565
+ local api_url
566
+ api_url=$(echo "$config" | jq -r '.api_url // "https://gitea.com/api/v1"')
567
+ local token
568
+ token=$(echo "$config" | jq -r '.token // ""')
569
+
570
+ if [[ -z "$token" ]]; then
571
+ print_error "API token not configured for account: $account_name"
572
+ return 1
573
+ fi
574
+
575
+ print_info "Creating branch '$branch_name' in $owner/$repo_name from '$source_branch'"
576
+
577
+ # Use API to create branch since tea doesn't have branch creation command
578
+ local branch_data
579
+ branch_data="{\"new_branch_name\": \"$branch_name\", \"old_branch_name\": \"$source_branch\"}"
580
+
581
+ local curl_args=()
582
+ curl_args+=("-X" "POST" "$api_url/repos/$owner/$repo_name/branches")
583
+ curl_args+=("-H" "$AUTH_HEADER_TOKEN $token")
584
+ curl_args+=("-H" "$CONTENT_TYPE_JSON")
585
+ curl_args+=("-d" "$branch_data")
586
+
587
+ if curl "${curl_args[@]}" &>/dev/null; then
588
+ print_success "$SUCCESS_BRANCH_CREATED"
589
+ else
590
+ print_error "Failed to create branch"
591
+ return 1
592
+ fi
593
+ return 0
594
+ }
595
+
596
+ # ------------------------------------------------------------------------------
597
+ # ACCOUNT MANAGEMENT
598
+ # ------------------------------------------------------------------------------
599
+
600
+ list_accounts() {
601
+ print_info "Configured Gitea accounts:"
602
+ if [[ -f "$CONFIG_FILE" ]]; then
603
+ jq -r '.accounts | keys[]' "$CONFIG_FILE" 2>/dev/null || print_warning "No accounts configured"
604
+ else
605
+ print_warning "Configuration file not found"
606
+ fi
607
+ return 0
608
+ }
609
+
610
+ show_help() {
611
+ cat << EOF
612
+ Gitea CLI Helper Script
613
+ Usage: $0 [command] [account] [arguments]
614
+
615
+ Gitea management using Gitea CLI (tea)
616
+
617
+ COMMANDS:
618
+ Repository Management:
619
+ list-repos [account] [filter] - List repositories (can filter by name)
620
+ create-repo <account> <name> [desc] [vis] [init] - Create repository
621
+ visibility: public|private|internal (default: public)
622
+ auto_init: true|false (default: false)
623
+ delete-repo <account> <name> - Delete repository (requires confirmation)
624
+ get-repo <account> <name> - Get repository information
625
+
626
+ Issue Management:
627
+ list-issues <account> <repo> [state] - List issues (open|closed|all)
628
+ create-issue <account> <repo> <title> [body] - Create issue
629
+ close-issue <account> <repo> <number> - Close issue
630
+
631
+ Pull Request Management:
632
+ list-prs <account> <repo> [state] - List pull requests
633
+ create-pr <account> <repo> <title> <head> [base] [body] - Create PR
634
+ merge-pr <account> <repo> <number> [method] - Merge PR (merge|squash|rebase)
635
+
636
+ Branch Management:
637
+ list-branches <account> <repo> - List branches
638
+ create-branch <account> <repo> <branch> [source] - Create branch
639
+
640
+ Account Management:
641
+ list-accounts - List configured accounts
642
+ help - $HELP_SHOW_MESSAGE
643
+
644
+ EXAMPLES:
645
+ $0 list-repos marcusquinn
646
+ $0 create-repo marcusquinn my-gitea-project "My Gitea project" private true
647
+ $0 list-issues marcusquinn my-repo open
648
+ $0 create-issue marcusquinn my-repo "Bug report" "Describe the issue here"
649
+ $0 create-pr marcusquinn my-repo "Fix bug" bugfix-branch main
650
+
651
+ CONFIGURATION:
652
+ File: configs/gitea-cli-config.json
653
+ Example: cp configs/gitea-cli-config.json.txt configs/gitea-cli-config.json
654
+
655
+ REQUIREMENTS:
656
+ - Gitea CLI (tea) installed and authenticated
657
+ - jq JSON processor
658
+ - Valid Gitea access token (configured in config file)
659
+
660
+ For more information, see the Gitea CLI documentation: https://gitea.com/tea/
661
+ EOF
662
+ return 0
663
+ }
664
+
665
+ # ------------------------------------------------------------------------------
666
+ # MAIN COMMAND HANDLER
667
+ # ------------------------------------------------------------------------------
668
+
669
+ main() {
670
+ local command="${1:-help}"
671
+ local account_name="$2"
672
+ local target="$3"
673
+ local options="$4"
674
+
675
+ case "$command" in
676
+ "list-repos")
677
+ list_repos "$account_name" "$target"
678
+ ;;
679
+ "create-repo")
680
+ local repo_desc="$options"
681
+ local repo_vis="$5"
682
+ local repo_init="$6"
683
+ create_repo "$account_name" "$target" "$repo_desc" "$repo_vis" "$repo_init"
684
+ ;;
685
+ "delete-repo")
686
+ delete_repo "$account_name" "$target"
687
+ ;;
688
+ "get-repo")
689
+ get_repo_details "$account_name" "$target"
690
+ ;;
691
+ "list-issues")
692
+ list_issues "$account_name" "$target" "$options"
693
+ ;;
694
+ "create-issue")
695
+ local issue_body="$5"
696
+ create_issue "$account_name" "$target" "$options" "$issue_body"
697
+ ;;
698
+ "close-issue")
699
+ close_issue "$account_name" "$target" "$options"
700
+ ;;
701
+ "list-prs")
702
+ list_prs "$account_name" "$target" "$options"
703
+ ;;
704
+ "create-pr")
705
+ local pr_title="$options"
706
+ local pr_head="$5"
707
+ local pr_base="$6"
708
+ local pr_body="$7"
709
+ create_pr "$account_name" "$target" "$pr_title" "$pr_head" "$pr_base" "$pr_body"
710
+ ;;
711
+ "merge-pr")
712
+ local merge_method="$5"
713
+ merge_pr "$account_name" "$target" "$options" "$merge_method"
714
+ ;;
715
+ "list-branches")
716
+ list_branches "$account_name" "$target"
717
+ ;;
718
+ "create-branch")
719
+ local source_branch="$5"
720
+ create_branch "$account_name" "$target" "$options" "$source_branch"
721
+ ;;
722
+ "list-accounts")
723
+ list_accounts
724
+ ;;
725
+ "help"|"-h"|"--help")
726
+ show_help
727
+ ;;
728
+ *)
729
+ print_error "$ERROR_UNKNOWN_COMMAND $command"
730
+ print_info "Use '$0 help' for usage information"
731
+ exit 1
732
+ ;;
733
+ esac
734
+
735
+ return 0
736
+ }
737
+
738
+ # Initialize
739
+ check_dependencies
740
+ load_config
741
+
742
+ # Execute main function
743
+ main "$@"