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,597 @@
|
|
|
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
|
+
# Vaultwarden (Self-hosted Bitwarden) Helper Script
|
|
5
|
+
# Secure password and secrets management for AI assistants
|
|
6
|
+
|
|
7
|
+
# Colors for output
|
|
8
|
+
# String literal constants
|
|
9
|
+
readonly ERROR_CONFIG_NOT_FOUND="Configuration file not found"
|
|
10
|
+
readonly ERROR_JQ_REQUIRED="jq is required but not installed"
|
|
11
|
+
readonly INFO_JQ_INSTALL_MACOS="Install with: brew install jq"
|
|
12
|
+
readonly INFO_JQ_INSTALL_UBUNTU="Install with: apt-get install jq"
|
|
13
|
+
readonly ERROR_CURL_REQUIRED="curl is required but not installed"
|
|
14
|
+
|
|
15
|
+
GREEN='\033[0;32m'
|
|
16
|
+
BLUE='\033[0;34m'
|
|
17
|
+
YELLOW='\033[1;33m'
|
|
18
|
+
RED='\033[0;31m'
|
|
19
|
+
NC='\033[0m' # No Color
|
|
20
|
+
|
|
21
|
+
# Common message constants
|
|
22
|
+
readonly HELP_SHOW_MESSAGE="Show this help"
|
|
23
|
+
readonly USAGE_COMMAND_OPTIONS="Usage: $0 <command> [options]"
|
|
24
|
+
|
|
25
|
+
print_info() {
|
|
26
|
+
local msg="$1"
|
|
27
|
+
echo -e "${BLUE}[INFO]${NC} $msg"
|
|
28
|
+
return 0
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
print_success() {
|
|
32
|
+
local msg="$1"
|
|
33
|
+
echo -e "${GREEN}[SUCCESS]${NC} $msg"
|
|
34
|
+
return 0
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
print_warning() {
|
|
38
|
+
local msg="$1"
|
|
39
|
+
echo -e "${YELLOW}[WARNING]${NC} $msg"
|
|
40
|
+
return 0
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
print_error() {
|
|
44
|
+
local msg="$1"
|
|
45
|
+
echo -e "${RED}[ERROR]${NC} $msg" >&2
|
|
46
|
+
return 0
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
CONFIG_FILE="../configs/vaultwarden-config.json"
|
|
50
|
+
|
|
51
|
+
# Check dependencies
|
|
52
|
+
check_dependencies() {
|
|
53
|
+
if ! command -v curl &> /dev/null; then
|
|
54
|
+
print_error "$ERROR_CURL_REQUIRED"
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
if ! command -v jq &> /dev/null; then
|
|
59
|
+
print_error "$ERROR_JQ_REQUIRED"
|
|
60
|
+
echo "$INFO_JQ_INSTALL_MACOS"
|
|
61
|
+
echo "$INFO_JQ_INSTALL_UBUNTU"
|
|
62
|
+
exit 1
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
if ! command -v bw &> /dev/null; then
|
|
66
|
+
print_warning "Bitwarden CLI not found. Install with:"
|
|
67
|
+
echo " npm install -g @bitwarden/cli"
|
|
68
|
+
echo " Or download from: https://bitwarden.com/download/"
|
|
69
|
+
fi
|
|
70
|
+
return 0
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Load configuration
|
|
74
|
+
load_config() {
|
|
75
|
+
if [[ ! -f "$CONFIG_FILE" ]]; then
|
|
76
|
+
print_error "$ERROR_CONFIG_NOT_FOUND"
|
|
77
|
+
print_info "Copy and customize: cp ../configs/vaultwarden-config.json.txt $CONFIG_FILE"
|
|
78
|
+
exit 1
|
|
79
|
+
fi
|
|
80
|
+
return 0
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
# Get instance configuration
|
|
84
|
+
get_instance_config() {
|
|
85
|
+
local instance_name="$command"
|
|
86
|
+
|
|
87
|
+
if [[ -z "$instance_name" ]]; then
|
|
88
|
+
print_error "Instance name is required"
|
|
89
|
+
list_instances
|
|
90
|
+
exit 1
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
local instance_config
|
|
94
|
+
instance_config=$(jq -r ".instances.\"$instance_name\"" "$CONFIG_FILE")
|
|
95
|
+
if [[ "$instance_config" == "null" ]]; then
|
|
96
|
+
print_error "Instance '$instance_name' not found in configuration"
|
|
97
|
+
list_instances
|
|
98
|
+
exit 1
|
|
99
|
+
fi
|
|
100
|
+
|
|
101
|
+
echo "$instance_config"
|
|
102
|
+
return 0
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# Configure Bitwarden CLI for instance
|
|
106
|
+
configure_bw_cli() {
|
|
107
|
+
local instance_name="$command"
|
|
108
|
+
local config
|
|
109
|
+
config=$(get_instance_config "$instance_name")
|
|
110
|
+
local server_url
|
|
111
|
+
server_url=$(echo "$config" | jq -r '.server_url')
|
|
112
|
+
|
|
113
|
+
if [[ "$server_url" != "null" ]]; then
|
|
114
|
+
bw config server "$server_url"
|
|
115
|
+
print_info "Configured Bitwarden CLI for server: $server_url"
|
|
116
|
+
fi
|
|
117
|
+
return 0
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# Login to Bitwarden
|
|
121
|
+
login_bw() {
|
|
122
|
+
local instance_name="$command"
|
|
123
|
+
local email="$account_name"
|
|
124
|
+
local password="$target"
|
|
125
|
+
|
|
126
|
+
configure_bw_cli "$instance_name"
|
|
127
|
+
|
|
128
|
+
if [[ -n "$email" && -n "$password" ]]; then
|
|
129
|
+
echo "$password" | bw login "$email" --raw
|
|
130
|
+
else
|
|
131
|
+
print_info "Interactive login required"
|
|
132
|
+
bw login
|
|
133
|
+
fi
|
|
134
|
+
return 0
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
# Unlock vault
|
|
138
|
+
unlock_vault() {
|
|
139
|
+
local password="$command"
|
|
140
|
+
|
|
141
|
+
if [[ -n "$password" ]]; then
|
|
142
|
+
echo "$password" | bw unlock --raw
|
|
143
|
+
else
|
|
144
|
+
print_info "Interactive unlock required"
|
|
145
|
+
bw unlock
|
|
146
|
+
fi
|
|
147
|
+
return 0
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
# List all configured instances
|
|
151
|
+
list_instances() {
|
|
152
|
+
load_config
|
|
153
|
+
print_info "Available Vaultwarden instances:"
|
|
154
|
+
jq -r '.instances | keys[]' "$CONFIG_FILE" | while read instance; do
|
|
155
|
+
local description
|
|
156
|
+
description=$(jq -r ".instances.\"$instance\".description" "$CONFIG_FILE")
|
|
157
|
+
local server_url
|
|
158
|
+
server_url=$(jq -r ".instances.\"$instance\".server_url" "$CONFIG_FILE")
|
|
159
|
+
echo " - $instance ($server_url) - $description"
|
|
160
|
+
done
|
|
161
|
+
return 0
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
# Get vault status
|
|
165
|
+
get_vault_status() {
|
|
166
|
+
local instance_name="$command"
|
|
167
|
+
configure_bw_cli "$instance_name"
|
|
168
|
+
|
|
169
|
+
print_info "Vault status for instance: $instance_name"
|
|
170
|
+
bw status
|
|
171
|
+
return 0
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
# List vault items
|
|
175
|
+
list_vault_items() {
|
|
176
|
+
local instance_name="$command"
|
|
177
|
+
local item_type="${2:-}"
|
|
178
|
+
|
|
179
|
+
configure_bw_cli "$instance_name"
|
|
180
|
+
|
|
181
|
+
if [[ -n "$item_type" ]]; then
|
|
182
|
+
print_info "Listing $item_type items"
|
|
183
|
+
bw list items --search "$item_type" | jq -r '.[] | "\(.id): \(.name) (\(.type))"'
|
|
184
|
+
else
|
|
185
|
+
print_info "Listing all vault items"
|
|
186
|
+
bw list items | jq -r '.[] | "\(.id): \(.name) (\(.type))"'
|
|
187
|
+
fi
|
|
188
|
+
return 0
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
# Get specific item
|
|
192
|
+
get_vault_item() {
|
|
193
|
+
local instance_name="$command"
|
|
194
|
+
local item_id="$account_name"
|
|
195
|
+
|
|
196
|
+
configure_bw_cli "$instance_name"
|
|
197
|
+
|
|
198
|
+
if [[ -z "$item_id" ]]; then
|
|
199
|
+
print_error "Item ID is required"
|
|
200
|
+
exit 1
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
print_info "Getting vault item: $item_id"
|
|
204
|
+
bw get item "$item_id"
|
|
205
|
+
return 0
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
# Search vault items
|
|
209
|
+
search_vault() {
|
|
210
|
+
local instance_name="$command"
|
|
211
|
+
local search_term="$account_name"
|
|
212
|
+
|
|
213
|
+
configure_bw_cli "$instance_name"
|
|
214
|
+
|
|
215
|
+
if [[ -z "$search_term" ]]; then
|
|
216
|
+
print_error "Search term is required"
|
|
217
|
+
exit 1
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
print_info "Searching vault for: $search_term"
|
|
221
|
+
bw list items --search "$search_term" | jq -r '.[] | "\(.id): \(.name) - \(.login.username // .notes // "N/A")"'
|
|
222
|
+
return 0
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
# Get password for item
|
|
226
|
+
get_password() {
|
|
227
|
+
local instance_name="$command"
|
|
228
|
+
local item_name="$account_name"
|
|
229
|
+
|
|
230
|
+
configure_bw_cli "$instance_name"
|
|
231
|
+
|
|
232
|
+
if [[ -z "$item_name" ]]; then
|
|
233
|
+
print_error "Item name is required"
|
|
234
|
+
exit 1
|
|
235
|
+
fi
|
|
236
|
+
|
|
237
|
+
print_info "Getting password for: $item_name"
|
|
238
|
+
bw get password "$item_name"
|
|
239
|
+
return 0
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
# Get username for item
|
|
243
|
+
get_username() {
|
|
244
|
+
local instance_name="$command"
|
|
245
|
+
local item_name="$account_name"
|
|
246
|
+
|
|
247
|
+
configure_bw_cli "$instance_name"
|
|
248
|
+
|
|
249
|
+
if [[ -z "$item_name" ]]; then
|
|
250
|
+
print_error "Item name is required"
|
|
251
|
+
exit 1
|
|
252
|
+
fi
|
|
253
|
+
|
|
254
|
+
print_info "Getting username for: $item_name"
|
|
255
|
+
bw get username "$item_name"
|
|
256
|
+
return 0
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
# Create new vault item
|
|
260
|
+
create_vault_item() {
|
|
261
|
+
local instance_name="$command"
|
|
262
|
+
local item_name="$account_name"
|
|
263
|
+
local username="$target"
|
|
264
|
+
local password="$options"
|
|
265
|
+
local uri="$param5"
|
|
266
|
+
|
|
267
|
+
configure_bw_cli "$instance_name"
|
|
268
|
+
|
|
269
|
+
if [[ -z "$item_name" || -z "$username" || -z "$password" ]]; then
|
|
270
|
+
print_error "Item name, username, and password are required"
|
|
271
|
+
exit 1
|
|
272
|
+
fi
|
|
273
|
+
|
|
274
|
+
local item_json=$(jq -n \
|
|
275
|
+
--arg name "$item_name" \
|
|
276
|
+
--arg username "$username" \
|
|
277
|
+
--arg password "$password" \
|
|
278
|
+
--arg uri "$uri" \
|
|
279
|
+
'{
|
|
280
|
+
type: 1,
|
|
281
|
+
name: $name,
|
|
282
|
+
login: {
|
|
283
|
+
username: $username,
|
|
284
|
+
password: $password,
|
|
285
|
+
uris: [{ uri: $uri }]
|
|
286
|
+
return 0
|
|
287
|
+
}
|
|
288
|
+
}')
|
|
289
|
+
|
|
290
|
+
print_info "Creating vault item: $item_name"
|
|
291
|
+
echo "$item_json" | bw create item
|
|
292
|
+
return 0
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
# Update vault item
|
|
296
|
+
update_vault_item() {
|
|
297
|
+
local instance_name="$command"
|
|
298
|
+
local item_id="$account_name"
|
|
299
|
+
local field="$target"
|
|
300
|
+
local value="$options"
|
|
301
|
+
|
|
302
|
+
configure_bw_cli "$instance_name"
|
|
303
|
+
|
|
304
|
+
if [[ -z "$item_id" || -z "$field" || -z "$value" ]]; then
|
|
305
|
+
print_error "Item ID, field, and value are required"
|
|
306
|
+
exit 1
|
|
307
|
+
fi
|
|
308
|
+
|
|
309
|
+
print_info "Updating vault item: $item_id"
|
|
310
|
+
bw get item "$item_id" | jq --arg field "$field" --arg value "$value" \
|
|
311
|
+
'if $field == "password" then .login.password = $value
|
|
312
|
+
elif $field == "username" then .login.username = $value
|
|
313
|
+
elif $field == "name" then .name = $value
|
|
314
|
+
else . end' | bw encode | bw edit item "$item_id"
|
|
315
|
+
return 0
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
# Delete vault item
|
|
319
|
+
delete_vault_item() {
|
|
320
|
+
local instance_name="$command"
|
|
321
|
+
local item_id="$account_name"
|
|
322
|
+
|
|
323
|
+
configure_bw_cli "$instance_name"
|
|
324
|
+
|
|
325
|
+
if [[ -z "$item_id" ]]; then
|
|
326
|
+
print_error "Item ID is required"
|
|
327
|
+
exit 1
|
|
328
|
+
fi
|
|
329
|
+
|
|
330
|
+
print_warning "Deleting vault item: $item_id"
|
|
331
|
+
bw delete item "$item_id"
|
|
332
|
+
return 0
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
# Generate secure password
|
|
336
|
+
generate_password() {
|
|
337
|
+
local length="${1:-16}"
|
|
338
|
+
local include_symbols="${2:-true}"
|
|
339
|
+
|
|
340
|
+
if [[ "$include_symbols" == "true" ]]; then
|
|
341
|
+
bw generate --length "$length" --uppercase --lowercase --number --special
|
|
342
|
+
else
|
|
343
|
+
bw generate --length "$length" --uppercase --lowercase --number
|
|
344
|
+
fi
|
|
345
|
+
return 0
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
# Sync vault
|
|
349
|
+
sync_vault() {
|
|
350
|
+
local instance_name="$command"
|
|
351
|
+
configure_bw_cli "$instance_name"
|
|
352
|
+
|
|
353
|
+
print_info "Syncing vault for instance: $instance_name"
|
|
354
|
+
bw sync
|
|
355
|
+
return 0
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
# Lock vault
|
|
359
|
+
lock_vault() {
|
|
360
|
+
print_info "Locking vault"
|
|
361
|
+
bw lock
|
|
362
|
+
return 0
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
# Export vault
|
|
366
|
+
export_vault() {
|
|
367
|
+
local instance_name="$command"
|
|
368
|
+
local format="${2:-json}"
|
|
369
|
+
local output_file="$target"
|
|
370
|
+
|
|
371
|
+
configure_bw_cli "$instance_name"
|
|
372
|
+
|
|
373
|
+
if [[ -z "$output_file" ]]; then
|
|
374
|
+
output_file="vault-export-$(date +%Y%m%d-%H%M%S).$format"
|
|
375
|
+
fi
|
|
376
|
+
|
|
377
|
+
print_info "Exporting vault to: $output_file"
|
|
378
|
+
bw export --format "$format" --output "$output_file"
|
|
379
|
+
|
|
380
|
+
# Secure the export file
|
|
381
|
+
chmod 600 "$output_file"
|
|
382
|
+
print_warning "Export file secured with 600 permissions"
|
|
383
|
+
return 0
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
# Get organization vault items
|
|
387
|
+
list_org_vault() {
|
|
388
|
+
local instance_name="$command"
|
|
389
|
+
local org_id="$account_name"
|
|
390
|
+
|
|
391
|
+
configure_bw_cli "$instance_name"
|
|
392
|
+
|
|
393
|
+
if [[ -z "$org_id" ]]; then
|
|
394
|
+
print_error "Organization ID is required"
|
|
395
|
+
exit 1
|
|
396
|
+
fi
|
|
397
|
+
|
|
398
|
+
print_info "Listing organization vault items"
|
|
399
|
+
bw list items --organizationid "$org_id" | jq -r '.[] | "\(.id): \(.name) (\(.type))"'
|
|
400
|
+
return 0
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
# Start MCP server for Bitwarden
|
|
404
|
+
start_mcp_server() {
|
|
405
|
+
local instance_name="$command"
|
|
406
|
+
local port="${2:-3002}"
|
|
407
|
+
|
|
408
|
+
configure_bw_cli "$instance_name"
|
|
409
|
+
|
|
410
|
+
print_info "Starting Bitwarden MCP server on port $port"
|
|
411
|
+
|
|
412
|
+
# Check if Bitwarden MCP server is available
|
|
413
|
+
if command -v bitwarden-mcp-server &> /dev/null; then
|
|
414
|
+
bitwarden-mcp-server --port "$port"
|
|
415
|
+
else
|
|
416
|
+
print_warning "Bitwarden MCP server not found. Install with:"
|
|
417
|
+
echo " npm install -g @bitwarden/mcp-server"
|
|
418
|
+
echo " Or clone from: https://github.com/bitwarden/mcp-server"
|
|
419
|
+
fi
|
|
420
|
+
return 0
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
# Test MCP server connection
|
|
424
|
+
test_mcp_connection() {
|
|
425
|
+
local port="${1:-3002}"
|
|
426
|
+
|
|
427
|
+
print_info "Testing MCP server connection on port $port"
|
|
428
|
+
|
|
429
|
+
if curl -s "http://localhost:$port/health" > /dev/null; then
|
|
430
|
+
print_success "MCP server is responding on port $port"
|
|
431
|
+
else
|
|
432
|
+
print_error "MCP server is not responding on port $port"
|
|
433
|
+
fi
|
|
434
|
+
return 0
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
# Audit vault security
|
|
438
|
+
audit_vault_security() {
|
|
439
|
+
local instance_name="$command"
|
|
440
|
+
configure_bw_cli "$instance_name"
|
|
441
|
+
|
|
442
|
+
print_info "Auditing vault security for instance: $instance_name"
|
|
443
|
+
echo ""
|
|
444
|
+
|
|
445
|
+
print_info "=== WEAK PASSWORDS ==="
|
|
446
|
+
bw list items | jq -r '.[] | select(.type == 1) | select(.login.password != null) | select((.login.password | length) < 8) | "\(.name): Password too short (\(.login.password | length) chars)"'
|
|
447
|
+
|
|
448
|
+
echo ""
|
|
449
|
+
print_info "=== DUPLICATE PASSWORDS ==="
|
|
450
|
+
bw list items | jq -r '.[] | select(.type == 1) | .login.password' | sort | uniq -d | while read password; do
|
|
451
|
+
if [[ -n "$password" ]]; then
|
|
452
|
+
echo "Duplicate password found (length: ${#password})"
|
|
453
|
+
fi
|
|
454
|
+
done
|
|
455
|
+
|
|
456
|
+
echo ""
|
|
457
|
+
print_info "=== ITEMS WITHOUT PASSWORDS ==="
|
|
458
|
+
bw list items | jq -r '.[] | select(.type == 1) | select(.login.password == null or .login.password == "") | "\(.name): No password set"'
|
|
459
|
+
return 0
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
# Show help
|
|
463
|
+
show_help() {
|
|
464
|
+
echo "Vaultwarden (Self-hosted Bitwarden) Helper Script"
|
|
465
|
+
echo "Usage: $0 [command] [instance] [options]"
|
|
466
|
+
echo ""
|
|
467
|
+
echo "Commands:"
|
|
468
|
+
echo " instances - List all configured instances"
|
|
469
|
+
echo " status [instance] - Get vault status"
|
|
470
|
+
echo " login [instance] [email] [password] - Login to vault"
|
|
471
|
+
echo " unlock [password] - Unlock vault"
|
|
472
|
+
echo " lock - Lock vault"
|
|
473
|
+
echo " sync [instance] - Sync vault"
|
|
474
|
+
echo " list [instance] [type] - List vault items"
|
|
475
|
+
echo " search [instance] [term] - Search vault items"
|
|
476
|
+
echo " get [instance] [item_id] - Get specific item"
|
|
477
|
+
echo " get-password [instance] [item_name] - Get password for item"
|
|
478
|
+
echo " get-username [instance] [item_name] - Get username for item"
|
|
479
|
+
echo " create [instance] [name] [username] [password] [uri] - Create new item"
|
|
480
|
+
echo " update [instance] [item_id] [field] [value] - Update item field"
|
|
481
|
+
echo " delete [instance] [item_id] - Delete item"
|
|
482
|
+
echo " generate [length] [include_symbols] - Generate secure password"
|
|
483
|
+
echo " export [instance] [format] [output_file] - Export vault"
|
|
484
|
+
echo " org-list [instance] [org_id] - List organization items"
|
|
485
|
+
echo " start-mcp [instance] [port] - Start MCP server"
|
|
486
|
+
echo " test-mcp [port] - Test MCP connection"
|
|
487
|
+
echo " audit [instance] - Audit vault security"
|
|
488
|
+
echo " help - $HELP_SHOW_MESSAGE"
|
|
489
|
+
echo ""
|
|
490
|
+
echo "Examples:"
|
|
491
|
+
echo " $0 instances"
|
|
492
|
+
echo " $0 login production user@example.com"
|
|
493
|
+
echo " $0 search production github"
|
|
494
|
+
echo " $0 get-password production 'GitHub Account'"
|
|
495
|
+
echo " $0 generate 20 true"
|
|
496
|
+
echo " $0 audit production"
|
|
497
|
+
return 0
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
# Main script logic
|
|
501
|
+
main() {
|
|
502
|
+
# Assign positional parameters to local variables
|
|
503
|
+
local command="${1:-help}"
|
|
504
|
+
local account_name="$account_name"
|
|
505
|
+
local target="$target"
|
|
506
|
+
local options="$options"
|
|
507
|
+
# Assign positional parameters to local variables
|
|
508
|
+
local command="${1:-help}"
|
|
509
|
+
local account_name="$account_name"
|
|
510
|
+
local target="$target"
|
|
511
|
+
local options="$options"
|
|
512
|
+
# Assign positional parameters to local variables
|
|
513
|
+
local command="${1:-help}"
|
|
514
|
+
local account_name="$account_name"
|
|
515
|
+
local target="$target"
|
|
516
|
+
local options="$options"
|
|
517
|
+
# Assign positional parameters to local variables
|
|
518
|
+
# Assign positional parameters to local variables
|
|
519
|
+
local instance_name="$account_name"
|
|
520
|
+
local user_email="$target"
|
|
521
|
+
local password_length="$options"
|
|
522
|
+
local param5="$param5"
|
|
523
|
+
local param6="$param6"
|
|
524
|
+
|
|
525
|
+
check_dependencies
|
|
526
|
+
|
|
527
|
+
case "$command" in
|
|
528
|
+
"instances")
|
|
529
|
+
list_instances
|
|
530
|
+
;;
|
|
531
|
+
"status")
|
|
532
|
+
get_vault_status "$instance_name"
|
|
533
|
+
;;
|
|
534
|
+
"login")
|
|
535
|
+
login_bw "$instance_name" "$user_email" "$password_length"
|
|
536
|
+
;;
|
|
537
|
+
"unlock")
|
|
538
|
+
unlock_vault "$instance_name"
|
|
539
|
+
;;
|
|
540
|
+
"lock")
|
|
541
|
+
lock_vault
|
|
542
|
+
;;
|
|
543
|
+
"sync")
|
|
544
|
+
sync_vault "$param2"
|
|
545
|
+
;;
|
|
546
|
+
"list")
|
|
547
|
+
list_vault_items "$param2" "$param3"
|
|
548
|
+
;;
|
|
549
|
+
"search")
|
|
550
|
+
search_vault "$param2" "$param3"
|
|
551
|
+
;;
|
|
552
|
+
"get")
|
|
553
|
+
get_vault_item "$param2" "$param3"
|
|
554
|
+
;;
|
|
555
|
+
"get-password")
|
|
556
|
+
get_password "$param2" "$param3"
|
|
557
|
+
;;
|
|
558
|
+
"get-username")
|
|
559
|
+
get_username "$param2" "$param3"
|
|
560
|
+
;;
|
|
561
|
+
"create")
|
|
562
|
+
create_vault_item "$instance_name" "$user_email" "$password_length" "$param5" "$param6"
|
|
563
|
+
;;
|
|
564
|
+
"update")
|
|
565
|
+
update_vault_item "$instance_name" "$user_email" "$password_length" "$param5"
|
|
566
|
+
;;
|
|
567
|
+
"delete")
|
|
568
|
+
delete_vault_item "$param2" "$param3"
|
|
569
|
+
;;
|
|
570
|
+
"generate")
|
|
571
|
+
generate_password "$param2" "$param3"
|
|
572
|
+
;;
|
|
573
|
+
"export")
|
|
574
|
+
export_vault "$param2" "$param3" "$param4"
|
|
575
|
+
;;
|
|
576
|
+
"org-list")
|
|
577
|
+
list_org_vault "$param2" "$param3"
|
|
578
|
+
;;
|
|
579
|
+
"start-mcp")
|
|
580
|
+
start_mcp_server "$param2" "$param3"
|
|
581
|
+
;;
|
|
582
|
+
"test-mcp")
|
|
583
|
+
test_mcp_connection "$param2"
|
|
584
|
+
;;
|
|
585
|
+
"audit")
|
|
586
|
+
audit_vault_security "$param2"
|
|
587
|
+
;;
|
|
588
|
+
"help"|*)
|
|
589
|
+
show_help
|
|
590
|
+
;;
|
|
591
|
+
esac
|
|
592
|
+
return 0
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
main "$@"
|
|
596
|
+
|
|
597
|
+
return 0
|