Loading...
Loading...
Compare original and translation side by side
_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
mkdir -p ~/.gstack/sessions
touch ~/.gstack/sessions/"$PPID"
_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true
_CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true)
_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
echo "BRANCH: $_BRANCH"UPGRADE_AVAILABLE <old> <new>~/.claude/skills/gstack/gstack-upgrade/SKILL.mdJUST_UPGRADED <from> <to>_UPD=$(~/.claude/skills/gstack/bin/gstack-update-check 2>/dev/null || .claude/skills/gstack/bin/gstack-update-check 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
mkdir -p ~/.gstack/sessions
touch ~/.gstack/sessions/"$PPID"
_SESSIONS=$(find ~/.gstack/sessions -mmin -120 -type f 2>/dev/null | wc -l | tr -d ' ')
find ~/.gstack/sessions -mmin +120 -type f -delete 2>/dev/null || true
_CONTRIB=$(~/.claude/skills/gstack/bin/gstack-config get gstack_contributor 2>/dev/null || true)
_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
echo "BRANCH: $_BRANCH"UPGRADE_AVAILABLE <old> <new>~/.claude/skills/gstack/gstack-upgrade/SKILL.mdJUST_UPGRADED <from> <to>_BRANCHRECOMMENDATION: Choose [X] because [one-line reason]A) ... B) ... C) ..._BRANCHRECOMMENDATION: 选择[X],因为[一句话理由]A) ... B) ... C) ..._CONTRIBtrue$B js "await fetch(...)"SyntaxError: await is only valid in async functions~/.gstack/contributor-logs/{slug}.mdundefined_CONTRIBtrue$B js "await fetch(...)"SyntaxError: await is only valid in async functions~/.gstack/contributor-logs/{slug}.mdundefined{paste the actual error or unexpected output here}{粘贴实际错误或意外输出}
Slug: lowercase, hyphens, max 60 chars (e.g. `browse-js-no-await`). Skip if file already exists. Max 3 reports per session. File inline and continue — don't stop the workflow. Tell user: "Filed gstack field report: {title}"
Slug:小写,用连字符分隔,最多60个字符(例如`browse-js-no-await`)。如果文件已存在则跳过。每个会话最多提交3份报告。直接在当前流程中提交并继续 — 不要中断工作流。告知用户:“已提交gstack现场报告:{标题}”_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B=~/.claude/skills/gstack/browse/dist/browse
if [ -x "$B" ]; then
echo "READY: $B"
else
echo "NEEDS_SETUP"
fiNEEDS_SETUPcd <SKILL_DIR> && ./setupbuncurl -fsSL https://bun.sh/install | bash_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
B=""
[ -n "$_ROOT" ] && [ -x "$_ROOT/.claude/skills/gstack/browse/dist/browse" ] && B="$_ROOT/.claude/skills/gstack/browse/dist/browse"
[ -z "$B" ] && B=~/.claude/skills/gstack/browse/dist/browse
if [ -x "$B" ]; then
echo "READY: $B"
else
echo "NEEDS_SETUP"
fiNEEDS_SETUPcd <SKILL_DIR> && ./setupcurl -fsSL https://bun.sh/install | bash$B goto https://yourapp.com
$B text # content loads?
$B console # JS errors?
$B network # failed requests?
$B is visible ".main-content" # key elements present?$B goto https://yourapp.com
$B text # 内容是否加载?
$B console # 是否有JS错误?
$B network # 是否有请求失败?
$B is visible ".main-content" # 关键元素是否存在?$B goto https://app.com/login
$B snapshot -i # see all interactive elements
$B fill @e3 "user@test.com"
$B fill @e4 "password"
$B click @e5 # submit
$B snapshot -D # diff: what changed after submit?
$B is visible ".dashboard" # success state present?$B goto https://app.com/login
$B snapshot -i # 查看所有可交互元素
$B fill @e3 "user@test.com"
$B fill @e4 "password"
$B click @e5 # 提交
$B snapshot -D # 对比:提交后页面有何变化?
$B is visible ".dashboard" # 是否显示成功状态?$B snapshot # baseline
$B click @e3 # do something
$B snapshot -D # unified diff shows exactly what changed$B snapshot # 生成基线快照
$B click @e3 # 执行操作
$B snapshot -D # 统一差异对比显示具体变化$B snapshot -i -a -o /tmp/annotated.png # labeled screenshot
$B screenshot /tmp/bug.png # plain screenshot
$B console # error log$B snapshot -i -a -o /tmp/annotated.png # 带标注的截图
$B screenshot /tmp/bug.png # 普通截图
$B console # 错误日志$B snapshot -C # finds divs with cursor:pointer, onclick, tabindex
$B click @c1 # interact with them$B snapshot -C # 查找带有cursor:pointer、onclick、tabindex的div元素
$B click @c1 # 与元素交互$B is visible ".modal"
$B is enabled "#submit-btn"
$B is disabled "#submit-btn"
$B is checked "#agree-checkbox"
$B is editable "#name-field"
$B is focused "#search-input"
$B js "document.body.textContent.includes('Success')"$B is visible ".modal"
$B is enabled "#submit-btn"
$B is disabled "#submit-btn"
$B is checked "#agree-checkbox"
$B is editable "#name-field"
$B is focused "#search-input"
$B js "document.body.textContent.includes('Success')"$B responsive /tmp/layout # mobile + tablet + desktop screenshots
$B viewport 375x812 # or set specific viewport
$B screenshot /tmp/mobile.png$B responsive /tmp/layout # 生成移动端、平板端、桌面端截图
$B viewport 375x812 # 或设置特定视口尺寸
$B screenshot /tmp/mobile.png$B upload "#file-input" /path/to/file.pdf
$B is visible ".upload-success"$B upload "#file-input" /path/to/file.pdf
$B is visible ".upload-success"$B dialog-accept "yes" # set up handler
$B click "#delete-button" # trigger dialog
$B dialog # see what appeared
$B snapshot -D # verify deletion happened$B dialog-accept "yes" # 设置对话框处理程序
$B click "#delete-button" # 触发对话框
$B dialog # 查看弹出的对话框内容
$B snapshot -D # 验证删除操作是否完成$B diff https://staging.app.com https://prod.app.com$B diff https://staging.app.com https://prod.app.com-i --interactive Interactive elements only (buttons, links, inputs) with @e refs
-c --compact Compact (no empty structural nodes)
-d <N> --depth Limit tree depth (0 = root only, default: unlimited)
-s <sel> --selector Scope to CSS selector
-D --diff Unified diff against previous snapshot (first call stores baseline)
-a --annotate Annotated screenshot with red overlay boxes and ref labels
-o <path> --output Output path for annotated screenshot (default: /tmp/browse-annotated.png)
-C --cursor-interactive Cursor-interactive elements (@c refs — divs with pointer, onclick)-o-a$B snapshot -i -a -C -o /tmp/annotated.png-C$B click @e3 $B fill @e4 "value" $B hover @e1
$B html @e2 $B css @e5 "color" $B attrs @e6
$B click @c1 # cursor-interactive ref (from -C) @e1 [heading] "Welcome" [level=1]
@e2 [textbox] "Email"
@e3 [button] "Submit"snapshotgoto-i --interactive 仅显示可交互元素(按钮、链接、输入框),并分配@e引用标识
-c --compact 紧凑模式(不显示空结构节点)
-d <N> --depth 限制树深度(0=仅根节点,默认:无限制)
-s <sel> --selector 限定CSS选择器范围
-D --diff 与上一次快照进行统一差异对比(首次调用会存储基线)
-a --annotate 生成带红色覆盖框和引用标识的标注截图
-o <path> --output 标注截图的输出路径(默认:/tmp/browse-annotated.png)
-C --cursor-interactive 显示光标可交互元素(@c引用标识 — 带有pointer、onclick的div)-o-a$B snapshot -i -a -C -o /tmp/annotated.png-C$B click @e3 $B fill @e4 "value" $B hover @e1
$B html @e2 $B css @e5 "color" $B attrs @e6
$B click @c1 # 光标可交互元素引用(来自-C参数) @e1 [heading] "Welcome" [level=1]
@e2 [textbox] "Email"
@e3 [button] "Submit"gotosnapshot| Command | Description |
|---|---|
| History back |
| History forward |
| Navigate to URL |
| Reload page |
| Print current URL |
| 命令 | 描述 |
|---|---|
| 返回历史页面 |
| 前进到历史页面 |
| 导航到指定URL |
| 重新加载页面 |
| 打印当前URL |
| Command | Description |
|---|---|
| Full ARIA tree |
| Form fields as JSON |
| innerHTML of selector (throws if not found), or full page HTML if no selector given |
| All links as "text → href" |
| Cleaned page text |
| 命令 | 描述 |
|---|---|
| 完整ARIA树 |
| 以JSON格式显示表单字段 |
| 选择器对应的innerHTML(未找到则抛出错误),无选择器时返回完整页面HTML |
| 所有链接,格式为“文本 → href” |
| 清理后的页面文本 |
| Command | Description |
|---|---|
| Click element |
| Set cookie on current page domain |
| Import cookies from JSON file |
| Import cookies from Comet, Chrome, Arc, Brave, or Edge (opens picker, or use --domain for direct import) |
| Auto-accept next alert/confirm/prompt. Optional text is sent as the prompt response |
| Auto-dismiss next dialog |
| Fill input |
| Set custom request header (colon-separated, sensitive values auto-redacted) |
| Hover element |
| Press key — Enter, Tab, Escape, ArrowUp/Down/Left/Right, Backspace, Delete, Home, End, PageUp, PageDown, or modifiers like Shift+Enter |
| Scroll element into view, or scroll to page bottom if no selector |
| Select dropdown option by value, label, or visible text |
| Type into focused element |
| Upload file(s) |
| Set user agent |
| Set viewport size |
| `wait <sel | --networkidle |
| 命令 | 描述 |
|---|---|
| 点击元素 |
| 在当前页面域名设置Cookie |
| 从JSON文件导入Cookie |
| 从Comet、Chrome、Arc、Brave或Edge浏览器导入Cookie(打开选择器,或使用--domain直接导入) |
| 自动接受下一个警告/确认/提示对话框。可选文本作为提示框的响应内容 |
| 自动关闭下一个对话框 |
| 填充输入框 |
| 设置自定义请求头(冒号分隔,敏感值会自动脱敏) |
| 悬停在元素上 |
| 按键 — Enter、Tab、Escape、ArrowUp/Down/Left/Right、Backspace、Delete、Home、End、PageUp、PageDown,或组合键如Shift+Enter |
| 将元素滚动到视图中,无选择器时滚动到页面底部 |
| 按值、标签或可见文本选择下拉选项 |
| 在聚焦元素中输入文本 |
| 上传文件(可多个) |
| 设置用户代理 |
| 设置视口尺寸 |
| `wait <sel | --networkidle |
| Command | Description |
|---|---|
| `attrs <sel | @ref>` |
| `console [--clear | --errors]` |
| All cookies as JSON |
| Computed CSS value |
| Dialog messages |
| Run JavaScript from file and return result as string (path must be under /tmp or cwd) |
| State check (visible/hidden/enabled/disabled/checked/editable/focused) |
| Run JavaScript expression and return result as string |
| Network requests |
| Page load timings |
| Read all localStorage + sessionStorage as JSON, or set <key> <value> to write localStorage |
| 命令 | 描述 |
|---|---|
| `attrs <sel | @ref>` |
| `console [--clear | --errors]` |
| 以JSON格式显示所有Cookie |
| 计算后的CSS属性值 |
| 对话框消息 |
| 运行文件中的JavaScript并返回结果字符串(路径必须在/tmp或当前工作目录下) |
| 状态检查(visible/hidden/enabled/disabled/checked/editable/focused) |
| 运行JavaScript表达式并返回结果字符串 |
| 网络请求记录 |
| 页面加载时间统计 |
| 读取所有localStorage和sessionStorage(JSON格式),或使用set <key> <value>写入localStorage |
| Command | Description |
|---|---|
| Text diff between pages |
| Save as PDF |
| Screenshots at mobile (375x812), tablet (768x1024), desktop (1280x720). Saves as {prefix}-mobile.png etc. |
| `screenshot [--viewport] [--clip x,y,w,h] [selector | @ref] [path]` |
| 命令 | 描述 |
|---|---|
| 页面文本差异对比 |
| 保存为PDF |
| 生成移动端(375x812)、平板端(768x1024)、桌面端(1280x720)截图。保存为{prefix}-mobile.png等格式 |
| `screenshot [--viewport] [--clip x,y,w,h] [selector | @ref] [path]` |
| Command | Description |
|---|---|
| Accessibility tree with @e refs for element selection. Flags: -i interactive only, -c compact, -d N depth limit, -s sel scope, -D diff vs previous, -a annotated screenshot, -o path output, -C cursor-interactive @c refs |
| 命令 | 描述 |
|---|---|
| 生成带@e引用标识的无障碍树,用于元素选择。参数:-i仅显示可交互元素,-c紧凑模式,-d N限制深度,-s sel限定范围,-d与上一次对比,-a生成标注截图,-o输出路径,-C显示光标可交互元素的@c引用 |
| Command | Description |
|---|---|
| Run commands from JSON stdin. Format: [["cmd","arg1",...],...] |
| 命令 | 描述 |
|---|---|
| 从标准输入的JSON运行命令。格式:[["cmd","arg1",...],...] |
| Command | Description |
|---|---|
| Close tab |
| Open new tab |
| Switch to tab |
| List open tabs |
| 命令 | 描述 |
|---|---|
| 关闭标签页 |
| 打开新标签页 |
| 切换到指定标签页 |
| 列出所有打开的标签页 |
| Command | Description |
|---|---|
| Restart server |
| Health check |
| Shutdown server |
| 命令 | 描述 |
|---|---|
| 重启服务器 |
| 健康检查 |
| 关闭服务器 |