fraim-framework 2.0.63 ā 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 +91 -15
- package/dist/src/utils/remote-sync.js +130 -0
- package/package.json +3 -4
- 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/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,562 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Website Structure Creator
|
|
5
|
-
*
|
|
6
|
-
* This script creates the basic file structure for a modern website project
|
|
7
|
-
* following the FRAIM website creation workflow.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
|
|
13
|
-
// Read configuration from .fraim/config.json if available
|
|
14
|
-
function loadConfig() {
|
|
15
|
-
const configPath = path.join(process.cwd(), '.fraim', 'config.json');
|
|
16
|
-
if (fs.existsSync(configPath)) {
|
|
17
|
-
try {
|
|
18
|
-
return JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
19
|
-
} catch (error) {
|
|
20
|
-
console.warn('Warning: Could not parse .fraim/config.json, using defaults');
|
|
21
|
-
return {};
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return {};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function createWebsiteStructure(projectName, outputDir = process.cwd()) {
|
|
28
|
-
const websiteDir = path.join(outputDir, projectName);
|
|
29
|
-
|
|
30
|
-
// Create main directory
|
|
31
|
-
if (!fs.existsSync(websiteDir)) {
|
|
32
|
-
fs.mkdirSync(websiteDir, { recursive: true });
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Create subdirectories
|
|
36
|
-
const dirs = [
|
|
37
|
-
'assets',
|
|
38
|
-
'assets/images',
|
|
39
|
-
'assets/icons',
|
|
40
|
-
'css',
|
|
41
|
-
'js',
|
|
42
|
-
'docs'
|
|
43
|
-
];
|
|
44
|
-
|
|
45
|
-
dirs.forEach(dir => {
|
|
46
|
-
const dirPath = path.join(websiteDir, dir);
|
|
47
|
-
if (!fs.existsSync(dirPath)) {
|
|
48
|
-
fs.mkdirSync(dirPath, { recursive: true });
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
// Create basic HTML structure
|
|
53
|
-
const indexHtml = `<!DOCTYPE html>
|
|
54
|
-
<html lang="en">
|
|
55
|
-
<head>
|
|
56
|
-
<meta charset="UTF-8">
|
|
57
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
58
|
-
<title>${projectName} - Modern Web Experience</title>
|
|
59
|
-
<meta name="description" content="Modern, responsive website for ${projectName}">
|
|
60
|
-
<link rel="stylesheet" href="css/styles.css">
|
|
61
|
-
</head>
|
|
62
|
-
<body>
|
|
63
|
-
<!-- Navigation -->
|
|
64
|
-
<nav class="nav">
|
|
65
|
-
<div class="nav-container">
|
|
66
|
-
<div class="nav-logo">
|
|
67
|
-
<span class="logo-text">${projectName}</span>
|
|
68
|
-
</div>
|
|
69
|
-
<div class="nav-links">
|
|
70
|
-
<a href="#features">Features</a>
|
|
71
|
-
<a href="#about">About</a>
|
|
72
|
-
<a href="#contact">Contact</a>
|
|
73
|
-
<button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark mode">
|
|
74
|
-
<span class="theme-icon">š</span>
|
|
75
|
-
</button>
|
|
76
|
-
</div>
|
|
77
|
-
</div>
|
|
78
|
-
</nav>
|
|
79
|
-
|
|
80
|
-
<!-- Hero Section -->
|
|
81
|
-
<section class="hero">
|
|
82
|
-
<div class="hero-container">
|
|
83
|
-
<h1 class="hero-title">
|
|
84
|
-
Welcome to <span class="gradient-text">${projectName}</span>
|
|
85
|
-
</h1>
|
|
86
|
-
<p class="hero-subtitle">
|
|
87
|
-
Your modern web experience starts here. Built with performance, accessibility, and user experience in mind.
|
|
88
|
-
</p>
|
|
89
|
-
<div class="hero-cta">
|
|
90
|
-
<a href="#get-started" class="btn-primary">Get Started</a>
|
|
91
|
-
<a href="#learn-more" class="btn-secondary">Learn More</a>
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
94
|
-
</section>
|
|
95
|
-
|
|
96
|
-
<!-- Features Section -->
|
|
97
|
-
<section id="features" class="features">
|
|
98
|
-
<div class="container">
|
|
99
|
-
<h2 class="section-title">Key Features</h2>
|
|
100
|
-
<div class="features-grid">
|
|
101
|
-
<div class="feature-card">
|
|
102
|
-
<div class="feature-icon">ā”</div>
|
|
103
|
-
<h3>Fast Performance</h3>
|
|
104
|
-
<p>Optimized for speed and efficiency</p>
|
|
105
|
-
</div>
|
|
106
|
-
<div class="feature-card">
|
|
107
|
-
<div class="feature-icon">š±</div>
|
|
108
|
-
<h3>Mobile Responsive</h3>
|
|
109
|
-
<p>Perfect experience on all devices</p>
|
|
110
|
-
</div>
|
|
111
|
-
<div class="feature-card">
|
|
112
|
-
<div class="feature-icon">šØ</div>
|
|
113
|
-
<h3>Modern Design</h3>
|
|
114
|
-
<p>Beautiful, contemporary interface</p>
|
|
115
|
-
</div>
|
|
116
|
-
</div>
|
|
117
|
-
</div>
|
|
118
|
-
</section>
|
|
119
|
-
|
|
120
|
-
<script src="js/script.js"></script>
|
|
121
|
-
</body>
|
|
122
|
-
</html>`;
|
|
123
|
-
|
|
124
|
-
// Create basic CSS with CSS variables for theming
|
|
125
|
-
const stylesCSS = `/* CSS Variables for theming */
|
|
126
|
-
:root {
|
|
127
|
-
--bg-primary: #ffffff;
|
|
128
|
-
--bg-secondary: #f8fafc;
|
|
129
|
-
--text-primary: #1a1a1a;
|
|
130
|
-
--text-secondary: #666666;
|
|
131
|
-
--accent-color: #6366f1;
|
|
132
|
-
--border-color: #e5e5e5;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
[data-theme="dark"] {
|
|
136
|
-
--bg-primary: #0f172a;
|
|
137
|
-
--bg-secondary: #1e293b;
|
|
138
|
-
--text-primary: #f8fafc;
|
|
139
|
-
--text-secondary: #cbd5e1;
|
|
140
|
-
--border-color: #334155;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/* Reset and base styles */
|
|
144
|
-
* {
|
|
145
|
-
margin: 0;
|
|
146
|
-
padding: 0;
|
|
147
|
-
box-sizing: border-box;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
body {
|
|
151
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
152
|
-
line-height: 1.6;
|
|
153
|
-
color: var(--text-primary);
|
|
154
|
-
background: var(--bg-primary);
|
|
155
|
-
transition: background-color 0.3s ease, color 0.3s ease;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
.container {
|
|
159
|
-
max-width: 1200px;
|
|
160
|
-
margin: 0 auto;
|
|
161
|
-
padding: 0 24px;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/* Navigation */
|
|
165
|
-
.nav {
|
|
166
|
-
position: fixed;
|
|
167
|
-
top: 0;
|
|
168
|
-
width: 100%;
|
|
169
|
-
background: rgba(255, 255, 255, 0.95);
|
|
170
|
-
backdrop-filter: blur(10px);
|
|
171
|
-
border-bottom: 1px solid var(--border-color);
|
|
172
|
-
z-index: 1000;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
.nav-container {
|
|
176
|
-
max-width: 1200px;
|
|
177
|
-
margin: 0 auto;
|
|
178
|
-
padding: 0 24px;
|
|
179
|
-
display: flex;
|
|
180
|
-
justify-content: space-between;
|
|
181
|
-
align-items: center;
|
|
182
|
-
height: 64px;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
.nav-links {
|
|
186
|
-
display: flex;
|
|
187
|
-
align-items: center;
|
|
188
|
-
gap: 32px;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
.nav-links a {
|
|
192
|
-
text-decoration: none;
|
|
193
|
-
color: var(--text-secondary);
|
|
194
|
-
font-weight: 500;
|
|
195
|
-
transition: color 0.2s;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
.nav-links a:hover {
|
|
199
|
-
color: var(--text-primary);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
.theme-toggle {
|
|
203
|
-
background: none;
|
|
204
|
-
border: 2px solid var(--border-color);
|
|
205
|
-
border-radius: 8px;
|
|
206
|
-
padding: 8px 12px;
|
|
207
|
-
cursor: pointer;
|
|
208
|
-
transition: all 0.2s ease;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
.theme-toggle:hover {
|
|
212
|
-
border-color: var(--accent-color);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/* Hero Section */
|
|
216
|
-
.hero {
|
|
217
|
-
padding: 120px 0 80px;
|
|
218
|
-
background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-primary) 100%);
|
|
219
|
-
text-align: center;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
.hero-title {
|
|
223
|
-
font-size: 56px;
|
|
224
|
-
font-weight: 700;
|
|
225
|
-
margin-bottom: 24px;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
.gradient-text {
|
|
229
|
-
background: linear-gradient(135deg, var(--accent-color) 0%, #8b5cf6 100%);
|
|
230
|
-
-webkit-background-clip: text;
|
|
231
|
-
-webkit-text-fill-color: transparent;
|
|
232
|
-
background-clip: text;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
.hero-subtitle {
|
|
236
|
-
font-size: 20px;
|
|
237
|
-
color: var(--text-secondary);
|
|
238
|
-
margin-bottom: 32px;
|
|
239
|
-
max-width: 600px;
|
|
240
|
-
margin-left: auto;
|
|
241
|
-
margin-right: auto;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
.hero-cta {
|
|
245
|
-
display: flex;
|
|
246
|
-
gap: 16px;
|
|
247
|
-
justify-content: center;
|
|
248
|
-
flex-wrap: wrap;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
.btn-primary, .btn-secondary {
|
|
252
|
-
padding: 12px 24px;
|
|
253
|
-
border-radius: 8px;
|
|
254
|
-
text-decoration: none;
|
|
255
|
-
font-weight: 600;
|
|
256
|
-
transition: all 0.2s;
|
|
257
|
-
display: inline-block;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
.btn-primary {
|
|
261
|
-
background: var(--accent-color);
|
|
262
|
-
color: white;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
.btn-primary:hover {
|
|
266
|
-
transform: translateY(-1px);
|
|
267
|
-
box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
.btn-secondary {
|
|
271
|
-
background: transparent;
|
|
272
|
-
color: var(--accent-color);
|
|
273
|
-
border: 2px solid var(--accent-color);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
.btn-secondary:hover {
|
|
277
|
-
background: var(--accent-color);
|
|
278
|
-
color: white;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/* Features Section */
|
|
282
|
-
.features {
|
|
283
|
-
padding: 80px 0;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
.section-title {
|
|
287
|
-
font-size: 40px;
|
|
288
|
-
font-weight: 700;
|
|
289
|
-
text-align: center;
|
|
290
|
-
margin-bottom: 64px;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
.features-grid {
|
|
294
|
-
display: grid;
|
|
295
|
-
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
296
|
-
gap: 32px;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
.feature-card {
|
|
300
|
-
background: var(--bg-secondary);
|
|
301
|
-
padding: 32px;
|
|
302
|
-
border-radius: 16px;
|
|
303
|
-
text-align: center;
|
|
304
|
-
transition: transform 0.2s;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
.feature-card:hover {
|
|
308
|
-
transform: translateY(-4px);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
.feature-icon {
|
|
312
|
-
font-size: 48px;
|
|
313
|
-
margin-bottom: 16px;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
.feature-card h3 {
|
|
317
|
-
font-size: 24px;
|
|
318
|
-
margin-bottom: 12px;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
.feature-card p {
|
|
322
|
-
color: var(--text-secondary);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/* Responsive Design */
|
|
326
|
-
@media (max-width: 768px) {
|
|
327
|
-
.hero-title {
|
|
328
|
-
font-size: 40px;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
.nav-links {
|
|
332
|
-
gap: 16px;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
.hero-cta {
|
|
336
|
-
flex-direction: column;
|
|
337
|
-
align-items: center;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
.features-grid {
|
|
341
|
-
grid-template-columns: 1fr;
|
|
342
|
-
}
|
|
343
|
-
}`;
|
|
344
|
-
|
|
345
|
-
// Create basic JavaScript for theme toggle
|
|
346
|
-
const scriptJS = `// Theme toggle functionality
|
|
347
|
-
document.addEventListener('DOMContentLoaded', function() {
|
|
348
|
-
const themeToggle = document.getElementById('theme-toggle');
|
|
349
|
-
const themeIcon = themeToggle.querySelector('.theme-icon');
|
|
350
|
-
|
|
351
|
-
// Check for saved theme preference or default to system preference
|
|
352
|
-
const savedTheme = localStorage.getItem('theme');
|
|
353
|
-
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
354
|
-
const initialTheme = savedTheme || (systemPrefersDark ? 'dark' : 'light');
|
|
355
|
-
|
|
356
|
-
// Apply initial theme
|
|
357
|
-
document.documentElement.setAttribute('data-theme', initialTheme);
|
|
358
|
-
updateThemeIcon(initialTheme);
|
|
359
|
-
|
|
360
|
-
// Theme toggle event listener
|
|
361
|
-
themeToggle.addEventListener('click', () => {
|
|
362
|
-
const currentTheme = document.documentElement.getAttribute('data-theme');
|
|
363
|
-
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
|
|
364
|
-
|
|
365
|
-
document.documentElement.setAttribute('data-theme', newTheme);
|
|
366
|
-
localStorage.setItem('theme', newTheme);
|
|
367
|
-
updateThemeIcon(newTheme);
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
function updateThemeIcon(theme) {
|
|
371
|
-
themeIcon.textContent = theme === 'dark' ? 'āļø' : 'š';
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
// Listen for system theme changes
|
|
375
|
-
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
|
|
376
|
-
if (!localStorage.getItem('theme')) {
|
|
377
|
-
const newTheme = e.matches ? 'dark' : 'light';
|
|
378
|
-
document.documentElement.setAttribute('data-theme', newTheme);
|
|
379
|
-
updateThemeIcon(newTheme);
|
|
380
|
-
}
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
// Smooth scrolling for navigation links
|
|
384
|
-
const navLinks = document.querySelectorAll('a[href^="#"]');
|
|
385
|
-
navLinks.forEach(link => {
|
|
386
|
-
link.addEventListener('click', function(e) {
|
|
387
|
-
e.preventDefault();
|
|
388
|
-
const targetId = this.getAttribute('href');
|
|
389
|
-
const targetSection = document.querySelector(targetId);
|
|
390
|
-
|
|
391
|
-
if (targetSection) {
|
|
392
|
-
const offsetTop = targetSection.offsetTop - 80; // Account for fixed nav
|
|
393
|
-
window.scrollTo({
|
|
394
|
-
top: offsetTop,
|
|
395
|
-
behavior: 'smooth'
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
});
|
|
399
|
-
});
|
|
400
|
-
});`;
|
|
401
|
-
|
|
402
|
-
// Create README
|
|
403
|
-
const readmeMD = `# ${projectName} Website
|
|
404
|
-
|
|
405
|
-
Modern, responsive website built following FRAIM website creation workflow.
|
|
406
|
-
|
|
407
|
-
## Features
|
|
408
|
-
|
|
409
|
-
- š Dark/Light mode toggle with system preference detection
|
|
410
|
-
- š± Fully responsive design
|
|
411
|
-
- ā” Performance optimized
|
|
412
|
-
- āæ Accessibility focused
|
|
413
|
-
- šØ Modern design with CSS variables
|
|
414
|
-
- š Ready for deployment
|
|
415
|
-
|
|
416
|
-
## Development
|
|
417
|
-
|
|
418
|
-
### Local Development
|
|
419
|
-
1. Open \`index.html\` in your browser
|
|
420
|
-
2. Or use a local server:
|
|
421
|
-
\`\`\`bash
|
|
422
|
-
# Python
|
|
423
|
-
python -m http.server 8000
|
|
424
|
-
|
|
425
|
-
# Node.js
|
|
426
|
-
npx serve .
|
|
427
|
-
|
|
428
|
-
# VS Code Live Server extension
|
|
429
|
-
\`\`\`
|
|
430
|
-
|
|
431
|
-
### File Structure
|
|
432
|
-
\`\`\`
|
|
433
|
-
${projectName}/
|
|
434
|
-
āāā index.html # Main page
|
|
435
|
-
āāā css/
|
|
436
|
-
ā āāā styles.css # Main stylesheet
|
|
437
|
-
āāā js/
|
|
438
|
-
ā āāā script.js # JavaScript functionality
|
|
439
|
-
āāā assets/
|
|
440
|
-
ā āāā images/ # Image assets
|
|
441
|
-
ā āāā icons/ # Icon assets
|
|
442
|
-
āāā docs/
|
|
443
|
-
āāā README.md # This file
|
|
444
|
-
\`\`\`
|
|
445
|
-
|
|
446
|
-
## Customization
|
|
447
|
-
|
|
448
|
-
### Colors
|
|
449
|
-
Edit CSS variables in \`css/styles.css\`:
|
|
450
|
-
\`\`\`css
|
|
451
|
-
:root {
|
|
452
|
-
--bg-primary: #ffffff;
|
|
453
|
-
--bg-secondary: #f8fafc;
|
|
454
|
-
--text-primary: #1a1a1a;
|
|
455
|
-
--text-secondary: #666666;
|
|
456
|
-
--accent-color: #6366f1;
|
|
457
|
-
--border-color: #e5e5e5;
|
|
458
|
-
}
|
|
459
|
-
\`\`\`
|
|
460
|
-
|
|
461
|
-
### Content
|
|
462
|
-
- Update text content in \`index.html\`
|
|
463
|
-
- Add images to \`assets/images/\`
|
|
464
|
-
- Modify styles in \`css/styles.css\`
|
|
465
|
-
- Add functionality in \`js/script.js\`
|
|
466
|
-
|
|
467
|
-
## Deployment
|
|
468
|
-
|
|
469
|
-
### GitHub Pages
|
|
470
|
-
1. Push to GitHub repository
|
|
471
|
-
2. Enable GitHub Pages in repository settings
|
|
472
|
-
3. Select "GitHub Actions" as source
|
|
473
|
-
|
|
474
|
-
### Netlify
|
|
475
|
-
1. Connect GitHub repository
|
|
476
|
-
2. Set build command: (none for static site)
|
|
477
|
-
3. Set publish directory: \`.\`
|
|
478
|
-
|
|
479
|
-
### Vercel
|
|
480
|
-
1. Import GitHub repository
|
|
481
|
-
2. Deploy with default settings
|
|
482
|
-
|
|
483
|
-
## Performance
|
|
484
|
-
|
|
485
|
-
- Optimized CSS with minimal dependencies
|
|
486
|
-
- Vanilla JavaScript (no heavy frameworks)
|
|
487
|
-
- Responsive images
|
|
488
|
-
- Efficient animations
|
|
489
|
-
|
|
490
|
-
## Browser Support
|
|
491
|
-
|
|
492
|
-
- Chrome (latest 2 versions)
|
|
493
|
-
- Firefox (latest 2 versions)
|
|
494
|
-
- Safari (latest 2 versions)
|
|
495
|
-
- Edge (latest 2 versions)
|
|
496
|
-
- Mobile browsers
|
|
497
|
-
|
|
498
|
-
## License
|
|
499
|
-
|
|
500
|
-
[Add your license here]
|
|
501
|
-
`;
|
|
502
|
-
|
|
503
|
-
// Write files
|
|
504
|
-
fs.writeFileSync(path.join(websiteDir, 'index.html'), indexHtml);
|
|
505
|
-
fs.writeFileSync(path.join(websiteDir, 'css', 'styles.css'), stylesCSS);
|
|
506
|
-
fs.writeFileSync(path.join(websiteDir, 'js', 'script.js'), scriptJS);
|
|
507
|
-
fs.writeFileSync(path.join(websiteDir, 'README.md'), readmeMD);
|
|
508
|
-
|
|
509
|
-
// Create .gitignore
|
|
510
|
-
const gitignore = `# Dependencies
|
|
511
|
-
node_modules/
|
|
512
|
-
npm-debug.log*
|
|
513
|
-
|
|
514
|
-
# Build outputs
|
|
515
|
-
dist/
|
|
516
|
-
build/
|
|
517
|
-
|
|
518
|
-
# Environment variables
|
|
519
|
-
.env
|
|
520
|
-
.env.local
|
|
521
|
-
|
|
522
|
-
# IDE files
|
|
523
|
-
.vscode/
|
|
524
|
-
.idea/
|
|
525
|
-
*.swp
|
|
526
|
-
*.swo
|
|
527
|
-
|
|
528
|
-
# OS files
|
|
529
|
-
.DS_Store
|
|
530
|
-
Thumbs.db
|
|
531
|
-
|
|
532
|
-
# Logs
|
|
533
|
-
*.log
|
|
534
|
-
`;
|
|
535
|
-
fs.writeFileSync(path.join(websiteDir, '.gitignore'), gitignore);
|
|
536
|
-
|
|
537
|
-
console.log(`ā
Website structure created successfully!`);
|
|
538
|
-
console.log(`š Project directory: ${websiteDir}`);
|
|
539
|
-
console.log(`š Next steps:`);
|
|
540
|
-
console.log(` 1. cd ${projectName}`);
|
|
541
|
-
console.log(` 2. Open index.html in your browser`);
|
|
542
|
-
console.log(` 3. Start customizing your website!`);
|
|
543
|
-
console.log(` 4. Follow the FRAIM website creation workflow for best practices`);
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
// CLI usage
|
|
547
|
-
if (require.main === module) {
|
|
548
|
-
const config = loadConfig();
|
|
549
|
-
const args = process.argv.slice(2);
|
|
550
|
-
const projectName = args[0];
|
|
551
|
-
const outputDir = args[1] || process.cwd();
|
|
552
|
-
|
|
553
|
-
if (!projectName) {
|
|
554
|
-
console.log('Usage: node create-website-structure.js <project-name> [output-directory]');
|
|
555
|
-
console.log('Example: node create-website-structure.js my-awesome-website');
|
|
556
|
-
process.exit(1);
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
createWebsiteStructure(projectName, outputDir);
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
module.exports = { createWebsiteStructure };
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Detect Tautological Tests
|
|
4
|
-
# This script scans test files for patterns that suggest tests are validating code structure
|
|
5
|
-
# (interfaces, enums) rather than runtime behavior.
|
|
6
|
-
|
|
7
|
-
echo "š Scanning for Tautological Test Patterns..."
|
|
8
|
-
ERROR_FOUND=0
|
|
9
|
-
|
|
10
|
-
# Pattern 1: Asserting an array literal equals another array literal (common in enum testing)
|
|
11
|
-
# Looks for: assert.deepEqual(['a', 'b'], ['a', 'b'])
|
|
12
|
-
if grep -rE "assert\.(deep)?(Strict)?Equal\(\[.*\], \[.*\]\)" test*.ts; then
|
|
13
|
-
echo "ā ERROR: Found potential tautological array comparison. Tests should verify app logic, not hardcoded arrays."
|
|
14
|
-
echo " Rationale: Testing that ['A'] equals ['A'] validates nothing about the application."
|
|
15
|
-
ERROR_FOUND=1
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
# Pattern 2: Asserting properties on an object literal defined in the test (Type/Interface testing)
|
|
19
|
-
# Simplified: Look for defining a typed object and immediately asserting on it in the same file
|
|
20
|
-
# This is hard to do robustly with just grep, so we'll rely on the Naming Convention check for now.
|
|
21
|
-
|
|
22
|
-
# Pattern 3: Test names that explicitly say "Validate Enums", "Validate Fields", etc.
|
|
23
|
-
# We match "Validate TaskStatus Enums" or similar phrases
|
|
24
|
-
if grep -riE "['\"]Unit: Validate (Enum|Constant|Interface|Type|Field|Object|TaskStatus|Task Object)" test*.ts; then
|
|
25
|
-
echo "ā ERROR: Found test descriptions explicitly claiming to validate Enums/Types/Fields."
|
|
26
|
-
echo " Rationale: Unit tests should validate BEHAVIOR (e.g., 'persists correct status'), not definitions."
|
|
27
|
-
ERROR_FOUND=1
|
|
28
|
-
fi
|
|
29
|
-
|
|
30
|
-
if [ $ERROR_FOUND -eq 1 ]; then
|
|
31
|
-
echo ""
|
|
32
|
-
echo "ā ļø Potential Anti-Patterns Detected."
|
|
33
|
-
echo " Please review the identified tests against rules/integrity-and-test-ethics.md"
|
|
34
|
-
exit 1
|
|
35
|
-
else
|
|
36
|
-
echo "ā
No obvious tautological patterns found."
|
|
37
|
-
exit 0
|
|
38
|
-
fi
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Code Quality Evaluator (Diagnostic Tool)
|
|
4
|
-
*
|
|
5
|
-
* Runs code quality checks and outputs results to the console.
|
|
6
|
-
* Used by the evaluate-code-quality bootstrapping workflow.
|
|
7
|
-
*
|
|
8
|
-
* Usage: npx tsx <this-script>
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import * as path from 'path';
|
|
12
|
-
import { spawn } from 'child_process';
|
|
13
|
-
|
|
14
|
-
const REGISTRY_SCRIPTS_DIR = __dirname;
|
|
15
|
-
const QUALITY_CHECK_SCRIPT = path.join(REGISTRY_SCRIPTS_DIR, 'code-quality-check.sh');
|
|
16
|
-
|
|
17
|
-
function evaluateQuality() {
|
|
18
|
-
console.log('š Starting Code Quality Evaluation...');
|
|
19
|
-
console.log('š Running code-quality-check.sh...\n');
|
|
20
|
-
|
|
21
|
-
// Run the existing quality check script and pipe output directly to terminal
|
|
22
|
-
const child = spawn('bash', [QUALITY_CHECK_SCRIPT, 'pre-pr'], {
|
|
23
|
-
stdio: 'inherit',
|
|
24
|
-
shell: false
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
child.on('exit', (code) => {
|
|
28
|
-
if (code === 0) {
|
|
29
|
-
console.log('\nā
Code quality check completed successfully.');
|
|
30
|
-
} else {
|
|
31
|
-
console.log(`\nā Code quality check failed with exit code ${code}.`);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
evaluateQuality();
|