diff --git a/.gitignore b/.gitignore index 6412b33b..a3ac5505 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Cloudflare Wrangler (local dev state, miniflare cache) +.wrangler/ + # build output dist/ # generated types diff --git a/astro.config.mjs b/astro.config.mjs index 622356d8..b85d6671 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -688,4 +688,8 @@ export default defineConfig({ vite: { plugins: [tailwindcss()], }, + + // Static site (SSG): deploy the `dist/` folder to any static host (e.g. Cloudflare Pages + // with build output directory `dist`). Agent discovery uses `public/_headers` and + // `public/.well-known/` — no Worker or middleware required. }); diff --git a/package-lock.json b/package-lock.json index ceeac4d4..15533979 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4091,9 +4091,9 @@ } }, "node_modules/cookie-es": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz", + "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==", "license": "MIT" }, "node_modules/crossws": { @@ -4268,9 +4268,9 @@ } }, "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, "node_modules/dequal": { @@ -5515,9 +5515,9 @@ } }, "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -6984,18 +6984,18 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "license": "MIT", "dependencies": { "minipass": "^7.1.2" @@ -7004,21 +7004,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -8486,16 +8471,15 @@ } }, "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { diff --git a/public/.assetsignore b/public/.assetsignore new file mode 100644 index 00000000..b7ccb6cb --- /dev/null +++ b/public/.assetsignore @@ -0,0 +1,2 @@ +_worker.js +_routes.json diff --git a/public/.well-known/agent-skills/index.json b/public/.well-known/agent-skills/index.json new file mode 100644 index 00000000..d6ceca69 --- /dev/null +++ b/public/.well-known/agent-skills/index.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://schemas.agentskills.io/discovery/0.2.0/schema.json", + "skills": [ + { + "name": "localstack-lifecycle", + "type": "skill-md", + "description": "Manage LocalStack container lifecycle (start, stop, status, restart).", + "url": "https://raw.githubusercontent.com/localstack/skills/main/skills/localstack-lifecycle/SKILL.md", + "digest": "sha256:7735719dbbe5044e18fd9340dfa8ec6da3333b647206d2535ed5575b3f2713ae" + }, + { + "name": "iac-deployment", + "type": "skill-md", + "description": "Deploy infrastructure using Terraform, CDK, CloudFormation, and Pulumi.", + "url": "https://raw.githubusercontent.com/localstack/skills/main/skills/iac-deployment/SKILL.md", + "digest": "sha256:aca879fd81ed331068f3ff5baebf8603e98fb7103f8041d2099878483321d5e5" + }, + { + "name": "state-management", + "type": "skill-md", + "description": "Save, load, and manage LocalStack state with Cloud Pods.", + "url": "https://raw.githubusercontent.com/localstack/skills/main/skills/state-management/SKILL.md", + "digest": "sha256:78a4ab070b6af721b7ae23cd7e9480cea852a18ddf1a8f28295e08540a5b5676" + }, + { + "name": "logs-analysis", + "type": "skill-md", + "description": "Analyze LocalStack logs, identify errors, and debug issues.", + "url": "https://raw.githubusercontent.com/localstack/skills/main/skills/logs-analysis/SKILL.md", + "digest": "sha256:226368b25674567bb08f36e167334b172dee242b1c6269911ea4f0d213bd737a" + }, + { + "name": "iam-policy-analyzer", + "type": "skill-md", + "description": "Analyze IAM policies and auto-generate least-privilege permissions.", + "url": "https://raw.githubusercontent.com/localstack/skills/main/skills/iam-policy-analyzer/SKILL.md", + "digest": "sha256:fd0c38ab117a52506cfa5d71637611122d6a59bbfe78e4396fcb6e28210cef24" + }, + { + "name": "localstack-extensions", + "type": "skill-md", + "description": "Manage LocalStack extensions and plugins.", + "url": "https://raw.githubusercontent.com/localstack/skills/main/skills/localstack-extensions/SKILL.md", + "digest": "sha256:7d78fd6301ff11947c923fd679cae4b698bb3ba807c43547ab3ad08427390a14" + } + ] +} diff --git a/public/.well-known/api-catalog b/public/.well-known/api-catalog new file mode 100644 index 00000000..1ef53b9a --- /dev/null +++ b/public/.well-known/api-catalog @@ -0,0 +1,36 @@ +{ + "title": "LocalStack documentation", + "description": "Machine-readable documentation surfaces for agents and tools.", + "items": [ + { + "href": "/llms.txt", + "type": "text/plain", + "description": "llms.txt index of documentation for LLM-oriented consumption" + }, + { + "href": "/llms-full.txt", + "type": "text/plain", + "description": "Full documentation export (llms-full.txt)" + }, + { + "href": "/llms-small.txt", + "type": "text/plain", + "description": "Compact documentation export (llms-small.txt)" + }, + { + "href": "/sitemap-index.xml", + "type": "application/xml", + "description": "Sitemap index for crawlers and discovery" + }, + { + "href": "/.well-known/mcp/server-card.json", + "type": "application/json", + "description": "MCP Server Card (SEP-2127) for LocalStack MCP discovery" + }, + { + "href": "/.well-known/agent-skills/index.json", + "type": "application/json", + "description": "Agent Skills discovery index (RFC v0.2.0) for LocalStack skills" + } + ] +} diff --git a/public/.well-known/mcp/server-card.json b/public/.well-known/mcp/server-card.json new file mode 100644 index 00000000..615116eb --- /dev/null +++ b/public/.well-known/mcp/server-card.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json", + "name": "io.github.localstack/localstack-mcp-server", + "version": "0.3.0", + "title": "LocalStack MCP Server", + "description": "Model Context Protocol server for LocalStack for AWS: manage containers, deploy CDK/Terraform/SAM, search LocalStack documentation, analyze logs, IAM policies, chaos experiments, Cloud Pods, extensions, ephemeral instances, and AWS CLI via awslocal. Runs locally via stdio; requires a LocalStack Auth Token.", + "websiteUrl": "https://docs.localstack.cloud/", + "repository": { + "url": "https://github.com/localstack/localstack-mcp-server", + "source": "github" + }, + "capabilities": { + "tools": true, + "resources": false, + "prompts": false + }, + "packages": [ + { + "registryType": "npm", + "registryBaseUrl": "https://registry.npmjs.org", + "identifier": "@localstack/localstack-mcp-server", + "version": "0.3.0", + "supportedProtocolVersions": ["2025-06-18"], + "transport": { + "type": "stdio" + }, + "environmentVariables": [ + { + "name": "LOCALSTACK_AUTH_TOKEN", + "description": "LocalStack Auth Token (required for all MCP tools). See https://docs.localstack.cloud/aws/getting-started/auth-token/", + "isRequired": true, + "isSecret": true + } + ] + } + ], + "_meta": { + "io.localstack.mcp/installation": "https://github.com/localstack/localstack-mcp-server#installation", + "io.localstack.mcp/npm": "https://www.npmjs.com/package/@localstack/localstack-mcp-server" + } +} diff --git a/public/_headers b/public/_headers new file mode 100644 index 00000000..9ec55640 --- /dev/null +++ b/public/_headers @@ -0,0 +1,14 @@ +/ + Link: ; rel="service-doc"; type="text/plain", ; rel="api-catalog"; type="application/json", ; rel="describedby"; type="application/xml", ; rel="alternate"; type="application/json", ; rel="alternate"; type="application/json" +/index.html + Link: ; rel="service-doc"; type="text/plain", ; rel="api-catalog"; type="application/json", ; rel="describedby"; type="application/xml", ; rel="alternate"; type="application/json", ; rel="alternate"; type="application/json" +/.well-known/mcp/server-card.json + Access-Control-Allow-Origin: * + Access-Control-Allow-Methods: GET, OPTIONS + Access-Control-Allow-Headers: Content-Type + Cache-Control: public, max-age=3600 +/.well-known/agent-skills/index.json + Access-Control-Allow-Origin: * + Access-Control-Allow-Methods: GET, OPTIONS + Access-Control-Allow-Headers: Content-Type + Cache-Control: public, max-age=3600 diff --git a/public/robots.txt b/public/robots.txt index d3c9e827..4ffa3e06 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,4 +1,5 @@ User-agent: * Allow: / +Content-Signal: ai-train=no, search=yes, ai-input=yes -Sitemap: https://docs.localstack.cloud/sitemap-index.xml \ No newline at end of file +Sitemap: https://docs.localstack.cloud/sitemap-index.xml