@zmice/zc 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -87
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +4 -2
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/qwen-code.d.ts.map +1 -1
- package/dist/adapters/qwen-code.js +7 -5
- package/dist/adapters/qwen-code.js.map +1 -1
- package/dist/cli/__tests__/i18n.test.d.ts +2 -0
- package/dist/cli/__tests__/i18n.test.d.ts.map +1 -0
- package/dist/cli/__tests__/i18n.test.js +45 -0
- package/dist/cli/__tests__/i18n.test.js.map +1 -0
- package/dist/cli/__tests__/platform.test.d.ts +2 -0
- package/dist/cli/__tests__/platform.test.d.ts.map +1 -0
- package/dist/cli/__tests__/platform.test.js +483 -0
- package/dist/cli/__tests__/platform.test.js.map +1 -0
- package/dist/cli/__tests__/surface.test.d.ts +2 -0
- package/dist/cli/__tests__/surface.test.d.ts.map +1 -0
- package/dist/cli/__tests__/surface.test.js +15 -0
- package/dist/cli/__tests__/surface.test.js.map +1 -0
- package/dist/cli/__tests__/toolkit.test.d.ts +2 -0
- package/dist/cli/__tests__/toolkit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/toolkit.test.js +72 -0
- package/dist/cli/__tests__/toolkit.test.js.map +1 -0
- package/dist/cli/__tests__/upstream.test.d.ts +2 -0
- package/dist/cli/__tests__/upstream.test.d.ts.map +1 -0
- package/dist/cli/__tests__/upstream.test.js +163 -0
- package/dist/cli/__tests__/upstream.test.js.map +1 -0
- package/dist/cli/doctor.js +21 -21
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +2 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +34 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/msg.d.ts.map +1 -1
- package/dist/cli/msg.js +73 -5
- package/dist/cli/msg.js.map +1 -1
- package/dist/cli/platform.d.ts +32 -0
- package/dist/cli/platform.d.ts.map +1 -0
- package/dist/cli/platform.js +635 -0
- package/dist/cli/platform.js.map +1 -0
- package/dist/cli/run.js +7 -7
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/setup.js +7 -7
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/task.d.ts.map +1 -1
- package/dist/cli/task.js +108 -8
- package/dist/cli/task.js.map +1 -1
- package/dist/cli/team.d.ts +12 -0
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +82 -39
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/toolkit.d.ts +3 -0
- package/dist/cli/toolkit.d.ts.map +1 -0
- package/dist/cli/toolkit.js +160 -0
- package/dist/cli/toolkit.js.map +1 -0
- package/dist/cli/upstream.d.ts +19 -0
- package/dist/cli/upstream.d.ts.map +1 -0
- package/dist/cli/upstream.js +705 -0
- package/dist/cli/upstream.js.map +1 -0
- package/dist/node_modules/@zmice/platform-core/dist/index.d.ts +72 -0
- package/dist/node_modules/@zmice/platform-core/dist/index.d.ts.map +1 -0
- package/dist/node_modules/@zmice/platform-core/dist/index.js +105 -0
- package/dist/node_modules/@zmice/platform-core/dist/index.js.map +1 -0
- package/dist/node_modules/@zmice/platform-core/dist/index.test.d.ts +2 -0
- package/dist/node_modules/@zmice/platform-core/dist/index.test.d.ts.map +1 -0
- package/dist/node_modules/@zmice/platform-core/dist/index.test.js +104 -0
- package/dist/node_modules/@zmice/platform-core/dist/index.test.js.map +1 -0
- package/dist/node_modules/@zmice/platform-core/package.json +34 -0
- package/dist/platform-state/index.d.ts +4 -0
- package/dist/platform-state/index.d.ts.map +1 -0
- package/dist/platform-state/index.js +3 -0
- package/dist/platform-state/index.js.map +1 -0
- package/dist/platform-state/receipt.d.ts +11 -0
- package/dist/platform-state/receipt.d.ts.map +1 -0
- package/dist/platform-state/receipt.js +27 -0
- package/dist/platform-state/receipt.js.map +1 -0
- package/dist/platform-state/status.d.ts +3 -0
- package/dist/platform-state/status.d.ts.map +1 -0
- package/dist/platform-state/status.js +82 -0
- package/dist/platform-state/status.js.map +1 -0
- package/dist/platform-state/status.test.d.ts +2 -0
- package/dist/platform-state/status.test.d.ts.map +1 -0
- package/dist/platform-state/status.test.js +120 -0
- package/dist/platform-state/status.test.js.map +1 -0
- package/dist/platform-state/types.d.ts +58 -0
- package/dist/platform-state/types.d.ts.map +1 -0
- package/dist/platform-state/types.js +2 -0
- package/dist/platform-state/types.js.map +1 -0
- package/dist/runtime/__tests__/logger.test.d.ts +2 -0
- package/dist/runtime/__tests__/logger.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/logger.test.js +11 -0
- package/dist/runtime/__tests__/logger.test.js.map +1 -0
- package/dist/runtime/__tests__/session-manager.test.d.ts +2 -0
- package/dist/runtime/__tests__/session-manager.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/session-manager.test.js +11 -0
- package/dist/runtime/__tests__/session-manager.test.js.map +1 -0
- package/dist/runtime/__tests__/worktree-manager.test.d.ts +2 -0
- package/dist/runtime/__tests__/worktree-manager.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/worktree-manager.test.js +11 -0
- package/dist/runtime/__tests__/worktree-manager.test.js.map +1 -0
- package/dist/runtime/logger.d.ts +5 -1
- package/dist/runtime/logger.d.ts.map +1 -1
- package/dist/runtime/logger.js +11 -1
- package/dist/runtime/logger.js.map +1 -1
- package/dist/runtime/state.d.ts +2 -8
- package/dist/runtime/state.d.ts.map +1 -1
- package/dist/runtime/state.js +7 -15
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/worktree-manager.d.ts +5 -26
- package/dist/runtime/worktree-manager.d.ts.map +1 -1
- package/dist/runtime/worktree-manager.js +34 -98
- package/dist/runtime/worktree-manager.js.map +1 -1
- package/dist/team/__tests__/mailbox.test.d.ts +2 -0
- package/dist/team/__tests__/mailbox.test.d.ts.map +1 -0
- package/dist/team/__tests__/mailbox.test.js +22 -0
- package/dist/team/__tests__/mailbox.test.js.map +1 -0
- package/dist/team/__tests__/orchestrator.test.d.ts +2 -0
- package/dist/team/__tests__/orchestrator.test.d.ts.map +1 -0
- package/dist/team/__tests__/orchestrator.test.js +13 -0
- package/dist/team/__tests__/orchestrator.test.js.map +1 -0
- package/dist/team/__tests__/task-queue.test.d.ts +2 -0
- package/dist/team/__tests__/task-queue.test.d.ts.map +1 -0
- package/dist/team/__tests__/task-queue.test.js +28 -0
- package/dist/team/__tests__/task-queue.test.js.map +1 -0
- package/dist/team/__tests__/worker-manager.test.d.ts +2 -0
- package/dist/team/__tests__/worker-manager.test.d.ts.map +1 -0
- package/dist/team/__tests__/worker-manager.test.js +13 -0
- package/dist/team/__tests__/worker-manager.test.js.map +1 -0
- package/dist/team/mailbox.d.ts +12 -10
- package/dist/team/mailbox.d.ts.map +1 -1
- package/dist/team/mailbox.js +40 -27
- package/dist/team/mailbox.js.map +1 -1
- package/dist/team/orchestrator.d.ts +1 -6
- package/dist/team/orchestrator.d.ts.map +1 -1
- package/dist/team/orchestrator.js +27 -67
- package/dist/team/orchestrator.js.map +1 -1
- package/dist/team/task-queue.d.ts +18 -17
- package/dist/team/task-queue.d.ts.map +1 -1
- package/dist/team/task-queue.js +68 -71
- package/dist/team/task-queue.js.map +1 -1
- package/dist/team/worker-manager.d.ts +13 -36
- package/dist/team/worker-manager.d.ts.map +1 -1
- package/dist/team/worker-manager.js +34 -129
- package/dist/team/worker-manager.js.map +1 -1
- package/dist/utils/config.d.ts +15 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +39 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/install-target.d.ts +23 -0
- package/dist/utils/install-target.d.ts.map +1 -0
- package/dist/utils/install-target.js +89 -0
- package/dist/utils/install-target.js.map +1 -0
- package/dist/utils/install-target.test.d.ts +2 -0
- package/dist/utils/install-target.test.d.ts.map +1 -0
- package/dist/utils/install-target.test.js +71 -0
- package/dist/utils/install-target.test.js.map +1 -0
- package/dist/utils/platform-install-receipt.d.ts +11 -0
- package/dist/utils/platform-install-receipt.d.ts.map +1 -0
- package/dist/utils/platform-install-receipt.js +62 -0
- package/dist/utils/platform-install-receipt.js.map +1 -0
- package/dist/utils/platform-install-receipt.test.d.ts +2 -0
- package/dist/utils/platform-install-receipt.test.d.ts.map +1 -0
- package/dist/utils/platform-install-receipt.test.js +74 -0
- package/dist/utils/platform-install-receipt.test.js.map +1 -0
- package/dist/utils/skill-loader.d.ts +0 -9
- package/dist/utils/skill-loader.d.ts.map +1 -1
- package/dist/utils/skill-loader.js +19 -26
- package/dist/utils/skill-loader.js.map +1 -1
- package/dist/utils/workspace.d.ts +28 -0
- package/dist/utils/workspace.d.ts.map +1 -0
- package/dist/utils/workspace.js +103 -0
- package/dist/utils/workspace.js.map +1 -0
- package/dist/utils/workspace.test.d.ts +2 -0
- package/dist/utils/workspace.test.d.ts.map +1 -0
- package/dist/utils/workspace.test.js +50 -0
- package/dist/utils/workspace.test.js.map +1 -0
- package/package.json +48 -36
- package/vendor/node_modules/@zmice/platform-core/dist/index.d.ts +72 -0
- package/vendor/node_modules/@zmice/platform-core/dist/index.d.ts.map +1 -0
- package/vendor/node_modules/@zmice/platform-core/dist/index.js +105 -0
- package/vendor/node_modules/@zmice/platform-core/dist/index.js.map +1 -0
- package/vendor/node_modules/@zmice/platform-core/dist/index.test.d.ts +2 -0
- package/vendor/node_modules/@zmice/platform-core/dist/index.test.d.ts.map +1 -0
- package/vendor/node_modules/@zmice/platform-core/dist/index.test.js +104 -0
- package/vendor/node_modules/@zmice/platform-core/dist/index.test.js.map +1 -0
- package/vendor/node_modules/@zmice/platform-core/package.json +34 -0
- package/vendor/packages/platform-codex/dist/generate.d.ts +2 -0
- package/vendor/packages/platform-codex/dist/generate.d.ts.map +1 -0
- package/vendor/packages/platform-codex/dist/generate.js +2 -0
- package/vendor/packages/platform-codex/dist/generate.js.map +1 -0
- package/vendor/packages/platform-codex/dist/index.d.ts +15 -0
- package/vendor/packages/platform-codex/dist/index.d.ts.map +1 -0
- package/vendor/packages/platform-codex/dist/index.js +46 -0
- package/vendor/packages/platform-codex/dist/index.js.map +1 -0
- package/vendor/packages/platform-codex/dist/index.test.d.ts +2 -0
- package/vendor/packages/platform-codex/dist/index.test.d.ts.map +1 -0
- package/vendor/packages/platform-codex/dist/index.test.js +38 -0
- package/vendor/packages/platform-codex/dist/index.test.js.map +1 -0
- package/vendor/packages/platform-codex/dist/install.d.ts +2 -0
- package/vendor/packages/platform-codex/dist/install.d.ts.map +1 -0
- package/vendor/packages/platform-codex/dist/install.js +2 -0
- package/vendor/packages/platform-codex/dist/install.js.map +1 -0
- package/vendor/packages/platform-codex/package.json +46 -0
- package/vendor/packages/platform-codex/templates/AGENTS.md +7 -0
- package/vendor/packages/platform-qoder/dist/generate.d.ts +2 -0
- package/vendor/packages/platform-qoder/dist/generate.d.ts.map +1 -0
- package/vendor/packages/platform-qoder/dist/generate.js +2 -0
- package/vendor/packages/platform-qoder/dist/generate.js.map +1 -0
- package/vendor/packages/platform-qoder/dist/index.d.ts +15 -0
- package/vendor/packages/platform-qoder/dist/index.d.ts.map +1 -0
- package/vendor/packages/platform-qoder/dist/index.js +46 -0
- package/vendor/packages/platform-qoder/dist/index.js.map +1 -0
- package/vendor/packages/platform-qoder/dist/index.test.d.ts +2 -0
- package/vendor/packages/platform-qoder/dist/index.test.d.ts.map +1 -0
- package/vendor/packages/platform-qoder/dist/index.test.js +38 -0
- package/vendor/packages/platform-qoder/dist/index.test.js.map +1 -0
- package/vendor/packages/platform-qoder/dist/install.d.ts +2 -0
- package/vendor/packages/platform-qoder/dist/install.d.ts.map +1 -0
- package/vendor/packages/platform-qoder/dist/install.js +2 -0
- package/vendor/packages/platform-qoder/dist/install.js.map +1 -0
- package/vendor/packages/platform-qoder/package.json +46 -0
- package/vendor/packages/platform-qoder/templates/instructions.md +7 -0
- package/vendor/packages/platform-qwen/dist/generate.d.ts +2 -0
- package/vendor/packages/platform-qwen/dist/generate.d.ts.map +1 -0
- package/vendor/packages/platform-qwen/dist/generate.js +2 -0
- package/vendor/packages/platform-qwen/dist/generate.js.map +1 -0
- package/vendor/packages/platform-qwen/dist/index.d.ts +16 -0
- package/vendor/packages/platform-qwen/dist/index.d.ts.map +1 -0
- package/vendor/packages/platform-qwen/dist/index.js +60 -0
- package/vendor/packages/platform-qwen/dist/index.js.map +1 -0
- package/vendor/packages/platform-qwen/dist/index.test.d.ts +2 -0
- package/vendor/packages/platform-qwen/dist/index.test.d.ts.map +1 -0
- package/vendor/packages/platform-qwen/dist/index.test.js +46 -0
- package/vendor/packages/platform-qwen/dist/index.test.js.map +1 -0
- package/vendor/packages/platform-qwen/dist/install.d.ts +2 -0
- package/vendor/packages/platform-qwen/dist/install.d.ts.map +1 -0
- package/vendor/packages/platform-qwen/dist/install.js +2 -0
- package/vendor/packages/platform-qwen/dist/install.js.map +1 -0
- package/vendor/packages/platform-qwen/package.json +46 -0
- package/vendor/packages/platform-qwen/templates/QWEN.md +7 -0
- package/vendor/packages/platform-qwen/templates/qwen-extension.json +7 -0
- package/vendor/packages/toolkit/dist/content-lint.test.d.ts +2 -0
- package/vendor/packages/toolkit/dist/content-lint.test.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/content-lint.test.js +252 -0
- package/vendor/packages/toolkit/dist/content-lint.test.js.map +1 -0
- package/vendor/packages/toolkit/dist/governance/index.d.ts +2 -0
- package/vendor/packages/toolkit/dist/governance/index.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/governance/index.js +2 -0
- package/vendor/packages/toolkit/dist/governance/index.js.map +1 -0
- package/vendor/packages/toolkit/dist/governance/upstreams.d.ts +6 -0
- package/vendor/packages/toolkit/dist/governance/upstreams.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/governance/upstreams.js +31 -0
- package/vendor/packages/toolkit/dist/governance/upstreams.js.map +1 -0
- package/vendor/packages/toolkit/dist/governance/upstreams.test.d.ts +2 -0
- package/vendor/packages/toolkit/dist/governance/upstreams.test.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/governance/upstreams.test.js +23 -0
- package/vendor/packages/toolkit/dist/governance/upstreams.test.js.map +1 -0
- package/vendor/packages/toolkit/dist/index.d.ts +8 -0
- package/vendor/packages/toolkit/dist/index.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/index.js +8 -0
- package/vendor/packages/toolkit/dist/index.js.map +1 -0
- package/vendor/packages/toolkit/dist/lint/content-lint.d.ts +21 -0
- package/vendor/packages/toolkit/dist/lint/content-lint.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/lint/content-lint.js +250 -0
- package/vendor/packages/toolkit/dist/lint/content-lint.js.map +1 -0
- package/vendor/packages/toolkit/dist/lint/index.d.ts +2 -0
- package/vendor/packages/toolkit/dist/lint/index.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/lint/index.js +2 -0
- package/vendor/packages/toolkit/dist/lint/index.js.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/asset-unit.d.ts +4 -0
- package/vendor/packages/toolkit/dist/loaders/asset-unit.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/asset-unit.js +95 -0
- package/vendor/packages/toolkit/dist/loaders/asset-unit.js.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/content-tree.d.ts +2 -0
- package/vendor/packages/toolkit/dist/loaders/content-tree.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/content-tree.js +2 -0
- package/vendor/packages/toolkit/dist/loaders/content-tree.js.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/fs.d.ts +6 -0
- package/vendor/packages/toolkit/dist/loaders/fs.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/fs.js +19 -0
- package/vendor/packages/toolkit/dist/loaders/fs.js.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/index.d.ts +4 -0
- package/vendor/packages/toolkit/dist/loaders/index.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/index.js +4 -0
- package/vendor/packages/toolkit/dist/loaders/index.js.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/simple-yaml.d.ts +2 -0
- package/vendor/packages/toolkit/dist/loaders/simple-yaml.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/loaders/simple-yaml.js +125 -0
- package/vendor/packages/toolkit/dist/loaders/simple-yaml.js.map +1 -0
- package/vendor/packages/toolkit/dist/loaders.test.d.ts +2 -0
- package/vendor/packages/toolkit/dist/loaders.test.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/loaders.test.js +84 -0
- package/vendor/packages/toolkit/dist/loaders.test.js.map +1 -0
- package/vendor/packages/toolkit/dist/manifests/index.d.ts +2 -0
- package/vendor/packages/toolkit/dist/manifests/index.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/manifests/index.js +2 -0
- package/vendor/packages/toolkit/dist/manifests/index.js.map +1 -0
- package/vendor/packages/toolkit/dist/manifests/toolkit-manifest.d.ts +7 -0
- package/vendor/packages/toolkit/dist/manifests/toolkit-manifest.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/manifests/toolkit-manifest.js +72 -0
- package/vendor/packages/toolkit/dist/manifests/toolkit-manifest.js.map +1 -0
- package/vendor/packages/toolkit/dist/manifests.test.d.ts +2 -0
- package/vendor/packages/toolkit/dist/manifests.test.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/manifests.test.js +75 -0
- package/vendor/packages/toolkit/dist/manifests.test.js.map +1 -0
- package/vendor/packages/toolkit/dist/query/index.d.ts +2 -0
- package/vendor/packages/toolkit/dist/query/index.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/query/index.js +2 -0
- package/vendor/packages/toolkit/dist/query/index.js.map +1 -0
- package/vendor/packages/toolkit/dist/query/toolkit-query.d.ts +10 -0
- package/vendor/packages/toolkit/dist/query/toolkit-query.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/query/toolkit-query.js +49 -0
- package/vendor/packages/toolkit/dist/query/toolkit-query.js.map +1 -0
- package/vendor/packages/toolkit/dist/query.test.d.ts +2 -0
- package/vendor/packages/toolkit/dist/query.test.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/query.test.js +30 -0
- package/vendor/packages/toolkit/dist/query.test.js.map +1 -0
- package/vendor/packages/toolkit/dist/schema/asset-meta.d.ts +3 -0
- package/vendor/packages/toolkit/dist/schema/asset-meta.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/schema/asset-meta.js +130 -0
- package/vendor/packages/toolkit/dist/schema/asset-meta.js.map +1 -0
- package/vendor/packages/toolkit/dist/schema/asset-unit.d.ts +3 -0
- package/vendor/packages/toolkit/dist/schema/asset-unit.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/schema/asset-unit.js +22 -0
- package/vendor/packages/toolkit/dist/schema/asset-unit.js.map +1 -0
- package/vendor/packages/toolkit/dist/schema/index.d.ts +5 -0
- package/vendor/packages/toolkit/dist/schema/index.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/schema/index.js +5 -0
- package/vendor/packages/toolkit/dist/schema/index.js.map +1 -0
- package/vendor/packages/toolkit/dist/schema/kinds.d.ts +6 -0
- package/vendor/packages/toolkit/dist/schema/kinds.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/schema/kinds.js +24 -0
- package/vendor/packages/toolkit/dist/schema/kinds.js.map +1 -0
- package/vendor/packages/toolkit/dist/schema/manifest.d.ts +3 -0
- package/vendor/packages/toolkit/dist/schema/manifest.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/schema/manifest.js +30 -0
- package/vendor/packages/toolkit/dist/schema/manifest.js.map +1 -0
- package/vendor/packages/toolkit/dist/types.d.ts +80 -0
- package/vendor/packages/toolkit/dist/types.d.ts.map +1 -0
- package/vendor/packages/toolkit/dist/types.js +6 -0
- package/vendor/packages/toolkit/dist/types.js.map +1 -0
- package/vendor/packages/toolkit/package.json +35 -0
- package/vendor/packages/toolkit/src/content/agents/architect/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/agents/architect/body.md +34 -0
- package/vendor/packages/toolkit/src/content/agents/architect/meta.yaml +25 -0
- package/vendor/packages/toolkit/src/content/agents/backend-specialist/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/agents/backend-specialist/body.md +30 -0
- package/vendor/packages/toolkit/src/content/agents/backend-specialist/meta.yaml +24 -0
- package/vendor/packages/toolkit/src/content/agents/code-reviewer/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/agents/code-reviewer/body.md +31 -0
- package/vendor/packages/toolkit/src/content/agents/code-reviewer/meta.yaml +26 -0
- package/vendor/packages/toolkit/src/content/agents/frontend-specialist/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/agents/frontend-specialist/body.md +31 -0
- package/vendor/packages/toolkit/src/content/agents/frontend-specialist/meta.yaml +24 -0
- package/vendor/packages/toolkit/src/content/agents/performance-engineer/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/agents/performance-engineer/body.md +72 -0
- package/vendor/packages/toolkit/src/content/agents/performance-engineer/meta.yaml +24 -0
- package/vendor/packages/toolkit/src/content/agents/product-owner/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/agents/product-owner/body.md +32 -0
- package/vendor/packages/toolkit/src/content/agents/product-owner/meta.yaml +24 -0
- package/vendor/packages/toolkit/src/content/agents/security-auditor/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/agents/security-auditor/body.md +83 -0
- package/vendor/packages/toolkit/src/content/agents/security-auditor/meta.yaml +24 -0
- package/vendor/packages/toolkit/src/content/agents/test-engineer/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/agents/test-engineer/body.md +30 -0
- package/vendor/packages/toolkit/src/content/agents/test-engineer/meta.yaml +28 -0
- package/vendor/packages/toolkit/src/content/commands/api/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/api/body.md +24 -0
- package/vendor/packages/toolkit/src/content/commands/api/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/build/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/build/body.md +37 -0
- package/vendor/packages/toolkit/src/content/commands/build/meta.yaml +26 -0
- package/vendor/packages/toolkit/src/content/commands/careful/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/careful/body.md +18 -0
- package/vendor/packages/toolkit/src/content/commands/careful/meta.yaml +17 -0
- package/vendor/packages/toolkit/src/content/commands/ci/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/ci/body.md +27 -0
- package/vendor/packages/toolkit/src/content/commands/ci/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/commit/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/commit/body.md +26 -0
- package/vendor/packages/toolkit/src/content/commands/commit/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/ctx-health/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/ctx-health/body.md +22 -0
- package/vendor/packages/toolkit/src/content/commands/ctx-health/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/debug/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/debug/body.md +24 -0
- package/vendor/packages/toolkit/src/content/commands/debug/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/doc/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/doc/body.md +23 -0
- package/vendor/packages/toolkit/src/content/commands/doc/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/freeze/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/freeze/body.md +17 -0
- package/vendor/packages/toolkit/src/content/commands/freeze/meta.yaml +17 -0
- package/vendor/packages/toolkit/src/content/commands/guard/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/guard/body.md +17 -0
- package/vendor/packages/toolkit/src/content/commands/guard/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/commands/idea/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/idea/body.md +23 -0
- package/vendor/packages/toolkit/src/content/commands/idea/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/learn/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/learn/body.md +37 -0
- package/vendor/packages/toolkit/src/content/commands/learn/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/migrate/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/migrate/body.md +24 -0
- package/vendor/packages/toolkit/src/content/commands/migrate/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/commands/onboard/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/onboard/body.md +24 -0
- package/vendor/packages/toolkit/src/content/commands/onboard/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/perf/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/perf/body.md +23 -0
- package/vendor/packages/toolkit/src/content/commands/perf/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/plan-review/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/plan-review/body.md +28 -0
- package/vendor/packages/toolkit/src/content/commands/plan-review/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/commands/qa/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/qa/body.md +24 -0
- package/vendor/packages/toolkit/src/content/commands/qa/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/quality-review/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/quality-review/body.md +38 -0
- package/vendor/packages/toolkit/src/content/commands/quality-review/meta.yaml +22 -0
- package/vendor/packages/toolkit/src/content/commands/retro/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/retro/body.md +25 -0
- package/vendor/packages/toolkit/src/content/commands/retro/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/commands/sdd-tdd/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/sdd-tdd/body.md +39 -0
- package/vendor/packages/toolkit/src/content/commands/sdd-tdd/meta.yaml +23 -0
- package/vendor/packages/toolkit/src/content/commands/secure/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/secure/body.md +23 -0
- package/vendor/packages/toolkit/src/content/commands/secure/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/ship/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/ship/body.md +17 -0
- package/vendor/packages/toolkit/src/content/commands/ship/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/commands/simplify/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/simplify/body.md +24 -0
- package/vendor/packages/toolkit/src/content/commands/simplify/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/commands/spec/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/spec/body.md +32 -0
- package/vendor/packages/toolkit/src/content/commands/spec/meta.yaml +23 -0
- package/vendor/packages/toolkit/src/content/commands/task-plan/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/task-plan/body.md +32 -0
- package/vendor/packages/toolkit/src/content/commands/task-plan/meta.yaml +23 -0
- package/vendor/packages/toolkit/src/content/commands/ui/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/ui/body.md +24 -0
- package/vendor/packages/toolkit/src/content/commands/ui/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/commands/verify/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/commands/verify/body.md +32 -0
- package/vendor/packages/toolkit/src/content/commands/verify/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/skills/api-and-interface-design/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/api-and-interface-design/body.md +289 -0
- package/vendor/packages/toolkit/src/content/skills/api-and-interface-design/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/brainstorming-and-design/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/brainstorming-and-design/body.md +129 -0
- package/vendor/packages/toolkit/src/content/skills/brainstorming-and-design/meta.yaml +18 -0
- package/vendor/packages/toolkit/src/content/skills/branch-finish-and-cleanup/body.md +155 -0
- package/vendor/packages/toolkit/src/content/skills/branch-finish-and-cleanup/meta.yaml +17 -0
- package/vendor/packages/toolkit/src/content/skills/browser-qa-testing/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/browser-qa-testing/body.md +554 -0
- package/vendor/packages/toolkit/src/content/skills/browser-qa-testing/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/skills/ci-cd-and-automation/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/ci-cd-and-automation/body.md +417 -0
- package/vendor/packages/toolkit/src/content/skills/ci-cd-and-automation/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/code-review-and-quality/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/code-review-and-quality/body.md +130 -0
- package/vendor/packages/toolkit/src/content/skills/code-review-and-quality/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/code-simplification/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/code-simplification/body.md +326 -0
- package/vendor/packages/toolkit/src/content/skills/code-simplification/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/codebase-onboarding/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/codebase-onboarding/body.md +40 -0
- package/vendor/packages/toolkit/src/content/skills/codebase-onboarding/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/skills/context-budget-audit/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/context-budget-audit/body.md +38 -0
- package/vendor/packages/toolkit/src/content/skills/context-budget-audit/meta.yaml +17 -0
- package/vendor/packages/toolkit/src/content/skills/context-engineering/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/context-engineering/body.md +55 -0
- package/vendor/packages/toolkit/src/content/skills/context-engineering/meta.yaml +17 -0
- package/vendor/packages/toolkit/src/content/skills/continuous-learning/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/continuous-learning/body.md +367 -0
- package/vendor/packages/toolkit/src/content/skills/continuous-learning/meta.yaml +18 -0
- package/vendor/packages/toolkit/src/content/skills/debugging-and-error-recovery/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/debugging-and-error-recovery/body.md +43 -0
- package/vendor/packages/toolkit/src/content/skills/debugging-and-error-recovery/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/deprecation-and-migration/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/deprecation-and-migration/body.md +201 -0
- package/vendor/packages/toolkit/src/content/skills/deprecation-and-migration/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/developer-experience-audit/body.md +49 -0
- package/vendor/packages/toolkit/src/content/skills/developer-experience-audit/meta.yaml +17 -0
- package/vendor/packages/toolkit/src/content/skills/documentation-and-adrs/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/documentation-and-adrs/body.md +61 -0
- package/vendor/packages/toolkit/src/content/skills/documentation-and-adrs/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/engineering-principles/body.md +54 -0
- package/vendor/packages/toolkit/src/content/skills/engineering-principles/meta.yaml +18 -0
- package/vendor/packages/toolkit/src/content/skills/frontend-ui-engineering/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/frontend-ui-engineering/body.md +324 -0
- package/vendor/packages/toolkit/src/content/skills/frontend-ui-engineering/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/git-workflow-and-versioning/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/git-workflow-and-versioning/body.md +319 -0
- package/vendor/packages/toolkit/src/content/skills/git-workflow-and-versioning/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/idea-refine/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/idea-refine/body.md +173 -0
- package/vendor/packages/toolkit/src/content/skills/idea-refine/meta.yaml +17 -0
- package/vendor/packages/toolkit/src/content/skills/incremental-implementation/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/incremental-implementation/body.md +43 -0
- package/vendor/packages/toolkit/src/content/skills/incremental-implementation/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/skills/multi-perspective-review/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/multi-perspective-review/body.md +52 -0
- package/vendor/packages/toolkit/src/content/skills/multi-perspective-review/meta.yaml +18 -0
- package/vendor/packages/toolkit/src/content/skills/parallel-agent-dispatch/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/parallel-agent-dispatch/body.md +351 -0
- package/vendor/packages/toolkit/src/content/skills/parallel-agent-dispatch/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/skills/performance-optimization/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/performance-optimization/body.md +345 -0
- package/vendor/packages/toolkit/src/content/skills/performance-optimization/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/skills/planning-and-task-breakdown/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/planning-and-task-breakdown/body.md +48 -0
- package/vendor/packages/toolkit/src/content/skills/planning-and-task-breakdown/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/skills/release-documentation-sync/body.md +54 -0
- package/vendor/packages/toolkit/src/content/skills/release-documentation-sync/meta.yaml +15 -0
- package/vendor/packages/toolkit/src/content/skills/review-response-and-resolution/body.md +61 -0
- package/vendor/packages/toolkit/src/content/skills/review-response-and-resolution/meta.yaml +18 -0
- package/vendor/packages/toolkit/src/content/skills/safety-guardrails/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/safety-guardrails/body.md +43 -0
- package/vendor/packages/toolkit/src/content/skills/safety-guardrails/meta.yaml +17 -0
- package/vendor/packages/toolkit/src/content/skills/sdd-tdd-workflow/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/sdd-tdd-workflow/body.md +371 -0
- package/vendor/packages/toolkit/src/content/skills/sdd-tdd-workflow/meta.yaml +25 -0
- package/vendor/packages/toolkit/src/content/skills/security-and-hardening/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/security-and-hardening/body.md +344 -0
- package/vendor/packages/toolkit/src/content/skills/security-and-hardening/meta.yaml +21 -0
- package/vendor/packages/toolkit/src/content/skills/shipping-and-launch/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/shipping-and-launch/body.md +55 -0
- package/vendor/packages/toolkit/src/content/skills/shipping-and-launch/meta.yaml +22 -0
- package/vendor/packages/toolkit/src/content/skills/source-driven-development/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/source-driven-development/body.md +186 -0
- package/vendor/packages/toolkit/src/content/skills/source-driven-development/meta.yaml +18 -0
- package/vendor/packages/toolkit/src/content/skills/spec-driven-development/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/spec-driven-development/body.md +49 -0
- package/vendor/packages/toolkit/src/content/skills/spec-driven-development/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/skills/sprint-retrospective/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/sprint-retrospective/body.md +336 -0
- package/vendor/packages/toolkit/src/content/skills/sprint-retrospective/meta.yaml +17 -0
- package/vendor/packages/toolkit/src/content/skills/subagent-driven-development/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/subagent-driven-development/body.md +228 -0
- package/vendor/packages/toolkit/src/content/skills/subagent-driven-development/meta.yaml +19 -0
- package/vendor/packages/toolkit/src/content/skills/team-orchestration/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/team-orchestration/body.md +372 -0
- package/vendor/packages/toolkit/src/content/skills/team-orchestration/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/skills/test-driven-development/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/test-driven-development/body.md +374 -0
- package/vendor/packages/toolkit/src/content/skills/test-driven-development/meta.yaml +20 -0
- package/vendor/packages/toolkit/src/content/skills/using-agent-skills/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/using-agent-skills/body.md +169 -0
- package/vendor/packages/toolkit/src/content/skills/using-agent-skills/meta.yaml +23 -0
- package/vendor/packages/toolkit/src/content/skills/verification-before-completion/assets/.gitkeep +0 -0
- package/vendor/packages/toolkit/src/content/skills/verification-before-completion/body.md +68 -0
- package/vendor/packages/toolkit/src/content/skills/verification-before-completion/meta.yaml +20 -0
- package/vendor/packages/toolkit/templates/README.md +12 -0
- package/vendor/packages/toolkit/templates/asset-unit/assets/.gitkeep +1 -0
- package/vendor/packages/toolkit/templates/asset-unit/body.md +3 -0
- package/vendor/packages/toolkit/templates/asset-unit/meta.yaml +6 -0
- package/vendor/references/upstreams.yaml +89 -0
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
# Browser QA Testing
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Unit tests verify functions. API tests verify endpoints. Neither tells you whether a user can actually log in, fill a form, or navigate your app without hitting a blank screen or a cryptic error. Browser-level QA testing fills this gap by driving a real browser through the same flows your users follow — clicking buttons, filling inputs, waiting for network responses, and validating what appears on screen.
|
|
6
|
+
|
|
7
|
+
**Why this matters:** The most common production incidents aren't logic bugs caught by unit tests — they're broken builds that render blank pages, API integrations that fail silently, modals that can't be dismissed, or forms that submit empty data. These only surface when a real browser renders real DOM, executes real JavaScript, and makes real network requests.
|
|
8
|
+
|
|
9
|
+
## When to Use
|
|
10
|
+
|
|
11
|
+
- After frontend component development is complete and you need to verify the integrated experience
|
|
12
|
+
- After user flow changes (new pages, modified navigation, updated forms)
|
|
13
|
+
- Before any release or deployment — as the final quality gate
|
|
14
|
+
- When visual regression is suspected (CSS changes, dependency upgrades, design system updates)
|
|
15
|
+
- When accessibility compliance needs verification (WCAG audits)
|
|
16
|
+
- After backend API changes that affect frontend behavior
|
|
17
|
+
- When a bug report describes browser-specific behavior you can't reproduce with unit tests
|
|
18
|
+
|
|
19
|
+
## 方法原则
|
|
20
|
+
|
|
21
|
+
- 先验证最小关键路径,再扩展到次要路径;不要一上来铺满低价值场景
|
|
22
|
+
- 浏览器 QA 的输出必须可作为证据使用,失败时要留下截图、trace、控制台或网络记录
|
|
23
|
+
- 对复杂改动谨慎推进,先锁定一条可复现路径,再扩大覆盖面
|
|
24
|
+
- 视觉、交互、网络、可访问性检查都应服务当前目标,而不是机械堆清单
|
|
25
|
+
|
|
26
|
+
## 最小关键路径
|
|
27
|
+
|
|
28
|
+
每轮浏览器 QA 至少先选 1-3 条“失败就不能放行”的路径,通常包括:
|
|
29
|
+
|
|
30
|
+
1. 进入应用或核心页面
|
|
31
|
+
2. 完成一次主要业务动作
|
|
32
|
+
3. 看到可验证的成功结果或明确错误反馈
|
|
33
|
+
|
|
34
|
+
如果这是一个 bug 修复,最小关键路径必须先覆盖“原始失败如何复现”和“修复后如何证明不再复发”。
|
|
35
|
+
|
|
36
|
+
## Tool Selection
|
|
37
|
+
|
|
38
|
+
### Playwright (Recommended)
|
|
39
|
+
|
|
40
|
+
Best overall choice for AI-driven QA workflows:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Strengths:
|
|
44
|
+
- Multi-browser (Chromium, Firefox, WebKit) with one API
|
|
45
|
+
- Auto-wait for elements (no manual sleep/waitFor)
|
|
46
|
+
- Built-in screenshot, video, and trace capture
|
|
47
|
+
- Network interception and mocking
|
|
48
|
+
- Native accessibility testing via @axe-core/playwright
|
|
49
|
+
|
|
50
|
+
Install: npm init playwright@latest
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Cypress
|
|
54
|
+
|
|
55
|
+
Better for teams already invested in the Cypress ecosystem:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
Strengths:
|
|
59
|
+
- Excellent interactive test runner with time-travel debugging
|
|
60
|
+
- Rich plugin ecosystem
|
|
61
|
+
- Good for component testing in isolation
|
|
62
|
+
|
|
63
|
+
Limitations:
|
|
64
|
+
- Chromium-family only (no Safari/WebKit)
|
|
65
|
+
- Cannot test multiple browser tabs or origins in one test
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Puppeteer
|
|
69
|
+
|
|
70
|
+
Use only when you need raw Chrome DevTools Protocol access:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
Strengths:
|
|
74
|
+
- Direct CDP access for advanced scenarios (performance profiling, coverage)
|
|
75
|
+
- Lightweight if you only need Chrome
|
|
76
|
+
|
|
77
|
+
Limitations:
|
|
78
|
+
- Chrome/Chromium only
|
|
79
|
+
- No built-in test runner — you must bring your own
|
|
80
|
+
- More boilerplate than Playwright for common tasks
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Decision rule:** Default to Playwright unless the project already uses Cypress. Use Puppeteer only for Chrome-specific DevTools scenarios.
|
|
84
|
+
|
|
85
|
+
### Browser Configuration
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// playwright.config.ts — recommended baseline
|
|
89
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
90
|
+
|
|
91
|
+
export default defineConfig({
|
|
92
|
+
testDir: './e2e',
|
|
93
|
+
timeout: 30_000,
|
|
94
|
+
retries: process.env.CI ? 2 : 0,
|
|
95
|
+
use: {
|
|
96
|
+
baseURL: process.env.BASE_URL || 'http://localhost:3000',
|
|
97
|
+
screenshot: 'only-on-failure',
|
|
98
|
+
video: 'retain-on-failure',
|
|
99
|
+
trace: 'retain-on-failure',
|
|
100
|
+
},
|
|
101
|
+
projects: [
|
|
102
|
+
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
|
|
103
|
+
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
|
|
104
|
+
{ name: 'webkit', use: { ...devices['Desktop Safari'] } },
|
|
105
|
+
{ name: 'mobile-chrome', use: { ...devices['Pixel 5'] } },
|
|
106
|
+
{ name: 'mobile-safari', use: { ...devices['iPhone 13'] } },
|
|
107
|
+
],
|
|
108
|
+
webServer: {
|
|
109
|
+
command: 'npm run dev',
|
|
110
|
+
port: 3000,
|
|
111
|
+
reuseExistingServer: !process.env.CI,
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## QA Testing Workflow
|
|
117
|
+
|
|
118
|
+
### Step 1: Environment Preparation
|
|
119
|
+
|
|
120
|
+
Before any browser test can run, the application must be running and data must be in a known state.
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
Pre-flight checklist:
|
|
124
|
+
□ Application builds without errors
|
|
125
|
+
□ Dev server or preview server is running and responding
|
|
126
|
+
□ Test database is seeded with known data (or API mocks are configured)
|
|
127
|
+
□ Environment variables are set (API URLs, feature flags)
|
|
128
|
+
□ No port conflicts on the target URL
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Seed data strategy:** Either use a test database with fixtures, or intercept network requests and return mock responses. Never rely on production data for QA tests.
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// Example: API mocking with Playwright
|
|
135
|
+
test.beforeEach(async ({ page }) => {
|
|
136
|
+
await page.route('**/api/tasks', route =>
|
|
137
|
+
route.fulfill({
|
|
138
|
+
status: 200,
|
|
139
|
+
contentType: 'application/json',
|
|
140
|
+
body: JSON.stringify([
|
|
141
|
+
{ id: 1, title: 'Test task', done: false },
|
|
142
|
+
{ id: 2, title: 'Completed task', done: true },
|
|
143
|
+
]),
|
|
144
|
+
})
|
|
145
|
+
);
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Step 2: Core User Flow Testing
|
|
150
|
+
|
|
151
|
+
Test the critical paths a real user follows. Prioritize by business impact:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
Priority 1 (Must pass — blocks release):
|
|
155
|
+
- Authentication (login, logout, session persistence)
|
|
156
|
+
- Primary CRUD operations (create, read, update, delete core entities)
|
|
157
|
+
- Payment/checkout flows (if applicable)
|
|
158
|
+
- Navigation between main sections
|
|
159
|
+
|
|
160
|
+
Priority 2 (Should pass — file bugs if broken):
|
|
161
|
+
- Search and filtering
|
|
162
|
+
- Settings and preferences
|
|
163
|
+
- Notification flows
|
|
164
|
+
- Export/import operations
|
|
165
|
+
|
|
166
|
+
Priority 3 (Nice to have):
|
|
167
|
+
- Edge case interactions
|
|
168
|
+
- Rarely used features
|
|
169
|
+
- Admin-only flows
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
先把 Priority 1 做成稳定、可重复、可留证据的路径;在它们还不稳定时,不要把精力优先花在长尾流程上。
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
// Example: Complete login → dashboard → action flow
|
|
176
|
+
test('user can log in and create a task', async ({ page }) => {
|
|
177
|
+
await page.goto('/login');
|
|
178
|
+
|
|
179
|
+
await page.getByLabel('Email').fill('user@test.com');
|
|
180
|
+
await page.getByLabel('Password').fill('testpass123');
|
|
181
|
+
await page.getByRole('button', { name: 'Sign in' }).click();
|
|
182
|
+
|
|
183
|
+
// Verify redirect to dashboard
|
|
184
|
+
await expect(page).toHaveURL('/dashboard');
|
|
185
|
+
await expect(page.getByRole('heading', { name: 'My Tasks' })).toBeVisible();
|
|
186
|
+
|
|
187
|
+
// Create a new task
|
|
188
|
+
await page.getByRole('button', { name: 'New Task' }).click();
|
|
189
|
+
await page.getByLabel('Task title').fill('Write QA tests');
|
|
190
|
+
await page.getByRole('button', { name: 'Save' }).click();
|
|
191
|
+
|
|
192
|
+
// Verify task appears in list
|
|
193
|
+
await expect(page.getByText('Write QA tests')).toBeVisible();
|
|
194
|
+
});
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Step 3: Interaction Testing
|
|
198
|
+
|
|
199
|
+
Test form submissions, navigation, and state changes that go beyond happy-path flows:
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
// Form validation testing
|
|
203
|
+
test('form shows validation errors for invalid input', async ({ page }) => {
|
|
204
|
+
await page.goto('/register');
|
|
205
|
+
|
|
206
|
+
// Submit empty form
|
|
207
|
+
await page.getByRole('button', { name: 'Create account' }).click();
|
|
208
|
+
|
|
209
|
+
// Check validation messages appear
|
|
210
|
+
await expect(page.getByText('Email is required')).toBeVisible();
|
|
211
|
+
await expect(page.getByText('Password must be at least 8 characters')).toBeVisible();
|
|
212
|
+
|
|
213
|
+
// Check invalid email
|
|
214
|
+
await page.getByLabel('Email').fill('not-an-email');
|
|
215
|
+
await page.getByRole('button', { name: 'Create account' }).click();
|
|
216
|
+
await expect(page.getByText('Enter a valid email address')).toBeVisible();
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// Navigation and back-button behavior
|
|
220
|
+
test('browser back button returns to previous page', async ({ page }) => {
|
|
221
|
+
await page.goto('/tasks');
|
|
222
|
+
await page.getByText('Task 1').click();
|
|
223
|
+
await expect(page).toHaveURL(/\/tasks\/\d+/);
|
|
224
|
+
|
|
225
|
+
await page.goBack();
|
|
226
|
+
await expect(page).toHaveURL('/tasks');
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Step 4: Visual Verification
|
|
231
|
+
|
|
232
|
+
Use screenshots to detect visual regressions:
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
// Full-page screenshot comparison
|
|
236
|
+
test('dashboard matches visual baseline', async ({ page }) => {
|
|
237
|
+
await page.goto('/dashboard');
|
|
238
|
+
await page.waitForLoadState('networkidle');
|
|
239
|
+
|
|
240
|
+
await expect(page).toHaveScreenshot('dashboard.png', {
|
|
241
|
+
maxDiffPixelRatio: 0.01, // Allow 1% pixel difference
|
|
242
|
+
fullPage: true,
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
// Component-level screenshot
|
|
247
|
+
test('task card renders correctly', async ({ page }) => {
|
|
248
|
+
await page.goto('/tasks');
|
|
249
|
+
const card = page.getByTestId('task-card').first();
|
|
250
|
+
|
|
251
|
+
await expect(card).toHaveScreenshot('task-card.png');
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**Update baselines** when intentional visual changes are made: `npx playwright test --update-snapshots`
|
|
256
|
+
|
|
257
|
+
### Step 4.5: Failure Regression Evidence
|
|
258
|
+
|
|
259
|
+
当测试失败时,至少保留一类可以复盘的证据:
|
|
260
|
+
|
|
261
|
+
- 截图,证明页面状态与预期不符
|
|
262
|
+
- trace 或录像,证明交互链路在哪里中断
|
|
263
|
+
- console error / network failure,证明是前端异常、接口失败还是环境问题
|
|
264
|
+
|
|
265
|
+
没有证据的“浏览器测过了”不构成可审查的结论。
|
|
266
|
+
|
|
267
|
+
### Step 5: Accessibility Audit
|
|
268
|
+
|
|
269
|
+
Integrate axe-core for automated WCAG compliance checking:
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
import AxeBuilder from '@axe-core/playwright';
|
|
273
|
+
|
|
274
|
+
test('home page has no accessibility violations', async ({ page }) => {
|
|
275
|
+
await page.goto('/');
|
|
276
|
+
|
|
277
|
+
const results = await new AxeBuilder({ page })
|
|
278
|
+
.withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa'])
|
|
279
|
+
.analyze();
|
|
280
|
+
|
|
281
|
+
expect(results.violations).toEqual([]);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
// Targeted audit on specific component
|
|
285
|
+
test('modal dialog meets accessibility standards', async ({ page }) => {
|
|
286
|
+
await page.goto('/tasks');
|
|
287
|
+
await page.getByRole('button', { name: 'New Task' }).click();
|
|
288
|
+
|
|
289
|
+
const modal = page.getByRole('dialog');
|
|
290
|
+
const results = await new AxeBuilder({ page })
|
|
291
|
+
.include(await modal.elementHandle())
|
|
292
|
+
.analyze();
|
|
293
|
+
|
|
294
|
+
expect(results.violations).toEqual([]);
|
|
295
|
+
});
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**Manual keyboard checks to include:**
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
□ Tab order follows visual order
|
|
302
|
+
□ Focus is visible on all interactive elements
|
|
303
|
+
□ Escape closes modals and dropdowns
|
|
304
|
+
□ Enter/Space activates buttons and links
|
|
305
|
+
□ Arrow keys work in menus and listboxes
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Step 6: Console and Network Monitoring
|
|
309
|
+
|
|
310
|
+
Enforce a zero-error policy in the browser console and verify network behavior:
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
// Collect console errors during test
|
|
314
|
+
test('page loads without console errors', async ({ page }) => {
|
|
315
|
+
const errors: string[] = [];
|
|
316
|
+
page.on('console', msg => {
|
|
317
|
+
if (msg.type() === 'error') errors.push(msg.text());
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
await page.goto('/dashboard');
|
|
321
|
+
await page.waitForLoadState('networkidle');
|
|
322
|
+
|
|
323
|
+
// Filter out known third-party noise if needed
|
|
324
|
+
const realErrors = errors.filter(e => !e.includes('third-party-sdk'));
|
|
325
|
+
expect(realErrors).toHaveLength(0);
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
// Verify no failed network requests
|
|
329
|
+
test('all API requests succeed', async ({ page }) => {
|
|
330
|
+
const failedRequests: string[] = [];
|
|
331
|
+
page.on('response', response => {
|
|
332
|
+
if (response.status() >= 400) {
|
|
333
|
+
failedRequests.push(`${response.status()} ${response.url()}`);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
await page.goto('/dashboard');
|
|
338
|
+
await page.waitForLoadState('networkidle');
|
|
339
|
+
|
|
340
|
+
expect(failedRequests).toHaveLength(0);
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
// Verify specific API calls are made
|
|
344
|
+
test('dashboard fetches tasks on load', async ({ page }) => {
|
|
345
|
+
const apiCalls: string[] = [];
|
|
346
|
+
page.on('request', req => {
|
|
347
|
+
if (req.url().includes('/api/')) apiCalls.push(req.url());
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
await page.goto('/dashboard');
|
|
351
|
+
await page.waitForLoadState('networkidle');
|
|
352
|
+
|
|
353
|
+
expect(apiCalls.some(url => url.includes('/api/tasks'))).toBe(true);
|
|
354
|
+
});
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Step 7: Regression Test Generation
|
|
358
|
+
|
|
359
|
+
When a bug is found during QA, immediately convert it into an automated test:
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
// Bug found: clicking "Delete" on last task causes blank screen
|
|
363
|
+
// → Convert to regression test:
|
|
364
|
+
|
|
365
|
+
test('deleting the last task shows empty state instead of blank screen', async ({ page }) => {
|
|
366
|
+
// Setup: single task
|
|
367
|
+
await page.route('**/api/tasks', route =>
|
|
368
|
+
route.fulfill({ body: JSON.stringify([{ id: 1, title: 'Only task', done: false }]) })
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
await page.goto('/tasks');
|
|
372
|
+
await page.getByRole('button', { name: 'Delete' }).click();
|
|
373
|
+
await page.getByRole('button', { name: 'Confirm' }).click();
|
|
374
|
+
|
|
375
|
+
// Should show empty state, not blank screen
|
|
376
|
+
await expect(page.getByText('No tasks yet')).toBeVisible();
|
|
377
|
+
await expect(page.getByRole('button', { name: 'Create Task' })).toBeVisible();
|
|
378
|
+
});
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
## Common Test Scenario Templates
|
|
382
|
+
|
|
383
|
+
### Login/Registration
|
|
384
|
+
|
|
385
|
+
```typescript
|
|
386
|
+
test.describe('Authentication', () => {
|
|
387
|
+
test('successful login redirects to dashboard', async ({ page }) => { /* ... */ });
|
|
388
|
+
test('wrong password shows error message', async ({ page }) => { /* ... */ });
|
|
389
|
+
test('session persists across page reload', async ({ page }) => { /* ... */ });
|
|
390
|
+
test('logout clears session and redirects to login', async ({ page }) => { /* ... */ });
|
|
391
|
+
test('registration with valid data creates account', async ({ page }) => { /* ... */ });
|
|
392
|
+
test('registration with duplicate email shows error', async ({ page }) => { /* ... */ });
|
|
393
|
+
});
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### CRUD Operations
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
test.describe('Task CRUD', () => {
|
|
400
|
+
test('create: new task appears in list', async ({ page }) => { /* ... */ });
|
|
401
|
+
test('read: task detail page shows all fields', async ({ page }) => { /* ... */ });
|
|
402
|
+
test('update: edited task saves and reflects changes', async ({ page }) => { /* ... */ });
|
|
403
|
+
test('delete: removed task disappears with confirmation', async ({ page }) => { /* ... */ });
|
|
404
|
+
test('bulk: select-all and batch delete works', async ({ page }) => { /* ... */ });
|
|
405
|
+
});
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Responsive Layout
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
const viewports = [
|
|
412
|
+
{ name: 'mobile', width: 375, height: 812 },
|
|
413
|
+
{ name: 'tablet', width: 768, height: 1024 },
|
|
414
|
+
{ name: 'desktop', width: 1440, height: 900 },
|
|
415
|
+
];
|
|
416
|
+
|
|
417
|
+
for (const vp of viewports) {
|
|
418
|
+
test(`dashboard layout is correct at ${vp.name}`, async ({ page }) => {
|
|
419
|
+
await page.setViewportSize({ width: vp.width, height: vp.height });
|
|
420
|
+
await page.goto('/dashboard');
|
|
421
|
+
await expect(page).toHaveScreenshot(`dashboard-${vp.name}.png`);
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### Error State Display
|
|
427
|
+
|
|
428
|
+
```typescript
|
|
429
|
+
test.describe('Error handling', () => {
|
|
430
|
+
test('API failure shows error message with retry button', async ({ page }) => {
|
|
431
|
+
await page.route('**/api/tasks', route => route.fulfill({ status: 500 }));
|
|
432
|
+
await page.goto('/tasks');
|
|
433
|
+
|
|
434
|
+
await expect(page.getByText('Something went wrong')).toBeVisible();
|
|
435
|
+
await expect(page.getByRole('button', { name: 'Retry' })).toBeVisible();
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
test('404 page shows helpful navigation', async ({ page }) => {
|
|
439
|
+
await page.goto('/nonexistent-page');
|
|
440
|
+
await expect(page.getByText('Page not found')).toBeVisible();
|
|
441
|
+
await expect(page.getByRole('link', { name: 'Go home' })).toBeVisible();
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
## QA Report Format
|
|
447
|
+
|
|
448
|
+
After a QA run, produce a structured report:
|
|
449
|
+
|
|
450
|
+
```markdown
|
|
451
|
+
## QA Report — [Feature/Page Name] — [Date]
|
|
452
|
+
|
|
453
|
+
### Environment
|
|
454
|
+
- URL: http://localhost:3000
|
|
455
|
+
- Browser: Chromium 120, Firefox 121, WebKit 17.4
|
|
456
|
+
- Viewport: 1440×900 (desktop), 375×812 (mobile)
|
|
457
|
+
|
|
458
|
+
### Summary
|
|
459
|
+
- Total tests: 24
|
|
460
|
+
- ✅ Passed: 21
|
|
461
|
+
- ❌ Failed: 2
|
|
462
|
+
- ⚠️ Flaky: 1
|
|
463
|
+
|
|
464
|
+
### Failed Tests
|
|
465
|
+
| Test | Browser | Error | Screenshot |
|
|
466
|
+
|------|---------|-------|------------|
|
|
467
|
+
| Login form validation | WebKit | "Email required" message not visible |  |
|
|
468
|
+
| Task delete on mobile | Mobile Chrome | Confirm button outside viewport |  |
|
|
469
|
+
|
|
470
|
+
### Accessibility Audit
|
|
471
|
+
- Violations found: 3
|
|
472
|
+
1. Missing alt text on user avatar (img element) — Critical
|
|
473
|
+
2. Color contrast ratio 3.8:1 on secondary text — Moderate
|
|
474
|
+
3. Missing aria-label on icon-only button — Moderate
|
|
475
|
+
|
|
476
|
+
### Console Errors
|
|
477
|
+
- None (clean)
|
|
478
|
+
|
|
479
|
+
### Network Issues
|
|
480
|
+
- None (all requests 2xx)
|
|
481
|
+
|
|
482
|
+
### Recommendations
|
|
483
|
+
1. [Critical] Fix WebKit form validation display — blocks release
|
|
484
|
+
2. [Critical] Fix mobile viewport overflow on delete confirmation
|
|
485
|
+
3. [Moderate] Add missing alt text and aria-labels
|
|
486
|
+
4. [Low] Improve secondary text contrast ratio
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
## Integration with Other Skills
|
|
490
|
+
|
|
491
|
+
### With `frontend-ui-engineering`
|
|
492
|
+
|
|
493
|
+
Development → QA feedback loop:
|
|
494
|
+
|
|
495
|
+
```
|
|
496
|
+
Build component → Run QA → Fix issues → Re-run QA → Approve
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
QA tests validate everything the frontend skill specifies: accessibility, responsive behavior, loading/error/empty states.
|
|
500
|
+
|
|
501
|
+
### With `test-driven-development`
|
|
502
|
+
|
|
503
|
+
TDD covers unit and integration layers. Browser QA adds the E2E layer:
|
|
504
|
+
|
|
505
|
+
```
|
|
506
|
+
Unit tests (TDD) → Function-level correctness
|
|
507
|
+
Integration tests → Module interaction
|
|
508
|
+
Browser QA tests → User-facing experience (this skill)
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### With `verification-before-completion`
|
|
512
|
+
|
|
513
|
+
QA test results serve as concrete verification evidence:
|
|
514
|
+
|
|
515
|
+
```
|
|
516
|
+
Verification evidence:
|
|
517
|
+
- 24/24 browser tests passing
|
|
518
|
+
- Zero console errors
|
|
519
|
+
- Zero accessibility violations
|
|
520
|
+
- Screenshots attached for visual confirmation
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
## Common Rationalizations
|
|
524
|
+
|
|
525
|
+
| Rationalization | Reality |
|
|
526
|
+
|---|---|
|
|
527
|
+
| "Unit tests are enough" | Unit tests can't catch a broken layout, a missing button, or a form that submits empty data. |
|
|
528
|
+
| "Manual QA is faster" | Manual QA is faster once. Automated QA is faster every time after that — and it doesn't forget edge cases. |
|
|
529
|
+
| "E2E tests are too slow" | A focused suite of 20-30 critical-path tests runs in under 2 minutes. That's faster than debugging a production incident. |
|
|
530
|
+
| "We'll add browser tests later" | Later never comes. The cost of writing tests increases as the app grows. Start with the critical paths now. |
|
|
531
|
+
| "It works on my machine" | Browser tests run in consistent environments. They catch the cross-browser and viewport issues you won't see on your dev setup. |
|
|
532
|
+
|
|
533
|
+
## Red Flags
|
|
534
|
+
|
|
535
|
+
- No browser tests exist for user-facing features
|
|
536
|
+
- QA is only done manually before releases (no automation)
|
|
537
|
+
- Tests use arbitrary `sleep()` / `waitForTimeout()` instead of proper element assertions
|
|
538
|
+
- Screenshot baselines haven't been updated in months (everything is ignored)
|
|
539
|
+
- Accessibility audits have never been run
|
|
540
|
+
- Console errors are ignored ("it's just a warning")
|
|
541
|
+
- Tests only run in one browser (skipping Firefox/WebKit/mobile)
|
|
542
|
+
- No test data seeding — tests depend on production data or shared environments
|
|
543
|
+
|
|
544
|
+
## Verification
|
|
545
|
+
|
|
546
|
+
After QA testing is complete:
|
|
547
|
+
|
|
548
|
+
- [ ] All Priority 1 (critical path) tests pass across target browsers
|
|
549
|
+
- [ ] Zero unhandled console errors in the browser
|
|
550
|
+
- [ ] Accessibility audit shows zero critical violations
|
|
551
|
+
- [ ] Visual screenshots are captured and reviewed
|
|
552
|
+
- [ ] Failed tests have filed bugs with reproduction steps
|
|
553
|
+
- [ ] Regression tests are written for any bugs discovered
|
|
554
|
+
- [ ] QA report is generated with pass/fail summary and evidence
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
kind: skill
|
|
2
|
+
name: browser-qa-testing
|
|
3
|
+
title: 浏览器质检
|
|
4
|
+
description: 对运行中的应用执行真实浏览器 QA 测试。适用于前端改动后、发布前,或单元/API 测试通过但仍需确认真实用户体验时,覆盖流程测试、视觉回归、可访问性以及控制台和网络监控。
|
|
5
|
+
tier: recommended
|
|
6
|
+
audience: advanced
|
|
7
|
+
stability: stable
|
|
8
|
+
suggests:
|
|
9
|
+
- skill:verification-before-completion
|
|
10
|
+
platforms:
|
|
11
|
+
- qwen
|
|
12
|
+
- codex
|
|
13
|
+
- qoder
|
|
14
|
+
source:
|
|
15
|
+
upstream: agent-skills
|
|
16
|
+
strategy: adapted
|
|
17
|
+
origin_name: browser-qa-testing
|
|
18
|
+
origin_path: skills/browser-qa-testing/SKILL.md
|
|
19
|
+
origin_id: skill:browser-qa-testing
|
|
20
|
+
notes: 沿用上游浏览器 QA 能力,并结合本仓库验证门禁输出。
|
|
File without changes
|