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.
Files changed (107) hide show
  1. package/bin/fraim-mcp.js +52 -19
  2. package/bin/fraim.js +23 -0
  3. package/dist/src/cli/commands/add-ide.js +53 -14
  4. package/dist/src/cli/commands/doctor.js +12 -24
  5. package/dist/src/cli/commands/init-project.js +0 -3
  6. package/dist/src/cli/commands/init.js +0 -2
  7. package/dist/src/cli/commands/mcp.js +65 -0
  8. package/dist/src/cli/commands/setup.js +17 -1
  9. package/dist/src/cli/commands/sync.js +173 -104
  10. package/dist/src/cli/setup/auto-mcp-setup.js +6 -4
  11. package/dist/src/cli/setup/mcp-config-generator.js +65 -41
  12. package/dist/src/fraim/issue-tracking/ado-provider.js +304 -0
  13. package/dist/src/fraim/issue-tracking/factory.js +63 -0
  14. package/dist/src/fraim/issue-tracking/github-provider.js +200 -0
  15. package/dist/src/fraim/issue-tracking/types.js +7 -0
  16. package/dist/src/fraim/issue-tracking-config.js +83 -0
  17. package/dist/src/local-mcp-server/stdio-server.js +23 -3
  18. package/dist/src/utils/remote-sync.js +130 -0
  19. package/package.json +2 -3
  20. package/dist/src/utils/enforcement-utils.js +0 -239
  21. package/dist/src/utils/validate-workflows.js +0 -101
  22. package/registry/scripts/cleanup-branch.ts +0 -341
  23. package/registry/scripts/code-quality-check.sh +0 -566
  24. package/registry/scripts/comprehensive-explorer.py +0 -297
  25. package/registry/scripts/create-git-labels.sh +0 -49
  26. package/registry/scripts/create-website-structure.js +0 -562
  27. package/registry/scripts/detect-tautological-tests.sh +0 -38
  28. package/registry/scripts/evaluate-code-quality.ts +0 -36
  29. package/registry/scripts/exec-with-timeout.ts +0 -122
  30. package/registry/scripts/generate-engagement-emails.ts +0 -830
  31. package/registry/scripts/interactive-explorer.py +0 -270
  32. package/registry/scripts/markdown-to-pdf.js +0 -395
  33. package/registry/scripts/newsletter-helpers.ts +0 -777
  34. package/registry/scripts/pdf-styles.css +0 -172
  35. package/registry/scripts/prep-issue.sh +0 -548
  36. package/registry/scripts/productivity/build-productivity-csv.mjs +0 -242
  37. package/registry/scripts/productivity/fetch-pr-details.mjs +0 -144
  38. package/registry/scripts/productivity/productivity-report.sh +0 -147
  39. package/registry/scripts/profile-server.ts +0 -426
  40. package/registry/scripts/run-thank-you-workflow.ts +0 -122
  41. package/registry/scripts/scrape-site.py +0 -302
  42. package/registry/scripts/send-newsletter-simple.ts +0 -102
  43. package/registry/scripts/send-thank-you-emails.ts +0 -57
  44. package/registry/scripts/validate-openapi-limits.ts +0 -366
  45. package/registry/scripts/validate-test-coverage.ts +0 -280
  46. package/registry/scripts/verify-pr-comments.sh +0 -74
  47. package/registry/scripts/verify-test-coverage.ts +0 -36
  48. package/registry/stubs/workflows/azure/cost-optimization.md +0 -11
  49. package/registry/stubs/workflows/bootstrap/create-architecture.md +0 -11
  50. package/registry/stubs/workflows/bootstrap/detect-broken-windows.md +0 -11
  51. package/registry/stubs/workflows/bootstrap/evaluate-code-quality.md +0 -11
  52. package/registry/stubs/workflows/bootstrap/verify-test-coverage.md +0 -11
  53. package/registry/stubs/workflows/brainstorming/blue-sky-brainstorming.md +0 -11
  54. package/registry/stubs/workflows/brainstorming/codebase-brainstorming.md +0 -11
  55. package/registry/stubs/workflows/business-development/create-business-plan.md +0 -11
  56. package/registry/stubs/workflows/business-development/ideate-business-opportunity.md +0 -11
  57. package/registry/stubs/workflows/business-development/price-product.md +0 -18
  58. package/registry/stubs/workflows/compliance/detect-compliance-requirements.md +0 -11
  59. package/registry/stubs/workflows/compliance/generate-audit-evidence.md +0 -11
  60. package/registry/stubs/workflows/compliance/soc2-evidence-generator.md +0 -11
  61. package/registry/stubs/workflows/customer-development/insight-analysis.md +0 -11
  62. package/registry/stubs/workflows/customer-development/insight-triage.md +0 -11
  63. package/registry/stubs/workflows/customer-development/interview-preparation.md +0 -11
  64. package/registry/stubs/workflows/customer-development/linkedin-outreach.md +0 -11
  65. package/registry/stubs/workflows/customer-development/strategic-brainstorming.md +0 -11
  66. package/registry/stubs/workflows/customer-development/thank-customers.md +0 -11
  67. package/registry/stubs/workflows/customer-development/user-survey-dispatch.md +0 -11
  68. package/registry/stubs/workflows/customer-development/users-to-target.md +0 -11
  69. package/registry/stubs/workflows/customer-development/weekly-newsletter.md +0 -11
  70. package/registry/stubs/workflows/deploy/cloud-deployment.md +0 -11
  71. package/registry/stubs/workflows/improve-fraim/contribute.md +0 -11
  72. package/registry/stubs/workflows/improve-fraim/file-issue.md +0 -11
  73. package/registry/stubs/workflows/learning/build-skillset.md +0 -11
  74. package/registry/stubs/workflows/learning/synthesize-learnings.md +0 -11
  75. package/registry/stubs/workflows/legal/contract-review-analysis.md +0 -11
  76. package/registry/stubs/workflows/legal/nda.md +0 -11
  77. package/registry/stubs/workflows/legal/patent-filing.md +0 -11
  78. package/registry/stubs/workflows/legal/saas-contract-development.md +0 -11
  79. package/registry/stubs/workflows/legal/trademark-filing.md +0 -11
  80. package/registry/stubs/workflows/marketing/content-creation.md +0 -11
  81. package/registry/stubs/workflows/marketing/convert-to-pdf.md +0 -11
  82. package/registry/stubs/workflows/marketing/create-modern-website.md +0 -11
  83. package/registry/stubs/workflows/marketing/domain-registration.md +0 -11
  84. package/registry/stubs/workflows/marketing/hbr-article.md +0 -11
  85. package/registry/stubs/workflows/marketing/launch-checklist.md +0 -11
  86. package/registry/stubs/workflows/marketing/marketing-strategy.md +0 -11
  87. package/registry/stubs/workflows/marketing/storytelling.md +0 -11
  88. package/registry/stubs/workflows/performance/analyze-performance.md +0 -11
  89. package/registry/stubs/workflows/product-building/design.md +0 -11
  90. package/registry/stubs/workflows/product-building/implement.md +0 -11
  91. package/registry/stubs/workflows/product-building/iterate-on-pr-comments.md +0 -11
  92. package/registry/stubs/workflows/product-building/prep-issue.md +0 -11
  93. package/registry/stubs/workflows/product-building/prototype.md +0 -11
  94. package/registry/stubs/workflows/product-building/resolve.md +0 -11
  95. package/registry/stubs/workflows/product-building/retrospect.md +0 -11
  96. package/registry/stubs/workflows/product-building/spec.md +0 -11
  97. package/registry/stubs/workflows/product-building/test.md +0 -11
  98. package/registry/stubs/workflows/productivity-report/productivity-report.md +0 -11
  99. package/registry/stubs/workflows/quality-assurance/browser-validation.md +0 -11
  100. package/registry/stubs/workflows/quality-assurance/iterative-improvement-cycle.md +0 -11
  101. package/registry/stubs/workflows/replicate/replicate-discovery.md +0 -11
  102. package/registry/stubs/workflows/replicate/replicate-to-issues.md +0 -11
  103. package/registry/stubs/workflows/reviewer/review-implementation-vs-design-spec.md +0 -11
  104. package/registry/stubs/workflows/reviewer/review-implementation-vs-feature-spec.md +0 -11
  105. package/registry/stubs/workflows/startup-credits/aws-activate-application.md +0 -11
  106. package/registry/stubs/workflows/startup-credits/google-cloud-application.md +0 -11
  107. 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!"