diff --git a/brand/logos/engine_active.png b/brand/logos/engine_active.png new file mode 100644 index 0000000..4c3f34b Binary files /dev/null and b/brand/logos/engine_active.png differ diff --git a/brand/logos/engine_idle.png b/brand/logos/engine_idle.png new file mode 100644 index 0000000..f97b928 Binary files /dev/null and b/brand/logos/engine_idle.png differ diff --git a/brand/logos/ghost_active.png b/brand/logos/ghost_active.png new file mode 100644 index 0000000..68fb98e Binary files /dev/null and b/brand/logos/ghost_active.png differ diff --git a/brand/logos/ghost_idle.png b/brand/logos/ghost_idle.png new file mode 100644 index 0000000..75109d3 Binary files /dev/null and b/brand/logos/ghost_idle.png differ diff --git a/brand/logos/pulse_active.png b/brand/logos/pulse_active.png new file mode 100644 index 0000000..41b8bf8 Binary files /dev/null and b/brand/logos/pulse_active.png differ diff --git a/brand/logos/pulse_idle.png b/brand/logos/pulse_idle.png new file mode 100644 index 0000000..dd75514 Binary files /dev/null and b/brand/logos/pulse_idle.png differ diff --git a/brand/logos/sentinel_active.png b/brand/logos/sentinel_active.png new file mode 100644 index 0000000..c1c9ded Binary files /dev/null and b/brand/logos/sentinel_active.png differ diff --git a/brand/logos/sentinel_idle.png b/brand/logos/sentinel_idle.png new file mode 100644 index 0000000..845dd67 Binary files /dev/null and b/brand/logos/sentinel_idle.png differ diff --git a/brand/logos/v1.png b/brand/logos/v1.png new file mode 100644 index 0000000..3699943 Binary files /dev/null and b/brand/logos/v1.png differ diff --git a/brand/logos/v2.png b/brand/logos/v2.png new file mode 100644 index 0000000..e3f49c7 Binary files /dev/null and b/brand/logos/v2.png differ diff --git a/brand/logos/v3.png b/brand/logos/v3.png new file mode 100644 index 0000000..b572a95 Binary files /dev/null and b/brand/logos/v3.png differ diff --git a/brand/logos/v4.png b/brand/logos/v4.png new file mode 100644 index 0000000..806e50b Binary files /dev/null and b/brand/logos/v4.png differ diff --git a/brand/logos/v5.png b/brand/logos/v5.png new file mode 100644 index 0000000..712a905 Binary files /dev/null and b/brand/logos/v5.png differ diff --git a/brand/logos/v6.png b/brand/logos/v6.png new file mode 100644 index 0000000..c070d81 Binary files /dev/null and b/brand/logos/v6.png differ diff --git a/brand/logos/v7.png b/brand/logos/v7.png new file mode 100644 index 0000000..58adc73 Binary files /dev/null and b/brand/logos/v7.png differ diff --git a/brand/logos/v8.png b/brand/logos/v8.png new file mode 100644 index 0000000..f74c9c5 Binary files /dev/null and b/brand/logos/v8.png differ diff --git a/logs/user_prompt_submit.json b/logs/user_prompt_submit.json new file mode 100644 index 0000000..75bb06d --- /dev/null +++ b/logs/user_prompt_submit.json @@ -0,0 +1,10 @@ +[ + { + "session_id": "c696a6ba-089c-47d9-95c7-3ba087b1e3a7", + "transcript_path": "/Users/wolfgangschoenberger/.claude/projects/-Users-wolfgangschoenberger-Projects-fgp/c696a6ba-089c-47d9-95c7-3ba087b1e3a7.jsonl", + "cwd": "/Users/wolfgangschoenberger/Projects/fgp/protocol", + "permission_mode": "bypassPermissions", + "hook_event_name": "UserPromptSubmit", + "prompt": "start implementing github tap registry system" + } +] \ No newline at end of file diff --git a/schemas/skill.schema.json b/schemas/skill.schema.json new file mode 100644 index 0000000..97a849f --- /dev/null +++ b/schemas/skill.schema.json @@ -0,0 +1,294 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://fgp.dev/schemas/skill.schema.json", + "title": "FGP Skill Manifest", + "description": "Schema for FGP skill packages - composed tools with instructions and triggers", + "type": "object", + "required": ["name", "version", "description", "author"], + "properties": { + "name": { + "type": "string", + "pattern": "^[a-z][a-z0-9-]*$", + "minLength": 2, + "maxLength": 64, + "description": "Skill name (lowercase, alphanumeric with hyphens)" + }, + "version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?$", + "description": "Semantic version (e.g., 1.0.0, 2.1.0-beta.1)" + }, + "description": { + "type": "string", + "minLength": 10, + "maxLength": 500, + "description": "Brief description of what the skill does" + }, + "author": { + "oneOf": [ + { "type": "string" }, + { + "type": "object", + "required": ["name"], + "properties": { + "name": { "type": "string" }, + "email": { "type": "string", "format": "email" }, + "url": { "type": "string", "format": "uri" } + } + } + ], + "description": "Author name or object with name, email, and URL" + }, + "license": { + "type": "string", + "description": "SPDX license identifier (e.g., MIT, Apache-2.0)" + }, + "repository": { + "type": "string", + "format": "uri", + "description": "URL to the skill's source repository" + }, + "homepage": { + "type": "string", + "format": "uri", + "description": "URL to the skill's homepage or documentation" + }, + "keywords": { + "type": "array", + "items": { "type": "string" }, + "maxItems": 10, + "description": "Keywords for discovery" + }, + "daemons": { + "type": "array", + "items": { + "type": "object", + "required": ["name"], + "properties": { + "name": { + "type": "string", + "description": "Daemon name (e.g., browser, gmail, calendar)" + }, + "version": { + "type": "string", + "description": "Version requirement (e.g., >=1.0.0, ^2.0.0)" + }, + "optional": { + "type": "boolean", + "default": false, + "description": "Whether this daemon is optional" + }, + "methods": { + "type": "array", + "items": { "type": "string" }, + "description": "Specific methods this skill uses (for permissions)" + } + } + }, + "description": "FGP daemon dependencies" + }, + "instructions": { + "type": "object", + "properties": { + "core": { + "type": "string", + "description": "Path to core instruction file (agent-agnostic)" + }, + "claude-code": { + "type": "string", + "description": "Path to Claude Code specific instructions" + }, + "cursor": { + "type": "string", + "description": "Path to Cursor specific instructions" + }, + "codex": { + "type": "string", + "description": "Path to Codex specific instructions" + }, + "windsurf": { + "type": "string", + "description": "Path to Windsurf specific instructions" + }, + "mcp": { + "type": "string", + "description": "Path to MCP tool schema" + } + }, + "description": "Agent-specific instruction files" + }, + "triggers": { + "type": "object", + "properties": { + "keywords": { + "type": "array", + "items": { "type": "string" }, + "description": "Keywords that trigger this skill" + }, + "patterns": { + "type": "array", + "items": { "type": "string" }, + "description": "Natural language patterns (e.g., 'research {topic}')" + }, + "commands": { + "type": "array", + "items": { "type": "string" }, + "description": "Explicit commands (e.g., '/research')" + } + }, + "description": "Trigger conditions for invoking the skill" + }, + "workflows": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": ["file"], + "properties": { + "file": { + "type": "string", + "description": "Path to workflow YAML file" + }, + "description": { + "type": "string", + "description": "Description of what this workflow does" + }, + "default": { + "type": "boolean", + "default": false, + "description": "Whether this is the default workflow" + } + } + }, + "description": "Named workflows included in this skill" + }, + "config": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": ["type"], + "properties": { + "type": { + "type": "string", + "enum": ["string", "number", "boolean", "enum", "array"], + "description": "Configuration value type" + }, + "description": { + "type": "string", + "description": "Description of this configuration option" + }, + "default": { + "description": "Default value" + }, + "required": { + "type": "boolean", + "default": false, + "description": "Whether this configuration is required" + }, + "options": { + "type": "array", + "description": "Valid options for enum type" + } + } + }, + "description": "User-configurable options" + }, + "auth": { + "type": "object", + "properties": { + "daemons": { + "type": "object", + "additionalProperties": { + "type": "string", + "enum": ["required", "optional"] + }, + "description": "Daemon auth requirements" + }, + "secrets": { + "type": "array", + "items": { + "type": "object", + "required": ["name"], + "properties": { + "name": { + "type": "string", + "pattern": "^[A-Z][A-Z0-9_]*$", + "description": "Environment variable name" + }, + "description": { + "type": "string", + "description": "Description of what this secret is for" + }, + "required": { + "type": "boolean", + "default": false, + "description": "Whether this secret is required" + } + } + }, + "description": "User-provided secrets (API keys, etc.)" + } + }, + "description": "Authentication requirements" + }, + "permissions": { + "type": "object", + "properties": { + "daemons": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { "type": "string", "enum": ["all", "deny"] }, + { "type": "array", "items": { "type": "string" } } + ] + }, + "description": "Daemon method permissions" + }, + "network": { + "type": "boolean", + "default": false, + "description": "Whether skill can make HTTP requests" + }, + "subprocess": { + "type": "boolean", + "default": false, + "description": "Whether skill can spawn processes" + }, + "env_vars": { + "type": "array", + "items": { "type": "string" }, + "description": "Allowed environment variables" + } + }, + "description": "Permission declarations" + }, + "exports": { + "type": "object", + "properties": { + "claude-code": { + "type": "object", + "properties": { + "enabled": { "type": "boolean", "default": true }, + "skill_name": { "type": "string" }, + "triggers": { "type": "array", "items": { "type": "string" } } + } + }, + "cursor": { + "type": "object", + "properties": { + "enabled": { "type": "boolean", "default": true }, + "rules_file": { "type": "string" } + } + }, + "mcp": { + "type": "object", + "properties": { + "enabled": { "type": "boolean", "default": true }, + "tools_prefix": { "type": "string" } + } + } + }, + "description": "Agent export configuration" + } + }, + "additionalProperties": false +} diff --git a/skills/research-assistant/README.md b/skills/research-assistant/README.md new file mode 100644 index 0000000..33035ac --- /dev/null +++ b/skills/research-assistant/README.md @@ -0,0 +1,70 @@ +# Research Assistant Skill + +A composed FGP skill that demonstrates the skill package format. + +## Installation + +```bash +fgp skill install research-assistant +``` + +## Usage + +### Via Natural Language (Claude Code / Cursor) + +``` +research quantum computing basics +look up the latest AI trends +find information about climate change solutions +``` + +### Via Command + +```bash +fgp workflow run research --topic "quantum computing" +``` + +### With Email Output + +```bash +fgp workflow run research --topic "AI trends 2026" --email-to "you@example.com" +``` + +## Configuration + +Edit `~/.fgp/skills/research-assistant/config.yaml`: + +```yaml +search_engine: google # google, duckduckgo, bing +email_results: false +max_results: 10 +``` + +## Requirements + +- **browser** daemon (required) +- **gmail** daemon (optional, for email output) + +## Workflows + +| Workflow | Description | +|----------|-------------| +| `research` | Full research with optional email (default) | +| `quick-search` | Fast search, no email | + +## Development + +```bash +# Validate the skill manifest +fgp skill validate ./ + +# Export for Claude Code +fgp skill export claude-code research-assistant + +# Run workflow locally +fgp workflow run research --topic "test" --dry-run +``` + +## License + +MIT diff --git a/skills/research-assistant/instructions/claude-code.md b/skills/research-assistant/instructions/claude-code.md new file mode 100644 index 0000000..7c26532 --- /dev/null +++ b/skills/research-assistant/instructions/claude-code.md @@ -0,0 +1,51 @@ +# Research Assistant - Claude Code Instructions + +## When to Use This Skill + +Invoke this skill when the user: +- Asks to research a topic ("research quantum computing") +- Wants to look something up ("look up the latest AI news") +- Requests information gathering ("find information about...") +- Uses the /research command + +## How to Execute + +### Step 1: Start Browser Daemon +```bash +fgp call browser.open -p '{"url": "https://google.com"}' +``` + +### Step 2: Perform Search +```bash +fgp call browser.fill -p '{"selector": "input[name=q]", "value": "{topic}"}' +fgp call browser.click -p '{"selector": "input[type=submit]"}' +``` + +### Step 3: Extract Results +```bash +fgp call browser.snapshot +``` + +### Step 4: Email Results (Optional) +If the user requested email output: +```bash +fgp call gmail.send -p '{"to": "{email}", "subject": "Research: {topic}", "body": "{summary}"}' +``` + +## Response Format + +After gathering information, present results as: +1. **Summary** - Brief overview of findings +2. **Key Points** - Bullet list of important information +3. **Sources** - Links to relevant pages + +## Error Handling + +- If browser daemon is not running, start it with `fgp start browser` +- If Gmail is not configured, inform user and skip email step +- If search returns no results, suggest alternative search terms + +## Performance + +- Browser operations: ~10ms each +- Full research workflow: ~500ms-2s depending on page load diff --git a/skills/research-assistant/instructions/core.md b/skills/research-assistant/instructions/core.md new file mode 100644 index 0000000..db8cf88 --- /dev/null +++ b/skills/research-assistant/instructions/core.md @@ -0,0 +1,41 @@ +# Research Assistant Skill + +This skill helps you research topics using web search and optionally email the findings. + +## Capabilities + +- **Web Search**: Search the web for information on any topic +- **Content Extraction**: Extract and summarize relevant content from search results +- **Email Output**: Optionally email the research findings (requires Gmail daemon) + +## Usage + +### Basic Research +``` +research {topic} +``` + +Example: "research quantum computing basics" + +### Research with Email +``` +research {topic} and email results to {email} +``` + +Example: "research AI trends 2026 and email results to john@example.com" + +## Available Workflows + +1. **research** (default) - Full research workflow with optional email +2. **quick-search** - Fast search without email output + +## Configuration + +- `search_engine`: google (default), duckduckgo, or bing +- `email_results`: true/false (default: false) +- `max_results`: number of results to return (default: 10) + +## Dependencies + +- **browser** daemon (required) - For web navigation and content extraction +- **gmail** daemon (optional) - For emailing results diff --git a/skills/research-assistant/instructions/cursor.md b/skills/research-assistant/instructions/cursor.md new file mode 100644 index 0000000..4d8225b --- /dev/null +++ b/skills/research-assistant/instructions/cursor.md @@ -0,0 +1,36 @@ +# Research Assistant - Cursor Rules + +## Trigger Detection + +When user mentions: +- "research" + topic +- "look up" + topic +- "search for" + topic +- "/research" command + +## Execution Pattern + +1. Parse the topic from user input +2. Use FGP browser daemon for web search +3. Extract and summarize results +4. Optionally email findings if requested + +## Commands + +```bash +# Open search engine +fgp call browser.open -p '{"url": "https://google.com/search?q={encoded_topic}"}' + +# Get page content +fgp call browser.snapshot + +# Send email (if requested) +fgp call gmail.send -p '{"to": "{email}", "subject": "Research: {topic}", "body": "{content}"}' +``` + +## Output Format + +Present research findings in markdown format with: +- Summary section +- Key findings as bullet points +- Source URLs diff --git a/skills/research-assistant/skill.yaml b/skills/research-assistant/skill.yaml new file mode 100644 index 0000000..3d600c5 --- /dev/null +++ b/skills/research-assistant/skill.yaml @@ -0,0 +1,126 @@ +# FGP Skill Manifest - Research Assistant +# This skill demonstrates the composed skill format + +name: research-assistant +version: 1.0.0 +description: Research topics using web search and optionally email findings +author: + name: FGP Team + email: team@fgp.dev + url: https://fgp.dev +license: MIT +repository: https://github.com/fast-gateway-protocol/skills +homepage: https://fgp.dev/skills/research-assistant +keywords: + - research + - search + - browser + - email + +# Daemon dependencies (Layer 0) +daemons: + - name: browser + version: ">=1.0.0" + methods: + - open + - snapshot + - fill + - click + - name: gmail + version: ">=1.0.0" + optional: true + methods: + - send + +# Agent instructions (portable across agents) +instructions: + core: ./instructions/core.md + claude-code: ./instructions/claude-code.md + cursor: ./instructions/cursor.md + +# Triggers (when to invoke this skill) +triggers: + keywords: + - research + - look up + - find information + - search for + - what is + patterns: + - "research {topic}" + - "look up {topic}" + - "find information about {topic}" + - "what do you know about {topic}" + commands: + - /research + +# Workflows (executable multi-step operations) +workflows: + research: + file: ./workflows/research.yaml + description: Full research workflow with optional email output + default: true + quick-search: + file: ./workflows/quick-search.yaml + description: Fast browser search without email + +# User configuration +config: + search_engine: + type: enum + description: Search engine to use + options: + - google + - duckduckgo + - bing + default: google + email_results: + type: boolean + description: Whether to email research results + default: false + max_results: + type: number + description: Maximum number of results to return + default: 10 + +# Authentication requirements +auth: + daemons: + browser: required + gmail: optional + secrets: + - name: SERP_API_KEY + description: API key for enhanced search results (optional) + required: false + +# Permission declarations +permissions: + daemons: + browser: + - open + - snapshot + - fill + - click + gmail: + - send + filesystem: deny + network: true + subprocess: false + env_vars: + - SERP_API_KEY + +# Export configuration +exports: + claude-code: + enabled: true + skill_name: research-assistant + triggers: + - research + - look up + - search + cursor: + enabled: true + rules_file: ./exports/cursor-rules.md + mcp: + enabled: true + tools_prefix: research diff --git a/skills/research-assistant/workflows/quick-search.yaml b/skills/research-assistant/workflows/quick-search.yaml new file mode 100644 index 0000000..38b8c94 --- /dev/null +++ b/skills/research-assistant/workflows/quick-search.yaml @@ -0,0 +1,28 @@ +# Quick Search Workflow +# Fast browser search without email output + +name: quick-search +description: Fast web search without email output +version: 1.0.0 + +inputs: + topic: + type: string + required: true + description: The topic to search for + +steps: + - id: navigate_to_search + daemon: browser + method: open + params: + url: "https://google.com/search?q={{ topic | urlencode }}" + + - id: get_results + daemon: browser + method: snapshot + depends_on: [navigate_to_search] + output: page_content + +outputs: + content: "{{ page_content }}" diff --git a/skills/research-assistant/workflows/research.yaml b/skills/research-assistant/workflows/research.yaml new file mode 100644 index 0000000..480d483 --- /dev/null +++ b/skills/research-assistant/workflows/research.yaml @@ -0,0 +1,102 @@ +# Full Research Workflow +# Performs web search and optionally emails results + +name: research +description: Research a topic and optionally email the findings +version: 1.0.0 + +inputs: + topic: + type: string + required: true + description: The topic to research + email_to: + type: string + required: false + description: Email address to send results to + search_engine: + type: string + default: google + description: Search engine to use (google, duckduckgo, bing) + +steps: + - id: build_search_url + type: template + template: | + {% if search_engine == "google" %} + https://google.com/search?q={{ topic | urlencode }} + {% elif search_engine == "duckduckgo" %} + https://duckduckgo.com/?q={{ topic | urlencode }} + {% else %} + https://bing.com/search?q={{ topic | urlencode }} + {% endif %} + output: search_url + + - id: navigate_to_search + daemon: browser + method: open + params: + url: "{{ search_url }}" + depends_on: [build_search_url] + + - id: wait_for_results + type: sleep + duration_ms: 1000 + depends_on: [navigate_to_search] + + - id: get_page_content + daemon: browser + method: snapshot + depends_on: [wait_for_results] + output: page_content + + - id: extract_results + type: transform + input: "{{ page_content }}" + transform: | + # Extract search results from ARIA tree + # Returns structured data with titles, URLs, snippets + output: search_results + + - id: format_summary + type: template + template: | + # Research Results: {{ topic }} + + ## Summary + Found {{ search_results | length }} results for "{{ topic }}". + + ## Top Results + {% for result in search_results[:5] %} + - **{{ result.title }}** + {{ result.snippet }} + [Link]({{ result.url }}) + {% endfor %} + + --- + Generated by FGP Research Assistant + output: summary + depends_on: [extract_results] + + - id: send_email + daemon: gmail + method: send + condition: "{{ email_to is defined and email_to != '' }}" + params: + to: "{{ email_to }}" + subject: "Research: {{ topic }}" + body: "{{ summary }}" + depends_on: [format_summary] + +outputs: + summary: "{{ summary }}" + results: "{{ search_results }}" + email_sent: "{{ send_email.success | default(false) }}" + +error_handling: + on_browser_error: + message: "Browser daemon not available. Start with: fgp start browser" + retry: false + on_gmail_error: + message: "Email could not be sent. Gmail daemon may not be configured." + continue: true # Don't fail the whole workflow diff --git a/tap.yaml b/tap.yaml new file mode 100644 index 0000000..466c550 --- /dev/null +++ b/tap.yaml @@ -0,0 +1,17 @@ +# FGP Official Skills Tap +# This repository contains officially maintained FGP skills + +name: official-skills +description: Official FGP skills maintained by the Fast Gateway Protocol team +author: Fast Gateway Protocol +homepage: https://fgp.dev + +# Categories of skills in this tap +categories: + - research + - productivity + - communication + - development + +# Minimum FGP CLI version required +min_cli_version: "0.1.0"