Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
19b56f4
Add initial wrangler configuration for dashboard
sjoerd2025 Aug 1, 2026
a2b07e5
Add pnpm-no.yaml file
sjoerd2025 Aug 1, 2026
0716329
n nn
sjoerd2025 Aug 1, 2026
f8c3554
Checkpoint from VS Code for cloud agent session
sjoerd2025 Aug 1, 2026
121cd0a
Merge pull request #1 from sjoerd2025/copilot/vscode-msa11sii-n6r7
sjoerd2025 Aug 1, 2026
e25b67a
Refactor package.json scripts and dependencies
sjoerd2025 Aug 1, 2026
87a130f
Initial plan
Copilot Aug 1, 2026
565f603
Initial plan
Copilot Aug 1, 2026
6ee7769
Initial plan
Copilot Aug 1, 2026
c842a51
Add mise.toml: Central tool & task orchestration with CLI toolchain
sjoerd2025 Aug 1, 2026
c2a15be
Add unified dev manager and dashboard workflow
Copilot Aug 1, 2026
a4f7ca3
Add MCP Builder Skill - comprehensive guide for building MCP servers
sjoerd2025 Aug 1, 2026
777e2d7
chore: centralize monorepo tooling and cleanup duplicate lint configs
Copilot Aug 1, 2026
1f2bd1d
Add comprehensive Agent Skills Plan with Mise and Roborev integration
sjoerd2025 Aug 1, 2026
89eb57a
Add comprehensive advanced toolchain setup script (Mise, Roborev, gh-…
sjoerd2025 Aug 1, 2026
65c4f8b
Merge pull request #3 from sjoerd2025/copilot/unified-dev-setup-mcp-s…
sjoerd2025 Aug 1, 2026
ad26d90
Stabilize monorepo setup and unify toolchain config
Copilot Aug 1, 2026
76c10b6
Merge origin/main and resolve package script conflicts
Copilot Aug 1, 2026
2f41f79
Patch axios and ws to non-vulnerable versions
Copilot Aug 1, 2026
44e391c
feat: add miniflare dev mode for unified manager
Copilot Aug 1, 2026
8804853
Merge pull request #2 from sjoerd2025/copilot/improve-build-setup-str…
sjoerd2025 Aug 1, 2026
bed109e
Merge origin/main and resolve package.json conflict
Copilot Aug 1, 2026
a98335a
Resolve merge conflicts with origin/main
Copilot Aug 1, 2026
e7564d3
Merge branch 'main' into copilot/update-cloudflare-configuration
sjoerd2025 Aug 1, 2026
a0a5811
Merge pull request #5 from sjoerd2025/copilot/update-cloudflare-confi…
sjoerd2025 Aug 1, 2026
ad672f3
Refactor app process metadata
Copilot Aug 1, 2026
814e25b
Merge origin/main and resolve conflicts
Copilot Aug 1, 2026
b377069
Start merge conflict resolution
Copilot Aug 1, 2026
50c18c0
Resolve merge conflicts with origin/main
Copilot Aug 1, 2026
fe47d20
Merge pull request #4 from sjoerd2025/copilot/implement-mcp-server-cl…
sjoerd2025 Aug 1, 2026
1d46c05
Merge pull request #6 from sjoerd2025/copilot/contine
sjoerd2025 Aug 1, 2026
893fb46
Add CodeQL analysis workflow
sjoerd2025 Aug 1, 2026
4afc40b
Create SECURITY.md for security policy
sjoerd2025 Aug 1, 2026
2010474
Add GitHub Actions workflow for issue summarization
sjoerd2025 Aug 1, 2026
c18fff7
Add GitHub Actions workflow for Cloud Run deployment
sjoerd2025 Aug 1, 2026
9048dbe
Update .env with Cloudflare and MCP settings
sjoerd2025 Aug 1, 2026
c1d95d6
Remove sensitive data from .env file
sjoerd2025 Aug 1, 2026
54b67ea
Stop tracking .env
sjoerd2025 Aug 1, 2026
ec270b5
Add .env file with environment variables
sjoerd2025 Aug 1, 2026
4a047d3
Update wrangler.jsonc
sjoerd2025 Aug 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Refactor app process metadata
  • Loading branch information
Copilot authored Aug 1, 2026
commit ad672f333fbb7c6bb801889801d934abb85e3b61
54 changes: 44 additions & 10 deletions apps/dev-dashboard/src/apps.mjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import net from 'node:net'

const WRANGLER_DEV_PROCESS = {
appendPort: true,
supportsLocalWranglerDev: true,
}

export const REQUIRED_ENV_VARS = [
'CLOUDFLARE_ACCOUNT_ID',
'CLOUDFLARE_API_TOKEN',
Expand Down Expand Up @@ -36,28 +41,31 @@ export const APPS = [
description: 'Get up-to-date reference information on Cloudflare',
features: ['Cloudflare docs search', 'Reference lookups'],
command: ['pnpm', ['--dir', 'apps/docs-ai-search', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8801,
},
{
name: 'workers-bindings',
description: 'Build Workers applications with storage, AI, and compute primitives',
features: ['Workers bindings guidance', 'Storage + AI primitives'],
command: ['pnpm', ['--dir', 'apps/workers-bindings', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8802,
},
{
name: 'workers-builds',
description: 'Get insights and manage your Cloudflare Workers Builds',
features: ['Build history', 'Build status and diagnostics'],
command: ['pnpm', ['--dir', 'apps/workers-builds', 'dev', '--']],
processOptions: [{ appendPort: true, strictPort: true }],
defaultPort: 8803,
portFlag: '--port',
},
{
name: 'workers-observability',
description: "Debug and inspect your application's logs and analytics",
features: ['Logs analytics', 'Application observability'],
command: ['pnpm', ['--dir', 'apps/workers-observability', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8804,
},
{
Expand All @@ -68,97 +76,111 @@ export const APPS = [
['pnpm', ['--dir', 'apps/sandbox-container', 'exec', 'tsx', 'container/sandbox.container.app.ts']],
['pnpm', ['--dir', 'apps/sandbox-container', 'exec', 'wrangler', 'dev', '--var', 'ENVIRONMENT:dev']],
],
processOptions: [{}, WRANGLER_DEV_PROCESS],
defaultPort: 8805,
},
{
name: 'browser-rendering',
description: 'Fetch web pages, convert to markdown, and take screenshots',
features: ['Web fetch', 'Screenshots and rendering'],
command: ['pnpm', ['--dir', 'apps/browser-rendering', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8806,
},
{
name: 'logpush',
description: 'Get quick summaries for Logpush job health',
features: ['Logpush health checks', 'Job summaries'],
command: ['pnpm', ['--dir', 'apps/logpush', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8807,
},
{
name: 'ai-gateway',
description: 'Search logs and inspect prompts/responses',
features: ['Prompt analytics', 'Gateway usage inspection'],
command: ['pnpm', ['--dir', 'apps/ai-gateway', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8808,
},
{
name: 'autorag',
description: 'Search and query account AutoRAG instances',
features: ['AutoRAG discovery', 'AutoRAG query tools'],
command: ['pnpm', ['--dir', 'apps/autorag', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8809,
},
{
name: 'auditlogs',
description: 'Query audit logs and generate review reports',
features: ['Audit log queries', 'Compliance report support'],
command: ['pnpm', ['--dir', 'apps/auditlogs', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8810,
},
{
name: 'dns-analytics',
description: 'Optimize DNS performance and debug setup issues',
features: ['DNS analytics', 'Performance diagnostics'],
command: ['pnpm', ['--dir', 'apps/dns-analytics', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8811,
},
{
name: 'dex-analysis',
description: 'Insights on critical application user experience',
features: ['Digital experience insights', 'Application health trends'],
command: ['pnpm', ['--dir', 'apps/dex-analysis', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8812,
},
{
name: 'cloudflare-one-casb',
description: 'Identify SaaS security misconfigurations',
features: ['CASB posture checks', 'SaaS security insights'],
command: ['pnpm', ['--dir', 'apps/cloudflare-one-casb', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8813,
},
{
name: 'radar',
description: 'Explore Cloudflare Radar internet insights',
features: ['Internet trend data', 'Radar analytics'],
command: ['pnpm', ['--dir', 'apps/radar', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8814,
},
{
name: 'cloudflare-blog',
description: 'Search and read Cloudflare Blog posts',
features: ['Blog search', 'Article retrieval'],
command: ['pnpm', ['--dir', 'apps/cloudflare-blog', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8815,
},
{
name: 'demo-day',
description: 'Demonstrate a minimal Cloudflare MCP server',
features: ['Minimal MCP example', 'Local demo workflows'],
command: ['pnpm', ['--dir', 'apps/demo-day', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8816,
},
{
name: 'graphql',
description: 'Cloudflare GraphQL analytics access',
features: ['GraphQL analytics tools', 'Query assistance'],
command: ['pnpm', ['--dir', 'apps/graphql', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8817,
},
{
name: 'stack-mcp',
description: 'Unified tool access across Cloudflare product domains',
features: ['Unified MCP surface', 'Cross-domain tools'],
command: ['pnpm', ['--dir', 'apps/stack-mcp', 'exec', 'wrangler', 'dev']],
processOptions: [WRANGLER_DEV_PROCESS],
defaultPort: 8818,
},
]
Expand All @@ -180,19 +202,31 @@ export function parseDotEnv(content) {
return output
}

export function createAppProcesses(app, port) {
function normalizeCreateAppProcessOptions(options = {}) {
const { wranglerDevMode = 'default', ...unexpected } = options
const unexpectedKeys = Object.keys(unexpected)
if (unexpectedKeys.length > 0) {
throw new TypeError(`Unsupported createAppProcesses options: ${unexpectedKeys.join(', ')}`)
}
if (!['default', 'local'].includes(wranglerDevMode)) {
throw new TypeError(`Unsupported wranglerDevMode: ${wranglerDevMode}`)
}
return { wranglerDevMode }
}

export function createAppProcesses(app, port, options = {}) {
const { wranglerDevMode } = normalizeCreateAppProcessOptions(options)
const commands = app.multiCommand ?? [app.command]
return commands.map((entry, index) => {
const [command, args] = entry
const baseArgs = [...args]
if (command === 'pnpm') {
if (app.name === 'workers-builds') {
baseArgs.push('--port', String(port), '--strictPort')
} else if (app.name === 'sandbox-container') {
if (index === 1) baseArgs.push('--port', String(port))
} else {
baseArgs.push('--port', String(port))
}
const processOptions = app.processOptions?.[index] ?? {}
if (command === 'pnpm' && processOptions.appendPort) {
baseArgs.push('--port', String(port))
if (processOptions.strictPort) baseArgs.push('--strictPort')
}
if (processOptions.supportsLocalWranglerDev && wranglerDevMode === 'local') {
baseArgs.push('--local')
}
return [command, baseArgs]
})
Expand Down
39 changes: 38 additions & 1 deletion apps/dev-dashboard/src/apps.test.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import assert from 'node:assert/strict'
import { describe, it } from 'node:test'

import { assignPorts, parseDotEnv } from './apps.mjs'
import { assignPorts, createAppProcesses, parseDotEnv } from './apps.mjs'

describe('assignPorts', () => {
it('allocates unique ports and bumps occupied ports', async () => {
Expand All @@ -25,3 +25,40 @@ describe('parseDotEnv', () => {
assert.deepEqual(env, { A: '1', B: 'two', C: 'three' })
})
})

describe('createAppProcesses', () => {
it('uses per-process metadata for port and local wrangler args', () => {
const app = {
name: 'sandbox-container',
multiCommand: [
['pnpm', ['--dir', 'apps/sandbox-container', 'exec', 'tsx', 'container/sandbox.container.app.ts']],
['pnpm', ['--dir', 'apps/sandbox-container', 'exec', 'wrangler', 'dev', '--var', 'ENVIRONMENT:dev']],
],
processOptions: [{}, { appendPort: true, supportsLocalWranglerDev: true }],
}

assert.deepEqual(createAppProcesses(app, 8805, { wranglerDevMode: 'local' }), [
['pnpm', ['--dir', 'apps/sandbox-container', 'exec', 'tsx', 'container/sandbox.container.app.ts']],
['pnpm', ['--dir', 'apps/sandbox-container', 'exec', 'wrangler', 'dev', '--var', 'ENVIRONMENT:dev', '--port', '8805', '--local']],
])
})

it('supports strict port injection without wrangler-local args', () => {
const app = {
name: 'workers-builds',
command: ['pnpm', ['--dir', 'apps/workers-builds', 'dev', '--']],
processOptions: [{ appendPort: true, strictPort: true }],
}

assert.deepEqual(createAppProcesses(app, 8803, { wranglerDevMode: 'local' }), [
['pnpm', ['--dir', 'apps/workers-builds', 'dev', '--', '--port', '8803', '--strictPort']],
])
})

it('rejects unsupported options', () => {
assert.throws(() => createAppProcesses({ command: ['pnpm', []] }, 8801, { useMiniflare: true }), {
name: 'TypeError',
message: 'Unsupported createAppProcesses options: useMiniflare',
})
})
})
2 changes: 1 addition & 1 deletion scripts/dev-manager.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ async function startApp(app) {
const state = states.get(app.name)
if (state) states.set(app.name, { ...state, status: 'starting' })

const commands = createAppProcesses(app, app.port)
const commands = createAppProcesses(app, app.port, { wranglerDevMode: 'local' })
const children = commands.map(([command, commandArgs], index) => spawnProcess(app.name, command, commandArgs, index))
appChildren.set(app.name, children)
}
Expand Down