fraim-framework 2.0.64 ā 2.0.65
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/bin/fraim-mcp.js +52 -19
- package/bin/fraim.js +23 -0
- package/dist/src/cli/commands/add-ide.js +53 -14
- package/dist/src/cli/commands/doctor.js +12 -24
- package/dist/src/cli/commands/init-project.js +0 -3
- package/dist/src/cli/commands/init.js +0 -2
- package/dist/src/cli/commands/mcp.js +65 -0
- package/dist/src/cli/commands/setup.js +17 -1
- package/dist/src/cli/commands/sync.js +173 -104
- package/dist/src/cli/setup/auto-mcp-setup.js +6 -4
- package/dist/src/cli/setup/mcp-config-generator.js +65 -41
- package/dist/src/fraim/issue-tracking/ado-provider.js +304 -0
- package/dist/src/fraim/issue-tracking/factory.js +63 -0
- package/dist/src/fraim/issue-tracking/github-provider.js +200 -0
- package/dist/src/fraim/issue-tracking/types.js +7 -0
- package/dist/src/fraim/issue-tracking-config.js +83 -0
- package/dist/src/local-mcp-server/stdio-server.js +23 -3
- package/dist/src/utils/remote-sync.js +130 -0
- package/package.json +2 -3
- package/dist/src/utils/enforcement-utils.js +0 -239
- package/dist/src/utils/validate-workflows.js +0 -101
- package/registry/scripts/cleanup-branch.ts +0 -341
- package/registry/scripts/code-quality-check.sh +0 -566
- package/registry/scripts/comprehensive-explorer.py +0 -297
- package/registry/scripts/create-git-labels.sh +0 -49
- package/registry/scripts/create-website-structure.js +0 -562
- package/registry/scripts/detect-tautological-tests.sh +0 -38
- package/registry/scripts/evaluate-code-quality.ts +0 -36
- package/registry/scripts/exec-with-timeout.ts +0 -122
- package/registry/scripts/generate-engagement-emails.ts +0 -830
- package/registry/scripts/interactive-explorer.py +0 -270
- package/registry/scripts/markdown-to-pdf.js +0 -395
- package/registry/scripts/newsletter-helpers.ts +0 -777
- package/registry/scripts/pdf-styles.css +0 -172
- package/registry/scripts/prep-issue.sh +0 -548
- package/registry/scripts/productivity/build-productivity-csv.mjs +0 -242
- package/registry/scripts/productivity/fetch-pr-details.mjs +0 -144
- package/registry/scripts/productivity/productivity-report.sh +0 -147
- package/registry/scripts/profile-server.ts +0 -426
- package/registry/scripts/run-thank-you-workflow.ts +0 -122
- package/registry/scripts/scrape-site.py +0 -302
- package/registry/scripts/send-newsletter-simple.ts +0 -102
- package/registry/scripts/send-thank-you-emails.ts +0 -57
- package/registry/scripts/validate-openapi-limits.ts +0 -366
- package/registry/scripts/validate-test-coverage.ts +0 -280
- package/registry/scripts/verify-pr-comments.sh +0 -74
- package/registry/scripts/verify-test-coverage.ts +0 -36
- package/registry/stubs/workflows/azure/cost-optimization.md +0 -11
- package/registry/stubs/workflows/bootstrap/create-architecture.md +0 -11
- package/registry/stubs/workflows/bootstrap/detect-broken-windows.md +0 -11
- package/registry/stubs/workflows/bootstrap/evaluate-code-quality.md +0 -11
- package/registry/stubs/workflows/bootstrap/verify-test-coverage.md +0 -11
- package/registry/stubs/workflows/brainstorming/blue-sky-brainstorming.md +0 -11
- package/registry/stubs/workflows/brainstorming/codebase-brainstorming.md +0 -11
- package/registry/stubs/workflows/business-development/create-business-plan.md +0 -11
- package/registry/stubs/workflows/business-development/ideate-business-opportunity.md +0 -11
- package/registry/stubs/workflows/business-development/price-product.md +0 -18
- package/registry/stubs/workflows/compliance/detect-compliance-requirements.md +0 -11
- package/registry/stubs/workflows/compliance/generate-audit-evidence.md +0 -11
- package/registry/stubs/workflows/compliance/soc2-evidence-generator.md +0 -11
- package/registry/stubs/workflows/customer-development/insight-analysis.md +0 -11
- package/registry/stubs/workflows/customer-development/insight-triage.md +0 -11
- package/registry/stubs/workflows/customer-development/interview-preparation.md +0 -11
- package/registry/stubs/workflows/customer-development/linkedin-outreach.md +0 -11
- package/registry/stubs/workflows/customer-development/strategic-brainstorming.md +0 -11
- package/registry/stubs/workflows/customer-development/thank-customers.md +0 -11
- package/registry/stubs/workflows/customer-development/user-survey-dispatch.md +0 -11
- package/registry/stubs/workflows/customer-development/users-to-target.md +0 -11
- package/registry/stubs/workflows/customer-development/weekly-newsletter.md +0 -11
- package/registry/stubs/workflows/deploy/cloud-deployment.md +0 -11
- package/registry/stubs/workflows/improve-fraim/contribute.md +0 -11
- package/registry/stubs/workflows/improve-fraim/file-issue.md +0 -11
- package/registry/stubs/workflows/learning/build-skillset.md +0 -11
- package/registry/stubs/workflows/learning/synthesize-learnings.md +0 -11
- package/registry/stubs/workflows/legal/contract-review-analysis.md +0 -11
- package/registry/stubs/workflows/legal/nda.md +0 -11
- package/registry/stubs/workflows/legal/patent-filing.md +0 -11
- package/registry/stubs/workflows/legal/saas-contract-development.md +0 -11
- package/registry/stubs/workflows/legal/trademark-filing.md +0 -11
- package/registry/stubs/workflows/marketing/content-creation.md +0 -11
- package/registry/stubs/workflows/marketing/convert-to-pdf.md +0 -11
- package/registry/stubs/workflows/marketing/create-modern-website.md +0 -11
- package/registry/stubs/workflows/marketing/domain-registration.md +0 -11
- package/registry/stubs/workflows/marketing/hbr-article.md +0 -11
- package/registry/stubs/workflows/marketing/launch-checklist.md +0 -11
- package/registry/stubs/workflows/marketing/marketing-strategy.md +0 -11
- package/registry/stubs/workflows/marketing/storytelling.md +0 -11
- package/registry/stubs/workflows/performance/analyze-performance.md +0 -11
- package/registry/stubs/workflows/product-building/design.md +0 -11
- package/registry/stubs/workflows/product-building/implement.md +0 -11
- package/registry/stubs/workflows/product-building/iterate-on-pr-comments.md +0 -11
- package/registry/stubs/workflows/product-building/prep-issue.md +0 -11
- package/registry/stubs/workflows/product-building/prototype.md +0 -11
- package/registry/stubs/workflows/product-building/resolve.md +0 -11
- package/registry/stubs/workflows/product-building/retrospect.md +0 -11
- package/registry/stubs/workflows/product-building/spec.md +0 -11
- package/registry/stubs/workflows/product-building/test.md +0 -11
- package/registry/stubs/workflows/productivity-report/productivity-report.md +0 -11
- package/registry/stubs/workflows/quality-assurance/browser-validation.md +0 -11
- package/registry/stubs/workflows/quality-assurance/iterative-improvement-cycle.md +0 -11
- package/registry/stubs/workflows/replicate/replicate-discovery.md +0 -11
- package/registry/stubs/workflows/replicate/replicate-to-issues.md +0 -11
- package/registry/stubs/workflows/reviewer/review-implementation-vs-design-spec.md +0 -11
- package/registry/stubs/workflows/reviewer/review-implementation-vs-feature-spec.md +0 -11
- package/registry/stubs/workflows/startup-credits/aws-activate-application.md +0 -11
- package/registry/stubs/workflows/startup-credits/google-cloud-application.md +0 -11
- package/registry/stubs/workflows/startup-credits/microsoft-azure-application.md +0 -11
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Comprehensive site exploration - deep dive into all pages and functionality
|
|
4
|
-
|
|
5
|
-
Usage:
|
|
6
|
-
python comprehensive_explorer.py <base_url> [--output-dir DIR] [--headless]
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import asyncio
|
|
10
|
-
from playwright.async_api import async_playwright
|
|
11
|
-
import json
|
|
12
|
-
import os
|
|
13
|
-
import sys
|
|
14
|
-
import argparse
|
|
15
|
-
from datetime import datetime
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
|
|
18
|
-
class ComprehensiveExplorer:
|
|
19
|
-
def __init__(self, base_url, output_dir="."):
|
|
20
|
-
self.base_url = base_url
|
|
21
|
-
self.output_dir = Path(output_dir)
|
|
22
|
-
self.screenshots_dir = self.output_dir / "screenshots"
|
|
23
|
-
self.screenshots_dir.mkdir(parents=True, exist_ok=True)
|
|
24
|
-
|
|
25
|
-
self.use_cases = []
|
|
26
|
-
self.pages_data = []
|
|
27
|
-
self.all_text_content = []
|
|
28
|
-
|
|
29
|
-
async def take_screenshot(self, page, name, description=""):
|
|
30
|
-
"""Take a screenshot"""
|
|
31
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
32
|
-
filename = self.screenshots_dir / f"{name}_{timestamp}.png"
|
|
33
|
-
await page.screenshot(path=str(filename), full_page=True)
|
|
34
|
-
return str(filename)
|
|
35
|
-
|
|
36
|
-
async def extract_page_content(self, page, page_name):
|
|
37
|
-
"""Extract comprehensive content from a page"""
|
|
38
|
-
content = await page.evaluate('''() => {
|
|
39
|
-
const getText = (el) => el ? el.innerText.trim() : '';
|
|
40
|
-
|
|
41
|
-
return {
|
|
42
|
-
url: window.location.href,
|
|
43
|
-
title: document.title,
|
|
44
|
-
headings: {
|
|
45
|
-
h1: Array.from(document.querySelectorAll('h1')).map(h => h.innerText.trim()).filter(t => t),
|
|
46
|
-
h2: Array.from(document.querySelectorAll('h2')).map(h => h.innerText.trim()).filter(t => t),
|
|
47
|
-
h3: Array.from(document.querySelectorAll('h3')).map(h => h.innerText.trim()).filter(t => t),
|
|
48
|
-
},
|
|
49
|
-
buttons: Array.from(document.querySelectorAll('button, [role="button"]'))
|
|
50
|
-
.filter(el => el.offsetParent !== null)
|
|
51
|
-
.map(el => el.innerText.trim())
|
|
52
|
-
.filter(t => t.length > 0)
|
|
53
|
-
.slice(0, 20),
|
|
54
|
-
links: Array.from(document.querySelectorAll('a[href]'))
|
|
55
|
-
.filter(el => el.offsetParent !== null)
|
|
56
|
-
.map(a => ({
|
|
57
|
-
text: a.innerText.trim(),
|
|
58
|
-
href: a.href
|
|
59
|
-
}))
|
|
60
|
-
.filter(link => link.text.length > 0 || link.href)
|
|
61
|
-
.slice(0, 30),
|
|
62
|
-
forms: Array.from(document.querySelectorAll('form')).map((form, idx) => ({
|
|
63
|
-
index: idx,
|
|
64
|
-
action: form.action || '',
|
|
65
|
-
method: form.method || 'GET',
|
|
66
|
-
inputs: Array.from(form.querySelectorAll('input, textarea, select')).map(input => ({
|
|
67
|
-
type: input.type || input.tagName.toLowerCase(),
|
|
68
|
-
name: input.name || '',
|
|
69
|
-
placeholder: input.placeholder || '',
|
|
70
|
-
id: input.id || '',
|
|
71
|
-
label: (() => {
|
|
72
|
-
const label = document.querySelector(`label[for="${input.id}"]`);
|
|
73
|
-
return label ? label.innerText.trim() : '';
|
|
74
|
-
})()
|
|
75
|
-
}))
|
|
76
|
-
})),
|
|
77
|
-
sections: Array.from(document.querySelectorAll('section, [class*="section"], [class*="Section"]'))
|
|
78
|
-
.map(section => section.innerText.trim().substring(0, 200))
|
|
79
|
-
.filter(t => t.length > 0)
|
|
80
|
-
.slice(0, 10),
|
|
81
|
-
main_text: document.body.innerText.substring(0, 5000),
|
|
82
|
-
images: Array.from(document.querySelectorAll('img[src]'))
|
|
83
|
-
.map(img => img.src || img.getAttribute('src'))
|
|
84
|
-
.filter(src => src)
|
|
85
|
-
.slice(0, 10)
|
|
86
|
-
};
|
|
87
|
-
}''')
|
|
88
|
-
|
|
89
|
-
return content
|
|
90
|
-
|
|
91
|
-
async def explore_route(self, page, route, page_name):
|
|
92
|
-
"""Explore a specific route"""
|
|
93
|
-
try:
|
|
94
|
-
url = f"{self.base_url}{route}" if route.startswith('/') else f"{self.base_url}/{route}"
|
|
95
|
-
print(f" š Exploring: {url}")
|
|
96
|
-
|
|
97
|
-
await page.goto(url, wait_until='networkidle', timeout=30000)
|
|
98
|
-
await page.wait_for_timeout(3000)
|
|
99
|
-
|
|
100
|
-
content = await self.extract_page_content(page, page_name)
|
|
101
|
-
self.all_text_content.append(content['main_text'])
|
|
102
|
-
|
|
103
|
-
screenshot = await self.take_screenshot(page, page_name, f"Page: {page_name}")
|
|
104
|
-
|
|
105
|
-
page_data = {
|
|
106
|
-
'name': page_name,
|
|
107
|
-
'url': content['url'],
|
|
108
|
-
'title': content['title'],
|
|
109
|
-
'headings': content['headings'],
|
|
110
|
-
'buttons': content['buttons'],
|
|
111
|
-
'links': content['links'],
|
|
112
|
-
'forms': content['forms'],
|
|
113
|
-
'sections': content['sections'],
|
|
114
|
-
'screenshot': screenshot,
|
|
115
|
-
'main_text': content['main_text'][:1000]
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
self.pages_data.append(page_data)
|
|
119
|
-
print(f" ā
Found {len(content['headings']['h1'])} H1, {len(content['buttons'])} buttons, {len(content['forms'])} forms")
|
|
120
|
-
|
|
121
|
-
return page_data
|
|
122
|
-
|
|
123
|
-
except Exception as e:
|
|
124
|
-
print(f" ā ļø Error exploring {route}: {e}")
|
|
125
|
-
return None
|
|
126
|
-
|
|
127
|
-
async def discover_routes_from_homepage(self, page):
|
|
128
|
-
"""Discover routes by analyzing the homepage"""
|
|
129
|
-
await page.goto(self.base_url, wait_until='networkidle', timeout=30000)
|
|
130
|
-
await page.wait_for_timeout(3000)
|
|
131
|
-
|
|
132
|
-
links = await page.evaluate(f'''() => {{
|
|
133
|
-
const baseUrl = "{self.base_url}";
|
|
134
|
-
return Array.from(document.querySelectorAll('a[href]'))
|
|
135
|
-
.map(a => a.href)
|
|
136
|
-
.filter(href => href && href.includes(baseUrl))
|
|
137
|
-
.map(href => {{
|
|
138
|
-
const url = new URL(href);
|
|
139
|
-
return url.pathname;
|
|
140
|
-
}})
|
|
141
|
-
.filter(path => path && path !== '/')
|
|
142
|
-
.filter((v, i, a) => a.indexOf(v) === i);
|
|
143
|
-
}}''')
|
|
144
|
-
|
|
145
|
-
print(f"\nš Discovered {len(links)} unique routes from homepage")
|
|
146
|
-
return links
|
|
147
|
-
|
|
148
|
-
async def explore_all_routes(self, page):
|
|
149
|
-
"""Explore common routes and discovered routes"""
|
|
150
|
-
common_routes = [
|
|
151
|
-
'/', '/home', '/events', '/event', '/signup', '/sign-up',
|
|
152
|
-
'/login', '/signin', '/sign-in', '/dashboard', '/profile',
|
|
153
|
-
'/about', '/contact', '/help', '/faq', '/map',
|
|
154
|
-
'/assessments', '/assessment', '/field', '/species',
|
|
155
|
-
'/organizations', '/organization', '/volunteer', '/volunteers',
|
|
156
|
-
'/community', '/hub'
|
|
157
|
-
]
|
|
158
|
-
|
|
159
|
-
print("\nš Exploring common routes...")
|
|
160
|
-
for route in common_routes:
|
|
161
|
-
page_name = route.replace('/', '').replace('-', '_') or 'home'
|
|
162
|
-
await self.explore_route(page, route, page_name)
|
|
163
|
-
await asyncio.sleep(1)
|
|
164
|
-
|
|
165
|
-
async def identify_use_cases_comprehensive(self):
|
|
166
|
-
"""Comprehensively identify use cases from all collected content"""
|
|
167
|
-
print("\nšÆ Analyzing use cases from collected content...")
|
|
168
|
-
|
|
169
|
-
all_text = ' '.join(self.all_text_content).lower()
|
|
170
|
-
|
|
171
|
-
use_case_patterns = {
|
|
172
|
-
'Event Discovery & Registration': {
|
|
173
|
-
'keywords': ['event', 'calendar', 'schedule', 'upcoming', 'register', 'rsvp', 'workshop', 'meeting', 'volunteer event'],
|
|
174
|
-
'evidence': []
|
|
175
|
-
},
|
|
176
|
-
'Field Assessment & Data Collection': {
|
|
177
|
-
'keywords': ['assessment', 'field', 'survey', 'evaluation', 'inspection', 'data collection', 'record', 'observation'],
|
|
178
|
-
'evidence': []
|
|
179
|
-
},
|
|
180
|
-
'Invasive Species Management': {
|
|
181
|
-
'keywords': ['invasive', 'species', 'native', 'wildlife', 'plant', 'management', 'control', 'removal'],
|
|
182
|
-
'evidence': []
|
|
183
|
-
},
|
|
184
|
-
'Organization & Community Management': {
|
|
185
|
-
'keywords': ['organization', 'community', 'hub', 'group', 'network', 'connect', 'collaborate'],
|
|
186
|
-
'evidence': []
|
|
187
|
-
},
|
|
188
|
-
'User Account & Authentication': {
|
|
189
|
-
'keywords': ['sign up', 'sign in', 'login', 'register', 'account', 'profile', 'user'],
|
|
190
|
-
'evidence': []
|
|
191
|
-
},
|
|
192
|
-
'Search & Filter': {
|
|
193
|
-
'keywords': ['search', 'find', 'filter', 'browse', 'discover', 'explore'],
|
|
194
|
-
'evidence': []
|
|
195
|
-
},
|
|
196
|
-
'Reporting & Data Export': {
|
|
197
|
-
'keywords': ['report', 'download', 'export', 'generate', 'print', 'data'],
|
|
198
|
-
'evidence': []
|
|
199
|
-
},
|
|
200
|
-
'Map & Location Services': {
|
|
201
|
-
'keywords': ['map', 'location', 'coordinates', 'gps', 'area', 'region', 'geographic'],
|
|
202
|
-
'evidence': []
|
|
203
|
-
},
|
|
204
|
-
'Educational Resources': {
|
|
205
|
-
'keywords': ['learn', 'guide', 'tutorial', 'help', 'documentation', 'faq', 'frequently asked'],
|
|
206
|
-
'evidence': []
|
|
207
|
-
},
|
|
208
|
-
'Volunteer Management': {
|
|
209
|
-
'keywords': ['volunteer', 'volunteers', 'participation', 'contribute', 'join'],
|
|
210
|
-
'evidence': []
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
for use_case, data in use_case_patterns.items():
|
|
215
|
-
for keyword in data['keywords']:
|
|
216
|
-
if keyword in all_text:
|
|
217
|
-
data['evidence'].append(keyword)
|
|
218
|
-
|
|
219
|
-
identified_use_cases = []
|
|
220
|
-
for use_case, data in use_case_patterns.items():
|
|
221
|
-
if len(data['evidence']) >= 2:
|
|
222
|
-
confidence = 'high' if len(data['evidence']) >= 4 else 'medium' if len(data['evidence']) >= 3 else 'low'
|
|
223
|
-
identified_use_cases.append({
|
|
224
|
-
'use_case': use_case,
|
|
225
|
-
'confidence': confidence,
|
|
226
|
-
'evidence_count': len(data['evidence']),
|
|
227
|
-
'keywords_found': data['evidence'][:10]
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
identified_use_cases.sort(key=lambda x: x['evidence_count'], reverse=True)
|
|
231
|
-
self.use_cases = identified_use_cases
|
|
232
|
-
return identified_use_cases
|
|
233
|
-
|
|
234
|
-
async def run_comprehensive_analysis(self, headless=True):
|
|
235
|
-
"""Run the complete comprehensive analysis"""
|
|
236
|
-
async with async_playwright() as p:
|
|
237
|
-
print("š Starting comprehensive browser analysis...")
|
|
238
|
-
browser = await p.chromium.launch(headless=headless)
|
|
239
|
-
context = await browser.new_context(
|
|
240
|
-
viewport={'width': 1920, 'height': 1080},
|
|
241
|
-
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
|
242
|
-
)
|
|
243
|
-
page = await context.new_page()
|
|
244
|
-
|
|
245
|
-
try:
|
|
246
|
-
discovered_routes = await self.discover_routes_from_homepage(page)
|
|
247
|
-
await self.explore_route(page, '/', 'homepage')
|
|
248
|
-
|
|
249
|
-
print(f"\nš Exploring {len(discovered_routes)} discovered routes...")
|
|
250
|
-
for route in discovered_routes[:15]:
|
|
251
|
-
page_name = route.replace('/', '').replace('-', '_') or 'home'
|
|
252
|
-
await self.explore_route(page, route, page_name)
|
|
253
|
-
await asyncio.sleep(1)
|
|
254
|
-
|
|
255
|
-
await self.explore_all_routes(page)
|
|
256
|
-
use_cases = await self.identify_use_cases_comprehensive()
|
|
257
|
-
|
|
258
|
-
report = {
|
|
259
|
-
'base_url': self.base_url,
|
|
260
|
-
'analysis_date': datetime.now().isoformat(),
|
|
261
|
-
'pages_analyzed': len(self.pages_data),
|
|
262
|
-
'pages': self.pages_data,
|
|
263
|
-
'use_cases': use_cases,
|
|
264
|
-
'discovered_routes': discovered_routes,
|
|
265
|
-
'total_screenshots': len(self.pages_data)
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
output_path = self.output_dir / 'comprehensive_analysis.json'
|
|
269
|
-
with open(output_path, 'w', encoding='utf-8') as f:
|
|
270
|
-
json.dump(report, f, indent=2, ensure_ascii=False)
|
|
271
|
-
|
|
272
|
-
print(f"\nā
Comprehensive analysis complete!")
|
|
273
|
-
print(f" š Pages analyzed: {len(self.pages_data)}")
|
|
274
|
-
print(f" šø Screenshots: {len(self.pages_data)}")
|
|
275
|
-
print(f" šÆ Use cases identified: {len(use_cases)}")
|
|
276
|
-
print(f" š¾ Report saved: {output_path}")
|
|
277
|
-
|
|
278
|
-
print(f"\nš Identified Use Cases:")
|
|
279
|
-
for uc in use_cases:
|
|
280
|
-
print(f" ⢠{uc['use_case']} ({uc['confidence']} confidence, {uc['evidence_count']} evidence)")
|
|
281
|
-
|
|
282
|
-
finally:
|
|
283
|
-
await browser.close()
|
|
284
|
-
|
|
285
|
-
async def main():
|
|
286
|
-
parser = argparse.ArgumentParser(description='Comprehensively explore a website')
|
|
287
|
-
parser.add_argument('url', help='Base URL of the website to explore')
|
|
288
|
-
parser.add_argument('--output-dir', default='.', help='Output directory for results (default: current directory)')
|
|
289
|
-
parser.add_argument('--headless', action='store_true', help='Run browser in headless mode')
|
|
290
|
-
|
|
291
|
-
args = parser.parse_args()
|
|
292
|
-
|
|
293
|
-
explorer = ComprehensiveExplorer(args.url, args.output_dir)
|
|
294
|
-
await explorer.run_comprehensive_analysis(headless=args.headless)
|
|
295
|
-
|
|
296
|
-
if __name__ == "__main__":
|
|
297
|
-
asyncio.run(main())
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Create GitHub labels from JSON file
|
|
4
|
-
# Usage: ./create-git-labels.sh labels.json
|
|
5
|
-
|
|
6
|
-
if [ $# -eq 0 ]; then
|
|
7
|
-
echo "Usage: $0 <labels.json>"
|
|
8
|
-
exit 1
|
|
9
|
-
fi
|
|
10
|
-
|
|
11
|
-
LABELS_FILE="$1"
|
|
12
|
-
|
|
13
|
-
if [ ! -f "$LABELS_FILE" ]; then
|
|
14
|
-
echo "Error: $LABELS_FILE not found"
|
|
15
|
-
exit 1
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
echo "š·ļø Creating GitHub labels from $LABELS_FILE..."
|
|
19
|
-
|
|
20
|
-
# Check if gh CLI is available
|
|
21
|
-
if ! command -v gh &> /dev/null; then
|
|
22
|
-
echo "ā GitHub CLI (gh) not found. Please install it first:"
|
|
23
|
-
echo " https://cli.github.com/"
|
|
24
|
-
echo " Then run: gh auth login"
|
|
25
|
-
exit 1
|
|
26
|
-
fi
|
|
27
|
-
|
|
28
|
-
# Check if user is authenticated
|
|
29
|
-
if ! gh auth status &> /dev/null; then
|
|
30
|
-
echo "ā Not authenticated with GitHub. Please run:"
|
|
31
|
-
echo " gh auth login"
|
|
32
|
-
exit 1
|
|
33
|
-
fi
|
|
34
|
-
|
|
35
|
-
# Parse JSON and create labels
|
|
36
|
-
node -e "
|
|
37
|
-
const fs = require('fs');
|
|
38
|
-
const labels = JSON.parse(fs.readFileSync('$LABELS_FILE', 'utf8'));
|
|
39
|
-
|
|
40
|
-
labels.forEach(label => {
|
|
41
|
-
const command = \`gh label create \\\"\${label.name}\\\" --color \\\"\${label.color}\\\" --description \\\"\${label.description}\\\"\`;
|
|
42
|
-
console.log(command);
|
|
43
|
-
});
|
|
44
|
-
" | while read -r command; do
|
|
45
|
-
echo " Executing: $command"
|
|
46
|
-
eval "$command" || echo " ā ļø Label might already exist"
|
|
47
|
-
done
|
|
48
|
-
|
|
49
|
-
echo "ā
GitHub labels creation complete!"
|