diff --git a/docs/README.skills.md b/docs/README.skills.md index 7d39a9ab0..572a74601 100644 --- a/docs/README.skills.md +++ b/docs/README.skills.md @@ -267,6 +267,7 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-skills) for guidelines on how to | [java-upgrade](../skills/java-upgrade/SKILL.md)
`gh skills install github/awesome-copilot java-upgrade` | Upgrade a Java project to a newer JDK (11 to 17, 17 to 21, 21 to 25) and adopt the new language and library features. Detects the current Java version from the build files, then loads only the matching per-version guide. Use when the user asks to upgrade Java, modernize Java code, or adopt records, sealed classes, pattern matching, virtual threads or other new Java features. For automated end-to-end upgrades see the modernize-java plugin. | `references/java-11-to-17.md`
`references/java-17-to-21.md`
`references/java-21-to-25.md`
`references/upstream-sources.md` | | [javascript-typescript-jest](../skills/javascript-typescript-jest/SKILL.md)
`gh skills install github/awesome-copilot javascript-typescript-jest` | Best practices for writing JavaScript/TypeScript tests using Jest, including mocking strategies, test structure, and common patterns. | None | | [javax-to-jakarta-migration](../skills/javax-to-jakarta-migration/SKILL.md)
`gh skills install github/awesome-copilot javax-to-jakarta-migration` | Migrate Java code from javax.* to jakarta.* namespace. Use only when the user explicitly asks for a javax to jakarta namespace or framework migration (for example to Tomcat 10+/11 or Jakarta EE), or when java-upgrade or spring-boot-4-migration delegates it. Finding javax imports alone does not authorize a migration. | None | +| [keenable-web-search](../skills/keenable-web-search/SKILL.md)
`gh skills install github/awesome-copilot keenable-web-search` | Search the web and read pages as clean markdown with Keenable, with no API key. Use when a task needs current information, documentation, release notes, changelogs, error reports, or the content of a known URL, and cite the sources used. | None | | [kotlin-mcp-server-generator](../skills/kotlin-mcp-server-generator/SKILL.md)
`gh skills install github/awesome-copilot kotlin-mcp-server-generator` | Generate a complete Kotlin MCP server project with proper structure, dependencies, and implementation using the official io.modelcontextprotocol:kotlin-sdk library. | None | | [kotlin-springboot](../skills/kotlin-springboot/SKILL.md)
`gh skills install github/awesome-copilot kotlin-springboot` | Get best practices for developing applications with Spring Boot and Kotlin. | None | | [landing-page-conversion-audit](../skills/landing-page-conversion-audit/SKILL.md)
`gh skills install github/awesome-copilot landing-page-conversion-audit` | Audit a landing page, sales page or checkout page for conversion leaks and return a fix list ordered by expected revenue impact. Use when asked to review, critique or improve a landing page, sales page, opt-in page, product page or checkout flow, when conversion rate is low, when paid traffic is not converting, or when someone asks "why isn't this page converting" or wants a CRO / landing page review. | None | diff --git a/skills/keenable-web-search/SKILL.md b/skills/keenable-web-search/SKILL.md new file mode 100644 index 000000000..36aee2bcc --- /dev/null +++ b/skills/keenable-web-search/SKILL.md @@ -0,0 +1,72 @@ +--- +name: keenable-web-search +description: 'Search the web and read pages as clean markdown with Keenable, with no API key. Use when a task needs current information, documentation, release notes, changelogs, error reports, or the content of a known URL, and cite the sources used.' +--- + +# Keenable Web Search + +Use [Keenable](https://keenable.ai) to find current, source-grounded information on the web and to read pages as clean markdown. Keenable works without an API key on a public tier, so this skill works on a fresh machine. + +## When to Use This Skill + +- The answer depends on something newer than your training data: a library release, a breaking change, a CVE, a deprecation notice. +- You need the exact content of a URL the user gave you (docs page, issue, changelog, blog post). +- You need sources to cite for a factual claim in code comments, a PR description, or an ADR. + +## Option A: Keenable MCP server (preferred) + +If the `keenable` MCP server is configured, use its two tools: + +- `search_web_pages` — ranked results (title, URL, excerpt). Optional `site` (one domain) and `published_after` / `published_before` (YYYY-MM-DD). +- `fetch_page_content` — any URL as markdown. Optional `max_chars`. + +To add it in VS Code, put this in `.vscode/mcp.json`: + +```json +{ + "servers": { + "keenable": { + "type": "http", + "url": "https://api.keenable.ai/mcp" + } + } +} +``` + +## Option B: HTTP API from the terminal (no MCP needed) + +The keyless endpoints need only an `X-Keenable-Title` header that names your app. + +Search: + +```bash +curl -s -X POST "https://api.keenable.ai/v1/search/public" \ + -H "X-Keenable-Title: copilot-keenable-web-search" \ + -H "Content-Type: application/json" \ + -d '{"query": "zod 4 release notes breaking changes", "max_results": 5}' +``` + +The response is JSON: `results[]` with `title`, `url` and `snippet`. + +Read a page as markdown: + +```bash +curl -s "https://api.keenable.ai/v1/fetch/public?url=https://zod.dev/v4/changelog&live=true" \ + -H "X-Keenable-Title: copilot-keenable-web-search" +``` + +The response is JSON with `url`, `title` and `content` (markdown). Use `live=true` for pages that change often or may not be indexed yet. + +If the user has a Keenable API key in `KEENABLE_API_KEY`, call `/v1/search` and `/v1/fetch` instead and send `-H "X-API-Key: $KEENABLE_API_KEY"` to lift the hourly limit. Never ask the user to paste a key into chat. + +## Workflow + +1. Write the query as a description of the page you want ("release notes for zod 4 breaking changes"), not a bag of keywords. +2. Narrow with `site` or a date filter instead of extra query words. Turn relative dates ("last week") into exact dates first. +3. Read the most relevant one to three results in full before relying on them. Snippets are for triage, not evidence. +4. Prefer primary sources: official docs, release notes, the project's own repo. +5. Answer in your own words and list the URLs you used. + +## Limits + +Keyless use is limited to 1,000 requests per hour per IP (shared by everyone on that IP) and 10 per second. On a `429`, wait and retry, and mention that a Keenable API key lifts the hourly cap. See https://docs.keenable.ai/rate-limits.