尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Superpowers使用指南:从安装到Java能力组合实战

Superpowers使用指南:从安装到Java能力组合实战 1. 从“superpowers”这个标题说起它到底是什么第一次看到“superpowers”这个词很多人脑子里蹦出来的可能是超级英雄电影或者某些游戏里的技能系统。但如果你是在技术社区、开源项目或者开发者群组里看到它那大概率说的不是漫画而是一个在开发者圈子里逐渐被频繁提及的能力增强工具集。我最早接触这个词是在一个自动化脚本的讨论帖里有人提到“用superpowers跑了一遍省了我大半天”当时我还以为是某个新出的浏览器插件后来才发现它更像是一套面向开发者的“能力扩展包”——把日常重复性高、逻辑固定但手动操作又特别费时的任务打包成可复用、可组合的模块。“superpowers”这个词本身带有很强的隐喻色彩它暗示的是“普通人获得超越常规的能力”。放在技术语境下这个“超越常规”通常体现在几个方面一是自动化程度高原本需要十几步手动操作的事情现在一条命令或者一个配置就能完成二是覆盖面广不局限于单一语言或单一平台Java、Python、JavaScript 等常见技术栈都能接入三是上手门槛相对低不需要你从零造轮子而是站在已有能力的基础上做组合和调用。这也是为什么“superpowers使用指南”“superpowers安装”“superpowers java”这些关键词会频繁出现在搜索热词里——大家最关心的就是三件事怎么装、怎么用、能不能在我的技术栈里跑起来。从应用场景来看superpowers 这类工具集主要服务于几类人一是日常需要处理大量重复性编码任务的开发者比如批量生成接口代码、批量修改配置文件、批量执行测试用例二是需要快速搭建原型或者验证想法的独立开发者他们没有太多时间去做底层封装更希望有一个现成的能力池可以调用三是运维和自动化方向的从业者他们需要把一些跨系统的操作串联起来形成一个可重复执行的流程。如果你属于以上任何一类那理解 superpowers 的运作逻辑和实操方法确实能帮你省下不少时间。但这里要先说清楚一个前提superpowers 不是一个具体的、唯一的软件产品名称。在不同的社区和不同的技术栈里它可能指代不同的实现。有的项目把它做成命令行工具有的做成 IDE 插件有的做成 SDK 形式的库。所以你在搜索“superpowers安装”的时候一定要先确认你面对的是哪个具体项目、哪个版本、依赖哪些环境。我见过不少人直接照着某篇教程敲命令结果因为版本不匹配或者依赖缺失卡在第一步就进行不下去了。这也是为什么我后面会花很大篇幅去讲环境准备和版本核对——这些看似琐碎的步骤恰恰是决定你能不能顺利跑起来的关键。2. 核心设计思路拆解为什么是“能力组合”而不是“大而全”2.1 从“单点工具”到“能力网络”的转变传统的开发者工具往往走的是“单点突破”路线一个工具解决一个具体问题比如格式化代码用 A 工具跑测试用 B 工具生成文档用 C 工具。这种模式的好处是职责清晰但坏处也很明显——当你的工作流变长之后工具之间的切换成本、数据传递成本、配置同步成本会迅速上升。superpowers 这类项目的核心设计思路恰恰是反其道而行之它不追求在单一功能上做到极致而是把多个能力点串联起来形成一个可以灵活组合的“能力网络”。我举个具体的例子来说明这种差异。假设你需要完成一个“从数据库表结构生成 Java 实体类然后自动生成对应的增删改查接口最后跑一遍单元测试”的流程。传统做法是先用一个代码生成器读取表结构生成实体类然后手动或者用另一个工具生成接口代码接着自己写测试用例或者用测试框架生成最后运行测试。每一步都需要你手动触发中间产物需要你自己管理。而 superpowers 的思路是把“读取表结构”“生成实体类”“生成接口”“生成测试”“执行测试”这五个能力点注册到同一个执行上下文里你只需要定义好输入和输出规则剩下的串联工作由框架来完成。这种设计带来的最大好处是可组合性。你可以把“生成实体类”这个能力单独拿出来用也可以把它和“生成接口”组合起来用还可以把“生成接口”替换成“生成 GraphQL schema”而其他环节保持不变。这种灵活性在面对多变的业务需求时特别有价值——今天用 REST明天可能就要换 GraphQL今天用 MySQL明天可能就要兼容 PostgreSQL。如果每个环节都是紧耦合的那每次变更都是一次大重构而如果是松耦合的能力组合你只需要替换其中一个模块。2.2 为什么选择“配置驱动”而不是“代码驱动”另一个值得注意的设计选择是superpowers 类的工具通常倾向于“配置驱动”而不是“代码驱动”。也就是说你不需要写大量的胶水代码来调用各个能力点而是通过一份结构化的配置文件来描述“我要做什么”“按什么顺序做”“每个步骤的输入输出是什么”。这份配置文件可能是 YAML、JSON、TOML也可能是某种领域特定语言DSL。这种选择背后的逻辑是降低使用门槛和提升可维护性。代码驱动的方案虽然灵活但要求使用者具备一定的编程能力而且一旦逻辑变复杂代码本身也会变得难以维护。配置驱动的方案则把“做什么”和“怎么做”分离了你只需要关心“做什么”框架负责“怎么做”。对于重复性高的任务来说这种分离能显著减少出错概率——你不需要每次都在代码里小心翼翼地处理边界条件只需要在配置里声明清楚即可。当然配置驱动也有它的代价。最大的问题是调试困难。当配置不生效或者行为不符合预期时你很难像调试代码那样打断点、看变量。你只能通过日志、输出产物、中间状态来反推问题出在哪。这也是为什么我在后面的实操部分会特别强调“分步验证”的重要性——不要一次性把整个配置写完然后跑而是每加一个能力点就验证一次确保每一步的输出都符合预期。2.3 扩展性设计的取舍插件化与内置能力的平衡superpowers 这类项目在扩展性设计上通常面临一个取舍是把所有能力都内置还是只提供核心框架能力通过插件的方式扩展内置的好处是开箱即用用户不需要额外安装插件就能完成大部分常见任务坏处是包体变大、依赖变多、更新变慢。插件化的好处是核心轻量、按需加载、社区可以贡献能力坏处是用户需要自己寻找和安装插件版本兼容性也更复杂。从我实际使用的体验来看比较成熟的项目通常会采取“核心内置 高频插件预装 低频插件按需安装”的混合策略。核心内置的是那些几乎所有用户都会用到的能力比如文件读写、日志输出、错误处理高频插件预装的是那些在特定领域内使用频率很高的能力比如数据库操作、HTTP 请求、JSON 解析低频插件则留给用户自己按需安装比如某些特定框架的代码生成、某些云服务的 SDK 封装。这种策略的好处是平衡了“开箱即用”和“保持轻量”这两个目标。但作为使用者你需要清楚你用的版本里到底预装了哪些能力哪些需要额外安装。我遇到过好几次这样的情况照着教程敲了一个命令结果报错说某个能力不存在查了半天才发现那个能力在教程对应的版本里是预装的而我用的版本里需要手动安装。所以后面我会专门讲怎么查看当前版本的能力清单以及怎么确认一个能力是否可用。3. 环境准备与安装实操从零到跑通第一条命令3.1 版本核对别急着敲命令先看清楚你面对的是什么在动手安装之前有一件事比什么都重要确认你面对的是哪个具体的 superpowers 实现。前面说过这个词在不同社区可能指代不同的项目。你需要先找到项目的官方仓库或者官方文档确认它的名称、版本号、支持的平台和依赖要求。这一步看起来很简单但实际中很多人会跳过直接去搜“superpowers安装教程”然后照着某篇博客或者视频里的命令敲。结果因为教程对应的版本和你实际安装的版本不一致命令参数变了、依赖变了、甚至安装方式都变了最后卡在半路。我的建议是先找到官方仓库的 README 文件重点看三个部分。第一是“Installation”或者“Getting Started”部分确认官方推荐的安装方式是什么第二是“Requirements”或者“Prerequisites”部分确认需要哪些前置依赖比如特定版本的运行时、包管理器、系统工具第三是“Release Notes”或者“Changelog”部分确认你打算安装的版本和上一个版本之间有没有破坏性变更。这三部分看完你心里就有底了。以 Java 技术栈为例如果你要用的是某个基于 JVM 的 superpowers 实现那通常需要确认 JDK 版本。有的实现要求 JDK 11 以上有的要求 JDK 17 以上还有的只支持 JDK 8。如果你本地的 JDK 版本不符合要求那要么升级 JDK要么找一个兼容你当前 JDK 版本的 superpowers 版本。我个人的经验是尽量用 LTS 版本的 JDK比如 JDK 11 或者 JDK 17因为大多数工具链对 LTS 版本的支持最完善遇到问题的概率最低。3.2 安装方式选择包管理器、二进制包还是源码编译确认了版本和依赖之后接下来要选择安装方式。常见的安装方式有三种通过包管理器安装、下载二进制包、从源码编译。这三种方式各有适用场景我分别说一下。通过包管理器安装是最省事的方式。比如在 Java 生态里如果这个 superpowers 实现发布到了 Maven Central那你只需要在pom.xml或者build.gradle里加一行依赖声明然后执行构建命令包管理器会自动帮你下载和解析依赖。这种方式的优点是版本管理方便、依赖解析自动化、升级也简单。缺点是如果包管理器仓库里没有你想要的版本或者网络环境导致下载缓慢那就比较麻烦。下载二进制包适合那些不依赖包管理器、或者需要离线安装的场景。通常官方仓库的 Releases 页面会提供编译好的压缩包你下载下来解压然后把可执行文件放到系统路径里或者直接在当前目录下运行。这种方式的优点是简单直接、不依赖网络、版本明确。缺点是升级需要手动操作而且如果二进制包和你的操作系统或者架构不匹配那就跑不起来。从源码编译适合那些需要定制功能、或者官方没有提供你所需平台的二进制包的场景。这种方式要求你本地有完整的编译工具链比如 JDK、Maven 或者 Gradle、以及可能的 C 编译器等。优点是灵活性最高你可以修改源码、裁剪功能、针对特定平台优化。缺点是门槛最高、耗时最长、容易在编译过程中遇到各种依赖问题。对于大多数使用者来说我建议优先选择包管理器安装其次是二进制包。源码编译留给那些确实有定制需求的人。如果你只是想把 superpowers 跑起来用起来那没必要在编译上花太多时间。3.3 安装后的验证跑通第一条命令安装完成之后不要急着去写复杂的配置。先跑一条最简单的命令确认工具本身能正常工作。这条命令通常就是查看版本号或者查看帮助信息。比如superpowers --version或者superpowers --help如果这条命令能正常输出说明可执行文件已经正确安装并且能被系统找到。如果报“command not found”或者类似的错误那说明可执行文件没有在系统路径里你需要检查安装步骤确认是否漏掉了“添加到 PATH”这一步。接下来可以尝试跑一个更具体的命令比如列出当前可用的能力清单superpowers list或者查看某个具体能力的用法superpowers help 能力名称这一步的目的是确认工具不仅能启动还能正确加载内置的能力模块。如果这一步报错那可能是依赖缺失、配置文件格式错误、或者权限问题。根据报错信息去排查通常能很快定位到原因。提示在安装和验证阶段尽量保持环境干净。不要在同一个环境里混装多个版本的 superpowers也不要在系统全局路径里放多个同名的可执行文件。版本冲突是导致“命令行为不符合预期”的最常见原因之一。4. 核心能力解析与配置实操以 Java 场景为例4.1 能力清单的查看与理解superpowers 的核心价值在于它提供的能力集合。不同版本、不同实现的能力清单可能不同但通常都会包含几类基础能力文件操作、网络请求、数据处理、代码生成、任务调度。在 Java 场景下你可能还会看到一些与 JVM 生态紧密相关的能力比如类加载、字节码操作、依赖分析等。查看能力清单的方式通常有两种一种是通过命令行工具列出比如前面提到的superpowers list另一种是查看官方文档里的能力索引。我建议两种方式结合使用先用命令行列出当前版本实际可用的能力然后对照官方文档了解每个能力的详细参数和用法。因为命令行列出的能力清单是最准确的——它反映的是你当前安装的版本实际包含的能力而文档可能对应的是最新版本两者之间可能存在差异。理解能力清单的时候重点关注三个方面能力的名称、能力的输入参数、能力的输出结果。名称决定了你怎么调用它输入参数决定了你需要提供什么信息输出结果决定了你能拿它做什么。比如一个“生成 Java 实体类”的能力它的输入可能是数据库连接信息、表名、包名输出可能是生成的 Java 文件路径或者文件内容。你只有清楚了这些才能正确地把它和其他能力组合起来。4.2 配置文件的编写从最小可用配置开始superpowers 的配置通常写在一个或多个配置文件里。配置文件的格式取决于具体实现可能是 YAML、JSON、TOML也可能是自定义的 DSL。不管格式是什么核心结构通常包含几个部分全局配置、能力定义、任务流程。全局配置放的是那些对所有任务都适用的参数比如日志级别、输出目录、临时文件路径、超时时间等。能力定义部分声明你要用哪些能力以及每个能力的参数。任务流程部分定义这些能力按什么顺序执行以及它们之间的数据怎么传递。我建议从最小可用配置开始不要一上来就写一个包含十几个能力点的复杂流程。先写一个只包含一个能力点的配置跑通它确认输出符合预期然后再逐步增加能力点。每增加一个能力点就重新跑一次确认整个流程仍然正常。这样做的好处是当出现问题时你很容易定位到是哪个能力点引入的。如果一次性写了一大堆配置然后跑报错了你根本不知道是哪里的问题。下面是一个简化的配置示例假设我们要完成“读取一个 CSV 文件解析成 JSON然后输出到指定目录”这个流程global: log_level: info output_dir: ./output capabilities: - name: read_file params: path: ./data/input.csv encoding: utf-8 - name: parse_csv params: delimiter: , has_header: true - name: write_json params: path: ./output/result.json pretty: true pipeline: - read_file - parse_csv - write_json这个配置里global部分定义了日志级别和输出目录capabilities部分定义了三个能力及其参数pipeline部分定义了执行顺序。数据在能力之间的传递通常是隐式的——上一个能力的输出自动成为下一个能力的输入。这种设计简化了配置但也要求你对每个能力的输入输出类型有清晰的了解。4.3 参数传递与数据流转的细节数据在能力之间的传递是 superpowers 类工具的核心机制之一。理解这个机制对于写出正确的配置至关重要。通常有两种传递方式一种是隐式传递即上一个能力的输出自动作为下一个能力的输入另一种是显式传递即你需要在配置里明确指定数据从哪个能力的哪个输出字段流向哪个能力的哪个输入字段。隐式传递的优点是配置简洁适合那些输入输出类型天然匹配的场景。比如“读取文件”的输出是文本内容“解析 CSV”的输入是文本内容两者天然匹配不需要额外配置。但隐式传递的缺点是灵活性差一旦类型不匹配或者你需要对数据进行转换就必须引入额外的能力点来做适配。显式传递的优点是灵活你可以精确控制数据的流向甚至可以把一个能力的输出同时传给多个下游能力。但缺点是配置更复杂你需要清楚地知道每个能力的输入输出字段名称和类型。在实际使用中我通常会在流程比较简单的时候用隐式传递在流程复杂或者需要做数据转换的时候用显式传递。还有一个需要注意的细节是错误处理。当某个能力执行失败时整个流程是立即终止还是跳过继续执行还是重试这些行为通常可以在全局配置或者能力级别配置里指定。我建议在开发阶段把错误处理设置为“立即终止并输出详细日志”这样一旦出错你能第一时间发现。在生产环境或者批量处理场景下可以根据实际需求设置为“跳过并记录”或者“重试 N 次”。注意不同版本的 superpowers 对错误处理的默认行为可能不同。有的默认是终止有的默认是跳过。在写配置之前先确认你用的版本的默认行为是什么避免因为默认行为不符合预期而导致数据丢失或者流程中断。5. 常见问题与排查技巧实录5.1 安装阶段的典型问题安装阶段最常见的问题有三个命令找不到、依赖缺失、版本冲突。命令找不到通常是因为可执行文件没有加到系统路径里。解决办法是找到可执行文件的实际位置然后把它所在的目录加到PATH环境变量里。在 Linux 或者 macOS 上你可以用which superpowers或者find / -name superpowers来定位在 Windows 上你可以用where superpowers来查找。找到之后把目录加到 PATH 里然后重新打开终端或者执行source命令让配置生效。依赖缺失通常表现为启动时报“ClassNotFoundException”“NoClassDefFoundError”或者类似的错误。这说明某个必需的库或者模块没有找到。解决办法是检查你的依赖管理配置确认所有必需的依赖都已经声明并且版本正确。如果你用的是 Maven可以执行mvn dependency:tree来查看依赖树确认有没有冲突或者缺失。如果你用的是 Gradle可以执行gradle dependencies来达到类似的目的。版本冲突通常表现为行为不符合预期比如某个能力明明在文档里说有但你这里就是找不到或者某个参数明明在文档里说支持但你传进去就是报错。这往往是因为你安装的版本和文档对应的版本不一致。解决办法是确认你实际安装的版本号然后找到对应版本的文档。如果找不到对应版本的文档那就以实际行为为准或者升级到文档对应的版本。5.2 配置阶段的典型问题配置阶段最常见的问题有格式错误、参数类型不匹配、能力名称拼写错误。格式错误通常是因为 YAML 或者 JSON 的缩进、引号、括号不匹配。YAML 对缩进特别敏感多一个空格少一个空格都可能导致解析失败。我的建议是使用支持语法高亮和格式检查的编辑器来写配置文件比如 VS Code 配合 YAML 插件或者 IntelliJ IDEA 自带的 YAML 支持。写完之后可以用在线的 YAML 校验工具检查一下格式是否正确。参数类型不匹配通常表现为“expected type X but got type Y”之类的错误。比如某个参数要求是整数你传了字符串或者某个参数要求是数组你传了单个值。解决办法是仔细看文档里对参数类型的说明确认你传的值类型正确。如果文档没有明确说明类型可以尝试传不同类型的值看哪种能通过。能力名称拼写错误是最容易犯也最容易忽略的问题。因为能力名称通常是英文单词或者英文单词的组合拼错一个字母就会导致“能力不存在”的错误。我的建议是直接从superpowers list的输出里复制能力名称不要手动输入。如果必须手动输入那就仔细核对每一个字母。5.3 运行阶段的典型问题运行阶段最常见的问题有权限不足、路径错误、网络超时。权限不足通常表现为“Permission denied”或者“Access is denied”。这说明当前用户没有执行某个操作或者访问某个文件的权限。解决办法是检查文件或者目录的权限设置必要时用chmod或者chown来调整。如果你是在容器或者虚拟环境里运行还需要确认容器或者虚拟环境的权限配置。路径错误通常表现为“File not found”或者“No such file or directory”。这说明配置里写的路径不存在或者路径的基准目录和你预期的不一样。superpowers 类工具通常支持相对路径和绝对路径相对路径的基准目录可能是当前工作目录也可能是配置文件所在的目录具体取决于实现。我的建议是尽量用绝对路径或者在配置里明确指定基准目录避免歧义。网络超时通常发生在需要访问外部服务的场景比如从远程仓库下载依赖、调用外部 API 等。解决办法是检查网络连接是否正常确认目标服务是否可达必要时调整超时时间。如果你在公司内网环境里还需要确认是否需要配置代理或者镜像源。5.4 常见问题速查表问题现象可能原因排查方法解决思路命令找不到可执行文件不在 PATH 里which或where查找把所在目录加到 PATH启动报类找不到依赖缺失或版本冲突查看依赖树补充依赖或调整版本配置解析失败格式错误用校验工具检查修正缩进、引号、括号参数类型错误传值类型不匹配对照文档检查类型转换为正确类型能力不存在名称拼写错误或版本不支持superpowers list核对复制正确名称或升级版本权限不足文件或目录权限设置查看权限位调整权限或换用户路径错误路径不存在或基准目录不对检查路径和基准目录用绝对路径或指定基准网络超时网络不通或服务不可达测试网络连接检查网络或调整超时提示遇到问题时第一件事是看日志。superpowers 类工具通常会把详细的错误信息和堆栈跟踪输出到日志里。把日志级别调到 debug 或者 trace能看到更多细节。很多时候日志里的某一行就能直接告诉你问题出在哪。6. 进阶用法与个人经验分享6.1 能力组合的几种常见模式当你熟悉了单个能力的使用之后就可以开始尝试能力组合了。常见的组合模式有几种串行组合、并行组合、条件组合、循环组合。串行组合是最简单的模式就是前面例子里的 pipeline能力按顺序一个接一个执行。这种模式适合那些有明确先后依赖关系的流程比如先读取再解析再输出。并行组合是指多个能力同时执行适合那些相互独立、没有依赖关系的任务。比如你需要同时从三个不同的数据源读取数据就可以把三个读取能力并行执行等所有读取完成后再进行后续处理。并行组合能显著缩短总执行时间但需要注意线程安全和资源竞争问题。条件组合是指根据某个条件决定执行哪个能力或者跳过哪个能力。比如你有一个“如果文件存在则读取否则生成默认文件”的流程就可以用条件组合来实现。条件组合通常需要配合表达式或者脚本能力来实现条件判断。循环组合是指对一组数据重复执行某个能力或者某组能力。比如你有一个包含多个表名的列表需要对每个表都执行“生成实体类”的操作就可以用循环组合来实现。循环组合通常需要配合迭代器或者集合处理能力来实现。6.2 性能优化的几个切入点当你的流程变得复杂、处理的数据量变大之后性能就可能成为一个问题。我总结的几个性能优化切入点包括减少不必要的 IO、合理使用缓存、控制并发度、优化数据结构。减少不必要的 IO 是最直接的优化手段。比如你不需要把中间结果写到磁盘上再读回来那就在内存里传递。superpowers 类工具通常支持在能力之间直接传递数据对象不需要经过文件系统。只有在需要持久化或者跨进程传递的时候才写到磁盘上。合理使用缓存能显著减少重复计算和重复请求。比如某个能力的输出在多次执行中是不变的那就可以把结果缓存起来下次直接读缓存。superpowers 类工具通常提供缓存能力或者缓存配置你可以根据实际情况启用。控制并发度是并行组合场景下需要注意的问题。并发度太高会导致资源竞争加剧、上下文切换频繁、甚至把目标服务打挂。并发度太低又达不到加速效果。我的经验是先从较低的并发度开始比如 2 或者 4然后根据实际表现逐步调整。同时要监控 CPU、内存、网络等资源的使用情况避免出现瓶颈。优化数据结构主要针对那些需要处理大量数据的场景。比如用数组代替链表、用哈希表代替线性查找、用流式处理代替全量加载。这些优化手段在通用编程里也适用在 superpowers 的配置里可能需要通过选择合适的能力或者调整参数来实现。6.3 我踩过的几个坑第一个坑是版本升级导致的配置不兼容。有一次我把 superpowers 从旧版本升级到新版本结果发现原来能跑的配置跑不通了。查了半天才发现新版本里某个能力的参数名称变了旧配置里的参数名在新版本里被废弃了。从那以后我每次升级之前都会先看一遍 Changelog确认有没有破坏性变更然后再决定要不要升级。第二个坑是日志级别设置不当导致的问题被掩盖。有一次我跑一个批量任务结果发现有一部分数据没有处理。查了半天没找到原因后来把日志级别调到 debug 才发现原来是有几条数据在解析阶段就失败了但因为日志级别是 info失败信息没有输出所以看起来像是“没处理”而不是“处理失败”。从那以后我在开发和调试阶段都会把日志级别调到 debug确认流程完全正常之后再调回 info。第三个坑是路径基准目录理解错误。有一次我写了一个相对路径以为基准目录是当前工作目录结果实际基准目录是配置文件所在的目录导致文件找不到。后来我养成了一个习惯在配置里尽量用绝对路径或者用工具提供的变量来动态获取基准目录避免依赖默认行为。6.4 后续可以扩展的方向如果你已经把基础的 superpowers 用法跑通了接下来可以考虑几个扩展方向。一是自定义能力如果内置能力不能满足你的需求你可以按照框架的扩展规范写自己的能力模块然后注册到框架里。二是集成到 CI/CD 流程里把 superpowers 作为构建或者部署流程中的一个环节实现自动化。三是封装成服务把 superpowers 的能力通过 HTTP 或者 RPC 暴露出去供其他系统调用。四是做可视化管理给 superpowers 的配置和运行状态做一个 Web 界面方便非技术用户使用。我个人在实际操作中的体会是superpowers 这类工具的价值不在于它内置了多少能力而在于它提供了一种“把能力组合起来解决问题”的思路。你一旦习惯了这种思路就会发现自己面对很多重复性任务时第一反应不再是“手动做一遍”而是“能不能用 superpowers 组合一个流程出来”。这种思维方式的转变比学会某个具体工具的使用方法更有价值。
返回列表