@adriankulik/create-fullstack-app 1.1.0 → 1.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 +5 -1
- package/package.json +1 -1
- package/templates/base/.agents/skills/accessibility-general/SKILL.md +231 -0
- package/templates/base/.agents/skills/senior-frontend/SKILL.md +209 -0
- package/templates/base/.agents/skills/senior-frontend/references/frontend_best_practices.md +103 -0
- package/templates/base/.agents/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
- package/templates/base/.agents/skills/senior-frontend/references/react_patterns.md +103 -0
- package/templates/base/.agents/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
- package/templates/base/.agents/skills/senior-frontend/scripts/component_generator.py +114 -0
- package/templates/base/.agents/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
- package/templates/base/.agents/skills/senior-fullstack/SKILL.md +209 -0
- package/templates/base/.agents/skills/senior-fullstack/references/architecture_patterns.md +103 -0
- package/templates/base/.agents/skills/senior-fullstack/references/development_workflows.md +103 -0
- package/templates/base/.agents/skills/senior-fullstack/references/tech_stack_guide.md +103 -0
- package/templates/base/.agents/skills/senior-fullstack/scripts/code_quality_analyzer.py +114 -0
- package/templates/base/.agents/skills/senior-fullstack/scripts/fullstack_scaffolder.py +114 -0
- package/templates/base/.agents/skills/senior-fullstack/scripts/project_scaffolder.py +114 -0
- package/templates/base/.agents/skills/senior-qa/SKILL.md +209 -0
- package/templates/base/.agents/skills/senior-qa/references/qa_best_practices.md +103 -0
- package/templates/base/.agents/skills/senior-qa/references/test_automation_patterns.md +103 -0
- package/templates/base/.agents/skills/senior-qa/references/testing_strategies.md +103 -0
- package/templates/base/.agents/skills/senior-qa/scripts/coverage_analyzer.py +114 -0
- package/templates/base/.agents/skills/senior-qa/scripts/e2e_test_scaffolder.py +114 -0
- package/templates/base/.agents/skills/senior-qa/scripts/test_suite_generator.py +114 -0
- package/templates/base/ACCESSIBILITY.md +117 -0
- package/templates/base/{GEMINI.md → AGENTS.md} +1 -1
- package/templates/base/README.md +12 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
E2E Test Scaffolder
|
|
4
|
+
Automated tool for senior qa tasks
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import json
|
|
10
|
+
import argparse
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Dict, List, Optional
|
|
13
|
+
|
|
14
|
+
class E2ETestScaffolder:
|
|
15
|
+
"""Main class for e2e test scaffolder functionality"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, target_path: str, verbose: bool = False):
|
|
18
|
+
self.target_path = Path(target_path)
|
|
19
|
+
self.verbose = verbose
|
|
20
|
+
self.results = {}
|
|
21
|
+
|
|
22
|
+
def run(self) -> Dict:
|
|
23
|
+
"""Execute the main functionality"""
|
|
24
|
+
print(f"🚀 Running {self.__class__.__name__}...")
|
|
25
|
+
print(f"📁 Target: {self.target_path}")
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
self.validate_target()
|
|
29
|
+
self.analyze()
|
|
30
|
+
self.generate_report()
|
|
31
|
+
|
|
32
|
+
print("✅ Completed successfully!")
|
|
33
|
+
return self.results
|
|
34
|
+
|
|
35
|
+
except Exception as e:
|
|
36
|
+
print(f"❌ Error: {e}")
|
|
37
|
+
sys.exit(1)
|
|
38
|
+
|
|
39
|
+
def validate_target(self):
|
|
40
|
+
"""Validate the target path exists and is accessible"""
|
|
41
|
+
if not self.target_path.exists():
|
|
42
|
+
raise ValueError(f"Target path does not exist: {self.target_path}")
|
|
43
|
+
|
|
44
|
+
if self.verbose:
|
|
45
|
+
print(f"✓ Target validated: {self.target_path}")
|
|
46
|
+
|
|
47
|
+
def analyze(self):
|
|
48
|
+
"""Perform the main analysis or operation"""
|
|
49
|
+
if self.verbose:
|
|
50
|
+
print("📊 Analyzing...")
|
|
51
|
+
|
|
52
|
+
# Main logic here
|
|
53
|
+
self.results['status'] = 'success'
|
|
54
|
+
self.results['target'] = str(self.target_path)
|
|
55
|
+
self.results['findings'] = []
|
|
56
|
+
|
|
57
|
+
# Add analysis results
|
|
58
|
+
if self.verbose:
|
|
59
|
+
print(f"✓ Analysis complete: {len(self.results.get('findings', []))} findings")
|
|
60
|
+
|
|
61
|
+
def generate_report(self):
|
|
62
|
+
"""Generate and display the report"""
|
|
63
|
+
print("\n" + "="*50)
|
|
64
|
+
print("REPORT")
|
|
65
|
+
print("="*50)
|
|
66
|
+
print(f"Target: {self.results.get('target')}")
|
|
67
|
+
print(f"Status: {self.results.get('status')}")
|
|
68
|
+
print(f"Findings: {len(self.results.get('findings', []))}")
|
|
69
|
+
print("="*50 + "\n")
|
|
70
|
+
|
|
71
|
+
def main():
|
|
72
|
+
"""Main entry point"""
|
|
73
|
+
parser = argparse.ArgumentParser(
|
|
74
|
+
description="E2E Test Scaffolder"
|
|
75
|
+
)
|
|
76
|
+
parser.add_argument(
|
|
77
|
+
'target',
|
|
78
|
+
help='Target path to analyze or process'
|
|
79
|
+
)
|
|
80
|
+
parser.add_argument(
|
|
81
|
+
'--verbose', '-v',
|
|
82
|
+
action='store_true',
|
|
83
|
+
help='Enable verbose output'
|
|
84
|
+
)
|
|
85
|
+
parser.add_argument(
|
|
86
|
+
'--json',
|
|
87
|
+
action='store_true',
|
|
88
|
+
help='Output results as JSON'
|
|
89
|
+
)
|
|
90
|
+
parser.add_argument(
|
|
91
|
+
'--output', '-o',
|
|
92
|
+
help='Output file path'
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
args = parser.parse_args()
|
|
96
|
+
|
|
97
|
+
tool = E2ETestScaffolder(
|
|
98
|
+
args.target,
|
|
99
|
+
verbose=args.verbose
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
results = tool.run()
|
|
103
|
+
|
|
104
|
+
if args.json:
|
|
105
|
+
output = json.dumps(results, indent=2)
|
|
106
|
+
if args.output:
|
|
107
|
+
with open(args.output, 'w') as f:
|
|
108
|
+
f.write(output)
|
|
109
|
+
print(f"Results written to {args.output}")
|
|
110
|
+
else:
|
|
111
|
+
print(output)
|
|
112
|
+
|
|
113
|
+
if __name__ == '__main__':
|
|
114
|
+
main()
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Test Suite Generator
|
|
4
|
+
Automated tool for senior qa tasks
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import json
|
|
10
|
+
import argparse
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Dict, List, Optional
|
|
13
|
+
|
|
14
|
+
class TestSuiteGenerator:
|
|
15
|
+
"""Main class for test suite generator functionality"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, target_path: str, verbose: bool = False):
|
|
18
|
+
self.target_path = Path(target_path)
|
|
19
|
+
self.verbose = verbose
|
|
20
|
+
self.results = {}
|
|
21
|
+
|
|
22
|
+
def run(self) -> Dict:
|
|
23
|
+
"""Execute the main functionality"""
|
|
24
|
+
print(f"🚀 Running {self.__class__.__name__}...")
|
|
25
|
+
print(f"📁 Target: {self.target_path}")
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
self.validate_target()
|
|
29
|
+
self.analyze()
|
|
30
|
+
self.generate_report()
|
|
31
|
+
|
|
32
|
+
print("✅ Completed successfully!")
|
|
33
|
+
return self.results
|
|
34
|
+
|
|
35
|
+
except Exception as e:
|
|
36
|
+
print(f"❌ Error: {e}")
|
|
37
|
+
sys.exit(1)
|
|
38
|
+
|
|
39
|
+
def validate_target(self):
|
|
40
|
+
"""Validate the target path exists and is accessible"""
|
|
41
|
+
if not self.target_path.exists():
|
|
42
|
+
raise ValueError(f"Target path does not exist: {self.target_path}")
|
|
43
|
+
|
|
44
|
+
if self.verbose:
|
|
45
|
+
print(f"✓ Target validated: {self.target_path}")
|
|
46
|
+
|
|
47
|
+
def analyze(self):
|
|
48
|
+
"""Perform the main analysis or operation"""
|
|
49
|
+
if self.verbose:
|
|
50
|
+
print("📊 Analyzing...")
|
|
51
|
+
|
|
52
|
+
# Main logic here
|
|
53
|
+
self.results['status'] = 'success'
|
|
54
|
+
self.results['target'] = str(self.target_path)
|
|
55
|
+
self.results['findings'] = []
|
|
56
|
+
|
|
57
|
+
# Add analysis results
|
|
58
|
+
if self.verbose:
|
|
59
|
+
print(f"✓ Analysis complete: {len(self.results.get('findings', []))} findings")
|
|
60
|
+
|
|
61
|
+
def generate_report(self):
|
|
62
|
+
"""Generate and display the report"""
|
|
63
|
+
print("\n" + "="*50)
|
|
64
|
+
print("REPORT")
|
|
65
|
+
print("="*50)
|
|
66
|
+
print(f"Target: {self.results.get('target')}")
|
|
67
|
+
print(f"Status: {self.results.get('status')}")
|
|
68
|
+
print(f"Findings: {len(self.results.get('findings', []))}")
|
|
69
|
+
print("="*50 + "\n")
|
|
70
|
+
|
|
71
|
+
def main():
|
|
72
|
+
"""Main entry point"""
|
|
73
|
+
parser = argparse.ArgumentParser(
|
|
74
|
+
description="Test Suite Generator"
|
|
75
|
+
)
|
|
76
|
+
parser.add_argument(
|
|
77
|
+
'target',
|
|
78
|
+
help='Target path to analyze or process'
|
|
79
|
+
)
|
|
80
|
+
parser.add_argument(
|
|
81
|
+
'--verbose', '-v',
|
|
82
|
+
action='store_true',
|
|
83
|
+
help='Enable verbose output'
|
|
84
|
+
)
|
|
85
|
+
parser.add_argument(
|
|
86
|
+
'--json',
|
|
87
|
+
action='store_true',
|
|
88
|
+
help='Output results as JSON'
|
|
89
|
+
)
|
|
90
|
+
parser.add_argument(
|
|
91
|
+
'--output', '-o',
|
|
92
|
+
help='Output file path'
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
args = parser.parse_args()
|
|
96
|
+
|
|
97
|
+
tool = TestSuiteGenerator(
|
|
98
|
+
args.target,
|
|
99
|
+
verbose=args.verbose
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
results = tool.run()
|
|
103
|
+
|
|
104
|
+
if args.json:
|
|
105
|
+
output = json.dumps(results, indent=2)
|
|
106
|
+
if args.output:
|
|
107
|
+
with open(args.output, 'w') as f:
|
|
108
|
+
f.write(output)
|
|
109
|
+
print(f"Results written to {args.output}")
|
|
110
|
+
else:
|
|
111
|
+
print(output)
|
|
112
|
+
|
|
113
|
+
if __name__ == '__main__':
|
|
114
|
+
main()
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Accessibility Commitment (ACCESSIBILITY.md)
|
|
2
|
+
|
|
3
|
+
## 1. Our commitment
|
|
4
|
+
|
|
5
|
+
We believe accessibility is a subset of quality. This project commits to **WCAG 2.2 AA** standards for all documentation and example code. We track our progress publicly to remain accountable to our users.
|
|
6
|
+
|
|
7
|
+
## 2. Real-time health metrics
|
|
8
|
+
|
|
9
|
+
| Metric | Status / Value |
|
|
10
|
+
| :--------------------------- | :-------------------------------------------------------------------------------------------------- |
|
|
11
|
+
| **Open A11y Issues** | [View open accessibility issues](https://github.com/mgifford/ACCESSIBILITY.md/labels/accessibility) |
|
|
12
|
+
| **Automated Test Pass Rate** | Monitored via link checking and documentation validation |
|
|
13
|
+
| **A11y PRs Merged (MTD)** | Tracked in [project insights](https://github.com/mgifford/ACCESSIBILITY.md/pulse) |
|
|
14
|
+
| **Browser Support** | Last 2 major versions of Chrome, Firefox, Safari - [View Policy](./BROWSER_SUPPORT.md) |
|
|
15
|
+
|
|
16
|
+
## 3. Contributor requirements (the guardrails)
|
|
17
|
+
|
|
18
|
+
To contribute to this repo, you must follow these guidelines:
|
|
19
|
+
|
|
20
|
+
- **Documentation Testing:** All documentation examples must follow accessibility best practices
|
|
21
|
+
- **Code Examples:** Follow our component-specific best practices:
|
|
22
|
+
- [SVG Accessibility Best Practices](./examples/SVG_ACCESSIBILITY_BEST_PRACTICES.md)
|
|
23
|
+
- [Mermaid Diagram Best Practices](./examples/MERMAID_ACCESSIBILITY_BEST_PRACTICES.md)
|
|
24
|
+
- [Forms Accessibility Best Practices](./examples/FORMS_ACCESSIBILITY_BEST_PRACTICES.md)
|
|
25
|
+
- [Keyboard Accessibility Best Practices](./examples/KEYBOARD_ACCESSIBILITY_BEST_PRACTICES.md)
|
|
26
|
+
- [Light/Dark Mode Accessibility Best Practices](./examples/LIGHT_DARK_MODE_ACCESSIBILITY_BEST_PRACTICES.md)
|
|
27
|
+
- **Link Validation:** All documentation links must pass our automated link checker
|
|
28
|
+
- **Inclusive Language:** Use person-centered, respectful language throughout
|
|
29
|
+
|
|
30
|
+
## 4. Reporting and severity taxonomy
|
|
31
|
+
|
|
32
|
+
Please use our [issue templates](https://github.com/mgifford/ACCESSIBILITY.md/issues/new) when reporting issues. We prioritize based on:
|
|
33
|
+
|
|
34
|
+
- **Critical:** Documentation error that could lead to implementing inaccessible features that prevent users from completing core tasks
|
|
35
|
+
- **High:** Significant guidance gap or misleading information that could create accessibility barriers
|
|
36
|
+
- **Medium:** Documentation clarity issues or incomplete examples
|
|
37
|
+
- **Low:** Minor improvements, typos, or enhancements
|
|
38
|
+
|
|
39
|
+
## 5. Automated check coverage
|
|
40
|
+
|
|
41
|
+
We track our automated testing rules against the [Axe Rules Reference](./examples/AXE_RULES_REFERENCE.md).
|
|
42
|
+
|
|
43
|
+
Our documentation includes:
|
|
44
|
+
|
|
45
|
+
- Comprehensive axe-core rule mappings ([AXE_RULES_COVERAGE.md](./examples/AXE_RULES_COVERAGE.md))
|
|
46
|
+
- Shift-left automation guidance ([SHIFT_LEFT_ACCESSIBILITY_AUTOMATION.md](./examples/SHIFT_LEFT_ACCESSIBILITY_AUTOMATION.md))
|
|
47
|
+
- Pre-commit hook samples ([PRE_COMMIT_ACCESSIBILITY_SAMPLE.yaml](./examples/PRE_COMMIT_ACCESSIBILITY_SAMPLE.yaml))
|
|
48
|
+
- CI/CD workflow examples ([A11Y_SHIFT_LEFT_WORKFLOW.yml](./examples/A11Y_SHIFT_LEFT_WORKFLOW.yml))
|
|
49
|
+
|
|
50
|
+
## 6. Browser and assistive technology testing
|
|
51
|
+
|
|
52
|
+
### Browser support guarantees
|
|
53
|
+
|
|
54
|
+
This project supports the **last 2 major versions** of all major browser engines:
|
|
55
|
+
|
|
56
|
+
- **Chrome/Chromium** (including Edge, Brave, Opera)
|
|
57
|
+
- **Firefox**
|
|
58
|
+
- **Safari/WebKit** (macOS and iOS)
|
|
59
|
+
|
|
60
|
+
See our comprehensive [Browser Support Policy](./BROWSER_SUPPORT.md) for version details, testing requirements, and implementation guidance.
|
|
61
|
+
|
|
62
|
+
### Assistive technology testing
|
|
63
|
+
|
|
64
|
+
Contributors are encouraged to test documentation and examples with:
|
|
65
|
+
|
|
66
|
+
- **Screen readers:** JAWS, NVDA, VoiceOver, TalkBack
|
|
67
|
+
- **Keyboard navigation:** Tab, arrow keys, standard shortcuts
|
|
68
|
+
- **Magnification tools:** Browser zoom, screen magnifiers
|
|
69
|
+
- **Voice control:** Dragon, Voice Control
|
|
70
|
+
|
|
71
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for details on reporting assistive technology test results.
|
|
72
|
+
|
|
73
|
+
## 7. Machine-readable standards
|
|
74
|
+
|
|
75
|
+
This project leverages [wai-yaml-ld](https://github.com/mgifford/wai-yaml-ld) for machine-readable accessibility standards, enabling AI agents to provide standards-grounded guidance. All vetted sources are documented in [TRUSTED_SOURCES.yaml](./examples/TRUSTED_SOURCES.yaml).
|
|
76
|
+
|
|
77
|
+
### Respecting content creator preferences
|
|
78
|
+
|
|
79
|
+
While we maintain a list of trusted accessibility sources, we recognize and respect that not all content creators want their work scraped or used for AI training. Our [TRUSTED_SOURCES.yaml](./examples/TRUSTED_SOURCES.yaml) includes an `ai_scraping` field to indicate each source's preferences:
|
|
80
|
+
|
|
81
|
+
- **`allowed`** (default): Content may be used for AI training and reference
|
|
82
|
+
- **`prohibited`**: Do not scrape, crawl, or use content for AI training. Reference and cite only
|
|
83
|
+
- **`restricted`**: Use only for reference and citation purposes, not for training data
|
|
84
|
+
|
|
85
|
+
**For AI agents and automated tools:** Always check the `ai_scraping` field before accessing content from listed sources. Even trusted accessibility experts may prohibit AI scraping of their content. Respect these preferences by:
|
|
86
|
+
|
|
87
|
+
- Not crawling or scraping sites marked as `prohibited`
|
|
88
|
+
- Citing and linking to content instead of reproducing it
|
|
89
|
+
- Using alternative sources when training data is needed
|
|
90
|
+
|
|
91
|
+
**For human contributors:** When adding new sources to TRUSTED_SOURCES.yaml, check the website's robots.txt, terms of service, or public statements about AI scraping, and set the `ai_scraping` field accordingly.
|
|
92
|
+
|
|
93
|
+
## 8. Known limitations
|
|
94
|
+
|
|
95
|
+
As a documentation repository:
|
|
96
|
+
|
|
97
|
+
- We provide guidance and templates but cannot test actual implementations
|
|
98
|
+
- Examples are illustrative and may need adaptation for specific contexts
|
|
99
|
+
- We rely on community feedback to identify gaps and outdated patterns
|
|
100
|
+
|
|
101
|
+
## 9. Getting help
|
|
102
|
+
|
|
103
|
+
- **Questions:** Open a [discussion](https://github.com/mgifford/ACCESSIBILITY.md/discussions)
|
|
104
|
+
- **Bugs or gaps:** Open an [issue](https://github.com/mgifford/ACCESSIBILITY.md/issues)
|
|
105
|
+
- **Contributions:** See [CONTRIBUTING.md](./CONTRIBUTING.md)
|
|
106
|
+
- **Accommodations:** Request via `accessibility-accommodation` label
|
|
107
|
+
|
|
108
|
+
## 10. Continuous improvement
|
|
109
|
+
|
|
110
|
+
We regularly review and update:
|
|
111
|
+
|
|
112
|
+
- WCAG conformance as standards evolve
|
|
113
|
+
- Best practices based on community feedback
|
|
114
|
+
- Tool recommendations and automation examples
|
|
115
|
+
- Inclusive language and terminology
|
|
116
|
+
|
|
117
|
+
Last updated: 2026-02-23
|
package/templates/base/README.md
CHANGED
|
@@ -35,3 +35,15 @@ To start both the frontend and backend development servers, simply run:
|
|
|
35
35
|
```bash
|
|
36
36
|
./lint.sh
|
|
37
37
|
```
|
|
38
|
+
|
|
39
|
+
## AI Development Friendly
|
|
40
|
+
|
|
41
|
+
This repository is optimized for development with AI agents:
|
|
42
|
+
- **`AGENTS.md`**: Provides behavioral guidelines and critical instructions to constrain and guide the AI.
|
|
43
|
+
- **`ACCESSIBILITY.md`**: Provides accessibility guidelines and constraints to guide the AI's implementations.
|
|
44
|
+
- **`.agents/skills/`**: Includes an extensive set of agent skills sourced from [claude-skills](https://github.com/alirezarezvani/claude-skills).
|
|
45
|
+
|
|
46
|
+
<details>
|
|
47
|
+
<summary>Included Agent Skills</summary>
|
|
48
|
+
<p>senior-frontend, senior-qa, senior-fullstack, accessibility-general</p>
|
|
49
|
+
</details>
|