测试凭据

Windup 让测试凭据远离一切会被提交或缓存的内容。场景只会说 “以 admin 账户登录” —— 从不出现密码。真实的值存放在一处已加入 gitignore 的位置;其他所有内容都按名称引用它们。

存储位置

内容位置是否提交?
真实的值(用户、密码).env.local(以 600 权限创建) —— 自动加入 gitignore。在 CI 中,相同的变量名是流水线密钥。
账户 → 变量名的映射windup.credentials.json —— 它不含任何值,只有 ENV: 引用。
实时接线在启动时合并进项目清单(context.credentials——

一个值只由执行器在填入字段的那一刻读取。它从不进入规划提示、操作计划、轨迹缓存或 git。

创建账户

npx windup secret set admin

(隐藏地)提示输入用户和密码,将它们写入 .env.local,把映射添加到 windup.credentials.json,并确保 .env.local 已加入 gitignore。变量名遵循 WINDUP_<ACCOUNT>_<FIELD> —— 因此 admin 账户的密码变成 WINDUP_ADMIN_PASSWORD

需要多少账户就注册多少(adminqareadonly……);每个账户都拥有各自的变量。

非交互式(CI 或脚本)—— 标志会留在 shell 历史里,因此真实密钥请优先使用提示:

npx windup secret set admin --user admin@acme.test --password 's3cr3t'

列出账户

npx windup secret list

列出每个账户、它的字段,以及每个值是否存在 —— [set][MISSING in .env.local / CI]。它从不打印值。在运行套件前执行它,以便尽早发现缺失的密钥。

删除账户

npx windup secret remove admin        # alias: windup secret rm admin

从映射中移除该账户、从 .env.local 中移除它的值(其他变量保持不变),并从清单中清除它。

在场景中使用凭据

在任务中按名称引用账户 —— 绝不写出字面值:

{
  "scenario_id": "create-invoice",
  "task": "Log in as the admin account, open the Invoices menu, create an invoice for ACME and verify it appears in the list."
}

在规划时,Windup 会告诉 LLM admin 账户存在,并带有 ENV:WINDUP_ADMIN_USER / ENV:WINDUP_ADMIN_PASSWORD,于是计划以 value_ref: "ENV:WINDUP_ADMIN_PASSWORD" 填入这些字段 —— 这是一个引用,仅在执行时解析为真实的值。

windup new 会替你完成这件事:如果你在指令中输入了真实凭据,它会检测到、注册账户并清除这些值 —— 生成的场景提到的是账户,绝非那个密钥。

在配置中声明凭据(替代方式)

你不一定要使用 CLI。映射也可以直接在 windup.config.ts 中声明 —— 这正是 windup.credentials.json 所馈入的内容:

context: {
  credentials: {
    admin: { user: "ENV:WINDUP_ADMIN_USER", password: "ENV:WINDUP_ADMIN_PASSWORD" },
  },
}

无论采用哪种方式,值仍然来自 .env.local(本地)或 CI 密钥,都在这些变量名之下。

在 CI 中

提交 windup.credentials.json,然后把相同的变量名(WINDUP_ADMIN_USERWINDUP_ADMIN_PASSWORD……)定义为流水线密钥。任何密钥都不会进入仓库,而 windup secret list 会在运行前告诉你是否有任何缺失。