x-ipe 1.0.19__py3-none-any.whl → 1.0.21__py3-none-any.whl
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.
- x_ipe/cli/main.py +54 -3
- x_ipe/core/scaffold.py +23 -0
- x_ipe/resources/copilot/mcp-config.json +15 -0
- x_ipe/resources/copilot-instructions.md +2 -1
- x_ipe/resources/skills/task-execution-guideline/SKILL.md +4 -2
- x_ipe/resources/skills/task-type-code-implementation/SKILL.md +2 -2
- x_ipe/resources/skills/task-type-feature-acceptance-test/SKILL.md +500 -0
- x_ipe/resources/skills/task-type-feature-acceptance-test/references/examples.md +390 -0
- x_ipe/resources/skills/task-type-feature-acceptance-test/templates/acceptance-test-cases.md +135 -0
- {x_ipe-1.0.19.dist-info → x_ipe-1.0.21.dist-info}/METADATA +1 -1
- {x_ipe-1.0.19.dist-info → x_ipe-1.0.21.dist-info}/RECORD +14 -10
- {x_ipe-1.0.19.dist-info → x_ipe-1.0.21.dist-info}/WHEEL +0 -0
- {x_ipe-1.0.19.dist-info → x_ipe-1.0.21.dist-info}/entry_points.txt +0 -0
- {x_ipe-1.0.19.dist-info → x_ipe-1.0.21.dist-info}/licenses/LICENSE +0 -0
x_ipe/cli/main.py
CHANGED
|
@@ -175,8 +175,13 @@ def info(ctx: click.Context) -> None:
|
|
|
175
175
|
is_flag=True,
|
|
176
176
|
help="Skip copying skills from package.",
|
|
177
177
|
)
|
|
178
|
+
@click.option(
|
|
179
|
+
"--no-mcp",
|
|
180
|
+
is_flag=True,
|
|
181
|
+
help="Skip MCP config merge prompt.",
|
|
182
|
+
)
|
|
178
183
|
@click.pass_context
|
|
179
|
-
def init(ctx: click.Context, force: bool, dry_run: bool, no_skills: bool) -> None:
|
|
184
|
+
def init(ctx: click.Context, force: bool, dry_run: bool, no_skills: bool, no_mcp: bool) -> None:
|
|
180
185
|
"""Initialize X-IPE in the current project.
|
|
181
186
|
|
|
182
187
|
Creates the standard X-IPE folder structure:
|
|
@@ -208,6 +213,9 @@ def init(ctx: click.Context, force: bool, dry_run: bool, no_skills: bool) -> Non
|
|
|
208
213
|
# Copy/merge copilot-instructions.md
|
|
209
214
|
scaffold.copy_copilot_instructions()
|
|
210
215
|
|
|
216
|
+
# Copy MCP config (.github/copilot/mcp-config.json)
|
|
217
|
+
scaffold.copy_mcp_config()
|
|
218
|
+
|
|
211
219
|
# Copy config files (copilot-prompt.json, tools.json, .env.example)
|
|
212
220
|
scaffold.copy_config_files()
|
|
213
221
|
|
|
@@ -226,7 +234,7 @@ def init(ctx: click.Context, force: bool, dry_run: bool, no_skills: bool) -> Non
|
|
|
226
234
|
|
|
227
235
|
# MCP config merge with user confirmation
|
|
228
236
|
mcp_servers = scaffold.get_project_mcp_servers()
|
|
229
|
-
if mcp_servers and not dry_run:
|
|
237
|
+
if mcp_servers and not dry_run and not no_mcp:
|
|
230
238
|
click.echo("\n" + "-" * 40)
|
|
231
239
|
click.echo("MCP Server Configuration")
|
|
232
240
|
click.echo("-" * 40)
|
|
@@ -393,9 +401,14 @@ def serve(ctx: click.Context, host: Optional[str], port: Optional[int],
|
|
|
393
401
|
default=None,
|
|
394
402
|
help="Upgrade only the specified skill.",
|
|
395
403
|
)
|
|
404
|
+
@click.option(
|
|
405
|
+
"--no-mcp",
|
|
406
|
+
is_flag=True,
|
|
407
|
+
help="Skip MCP config merge prompt.",
|
|
408
|
+
)
|
|
396
409
|
@click.pass_context
|
|
397
410
|
def upgrade(ctx: click.Context, force: bool, dry_run: bool,
|
|
398
|
-
backup: bool, skill: Optional[str]) -> None:
|
|
411
|
+
backup: bool, skill: Optional[str], no_mcp: bool) -> None:
|
|
399
412
|
"""Upgrade skills from the X-IPE package.
|
|
400
413
|
|
|
401
414
|
Syncs skills from the installed X-IPE package to the local
|
|
@@ -477,6 +490,44 @@ def upgrade(ctx: click.Context, force: bool, dry_run: bool,
|
|
|
477
490
|
|
|
478
491
|
if backup and skills_to_warn:
|
|
479
492
|
click.echo(f"\nBackups created in: {project_root / '.x-ipe' / 'backups'}")
|
|
493
|
+
|
|
494
|
+
# Copy/update MCP config from package, then merge to global
|
|
495
|
+
scaffold = ScaffoldManager(project_root, dry_run=dry_run, force=force)
|
|
496
|
+
scaffold.copy_mcp_config()
|
|
497
|
+
|
|
498
|
+
# MCP config merge with user confirmation
|
|
499
|
+
mcp_servers = scaffold.get_project_mcp_servers()
|
|
500
|
+
if mcp_servers and not dry_run and not no_mcp:
|
|
501
|
+
click.echo("\n" + "-" * 40)
|
|
502
|
+
click.echo("MCP Server Configuration")
|
|
503
|
+
click.echo("-" * 40)
|
|
504
|
+
|
|
505
|
+
# Show available servers
|
|
506
|
+
click.echo(f"\nFound {len(mcp_servers)} MCP server(s) in project config:")
|
|
507
|
+
for name in mcp_servers:
|
|
508
|
+
click.echo(f" • {name}")
|
|
509
|
+
|
|
510
|
+
# Confirm each server
|
|
511
|
+
servers_to_merge = []
|
|
512
|
+
for name in mcp_servers:
|
|
513
|
+
if click.confirm(f"\nAdd '{name}' to global MCP config?", default=True):
|
|
514
|
+
servers_to_merge.append(name)
|
|
515
|
+
|
|
516
|
+
if servers_to_merge:
|
|
517
|
+
# Confirm target path
|
|
518
|
+
default_path = Path.home() / ".copilot" / "mcp-config.json"
|
|
519
|
+
target_path = click.prompt(
|
|
520
|
+
"\nTarget MCP config path",
|
|
521
|
+
default=str(default_path),
|
|
522
|
+
type=click.Path(dir_okay=False, path_type=Path)
|
|
523
|
+
)
|
|
524
|
+
|
|
525
|
+
scaffold.merge_mcp_config(
|
|
526
|
+
servers_to_merge=servers_to_merge,
|
|
527
|
+
target_path=target_path
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
click.echo(f"\n✓ Merged {len(servers_to_merge)} MCP server(s) to {target_path}")
|
|
480
531
|
|
|
481
532
|
|
|
482
533
|
def main() -> None:
|
x_ipe/core/scaffold.py
CHANGED
|
@@ -145,6 +145,28 @@ class ScaffoldManager:
|
|
|
145
145
|
shutil.copy2(source, target)
|
|
146
146
|
self.created.append(target)
|
|
147
147
|
|
|
148
|
+
def copy_mcp_config(self) -> None:
|
|
149
|
+
"""Copy mcp-config.json to .github/copilot/."""
|
|
150
|
+
source = self._get_resource_path("copilot")
|
|
151
|
+
if source is None or not source.exists():
|
|
152
|
+
return
|
|
153
|
+
|
|
154
|
+
source_file = source / "mcp-config.json"
|
|
155
|
+
if not source_file.exists():
|
|
156
|
+
return
|
|
157
|
+
|
|
158
|
+
target = self.project_root / ".github" / "copilot" / "mcp-config.json"
|
|
159
|
+
|
|
160
|
+
if target.exists():
|
|
161
|
+
if not self.force:
|
|
162
|
+
self.skipped.append(target)
|
|
163
|
+
return
|
|
164
|
+
|
|
165
|
+
if not self.dry_run:
|
|
166
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
167
|
+
shutil.copy2(source_file, target)
|
|
168
|
+
self.created.append(target)
|
|
169
|
+
|
|
148
170
|
def get_project_mcp_servers(self) -> dict:
|
|
149
171
|
"""Get MCP servers from project's .github/copilot/mcp-config.json.
|
|
150
172
|
|
|
@@ -382,6 +404,7 @@ server:
|
|
|
382
404
|
self.create_runtime_folder()
|
|
383
405
|
self.copy_skills()
|
|
384
406
|
self.copy_copilot_instructions()
|
|
407
|
+
self.copy_mcp_config()
|
|
385
408
|
self.copy_config_files()
|
|
386
409
|
self.copy_planning_templates()
|
|
387
410
|
self.copy_themes()
|
|
@@ -74,7 +74,8 @@
|
|
|
74
74
|
| Feature Refinement | `task-type-feature-refinement` | feature-stage | Technical Design | Yes |
|
|
75
75
|
| Technical Design | `task-type-technical-design` | feature-stage | Test Generation | Yes |
|
|
76
76
|
| Test Generation | `task-type-test-generation` | feature-stage | Code Implementation | No |
|
|
77
|
-
| Code Implementation | `task-type-code-implementation` | feature-stage | Feature
|
|
77
|
+
| Code Implementation | `task-type-code-implementation` | feature-stage | Feature Acceptance Test | No |
|
|
78
|
+
| Feature Acceptance Test | `task-type-feature-acceptance-test` | Standalone OR feature-stage | Feature Closing | No |
|
|
78
79
|
| Human Playground | `task-type-human-playground` | Standalone | - | Yes |
|
|
79
80
|
| Feature Closing | `task-type-feature-closing` | feature-stage | User Manual | No |
|
|
80
81
|
| Bug Fix | `task-type-bug-fix` | Standalone | - | Yes |
|
|
@@ -62,12 +62,14 @@ Task:
|
|
|
62
62
|
|
|
63
63
|
| Task Type | Category |
|
|
64
64
|
|-----------|----------|
|
|
65
|
-
| `task-type-feature-refinement`, `task-type-technical-design`, `task-type-test-generation`, `task-type-code-implementation`, `task-type-feature-closing` | feature-stage |
|
|
65
|
+
| `task-type-feature-refinement`, `task-type-technical-design`, `task-type-test-generation`, `task-type-code-implementation`, `task-type-feature-acceptance-test`, `task-type-feature-closing` | feature-stage |
|
|
66
66
|
| `task-type-ideation`, `task-type-idea-mockup`, `task-type-idea-to-architecture` | ideation-stage |
|
|
67
67
|
| `task-type-requirement-gathering`, `task-type-feature-breakdown` | requirement-stage |
|
|
68
|
-
| `task-type-bug-fix`, `task-type-change-request`, `task-type-project-init`, `task-type-dev-environment`, `task-type-user-manual`, `task-type-human-playground`, `task-type-share-idea` | Standalone |
|
|
68
|
+
| `task-type-bug-fix`, `task-type-change-request`, `task-type-project-init`, `task-type-dev-environment`, `task-type-user-manual`, `task-type-human-playground`, `task-type-share-idea`, `task-type-feature-acceptance-test` | Standalone |
|
|
69
69
|
| `task-type-refactoring-analysis`, `task-type-improve-code-quality-before-refactoring`, `task-type-code-refactor-v2` | code-refactoring-stage |
|
|
70
70
|
|
|
71
|
+
> **Note:** `task-type-feature-acceptance-test` can be either feature-stage (in workflow) or Standalone (called directly).
|
|
72
|
+
|
|
71
73
|
### Task States
|
|
72
74
|
|
|
73
75
|
| State | Terminal? | Description |
|
|
@@ -31,7 +31,7 @@ Implement code for a single feature by:
|
|
|
31
31
|
|-----------|-------|
|
|
32
32
|
| Task Type | Code Implementation |
|
|
33
33
|
| Category | feature-stage |
|
|
34
|
-
| Next Task Type | Feature
|
|
34
|
+
| Next Task Type | Feature Acceptance Test |
|
|
35
35
|
| Require Human Review | No |
|
|
36
36
|
| Feature Phase | Code Implementation |
|
|
37
37
|
|
|
@@ -53,7 +53,7 @@ This skill MUST return these attributes to the Task Data Model upon task complet
|
|
|
53
53
|
Output:
|
|
54
54
|
category: feature-stage
|
|
55
55
|
status: completed | blocked
|
|
56
|
-
next_task_type: Feature
|
|
56
|
+
next_task_type: Feature Acceptance Test
|
|
57
57
|
require_human_review: No
|
|
58
58
|
auto_proceed: {from input Auto Proceed}
|
|
59
59
|
task_output_links: [src/, tests/]
|
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-type-feature-acceptance-test
|
|
3
|
+
description: Execute acceptance tests for features with web UI. Generates test cases from specification acceptance criteria, analyzes HTML for selectors, and runs tests via Chrome DevTools MCP. Use after Code Implementation for features with web UI. Triggers on requests like "run acceptance tests", "test feature UI", "execute acceptance tests".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Task Type: Feature Acceptance Test
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Execute acceptance tests for web UI features by:
|
|
11
|
+
1. Checking if feature has web UI component (skip if backend-only)
|
|
12
|
+
2. Generating acceptance test case plan from specification criteria
|
|
13
|
+
3. Analyzing HTML to design precise test steps with selectors
|
|
14
|
+
4. Reflecting and refining test cases for completeness
|
|
15
|
+
5. Executing tests via Chrome DevTools MCP
|
|
16
|
+
6. Reporting test results
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Important Notes
|
|
21
|
+
|
|
22
|
+
### Skill Prerequisite
|
|
23
|
+
- If you HAVE NOT learned `task-execution-guideline` skill, please learn it first before executing this skill.
|
|
24
|
+
|
|
25
|
+
**Important:** If Agent DO NOT have skill capability, can directly go to `.github/skills/` folder to learn skills. And SKILL.md file is the entry point to understand each skill.
|
|
26
|
+
|
|
27
|
+
### Web UI Only
|
|
28
|
+
This skill is **ONLY for features with web UI**. If the feature is:
|
|
29
|
+
- Backend API only → Skip this skill, proceed to Feature Closing
|
|
30
|
+
- CLI tool only → Skip this skill, proceed to Feature Closing
|
|
31
|
+
- Library/SDK only → Skip this skill, proceed to Feature Closing
|
|
32
|
+
|
|
33
|
+
### MCP Requirement
|
|
34
|
+
This skill requires Chrome DevTools MCP for test execution. If MCP is not available, generate test cases but mark execution as blocked.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Task Type Default Attributes
|
|
39
|
+
|
|
40
|
+
| Attribute | Value |
|
|
41
|
+
|-----------|-------|
|
|
42
|
+
| Task Type | Feature Acceptance Test |
|
|
43
|
+
| Category | Standalone OR feature-stage |
|
|
44
|
+
| Next Task Type | Feature Closing (if feature-stage) |
|
|
45
|
+
| Require Human Review | No |
|
|
46
|
+
| Feature Phase | Acceptance Testing |
|
|
47
|
+
|
|
48
|
+
**Category Behavior:**
|
|
49
|
+
- **Standalone**: Called directly to test any web UI (no feature board interaction)
|
|
50
|
+
- **feature-stage**: Called as part of feature workflow (after Code Implementation)
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Task Type Required Input Attributes
|
|
55
|
+
|
|
56
|
+
| Attribute | Default Value |
|
|
57
|
+
|-----------|---------------|
|
|
58
|
+
| Auto Proceed | False |
|
|
59
|
+
| feature_id | Required (feature-stage) OR Optional (standalone) |
|
|
60
|
+
| target_url | Required (standalone) OR from feature (feature-stage) |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Skill/Task Completion Output Attributes
|
|
65
|
+
|
|
66
|
+
This skill MUST return these attributes to the Task Data Model upon task completion:
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
Output:
|
|
70
|
+
category: Standalone | feature-stage # Based on how skill was invoked
|
|
71
|
+
status: completed | blocked | skipped
|
|
72
|
+
next_task_type: Feature Closing | null # null if standalone
|
|
73
|
+
require_human_review: No
|
|
74
|
+
auto_proceed: {from input}
|
|
75
|
+
task_output_links: [x-ipe-docs/requirements/FEATURE-XXX/acceptance-test-cases.md] | [{output_path}]
|
|
76
|
+
|
|
77
|
+
# Feature-stage specific (only if category=feature-stage)
|
|
78
|
+
feature_id: FEATURE-XXX
|
|
79
|
+
feature_title: {title}
|
|
80
|
+
feature_version: {version}
|
|
81
|
+
feature_phase: Acceptance Testing
|
|
82
|
+
|
|
83
|
+
# Acceptance test specific
|
|
84
|
+
skip_reason: "No web UI" | null
|
|
85
|
+
test_cases_created: {count}
|
|
86
|
+
tests_passed: {count}
|
|
87
|
+
tests_failed: {count}
|
|
88
|
+
pass_rate: "{X}%"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Definition of Ready (DoR)
|
|
94
|
+
|
|
95
|
+
| # | Checkpoint | Required |
|
|
96
|
+
|---|------------|----------|
|
|
97
|
+
| 1 | Feature exists on feature board | Yes |
|
|
98
|
+
| 2 | Feature status is "Implemented" or "Test Generation Complete" | Yes |
|
|
99
|
+
| 3 | Code implementation is complete | Yes |
|
|
100
|
+
| 4 | Specification with acceptance criteria exists | Yes |
|
|
101
|
+
| 5 | Feature is deployed and accessible via URL | Yes |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Execution Flow
|
|
106
|
+
|
|
107
|
+
Execute Feature Acceptance Test by following these steps in order:
|
|
108
|
+
|
|
109
|
+
| Step | Name | Action | Gate to Next |
|
|
110
|
+
|------|------|--------|--------------|
|
|
111
|
+
| 1 | Check UI Scope | Determine if feature has web UI | Has web UI OR skip |
|
|
112
|
+
| 2 | Generate Plan | Create test cases from acceptance criteria | Test cases defined |
|
|
113
|
+
| 3 | Analyze HTML | Extract element selectors from UI code | Selectors identified |
|
|
114
|
+
| 4 | Test Data Prep | Ask user for test data (if auto_proceed=false) | Data collected OR skipped |
|
|
115
|
+
| 5 | Reflect & Refine | Review and update test cases | Cases validated |
|
|
116
|
+
| 6 | Execute Tests | Run tests via Chrome DevTools MCP | Tests complete |
|
|
117
|
+
| 7 | Report Results | Document test results | Results documented |
|
|
118
|
+
|
|
119
|
+
**⛔ BLOCKING RULES:**
|
|
120
|
+
- Step 1: If no web UI → output status=skipped, proceed to next_task_type
|
|
121
|
+
- Step 4: If auto_proceed=true → skip this step, use placeholder/generated data
|
|
122
|
+
- Step 6: If MCP unavailable → output status=blocked, test cases ready for manual execution
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Execution Procedure
|
|
127
|
+
|
|
128
|
+
### Step 1: Check UI Scope
|
|
129
|
+
|
|
130
|
+
**Action:** Determine if feature has web UI component
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
1. QUERY feature board for Feature Data Model:
|
|
134
|
+
- feature_id
|
|
135
|
+
- specification_link
|
|
136
|
+
- technical_design_link
|
|
137
|
+
|
|
138
|
+
2. READ technical design → Check "Technical Scope" section:
|
|
139
|
+
|
|
140
|
+
IF scope includes [Frontend] OR [Full Stack]:
|
|
141
|
+
- Proceed to Step 2
|
|
142
|
+
|
|
143
|
+
ELSE (Backend, API Only, Database, CLI):
|
|
144
|
+
- SET status = "skipped"
|
|
145
|
+
- SET skip_reason = "No web UI"
|
|
146
|
+
- RETURN to task-execution-guideline with:
|
|
147
|
+
next_task_type: Feature Closing
|
|
148
|
+
status: skipped
|
|
149
|
+
|
|
150
|
+
3. VERIFY feature is accessible:
|
|
151
|
+
- Check if playground/demo URL exists
|
|
152
|
+
- Confirm feature can be triggered via web UI
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Output:** Decision to proceed or skip
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### Step 2: Generate Acceptance Test Plan
|
|
160
|
+
|
|
161
|
+
**Action:** Create test cases from specification acceptance criteria
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
1. READ specification.md for feature:
|
|
165
|
+
Location: x-ipe-docs/requirements/FEATURE-XXX/specification.md
|
|
166
|
+
|
|
167
|
+
2. EXTRACT all acceptance criteria (AC-X):
|
|
168
|
+
- Note the exact wording of each criterion
|
|
169
|
+
- Identify testable conditions
|
|
170
|
+
- Note any edge cases mentioned
|
|
171
|
+
|
|
172
|
+
3. CREATE acceptance-test-cases.md:
|
|
173
|
+
Location: x-ipe-docs/requirements/FEATURE-XXX/acceptance-test-cases.md
|
|
174
|
+
Template: Use templates/acceptance-test-cases.md
|
|
175
|
+
|
|
176
|
+
4. FOR EACH acceptance criterion:
|
|
177
|
+
- Create at least one test case (TC-XXX)
|
|
178
|
+
- Map TC to AC reference
|
|
179
|
+
- Define priority (P0/P1/P2)
|
|
180
|
+
- Write high-level test steps (without selectors yet)
|
|
181
|
+
- Define expected outcomes
|
|
182
|
+
|
|
183
|
+
5. PRIORITIZE test cases:
|
|
184
|
+
P0 (Critical): Core functionality, must pass
|
|
185
|
+
P1 (High): Important flows, should pass
|
|
186
|
+
P2 (Medium): Edge cases, nice to pass
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Output:** Initial acceptance-test-cases.md with test case outlines
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### Step 3: Analyze HTML for Selectors
|
|
194
|
+
|
|
195
|
+
**Action:** Extract precise CSS/XPath selectors from UI code
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
1. LOCATE UI implementation files:
|
|
199
|
+
- Templates: src/x_ipe/templates/*.html
|
|
200
|
+
- Static JS: src/x_ipe/static/js/*.js
|
|
201
|
+
- Components: (project-specific paths)
|
|
202
|
+
|
|
203
|
+
2. FOR EACH test case, identify UI elements:
|
|
204
|
+
|
|
205
|
+
ELEMENT IDENTIFICATION PRIORITY:
|
|
206
|
+
1. data-testid attribute (preferred)
|
|
207
|
+
2. id attribute
|
|
208
|
+
3. aria-label for accessibility
|
|
209
|
+
4. Unique class combinations
|
|
210
|
+
5. CSS selector path (last resort)
|
|
211
|
+
|
|
212
|
+
3. UPDATE test steps with selectors:
|
|
213
|
+
|
|
214
|
+
| Step | Action | Element Selector | Input Data | Expected Result |
|
|
215
|
+
|------|--------|------------------|------------|-----------------|
|
|
216
|
+
| 1 | Click | `[data-testid="submit-btn"]` | - | Form submits |
|
|
217
|
+
| 2 | Enter | `#email-input` | "test@example.com" | Value appears |
|
|
218
|
+
| 3 | Verify | `.success-message` | - | Contains "Saved" |
|
|
219
|
+
|
|
220
|
+
4. VERIFY selectors are:
|
|
221
|
+
- Unique on the page
|
|
222
|
+
- Stable (not dynamically generated IDs)
|
|
223
|
+
- Descriptive of element purpose
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Selector Best Practices:**
|
|
227
|
+
```
|
|
228
|
+
PREFER:
|
|
229
|
+
- [data-testid="..."] # Explicit test hooks
|
|
230
|
+
- #unique-id # Stable IDs
|
|
231
|
+
- [aria-label="..."] # Accessibility labels
|
|
232
|
+
- form[name="..."] # Named forms
|
|
233
|
+
|
|
234
|
+
AVOID:
|
|
235
|
+
- .class1.class2.class3 # Fragile class chains
|
|
236
|
+
- div > div > span # Position-dependent
|
|
237
|
+
- [id^="auto_"] # Auto-generated IDs
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
### Step 4: Test Data Preparation (Conditional)
|
|
243
|
+
|
|
244
|
+
**Action:** Collect test data from user when auto_proceed is false
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
IF auto_proceed = true:
|
|
248
|
+
- SKIP this step
|
|
249
|
+
- Use placeholder/generated test data
|
|
250
|
+
- Proceed to Step 5
|
|
251
|
+
|
|
252
|
+
IF auto_proceed = false:
|
|
253
|
+
- PAUSE and ask user for test data
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**Data Collection Process:**
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
1. ANALYZE each test case for data requirements:
|
|
260
|
+
|
|
261
|
+
DATA TYPES (per test case):
|
|
262
|
+
- Input: Values to enter in forms, fields
|
|
263
|
+
- Selection: Options to select from dropdowns
|
|
264
|
+
- Expected: Expected text, values to verify
|
|
265
|
+
- Compare: Before/after values for validation
|
|
266
|
+
|
|
267
|
+
2. ASK user for each test case:
|
|
268
|
+
|
|
269
|
+
"For TC-001 ({title}):
|
|
270
|
+
- Input for '{field}': ___
|
|
271
|
+
- Expected result: ___"
|
|
272
|
+
|
|
273
|
+
3. UPDATE Test Data table in each test case:
|
|
274
|
+
|
|
275
|
+
| Type | Field/Element | Value | Notes |
|
|
276
|
+
|------|---------------|-------|-------|
|
|
277
|
+
| Input | email | "user@test.com" | Valid email |
|
|
278
|
+
| Expected | success-msg | "Saved" | Contains |
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Output:** Test Data table populated in each test case section
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
### Step 5: Reflect and Refine Test Cases
|
|
286
|
+
|
|
287
|
+
**Action:** Review each test case for completeness and accuracy
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
FOR EACH test case:
|
|
291
|
+
|
|
292
|
+
1. VALIDATION CHECKLIST:
|
|
293
|
+
□ Does test case cover the AC completely?
|
|
294
|
+
□ Are preconditions clearly defined?
|
|
295
|
+
□ Are all steps actionable?
|
|
296
|
+
□ Are selectors verified to exist?
|
|
297
|
+
□ Is expected result specific and measurable?
|
|
298
|
+
□ Are edge cases covered?
|
|
299
|
+
|
|
300
|
+
2. REFLECTION QUESTIONS:
|
|
301
|
+
- What could cause this test to fail incorrectly?
|
|
302
|
+
- Are there missing steps between actions?
|
|
303
|
+
- Is the expected result too vague?
|
|
304
|
+
- Should this be split into multiple tests?
|
|
305
|
+
|
|
306
|
+
3. REFINE based on reflection:
|
|
307
|
+
- Add missing steps
|
|
308
|
+
- Clarify expected results
|
|
309
|
+
- Add wait conditions if needed
|
|
310
|
+
- Handle dynamic content loading
|
|
311
|
+
|
|
312
|
+
4. UPDATE acceptance-test-cases.md with refinements
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
**Common Refinements:**
|
|
316
|
+
- Add explicit wait steps for async operations
|
|
317
|
+
- Add verification steps between major actions
|
|
318
|
+
- Split complex tests into focused smaller tests
|
|
319
|
+
- Add cleanup/reset steps if needed
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
### Step 6: Execute Tests via Chrome DevTools MCP
|
|
324
|
+
|
|
325
|
+
**Action:** Run acceptance tests using Chrome DevTools MCP
|
|
326
|
+
|
|
327
|
+
```
|
|
328
|
+
1. CHECK MCP availability:
|
|
329
|
+
|
|
330
|
+
IF Chrome DevTools MCP available:
|
|
331
|
+
- Proceed with execution
|
|
332
|
+
ELSE:
|
|
333
|
+
- SET status = "blocked"
|
|
334
|
+
- Document: "Test cases ready for manual execution"
|
|
335
|
+
- RETURN results with test_cases_created count
|
|
336
|
+
|
|
337
|
+
2. FOR EACH test case (ordered by priority):
|
|
338
|
+
|
|
339
|
+
a. SETUP:
|
|
340
|
+
- Navigate to test URL
|
|
341
|
+
- Verify page loaded
|
|
342
|
+
|
|
343
|
+
b. EXECUTE steps:
|
|
344
|
+
- Perform each action via MCP
|
|
345
|
+
- Capture results after each step
|
|
346
|
+
- Take screenshot on failure
|
|
347
|
+
|
|
348
|
+
c. VERIFY expected outcomes:
|
|
349
|
+
- Check element states
|
|
350
|
+
- Validate text content
|
|
351
|
+
- Confirm UI changes
|
|
352
|
+
|
|
353
|
+
d. RECORD result:
|
|
354
|
+
- Status: Pass | Fail | Blocked
|
|
355
|
+
- Execution time
|
|
356
|
+
- Failure reason (if any)
|
|
357
|
+
- Screenshot link (if failure)
|
|
358
|
+
|
|
359
|
+
3. CONTINUE with remaining tests even if some fail
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**MCP Commands Pattern:**
|
|
363
|
+
```javascript
|
|
364
|
+
// Navigate
|
|
365
|
+
await page.goto('{URL}');
|
|
366
|
+
|
|
367
|
+
// Click element
|
|
368
|
+
await page.click('{selector}');
|
|
369
|
+
|
|
370
|
+
// Enter text
|
|
371
|
+
await page.fill('{selector}', '{value}');
|
|
372
|
+
|
|
373
|
+
// Verify text content
|
|
374
|
+
const text = await page.textContent('{selector}');
|
|
375
|
+
assert(text.includes('{expected}'));
|
|
376
|
+
|
|
377
|
+
// Wait for element
|
|
378
|
+
await page.waitForSelector('{selector}');
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
### Step 7: Report Test Results
|
|
384
|
+
|
|
385
|
+
**Action:** Document comprehensive test results
|
|
386
|
+
|
|
387
|
+
```
|
|
388
|
+
1. UPDATE acceptance-test-cases.md:
|
|
389
|
+
|
|
390
|
+
- Set status for each test case (✅ Pass | ❌ Fail | ⬜ Not Run)
|
|
391
|
+
- Add execution notes
|
|
392
|
+
- Fill in Execution Results section:
|
|
393
|
+
- Execution date
|
|
394
|
+
- Environment
|
|
395
|
+
- Pass/Fail counts
|
|
396
|
+
- Pass rate percentage
|
|
397
|
+
|
|
398
|
+
2. DOCUMENT failures:
|
|
399
|
+
|
|
400
|
+
| Test Case | Failure Reason | Recommended Action |
|
|
401
|
+
|-----------|----------------|-------------------|
|
|
402
|
+
| TC-003 | Button not found | Verify selector |
|
|
403
|
+
| TC-007 | Timeout waiting | Check async loading |
|
|
404
|
+
|
|
405
|
+
3. CALCULATE metrics:
|
|
406
|
+
- Total tests
|
|
407
|
+
- Passed count
|
|
408
|
+
- Failed count
|
|
409
|
+
- Blocked count
|
|
410
|
+
- Pass rate = (passed / total) * 100
|
|
411
|
+
|
|
412
|
+
4. RETURN task output with results
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## Definition of Done (DoD)
|
|
418
|
+
|
|
419
|
+
| # | Checkpoint | Required |
|
|
420
|
+
|---|------------|----------|
|
|
421
|
+
| 1 | Feature checked for web UI scope | Yes |
|
|
422
|
+
| 2 | Acceptance test cases created from ACs | Yes (if has UI) |
|
|
423
|
+
| 3 | HTML analyzed for element selectors | Yes (if has UI) |
|
|
424
|
+
| 4 | Test data collected from user (if auto_proceed=false) | Conditional |
|
|
425
|
+
| 5 | Test cases reflected and refined | Yes (if has UI) |
|
|
426
|
+
| 6 | Tests executed via MCP (or marked blocked) | Yes (if has UI) |
|
|
427
|
+
| 7 | Test results documented | Yes (if has UI) |
|
|
428
|
+
| 8 | acceptance-test-cases.md saved to feature folder | Yes (if has UI) |
|
|
429
|
+
|
|
430
|
+
**Important:** After completing this skill, always return to `task-execution-guideline` skill to continue the task execution flow and validate the DoD defined there.
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## Patterns
|
|
435
|
+
|
|
436
|
+
### Pattern: Form Submission Test
|
|
437
|
+
|
|
438
|
+
**When:** Feature includes form input and submission
|
|
439
|
+
**Then:**
|
|
440
|
+
```
|
|
441
|
+
1. Test empty form submission (validation)
|
|
442
|
+
2. Test invalid input formats
|
|
443
|
+
3. Test valid submission → success state
|
|
444
|
+
4. Verify success message/redirect
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### Pattern: CRUD Operations Test
|
|
448
|
+
|
|
449
|
+
**When:** Feature includes Create/Read/Update/Delete
|
|
450
|
+
**Then:**
|
|
451
|
+
```
|
|
452
|
+
1. Test Create → verify appears in list
|
|
453
|
+
2. Test Read → verify data displayed correctly
|
|
454
|
+
3. Test Update → verify changes persisted
|
|
455
|
+
4. Test Delete → verify removed from list
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### Pattern: Navigation/Routing Test
|
|
459
|
+
|
|
460
|
+
**When:** Feature includes page navigation
|
|
461
|
+
**Then:**
|
|
462
|
+
```
|
|
463
|
+
1. Test direct URL access
|
|
464
|
+
2. Test navigation via links/buttons
|
|
465
|
+
3. Verify correct page renders
|
|
466
|
+
4. Test back/forward browser navigation
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
## Anti-Patterns
|
|
472
|
+
|
|
473
|
+
| Anti-Pattern | Why Bad | Do Instead |
|
|
474
|
+
|--------------|---------|------------|
|
|
475
|
+
| Test without selectors | Tests will fail to find elements | Analyze HTML first |
|
|
476
|
+
| Skip reflection step | Miss edge cases and errors | Always reflect on each TC |
|
|
477
|
+
| Test implementation details | Brittle tests | Test user-visible behavior |
|
|
478
|
+
| One massive test | Hard to debug failures | Split into focused tests |
|
|
479
|
+
| Ignore async loading | Flaky tests | Add explicit wait steps |
|
|
480
|
+
| Hard-coded test data | Hard to maintain | Use variables/fixtures |
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
## Example
|
|
485
|
+
|
|
486
|
+
See [references/examples.md](references/examples.md) for concrete execution examples including:
|
|
487
|
+
- Standard feature acceptance test flow
|
|
488
|
+
- Skipped execution (no web UI)
|
|
489
|
+
- Blocked execution (no MCP available)
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
## Notes
|
|
494
|
+
|
|
495
|
+
- This skill is specifically for **web UI acceptance testing**
|
|
496
|
+
- Backend/API testing is handled by Test Generation skill
|
|
497
|
+
- Test cases should map 1:1 with acceptance criteria
|
|
498
|
+
- Prioritize stable selectors (data-testid > id > class)
|
|
499
|
+
- MCP execution is preferred but manual execution fallback exists
|
|
500
|
+
- All test artifacts go in the feature folder alongside specification
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
# Feature Acceptance Test Examples
|
|
2
|
+
|
|
3
|
+
This document provides concrete execution examples for the Feature Acceptance Test skill.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Example 1: Standard Feature Acceptance Test
|
|
8
|
+
|
|
9
|
+
**Context:** FEATURE-022-C: Feedback Capture & Panel has been implemented and needs acceptance testing.
|
|
10
|
+
|
|
11
|
+
### Step 1: Check UI Scope
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Query feature board:
|
|
15
|
+
feature_id: FEATURE-022-C
|
|
16
|
+
status: Implemented
|
|
17
|
+
|
|
18
|
+
Read technical design:
|
|
19
|
+
Technical Scope: [Frontend, Backend]
|
|
20
|
+
|
|
21
|
+
Decision: Has web UI → Proceed to Step 2
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Step 2: Generate Test Plan
|
|
25
|
+
|
|
26
|
+
Read specification.md acceptance criteria:
|
|
27
|
+
```
|
|
28
|
+
AC-1: User can right-click any element to open context menu
|
|
29
|
+
AC-2: Context menu shows "Capture Feedback" option
|
|
30
|
+
AC-3: Clicking capture opens feedback panel
|
|
31
|
+
AC-4: Panel displays screenshot preview
|
|
32
|
+
AC-5: User can enter feedback description
|
|
33
|
+
AC-6: Submit button saves feedback
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Generated acceptance-test-cases.md:
|
|
37
|
+
```markdown
|
|
38
|
+
### TC-001: Context Menu Opens on Right-Click
|
|
39
|
+
|
|
40
|
+
**Acceptance Criteria Reference:** AC-1
|
|
41
|
+
|
|
42
|
+
**Priority:** P0
|
|
43
|
+
|
|
44
|
+
**Preconditions:**
|
|
45
|
+
- User is on proxy page with injected inspector
|
|
46
|
+
|
|
47
|
+
**Test Steps:**
|
|
48
|
+
|
|
49
|
+
| Step | Action | Element Selector | Input Data | Expected Result |
|
|
50
|
+
|------|--------|------------------|------------|-----------------|
|
|
51
|
+
| 1 | Navigate to | - | /proxy/preview?url=... | Page loads |
|
|
52
|
+
| 2 | Right-click | `body` | - | Context menu appears |
|
|
53
|
+
| 3 | Verify | `.feedback-context-menu` | - | Menu is visible |
|
|
54
|
+
|
|
55
|
+
**Expected Outcome:** Context menu appears on right-click
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Step 3: Analyze HTML
|
|
59
|
+
|
|
60
|
+
Reviewed src/x_ipe/static/js/uiux-feedback.js:
|
|
61
|
+
```javascript
|
|
62
|
+
// Found context menu implementation
|
|
63
|
+
const contextMenu = document.createElement('div');
|
|
64
|
+
contextMenu.className = 'feedback-context-menu';
|
|
65
|
+
contextMenu.id = 'feedback-context-menu';
|
|
66
|
+
|
|
67
|
+
// Found feedback panel
|
|
68
|
+
const panel = document.createElement('div');
|
|
69
|
+
panel.id = 'feedback-panel';
|
|
70
|
+
panel.innerHTML = `
|
|
71
|
+
<textarea id="feedback-description"></textarea>
|
|
72
|
+
<button id="submit-feedback">Submit</button>
|
|
73
|
+
`;
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Updated selectors:
|
|
77
|
+
```
|
|
78
|
+
- Context menu: #feedback-context-menu
|
|
79
|
+
- Capture option: .capture-feedback-btn
|
|
80
|
+
- Feedback panel: #feedback-panel
|
|
81
|
+
- Description input: #feedback-description
|
|
82
|
+
- Submit button: #submit-feedback
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Step 4: Test Data Preparation
|
|
86
|
+
|
|
87
|
+
**Context:** auto_proceed = false, so user is asked for test data.
|
|
88
|
+
|
|
89
|
+
Agent asks:
|
|
90
|
+
```markdown
|
|
91
|
+
## Test Data Required for FEATURE-022-C
|
|
92
|
+
|
|
93
|
+
### TC-005: Submit Feedback Successfully
|
|
94
|
+
- **Feedback description text:** (text to enter in textarea)
|
|
95
|
+
- **Expected success message:** (exact text to verify after submit)
|
|
96
|
+
|
|
97
|
+
### TC-006: Submit Feedback with Screenshot
|
|
98
|
+
- **Feedback description:** (text to enter)
|
|
99
|
+
- **Expected confirmation:** (what should appear after submission)
|
|
100
|
+
|
|
101
|
+
Please provide the test data, or type "use defaults" to use placeholder values.
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
User provides:
|
|
105
|
+
```
|
|
106
|
+
TC-005:
|
|
107
|
+
- Feedback description: "The button color is too light, hard to see"
|
|
108
|
+
- Expected success message: "Feedback submitted successfully"
|
|
109
|
+
|
|
110
|
+
TC-006:
|
|
111
|
+
- Feedback description: "Navigation menu overlaps content"
|
|
112
|
+
- Expected confirmation: "Feedback with screenshot saved"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Updated in each test case's Test Data table:
|
|
116
|
+
```markdown
|
|
117
|
+
### TC-005: Submit Feedback Successfully
|
|
118
|
+
...
|
|
119
|
+
**Test Data:**
|
|
120
|
+
> Data Source: User Provided
|
|
121
|
+
|
|
122
|
+
| Type | Field/Element | Value | Notes |
|
|
123
|
+
|------|---------------|-------|-------|
|
|
124
|
+
| Input | feedback-description | "The button color is too light, hard to see" | User provided |
|
|
125
|
+
| Expected | success-message | "Feedback submitted successfully" | Contains |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### TC-006: Submit Feedback with Screenshot
|
|
130
|
+
...
|
|
131
|
+
**Test Data:**
|
|
132
|
+
> Data Source: User Provided
|
|
133
|
+
|
|
134
|
+
| Type | Field/Element | Value | Notes |
|
|
135
|
+
|------|---------------|-------|-------|
|
|
136
|
+
| Input | feedback-description | "Navigation menu overlaps content" | User provided |
|
|
137
|
+
| Expected | success-message | "Feedback with screenshot saved" | Contains |
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Step 5: Reflect & Refine
|
|
141
|
+
|
|
142
|
+
Reflection on TC-001:
|
|
143
|
+
- ✅ Covers AC-1 completely
|
|
144
|
+
- ⚠️ Missing: Wait for context menu animation
|
|
145
|
+
- ⚠️ Missing: Verify menu position near click
|
|
146
|
+
|
|
147
|
+
Refined TC-001:
|
|
148
|
+
```markdown
|
|
149
|
+
| Step | Action | Element Selector | Input Data | Expected Result |
|
|
150
|
+
|------|--------|------------------|------------|-----------------|
|
|
151
|
+
| 1 | Navigate to | - | /proxy/preview?url=... | Page loads |
|
|
152
|
+
| 2 | Wait | `body` | 500ms | Page interactive |
|
|
153
|
+
| 3 | Right-click | `body` at (200, 200) | - | Click registered |
|
|
154
|
+
| 4 | Wait for | `#feedback-context-menu` | 300ms | Menu appears |
|
|
155
|
+
| 5 | Verify visible | `#feedback-context-menu` | - | Menu is visible |
|
|
156
|
+
| 6 | Verify position | `#feedback-context-menu` | - | Near click coords |
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Step 6: Execute via Chrome DevTools MCP
|
|
160
|
+
|
|
161
|
+
```javascript
|
|
162
|
+
// TC-001 Execution
|
|
163
|
+
await page.goto('http://localhost:5000/proxy/preview?url=https://example.com');
|
|
164
|
+
await page.waitForTimeout(500);
|
|
165
|
+
await page.click('body', { button: 'right', position: { x: 200, y: 200 } });
|
|
166
|
+
await page.waitForSelector('#feedback-context-menu', { timeout: 1000 });
|
|
167
|
+
|
|
168
|
+
const menuVisible = await page.isVisible('#feedback-context-menu');
|
|
169
|
+
assert(menuVisible === true); // PASS
|
|
170
|
+
|
|
171
|
+
// TC-002 Execution
|
|
172
|
+
await page.click('.capture-feedback-btn');
|
|
173
|
+
await page.waitForSelector('#feedback-panel');
|
|
174
|
+
|
|
175
|
+
const panelVisible = await page.isVisible('#feedback-panel');
|
|
176
|
+
assert(panelVisible === true); // PASS
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Step 7: Report Results
|
|
180
|
+
|
|
181
|
+
```markdown
|
|
182
|
+
## Execution Results
|
|
183
|
+
|
|
184
|
+
**Execution Date:** 01-28-2026
|
|
185
|
+
**Executed By:** Cipher
|
|
186
|
+
**Environment:** dev (localhost:5000)
|
|
187
|
+
|
|
188
|
+
| Metric | Value |
|
|
189
|
+
|--------|-------|
|
|
190
|
+
| Total Tests | 6 |
|
|
191
|
+
| Passed | 6 |
|
|
192
|
+
| Failed | 0 |
|
|
193
|
+
| Blocked | 0 |
|
|
194
|
+
| Pass Rate | 100% |
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Final Output
|
|
198
|
+
|
|
199
|
+
```yaml
|
|
200
|
+
Output:
|
|
201
|
+
category: feature-stage
|
|
202
|
+
status: completed
|
|
203
|
+
next_task_type: Feature Closing
|
|
204
|
+
require_human_review: No
|
|
205
|
+
task_output_links: [x-ipe-docs/requirements/FEATURE-022-C/acceptance-test-cases.md]
|
|
206
|
+
feature_id: FEATURE-022-C
|
|
207
|
+
feature_title: Feedback Capture & Panel
|
|
208
|
+
feature_version: v1.0
|
|
209
|
+
feature_phase: Acceptance Testing
|
|
210
|
+
test_cases_created: 6
|
|
211
|
+
tests_passed: 6
|
|
212
|
+
tests_failed: 0
|
|
213
|
+
pass_rate: "100%"
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Example 2: Skipped Execution (No Web UI)
|
|
219
|
+
|
|
220
|
+
**Context:** FEATURE-018: CLI Tool has been implemented.
|
|
221
|
+
|
|
222
|
+
### Step 1: Check UI Scope
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
Query feature board:
|
|
226
|
+
feature_id: FEATURE-018
|
|
227
|
+
status: Implemented
|
|
228
|
+
|
|
229
|
+
Read technical design:
|
|
230
|
+
Technical Scope: [CLI]
|
|
231
|
+
|
|
232
|
+
Decision: No web UI → Skip acceptance test
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Final Output
|
|
236
|
+
|
|
237
|
+
```yaml
|
|
238
|
+
Output:
|
|
239
|
+
category: feature-stage
|
|
240
|
+
status: skipped
|
|
241
|
+
next_task_type: Feature Closing
|
|
242
|
+
require_human_review: No
|
|
243
|
+
task_output_links: []
|
|
244
|
+
feature_id: FEATURE-018
|
|
245
|
+
feature_title: X-IPE CLI Tool
|
|
246
|
+
feature_version: v1.0
|
|
247
|
+
feature_phase: Acceptance Testing
|
|
248
|
+
skip_reason: "No web UI - CLI tool only"
|
|
249
|
+
test_cases_created: 0
|
|
250
|
+
tests_passed: 0
|
|
251
|
+
tests_failed: 0
|
|
252
|
+
pass_rate: "N/A"
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Example 3: Blocked Execution (No MCP)
|
|
258
|
+
|
|
259
|
+
**Context:** FEATURE-008: Idea Viewer needs acceptance testing but Chrome DevTools MCP is not configured.
|
|
260
|
+
|
|
261
|
+
### Steps 1-4: Complete as normal
|
|
262
|
+
|
|
263
|
+
Test cases generated and refined in acceptance-test-cases.md.
|
|
264
|
+
|
|
265
|
+
### Step 5: Execute Blocked
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
CHECK MCP availability:
|
|
269
|
+
Chrome DevTools MCP: Not configured
|
|
270
|
+
|
|
271
|
+
ACTION:
|
|
272
|
+
- Mark execution as blocked
|
|
273
|
+
- Document test cases are ready for manual execution
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Step 6: Report Results
|
|
277
|
+
|
|
278
|
+
```markdown
|
|
279
|
+
## Execution Results
|
|
280
|
+
|
|
281
|
+
**Execution Date:** 01-30-2026
|
|
282
|
+
**Executed By:** Cipher
|
|
283
|
+
**Environment:** N/A (MCP not available)
|
|
284
|
+
|
|
285
|
+
| Metric | Value |
|
|
286
|
+
|--------|-------|
|
|
287
|
+
| Total Tests | 8 |
|
|
288
|
+
| Passed | 0 |
|
|
289
|
+
| Failed | 0 |
|
|
290
|
+
| Blocked | 8 |
|
|
291
|
+
| Pass Rate | N/A |
|
|
292
|
+
|
|
293
|
+
**Note:** Test cases ready for manual execution. Chrome DevTools MCP required for automated execution.
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Final Output
|
|
297
|
+
|
|
298
|
+
```yaml
|
|
299
|
+
Output:
|
|
300
|
+
category: feature-stage
|
|
301
|
+
status: blocked
|
|
302
|
+
next_task_type: Feature Closing
|
|
303
|
+
require_human_review: Yes # Human should manually test or configure MCP
|
|
304
|
+
task_output_links: [x-ipe-docs/requirements/FEATURE-008/acceptance-test-cases.md]
|
|
305
|
+
feature_id: FEATURE-008
|
|
306
|
+
feature_title: Idea Viewer
|
|
307
|
+
feature_version: v1.4
|
|
308
|
+
feature_phase: Acceptance Testing
|
|
309
|
+
test_cases_created: 8
|
|
310
|
+
tests_passed: 0
|
|
311
|
+
tests_failed: 0
|
|
312
|
+
pass_rate: "N/A"
|
|
313
|
+
blocked_reason: "Chrome DevTools MCP not available"
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## Example 4: Partial Test Failure
|
|
319
|
+
|
|
320
|
+
**Context:** FEATURE-010: Dashboard has some failing tests.
|
|
321
|
+
|
|
322
|
+
### Step 5: Execute with Failures
|
|
323
|
+
|
|
324
|
+
```javascript
|
|
325
|
+
// TC-001: Dashboard loads - PASS
|
|
326
|
+
await page.goto('/dashboard');
|
|
327
|
+
const title = await page.textContent('h1');
|
|
328
|
+
assert(title === 'Dashboard'); // PASS
|
|
329
|
+
|
|
330
|
+
// TC-002: Chart renders - PASS
|
|
331
|
+
await page.waitForSelector('.chart-container');
|
|
332
|
+
// PASS
|
|
333
|
+
|
|
334
|
+
// TC-003: Export button works - FAIL
|
|
335
|
+
await page.click('#export-btn');
|
|
336
|
+
await page.waitForSelector('.export-modal', { timeout: 3000 });
|
|
337
|
+
// TIMEOUT - Modal never appeared
|
|
338
|
+
|
|
339
|
+
// TC-004: Data refresh works - PASS
|
|
340
|
+
await page.click('#refresh-btn');
|
|
341
|
+
// PASS
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Step 6: Report with Failures
|
|
345
|
+
|
|
346
|
+
```markdown
|
|
347
|
+
## Test Execution Summary
|
|
348
|
+
|
|
349
|
+
| Test Case | Title | Priority | Status | Notes |
|
|
350
|
+
|-----------|-------|----------|--------|-------|
|
|
351
|
+
| TC-001 | Dashboard loads | P0 | ✅ Pass | |
|
|
352
|
+
| TC-002 | Chart renders | P0 | ✅ Pass | |
|
|
353
|
+
| TC-003 | Export button works | P1 | ❌ Fail | Modal timeout |
|
|
354
|
+
| TC-004 | Data refresh works | P1 | ✅ Pass | |
|
|
355
|
+
|
|
356
|
+
## Execution Results
|
|
357
|
+
|
|
358
|
+
| Metric | Value |
|
|
359
|
+
|--------|-------|
|
|
360
|
+
| Total Tests | 4 |
|
|
361
|
+
| Passed | 3 |
|
|
362
|
+
| Failed | 1 |
|
|
363
|
+
| Blocked | 0 |
|
|
364
|
+
| Pass Rate | 75% |
|
|
365
|
+
|
|
366
|
+
### Failed Tests
|
|
367
|
+
|
|
368
|
+
| Test Case | Failure Reason | Recommended Action |
|
|
369
|
+
|-----------|----------------|-------------------|
|
|
370
|
+
| TC-003 | Timeout waiting for .export-modal | Check export modal implementation |
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Final Output
|
|
374
|
+
|
|
375
|
+
```yaml
|
|
376
|
+
Output:
|
|
377
|
+
category: feature-stage
|
|
378
|
+
status: completed # Tests ran, even with failures
|
|
379
|
+
next_task_type: Feature Closing
|
|
380
|
+
require_human_review: Yes # Due to test failures
|
|
381
|
+
task_output_links: [x-ipe-docs/requirements/FEATURE-010/acceptance-test-cases.md]
|
|
382
|
+
feature_id: FEATURE-010
|
|
383
|
+
feature_title: Dashboard
|
|
384
|
+
feature_version: v1.0
|
|
385
|
+
feature_phase: Acceptance Testing
|
|
386
|
+
test_cases_created: 4
|
|
387
|
+
tests_passed: 3
|
|
388
|
+
tests_failed: 1
|
|
389
|
+
pass_rate: "75%"
|
|
390
|
+
```
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Acceptance Test Cases
|
|
2
|
+
|
|
3
|
+
> Feature: {FEATURE-XXX} - {Feature Title}
|
|
4
|
+
> Generated: {date}
|
|
5
|
+
> Status: Draft | Ready for Execution | Executed
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
| Attribute | Value |
|
|
12
|
+
|-----------|-------|
|
|
13
|
+
| Feature ID | {FEATURE-XXX} |
|
|
14
|
+
| Feature Title | {title} |
|
|
15
|
+
| Total Test Cases | {count} |
|
|
16
|
+
| Priority | P0 (Critical) / P1 (High) / P2 (Medium) |
|
|
17
|
+
| Target URL | {base URL for testing} |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Prerequisites
|
|
22
|
+
|
|
23
|
+
- [ ] Feature is deployed and accessible
|
|
24
|
+
- [ ] Test environment is ready
|
|
25
|
+
- [ ] Chrome DevTools MCP is available
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Test Cases
|
|
30
|
+
|
|
31
|
+
### TC-001: {Test Case Title}
|
|
32
|
+
|
|
33
|
+
**Acceptance Criteria Reference:** AC-{X} from specification.md
|
|
34
|
+
|
|
35
|
+
**Priority:** P0 | P1 | P2
|
|
36
|
+
|
|
37
|
+
**Preconditions:**
|
|
38
|
+
- {precondition 1}
|
|
39
|
+
- {precondition 2}
|
|
40
|
+
|
|
41
|
+
**Test Data:**
|
|
42
|
+
> Data Source: User Provided | Generated Defaults
|
|
43
|
+
|
|
44
|
+
| Type | Field/Element | Value | Notes |
|
|
45
|
+
|------|---------------|-------|-------|
|
|
46
|
+
| Input | {field_name} | "{value}" | {notes} |
|
|
47
|
+
| Input | {field_name} | "{value}" | {notes} |
|
|
48
|
+
| Selection | {dropdown} | "{option}" | {notes} |
|
|
49
|
+
| Expected | {element} | "{expected_text}" | Match: Exact/Contains |
|
|
50
|
+
| Compare | {counter} | Before: X, After: Y | {notes} |
|
|
51
|
+
|
|
52
|
+
**Test Steps:**
|
|
53
|
+
|
|
54
|
+
| Step | Action | Element Selector | Input Data | Expected Result |
|
|
55
|
+
|------|--------|------------------|------------|-----------------|
|
|
56
|
+
| 1 | Navigate to | - | {URL} | Page loads successfully |
|
|
57
|
+
| 2 | Click | `{CSS selector}` | - | {expected behavior} |
|
|
58
|
+
| 3 | Enter text | `{CSS selector}` | "{input value}" | Text appears in field |
|
|
59
|
+
| 4 | Click | `{CSS selector}` | - | {expected behavior} |
|
|
60
|
+
| 5 | Verify | `{CSS selector}` | - | Element contains "{expected text}" |
|
|
61
|
+
|
|
62
|
+
**Expected Outcome:** {overall expected result}
|
|
63
|
+
|
|
64
|
+
**Status:** ⬜ Not Run | ✅ Pass | ❌ Fail
|
|
65
|
+
|
|
66
|
+
**Execution Notes:** {notes after execution}
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### TC-002: {Test Case Title}
|
|
71
|
+
|
|
72
|
+
**Acceptance Criteria Reference:** AC-{X} from specification.md
|
|
73
|
+
|
|
74
|
+
**Priority:** P0 | P1 | P2
|
|
75
|
+
|
|
76
|
+
**Preconditions:**
|
|
77
|
+
- {precondition 1}
|
|
78
|
+
|
|
79
|
+
**Test Data:**
|
|
80
|
+
> Data Source: User Provided | Generated Defaults
|
|
81
|
+
|
|
82
|
+
| Type | Field/Element | Value | Notes |
|
|
83
|
+
|------|---------------|-------|-------|
|
|
84
|
+
| Input | {field_name} | "{value}" | {notes} |
|
|
85
|
+
| Expected | {element} | "{expected_value}" | Match: Exact |
|
|
86
|
+
|
|
87
|
+
**Test Steps:**
|
|
88
|
+
|
|
89
|
+
| Step | Action | Element Selector | Input Data | Expected Result |
|
|
90
|
+
|------|--------|------------------|------------|-----------------|
|
|
91
|
+
| 1 | Navigate to | - | {URL} | Page loads successfully |
|
|
92
|
+
| 2 | {action} | `{selector}` | {input} | {expected} |
|
|
93
|
+
|
|
94
|
+
**Expected Outcome:** {overall expected result}
|
|
95
|
+
|
|
96
|
+
**Status:** ⬜ Not Run | ✅ Pass | ❌ Fail
|
|
97
|
+
|
|
98
|
+
**Execution Notes:** {notes after execution}
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Test Execution Summary
|
|
103
|
+
|
|
104
|
+
| Test Case | Title | Priority | Status | Notes |
|
|
105
|
+
|-----------|-------|----------|--------|-------|
|
|
106
|
+
| TC-001 | {title} | P0 | ⬜ Not Run | |
|
|
107
|
+
| TC-002 | {title} | P1 | ⬜ Not Run | |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Execution Results
|
|
112
|
+
|
|
113
|
+
**Execution Date:** {date}
|
|
114
|
+
**Executed By:** {agent nickname}
|
|
115
|
+
**Environment:** {dev/staging/prod}
|
|
116
|
+
|
|
117
|
+
| Metric | Value |
|
|
118
|
+
|--------|-------|
|
|
119
|
+
| Total Tests | {X} |
|
|
120
|
+
| Passed | {X} |
|
|
121
|
+
| Failed | {X} |
|
|
122
|
+
| Blocked | {X} |
|
|
123
|
+
| Pass Rate | {X}% |
|
|
124
|
+
|
|
125
|
+
### Failed Tests
|
|
126
|
+
|
|
127
|
+
| Test Case | Failure Reason | Screenshot | Recommended Action |
|
|
128
|
+
|-----------|----------------|------------|-------------------|
|
|
129
|
+
| TC-XXX | {reason} | {link if any} | {action} |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Notes
|
|
134
|
+
|
|
135
|
+
- {any additional notes about testing}
|
|
@@ -4,12 +4,12 @@ x_ipe/app.py,sha256=EkOYKxF-nKnRG2ev6tC-Fw5EHikWJyVxO7hfLAouJPE,5262
|
|
|
4
4
|
x_ipe/app.py.bak,sha256=WRuPkrHkS77BAMFYV5uVS2Xl2-QDwQE0KdgTyJHxMpk,45732
|
|
5
5
|
x_ipe/config.py,sha256=NYLhpfhxVMZETHW2SNej3sVoUutuPzTGrQTsJTuie80,1685
|
|
6
6
|
x_ipe/cli/__init__.py,sha256=yAg0J4ULFDPnVbtFOORPAcWT_SwjW4CK9bNDd-c2xPg,80
|
|
7
|
-
x_ipe/cli/main.py,sha256=
|
|
7
|
+
x_ipe/cli/main.py,sha256=NA0Fn7t6tjrYczASydcE0qPsA-y89pYPxBv8faiyURs,16596
|
|
8
8
|
x_ipe/core/__init__.py,sha256=aB6UCmjC3QRrJfHPTV0uBqGHnnnQncX6rl4i6PKI5oo,556
|
|
9
9
|
x_ipe/core/config.py,sha256=9JmWcVqBvfcqwkWnfx4WvmSi65JVnfhERE5w6pBZSRI,5590
|
|
10
10
|
x_ipe/core/hashing.py,sha256=brF5W8fHZVxADkRqztoBg9yNkN8PpbLI7WWrsRY54Zg,3573
|
|
11
11
|
x_ipe/core/paths.py,sha256=bTXouYy0-_k7A1mNaRg2MLWnfDuzZesPlsY9Rg6nMOo,2562
|
|
12
|
-
x_ipe/core/scaffold.py,sha256
|
|
12
|
+
x_ipe/core/scaffold.py,sha256=64jB8jYmm9oU_7l3PUjRzLyudb8NxZ9mDwgHb8WytVI,15107
|
|
13
13
|
x_ipe/core/skills.py,sha256=sZSk-eDLYxvpa9J1a7HIv3xuwrDLinvL7tLIcmTXixc,8535
|
|
14
14
|
x_ipe/handlers/__init__.py,sha256=asR3VNYqVYbOowET6Nxn82S7hM52ySEuCmqAaKaZ78E,359
|
|
15
15
|
x_ipe/handlers/terminal_handlers.py,sha256=1vc34FAdaBL2J_wi3BSlGKw6HmWADXf83O-ECTO8Ov0,4463
|
|
@@ -17,6 +17,7 @@ x_ipe/handlers/voice_handlers.py,sha256=Eo5qzQR4WIbG-Jm5zmQHro4kAb-1mbnUPIDnGcop
|
|
|
17
17
|
x_ipe/resources/config/.env.example,sha256=uG9RiX2q9wd-RS-2kg8gqiYrZwNtYHjJINzrIIk3_1I,1192
|
|
18
18
|
x_ipe/resources/config/copilot-prompt.json,sha256=R6aG7x63Kw_YHIZgs0QVNMA1w4DBY8ilTWBhSYTrAxo,709
|
|
19
19
|
x_ipe/resources/config/tools.json,sha256=WilFs7YfsbPEhml10ksFcba61F1OU-iMqYocogqTefE,595
|
|
20
|
+
x_ipe/resources/copilot/mcp-config.json,sha256=cSjfY0a1ewqwnTMbTJNYk1UOZrPKCS43xKvOwP7DcjQ,216
|
|
20
21
|
x_ipe/resources/planning/features.md,sha256=NhWPI3eeC7EN5yqWwR-7pKbLrbBJ5JVKDtWoiYOOiAY,981
|
|
21
22
|
x_ipe/resources/planning/task-board.md,sha256=y_TZ7SZxCZCRUTs-g04BWewSb3CnX_lXY3UP7_5vkF4,2028
|
|
22
23
|
x_ipe/resources/themes/theme-default/component-visualization.html,sha256=0Ykm6QxVsEyk4Xpt7uNggZnqD1UxAR0vN3qtLbb3OLk,27908
|
|
@@ -95,7 +96,7 @@ x_ipe/templates/index.html,sha256=jwkix2HceZpryi-nIpqSrKa1Yu_zTW9i6V2gBiWnB-g,68
|
|
|
95
96
|
x_ipe/templates/settings.html,sha256=sWre7dVeDkmRimMZuQDnVvmHHXBStBQAmW-sRIHgRQY,28132
|
|
96
97
|
x_ipe/templates/uiux-feedbacks.html,sha256=MbFtkXowyrVfPCthU0FZ8lCrnCJ2W82EqqfsWZnzpgE,3429
|
|
97
98
|
x_ipe/templates/workplace.html,sha256=URmVTLMFJ4oyEdfAV3UA6RTaSzieUoJJVmGydzroyFw,4652
|
|
98
|
-
x_ipe/resources/copilot-instructions.md,sha256=
|
|
99
|
+
x_ipe/resources/copilot-instructions.md,sha256=ZDEQwxmE68zJfh5oDgmzDKI-R6zq90V_eJz-XUUSkXo,7570
|
|
99
100
|
x_ipe/resources/skills/feature-stage+feature-board-management/SKILL.md,sha256=dKezRiU4rMu0rxjxtzbSejwQKVxiNMZ1T3Z6S77_0gI,12692
|
|
100
101
|
x_ipe/resources/skills/feature-stage+feature-board-management/templates/features.md,sha256=i2GgcZLAXJtatsabctlYDY30H81Mf3Ux0WQXVOORygQ,996
|
|
101
102
|
x_ipe/resources/skills/frontend-design/LICENSE.txt,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
|
|
@@ -1134,7 +1135,7 @@ x_ipe/resources/skills/requirement-stage+requirement-board-management/SKILL.md,s
|
|
|
1134
1135
|
x_ipe/resources/skills/task-board-management/SKILL.md,sha256=MHlMd5v9d_zf-91NZApmwWJhyTfrTg_Wpk6XIKyV8hY,10713
|
|
1135
1136
|
x_ipe/resources/skills/task-board-management/templates/task-board.md,sha256=BqTpI7EThVho2uOl43pweRsRLEmgC5fZ8X-lfANFFAQ,1947
|
|
1136
1137
|
x_ipe/resources/skills/task-board-management/templates/task-record.yaml,sha256=jPuGTpvJtGVXvYk1kAS2ISo37kfwZ4u5I4eP2lItGBM,3060
|
|
1137
|
-
x_ipe/resources/skills/task-execution-guideline/SKILL.md,sha256=
|
|
1138
|
+
x_ipe/resources/skills/task-execution-guideline/SKILL.md,sha256=_-I8ERVjQarxiTEm66MuKa9uTpW45muV5FVXbVCeWqI,15894
|
|
1138
1139
|
x_ipe/resources/skills/task-execution-guideline/templates/task-board.md,sha256=YDfhiTU7XBeyjfvtvIjgazHdj3W4X-7RJYElrT-DqXY,1465
|
|
1139
1140
|
x_ipe/resources/skills/task-execution-guideline/templates/task-record.yaml,sha256=KeqVfE9G0kdL1hdyjLMQERDR2sEW84JFpccOMssohk0,3158
|
|
1140
1141
|
x_ipe/resources/skills/task-type-bug-fix/SKILL.md,sha256=LmdhaSYghwKfad3vSs8dRYIFsNjvDDcJiXhfls7Xu1c,10026
|
|
@@ -1142,7 +1143,7 @@ x_ipe/resources/skills/task-type-change-request/SKILL.md,sha256=D4hVF8ag_oe8OLX_
|
|
|
1142
1143
|
x_ipe/resources/skills/task-type-change-request/references/examples.md,sha256=_flkdNdgyUSEMfSb51zxeL1QhdXLvQANPAJUdZlvnDw,4633
|
|
1143
1144
|
x_ipe/resources/skills/task-type-change-request/references/patterns.md,sha256=c-Iz0mncfb2dHVhmqXXaRSvWMiCZzxs8COUHGN60jIQ,4754
|
|
1144
1145
|
x_ipe/resources/skills/task-type-change-request/templates/change-request.md,sha256=mWHPbkpeAY6QB7XBBLNZ-PXcgP88h7BEAyXBAGFdSrI,1980
|
|
1145
|
-
x_ipe/resources/skills/task-type-code-implementation/SKILL.md,sha256=
|
|
1146
|
+
x_ipe/resources/skills/task-type-code-implementation/SKILL.md,sha256=wqUn0mYJkn0E0b6EGTIEmD6aeK1Wx--76ZmRX9vNBys,15350
|
|
1146
1147
|
x_ipe/resources/skills/task-type-code-implementation/references/examples.md,sha256=CKRqR2pn4wWTZ3MDkf575wf2zEsIoOaNJWgPFCmsugY,4071
|
|
1147
1148
|
x_ipe/resources/skills/task-type-code-refactor-v2/SKILL.md,sha256=3toyHNxuaCCL1qdT2AVCXCzwJR0DLyvMNCzCqO5CKt4,15974
|
|
1148
1149
|
x_ipe/resources/skills/task-type-code-refactor-v2/references/examples.md,sha256=1lv-Q5-_qFiLMEFpEaa2SLcukxI7zfriCMKcdQidR1I,7359
|
|
@@ -1151,6 +1152,9 @@ x_ipe/resources/skills/task-type-dev-environment/references/examples.md,sha256=6
|
|
|
1151
1152
|
x_ipe/resources/skills/task-type-dev-environment/templates/setup-nodejs.md,sha256=jWOp1CfnaTKfQa7hB6xrk2PbZ_P_SjMuMSyu6oLuXLA,7196
|
|
1152
1153
|
x_ipe/resources/skills/task-type-dev-environment/templates/setup-python.md,sha256=qSilVbgXjfta7zkjlM1IBIbMCMoTgiW-g2EVps5iX5w,4985
|
|
1153
1154
|
x_ipe/resources/skills/task-type-doc-viewer/SKILL.md,sha256=dn3WKRTjsQSbW6vMLWBbqKOIVPK9AelSb_mihErtX3c,7058
|
|
1155
|
+
x_ipe/resources/skills/task-type-feature-acceptance-test/SKILL.md,sha256=sR_1kgcvLev2rpfVxYaGdtd1upf9nI63Mu0Ov1R_8xQ,14678
|
|
1156
|
+
x_ipe/resources/skills/task-type-feature-acceptance-test/references/examples.md,sha256=DCKPEIRPkS-EWA7B13tenWo9oYwOCXj9YG5e-8Pgh50,9886
|
|
1157
|
+
x_ipe/resources/skills/task-type-feature-acceptance-test/templates/acceptance-test-cases.md,sha256=iTB-TOPSLy-7GXAnJoPwmodIRHA7o6AlAYoOXdy-W04,3330
|
|
1154
1158
|
x_ipe/resources/skills/task-type-feature-breakdown/SKILL.md,sha256=94K4Z8fP95Xsou-B5H97lMvjapbdKJw6SmaqI8HqHyQ,17718
|
|
1155
1159
|
x_ipe/resources/skills/task-type-feature-breakdown/references/examples.md,sha256=4coUx5BBSTMTFZmBNAJbqc_KWLp35EKLDzYe1h5INRY,4848
|
|
1156
1160
|
x_ipe/resources/skills/task-type-feature-breakdown/templates/features.md,sha256=SBHkJqspofvytOL5KsbHlwqHUa40ZfWQgLAXshhjn8s,252
|
|
@@ -1240,8 +1244,8 @@ x_ipe/resources/skills/x-ipe-skill-creator/templates/references/examples.md,sha2
|
|
|
1240
1244
|
x_ipe/resources/skills/xlsx/LICENSE.txt,sha256=efbY9bQnJS-jscEezb22v2ELlE91MLTeePdw84dBz6o,1467
|
|
1241
1245
|
x_ipe/resources/skills/xlsx/SKILL.md,sha256=AgzNtZMiV7ZsY47BFX6iSNV_pSyMAfH2i1WbWXDH3zU,10632
|
|
1242
1246
|
x_ipe/resources/skills/xlsx/recalc.py,sha256=qx7wyUU2uyO2xqPTJ2mwQB7DzIXnPCR9V03YTsc68V0,6408
|
|
1243
|
-
x_ipe-1.0.
|
|
1244
|
-
x_ipe-1.0.
|
|
1245
|
-
x_ipe-1.0.
|
|
1246
|
-
x_ipe-1.0.
|
|
1247
|
-
x_ipe-1.0.
|
|
1247
|
+
x_ipe-1.0.21.dist-info/METADATA,sha256=oknwRHE940fbvhPbPU1g4GA-bJX5gSV_mqhZmPE8Huo,637
|
|
1248
|
+
x_ipe-1.0.21.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
1249
|
+
x_ipe-1.0.21.dist-info/entry_points.txt,sha256=b787rsvZAIjLgjBzB87D_BE8yu6DCqBqv9zv4F6_j6M,41
|
|
1250
|
+
x_ipe-1.0.21.dist-info/licenses/LICENSE,sha256=8lS-M88bBvSI9_8kauYvQRu03WEMnj1Q5KoxOFKFnhc,1062
|
|
1251
|
+
x_ipe-1.0.21.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|