Skip to content
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ test-output
docs/docs.backup.json

.claude/settings.local.json

# FrontMCP development keys (contains private keys - never commit!)
.frontmcp/
/.cache/transformers/Xenova/
/libs/ast-guard/coverage/

Expand Down
45 changes: 45 additions & 0 deletions libs/cli/src/commands/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ async function upsertPackageJson(cwd: string, nameOverride: string | undefined,
build: 'frontmcp build',
inspect: 'frontmcp inspector',
doctor: 'frontmcp doctor',
test: 'frontmcp test',
'test:e2e': 'jest --config jest.e2e.config.ts --runInBand',
},
engines: {
Expand All @@ -72,6 +73,7 @@ async function upsertPackageJson(cwd: string, nameOverride: string | undefined,
'@swc/core': '^1.11.29',
'@swc/jest': '^0.2.37',
jest: '^29.7.0',
'@types/jest': '^29.5.14',
tsx: '^4.20.6',
'@types/node': '^24.0.0',
typescript: '^5.5.3',
Expand All @@ -97,6 +99,7 @@ async function upsertPackageJson(cwd: string, nameOverride: string | undefined,
build: existing.scripts?.build ?? base.scripts.build,
inspect: existing.scripts?.inspect ?? base.scripts.inspect,
doctor: existing.scripts?.doctor ?? base.scripts.doctor,
test: existing.scripts?.test ?? base.scripts.test,
'test:e2e': existing.scripts?.['test:e2e'] ?? base.scripts['test:e2e'],
};

Expand Down Expand Up @@ -207,6 +210,45 @@ test.describe('Server E2E', () => {
});
`;

const TEMPLATE_GITIGNORE = `
# Dependencies
node_modules/

# Build output
dist/
*.tsbuildinfo

# IDE
.idea/
.vscode/
*.swp
*.swo

# OS files
.DS_Store
Thumbs.db

# Logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Environment variables
.env
.env.local
.env.*.local

# FrontMCP development keys (contains private keys - never commit!)
.frontmcp/

# Coverage
coverage/

# Test output
test-output/
`;

const TEMPLATE_JEST_E2E_CONFIG = `
/* eslint-disable */
export default {
Expand Down Expand Up @@ -300,6 +342,9 @@ export async function runCreate(projectArg?: string): Promise<void> {
await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'e2e', 'server.e2e.test.ts'), TEMPLATE_E2E_TEST_TS);
await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'jest.e2e.config.ts'), TEMPLATE_JEST_E2E_CONFIG);

// Git configuration
await scaffoldFileIfMissing(targetDir, path.join(targetDir, '.gitignore'), TEMPLATE_GITIGNORE);

console.log('\nNext steps:');
console.log(` 1) cd ${folder}`);
console.log(' 2) npm install');
Expand Down
2 changes: 1 addition & 1 deletion libs/cli/src/tsconfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export const RECOMMENDED_TSCONFIG = {
sourceMap: true,
outDir: 'dist',
rootDir: 'src',
types: ['node'],
types: ['node', '@types/jest', '@frontmcp/testing'],
},
include: ['src/**/*'],
} as const;
Expand Down
4 changes: 2 additions & 2 deletions libs/sdk/src/auth/flows/well-known.jwks.flow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export default class WellKnownJwksFlow extends FlowBase<typeof name> {

// Orchestrated gateway → serve own JWKS
if (isOrchestrated) {
const keysDoc = jwksSvc.getPublicJwks();
const keysDoc = await jwksSvc.getPublicJwks();
if (!keysDoc?.keys || !Array.isArray(keysDoc.keys)) {
throw new Error('orchestrator jwks not available');
}
Expand All @@ -95,7 +95,7 @@ export default class WellKnownJwksFlow extends FlowBase<typeof name> {
}
} else {
// Public or orchestrated mode - serve local JWKS
const keysDoc = jwksSvc.getPublicJwks();
const keysDoc = await jwksSvc.getPublicJwks();
if (keysDoc?.keys && Array.isArray(keysDoc.keys)) {
this.respond(httpRespond.json(keysDoc));
} else {
Expand Down
Loading
Loading