Skip to content
Merged
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
13 changes: 13 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Workbench application
APP_NAME=Toolkit
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

DB_CONNECTION=testing

# Tavily API key (https://app.tavily.com)
TAVILY_API_KEY=

OPENAI_API_KEY=
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
uses: shivammathur/setup-php@7c071dfe9dc99bdf297fa79cb49ea005b9fcadbc # v2
with:
php-version: ${{ matrix.php }}
extensions: dom, mbstring, zip, fileinfo
extensions: dom, mbstring, zip, fileinfo, pdo_sqlite
coverage: pcov

- name: Get Composer cache directory
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
/phpunit.xml
/vendor/
/.idea/
/.env
/workbench/database/*.sqlite
*.swp
*.swo
.deepsec/
docs/node_modules/
.claude
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,17 @@ Toolkit is a community catalog of reusable AI tools for the [Laravel AI SDK](htt

> Requires PHP 8.4+ and `laravel/ai`.

## Available Tools

| Tool | Description |
|------|-------------|
| `CalculatorTool` | Evaluate mathematical expressions with perfect accuracy. Supports `+`, `-`, `*`, `/`, `%`, `^`, parentheses, and decimals. |
| `DatabaseQueryTool` | Run read-only `SELECT` queries against your Laravel database and return results as JSON. |
| `TavilySearch` | Search the web for real-time information using [Tavily](https://tavily.com). |
| `TavilyExtract` | Extract clean, structured content from URLs. |
| `TavilyCrawl` | Intelligently crawl a website and extract content. |
| `TavilyMap` | Discover and map a website's structure. |

## Official Documentation

Documentation for Toolkit can be found on the [documentation site](https://toolkit.shipfastlabs.com).
Expand Down
26 changes: 22 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,22 +33,28 @@
"replace": {
"shipfastlabs/toolkit-calculator": "self.version",
"shipfastlabs/toolkit-database": "self.version",
"shipfastlabs/toolkit-stub": "self.version"
"shipfastlabs/toolkit-stub": "self.version",
"shipfastlabs/toolkit-tavily": "self.version"
},
"minimum-stability": "dev",
"prefer-stable": true,
"autoload": {
"psr-4": {
"Shipfastlabs\\Toolkit\\": "src/",
"Shipfastlabs\\Toolkit\\Calculator\\": "src/Calculator/src/",
"Shipfastlabs\\Toolkit\\Database\\": "src/Database/src/"
"Shipfastlabs\\Toolkit\\Database\\": "src/Database/src/",
"Shipfastlabs\\Toolkit\\Tavily\\": "src/Tavily/src/"
}
},
"autoload-dev": {
"psr-4": {
"Shipfastlabs\\Toolkit\\Calculator\\Tests\\": "src/Calculator/tests/",
"Shipfastlabs\\Toolkit\\Database\\Tests\\": "src/Database/tests/",
"Shipfastlabs\\Toolkit\\Tests\\": "tests/"
"Shipfastlabs\\Toolkit\\Tavily\\Tests\\": "src/Tavily/tests/",
"Shipfastlabs\\Toolkit\\Tests\\": "tests/",
"Workbench\\App\\": "workbench/app/",
"Workbench\\Database\\Factories\\": "workbench/database/factories/",
"Workbench\\Database\\Seeders\\": "workbench/database/seeders/"
}
},
"config": {
Expand Down Expand Up @@ -90,6 +96,18 @@
"@mirrors:create",
"@split",
"@release"
],
"post-autoload-dump": [
"@clear",
"@prepare"
],
"clear": "@php vendor/bin/testbench package:purge-skeleton --ansi",
"prepare": "@php vendor/bin/testbench package:discover --ansi",
"build": "@php vendor/bin/testbench workbench:build --ansi",
"serve": [
"Composer\\Config::disableProcessTimeout",
"@build",
"@php vendor/bin/testbench serve --ansi"
]
},
"scripts-descriptions": {
Expand All @@ -102,4 +120,4 @@
"release": "Tag and release the tools changed in the latest commit.",
"publish": "Full release: create mirrors, split, then release."
}
}
}
199 changes: 133 additions & 66 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
@@ -1,81 +1,148 @@
import { defineConfig } from 'vitepress'
import llmstxt from 'vitepress-plugin-llms'
import { defineConfig } from "vitepress";
import llmstxt from "vitepress-plugin-llms";
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";

// https://vitepress.dev/reference/site-config
export default defineConfig({
title: 'Toolkit by Ship Fast Labs',
description: 'A community catalog of reusable AI tools for the Laravel AI SDK.',
cleanUrls: true,
lastUpdated: true,
// Auto-generate the Tools sidebar from docs/tools/*.md so new tools appear with
// no manual config edits. The markdown is generated by tools/sync-docs.sh, which
// stays the single source of truth. Title comes from each file's first H1,
// falling back to a capitalized slug.
const toolsDir = path.resolve(
path.dirname(fileURLToPath(import.meta.url)),
"../tools",
);

// Generate llms.txt, llms-full.txt and per-page markdown for LLM consumption.
vite: {
plugins: [
llmstxt({
title: 'shipfastlabs/toolkit',
description: 'A community catalog of reusable AI tools for the Laravel AI SDK.',
ignoreFiles: ['README.md'],
}),
],
},
function toolItems() {
return fs
.readdirSync(toolsDir)
.filter((file) => file.endsWith(".md"))
.map((file) => {
const slug = file.replace(/\.md$/, "");
const contents = fs.readFileSync(
path.join(toolsDir, file),
"utf-8",
);
const heading = contents.match(/^#\s+(.+)$/m)?.[1].trim();
const text = heading ?? slug.charAt(0).toUpperCase() + slug.slice(1);
return { text, link: `/tools/${slug}` };
})
.sort((a, b) => a.text.localeCompare(b.text));
}

// Dark-only design (hides the light/dark toggle).
appearance: 'force-dark',
const tools = toolItems();

head: [
['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }],
['link', { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' }],
['link', {
rel: 'stylesheet',
href: 'https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap',
}],
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "Toolkit by Ship Fast Labs",
description:
"A community catalog of reusable AI tools for the Laravel AI SDK.",
cleanUrls: true,
lastUpdated: true,

// Open Graph / Twitter card (image lives at docs/public/og.png).
['meta', { property: 'og:type', content: 'website' }],
['meta', { property: 'og:title', content: 'Toolkit by Ship Fast Labs' }],
['meta', { property: 'og:description', content: 'Reusable AI tools for the Laravel AI SDK.' }],
['meta', { property: 'og:url', content: 'https://toolkit.shipfastlabs.com/' }],
['meta', { property: 'og:image', content: 'https://toolkit.shipfastlabs.com/og.png' }],
['meta', { name: 'twitter:card', content: 'summary_large_image' }],
['meta', { name: 'twitter:image', content: 'https://toolkit.shipfastlabs.com/og.png' }],
],
// Generate llms.txt, llms-full.txt and per-page markdown for LLM consumption.
vite: {
plugins: [
llmstxt({
title: "shipfastlabs/toolkit",
description:
"A community catalog of reusable AI tools for the Laravel AI SDK.",
ignoreFiles: ["README.md"],
}),
],
},

themeConfig: {
logo: '/logo.svg',
// Dark-only design (hides the light/dark toggle).
appearance: "force-dark",

nav: [
{ text: 'Guide', link: '/guide/getting-started' },
{ text: 'Tools', link: '/tools/calculator' },
],
head: [
["link", { rel: "preconnect", href: "https://fonts.googleapis.com" }],
[
"link",
{
rel: "preconnect",
href: "https://fonts.gstatic.com",
crossorigin: "",
},
],
[
"link",
{
rel: "stylesheet",
href: "https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap",
},
],

sidebar: [
{
text: 'Guide',
items: [
{ text: 'Getting Started', link: '/guide/getting-started' },
{ text: 'Contributing', link: '/guide/contributing' },
// Open Graph / Twitter card (image lives at docs/public/og.png).
["meta", { property: "og:type", content: "website" }],
[
"meta",
{ property: "og:title", content: "Toolkit by Ship Fast Labs" },
],
[
"meta",
{
property: "og:description",
content: "Reusable AI tools for the Laravel AI SDK.",
},
],
},
{
text: 'Tools',
items: [
{ text: 'Calculator', link: '/tools/calculator' },
{ text: 'Database', link: '/tools/database' },
[
"meta",
{
property: "og:url",
content: "https://toolkit.shipfastlabs.com/",
},
],
[
"meta",
{
property: "og:image",
content: "https://toolkit.shipfastlabs.com/og.png",
},
],
["meta", { name: "twitter:card", content: "summary_large_image" }],
[
"meta",
{
name: "twitter:image",
content: "https://toolkit.shipfastlabs.com/og.png",
},
],
},
],

socialLinks: [
{ icon: 'github', link: 'https://github.com/shipfastlabs/toolkit' },
],
themeConfig: {
logo: "/logo.svg",

search: {
provider: 'local',
},
nav: [
{ text: "Guide", link: "/guide/getting-started" },
{ text: "Tools", link: tools[0]?.link ?? "/tools/calculator" },
],

sidebar: [
{
text: "Guide",
items: [
{ text: "Getting Started", link: "/guide/getting-started" },
{ text: "Contributing", link: "/guide/contributing" },
],
},
{
text: "Tools",
items: tools,
},
],

socialLinks: [
{ icon: "github", link: "https://github.com/shipfastlabs/toolkit" },
],

search: {
provider: "local",
},

footer: {
message: 'Released under the MIT License.',
copyright: 'Copyright © 2026 Shipfastlabs',
footer: {
message: "Released under the MIT License.",
copyright: "Copyright © 2026 Shipfastlabs",
},
},
},
})
});
Loading
Loading