跳转到内容
首页
Docs/工作流

Workflows

工作流由一个触发器和一棵步骤树组成,在你的设备上基于共享上下文运行。本页涵盖该模块的每个界面、25 种触发器、15 种操作、七种步骤、表达式、定时、密钥、分享,以及 Free 和 Pro 各自能用什么。

它是什么,以及如何打开

工作流是覆盖在应用之上的全屏窗口,不是分页器里的五个页面之一。工作流保存在你的设备上,也在设备上运行:一个主触发器(最多再加五个)和一棵由七种步骤组成的步骤树。定时运行通过 Android 的 WorkManager 进行;只要有任何运行存活,PocketCode 就会保留一条带停止按钮的通知。

打开方式

你所在的位置点按什么会打开什么
导航栏的工具面板第二行格子里的工作流该模块,停在欢迎界面
侧边菜单工具分类里的工作流该模块
Home工作流运行 小组件的任意一行(只有存在运行时,该小组件才会绘制)该模块
一条运行通知,或某个定时工作流无法启动的提示点按它该次运行的详情,或该工作流的编辑器
AI 聊天的活动面板某个工作流运行对应的一行该模块
应用之外一个链接:pocketcode://workflows、pocketcode://workflows/run/<runId>、pocketcode://workflows/<workflowId> 或 pocketcode://workflows/import?url=<https address>该模块、那次运行、那个工作流,或导入面板。链接只会打开一个界面:它自己绝不会运行、删除或下载任何东西

窗口的行为

  • 该模块是独立的窗口,所以打开期间看不到应用的其余部分。返回会上一级:编辑器回到列表,运行详情回到历史或标签页,密钥回到标签页,标签页回到欢迎界面,而欢迎界面会关闭该模块。
  • 在宽窗口(宽 840 dp 且高 480 dp 或以上,例如平板)下,列表留在左边,编辑器、历史或运行详情在右边打开。步骤设置面板(宽 360 dp)只有在编辑器旁边至少还留有 400 dp 时才会使用;否则步骤设置以面板(sheet)形式打开。
  • 也可以不打开该模块就启动工作流:通过主屏快捷方式、快速设置卡片或系统的分享菜单(见“运行与查看”)。
Workflows welcome screen on a tablet in landscape: My Workflows, and under Explore the Templates and CI / CD cards
平板横屏时的欢迎界面:我的工作流,以及探索下的模板和 CI / CD 卡片。横屏下没有从提示生成卡片。

你不能做的,以及原因

  • 从命令面板打开它:命令面板没有 Workflows 命令,Workflows 也不是分页器的一个页面。有意为之

界面地图

该模块的每个界面、面板和对话框各占一行,并说明它从哪里进入。

界面如何进入你可以做什么
欢迎界面打开该模块;从标签页按返回打开我的工作流、从提示生成(仅竖屏)、模板或 CI / CD(这两个都会打开模板标签页)。
顶栏和标签页始终在最上方在我的工作流、模板和活动之间切换。仅在第一个标签页:从文件导入工作流、管理密钥和 + 按钮(新建工作流)。当有事情会拖住定时运行时,标签页上方会显示横幅定时工作流需要处理。
我的工作流标签页第一个标签页搜索、排序、按标签筛选;开启或关闭某个工作流;运行、停止、定时、打开它的历史、删除;打开长按菜单。
标签对话框卡片菜单里的标签给一个工作流添加或移除最多 8 个标签。
模板标签页第二个标签页;欢迎界面的模板和 CI / CD 卡片搜索 17 个模板、按系列筛选、打开预览、启用或再添加一份。
模板预览点按模板卡片阅读触发时机、各步骤和需要什么,并运行不会碰任何东西的试运行(立即测试)。
活动标签页第三个标签页查看每个工作流的最近运行;在错误信息中搜索;按状态、日期和工作流筛选;停止一个正在进行的运行;打开一次运行;把筛选后的运行复制为 JSON;删除历史记录。
编辑器点按卡片、其菜单里的编辑、+ 按钮、定时工作流的提示、在编辑器中打开命名;声明输入;设置工作流设置和权限;选择触发器和过滤条件;构建步骤树;测试;保存。
步骤设置(七种面板)步骤的铅笔图标,或添加步骤配置一个操作、If / Else、循环、并行、尝试 / 失败时、子流程或等待。对于操作,还有可靠性和条件。
添加步骤面板编辑器的 + 按钮,或某个分支的 +按名称、描述或输出搜索 15 种操作和六种控制流块;使用收藏和最近使用。
插入数据选择器参数里的同名按钮选择一个输入、一个触发器字段、前面某个步骤的输出或状态,或你所在块的项或错误。
问题面板在编辑器内,步骤上方阅读错误、警告和提示,并用跳转到步骤跳到对应步骤。
转为子流程对话框步骤菜单里的转为子流程给新工作流命名,并把该步骤及其内容移进去。
运行对话框(运行输入)对带有必填输入的工作流点立即运行;在一次运行里点用这些输入运行填写已声明的输入(默认值已填好),然后按运行。
运行历史卡片上或其菜单里的运行历史查看某个工作流的运行;停止本次运行;打开某次运行。
运行详情历史或活动里的一次运行;一条通知;一个深层链接查看每个步骤(结果、耗时、尝试次数、错误、JSON 输出),跟随实时的 shell 日志,再次运行、从失败的步骤重来、用这些输入运行、用 AI 分析、复制为 JSON。
重复这次运行对话框再次运行或从失败的步骤重来确认之前,先看自那次运行以来改了什么。
定时面板(… 的计划)卡片上或其菜单里的计划列出并移除计划;添加预设或自定义 cron;设置设备条件和如果错过一次执行。
密钥管理密钥(钥匙图标)添加、更改取值或删除加密密钥;删除前先看哪些工作流在用它。
分享此工作流面板卡片菜单里的作为文件分享检查哪些密钥字段会被清空,并分享 .pcwf.json 文件。
导入工作流面板从文件导入工作流预览文件(触发器、步骤、缺少的密钥、linter 结果),并以关闭状态保存。
有链接想导入工作流一个 pocketcode://workflows/import?url=… 链接查看它来自哪个地址,然后选择下载或不用了。
从提示生成工作流和用 AI 修改「…」欢迎界面的从提示生成;卡片菜单里的用 AI 修改描述一个自动化或一处修改,检查结果,然后保存并启用或在编辑器中打开。
不可撤销步骤对话框开启一个含有不可撤销步骤的工作流;保存一个可供 AI 代理使用的工作流阅读这些步骤并作出决定:仍然启用或允许 AI。
快捷方式、卡片和发送给工作流主屏幕、快速设置和 Android 的分享菜单不打开该模块就启动工作流。
运行通知运行存活期间的通知栏跟踪第 n 步,共 m 步并按停止。

列表、标签和模板

该模块有三个标签页:我的工作流、模板和活动(最后一个在“运行与查看”里介绍)。标签页上方,仅在我的工作流上,有从文件导入工作流、管理密钥和 + 按钮(新建工作流),它会打开编辑器,里面是一个已关闭、触发器为手动或定时的空工作流。

欢迎界面

该模块总是从这里打开。从标签页按返回会回到这里;在这里按返回会关闭该模块。

你可以

  • 点按我的工作流(管理你的活动自动化)打开列表。
  • 点按从提示生成,用一句话描述一个自动化(见“AI:生成、修改和聊天”)。该卡片只在竖屏下出现。
  • 在探索下,点按模板或 CI / CD。两者打开的是同一个模板标签页:CI / CD 不会筛选任何东西。

你不能做的,以及原因

  • 从这里创建空白工作流:请用我的工作流上的 + 按钮。有意为之
  • 在横屏下看到从提示生成(手机横过来、平板横着拿):横屏的欢迎界面只有我的工作流、模板和 CI / CD。卡片菜单里的用 AI 修改仍然可用。尚未提供

我的工作流标签页

每个工作流一张卡片,显示它的状态、上次运行时间、健康圆点,以及(如果设了定时)下一次运行。

My Workflows on a tablet: tabs, the battery-optimisation banner and two workflow cards with their switches and icons
平板上的我的工作流:电池优化提示横幅、一个每次 push 都会启动的工作流,以及一个带有 ▶、时钟、历史和垃圾桶图标的手动工作流。右上角的两个图标是从文件导入工作流和管理密钥。

你可以

  • 搜索你的工作流:在名称、描述和标签里查找,忽略重音。
  • 按最近编辑、按名称、上次运行或出错的优先排序。
  • 用标签芯片筛选(全部加上你的标签,最常用的在前)。
  • 用卡片上的开关开启或关闭工作流。开启一个含有不可撤销步骤的工作流时会询问一次(见“运行与查看”)。
  • 点按 ▶ 图标运行主触发器为手动或定时的工作流;运行期间,对任何工作流(无论是什么启动了这次运行),该图标都会变成带进度环的 ■ 停止。
  • 使用时钟图标(计划)、历史图标(运行历史)和红色垃圾桶(删除)。
  • 用红色垃圾桶或卡片菜单里的删除来删除工作流。对话框会询问删除“<名称>”?(“该工作流及其计划将被删除,无法撤销。”),只有你点按删除才会真正删除;取消则保持原样。
  • 长按卡片,或使用副键点击,打开它的菜单。

你不能做的,以及原因

  • 在由事件或快捷方式启动的工作流的卡片上看到 ▶:这类工作流的立即运行在卡片菜单里。有意为之
  • 离开界面后仍保留搜索、排序或标签筛选:筛选会隐藏内容,所以每次都会重新询问。有意为之
My Workflows on a phone with the three tabs, the battery-optimisation banner and cards for verify-hello, Tests then Deploy if they pass and Prettier on Save with their health dots
手机上的同一个列表:标签页、横幅、一个带健康圆点和 成功率 100% 的工作流、一个从未运行过的工作流,以及一个最近几次运行都失败的工作流(成功率 0%)。

卡片显示什么

部分它告诉你什么
状态空闲、运行中、已完成、已失败或已取消,以及上次运行:(或从未运行)。
健康度最近 5 次运行的圆点和成功率(例如成功率 100%);没有时显示还没有已完成的运行。
触发器主触发器的标签,例如 git push 时或手动或定时。
下次:下一次定时运行,如果该工作流设有计划。
实时进度运行时显示第 n 步,共 m 步。

卡片菜单

项目它的作用
编辑打开编辑器。
用 AI 修改打开修改面板(见“AI:生成、修改和聊天”)。
启用 / 停用和开关作用相同。
立即运行 / 停止启动任何工作流的一次运行,不论它的触发器是什么;有必填输入时会先询问。运行期间该项为停止。
计划打开定时面板。
运行历史打开该工作流的运行。
复制生成一份处于关闭状态的副本,步骤 id 是新的,名称后加 copy。
作为文件分享打开导出 .pcwf.json 的面板。
标签打开标签对话框。
删除询问删除“<名称>”?,你确认之后才会删除该工作流及其计划。

标签

标签用来给列表分组,不会移动任何东西。它们存放在工作流的设置里,所以会随导出的文件一起走。

你可以

  • 从卡片菜单打开标签,在新标签里输入并添加;在同一个对话框里移除标签。
  • 按标签筛选我的工作流;芯片按使用它们的工作流数量排序。

你不能做的,以及原因

  • 给一个工作流打超过 8 个标签(最多 8 个标签。):二十个标签什么也整理不了。有意为之

模板标签页

17 个现成的工作流,按启动它们的事件分组。每张卡片显示名称、描述、触发器、用到的操作种类和需要什么:不可撤销步骤、终端命令、已连接的部署服务商、带密钥的 AI 服务商、网络、写入文件、已打开的项目。

你可以

  • 按名称、描述、触发器或操作搜索模板;用芯片按系列筛选(全部和下面的六个系列)。
  • 点按启用,得到一份可编辑的副本:它有新的 id、处于开启状态,并出现在我的工作流里;如果你已经有了,点按再添加一份。副本与模板互不共享任何东西。
  • 打开预览、运行试运行,之后在编辑器里修改副本。

你不能做的,以及原因

  • 在模板库里编辑模板:你编辑的是自己的副本。目录固定为 17 个模板。有意为之
  • 在点启用时被问到不可撤销步骤:这个问题只会在你之后拨动某个工作流的开关时才出现。启用之前请先读需要什么。尚未提供
Template gallery with the When you edit and When you use git groups and an Activate button on each card
按使用时机分组的模板库,这里是编辑时和使用 git 时。每张卡片都有它的触发器和启用。

六个系列

系列包含什么
编辑时3 个模板,全都以保存文件时启动。该系列还包含任何由文件被创建、删除、重命名或被 AI 修改而启动的内容。
使用 git 时5 个模板:三个以 git push 时启动,两个以 git commit 时启动。
部署前后1 个模板,以部署完成启动。该系列还涵盖部署失败。
出问题时1 个模板,以检测到错误启动。该系列还涵盖构建或运行结束。
来自手机1 个模板,以分享到 PocketCode 的文本启动。该系列还涵盖主屏快捷方式、快速设置卡片和分享来的文件。
手动触发或按计划6 个以手动或定时启动的模板:由你运行,或者用时钟按钮添加计划。

17 个模板

模板触发时机它做什么、需要什么
保存时运行 Prettier保存文件时,针对 .js 文件对你刚保存的文件运行 prettier --write,而不是对整个项目。
保存 Kotlin 文件时自动 commit保存文件时,针对 .kt 文件只提交被保存的那个文件,提交到当前检出的分支,不会 push。保存时没有真正的改动不算失败。
只 lint 你刚保存的文件保存文件时,针对 .ts 文件等待两秒,对该文件运行 eslint,只有发现问题时才通知。等待期间再次保存会取消待执行的那次运行。
先测试,通过再部署git push 时运行测试命令,只有它以 0 退出时才请求部署;否则只发通知,不部署任何东西。需要在 Backend Manager 里连接好部署服务商。
push 到 main 自动部署git push 时,过滤 mainpush 到 main 之后部署,并通知状态和 URL。
push 到 main 之后跑测试git push 时,过滤 mainpush 到 main 之后运行测试套件,并通知其退出码(它无法阻止 push)。
每次 commit 跑测试git commit 时commit 之后运行测试,并通知退出码和提交信息。它只对从 Projects 做的提交触发。
只测你动过的模块git commit 时对该次提交涉及的目录(最多 20 个)做一个循环,每个目录运行一次测试命令;某个模块失败不会让其余的停下。限制与上面相同:只对从 Projects 做的提交有效。
部署后备份数据库部署完成运行一次 pg_dump 并报告生成的文件;请把命令改成适合你自己数据库的样子。
用 AI 分析失败的工作流检测到错误把错误发给 AI,并把回答通知给你。需要带密钥的 AI 服务商。卡片上说它只看得到工作流的失败;而目前该触发器也会收到编辑器的构建和运行错误,以及 AI 运行的失败终端命令。
每晚备份手动或定时把你的数据库导出到项目的一个文件夹里,只在失败时通知你。从时钟按钮附加一个计划(例如每天 9:00):计划不是触发器。
测试你选的分支手动或定时询问一个分支(默认 main),在已打开的项目里检出它并运行测试。它会改动你的工作树:请先 commit 或 stash。
用最近的 commit 生成发布说明手动或定时读取最近 20 个 commit,请 AI 写发布说明,并写入 RELEASE_NOTES.md,会覆盖原文件。需要 AI 服务商。
检查一个接口手动或定时一个 GET 请求,并通知状态码和耗时。URL 有默认值,所以你设置好自己的地址后它可以无人值守运行。
同时检查三个接口手动或定时询问三个 URL 并并行调用它们,等待三个都完成。打开该次运行可以看到每个状态码。
部署,失败也要告诉我手动或定时在部署外面包一层尝试 / 失败时,无论结果如何都会通知。需要已连接的部署服务商。
把分享来的链接存进 links.md分享到 PocketCode 的文本把从任意应用分享来的页面追加到已打开项目里的 links.md,绝不覆盖它。

模板 id 永远不变,所以从某个模板创建的工作流会一直保留与该模板的关联。

模板预览

点按模板卡片,在启用之前先看它会做什么。

你可以

  • 阅读触发时机、带分支的步骤树(如果成立、否则、尝试执行、如果失败)和需要什么。
  • 用立即测试运行一次试运行。如果模板有必填输入,默认值会自动填好。预览会说明哪些步骤因无法模拟而被跳过,或者缺少什么,并以 n 个步骤 · n 毫秒 · 不保存 结尾。

你不能做的,以及原因

  • 对声明了没有默认值的必填输入的模板做试运行:预览会显示缺少以下内容,无法试运行:并写出该输入的名称。目前 17 个模板里没有一个这样,而缺少部署服务商或 AI 密钥并不会阻止测试。有意为之

编辑器

点按卡片、其菜单里的编辑,或者用 + 按钮新建工作流,即可打开编辑器。从上到下依次是:名称和描述、输入、工作流设置(折叠)、权限(自己独立的折叠卡片)、已启用和可供 AI 代理使用开关、触发器,以及带步骤树和 + 按钮(添加步骤)的步骤。顶栏有关闭、撤销、重做、立即测试和保存。撤销保留最近 100 个状态,并合并 800 毫秒内同一类型的连续编辑。关闭(x 或返回)时,如果工作流可以保存就会保存;如果里面有暂时无法保存的内容,会询问放弃更改?(继续编辑或放弃);什么都没写时则直接关闭。有错误时保存不可用:名称为空、没有步骤、必填参数为空或输入无效。

Two panes on a tablet: the workflow list on the left and the Edit workflow screen on the right with Inputs, Workflow settings, Permissions, Enabled, Available to AI agent and Trigger
宽窗口下的双栏:左边是列表,右边是编辑器,工作流设置和权限是各自折叠的卡片,下面是已启用、可供 AI 代理使用和触发器。

名称、开关和 AI 可见性

名称和描述在最上方。已启用(关闭时工作流仍会保存,但不运行)和可供 AI 代理使用(开启时聊天代理可以把它当作工具调用)排在设置之后,还有展示给 AI 的描述:如果留空,就使用工作流的描述。

你可以

  • 切换已启用:它和卡片上的是同一个开关。
  • 切换可供 AI 代理使用并填写展示给 AI 的描述。开关开启且工作流含有不可撤销步骤时保存,会询问一次允许 AI 运行此工作流?(允许 AI)。
  • 当一个暴露给 AI 的工作流里,shell 步骤包含 {{…}} 绑定时,请阅读安全警告:聊天代理可能通过输入把文本注入命令。

你不能做的,以及原因

  • 让代理调用一个已关闭的工作流:只有同时可供 AI 代理使用且已启用的工作流才会向聊天宣告。有意为之
The workflow editor on a phone: name, description, Inputs, Workflow settings, Permissions, and the Enabled and Available to AI agent switches
手机上的编辑器:名称、描述、输入、工作流设置、带摘要句的权限,以及已启用和可供 AI 代理使用两个开关。

输入

工作流运行时向你索取的值。你可以在任何地方以 {{var.<name>}} 读取它们。

你可以

  • 添加输入,包括名称(字母、数字和 _,不能以数字开头,且唯一)、类型(文本、长文本、数字、是 / 否、选择、JSON)、必填、默认值、选项(用逗号分隔,用于选择)、标签和描述(询问时显示,也会展示给 AI)。可以上移或下移输入,也可以移除。
  • 用立即运行运行它:带有必填输入的工作流会打开运行对话框并填好默认值,所以你只需改需要改的部分。

你不能做的,以及原因

  • 带着无效输入保存:名称为空、无效或重复,选择类型没有选项,或默认值不在选项里、或不是数字,都会让保存无法使用。有意为之
  • 让必填输入没有默认值的工作流自己启动:定时运行、事件、快捷方式或卡片都没有人可问。编辑器会用必填但无默认值警告,调度器会记录一次失败的运行。有意为之

工作流设置

一张可折叠的卡片(显示 / 隐藏),放的是针对整次运行的设置。

你可以

  • 整次运行上限(秒):留空即无上限。用完时,这次运行会像你手动停止一样被取消。
  • 当某步骤失败时:停止或继续。这是每个步骤继承的默认值。写了继续的步骤保留自己的选择;但当工作流设为继续时,没有任何步骤能再要求停止。
  • 当已有运行在进行时:跳过新的(默认)、排队等待(每个工作流最多 10 个在等)或取消进行中的运行。它适用于事件触发器和定时运行;手动运行和由 AI 启动的运行不受它限制。
  • 保留的历史记录:保留的运行次数和保留天数。留空表示默认值(100 次运行、30 天);你可以设置 1 到 1000 次运行和 1 到 365 天。较旧的运行会在该工作流下一次运行时被清理,而不是在你保存时。

你不能做的,以及原因

  • 为被跳过新的丢弃的事件留下记录:在默认策略下,工作流正在运行时到达的事件会被直接丢弃,历史里没有任何条目,这是有意为之:否则一连串保存会让每个事件都写一行。(被队列或应用级上限拒之门外的运行,会记为已取消并附上原因。)有意为之

权限

工作流设置下面自己独立的可折叠卡片,这样唯一可能让步骤停止运行的那个决定,永远不会藏在下拉菜单里。摘要句即使在卡片折叠时也能看到。默认一切都允许。

你可以

  • 切换访问网络(HTTP 请求、AI 步骤、部署,以及 git push 或 pull)、写入文件(写入、检出和备份;读取永远不受影响)和执行终端命令(数据库备份步骤的命令也算)。
  • 添加允许访问的域名:留空表示任意域名,github.com 也涵盖 api.github.com,你粘贴的内容会被清理(去掉协议、路径和端口)。
  • 记住子流程的一条规则:子流程以自身权限与父流程权限的交集运行,如果两个域名列表没有任何交集,网络就是关闭的。

你不能做的,以及原因

  • 把权限当作安全边界:摘要的结尾是“这不是沙箱:任何能编辑该工作流的人都能改动这些权限。”它们保护你免于粗心,而不是防范恶意的作者。有意为之
  • 让域名列表限制 AI、部署或 git 步骤:该列表只覆盖 HTTP 请求步骤,摘要里也这么说。有意为之
  • 从域名列表得到对 SSRF 的防护:比较的是主机名,而不是它解析到的地址,HTTP 步骤可以访问 127.0.0.1 或 10.x。有意为之
Permissions card with a summary sentence saying the workflow can go out to the network, write files and run terminal commands, and that it is not a sandbox, above the Enabled and Available to AI agent switches
权限卡片:一句话说明工作流可以做什么,并指出它不是沙箱。下面是已启用和可供 AI 代理使用。

触发器

一个工作流有一个主触发器,总共最多六个(添加触发器、设为主触发器)。当其中两个匹配同一个事件时,只会启动一次运行,且以主触发器为准。在下拉菜单里选择类型:共有 25 种。许多触发器带有数据,你可以用 {{trigger.<field>}} 读取;各字段列在表格里。

你可以

  • 选择 25 种类型中的任意一种,最多添加 6 个触发器,并把其中一个提升为主触发器。
  • 构建一个带类型的过滤(见下),让工作流只在你关心的事件上启动。
  • 在捕获下一个事件下按捕获:编辑器会监听 60 秒,显示该类型下一个事件的真实数据,并把它保留为插入数据用的示例数据。
  • 按分支过滤 git push 时(例如 main):发出 push 的四个地方(Projects 两处、编辑器的 Git 面板和 AI 聊天)都会带上当时检出的分支,所以 push 到 main 自动部署和 push 到 main 之后跑测试会触发。

你不能做的,以及原因

  • 使用项目已关闭和 AI 完成了回合:它们在下拉菜单里,但应用里没有任何地方会发出它们,所以以它们启动的工作流永远不会触发。linter 会警告(“目前应用中没有任何地方发出 PROJECT_CLOSED,因此该工作流不会被触发。”),捕获则提示“应用中还没有任何地方发出该触发器,再等也没用。”尚未提供
  • 由在编辑器的 源代码管理 面板或 AI 聊天里做的提交来启动:git commit 时只对从 Projects 做的提交触发。尚未提供
  • 过滤四种系统触发器(主屏快捷方式、快速设置卡片、分享到 PocketCode 的文本、分享到 PocketCode 的文件):它们由 Android 启动,启动器只按类型选择工作流,所以过滤会被忽略。尚未提供
  • 当命令是在交互式终端里输入时,从命令已完成读取真实的退出码:该事件的 exitCodeKnown 为 false。尚未提供
  • 添加第七个触发器或第九个条件(最多 6 个触发器。和最多 8 个条件。)。有意为之
Trigger type dropdown listing On git push, On git commit, On file save, Deploy completed, Deploy failed, An error was detected, App opened and Command finished, over a saved text filter
触发器类型下拉菜单,以及一个用旧的自由文本过滤(.js)保存的工作流,带有转换为条件。
Trigger section with On git push, the message No condition: this trigger fires with every event of its type, Add condition and Capture the next event
没有条件的触发器会用文字说明这一点,捕获下一个事件(捕获按钮)会监听一个真实事件。

25 种触发器

Git(2)

git push 时从 Projects、编辑器的 Git 面板或 AI 聊天 push 之后。字段:projectId、projectName、branch(被推送的分支,例如 main)。
git commit 时从 Projects 提交之后。字段:projectId、projectName、message、branch。

文件(4)

保存文件时字段:filePath、language、linesChanged。
文件已创建字段:filePath、fileName。
文件已删除字段:filePath、fileName。
文件已重命名字段:filePath、previousPath。

项目和构建(5)

项目已打开当你选中一个项目时。字段:projectId、projectName。
项目已关闭列在其中,但没有任何东西会发出它:它永远不会触发。
构建已完成字段:status、exitCode、durationMs、output。
运行已完成字段:filePath、runtime、exitCode、output。
命令已完成字段:command、exitCode、output、exitCodeKnown。

部署、数据和工具(5)

部署完成字段:provider、projectName、status、url。
部署失败字段:provider、projectName、error。
查询已执行字段:data、format、rowCount、columns。
API 测试器响应字段:url、method、status、durationMs。
设计已导出字段:designId、designName、format。

错误和 AI(3)

检测到错误会收到另一个工作流的失败、编辑器的构建和运行错误,以及由 AI 运行、退出码不是 0 的终端命令。工作流永远不会触发自己。字段:source、message、filePath、exitCode、workflowId、workflowName、error。
AI 修改了文件由 AI 代理写入的文件。它特意与保存文件时分开:自动写入不应触发你为自己的工作搭建的自动化。字段:filePath、fileName。
AI 完成了回合列在其中,但没有任何东西会发出它:它永远不会触发。

应用和手动(2)

应用已打开当应用回到前台时。字段:sessionId。
手动或定时没有数据。你用 ▶ 或立即运行启动的、计划启动的、以及 AI 聊天运行的,都用它。

来自 Android(4)

主屏快捷方式没有数据。见“运行与查看”。
快速设置卡片没有数据。
分享到 PocketCode 的文本字段:text、subject。
分享到 PocketCode 的文件字段:uri、fileName、mimeType。

带类型的过滤

在触发器下,添加条件(最多 8 个)会给出字段(该触发器的字段)、比较和值。用全部或任一把它们连起来,并可以给其中任何一个加上取反。没有条件时,编辑器会说“没有条件:该触发器对此类型的每个事件都会触发。”更改类型会丢弃字段在新类型中不存在的条件,并告诉你。用旧的自由文本过滤保存的工作流会把它保留为文本过滤,仍然有效,并带有转换为条件。

比较它的作用
等于字段等于该值。
包含字段包含该值。
开头为 / 结尾为字段以该值开头或结尾。
匹配路径针对路径字段的 glob:一个 * 停留在一个文件夹内,两个可以跨文件夹,开头的点匹配扩展名。
属于字段是用逗号分隔的若干值之一。
为空字段没有值。
大于 / 小于数值比较。只要有一边不是数字,条件就不匹配。

步骤:树、卡片和面板

步骤列表是一棵树:块嵌套在块里。步骤按 2、2.1 编号;else 分支写作 2.e1,catch 分支写作 2.c1,并行分支写作 2.<n>。块可以折叠(折叠 / 展开),嵌套很深的步骤会得到类似嵌套 5 层的提示,说明它照常运行,只是在手机屏幕上放不下了。

你可以

  • 点按 + 按钮(添加步骤)打开面板:按名称、描述或输出搜索(“名称、说明或输出(stdout、url…)”),选择一个分类芯片(Shell、Git、部署、AI、数据、HTTP、文件、控制、通知、其他),并使用收藏和最近 5 次使用。每一项显示它产出什么(产出:…),并标出不可撤销、执行命令、访问网络、写入文件或无法模拟。新步骤落在你选的位置的末尾,并打开它的设置。
  • 每张卡片上:排序把手、编号、标题和一行摘要、已启用 / 已停用开关(已停用的步骤会被跳过,且不算失败)、如果此步骤失败芯片、测试此步骤、铅笔(打开设置并选中该步骤)和 ⋮ 菜单。
  • 菜单里有:上移、下移、复制步骤、粘贴到下方(只有剪贴板里有 PocketCode 步骤时才可用,所以你可以粘贴到另一个工作流里)、复制、备注(只在编辑器里显示)、转为子流程和删除。
  • 识别固定数据:带有固定输出的步骤,其卡片上会显示示例数据。

你不能做的,以及原因

  • 把步骤拖进另一个块:把手在自己的列表里每拖 48 dp 就把步骤移动一个位置;请用菜单里的上移和下移。有意为之
  • 把流程画成图,或使用 N 路 switch 或自由合并:流程是一棵嵌套的树,If / Else 正好有两个分支,并行用三种策略之一合并它的分支。有意为之
  • 编辑应用不认识的步骤(未知步骤,由更新的版本写入):它会原样保留,只能移动或删除。有意为之
Add step sheet with a search box, category chips and the Run terminal command and Git operation entries showing what they give back
添加步骤:按名称、描述或输出搜索,有分类标签,并显示每个操作的产出。Git 操作下的提示比操作本身旧:它处理七种操作,而不是三种。
Step tree with an If step, steps 2.1 and 2.2 under If it matches and 2.e1 under Otherwise
来自先测试,通过再部署模板的分支:2.1 和 2.2 在如果成立之下,2.e1 在否则之下。部署因为无法模拟,所以提供真实执行此步骤。

七种步骤

种类它做什么你设置什么
操作运行 15 种操作之一。该操作的参数。只有操作才有:可靠性(重试、超时)和条件(何时)。
If / Else条件为真时运行如果成立,为假时运行否则。一棵由且、或和非组成的条件树。
循环对列表的每一项重复它的步骤。要遍历的列表、每一项的名称(以 {{item.<name>}} 读取)、最多迭代次数(默认 100,绝不超过 10 000)和同时进行的迭代数(1 表示一个接一个运行,最多 16)。
并行同时运行多个分支。分支(添加一个,或移除一个空的)和何时继续:全部完成时、第一个完成时或第一个成功时。后两种会取消落败的分支,不管进行到哪一步,也不管它们的副作用。
尝试 / 失败时运行尝试执行;如果其中任何一步失败,就运行如果失败。错误的名称(默认 error,以 {{var.error}} 读取,最多 4 096 个字符)。
子流程用你给它的值运行另一个工作流,并使用它的最后一个结果。要运行的工作流和子流程的取值。最多嵌套 5 层,不能递归,权限是与父流程权限的交集。
等待让工作流暂停一段时间,或直到某件事发生。以毫秒计的时间,或等待某个事件,配合等待的事件、一个可选的过滤(规则与触发器相同)和上限(毫秒)(不设置则为 5 分钟)。

操作

十五种操作,分属面板的八个分类。每一种都列出你可以用 {{step.<id>.output.<key>}} 读取的输出;下面的名称就是这些 key。标签是面板显示的英文标签。

Shell(1)

运行终端命令在终端的 shell 里运行一条命令。参数:command、cwd、env、failOnNonZero(默认开启)、timeoutMs。输出:command、exitCode(被上限杀掉时为 -1)、stdout、stderr(各限 64 KB,保留开头和结尾)、durationMs、timedOut。

Git(1)

Git 操作七种操作:status、commit、push、pull、checkout、log、diff。参数:operation、message、branch(字母、数字、.、_、/、-)、n(默认 20)、path、projectPath。输出:sha、branch、changedFiles、ahead、behind、text。只有 push(或来自绑定的操作)算不可撤销;commit、pull 和 checkout 会写入文件;status、log 和 diff 什么都不碰。diff 按文件进行。

部署(1)

触发部署在 render、netlify、digitalocean 或 railway 上触发一次部署,并等待服务商的结论(默认 15 分钟,1 到 60 分钟)。参数:provider、project、timeoutMs;branch 和 env 会被记录但不生效。输出:status、url、provider、projectName、logsTail、durationMs、timedOut。它无法模拟:立即测试会跳过它,步骤测试则提供真实执行此步骤。在 Free 上,当该项目已有一次部署在进行中(排队、构建或部署中)时,它会失败并显示“需要升级才能触发另一个活跃部署”,同时你会看到一条提示,说明该操作需要 PocketCode Pro。

AI(2)

请求 AI 分析把一条提示(可附带上下文)发给你当前启用的 AI 服务商。参数:prompt、context、outputFormat(TEXT 或 JSON)、schema。输出:text、json(仅 JSON 模式)和 tokensEst,这是本地估算的 token 数,不是服务商的计数。
请求 AI 生成同上,但以代码生成的方式提问。参数:prompt、context、language。输出:text、tokensEst。它不会写文件;请用写入文件配合它的 text。

数据(4)

查询数据库对一个命名连接运行 SQL:neon、supabase、turso、upstash 或 cloudflare(D1),或对你已保存的某个 PostgreSQL 连接(按名称或 id)。参数:connection、sql、maxRows(默认 200,最多 5 000)、allowWrites。输出:rows、rowCount、columns、truncated、durationMs、message、writes。带有写入动词(DROP、DELETE、TRUNCATE、UPDATE、INSERT、ALTER、CREATE、GRANT)的查询,或来自绑定的 SQL,算不可撤销,除非开启 allowWrites,否则会失败。面板的提示称它为只读;其实不是。
备份数据库运行你自己的备份命令(例如 pg_dump);没有命令时,只能复制 PocketCode 的内部数据库。参数:connection、command、outputDir、timeoutMs(10 分钟)。输出:filePath、sizeBytes、tables、exitCode、stdout、stderr、timedOut、durationMs。
设置变量参数:name、value。输出:name、value。它会为后面的步骤写入 {{var.<name>}}(也可以用 {{step.<id>.output.value}} 读取该值)。试运行(立即测试)不会写入该变量。
转换值用过滤器计算一个 expression 并返回 value。没有副作用,试运行与真实运行的结果相同。

HTTP(1)

HTTP 请求参数:method、url、headers(JSON)、authorization(一个密钥)、body、contentType、timeoutMs(1 000 到 120 000,默认 30 000)、followRedirects。输出:status、headers、body(最多 128 KiB)、json、durationMs、bodyTruncated、finalUrl、redirects。只支持 http 和 https;最多 5 次重定向,凭据绝不会带到另一个 origin。

文件(4)

读取文件参数:path。输出:content(最多 128 KiB)、sizeBytes、exists、contentTruncated、filePath。
写入文件参数:path、content、append。输出:filePath、sizeBytes、bytesWritten、overwritten。它从不算作不可撤销,即使是覆盖时也一样。
检查文件是否存在参数:path。输出:exists、isDirectory、sizeBytes、filePath。
在编辑器中打开文件参数:file、line。输出:opened(只有编辑器在 1.5 秒内确认才为 true,所以应用在后台时为 false)、file、line。

通知(1)

显示通知参数:title、message、deepLink(只能是 pocketcode://workflows/…)、importance(LOW、DEFAULT、HIGH)。只有 HIGH 使用 Workflows · 提醒渠道;其余都进静音的 Workflows 渠道。输出:notificationId、delivered(表示事件已发往通知系统,不代表你看到了;试运行时为 false)、deepLink、importance。
  • 三个会读写的文件操作(读取文件、写入文件、检查文件是否存在)被限制在项目根目录内;运行终端命令和 Git 操作则没有这个限制。
  • 在面板里,不可撤销标的是该类型的最坏情况;确认对话框、步骤测试和问题面板看的是你实际输入的值。

你不能做的,以及原因

  • 部署到任意服务商:只有 render、netlify、digitalocean 和 railway 有触发部署的调用,而且分支和环境不会生效。第三方
  • 查询不是远程 PostgreSQL 的已保存连接(内置的本地数据库、MySQL 等):工作流只能访问 neon、supabase、turso、upstash、cloudflare(D1)和你已保存的 PostgreSQL 连接。第三方
  • 不带命令地备份任意数据库:没有 command 时,该步骤只能复制 PocketCode 的内部数据库。尚未提供

条件:If / Else 和 何时

If / Else 步骤包含一棵条件树和两个分支。操作类步骤在条件下还可以带有何时(表达式):当表达式解析为空、false、0 或 null 时,该步骤会被跳过。何时只存在于操作步骤上。

你可以

  • 用添加条件和添加分组构建条件,用且、或和非组合,并使用分组和移除。空分组总是匹配。
  • 查看条件成立或条件不成立,它是用你固定的示例数据计算的,不是用下一次运行。

你不能做的,以及原因

  • 把何时放在循环、并行、try、子流程、等待或 If / Else 上:只有操作步骤才有。有意为之
运算符何时为真
等于 / 不等于两个值相等,或不相等。
大于 / 小于数值比较。
大于或等于 / 小于或等于数值比较,包含相等。
包含 / 开头为 / 结尾为文本比较。
匹配一个正则表达式(请保持简短)。
属于该值是用逗号分隔的若干值之一。
为空值 / 为空 / 为真检查值本身。
总是总是为真。

变量和表达式

任何参数都可以填字面值,或写在双花括号之间的表达式:{{ root.field[0] | filter:"arg" | filter }}。插入数据会打开一个选择器(输入、触发器、之前的步骤、步骤状态,以及你所在块的项或错误),所以你永远不用手输步骤 id;它会提示“在分支内:可能未执行。”和“在循环内:仅保留最后一次迭代。”无法解析的引用会得到空字符串。\{{ 会写出字面的 {{。过滤器的参数一律放在双引号里:replace:a:b 是语法错误,replace:"a":"b" 才行。

你可以

  • 在任何引用之后用 | 串联过滤器。
  • 把某个输出固定为示例数据,让插入数据和 If / Else 可以用它来预览。

你不能做的,以及原因

  • 在表达式里添加自己的函数或运行代码:13 个过滤器的列表是封闭的,没有用户函数,也没有 eval;过长的路径、过长的过滤器链,或花括号之间的文本在解析时会被拒绝。有意为之
表达式解析为
{{var.<name>}}已声明的输入(包括用这些输入运行的值,以及定时或快捷方式的默认值)、尝试 / 失败时的错误名称、子流程传给其子流程的值,以及设置变量步骤写入的值(试运行不会写入)。
{{step.<id>.status}}SUCCESS、FAILURE、SKIPPED、TIMED_OUT,或对仍在进行的步骤是 RUNNING。
{{step.<id>.output}}该步骤的输出映射,或其中一个字段:{{step.<id>.output.json.items[0].name}} 用 [n] 深入 JSON。
{{step.<id>.error}}失败步骤的错误信息。
{{item.<alias>}}循环当前的项(直接写别名也行)。
{{trigger.<field>}}启动该次运行的事件的数据;{{trigger.type}} 说明是该工作流的哪个触发器(没有事件时为 MANUAL)。
{{secret.<NAME>}}一个已保存的密钥。它是终点:不能再往里走。

13 个过滤器

过滤器它的作用
lines把文本拆成行;末尾的一个换行会被丢掉。
first / last列表的第一项或最后一项,或文本的第一个或最后一个字符。为空时会失败。
trim / upper / lower去掉空格、转大写、转小写。
length列表的项数或文本的字符数。
json把值渲染为 JSON。
default:"x"值缺失或为空时的备用值。
split:","按分隔符把文本拆成列表。
join:","用分隔符把列表连起来。
date:"HH:mm"把以 epoch 毫秒表示的日期或 ISO 日期按设备时区格式化。
replace:"a":"b"替换文本;要被替换的文本不能为空。

示例

{{step.<id>.output.stdout | lines | first | trim}}命令输出的第一行,去掉空格。
{{step.<id>.output.json.items[0].name | default:"none"}}JSON 响应里的某个字段,带备用值。
{{trigger.filePath | replace:"src/":""}}去掉前缀的已保存文件路径。

循环、并行、尝试 / 失败时和子流程

树里的各种块,以及实际中要紧的限制。

你可以

  • 循环:最多 10 000 次迭代(默认 100),同时最多 16 个;当同时进行的迭代数大于 1 时,它们分批运行。
  • 并行:全部完成时会等待每个分支,只要有一个失败就失败;第一个完成时和第一个成功时会取消其余分支。
  • 尝试 / 失败时:失败分支在 {{var.<name>}} 里读取错误信息;失败仍会显示在历史里。
  • 子流程:把一部分只做一次,从多个工作流调用它;转为子流程会把一个步骤及其全部内容提取成一个已关闭的新工作流,并在原处留下一个子流程步骤,同时列出将会失效的引用(它们会静默解析为空值,抽取后请检查。)。

你不能做的,以及原因

  • 嵌套子流程超过 5 层,或让工作流调用自己:递归的子流程会被跳过,linter 会警告。有意为之
  • 循环超过 10 000 次,或同时运行超过 16 个迭代,不管字段里怎么写。有意为之

重试、超时和失败

打开某个操作步骤的设置,展开可靠性。这些字段只存在于操作步骤上。

你可以

  • 设置最大尝试次数(1 表示不重试)、重试间隔(文本字段:EXPONENTIAL、LINEAR 或 FIXED)、初始延迟(毫秒)、最大延迟(毫秒)和超时(毫秒)(留空表示无上限)。
  • 依赖超时也会被重试:超时的步骤会被标为 TIMED_OUT,如果还有剩余尝试次数,它会像其他失败一样再次运行。
  • 选择如果此步骤失败:停止(运行在此结束)、继续(继续往下,失败留在历史里)或使用工作流的设置。选了继续,该步骤仍显示红色,而整次运行仍可能以绿色结束。
  • 在运行详情里查看结果:第 n 次尝试成功,或者从未成功时的尝试 n 次。

你不能做的,以及原因

  • 给循环、并行或其他控制块设置重试或超时:这些字段只存在于操作步骤上。整个工作流的上限在工作流设置里。有意为之

测试步骤、固定数据、测试工作流

你可以不运行整个工作流就试一试。

你可以

  • 点按测试此步骤:它用你固定的数据作为上下文来模拟该步骤,并显示已模拟,用时 n 毫秒:未触碰任何东西。当某个引用指向没有固定输出的步骤时,会提示以下步骤没有固定输出:…。
  • 当操作无法模拟(目前只有触发部署),或你输入的值会是不可撤销的,按钮会变成真实执行此步骤。它会先询问:只运行那个步骤,工作流的其余部分不受影响,这次运行也不会存入历史。
  • 把某个步骤的输出固定(以及取消固定)为示例数据,供选择器和预览使用。固定的输出保存在设备上,每个工作流最多 50 个步骤,14 天后会被丢弃。
  • 点按立即测试(或按 Ctrl+Enter)对整个工作流做试运行,按屏幕上的样子,而不是上次保存的样子。它会显示测试通过或测试失败,以及 n 个步骤 · n 毫秒 · 不保存。试运行不保存运行,也不触发任何事件。

你不能做的,以及原因

  • 单独测试控制流块:“只有动作步骤可以单独测试:测试分支或循环等于执行它内部的步骤。”有意为之
  • 在试运行里使用密钥:它们不会被解析,步骤会被跳过,并告诉你它用了哪些密钥。有意为之
  • 导出或同步固定的输出:它们留在设备上。有意为之

问题

linter 在你编辑时运行,列出错误、警告和建议,并各带一个计数。每一行都写明规则、步骤(步骤:…或整个工作流),并带有跳转到步骤。什么都没有时会显示没有需要修复的问题。同一个 linter 也会检查 AI 生成的内容和你导入的内容。

你可以

  • 修复警告所指的问题,或者不管它:只有属于错误的那三条规则会阻止保存。
  • 用跳转到步骤直接跳到对应步骤。

你不能做的,以及原因

  • 带着错误保存(名称为空、没有步骤、必填参数留空):三条错误规则针对的是会让工作流无法读取或无法保存的情况。其余的,包括权限规则,只警告而不阻止,因为想关闭网络的人通常会在删除用到网络的步骤之前先这样做。有意为之
Problems panel with one warning about an unquoted binding and Go to step, above a step card with On, default: Stop and Test this step
步骤上方的问题面板:一条关于绑定未加引号就进入命令的警告,带有跳转到步骤。卡片显示已启用、默认:停止 和测试此步骤。

34 条规则

分组规则
结构(6)错误:工作流没有名称;没有步骤。警告:空的分支;永远不会运行的步骤。建议:只有一个分支的并行;嵌套太深。
参数(3)错误:必填参数为空。警告:该操作没有的参数;没有任何已安装的宿主能处理的操作类型。
引用(7)全是警告:永远无法解析的引用;读取了稍后才运行的步骤的引用;步骤不返回的输出;触发器不携带的触发器字段;未声明的变量;对已关闭步骤的引用;未加引号就进入 shell 命令的引用。
触发器(3)警告:没有任何东西会发出的触发器;对触发器不携带的字段的过滤。建议:同一个触发器带着相同的过滤出现两次。
循环(3)全是警告:没有要遍历的列表;别名已被占用;没有别名。
可靠性(2)警告:荒谬的超时;荒谬的重试。
安全(2)警告:以明文输入的密钥;只会自行运行的工作流里有不可撤销的步骤。
权限(4)警告:在对应权限关闭时仍访问网络、写入文件或运行命令的步骤;访问了不在列表里的域名的步骤。
一致性(4)警告:暴露给 AI 却没有描述;事件触发器上有无默认值的必填输入;递归的子流程;指向空无一物的子流程。

运行与查看

每次运行结束时都会写入历史:每个步骤的结果、耗时、用了几次尝试以及它的错误。保留多少由每个工作流在工作流设置里设定:1 到 1 000 次运行和 1 到 365 天(默认是 100 次运行和 30 天)。凡是能启动运行的,也都能停止它。

启动和停止运行

运行可以由触发器、▶ 或立即运行、计划、AI 聊天,或者快捷方式、卡片或分享菜单启动。在所有工作流之间,应用最多同时运行 8 个,并最多让 16 个等待最长 120 秒;超出之后,该次运行会被记为已取消,原因是“应用同时运行的工作流已经过多”。

你可以

  • 在主触发器为手动或定时的工作流卡片上点按 ▶,或在任何工作流的菜单里点立即运行。如果它声明了必填输入,会先打开运行对话框(“此工作流启动前需要这些值。”),默认值已填好。
  • 从卡片、菜单、历史、活动、运行详情或通知里停止它。这次运行会以已取消结束。
  • 开启一个含有不可撤销步骤的工作流:会弹出标题为“此工作流包含不可撤销的操作”的对话框,列出这些步骤(第 n 步 · …),你选择仍然启用。每个工作流只问一次,并记在设备上,不同步也不导出。
  • 保存一个开启了可供 AI 代理使用且含有不可撤销步骤的工作流:允许 AI 运行此工作流?(允许 AI),同样只问一次。没有这个许可,代理的工具会拒绝运行它,并告诉模型该去问谁。

你不能做的,以及原因

  • 在点模板的启用、用生成器的保存并启用,或导入文件时被问到不可撤销步骤(导入的工作流是关闭的,问题要在你开启它时才出现)。尚未提供
  • 在覆盖文件时得到警告:写入文件从不算作不可撤销,即使是覆盖时也一样;它的 overwritten 输出会在事后告诉你。只有 Git 的 push(或来自绑定的 Git 操作)以及带写入动词的 SQL(或来自绑定的 SQL)才算。有意为之

活动标签页

每个工作流的最新运行,正在进行的排在前面,每次 50 条。

你可以

  • 在错误信息中搜索:它会查找该次运行的信息和每个步骤的信息。
  • 按状态(已完成、已失败、已取消)、日期(任意日期、今天、最近 7 天、最近 30 天)和工作流(全部工作流,包括你已经删除的工作流)筛选;清除会移除筛选。
  • 加载更多会再加 50 条,可以停止一个正在进行的运行,点按某次运行即可打开它的详情。
  • 用导出为 JSON 把筛选后的运行复制为 JSON:它会把文本放进剪贴板。
  • 确认之后删除历史记录(“运行记录会消失,工作流本身不变。”),可以针对所有工作流,也可以只针对被筛选的那一个。

你不能做的,以及原因

  • 回溯到比最近 500 次运行更早:“此页面最多显示到这里。请缩小筛选范围以查找更早的记录。”有意为之
  • 把历史导出成文件:导出为 JSON 只会复制文本。尚未提供

单个工作流的运行历史

卡片上的运行历史会列出该工作流的运行,最新的在前。

你可以

  • 查看每次运行的状态和时间、步骤数、由 … 触发,对已取消的运行还有由 … 取消;仍在进行的运行带有进行中。
  • 停止本次运行,或打开某次运行查看详情。
  • 还没有任何运行时会显示“暂无运行——触发此工作流以开始记录历史。”

你不能做的,以及原因

  • 用文字读到每一种取消原因:应用只翻译了上一次执行仍在进行、队列已满和“应用同时运行的工作流已经过多”;其他原因(user、timeout、superseded、scope)会按原始单词显示。尚未提供

运行详情

从历史、活动、运行通知或深层链接打开一次运行。

你可以

  • 阅读顶部信息(状态、耗时、触发器、是谁中止的)和每个步骤:结果、耗时、第 n 次尝试成功或尝试 n 次、错误,以及可以展开和复制的 JSON 树形输出。运行结束时仍在进行的步骤显示已中断;之后已从工作流中移除的步骤显示该步骤已不在此工作流中。
  • 运行期间跟随 shell 的实时输出,搜索它(搜索日志)并复制它(复制日志)。每个步骤只保留最后 500 行,丢弃了较早的行时界面会说明。
  • 用 AI 分析整次运行,或在某个步骤上用 AI 分析:它会打开聊天,并带着写好的提示。
  • 复制为 JSON 会复制这次运行。

你不能做的,以及原因

  • 读取已经结束的运行的 shell 日志:“终端日志不会保存到历史记录,只在运行期间可见。”有意为之
  • 找到系统杀掉应用时正在进行的运行:运行只在结束时写入一次,启动时不会恢复任何东西,所以被中断的运行不会留下记录。有意为之
  • 看到已保存的密钥:运行写入时,值会被遮成 •••,所以数据库里也没有它们。短于 4 个字符的值无法遮盖。有意为之

再次运行、从失败的步骤重来、带输入运行

详情底部有三个按钮,最后都会进入重复这次运行对话框。

你可以

  • 再次运行从头运行工作流。
  • 从失败的步骤重来从第一个失败的步骤开始再次运行,复用它之前各步骤的结果(复用之前的 n 个结果。)。只有当运行已结束且存在失败步骤时才会显示。
  • 用这些输入运行会在运行之前再次询问输入。
  • 确认之前先读一下对话框:它会说明“将按工作流当前的定义运行,而不是这次运行时的定义。”,说明工作流自那以后是否被编辑过,哪些步骤已不存在,哪些是新增的,以及从哪里继续。

你不能做的,以及原因

  • 复用旧运行的输入:“那次运行的输入没有保存,因此使用声明的默认值。”它们可能是 token。有意为之
  • 从嵌套在块里的步骤继续:只有第一层的步骤才能作为重启点。有意为之
  • 重复一次其工作流已被你删除的运行:“工作流已不存在,无法重复这次运行。”有意为之

运行通知

存活的运行会显示一条常驻通知,带有第 n 步,共 m 步和停止按钮。运行期间,PocketCode 会保持一个特殊用途类型的前台服务,这样 Android 不会把应用在半途停掉。

你可以

  • 在通知栏里跟踪运行,并从那里停止它;停止按钮只作用于本应用正在进行的运行。
  • 用显示通知步骤发送你自己的通知。它的 importance 决定渠道:HIGH 进入 Workflows · 提醒,其他都进静音的 Workflows 渠道。两者都遵循应用的通知设置:总开关、提醒和通知开关、Android 的通知权限以及勿扰时段。
  • 点按通知:指向 pocketcode://workflows/… 的链接会打开该运行或该工作流;其他任何链接都会被丢弃,通知只会打开应用。

你不能做的,以及原因

  • 在运行失败时收到自动通知:PocketCode 不会发送任何通知。如果想要,可以在尝试 / 失败时分支里添加一个显示通知步骤,或者建一个以检测到错误启动的工作流。(AI 聊天可以显示一条带试试按钮的 Workflow '…' failed 提示,但只出现在聊天里。)尚未提供
  • 让每次运行都有进度通知:只有同时进行的前 5 个运行有;其余的没有它也照常运行。设备
  • 在应用处于后台时指望前台服务:从 Android 12 起,系统可能会拒绝它(例如手机揣在口袋里时的定时运行)。运行会继续,只是没有那层保护,PocketCode 每 30 秒会再请求一次。Google Play

快捷方式、快速设置卡片和分享

不打开该模块就启动工作流的三种方式。每一种都需要工作流里有对应的触发器(主屏快捷方式、快速设置卡片、分享到 PocketCode 的文本或分享到 PocketCode 的文件),并且工作流处于开启状态。

你可以

  • 快捷方式:每个开启的、带有快捷方式触发器的工作流,都会作为应用图标的动态快捷方式出现(标签被截成 30 个字符)。点按它会不打开任何界面就运行该工作流,并显示工作流已启动。已被删除或关闭的工作流的固定快捷方式会如实说明。
  • 卡片:把运行工作流拖进快速设置。没有工作流使用它时,显示没有工作流使用此快设卡片;有一个时直接运行它;有多个时显示选择器。
  • 分享:从其他应用把文本、图片、JSON、XML、zip、PDF 或一般的二进制文件分享给运行工作流。一个标题为发送给工作流的面板会始终显示收到了什么(“分享的内容是数据,不是指令。”)以及哪个工作流会接收它;有多个时由你选一个。数据以 {{trigger.text}}、{{trigger.subject}}、{{trigger.uri}}、{{trigger.fileName}}、{{trigger.mimeType}} 的形式到达,同名的已声明输入优先。
  • 如果没有任何东西在监听,你会读到“没有启用的工作流在监听它。请在工作流编辑器中添加对应的触发器。”

你不能做的,以及原因

  • 用这三种方式启动必填输入没有默认值的工作流:它会显示 … 需要先填一个值,而不是盲目运行。有意为之
  • 一次分享多个项目、超过 32 768 个字符的文本(会被截断并告知你),或超过 25 MB 的文件。分享的文件会被复制进 PocketCode,24 小时后删除;接受的类型列表是固定的,不是任意类型。有意为之
  • 指望快捷方式的数量:由 Android 决定启动器显示几个(至少 5 个,通常是 4 或 5 个),而卡片需要你主动添加,得自己拖进去。设备
  • 从其他应用直接打开 .pcwf.json:分享菜单会把文件发给分享到 PocketCode 的文件触发器,而不是导入器。请用从文件导入工作流导入。有意为之

定时

任何工作流都可以带多个计划,通过时钟图标或其菜单里的计划来设置(… 的计划)。它们通过 Android 的 WorkManager 运行,会有随之而来的时间宽松,并在应用启动时重新装载。

你可以

  • 查看现有的计划(每 n 分钟或 Cron:…、下次:…、它们的条件、间隔被调高时的提示、会补跑一次错过的执行),并移除任意一个。
  • 用预设或自定义 cron 添加一个:五个字段,min hour day month weekday,例如 0 9 * * 1。面板会显示下次执行:…或无效的 cron 表达式,添加 cron 会保存它。Cron 接受 *、数字、列表、范围、*/n、名称(SUN–SAT、JAN–DEC),并且只有月份和星期的范围可以绕过末尾回绕;星期是 0 到 6,7 表示星期天。
  • 创建之前先选设备条件:不限制、任意连接或仅 Wi-Fi,再加上仅在充电时、电量低时不跑和仅在设备空闲时。条件只会推迟运行,不会取消它:条件最终满足时,挂起的运行就会继续,哪怕是几个小时之后。
  • 在如果错过一次执行下开启设备恢复后补跑一次:设备关机期间错过的运行,会在应用下次启动时补跑一次(容差 15 分钟),不管错过了多少次。默认是关闭的,所以错过的运行会被跳过。
  • 可以依赖时间制的变化:春天不存在的那一小时会在跳变时触发,秋天出现两次的那一小时只触发一次(精细的 cron 会丢掉那一小时的第二次)。
  • 可以依赖重试:失败的定时运行总共最多尝试 4 次(第一次加 3 次重试),重试采用 WorkManager 的指数退避。如果下一次到期时上一次还在运行,由并发策略决定;选跳过新的时,该次运行会被记为已取消,原因是上一次执行仍在进行。
  • 阅读标签页上方的横幅定时工作流需要处理:当 PocketCode 的通知被关闭、Workflows · 提醒渠道被屏蔽,或应用受电池优化管制时它会出现(“PocketCode 受电池优化管控:Android 可能推迟定时运行。不是取消,只是晚一些才跑。”)。它带有打开设置,没有关闭按钮;原因消失它就消失。

你不能做的,以及原因

  • 得到低于 15 分钟的保证:Android 不会比每 15 分钟更频繁地运行定时任务。低于它的间隔会被调到 15,面板会说明(“要求每 n 分钟一次,但实际每 15 分钟才跑一次:这是 Android 允许的下限。”);低于它的 cron 会提示“低于 15 分钟时,Android 不保证后台能保持这个节奏”。PocketCode 既不申请精确闹钟权限,也不申请电池优化豁免。Google Play
  • 自己输入一个间隔:预设只提供三个间隔(每 15 分钟、每小时、每 6 小时);其他节奏都用 cron 表达式。间隔不能超过约 30 天。有意为之
  • 选择时区:没有选择器,新计划的 cron 按设备所在时区解读(每个计划都存有时区,只是界面没有暴露)。尚未提供
  • 编辑一个计划或它的条件:先移除再添加另一个。有意为之
  • 在 cron 表达式里使用 ?、L、#、范围上的步长(1-9/2)或年份字段。永远不会触发的 cron(例如 2 月 31 日)会把该计划关闭。有意为之
  • 让横幅告诉你关于手机厂商杀后台的情况:它只会转述 Android 给出的回答(通知被关闭、渠道被屏蔽、电池优化)。设备

预设

预设它添加什么
每 15 分钟15 分钟的间隔,Android 的下限。
每小时60 分钟的间隔。
每 6 小时6 小时的间隔。
每天 9:00cron 0 9 * * *。
每周一 9:00cron 0 9 * * 1。

密钥

管理密钥(列表上的钥匙图标)是一份只有名称、没有取值的清单。你在任何参数里以 {{secret.NAME}} 引用某个密钥,这样令牌就不必输入到工作流里:写进去的话它会原样保存、导出时随文件走,还会出现在运行历史里。

你可以

  • 添加密钥:一个由大写字母、数字和下划线组成的名称(如果名称不能用在表达式里,界面会给出建议,使用 …),以及一个值。步骤用的就是这个名称,所以之后改名会让它们失效。
  • 更改值:用到它的工作流会在下一次运行时取得新值。
  • 删除:对话框会列出引用它的工作流,并警告该值无法恢复,而且失去密钥的工作流在保存时不会失败,而是在下一次运行时以空值失败。
  • 阅读“加密保存在本机,每个账号一套。保存后不再显示明文,这里也不显示。”

你不能做的,以及原因

  • 保存之后再次看到某个值,或保存空值(“空值不会被保存。要移除密钥,请删除它。”)。有意为之
  • 让短于 4 个字符的值在运行历史里被遮盖:它会被保存,但界面会警告“注意:该值少于 4 个字符,因此在运行历史中不会被遮盖”,打印它的步骤会让它在那里清晰可读。有意为之
  • 在恢复手机或更改锁屏方式之后打开存储:“本机无法打开加密存储……没有删除任何内容。这通常发生在恢复手机或更改锁屏方式之后。”设备
  • 在设备之间同步密钥:它们会从上传的内容里被剔除,导出的文件里也不带。有意为之

导出、导入和链接

工作流以 .pcwf.json 文件的形式流转。导出和导入特意设为免费,代码里也说明了原因:它们是把你的成果带出应用的唯一途径,而把取回自己数据的办法锁在订阅后面,会把套餐变成枷锁。

你可以

  • 卡片菜单里的作为文件分享会打开分享此工作流:文件名、哪些密钥字段会被清空(你的密钥留在本机),以及提醒运行历史、固定的输出和开关状态不会带走。分享会打开 Android 的应用选择器。
  • 从文件导入工作流(列表顶部的按钮)会打开系统文件选择器。导入工作流面板显示名称、触发条件、最多 40 个步骤、针对密钥的你需要自己填写这些,以及 linter 的结果;有错误时保存会被阻止。“保存后处于关闭状态。打开前先看一遍:工作流可以在你的设备上执行命令。”
  • 从其他应用打开链接 pocketcode://workflows/import?url=https://…:有链接想导入工作流会显示地址(来自:…)和一条警告,在你按下载(或不用了)之前不会下载任何东西。

你不能做的,以及原因

  • 直接从文件管理器或其他应用打开 .pcwf.json:应用没有为它设文件过滤器。请用从文件导入工作流或链接。有意为之
  • 导入大于 512 KB 的文件、不是 PocketCode 工作流的文件、已损坏的文件,或由更新版本的 PocketCode 写出的文件:每种情况都有各自的提示。有意为之
  • 使用不是 https 的链接、长度超过 2 048 个字符的链接、地址里带有凭据的链接,或指向设备本身的链接;重定向会被显示出来,但不会被跟随。有意为之
  • 不检查就分享文件:只有声明为密钥的参数会被清空;HTTP 头和命令会原样带走,所以如果某个字段里放着密钥或令牌,分享之前请先检查文件。有意为之

文件里有什么

会带走名称、描述、触发器、步骤、输入和运行设置(包括权限和标签)。
不会带走id、日期、上次运行的状态、它来自的模板、开关状态、可供 AI 代理使用、固定的输出、历史和计划。
密钥声明为密钥的参数会被清空并列出。{{secret.NAME}} 引用会随文件走:它是名称,不是密钥本身。
到达时处于关闭状态,并带有新的 id,且已经过 linter。来自更新版本的新操作会被单独丢弃;格式更新的文件则整个被拒绝。

AI:生成、修改和聊天

AI 在三个地方接触工作流:该模块里的生成器和修改面板(免费)、可以读取、运行并且在 Pro 下还能写入它们的聊天代理,以及运行里的用 AI 分析按钮。

从提示生成和用 AI 修改

两者都在该模块里,都不检查套餐。所用模型是你在设置里配置的 AI 服务商,使用你自己的密钥。

你可以

  • 在欢迎界面(竖屏)点按从提示生成,打开从提示生成工作流:写下提示词,提到触发器(push、保存、commit、错误、部署)和操作(部署、通知、备份、测试、格式化),然后按生成。
  • 在卡片菜单里点按用 AI 修改,打开用 AI 修改「…」:说明你想改什么;工作流的其余部分保持不变,保存之前你会看到改了什么。
  • 检查结果:预览、检查(linter 的问题)、模拟运行通过,用时 n 毫秒、模拟运行失败:…或“未测试:…您可以在编辑器中自行测试。”、对应用修复的内容显示已自动修正,以及修改时的差异(新增、删除、修改、n 个步骤未变)。
  • 选择保存并启用(仅在创建时)、在编辑器中打开(检查阻止保存时的出路)或放弃。以这种方式创建的工作流保存后是开启的;修改则保留工作流的 id、开关状态和创建日期。

你不能做的,以及原因

  • 指望 AI 生成的所有东西都做试运行:只有应用判断安全时才会运行,因为试运行会执行步骤。当某个步骤无法模拟、等待合计超过 10 秒、等待的是某个事件,或无法检查子流程时,它会显示未测试并给出原因。有意为之
  • 在没有 AI 服务商的情况下得到由模型写成的工作流:没设密钥时,应用退回到关键词匹配,并说明“未使用模型:未配置 AI 密钥,因此由关键词匹配生成。”需要网络
  • 保存被 linter 拒绝的生成结果:“保存前请先修复:此工作流尚未就绪。”有意为之

聊天代理与工作流

是两件不同的事。你标为可供 AI 代理使用并保持开启的工作流,会作为它自己的工具向聊天宣告,名为 workflow__<name>__<id 的最后 6 个字符>,其描述由它的步骤构成(对不可撤销的步骤会发出警告),输入 schema 由它声明的输入构成。另外六个管理工具始终都在,无论有没有暴露出来的工作流。

工具它做什么套餐
workflow__list列出你的工作流(最多 25 个),包含触发器、是否启用以及上次运行的情况;可以筛选。Free
workflow__get完整返回一个工作流。密钥参数显示为 [secret, not shown]。长于 20 000 个字符的工作流会被拒绝,而不是被截断。Free
workflow__runs某个工作流的历史,最新的在前(默认 5 条,最多 20 条),带有最后一个错误和最多 5 个失败的步骤。Free
workflow__run立即运行一个工作流。它会拒绝已关闭的工作流、校验输入,并遵守不可撤销步骤的许可。Free
workflow__create根据一份文档创建工作流。它会先被校验,并且即使模型要求开启,创建出来也是关闭的。Pro
workflow__update修改现有工作流的字段。Pro

你可以

  • 问代理你 push 时会运行哪些工作流,或者昨晚的备份为什么失败:它用 workflow__list、workflow__get 和 workflow__runs 读取,这些是免费的。
  • 让它用 workflow__run 运行其中一个:它会按工作流声明的输入校验这些输入,并遵守你授予的不可撤销步骤许可(允许 AI)。
  • 在 Pro 下,让它创建或修改一个:workflow__create 和 workflow__update。三个会写入的工具要经过代理的确认面板。

你不能做的,以及原因

  • 在 Free 上从聊天创建或修改工作流:模型会收到一个拒绝,并被要求告知你,你会看到一条提示(“… 需要 PocketCode Pro,因此该操作未执行。”)和一个升级按钮。该套餐功能名为通过聊天创建工作流。Pro
  • 让代理改动工作流的重试、超时、何时条件或保留策略:AI 无法设置它们,而更新会保留步骤的 id、权限、标签和保留策略。有意为之
  • 把可供 AI 代理使用当作访问控制:它只决定工作流是否作为它自己的工具被宣告。workflow__run 可以按名称运行任何处于开启状态的工作流。有意为之

Marketplace

Marketplace 有一个工作流资源类型,但目前无法从中安装工作流,应用也没有发布工作流的办法。要分享工作流,请用文件或链接(见“导出、导入和链接”)。

你可以

  • 按工作流类型筛选 Marketplace,并阅读该类型资源的页面。
  • 用作为文件分享分享你自己的工作流,或把 .pcwf.json 放在一个 https 地址上并发送 pocketcode://workflows/import?url=… 链接。

你不能做的,以及原因

  • 从 Marketplace 安装工作流:在工作流资源的页面上,安装按钮是禁用的(需要 WASM 运行时),和插件一样,尽管引擎已经知道如何检查和安装工作流。尚未提供
  • 把工作流发布到 Marketplace:没有这个按钮,应用也无法上传任何东西。目录由团队通过 pull request 发布,由 CI 校验并签名。有意为之

Free 与 Pro

引擎是免费的。要花钱的部分很窄,而且每一项都是你可以在这个模块之外碰到的限制。价格见“套餐与价格”。

功能FreePro
25 种触发器、15 种操作、七种步骤、模板、编辑器、linter 和步骤测试有有
定时(WorkManager、cron、设备条件、错过运行的补跑)有有
加密密钥、每个工作流的权限、历史和活动、.pcwf.json 的导出与导入有有
可供 AI 代理使用,以及聊天运行你的工作流(workflow__run、workflow__list、workflow__get、workflow__runs)有有
本模块里的从提示生成和用 AI 修改有,使用你自己的 AI 服务商有,使用你自己的 AI 服务商
AI 聊天创建或修改工作流(workflow__create、workflow__update)没有:模型会收到拒绝,你会看到带升级的提示有(通过聊天创建工作流)
同一项目的部署正在进行(排队、构建或部署中)时的触发部署步骤没有:每个项目同时只能有 1 个进行中(“需要升级才能触发另一个活跃部署”)有,不设上限
在你的设备之间同步工作流定义(Cloud Sync,工作流分组)没有有
哪些东西不卖,以及原因,用代码自己的话来说:webhook 不存在(没有服务器、端点或触发器);精确闹钟被否决了,改用带有时间宽松的 WorkManager;发布到 Marketplace 则无法上传任何东西。历史和导出特意设为免费:对它们收费会拿走今天免费的东西,而导出是把你的成果带出应用的唯一办法。Cloud Sync 只同步定义;运行、计划、固定的输出、不可撤销步骤的许可和密钥永远不会离开设备。

键盘快捷键

这些只在编辑器打开且使用实体键盘时有效。可以在设置里更改。

按键它的作用
Ctrl+S保存。
Ctrl+Z / Ctrl+Shift+Z撤销 / 重做。
Ctrl+Enter立即测试:对工作流做试运行。
Ctrl+D复制所选步骤(IntelliJ 预设里是 Ctrl+Shift+D)。
Delete删除所选步骤。
Ctrl+↑ / Ctrl+↓上移或下移所选步骤(Atom 预设里是 Ctrl+Alt+↑ / Ctrl+Alt+↓)。

最后四个作用于所选步骤:点按卡片的铅笔图标即可选中它。

隐私与安全

工作流在你的设备上运行;离开设备的,是你让某个步骤指向的东西。

  • 存放在哪里。定义保存在设备上的本地数据库里,每个账号一个文件。在 Pro 下,Cloud Sync 可以在你的设备之间复制这些定义(工作流分组);运行、计划、固定的输出和密钥永远不会同步。
  • 密钥。它们加密保存在设备上,每个账号一套(Android Keystore 密钥,AES-256-GCM),不会再次显示,在试运行里不会被解析,不会随导出的文件带走,并且在运行写入历史时被遮成 •••(短于 4 个字符的值无法遮盖)。
  • 不可撤销步骤的许可。对仍然启用和允许 AI 的回答只记在设备上,每个工作流一次。
  • 工作流能做什么。工作流可以用你留着开放的权限来运行命令和写入文件;权限不是沙箱,域名列表也拦不住 AI、部署或 git 步骤。
  • 什么会离开设备。 HTTP 请求、触发部署、Git 操作(push 和 pull)和 AI 步骤会发往你配置的服务或你写下的地址。AI 步骤会用你自己的密钥把它的提示和上下文发给你的服务商。
  • 导入。文件或链接总是以关闭状态到达,带有预览和 linter 的结果;链接必须是 https,不能带凭据或指向设备本身,不会跟随重定向,在你按下载之前不会下载任何东西。
  • 其他应用发给你的内容。分享来的文本和文件作为数据到达,绝不作为指令,应用也总会显示收到了什么以及哪个工作流会接收它。
  • 导出。只有声明为密钥的参数会被清空;HTTP 头和命令按你输入的样子带走。分享之前请检查文件。

限制

最重要的限制,每条都附带原因。某个界面特有的限制,写在该界面的小节里。

  • 聊天在 Free 上不能创建或修改工作流,而当该项目已有一次部署在进行时,触发部署步骤在 Free 上会失败。Pro
  • 定义只有在 Pro 下才能在设备之间同步(Cloud Sync)。Pro
  • 定时运行通过 WorkManager 进行:频率不会高于每 15 分钟一次,没有精确闹钟,而且 Doze 或省电模式可能推迟它们(但绝不会取消它们)。Google Play
  • 后台运行依赖前台服务;从 Android 12 起,应用在后台时系统可能会拒绝它,此时运行会在没有这层保护的情况下继续。Google Play
  • 只有同时进行的前 5 个运行有进度通知;快速设置卡片需要主动添加,而启动器显示多少个快捷方式由 Android 决定。设备
  • 在恢复手机或更改锁屏方式之后,密钥存储可能无法打开;不会删除任何内容。设备
  • 项目已关闭和 AI 完成了回合永远不会触发:应用里没有任何东西会发出它们。尚未提供
  • git commit 时只对从 Projects 做的提交触发,编辑器的源代码管理面板或 AI 聊天做的提交不会触发。尚未提供
  • 计划没有时区选择器,运行失败时也没有自动通知。尚未提供
  • 无法从 Marketplace 安装工作流,应用也无法发布工作流。尚未提供
  • 系统杀掉应用时正在进行的运行不会在历史里留下记录,已结束运行的 shell 日志也不会保存。有意为之
  • 没有图形画布、N 路 switch 或自由合并,不能编辑计划,cron 不支持 ?、L、#,预设里只有三个间隔。有意为之
  • 每个工作流最多 6 个触发器,每个过滤最多 8 个条件,每个工作流最多 8 个标签,导入预览里最多列出 40 个步骤,文件最大 512 KB。有意为之
  • 引擎的限制:整个应用同时最多运行 8 个,最多 16 个等待最长 120 秒,每个工作流最多排队 10 个事件运行,循环最多 10 000 次迭代、同时最多 16 个,子流程最多嵌套 5 层,等待事件的等待默认为 5 分钟,尝试 / 失败时的错误信息最长 4 096 个字符。有意为之
  • 步骤输出:HTTP 响应体最多 128 KiB,shell 输出最多 64 KB,读取文件最多 128 KiB,每个步骤在历史里最多存 32 KiB 的输出。有意为之
  • 活动界面最多显示最近的 500 次运行;每个工作流保留的历史是 1 到 1 000 次运行和 1 到 365 天。有意为之
  • 部署只能发往 render、netlify、digitalocean 和 railway,查询数据库能访问 neon、supabase、turso、upstash、cloudflare(D1)和你已保存的远程 PostgreSQL 连接。第三方
  • 从提示生成和用 AI 修改需要带密钥的 AI 服务商;没有时会退回到关键词匹配。需要网络

故障排查

应用的真实提示信息,以及它们的含义。

目前应用中没有任何地方发出 PROJECT_CLOSED,因此该工作流不会被触发。

该触发器在下拉菜单里,但没有任何东西会发出它。请换一个触发器:项目已关闭和 AI 完成了回合永远不会触发。

没有条件:该触发器对此类型的每个事件都会触发。

这不是错误:该触发器没有过滤。如果只想要部分事件,请添加条件。

我开启的工作流从不运行

检查已启用是否开启,它的触发器是否真的有发送方和匹配的过滤,它是否因为另一个运行正在进行而被跳过新的跳过,以及必填输入是否有默认值(事件、计划或快捷方式都没有人可问)。

没有启用的工作流在监听它。请在工作流编辑器中添加对应的触发器。

你向 PocketCode 分享了内容,但没有任何开启的工作流带有分享到 PocketCode 的文本或分享到 PocketCode 的文件。请添加触发器并开启该工作流。

… 需要先填一个值

某个快捷方式、卡片或分享试图启动一个必填输入没有默认值的工作流。请给该输入设一个默认值,或从该模块里运行它。

必填但无默认值:…。定时执行无法启动,因为调度器无人可问。

计划无法向你询问输入。请给每个必填输入一个默认值。

无效的 cron 表达式

cron 有五个字段:min hour day month weekday。?、L、#、范围上的步长和年份字段都不被接受。

要求每 5 分钟一次,但实际每 15 分钟才跑一次:这是 Android 允许的下限。

低于 15 分钟的间隔会被调到 15。低于这个频率的 cron 会提示“低于 15 分钟时,Android 不保证后台能保持这个节奏”。

定时工作流需要处理

横幅说的是 Android 的回答:PocketCode 的通知已关闭、“Workflows · 提醒”渠道被屏蔽,或“PocketCode 受电池优化管控”。点按打开设置。横幅无法关闭;原因消失它就消失。

permiso denegado (…): … Se cambia en «Permisos», dentro de los ajustes del workflow.

某个步骤被工作流的权限拒绝了(这条信息在所有语言里都是西班牙语)。打开工作流设置和权限,开放网络、写入或命令,或添加该域名。

需要升级才能触发另一个活跃部署

在 Free 上,当同一项目的部署仍在进行(排队、构建或部署中)时,触发部署步骤会失败;上限是 1。请等它完成,或升级到 Pro。

la consulta modifica datos (…) y el paso no tiene «allowWrites» activado

某个查询数据库步骤带有写入动词,而 allowWrites 是关闭的(这条信息在所有语言里都是西班牙语)。只有确实需要时才开启 allowWrites。

这不是 PocketCode 的工作流文件。请选择 .pcwf.json 文件。

该文件不是工作流。另外两条信息是“这是工作流文件,但已损坏、无法读取。请向发送者索要另一份。”和“该文件由更新版本的 PocketCode 写入(格式 …)。请更新应用后再打开。”

该地址会把你转到别处:…。没有跟随;只有在你信任时才确认新地址。

某个导入链接重定向到了另一个地址。只有在你信任时才确认新地址。

本机无法打开加密存储

恢复手机或更改锁屏方式之后,无法打开密钥存储。没有删除任何内容。

注意:该值少于 4 个字符,因此在运行历史中不会被 ••• 遮盖。如果某个步骤把它打印出来,它会原样留在那里。

该密钥已保存,但如果某个步骤把它打印出来,它会在运行历史里保持可读。请用更长的值。

工作流已不存在,无法重复这次运行。

该工作流已被删除。已删除工作流的运行仍然可以在活动里查看,但不能重复。

终端日志不会保存到历史记录,只在运行期间可见。

运行期间从实时输出跟随日志,或者用一个步骤把你需要的内容写进文件。

保存前请先修复:此工作流尚未就绪。

生成器的检查发现了一个错误。用在编辑器中打开在编辑器里打开该工作流,并修复问题里列出的内容。

未测试:…。您可以在编辑器中自行测试。

生成器没有对该工作流做试运行,因为试运行会执行步骤,而它无法确认其中某一步是安全的:无法模拟的步骤(部署)、合计超过 10 秒的等待、等待某个事件,或无法查看内部的子流程。请在编辑器里测试它。