fraim-framework 2.0.36 → 2.0.38
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 +5 -52
- package/dist/registry/scripts/build-scripts-generator.js +205 -0
- package/dist/registry/scripts/fraim-config.js +61 -0
- package/dist/registry/scripts/generic-issues-api.js +100 -0
- package/dist/registry/scripts/openapi-generator.js +664 -0
- package/dist/registry/scripts/performance/profile-server.js +390 -0
- package/dist/scripts/build-stub-registry.js +108 -0
- package/dist/src/cli/commands/doctor.js +5 -5
- package/dist/src/cli/commands/init-project.js +74 -0
- package/dist/src/cli/commands/setup.js +176 -0
- package/dist/src/cli/commands/sync.js +33 -19
- package/dist/src/cli/commands/test-mcp.js +135 -0
- package/dist/src/cli/fraim.js +6 -0
- package/dist/src/cli/setup/auto-mcp-setup.js +367 -0
- package/dist/src/cli/setup/ide-detector.js +163 -0
- package/dist/src/cli/setup/mcp-config-generator.js +115 -0
- package/dist/src/cli/setup/token-validator.js +49 -0
- package/dist/test-utils.js +96 -0
- package/dist/tests/debug-tools.js +2 -2
- package/dist/tests/esm-compat.js +11 -0
- package/dist/tests/shared-server-utils.js +57 -0
- package/dist/tests/test-chalk-esm-issue.js +159 -0
- package/dist/tests/test-chalk-real-world.js +265 -0
- package/dist/tests/test-chalk-regression.js +2 -18
- package/dist/tests/test-chalk-resolution-issue.js +304 -0
- package/dist/tests/test-client-scripts-validation.js +27 -5
- package/dist/tests/test-complete-setup-flow.js +110 -0
- package/dist/tests/test-fraim-install-chalk-issue.js +254 -0
- package/dist/tests/test-ide-detector.js +46 -0
- package/dist/tests/test-improved-setup.js +121 -0
- package/dist/tests/test-mcp-config-generator.js +70 -0
- package/dist/tests/test-mcp-connection.js +58 -117
- package/dist/tests/test-mcp-issue-integration.js +2 -2
- package/dist/tests/test-mcp-lifecycle-methods.js +34 -100
- package/dist/tests/test-mcp-shared-server.js +308 -0
- package/dist/tests/test-npm-resolution-diagnostic.js +140 -0
- package/dist/tests/test-package-size.js +101 -0
- package/dist/tests/test-prep-issue.js +34 -1
- package/dist/tests/test-script-location-independence.js +39 -62
- package/dist/tests/test-server-utils.js +32 -0
- package/dist/tests/test-session-rehydration.js +2 -2
- package/dist/tests/test-setup-integration.js +98 -0
- package/dist/tests/test-standalone.js +2 -2
- package/dist/tests/test-stub-registry.js +136 -0
- package/dist/tests/test-sync-stubs.js +143 -0
- package/dist/tests/test-telemetry.js +2 -2
- package/dist/tests/test-token-validator.js +30 -0
- package/dist/tests/test-user-journey.js +2 -1
- package/package.json +7 -9
- package/registry/agent-guardrails.md +62 -62
- package/registry/scripts/code-quality-check.sh +559 -559
- package/registry/scripts/detect-tautological-tests.sh +38 -38
- package/registry/scripts/prep-issue.sh +61 -30
- package/registry/scripts/validate-openapi-limits.ts +366 -366
- package/registry/scripts/validate-test-coverage.ts +280 -280
- package/registry/scripts/verify-pr-comments.sh +70 -70
- package/registry/stubs/workflows/bootstrap/create-architecture.md +11 -0
- package/registry/stubs/workflows/bootstrap/detect-broken-windows.md +11 -0
- package/registry/stubs/workflows/bootstrap/evaluate-code-quality.md +11 -0
- package/registry/stubs/workflows/bootstrap/verify-test-coverage.md +11 -0
- package/registry/stubs/workflows/business-development/create-business-plan.md +11 -0
- package/registry/stubs/workflows/business-development/ideate-business-opportunity.md +11 -0
- package/registry/stubs/workflows/business-development/price-product.md +18 -0
- package/registry/stubs/workflows/convert-to-pdf.md +11 -0
- package/registry/stubs/workflows/customer-development/insight-analysis.md +11 -0
- package/registry/stubs/workflows/customer-development/insight-triage.md +11 -0
- package/registry/stubs/workflows/customer-development/interview-preparation.md +11 -0
- package/registry/stubs/workflows/customer-development/linkedin-outreach.md +11 -0
- package/registry/stubs/workflows/customer-development/strategic-brainstorming.md +11 -0
- package/registry/stubs/workflows/customer-development/thank-customers.md +11 -0
- package/registry/stubs/workflows/customer-development/weekly-newsletter.md +11 -0
- package/registry/stubs/workflows/deploy/cloud-deployment.md +11 -0
- package/registry/stubs/workflows/improve-fraim/contribute.md +11 -0
- package/registry/stubs/workflows/improve-fraim/file-issue.md +11 -0
- package/registry/stubs/workflows/marketing/content-creation.md +11 -0
- package/registry/stubs/workflows/marketing/hbr-article.md +11 -0
- package/registry/stubs/workflows/marketing/launch-checklist.md +11 -0
- package/registry/stubs/workflows/marketing/marketing-strategy.md +11 -0
- package/registry/stubs/workflows/marketing/storytelling.md +11 -0
- package/registry/stubs/workflows/performance/analyze-performance.md +11 -0
- package/registry/stubs/workflows/product-building/design.md +11 -0
- package/registry/stubs/workflows/product-building/implement.md +12 -0
- package/registry/stubs/workflows/product-building/iterate-on-pr-comments.md +11 -0
- package/registry/stubs/workflows/product-building/prep-issue.md +11 -0
- package/registry/stubs/workflows/product-building/prototype.md +11 -0
- package/registry/stubs/workflows/product-building/resolve.md +11 -0
- package/registry/stubs/workflows/product-building/retrospect.md +11 -0
- package/registry/stubs/workflows/product-building/spec.md +11 -0
- package/registry/stubs/workflows/product-building/test.md +11 -0
- package/registry/stubs/workflows/quality-assurance/browser-validation.md +11 -0
- package/registry/stubs/workflows/quality-assurance/iterative-improvement-cycle.md +11 -0
- package/registry/stubs/workflows/replicate/replicate-discovery.md +11 -0
- package/registry/stubs/workflows/replicate/replicate-to-issues.md +11 -0
- package/registry/stubs/workflows/reviewer/review-implementation-vs-design-spec.md +11 -0
- package/registry/stubs/workflows/reviewer/review-implementation-vs-feature-spec.md +11 -0
- package/registry/stubs/workflows/startup-credits/aws-activate-application.md +11 -0
- package/registry/stubs/workflows/startup-credits/google-cloud-application.md +11 -0
- package/registry/stubs/workflows/startup-credits/microsoft-azure-application.md +11 -0
- package/.github/workflows/ci.yml +0 -65
- package/.github/workflows/deploy-fraim.yml +0 -87
- package/.github/workflows/phase-change.yml +0 -251
- package/.github/workflows/status-change.yml +0 -68
- package/.github/workflows/sync-on-pr-review.yml +0 -66
- package/examples/simple-webapp/TESTING.md +0 -62
- package/examples/simple-webapp/example-test.ts +0 -186
- package/registry/github/workflows/ci.yml +0 -51
- package/registry/github/workflows/phase-change.yml +0 -251
- package/registry/github/workflows/status-change.yml +0 -68
- package/registry/github/workflows/sync-on-pr-review.yml +0 -66
- package/registry/mcp-template.jsonc +0 -29
- package/registry/rules/agent-success-criteria.md +0 -52
- package/registry/rules/agent-testing-guidelines.md +0 -502
- package/registry/rules/architecture.md +0 -52
- package/registry/rules/communication.md +0 -122
- package/registry/rules/continuous-learning.md +0 -55
- package/registry/rules/debugging-multitenancy-issues.md +0 -85
- package/registry/rules/ephemeral-execution.md +0 -57
- package/registry/rules/git-safe-commands.md +0 -34
- package/registry/rules/hitl-ppe-record-analysis.md +0 -302
- package/registry/rules/integrity-and-test-ethics.md +0 -275
- package/registry/rules/local-development.md +0 -254
- package/registry/rules/merge-requirements.md +0 -231
- package/registry/rules/simplicity.md +0 -118
- package/registry/rules/software-development-lifecycle.md +0 -105
- package/registry/rules/spike-first-development.md +0 -205
- package/registry/rules/successful-debugging-patterns.md +0 -491
- package/registry/rules/telemetry.md +0 -67
- package/registry/templates/bootstrap/ARCHITECTURE-TEMPLATE.md +0 -53
- package/registry/templates/bootstrap/CODE-QUALITY-REPORT-TEMPLATE.md +0 -37
- package/registry/templates/bootstrap/TEST-COVERAGE-REPORT-TEMPLATE.md +0 -35
- package/registry/templates/business-development/IDEATION-REPORT-TEMPLATE.md +0 -29
- package/registry/templates/business-development/PRICING-STRATEGY-TEMPLATE.md +0 -126
- package/registry/templates/customer-development/customer-interview-template.md +0 -99
- package/registry/templates/customer-development/follow-up-email-templates.md +0 -132
- package/registry/templates/customer-development/insight-analysis-template.md +0 -74
- package/registry/templates/customer-development/strategic-recommendations-template.md +0 -53
- package/registry/templates/customer-development/thank-you-email-template.html +0 -124
- package/registry/templates/customer-development/thank-you-note-template.md +0 -16
- package/registry/templates/customer-development/triage-log-template.md +0 -278
- package/registry/templates/customer-development/weekly-newsletter-template.html +0 -204
- package/registry/templates/evidence/Design-Evidence.md +0 -30
- package/registry/templates/evidence/Implementation-BugEvidence.md +0 -86
- package/registry/templates/evidence/Implementation-FeatureEvidence.md +0 -121
- package/registry/templates/evidence/Spec-Evidence.md +0 -19
- package/registry/templates/help/HelpNeeded.md +0 -14
- package/registry/templates/marketing/HBR-ARTICLE-TEMPLATE.md +0 -66
- package/registry/templates/replicate/implementation-checklist.md +0 -39
- package/registry/templates/replicate/use-cases-template.md +0 -88
- package/registry/templates/retrospective/RETROSPECTIVE-TEMPLATE.md +0 -55
- package/registry/templates/specs/BUGSPEC-TEMPLATE.md +0 -37
- package/registry/templates/specs/FEATURESPEC-TEMPLATE.md +0 -29
- package/registry/templates/specs/TECHSPEC-TEMPLATE.md +0 -39
- package/registry/workflows/bootstrap/create-architecture.md +0 -38
- package/registry/workflows/bootstrap/evaluate-code-quality.md +0 -36
- package/registry/workflows/bootstrap/verify-test-coverage.md +0 -37
- package/registry/workflows/business-development/create-business-plan.md +0 -737
- package/registry/workflows/business-development/ideate-business-opportunity.md +0 -55
- package/registry/workflows/business-development/price-product.md +0 -325
- package/registry/workflows/convert-to-pdf.md +0 -235
- package/registry/workflows/customer-development/insight-analysis.md +0 -156
- package/registry/workflows/customer-development/insight-triage.md +0 -933
- package/registry/workflows/customer-development/interview-preparation.md +0 -421
- package/registry/workflows/customer-development/linkedin-outreach.md +0 -593
- package/registry/workflows/customer-development/strategic-brainstorming.md +0 -146
- package/registry/workflows/customer-development/thank-customers.md +0 -203
- package/registry/workflows/customer-development/weekly-newsletter.md +0 -366
- package/registry/workflows/deploy/cloud-deployment.md +0 -310
- package/registry/workflows/improve-fraim/contribute.md +0 -32
- package/registry/workflows/improve-fraim/file-issue.md +0 -32
- package/registry/workflows/marketing/content-creation.md +0 -37
- package/registry/workflows/marketing/hbr-article.md +0 -73
- package/registry/workflows/marketing/launch-checklist.md +0 -37
- package/registry/workflows/marketing/marketing-strategy.md +0 -45
- package/registry/workflows/performance/analyze-performance.md +0 -65
- package/registry/workflows/product-building/design.md +0 -130
- package/registry/workflows/product-building/implement.md +0 -315
- package/registry/workflows/product-building/iterate-on-pr-comments.md +0 -70
- package/registry/workflows/product-building/prep-issue.md +0 -43
- package/registry/workflows/product-building/prototype.md +0 -60
- package/registry/workflows/product-building/resolve.md +0 -164
- package/registry/workflows/product-building/retrospect.md +0 -86
- package/registry/workflows/product-building/spec.md +0 -117
- package/registry/workflows/product-building/test.md +0 -120
- package/registry/workflows/quality-assurance/browser-validation.md +0 -221
- package/registry/workflows/quality-assurance/iterative-improvement-cycle.md +0 -562
- package/registry/workflows/replicate/replicate-discovery.md +0 -336
- package/registry/workflows/replicate/replicate-to-issues.md +0 -319
- package/registry/workflows/reviewer/review-implementation-vs-design-spec.md +0 -632
- package/registry/workflows/reviewer/review-implementation-vs-feature-spec.md +0 -669
- package/registry/workflows/startup-credits/aws-activate-application.md +0 -535
- package/registry/workflows/startup-credits/google-cloud-application.md +0 -647
- package/registry/workflows/startup-credits/microsoft-azure-application.md +0 -538
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Example Test Case for FRAIM Framework
|
|
5
|
-
*
|
|
6
|
-
* This demonstrates how to write test cases using the FRAIM testing framework
|
|
7
|
-
* with proper tagging and structure.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { BaseTestCase, runTests } from '../../test-utils';
|
|
11
|
-
|
|
12
|
-
// Example test case interface extending BaseTestCase
|
|
13
|
-
interface ExampleTestCase extends BaseTestCase {
|
|
14
|
-
description: string;
|
|
15
|
-
testFunction: () => Promise<boolean>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Example test cases with different tags
|
|
19
|
-
const EXAMPLE_TEST_CASES: ExampleTestCase[] = [
|
|
20
|
-
{
|
|
21
|
-
name: 'test_basic_functionality',
|
|
22
|
-
tags: ['smoke', 'basic'],
|
|
23
|
-
description: 'Should verify basic application functionality works',
|
|
24
|
-
testFunction: async () => {
|
|
25
|
-
console.log('🧪 Testing basic functionality...');
|
|
26
|
-
|
|
27
|
-
// Example: Test that a basic function works
|
|
28
|
-
const result = await basicFunction();
|
|
29
|
-
|
|
30
|
-
if (result !== 'success') {
|
|
31
|
-
console.log(`❌ Expected 'success', got '${result}'`);
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
console.log('✅ Basic functionality test passed');
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
name: 'test_user_authentication',
|
|
41
|
-
tags: ['smoke', 'auth'],
|
|
42
|
-
description: 'Should verify user authentication works correctly',
|
|
43
|
-
testFunction: async () => {
|
|
44
|
-
console.log('🧪 Testing user authentication...');
|
|
45
|
-
|
|
46
|
-
// Example: Test authentication flow
|
|
47
|
-
const authResult = await authenticateUser('test@example.com', 'password123');
|
|
48
|
-
|
|
49
|
-
if (!authResult.success) {
|
|
50
|
-
console.log(`❌ Authentication failed: ${authResult.error}`);
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
console.log('✅ User authentication test passed');
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
name: 'test_api_integration',
|
|
60
|
-
tags: ['integration', 'api'],
|
|
61
|
-
description: 'Should verify API integration works correctly',
|
|
62
|
-
testFunction: async () => {
|
|
63
|
-
console.log('🧪 Testing API integration...');
|
|
64
|
-
|
|
65
|
-
// Example: Test API call
|
|
66
|
-
const apiResult = await callExternalAPI('https://api.example.com/data');
|
|
67
|
-
|
|
68
|
-
if (!apiResult || !apiResult.data) {
|
|
69
|
-
console.log('❌ API integration failed - no data returned');
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
console.log('✅ API integration test passed');
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
name: 'test_database_operations',
|
|
79
|
-
tags: ['database', 'integration'],
|
|
80
|
-
description: 'Should verify database operations work correctly',
|
|
81
|
-
testFunction: async () => {
|
|
82
|
-
console.log('🧪 Testing database operations...');
|
|
83
|
-
|
|
84
|
-
// Example: Test database operations
|
|
85
|
-
const dbResult = await performDatabaseOperation();
|
|
86
|
-
|
|
87
|
-
if (!dbResult.success) {
|
|
88
|
-
console.log(`❌ Database operation failed: ${dbResult.error}`);
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
console.log('✅ Database operations test passed');
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
name: 'test_performance_benchmark',
|
|
98
|
-
tags: ['performance', 'flaky'],
|
|
99
|
-
description: 'Should verify performance meets requirements (may be flaky)',
|
|
100
|
-
testFunction: async () => {
|
|
101
|
-
console.log('🧪 Testing performance benchmark...');
|
|
102
|
-
|
|
103
|
-
const startTime = Date.now();
|
|
104
|
-
await performExpensiveOperation();
|
|
105
|
-
const endTime = Date.now();
|
|
106
|
-
|
|
107
|
-
const duration = endTime - startTime;
|
|
108
|
-
const maxDuration = 1000; // 1 second
|
|
109
|
-
|
|
110
|
-
if (duration > maxDuration) {
|
|
111
|
-
console.log(`❌ Performance test failed: ${duration}ms > ${maxDuration}ms`);
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
console.log(`✅ Performance test passed: ${duration}ms`);
|
|
116
|
-
return true;
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
name: 'test_failing_scenario',
|
|
121
|
-
tags: ['failing', 'debug'],
|
|
122
|
-
description: 'This test is currently failing and needs debugging',
|
|
123
|
-
testFunction: async () => {
|
|
124
|
-
console.log('🧪 Testing failing scenario...');
|
|
125
|
-
|
|
126
|
-
// This test is intentionally failing to demonstrate the failing tag
|
|
127
|
-
console.log('❌ This test is currently failing for demonstration');
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
];
|
|
132
|
-
|
|
133
|
-
// Mock functions for demonstration
|
|
134
|
-
async function basicFunction(): Promise<string> {
|
|
135
|
-
// Simulate some work
|
|
136
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
137
|
-
return 'success';
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
async function authenticateUser(email: string, password: string): Promise<{success: boolean, error?: string}> {
|
|
141
|
-
// Simulate authentication
|
|
142
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
143
|
-
|
|
144
|
-
if (email === 'test@example.com' && password === 'password123') {
|
|
145
|
-
return { success: true };
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return { success: false, error: 'Invalid credentials' };
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
async function callExternalAPI(url: string): Promise<{data?: any}> {
|
|
152
|
-
// Simulate API call
|
|
153
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
154
|
-
|
|
155
|
-
return {
|
|
156
|
-
data: {
|
|
157
|
-
id: 1,
|
|
158
|
-
name: 'Test Data',
|
|
159
|
-
timestamp: new Date().toISOString()
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
async function performDatabaseOperation(): Promise<{success: boolean, error?: string}> {
|
|
165
|
-
// Simulate database operation
|
|
166
|
-
await new Promise(resolve => setTimeout(resolve, 75));
|
|
167
|
-
|
|
168
|
-
return { success: true };
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
async function performExpensiveOperation(): Promise<void> {
|
|
172
|
-
// Simulate expensive operation
|
|
173
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Test runner function
|
|
177
|
-
const runExampleTest = async (testCase: ExampleTestCase): Promise<boolean> => {
|
|
178
|
-
try {
|
|
179
|
-
return await testCase.testFunction();
|
|
180
|
-
} catch (error) {
|
|
181
|
-
console.log(`❌ Test ${testCase.name} threw an error: ${error}`);
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
await runTests(EXAMPLE_TEST_CASES, runExampleTest, 'Example Test Suite');
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- 'master'
|
|
7
|
-
schedule:
|
|
8
|
-
- cron: '0 6 * * *' # 11 PM PST is 6 AM UTC
|
|
9
|
-
|
|
10
|
-
# Sets permissions of the GITHUB_TOKEN
|
|
11
|
-
permissions:
|
|
12
|
-
contents: read
|
|
13
|
-
checks: write
|
|
14
|
-
|
|
15
|
-
# Cancel in-progress runs on same branch
|
|
16
|
-
concurrency:
|
|
17
|
-
group: ci-${{ github.workflow }}-${{ github.ref }}
|
|
18
|
-
cancel-in-progress: true
|
|
19
|
-
|
|
20
|
-
jobs:
|
|
21
|
-
build:
|
|
22
|
-
if: github.event_name == 'push'
|
|
23
|
-
runs-on: ubuntu-latest
|
|
24
|
-
timeout-minutes: 15
|
|
25
|
-
|
|
26
|
-
steps:
|
|
27
|
-
- uses: actions/checkout@v4
|
|
28
|
-
- uses: actions/setup-node@v4
|
|
29
|
-
with:
|
|
30
|
-
node-version: 20
|
|
31
|
-
- run: npm install
|
|
32
|
-
- name: Build
|
|
33
|
-
run: npm run build
|
|
34
|
-
- name: Test Smoke CI
|
|
35
|
-
run: npm run test-smoke-ci
|
|
36
|
-
|
|
37
|
-
full-test:
|
|
38
|
-
runs-on: ubuntu-latest
|
|
39
|
-
if: github.event_name == 'schedule' && github.ref == 'refs/heads/master'
|
|
40
|
-
|
|
41
|
-
steps:
|
|
42
|
-
- uses: actions/checkout@v4
|
|
43
|
-
- uses: actions/setup-node@v4
|
|
44
|
-
with:
|
|
45
|
-
node-version: 20
|
|
46
|
-
- run: npm install
|
|
47
|
-
- name: Build
|
|
48
|
-
run: npm run build
|
|
49
|
-
- name: Test All CI
|
|
50
|
-
run: npm run test-all-ci
|
|
51
|
-
timeout-minutes: 30
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
name: Phase Change Handler
|
|
2
|
-
|
|
3
|
-
# This workflow now assumes branches are created by prep-issue.sh
|
|
4
|
-
# It only handles PR creation/updating and status management
|
|
5
|
-
|
|
6
|
-
on:
|
|
7
|
-
issues:
|
|
8
|
-
types: [labeled]
|
|
9
|
-
|
|
10
|
-
permissions:
|
|
11
|
-
issues: write
|
|
12
|
-
pull-requests: write
|
|
13
|
-
contents: write
|
|
14
|
-
|
|
15
|
-
jobs:
|
|
16
|
-
handle-phase-change:
|
|
17
|
-
runs-on: ubuntu-latest
|
|
18
|
-
if: |
|
|
19
|
-
contains(github.event.label.name, 'phase:') ||
|
|
20
|
-
(github.event.action == 'unlabeled' && contains(github.event.label.name, 'phase:'))
|
|
21
|
-
|
|
22
|
-
steps:
|
|
23
|
-
- name: Checkout repository
|
|
24
|
-
uses: actions/checkout@v4
|
|
25
|
-
with:
|
|
26
|
-
token: ${{ secrets.GITHUB_TOKEN }}
|
|
27
|
-
fetch-depth: 0
|
|
28
|
-
|
|
29
|
-
- name: Setup Git
|
|
30
|
-
run: |
|
|
31
|
-
git config --global user.name "github-actions[bot]"
|
|
32
|
-
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
|
33
|
-
|
|
34
|
-
- name: Auth GitHub CLI
|
|
35
|
-
run: echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token
|
|
36
|
-
|
|
37
|
-
- name: Extract issue details
|
|
38
|
-
id: issue-details
|
|
39
|
-
run: |
|
|
40
|
-
ISSUE_NUMBER="${{ github.event.issue.number }}"
|
|
41
|
-
ISSUE_TITLE="${{ github.event.issue.title }}"
|
|
42
|
-
BRANCH_NAME="feature/${ISSUE_NUMBER}-$(echo "$ISSUE_TITLE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g')"
|
|
43
|
-
|
|
44
|
-
echo "issue_number=$ISSUE_NUMBER" >> $GITHUB_OUTPUT
|
|
45
|
-
echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
|
|
46
|
-
echo "issue_title=$ISSUE_TITLE" >> $GITHUB_OUTPUT
|
|
47
|
-
|
|
48
|
-
- name: Determine current phase
|
|
49
|
-
id: current-phase
|
|
50
|
-
run: |
|
|
51
|
-
LABELS='${{ toJson(github.event.issue.labels) }}'
|
|
52
|
-
CURRENT_PHASE=""
|
|
53
|
-
|
|
54
|
-
# Extract current phase from labels
|
|
55
|
-
for label in $(echo "$LABELS" | jq -r '.[].name'); do
|
|
56
|
-
if [[ $label == phase:* ]]; then
|
|
57
|
-
CURRENT_PHASE=$label
|
|
58
|
-
break
|
|
59
|
-
fi
|
|
60
|
-
done
|
|
61
|
-
|
|
62
|
-
echo "current_phase=$CURRENT_PHASE" >> $GITHUB_OUTPUT
|
|
63
|
-
echo "Current phase: $CURRENT_PHASE"
|
|
64
|
-
|
|
65
|
-
- name: Verify branch exists (created by prep-issue.sh)
|
|
66
|
-
run: |
|
|
67
|
-
BRANCH_NAME="${{ steps.issue-details.outputs.branch_name }}"
|
|
68
|
-
|
|
69
|
-
# Check if branch exists remotely
|
|
70
|
-
if git ls-remote --exit-code --heads origin "$BRANCH_NAME" >/dev/null 2>&1; then
|
|
71
|
-
echo "✓ Branch $BRANCH_NAME exists remotely"
|
|
72
|
-
git fetch origin "$BRANCH_NAME"
|
|
73
|
-
else
|
|
74
|
-
echo "⚠️ Branch $BRANCH_NAME does not exist remotely"
|
|
75
|
-
echo " This should have been created by prep-issue.sh"
|
|
76
|
-
echo " Please run prep-issue.sh before invoking agent workflows"
|
|
77
|
-
exit 1
|
|
78
|
-
fi
|
|
79
|
-
|
|
80
|
-
- name: Check if PR already exists
|
|
81
|
-
id: pr-check
|
|
82
|
-
run: |
|
|
83
|
-
BRANCH_NAME="${{ steps.issue-details.outputs.branch_name }}"
|
|
84
|
-
EXISTING_PR=$(gh pr list --head "$BRANCH_NAME" --json number --jq '.[0].number' 2>/dev/null || echo "")
|
|
85
|
-
echo "existing_pr=$EXISTING_PR" >> $GITHUB_OUTPUT
|
|
86
|
-
if [ -n "$EXISTING_PR" ]; then
|
|
87
|
-
echo "✓ PR #$EXISTING_PR already exists"
|
|
88
|
-
else
|
|
89
|
-
echo "ℹ️ No PR exists yet, will create one for phase: ${{ steps.current-phase.outputs.current_phase }}"
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
- name: phase:spec → create/update PR for Specification phase
|
|
93
|
-
if: steps.current-phase.outputs.current_phase == 'phase:spec'
|
|
94
|
-
shell: bash
|
|
95
|
-
env:
|
|
96
|
-
ISSUE: ${{ github.event.issue.number }}
|
|
97
|
-
run: |
|
|
98
|
-
ISSUE_NUMBER="${{ steps.issue-details.outputs.issue_number }}"
|
|
99
|
-
ISSUE_TITLE="${{ steps.issue-details.outputs.issue_title }}"
|
|
100
|
-
BRANCH_NAME="${{ steps.issue-details.outputs.branch_name }}"
|
|
101
|
-
|
|
102
|
-
# Create or update PR for Specification phase
|
|
103
|
-
PR_TITLE="[Specification] Feature Spec for Issue #$ISSUE_NUMBER: $ISSUE_TITLE"
|
|
104
|
-
PR_BODY="## Feature Specification for Issue #$ISSUE_NUMBER
|
|
105
|
-
|
|
106
|
-
This PR contains the feature specification for: $ISSUE_TITLE
|
|
107
|
-
|
|
108
|
-
**Phase:** Specification
|
|
109
|
-
**Issue:** #$ISSUE_NUMBER
|
|
110
|
-
**Branch:** \`$BRANCH_NAME\`
|
|
111
|
-
|
|
112
|
-
### Specification Document
|
|
113
|
-
- 📋 [Feature Specification]($SPEC_FILE)
|
|
114
|
-
|
|
115
|
-
**Note:** This is a Specification PR. Design and Implementation will follow after specification approval.
|
|
116
|
-
|
|
117
|
-
"
|
|
118
|
-
|
|
119
|
-
EXISTING_PR="${{ steps.pr-check.outputs.existing_pr }}"
|
|
120
|
-
|
|
121
|
-
if [ -n "$EXISTING_PR" ]; then
|
|
122
|
-
echo "Updating existing PR #$EXISTING_PR for Specification phase"
|
|
123
|
-
gh pr edit "$EXISTING_PR" --title "$PR_TITLE" --body "$PR_BODY"
|
|
124
|
-
gh pr edit "$EXISTING_PR" --add-label "phase:spec" --remove-label "phase:design" --remove-label "phase:tests" --remove-label "phase:impl"
|
|
125
|
-
else
|
|
126
|
-
echo "Creating new PR for Specification phase"
|
|
127
|
-
gh pr create --title "$PR_TITLE" --body "$PR_BODY" --base master --head "$BRANCH_NAME" --draft
|
|
128
|
-
gh pr edit --add-label "phase:spec"
|
|
129
|
-
fi
|
|
130
|
-
|
|
131
|
-
- name: phase:design → create/update PR for Design phase
|
|
132
|
-
if: steps.current-phase.outputs.current_phase == 'phase:design'
|
|
133
|
-
shell: bash
|
|
134
|
-
env:
|
|
135
|
-
ISSUE: ${{ github.event.issue.number }}
|
|
136
|
-
run: |
|
|
137
|
-
ISSUE_NUMBER="${{ steps.issue-details.outputs.issue_number }}"
|
|
138
|
-
ISSUE_TITLE="${{ steps.issue-details.outputs.issue_title }}"
|
|
139
|
-
BRANCH_NAME="${{ steps.issue-details.outputs.branch_name }}"
|
|
140
|
-
|
|
141
|
-
# Create or update PR for Design phase
|
|
142
|
-
PR_TITLE="[Design] RFC for Issue #$ISSUE_NUMBER: $ISSUE_TITLE"
|
|
143
|
-
PR_BODY="## Design RFC for Issue #$ISSUE_NUMBER
|
|
144
|
-
|
|
145
|
-
This PR contains the design RFC for: $ISSUE_TITLE
|
|
146
|
-
|
|
147
|
-
**Phase:** Design
|
|
148
|
-
**Issue:** #$ISSUE_NUMBER
|
|
149
|
-
**Branch:** \`$BRANCH_NAME\`
|
|
150
|
-
|
|
151
|
-
### RFC Document
|
|
152
|
-
- 📋 [RFC Document]($RFC_FILE)
|
|
153
|
-
|
|
154
|
-
**Note:** This is a Design PR. Implementation will follow in a separate PR after design approval.
|
|
155
|
-
|
|
156
|
-
"
|
|
157
|
-
|
|
158
|
-
EXISTING_PR="${{ steps.pr-check.outputs.existing_pr }}"
|
|
159
|
-
|
|
160
|
-
if [ -n "$EXISTING_PR" ]; then
|
|
161
|
-
echo "Updating existing PR #$EXISTING_PR for Design phase"
|
|
162
|
-
gh pr edit "$EXISTING_PR" --title "$PR_TITLE" --body "$PR_BODY"
|
|
163
|
-
gh pr edit "$EXISTING_PR" --add-label "phase:design" --remove-label "phase:spec" --remove-label "phase:tests" --remove-label "phase:impl"
|
|
164
|
-
else
|
|
165
|
-
echo "Creating new PR for Design phase"
|
|
166
|
-
gh pr create --title "$PR_TITLE" --body "$PR_BODY" --base master --head "$BRANCH_NAME" --draft
|
|
167
|
-
gh pr edit --add-label "phase:design"
|
|
168
|
-
fi
|
|
169
|
-
|
|
170
|
-
- name: phase:tests → create/update PR for Test phase
|
|
171
|
-
if: steps.current-phase.outputs.current_phase == 'phase:tests'
|
|
172
|
-
run: |
|
|
173
|
-
ISSUE_NUMBER="${{ steps.issue-details.outputs.issue_number }}"
|
|
174
|
-
ISSUE_TITLE="${{ steps.issue-details.outputs.issue_title }}"
|
|
175
|
-
BRANCH_NAME="${{ steps.issue-details.outputs.branch_name }}"
|
|
176
|
-
|
|
177
|
-
# Create or update PR for Test phase
|
|
178
|
-
PR_TITLE="[Testing] Test Cases for Issue #$ISSUE_NUMBER: $ISSUE_TITLE"
|
|
179
|
-
PR_BODY="## Test cases for Issue #$ISSUE_NUMBER
|
|
180
|
-
|
|
181
|
-
This PR contains the test cases for: $ISSUE_TITLE
|
|
182
|
-
|
|
183
|
-
**Phase:** Tests
|
|
184
|
-
**Issue:** #$ISSUE_NUMBER
|
|
185
|
-
**Branch:** \`$BRANCH_NAME\`
|
|
186
|
-
|
|
187
|
-
### Test Cases
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
**Note:** This is a Test PR. Implementation will follow after test approval.
|
|
191
|
-
|
|
192
|
-
"
|
|
193
|
-
|
|
194
|
-
EXISTING_PR="${{ steps.pr-check.outputs.existing_pr }}"
|
|
195
|
-
|
|
196
|
-
if [ -n "$EXISTING_PR" ]; then
|
|
197
|
-
echo "Updating existing PR #$EXISTING_PR for Test phase"
|
|
198
|
-
gh pr edit "$EXISTING_PR" --title "$PR_TITLE" --body "$PR_BODY"
|
|
199
|
-
gh pr edit "$EXISTING_PR" --add-label "phase:tests" --remove-label "phase:spec" --remove-label "phase:design" --remove-label "phase:impl"
|
|
200
|
-
else
|
|
201
|
-
echo "Creating new PR for Test phase"
|
|
202
|
-
gh pr create --title "$PR_TITLE" --body "$PR_BODY" --base master --head "$BRANCH_NAME" --draft
|
|
203
|
-
gh pr edit --add-label "phase:tests"
|
|
204
|
-
fi
|
|
205
|
-
|
|
206
|
-
- name: phase:impl → create/update PR for Implementation phase
|
|
207
|
-
if: steps.current-phase.outputs.current_phase == 'phase:impl'
|
|
208
|
-
run: |
|
|
209
|
-
ISSUE_NUMBER="${{ steps.issue-details.outputs.issue_number }}"
|
|
210
|
-
ISSUE_TITLE="${{ steps.issue-details.outputs.issue_title }}"
|
|
211
|
-
BRANCH_NAME="${{ steps.issue-details.outputs.branch_name }}"
|
|
212
|
-
|
|
213
|
-
# Create or update PR for Implementation phase
|
|
214
|
-
PR_TITLE="[Implementation] Fixes for Issue #$ISSUE_NUMBER: $ISSUE_TITLE"
|
|
215
|
-
PR_BODY="## Fixes for Issue #$ISSUE_NUMBER
|
|
216
|
-
|
|
217
|
-
This PR contains the fixes for: $ISSUE_TITLE
|
|
218
|
-
|
|
219
|
-
**Phase:** Implementation
|
|
220
|
-
**Issue:** #$ISSUE_NUMBER
|
|
221
|
-
**Branch:** \`$BRANCH_NAME\`
|
|
222
|
-
|
|
223
|
-
### Fixes
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
Closes #$ISSUE_NUMBER
|
|
227
|
-
|
|
228
|
-
"
|
|
229
|
-
|
|
230
|
-
EXISTING_PR="${{ steps.pr-check.outputs.existing_pr }}"
|
|
231
|
-
|
|
232
|
-
if [ -n "$EXISTING_PR" ]; then
|
|
233
|
-
echo "Updating existing PR #$EXISTING_PR for Implementation phase"
|
|
234
|
-
gh pr edit "$EXISTING_PR" --title "$PR_TITLE" --body "$PR_BODY"
|
|
235
|
-
gh pr edit "$EXISTING_PR" --add-label "phase:impl" --remove-label "phase:spec" --remove-label "phase:design" --remove-label "phase:tests"
|
|
236
|
-
else
|
|
237
|
-
echo "Creating new PR for Implementation phase"
|
|
238
|
-
gh pr create --title "$PR_TITLE" --body "$PR_BODY" --base master --head "$BRANCH_NAME" --draft
|
|
239
|
-
gh pr edit --add-label "phase:impl"
|
|
240
|
-
fi
|
|
241
|
-
|
|
242
|
-
- name: Normalize ISSUE and PR status to WIP (authoritative)
|
|
243
|
-
run: |
|
|
244
|
-
gh issue edit ${{ github.event.issue.number }} --add-label "status:wip" --remove-label "status:needs-review" --remove-label "status:complete" || true
|
|
245
|
-
|
|
246
|
-
# Use the PR number from the check step
|
|
247
|
-
EXISTING_PR="${{ steps.pr-check.outputs.existing_pr }}"
|
|
248
|
-
|
|
249
|
-
if [ -n "$EXISTING_PR" ]; then
|
|
250
|
-
gh pr edit "$EXISTING_PR" --add-label "status:wip" --remove-label "status:needs-review" --remove-label "status:complete" || true
|
|
251
|
-
fi
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
name: Status Change → Flip PR Draft/Ready
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
issues:
|
|
5
|
-
types: [labeled]
|
|
6
|
-
|
|
7
|
-
permissions:
|
|
8
|
-
pull-requests: write
|
|
9
|
-
issues: read
|
|
10
|
-
contents: write
|
|
11
|
-
|
|
12
|
-
# Serialize per ISSUE; last status wins
|
|
13
|
-
concurrency:
|
|
14
|
-
group: status-change-${{ github.event.issue.number }}
|
|
15
|
-
cancel-in-progress: true
|
|
16
|
-
|
|
17
|
-
jobs:
|
|
18
|
-
status-change:
|
|
19
|
-
if: startsWith(github.event.label.name, 'status:')
|
|
20
|
-
runs-on: ubuntu-latest
|
|
21
|
-
steps:
|
|
22
|
-
- name: Checkout repository
|
|
23
|
-
uses: actions/checkout@v4
|
|
24
|
-
with:
|
|
25
|
-
token: ${{ secrets.GITHUB_TOKEN }}
|
|
26
|
-
fetch-depth: 0
|
|
27
|
-
|
|
28
|
-
- name: Setup Git
|
|
29
|
-
run: |
|
|
30
|
-
git config --global user.name "github-actions[bot]"
|
|
31
|
-
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
|
32
|
-
|
|
33
|
-
- name: Auth GitHub CLI
|
|
34
|
-
run: echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token
|
|
35
|
-
|
|
36
|
-
- name: Derive branch + find PR
|
|
37
|
-
id: pr
|
|
38
|
-
shell: bash
|
|
39
|
-
env:
|
|
40
|
-
ISSUE_NUMBER: ${{ github.event.issue.number }}
|
|
41
|
-
ISSUE_TITLE: ${{ github.event.issue.title }}
|
|
42
|
-
run: |
|
|
43
|
-
set -euo pipefail
|
|
44
|
-
slug=$(echo "$ISSUE_TITLE" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g;s/^-+|-+$//g')
|
|
45
|
-
BR="feature/${ISSUE_NUMBER}-${slug}"
|
|
46
|
-
PR=$(gh pr list --state open --head "$BR" --json number --jq '.[0].number')
|
|
47
|
-
echo "pr=$PR" >> $GITHUB_OUTPUT
|
|
48
|
-
echo "label=${{ github.event.label.name }}" >> $GITHUB_OUTPUT
|
|
49
|
-
|
|
50
|
-
- name: Flip PR state (Draft/Ready) based on label
|
|
51
|
-
if: steps.pr.outputs.pr != ''
|
|
52
|
-
shell: bash
|
|
53
|
-
env:
|
|
54
|
-
PR: ${{ steps.pr.outputs.pr }}
|
|
55
|
-
LABEL: ${{ steps.pr.outputs.label }}
|
|
56
|
-
run: |
|
|
57
|
-
set -euo pipefail
|
|
58
|
-
case "$LABEL" in
|
|
59
|
-
status:needs-review)
|
|
60
|
-
gh pr ready "$PR"
|
|
61
|
-
gh pr edit "$PR" --add-label "status:needs-review" --remove-label "status:wip" --remove-label "status:complete" || true
|
|
62
|
-
;;
|
|
63
|
-
status:wip)
|
|
64
|
-
gh pr edit "$PR" --add-label "status:wip" --remove-label "status:needs-review" --remove-label "status:complete" || true
|
|
65
|
-
;;
|
|
66
|
-
*)
|
|
67
|
-
echo "No action for label: $LABEL" ;;
|
|
68
|
-
esac
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
name: Sync Issue on PR Review
|
|
2
|
-
on:
|
|
3
|
-
pull_request_review:
|
|
4
|
-
types: [submitted]
|
|
5
|
-
|
|
6
|
-
permissions:
|
|
7
|
-
pull-requests: write
|
|
8
|
-
issues: write
|
|
9
|
-
|
|
10
|
-
concurrency:
|
|
11
|
-
group: review-sync-${{ github.event.pull_request.number }}
|
|
12
|
-
cancel-in-progress: true
|
|
13
|
-
|
|
14
|
-
jobs:
|
|
15
|
-
sync-on-review:
|
|
16
|
-
runs-on: ubuntu-latest
|
|
17
|
-
# no job-level `if` — we branch inside the script
|
|
18
|
-
env:
|
|
19
|
-
GH_TOKEN: ${{ secrets.PR_AUTOMATION_TOKEN || secrets.GITHUB_TOKEN }}
|
|
20
|
-
REPO: ${{ github.repository }}
|
|
21
|
-
steps:
|
|
22
|
-
- name: Derive review state, issue number, and branch
|
|
23
|
-
id: vars
|
|
24
|
-
shell: bash
|
|
25
|
-
run: |
|
|
26
|
-
set -euo pipefail
|
|
27
|
-
STATE="${{ github.event.review.state }}"
|
|
28
|
-
BR="${{ github.event.pull_request.head.ref }}" # e.g., feature/26-slug
|
|
29
|
-
ISSUE="$(sed -nE 's#^feature/([0-9]+)-.*#\1#p' <<< "$BR" || true)"
|
|
30
|
-
echo "state=$STATE" >> $GITHUB_OUTPUT
|
|
31
|
-
echo "issue=$ISSUE" >> $GITHUB_OUTPUT
|
|
32
|
-
echo "branch=$BR" >> $GITHUB_OUTPUT
|
|
33
|
-
echo "Detected review state: $STATE; branch: $BR; issue: $ISSUE"
|
|
34
|
-
|
|
35
|
-
- name: Handle review states
|
|
36
|
-
if: steps.vars.outputs.issue != ''
|
|
37
|
-
shell: bash
|
|
38
|
-
env:
|
|
39
|
-
STATE: ${{ steps.vars.outputs.state }}
|
|
40
|
-
ISSUE: ${{ steps.vars.outputs.issue }}
|
|
41
|
-
PRNUM: ${{ github.event.pull_request.number }}
|
|
42
|
-
REPO: ${{ env.REPO }}
|
|
43
|
-
run: |
|
|
44
|
-
set -euo pipefail
|
|
45
|
-
case "$STATE" in
|
|
46
|
-
changes_requested)
|
|
47
|
-
# Flip to WIP
|
|
48
|
-
gh issue edit "$ISSUE" --repo "$REPO" \
|
|
49
|
-
--add-label "status:wip" --remove-label "status:needs-review" --remove-label "status:complete" || true
|
|
50
|
-
gh pr edit "$PRNUM" --repo "$REPO" \
|
|
51
|
-
--add-label "status:wip" --remove-label "status:needs-review" --remove-label "status:complete" || true
|
|
52
|
-
;;
|
|
53
|
-
approved)
|
|
54
|
-
# Flip to Complete
|
|
55
|
-
gh issue edit "$ISSUE" --repo "$REPO" \
|
|
56
|
-
--add-label "status:complete" --remove-label "status:wip" --remove-label "status:needs-review" || true
|
|
57
|
-
gh pr edit "$PRNUM" --repo "$REPO" --add-label "status:complete" --remove-label "status:wip" --remove-label "status:needs-review" || true
|
|
58
|
-
;;
|
|
59
|
-
commented)
|
|
60
|
-
# No-op; comments don't change state
|
|
61
|
-
echo "Review was 'commented' — no state change."
|
|
62
|
-
;;
|
|
63
|
-
*)
|
|
64
|
-
echo "Unknown review state: $STATE"
|
|
65
|
-
;;
|
|
66
|
-
esac
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
// This is a template file to set up MCP servers for dev purposes. Follow these steps
|
|
2
|
-
// 1. Replace <your github pat> with your github personal access token
|
|
3
|
-
// 2. Replace <your context7 api key> with your context7 api key
|
|
4
|
-
// 3. Remove the comments from the file
|
|
5
|
-
//
|
|
6
|
-
// Depending on the coding agent you are using, do the following:
|
|
7
|
-
// Windsurf: Copy this file to .codeium/windsurf/mcp.json (at the user's home directory)
|
|
8
|
-
// Cursor: Copy this file to .cursor/mcp.json
|
|
9
|
-
// Claude: Append the mcpServers object to .claude/settings.json
|
|
10
|
-
|
|
11
|
-
{
|
|
12
|
-
"mcpServers": {
|
|
13
|
-
"git": {
|
|
14
|
-
"command": "npx",
|
|
15
|
-
"args": ["-y", "@cyanheads/git-mcp-server"]
|
|
16
|
-
},
|
|
17
|
-
"github": {
|
|
18
|
-
"url": "https://api.githubcopilot.com/mcp/",
|
|
19
|
-
"headers": {
|
|
20
|
-
"Authorization": "Bearer <your github pat>"
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
"playwright": {
|
|
24
|
-
"command": "npx",
|
|
25
|
-
"args": ["-y", "@playwright/mcp"]
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|