aidevops 2.52.1 → 2.53.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/README.md +1 -1
- package/VERSION +1 -1
- package/aidevops.sh +15 -9
- package/package.json +4 -4
- package/scripts/npm-postinstall.js +6 -7
- package/setup.sh +1 -1
- package/templates/deploy-templates.sh +144 -0
- package/templates/home/.agent/README.md +33 -0
- package/templates/home/AGENTS.md +96 -0
- package/templates/home/git/.agent/README.md +48 -0
- package/templates/home/git/AGENTS.md +97 -0
- package/templates/standard-functions.sh +179 -0
- package/templates/wordpress-performance-workflow.md +217 -0
- package/.agent/AGENTS.md +0 -614
- package/.agent/accounts.md +0 -65
- package/.agent/aidevops/add-new-mcp-to-aidevops.md +0 -456
- package/.agent/aidevops/api-integrations.md +0 -335
- package/.agent/aidevops/architecture.md +0 -510
- package/.agent/aidevops/configs.md +0 -274
- package/.agent/aidevops/docs.md +0 -244
- package/.agent/aidevops/extension.md +0 -311
- package/.agent/aidevops/mcp-integrations.md +0 -340
- package/.agent/aidevops/mcp-troubleshooting.md +0 -162
- package/.agent/aidevops/memory-patterns.md +0 -172
- package/.agent/aidevops/providers.md +0 -217
- package/.agent/aidevops/recommendations.md +0 -321
- package/.agent/aidevops/requirements.md +0 -301
- package/.agent/aidevops/resources.md +0 -214
- package/.agent/aidevops/security-requirements.md +0 -174
- package/.agent/aidevops/security.md +0 -350
- package/.agent/aidevops/service-links.md +0 -400
- package/.agent/aidevops/services.md +0 -357
- package/.agent/aidevops/setup.md +0 -153
- package/.agent/aidevops/troubleshooting.md +0 -389
- package/.agent/aidevops.md +0 -124
- package/.agent/build-plus.md +0 -244
- package/.agent/content/guidelines.md +0 -109
- package/.agent/content.md +0 -87
- package/.agent/health.md +0 -59
- package/.agent/legal.md +0 -59
- package/.agent/loop-state/full-loop.local.md +0 -16
- package/.agent/loop-state/ralph-loop.local.md +0 -10
- package/.agent/marketing.md +0 -440
- package/.agent/memory/README.md +0 -260
- package/.agent/onboarding.md +0 -796
- package/.agent/plan-plus.md +0 -245
- package/.agent/research.md +0 -100
- package/.agent/sales.md +0 -333
- package/.agent/scripts/101domains-helper.sh +0 -701
- package/.agent/scripts/add-missing-returns.sh +0 -140
- package/.agent/scripts/agent-browser-helper.sh +0 -311
- package/.agent/scripts/agno-setup.sh +0 -712
- package/.agent/scripts/ahrefs-mcp-wrapper.js +0 -168
- package/.agent/scripts/aidevops-update-check.sh +0 -71
- package/.agent/scripts/ampcode-cli.sh +0 -522
- package/.agent/scripts/auto-version-bump.sh +0 -156
- package/.agent/scripts/autogen-helper.sh +0 -512
- package/.agent/scripts/beads-sync-helper.sh +0 -596
- package/.agent/scripts/closte-helper.sh +0 -5
- package/.agent/scripts/cloudron-helper.sh +0 -321
- package/.agent/scripts/codacy-cli-chunked.sh +0 -581
- package/.agent/scripts/codacy-cli.sh +0 -442
- package/.agent/scripts/code-audit-helper.sh +0 -5
- package/.agent/scripts/coderabbit-cli.sh +0 -417
- package/.agent/scripts/coderabbit-pro-analysis.sh +0 -238
- package/.agent/scripts/commands/code-simplifier.md +0 -86
- package/.agent/scripts/commands/full-loop.md +0 -246
- package/.agent/scripts/commands/postflight-loop.md +0 -103
- package/.agent/scripts/commands/recall.md +0 -182
- package/.agent/scripts/commands/remember.md +0 -132
- package/.agent/scripts/commands/save-todo.md +0 -175
- package/.agent/scripts/commands/session-review.md +0 -154
- package/.agent/scripts/comprehensive-quality-fix.sh +0 -106
- package/.agent/scripts/context-builder-helper.sh +0 -522
- package/.agent/scripts/coolify-cli-helper.sh +0 -674
- package/.agent/scripts/coolify-helper.sh +0 -380
- package/.agent/scripts/crawl4ai-examples.sh +0 -401
- package/.agent/scripts/crawl4ai-helper.sh +0 -1078
- package/.agent/scripts/crewai-helper.sh +0 -681
- package/.agent/scripts/dev-browser-helper.sh +0 -513
- package/.agent/scripts/dns-helper.sh +0 -396
- package/.agent/scripts/domain-research-helper.sh +0 -917
- package/.agent/scripts/dspy-helper.sh +0 -285
- package/.agent/scripts/dspyground-helper.sh +0 -291
- package/.agent/scripts/eeat-score-helper.sh +0 -1242
- package/.agent/scripts/efficient-return-fix.sh +0 -92
- package/.agent/scripts/extract-opencode-prompts.sh +0 -128
- package/.agent/scripts/find-missing-returns.sh +0 -113
- package/.agent/scripts/fix-auth-headers.sh +0 -104
- package/.agent/scripts/fix-common-strings.sh +0 -254
- package/.agent/scripts/fix-content-type.sh +0 -100
- package/.agent/scripts/fix-error-messages.sh +0 -130
- package/.agent/scripts/fix-misplaced-returns.sh +0 -74
- package/.agent/scripts/fix-remaining-literals.sh +0 -152
- package/.agent/scripts/fix-return-statements.sh +0 -41
- package/.agent/scripts/fix-s131-default-cases.sh +0 -249
- package/.agent/scripts/fix-sc2155-simple.sh +0 -102
- package/.agent/scripts/fix-shellcheck-critical.sh +0 -187
- package/.agent/scripts/fix-string-literals.sh +0 -273
- package/.agent/scripts/full-loop-helper.sh +0 -773
- package/.agent/scripts/generate-opencode-agents.sh +0 -497
- package/.agent/scripts/generate-opencode-commands.sh +0 -1629
- package/.agent/scripts/generate-skills.sh +0 -366
- package/.agent/scripts/git-platforms-helper.sh +0 -640
- package/.agent/scripts/gitea-cli-helper.sh +0 -743
- package/.agent/scripts/github-cli-helper.sh +0 -702
- package/.agent/scripts/gitlab-cli-helper.sh +0 -682
- package/.agent/scripts/gsc-add-user-helper.sh +0 -325
- package/.agent/scripts/gsc-sitemap-helper.sh +0 -678
- package/.agent/scripts/hetzner-helper.sh +0 -485
- package/.agent/scripts/hostinger-helper.sh +0 -229
- package/.agent/scripts/keyword-research-helper.sh +0 -1815
- package/.agent/scripts/langflow-helper.sh +0 -544
- package/.agent/scripts/linkedin-automation.py +0 -241
- package/.agent/scripts/linter-manager.sh +0 -599
- package/.agent/scripts/linters-local.sh +0 -434
- package/.agent/scripts/list-keys-helper.sh +0 -488
- package/.agent/scripts/local-browser-automation.py +0 -339
- package/.agent/scripts/localhost-helper.sh +0 -744
- package/.agent/scripts/loop-common.sh +0 -806
- package/.agent/scripts/mainwp-helper.sh +0 -728
- package/.agent/scripts/markdown-formatter.sh +0 -338
- package/.agent/scripts/markdown-lint-fix.sh +0 -311
- package/.agent/scripts/mass-fix-returns.sh +0 -58
- package/.agent/scripts/mcp-diagnose.sh +0 -167
- package/.agent/scripts/mcp-inspector-helper.sh +0 -449
- package/.agent/scripts/memory-helper.sh +0 -650
- package/.agent/scripts/monitor-code-review.sh +0 -255
- package/.agent/scripts/onboarding-helper.sh +0 -706
- package/.agent/scripts/opencode-github-setup-helper.sh +0 -797
- package/.agent/scripts/opencode-test-helper.sh +0 -213
- package/.agent/scripts/pagespeed-helper.sh +0 -464
- package/.agent/scripts/pandoc-helper.sh +0 -362
- package/.agent/scripts/postflight-check.sh +0 -555
- package/.agent/scripts/pre-commit-hook.sh +0 -259
- package/.agent/scripts/pre-edit-check.sh +0 -169
- package/.agent/scripts/qlty-cli.sh +0 -356
- package/.agent/scripts/quality-cli-manager.sh +0 -525
- package/.agent/scripts/quality-feedback-helper.sh +0 -462
- package/.agent/scripts/quality-fix.sh +0 -263
- package/.agent/scripts/quality-loop-helper.sh +0 -1108
- package/.agent/scripts/ralph-loop-helper.sh +0 -836
- package/.agent/scripts/ralph-upstream-check.sh +0 -341
- package/.agent/scripts/secretlint-helper.sh +0 -847
- package/.agent/scripts/servers-helper.sh +0 -241
- package/.agent/scripts/ses-helper.sh +0 -619
- package/.agent/scripts/session-review-helper.sh +0 -404
- package/.agent/scripts/setup-linters-wizard.sh +0 -379
- package/.agent/scripts/setup-local-api-keys.sh +0 -330
- package/.agent/scripts/setup-mcp-integrations.sh +0 -472
- package/.agent/scripts/shared-constants.sh +0 -246
- package/.agent/scripts/site-crawler-helper.sh +0 -1487
- package/.agent/scripts/snyk-helper.sh +0 -940
- package/.agent/scripts/sonarcloud-autofix.sh +0 -193
- package/.agent/scripts/sonarcloud-cli.sh +0 -191
- package/.agent/scripts/sonarscanner-cli.sh +0 -455
- package/.agent/scripts/spaceship-helper.sh +0 -747
- package/.agent/scripts/stagehand-helper.sh +0 -321
- package/.agent/scripts/stagehand-python-helper.sh +0 -321
- package/.agent/scripts/stagehand-python-setup.sh +0 -441
- package/.agent/scripts/stagehand-setup.sh +0 -439
- package/.agent/scripts/system-cleanup.sh +0 -340
- package/.agent/scripts/terminal-title-helper.sh +0 -388
- package/.agent/scripts/terminal-title-setup.sh +0 -549
- package/.agent/scripts/test-stagehand-both-integration.sh +0 -317
- package/.agent/scripts/test-stagehand-integration.sh +0 -309
- package/.agent/scripts/test-stagehand-python-integration.sh +0 -341
- package/.agent/scripts/todo-ready.sh +0 -263
- package/.agent/scripts/tool-version-check.sh +0 -362
- package/.agent/scripts/toon-helper.sh +0 -469
- package/.agent/scripts/twilio-helper.sh +0 -917
- package/.agent/scripts/updown-helper.sh +0 -279
- package/.agent/scripts/validate-mcp-integrations.sh +0 -250
- package/.agent/scripts/validate-version-consistency.sh +0 -131
- package/.agent/scripts/vaultwarden-helper.sh +0 -597
- package/.agent/scripts/vercel-cli-helper.sh +0 -816
- package/.agent/scripts/verify-mirrors.sh +0 -169
- package/.agent/scripts/version-manager.sh +0 -831
- package/.agent/scripts/webhosting-helper.sh +0 -471
- package/.agent/scripts/webhosting-verify.sh +0 -238
- package/.agent/scripts/wordpress-mcp-helper.sh +0 -508
- package/.agent/scripts/worktree-helper.sh +0 -595
- package/.agent/scripts/worktree-sessions.sh +0 -577
- package/.agent/seo/dataforseo.md +0 -215
- package/.agent/seo/domain-research.md +0 -532
- package/.agent/seo/eeat-score.md +0 -659
- package/.agent/seo/google-search-console.md +0 -366
- package/.agent/seo/gsc-sitemaps.md +0 -282
- package/.agent/seo/keyword-research.md +0 -521
- package/.agent/seo/serper.md +0 -278
- package/.agent/seo/site-crawler.md +0 -387
- package/.agent/seo.md +0 -236
- package/.agent/services/accounting/quickfile.md +0 -159
- package/.agent/services/communications/telfon.md +0 -470
- package/.agent/services/communications/twilio.md +0 -569
- package/.agent/services/crm/fluentcrm.md +0 -449
- package/.agent/services/email/ses.md +0 -399
- package/.agent/services/hosting/101domains.md +0 -378
- package/.agent/services/hosting/closte.md +0 -177
- package/.agent/services/hosting/cloudflare.md +0 -251
- package/.agent/services/hosting/cloudron.md +0 -478
- package/.agent/services/hosting/dns-providers.md +0 -335
- package/.agent/services/hosting/domain-purchasing.md +0 -344
- package/.agent/services/hosting/hetzner.md +0 -327
- package/.agent/services/hosting/hostinger.md +0 -287
- package/.agent/services/hosting/localhost.md +0 -419
- package/.agent/services/hosting/spaceship.md +0 -353
- package/.agent/services/hosting/webhosting.md +0 -330
- package/.agent/social-media.md +0 -69
- package/.agent/templates/plans-template.md +0 -114
- package/.agent/templates/prd-template.md +0 -129
- package/.agent/templates/tasks-template.md +0 -108
- package/.agent/templates/todo-template.md +0 -89
- package/.agent/tools/ai-assistants/agno.md +0 -471
- package/.agent/tools/ai-assistants/capsolver.md +0 -326
- package/.agent/tools/ai-assistants/configuration.md +0 -221
- package/.agent/tools/ai-assistants/overview.md +0 -209
- package/.agent/tools/ai-assistants/status.md +0 -171
- package/.agent/tools/ai-assistants/windsurf.md +0 -193
- package/.agent/tools/ai-orchestration/autogen.md +0 -406
- package/.agent/tools/ai-orchestration/crewai.md +0 -445
- package/.agent/tools/ai-orchestration/langflow.md +0 -405
- package/.agent/tools/ai-orchestration/openprose.md +0 -487
- package/.agent/tools/ai-orchestration/overview.md +0 -362
- package/.agent/tools/ai-orchestration/packaging.md +0 -647
- package/.agent/tools/browser/agent-browser.md +0 -464
- package/.agent/tools/browser/browser-automation.md +0 -400
- package/.agent/tools/browser/chrome-devtools.md +0 -282
- package/.agent/tools/browser/crawl4ai-integration.md +0 -422
- package/.agent/tools/browser/crawl4ai-resources.md +0 -277
- package/.agent/tools/browser/crawl4ai-usage.md +0 -416
- package/.agent/tools/browser/crawl4ai.md +0 -585
- package/.agent/tools/browser/dev-browser.md +0 -341
- package/.agent/tools/browser/pagespeed.md +0 -260
- package/.agent/tools/browser/playwright.md +0 -266
- package/.agent/tools/browser/playwriter.md +0 -310
- package/.agent/tools/browser/stagehand-examples.md +0 -456
- package/.agent/tools/browser/stagehand-python.md +0 -483
- package/.agent/tools/browser/stagehand.md +0 -421
- package/.agent/tools/build-agent/agent-review.md +0 -224
- package/.agent/tools/build-agent/build-agent.md +0 -784
- package/.agent/tools/build-mcp/aidevops-plugin.md +0 -476
- package/.agent/tools/build-mcp/api-wrapper.md +0 -445
- package/.agent/tools/build-mcp/build-mcp.md +0 -240
- package/.agent/tools/build-mcp/deployment.md +0 -401
- package/.agent/tools/build-mcp/server-patterns.md +0 -632
- package/.agent/tools/build-mcp/transports.md +0 -366
- package/.agent/tools/code-review/auditing.md +0 -383
- package/.agent/tools/code-review/automation.md +0 -219
- package/.agent/tools/code-review/best-practices.md +0 -203
- package/.agent/tools/code-review/codacy.md +0 -151
- package/.agent/tools/code-review/code-simplifier.md +0 -174
- package/.agent/tools/code-review/code-standards.md +0 -309
- package/.agent/tools/code-review/coderabbit.md +0 -101
- package/.agent/tools/code-review/management.md +0 -155
- package/.agent/tools/code-review/qlty.md +0 -248
- package/.agent/tools/code-review/secretlint.md +0 -565
- package/.agent/tools/code-review/setup.md +0 -250
- package/.agent/tools/code-review/snyk.md +0 -563
- package/.agent/tools/code-review/tools.md +0 -230
- package/.agent/tools/content/summarize.md +0 -353
- package/.agent/tools/context/augment-context-engine.md +0 -468
- package/.agent/tools/context/context-builder-agent.md +0 -76
- package/.agent/tools/context/context-builder.md +0 -375
- package/.agent/tools/context/context7.md +0 -371
- package/.agent/tools/context/dspy.md +0 -302
- package/.agent/tools/context/dspyground.md +0 -374
- package/.agent/tools/context/llm-tldr.md +0 -219
- package/.agent/tools/context/osgrep.md +0 -488
- package/.agent/tools/context/prompt-optimization.md +0 -338
- package/.agent/tools/context/toon.md +0 -292
- package/.agent/tools/conversion/pandoc.md +0 -304
- package/.agent/tools/credentials/api-key-management.md +0 -154
- package/.agent/tools/credentials/api-key-setup.md +0 -224
- package/.agent/tools/credentials/environment-variables.md +0 -180
- package/.agent/tools/credentials/vaultwarden.md +0 -382
- package/.agent/tools/data-extraction/outscraper.md +0 -974
- package/.agent/tools/deployment/coolify-cli.md +0 -388
- package/.agent/tools/deployment/coolify-setup.md +0 -353
- package/.agent/tools/deployment/coolify.md +0 -345
- package/.agent/tools/deployment/vercel.md +0 -390
- package/.agent/tools/git/authentication.md +0 -132
- package/.agent/tools/git/gitea-cli.md +0 -193
- package/.agent/tools/git/github-actions.md +0 -207
- package/.agent/tools/git/github-cli.md +0 -223
- package/.agent/tools/git/gitlab-cli.md +0 -190
- package/.agent/tools/git/opencode-github-security.md +0 -350
- package/.agent/tools/git/opencode-github.md +0 -328
- package/.agent/tools/git/opencode-gitlab.md +0 -252
- package/.agent/tools/git/security.md +0 -196
- package/.agent/tools/git.md +0 -207
- package/.agent/tools/opencode/oh-my-opencode.md +0 -375
- package/.agent/tools/opencode/opencode-anthropic-auth.md +0 -446
- package/.agent/tools/opencode/opencode.md +0 -651
- package/.agent/tools/social-media/bird.md +0 -437
- package/.agent/tools/task-management/beads.md +0 -336
- package/.agent/tools/terminal/terminal-title.md +0 -251
- package/.agent/tools/ui/shadcn.md +0 -196
- package/.agent/tools/ui/ui-skills.md +0 -115
- package/.agent/tools/wordpress/localwp.md +0 -311
- package/.agent/tools/wordpress/mainwp.md +0 -391
- package/.agent/tools/wordpress/scf.md +0 -527
- package/.agent/tools/wordpress/wp-admin.md +0 -729
- package/.agent/tools/wordpress/wp-dev.md +0 -940
- package/.agent/tools/wordpress/wp-preferred.md +0 -398
- package/.agent/tools/wordpress.md +0 -95
- package/.agent/workflows/branch/bugfix.md +0 -63
- package/.agent/workflows/branch/chore.md +0 -95
- package/.agent/workflows/branch/experiment.md +0 -115
- package/.agent/workflows/branch/feature.md +0 -59
- package/.agent/workflows/branch/hotfix.md +0 -98
- package/.agent/workflows/branch/refactor.md +0 -92
- package/.agent/workflows/branch/release.md +0 -96
- package/.agent/workflows/branch.md +0 -347
- package/.agent/workflows/bug-fixing.md +0 -267
- package/.agent/workflows/changelog.md +0 -129
- package/.agent/workflows/code-audit-remote.md +0 -279
- package/.agent/workflows/conversation-starter.md +0 -69
- package/.agent/workflows/error-feedback.md +0 -578
- package/.agent/workflows/feature-development.md +0 -355
- package/.agent/workflows/git-workflow.md +0 -702
- package/.agent/workflows/multi-repo-workspace.md +0 -268
- package/.agent/workflows/plans.md +0 -709
- package/.agent/workflows/postflight.md +0 -604
- package/.agent/workflows/pr.md +0 -571
- package/.agent/workflows/preflight.md +0 -278
- package/.agent/workflows/ralph-loop.md +0 -773
- package/.agent/workflows/release.md +0 -498
- package/.agent/workflows/session-manager.md +0 -254
- package/.agent/workflows/session-review.md +0 -311
- package/.agent/workflows/sql-migrations.md +0 -631
- package/.agent/workflows/version-bump.md +0 -283
- package/.agent/workflows/wiki-update.md +0 -333
- package/.agent/workflows/worktree.md +0 -477
|
@@ -1,555 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# shellcheck disable=SC2034,SC2155
|
|
3
|
-
# Postflight Verification Script
|
|
4
|
-
# Verifies release health after tag creation and GitHub release publication
|
|
5
|
-
#
|
|
6
|
-
# Usage: ./postflight-check.sh [--quick|--full|--ci-only|--security-only]
|
|
7
|
-
#
|
|
8
|
-
# Author: AI DevOps Framework
|
|
9
|
-
# Version: 1.0.0
|
|
10
|
-
|
|
11
|
-
set -euo pipefail
|
|
12
|
-
|
|
13
|
-
# Configuration
|
|
14
|
-
readonly TIMEOUT_CI=600 # 10 minutes for CI/CD
|
|
15
|
-
readonly TIMEOUT_TOOLS=300 # 5 minutes for code review tools
|
|
16
|
-
readonly POLL_INTERVAL=30 # Check every 30 seconds
|
|
17
|
-
readonly MAX_ATTEMPTS=20 # Maximum polling attempts
|
|
18
|
-
|
|
19
|
-
# Colors for output
|
|
20
|
-
readonly RED='\033[0;31m'
|
|
21
|
-
readonly GREEN='\033[0;32m'
|
|
22
|
-
readonly YELLOW='\033[1;33m'
|
|
23
|
-
readonly BLUE='\033[0;34m'
|
|
24
|
-
readonly NC='\033[0m'
|
|
25
|
-
|
|
26
|
-
# Repository info
|
|
27
|
-
readonly REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" || exit
|
|
28
|
-
readonly SONAR_PROJECT_KEY="marcusquinn_aidevops"
|
|
29
|
-
# Save the original working directory for git operations (supports worktrees)
|
|
30
|
-
readonly ORIGINAL_PWD="$PWD"
|
|
31
|
-
|
|
32
|
-
# Counters
|
|
33
|
-
PASSED=0
|
|
34
|
-
FAILED=0
|
|
35
|
-
WARNINGS=0
|
|
36
|
-
SKIPPED=0
|
|
37
|
-
|
|
38
|
-
print_header() {
|
|
39
|
-
echo -e "${BLUE}========================================${NC}"
|
|
40
|
-
echo -e "${BLUE} Postflight Verification${NC}"
|
|
41
|
-
echo -e "${BLUE}========================================${NC}"
|
|
42
|
-
echo "Started: $(date)"
|
|
43
|
-
echo ""
|
|
44
|
-
return 0
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
print_success() {
|
|
48
|
-
local message="$1"
|
|
49
|
-
echo -e "${GREEN}PASSED${NC} $message"
|
|
50
|
-
((PASSED++))
|
|
51
|
-
return 0
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
print_warning() {
|
|
55
|
-
local message="$1"
|
|
56
|
-
echo -e "${YELLOW}WARNING${NC} $message"
|
|
57
|
-
((WARNINGS++))
|
|
58
|
-
return 0
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
print_error() {
|
|
62
|
-
local message="$1"
|
|
63
|
-
echo -e "${RED}FAILED${NC} $message"
|
|
64
|
-
((FAILED++))
|
|
65
|
-
return 0
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
print_skip() {
|
|
69
|
-
local message="$1"
|
|
70
|
-
echo -e "${BLUE}SKIPPED${NC} $message"
|
|
71
|
-
((SKIPPED++))
|
|
72
|
-
return 0
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
print_info() {
|
|
76
|
-
local message="$1"
|
|
77
|
-
echo -e "${BLUE}INFO${NC} $message"
|
|
78
|
-
return 0
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
print_section() {
|
|
82
|
-
local title="$1"
|
|
83
|
-
echo ""
|
|
84
|
-
echo -e "${BLUE}--- $title ---${NC}"
|
|
85
|
-
return 0
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
# Check if gh CLI is available and authenticated
|
|
89
|
-
check_gh_cli() {
|
|
90
|
-
if ! command -v gh &> /dev/null; then
|
|
91
|
-
print_error "GitHub CLI (gh) not installed"
|
|
92
|
-
return 1
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
if ! gh auth status &> /dev/null; then
|
|
96
|
-
print_error "GitHub CLI not authenticated. Run: gh auth login"
|
|
97
|
-
return 1
|
|
98
|
-
fi
|
|
99
|
-
|
|
100
|
-
return 0
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
# Get repository owner and name from original directory (works with worktrees)
|
|
104
|
-
get_repo_info() {
|
|
105
|
-
local remote_url
|
|
106
|
-
# Use original working directory's git context (saved before cd to REPO_ROOT)
|
|
107
|
-
remote_url=$(git -C "$ORIGINAL_PWD" remote get-url origin 2>/dev/null || echo "")
|
|
108
|
-
|
|
109
|
-
if [[ -z "$remote_url" ]]; then
|
|
110
|
-
echo ""
|
|
111
|
-
return 1
|
|
112
|
-
fi
|
|
113
|
-
|
|
114
|
-
# Extract owner/repo from various URL formats using parameter expansion
|
|
115
|
-
# (bash 3.2 compatible - regex capture groups don't work reliably on macOS)
|
|
116
|
-
local repo_path
|
|
117
|
-
if [[ "$remote_url" == *"github.com"* ]]; then
|
|
118
|
-
# Handle HTTPS: https://github.com/owner/repo.git
|
|
119
|
-
if [[ "$remote_url" == *"github.com/"* ]]; then
|
|
120
|
-
repo_path="${remote_url#*github.com/}"
|
|
121
|
-
# Handle SSH: git@github.com:owner/repo.git
|
|
122
|
-
elif [[ "$remote_url" == *"github.com:"* ]]; then
|
|
123
|
-
repo_path="${remote_url#*github.com:}"
|
|
124
|
-
else
|
|
125
|
-
echo ""
|
|
126
|
-
return 1
|
|
127
|
-
fi
|
|
128
|
-
# Remove .git suffix if present
|
|
129
|
-
repo_path="${repo_path%.git}"
|
|
130
|
-
if [[ -n "$repo_path" && "$repo_path" == *"/"* ]]; then
|
|
131
|
-
echo "$repo_path"
|
|
132
|
-
return 0
|
|
133
|
-
fi
|
|
134
|
-
fi
|
|
135
|
-
|
|
136
|
-
echo ""
|
|
137
|
-
return 1
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
# Check GitHub Actions CI/CD status
|
|
141
|
-
check_cicd_status() {
|
|
142
|
-
print_section "CI/CD Pipeline Status"
|
|
143
|
-
|
|
144
|
-
if ! check_gh_cli; then
|
|
145
|
-
return 1
|
|
146
|
-
fi
|
|
147
|
-
|
|
148
|
-
local repo
|
|
149
|
-
repo=$(get_repo_info)
|
|
150
|
-
if [[ -z "$repo" ]]; then
|
|
151
|
-
print_error "Could not determine repository"
|
|
152
|
-
return 1
|
|
153
|
-
fi
|
|
154
|
-
|
|
155
|
-
print_info "Repository: $repo"
|
|
156
|
-
|
|
157
|
-
# Get latest workflow run
|
|
158
|
-
local latest_run
|
|
159
|
-
latest_run=$(gh run list --repo "$repo" --limit=1 --json databaseId,status,conclusion,name 2>/dev/null || echo "")
|
|
160
|
-
|
|
161
|
-
if [[ -z "$latest_run" || "$latest_run" == "[]" ]]; then
|
|
162
|
-
print_warning "No workflow runs found"
|
|
163
|
-
return 0
|
|
164
|
-
fi
|
|
165
|
-
|
|
166
|
-
local run_id status conclusion name
|
|
167
|
-
run_id=$(echo "$latest_run" | jq -r '.[0].databaseId')
|
|
168
|
-
status=$(echo "$latest_run" | jq -r '.[0].status')
|
|
169
|
-
conclusion=$(echo "$latest_run" | jq -r '.[0].conclusion')
|
|
170
|
-
name=$(echo "$latest_run" | jq -r '.[0].name')
|
|
171
|
-
|
|
172
|
-
print_info "Latest run: $name (#$run_id)"
|
|
173
|
-
print_info "Status: $status, Conclusion: $conclusion"
|
|
174
|
-
|
|
175
|
-
# If still running, wait for completion
|
|
176
|
-
if [[ "$status" == "in_progress" || "$status" == "queued" ]]; then
|
|
177
|
-
print_info "Waiting for workflow to complete (timeout: ${TIMEOUT_CI}s)..."
|
|
178
|
-
|
|
179
|
-
local attempt=0
|
|
180
|
-
while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
|
|
181
|
-
sleep "$POLL_INTERVAL"
|
|
182
|
-
((attempt++))
|
|
183
|
-
|
|
184
|
-
local current_status
|
|
185
|
-
current_status=$(gh run view "$run_id" --repo "$repo" --json status,conclusion 2>/dev/null || echo "")
|
|
186
|
-
|
|
187
|
-
if [[ -z "$current_status" ]]; then
|
|
188
|
-
continue
|
|
189
|
-
fi
|
|
190
|
-
|
|
191
|
-
status=$(echo "$current_status" | jq -r '.status')
|
|
192
|
-
conclusion=$(echo "$current_status" | jq -r '.conclusion')
|
|
193
|
-
|
|
194
|
-
if [[ "$status" == "completed" ]]; then
|
|
195
|
-
break
|
|
196
|
-
fi
|
|
197
|
-
|
|
198
|
-
print_info "Still waiting... (attempt $attempt/$MAX_ATTEMPTS)"
|
|
199
|
-
done
|
|
200
|
-
fi
|
|
201
|
-
|
|
202
|
-
# Check final status
|
|
203
|
-
if [[ "$status" != "completed" ]]; then
|
|
204
|
-
print_error "Workflow did not complete within timeout"
|
|
205
|
-
return 1
|
|
206
|
-
fi
|
|
207
|
-
|
|
208
|
-
if [[ "$conclusion" == "success" ]]; then
|
|
209
|
-
print_success "CI/CD pipeline: $name"
|
|
210
|
-
elif [[ "$conclusion" == "failure" ]]; then
|
|
211
|
-
print_error "CI/CD pipeline failed: $name"
|
|
212
|
-
print_info "View logs: gh run view $run_id --repo $repo --log-failed"
|
|
213
|
-
return 1
|
|
214
|
-
else
|
|
215
|
-
print_warning "CI/CD pipeline conclusion: $conclusion"
|
|
216
|
-
fi
|
|
217
|
-
|
|
218
|
-
# Check all recent workflows
|
|
219
|
-
print_info "Checking all recent workflows..."
|
|
220
|
-
local all_runs
|
|
221
|
-
all_runs=$(gh run list --repo "$repo" --limit=5 --json name,conclusion,status 2>/dev/null || echo "[]")
|
|
222
|
-
|
|
223
|
-
local failed_count
|
|
224
|
-
failed_count=$(echo "$all_runs" | jq '[.[] | select(.conclusion == "failure")] | length')
|
|
225
|
-
|
|
226
|
-
if [[ "$failed_count" -gt 0 ]]; then
|
|
227
|
-
print_warning "$failed_count workflow(s) failed recently"
|
|
228
|
-
echo "$all_runs" | jq -r '.[] | select(.conclusion == "failure") | " - \(.name): \(.conclusion)"'
|
|
229
|
-
fi
|
|
230
|
-
|
|
231
|
-
return 0
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
# Check SonarCloud quality gate
|
|
235
|
-
check_sonarcloud() {
|
|
236
|
-
print_section "SonarCloud Analysis"
|
|
237
|
-
|
|
238
|
-
# Check quality gate status
|
|
239
|
-
local qg_response
|
|
240
|
-
qg_response=$(curl -s "https://sonarcloud.io/api/qualitygates/project_status?projectKey=$SONAR_PROJECT_KEY" 2>/dev/null || echo "")
|
|
241
|
-
|
|
242
|
-
if [[ -z "$qg_response" ]]; then
|
|
243
|
-
print_skip "Could not reach SonarCloud API"
|
|
244
|
-
return 0
|
|
245
|
-
fi
|
|
246
|
-
|
|
247
|
-
local qg_status
|
|
248
|
-
qg_status=$(echo "$qg_response" | jq -r '.projectStatus.status // "UNKNOWN"')
|
|
249
|
-
|
|
250
|
-
if [[ "$qg_status" == "OK" ]]; then
|
|
251
|
-
print_success "SonarCloud quality gate: PASSED"
|
|
252
|
-
elif [[ "$qg_status" == "ERROR" ]]; then
|
|
253
|
-
print_error "SonarCloud quality gate: FAILED"
|
|
254
|
-
|
|
255
|
-
# Get failing conditions
|
|
256
|
-
echo "$qg_response" | jq -r '.projectStatus.conditions[] | select(.status == "ERROR") | " - \(.metricKey): \(.actualValue) (threshold: \(.errorThreshold))"'
|
|
257
|
-
elif [[ "$qg_status" == "WARN" ]]; then
|
|
258
|
-
print_warning "SonarCloud quality gate: WARNING"
|
|
259
|
-
else
|
|
260
|
-
print_warning "SonarCloud quality gate status: $qg_status"
|
|
261
|
-
fi
|
|
262
|
-
|
|
263
|
-
# Get current metrics
|
|
264
|
-
local metrics_response
|
|
265
|
-
metrics_response=$(curl -s "https://sonarcloud.io/api/measures/component?component=$SONAR_PROJECT_KEY&metricKeys=bugs,vulnerabilities,code_smells,security_hotspots" 2>/dev/null || echo "")
|
|
266
|
-
|
|
267
|
-
if [[ -n "$metrics_response" ]]; then
|
|
268
|
-
print_info "Current metrics:"
|
|
269
|
-
echo "$metrics_response" | jq -r '.component.measures[] | " - \(.metric): \(.value)"' 2>/dev/null || true
|
|
270
|
-
fi
|
|
271
|
-
|
|
272
|
-
# Check for new issues
|
|
273
|
-
local issues_response
|
|
274
|
-
issues_response=$(curl -s "https://sonarcloud.io/api/issues/search?componentKeys=$SONAR_PROJECT_KEY&resolved=false&severities=BLOCKER,CRITICAL&ps=5" 2>/dev/null || echo "")
|
|
275
|
-
|
|
276
|
-
if [[ -n "$issues_response" ]]; then
|
|
277
|
-
local critical_count
|
|
278
|
-
critical_count=$(echo "$issues_response" | jq -r '.total // 0')
|
|
279
|
-
|
|
280
|
-
if [[ "$critical_count" -gt 0 ]]; then
|
|
281
|
-
print_warning "$critical_count blocker/critical issues found"
|
|
282
|
-
echo "$issues_response" | jq -r '.issues[] | " - [\(.severity)] \(.message)"' 2>/dev/null | head -5 || true
|
|
283
|
-
fi
|
|
284
|
-
fi
|
|
285
|
-
|
|
286
|
-
return 0
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
# Check Codacy status
|
|
290
|
-
check_codacy() {
|
|
291
|
-
print_section "Codacy Analysis"
|
|
292
|
-
|
|
293
|
-
local codacy_script="$REPO_ROOT/.agent/scripts/codacy-cli.sh"
|
|
294
|
-
|
|
295
|
-
if [[ -f "$codacy_script" ]]; then
|
|
296
|
-
if bash "$codacy_script" status &> /dev/null; then
|
|
297
|
-
print_success "Codacy CLI: Available"
|
|
298
|
-
print_info "Run 'bash $codacy_script analyze' for detailed analysis"
|
|
299
|
-
else
|
|
300
|
-
print_skip "Codacy CLI not configured"
|
|
301
|
-
fi
|
|
302
|
-
else
|
|
303
|
-
print_skip "Codacy CLI script not found"
|
|
304
|
-
fi
|
|
305
|
-
|
|
306
|
-
# Check via dashboard link
|
|
307
|
-
print_info "Dashboard: https://app.codacy.com/gh/marcusquinn/aidevops"
|
|
308
|
-
|
|
309
|
-
return 0
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
# Check security with Snyk
|
|
313
|
-
check_snyk() {
|
|
314
|
-
print_section "Security Scanning (Snyk)"
|
|
315
|
-
|
|
316
|
-
if ! command -v snyk &> /dev/null; then
|
|
317
|
-
print_skip "Snyk CLI not installed"
|
|
318
|
-
print_info "Install: brew tap snyk/tap && brew install snyk-cli"
|
|
319
|
-
return 0
|
|
320
|
-
fi
|
|
321
|
-
|
|
322
|
-
# Check authentication
|
|
323
|
-
if ! snyk auth check &> /dev/null 2>&1; then
|
|
324
|
-
print_skip "Snyk not authenticated"
|
|
325
|
-
print_info "Run: snyk auth"
|
|
326
|
-
return 0
|
|
327
|
-
fi
|
|
328
|
-
|
|
329
|
-
print_info "Running Snyk security scan..."
|
|
330
|
-
|
|
331
|
-
local snyk_output
|
|
332
|
-
local snyk_exit=0
|
|
333
|
-
snyk_output=$(snyk test --severity-threshold=high --json 2>/dev/null) || snyk_exit=$?
|
|
334
|
-
|
|
335
|
-
if [[ $snyk_exit -eq 0 ]]; then
|
|
336
|
-
print_success "Snyk: No high/critical vulnerabilities"
|
|
337
|
-
elif [[ $snyk_exit -eq 1 ]]; then
|
|
338
|
-
local vuln_count
|
|
339
|
-
vuln_count=$(echo "$snyk_output" | jq -r '.vulnerabilities | length // 0')
|
|
340
|
-
print_error "Snyk: $vuln_count vulnerabilities found"
|
|
341
|
-
|
|
342
|
-
# Show top vulnerabilities
|
|
343
|
-
echo "$snyk_output" | jq -r '.vulnerabilities[:5][] | " - [\(.severity)] \(.title) in \(.packageName)"' 2>/dev/null || true
|
|
344
|
-
else
|
|
345
|
-
print_warning "Snyk scan completed with warnings"
|
|
346
|
-
fi
|
|
347
|
-
|
|
348
|
-
return 0
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
# Check for exposed secrets
|
|
352
|
-
check_secrets() {
|
|
353
|
-
print_section "Secret Detection (Secretlint)"
|
|
354
|
-
|
|
355
|
-
if command -v secretlint &> /dev/null; then
|
|
356
|
-
print_info "Running Secretlint scan..."
|
|
357
|
-
|
|
358
|
-
if secretlint "**/*" --format compact 2>/dev/null; then
|
|
359
|
-
print_success "Secretlint: No secrets detected"
|
|
360
|
-
else
|
|
361
|
-
print_error "Secretlint: Potential secrets found"
|
|
362
|
-
return 1
|
|
363
|
-
fi
|
|
364
|
-
elif [[ -f "$REPO_ROOT/node_modules/.bin/secretlint" ]]; then
|
|
365
|
-
print_info "Running Secretlint (local)..."
|
|
366
|
-
|
|
367
|
-
if "$REPO_ROOT/node_modules/.bin/secretlint" "**/*" --format compact 2>/dev/null; then
|
|
368
|
-
print_success "Secretlint: No secrets detected"
|
|
369
|
-
else
|
|
370
|
-
print_error "Secretlint: Potential secrets found"
|
|
371
|
-
return 1
|
|
372
|
-
fi
|
|
373
|
-
else
|
|
374
|
-
print_skip "Secretlint not installed"
|
|
375
|
-
print_info "Install: npm install -g secretlint @secretlint/secretlint-rule-preset-recommend"
|
|
376
|
-
fi
|
|
377
|
-
|
|
378
|
-
return 0
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
# Check npm audit (if applicable)
|
|
382
|
-
check_npm_audit() {
|
|
383
|
-
print_section "Dependency Audit"
|
|
384
|
-
|
|
385
|
-
if [[ -f "$REPO_ROOT/package.json" ]]; then
|
|
386
|
-
if command -v npm &> /dev/null; then
|
|
387
|
-
print_info "Running npm audit..."
|
|
388
|
-
|
|
389
|
-
local audit_output
|
|
390
|
-
local audit_exit=0
|
|
391
|
-
audit_output=$(npm audit --audit-level=high --json 2>/dev/null) || audit_exit=$?
|
|
392
|
-
|
|
393
|
-
if [[ $audit_exit -eq 0 ]]; then
|
|
394
|
-
print_success "npm audit: No high/critical vulnerabilities"
|
|
395
|
-
else
|
|
396
|
-
local vuln_count
|
|
397
|
-
vuln_count=$(echo "$audit_output" | jq -r '.metadata.vulnerabilities.high + .metadata.vulnerabilities.critical // 0')
|
|
398
|
-
print_warning "npm audit: $vuln_count high/critical vulnerabilities"
|
|
399
|
-
fi
|
|
400
|
-
else
|
|
401
|
-
print_skip "npm not available"
|
|
402
|
-
fi
|
|
403
|
-
else
|
|
404
|
-
print_skip "No package.json found"
|
|
405
|
-
fi
|
|
406
|
-
|
|
407
|
-
return 0
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
# Run local quality checks
|
|
411
|
-
check_local_quality() {
|
|
412
|
-
print_section "Local Quality Checks"
|
|
413
|
-
|
|
414
|
-
local quality_script="$REPO_ROOT/.agent/scripts/linters-local.sh"
|
|
415
|
-
|
|
416
|
-
if [[ -f "$quality_script" ]]; then
|
|
417
|
-
print_info "Running linters-local.sh..."
|
|
418
|
-
|
|
419
|
-
if bash "$quality_script" &> /dev/null; then
|
|
420
|
-
print_success "Local quality checks passed"
|
|
421
|
-
else
|
|
422
|
-
print_warning "Local quality checks reported issues"
|
|
423
|
-
print_info "Run: bash $quality_script (for details)"
|
|
424
|
-
fi
|
|
425
|
-
else
|
|
426
|
-
print_skip "linters-local.sh not found"
|
|
427
|
-
fi
|
|
428
|
-
|
|
429
|
-
return 0
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
# Print summary
|
|
433
|
-
print_summary() {
|
|
434
|
-
echo ""
|
|
435
|
-
echo -e "${BLUE}========================================${NC}"
|
|
436
|
-
echo -e "${BLUE} Summary${NC}"
|
|
437
|
-
echo -e "${BLUE}========================================${NC}"
|
|
438
|
-
echo "Finished: $(date)"
|
|
439
|
-
echo ""
|
|
440
|
-
echo -e " ${GREEN}Passed:${NC} $PASSED"
|
|
441
|
-
echo -e " ${RED}Failed:${NC} $FAILED"
|
|
442
|
-
echo -e " ${YELLOW}Warnings:${NC} $WARNINGS"
|
|
443
|
-
echo -e " ${BLUE}Skipped:${NC} $SKIPPED"
|
|
444
|
-
echo ""
|
|
445
|
-
|
|
446
|
-
if [[ $FAILED -gt 0 ]]; then
|
|
447
|
-
echo -e "${RED}POSTFLIGHT VERIFICATION FAILED${NC}"
|
|
448
|
-
echo ""
|
|
449
|
-
echo "Recommended actions:"
|
|
450
|
-
echo " 1. Review failed checks above"
|
|
451
|
-
echo " 2. Consider rollback if critical issues found"
|
|
452
|
-
echo " 3. See: .agent/workflows/postflight.md#rollback-procedures"
|
|
453
|
-
return 1
|
|
454
|
-
elif [[ $WARNINGS -gt 0 ]]; then
|
|
455
|
-
echo -e "${YELLOW}POSTFLIGHT VERIFICATION PASSED WITH WARNINGS${NC}"
|
|
456
|
-
echo ""
|
|
457
|
-
echo "Review warnings above and address in next release if needed."
|
|
458
|
-
return 0
|
|
459
|
-
else
|
|
460
|
-
echo -e "${GREEN}POSTFLIGHT VERIFICATION PASSED${NC}"
|
|
461
|
-
return 0
|
|
462
|
-
fi
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
# Show usage
|
|
466
|
-
show_usage() {
|
|
467
|
-
echo "Usage: $0 [OPTIONS]"
|
|
468
|
-
echo ""
|
|
469
|
-
echo "Options:"
|
|
470
|
-
echo " --quick Run quick checks only (CI/CD + SonarCloud)"
|
|
471
|
-
echo " --full Run all checks (default)"
|
|
472
|
-
echo " --ci-only Run CI/CD checks only"
|
|
473
|
-
echo " --security-only Run security checks only"
|
|
474
|
-
echo " --help Show this help message"
|
|
475
|
-
echo ""
|
|
476
|
-
echo "Examples:"
|
|
477
|
-
echo " $0 # Run full postflight verification"
|
|
478
|
-
echo " $0 --quick # Quick check after minor release"
|
|
479
|
-
echo " $0 --security # Security-focused verification"
|
|
480
|
-
return 0
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
# Main function
|
|
484
|
-
main() {
|
|
485
|
-
local mode="full"
|
|
486
|
-
|
|
487
|
-
# Parse arguments
|
|
488
|
-
while [[ $# -gt 0 ]]; do
|
|
489
|
-
local arg="$1"
|
|
490
|
-
case "$arg" in
|
|
491
|
-
--quick)
|
|
492
|
-
mode="quick"
|
|
493
|
-
shift
|
|
494
|
-
;;
|
|
495
|
-
--full)
|
|
496
|
-
mode="full"
|
|
497
|
-
shift
|
|
498
|
-
;;
|
|
499
|
-
--ci-only)
|
|
500
|
-
mode="ci-only"
|
|
501
|
-
shift
|
|
502
|
-
;;
|
|
503
|
-
--security-only)
|
|
504
|
-
mode="security-only"
|
|
505
|
-
shift
|
|
506
|
-
;;
|
|
507
|
-
--help|-h)
|
|
508
|
-
show_usage
|
|
509
|
-
return 0
|
|
510
|
-
;;
|
|
511
|
-
*)
|
|
512
|
-
echo "Unknown option: $arg"
|
|
513
|
-
show_usage
|
|
514
|
-
return 1
|
|
515
|
-
;;
|
|
516
|
-
esac
|
|
517
|
-
done
|
|
518
|
-
|
|
519
|
-
print_header
|
|
520
|
-
|
|
521
|
-
cd "$REPO_ROOT" || exit
|
|
522
|
-
|
|
523
|
-
case "$mode" in
|
|
524
|
-
quick)
|
|
525
|
-
check_cicd_status || true
|
|
526
|
-
check_sonarcloud || true
|
|
527
|
-
;;
|
|
528
|
-
ci-only)
|
|
529
|
-
check_cicd_status || true
|
|
530
|
-
;;
|
|
531
|
-
security-only)
|
|
532
|
-
check_snyk || true
|
|
533
|
-
check_secrets || true
|
|
534
|
-
check_npm_audit || true
|
|
535
|
-
;;
|
|
536
|
-
full)
|
|
537
|
-
check_cicd_status || true
|
|
538
|
-
check_sonarcloud || true
|
|
539
|
-
check_codacy || true
|
|
540
|
-
check_snyk || true
|
|
541
|
-
check_secrets || true
|
|
542
|
-
check_npm_audit || true
|
|
543
|
-
check_local_quality || true
|
|
544
|
-
;;
|
|
545
|
-
*)
|
|
546
|
-
print_error "Unknown mode: $mode"
|
|
547
|
-
return 1
|
|
548
|
-
;;
|
|
549
|
-
esac
|
|
550
|
-
|
|
551
|
-
print_summary
|
|
552
|
-
return $?
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
main "$@"
|