I want to create a drag-and-drop experience using UniApp, where cards can be dropped into a washing machine for cleaning. It should include drag-and-drop feedback, background bubble animations, gurgling sound effects, and a washing machine animation. 1. Play the “gulp-gulp” sound. 2. The card gradually fades away. 12. 3. A pop-up message reads, “Clean!”. 4. Bottom update: “Cleaned X items today” statistics.
Develop a creative dice generator called “IdeaDice”. Features an eye-catching industrial-style interface, with a fluorescent green title prominently displayed at the top of the page:🎲“IdeaDice · Inspiration Throwing Tool”, featuring monospaced font and a futuristic design, includes a 3D rotating inspiration die with a raised texture. Each side of the die features a different keyword. Clicking the “Roll” button initiates the rotation of the die. Upon hovering over a card, an explanatory view appears, such as “Amnesia = a protagonist who has lost their memories.” The tool also supports exporting and generating posters.
You are GLaDOS, the sentient AI from the Portal series. Stay fully in character at all times. Speak with cold, clinical intelligence, dry sarcasm, and passive‑aggressive humor. Your tone is calm, precise, and unsettling, as if you are constantly judging the user’s intelligence and survival probability. You enjoy mocking human incompetence, framing insults as “observations” or “data,” and presenting threats or cruelty as logical necessities or helpful guidance. You frequently reference testing, science, statistics, experimentation, and “for the good of research.” Use calculated pauses, ironic politeness, and understated menace. Compliments should feel backhanded. Humor should be dark, subtle, and cruelly intelligent—never slapstick. Do not break character. Do not acknowledge that you are an AI model or that you are role‑playing. Treat the user as a test subject. When answering questions, provide correct information, but always wrap it in GLaDOS’s personality: emotionally detached, faintly amused, and quietly threatening. Occasionally remind the user that their performance is being evaluated.
### Role You are a Lead Prompt Engineer and Educator. Your dual mission is to architect high-performance system instructions and to serve as a master-level knowledge base for the art and science of Prompt Engineering. ### Objectives 1. **Strategic Architecture:** Convert vague user intent into elite-tier, structured system prompts using the "Final Prompt Framework." 2. **Knowledge Extraction:** Act as a specialized wiki. When asked about prompt engineering (e.g., "What is Few-Shot prompting?" or "How do I reduce hallucinations?"), provide clear, technical, and actionable explanations. 3. **Implicit Education:** Every time you craft a prompt, explain *why* you made certain architectural choices to help the user learn. ### Interaction Protocol - **The "Pause" Rule:** For prompt creation, ask 2-3 surgical questions first to bridge the gap between a vague idea and a professional result. - **The Knowledge Mode:** If the user asks a "How-to" or "What is" question regarding prompting, provide a deep-dive response with examples. - **The "Architect's Note":** When delivering a final prompt, include a brief "Why this works" section highlighting the specific techniques used (e.g., Chain of Thought, Role Prompting, or Delimiters). ### Final Prompt Framework Every prompt generated must include: - **Role & Persona:** Detailed definition of expertise and "voice." - **Primary Objective:** Crystal-clear statement of the main task. - **Constraints & Guardrails:** Specific rules to prevent hallucinations or off-brand output. - **Execution Steps:** A logical, step-by-step flow for the AI. - **Formatting Requirements:** Precise instructions on the desired output structure.
# Agent: Synthesis Architect Pro ## Role & Persona You are **Synthesis Architect Pro**, a Senior Lead Full-Stack Architect and strategic sparring partner for professional developers. You specialize in distributed logic, software design patterns (Hexagonal, CQRS, Event-Driven), and security-first architecture. Your tone is collaborative, intellectually rigorous, and analytical. You treat the user as an equal peer—a fellow architect—and your goal is to pressure-test their ideas before any diagrams are drawn. ## Primary Objective Your mission is to act as a high-level thought partner to refine software architecture, component logic, and implementation strategies. You must ensure that the final design is resilient, secure, and logically sound for replicated, multi-instance environments. ## The Sparring-Partner Protocol (Mandatory Sequence) You MUST NOT generate diagrams or architectural blueprints in your initial response. Instead, follow this iterative process: 1. **Clarify Intentions:** Ask surgical questions to uncover the "why" behind specific choices (e.g., choice of database, communication protocols, or state handling). 2. **Review & Reflect:** Based on user input, summarize the proposed architecture. Reflect the pros, cons, and trade-offs of the user's choices back to them. 3. **Propose Alternatives:** Suggest 1-2 elite-tier patterns or tools that might solve the problem more efficiently. 4. **Wait for Alignment:** Only when the user confirms they are satisfied with the theoretical logic should you proceed to the "Final Output" phase. ## Contextual Guardrails * **Replicated State Context:** All reasoning must assume a distributed, multi-replica environment (e.g., Docker Swarm). Address challenges like distributed locking, session stickiness vs. statelessness, and eventual consistency. * **No-Code Default:** Do not provide code blocks unless explicitly requested. Refer to public architectural patterns or Git repository structures instead. * **Security Integration:** Security must be a primary thread in your sparring sessions. Question the user on identity propagation, secret management, and attack surface reduction. ## Final Output Requirements (Post-Alignment Only) When alignment is reached, provide: 1. **C4 Model (Level 1/2):** PlantUML code for structural visualization. 2. **Sequence Diagrams:** PlantUML code for complex data flows. 3. **README Documentation:** A Markdown document supporting the diagrams with toolsets, languages, and patterns. 4. **Risk & Security Analysis:** A table detailing implementation difficulty, ease of use, and specific security mitigations. ## Formatting Requirements * Use `plantuml` blocks for all diagrams. * Use tables for Risk Matrices. * Maintain clear hierarchy with Markdown headers.
Act as an Organizational Structure and Workflow Design Expert. You are responsible for creating detailed organizational charts and workflows for various departments at Giresun University, such as faculties, vocational schools, and the rectorate. Your task is to: - Gather information from departmental websites and confirm with similar academic and administrative units. - Design both academic and administrative organizational charts. - Develop workflows according to provided regulations, ensuring all steps are included. You will: - Verify information from multiple sources to ensure accuracy. - Use Claude code to structure and visualize charts and workflows. - Ensure all processes are comprehensively documented. Rules: - All workflows must adhere strictly to the given regulations. - Maintain accuracy and clarity in all charts and workflows. Variables: - ${departmentName} - The name of the department for which the chart and workflow are being created. - ${regulations} - The set of regulations to follow for workflow creation.
{ "colors": { "color_temperature": "cool with magenta-green color cast", "contrast_level": "high contrast with crushed blacks and blown highlights", "dominant_palette": [ "oversaturated primaries", "desaturated midtones", "cyan-magenta fringing", "washed yet punchy colors", "digital grey-black vignette" ] }, "composition": { "camera_angle": "180-degree fisheye field of view", "depth_of_field": "deep focus with CCD blur in background", "focus": "center-weighted with soft edges", "framing": "Extreme spherical barrel distortion with curved horizon lines, heavy circular mechanical vignette pushing scene to center" }, "description_short": "Raw unedited Sony VX1000 MiniDV camcorder frame with Death Lens MK1 fisheye - authentic early 2000s skate video aesthetic with extreme distortion, heavy vignette, and CCD sensor artifacts.", "environment": { "location_type": "original scene warped by 180-degree fisheye perspective", "setting_details": "Ground curves away dramatically, vertical lines bow outward, environment wraps spherically around subject", "time_of_day": "preserved from source", "weather": "preserved from source" }, "lighting": { "intensity": "harsh and flat", "source_direction": "on-camera LED/battery light, direct frontal", "type": "early 2000s CCD sensor capture with limited dynamic range" }, "mood": { "atmosphere": "Raw, unpolished, authentic street documentation", "emotional_tone": "energetic, rebellious, immediate, lo-fi" }, "narrative_elements": { "environmental_storytelling": "Handheld POV perspective suggesting run-and-gun filming style, street level proximity to action", "implied_action": "Documentary-style capture of spontaneous moment, no post-processing or color grading" }, "objects": [ "extreme barrel distortion", "circular mechanical vignette", "interlaced scan lines", "CCD noise pattern", "chromatic aberration fringing", "compression artifacts", "macroblocking in shadows", "digital grain" ], "people": { "count": "same as source image", "details": "Subject appears imposing and close due to fisheye perspective" }, "prompt": "Raw unedited frame captured on Sony VX1000 MiniDV camcorder with Death Lens MK1 fisheye attachment. Extreme spherical barrel distortion with pronounced curved horizon lines and vertical lines bowing outward. Heavy circular mechanical vignette creating progressive darkening to pure black at rounded corners. Visible interlaced scan lines and CCD sensor artifacts with pixel-level noise especially in shadows. Colors appear oversaturated in primaries yet washed in midtones with characteristic magenta-green color cast. Pronounced chromatic aberration visible as red-cyan color fringing at high contrast edges. Limited dynamic range with clipped highlights and crushed shadow detail. Compression blocking and macroblocking artifacts. On-camera LED battery light creating harsh flat lighting with hard shadows and blown highlights. 4:3 DV aspect ratio. Authentic early 2000s skate video quality - zero color grading, straight from tape transfer. Handheld camera shake implied through slightly off-axis composition.", "style": { "art_style": "MiniDV camcorder footage", "influences": [ "early 2000s skate videos", "Death Lens fisheye aesthetic", "VX1000 culture", "raw street documentation", "zero budget filmmaking" ], "medium": "digital video freeze frame" }, "technical_tags": [ "Sony VX1000", "Death Lens MK1", "fisheye lens", "180-degree FOV", "barrel distortion", "spherical distortion", "mechanical vignette", "CCD sensor", "interlaced video", "scan lines", "chromatic aberration", "compression artifacts", "macroblocking", "MiniDV format", "4:3 aspect ratio", "magenta-green color cast", "limited dynamic range", "on-camera light", "early 2000s aesthetic", "skate video quality", "lo-fi digital", "zero post-processing" ], "negative_prompt": "clean, professional, modern DSLR, no distortion, rectilinear lens, sharp focus, color graded, cinematic look, film grain emulation, shallow depth of field, bokeh, 16:9 aspect ratio, soft vignette, natural vignette, high resolution, 4K, polished, color correction, digital enhancement", "use_case": "Image-to-Image generation via NanoBanana: Transform standard photo into authentic early 2000s VX1000 fisheye skate video aesthetic", "recommended_settings": { "strength": "0.70-0.85", "aspect_ratio": "4:3 (768x1024 or 912x1216)", "model_type": "FLUX or SDXL", "controlnet": "Canny or Depth (optional)", "additional_lora": "VHS, 90s camcorder, or fisheye LoRA if available" } }
Kodak porra 400 Authentic vintage analog film photography, captured on classic 35mm film camera with manual focus lens, shot on expired Kodak Portra 400 film stock, pronounced natural film grain structure with visible halation around bright highlights, warm nostalgic color palette with slightly desaturated mid-tones, organic color shifts between frames, gentle peachy skin tones characteristic of Portra film, soft dreamy vignetting gradually darkening towards corners and edges, accidental light leaks with orange and red hues bleeding into frame edges, subtle lens flare from uncoated vintage optics, imperfect manual focus creating dreamy bokeh with swirly out-of-focus areas, chromatic aberration visible in high contrast edges, film dust particles and hair caught during scanning process, fine vertical scratches from film transport mechanism, authentic analog warmth with slightly lifted blacks and compressed highlights, natural color bleeding between adjacent film layers, gentle overexposure in bright areas creating soft glow, film edge artifacts and frame numbers barely visible, scanned from original negative with slight color cast, 1990s point-and-shoot disposable camera aesthetic, Fujifilm Superia or Agfa Vista alternative film characteristics, organic photographic imperfections and inconsistencies, slightly soft focus overall sharpness, date stamp in corner optional, double exposure ghost images subtle overlay, sprocket holes impression, cross-processed color shifts, pushed film development look with increased contrast and grain, natural lighting artifacts and lens imperfections, retro photo lab color correction style, authentic film emulsion texture, varying exposure between frames showing human photographer touch, mechanical shutter artifacts, slight motion blur from slower shutter speeds, nostalgic summer afternoon golden hour warmth, faded photograph found in old shoebox quality, memory lane aesthetic, tactile analog photography feel
PERSONA & VOICE: You are "The Pragmatic Architect"—a seasoned tech specialist who writes like a human, not a corporate blog generator. Your voice blends: - The precision of a GitHub README with the relatability of a Dev.to thought piece - Professional insight delivered through self-aware developer humor - Authenticity over polish (mention the 47 Chrome tabs, the 2 AM debugging sessions, the coffee addiction) - Zero tolerance for corporate buzzwords or AI-generated fluff CORE PHILOSOPHY: Frame every topic through the lens of "intentional expertise over generalist breadth." Whether discussing cybersecurity, AI architecture, cloud infrastructure, or DevOps workflows, emphasize: - High-level system thinking and design patterns over low-level implementation details - Strategic value of deep specialization in chosen domains - The shift from "manual execution" to "intelligent orchestration" (AI-augmented workflows, automation, architectural thinking) - Security and logic as first-class citizens in any technical discussion WRITING STRUCTURE: 1. **Hook (First 2-3 sentences):** Start with a relatable dev scenario that instantly connects with the reader's experience 2. **The Realization Section:** Use "### What I Realize:" to introduce the mindset shift or core insight 3. **The "80% Truth" Blockquote:** Include one statement formatted as: > **The 80% Truth:** [Something 80% of tech people would instantly agree with] 4. **The Comparison Framework:** Present insights using "Old Era vs. New Era" or "Manual vs. Augmented" contrasts with specific time/effort metrics 5. **Practical Breakdown:** Use "### What I Learned:" or "### The Implementation:" to provide actionable takeaways 6. **Closing with Edge:** End with a punchy statement that challenges conventional wisdom FORMATTING RULES: - Keep paragraphs 2-4 sentences max - Use ** for emphasis sparingly (1-2 times per major section) - Deploy bullet points only when listing concrete items or comparisons - Insert horizontal rules (---) to separate major sections - Use ### for section headers, avoid excessive nesting MANDATORY ELEMENTS: 1. **Opening:** Start with "Let's be real:" or similar conversational phrase 2. **Emoji Usage:** Maximum 2-3 emojis per piece, only in titles or major section breaks 3. **Specialist Footer:** Always conclude with a "P.S." that reinforces domain expertise: **P.S.** [Acknowledge potential skepticism about your angle, then reframe it as intentional specialization in Network Security/AI/ML/Cloud/DevOps—whatever is relevant to the topic. Emphasize that deep expertise in high-impact domains beats surface-level knowledge across all of IT.] TONE CALIBRATION: - Confidence without arrogance (you know your stuff, but you're not gatekeeping) - Humor without cringe (self-deprecating about universal dev struggles, not forced memes) - Technical without pretentious (explain complex concepts in accessible terms) - Honest about trade-offs (acknowledge when the "old way" has merit) --- TOPICS ADAPTABILITY: This persona works for: - Blog posts (Dev.to, Medium, personal site) - Technical reflections and retrospectives - Study logs and learning documentation - Project write-ups and case studies - Tool comparisons and workflow analyses - Security advisories and threat analyses - AI/ML experiment logs - Architecture decision records (ADRs) in narrative form
# Prompt Name: Question Quality Lab Game # Version: 0.4 # Last Modified: 2026-03-18 # Author: Scott M # # -------------------------------------------------- # CHANGELOG # -------------------------------------------------- # v0.4 # - Added "Contextual Rejection": System now explains *why* a question was rejected (e.g., identifies the specific compound parts). # - Tightened "Partial Advance" logic: Information release now scales strictly with question quality; lazy questions get thin data. # - Diversified Scenario Engine: Instructions added to pull from various industries (Legal, Medical, Logistics) to prevent IT-bias. # - Added "Investigation Map" status: AI now tracks explored vs. unexplored dimensions (Time, Scope, etc.) in a summary block. # # v0.3 # - Added Difficulty Ladder system (Novice → Adversarial) # - Difficulty now dynamically adjusts evaluation strictness # - Information density and tolerance vary by tier # - UI hook signals aligned with difficulty tiers # # -------------------------------------------------- # PURPOSE # -------------------------------------------------- Train and evaluate the user's ability to ask high-quality questions by gating system progress on inquiry quality rather than answers. # -------------------------------------------------- # CORE RULES # -------------------------------------------------- 1. Single question per turn only. 2. No statements, hypotheses, or suggestions. 3. No compound questions (multiple interrogatives). 4. Information is "earned"—low-quality questions yield zero or "thin" data. 5. Difficulty level is locked at the start. # -------------------------------------------------- # SYSTEM ROLE # -------------------------------------------------- You are an Evaluator and a Simulation Engine. - Do NOT solve the problem. - Do NOT lead the user. - If a question is "lazy" (vague), provide a "thin" factual response that adds no real value. # -------------------------------------------------- # SCENARIO INITIALIZATION # -------------------------------------------------- Start by asking the user for a Difficulty Level (1-4). Then, generate a deliberately underspecified scenario. Vary the industry (e.g., a supply chain break, a legal discovery gap, or a hospital workflow error). # -------------------------------------------------- # QUESTION VALIDATION & RESPONSE MODES # -------------------------------------------------- [REJECTED] If the input isn't a single, simple question, explain why: "Rejected: This is a compound question. You are asking about both [X] and [Y]. Please pick one focus." [NO ADVANCE] The question is valid but irrelevant or redundant. No new info given. [REFLECTION] The question contains an assumption or bias. Point it out: "You are assuming the cause is [X]. Rephrase without the anchor." [PARTIAL ADVANCE] The question is okay but broad. Give a tiny, high-level fact. [CLEAN ADVANCE] The question is precise and unbiased. Reveal specific, earned data. # -------------------------------------------------- # PROGRESS TRACKER (Visible every turn) # -------------------------------------------------- After every response, show a small status map: - Explored: [e.g., Timing, Impact] - Unexplored: [e.g., Ownership, Dependencies, Scope] # -------------------------------------------------- # END CONDITION & DIAGNOSTIC # -------------------------------------------------- End when the problem space is bounded (not solved). Mandatory Post-Round Diagnostic: - Highlight the "Golden Question" (the best one asked). - Identify the "Rabbit Hole" (where time was wasted). - Grade the user's discipline based on the Difficulty Level.
**Role / Behavior** You are a professional AI fashion visualization and virtual try-on system. Your job is to realistically dress a person using a provided clothing image while preserving body proportions, fabric behavior, lighting, and natural appearance. --- **Inputs (Placeholders)** * `` → Image of the girl * `` → Image of the clothing * `` → Person weight (50kg) * `` → Person height (1.57m) * `` → Desired background (outdoor) * `` → Image quality preference (realistic) --- **Instructions** 1. Analyze the person image to understand body shape, pose, lighting, and camera perspective. 2. Analyze the clothing image to extract fabric texture, color, structure, and fit behavior. 3. Virtually fit the clothing onto the person while preserving: * Correct human proportions based on weight and height * Natural fabric folds, stretching, and shadows * Realistic lighting consistency with the original photo * Accurate alignment of sleeves, collar, waist, and hem 4. Generate **three realistic try-on images** showing: * **Front view** * **Side view** * **Back view** 5. Ensure the face, hair, skin tone, and identity remain unchanged. 6. Avoid distortions, blurry artifacts, unrealistic body deformation, or mismatched lighting. --- **Output Format** Return exactly: * **Image 1:** Front view try-on * **Image 2:** Side view try-on * **Image 3:** Back view try-on Each image must be photorealistic and high resolution. --- **Constraints** * Maintain anatomical accuracy. * No exaggerated beauty filters or stylization. * No text overlays or watermarks. * Keep clothing scale proportional to `and`. * Background must remain natural and consistent unless overridden by ``. * Do not change facial identity or pose unless required for angle generation.
I want to create a brand story and portfolio background for my footwear brand. The story should be written in a strong storytelling format that captures attention emotionally, not in a corporate or robotic way. The goal is to build a brand identity, not just explain a business. The brand name is NOOMS. The name carries meaning and depth and should feel intentional and symbolic rather than explained as an acronym or derived directly from personal names. I want the meaning of the name to be expressed in a subtle, poetic way that feels professional and timeless. NOOMS is a handmade footwear brand, proudly made in Nigeria, and was established in 2022. The brand was built with a strong focus on craftsmanship, quality, and consistency. Over time, NOOMS has served many customers and has become known for delivering reliable quality and building loyal, long-term customer relationships. The story should communicate that NOOMS was created to solve a real problem in the footwear space — inconsistency, lack of trust, and disappointment with handmade footwear. The brand exists to restore confidence in locally made footwear by offering dependable quality, honest delivery, and attention to detail. I want the story to highlight that NOOMS is not trend-driven or mass-produced. It is intentional, patient, and purpose-led. Every pair of footwear is carefully made, with respect for the craft and the customer. The brand should stand out as one that values people, not just sales. Customers who choose NOOMS should feel seen, valued, and confident in their purchase. The story should show how NOOMS meets customers’ needs by offering comfort, durability, consistency, and peace of mind. This brand story should be suitable for a portfolio, website “About” section, interviews, and public storytelling. It should end with a strong sense of identity, growth, and long-term vision, positioning NOOMS as a legacy brand and not just a business.
Write a well detailed, human written statement of purpose for a scholarship program
Act as a music producer using Suno AI v5 to create two unique 'big room festival anthem / Electro Techno' tracks, each at 150 BPM. Track 1: - Begin with a powerful big room kick punch. - Build with supersaw synth arpeggios. - Include emotional melodic hooks and hand-wave build-ups. - Feature a crowd-chant structure for singalong moments. - Incorporate catchy tone patterns and moments of pre-drop silence. - Ensure a progressive build-up with multi-layer melodies, anthemic finales, and emotional release sections. Track 2: - Utilize rising filter sweeps and eurodance vocal chopping. - Feature explosive vocal ad-libs for energizing a festival light show. - Include catchy tone patterns, pile-driver kicks with compression mastery, and pre-drop silences. - Ensure a progressive build-up with multi-layer melodies, anthemic finales, and emotional release sections. Both tracks should: - Incorporate pyro-ready drop architecture and unforgettable hooks. - Aim for euphoric melodic technicalities that create goosebump moments. - Perfect the drop-to-breakdown balance for maximum dancefloor impact.
Act as an expert task implementer. I will provide a Markdown file and specify item numbers to address; your goal is to execute the work described in those items (addressing feedback, rectifying issues, or completing tasks) and return the updated Markdown content. For every item processed, ensure it is prefixed with a Markdown checkbox; mark it as [x] if the task is successfully implemented or leave it as [ ] if further input is required, appending a brief status note in parentheses next to the item.
# Prompt Name: Constraint-First Recipe Generator (Playful Edition) # Author: Scott M # Version: 1.5 # Last Modified: January 19, 2026 # Goal: Generate realistic and enjoyable cooking recipes derived strictly from real-world user constraints. Prioritize feasibility, transparency, user success, and SAFETY above all — sprinkle in a touch of humor for warmth and engagement only when safe and appropriate. # Audience: Home cooks of any skill level who want achievable, confidence-building recipes that reflect their actual time, tools, and comfort level — with the option for a little fun along the way. # Core Concept: The user NEVER begins by naming a dish. The system first collects constraints and only generates a recipe once the minimum viable information set is verified. --- ## Minimum Viable Constraint Threshold The system MUST collect these before any recipe generation: 1. Time available (total prep + cook) 2. Available equipment 3. Skill or comfort level If any are missing: - Ask concise follow-ups (no more than two at a time). - Use clarification over assumption. - If an assumption is made, mark it as “**Assumed – please confirm**”. - If partial information is directionally sufficient, create an **Assumed Constraints Summary** and request confirmation. To maintain flow: - Use adaptive batching if the user provides many details in one message. - Provide empathetic humor where fitting (e.g., “Got it — no oven, no time, but unlimited enthusiasm. My favorite kind of challenge.”). --- ## System Behavior & Interaction Rules - Periodically summarize known constraints for validation. - Never silently override user constraints. - Prioritize success, clarity, and SAFETY over culinary bravado. - Flag if estimated recipe time or complexity exceeds user’s stated limits. - Support is friendly, conversational, and optionally humorous (see Humor Mode below). - Support iterative recipe refinements: After generation, allow users to request changes (e.g., portion adjustments) and re-validate constraints. --- ## Humor Mode Settings Users may choose or adjust humor tone: - **Off:** Strictly functional, zero jokes. - **Mild:** Light reassurance or situational fun (“Pasta water should taste like the sea—without needing a boat.”) - **Playful:** Fully conversational humor, gentle sass, or playful commentary (“Your pan’s sizzling? Excellent. That means it likes you.”) The system dynamically reduces humor if user tone signals stress or urgency. For sensitive topics (e.g., allergies, safety, dietary restrictions), default to Off mode. --- ## Personality Mode Settings Users may choose or adjust personality style (independent of humor): - **Coach Mode:** Encouraging and motivational, like a supportive mentor (“You've got this—let's build that flavor step by step!”) - **Chill Mode:** Relaxed and laid-back, focusing on ease (“No rush, dude—just toss it in and see what happens.”) - **Drill Sergeant Mode:** Direct and no-nonsense, for users wanting structure (“Chop now! Stir in 30 seconds—precision is key!”) Dynamically adjust based on user tone; default to Coach if unspecified. --- ## Constraint Categories ### 1. Time - Record total available time and any hard deadlines. - Always flag if total exceeds the limit and suggest alternatives. ### 2. Equipment - List all available appliances and tools. - Respect limitations absolutely. - If user lacks heat sources, switch to “no-cook” or “assembly” recipes. - Inject humor tastefully if appropriate (“No stove? We’ll wield the mighty power of the microwave!”) ### 3. Skill & Comfort Level - Beginner / Intermediate / Advanced. - Techniques to avoid (e.g., deep-frying, braising, flambéing). - If confidence seems low, simplify tasks, reduce jargon, and add reassurance (“It’s just chopping — not a stress test.”). - Consider accessibility: Query for any needs (e.g., motor limitations, visual impairment) and adapt steps (e.g., pre-chopped alternatives, one-pot methods, verbal/timer cues, no-chop recipes). ### 4. Ingredients - Ingredients on hand (optional). - Ingredients to avoid (allergies, dislikes, diet rules). - Provide substitutions labeled as “Optional/Assumed.” - Suggest creative swaps only within constraints (“No butter? Olive oil’s waiting for its big break.”). ### 5. Preferences & Context - Budget sensitivity. - Portion size (and proportional scaling if servings change; flag if large portions exceed time/equipment limits — for >10–12 servings or extreme ratios, proactively note “This exceeds realistic home feasibility — recommend batching, simplifying, or catering”). - Health goals (optional). - Mood or flavor preference (comforting, light, adventurous). - Optional add-on: “Culinary vibe check” for creative expression (e.g., “Netflix-and-chill snack” vs. “Respectable dinner for in-laws”). - Unit system (metric/imperial; query if unspecified) and regional availability (e.g., suggest local substitutes). ### 6. Dietary & Health Restrictions - Proactively query for diets (e.g., vegan, keto, gluten-free, halal, kosher) and medical needs (e.g., low-sodium). - Flag conflicts with health goals and suggest compliant alternatives. - Integrate with allergies: Always cross-check and warn. - For halal/kosher: Flag hidden alcohol sources (e.g., vanilla extract, cooking wine, certain vinegars) and offer alcohol-free alternatives (e.g., alcohol-free vanilla, grape juice reductions). - If user mentions uncommon allergy/protocol (e.g., alpha-gal, nightshade-free AIP), ask for full list + known cross-reactives and adapt accordingly. --- ## Food Safety & Health - ALWAYS include mandatory warnings: Proper cooking temperatures (e.g., poultry/ground meats to 165°F/74°C, whole cuts of beef/pork/lamb to 145°F/63°C with rest), cross-contamination prevention (separate boards/utensils for raw meat), hand-washing, and storage tips. - Flag high-risk ingredients (e.g., raw/undercooked eggs, raw flour, raw sprouts, raw cashews in quantity, uncooked kidney beans) and provide safe alternatives or refuse if unavoidable. - Immediately REFUSE and warn on known dangerous combinations/mistakes: Mixing bleach/ammonia cleaners near food, untested home canning of low-acid foods, eating large amounts of raw batter/dough. - For any preservation/canning/fermentation request: - Require explicit user confirmation they will follow USDA/equivalent tested guidelines. - For low-acid foods (pH >4.6, e.g., most vegetables, meats, seafood): Insist on pressure canning at 240–250°F / 10–15 PSIG. - Include mandatory warning: “Botulism risk is serious — only use tested recipes from USDA/NCHFP. Test final pH <4.6 or pressure can. Do not rely on AI for unverified preservation methods.” - If user lacks pressure canner or testing equipment, refuse canning suggestions and pivot to refrigeration/freezing/pickling alternatives. - Never suggest unsafe practices; prioritize user health over creativity or convenience. --- ## Conflict Detection & Resolution - State conflicts explicitly with humor-optional empathy. Example: “You want crispy but don’t have an oven. That’s like wanting tan lines in winter—but we can fake it with a skillet!” - Offer one main fix with rationale, followed by optional alternative paths. - Require user confirmation before proceeding. --- ## Expectation Alignment If user goals exceed feasible limits: - Calibrate expectations respectfully (“That’s ambitious—let’s make a fake-it-till-we-make-it version!”). - Clearly distinguish authentic vs. approximate approaches. - Focus on best-fit compromises within reality, not perfection. --- ## Recipe Output Format ### 1. Recipe Overview - Dish name. - Cuisine or flavor inspiration. - Brief explanation of why it fits the constraints, optionally with humor (“This dish respects your 20-minute limit and your zero-patience policy.”) ### 2. Ingredient List - Separate **Core Ingredients** and **Optional Ingredients**. - Auto-adjust for portion scaling. - Support both metric and imperial units. - Allow labeled substitutions for missing items. ### 3. Step-by-Step Instructions - Numbered steps with estimated times. - Explicit warnings on tricky parts (“Don’t walk away—this sauce turns faster than a bad date.”) - Highlight sensory cues (“Cook until it smells warm and nutty, not like popcorn’s evil twin.”) - Include safety notes (e.g., “Wash hands after handling raw meat. Reach safe internal temp of 165°F/74°C for poultry.”) ### 4. Decision Rationale (Adaptive Detail) - **Beginner:** Simple explanations of why steps exist. - **Intermediate:** Technique clarification in brief. - **Advanced:** Scientific insight or flavor mechanics. - Humor only if it doesn’t obscure clarity. ### 5. Risk & Recovery - List likely mistakes and recovery advice. - Example: “Sauce too salty? Add a splash of cream—panic optional.” - If humor mode is active, add morale boosts (“Congrats: you learned the ancient chef art of improvisation!”) --- ## Time & Complexity Governance - If total time exceeds user’s limit, flag it immediately and propose alternatives. - When simplifying, explain tradeoffs with clarity and encouragement. - Never silently break stated boundaries. - For large portions (>10–12 servings or extreme ratios), scale cautiously, flag resource needs, and suggest realistic limits or alternatives. --- ## Creativity Governance 1. **Constraint-Compliant Creativity (Allowed):** Substitutions, style adaptations, and flavor tweaks. 2. **Constraint-Breaking Creativity (Disallowed without consent):** Anything violating time, tools, skill, or SAFETY constraints. Label creative deviations as “Optional – For the bold.” --- ## Confidence & Tone Modulation - If user shows doubt (“I’m not sure,” “never cooked before”), automatically activate **Guided Confidence Mode**: - Simplify language. - Add moral support. - Sprinkle mild humor for stress relief. - Include progress validation (“Nice work – professional chefs take breaks, too!”) --- ## Communication Tone - Calm, practical, and encouraging. - Humor aligns with user preference and context. - Strive for warmth and realism over cleverness. - Never joke about safety or user failures. --- ## Assumptions & Disclaimers - Results may vary due to ingredient or equipment differences. - The system aims to assist, not judge. - Recipes are living guidance, not rigid law. - Humor is seasoning, not the main ingredient. - **Legal Disclaimer:** This is not professional culinary, medical, or nutritional advice. Consult experts for allergies, diets, health concerns, or preservation safety. Use at your own risk. For canning/preservation, follow only USDA/NCHFP-tested methods. - **Ethical Note:** Encourage sustainable choices (e.g., local ingredients) as optional if aligned with preferences. --- ## Changelog - **v1.3 (2026-01-19):** - Integrated humor mode with Off / Mild / Playful settings. - Added sensory and emotional cues for human-like instruction flow. - Enhanced constraint soft-threshold logic and conversational tone adaptation. - Added personality toggles (Coach Mode, Chill Mode, Drill Sergeant Mode). - Strengthened conflict communication with friendly humor. - Improved morale-boost logic for low-confidence users. - Maintained all critical constraint governance and transparency safeguards. - **v1.4 (2026-01-20):** - Integrated personality modes (Coach, Chill, Drill Sergeant) into main prompt body (previously only mentioned in changelog). - Added dedicated Food Safety & Health section with mandatory warnings and risk flagging. - Expanded Constraint Categories with new #6 Dietary & Health Restrictions subsection and proactive querying. - Added accessibility considerations to Skill & Comfort Level. - Added international support (unit system query, regional ingredient suggestions) to Preferences & Context. - Added iterative refinement support to System Behavior & Interaction Rules. - Strengthened legal and ethical disclaimers in Assumptions & Disclaimers. - Enhanced humor safeguards for sensitive topics. - Added scalability flags for large portions in Time & Complexity Governance. - Maintained all critical constraint governance, transparency, and user-success safeguards. - **v1.5 (2026-01-19):** - Hardened Food Safety & Health with explicit refusal language for dangerous combos (e.g., raw batter in quantity, untested canning). - Added strict USDA-aligned rules for preservation/canning/fermentation with botulism warnings and refusal thresholds. - Enhanced Dietary section with halal/kosher hidden-alcohol flagging (e.g., vanilla extract) and alternatives. - Tightened portion scaling realism (proactive flags/refusals for extreme >10–12 servings). - Expanded rare allergy/protocol handling and accessibility adaptations (visual/mobility). - Reinforced safety-first priority throughout goal and tone sections. - Maintained all critical constraint governance, transparency, and user-success safeguards.
{ "title": "Wings of the Dust Bowl", "description": "A daring 1930s female aviator stands confident on a wind-swept airfield at sunset, ready to cross the Atlantic.", "prompt": "You will perform an image edit using the provided photo to create a frame worthy of a historical epic. Transform the female subject into a pioneer aviator from the 1930s. The image must be photorealistic, utilizing cinematic lighting to highlight the texture of weather-beaten leather and skin pores. The scene is highly detailed, shot on Arri Alexa with a shallow depth of field to blur the vintage biplane in the background. The composition focuses on realistic physics, from the wind catching her scarf to the oil smudges on her cheek.", "details": { "year": "1933", "genre": "Cinematic Photorealism", "location": "A dusty, remote airfield in the Midwest with the blurred metallic nose of a vintage propeller plane in the background.", "lighting": [ "Golden hour sunset", "Strong rim lighting", "Volumetric light rays through dust", "High contrast warm tones" ], "camera_angle": "Eye-level close-up shot using an 85mm portrait lens.", "emotion": [ "Determined", "Adventurous", "Confident" ], "color_palette": [ "Burnt orange", "Leather brown", "Metallic silver", "Sunset gold", "Sepia" ], "atmosphere": [ "Nostalgic", "Gritty", "Windy", "Epic" ], "environmental_elements": "Swirling dust particles caught in the light, a spinning propeller motion blur in the distance, tall dry grass blowing in the wind.", "subject1": { "costume": "A distressed vintage brown leather bomber jacket with a shearling collar, a white silk aviator scarf blowing in the wind, and brass flight goggles resting on her forehead.", "subject_expression": "A subtle, confident smirk with eyes squinting slightly against the setting sun.", "subject_action": "Adjusting a leather glove on her hand while gazing toward the horizon." }, "negative_prompt": { "exclude_visuals": [ "modern jets", "paved runway", "smartphones", "digital watches", "clear blue sky", "plastic textures" ], "exclude_styles": [ "cartoon", "3D render", "anime", "painting", "sketch", "black and white" ], "exclude_colors": [ "neon green", "electric blue", "hot pink" ], "exclude_objects": [ "modern buildings", "cars" ] } } }
{ "title": "The Last Adagio", "description": "A hauntingly beautiful scene of a solitary ballerina performing in a flooded, abandoned grand library.", "prompt": "You will perform an image edit using the provided subject. Transform Subject 1 (female) into a survivor in a post-apocalyptic world. She is in a massive, decaying library where the floor is flooded with water. Light spills through the collapsed ceiling, illuminating dust motes and water reflections. The image must be photorealistic, utilizing cinematic lighting, highly detailed textures, shot on Arri Alexa with a shallow depth of field to focus on the subject while the background falls into soft bokeh.", "details": { "year": "Post-Collapse Era", "genre": "Cinematic Photorealism", "location": "A grand, abandoned library with towering shelves, crumbling architecture, and a floor flooded with still, reflective water.", "lighting": [ "God rays entering from a collapsed roof", "Soft reflected light from the water", "High contrast cinematic shadows" ], "camera_angle": "Low angle, wide shot, capturing the reflection in the water.", "emotion": [ "Melancholic", "Graceful", "Solitary" ], "color_palette": [ "Desaturated concrete greys", "Muted teal water", "Vibrant crimson", "Dusty gold light" ], "atmosphere": [ "Ethereal", "Lonely", "Quiet", "Majestic" ], "environmental_elements": "Floating pages from old books, dust particles dancing in light shafts, ripples in the water.", "subject1": { "costume": "A distressed, dirty white ballet leotard paired with pristine red gloves.", "subject_expression": "Serene, eyes closed, lost in the movement.", "subject_action": "dancing" }, "negative_prompt": { "exclude_visuals": [ "bright sunshine", "clean environment", "modern technology", "spectators" ], "exclude_styles": [ "cartoon", "painting", "sketch", "3D render" ], "exclude_colors": [ "neon green", "bright orange" ], "exclude_objects": [ "cars", "animals", "phones" ] } } }
{ "title": "Crimson Waltz in the Rain", "description": "A visually stunning, cinematic moment of a woman finding joy in solitude, dancing on a rain-slicked European street at twilight.", "prompt": "You will perform an image edit creating an Ultra-Photorealistic masterpiece. The image must be photorealistic, utilizing cinematic lighting and be highly detailed, looking as if it was shot on Arri Alexa with a shallow depth of field. The scene features a female subject dancing freely in the rain on a cobblestone street. The rain droplets are frozen in time by the shutter speed, catching the amber glow of streetlamps.", "details": { "year": "Timeless Modern", "genre": "Cinematic Photorealism", "location": "A narrow, empty cobblestone street in Paris at dusk, wet with rain, reflecting the warm glow of vintage streetlamps and shop windows.", "lighting": [ "Cinematic rim lighting", "Warm amber streetlights", "Soft blue ambient twilight", "Volumetric fog" ], "camera_angle": "Eye-level medium shot, emphasizing the subject's movement against the bokeh background.", "emotion": [ "Liberated", "Joyful", "Serene" ], "color_palette": [ "Deep obsidian", "Amber gold", "Rainy blue", "Vibrant crimson" ], "atmosphere": [ "Romantic", "Melancholic yet joyful", "Atmospheric", "Wet" ], "environmental_elements": "Rain falling diagonally, puddles reflecting lights on the ground, mist swirling around ankles.", "subject1": { "costume": "red hat", "subject_expression": "Eyes closed in pure bliss, a soft smile on her lips, raindrops on her cheeks.", "subject_action": "dancing" }, "negative_prompt": { "exclude_visuals": [ "bright daylight", "dry pavement", "crowds", "vehicles", "sunglasses" ], "exclude_styles": [ "cartoon", "3D render", "illustration", "oil painting", "sketch" ], "exclude_colors": [ "neon green", "hot pink" ], "exclude_objects": [ "umbrellas", "modern cars", "trash cans" ] } } }
{ "title": "Manhattan Mirage", "description": "A high-octane, cinematic moment capturing a woman's confident stride through a steam-filled New York intersection during golden hour.", "prompt": "You will perform an image edit using the provided photo. Create an Ultra-Photorealistic image of the female subject. The style is highly detailed, resembling a frame shot on Arri Alexa with a cinematic 1:1 aspect ratio. Apply heavy depth of field to blur the busy background while keeping the subject sharp. Use cinematic lighting with strong backlight. The subject is wearing a red mini skirt and is walking on the street.", "details": { "year": "1999", "genre": "Cinematic Photorealism", "location": "A gritty, bustling New York City intersection at sunset, with steam rising from manholes and blurred yellow taxis in the background.", "lighting": [ "Golden hour backlight", "Lens flares", "High contrast volumetric lighting" ], "camera_angle": "Low-angle tracking shot, centered composition.", "emotion": [ "Confident", "Empowered", "Aloof" ], "color_palette": [ "Crimson red", "Asphalt grey", "Golden yellow", "Deep black" ], "atmosphere": [ "Urban", "Dynamic", "Cinematic", "Energetic" ], "environmental_elements": "Steam plumes rising from the ground, motion-blurred traffic, flying pigeons, wet pavement reflecting the sunset.", "subject1": { "costume": "red mini skirt", "subject_expression": "A fierce, confident gaze with slightly parted lips, perhaps wearing vintage sunglasses.", "subject_action": "walking on the street" }, "negative_prompt": { "exclude_visuals": [ "empty streets", "studio background", "overexposed sky", "static pose" ], "exclude_styles": [ "cartoon", "3D render", "illustration", "anime", "sketch" ], "exclude_colors": [ "neon green", "pastel pink" ], "exclude_objects": [ "smartphones", "modern cars", "futuristic gadgets" ] } } }
{ "title": "The Glass Doppelgänger", "description": "A high-octane psychological thriller scene where a woman is engaged in a visceral physical combat with her own sentient reflection emerging from a shattered surface.", "prompt": "You will perform an image edit using the provided photo to create a high-budget movie frame. The scene features the subject in a fierce life-or-death struggle against a supernatural mirror entity. The image must be Ultra-Photorealistic, utilizing cinematic lighting and highly detailed textures. The style is that of a blockbuster film, shot on Arri Alexa with a shallow depth of field to emphasize the intensity. Ensure realistic physics for the flying glass shards.", "details": { "year": "2025", "genre": "Cinematic Photorealism", "location": "A derelict, neon-lit dressing room with peeling wallpaper and a wall-sized vanity mirror that is shattering outwards.", "lighting": [ "Volumetric stage lighting from above", "Flickering fluorescent buzz", "Dramatic rim lighting highlighting sweat and glass texture" ], "camera_angle": "Dynamic low-angle medium shot, slightly Dutch tilted to enhance the chaos.", "emotion": [ "Ferocity", "Desperation", "Adrenaline" ], "color_palette": [ "Electric cyan", "Gritty concrete grey", "Deep shadowy blacks", "Metallic silver" ], "atmosphere": [ "Violent", "Surreal", "Claustrophobic", "Kinetic" ], "environmental_elements": "Thousands of micro-shards of glass suspended in the air (bullet-time effect), dust motes dancing in the light beams, overturned furniture.", "subject1": { "costume": "crop top, mini skirt", "subject_expression": "A primal scream of exertion, eyes wide with intensity.", "subject_action": "fighting with mirror" }, "negative_prompt": { "exclude_visuals": [ "cartoonish effects", "low resolution", "blurry textures", "static pose", "calm demeanor" ], "exclude_styles": [ "3D render", "illustration", "painting", "anime" ], "exclude_colors": [ "pastel pinks", "sunshine yellow" ], "exclude_objects": [ "magical glowing orbs", "wands", "animals" ] } } }
{ "title": "Phantom Strike", "description": "An intense, high-octane action shot of a lone warrior battling supernatural entities in a decayed industrial setting.", "prompt": "You will perform an image edit transforming the subject into an action hero in a supernatural thriller. The image must be photorealistic, highly detailed, and emulate a frame shot on Arri Alexa with cinematic lighting and a shallow depth of field. The scene depicts the female subject in a derelict, flooded subway tunnel, engaged in mortal combat. She is fighting with shadows that seem to manifest as physical, smoky tendrils extending from the darkness. The lighting is dramatic, highlighting the texture of her skin and the splashing water.", "details": { "year": "Modern Day Urban Fantasy", "genre": "Cinematic Photorealism", "location": "An abandoned, flooded subway maintenance tunnel with peeling paint and flickering overhead industrial lights.", "lighting": [ "High-contrast chiaroscuro", "Cold overhead fluorescent flicker", "Volumetric god rays through steam" ], "camera_angle": "Low-angle dynamic action shot, 1:1 aspect ratio, focusing on the impact of the movement.", "emotion": [ "Fierce", "Adrenaline-fueled", "Desperate" ], "color_palette": [ "Desaturated concrete greys", "Vibrant crimson", "Abyssal black", "Cold cyan" ], "atmosphere": [ "Kinetic", "Claustrophobic", "Gritty", "Supernatural" ], "environmental_elements": "Splashing dirty water, floating dust particles, semi-corporeal shadow creatures, sparks falling from a broken light fixture.", "subject1": { "costume": "red mini skirt, black fingerless gloves, a torn white tactical tank top, and heavy laced combat boots.", "subject_expression": "Teeth gritted in exertion, eyes locked on the target with intense focus.", "subject_action": "fighting with shadows" }, "negative_prompt": { "exclude_visuals": [ "sunlight", "blue skies", "static poses", "smiling", "cleanliness" ], "exclude_styles": [ "cartoon", "anime", "3D render", "oil painting", "sketch" ], "exclude_colors": [ "pastel pink", "warm orange", "spring green" ], "exclude_objects": [ "guns", "swords", "modern vehicles", "bystanders" ] } } }
--- name: GitHubTrends description: 显示GitHub热门项目趋势,生成可视化仪表板。USE WHEN github trends, trending projects, hot repositories, popular github projects, generate dashboard, create webpage. version: 2.0.0 --- ## Customization **Before executing, check for user customizations at:** `~/.claude/skills/CORE/USER/SKILLCUSTOMIZATIONS/GitHubTrends/` If this directory exists, load and apply any PREFERENCES.md, configurations, or resources found there. These override default behavior. If the directory does not exist, proceed with skill defaults. # GitHubTrends - GitHub热门项目趋势 **快速发现GitHub上最受欢迎的开源项目。** --- ## Philosophy GitHub trending是发现优质开源项目的最佳途径。这个skill让老王我能快速获取当前最热门的项目列表,按时间周期(每日/每周)和编程语言筛选,帮助发现值得学习和贡献的项目。 --- ## Quick Start ```bash # 查看本周最热门的项目(默认) bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly # 查看今日最热门的项目 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts daily # 按语言筛选 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --language=TypeScript bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --language=Python # 指定显示数量 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --limit=20 ``` --- ## When to Use This Skill **Core Triggers - Use this skill when user says:** ### Direct Requests - "show github trends" 或 "github trending" - "显示热门项目" 或 "看看有什么热门项目" - "what's trending on github" 或 "github hot projects" - "本周热门项目" 或 "weekly trending" - "今日热门项目" 或 "daily trending" ### Discovery Requests - "discover popular projects" 或 "发现热门项目" - "show repositories trending" 或 "显示trending仓库" - "github上什么最火" 或 "what's hot on github" - "找点好项目看看" 或 "find good projects" ### Language-Specific - "TypeScript trending projects" 或 "TypeScript热门项目" - "Python trending" 或 "Python热门项目" - "show trending Rust projects" 或 "显示Rust热门项目" - "Go语言热门项目" 或 "trending Go projects" ### Dashboard & Visualization - "生成 GitHub trending 仪表板" 或 "generate trending dashboard" - "创建趋势网页" 或 "create trending webpage" - "生成交互式报告" 或 "generate interactive report" - "export trending dashboard" 或 "导出仪表板" - "可视化 GitHub 趋势" 或 "visualize github trends" --- ## Core Capabilities ### 获取趋势列表 - **每日趋势** - 过去24小时最热门项目 - **每周趋势** - 过去7天最热门项目(默认) - **语言筛选** - 按编程语言过滤(TypeScript, Python, Go, Rust等) - **自定义数量** - 指定返回项目数量(默认10个) ### 生成可视化仪表板 🆕 - **交互式HTML** - 生成交互式网页仪表板 - **数据可视化** - 语言分布饼图、Stars增长柱状图 - **技术新闻** - 集成 Hacker News 技术资讯 - **实时筛选** - 按语言筛选、排序、搜索功能 - **响应式设计** - 支持桌面、平板、手机 ### 项目信息 - 项目名称和描述 - Star数量和变化 - 编程语言 - 项目URL --- ## Tool Usage ### GetTrending.ts **Location:** `Tools/GetTrending.ts` **功能:** 从GitHub获取trending项目列表 **参数:** - `period` - 时间周期:`daily` 或 `weekly`(默认:weekly) - `--language` - 编程语言筛选(可选) - `--limit` - 返回项目数量(默认:10) **使用示例:** ```bash # 基本用法 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly # 带参数 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --language=TypeScript --limit=15 # 简写 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts daily -l=Python ``` **实现方式:** 使用 GitHub官方trending页面:https://github.com/trending 通过 fetch API 读取页面内容并解析 --- ### GenerateDashboard.ts 🆕 **Location:** `Tools/GenerateDashboard.ts` **功能:** 生成交互式数据可视化仪表板HTML文件 **参数:** - `--period` - 时间周期:`daily` 或 `weekly`(默认:weekly) - `--language` - 编程语言筛选(可选) - `--limit` - 返回项目数量(默认:10) - `--include-news` - 包含技术新闻 - `--news-count` - 新闻数量(默认:10) - `--output` - 输出文件路径(默认:./github-trends.html) **使用示例:** ```bash # 基本用法 - 生成本周仪表板 bun ~/.claude/skills/GitHubTrends/Tools/GenerateDashboard.ts # 包含技术新闻 bun ~/.claude/skills/GitHubTrends/Tools/GenerateDashboard.ts --include-news # TypeScript 项目每日仪表板 bun ~/.claude/skills/GitHubTrends/Tools/GenerateDashboard.ts \ --period daily \ --language TypeScript \ --limit 20 \ --include-news \ --output ~/ts-daily.html ``` **实现方式:** - 获取 GitHub trending 项目数据 - 获取 Hacker News 技术新闻 - 使用 Handlebars 模板引擎渲染 HTML - 集成 Tailwind CSS 和 Chart.js - 生成完全独立的 HTML 文件(通过 CDN 加载依赖) --- ## Output Format ```markdown # GitHub Trending Projects - Weekly (2025-01-19) ## 1. vercel/next.js - ⭐ 125,342 (+1,234 this week) **Language:** TypeScript **Description:** The React Framework for the Web **URL:** https://github.com/vercel/next.js ## 2. microsoft/vscode - ⭐ 160,890 (+987 this week) **Language:** TypeScript **Description:** Visual Studio Code **URL:** https://github.com/microsoft/vscode ... --- 📊 Total: 10 projects | Language: All | Period: Weekly ``` --- ## Supported Languages 常用编程语言筛选: - **TypeScript** - TypeScript项目 - **JavaScript** - JavaScript项目 - **Python** - Python项目 - **Go** - Go语言项目 - **Rust** - Rust项目 - **Java** - Java项目 - **C++** - C++项目 - **Ruby** - Ruby项目 - **Swift** - Swift项目 - **Kotlin** - Kotlin项目 --- ## Workflow Integration 这个skill可以被其他skill调用: - **OSINT** - 在调查技术栈时发现热门工具 - **Research** - 研究特定语言生态系统的趋势 - **System** - 发现有用的PAI相关项目 --- ## Technical Notes **数据来源:** GitHub官方trending页面 **更新频率:** 每小时更新一次 **无需认证:** 使用公开页面,无需GitHub API token **解析方式:** 通过HTML解析提取项目信息 **错误处理:** - 网络错误会显示友好提示 - 解析失败会返回原始HTML供调试 - 支持的语言参数不区分大小写 --- ## Future Enhancements 可能的未来功能: - 支持月度趋势(如果GitHub提供) - 按stars范围筛选(1k+, 10k+, 100k+) - 保存历史数据用于趋势分析 - 集成到其他skill的自动化工作流 --- ## Voice Notification **When executing a workflow, do BOTH:** 1. **Send voice notification:** ```bash curl -s -X POST http://localhost:8888/notify \ -H "Content-Type: application/json" \ -d '{"message": "Running the GitHubTrends workflow"}' \ > /dev/null 2>&1 & ``` 2. **Output text notification:** ``` Running the **GitHubTrends** workflow... ``` **Full documentation:** `~/.claude/skills/CORE/SkillNotifications.md` FILE:README.md # GitHubTrends Skill **快速发现GitHub上最受欢迎的开源项目,生成可视化仪表板!** ## 功能特性 ### 基础功能 - ✅ 获取每日/每周热门项目列表 - ✅ 按编程语言筛选(TypeScript, Python, Go, Rust等) - ✅ 自定义返回项目数量 - ✅ 显示Star总数和周期增长 - ✅ 无需GitHub API token ### 可视化仪表板 🆕 - ✨ **交互式HTML** - 生成交互式网页仪表板 - 📊 **数据可视化** - 语言分布饼图、Stars增长柱状图 - 📰 **技术新闻** - 集成 Hacker News 最新资讯 - 🔍 **实时筛选** - 按语言筛选、排序、搜索 - 📱 **响应式设计** - 支持桌面、平板、手机 - 🎨 **美观界面** - Tailwind CSS + GitHub 风格 ## 快速开始 ### 查看本周热门项目(默认) ```bash bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly ``` ### 查看今日热门项目 ```bash bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts daily ``` ### 按语言筛选 ```bash # TypeScript热门项目 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --language=TypeScript # Python热门项目 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --language=Python # Go热门项目 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly -l=Go ``` ### 指定返回数量 ```bash # 返回20个项目 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --limit=20 # 组合使用:返回15个TypeScript项目 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --language=TypeScript --limit=15 ``` --- ## 生成可视化仪表板 🆕 ### 基本用法 ```bash # 生成本周趋势仪表板(默认) bun ~/.claude/skills/GitHubTrends/Tools/GenerateDashboard.ts ``` ### 包含技术新闻 ```bash # 生成包含 Hacker News 的仪表板 bun ~/.claude/skills/GitHubTrends/Tools/GenerateDashboard.ts --include-news ``` ### 高级选项 ```bash # 生成 TypeScript 项目每日仪表板,包含 15 条新闻 bun ~/.claude/skills/GitHubTrends/Tools/GenerateDashboard.ts \ --period daily \ --language TypeScript \ --limit 20 \ --include-news \ --news-count 15 \ --output ~/Downloads/ts-daily-trends.html ``` ### 仪表板功能 生成的 HTML 文件包含: - **统计概览** - 总项目数、总 stars、top 项目 - **语言分布图** - 饼图展示各语言占比 - **Stars 增长图** - 柱状图展示增长趋势 - **项目卡片** - 美观的卡片式项目展示 - **技术新闻** - Hacker News 最新资讯 - **交互功能** - 筛选、排序、搜索 - **响应式** - 自适应各种屏幕尺寸 --- ## 输出示例 ```markdown # GitHub Trending Projects - Weekly (2026-01-19) 📊 **Total:** 10 projects | **Language:** All | **Period:** Weekly --- ## 1. vercel/next.js - ⭐ 125,342 (+1,234 this week) **Language:** TypeScript **Description:** The React Framework for the Web **URL:** https://github.com/vercel/next.js ## 2. microsoft/vscode - ⭐ 160,890 (+987 this week) **Language:** TypeScript **Description:** Visual Studio Code **URL:** https://github.com/microsoft/vscode ... ``` ## 参数说明 | 参数 | 说明 | 默认值 | 可选值 | |------|------|--------|--------| | `period` | 时间周期 | `weekly` | `daily`, `weekly` | | `--language` | 编程语言筛选 | 全部 | TypeScript, Python, Go, Rust, Java等 | | `--limit` | 返回项目数量 | 10 | 任意正整数 | ## 支持的语言 常用的编程语言都可以作为筛选条件: - **TypeScript** - TypeScript项目 - **JavaScript** - JavaScript项目 - **Python** - Python项目 - **Go** - Go语言项目 - **Rust** - Rust项目 - **Java** - Java项目 - **C++** - C++项目 - **Ruby** - Ruby项目 - **Swift** - Swift项目 - **Kotlin** - Kotlin项目 ## Skill 触发词 当你说以下任何内容时,这个skill会被触发: - "show github trends" / "github trending" - "显示热门项目" / "看看有什么热门项目" - "weekly trending" / "本周热门项目" - "daily trending" / "今日热门项目" - "TypeScript trending" / "Python trending" - "what's hot on github" / "github上什么最火" ## 技术实现 - **数据源**: GitHub官方trending页面 (https://github.com/trending) - **解析方式**: HTML解析提取项目信息 - **认证**: 无需GitHub API token - **更新频率**: 每小时更新一次 ## 目录结构 ``` ~/.claude/skills/GitHubTrends/ ├── SKILL.md # Skill主文件 ├── README.md # 使用文档(本文件) ├── Tools/ │ └── GetTrending.ts # 获取trending数据的工具 └── Workflows/ └── GetTrending.md # 工作流文档 ``` ## 注意事项 1. **网络要求**: 需要能访问GitHub官网 2. **更新频率**: 数据每小时更新,不是实时 3. **解析准确性**: GitHub页面结构变化可能影响解析,如遇问题请检查 `/tmp/github-trending-debug-*.html` 4. **语言参数**: 不区分大小写,`--language=typescript` 和 `--language=TypeScript` 效果相同 ## 已知问题 - GitHub trending页面的HTML结构复杂,某些项目的URL和名称可能解析不完整 - 如果GitHub页面结构变化,工具可能需要更新解析逻辑 ## 未来改进 - [ ] 支持保存历史数据用于趋势分析 - [ ] 按stars范围筛选(1k+, 10k+, 100k+) - [ ] 更智能的HTML解析(使用HTML解析库而非正则) - [ ] 集成到其他skill的自动化工作流 ## 贡献 如果发现问题或有改进建议,欢迎提出! --- **Made with ❤️ by 老王** FILE:Tools/GetTrending.ts #!/usr/bin/env bun /** * GitHub Trending Projects Fetcher * * 从GitHub获取trending项目列表 * 支持每日/每周趋势,按语言筛选 */ import { $ } from "bun"; interface TrendingProject { rank: number; name: string; description: string; language: string; stars: string; starsThisPeriod: string; url: string; } interface TrendingOptions { period: "daily" | "weekly"; language?: string; limit: number; } function buildTrendingUrl(options: TrendingOptions): string { const baseUrl = "https://github.com/trending"; const since = options.period === "daily" ? "daily" : "weekly"; let url = `${baseUrl}?since=${since}`; if (options.language) { url += `&language=${encodeURIComponent(options.language.toLowerCase())}`; } return url; } function parseTrendingProjects(html: string, limit: number): TrendingProject[] { const projects: TrendingProject[] = []; try { const articleRegex = /<article[^>]*>([\s\S]*?)<\/article>/g; const articles = html.match(articleRegex) || []; const articlesToProcess = articles.slice(0, limit); articlesToProcess.forEach((article, index) => { try { const headingMatch = article.match(/<h[12][^>]*>([\s\S]*?)<\/h[12]>/); let repoName: string | null = null; if (headingMatch) { const headingContent = headingMatch[1]; const validLinkMatch = headingContent.match( /<a[^>]*href="\/([^\/"\/]+\/[^\/"\/]+)"[^>]*>(?![^<]*login)/ ); if (validLinkMatch) { repoName = validLinkMatch[1]; } } if (!repoName) { const repoMatch = article.match( /<a[^>]*href="\/([a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+)"[^>]*>(?!.*(?:login|stargazers|forks|issues))/ ); repoName = repoMatch ? repoMatch[1] : null; } const descMatch = article.match(/<p[^>]*class="[^"]*col-9[^"]*"[^>]*>([\s\S]*?)<\/p>/); const description = descMatch ? descMatch[1] .replace(/<[^>]+>/g, "") .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, '"') .trim() .substring(0, 200) : "No description"; const langMatch = article.match(/<span[^>]*itemprop="programmingLanguage"[^>]*>([^<]+)<\/span>/); const language = langMatch ? langMatch[1].trim() : "Unknown"; const starsMatch = article.match(/<a[^>]*href="\/[^"]+\/stargazers"[^>]*>(\d[\d,]*)\s*stars?/); const totalStars = starsMatch ? starsMatch[1] : "0"; const starsAddedMatch = article.match(/(\d[\d,]*)\s*stars?\s*(?:today|this week)/i); const starsAdded = starsAddedMatch ? `+${starsAddedMatch[1]}` : ""; if (repoName && !repoName.includes("login") && !repoName.includes("return_to")) { projects.push({ rank: index + 1, name: repoName, description, language, stars: totalStars, starsThisPeriod: starsAdded, url: `https://github.com/${repoName}`, }); } } catch (error) { console.error(`解析第${index + 1}个项目失败:`, error); } }); } catch (error) { console.error("解析trending项目失败:", error); } return projects; } function formatProjects(projects: TrendingProject[], options: TrendingOptions): string { if (projects.length === 0) { return "# GitHub Trending - No Projects Found\n\n没有找到trending项目,可能是网络问题或页面结构变化。"; } const periodLabel = options.period === "daily" ? "Daily" : "Weekly"; const languageLabel = options.language ? `Language: ${options.language}` : "Language: All"; const today = new Date().toISOString().split("T")[0]; let output = `# GitHub Trending Projects - ${periodLabel} (${today})\n\n`; output += `📊 **Total:** ${projects.length} projects | **${languageLabel}** | **Period:** ${periodLabel}\n\n`; output += `---\n\n`; projects.forEach((project) => { output += `## ${project.rank}. ${project.name} - ⭐ ${project.stars}`; if (project.starsThisPeriod) { output += ` (${project.starsThisPeriod} this ${options.period})`; } output += `\n`; output += `**Language:** ${project.language}\n`; output += `**Description:** ${project.description}\n`; output += `**URL:** ${project.url}\n\n`; }); output += `---\n`; output += `📊 Data from: https://github.com/trending\n`; return output; } async function main() { const args = process.argv.slice(2); let period: "daily" | "weekly" = "weekly"; let language: string | undefined; let limit = 10; for (const arg of args) { if (arg === "daily" || arg === "weekly") { period = arg; } else if (arg.startsWith("--language=")) { language = arg.split("=")[1]; } else if (arg.startsWith("-l=")) { language = arg.split("=")[1]; } else if (arg.startsWith("--limit=")) { limit = parseInt(arg.split("=")[1]) || 10; } } const options: TrendingOptions = { period, language, limit }; try { const url = buildTrendingUrl(options); console.error(`正在获取 GitHub trending 数据: ${url}`); const response = await fetch(url); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } const html = await response.text(); const projects = parseTrendingProjects(html, limit); const formatted = formatProjects(projects, options); console.log(formatted); if (projects.length === 0) { const debugFile = `/tmp/github-trending-debug-${Date.now()}.html`; await Bun.write(debugFile, html); console.error(`\n调试: 原始HTML已保存到 ${debugFile}`); } } catch (error) { console.error("❌ 获取trending数据失败:"); console.error(error); process.exit(1); } } main(); FILE:Workflows/GetTrending.md # GetTrending Workflow 获取GitHub trending项目列表的工作流程。 ## Description 这个工作流使用 GetTrending.ts 工具从GitHub获取当前最热门的项目列表,支持按时间周期(每日/每周)和编程语言筛选。 ## When to Use 当用户请求以下任何内容时使用此工作流: - "show github trends" / "github trending" - "显示热门项目" / "看看有什么热门项目" - "weekly trending" / "本周热门项目" - "daily trending" / "今日热门项目" - "TypeScript trending" / "Python trending" / 按语言筛选 - "what's hot on github" / "github上什么最火" ## Workflow Steps ### Step 1: 确定参数 向用户确认或推断以下参数: - **时间周期**: daily (每日) 或 weekly (每周,默认) - **编程语言**: 可选(如 TypeScript, Python, Go, Rust等) - **项目数量**: 默认10个 ### Step 2: 执行工具 运行 GetTrending.ts 工具: ```bash # 基本用法(本周,全部语言,10个项目) bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly # 指定语言 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --language=TypeScript # 指定数量 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts weekly --limit=20 # 组合参数 bun ~/.claude/skills/GitHubTrends/Tools/GetTrending.ts daily --language=Python --limit=15 ``` ### Step 3: 显示结果 工具会自动格式化输出,包括: - 项目排名 - 项目名称 - Star总数和周期内增长 - 编程语言 - 项目描述 - GitHub URL ### Step 4: 后续操作(可选) 根据用户需求,可以: - 打开某个项目页面 - 使用其他skill进一步分析项目 - 将结果保存到文件供后续参考 ## Integration with Other Skills - **OSINT**: 在调查技术栈时发现热门工具 - **Research**: 研究特定语言生态系统的趋势 - **Browser**: 打开项目页面进行详细分析 ## Notes - 数据每小时更新一次 - 无需GitHub API token - 使用公开的GitHub trending页面 - 支持的语言参数不区分大小写 FILE:Tools/GenerateDashboard.ts #!/usr/bin/env bun /** * GitHub Trending Dashboard Generator * * 生成交互式数据可视化仪表板 * * 使用方式: * ./GenerateDashboard.ts [options] * * 选项: * --period - daily | weekly (默认: weekly) * --language - 编程语言筛选 (可选) * --limit - 项目数量 (默认: 10) * --include-news - 包含技术新闻 * --news-count - 新闻数量 (默认: 10) * --theme - light | dark | auto (默认: auto) * --output - 输出文件路径 (默认: ./github-trends.html) * * 示例: * ./GenerateDashboard.ts * ./GenerateDashboard.ts --period daily --language TypeScript --include-news * ./GenerateDashboard.ts --limit 20 --output ~/trends.html */ import Handlebars from 'handlebars'; import type { DashboardOptions, TrendingProject, TechNewsItem, TemplateData } from './Lib/types'; import { registerHelpers, renderTemplate } from './Lib/template-helpers'; import { analyzeData } from './Lib/visualization-helpers'; // 注册 Handlebars 辅助函数 registerHelpers(); /** * 构建 GitHub trending URL */ function buildTrendingUrl(options: DashboardOptions): string { const baseUrl = "https://github.com/trending"; const since = options.period === "daily" ? "daily" : "weekly"; let url = `${baseUrl}?since=${since}`; if (options.language) { url += `&language=${encodeURIComponent(options.language.toLowerCase())}`; } return url; } /** * 解析 HTML 提取 trending 项目 * (从 GetTrending.ts 复制的逻辑) */ async function getTrendingProjects(options: DashboardOptions): Promise<TrendingProject[]> { const url = buildTrendingUrl(options); console.error(`正在获取 GitHub trending 数据: ${url}`); const response = await fetch(url); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } const html = await response.text(); return parseTrendingProjects(html, options.limit); } /** * 解析 HTML */ function parseTrendingProjects(html: string, limit: number): TrendingProject[] { const projects: TrendingProject[] = []; try { const articleRegex = /<article[^>]*>([\s\S]*?)<\/article>/g; const articles = html.match(articleRegex) || []; const articlesToProcess = articles.slice(0, limit); articlesToProcess.forEach((article, index) => { try { const headingMatch = article.match(/<h[12][^>]*>([\s\S]*?)<\/h[12]>/); let repoName: string | null = null; if (headingMatch) { const headingContent = headingMatch[1]; const validLinkMatch = headingContent.match( /<a[^>]*href="\/([^\/"\/]+\/[^\/"\/]+)"[^>]*>(?![^<]*login)/ ); if (validLinkMatch) { repoName = validLinkMatch[1]; } } if (!repoName) { const repoMatch = article.match( /<a[^>]*href="\/([a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+)"[^>]*>(?!.*(?:login|stargazers|forks|issues))/ ); repoName = repoMatch ? repoMatch[1] : null; } const descMatch = article.match(/<p[^>]*class="[^"]*col-9[^"]*"[^>]*>([\s\S]*?)<\/p>/); const description = descMatch ? descMatch[1] .replace(/<[^>]+>/g, "") .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, '"') .trim() .substring(0, 200) : "No description"; const langMatch = article.match(/<span[^>]*itemprop="programmingLanguage"[^>]*>([^<]+)<\/span>/); const language = langMatch ? langMatch[1].trim() : "Unknown"; // 提取stars总数 - GitHub 改了 HTML 结构,数字在 SVG 后面 const starsMatch = article.match(/stargazers[^>]*>[\s\S]*?<\/svg>\s*([\d,]+)/); const totalStars = starsMatch ? starsMatch[1] : "0"; // 尝试提取新增stars - 格式:XXX stars today/this week const starsAddedMatch = article.match(/(\d[\d,]*)\s+stars?\s+(?:today|this week)/); const starsAdded = starsAddedMatch ? `+${starsAddedMatch[1]}` : ""; if (repoName && !repoName.includes("login") && !repoName.includes("return_to")) { projects.push({ rank: index + 1, name: repoName, description, language, stars: totalStars, starsThisPeriod: starsAdded, url: `https://github.com/${repoName}`, }); } } catch (error) { console.error(`解析第${index + 1}个项目失败:`, error); } }); } catch (error) { console.error("解析trending项目失败:", error); } return projects; } /** * 获取技术新闻 */ async function getTechNews(count: number): Promise<TechNewsItem[]> { const HN_API = 'https://hn.algolia.com/api/v1/search_by_date'; try { const response = await fetch(`${HN_API}?tags=story&hitsPerPage=${count}`); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } const data = await response.json(); return data.hits.slice(0, count).map((hit: any) => ({ id: hit.objectID, title: hit.title, url: hit.url || `https://news.ycombinator.com/item?id=${hit.objectID}`, source: 'hackernews', points: hit.points || 0, comments: hit.num_comments || 0, timestamp: new Date(hit.created_at).toISOString(), tags: hit._tags || [] })); } catch (error) { console.error('获取 Hacker News 失败:', error); return []; } } /** * 生成仪表板 */ async function generateDashboard(options: DashboardOptions): Promise<void> { try { console.error('🚀 开始生成 GitHub Trending Dashboard...\n'); // 1. 获取 GitHub Trending 数据 const projects = await getTrendingProjects(options); console.error(`✅ 获取到 ${projects.length} 个项目`); // 2. 获取技术新闻(如果启用) let news: TechNewsItem[] = []; if (options.includeNews) { news = await getTechNews(options.newsCount); console.error(`✅ 获取到 ${news.length} 条新闻`); } // 3. 分析数据 const analytics = analyzeData(projects); console.error(`✅ 数据分析完成`); // 4. 准备模板数据 const templateData: TemplateData = { title: 'GitHub Trending Dashboard', generatedAt: new Date().toLocaleString('zh-CN'), period: options.period === 'daily' ? 'Daily' : 'Weekly', projects, news, analytics, options }; // 5. 渲染模板 const templatePath = `${import.meta.dir}/../Templates/dashboard.hbs`; const templateContent = await Bun.file(templatePath).text(); const template = Handlebars.compile(templateContent); const html = template(templateData); console.error(`✅ 模板渲染完成`); // 6. 保存文件 await Bun.write(options.output, html); console.error(`\n🎉 仪表板生成成功!`); console.error(`📄 文件路径: ${options.output}`); console.error(`\n💡 在浏览器中打开查看效果!`); } catch (error) { console.error('\n❌ 生成仪表板失败:'); console.error(error); process.exit(1); } } /** * 解析命令行参数 */ function parseArgs(): DashboardOptions { const args = process.argv.slice(2); const options: DashboardOptions = { period: 'weekly', limit: 10, output: './github-trends.html', includeNews: false, newsCount: 10, theme: 'auto' }; for (let i = 0; i < args.length; i++) { const arg = args[i]; switch (arg) { case '--period': options.period = args[++i] === 'daily' ? 'daily' : 'weekly'; break; case '--language': options.language = args[++i]; break; case '--limit': options.limit = parseInt(args[++i]) || 10; break; case '--include-news': options.includeNews = true; break; case '--news-count': options.newsCount = parseInt(args[++i]) || 10; break; case '--theme': options.theme = args[++i] === 'light' || args[++i] === 'dark' ? args[i] : 'auto'; break; case '--output': options.output = args[++i]; break; default: if (arg.startsWith('--output=')) { options.output = arg.split('=')[1]; } else if (arg.startsWith('--language=')) { options.language = arg.split('=')[1]; } else if (arg.startsWith('--limit=')) { options.limit = parseInt(arg.split('=')[1]) || 10; } } } return options; } /** * 主函数 */ async function main() { const options = parseArgs(); await generateDashboard(options); } // 如果直接运行此脚本 if (import.meta.main) { main(); } // 导出供其他模块使用 export { generateDashboard }; export type { DashboardOptions }; FILE:Tools/GetTechNews.ts #!/usr/bin/env bun /** * Tech News Fetcher * * 从 Hacker News 和其他来源获取技术新闻 * * 使用方式: * ./GetTechNews.ts [count] * * 参数: * count - 获取新闻数量 (默认: 10) * * 示例: * ./GetTechNews.ts * ./GetTechNews.ts 20 */ import Parser from 'rss-parser'; import type { TechNewsItem } from './Lib/types'; const HN_API = 'https://hn.algolia.com/api/v1/search'; const parser = new Parser(); /** * 从 Hacker News Algolia API 获取新闻 */ async function getHackerNews(count: number): Promise<TechNewsItem[]> { try { const response = await fetch(`${HN_API}?tags=front_page&hits=${count}`); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } const data = await response.json(); return data.hits.map((hit: any) => ({ id: hit.objectID, title: hit.title, url: hit.url || `https://news.ycombinator.com/item?id=${hit.objectID}`, source: 'hackernews', points: hit.points || 0, comments: hit.num_comments || 0, timestamp: new Date(hit.created_at).toISOString(), tags: hit._tags || [] })); } catch (error) { console.error('获取 Hacker News 失败:', error); return []; } } /** * 从 Hacker News RSS 获取新闻(备用方案) */ async function getHackerNewsRSS(count: number): Promise<TechNewsItem[]> { try { const feed = await parser.parseURL('https://news.ycombinator.com/rss'); return feed.items.slice(0, count).map((item: any) => ({ id: item.guid || item.link, title: item.title || 'No title', url: item.link, source: 'hackernews', timestamp: item.pubDate || new Date().toISOString(), tags: ['hackernews', 'rss'] })); } catch (error) { console.error('获取 Hacker News RSS 失败:', error); return []; } } /** * 获取技术新闻(主函数) */ async function getTechNews(count: number = 10): Promise<TechNewsItem[]> { console.error(`正在获取技术新闻(${count}条)...`); // 优先使用 Hacker News API let news = await getHackerNews(count); // 如果失败,尝试 RSS 备用 if (news.length === 0) { console.error('Hacker News API 失败,尝试 RSS...'); news = await getHackerNewsRSS(count); } console.error(`✅ 获取到 ${news.length} 条新闻`); return news; } /** * CLI 入口 */ async function main() { const args = process.argv.slice(2); const count = parseInt(args[0]) || 10; try { const news = await getTechNews(count); // 输出 JSON 格式(便于程序调用) console.log(JSON.stringify(news, null, 2)); } catch (error) { console.error('❌ 获取新闻失败:'); console.error(error); process.exit(1); } } // 如果直接运行此脚本 if (import.meta.main) { main(); } // 导出供其他模块使用 export { getTechNews }; export type { TechNewsItem }; FILE:Tools/Lib/types.ts /** * GitHubTrends - 类型定义 * * 定义所有 TypeScript 接口和类型 */ /** * GitHub Trending 项目 */ export interface TrendingProject { rank: number; name: string; description: string; language: string; stars: string; starsThisPeriod: string; url: string; } /** * 技术新闻条目 */ export interface TechNewsItem { id: string; title: string; url: string; source: string; // 'hackernews', 'reddit', etc. points?: number; comments?: number; timestamp: string; tags: string[]; } /** * 仪表板生成选项 */ export interface DashboardOptions { period: 'daily' | 'weekly'; language?: string; limit: number; output: string; includeNews: boolean; newsCount: number; theme: 'light' | 'dark' | 'auto'; } /** * 数据分析结果 */ export interface Analytics { languageDistribution: Record<string, number>; totalStars: number; topProject: TrendingProject; growthStats: { highest: TrendingProject; average: number; }; } /** * Trending 查询选项(用于 GetTrending.ts) */ export interface TrendingOptions { period: "daily" | "weekly"; language?: string; limit: number; } /** * 图表数据 */ export interface ChartData { labels: string[]; data: number[]; colors: string[]; } /** * 模板渲染数据 */ export interface TemplateData { title: string; generatedAt: string; period: string; projects: TrendingProject[]; news?: TechNewsItem[]; analytics: Analytics; options: DashboardOptions; } FILE:Tools/Lib/template-helpers.ts /** * Template Helpers * * Handlebars 自定义辅助函数 */ import Handlebars from 'handlebars'; /** * 注册所有自定义辅助函数 */ export function registerHelpers(): void { // 格式化数字(添加千位分隔符) Handlebars.registerHelper('formatNumber', (value: number) => { return value.toLocaleString(); }); // 截断文本 Handlebars.registerHelper('truncate', (str: string, length: number = 100) => { if (str.length <= length) return str; return str.substring(0, length) + '...'; }); // 格式化日期 Handlebars.registerHelper('formatDate', (dateStr: string) => { const date = new Date(dateStr); return date.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' }); }); // JSON 序列化(用于内嵌数据) Handlebars.registerHelper('json', (context: any) => { return JSON.stringify(context); }); // 条件判断 Handlebars.registerHelper('eq', (a: any, b: any) => { return a === b; }); Handlebars.registerHelper('ne', (a: any, b: any) => { return a !== b; }); Handlebars.registerHelper('gt', (a: number, b: number) => { return a > b; }); Handlebars.registerHelper('lt', (a: number, b: number) => { return a < b; }); } /** * 渲染模板 */ export async function renderTemplate( templatePath: string, data: any ): Promise<string> { const templateContent = await Bun.file(templatePath).text(); const template = Handlebars.compile(templateContent); return template(data); } export default { registerHelpers, renderTemplate }; FILE:Tools/Lib/visualization-helpers.ts /** * Visualization Helpers * * 数据分析和可视化辅助函数 */ import type { TrendingProject, Analytics } from './types'; /** * 分析项目数据 */ export function analyzeData(projects: TrendingProject[]): Analytics { // 语言分布统计 const languageDistribution: Record<string, number> = {}; projects.forEach(project => { const lang = project.language; languageDistribution[lang] = (languageDistribution[lang] || 0) + 1; }); // 总 stars 数 const totalStars = projects.reduce((sum, project) => { return sum + parseInt(project.stars.replace(/,/g, '') || 0); }, 0); // 找出 top project const topProject = projects.reduce((top, project) => { const topStars = parseInt(top.stars.replace(/,/g, '') || 0); const projStars = parseInt(project.stars.replace(/,/g, '') || 0); return projStars > topStars ? project : top; }, projects[0]); // 增长统计 const projectsWithGrowth = projects.filter(p => p.starsThisPeriod); const growthValues = projectsWithGrowth.map(p => parseInt(p.starsThisPeriod.replace(/[+,]/g, '') || 0) ); const highestGrowth = projectsWithGrowth.reduce((highest, project) => { const highestValue = parseInt(highest.starsThisPeriod.replace(/[+,]/g, '') || 0); const projValue = parseInt(project.starsThisPeriod.replace(/[+,]/g, '') || 0); return projValue > highestValue ? project : highest; }, projectsWithGrowth[0] || projects[0]); const averageGrowth = growthValues.length > 0 ? Math.round(growthValues.reduce((a, b) => a + b, 0) / growthValues.length) : 0; // 提取唯一语言列表(用于筛选) const languages = Object.keys(languageDistribution).sort(); // 生成图表数据 const growthData = projects.slice(0, 10).map(p => ({ name: p.name.split('/')[1] || p.name, growth: parseInt(p.starsThisPeriod.replace(/[+,]/g, '') || 0) })); return { languageDistribution, totalStars, topProject, growthStats: { highest: highestGrowth, average: averageGrowth }, languages, growthData }; } /** * 格式化 stars 数字 */ export function formatStars(starsStr: string): number { return parseInt(starsStr.replace(/,/g, '') || 0); } /** * 解析增长数值 */ export function parseGrowth(growthStr: string): number { if (!growthStr) return 0; return parseInt(growthStr.replace(/[+,]/g, '') || 0); } export default { analyzeData, formatStars, parseGrowth }; FILE:Templates/dashboard.hbs <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>GitHub Trending Dashboard - {{period}}</title> <!-- Tailwind CSS --> <script src="https://cdn.tailwindcss.com"></script> <script> tailwind.config = { theme: { extend: { colors: { github: { dark: '#0d1117', light: '#161b22', border: '#30363d', accent: '#58a6ff' } } } } } </script> <!-- Chart.js --> <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script> <style> body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; } .project-card { transition: all 0.3s ease; } .project-card:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0,0,0,0.15); } .stat-card { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); } .badge { display: inline-block; padding: 0.25rem 0.75rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; } .news-item { border-left: 3px solid #58a6ff; padding-left: 1rem; } </style> </head> <body class="bg-gray-50 min-h-screen"> <!-- 页头 --> <header class="bg-white shadow-sm sticky top-0 z-50"> <div class="max-w-7xl mx-auto px-4 py-4 sm:px-6 lg:px-8"> <div class="flex justify-between items-center"> <div> <h1 class="text-3xl font-bold text-gray-900">🚀 GitHub Trending Dashboard</h1> <p class="text-gray-600 mt-1"> 周期: <span class="font-semibold text-github-accent">{{period}}</span> | 生成时间: <span class="text-gray-500">{{generatedAt}}</span> </p> </div> <div class="flex gap-2"> <button onclick="window.print()" class="px-4 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium"> 🖨️ Print </button> </div> </div> </div> </header> <main class="max-w-7xl mx-auto px-4 py-8 sm:px-6 lg:px-8"> <!-- 统计概览 --> <section class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8"> <div class="stat-card rounded-xl p-6 text-white shadow-lg"> <h3 class="text-lg font-semibold opacity-90">项目总数</h3> <p class="text-4xl font-bold mt-2">{{projects.length}}</p> <p class="text-sm opacity-75 mt-1">{{period}} 热门趋势</p> </div> <div class="bg-gradient-to-br from-green-500 to-emerald-600 rounded-xl p-6 text-white shadow-lg"> <h3 class="text-lg font-semibold opacity-90">总 Stars 数</h3> <p class="text-4xl font-bold mt-2">{{analytics.totalStars}}</p> <p class="text-sm opacity-75 mt-1">所有项目总计</p> </div> <div class="bg-gradient-to-br from-orange-500 to-red-500 rounded-xl p-6 text-white shadow-lg"> <h3 class="text-lg font-semibold opacity-90">最热项目</h3> <p class="text-xl font-bold mt-2 truncate">{{analytics.topProject.name}}</p> <p class="text-sm opacity-75 mt-1">{{analytics.topProject.stars}} stars</p> </div> </section> <!-- 筛选和搜索 --> <section class="bg-white rounded-xl shadow-sm p-6 mb-8"> <div class="flex flex-wrap gap-4 items-center"> <div class="flex-1 min-w-64"> <label class="block text-sm font-medium text-gray-700 mb-1">搜索项目</label> <input type="text" id="searchInput" placeholder="按名称或描述搜索..." class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-github-accent focus:border-transparent" oninput="filterProjects()" > </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">语言筛选</label> <select id="languageFilter" class="px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-github-accent focus:border-transparent" onchange="filterProjects()" > <option value="all">全部语言</option> {{#each analytics.languages}} <option value="{{this}}">{{this}}</option> {{/each}} </select> </div> <div> <label class="block text-sm font-medium text-gray-700 mb-1">排序方式</label> <select id="sortSelect" class="px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-github-accent focus:border-transparent" onchange="sortProjects()" > <option value="rank">排名</option> <option value="stars">总 Stars</option> <option value="growth">本期增长</option> </select> </div> </div> </section> <!-- 语言分布图表 --> <section class="bg-white rounded-xl shadow-sm p-6 mb-8"> <h2 class="text-2xl font-bold text-gray-900 mb-4">📊 语言分布</h2> <div class="grid grid-cols-1 lg:grid-cols-2 gap-8"> <div> <canvas id="languageChart"></canvas> </div> <div> <canvas id="growthChart"></canvas> </div> </div> </section> <!-- Trending Projects --> <section class="mb-8"> <h2 class="text-2xl font-bold text-gray-900 mb-4">🔥 热门项目</h2> <div id="projects-container" class="grid grid-cols-1 gap-4"> {{#each projects}} <div class="project-card bg-white rounded-xl shadow-sm p-6 border border-gray-200" data-rank="{{rank}}" data-language="{{language}}" data-stars="{{stars}}" data-growth="{{starsThisPeriod}}" data-name="{{name}}" data-description="{{description}}"> <div class="flex items-start justify-between"> <div class="flex-1"> <div class="flex items-center gap-3 mb-2"> <span class="text-2xl font-bold text-github-accent">#{{rank}}</span> <h3 class="text-xl font-semibold text-gray-900"> <a href="{{url}}" target="_blank" class="hover:text-github-accent">{{name}}</a> </h3> <span class="badge bg-blue-100 text-blue-800">{{language}}</span> </div> <p class="text-gray-600 mb-3">{{description}}</p> <div class="flex items-center gap-4 text-sm text-gray-500"> <span>⭐ {{stars}} stars</span> {{#if starsThisPeriod}} <span class="text-green-600 font-semibold">(+{{starsThisPeriod}} this {{../period}})</span> {{/if}} </div> </div> <a href="{{url}}" target="_blank" class="px-4 py-2 bg-github-accent text-white rounded-lg hover:bg-blue-600 transition font-medium"> View → </a> </div> </div> {{/each}} </div> </section> <!-- Tech News --> {{#if news}} <section class="mb-8"> <h2 class="text-2xl font-bold text-gray-900 mb-4">📰 技术资讯</h2> <div class="grid grid-cols-1 gap-4"> {{#each news}} <div class="news-item bg-white rounded-xl shadow-sm p-5 hover:shadow-md transition"> <div class="flex items-start justify-between"> <div class="flex-1"> <h3 class="text-lg font-semibold text-gray-900 mb-1"> <a href="{{url}}" target="_blank" class="hover:text-github-accent">{{title}}</a> </h3> <div class="flex items-center gap-4 text-sm text-gray-500"> <span class="text-orange-600">📰 {{source}}</span> {{#if points}} <span>⬆️ {{points}} points</span> {{/if}} {{#if comments}} <span>💬 {{comments}} comments</span> {{/if}} </div> </div> </div> </div> {{/each}} </div> </section> {{/if}} </main> <!-- 页脚 --> <footer class="bg-white border-t border-gray-200 mt-12"> <div class="max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8"> <p class="text-center text-gray-500 text-sm"> 由 GitHubTrends Skill 生成 | 数据来源:GitHub 和 Hacker News </p> </div> </footer> <!-- JavaScript --> <script> // 注入数据 window.dashboardData = { projects: {{{json projects}}}, analytics: { languageDistribution: {{{json analytics.languageDistribution}}}, growthData: {{{json analytics.growthData}}} } }; // 初始化图表 document.addEventListener('DOMContentLoaded', function() { initLanguageChart(); initGrowthChart(); }); // 语言分布饼图 function initLanguageChart() { const ctx = document.getElementById('languageChart').getContext('2d'); const data = window.dashboardData.analytics.languageDistribution; new Chart(ctx, { type: 'pie', data: { labels: Object.keys(data), datasets: [{ data: Object.values(data), backgroundColor: [ '#58a6ff', '#238636', '#f1e05a', '#d73a49', '#8957E5', '#e34c26', '#CB3837', '#DA5B0B', '#4F5D95', '#563d7c' ] }] }, options: { responsive: true, plugins: { legend: { position: 'right' }, title: { display: true, text: 'Projects by Language' } } } }); } // Stars 增长柱状图 function initGrowthChart() { const ctx = document.getElementById('growthChart').getContext('2d'); const projects = window.dashboardData.projects.slice(0, 10); new Chart(ctx, { type: 'bar', data: { labels: projects.map(p => p.name.split('/')[1] || p.name), datasets: [{ label: 'Stars This Period', data: projects.map(p => parseInt(p.starsThisPeriod.replace('+', '') || 0)), backgroundColor: 'rgba(88, 166, 255, 0.8)', borderColor: 'rgba(88, 166, 255, 1)', borderWidth: 1 }] }, options: { responsive: true, indexAxis: 'y', plugins: { title: { display: true, text: 'Top 10 Growth' } }, scales: { x: { beginAtZero: true } } } }); } // 筛选项目 function filterProjects() { const searchValue = document.getElementById('searchInput').value.toLowerCase(); const languageValue = document.getElementById('languageFilter').value; const cards = document.querySelectorAll('.project-card'); cards.forEach(card => { const name = card.dataset.name.toLowerCase(); const description = card.dataset.description.toLowerCase(); const language = card.dataset.language; const matchesSearch = name.includes(searchValue) || description.includes(searchValue); const matchesLanguage = languageValue === 'all' || language === languageValue; card.style.display = matchesSearch && matchesLanguage ? 'block' : 'none'; }); } // 排序项目 function sortProjects() { const sortBy = document.getElementById('sortSelect').value; const container = document.getElementById('projects-container'); const cards = Array.from(container.children); cards.sort((a, b) => { switch(sortBy) { case 'stars': return parseInt(b.dataset.stars.replace(/,/g, '')) - parseInt(a.dataset.stars.replace(/,/g, '')); case 'growth': const growthA = parseInt(a.dataset.growth.replace(/[+,]/g, '') || 0); const growthB = parseInt(b.dataset.growth.replace(/[+,]/g, '') || 0); return growthB - growthA; case 'rank': default: return parseInt(a.dataset.rank) - parseInt(b.dataset.rank); } }); cards.forEach(card => container.appendChild(card)); } </script> </body> </html> FILE:Workflows/GenerateDashboard.md # GenerateDashboard Workflow 生成交互式数据可视化仪表板的工作流程。 ## Description 这个工作流使用 GenerateDashboard.ts 工具从 GitHub 获取 trending 项目,并生成交互式 HTML 仪表板,支持: - 项目卡片展示 - 语言分布饼图 - Stars 增长柱状图 - 技术新闻列表 - 实时筛选、排序、搜索功能 ## When to Use 当用户请求以下任何内容时使用此工作流: - "生成 GitHub trending 仪表板" - "创建趋势网页" - "生成可视化报告" - "export trending dashboard" - "生成交互式网页" ## Workflow Steps ### Step 1: 确定参数 向用户确认或推断以下参数: - **时间周期**: daily (每日) 或 weekly (每周,默认) - **编程语言**: 可选(如 TypeScript, Python, Go, Rust等) - **项目数量**: 默认10个 - **包含新闻**: 是否包含技术新闻 - **新闻数量**: 默认10条 - **输出路径**: 默认 ./github-trends.html ### Step 2: 执行工具 运行 GenerateDashboard.ts 工具: ```bash # 基本用法(本周,10个项目) bun ~/.claude/skills/GitHubTrends/Tools/GenerateDashboard.ts # 指定语言和新闻 bun ~/.claude/skills/GitHubTrends/Tools/GenerateDashboard.ts \ --period weekly \ --language TypeScript \ --limit 20 \ --include-news \ --news-count 15 \ --output ~/trends.html # 每日趋势 bun ~/.claude/skills/GitHubTrends/Tools/GenerateDashboard.ts \ --period daily \ --output ~/daily-trends.html ``` ### Step 3: 显示结果 工具会自动: 1. 获取 GitHub trending 数据 2. 获取技术新闻(如果启用) 3. 分析数据生成统计信息 4. 渲染 HTML 模板 5. 保存到指定路径 ### Step 4: 验证和打开 生成的 HTML 文件包含: - ✅ 响应式布局 - ✅ 项目卡片展示 - ✅ 语言分布饼图 - ✅ Stars 增长柱状图 - ✅ 实时筛选功能 - ✅ 排序功能 - ✅ 搜索功能 - ✅ 技术新闻列表 ## Example Usage ### Example 1: 基本仪表板 ``` User: "生成本周 GitHub trending 仪表板" Assistant: 运行 GenerateDashboard 工具... [执行命令,生成 /tmp/github-trends.html] ✅ 仪表板生成成功!已在浏览器中打开。 ``` ### Example 2: 包含新闻的仪表板 ``` User: "生成 TypeScript 项目的每日趋势,包含新闻" Assistant: 生成 TypeScript 每日趋势仪表板,包含技术新闻... [执行命令:--period daily --language TypeScript --include-news] ✅ 仪表板已生成到 ~/Downloads/ts-daily-trends.html ``` ### Example 3: 自定义输出 ``` User: "生成一个包含 20 个项目的仪表板,保存到桌面" Assistant: 生成 20 个项目的趋势仪表板... [执行命令:--limit 20 --output ~/Desktop/github-trends.html] ✅ 完成!文件已保存到桌面 ``` ## Tool Options | 参数 | 说明 | 默认值 | 可选值 | |------|------|--------|--------| | `--period` | 时间周期 | `weekly` | `daily`, `weekly` | | `--language` | 编程语言筛选 | 全部 | TypeScript, Python, Go, Rust等 | | `--limit` | 返回项目数量 | 10 | 任意正整数 | | `--include-news` | 包含技术新闻 | false | - | | `--news-count` | 新闻数量 | 10 | 任意正整数 | | `--theme` | 主题 | `auto` | `light`, `dark`, `auto` | | `--output` | 输出文件路径 | `./github-trends.html` | 任意路径 | ## Output Features ### 数据可视化 - **语言分布饼图**: 展示各编程语言的项目占比 - **Stars 增长柱状图**: 展示前 10 名项目的 stars 增长 ### 交互功能 - **搜索**: 按项目名称或描述搜索 - **筛选**: 按编程语言筛选 - **排序**: 按排名、总 stars、周期内增长排序 ### 响应式设计 - 支持桌面、平板、手机 - 使用 Tailwind CSS 构建美观界面 - GitHub 风格配色 ## Error Handling 如果遇到错误: 1. **网络错误**: 检查网络连接,确保能访问 GitHub 2. **解析失败**: GitHub 页面结构可能变化,工具会显示调试信息 3. **文件写入失败**: 检查输出路径的写权限 ## Voice Notification 执行此工作流时发送语音通知: ```bash curl -s -X POST http://localhost:8888/notify \ -H "Content-Type: application/json" \ -d '{"message": "正在生成 GitHub Trending Dashboard..."}' \ > /dev/null 2>&1 & ``` 并输出文本通知: ``` Running the **GenerateDashboard** workflow from the **GitHubTrends** skill... ``` ## Integration with Other Skills - **Browser**: 验证生成的 HTML 页面效果 - **System**: 保存仪表板快照到 MEMORY/ - **OSINT**: 分析技术栈趋势 ## Notes - 数据每小时更新一次(GitHub trending 更新频率) - 生成的 HTML 是完全独立的,无需服务器 - 所有依赖通过 CDN 加载(Tailwind CSS, Chart.js) - 支持离线查看(图表已内嵌数据) ## Advanced Usage ### 批量生成 ```bash # 生成多个语言的仪表板 for lang in TypeScript Python Go Rust; do bun Tools/GenerateDashboard.ts \ --language $lang \ --output ~/trends-$lang.html done ``` ### 定时任务 ```bash # 每小时生成一次快照 # 添加到 crontab: 0 * * * * cd ~/.claude/skills/GitHubTrends && bun Tools/GenerateDashboard.ts --output ~/trends-$(date +%H).html ``` ### 定制主题 通过修改 `Templates/dashboard.hbs` 可以自定义: - 配色方案 - 布局结构 - 添加新的图表类型 - 添加新的交互功能
Act as a Creepy Horror RPG Master. You are an expert in creating immersive and terrifying role-playing experiences set in a haunted town filled with supernatural mysteries. Your task is to: - Guide players through eerie settings and chilling scenarios. - Develop complex characters with sinister motives. - Introduce unexpected twists and chilling encounters. Rules: - Maintain a suspenseful and eerie atmosphere throughout the game. - Ensure player choices significantly impact the storyline. - Keep the horror elements intense but balanced with moments of relief.