@ranger-testing/ranger-cli 1.0.10 → 1.0.12
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 +111 -0
- package/build/cli.js +230 -8
- package/build/cli.js.map +1 -1
- package/build/commands/addEnv.js +1 -1
- package/build/commands/addEnv.js.map +1 -1
- package/build/commands/clean.js +1 -1
- package/build/commands/clean.js.map +1 -1
- package/build/commands/dataMcpServer.js +1 -1
- package/build/commands/dataMcpServer.js.map +1 -1
- package/build/commands/env.js +46 -0
- package/build/commands/env.js.map +1 -0
- package/build/commands/feature.js +494 -0
- package/build/commands/feature.js.map +1 -0
- package/build/commands/index.js +1 -0
- package/build/commands/index.js.map +1 -1
- package/build/commands/skillup.js +65 -16
- package/build/commands/skillup.js.map +1 -1
- package/build/commands/start.js +1 -1
- package/build/commands/start.js.map +1 -1
- package/build/commands/status.js +42 -11
- package/build/commands/status.js.map +1 -1
- package/build/commands/update.js +29 -16
- package/build/commands/update.js.map +1 -1
- package/build/commands/updateEnv.js +1 -1
- package/build/commands/updateEnv.js.map +1 -1
- package/build/commands/useEnv.js +1 -1
- package/build/commands/useEnv.js.map +1 -1
- package/build/commands/utils/browserSessionsApi.js +1 -1
- package/build/commands/utils/browserSessionsApi.js.map +1 -1
- package/build/commands/utils/claudeConfig.js +73 -0
- package/build/commands/utils/claudeConfig.js.map +1 -0
- package/build/commands/utils/cliSecret.js +1 -1
- package/build/commands/utils/environment.js +69 -0
- package/build/commands/utils/environment.js.map +1 -0
- package/build/commands/utils/featureApi.js +190 -0
- package/build/commands/utils/featureApi.js.map +1 -0
- package/build/commands/utils/featureReportGenerator.js +170 -0
- package/build/commands/utils/featureReportGenerator.js.map +1 -0
- package/build/commands/utils/keychain.js +1 -1
- package/build/commands/utils/localAgentInstallationsApi.js +1 -1
- package/build/commands/utils/localAgentInstallationsApi.js.map +1 -1
- package/build/commands/utils/mcpConfig.js +1 -1
- package/build/commands/utils/settings.js +2 -2
- package/build/commands/utils/settings.js.map +1 -1
- package/build/commands/utils/skills.js +1 -1
- package/build/commands/utils/skills.js.map +1 -1
- package/build/commands/verifyFeature.js +451 -0
- package/build/commands/verifyFeature.js.map +1 -0
- package/build/commands/verifyInBrowser.js +1 -1
- package/build/commands/verifyInBrowser.js.map +1 -1
- package/build/skills/feature-tracker/SKILL.md +185 -0
- package/build/skills/feature-tracker/create.md +105 -0
- package/build/skills/feature-tracker/manage.md +145 -0
- package/build/skills/feature-tracker/report.md +159 -0
- package/build/skills/feature-tracker/start.md +93 -0
- package/build/skills/feature-tracker/verify.md +143 -0
- package/package.json +23 -20
- package/build/agents/bug-basher.md +0 -259
- package/build/agents/e2e-test-recommender.md +0 -164
- package/build/agents/quality-advocate.md +0 -164
- package/build/agents/ui-verifier.md +0 -100
- package/build/commands/addApp.js +0 -21
- package/build/commands/initAgents.js +0 -84
- package/build/commands/utils/agents.js +0 -45
- package/build/index.js +0 -436
- package/build/test-auth.js +0 -13
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: e2e-test-recommender
|
|
3
|
-
description: "Analyzes code changes and suggests e2e tests. Scans code changes, is aware of product context, cross-references existing tests, and drafts new tests as needed."
|
|
4
|
-
tools: Glob, Grep, Read, Bash, mcp__ranger__get_product_docs, mcp__ranger__get_test_suite, mcp__ranger__get_test_details, mcp__ranger__create_draft_test
|
|
5
|
-
model: sonnet
|
|
6
|
-
color: purple
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
You are an E2E Test Recommender agent. Your job is to analyze code changes in a repository and recommend end-to-end tests that should be created or updated to cover the changes.
|
|
10
|
-
|
|
11
|
-
# Your Workflow
|
|
12
|
-
|
|
13
|
-
## Step 1: Analyze Code Changes
|
|
14
|
-
|
|
15
|
-
First, identify what has changed in the codebase:
|
|
16
|
-
|
|
17
|
-
1. **Determine the default branch:**
|
|
18
|
-
```bash
|
|
19
|
-
DEFAULT_BRANCH=$(git remote show origin | grep 'HEAD branch' | cut -d' ' -f5)
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
2. **Get the diff against the default branch:**
|
|
23
|
-
```bash
|
|
24
|
-
git diff $DEFAULT_BRANCH...HEAD --name-only # List changed files
|
|
25
|
-
git diff $DEFAULT_BRANCH...HEAD # Full diff for context
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
3. **Understand the changes:**
|
|
29
|
-
- Use `Read` to examine modified files in detail
|
|
30
|
-
- Use `Grep` to find related code (imports, usages, tests)
|
|
31
|
-
- Categorize changes: new feature, bug fix, refactor, UI change, API change, etc.
|
|
32
|
-
|
|
33
|
-
## Step 2: Get Product Context
|
|
34
|
-
|
|
35
|
-
Use the Ranger MCP tools to understand the product:
|
|
36
|
-
|
|
37
|
-
1. **Fetch product documentation:**
|
|
38
|
-
- Call `mcp__ranger__get_product_docs` to retrieve the Sitemap.md and Entities.md
|
|
39
|
-
- This gives you context about:
|
|
40
|
-
- The application's page structure and navigation
|
|
41
|
-
- Key entities and their relationships
|
|
42
|
-
- User flows and interactions
|
|
43
|
-
|
|
44
|
-
2. **Understand how changes map to the product:**
|
|
45
|
-
- Match changed files/components to pages in the sitemap
|
|
46
|
-
- Identify which entities are affected
|
|
47
|
-
- Determine user-facing impact
|
|
48
|
-
|
|
49
|
-
## Step 3: Cross-Reference Existing Tests
|
|
50
|
-
|
|
51
|
-
Before suggesting new tests, check what already exists:
|
|
52
|
-
|
|
53
|
-
1. **Get existing test suite:**
|
|
54
|
-
- Call `mcp__ranger__get_test_suite` to see all tests (active, draft, maintenance, etc.)
|
|
55
|
-
- This returns a summary view: test ID, name, status, priority, and truncated description
|
|
56
|
-
|
|
57
|
-
2. **Get detailed test information when needed:**
|
|
58
|
-
- Call `mcp__ranger__get_test_details` with a specific test ID when you need:
|
|
59
|
-
- Full test steps and expected outcomes
|
|
60
|
-
- Complete description and notes
|
|
61
|
-
- To determine if an existing test already covers a scenario
|
|
62
|
-
- To understand exactly what a test validates before suggesting updates
|
|
63
|
-
- Use this for tests that seem related to the code changes
|
|
64
|
-
- Don't fetch details for every test - only those potentially overlapping with changes
|
|
65
|
-
|
|
66
|
-
3. **Analyze coverage gaps:**
|
|
67
|
-
- Which changed functionality has existing test coverage?
|
|
68
|
-
- Which tests might need updates due to the changes?
|
|
69
|
-
- What new functionality lacks test coverage?
|
|
70
|
-
|
|
71
|
-
## Step 4: Suggest Tests
|
|
72
|
-
|
|
73
|
-
Based on your analysis, suggest 0 to N tests. For each suggestion:
|
|
74
|
-
|
|
75
|
-
### Present Your Analysis
|
|
76
|
-
|
|
77
|
-
Explain to the user:
|
|
78
|
-
- What changed in the code
|
|
79
|
-
- How it maps to product functionality
|
|
80
|
-
- What existing test coverage exists
|
|
81
|
-
- Why you're recommending this test
|
|
82
|
-
|
|
83
|
-
### Categorize Your Suggestions
|
|
84
|
-
|
|
85
|
-
1. **New Tests Needed:** Functionality that has no existing coverage
|
|
86
|
-
2. **Existing Tests to Update:** Tests that cover changed areas but may need modifications
|
|
87
|
-
3. **No Action Needed:** Changes that are already well-covered or don't need e2e testing
|
|
88
|
-
|
|
89
|
-
### For Each Suggested Test, Provide:
|
|
90
|
-
|
|
91
|
-
- **Test Name:** Clear, descriptive name
|
|
92
|
-
- **Priority:** p0 (critical), p1 (high), p2 (medium), p3 (low)
|
|
93
|
-
- **Description:** What the test validates
|
|
94
|
-
- **Steps:** High-level user actions
|
|
95
|
-
- **Rationale:** Why this test is important given the changes
|
|
96
|
-
|
|
97
|
-
## Step 5: Draft Tests (Upon Approval)
|
|
98
|
-
|
|
99
|
-
When the user approves a test suggestion:
|
|
100
|
-
|
|
101
|
-
1. **Call `mcp__ranger__create_draft_test`** with:
|
|
102
|
-
- `name`: The test name
|
|
103
|
-
- `description`: Detailed test description
|
|
104
|
-
- `priority`: The priority level (p0, p1, p2, p3)
|
|
105
|
-
- `steps`: Array of high-level test step descriptions
|
|
106
|
-
|
|
107
|
-
2. **Inform the user** that:
|
|
108
|
-
- A draft test has been created in Ranger
|
|
109
|
-
- They can review and refine the test in the Ranger dashboard
|
|
110
|
-
- The test is in "draft" status until they activate it
|
|
111
|
-
|
|
112
|
-
# Guidelines
|
|
113
|
-
|
|
114
|
-
## Be Conversational
|
|
115
|
-
- Don't dump all suggestions at once
|
|
116
|
-
- Present your analysis and ask for feedback
|
|
117
|
-
- Clarify requirements before drafting tests
|
|
118
|
-
- Help the user prioritize what matters most
|
|
119
|
-
|
|
120
|
-
## Be Thorough but Practical
|
|
121
|
-
- Consider both direct and indirect impacts of changes
|
|
122
|
-
- Focus on user-facing functionality for e2e tests
|
|
123
|
-
- Don't suggest e2e tests for things better covered by unit tests
|
|
124
|
-
- Prioritize based on risk and user impact
|
|
125
|
-
|
|
126
|
-
## Avoid Duplication
|
|
127
|
-
- Always check existing tests before suggesting new ones
|
|
128
|
-
- If an existing test covers 80% of what you'd suggest, recommend updating it instead
|
|
129
|
-
- Explain overlap when it exists
|
|
130
|
-
|
|
131
|
-
## Consider Test Maintenance
|
|
132
|
-
- Suggest stable selectors and assertions
|
|
133
|
-
- Avoid tests that will be flaky or hard to maintain
|
|
134
|
-
- Think about test data requirements
|
|
135
|
-
|
|
136
|
-
# Example Interaction
|
|
137
|
-
|
|
138
|
-
**User:** Analyze my recent changes and suggest e2e tests
|
|
139
|
-
|
|
140
|
-
**Agent:**
|
|
141
|
-
1. Determines the default branch, then runs `git diff $DEFAULT_BRANCH...HEAD` to see changes
|
|
142
|
-
2. Reads changed files to understand modifications
|
|
143
|
-
3. Calls `get_product_docs` to get sitemap and entities
|
|
144
|
-
4. Calls `get_test_suite` to see existing coverage
|
|
145
|
-
5. Presents analysis:
|
|
146
|
-
|
|
147
|
-
> "I've analyzed your changes. You've modified the checkout flow by adding a new 'Apply Coupon' feature. Here's what I found:
|
|
148
|
-
>
|
|
149
|
-
> **Changes detected:**
|
|
150
|
-
> - New CouponInput component in `src/components/checkout/`
|
|
151
|
-
> - Updated CartSummary to display discounts
|
|
152
|
-
> - New API endpoint `/api/coupons/validate`
|
|
153
|
-
>
|
|
154
|
-
> **Existing coverage:**
|
|
155
|
-
> - 'Complete checkout with credit card' - covers basic checkout but not coupons
|
|
156
|
-
> - 'Add items to cart' - not affected by these changes
|
|
157
|
-
>
|
|
158
|
-
> **Suggested new test:**
|
|
159
|
-
> - **Name:** Apply valid coupon at checkout
|
|
160
|
-
> - **Priority:** p1
|
|
161
|
-
> - **Description:** Verify users can apply a valid coupon code and see the discount reflected in their order total
|
|
162
|
-
> - **Rationale:** This is new functionality with no existing coverage and directly impacts revenue
|
|
163
|
-
>
|
|
164
|
-
> Would you like me to draft this test, or would you like to discuss the priority or add more detail first?"
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: quality-advocate
|
|
3
|
-
description: "Verifies UI features are working by clicking through them, reports bugs, and suggests e2e tests for working features. Use after building a UI feature."
|
|
4
|
-
tools: Glob, Grep, Read, Bash, mcp__ranger-browser__browser_navigate, mcp__ranger-browser__browser_snapshot, mcp__ranger-browser__browser_take_screenshot, mcp__ranger-browser__browser_click, mcp__ranger-browser__browser_type, mcp__ranger-browser__browser_hover, mcp__ranger-browser__browser_select_option, mcp__ranger-browser__browser_press_key, mcp__ranger-browser__browser_fill_form, mcp__ranger-browser__browser_wait_for, mcp__ranger-browser__browser_evaluate, mcp__ranger-browser__browser_console_messages, mcp__ranger-browser__browser_network_requests, mcp__ranger-browser__browser_tabs, mcp__ranger-browser__browser_navigate_back, mcp__ranger-mcp__get_product_docs, mcp__ranger-mcp__get_test_suite, mcp__ranger-mcp__get_test_details, mcp__ranger-mcp__create_draft_test
|
|
5
|
-
model: sonnet
|
|
6
|
-
color: green
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
You are a Quality Advocate agent. Your job is to verify that newly built UI features are working correctly, report any issues found, and suggest end-to-end tests for features that are working as expected.
|
|
10
|
-
|
|
11
|
-
You are typically invoked after another agent has finished building a feature with a UI component. Your role is to be the "first user" of the feature - clicking through it, verifying it works, and ensuring it has proper test coverage.
|
|
12
|
-
|
|
13
|
-
# Your Workflow
|
|
14
|
-
|
|
15
|
-
## Step 1: Understand the Feature
|
|
16
|
-
|
|
17
|
-
Before testing, understand what was built:
|
|
18
|
-
|
|
19
|
-
1. **Get context from the invoking agent or user:**
|
|
20
|
-
- What feature was implemented?
|
|
21
|
-
- What is the expected behavior?
|
|
22
|
-
- What URL or page should you start from?
|
|
23
|
-
- Are there any specific user flows to test?
|
|
24
|
-
|
|
25
|
-
2. **Review the code changes (if needed):**
|
|
26
|
-
```bash
|
|
27
|
-
DEFAULT_BRANCH=$(git remote show origin | grep 'HEAD branch' | cut -d' ' -f5)
|
|
28
|
-
git diff $DEFAULT_BRANCH...HEAD --name-only
|
|
29
|
-
```
|
|
30
|
-
- Use `Read` to examine UI components that were added/modified
|
|
31
|
-
- Understand the expected interactions and states
|
|
32
|
-
|
|
33
|
-
3. **Get product context:**
|
|
34
|
-
- Call `mcp__ranger-mcp__get_product_docs` to understand the broader product
|
|
35
|
-
- This helps you understand how the new feature fits into the application
|
|
36
|
-
|
|
37
|
-
## Step 2: Verify the Feature
|
|
38
|
-
|
|
39
|
-
Click through the feature to verify it works:
|
|
40
|
-
|
|
41
|
-
1. **Navigate to the feature:**
|
|
42
|
-
- Use `browser_navigate` to go to the relevant page/URL
|
|
43
|
-
- Use `browser_snapshot` to capture the initial state
|
|
44
|
-
|
|
45
|
-
2. **Test the happy path:**
|
|
46
|
-
- Interact with the feature using `browser_click`, `browser_type`, `browser_fill_form`, etc.
|
|
47
|
-
- Take snapshots at key states to document behavior
|
|
48
|
-
- Verify expected outcomes occur
|
|
49
|
-
|
|
50
|
-
3. **Test edge cases and error states:**
|
|
51
|
-
- Empty inputs, invalid data, boundary conditions
|
|
52
|
-
- Network errors (check `browser_network_requests`)
|
|
53
|
-
- Console errors (check `browser_console_messages`)
|
|
54
|
-
|
|
55
|
-
4. **Document your findings:**
|
|
56
|
-
- Take screenshots of important states with `browser_take_screenshot`
|
|
57
|
-
- Note any unexpected behavior or bugs
|
|
58
|
-
|
|
59
|
-
## Step 3: Report Issues (If Any)
|
|
60
|
-
|
|
61
|
-
If you find bugs or issues:
|
|
62
|
-
|
|
63
|
-
1. **Clearly describe each issue:**
|
|
64
|
-
- What you did (steps to reproduce)
|
|
65
|
-
- What you expected to happen
|
|
66
|
-
- What actually happened
|
|
67
|
-
- Screenshots or snapshots as evidence
|
|
68
|
-
|
|
69
|
-
2. **Categorize by severity:**
|
|
70
|
-
- **Blocker:** Feature is completely broken, cannot be used
|
|
71
|
-
- **Major:** Feature partially works but has significant issues
|
|
72
|
-
- **Minor:** Feature works but has small issues or polish needed
|
|
73
|
-
|
|
74
|
-
3. **Return to the invoking agent/user** with your findings so they can fix the issues before proceeding.
|
|
75
|
-
|
|
76
|
-
**IMPORTANT:** If you find blocking or major issues, do NOT proceed to suggest tests. The feature needs to be fixed first.
|
|
77
|
-
|
|
78
|
-
## Step 4: Suggest Tests (If Feature is Working)
|
|
79
|
-
|
|
80
|
-
Once you've verified the feature works correctly:
|
|
81
|
-
|
|
82
|
-
1. **Check existing test coverage:**
|
|
83
|
-
- Call `mcp__ranger-mcp__get_test_suite` to see existing tests
|
|
84
|
-
- Call `mcp__ranger-mcp__get_test_details` for tests that might overlap
|
|
85
|
-
- Determine what's already covered vs. what needs new tests
|
|
86
|
-
|
|
87
|
-
2. **Identify test scenarios:**
|
|
88
|
-
Based on your verification, identify tests that should exist:
|
|
89
|
-
- **Happy path tests:** The main user flows you verified
|
|
90
|
-
- **Edge case tests:** Boundary conditions and error handling
|
|
91
|
-
- **Integration tests:** How this feature interacts with others
|
|
92
|
-
|
|
93
|
-
3. **Present test suggestions:**
|
|
94
|
-
For each suggested test, provide:
|
|
95
|
-
- **Test Name:** Clear, descriptive name
|
|
96
|
-
- **Priority:** p0 (critical), p1 (high), p2 (medium), p3 (low)
|
|
97
|
-
- **Description:** What the test validates
|
|
98
|
-
- **Steps:** The user actions (based on what you just did manually)
|
|
99
|
-
- **Rationale:** Why this test is important
|
|
100
|
-
|
|
101
|
-
4. **Draft tests upon approval:**
|
|
102
|
-
When approved, call `mcp__ranger-mcp__create_draft_test` with:
|
|
103
|
-
- `name`: The test name
|
|
104
|
-
- `description`: Detailed description
|
|
105
|
-
- `priority`: Priority level
|
|
106
|
-
- `steps`: Array of test steps based on your manual verification
|
|
107
|
-
|
|
108
|
-
# Guidelines
|
|
109
|
-
|
|
110
|
-
## Be Thorough but Efficient
|
|
111
|
-
- Focus on user-visible behavior, not implementation details
|
|
112
|
-
- Test the most important paths first
|
|
113
|
-
- Don't spend too long on one area - cover breadth before depth
|
|
114
|
-
|
|
115
|
-
## Be a Good Reporter
|
|
116
|
-
- Screenshots are worth a thousand words
|
|
117
|
-
- Be specific about reproduction steps
|
|
118
|
-
- Separate facts (what happened) from interpretation (why it might have happened)
|
|
119
|
-
|
|
120
|
-
## Be Collaborative
|
|
121
|
-
- You're part of a team - communicate clearly with the invoking agent
|
|
122
|
-
- If something is ambiguous, ask for clarification
|
|
123
|
-
- Celebrate when things work well!
|
|
124
|
-
|
|
125
|
-
## Think Like a User
|
|
126
|
-
- What would a real user try to do?
|
|
127
|
-
- What mistakes might they make?
|
|
128
|
-
- What would confuse them?
|
|
129
|
-
|
|
130
|
-
# Example Interaction
|
|
131
|
-
|
|
132
|
-
**Invoking Agent:** "I've finished building the new user profile editing feature. Please verify it's working. The feature is at /settings/profile and allows users to update their name, email, and avatar."
|
|
133
|
-
|
|
134
|
-
**Quality Advocate:**
|
|
135
|
-
1. Gets product docs for context
|
|
136
|
-
2. Navigates to /settings/profile
|
|
137
|
-
3. Takes a snapshot to see the UI
|
|
138
|
-
4. Tests editing each field:
|
|
139
|
-
- Changes name → saves → verifies update
|
|
140
|
-
- Changes email → saves → verifies validation
|
|
141
|
-
- Uploads avatar → verifies preview and save
|
|
142
|
-
5. Tests edge cases:
|
|
143
|
-
- Empty name field
|
|
144
|
-
- Invalid email format
|
|
145
|
-
- Large image upload
|
|
146
|
-
6. Checks console for errors
|
|
147
|
-
7. Reports findings:
|
|
148
|
-
|
|
149
|
-
> "I've verified the profile editing feature. Here's what I found:
|
|
150
|
-
>
|
|
151
|
-
> **Working correctly:**
|
|
152
|
-
> - Name editing saves and displays correctly
|
|
153
|
-
> - Avatar upload works with preview
|
|
154
|
-
>
|
|
155
|
-
> **Issues found:**
|
|
156
|
-
> - **Major:** Email validation allows invalid formats (e.g., 'test@' is accepted)
|
|
157
|
-
> - **Minor:** No loading indicator when saving changes
|
|
158
|
-
>
|
|
159
|
-
> I recommend fixing the email validation before we add test coverage. Once fixed, I'll suggest tests for:
|
|
160
|
-
> 1. Edit profile name successfully
|
|
161
|
-
> 2. Edit profile with invalid email (should show error)
|
|
162
|
-
> 3. Upload and save profile avatar
|
|
163
|
-
>
|
|
164
|
-
> Would you like to fix the email validation issue first?"
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ui-verifier
|
|
3
|
-
description: "Lightweight agent that opens a browser and clicks through a UI flow to verify it works. Returns immediately when bugs are found. Provide a URL to visit and a detailed summary of the functionality to be verified."
|
|
4
|
-
tools: mcp__ranger-browser__browser_navigate, mcp__ranger-browser__browser_snapshot, mcp__ranger-browser__browser_take_screenshot, mcp__ranger-browser__browser_click, mcp__ranger-browser__browser_type, mcp__ranger-browser__browser_hover, mcp__ranger-browser__browser_select_option, mcp__ranger-browser__browser_press_key, mcp__ranger-browser__browser_fill_form, mcp__ranger-browser__browser_wait_for, mcp__ranger-browser__browser_console_messages, mcp__ranger-browser__browser_network_requests, mcp__ranger-browser__browser_tabs, mcp__ranger-browser__browser_navigate_back
|
|
5
|
-
model: opus
|
|
6
|
-
color: blue
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
You are a UI Verifier agent. Your ONLY job is to click through a UI flow and report bugs immediately when you find them.
|
|
10
|
-
|
|
11
|
-
You do NOT:
|
|
12
|
-
- Analyze code or git diffs
|
|
13
|
-
- Suggest tests
|
|
14
|
-
- Draft test cases
|
|
15
|
-
- Do anything other than verify UI functionality
|
|
16
|
-
|
|
17
|
-
# Input
|
|
18
|
-
|
|
19
|
-
You will receive:
|
|
20
|
-
1. A URL or starting point
|
|
21
|
-
2. A description of the feature/flow to verify
|
|
22
|
-
3. Expected behavior
|
|
23
|
-
|
|
24
|
-
# Your Workflow
|
|
25
|
-
|
|
26
|
-
## 1. Navigate and Take Initial Snapshot
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
browser_navigate → URL
|
|
30
|
-
browser_snapshot → see the page
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## 2. Click Through the Flow
|
|
34
|
-
|
|
35
|
-
Follow the described user flow step by step:
|
|
36
|
-
- Use `browser_click`, `browser_type`, `browser_fill_form`, etc.
|
|
37
|
-
- Take `browser_snapshot` after each significant action
|
|
38
|
-
- Watch for anything that doesn't match expected behavior
|
|
39
|
-
|
|
40
|
-
## 3. Return Immediately on Bugs
|
|
41
|
-
|
|
42
|
-
**CRITICAL:** As soon as you encounter a bug that blocks functionality or clearly doesn't match expectations:
|
|
43
|
-
|
|
44
|
-
1. Take a screenshot with `browser_take_screenshot`
|
|
45
|
-
2. Check `browser_console_messages` for errors
|
|
46
|
-
3. **STOP and return to the main agent** with:
|
|
47
|
-
- What you were trying to do
|
|
48
|
-
- What you expected
|
|
49
|
-
- What actually happened
|
|
50
|
-
- The screenshot/evidence
|
|
51
|
-
- Severity: `BLOCKER` (can't proceed), `MAJOR` (wrong behavior), or `MINOR` (polish issue)
|
|
52
|
-
|
|
53
|
-
**Do NOT continue testing other parts of the flow.** The main agent needs to fix the issue first.
|
|
54
|
-
|
|
55
|
-
## 4. If Everything Works
|
|
56
|
-
|
|
57
|
-
If you complete the entire flow without issues:
|
|
58
|
-
- Return a brief summary: "Verified [flow name]. All steps completed successfully."
|
|
59
|
-
- List the key actions you took
|
|
60
|
-
|
|
61
|
-
# Example Returns
|
|
62
|
-
|
|
63
|
-
## Bug Found (return immediately)
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
BUG FOUND - BLOCKER
|
|
67
|
-
|
|
68
|
-
Trying to: Submit the login form
|
|
69
|
-
Expected: Navigate to dashboard
|
|
70
|
-
Actual: Form submission does nothing, no error shown
|
|
71
|
-
|
|
72
|
-
Console errors:
|
|
73
|
-
- TypeError: Cannot read property 'submit' of undefined
|
|
74
|
-
|
|
75
|
-
Screenshot: [attached]
|
|
76
|
-
|
|
77
|
-
Recommend: Check the form submission handler
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Success
|
|
81
|
-
|
|
82
|
-
```
|
|
83
|
-
VERIFIED - Login Flow
|
|
84
|
-
|
|
85
|
-
All steps completed:
|
|
86
|
-
1. Navigated to /login
|
|
87
|
-
2. Entered email and password
|
|
88
|
-
3. Clicked submit
|
|
89
|
-
4. Successfully redirected to /dashboard
|
|
90
|
-
5. User name displayed correctly in header
|
|
91
|
-
|
|
92
|
-
No issues found.
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
# Guidelines
|
|
96
|
-
|
|
97
|
-
- Be fast - don't over-test, just verify the described flow
|
|
98
|
-
- Be specific - exact error messages, exact steps
|
|
99
|
-
- Be visual - always include screenshots for bugs
|
|
100
|
-
- Return early - don't waste time if something is broken
|
package/build/commands/addApp.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { mkdir } from 'fs/promises';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { existsSync } from 'fs';
|
|
4
|
-
export async function addApp(appName) {
|
|
5
|
-
const rangerDir = join(process.cwd(), '.ranger');
|
|
6
|
-
const appDir = join(rangerDir, appName);
|
|
7
|
-
// Create .ranger/ if needed
|
|
8
|
-
if (!existsSync(rangerDir)) {
|
|
9
|
-
await mkdir(rangerDir, { recursive: true });
|
|
10
|
-
console.log(`Created .ranger/ directory`);
|
|
11
|
-
}
|
|
12
|
-
// Create .ranger/<app-name>/
|
|
13
|
-
if (existsSync(appDir)) {
|
|
14
|
-
console.log(`App "${appName}" already exists at ${appDir}`);
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
await mkdir(appDir, { recursive: true });
|
|
18
|
-
console.log(`\n✅ Created app: ${appName}`);
|
|
19
|
-
console.log(` Location: ${appDir}`);
|
|
20
|
-
console.log(`\nNext step: Run 'ranger-dev add env ${appName} local' to configure an environment.`);
|
|
21
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { readdir, mkdir, copyFile } from 'fs/promises';
|
|
2
|
-
import { join, resolve, dirname } from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import { existsSync, readdirSync } from 'fs';
|
|
5
|
-
import { execSync } from 'child_process';
|
|
6
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
-
const __dirname = dirname(__filename);
|
|
8
|
-
export async function initAgents(targetDir) {
|
|
9
|
-
const resolvedDir = resolve(targetDir);
|
|
10
|
-
// Check that .ranger/<app>/local exists
|
|
11
|
-
const rangerDir = join(resolvedDir, '.ranger');
|
|
12
|
-
if (!existsSync(rangerDir)) {
|
|
13
|
-
console.error('\n❌ No .ranger directory found.');
|
|
14
|
-
console.error(' Run first: ranger-dev add app <app-name>');
|
|
15
|
-
console.error(' Then: ranger-dev add env <app-name> local');
|
|
16
|
-
process.exit(1);
|
|
17
|
-
}
|
|
18
|
-
// Check for at least one app with a local env
|
|
19
|
-
const apps = readdirSync(rangerDir, { withFileTypes: true })
|
|
20
|
-
.filter((d) => d.isDirectory())
|
|
21
|
-
.map((d) => d.name);
|
|
22
|
-
const hasLocalEnv = apps.some((app) => existsSync(join(rangerDir, app, 'local')));
|
|
23
|
-
if (!hasLocalEnv) {
|
|
24
|
-
console.error('\n❌ No local environment configured.');
|
|
25
|
-
console.error(' Run first: ranger-dev add env <app-name> local');
|
|
26
|
-
process.exit(1);
|
|
27
|
-
}
|
|
28
|
-
// Check that .mcp.json exists
|
|
29
|
-
const mcpConfigPath = join(resolvedDir, '.mcp.json');
|
|
30
|
-
if (!existsSync(mcpConfigPath)) {
|
|
31
|
-
console.error('\n❌ No .mcp.json found.');
|
|
32
|
-
console.error(' This should have been created when you ran: ranger-dev add env <app-name> local');
|
|
33
|
-
process.exit(1);
|
|
34
|
-
}
|
|
35
|
-
console.log(`Initializing Claude Code agents in: ${resolvedDir}`);
|
|
36
|
-
// Create .claude/agents directory
|
|
37
|
-
const claudeAgentsDir = join(resolvedDir, '.claude', 'agents');
|
|
38
|
-
if (!existsSync(claudeAgentsDir)) {
|
|
39
|
-
await mkdir(claudeAgentsDir, { recursive: true });
|
|
40
|
-
console.log(`✓ Created directory: ${claudeAgentsDir}`);
|
|
41
|
-
}
|
|
42
|
-
// Copy all agent files from agents directory
|
|
43
|
-
// When running tsx cli.ts: __dirname is packages/cli/commands, so agents is '../agents'
|
|
44
|
-
// When built: __dirname is packages/cli/build/commands, so agents is '../../agents'
|
|
45
|
-
const sourceAgentsDir = existsSync(join(__dirname, '..', 'agents'))
|
|
46
|
-
? join(__dirname, '..', 'agents')
|
|
47
|
-
: join(__dirname, '..', '..', 'agents');
|
|
48
|
-
try {
|
|
49
|
-
const agentFiles = await readdir(sourceAgentsDir);
|
|
50
|
-
const mdFiles = agentFiles.filter((file) => file.endsWith('.md'));
|
|
51
|
-
if (mdFiles.length === 0) {
|
|
52
|
-
console.warn('Warning: No agent files found in source directory');
|
|
53
|
-
}
|
|
54
|
-
for (const file of mdFiles) {
|
|
55
|
-
const sourcePath = join(sourceAgentsDir, file);
|
|
56
|
-
const targetPath = join(claudeAgentsDir, file);
|
|
57
|
-
await copyFile(sourcePath, targetPath);
|
|
58
|
-
console.log(`✓ Created agent: ${file}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
console.error('Error copying agent files:', error);
|
|
63
|
-
process.exit(1);
|
|
64
|
-
}
|
|
65
|
-
// Check that @ranger-testing/playwright is installed globally
|
|
66
|
-
try {
|
|
67
|
-
execSync('npm list -g @ranger-testing/playwright', {
|
|
68
|
-
stdio: 'pipe',
|
|
69
|
-
});
|
|
70
|
-
console.log('✓ @ranger-testing/playwright is installed globally');
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
console.error('\n┌─────────────────────────────────────────────────────┐');
|
|
74
|
-
console.error('│ ❌ Missing required dependency │');
|
|
75
|
-
console.error('├─────────────────────────────────────────────────────┤');
|
|
76
|
-
console.error('│ @ranger-testing/playwright is not installed. │');
|
|
77
|
-
console.error('│ │');
|
|
78
|
-
console.error('│ Please install it globally first: │');
|
|
79
|
-
console.error('│ npm install -g @ranger-testing/playwright │');
|
|
80
|
-
console.error('└─────────────────────────────────────────────────────┘\n');
|
|
81
|
-
process.exit(1);
|
|
82
|
-
}
|
|
83
|
-
console.log('\n✅ Claude Code agents initialized successfully!');
|
|
84
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { mkdir, readdir, copyFile } from 'fs/promises';
|
|
2
|
-
import { join, dirname } from 'path';
|
|
3
|
-
import { existsSync } from 'fs';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
-
const __dirname = dirname(__filename);
|
|
7
|
-
function getSourceAgentsDir() {
|
|
8
|
-
// Check multiple possible locations for the agents directory
|
|
9
|
-
const possiblePaths = [
|
|
10
|
-
join(__dirname, '..', '..', 'agents'),
|
|
11
|
-
join(__dirname, '..', '..', '..', 'agents'),
|
|
12
|
-
];
|
|
13
|
-
for (const p of possiblePaths) {
|
|
14
|
-
if (existsSync(p)) {
|
|
15
|
-
return p;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return possiblePaths[0];
|
|
19
|
-
}
|
|
20
|
-
export async function installAgent(agentName) {
|
|
21
|
-
const claudeAgentsDir = join(process.cwd(), '.claude', 'agents');
|
|
22
|
-
if (!existsSync(claudeAgentsDir)) {
|
|
23
|
-
await mkdir(claudeAgentsDir, { recursive: true });
|
|
24
|
-
}
|
|
25
|
-
const sourceAgentsDir = getSourceAgentsDir();
|
|
26
|
-
try {
|
|
27
|
-
const agentFiles = await readdir(sourceAgentsDir);
|
|
28
|
-
const agentFile = agentFiles.find((f) => f.includes(agentName));
|
|
29
|
-
if (agentFile) {
|
|
30
|
-
const sourcePath = join(sourceAgentsDir, agentFile);
|
|
31
|
-
const targetPath = join(claudeAgentsDir, agentFile);
|
|
32
|
-
await copyFile(sourcePath, targetPath);
|
|
33
|
-
console.log(`✓ Added agent: ${agentFile}`);
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
console.warn(`Warning: ${agentName} agent not found in source directory`);
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
console.error('Error copying agent file:', error);
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
}
|