Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .github/workflows/skill-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Tessl Skill Review β€” runs on PRs that change any SKILL.md; posts scores as one PR comment.
# Docs: https://github.com/tesslio/skill-review
name: Tessl Skill Review

on:
pull_request:
branches: [main]
paths:
- "**/SKILL.md"

jobs:
review:
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: tesslio/skill-review@main
# Optional quality gate (off by default β€” do not enable unless user asked):
# with:
# fail-threshold: 70
63 changes: 15 additions & 48 deletions application/skills/book-search/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,75 +1,42 @@
---
name: book-search
description: Search for books using Kyobo Book Centre's online catalog. Use when users want to find books by keyword, title, author, or topic. Supports Korean and English search terms and returns book titles with direct purchase links. Perfect for book recommendations, finding specific titles, or discovering books on particular subjects.
description: "Search for books using Kyobo Book Centre's online catalog. Use when users want to find books by keyword, title, author, or topic. Supports Korean and English search terms and returns book titles with direct purchase links. Perfect for book recommendations, finding specific titles, or discovering books on particular subjects."
---

# Book Search

Search for books using Kyobo Book Centre's comprehensive online catalog.
Search for books using Kyobo Book Centre's online catalog.

## Quick Start
## Script Location

Use the search script to find books by any keyword:
**IMPORTANT**: Always use the FULL path `skills/book-search/scripts/search_books.py` β€” do NOT shorten to `scripts/search_books.py`.

## Quick Start

```python
import subprocess
result = subprocess.run(['python', 'scripts/search_books.py', 'keyword'],
capture_output=True, text=True, cwd='book-search')
result = subprocess.run(['python', 'skills/book-search/scripts/search_books.py', 'keyword'],
capture_output=True, text=True)
print(result.stdout)
```

## Script Location

The search script is located at `skills/book-search/scripts/search_books.py` relative to the application working directory.
**IMPORTANT**: Always use the FULL path `skills/book-search/scripts/search_books.py` β€” do NOT shorten to `scripts/search_books.py`.

## Features

- **Keyword Search**: Find books by title, author, topic, or any relevant term
- **Korean & English Support**: Search in both Korean and English
- **Top Results**: Returns up to 5 most relevant books
- **Direct Links**: Provides direct URLs to book pages for purchase
- **Error Handling**: Graceful handling of network issues and parsing errors

## Usage Examples

### Basic Search
```python
# Search for programming books
result = subprocess.run(['python', 'scripts/search_books.py', 'ν”„λ‘œκ·Έλž˜λ°'],
capture_output=True, text=True, cwd='book-search')
```
# Search by keyword (Korean)
subprocess.run(['python', 'skills/book-search/scripts/search_books.py', 'ν”„λ‘œκ·Έλž˜λ°'], capture_output=True, text=True)

### Author Search
```python
# Search by author name
result = subprocess.run(['python', 'scripts/search_books.py', '무라카미 ν•˜λ£¨ν‚€'],
capture_output=True, text=True, cwd='book-search')
```
# Search by author
subprocess.run(['python', 'skills/book-search/scripts/search_books.py', '무라카미 ν•˜λ£¨ν‚€'], capture_output=True, text=True)

### Topic Search
```python
# Search by topic
result = subprocess.run(['python', 'scripts/search_books.py', 'artificial intelligence'],
capture_output=True, text=True, cwd='book-search')
# Search by topic (English)
subprocess.run(['python', 'skills/book-search/scripts/search_books.py', 'artificial intelligence'], capture_output=True, text=True)
```

## Implementation Notes

- Uses web scraping with proper User-Agent headers
- Handles URL encoding for special characters
- Returns formatted results with titles and purchase links
- Limited to top 5 results to avoid overwhelming output
- Includes error handling for network and parsing issues
Returns up to 5 results with titles and direct Kyobo purchase links.

## Dependencies

The script requires:
- `requests` - for HTTP requests
- `beautifulsoup4` - for HTML parsing
- `urllib.parse` - for URL encoding (built-in)

Install dependencies:
```bash
pip install requests beautifulsoup4
```
48 changes: 28 additions & 20 deletions application/skills/notion/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
---
name: notion
description: Notion API for creating and managing pages, databases, and blocks.
homepage: https://developers.notion.com
description: "Interact with Notion workspaces via the Notion API. Create, read, update, and search pages, databases (data sources), and blocks. Use when the user mentions Notion, wants to create or edit Notion pages, query Notion databases, manage workspace content, add blocks, update properties, or sync data with Notion. Triggers on terms like 'Notion', 'Notion page', 'Notion database', 'Notion doc', 'add to Notion', 'Notion workspace'. Requires NOTION_API_KEY."
---

# notion
# Notion API

Use the Notion API to create/read/update pages, data sources (databases), and blocks.
Create, read, update, and search pages, databases (data sources), and blocks via the Notion API.

## Setup

Expand All @@ -15,18 +14,25 @@ Use the Notion API to create/read/update pages, data sources (databases), and bl
3. Set the environment variable `NOTION_API_KEY`
4. Share target pages/databases with your integration (click "..." β†’ "Connect to" β†’ your integration name)

**Verify connection:**

```bash
curl -s "https://api.notion.com/v1/users/me" \
-H "Authorization: Bearer $NOTION_API_KEY" \
-H "Notion-Version: 2025-09-03" | python3 -c "import sys,json; print(json.load(sys.stdin).get('name','ERROR'))"
```

## API Basics

All requests need:
All requests require these headers:

```bash
curl -X GET "https://api.notion.com/v1/..." \
-H "Authorization: Bearer $NOTION_API_KEY" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json"
-H "Authorization: Bearer $NOTION_API_KEY" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json"
```

> **Note:** The `Notion-Version` header is required. This skill uses `2025-09-03` (latest). In this version, databases are called "data sources" in the API.
> **Note:** `Notion-Version: 2025-09-03` is the latest. In this version, databases are called "data sources" in the API.

## Common Operations

Expand All @@ -40,20 +46,14 @@ curl -X POST "https://api.notion.com/v1/search" \
-d '{"query": "page title"}'
```

**Get page:**
**Get page / page content:**

```bash
curl "https://api.notion.com/v1/pages/{page_id}" \
-H "Authorization: Bearer $NOTION_API_KEY" \
-H "Notion-Version: 2025-09-03"
```
-H "Authorization: Bearer $NOTION_API_KEY" -H "Notion-Version: 2025-09-03"

**Get page content (blocks):**

```bash
curl "https://api.notion.com/v1/blocks/{page_id}/children" \
-H "Authorization: Bearer $NOTION_API_KEY" \
-H "Notion-Version: 2025-09-03"
-H "Authorization: Bearer $NOTION_API_KEY" -H "Notion-Version: 2025-09-03"
```

**Create page in a data source:**
Expand Down Expand Up @@ -152,9 +152,17 @@ Common property formats for database items:
- **Parent in responses:** Pages show `parent.data_source_id` alongside `parent.database_id`
- **Finding the data_source_id:** Search for the database, or call `GET /v1/data_sources/{data_source_id}`

## Troubleshooting

| Error | Cause | Fix |
|-------|-------|-----|
| 401 Unauthorized | Bad or missing API key | Check `NOTION_API_KEY` is set and valid |
| 403 Forbidden | Page not shared with integration | Share page via "..." β†’ "Connect to" |
| 404 Not Found | Wrong page/database ID | Verify UUID; try searching first |
| 429 Rate Limited | Too many requests (~3/sec avg) | Add delays between calls |

## Notes

- Page/database IDs are UUIDs (with or without dashes)
- The API cannot set database view filters β€” that's UI-only
- Rate limit: ~3 requests/second average
- Use `is_inline: true` when creating data sources to embed them in pages
Loading