@bluefly/openstandardagents 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +41 -0
- package/.eslintrc.cjs +43 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +39 -0
- package/.github/dependabot.yml +58 -0
- package/.github/workflows/ci.yml +154 -0
- package/.github/workflows/codeql.yml +41 -0
- package/.github/workflows/dependabot-auto-merge.yml +28 -0
- package/.github/workflows/release.yml +103 -0
- package/.prettierignore +7 -0
- package/.prettierrc.json +10 -0
- package/.redocly.yaml +9 -0
- package/.releaserc.json +84 -0
- package/.releaserc.json.disabled +81 -0
- package/CHANGELOG.md +152 -0
- package/CONTRIBUTING.md +249 -0
- package/LICENSE +190 -0
- package/README.md +280 -0
- package/bin/ossa +8 -0
- package/bin/validate-ossa-0.2.2.ts +244 -0
- package/dist/di-container.d.ts +18 -0
- package/dist/di-container.d.ts.map +1 -0
- package/dist/di-container.js +43 -0
- package/dist/di-container.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/repositories/manifest.repository.d.ts +26 -0
- package/dist/repositories/manifest.repository.d.ts.map +1 -0
- package/dist/repositories/manifest.repository.js +90 -0
- package/dist/repositories/manifest.repository.js.map +1 -0
- package/dist/repositories/schema.repository.d.ts +30 -0
- package/dist/repositories/schema.repository.d.ts.map +1 -0
- package/dist/repositories/schema.repository.js +143 -0
- package/dist/repositories/schema.repository.js.map +1 -0
- package/dist/services/generation.service.d.ts +54 -0
- package/dist/services/generation.service.d.ts.map +1 -0
- package/dist/services/generation.service.js +298 -0
- package/dist/services/generation.service.js.map +1 -0
- package/dist/services/migration.service.d.ts +30 -0
- package/dist/services/migration.service.d.ts.map +1 -0
- package/dist/services/migration.service.js +231 -0
- package/dist/services/migration.service.js.map +1 -0
- package/dist/services/runtime/openai.adapter.d.ts +94 -0
- package/dist/services/runtime/openai.adapter.d.ts.map +1 -0
- package/dist/services/runtime/openai.adapter.js +209 -0
- package/dist/services/runtime/openai.adapter.js.map +1 -0
- package/dist/services/validation.service.d.ts +45 -0
- package/dist/services/validation.service.d.ts.map +1 -0
- package/dist/services/validation.service.js +362 -0
- package/dist/services/validation.service.js.map +1 -0
- package/dist/services/validators/anthropic.validator.d.ts +9 -0
- package/dist/services/validators/anthropic.validator.d.ts.map +1 -0
- package/dist/services/validators/anthropic.validator.js +105 -0
- package/dist/services/validators/anthropic.validator.js.map +1 -0
- package/dist/services/validators/autogen.validator.d.ts +9 -0
- package/dist/services/validators/autogen.validator.d.ts.map +1 -0
- package/dist/services/validators/autogen.validator.js +111 -0
- package/dist/services/validators/autogen.validator.js.map +1 -0
- package/dist/services/validators/crewai.validator.d.ts +9 -0
- package/dist/services/validators/crewai.validator.d.ts.map +1 -0
- package/dist/services/validators/crewai.validator.js +117 -0
- package/dist/services/validators/crewai.validator.js.map +1 -0
- package/dist/services/validators/cursor.validator.d.ts +9 -0
- package/dist/services/validators/cursor.validator.d.ts.map +1 -0
- package/dist/services/validators/cursor.validator.js +88 -0
- package/dist/services/validators/cursor.validator.js.map +1 -0
- package/dist/services/validators/index.d.ts +15 -0
- package/dist/services/validators/index.d.ts.map +1 -0
- package/dist/services/validators/index.js +15 -0
- package/dist/services/validators/index.js.map +1 -0
- package/dist/services/validators/langchain.validator.d.ts +9 -0
- package/dist/services/validators/langchain.validator.d.ts.map +1 -0
- package/dist/services/validators/langchain.validator.js +103 -0
- package/dist/services/validators/langchain.validator.js.map +1 -0
- package/dist/services/validators/langflow.validator.d.ts +9 -0
- package/dist/services/validators/langflow.validator.d.ts.map +1 -0
- package/dist/services/validators/langflow.validator.js +92 -0
- package/dist/services/validators/langflow.validator.js.map +1 -0
- package/dist/services/validators/langgraph.validator.d.ts +9 -0
- package/dist/services/validators/langgraph.validator.d.ts.map +1 -0
- package/dist/services/validators/langgraph.validator.js +123 -0
- package/dist/services/validators/langgraph.validator.js.map +1 -0
- package/dist/services/validators/llamaindex.validator.d.ts +9 -0
- package/dist/services/validators/llamaindex.validator.d.ts.map +1 -0
- package/dist/services/validators/llamaindex.validator.js +121 -0
- package/dist/services/validators/llamaindex.validator.js.map +1 -0
- package/dist/services/validators/openai.validator.d.ts +9 -0
- package/dist/services/validators/openai.validator.d.ts.map +1 -0
- package/dist/services/validators/openai.validator.js +126 -0
- package/dist/services/validators/openai.validator.js.map +1 -0
- package/dist/services/validators/vercel-ai.validator.d.ts +9 -0
- package/dist/services/validators/vercel-ai.validator.d.ts.map +1 -0
- package/dist/services/validators/vercel-ai.validator.js +99 -0
- package/dist/services/validators/vercel-ai.validator.js.map +1 -0
- package/dist/spec/v0.1.9/agent-autonomous-extensions.json +234 -0
- package/dist/spec/v0.1.9/ecosystem-compliance.json +235 -0
- package/dist/spec/v0.1.9/ossa-v0.1.9.schema.json +695 -0
- package/dist/spec/v0.1.9/ossa-v0.1.9.schema.json.backup +695 -0
- package/dist/spec/v0.1.9/reasoning-compliance.json +654 -0
- package/dist/spec/v0.2.2/kagent-enhancements.json +395 -0
- package/dist/spec/v0.2.2/ossa-0.2.2.schema.json +906 -0
- package/dist/spec/v0.2.2/ossa-0.2.2.yaml +448 -0
- package/dist/spec/v0.2.2/ossa-reasoning-compliance-1.0.schema.json +424 -0
- package/dist/spec/v0.2.3/CHANGELOG.md +176 -0
- package/dist/spec/v0.2.3/README.md +154 -0
- package/dist/spec/v0.2.3/migrations/v0.2.2-to-v0.2.3.md +343 -0
- package/dist/spec/v0.2.3/ossa-0.2.3.schema.json +1397 -0
- package/dist/spec/v0.2.3/ossa-0.2.3.yaml +448 -0
- package/dist/spec/v0.2.4-dev/CHANGELOG.md +403 -0
- package/dist/spec/v0.2.4-dev/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/dist/spec/v0.2.4-dev/ossa-0.2.4-dev.schema.json +1696 -0
- package/dist/spec/v0.2.4-dev/ossa-0.2.4-dev.yaml +581 -0
- package/dist/spec/v0.2.5-dev/CHANGELOG.md +171 -0
- package/dist/spec/v0.2.5-dev/examples/customer-support-graph.ossa.yaml +362 -0
- package/dist/spec/v0.2.5-dev/examples/parallel-processors.ossa.yaml +464 -0
- package/dist/spec/v0.2.5-dev/examples/research-team.ossa.yaml +440 -0
- package/dist/spec/v0.2.5-dev/migrations/v0.2.4-to-v0.2.5.md +317 -0
- package/dist/spec/v0.2.5-dev/ossa-0.2.5-dev.schema.json +1732 -0
- package/dist/spec/v0.2.5-dev/ossa-0.2.5-dev.yaml +409 -0
- package/dist/types/index.d.ts +178 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/openapi-extensions.d.ts +164 -0
- package/dist/types/openapi-extensions.d.ts.map +1 -0
- package/dist/types/openapi-extensions.js +6 -0
- package/dist/types/openapi-extensions.js.map +1 -0
- package/docs/OSSA-COMPLIANT-BADGE.md +248 -0
- package/docs/README.md +31 -0
- package/docs/VERSIONING.md +284 -0
- package/docs/agent-openapi-spec.yml +942 -0
- package/docs/getting-started.md +87 -0
- package/docs/migration/general-agent-schema.yml +255 -0
- package/docs/migration/migration-manifest.json +64 -0
- package/docs/openapi-extensions.md +930 -0
- package/docs/schemas/openapi-extensions.schema.json +486 -0
- package/examples/adk-integration/code-review-workflow.yml +136 -0
- package/examples/adk-integration/customer-support.yml +263 -0
- package/examples/adk-integration/data-pipeline.yml +173 -0
- package/examples/advanced/patterns/compliance-context-production.json +53 -0
- package/examples/advanced/patterns/model-router.ts +274 -0
- package/examples/advanced/patterns/smart-model-routing.ts +248 -0
- package/examples/advanced/workflows/hybrid-model-strategy.yaml +232 -0
- package/examples/agent-manifests/critics/critic-agent.yaml +149 -0
- package/examples/agent-manifests/governors/governor-agent.yaml +128 -0
- package/examples/agent-manifests/integrators/integrator-agent.yaml +103 -0
- package/examples/agent-manifests/judges/judge-agent.yaml +153 -0
- package/examples/agent-manifests/monitors/monitor-agent.yaml +122 -0
- package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +247 -0
- package/examples/agent-manifests/sample-compliant-agent.yaml +147 -0
- package/examples/agent-manifests/workers/worker-agent.yaml +82 -0
- package/examples/anthropic/claude-assistant.ossa.json +45 -0
- package/examples/architecture/model-configuration/ollama-integration.ts +110 -0
- package/examples/autogen/multi-agent.ossa.json +37 -0
- package/examples/bridge-configurations.yaml +346 -0
- package/examples/bridges/Dockerfile.production +87 -0
- package/examples/bridges/__pycache__/aiflow-bridge-enhanced.cpython-313.pyc +0 -0
- package/examples/bridges/__pycache__/aiflow-phoenix-tracing.cpython-313.pyc +0 -0
- package/examples/bridges/__pycache__/test_aiflow_integration.cpython-313.pyc +0 -0
- package/examples/bridges/aiflow-bridge-enhanced.py +462 -0
- package/examples/bridges/aiflow-bridge-example.yml +310 -0
- package/examples/bridges/aiflow-phoenix-tracing.py +310 -0
- package/examples/bridges/aiflow-registration-api.openapi.yml +439 -0
- package/examples/bridges/k8s/configmap.yaml +121 -0
- package/examples/bridges/k8s/deployment-simple.yaml +34 -0
- package/examples/bridges/k8s/deployment.yaml +275 -0
- package/examples/bridges/k8s/hpa.yaml +126 -0
- package/examples/bridges/k8s/ingress.yaml +155 -0
- package/examples/bridges/kagent-bridge-example.yml +94 -0
- package/examples/bridges/load-tests/Dockerfile +28 -0
- package/examples/bridges/load-tests/k6-load-test.js +302 -0
- package/examples/bridges/load-tests/requirements.txt +20 -0
- package/examples/bridges/loadtest/k6-scenarios.js +270 -0
- package/examples/bridges/phase4/SLO-SLA.yaml +249 -0
- package/examples/bridges/phase4/chaos-tests.yaml +226 -0
- package/examples/bridges/requirements.txt +24 -0
- package/examples/bridges/test_aiflow_integration.py +341 -0
- package/examples/common_npm/agent-router.ossa.yaml +182 -0
- package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +60 -0
- package/examples/compliance-agent.yml +155 -0
- package/examples/crewai/research-team.ossa.json +36 -0
- package/examples/cursor/code-review-agent.ossa.json +47 -0
- package/examples/drupal/gitlab-ml-recommender.ossa.yaml +609 -0
- package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +68 -0
- package/examples/enterprise/agent.yml +452 -0
- package/examples/extensions/drupal-v1.yml +266 -0
- package/examples/extensions/kagent-v1.yml +167 -0
- package/examples/getting-started/hello-world-complete.ossa.yaml +266 -0
- package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +376 -0
- package/examples/kagent/README.md +31 -0
- package/examples/kagent/compliance-validator.ossa.yaml +111 -0
- package/examples/kagent/cost-optimizer.ossa.yaml +93 -0
- package/examples/kagent/documentation-agent.ossa.yaml +91 -0
- package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +269 -0
- package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +106 -0
- package/examples/kagent/k8s-troubleshooter.ossa.yaml +257 -0
- package/examples/kagent/security-scanner.ossa.yaml +140 -0
- package/examples/langchain/chain-agent.ossa.json +42 -0
- package/examples/langflow/workflow-agent.ossa.json +39 -0
- package/examples/langgraph/state-machine-agent.ossa.json +59 -0
- package/examples/llamaindex/rag-agent.ossa.json +41 -0
- package/examples/migration-guides/from-langchain-to-ossa.yaml +309 -0
- package/examples/minimal/agent.yml +152 -0
- package/examples/minimal/openapi.yaml +95 -0
- package/examples/openai/swarm-agent.ossa.json +59 -0
- package/examples/openapi-extensions/README.md +87 -0
- package/examples/openapi-extensions/minimal-agent-api.openapi.yml +288 -0
- package/examples/openapi-extensions/orchestrator-agent-api.openapi.yml +633 -0
- package/examples/openapi-extensions/worker-agent-api.openapi.yml +533 -0
- package/examples/production/agent.yml +713 -0
- package/examples/production/document-analyzer-openai.yml +134 -0
- package/examples/quickstart/support-agent.ossa.yaml +59 -0
- package/examples/service-registry-usage.ts +423 -0
- package/examples/spec-examples/audit-agent.yml +147 -0
- package/examples/spec-examples/chat-agent.yml +189 -0
- package/examples/spec-examples/compliance-agent.yml +204 -0
- package/examples/spec-examples/data-processing-agent.yml +132 -0
- package/examples/spec-examples/development-agent.yml +138 -0
- package/examples/spec-examples/edge-agent.yml +101 -0
- package/examples/spec-examples/integration-agent.yml +129 -0
- package/examples/spec-examples/monitoring-agent.yml +130 -0
- package/examples/spec-examples/serverless-agent.yml +82 -0
- package/examples/spec-examples/workflow-agent.yml +223 -0
- package/examples/templates/ossa-compliance.yaml +56 -0
- package/examples/typescript/advanced/demo-registry.ts +168 -0
- package/examples/typescript/mcpb-agent-example.ts +358 -0
- package/examples/vercel/edge-agent.ossa.json +43 -0
- package/infrastructure/docker-compose.yml +33 -0
- package/junit.xml +1 -0
- package/openapi/drupal-agent-api.openapi.yaml +348 -0
- package/openapi/gitlab-orchestrator.openapi.yaml +330 -0
- package/openapi/helm-generator.openapi.yaml +389 -0
- package/openapi/ossa-core-api.openapi.yaml +1448 -0
- package/openapi/ossa-registry-api.openapi.yaml +980 -0
- package/openapi/ossa-registry.openapi.yaml +782 -0
- package/openapi/self-evolving-ecosystem.openapi.yaml +1530 -0
- package/openapi/unified-agent-gateway.openapi.yaml +833 -0
- package/ossa-website-swarm-tasks.json +105 -0
- package/package.json +132 -0
- package/release.config.js +64 -0
- package/spec/v0.1.9/agent-autonomous-extensions.json +234 -0
- package/spec/v0.1.9/ecosystem-compliance.json +235 -0
- package/spec/v0.1.9/ossa-v0.1.9.schema.json +695 -0
- package/spec/v0.1.9/ossa-v0.1.9.schema.json.backup +695 -0
- package/spec/v0.1.9/reasoning-compliance.json +654 -0
- package/spec/v0.2.2/kagent-enhancements.json +395 -0
- package/spec/v0.2.2/ossa-0.2.2.schema.json +906 -0
- package/spec/v0.2.2/ossa-0.2.2.yaml +448 -0
- package/spec/v0.2.2/ossa-reasoning-compliance-1.0.schema.json +424 -0
- package/spec/v0.2.3/CHANGELOG.md +176 -0
- package/spec/v0.2.3/README.md +154 -0
- package/spec/v0.2.3/migrations/v0.2.2-to-v0.2.3.md +343 -0
- package/spec/v0.2.3/ossa-0.2.3.schema.json +1397 -0
- package/spec/v0.2.3/ossa-0.2.3.yaml +448 -0
- package/spec/v0.2.4-dev/CHANGELOG.md +403 -0
- package/spec/v0.2.4-dev/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/spec/v0.2.4-dev/ossa-0.2.4-dev.schema.json +1696 -0
- package/spec/v0.2.4-dev/ossa-0.2.4-dev.yaml +581 -0
- package/spec/v0.2.5-dev/CHANGELOG.md +171 -0
- package/spec/v0.2.5-dev/examples/customer-support-graph.ossa.yaml +362 -0
- package/spec/v0.2.5-dev/examples/parallel-processors.ossa.yaml +464 -0
- package/spec/v0.2.5-dev/examples/research-team.ossa.yaml +440 -0
- package/spec/v0.2.5-dev/migrations/v0.2.4-to-v0.2.5.md +317 -0
- package/spec/v0.2.5-dev/ossa-0.2.5-dev.schema.json +1732 -0
- package/spec/v0.2.5-dev/ossa-0.2.5-dev.yaml +409 -0
- package/test-results.xml +1 -0
- package/website/.lighthouserc.js +20 -0
- package/website/.prettierrc +10 -0
- package/website/Dockerfile +17 -0
- package/website/app/about/page.tsx +295 -0
- package/website/app/api/validate/route.ts +88 -0
- package/website/app/blog/[slug]/page.tsx +167 -0
- package/website/app/blog/page.tsx +162 -0
- package/website/app/docs/[[...slug]]/page.tsx +349 -0
- package/website/app/docs/core-concepts/project-structure/page.tsx +349 -0
- package/website/app/ecosystem/page.tsx +375 -0
- package/website/app/examples/page.tsx +123 -0
- package/website/app/globals.css +108 -0
- package/website/app/layout.tsx +106 -0
- package/website/app/page.tsx +409 -0
- package/website/app/playground/page.tsx +507 -0
- package/website/app/robots.ts +19 -0
- package/website/app/rss.xml/route.ts +74 -0
- package/website/app/schema/page.tsx +970 -0
- package/website/app/sitemap.ts +56 -0
- package/website/app/specification/page.tsx +211 -0
- package/website/components/InstallCommand.tsx +96 -0
- package/website/components/Logo.tsx +24 -0
- package/website/components/StructuredData.tsx +65 -0
- package/website/components/docs/DocsSearch.tsx +104 -0
- package/website/components/docs/DocsSidebar.tsx +118 -0
- package/website/components/docs/MarkdownContent.tsx +183 -0
- package/website/components/docs/VersionSelector.tsx +49 -0
- package/website/components/examples/ExamplesViewer.tsx +293 -0
- package/website/components/layout/Footer.tsx +111 -0
- package/website/components/layout/Header.tsx +170 -0
- package/website/components/schema/SchemaExplorer.tsx +213 -0
- package/website/content/blog/OpenAPI-AI-Agents-Standard.md +285 -0
- package/website/content/blog/Why-Formal-Standards-Matter-Now.md +209 -0
- package/website/content/blog/introducing-ossa-framework.md +328 -0
- package/website/content/blog/ossa-production-results.md +279 -0
- package/website/content/blog/welcome-to-ossa.md +43 -0
- package/website/content/blog/why-ai-agents-need-open-standard.md +98 -0
- package/website/content/docs/00-HOME.md +160 -0
- package/website/content/docs/AIFlow-Framework-Integration-with-OSSA.md +107 -0
- package/website/content/docs/OpenAPI-Extensions.md +498 -0
- package/website/content/docs/architecture/execution-flow.md +335 -0
- package/website/content/docs/architecture/multi-agent-systems.md +737 -0
- package/website/content/docs/architecture/overview.md +121 -0
- package/website/content/docs/architecture/stack-integration.md +461 -0
- package/website/content/docs/changelog.md +246 -0
- package/website/content/docs/contributing.md +599 -0
- package/website/content/docs/core-concepts/project-structure.md +348 -0
- package/website/content/docs/ecosystem/framework-support.md +821 -0
- package/website/content/docs/ecosystem/overview.md +366 -0
- package/website/content/docs/examples/Migration-Guides.md +214 -0
- package/website/content/docs/examples.md +71 -0
- package/website/content/docs/for-audiences/Enterprises.md +256 -0
- package/website/content/docs/for-audiences/Students-Researchers.md +122 -0
- package/website/content/docs/for-audiences/architects.md +224 -0
- package/website/content/docs/for-audiences/developers.md +220 -0
- package/website/content/docs/getting-started/5-minute-overview.md +85 -0
- package/website/content/docs/getting-started/Hello-World.md +184 -0
- package/website/content/docs/getting-started/first-agent.md +196 -0
- package/website/content/docs/getting-started/installation.md +155 -0
- package/website/content/docs/getting-started/running-agents.md +107 -0
- package/website/content/docs/integrations/aiflow.md +104 -0
- package/website/content/docs/integrations/drupal.md +105 -0
- package/website/content/docs/migration-guides/00-index.md +76 -0
- package/website/content/docs/migration-guides/README.md +133 -0
- package/website/content/docs/migration-guides/anthropic-mcp-to-ossa.md +1750 -0
- package/website/content/docs/migration-guides/crewai-to-ossa.md +274 -0
- package/website/content/docs/migration-guides/drupal-eca-to-ossa.md +2017 -0
- package/website/content/docs/migration-guides/index.md +133 -0
- package/website/content/docs/migration-guides/langchain-to-ossa.md +1714 -0
- package/website/content/docs/migration-guides/langflow-to-ossa.md +2075 -0
- package/website/content/docs/migration-guides/openai-to-ossa.md +1202 -0
- package/website/content/docs/openapi-extensions/examples.md +550 -0
- package/website/content/docs/openapi-extensions/index.md +495 -0
- package/website/content/docs/openapi-extensions/operation-extensions.md +398 -0
- package/website/content/docs/openapi-extensions/root-extensions.md +364 -0
- package/website/content/docs/pre-release/index.md +175 -0
- package/website/content/docs/quick-reference.md +17 -0
- package/website/content/docs/schema-reference/agent-spec.md +406 -0
- package/website/content/docs/schema-reference/autonomy.md +568 -0
- package/website/content/docs/schema-reference/constraints.md +543 -0
- package/website/content/docs/schema-reference/index.md +176 -0
- package/website/content/docs/schema-reference/llm-config.md +445 -0
- package/website/content/docs/schema-reference/observability.md +654 -0
- package/website/content/docs/schema-reference/ossa-manifest.md +309 -0
- package/website/content/docs/schema-reference/taxonomy.md +509 -0
- package/website/content/docs/schema-reference/tools.md +628 -0
- package/website/content/docs/templates/blog-post.md +43 -0
- package/website/content/docs/use-cases/00-index.md +395 -0
- package/website/content/docs/use-cases/cicd-code-review.md +1236 -0
- package/website/content/docs/use-cases/customer-support.md +1234 -0
- package/website/content/docs/use-cases/enterprise-compliance.md +1208 -0
- package/website/content/docs/use-cases/research-multi-agent.md +1161 -0
- package/website/lib/version.ts +18 -0
- package/website/next.config.js +17 -0
- package/website/next.config.ts +16 -0
- package/website/nginx.conf +32 -0
- package/website/package-lock.json +9145 -0
- package/website/package.json +53 -0
- package/website/postcss.config.js +7 -0
- package/website/postcss.config.mjs +9 -0
- package/website/scripts/sync-version.js +44 -0
- package/website/scripts/sync-wiki.ts +261 -0
- package/website/tailwind.config.js +58 -0
- package/website/tailwind.config.ts +65 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import Link from 'next/link';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import matter from 'gray-matter';
|
|
5
|
+
|
|
6
|
+
interface BlogPost {
|
|
7
|
+
slug: string;
|
|
8
|
+
title: string;
|
|
9
|
+
date: string;
|
|
10
|
+
author: string;
|
|
11
|
+
category: string;
|
|
12
|
+
tags: string[];
|
|
13
|
+
excerpt: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const blogDirectory = path.join(process.cwd(), 'content/blog');
|
|
17
|
+
|
|
18
|
+
function getAllBlogPosts(): BlogPost[] {
|
|
19
|
+
const fileNames = fs.readdirSync(blogDirectory);
|
|
20
|
+
const posts = fileNames
|
|
21
|
+
.filter(fileName => fileName.endsWith('.md'))
|
|
22
|
+
.map(fileName => {
|
|
23
|
+
const slug = fileName.replace(/\.md$/, '');
|
|
24
|
+
const fullPath = path.join(blogDirectory, fileName);
|
|
25
|
+
const fileContents = fs.readFileSync(fullPath, 'utf8');
|
|
26
|
+
const { data } = matter(fileContents);
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
slug,
|
|
30
|
+
title: data.title || slug,
|
|
31
|
+
date: data.date || new Date().toISOString(),
|
|
32
|
+
author: data.author || 'OSSA Team',
|
|
33
|
+
category: data.category || 'General',
|
|
34
|
+
tags: data.tags || [],
|
|
35
|
+
excerpt: data.excerpt || '',
|
|
36
|
+
};
|
|
37
|
+
})
|
|
38
|
+
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
|
|
39
|
+
|
|
40
|
+
return posts;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export default function BlogPage() {
|
|
44
|
+
const posts = getAllBlogPosts();
|
|
45
|
+
|
|
46
|
+
// Featured post - OpenAPI AI Agents Standard
|
|
47
|
+
const featuredSlug = 'openapi-ai-agents-standard';
|
|
48
|
+
const featuredPost = posts.find(p => p.slug.toLowerCase().includes(featuredSlug) || p.slug.toLowerCase().includes('openapi'));
|
|
49
|
+
const otherPosts = posts.filter(p => p.slug !== featuredPost?.slug);
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<div className="min-h-screen bg-gray-50">
|
|
53
|
+
{/* Hero Section */}
|
|
54
|
+
<div className="bg-gradient-to-br from-primary via-blue-600 to-secondary text-white py-20 px-4">
|
|
55
|
+
<div className="container mx-auto max-w-6xl">
|
|
56
|
+
<h1 className="text-5xl font-bold mb-6">OSSA Blog</h1>
|
|
57
|
+
<p className="text-xl opacity-90 max-w-3xl">
|
|
58
|
+
Insights, research, and updates on the open standard for AI agents
|
|
59
|
+
</p>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
{/* Featured Post */}
|
|
64
|
+
{featuredPost && (
|
|
65
|
+
<div className="container mx-auto max-w-6xl px-4 -mt-10">
|
|
66
|
+
<Link
|
|
67
|
+
href={`/blog/${featuredPost.slug}`}
|
|
68
|
+
className="block bg-white rounded-xl shadow-xl hover:shadow-2xl transition-all duration-300 overflow-hidden"
|
|
69
|
+
>
|
|
70
|
+
<div className="p-8 md:p-12">
|
|
71
|
+
<div className="flex items-center gap-3 mb-4">
|
|
72
|
+
<span className="inline-block px-3 py-1 text-xs font-semibold text-white bg-primary rounded-full">
|
|
73
|
+
Featured
|
|
74
|
+
</span>
|
|
75
|
+
<span className="inline-block px-3 py-1 text-xs font-semibold text-primary bg-blue-100 rounded-full">
|
|
76
|
+
{featuredPost.category}
|
|
77
|
+
</span>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<h2 className="text-3xl md:text-4xl font-bold mb-4 text-gray-900 hover:text-primary transition-colors">
|
|
81
|
+
{featuredPost.title}
|
|
82
|
+
</h2>
|
|
83
|
+
|
|
84
|
+
<p className="text-lg text-gray-600 mb-6 max-w-4xl">
|
|
85
|
+
{featuredPost.excerpt}
|
|
86
|
+
</p>
|
|
87
|
+
|
|
88
|
+
<div className="flex items-center justify-between">
|
|
89
|
+
<div className="flex items-center gap-4 text-sm text-gray-500">
|
|
90
|
+
<span className="font-medium">{featuredPost.author}</span>
|
|
91
|
+
<span>•</span>
|
|
92
|
+
<span>{new Date(featuredPost.date).toLocaleDateString('en-US', {
|
|
93
|
+
year: 'numeric',
|
|
94
|
+
month: 'long',
|
|
95
|
+
day: 'numeric'
|
|
96
|
+
})}</span>
|
|
97
|
+
</div>
|
|
98
|
+
<span className="text-primary font-medium">Read article →</span>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
</Link>
|
|
102
|
+
</div>
|
|
103
|
+
)}
|
|
104
|
+
|
|
105
|
+
{/* Blog Posts Grid */}
|
|
106
|
+
<div className="container mx-auto max-w-6xl px-4 py-16">
|
|
107
|
+
<h2 className="text-2xl font-bold mb-8 text-gray-900">Latest Posts</h2>
|
|
108
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
|
109
|
+
{otherPosts.map((post) => (
|
|
110
|
+
<Link
|
|
111
|
+
key={post.slug}
|
|
112
|
+
href={`/blog/${post.slug}`}
|
|
113
|
+
className="glass-card p-6 rounded-lg shadow-lg hover:shadow-xl transition-all duration-300 block"
|
|
114
|
+
>
|
|
115
|
+
<div className="mb-4">
|
|
116
|
+
<span className="inline-block px-3 py-1 text-xs font-semibold text-primary bg-blue-100 rounded-full">
|
|
117
|
+
{post.category}
|
|
118
|
+
</span>
|
|
119
|
+
</div>
|
|
120
|
+
|
|
121
|
+
<h2 className="text-2xl font-bold mb-3 text-gray-900 hover:text-primary transition-colors">
|
|
122
|
+
{post.title}
|
|
123
|
+
</h2>
|
|
124
|
+
|
|
125
|
+
<p className="text-gray-600 mb-4 line-clamp-3">
|
|
126
|
+
{post.excerpt}
|
|
127
|
+
</p>
|
|
128
|
+
|
|
129
|
+
<div className="flex items-center justify-between text-sm text-gray-500">
|
|
130
|
+
<span>{post.author}</span>
|
|
131
|
+
<span>{new Date(post.date).toLocaleDateString('en-US', {
|
|
132
|
+
year: 'numeric',
|
|
133
|
+
month: 'long',
|
|
134
|
+
day: 'numeric'
|
|
135
|
+
})}</span>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
{post.tags.length > 0 && (
|
|
139
|
+
<div className="mt-4 flex flex-wrap gap-2">
|
|
140
|
+
{post.tags.map((tag) => (
|
|
141
|
+
<span
|
|
142
|
+
key={tag}
|
|
143
|
+
className="text-xs px-2 py-1 bg-gray-100 text-gray-600 rounded"
|
|
144
|
+
>
|
|
145
|
+
{tag}
|
|
146
|
+
</span>
|
|
147
|
+
))}
|
|
148
|
+
</div>
|
|
149
|
+
)}
|
|
150
|
+
</Link>
|
|
151
|
+
))}
|
|
152
|
+
</div>
|
|
153
|
+
|
|
154
|
+
{otherPosts.length === 0 && !featuredPost && (
|
|
155
|
+
<div className="text-center py-12">
|
|
156
|
+
<p className="text-gray-500 text-lg">No blog posts yet. Check back soon!</p>
|
|
157
|
+
</div>
|
|
158
|
+
)}
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { notFound } from 'next/navigation';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import matter from 'gray-matter';
|
|
5
|
+
import { DocsSidebar } from '@/components/docs/DocsSidebar';
|
|
6
|
+
import { MarkdownContent } from '@/components/docs/MarkdownContent';
|
|
7
|
+
|
|
8
|
+
interface PageProps {
|
|
9
|
+
params: Promise<{
|
|
10
|
+
slug?: string[];
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const docsDirectory = path.join(process.cwd(), 'content/docs');
|
|
15
|
+
|
|
16
|
+
function getDocContent(slug: string[]): { content: string; metadata: any } | null {
|
|
17
|
+
// Convert URL slug to PascalCase for legacy wiki files
|
|
18
|
+
const slugPath = slug.map(s =>
|
|
19
|
+
s.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('-')
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
// Try different path patterns - lowercase first (new convention), then PascalCase (legacy)
|
|
23
|
+
const possiblePaths = [
|
|
24
|
+
// Lowercase paths (current convention)
|
|
25
|
+
path.join(docsDirectory, ...slug) + '.md',
|
|
26
|
+
path.join(docsDirectory, ...slug, 'index.md'),
|
|
27
|
+
path.join(docsDirectory, ...slug, 'readme.md'),
|
|
28
|
+
// PascalCase paths (legacy wiki structure)
|
|
29
|
+
path.join(docsDirectory, ...slugPath) + '.md',
|
|
30
|
+
path.join(docsDirectory, ...slugPath, 'index.md'),
|
|
31
|
+
path.join(docsDirectory, ...slugPath, 'README.md'),
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
let fullPath = null;
|
|
35
|
+
for (const tryPath of possiblePaths) {
|
|
36
|
+
if (fs.existsSync(tryPath)) {
|
|
37
|
+
fullPath = tryPath;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!fullPath) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const fileContents = fs.readFileSync(fullPath, 'utf8');
|
|
47
|
+
const { data, content } = matter(fileContents);
|
|
48
|
+
|
|
49
|
+
// Extract title from frontmatter or generate from slug
|
|
50
|
+
const title = data.title || slug[slug.length - 1]
|
|
51
|
+
.split('-')
|
|
52
|
+
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
|
|
53
|
+
.join(' ');
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
content,
|
|
57
|
+
metadata: {
|
|
58
|
+
title,
|
|
59
|
+
description: data.description,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function getAllDocPaths(): string[][] {
|
|
65
|
+
const paths: string[][] = [];
|
|
66
|
+
|
|
67
|
+
function traverseDir(dir: string, currentPath: string[] = []): void {
|
|
68
|
+
if (!fs.existsSync(dir)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
73
|
+
|
|
74
|
+
for (const entry of entries) {
|
|
75
|
+
if (entry.isDirectory()) {
|
|
76
|
+
traverseDir(path.join(dir, entry.name), [...currentPath, entry.name]);
|
|
77
|
+
} else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
78
|
+
const slug = entry.name.replace(/\.md$/, '');
|
|
79
|
+
if (slug !== 'index') {
|
|
80
|
+
paths.push([...currentPath, slug]);
|
|
81
|
+
} else if (currentPath.length > 0) {
|
|
82
|
+
paths.push(currentPath);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
traverseDir(docsDirectory);
|
|
89
|
+
return paths;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Comment out for dev mode - re-enable for production build
|
|
93
|
+
// export const dynamic = 'force-static';
|
|
94
|
+
// export const dynamicParams = false;
|
|
95
|
+
|
|
96
|
+
export async function generateStaticParams() {
|
|
97
|
+
const paths = getAllDocPaths();
|
|
98
|
+
// Convert paths to lowercase for URL matching
|
|
99
|
+
// Return root docs page as empty array (not undefined!), plus all other paths
|
|
100
|
+
return [
|
|
101
|
+
{ slug: [] },
|
|
102
|
+
...paths.map((slugParts) => ({
|
|
103
|
+
slug: slugParts.map(part => part.toLowerCase()),
|
|
104
|
+
}))
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export default async function DocsPage({ params }: PageProps) {
|
|
109
|
+
const { slug: slugParam } = await params;
|
|
110
|
+
const slug = slugParam || [];
|
|
111
|
+
|
|
112
|
+
// Handle root /docs route - CLEAN, PROFESSIONAL DESIGN
|
|
113
|
+
if (slug.length === 0) {
|
|
114
|
+
return (
|
|
115
|
+
<div className="min-h-screen bg-white">
|
|
116
|
+
{/* Simple Header - no gradient */}
|
|
117
|
+
<div className="border-b border-gray-200 bg-white">
|
|
118
|
+
<div className="container mx-auto max-w-6xl px-4 py-12">
|
|
119
|
+
<h1 className="text-4xl font-bold text-gray-900 mb-3">Documentation</h1>
|
|
120
|
+
<p className="text-xl text-gray-600">
|
|
121
|
+
Build portable, framework-agnostic AI agents with OSSA
|
|
122
|
+
</p>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
{/* Main Content */}
|
|
127
|
+
<div className="container mx-auto max-w-6xl px-4 py-12">
|
|
128
|
+
|
|
129
|
+
{/* Quick Start - Clean and Simple */}
|
|
130
|
+
<section className="mb-16">
|
|
131
|
+
<div className="bg-blue-50 border border-blue-200 rounded-lg p-6">
|
|
132
|
+
<div className="flex items-start gap-4">
|
|
133
|
+
<div className="text-blue-600 mt-1">
|
|
134
|
+
<svg className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
135
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
|
|
136
|
+
</svg>
|
|
137
|
+
</div>
|
|
138
|
+
<div>
|
|
139
|
+
<h3 className="text-lg font-semibold text-gray-900 mb-2">Quick Start</h3>
|
|
140
|
+
<p className="text-gray-700 mb-3">
|
|
141
|
+
New to OSSA? Start with the 5-minute overview, then build your first agent.
|
|
142
|
+
</p>
|
|
143
|
+
<div className="flex gap-4">
|
|
144
|
+
<a href="/docs/getting-started/5-minute-overview" className="text-blue-600 hover:text-blue-700 font-medium text-sm">
|
|
145
|
+
5-Minute Overview →
|
|
146
|
+
</a>
|
|
147
|
+
<a href="/docs/getting-started/hello-world" className="text-blue-600 hover:text-blue-700 font-medium text-sm">
|
|
148
|
+
Hello World →
|
|
149
|
+
</a>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</section>
|
|
155
|
+
|
|
156
|
+
{/* Core Sections - Simple Grid */}
|
|
157
|
+
<section className="mb-16">
|
|
158
|
+
<h2 className="text-2xl font-bold text-gray-900 mb-6">Core Documentation</h2>
|
|
159
|
+
<div className="grid md:grid-cols-3 gap-6">
|
|
160
|
+
|
|
161
|
+
{/* Getting Started */}
|
|
162
|
+
<div className="border border-gray-200 rounded-lg p-6 hover:border-gray-300 hover:shadow-sm transition-all">
|
|
163
|
+
<h3 className="text-lg font-semibold text-gray-900 mb-3">Getting Started</h3>
|
|
164
|
+
<ul className="space-y-2.5 text-sm">
|
|
165
|
+
<li>
|
|
166
|
+
<a href="/docs/getting-started/5-minute-overview" className="text-blue-600 hover:text-blue-700">
|
|
167
|
+
5-Minute Overview
|
|
168
|
+
</a>
|
|
169
|
+
</li>
|
|
170
|
+
<li>
|
|
171
|
+
<a href="/docs/getting-started/hello-world" className="text-blue-600 hover:text-blue-700">
|
|
172
|
+
Hello World
|
|
173
|
+
</a>
|
|
174
|
+
</li>
|
|
175
|
+
<li>
|
|
176
|
+
<a href="/docs/getting-started/first-agent" className="text-blue-600 hover:text-blue-700">
|
|
177
|
+
Your First Agent
|
|
178
|
+
</a>
|
|
179
|
+
</li>
|
|
180
|
+
<li>
|
|
181
|
+
<a href="/docs/core-concepts/project-structure" className="text-blue-600 hover:text-blue-700">
|
|
182
|
+
Project Structure
|
|
183
|
+
</a>
|
|
184
|
+
</li>
|
|
185
|
+
</ul>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
{/* API Reference */}
|
|
189
|
+
<div className="border border-gray-200 rounded-lg p-6 hover:border-gray-300 hover:shadow-sm transition-all">
|
|
190
|
+
<h3 className="text-lg font-semibold text-gray-900 mb-3">API Reference</h3>
|
|
191
|
+
<ul className="space-y-2.5 text-sm">
|
|
192
|
+
<li>
|
|
193
|
+
<a href="/schema" className="text-blue-600 hover:text-blue-700">
|
|
194
|
+
Schema Reference
|
|
195
|
+
</a>
|
|
196
|
+
</li>
|
|
197
|
+
<li>
|
|
198
|
+
<a href="/docs/openapi-extensions" className="text-blue-600 hover:text-blue-700">
|
|
199
|
+
OpenAPI Extensions
|
|
200
|
+
</a>
|
|
201
|
+
</li>
|
|
202
|
+
<li>
|
|
203
|
+
<a href="/docs/quick-reference" className="text-blue-600 hover:text-blue-700">
|
|
204
|
+
Quick Reference
|
|
205
|
+
</a>
|
|
206
|
+
</li>
|
|
207
|
+
<li>
|
|
208
|
+
<a href="/examples" className="text-blue-600 hover:text-blue-700">
|
|
209
|
+
Examples
|
|
210
|
+
</a>
|
|
211
|
+
</li>
|
|
212
|
+
</ul>
|
|
213
|
+
</div>
|
|
214
|
+
|
|
215
|
+
{/* Migration */}
|
|
216
|
+
<div className="border border-gray-200 rounded-lg p-6 hover:border-gray-300 hover:shadow-sm transition-all">
|
|
217
|
+
<h3 className="text-lg font-semibold text-gray-900 mb-3">Migration Guides</h3>
|
|
218
|
+
<ul className="space-y-2.5 text-sm">
|
|
219
|
+
<li>
|
|
220
|
+
<a href="/docs/migration-guides/langchain-to-ossa" className="text-blue-600 hover:text-blue-700">
|
|
221
|
+
From LangChain
|
|
222
|
+
</a>
|
|
223
|
+
</li>
|
|
224
|
+
<li>
|
|
225
|
+
<a href="/docs/migration-guides/anthropic-mcp-to-ossa" className="text-blue-600 hover:text-blue-700">
|
|
226
|
+
From Anthropic MCP
|
|
227
|
+
</a>
|
|
228
|
+
</li>
|
|
229
|
+
<li>
|
|
230
|
+
<a href="/docs/migration-guides/openai-to-ossa" className="text-blue-600 hover:text-blue-700">
|
|
231
|
+
From OpenAI
|
|
232
|
+
</a>
|
|
233
|
+
</li>
|
|
234
|
+
<li>
|
|
235
|
+
<a href="/docs/migration-guides/crewai-to-ossa" className="text-blue-600 hover:text-blue-700">
|
|
236
|
+
From CrewAI
|
|
237
|
+
</a>
|
|
238
|
+
</li>
|
|
239
|
+
</ul>
|
|
240
|
+
</div>
|
|
241
|
+
|
|
242
|
+
</div>
|
|
243
|
+
</section>
|
|
244
|
+
|
|
245
|
+
{/* For Developers */}
|
|
246
|
+
<section className="mb-16">
|
|
247
|
+
<h2 className="text-2xl font-bold text-gray-900 mb-6">By Role</h2>
|
|
248
|
+
<div className="grid md:grid-cols-4 gap-4">
|
|
249
|
+
<a href="/docs/for-audiences/developers" className="border border-gray-200 rounded-lg p-4 hover:border-blue-300 hover:shadow-sm transition-all">
|
|
250
|
+
<h3 className="font-semibold text-gray-900 mb-1">Developers</h3>
|
|
251
|
+
<p className="text-sm text-gray-600">Build agents</p>
|
|
252
|
+
</a>
|
|
253
|
+
<a href="/docs/for-audiences/architects" className="border border-gray-200 rounded-lg p-4 hover:border-blue-300 hover:shadow-sm transition-all">
|
|
254
|
+
<h3 className="font-semibold text-gray-900 mb-1">Architects</h3>
|
|
255
|
+
<p className="text-sm text-gray-600">Design systems</p>
|
|
256
|
+
</a>
|
|
257
|
+
<a href="/docs/for-audiences/enterprises" className="border border-gray-200 rounded-lg p-4 hover:border-blue-300 hover:shadow-sm transition-all">
|
|
258
|
+
<h3 className="font-semibold text-gray-900 mb-1">Enterprises</h3>
|
|
259
|
+
<p className="text-sm text-gray-600">Deploy at scale</p>
|
|
260
|
+
</a>
|
|
261
|
+
<a href="/docs/for-audiences/students-researchers" className="border border-gray-200 rounded-lg p-4 hover:border-blue-300 hover:shadow-sm transition-all">
|
|
262
|
+
<h3 className="font-semibold text-gray-900 mb-1">Researchers</h3>
|
|
263
|
+
<p className="text-sm text-gray-600">Academic resources</p>
|
|
264
|
+
</a>
|
|
265
|
+
</div>
|
|
266
|
+
</section>
|
|
267
|
+
|
|
268
|
+
{/* Bottom CTA */}
|
|
269
|
+
<section className="border-t border-gray-200 pt-12">
|
|
270
|
+
<div className="grid md:grid-cols-3 gap-8">
|
|
271
|
+
<div>
|
|
272
|
+
<h3 className="text-lg font-semibold text-gray-900 mb-3">Community</h3>
|
|
273
|
+
<ul className="space-y-2 text-sm">
|
|
274
|
+
<li>
|
|
275
|
+
<a href="https://github.com/blueflyio/openstandardagents/issues" className="text-blue-600 hover:text-blue-700">
|
|
276
|
+
Issues & Bugs
|
|
277
|
+
</a>
|
|
278
|
+
</li>
|
|
279
|
+
<li>
|
|
280
|
+
<a href="/docs/contributing" className="text-blue-600 hover:text-blue-700">
|
|
281
|
+
Contributing
|
|
282
|
+
</a>
|
|
283
|
+
</li>
|
|
284
|
+
</ul>
|
|
285
|
+
</div>
|
|
286
|
+
<div>
|
|
287
|
+
<h3 className="text-lg font-semibold text-gray-900 mb-3">Resources</h3>
|
|
288
|
+
<ul className="space-y-2 text-sm">
|
|
289
|
+
<li>
|
|
290
|
+
<a href="/docs/changelog" className="text-blue-600 hover:text-blue-700">
|
|
291
|
+
Changelog
|
|
292
|
+
</a>
|
|
293
|
+
</li>
|
|
294
|
+
<li>
|
|
295
|
+
<a href="/blog" className="text-blue-600 hover:text-blue-700">
|
|
296
|
+
Blog
|
|
297
|
+
</a>
|
|
298
|
+
</li>
|
|
299
|
+
</ul>
|
|
300
|
+
</div>
|
|
301
|
+
<div>
|
|
302
|
+
<h3 className="text-lg font-semibold text-gray-900 mb-3">Tools</h3>
|
|
303
|
+
<ul className="space-y-2 text-sm">
|
|
304
|
+
<li>
|
|
305
|
+
<a href="/playground" className="text-blue-600 hover:text-blue-700">
|
|
306
|
+
Playground
|
|
307
|
+
</a>
|
|
308
|
+
</li>
|
|
309
|
+
<li>
|
|
310
|
+
<a href="/schema" className="text-blue-600 hover:text-blue-700">
|
|
311
|
+
Schema Explorer
|
|
312
|
+
</a>
|
|
313
|
+
</li>
|
|
314
|
+
</ul>
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
</section>
|
|
318
|
+
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const doc = getDocContent(slug);
|
|
325
|
+
|
|
326
|
+
if (!doc) {
|
|
327
|
+
notFound();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return (
|
|
331
|
+
<div className="flex min-h-screen">
|
|
332
|
+
<DocsSidebar />
|
|
333
|
+
<div className="flex-1 flex flex-col">
|
|
334
|
+
<main className="flex-1 container mx-auto max-w-4xl px-4 py-8">
|
|
335
|
+
<article className="prose prose-lg max-w-none">
|
|
336
|
+
<h1>{doc.metadata.title}</h1>
|
|
337
|
+
{doc.metadata.description && (
|
|
338
|
+
<p className="text-xl text-gray-600">{doc.metadata.description}</p>
|
|
339
|
+
)}
|
|
340
|
+
<div className="mt-8">
|
|
341
|
+
<MarkdownContent content={doc.content} />
|
|
342
|
+
</div>
|
|
343
|
+
</article>
|
|
344
|
+
</main>
|
|
345
|
+
</div>
|
|
346
|
+
</div>
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
|