3// Cron job quotidien - Fromage du jour
4// Configure le timer avec l'icône 🕒 pour exécuter chaque jour
5export async function scheduledHandler() {
6const timestamp = new Date().toISOString();
7console.log(`Fromage du jour exécuté à : ${timestamp}`);
2import { db } from "./db.ts";
34export async function createTables() {
5// Uncomment to reset database
6await db.run(sql`DROP TABLE IF EXISTS messages`);
1export default async function(interval: Interval) {
2try {
3const response = await fetch("https://degensub.vercel.app/users/19", {
sprint-summarizermain.tsx2 matches
1213// Main dashboard handler
14export default async function(req: Request): Promise<Response> {
15try {
16const url = new URL(req.url);
358359<script>{`
360function generateRollup() {
361const start = document.getElementById('rollupStart').value;
362const end = document.getElementById('rollupEnd').value;
commitWebhookmain.tsx10 matches
9899// Extract ticket info from text
100function extractTicketInfo(text: string) {
101const pattern = /\[([bfcr])\]\s+(DOC|ENG|BUG|TECH)-(\d+):\s*(.+?)(?:\n|$)/i;
102const simplePattern = /(DOC|ENG|BUG|TECH)-(\d+)/i;
132133// Verify GitHub webhook signature
134function verifySignature(payload: string, signature: string, secret: string): boolean {
135const hmac = createHmac("sha256", secret);
136hmac.update(payload);
140141// Main webhook handler
142export default async function commitWebhookEnhanced(req: Request): Promise<Response> {
143try {
144const signature = req.headers.get("X-Hub-Signature-256");
194195// Handle push events (commits)
196async function handlePushEvent(data: any) {
197const branch = data.ref?.replace("refs/heads/", "") || "unknown";
198241242// Handle pull request events
243async function handlePullRequestEvent(data: any) {
244const pr = data.pull_request;
245const action = data.action;
287288// Handle issue/PR comments
289async function handleIssueCommentEvent(data: any) {
290const comment = data.comment;
291const issue = data.issue;
328329// Handle PR reviews
330async function handlePullRequestReviewEvent(data: any) {
331const review = data.review;
332const pr = data.pull_request;
359360// Handle PR review comments (inline code comments)
361async function handleReviewCommentEvent(data: any) {
362const comment = data.comment;
363const pr = data.pull_request;
394}
395396// Export query functions for reports
397export async function getEnhancedStats(startDate: string, endDate: string) {
398const stats = {};
399
6const BASE_URL = "https://sprintsummarizer-pdw.web.val.run/api/mcp";
78async function testMCPServer() {
9console.log("Testing MCP Server at:", BASE_URL);
10
sprint-summarizerprDatabase.ts15 matches
1// Database utilities for PR summaries
2// Shared functions for querying and managing PR data
34import { sqlite } from "https://esm.sh/@val-town/sqlite@2.0.1";
4445// Get recent PR summaries
46export async function getRecentSummaries(limit: number = 10): Promise<PRSummary[]> {
47const result = await sqlite.execute({
48sql: `
6162// Get summaries by date range
63export async function getSummariesByDateRange(
64startDate: string,
65endDate: string
8182// Get summaries by deployment status
83export async function getSummariesByStatus(status: string): Promise<PRSummary[]> {
84const result = await sqlite.execute({
85sql: `
9899// Search summaries by text
100export async function searchSummaries(query: string): Promise<PRSummary[]> {
101const searchTerm = `%${query}%`;
102const result = await sqlite.execute({
116117// Get deployment history
118export async function getDeploymentHistory(limit: number = 50): Promise<Deployment[]> {
119const result = await sqlite.execute({
120sql: `
132133// Get statistics for a date range
134export async function getStats(startDate?: string, endDate?: string) {
135let sql = `
136SELECT
156157// Get author statistics
158export async function getAuthorStats(startDate?: string, endDate?: string) {
159let sql = `
160SELECT
180181// Calculate quarter from date
182export function getQuarterFromDate(date: Date): { year: number; quarter: number } {
183const year = date.getFullYear();
184const month = date.getMonth();
188189// Get quarter date range
190export function getQuarterDateRange(year: number, quarter: number) {
191const startMonth = (quarter - 1) * 3;
192const endMonth = startMonth + 2;
202203// Get summaries for a specific quarter
204export async function getQuarterlySummaries(year: number, quarter: number): Promise<PRSummary[]> {
205const { startDate, endDate } = getQuarterDateRange(year, quarter);
206return getSummariesByDateRange(startDate, endDate);
208209// Store quarterly summary
210export async function storeQuarterlySummary(
211year: number,
212quarter: number,
250251// Get all quarterly summaries
252export async function getAllQuarterlySummaries(): Promise<QuarterlySummary[]> {
253const result = await sqlite.execute({
254sql: `
262263// Utility to format date for display
264export function formatDate(dateString: string): string {
265const date = new Date(dateString);
266return date.toLocaleDateString("en-US", {
274275// Get PR velocity (PRs per week)
276export async function getVelocityData(weeks: number = 12) {
277const weeksAgo = new Date();
278weeksAgo.setDate(weeksAgo.getDate() - (weeks * 7));
sprint-summarizerprMCPServer.http.ts6 matches
160161// Execute tool based on request
162async function executeTool(toolName: string, args: any): Promise<any> {
163switch (toolName) {
164case "searchPRs": {
298}
299300// Helper function to calculate trend
301function calculateTrend(weeklyData: Record<string, number>): string {
302const weeks = Object.keys(weeklyData).sort();
303if (weeks.length < 2) return "insufficient_data";
317318// Helper to get ISO week number (Deno-compatible)
319function getWeekNumber(date: Date): string {
320const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
321const dayNum = d.getUTCDay() || 7;
327328// Handle MCP requests
329async function handleMCPRequest(request: MCPRequest): Promise<MCPResponse> {
330try {
331switch (request.method) {
375376// Main HTTP handler for MCP server (Val.town compatible)
377export default async function(req: Request): Promise<Response> {
378// Enhanced CORS headers for browser-based MCP clients
379const corsHeaders = {
sprint-summarizerprAnalytics.http.ts10 matches
2425// Generate AI-powered rollup summary
26async function generateAISummary(
27summaries: any[],
28stats: any,
8889// Fallback manual summary generation
90function createManualSummary(summaries: any[], stats: any): string {
91const topAuthors = summaries.reduce((acc, pr) => {
92acc[pr.pr_author] = (acc[pr.pr_author] || 0) + 1;
115116// Generate quarterly report
117async function generateQuarterlyReport(year: number, quarter: number) {
118const summaries = await getQuarterlySummaries(year, quarter);
119const { startDate, endDate } = getQuarterDateRange(year, quarter);
141142// Extract key features from PR titles and summaries
143function extractKeyFeatures(summaries: any[]): string[] {
144const features = new Set<string>();
145
163164// Calculate velocity trend
165function calculateVelocityTrend(summaries: any[]) {
166// Group by week
167const weeklyData = summaries.reduce((acc, pr) => {
187}
188189// Helper function to get ISO week number
190function getWeekNumber(date: Date): string {
191const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
192const dayNum = d.getUTCDay() || 7;
198199// Helper to get quarter date range
200function getQuarterDateRange(year: number, quarter: number) {
201const startMonth = (quarter - 1) * 3;
202const endMonth = startMonth + 2;
212213// Main HTTP handler for analytics API
214export default async function(req: Request): Promise<Response> {
215const url = new URL(req.url);
216const path = url.pathname.split("/").pop();
324}
325326// Export utility functions for use in other vals
327export { generateAISummary, generateQuarterlyReport, getQuarterDateRange };
sprint-summarizerprWebhook.http.ts5 matches
2930// Initialize database tables
31async function initDatabase() {
32await sqlite.execute(`
33CREATE TABLE IF NOT EXISTS pr_summaries (
7374// Verify HMAC signature from GitHub
75function verifySignature(payload: string, signature: string): boolean {
76if (!WEBHOOK_SECRET) {
77console.warn("No webhook secret configured - skipping signature verification");
9596// Validate timestamp to prevent replay attacks (5 minute window)
97function isTimestampValid(timestamp: string): boolean {
98const webhookTime = new Date(timestamp).getTime();
99const currentTime = Date.now();
104105// Store PR summary in database
106async function storePRSummary(data: PRWebhookPayload) {
107// Determine deployment status from branch if not provided
108const deploymentStatus = data.deployment_status ||
155156// Main webhook handler
157export default async function(req: Request): Promise<Response> {
158try {
159// Only accept POST requests