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.
- package/.agent/AGENTS.md +614 -0
- package/.agent/accounts.md +65 -0
- package/.agent/aidevops/add-new-mcp-to-aidevops.md +456 -0
- package/.agent/aidevops/api-integrations.md +335 -0
- package/.agent/aidevops/architecture.md +510 -0
- package/.agent/aidevops/configs.md +274 -0
- package/.agent/aidevops/docs.md +244 -0
- package/.agent/aidevops/extension.md +311 -0
- package/.agent/aidevops/mcp-integrations.md +340 -0
- package/.agent/aidevops/mcp-troubleshooting.md +162 -0
- package/.agent/aidevops/memory-patterns.md +172 -0
- package/.agent/aidevops/providers.md +217 -0
- package/.agent/aidevops/recommendations.md +321 -0
- package/.agent/aidevops/requirements.md +301 -0
- package/.agent/aidevops/resources.md +214 -0
- package/.agent/aidevops/security-requirements.md +174 -0
- package/.agent/aidevops/security.md +350 -0
- package/.agent/aidevops/service-links.md +400 -0
- package/.agent/aidevops/services.md +357 -0
- package/.agent/aidevops/setup.md +153 -0
- package/.agent/aidevops/troubleshooting.md +389 -0
- package/.agent/aidevops.md +124 -0
- package/.agent/build-plus.md +244 -0
- package/.agent/content/guidelines.md +109 -0
- package/.agent/content.md +87 -0
- package/.agent/health.md +59 -0
- package/.agent/legal.md +59 -0
- package/.agent/loop-state/full-loop.local.md +16 -0
- package/.agent/loop-state/ralph-loop.local.md +10 -0
- package/.agent/marketing.md +440 -0
- package/.agent/memory/README.md +260 -0
- package/.agent/onboarding.md +796 -0
- package/.agent/plan-plus.md +245 -0
- package/.agent/research.md +100 -0
- package/.agent/sales.md +333 -0
- package/.agent/scripts/101domains-helper.sh +701 -0
- package/.agent/scripts/add-missing-returns.sh +140 -0
- package/.agent/scripts/agent-browser-helper.sh +311 -0
- package/.agent/scripts/agno-setup.sh +712 -0
- package/.agent/scripts/ahrefs-mcp-wrapper.js +168 -0
- package/.agent/scripts/aidevops-update-check.sh +71 -0
- package/.agent/scripts/ampcode-cli.sh +522 -0
- package/.agent/scripts/auto-version-bump.sh +156 -0
- package/.agent/scripts/autogen-helper.sh +512 -0
- package/.agent/scripts/beads-sync-helper.sh +596 -0
- package/.agent/scripts/closte-helper.sh +5 -0
- package/.agent/scripts/cloudron-helper.sh +321 -0
- package/.agent/scripts/codacy-cli-chunked.sh +581 -0
- package/.agent/scripts/codacy-cli.sh +442 -0
- package/.agent/scripts/code-audit-helper.sh +5 -0
- package/.agent/scripts/coderabbit-cli.sh +417 -0
- package/.agent/scripts/coderabbit-pro-analysis.sh +238 -0
- package/.agent/scripts/commands/code-simplifier.md +86 -0
- package/.agent/scripts/commands/full-loop.md +246 -0
- package/.agent/scripts/commands/postflight-loop.md +103 -0
- package/.agent/scripts/commands/recall.md +182 -0
- package/.agent/scripts/commands/remember.md +132 -0
- package/.agent/scripts/commands/save-todo.md +175 -0
- package/.agent/scripts/commands/session-review.md +154 -0
- package/.agent/scripts/comprehensive-quality-fix.sh +106 -0
- package/.agent/scripts/context-builder-helper.sh +522 -0
- package/.agent/scripts/coolify-cli-helper.sh +674 -0
- package/.agent/scripts/coolify-helper.sh +380 -0
- package/.agent/scripts/crawl4ai-examples.sh +401 -0
- package/.agent/scripts/crawl4ai-helper.sh +1078 -0
- package/.agent/scripts/crewai-helper.sh +681 -0
- package/.agent/scripts/dev-browser-helper.sh +513 -0
- package/.agent/scripts/dns-helper.sh +396 -0
- package/.agent/scripts/domain-research-helper.sh +917 -0
- package/.agent/scripts/dspy-helper.sh +285 -0
- package/.agent/scripts/dspyground-helper.sh +291 -0
- package/.agent/scripts/eeat-score-helper.sh +1242 -0
- package/.agent/scripts/efficient-return-fix.sh +92 -0
- package/.agent/scripts/extract-opencode-prompts.sh +128 -0
- package/.agent/scripts/find-missing-returns.sh +113 -0
- package/.agent/scripts/fix-auth-headers.sh +104 -0
- package/.agent/scripts/fix-common-strings.sh +254 -0
- package/.agent/scripts/fix-content-type.sh +100 -0
- package/.agent/scripts/fix-error-messages.sh +130 -0
- package/.agent/scripts/fix-misplaced-returns.sh +74 -0
- package/.agent/scripts/fix-remaining-literals.sh +152 -0
- package/.agent/scripts/fix-return-statements.sh +41 -0
- package/.agent/scripts/fix-s131-default-cases.sh +249 -0
- package/.agent/scripts/fix-sc2155-simple.sh +102 -0
- package/.agent/scripts/fix-shellcheck-critical.sh +187 -0
- package/.agent/scripts/fix-string-literals.sh +273 -0
- package/.agent/scripts/full-loop-helper.sh +773 -0
- package/.agent/scripts/generate-opencode-agents.sh +497 -0
- package/.agent/scripts/generate-opencode-commands.sh +1629 -0
- package/.agent/scripts/generate-skills.sh +366 -0
- package/.agent/scripts/git-platforms-helper.sh +640 -0
- package/.agent/scripts/gitea-cli-helper.sh +743 -0
- package/.agent/scripts/github-cli-helper.sh +702 -0
- package/.agent/scripts/gitlab-cli-helper.sh +682 -0
- package/.agent/scripts/gsc-add-user-helper.sh +325 -0
- package/.agent/scripts/gsc-sitemap-helper.sh +678 -0
- package/.agent/scripts/hetzner-helper.sh +485 -0
- package/.agent/scripts/hostinger-helper.sh +229 -0
- package/.agent/scripts/keyword-research-helper.sh +1815 -0
- package/.agent/scripts/langflow-helper.sh +544 -0
- package/.agent/scripts/linkedin-automation.py +241 -0
- package/.agent/scripts/linter-manager.sh +599 -0
- package/.agent/scripts/linters-local.sh +434 -0
- package/.agent/scripts/list-keys-helper.sh +488 -0
- package/.agent/scripts/local-browser-automation.py +339 -0
- package/.agent/scripts/localhost-helper.sh +744 -0
- package/.agent/scripts/loop-common.sh +806 -0
- package/.agent/scripts/mainwp-helper.sh +728 -0
- package/.agent/scripts/markdown-formatter.sh +338 -0
- package/.agent/scripts/markdown-lint-fix.sh +311 -0
- package/.agent/scripts/mass-fix-returns.sh +58 -0
- package/.agent/scripts/mcp-diagnose.sh +167 -0
- package/.agent/scripts/mcp-inspector-helper.sh +449 -0
- package/.agent/scripts/memory-helper.sh +650 -0
- package/.agent/scripts/monitor-code-review.sh +255 -0
- package/.agent/scripts/onboarding-helper.sh +706 -0
- package/.agent/scripts/opencode-github-setup-helper.sh +797 -0
- package/.agent/scripts/opencode-test-helper.sh +213 -0
- package/.agent/scripts/pagespeed-helper.sh +464 -0
- package/.agent/scripts/pandoc-helper.sh +362 -0
- package/.agent/scripts/postflight-check.sh +555 -0
- package/.agent/scripts/pre-commit-hook.sh +259 -0
- package/.agent/scripts/pre-edit-check.sh +169 -0
- package/.agent/scripts/qlty-cli.sh +356 -0
- package/.agent/scripts/quality-cli-manager.sh +525 -0
- package/.agent/scripts/quality-feedback-helper.sh +462 -0
- package/.agent/scripts/quality-fix.sh +263 -0
- package/.agent/scripts/quality-loop-helper.sh +1108 -0
- package/.agent/scripts/ralph-loop-helper.sh +836 -0
- package/.agent/scripts/ralph-upstream-check.sh +341 -0
- package/.agent/scripts/secretlint-helper.sh +847 -0
- package/.agent/scripts/servers-helper.sh +241 -0
- package/.agent/scripts/ses-helper.sh +619 -0
- package/.agent/scripts/session-review-helper.sh +404 -0
- package/.agent/scripts/setup-linters-wizard.sh +379 -0
- package/.agent/scripts/setup-local-api-keys.sh +330 -0
- package/.agent/scripts/setup-mcp-integrations.sh +472 -0
- package/.agent/scripts/shared-constants.sh +246 -0
- package/.agent/scripts/site-crawler-helper.sh +1487 -0
- package/.agent/scripts/snyk-helper.sh +940 -0
- package/.agent/scripts/sonarcloud-autofix.sh +193 -0
- package/.agent/scripts/sonarcloud-cli.sh +191 -0
- package/.agent/scripts/sonarscanner-cli.sh +455 -0
- package/.agent/scripts/spaceship-helper.sh +747 -0
- package/.agent/scripts/stagehand-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-setup.sh +441 -0
- package/.agent/scripts/stagehand-setup.sh +439 -0
- package/.agent/scripts/system-cleanup.sh +340 -0
- package/.agent/scripts/terminal-title-helper.sh +388 -0
- package/.agent/scripts/terminal-title-setup.sh +549 -0
- package/.agent/scripts/test-stagehand-both-integration.sh +317 -0
- package/.agent/scripts/test-stagehand-integration.sh +309 -0
- package/.agent/scripts/test-stagehand-python-integration.sh +341 -0
- package/.agent/scripts/todo-ready.sh +263 -0
- package/.agent/scripts/tool-version-check.sh +362 -0
- package/.agent/scripts/toon-helper.sh +469 -0
- package/.agent/scripts/twilio-helper.sh +917 -0
- package/.agent/scripts/updown-helper.sh +279 -0
- package/.agent/scripts/validate-mcp-integrations.sh +250 -0
- package/.agent/scripts/validate-version-consistency.sh +131 -0
- package/.agent/scripts/vaultwarden-helper.sh +597 -0
- package/.agent/scripts/vercel-cli-helper.sh +816 -0
- package/.agent/scripts/verify-mirrors.sh +169 -0
- package/.agent/scripts/version-manager.sh +831 -0
- package/.agent/scripts/webhosting-helper.sh +471 -0
- package/.agent/scripts/webhosting-verify.sh +238 -0
- package/.agent/scripts/wordpress-mcp-helper.sh +508 -0
- package/.agent/scripts/worktree-helper.sh +595 -0
- package/.agent/scripts/worktree-sessions.sh +577 -0
- package/.agent/seo/dataforseo.md +215 -0
- package/.agent/seo/domain-research.md +532 -0
- package/.agent/seo/eeat-score.md +659 -0
- package/.agent/seo/google-search-console.md +366 -0
- package/.agent/seo/gsc-sitemaps.md +282 -0
- package/.agent/seo/keyword-research.md +521 -0
- package/.agent/seo/serper.md +278 -0
- package/.agent/seo/site-crawler.md +387 -0
- package/.agent/seo.md +236 -0
- package/.agent/services/accounting/quickfile.md +159 -0
- package/.agent/services/communications/telfon.md +470 -0
- package/.agent/services/communications/twilio.md +569 -0
- package/.agent/services/crm/fluentcrm.md +449 -0
- package/.agent/services/email/ses.md +399 -0
- package/.agent/services/hosting/101domains.md +378 -0
- package/.agent/services/hosting/closte.md +177 -0
- package/.agent/services/hosting/cloudflare.md +251 -0
- package/.agent/services/hosting/cloudron.md +478 -0
- package/.agent/services/hosting/dns-providers.md +335 -0
- package/.agent/services/hosting/domain-purchasing.md +344 -0
- package/.agent/services/hosting/hetzner.md +327 -0
- package/.agent/services/hosting/hostinger.md +287 -0
- package/.agent/services/hosting/localhost.md +419 -0
- package/.agent/services/hosting/spaceship.md +353 -0
- package/.agent/services/hosting/webhosting.md +330 -0
- package/.agent/social-media.md +69 -0
- package/.agent/templates/plans-template.md +114 -0
- package/.agent/templates/prd-template.md +129 -0
- package/.agent/templates/tasks-template.md +108 -0
- package/.agent/templates/todo-template.md +89 -0
- package/.agent/tools/ai-assistants/agno.md +471 -0
- package/.agent/tools/ai-assistants/capsolver.md +326 -0
- package/.agent/tools/ai-assistants/configuration.md +221 -0
- package/.agent/tools/ai-assistants/overview.md +209 -0
- package/.agent/tools/ai-assistants/status.md +171 -0
- package/.agent/tools/ai-assistants/windsurf.md +193 -0
- package/.agent/tools/ai-orchestration/autogen.md +406 -0
- package/.agent/tools/ai-orchestration/crewai.md +445 -0
- package/.agent/tools/ai-orchestration/langflow.md +405 -0
- package/.agent/tools/ai-orchestration/openprose.md +487 -0
- package/.agent/tools/ai-orchestration/overview.md +362 -0
- package/.agent/tools/ai-orchestration/packaging.md +647 -0
- package/.agent/tools/browser/agent-browser.md +464 -0
- package/.agent/tools/browser/browser-automation.md +400 -0
- package/.agent/tools/browser/chrome-devtools.md +282 -0
- package/.agent/tools/browser/crawl4ai-integration.md +422 -0
- package/.agent/tools/browser/crawl4ai-resources.md +277 -0
- package/.agent/tools/browser/crawl4ai-usage.md +416 -0
- package/.agent/tools/browser/crawl4ai.md +585 -0
- package/.agent/tools/browser/dev-browser.md +341 -0
- package/.agent/tools/browser/pagespeed.md +260 -0
- package/.agent/tools/browser/playwright.md +266 -0
- package/.agent/tools/browser/playwriter.md +310 -0
- package/.agent/tools/browser/stagehand-examples.md +456 -0
- package/.agent/tools/browser/stagehand-python.md +483 -0
- package/.agent/tools/browser/stagehand.md +421 -0
- package/.agent/tools/build-agent/agent-review.md +224 -0
- package/.agent/tools/build-agent/build-agent.md +784 -0
- package/.agent/tools/build-mcp/aidevops-plugin.md +476 -0
- package/.agent/tools/build-mcp/api-wrapper.md +445 -0
- package/.agent/tools/build-mcp/build-mcp.md +240 -0
- package/.agent/tools/build-mcp/deployment.md +401 -0
- package/.agent/tools/build-mcp/server-patterns.md +632 -0
- package/.agent/tools/build-mcp/transports.md +366 -0
- package/.agent/tools/code-review/auditing.md +383 -0
- package/.agent/tools/code-review/automation.md +219 -0
- package/.agent/tools/code-review/best-practices.md +203 -0
- package/.agent/tools/code-review/codacy.md +151 -0
- package/.agent/tools/code-review/code-simplifier.md +174 -0
- package/.agent/tools/code-review/code-standards.md +309 -0
- package/.agent/tools/code-review/coderabbit.md +101 -0
- package/.agent/tools/code-review/management.md +155 -0
- package/.agent/tools/code-review/qlty.md +248 -0
- package/.agent/tools/code-review/secretlint.md +565 -0
- package/.agent/tools/code-review/setup.md +250 -0
- package/.agent/tools/code-review/snyk.md +563 -0
- package/.agent/tools/code-review/tools.md +230 -0
- package/.agent/tools/content/summarize.md +353 -0
- package/.agent/tools/context/augment-context-engine.md +468 -0
- package/.agent/tools/context/context-builder-agent.md +76 -0
- package/.agent/tools/context/context-builder.md +375 -0
- package/.agent/tools/context/context7.md +371 -0
- package/.agent/tools/context/dspy.md +302 -0
- package/.agent/tools/context/dspyground.md +374 -0
- package/.agent/tools/context/llm-tldr.md +219 -0
- package/.agent/tools/context/osgrep.md +488 -0
- package/.agent/tools/context/prompt-optimization.md +338 -0
- package/.agent/tools/context/toon.md +292 -0
- package/.agent/tools/conversion/pandoc.md +304 -0
- package/.agent/tools/credentials/api-key-management.md +154 -0
- package/.agent/tools/credentials/api-key-setup.md +224 -0
- package/.agent/tools/credentials/environment-variables.md +180 -0
- package/.agent/tools/credentials/vaultwarden.md +382 -0
- package/.agent/tools/data-extraction/outscraper.md +974 -0
- package/.agent/tools/deployment/coolify-cli.md +388 -0
- package/.agent/tools/deployment/coolify-setup.md +353 -0
- package/.agent/tools/deployment/coolify.md +345 -0
- package/.agent/tools/deployment/vercel.md +390 -0
- package/.agent/tools/git/authentication.md +132 -0
- package/.agent/tools/git/gitea-cli.md +193 -0
- package/.agent/tools/git/github-actions.md +207 -0
- package/.agent/tools/git/github-cli.md +223 -0
- package/.agent/tools/git/gitlab-cli.md +190 -0
- package/.agent/tools/git/opencode-github-security.md +350 -0
- package/.agent/tools/git/opencode-github.md +328 -0
- package/.agent/tools/git/opencode-gitlab.md +252 -0
- package/.agent/tools/git/security.md +196 -0
- package/.agent/tools/git.md +207 -0
- package/.agent/tools/opencode/oh-my-opencode.md +375 -0
- package/.agent/tools/opencode/opencode-anthropic-auth.md +446 -0
- package/.agent/tools/opencode/opencode.md +651 -0
- package/.agent/tools/social-media/bird.md +437 -0
- package/.agent/tools/task-management/beads.md +336 -0
- package/.agent/tools/terminal/terminal-title.md +251 -0
- package/.agent/tools/ui/shadcn.md +196 -0
- package/.agent/tools/ui/ui-skills.md +115 -0
- package/.agent/tools/wordpress/localwp.md +311 -0
- package/.agent/tools/wordpress/mainwp.md +391 -0
- package/.agent/tools/wordpress/scf.md +527 -0
- package/.agent/tools/wordpress/wp-admin.md +729 -0
- package/.agent/tools/wordpress/wp-dev.md +940 -0
- package/.agent/tools/wordpress/wp-preferred.md +398 -0
- package/.agent/tools/wordpress.md +95 -0
- package/.agent/workflows/branch/bugfix.md +63 -0
- package/.agent/workflows/branch/chore.md +95 -0
- package/.agent/workflows/branch/experiment.md +115 -0
- package/.agent/workflows/branch/feature.md +59 -0
- package/.agent/workflows/branch/hotfix.md +98 -0
- package/.agent/workflows/branch/refactor.md +92 -0
- package/.agent/workflows/branch/release.md +96 -0
- package/.agent/workflows/branch.md +347 -0
- package/.agent/workflows/bug-fixing.md +267 -0
- package/.agent/workflows/changelog.md +129 -0
- package/.agent/workflows/code-audit-remote.md +279 -0
- package/.agent/workflows/conversation-starter.md +69 -0
- package/.agent/workflows/error-feedback.md +578 -0
- package/.agent/workflows/feature-development.md +355 -0
- package/.agent/workflows/git-workflow.md +702 -0
- package/.agent/workflows/multi-repo-workspace.md +268 -0
- package/.agent/workflows/plans.md +709 -0
- package/.agent/workflows/postflight.md +604 -0
- package/.agent/workflows/pr.md +571 -0
- package/.agent/workflows/preflight.md +278 -0
- package/.agent/workflows/ralph-loop.md +773 -0
- package/.agent/workflows/release.md +498 -0
- package/.agent/workflows/session-manager.md +254 -0
- package/.agent/workflows/session-review.md +311 -0
- package/.agent/workflows/sql-migrations.md +631 -0
- package/.agent/workflows/version-bump.md +283 -0
- package/.agent/workflows/wiki-update.md +333 -0
- package/.agent/workflows/worktree.md +477 -0
- package/LICENSE +21 -0
- package/README.md +1446 -0
- package/VERSION +1 -0
- package/aidevops.sh +1746 -0
- package/bin/aidevops +21 -0
- package/package.json +75 -0
- package/scripts/npm-postinstall.js +60 -0
- package/setup.sh +2366 -0
|
@@ -0,0 +1,831 @@
|
|
|
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
|
+
# Version Manager for AI DevOps Framework
|
|
5
|
+
# Manages semantic versioning and automated version bumping
|
|
6
|
+
#
|
|
7
|
+
# Author: AI DevOps Framework
|
|
8
|
+
# Version: 1.1.0
|
|
9
|
+
|
|
10
|
+
# Colors for output
|
|
11
|
+
readonly GREEN='\033[0;32m'
|
|
12
|
+
readonly BLUE='\033[0;34m'
|
|
13
|
+
readonly YELLOW='\033[1;33m'
|
|
14
|
+
readonly RED='\033[0;31m'
|
|
15
|
+
readonly NC='\033[0m' # No Color
|
|
16
|
+
|
|
17
|
+
print_info() { local msg="$1"; echo -e "${BLUE}[INFO]${NC} $msg"; return 0; }
|
|
18
|
+
print_success() { local msg="$1"; echo -e "${GREEN}[SUCCESS]${NC} $msg"; return 0; }
|
|
19
|
+
print_warning() { local msg="$1"; echo -e "${YELLOW}[WARNING]${NC} $msg"; return 0; }
|
|
20
|
+
print_error() { local msg="$1"; echo -e "${RED}[ERROR]${NC} $msg" >&2; return 0; }
|
|
21
|
+
|
|
22
|
+
# Repository root directory
|
|
23
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
24
|
+
VERSION_FILE="$REPO_ROOT/VERSION"
|
|
25
|
+
|
|
26
|
+
# Function to get current version
|
|
27
|
+
get_current_version() {
|
|
28
|
+
if [[ -f "$VERSION_FILE" ]]; then
|
|
29
|
+
cat "$VERSION_FILE"
|
|
30
|
+
else
|
|
31
|
+
echo "1.0.0"
|
|
32
|
+
fi
|
|
33
|
+
return 0
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Function to bump version
|
|
37
|
+
bump_version() {
|
|
38
|
+
local bump_type="$1"
|
|
39
|
+
local current_version
|
|
40
|
+
current_version=$(get_current_version)
|
|
41
|
+
|
|
42
|
+
IFS='.' read -r major minor patch <<< "$current_version"
|
|
43
|
+
|
|
44
|
+
case "$bump_type" in
|
|
45
|
+
"major")
|
|
46
|
+
major=$((major + 1))
|
|
47
|
+
minor=0
|
|
48
|
+
patch=0
|
|
49
|
+
;;
|
|
50
|
+
"minor")
|
|
51
|
+
minor=$((minor + 1))
|
|
52
|
+
patch=0
|
|
53
|
+
;;
|
|
54
|
+
"patch")
|
|
55
|
+
patch=$((patch + 1))
|
|
56
|
+
;;
|
|
57
|
+
*)
|
|
58
|
+
print_error "Invalid bump type. Use: major, minor, or patch"
|
|
59
|
+
return 1
|
|
60
|
+
;;
|
|
61
|
+
esac
|
|
62
|
+
|
|
63
|
+
local new_version="$major.$minor.$patch"
|
|
64
|
+
echo "$new_version" > "$VERSION_FILE"
|
|
65
|
+
echo "$new_version"
|
|
66
|
+
return 0
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Function to check changelog has entry for version
|
|
70
|
+
check_changelog_version() {
|
|
71
|
+
local version="$1"
|
|
72
|
+
local changelog_file="$REPO_ROOT/CHANGELOG.md"
|
|
73
|
+
|
|
74
|
+
if [[ ! -f "$changelog_file" ]]; then
|
|
75
|
+
print_warning "CHANGELOG.md not found"
|
|
76
|
+
return 1
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# Check if version entry exists
|
|
80
|
+
if grep -q "^\## \[$version\]" "$changelog_file"; then
|
|
81
|
+
print_success "CHANGELOG.md: $version ✓"
|
|
82
|
+
return 0
|
|
83
|
+
else
|
|
84
|
+
print_error "CHANGELOG.md missing entry for version $version"
|
|
85
|
+
return 1
|
|
86
|
+
fi
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
# Function to check changelog has unreleased content
|
|
90
|
+
check_changelog_unreleased() {
|
|
91
|
+
local changelog_file="$REPO_ROOT/CHANGELOG.md"
|
|
92
|
+
|
|
93
|
+
if [[ ! -f "$changelog_file" ]]; then
|
|
94
|
+
print_warning "CHANGELOG.md not found"
|
|
95
|
+
return 1
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# Check if [Unreleased] section exists
|
|
99
|
+
if ! grep -q "^\## \[Unreleased\]" "$changelog_file"; then
|
|
100
|
+
print_error "CHANGELOG.md missing [Unreleased] section"
|
|
101
|
+
return 1
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
# Check if there's content under [Unreleased]
|
|
105
|
+
local unreleased_content
|
|
106
|
+
unreleased_content=$(sed -n '/^## \[Unreleased\]/,/^## \[/p' "$changelog_file" | grep -v "^##" | grep -v "^$" | head -5)
|
|
107
|
+
|
|
108
|
+
if [[ -z "$unreleased_content" ]]; then
|
|
109
|
+
print_warning "CHANGELOG.md [Unreleased] section is empty"
|
|
110
|
+
return 1
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
print_success "CHANGELOG.md has unreleased content ✓"
|
|
114
|
+
return 0
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
# Function to generate changelog preview from commits
|
|
118
|
+
generate_changelog_preview() {
|
|
119
|
+
local prev_tag
|
|
120
|
+
prev_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
|
121
|
+
|
|
122
|
+
local version
|
|
123
|
+
version=$(get_current_version)
|
|
124
|
+
|
|
125
|
+
echo "## [$version] - $(date +%Y-%m-%d)"
|
|
126
|
+
echo ""
|
|
127
|
+
|
|
128
|
+
# Categorize commits
|
|
129
|
+
local added="" changed="" fixed="" security=""
|
|
130
|
+
|
|
131
|
+
local commits
|
|
132
|
+
if [[ -n "$prev_tag" ]]; then
|
|
133
|
+
commits=$(git log "$prev_tag"..HEAD --pretty=format:"%s" 2>/dev/null)
|
|
134
|
+
else
|
|
135
|
+
commits=$(git log --oneline -20 --pretty=format:"%s" 2>/dev/null)
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
while IFS= read -r commit; do
|
|
139
|
+
case "$commit" in
|
|
140
|
+
feat:*|feat\(*) added="$added\n- ${commit#feat: }" ;;
|
|
141
|
+
fix:*|fix\(*) fixed="$fixed\n- ${commit#fix: }" ;;
|
|
142
|
+
security:*) security="$security\n- ${commit#security: }" ;;
|
|
143
|
+
refactor:*|docs:*|chore:*) changed="$changed\n- $commit" ;;
|
|
144
|
+
*) ;; # Ignore other commit types
|
|
145
|
+
esac
|
|
146
|
+
done <<< "$commits"
|
|
147
|
+
|
|
148
|
+
[[ -n "$added" ]] && echo -e "### Added\n$added\n"
|
|
149
|
+
[[ -n "$changed" ]] && echo -e "### Changed\n$changed\n"
|
|
150
|
+
[[ -n "$fixed" ]] && echo -e "### Fixed\n$fixed\n"
|
|
151
|
+
[[ -n "$security" ]] && echo -e "### Security\n$security\n"
|
|
152
|
+
|
|
153
|
+
return 0
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
# Function to generate changelog content from commits (cleaner format)
|
|
157
|
+
generate_changelog_content() {
|
|
158
|
+
local prev_tag
|
|
159
|
+
prev_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
|
160
|
+
|
|
161
|
+
# Categorize commits
|
|
162
|
+
local added="" changed="" fixed="" security="" removed="" deprecated=""
|
|
163
|
+
|
|
164
|
+
local commits
|
|
165
|
+
if [[ -n "$prev_tag" ]]; then
|
|
166
|
+
commits=$(git log "$prev_tag"..HEAD --pretty=format:"%s" 2>/dev/null)
|
|
167
|
+
else
|
|
168
|
+
commits=$(git log --oneline -20 --pretty=format:"%s" 2>/dev/null)
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
while IFS= read -r commit; do
|
|
172
|
+
# Skip empty lines and release commits
|
|
173
|
+
[[ -z "$commit" ]] && continue
|
|
174
|
+
[[ "$commit" == chore\(release\):* ]] && continue
|
|
175
|
+
|
|
176
|
+
# Clean up commit message - remove type prefix for cleaner output
|
|
177
|
+
local clean_msg="$commit"
|
|
178
|
+
|
|
179
|
+
case "$commit" in
|
|
180
|
+
feat:*)
|
|
181
|
+
clean_msg="${commit#feat: }"
|
|
182
|
+
added="${added}- ${clean_msg}\n"
|
|
183
|
+
;;
|
|
184
|
+
feat\(*\):*)
|
|
185
|
+
clean_msg=$(echo "$commit" | sed 's/^feat([^)]*): //')
|
|
186
|
+
added="${added}- ${clean_msg}\n"
|
|
187
|
+
;;
|
|
188
|
+
fix:*)
|
|
189
|
+
clean_msg="${commit#fix: }"
|
|
190
|
+
fixed="${fixed}- ${clean_msg}\n"
|
|
191
|
+
;;
|
|
192
|
+
fix\(*\):*)
|
|
193
|
+
clean_msg=$(echo "$commit" | sed 's/^fix([^)]*): //')
|
|
194
|
+
fixed="${fixed}- ${clean_msg}\n"
|
|
195
|
+
;;
|
|
196
|
+
security:*)
|
|
197
|
+
clean_msg="${commit#security: }"
|
|
198
|
+
security="${security}- ${clean_msg}\n"
|
|
199
|
+
;;
|
|
200
|
+
docs:*)
|
|
201
|
+
clean_msg="${commit#docs: }"
|
|
202
|
+
changed="${changed}- Documentation: ${clean_msg}\n"
|
|
203
|
+
;;
|
|
204
|
+
refactor:*)
|
|
205
|
+
clean_msg="${commit#refactor: }"
|
|
206
|
+
changed="${changed}- Refactor: ${clean_msg}\n"
|
|
207
|
+
;;
|
|
208
|
+
perf:*)
|
|
209
|
+
clean_msg="${commit#perf: }"
|
|
210
|
+
changed="${changed}- Performance: ${clean_msg}\n"
|
|
211
|
+
;;
|
|
212
|
+
BREAKING\ CHANGE:*|breaking:*)
|
|
213
|
+
clean_msg="${commit#BREAKING CHANGE: }"
|
|
214
|
+
clean_msg="${clean_msg#breaking: }"
|
|
215
|
+
removed="${removed}- **BREAKING**: ${clean_msg}\n"
|
|
216
|
+
;;
|
|
217
|
+
deprecate:*|deprecated:*)
|
|
218
|
+
clean_msg="${commit#deprecate: }"
|
|
219
|
+
clean_msg="${clean_msg#deprecated: }"
|
|
220
|
+
deprecated="${deprecated}- ${clean_msg}\n"
|
|
221
|
+
;;
|
|
222
|
+
# Skip chore commits (noise in changelog)
|
|
223
|
+
chore:*|chore\(*) ;;
|
|
224
|
+
*) ;; # Ignore other commit types
|
|
225
|
+
esac
|
|
226
|
+
done <<< "$commits"
|
|
227
|
+
|
|
228
|
+
# Output in Keep a Changelog order
|
|
229
|
+
[[ -n "$added" ]] && printf "### Added\n\n%b\n" "$added"
|
|
230
|
+
[[ -n "$changed" ]] && printf "### Changed\n\n%b\n" "$changed"
|
|
231
|
+
[[ -n "$deprecated" ]] && printf "### Deprecated\n\n%b\n" "$deprecated"
|
|
232
|
+
[[ -n "$removed" ]] && printf "### Removed\n\n%b\n" "$removed"
|
|
233
|
+
[[ -n "$fixed" ]] && printf "### Fixed\n\n%b\n" "$fixed"
|
|
234
|
+
[[ -n "$security" ]] && printf "### Security\n\n%b\n" "$security"
|
|
235
|
+
|
|
236
|
+
return 0
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
# Function to update CHANGELOG.md with new version
|
|
240
|
+
update_changelog() {
|
|
241
|
+
local version="$1"
|
|
242
|
+
local changelog_file="$REPO_ROOT/CHANGELOG.md"
|
|
243
|
+
local today
|
|
244
|
+
today=$(date +%Y-%m-%d)
|
|
245
|
+
|
|
246
|
+
if [[ ! -f "$changelog_file" ]]; then
|
|
247
|
+
print_warning "CHANGELOG.md not found, creating new one"
|
|
248
|
+
cat > "$changelog_file" << 'EOF'
|
|
249
|
+
# Changelog
|
|
250
|
+
|
|
251
|
+
All notable changes to this project will be documented in this file.
|
|
252
|
+
|
|
253
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
254
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
255
|
+
|
|
256
|
+
## [Unreleased]
|
|
257
|
+
|
|
258
|
+
EOF
|
|
259
|
+
fi
|
|
260
|
+
|
|
261
|
+
# Check if [Unreleased] section exists
|
|
262
|
+
if ! grep -q "^\## \[Unreleased\]" "$changelog_file"; then
|
|
263
|
+
print_error "CHANGELOG.md missing [Unreleased] section"
|
|
264
|
+
return 1
|
|
265
|
+
fi
|
|
266
|
+
|
|
267
|
+
# Generate changelog content from commits
|
|
268
|
+
local changelog_content
|
|
269
|
+
changelog_content=$(generate_changelog_content)
|
|
270
|
+
|
|
271
|
+
if [[ -z "$changelog_content" ]]; then
|
|
272
|
+
print_warning "No conventional commits found for changelog generation"
|
|
273
|
+
changelog_content="### Changed
|
|
274
|
+
|
|
275
|
+
- Version bump and maintenance updates
|
|
276
|
+
"
|
|
277
|
+
fi
|
|
278
|
+
|
|
279
|
+
# Create temp files for the update
|
|
280
|
+
local temp_file content_file
|
|
281
|
+
temp_file=$(mktemp)
|
|
282
|
+
content_file=$(mktemp)
|
|
283
|
+
|
|
284
|
+
# Write the new version section to a temp file (avoids awk multiline issues)
|
|
285
|
+
cat > "$content_file" << EOF
|
|
286
|
+
## [$version] - $today
|
|
287
|
+
|
|
288
|
+
$changelog_content
|
|
289
|
+
EOF
|
|
290
|
+
|
|
291
|
+
# Process the changelog using sed instead of awk for reliability
|
|
292
|
+
# 1. Find the [Unreleased] line
|
|
293
|
+
# 2. Keep it, add blank line, then insert new version content
|
|
294
|
+
# 3. Skip any existing content under [Unreleased] until next ## section
|
|
295
|
+
|
|
296
|
+
local in_unreleased=0
|
|
297
|
+
local printed_new=0
|
|
298
|
+
|
|
299
|
+
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
300
|
+
if [[ "$line" == "## [Unreleased]"* ]]; then
|
|
301
|
+
echo "## [Unreleased]"
|
|
302
|
+
echo ""
|
|
303
|
+
cat "$content_file"
|
|
304
|
+
in_unreleased=1
|
|
305
|
+
printed_new=1
|
|
306
|
+
elif [[ "$line" == "## ["* ]] && [[ $in_unreleased -eq 1 ]]; then
|
|
307
|
+
# Next version section found, stop skipping
|
|
308
|
+
in_unreleased=0
|
|
309
|
+
echo "$line"
|
|
310
|
+
elif [[ $in_unreleased -eq 0 ]]; then
|
|
311
|
+
echo "$line"
|
|
312
|
+
fi
|
|
313
|
+
# Skip lines while in_unreleased=1 (old unreleased content)
|
|
314
|
+
done < "$changelog_file" > "$temp_file"
|
|
315
|
+
|
|
316
|
+
# Replace original file
|
|
317
|
+
mv "$temp_file" "$changelog_file"
|
|
318
|
+
rm -f "$content_file"
|
|
319
|
+
|
|
320
|
+
print_success "Updated CHANGELOG.md: [Unreleased] → [$version] - $today"
|
|
321
|
+
return 0
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
# Function to run preflight quality checks
|
|
325
|
+
run_preflight_checks() {
|
|
326
|
+
print_info "Running preflight quality checks..."
|
|
327
|
+
|
|
328
|
+
local preflight_script="$REPO_ROOT/.agent/scripts/linters-local.sh"
|
|
329
|
+
|
|
330
|
+
if [[ -f "$preflight_script" ]]; then
|
|
331
|
+
if bash "$preflight_script"; then
|
|
332
|
+
print_success "Preflight checks passed ✓"
|
|
333
|
+
return 0
|
|
334
|
+
else
|
|
335
|
+
print_error "Preflight checks failed"
|
|
336
|
+
return 1
|
|
337
|
+
fi
|
|
338
|
+
else
|
|
339
|
+
print_warning "Preflight script not found, skipping checks"
|
|
340
|
+
return 0
|
|
341
|
+
fi
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
# Function to validate version consistency across files
|
|
345
|
+
validate_version_consistency() {
|
|
346
|
+
local expected_version="$1"
|
|
347
|
+
local errors=0
|
|
348
|
+
|
|
349
|
+
print_info "Validating version consistency across files..."
|
|
350
|
+
|
|
351
|
+
# Check VERSION file
|
|
352
|
+
if [[ -f "$VERSION_FILE" ]]; then
|
|
353
|
+
local version_file_content
|
|
354
|
+
version_file_content=$(cat "$VERSION_FILE")
|
|
355
|
+
if [[ "$version_file_content" != "$expected_version" ]]; then
|
|
356
|
+
print_error "VERSION file contains '$version_file_content', expected '$expected_version'"
|
|
357
|
+
errors=$((errors + 1))
|
|
358
|
+
else
|
|
359
|
+
print_success "VERSION file: $expected_version ✓"
|
|
360
|
+
fi
|
|
361
|
+
else
|
|
362
|
+
print_error "VERSION file not found"
|
|
363
|
+
errors=$((errors + 1))
|
|
364
|
+
fi
|
|
365
|
+
|
|
366
|
+
# Check README badge
|
|
367
|
+
if [[ -f "$REPO_ROOT/README.md" ]]; then
|
|
368
|
+
if grep -q "Version-$expected_version-blue" "$REPO_ROOT/README.md"; then
|
|
369
|
+
print_success "README.md badge: $expected_version ✓"
|
|
370
|
+
else
|
|
371
|
+
print_error "README.md badge does not contain version $expected_version"
|
|
372
|
+
errors=$((errors + 1))
|
|
373
|
+
fi
|
|
374
|
+
else
|
|
375
|
+
print_warning "README.md not found"
|
|
376
|
+
fi
|
|
377
|
+
|
|
378
|
+
# Check sonar-project.properties
|
|
379
|
+
if [[ -f "$REPO_ROOT/sonar-project.properties" ]]; then
|
|
380
|
+
if grep -q "sonar.projectVersion=$expected_version" "$REPO_ROOT/sonar-project.properties"; then
|
|
381
|
+
print_success "sonar-project.properties: $expected_version ✓"
|
|
382
|
+
else
|
|
383
|
+
print_error "sonar-project.properties does not contain version $expected_version"
|
|
384
|
+
errors=$((errors + 1))
|
|
385
|
+
fi
|
|
386
|
+
fi
|
|
387
|
+
|
|
388
|
+
# Check setup.sh
|
|
389
|
+
if [[ -f "$REPO_ROOT/setup.sh" ]]; then
|
|
390
|
+
if grep -q "# Version: $expected_version" "$REPO_ROOT/setup.sh"; then
|
|
391
|
+
print_success "setup.sh: $expected_version ✓"
|
|
392
|
+
else
|
|
393
|
+
print_error "setup.sh does not contain version $expected_version"
|
|
394
|
+
errors=$((errors + 1))
|
|
395
|
+
fi
|
|
396
|
+
fi
|
|
397
|
+
|
|
398
|
+
# Check Claude Code plugin marketplace.json
|
|
399
|
+
if [[ -f "$REPO_ROOT/.claude-plugin/marketplace.json" ]]; then
|
|
400
|
+
if grep -q "\"version\": \"$expected_version\"" "$REPO_ROOT/.claude-plugin/marketplace.json"; then
|
|
401
|
+
print_success ".claude-plugin/marketplace.json: $expected_version ✓"
|
|
402
|
+
else
|
|
403
|
+
print_error ".claude-plugin/marketplace.json does not contain version $expected_version"
|
|
404
|
+
errors=$((errors + 1))
|
|
405
|
+
fi
|
|
406
|
+
fi
|
|
407
|
+
|
|
408
|
+
if [[ $errors -eq 0 ]]; then
|
|
409
|
+
print_success "All version references are consistent: $expected_version"
|
|
410
|
+
return 0
|
|
411
|
+
else
|
|
412
|
+
print_error "Found $errors version inconsistencies"
|
|
413
|
+
return 1
|
|
414
|
+
fi
|
|
415
|
+
return 0
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
# Function to update version in files
|
|
419
|
+
update_version_in_files() {
|
|
420
|
+
local new_version="$1"
|
|
421
|
+
|
|
422
|
+
print_info "Updating version references in files..."
|
|
423
|
+
|
|
424
|
+
# Update VERSION file
|
|
425
|
+
if [[ -f "$VERSION_FILE" ]]; then
|
|
426
|
+
echo "$new_version" > "$VERSION_FILE"
|
|
427
|
+
print_success "Updated VERSION file"
|
|
428
|
+
fi
|
|
429
|
+
|
|
430
|
+
# Update package.json if it exists
|
|
431
|
+
if [[ -f "$REPO_ROOT/package.json" ]]; then
|
|
432
|
+
sed -i '' "s/\"version\": \"[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\"/\"version\": \"$new_version\"/" "$REPO_ROOT/package.json"
|
|
433
|
+
print_success "Updated package.json"
|
|
434
|
+
fi
|
|
435
|
+
|
|
436
|
+
# Update sonar-project.properties
|
|
437
|
+
if [[ -f "$REPO_ROOT/sonar-project.properties" ]]; then
|
|
438
|
+
sed -i '' "s/sonar\.projectVersion=.*/sonar.projectVersion=$new_version/" "$REPO_ROOT/sonar-project.properties"
|
|
439
|
+
print_success "Updated sonar-project.properties"
|
|
440
|
+
fi
|
|
441
|
+
|
|
442
|
+
# Update setup.sh if it exists
|
|
443
|
+
if [[ -f "$REPO_ROOT/setup.sh" ]]; then
|
|
444
|
+
sed -i '' "s/# Version: .*/# Version: $new_version/" "$REPO_ROOT/setup.sh"
|
|
445
|
+
print_success "Updated setup.sh"
|
|
446
|
+
fi
|
|
447
|
+
|
|
448
|
+
# Update README version badge
|
|
449
|
+
if [[ -f "$REPO_ROOT/README.md" ]]; then
|
|
450
|
+
# Use more robust regex pattern for version numbers (handles single and multi-digit)
|
|
451
|
+
# macOS sed requires different syntax for extended regex
|
|
452
|
+
sed -i '' "s/Version-[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*-blue/Version-$new_version-blue/" "$REPO_ROOT/README.md"
|
|
453
|
+
|
|
454
|
+
# Validate the update was successful
|
|
455
|
+
if grep -q "Version-$new_version-blue" "$REPO_ROOT/README.md"; then
|
|
456
|
+
print_success "Updated README.md version badge to $new_version"
|
|
457
|
+
else
|
|
458
|
+
print_error "Failed to update README.md version badge"
|
|
459
|
+
print_info "Please manually update the version badge in README.md"
|
|
460
|
+
return 1
|
|
461
|
+
fi
|
|
462
|
+
else
|
|
463
|
+
print_warning "README.md not found, skipping version badge update"
|
|
464
|
+
fi
|
|
465
|
+
|
|
466
|
+
# Update Claude Code plugin marketplace.json
|
|
467
|
+
if [[ -f "$REPO_ROOT/.claude-plugin/marketplace.json" ]]; then
|
|
468
|
+
sed -i '' "s/\"version\": \"[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\"/\"version\": \"$new_version\"/" "$REPO_ROOT/.claude-plugin/marketplace.json"
|
|
469
|
+
print_success "Updated .claude-plugin/marketplace.json"
|
|
470
|
+
fi
|
|
471
|
+
return 0
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
# Function to check for uncommitted changes
|
|
475
|
+
check_working_tree_clean() {
|
|
476
|
+
local uncommitted
|
|
477
|
+
uncommitted=$(git status --porcelain 2>/dev/null)
|
|
478
|
+
|
|
479
|
+
if [[ -n "$uncommitted" ]]; then
|
|
480
|
+
print_error "Working tree has uncommitted changes:"
|
|
481
|
+
echo "$uncommitted" | head -20
|
|
482
|
+
echo ""
|
|
483
|
+
print_info "Options:"
|
|
484
|
+
print_info " 1. Commit your changes first: git add -A && git commit -m 'your message'"
|
|
485
|
+
print_info " 2. Stash changes: git stash"
|
|
486
|
+
print_info " 3. Use --allow-dirty to release anyway (not recommended)"
|
|
487
|
+
return 1
|
|
488
|
+
fi
|
|
489
|
+
return 0
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
# Function to commit version changes
|
|
493
|
+
commit_version_changes() {
|
|
494
|
+
local version="$1"
|
|
495
|
+
|
|
496
|
+
cd "$REPO_ROOT" || exit 1
|
|
497
|
+
|
|
498
|
+
print_info "Committing version changes..."
|
|
499
|
+
|
|
500
|
+
# Stage all version-related files (including CHANGELOG.md and Claude plugin)
|
|
501
|
+
git add VERSION package.json README.md setup.sh sonar-project.properties CHANGELOG.md .claude-plugin/marketplace.json 2>/dev/null
|
|
502
|
+
|
|
503
|
+
# Check if there are changes to commit
|
|
504
|
+
if git diff --cached --quiet; then
|
|
505
|
+
print_info "No version changes to commit"
|
|
506
|
+
return 0
|
|
507
|
+
fi
|
|
508
|
+
|
|
509
|
+
if git commit -m "chore(release): bump version to $version"; then
|
|
510
|
+
print_success "Committed version changes"
|
|
511
|
+
return 0
|
|
512
|
+
else
|
|
513
|
+
print_error "Failed to commit version changes"
|
|
514
|
+
return 1
|
|
515
|
+
fi
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
# Function to push changes and tags
|
|
519
|
+
push_changes() {
|
|
520
|
+
cd "$REPO_ROOT" || exit 1
|
|
521
|
+
|
|
522
|
+
print_info "Pushing changes to remote..."
|
|
523
|
+
|
|
524
|
+
if git push origin main --tags; then
|
|
525
|
+
print_success "Pushed changes and tags to remote"
|
|
526
|
+
return 0
|
|
527
|
+
else
|
|
528
|
+
print_error "Failed to push to remote"
|
|
529
|
+
return 1
|
|
530
|
+
fi
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
# Function to create git tag
|
|
534
|
+
create_git_tag() {
|
|
535
|
+
local version="$1"
|
|
536
|
+
local tag_name="v$version"
|
|
537
|
+
|
|
538
|
+
print_info "Creating git tag: $tag_name"
|
|
539
|
+
|
|
540
|
+
cd "$REPO_ROOT" || exit 1
|
|
541
|
+
|
|
542
|
+
if git tag -a "$tag_name" -m "Release $tag_name - AI DevOps Framework"; then
|
|
543
|
+
print_success "Created git tag: $tag_name"
|
|
544
|
+
return 0
|
|
545
|
+
else
|
|
546
|
+
print_error "Failed to create git tag"
|
|
547
|
+
return 1
|
|
548
|
+
fi
|
|
549
|
+
return 0
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
# Function to create GitHub release
|
|
553
|
+
create_github_release() {
|
|
554
|
+
local version="$1"
|
|
555
|
+
local tag_name="v$version"
|
|
556
|
+
|
|
557
|
+
print_info "Creating GitHub release: $tag_name"
|
|
558
|
+
|
|
559
|
+
# Try GitHub CLI first
|
|
560
|
+
if command -v gh &> /dev/null && gh auth status &> /dev/null; then
|
|
561
|
+
print_info "Using GitHub CLI for release creation"
|
|
562
|
+
|
|
563
|
+
# Generate release notes based on version
|
|
564
|
+
local release_notes
|
|
565
|
+
release_notes=$(generate_release_notes "$version")
|
|
566
|
+
|
|
567
|
+
# Create GitHub release
|
|
568
|
+
if gh release create "$tag_name" \
|
|
569
|
+
--title "$tag_name - AI DevOps Framework" \
|
|
570
|
+
--notes "$release_notes" \
|
|
571
|
+
--latest; then
|
|
572
|
+
print_success "Created GitHub release: $tag_name"
|
|
573
|
+
return 0
|
|
574
|
+
else
|
|
575
|
+
print_error "Failed to create GitHub release with GitHub CLI"
|
|
576
|
+
return 1
|
|
577
|
+
fi
|
|
578
|
+
else
|
|
579
|
+
# GitHub CLI not available
|
|
580
|
+
print_warning "GitHub release creation skipped - GitHub CLI not available"
|
|
581
|
+
print_info "To enable GitHub releases:"
|
|
582
|
+
print_info "1. Install GitHub CLI: brew install gh (macOS)"
|
|
583
|
+
print_info "2. Authenticate: gh auth login"
|
|
584
|
+
return 0
|
|
585
|
+
fi
|
|
586
|
+
return 0
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
# Function to generate release notes
|
|
590
|
+
generate_release_notes() {
|
|
591
|
+
local version="$1"
|
|
592
|
+
# Parse version components (reserved for version-specific logic)
|
|
593
|
+
# shellcheck disable=SC2034
|
|
594
|
+
local major minor patch
|
|
595
|
+
IFS='.' read -r major minor patch <<< "$version"
|
|
596
|
+
|
|
597
|
+
cat << EOF
|
|
598
|
+
## AI DevOps Framework v$version
|
|
599
|
+
|
|
600
|
+
### Installation
|
|
601
|
+
|
|
602
|
+
\`\`\`bash
|
|
603
|
+
# npm (recommended)
|
|
604
|
+
npm install -g aidevops
|
|
605
|
+
|
|
606
|
+
# Homebrew
|
|
607
|
+
brew install marcusquinn/tap/aidevops
|
|
608
|
+
|
|
609
|
+
# curl
|
|
610
|
+
bash <(curl -fsSL https://aidevops.sh)
|
|
611
|
+
\`\`\`
|
|
612
|
+
|
|
613
|
+
### What's New
|
|
614
|
+
|
|
615
|
+
See [CHANGELOG.md](CHANGELOG.md) for detailed changes.
|
|
616
|
+
|
|
617
|
+
### Quick Start
|
|
618
|
+
|
|
619
|
+
\`\`\`bash
|
|
620
|
+
# Check installation
|
|
621
|
+
aidevops status
|
|
622
|
+
|
|
623
|
+
# Initialize in a project
|
|
624
|
+
aidevops init
|
|
625
|
+
|
|
626
|
+
# Update framework + projects
|
|
627
|
+
aidevops update
|
|
628
|
+
|
|
629
|
+
# List registered projects
|
|
630
|
+
aidevops repos
|
|
631
|
+
\`\`\`
|
|
632
|
+
|
|
633
|
+
### Documentation
|
|
634
|
+
|
|
635
|
+
- **[Setup Guide](README.md)**: Complete framework setup
|
|
636
|
+
- **[User Guide](.agent/AGENTS.md)**: AI assistant integration
|
|
637
|
+
- **[API Integrations](.agent/aidevops/api-integrations.md)**: Service APIs
|
|
638
|
+
|
|
639
|
+
### Links
|
|
640
|
+
|
|
641
|
+
- **Website**: https://aidevops.sh
|
|
642
|
+
- **Repository**: https://github.com/marcusquinn/aidevops
|
|
643
|
+
- **Issues**: https://github.com/marcusquinn/aidevops/issues
|
|
644
|
+
|
|
645
|
+
---
|
|
646
|
+
|
|
647
|
+
**Full Changelog**: https://github.com/marcusquinn/aidevops/compare/v1.0.0...v$version
|
|
648
|
+
EOF
|
|
649
|
+
return 0
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
# Main function
|
|
653
|
+
main() {
|
|
654
|
+
local action="$1"
|
|
655
|
+
local bump_type="$2"
|
|
656
|
+
|
|
657
|
+
case "$action" in
|
|
658
|
+
"get")
|
|
659
|
+
get_current_version
|
|
660
|
+
;;
|
|
661
|
+
"bump")
|
|
662
|
+
if [[ -z "$bump_type" ]]; then
|
|
663
|
+
print_error "Bump type required. Usage: $0 bump [major|minor|patch]"
|
|
664
|
+
exit 1
|
|
665
|
+
fi
|
|
666
|
+
|
|
667
|
+
local current_version
|
|
668
|
+
current_version=$(get_current_version)
|
|
669
|
+
print_info "Current version: $current_version"
|
|
670
|
+
|
|
671
|
+
local new_version
|
|
672
|
+
new_version=$(bump_version "$bump_type")
|
|
673
|
+
|
|
674
|
+
if [[ $? -eq 0 ]]; then
|
|
675
|
+
print_success "Bumped version: $current_version → $new_version"
|
|
676
|
+
update_version_in_files "$new_version"
|
|
677
|
+
echo "$new_version"
|
|
678
|
+
else
|
|
679
|
+
exit 1
|
|
680
|
+
fi
|
|
681
|
+
;;
|
|
682
|
+
"tag")
|
|
683
|
+
local version
|
|
684
|
+
version=$(get_current_version)
|
|
685
|
+
create_git_tag "$version"
|
|
686
|
+
;;
|
|
687
|
+
"release")
|
|
688
|
+
if [[ -z "$bump_type" ]]; then
|
|
689
|
+
print_error "Bump type required. Usage: $0 release [major|minor|patch]"
|
|
690
|
+
exit 1
|
|
691
|
+
fi
|
|
692
|
+
|
|
693
|
+
# Parse flags (can be in any order after bump_type)
|
|
694
|
+
local force_flag=""
|
|
695
|
+
local skip_preflight=""
|
|
696
|
+
local allow_dirty=""
|
|
697
|
+
for arg in "${@:3}"; do
|
|
698
|
+
case "$arg" in
|
|
699
|
+
"--force") force_flag="--force" ;;
|
|
700
|
+
"--skip-preflight") skip_preflight="--skip-preflight" ;;
|
|
701
|
+
"--allow-dirty") allow_dirty="--allow-dirty" ;;
|
|
702
|
+
*) ;; # Ignore unknown flags
|
|
703
|
+
esac
|
|
704
|
+
done
|
|
705
|
+
|
|
706
|
+
print_info "Creating release with $bump_type version bump..."
|
|
707
|
+
|
|
708
|
+
# Check for uncommitted changes
|
|
709
|
+
if [[ "$allow_dirty" != "--allow-dirty" ]]; then
|
|
710
|
+
if ! check_working_tree_clean; then
|
|
711
|
+
print_error "Cannot release with uncommitted changes."
|
|
712
|
+
print_info "Commit your changes first, or use --allow-dirty to bypass (not recommended)"
|
|
713
|
+
exit 1
|
|
714
|
+
fi
|
|
715
|
+
else
|
|
716
|
+
print_warning "Releasing with uncommitted changes (--allow-dirty)"
|
|
717
|
+
fi
|
|
718
|
+
|
|
719
|
+
# Run preflight checks unless skipped
|
|
720
|
+
if [[ "$skip_preflight" != "--skip-preflight" ]]; then
|
|
721
|
+
if ! run_preflight_checks; then
|
|
722
|
+
print_error "Preflight checks failed. Fix issues or use --skip-preflight to bypass."
|
|
723
|
+
exit 1
|
|
724
|
+
fi
|
|
725
|
+
else
|
|
726
|
+
print_warning "Skipping preflight checks with --skip-preflight"
|
|
727
|
+
fi
|
|
728
|
+
|
|
729
|
+
# Check changelog has content before proceeding
|
|
730
|
+
if ! check_changelog_unreleased; then
|
|
731
|
+
if [[ "$force_flag" != "--force" ]]; then
|
|
732
|
+
print_error "CHANGELOG.md [Unreleased] section is empty or missing"
|
|
733
|
+
print_info "Add changelog entries or use --force to bypass"
|
|
734
|
+
print_info "Run: $0 changelog-preview to see suggested entries"
|
|
735
|
+
exit 1
|
|
736
|
+
else
|
|
737
|
+
print_warning "Bypassing changelog check with --force"
|
|
738
|
+
fi
|
|
739
|
+
fi
|
|
740
|
+
|
|
741
|
+
local new_version
|
|
742
|
+
new_version=$(bump_version "$bump_type")
|
|
743
|
+
|
|
744
|
+
if [[ $? -eq 0 ]]; then
|
|
745
|
+
print_info "Updating version references in files..."
|
|
746
|
+
update_version_in_files "$new_version"
|
|
747
|
+
|
|
748
|
+
print_info "Updating CHANGELOG.md..."
|
|
749
|
+
if ! update_changelog "$new_version"; then
|
|
750
|
+
print_warning "Failed to update CHANGELOG.md automatically"
|
|
751
|
+
fi
|
|
752
|
+
|
|
753
|
+
print_info "Validating version consistency..."
|
|
754
|
+
if validate_version_consistency "$new_version"; then
|
|
755
|
+
print_success "Version validation passed"
|
|
756
|
+
commit_version_changes "$new_version"
|
|
757
|
+
create_git_tag "$new_version"
|
|
758
|
+
push_changes
|
|
759
|
+
create_github_release "$new_version"
|
|
760
|
+
print_success "Release $new_version created successfully!"
|
|
761
|
+
else
|
|
762
|
+
print_error "Version validation failed. Please fix inconsistencies before creating release."
|
|
763
|
+
exit 1
|
|
764
|
+
fi
|
|
765
|
+
else
|
|
766
|
+
exit 1
|
|
767
|
+
fi
|
|
768
|
+
;;
|
|
769
|
+
"github-release")
|
|
770
|
+
local version
|
|
771
|
+
version=$(get_current_version)
|
|
772
|
+
create_github_release "$version"
|
|
773
|
+
;;
|
|
774
|
+
"validate")
|
|
775
|
+
local version
|
|
776
|
+
version=$(get_current_version)
|
|
777
|
+
validate_version_consistency "$version"
|
|
778
|
+
;;
|
|
779
|
+
"changelog-check")
|
|
780
|
+
local version
|
|
781
|
+
version=$(get_current_version)
|
|
782
|
+
print_info "Checking CHANGELOG.md for version $version..."
|
|
783
|
+
if check_changelog_version "$version"; then
|
|
784
|
+
print_success "CHANGELOG.md is in sync with VERSION"
|
|
785
|
+
else
|
|
786
|
+
print_error "CHANGELOG.md is out of sync with VERSION ($version)"
|
|
787
|
+
print_info "Run: $0 changelog-preview to see suggested entries"
|
|
788
|
+
exit 1
|
|
789
|
+
fi
|
|
790
|
+
;;
|
|
791
|
+
"changelog-preview")
|
|
792
|
+
print_info "Generating changelog preview from commits..."
|
|
793
|
+
echo ""
|
|
794
|
+
generate_changelog_preview
|
|
795
|
+
;;
|
|
796
|
+
*)
|
|
797
|
+
echo "AI DevOps Framework Version Manager"
|
|
798
|
+
echo ""
|
|
799
|
+
echo "Usage: $0 [action] [options]"
|
|
800
|
+
echo ""
|
|
801
|
+
echo "Actions:"
|
|
802
|
+
echo " get Get current version"
|
|
803
|
+
echo " bump [major|minor|patch] Bump version"
|
|
804
|
+
echo " tag Create git tag for current version"
|
|
805
|
+
echo " github-release Create GitHub release for current version"
|
|
806
|
+
echo " release [major|minor|patch] Bump version, update files, create tag and GitHub release"
|
|
807
|
+
echo " validate Validate version consistency across all files"
|
|
808
|
+
echo " changelog-check Check CHANGELOG.md has entry for current version"
|
|
809
|
+
echo " changelog-preview Generate changelog entry from commits since last tag"
|
|
810
|
+
echo ""
|
|
811
|
+
echo "Options:"
|
|
812
|
+
echo " --force Bypass changelog check (use with release)"
|
|
813
|
+
echo " --skip-preflight Bypass quality checks (use with release)"
|
|
814
|
+
echo ""
|
|
815
|
+
echo "Examples:"
|
|
816
|
+
echo " $0 get"
|
|
817
|
+
echo " $0 bump minor"
|
|
818
|
+
echo " $0 release patch"
|
|
819
|
+
echo " $0 release minor --force"
|
|
820
|
+
echo " $0 release patch --skip-preflight"
|
|
821
|
+
echo " $0 release patch --force --skip-preflight"
|
|
822
|
+
echo " $0 github-release"
|
|
823
|
+
echo " $0 validate"
|
|
824
|
+
echo " $0 changelog-check"
|
|
825
|
+
echo " $0 changelog-preview"
|
|
826
|
+
;;
|
|
827
|
+
esac
|
|
828
|
+
return 0
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
main "$@"
|