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.
- package/bin/fraim.js +1 -1
- package/dist/registry/ai-manager-rules/design-phases/design-completeness-review.md +73 -0
- package/dist/registry/ai-manager-rules/design-phases/design-design.md +145 -0
- package/dist/registry/ai-manager-rules/design-phases/design.md +108 -0
- package/dist/registry/ai-manager-rules/design-phases/finalize.md +60 -0
- package/dist/registry/ai-manager-rules/design-phases/validate.md +125 -0
- package/dist/registry/ai-manager-rules/implement-phases/code.md +323 -0
- package/dist/registry/ai-manager-rules/implement-phases/completeness-review.md +94 -0
- package/dist/registry/ai-manager-rules/implement-phases/finalize.md +177 -0
- package/dist/registry/ai-manager-rules/implement-phases/implement-code.md +286 -0
- package/dist/registry/ai-manager-rules/implement-phases/implement-completeness-review.md +120 -0
- package/dist/registry/ai-manager-rules/implement-phases/implement-regression.md +173 -0
- package/dist/registry/ai-manager-rules/implement-phases/implement-repro.md +104 -0
- package/dist/registry/ai-manager-rules/implement-phases/implement-scoping.md +100 -0
- package/dist/registry/ai-manager-rules/implement-phases/implement-smoke.md +230 -0
- package/dist/registry/ai-manager-rules/implement-phases/implement-spike.md +121 -0
- package/dist/registry/ai-manager-rules/implement-phases/implement-validate.md +371 -0
- package/dist/registry/ai-manager-rules/implement-phases/quality-review.md +304 -0
- package/dist/registry/ai-manager-rules/implement-phases/regression.md +159 -0
- package/dist/registry/ai-manager-rules/implement-phases/repro.md +101 -0
- package/dist/registry/ai-manager-rules/implement-phases/scoping.md +93 -0
- package/dist/registry/ai-manager-rules/implement-phases/smoke.md +225 -0
- package/dist/registry/ai-manager-rules/implement-phases/spike.md +118 -0
- package/dist/registry/ai-manager-rules/implement-phases/validate.md +347 -0
- package/dist/registry/ai-manager-rules/shared-phases/finalize.md +169 -0
- package/dist/registry/ai-manager-rules/shared-phases/submit-pr.md +202 -0
- package/dist/registry/ai-manager-rules/shared-phases/wait-for-pr-review.md +170 -0
- package/dist/registry/ai-manager-rules/spec-phases/finalize.md +60 -0
- package/dist/registry/ai-manager-rules/spec-phases/spec-completeness-review.md +66 -0
- package/dist/registry/ai-manager-rules/spec-phases/spec-spec.md +139 -0
- package/dist/registry/ai-manager-rules/spec-phases/spec.md +102 -0
- package/dist/registry/ai-manager-rules/spec-phases/validate.md +118 -0
- package/dist/src/ai-manager/ai-manager.js +380 -119
- package/dist/src/ai-manager/evidence-validator.js +309 -0
- package/dist/src/ai-manager/phase-flow.js +244 -0
- package/dist/src/ai-manager/types.js +5 -0
- package/dist/src/fraim-mcp-server.js +45 -153
- package/dist/src/static-website-middleware.js +75 -0
- package/dist/tests/test-ai-coach-edge-cases.js +415 -0
- package/dist/tests/test-ai-coach-mcp-integration.js +432 -0
- package/dist/tests/test-ai-coach-performance.js +328 -0
- package/dist/tests/test-ai-coach-phase-content.js +264 -0
- package/dist/tests/test-ai-coach-workflows.js +487 -0
- package/dist/tests/test-ai-manager-phase-protocol.js +147 -0
- package/dist/tests/test-ai-manager.js +60 -71
- package/dist/tests/test-evidence-validation.js +221 -0
- package/dist/tests/test-mcp-lifecycle-methods.js +18 -23
- package/dist/tests/test-pr-review-integration.js +1 -0
- package/dist/tests/test-pr-review-workflow.js +299 -0
- package/dist/website/.nojekyll +0 -0
- package/dist/website/404.html +101 -0
- package/dist/website/CNAME +1 -0
- package/dist/website/README.md +22 -0
- package/dist/website/demo.html +604 -0
- package/dist/website/images/.gitkeep +1 -0
- package/dist/website/images/fraim-logo.png +0 -0
- package/dist/website/index.html +290 -0
- package/dist/website/pricing.html +414 -0
- package/dist/website/script.js +55 -0
- package/dist/website/styles.css +2647 -0
- package/package.json +2 -1
- package/registry/agent-guardrails.md +1 -1
- package/registry/stubs/workflows/brainstorming/blue-sky-brainstorming.md +11 -0
- package/registry/stubs/workflows/brainstorming/codebase-brainstorming.md +11 -0
- package/registry/stubs/workflows/compliance/detect-compliance-requirements.md +11 -0
- package/registry/stubs/workflows/compliance/generate-audit-evidence.md +11 -0
- package/registry/stubs/workflows/learning/synthesize-learnings.md +11 -0
- package/registry/stubs/workflows/legal/nda.md +11 -0
- package/registry/stubs/workflows/legal/patent-filing.md +11 -0
- package/registry/stubs/workflows/legal/trademark-filing.md +11 -0
- package/registry/stubs/workflows/product-building/design.md +1 -1
- 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
|