fraim-framework 2.0.44 โ†’ 2.0.45

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 (72) hide show
  1. package/bin/fraim.js +1 -1
  2. package/dist/registry/ai-manager-rules/design-phases/design-completeness-review.md +73 -0
  3. package/dist/registry/ai-manager-rules/design-phases/design-design.md +145 -0
  4. package/dist/registry/ai-manager-rules/design-phases/design.md +108 -0
  5. package/dist/registry/ai-manager-rules/design-phases/finalize.md +60 -0
  6. package/dist/registry/ai-manager-rules/design-phases/validate.md +125 -0
  7. package/dist/registry/ai-manager-rules/implement-phases/code.md +323 -0
  8. package/dist/registry/ai-manager-rules/implement-phases/completeness-review.md +94 -0
  9. package/dist/registry/ai-manager-rules/implement-phases/finalize.md +177 -0
  10. package/dist/registry/ai-manager-rules/implement-phases/implement-code.md +286 -0
  11. package/dist/registry/ai-manager-rules/implement-phases/implement-completeness-review.md +120 -0
  12. package/dist/registry/ai-manager-rules/implement-phases/implement-regression.md +173 -0
  13. package/dist/registry/ai-manager-rules/implement-phases/implement-repro.md +104 -0
  14. package/dist/registry/ai-manager-rules/implement-phases/implement-scoping.md +100 -0
  15. package/dist/registry/ai-manager-rules/implement-phases/implement-smoke.md +230 -0
  16. package/dist/registry/ai-manager-rules/implement-phases/implement-spike.md +121 -0
  17. package/dist/registry/ai-manager-rules/implement-phases/implement-validate.md +371 -0
  18. package/dist/registry/ai-manager-rules/implement-phases/quality-review.md +304 -0
  19. package/dist/registry/ai-manager-rules/implement-phases/regression.md +159 -0
  20. package/dist/registry/ai-manager-rules/implement-phases/repro.md +101 -0
  21. package/dist/registry/ai-manager-rules/implement-phases/scoping.md +93 -0
  22. package/dist/registry/ai-manager-rules/implement-phases/smoke.md +225 -0
  23. package/dist/registry/ai-manager-rules/implement-phases/spike.md +118 -0
  24. package/dist/registry/ai-manager-rules/implement-phases/validate.md +347 -0
  25. package/dist/registry/ai-manager-rules/shared-phases/finalize.md +169 -0
  26. package/dist/registry/ai-manager-rules/shared-phases/submit-pr.md +202 -0
  27. package/dist/registry/ai-manager-rules/shared-phases/wait-for-pr-review.md +170 -0
  28. package/dist/registry/ai-manager-rules/spec-phases/finalize.md +60 -0
  29. package/dist/registry/ai-manager-rules/spec-phases/spec-completeness-review.md +66 -0
  30. package/dist/registry/ai-manager-rules/spec-phases/spec-spec.md +139 -0
  31. package/dist/registry/ai-manager-rules/spec-phases/spec.md +102 -0
  32. package/dist/registry/ai-manager-rules/spec-phases/validate.md +118 -0
  33. package/dist/src/ai-manager/ai-manager.js +380 -119
  34. package/dist/src/ai-manager/evidence-validator.js +309 -0
  35. package/dist/src/ai-manager/phase-flow.js +244 -0
  36. package/dist/src/ai-manager/types.js +5 -0
  37. package/dist/src/fraim-mcp-server.js +45 -153
  38. package/dist/src/static-website-middleware.js +75 -0
  39. package/dist/tests/test-ai-coach-edge-cases.js +415 -0
  40. package/dist/tests/test-ai-coach-mcp-integration.js +432 -0
  41. package/dist/tests/test-ai-coach-performance.js +328 -0
  42. package/dist/tests/test-ai-coach-phase-content.js +264 -0
  43. package/dist/tests/test-ai-coach-workflows.js +487 -0
  44. package/dist/tests/test-ai-manager-phase-protocol.js +147 -0
  45. package/dist/tests/test-ai-manager.js +60 -71
  46. package/dist/tests/test-evidence-validation.js +221 -0
  47. package/dist/tests/test-mcp-lifecycle-methods.js +18 -23
  48. package/dist/tests/test-pr-review-integration.js +1 -0
  49. package/dist/tests/test-pr-review-workflow.js +299 -0
  50. package/dist/website/.nojekyll +0 -0
  51. package/dist/website/404.html +101 -0
  52. package/dist/website/CNAME +1 -0
  53. package/dist/website/README.md +22 -0
  54. package/dist/website/demo.html +604 -0
  55. package/dist/website/images/.gitkeep +1 -0
  56. package/dist/website/images/fraim-logo.png +0 -0
  57. package/dist/website/index.html +290 -0
  58. package/dist/website/pricing.html +414 -0
  59. package/dist/website/script.js +55 -0
  60. package/dist/website/styles.css +2647 -0
  61. package/package.json +2 -1
  62. package/registry/agent-guardrails.md +1 -1
  63. package/registry/stubs/workflows/brainstorming/blue-sky-brainstorming.md +11 -0
  64. package/registry/stubs/workflows/brainstorming/codebase-brainstorming.md +11 -0
  65. package/registry/stubs/workflows/compliance/detect-compliance-requirements.md +11 -0
  66. package/registry/stubs/workflows/compliance/generate-audit-evidence.md +11 -0
  67. package/registry/stubs/workflows/learning/synthesize-learnings.md +11 -0
  68. package/registry/stubs/workflows/legal/nda.md +11 -0
  69. package/registry/stubs/workflows/legal/patent-filing.md +11 -0
  70. package/registry/stubs/workflows/legal/trademark-filing.md +11 -0
  71. package/registry/stubs/workflows/product-building/design.md +1 -1
  72. package/registry/stubs/workflows/product-building/implement.md +1 -2
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_assert_1 = require("node:assert");
4
+ const test_utils_1 = require("./test-utils");
5
+ const phase_flow_js_1 = require("../src/ai-manager/phase-flow.js");
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ /**
9
+ * Test PR Review Workflow Phase Flow
10
+ */
11
+ async function testPRReviewPhaseFlow() {
12
+ try {
13
+ console.log('๐Ÿงช Testing PR review phase flow...');
14
+ // Test bug workflow includes new phases
15
+ const bugPhases = (0, phase_flow_js_1.getPhasesForWorkflow)('implement', 'bug');
16
+ (0, node_assert_1.strict)(bugPhases.includes('submit-pr'), 'Bug workflow should include submit-pr phase');
17
+ (0, node_assert_1.strict)(bugPhases.includes('wait-for-pr-review'), 'Bug workflow should include wait-for-pr-review phase');
18
+ // Test feature workflow includes new phases
19
+ const featurePhases = (0, phase_flow_js_1.getPhasesForWorkflow)('implement', 'feature');
20
+ (0, node_assert_1.strict)(featurePhases.includes('submit-pr'), 'Feature workflow should include submit-pr phase');
21
+ (0, node_assert_1.strict)(featurePhases.includes('wait-for-pr-review'), 'Feature workflow should include wait-for-pr-review phase');
22
+ // Test phase progression
23
+ const nextAfterCompleteness = (0, phase_flow_js_1.getNextPhase)('implement-completeness-review', 'implement', 'bug');
24
+ node_assert_1.strict.equal(nextAfterCompleteness, 'submit-pr', 'After completeness-review should go to submit-pr');
25
+ const nextAfterSubmitPR = (0, phase_flow_js_1.getNextPhase)('submit-pr', 'implement', 'bug');
26
+ node_assert_1.strict.equal(nextAfterSubmitPR, 'wait-for-pr-review', 'After submit-pr should go to wait-for-pr-review');
27
+ const nextAfterWaitPR = (0, phase_flow_js_1.getNextPhase)('wait-for-pr-review', 'implement', 'bug');
28
+ node_assert_1.strict.equal(nextAfterWaitPR, null, 'wait-for-pr-review should be the last phase');
29
+ console.log('โœ… PR review phase flow tests passed');
30
+ return true;
31
+ }
32
+ catch (error) {
33
+ console.error('โŒ PR review phase flow test failed:', error.message);
34
+ return false;
35
+ }
36
+ }
37
+ /**
38
+ * Test PR Review Failure Handling
39
+ */
40
+ async function testPRReviewFailureHandling() {
41
+ try {
42
+ console.log('๐Ÿงช Testing PR review failure handling...');
43
+ // Test submit-pr failure
44
+ const submitPRFailure = (0, phase_flow_js_1.getPhaseOnFailure)('submit-pr', 'implement', 'bug');
45
+ node_assert_1.strict.equal(submitPRFailure, 'implement-completeness-review', 'submit-pr failure should return to completeness-review');
46
+ // Test wait-for-pr-review failure (default)
47
+ const waitPRFailure = (0, phase_flow_js_1.getPhaseOnFailure)('wait-for-pr-review', 'implement', 'bug');
48
+ node_assert_1.strict.equal(waitPRFailure, 'implement-code', 'wait-for-pr-review failure should default to implement-code');
49
+ // Test all workflow types have new phases
50
+ const specPhases = (0, phase_flow_js_1.getPhasesForWorkflow)('spec');
51
+ (0, node_assert_1.strict)(specPhases.includes('submit-pr'), 'Spec workflow should include submit-pr');
52
+ (0, node_assert_1.strict)(specPhases.includes('wait-for-pr-review'), 'Spec workflow should include wait-for-pr-review');
53
+ const designPhases = (0, phase_flow_js_1.getPhasesForWorkflow)('design');
54
+ (0, node_assert_1.strict)(designPhases.includes('submit-pr'), 'Design workflow should include submit-pr');
55
+ (0, node_assert_1.strict)(designPhases.includes('wait-for-pr-review'), 'Design workflow should include wait-for-pr-review');
56
+ console.log('โœ… PR review failure handling tests passed');
57
+ return true;
58
+ }
59
+ catch (error) {
60
+ console.error('โŒ PR review failure handling test failed:', error.message);
61
+ return false;
62
+ }
63
+ }
64
+ /**
65
+ * Test PR Comment Polling Script (Mock)
66
+ */
67
+ async function testPRCommentPollingScript() {
68
+ try {
69
+ console.log('๐Ÿงช Testing PR comment polling script...');
70
+ // Create mock .fraim/config.json
71
+ const testDir = (0, path_1.join)(process.cwd(), 'test_temp');
72
+ const fraimDir = (0, path_1.join)(testDir, '.fraim');
73
+ if ((0, fs_1.existsSync)(testDir)) {
74
+ (0, fs_1.rmSync)(testDir, { recursive: true, force: true });
75
+ }
76
+ (0, fs_1.mkdirSync)(fraimDir, { recursive: true });
77
+ const mockConfig = {
78
+ git: {
79
+ repoOwner: 'test-owner',
80
+ repoName: 'test-repo'
81
+ }
82
+ };
83
+ (0, fs_1.writeFileSync)((0, path_1.join)(fraimDir, 'config.json'), JSON.stringify(mockConfig, null, 2));
84
+ // Test script exists and is executable
85
+ const scriptPath = (0, path_1.join)(process.cwd(), 'scripts', 'sleep-and-continue.js');
86
+ (0, node_assert_1.strict)((0, fs_1.existsSync)(scriptPath), 'Sleep utility script should exist');
87
+ // Test script can be executed (syntax check)
88
+ const { execSync } = require('child_process');
89
+ try {
90
+ // Test help output
91
+ execSync('node scripts/sleep-and-continue.js --help', { stdio: 'pipe' });
92
+ }
93
+ catch (error) {
94
+ // Expected to fail with usage message, which is fine
95
+ (0, node_assert_1.strict)(error.message.includes('Usage:'), 'Script should show usage when called incorrectly');
96
+ }
97
+ // Cleanup
98
+ (0, fs_1.rmSync)(testDir, { recursive: true, force: true });
99
+ console.log('โœ… PR comment polling script tests passed');
100
+ return true;
101
+ }
102
+ catch (error) {
103
+ console.error('โŒ PR comment polling script test failed:', error.message);
104
+ return false;
105
+ }
106
+ }
107
+ /**
108
+ * Test PR Feedback File System
109
+ */
110
+ async function testPRCommentVerificationScript() {
111
+ try {
112
+ console.log('๐Ÿงช Testing PR feedback file system...');
113
+ const testDir = (0, path_1.join)(process.cwd(), 'test_temp');
114
+ const evidenceDir = (0, path_1.join)(testDir, 'evidence');
115
+ if ((0, fs_1.existsSync)(testDir)) {
116
+ (0, fs_1.rmSync)(testDir, { recursive: true, force: true });
117
+ }
118
+ (0, fs_1.mkdirSync)(evidenceDir, { recursive: true });
119
+ // Create mock feedback document using new format
120
+ const mockFeedbackDoc = `# PR Feedback for Issue #123 - Implement Workflow
121
+
122
+ ## Round 1 Feedback
123
+ *Received: 2024-01-15T10:30:00Z*
124
+
125
+ ### Comment 1 - ADDRESSED
126
+ - **Author**: reviewer1
127
+ - **Type**: review_comment
128
+ - **File**: src/test.ts
129
+ - **Line**: 45
130
+ - **Comment**: This function needs error handling
131
+ - **Status**: ADDRESSED
132
+ - **Resolution**: Added try-catch block and proper error handling
133
+
134
+ ### Comment 2 - ADDRESSED
135
+ - **Author**: reviewer2
136
+ - **Type**: pr_comment
137
+ - **Comment**: Please add unit tests for this feature
138
+ - **Status**: ADDRESSED
139
+ - **Resolution**: Added comprehensive unit tests in test/feature.test.ts
140
+ `;
141
+ const feedbackDocPath = (0, path_1.join)(evidenceDir, '123-implement-feedback.md');
142
+ (0, fs_1.writeFileSync)(feedbackDocPath, mockFeedbackDoc);
143
+ // Test that feedback document was created and has expected content
144
+ (0, node_assert_1.strict)((0, fs_1.existsSync)(feedbackDocPath), 'PR feedback document should exist');
145
+ const content = (0, fs_1.readFileSync)(feedbackDocPath, 'utf-8');
146
+ (0, node_assert_1.strict)(content.includes('## Round 1 Feedback'), 'Document should contain Round 1 Feedback');
147
+ (0, node_assert_1.strict)(content.includes('### Comment 1 - ADDRESSED'), 'Document should contain Comment 1 with status');
148
+ (0, node_assert_1.strict)(content.includes('### Comment 2 - ADDRESSED'), 'Document should contain Comment 2 with status');
149
+ (0, node_assert_1.strict)(content.includes('reviewer1'), 'Document should contain reviewer1');
150
+ (0, node_assert_1.strict)(content.includes('reviewer2'), 'Document should contain reviewer2');
151
+ (0, node_assert_1.strict)(content.includes('Status**: ADDRESSED'), 'Comments should be marked as ADDRESSED');
152
+ // Cleanup
153
+ (0, fs_1.rmSync)(testDir, { recursive: true, force: true });
154
+ console.log('โœ… PR feedback file system tests passed');
155
+ return true;
156
+ }
157
+ catch (error) {
158
+ console.error('โŒ PR feedback file system test failed:', error.message);
159
+ return false;
160
+ }
161
+ }
162
+ /**
163
+ * Test Real-World PR Review Scenario
164
+ */
165
+ async function testRealWorldPRReviewScenario() {
166
+ try {
167
+ console.log('๐Ÿงช Testing real-world PR review scenario...');
168
+ // Scenario: Feature implementation with PR feedback
169
+ let currentPhase = 'implement-scoping';
170
+ const workflowType = 'implement';
171
+ const issueType = 'feature';
172
+ // Progress through normal phases
173
+ const expectedFlow = [
174
+ 'implement-scoping',
175
+ 'implement-spike',
176
+ 'implement-code',
177
+ 'implement-validate',
178
+ 'implement-smoke',
179
+ 'implement-regression',
180
+ 'implement-completeness-review',
181
+ 'submit-pr',
182
+ 'wait-for-pr-review'
183
+ ];
184
+ for (let i = 0; i < expectedFlow.length - 1; i++) {
185
+ const nextPhase = (0, phase_flow_js_1.getNextPhase)(currentPhase, workflowType, issueType);
186
+ node_assert_1.strict.equal(nextPhase, expectedFlow[i + 1], `After ${currentPhase} should go to ${expectedFlow[i + 1]}`);
187
+ currentPhase = nextPhase;
188
+ }
189
+ // Test PR review completion (approved)
190
+ const finalPhase = (0, phase_flow_js_1.getNextPhase)('wait-for-pr-review', workflowType, issueType);
191
+ node_assert_1.strict.equal(finalPhase, null, 'wait-for-pr-review should be final phase when approved');
192
+ // Test PR review with changes requested (failure scenario)
193
+ const failurePhase = (0, phase_flow_js_1.getPhaseOnFailure)('wait-for-pr-review', workflowType, issueType);
194
+ node_assert_1.strict.equal(failurePhase, 'implement-code', 'PR changes requested should route to implement-code by default');
195
+ // Test iteration: after fixing code, go through validation again
196
+ let iterationPhase = 'implement-code';
197
+ const iterationFlow = ['implement-validate', 'implement-smoke', 'implement-regression', 'implement-completeness-review', 'submit-pr', 'wait-for-pr-review'];
198
+ for (const expectedNext of iterationFlow) {
199
+ const nextPhase = (0, phase_flow_js_1.getNextPhase)(iterationPhase, workflowType, issueType);
200
+ node_assert_1.strict.equal(nextPhase, expectedNext, `Iteration: after ${iterationPhase} should go to ${expectedNext}`);
201
+ iterationPhase = nextPhase;
202
+ }
203
+ console.log('โœ… Real-world PR review scenario tests passed');
204
+ return true;
205
+ }
206
+ catch (error) {
207
+ console.error('โŒ Real-world PR review scenario test failed:', error.message);
208
+ return false;
209
+ }
210
+ }
211
+ /**
212
+ * Test PR Comment Routing Logic
213
+ */
214
+ async function testPRCommentRoutingLogic() {
215
+ try {
216
+ console.log('๐Ÿงช Testing PR comment routing logic...');
217
+ // Test different comment types should route to different phases
218
+ // This would be implemented in the wait-for-pr-review phase logic
219
+ // Mock comment analysis scenarios
220
+ const commentScenarios = [
221
+ {
222
+ comment: "This doesn't match the requirements in the spec",
223
+ expectedRoute: 'implement-scoping', // or spec-spec for spec workflow
224
+ category: 'requirements'
225
+ },
226
+ {
227
+ comment: "The API design doesn't follow our patterns",
228
+ expectedRoute: 'design-design',
229
+ category: 'design'
230
+ },
231
+ {
232
+ comment: "This code has a memory leak",
233
+ expectedRoute: 'implement-code',
234
+ category: 'code_quality'
235
+ },
236
+ {
237
+ comment: "Missing test coverage for edge cases",
238
+ expectedRoute: 'implement-validate',
239
+ category: 'testing'
240
+ },
241
+ {
242
+ comment: "The documentation is incomplete",
243
+ expectedRoute: 'implement-completeness-review',
244
+ category: 'documentation'
245
+ }
246
+ ];
247
+ // For now, just verify the routing logic exists in the failure handling
248
+ for (const scenario of commentScenarios) {
249
+ // The actual routing would be implemented in the wait-for-pr-review phase
250
+ // For now, we test that the failure handling provides reasonable defaults
251
+ const routePhase = (0, phase_flow_js_1.getPhaseOnFailure)('wait-for-pr-review', 'implement', 'feature');
252
+ (0, node_assert_1.strict)(typeof routePhase === 'string', `Should return a valid phase for routing`);
253
+ }
254
+ console.log('โœ… PR comment routing logic tests passed');
255
+ return true;
256
+ }
257
+ catch (error) {
258
+ console.error('โŒ PR comment routing logic test failed:', error.message);
259
+ return false;
260
+ }
261
+ }
262
+ /**
263
+ * Test Phase Validation
264
+ */
265
+ async function testPhaseValidation() {
266
+ try {
267
+ console.log('๐Ÿงช Testing phase validation...');
268
+ // Test new phases are valid for all workflow types
269
+ (0, node_assert_1.strict)((0, phase_flow_js_1.isPhaseValidForWorkflow)('submit-pr', 'implement', 'bug'), 'submit-pr should be valid for implement workflow');
270
+ (0, node_assert_1.strict)((0, phase_flow_js_1.isPhaseValidForWorkflow)('wait-for-pr-review', 'implement', 'bug'), 'wait-for-pr-review should be valid for implement workflow');
271
+ (0, node_assert_1.strict)((0, phase_flow_js_1.isPhaseValidForWorkflow)('submit-pr', 'spec'), 'submit-pr should be valid for spec workflow');
272
+ (0, node_assert_1.strict)((0, phase_flow_js_1.isPhaseValidForWorkflow)('wait-for-pr-review', 'spec'), 'wait-for-pr-review should be valid for spec workflow');
273
+ (0, node_assert_1.strict)((0, phase_flow_js_1.isPhaseValidForWorkflow)('submit-pr', 'design'), 'submit-pr should be valid for design workflow');
274
+ (0, node_assert_1.strict)((0, phase_flow_js_1.isPhaseValidForWorkflow)('wait-for-pr-review', 'design'), 'wait-for-pr-review should be valid for design workflow');
275
+ (0, node_assert_1.strict)((0, phase_flow_js_1.isPhaseValidForWorkflow)('submit-pr', 'test'), 'submit-pr should be valid for test workflow');
276
+ (0, node_assert_1.strict)((0, phase_flow_js_1.isPhaseValidForWorkflow)('wait-for-pr-review', 'test'), 'wait-for-pr-review should be valid for test workflow');
277
+ // Test old finalize phase is no longer valid
278
+ (0, node_assert_1.strict)(!(0, phase_flow_js_1.isPhaseValidForWorkflow)('finalize', 'implement', 'bug'), 'finalize should no longer be valid for implement workflow');
279
+ (0, node_assert_1.strict)(!(0, phase_flow_js_1.isPhaseValidForWorkflow)('finalize', 'spec'), 'finalize should no longer be valid for spec workflow');
280
+ console.log('โœ… Phase validation tests passed');
281
+ return true;
282
+ }
283
+ catch (error) {
284
+ console.error('โŒ Phase validation test failed:', error.message);
285
+ return false;
286
+ }
287
+ }
288
+ // Test cases
289
+ const testCases = [
290
+ { name: 'PR Review Phase Flow', testFn: testPRReviewPhaseFlow },
291
+ { name: 'PR Review Failure Handling', testFn: testPRReviewFailureHandling },
292
+ { name: 'PR Comment Polling Script', testFn: testPRCommentPollingScript },
293
+ { name: 'PR Feedback File System', testFn: testPRCommentVerificationScript },
294
+ { name: 'Real-World PR Review Scenario', testFn: testRealWorldPRReviewScenario },
295
+ { name: 'PR Comment Routing Logic', testFn: testPRCommentRoutingLogic },
296
+ { name: 'Phase Validation', testFn: testPhaseValidation }
297
+ ];
298
+ // Run tests
299
+ (0, test_utils_1.runTests)(testCases, async (t) => t.testFn(), 'PR Review Workflow Tests');
File without changes
@@ -0,0 +1,101 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Page Not Found - FRAIM</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
10
+ <style>
11
+ * {
12
+ margin: 0;
13
+ padding: 0;
14
+ box-sizing: border-box;
15
+ }
16
+
17
+ body {
18
+ font-family: 'Inter', sans-serif;
19
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
20
+ min-height: 100vh;
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ color: #1a1a1a;
25
+ }
26
+
27
+ .error-container {
28
+ text-align: center;
29
+ max-width: 600px;
30
+ padding: 40px 20px;
31
+ }
32
+
33
+ .error-code {
34
+ font-size: 120px;
35
+ font-weight: 700;
36
+ background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #ec4899 100%);
37
+ -webkit-background-clip: text;
38
+ -webkit-text-fill-color: transparent;
39
+ background-clip: text;
40
+ margin-bottom: 20px;
41
+ }
42
+
43
+ .error-title {
44
+ font-size: 32px;
45
+ font-weight: 600;
46
+ margin-bottom: 16px;
47
+ }
48
+
49
+ .error-message {
50
+ font-size: 18px;
51
+ color: #666;
52
+ margin-bottom: 32px;
53
+ line-height: 1.5;
54
+ }
55
+
56
+ .home-button {
57
+ background: #6366f1;
58
+ color: white;
59
+ padding: 12px 24px;
60
+ border-radius: 8px;
61
+ text-decoration: none;
62
+ font-weight: 600;
63
+ transition: all 0.2s;
64
+ display: inline-block;
65
+ }
66
+
67
+ .home-button:hover {
68
+ background: #5855eb;
69
+ transform: translateY(-1px);
70
+ }
71
+
72
+ .logo {
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ gap: 8px;
77
+ margin-bottom: 40px;
78
+ font-size: 24px;
79
+ font-weight: 700;
80
+ }
81
+
82
+ .logo-icon {
83
+ font-size: 32px;
84
+ }
85
+ </style>
86
+ </head>
87
+ <body>
88
+ <div class="error-container">
89
+ <div class="logo">
90
+ <span class="logo-icon">๐Ÿš€</span>
91
+ <span>FRAIM</span>
92
+ </div>
93
+ <div class="error-code">404</div>
94
+ <h1 class="error-title">Page Not Found</h1>
95
+ <p class="error-message">
96
+ The page you're looking for doesn't exist. It might have been moved, deleted, or you entered the wrong URL.
97
+ </p>
98
+ <a href="/" class="home-button">Back to Home</a>
99
+ </div>
100
+ </body>
101
+ </html>
@@ -0,0 +1 @@
1
+ fraimworks.ai
@@ -0,0 +1,22 @@
1
+ # FRAIM Website
2
+
3
+ This directory contains the FRAIM marketing website with dark/light mode toggle.
4
+
5
+ ## Features
6
+ - Responsive design with mobile support
7
+ - Dark/light mode toggle with system preference detection
8
+ - Professional branding and animations
9
+ - GitHub Pages deployment via GitHub Actions
10
+
11
+ ## Deployment
12
+ The site is automatically deployed to GitHub Pages via GitHub Actions when changes are pushed to the `website/` folder.
13
+
14
+ **Site URL**: https://mathursrus.github.io/FRAIM/
15
+
16
+ ## Files
17
+ - `index.html` - Main landing page
18
+ - `demo.html` - Interactive demo page
19
+ - `styles.css` - CSS with dark/light mode variables
20
+ - `script.js` - JavaScript for theme toggle and animations
21
+ - `404.html` - Custom error page
22
+ - `.nojekyll` - Prevents Jekyll processing