@bluefly/openstandardagents 0.2.7 → 0.2.9
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/.devfile.yaml +1 -1
- package/.env.example +1 -1
- package/.github/AGENTS.md +245 -0
- package/.github/agents/github-issue-triage.ossa.yaml +99 -0
- package/.github/agents/github-pr-triage.ossa.yaml +137 -0
- package/.github/workflows/issue-sync-to-gitlab.yml +138 -0
- package/.github/workflows/pr-triage-to-gitlab.yml +164 -0
- package/.version.json +2 -2
- package/.wiki-config.json +24 -0
- package/CHANGELOG.md +44 -18
- package/CODEOWNERS +75 -0
- package/CONTRIBUTING.md +103 -4
- package/README.md +178 -243
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/repositories/schema.repository.d.ts +6 -1
- package/dist/repositories/schema.repository.d.ts.map +1 -1
- package/dist/repositories/schema.repository.js +49 -27
- package/dist/repositories/schema.repository.js.map +1 -1
- package/dist/services/migration.service.d.ts +4 -3
- package/dist/services/migration.service.d.ts.map +1 -1
- package/dist/services/migration.service.js +11 -10
- package/dist/services/migration.service.js.map +1 -1
- package/dist/services/release-automation/release.service.js +1 -1
- package/dist/services/release-automation/release.service.js.map +1 -1
- package/dist/services/release-automation/schemas/release.schema.js +1 -1
- package/dist/services/release-automation/webhook.service.js +3 -3
- package/dist/services/release-automation/webhook.service.js.map +1 -1
- package/dist/services/runtime/claude/claude-adapter.d.ts +1 -1
- package/dist/services/runtime/claude/claude-adapter.d.ts.map +1 -1
- package/dist/services/runtime/claude/claude-adapter.js +2 -2
- package/dist/services/runtime/claude/claude-adapter.js.map +1 -1
- package/dist/spec/v0.2.8/CHANGELOG.md +401 -0
- package/dist/spec/v0.2.8/README.md +72 -0
- package/dist/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/dist/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
- package/dist/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
- package/{spec/v0.2.6-dev/ossa-0.2.5.schema.json → dist/spec/v0.2.8/ossa-0.2.8.schema.json} +1509 -52
- package/dist/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
- package/dist/spec/v0.2.9/a2a-protocol.md +1337 -0
- package/dist/spec/v0.2.9/agent.md +1946 -0
- package/dist/spec/v0.2.9/capabilities/index.yaml +25 -0
- package/dist/spec/v0.2.9/capabilities/memory.yaml +251 -0
- package/dist/spec/v0.2.9/capability-schema.md +576 -0
- package/dist/spec/v0.2.9/compliance-profiles.md +533 -0
- package/dist/spec/v0.2.9/conformance-testing.md +1527 -0
- package/dist/spec/v0.2.9/gitlab-duo-integration.md +621 -0
- package/dist/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
- package/dist/spec/v0.2.9/runtime-semantics.md +464 -0
- package/dist/spec/v0.2.9/security-model.md +1245 -0
- package/dist/spec/v0.2.9/semantic-conventions.md +347 -0
- package/dist/spec/v0.2.9/types.ts +522 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/policy.d.ts +377 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +84 -0
- package/dist/types/policy.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/version.d.ts +68 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +156 -0
- package/dist/utils/version.js.map +1 -0
- package/docs/specs/policy-dsl.md +925 -0
- package/eslint-report.json +1 -0
- package/examples/adk-integration/code-review-workflow.yml +1 -1
- package/examples/adk-integration/customer-support.yml +1 -1
- package/examples/adk-integration/data-pipeline.yml +1 -1
- package/examples/advanced/reasoning-agent.yaml +136 -0
- package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
- package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
- package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
- package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
- package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
- package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
- package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
- package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
- package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
- package/examples/agents-md/code-agent.ossa.json +100 -0
- package/examples/agents-md/monorepo-agent.ossa.yaml +180 -0
- package/examples/anthropic/claude-assistant.ossa.json +1 -1
- package/examples/autogen/multi-agent.ossa.json +1 -1
- package/examples/claude-code/code-reviewer.ossa.yaml +78 -0
- package/examples/claude-code/ossa-validator.ossa.yaml +80 -0
- package/examples/common_npm/agent-router.ossa.yaml +1 -0
- package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +1 -1
- package/examples/crewai/research-team.ossa.json +1 -1
- package/examples/cursor/code-review-agent.ossa.json +1 -1
- package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -0
- package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +1 -1
- package/examples/extensions/agents-md-v1.yml +175 -0
- package/examples/extensions/drupal-v1.yml +1 -1
- package/examples/extensions/kagent-v1.yml +1 -1
- package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
- package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +4 -4
- package/examples/kagent/compliance-validator.ossa.yaml +1 -1
- package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
- package/examples/kagent/documentation-agent.ossa.yaml +1 -1
- package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -0
- package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +1 -1
- package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
- package/examples/kagent/security-scanner.ossa.yaml +1 -1
- package/examples/langchain/chain-agent.ossa.json +1 -1
- package/examples/langflow/workflow-agent.ossa.json +1 -1
- package/examples/langgraph/state-machine-agent.ossa.json +1 -1
- package/examples/llamaindex/rag-agent.ossa.json +1 -1
- package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
- package/examples/multi-agent/README.md +74 -0
- package/examples/multi-agent/conditional-router.ossa.yaml +42 -0
- package/examples/multi-agent/parallel-execution.ossa.yaml +54 -0
- package/examples/multi-agent/sequential-pipeline.ossa.yaml +45 -0
- package/examples/openai/basic-agent.ossa.yaml +1 -1
- package/examples/openai/multi-tool-agent.ossa.json +1 -1
- package/examples/openai/swarm-agent.ossa.json +1 -1
- package/examples/production/document-analyzer-openai.yml +1 -1
- package/examples/quickstart/support-agent.ossa.yaml +1 -1
- package/examples/spec-examples/audit-agent.yml +1 -1
- package/examples/spec-examples/chat-agent.yml +1 -1
- package/examples/spec-examples/compliance-agent.yml +1 -1
- package/examples/spec-examples/monitoring-agent.yml +1 -1
- package/examples/spec-examples/workflow-agent.yml +1 -1
- package/examples/templates/ossa-compliance.yaml +1 -1
- package/examples/vercel/edge-agent.ossa.json +1 -1
- package/gl-code-quality-report.json +62 -0
- package/llms-ctx-full.txt +39 -0
- package/llms-ctx.txt +39 -0
- package/llms.txt +47 -0
- package/package.json +6 -3
- package/scripts/README.md +25 -0
- package/scripts/compliance-audit.ts +796 -0
- package/scripts/eslint-to-codequality.cjs +34 -0
- package/scripts/generate-agents-catalog.ts +2 -1
- package/scripts/generate-api-docs.ts +2 -1
- package/scripts/generate-examples-docs.ts +2 -1
- package/scripts/generate-llms-ctx.sh +17 -0
- package/scripts/generate-schema-docs.ts +31 -10
- package/scripts/sync-version.js +4 -12
- package/scripts/validate-schema.ts +2 -1
- package/spec/v0.2.8/CHANGELOG.md +401 -0
- package/spec/v0.2.8/README.md +72 -0
- package/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
- package/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
- package/spec/{v0.2.6-dev/ossa-0.2.6-dev.schema.json → v0.2.8/ossa-0.2.8.schema.json} +1509 -52
- package/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
- package/spec/v0.2.9/a2a-protocol.md +1337 -0
- package/spec/v0.2.9/agent.md +1946 -0
- package/spec/v0.2.9/capabilities/index.yaml +25 -0
- package/spec/v0.2.9/capabilities/memory.yaml +251 -0
- package/spec/v0.2.9/capability-schema.md +576 -0
- package/spec/v0.2.9/compliance-profiles.md +533 -0
- package/spec/v0.2.9/conformance-testing.md +1527 -0
- package/spec/v0.2.9/gitlab-duo-integration.md +621 -0
- package/spec/v0.2.9/ossa-0.2.9.schema.json +3699 -0
- package/spec/v0.2.9/runtime-semantics.md +464 -0
- package/spec/v0.2.9/security-model.md +1245 -0
- package/spec/v0.2.9/semantic-conventions.md +347 -0
- package/spec/v0.2.9/types.ts +522 -0
- package/test-results/junit.xml +337 -0
- package/.github/workflows/pr-comment.yml +0 -33
- package/bin/validate-ossa-0.2.5-RC.ts +0 -244
- package/dist/spec/v0.2.6-dev/ossa-0.2.5.schema.json +0 -1696
- package/dist/spec/v0.2.6-dev/ossa-0.2.6-dev.schema.json +0 -1696
- package/scripts/lib/exec.ts +0 -37
- package/scripts/lib/file-ops.ts +0 -58
- package/scripts/lib/version.ts +0 -83
- package/website/.lighthouserc.ts +0 -24
- package/website/.prettierrc +0 -10
- package/website/DESIGN_SYSTEM_IMPLEMENTATION.md +0 -445
- package/website/Dockerfile +0 -30
- package/website/app/about/page.tsx +0 -304
- package/website/app/blog/[slug]/page.tsx +0 -208
- package/website/app/blog/page.tsx +0 -249
- package/website/app/design-guide/page.tsx +0 -511
- package/website/app/docs/[[...slug]]/page.tsx +0 -847
- package/website/app/docs/core-concepts/project-structure/page.tsx +0 -349
- package/website/app/ecosystem/page.tsx +0 -410
- package/website/app/examples/page.tsx +0 -133
- package/website/app/globals.scss +0 -370
- package/website/app/layout.tsx +0 -106
- package/website/app/license/page.tsx +0 -183
- package/website/app/not-found.tsx +0 -18
- package/website/app/page.tsx +0 -686
- package/website/app/page.tsx.bak +0 -679
- package/website/app/page.tsx.bak2 +0 -649
- package/website/app/playground/page.tsx +0 -487
- package/website/app/robots.ts +0 -19
- package/website/app/rss.xml/route.ts +0 -74
- package/website/app/schema/page.tsx +0 -1001
- package/website/app/sitemap.ts +0 -56
- package/website/app/specification/page.tsx +0 -287
- package/website/components/InstallCommand.tsx +0 -96
- package/website/components/Logo.tsx +0 -97
- package/website/components/StructuredData.tsx +0 -65
- package/website/components/docs/DocsSearch.tsx +0 -104
- package/website/components/docs/DocsSidebar.tsx +0 -155
- package/website/components/docs/MarkdownContent.tsx +0 -401
- package/website/components/docs/VersionSelector.tsx +0 -105
- package/website/components/examples/ExamplesViewer.tsx +0 -293
- package/website/components/layout/Footer.tsx +0 -116
- package/website/components/layout/Header.tsx +0 -172
- package/website/components/schema/SchemaComponentsAccordion.tsx +0 -84
- package/website/components/schema/SchemaExplorer.tsx +0 -213
- package/website/components/ui/Badge.tsx +0 -82
- package/website/components/ui/Button.tsx +0 -116
- package/website/components/ui/Card.tsx +0 -167
- package/website/components/ui/Checkbox.tsx +0 -141
- package/website/components/ui/Input.tsx +0 -169
- package/website/components/ui/Radio.tsx +0 -141
- package/website/components/ui/Select.tsx +0 -182
- package/website/components/ui/Tag.tsx +0 -158
- package/website/components/ui/Textarea.tsx +0 -195
- package/website/components/ui/index.ts +0 -11
- package/website/content/blog/OpenAPI-AI-Agents-Standard.md +0 -285
- package/website/content/blog/Why-Formal-Standards-Matter-Now.md +0 -198
- package/website/content/blog/gitlab-kubernetes-agent-ecosystem.md +0 -286
- package/website/content/blog/introducing-ossa-framework.md +0 -328
- package/website/content/blog/ossa-production-results.md +0 -279
- package/website/content/blog/welcome-to-ossa.md +0 -43
- package/website/content/blog/why-ai-agents-need-open-standard.md +0 -98
- package/website/content/docs/00-home.md +0 -153
- package/website/content/docs/adapters/openai-adapter.md +0 -693
- package/website/content/docs/agents/catalog.md +0 -28
- package/website/content/docs/aiflow-framework-integration-with-ossa.md +0 -107
- package/website/content/docs/api-reference/index.md +0 -38
- package/website/content/docs/api-reference/ossa-core-api.md +0 -634
- package/website/content/docs/api-reference/ossa-registry-api.md +0 -515
- package/website/content/docs/api-reference/unified-agent-gateway.md +0 -599
- package/website/content/docs/architecture/execution-flow.md +0 -335
- package/website/content/docs/architecture/multi-agent-systems.md +0 -737
- package/website/content/docs/architecture/overview.md +0 -121
- package/website/content/docs/architecture/stack-integration.md +0 -461
- package/website/content/docs/changelog.md +0 -246
- package/website/content/docs/cli-reference/index.md +0 -111
- package/website/content/docs/cli-reference/ossa-agents.md +0 -70
- package/website/content/docs/cli-reference/ossa-export.md +0 -56
- package/website/content/docs/cli-reference/ossa-generate.md +0 -66
- package/website/content/docs/cli-reference/ossa-gitlab-agent.md +0 -57
- package/website/content/docs/cli-reference/ossa-import.md +0 -56
- package/website/content/docs/cli-reference/ossa-init.md +0 -57
- package/website/content/docs/cli-reference/ossa-migrate.md +0 -62
- package/website/content/docs/cli-reference/ossa-run.md +0 -66
- package/website/content/docs/cli-reference/ossa-schema.md +0 -57
- package/website/content/docs/cli-reference/ossa-setup.md +0 -57
- package/website/content/docs/cli-reference/ossa-validate.md +0 -66
- package/website/content/docs/configuration/index.md +0 -97
- package/website/content/docs/contributing.md +0 -599
- package/website/content/docs/deployment/github-mirroring.md +0 -924
- package/website/content/docs/documentation.md +0 -100
- package/website/content/docs/ecosystem/framework-support.md +0 -1361
- package/website/content/docs/ecosystem/overview.md +0 -366
- package/website/content/docs/errors/index.md +0 -10
- package/website/content/docs/examples/aiflow-framework-integration-with-ossa.md +0 -107
- package/website/content/docs/examples/catalog.md +0 -300
- package/website/content/docs/for-audiences/students-researchers.md +0 -122
- package/website/content/docs/getting-started/index.md +0 -92
- package/website/content/docs/getting-started/installation.md +0 -155
- package/website/content/docs/getting-started/running-agents.md +0 -309
- package/website/content/docs/getting-started.md +0 -91
- package/website/content/docs/integrations/aiflow.md +0 -104
- package/website/content/docs/integrations/drupal.md +0 -105
- package/website/content/docs/migration-guides/agent-schema-comparison.md +0 -232
- package/website/content/docs/migration-guides/anthropic-mcp-to-ossa.md +0 -1750
- package/website/content/docs/migration-guides/crewai-to-ossa.md +0 -274
- package/website/content/docs/migration-guides/drupal-eca-to-ossa.md +0 -2017
- package/website/content/docs/migration-guides/general-agent-schema.yml +0 -247
- package/website/content/docs/migration-guides/index.md +0 -133
- package/website/content/docs/migration-guides/langchain-to-ossa.md +0 -1714
- package/website/content/docs/migration-guides/langflow-to-ossa.md +0 -2075
- package/website/content/docs/migration-guides/migration-manifest.json +0 -64
- package/website/content/docs/migration-guides/openai-to-ossa.md +0 -1202
- package/website/content/docs/openapi-extensions/examples.md +0 -550
- package/website/content/docs/openapi-extensions/index.md +0 -551
- package/website/content/docs/openapi-extensions/operation-extensions.md +0 -457
- package/website/content/docs/openapi-extensions/root-extensions.md +0 -410
- package/website/content/docs/ossa-compliant-badge.md +0 -251
- package/website/content/docs/pre-release/index.md +0 -175
- package/website/content/docs/quick-reference.md +0 -17
- package/website/content/docs/readme.md +0 -35
- package/website/content/docs/releases/v0.2.6.md +0 -99
- package/website/content/docs/schema-reference/agent-capabilities.md +0 -50
- package/website/content/docs/schema-reference/agent-id.md +0 -52
- package/website/content/docs/schema-reference/agent-name.md +0 -50
- package/website/content/docs/schema-reference/agent-role.md +0 -54
- package/website/content/docs/schema-reference/agent-spec.md +0 -406
- package/website/content/docs/schema-reference/agent-version.md +0 -50
- package/website/content/docs/schema-reference/autonomy.md +0 -568
- package/website/content/docs/schema-reference/constraints.md +0 -543
- package/website/content/docs/schema-reference/index.md +0 -45
- package/website/content/docs/schema-reference/llm-config.md +0 -445
- package/website/content/docs/schema-reference/observability.md +0 -654
- package/website/content/docs/schema-reference/ossa-manifest.md +0 -309
- package/website/content/docs/schema-reference/taxonomy.md +0 -509
- package/website/content/docs/schema-reference/tools.md +0 -628
- package/website/content/docs/templates/blog-post.md +0 -43
- package/website/content/docs/types-reference/index.md +0 -105
- package/website/content/docs/use-cases/00-index.md +0 -395
- package/website/content/docs/use-cases/cicd-code-review.md +0 -1236
- package/website/content/docs/use-cases/customer-support.md +0 -1234
- package/website/content/docs/use-cases/enterprise-compliance.md +0 -1208
- package/website/content/docs/use-cases/research-multi-agent.md +0 -1161
- package/website/content/docs/versioning.md +0 -288
- package/website/dev.sh +0 -53
- package/website/docker-compose.dev.yml +0 -36
- package/website/lib/version.ts +0 -35
- package/website/lib/versions.json +0 -103
- package/website/next.config.ts +0 -18
- package/website/nginx.conf +0 -32
- package/website/package-lock.json +0 -9679
- package/website/package.json +0 -59
- package/website/postcss.config.mjs +0 -9
- package/website/scripts/fetch-versions.js +0 -166
- package/website/scripts/generate-examples-index.js +0 -163
- package/website/scripts/merge-docs-to-wiki.ts +0 -207
- package/website/scripts/sync-version.js +0 -72
- package/website/scripts/sync-wiki.ts +0 -322
- package/website/scripts/upload-wiki.ts +0 -199
- package/website/styles/_spacing.scss +0 -453
- package/website/styles/_tokens.scss +0 -245
- package/website/styles/_typography.scss +0 -361
- package/website/styles/_variables.scss +0 -287
- package/website/tailwind.config.ts +0 -170
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import Link from 'next/link';
|
|
2
|
-
import type { Metadata } from 'next';
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import matter from 'gray-matter';
|
|
6
|
-
|
|
7
|
-
export const metadata: Metadata = {
|
|
8
|
-
title: 'OSSA Blog - Insights, Research, and Updates',
|
|
9
|
-
description: 'Insights, research, and updates on the open standard for AI agents. Learn about OSSA, agent orchestration, and best practices.',
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
interface BlogPost {
|
|
13
|
-
slug: string;
|
|
14
|
-
title: string;
|
|
15
|
-
date: string;
|
|
16
|
-
formattedDate: string;
|
|
17
|
-
author: string;
|
|
18
|
-
category: string;
|
|
19
|
-
tags: string[];
|
|
20
|
-
excerpt: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const blogDirectory = path.join(process.cwd(), 'content/blog');
|
|
24
|
-
|
|
25
|
-
// Helper function to fix malformed YAML frontmatter (double quotes)
|
|
26
|
-
function fixYamlFrontmatter(content: string): string {
|
|
27
|
-
// Fix double-quoted values in frontmatter
|
|
28
|
-
// Pattern: key: ""value"" -> key: "value"
|
|
29
|
-
// Also handle escaped quotes in values
|
|
30
|
-
let fixed = content;
|
|
31
|
-
|
|
32
|
-
// Fix double quotes around values (key: ""value"" -> key: "value")
|
|
33
|
-
fixed = fixed.replace(/(\w+):\s*""([^"]*)""/g, '$1: "$2"');
|
|
34
|
-
|
|
35
|
-
// Fix escaped quotes in excerpt (\"value\" -> value)
|
|
36
|
-
fixed = fixed.replace(/excerpt:\s*"\\"([^"]*)\\""/g, 'excerpt: "$1"');
|
|
37
|
-
|
|
38
|
-
return fixed;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function getAllBlogPosts(): BlogPost[] {
|
|
42
|
-
if (!fs.existsSync(blogDirectory)) {
|
|
43
|
-
console.warn(`Blog directory does not exist: ${blogDirectory}`);
|
|
44
|
-
return [];
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const fileNames = fs.readdirSync(blogDirectory);
|
|
48
|
-
const posts = fileNames
|
|
49
|
-
.filter(fileName => fileName.endsWith('.md'))
|
|
50
|
-
.map(fileName => {
|
|
51
|
-
try {
|
|
52
|
-
const slug = fileName.replace(/\.md$/, '');
|
|
53
|
-
const fullPath = path.join(blogDirectory, fileName);
|
|
54
|
-
const fileContents = fs.readFileSync(fullPath, 'utf8');
|
|
55
|
-
|
|
56
|
-
// Fix malformed YAML before parsing
|
|
57
|
-
const fixedContent = fixYamlFrontmatter(fileContents);
|
|
58
|
-
const { data } = matter(fixedContent);
|
|
59
|
-
|
|
60
|
-
// Clean up extracted values (remove extra quotes if present)
|
|
61
|
-
const cleanValue = (value: any): any => {
|
|
62
|
-
if (typeof value === 'string') {
|
|
63
|
-
// Remove surrounding double quotes if present
|
|
64
|
-
return value.replace(/^""(.*)""$/, '$1').replace(/^"(.*)"$/, '$1');
|
|
65
|
-
}
|
|
66
|
-
return value;
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
const dateValue = cleanValue(data.date) || new Date().toISOString();
|
|
70
|
-
const dateObj = new Date(dateValue);
|
|
71
|
-
const validDate = isNaN(dateObj.getTime()) ? new Date() : dateObj;
|
|
72
|
-
|
|
73
|
-
// Format date during server-side rendering to avoid hydration mismatch
|
|
74
|
-
const formattedDate = validDate.toLocaleDateString('en-US', {
|
|
75
|
-
year: 'numeric',
|
|
76
|
-
month: 'long',
|
|
77
|
-
day: 'numeric'
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
return {
|
|
81
|
-
slug,
|
|
82
|
-
title: cleanValue(data.title) || slug,
|
|
83
|
-
date: validDate.toISOString(),
|
|
84
|
-
formattedDate,
|
|
85
|
-
author: cleanValue(data.author) || 'OSSA Team',
|
|
86
|
-
category: cleanValue(data.category) || 'General',
|
|
87
|
-
tags: Array.isArray(data.tags) ? data.tags.map(cleanValue) : [],
|
|
88
|
-
excerpt: cleanValue(data.excerpt) || '',
|
|
89
|
-
};
|
|
90
|
-
} catch (error) {
|
|
91
|
-
console.error(`Error parsing blog post ${fileName}:`, error);
|
|
92
|
-
// Return a default post so the page doesn't crash
|
|
93
|
-
const defaultDate = new Date();
|
|
94
|
-
return {
|
|
95
|
-
slug: fileName.replace(/\.md$/, ''),
|
|
96
|
-
title: fileName.replace(/\.md$/, ''),
|
|
97
|
-
date: defaultDate.toISOString(),
|
|
98
|
-
formattedDate: defaultDate.toLocaleDateString('en-US', {
|
|
99
|
-
year: 'numeric',
|
|
100
|
-
month: 'long',
|
|
101
|
-
day: 'numeric'
|
|
102
|
-
}),
|
|
103
|
-
author: 'OSSA Team',
|
|
104
|
-
category: 'General',
|
|
105
|
-
tags: [],
|
|
106
|
-
excerpt: '',
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
})
|
|
110
|
-
.filter(post => post !== null && post !== undefined)
|
|
111
|
-
.sort((a, b) => {
|
|
112
|
-
try {
|
|
113
|
-
const dateA = new Date(a.date).getTime();
|
|
114
|
-
const dateB = new Date(b.date).getTime();
|
|
115
|
-
if (isNaN(dateA) || isNaN(dateB)) return 0;
|
|
116
|
-
return dateB - dateA;
|
|
117
|
-
} catch {
|
|
118
|
-
return 0;
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
return posts;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export default function BlogPage() {
|
|
126
|
-
let posts: BlogPost[] = [];
|
|
127
|
-
let featuredPost: BlogPost | undefined;
|
|
128
|
-
let otherPosts: BlogPost[] = [];
|
|
129
|
-
|
|
130
|
-
try {
|
|
131
|
-
posts = getAllBlogPosts();
|
|
132
|
-
// Featured post - Welcome to OSSA
|
|
133
|
-
const featuredSlug = 'welcome-to-ossa';
|
|
134
|
-
featuredPost = posts.find(p => p.slug.toLowerCase() === featuredSlug);
|
|
135
|
-
otherPosts = posts.filter(p => p.slug !== featuredPost?.slug);
|
|
136
|
-
} catch (error) {
|
|
137
|
-
console.error('Error loading blog posts:', error);
|
|
138
|
-
// Continue with empty arrays - page will show "No blog posts yet"
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return (
|
|
142
|
-
<div className="min-h-screen bg-gray-50">
|
|
143
|
-
{/* Hero Section */}
|
|
144
|
-
<div className="bg-gradient-to-br from-primary via-blue-600 to-secondary text-white py-20 px-4">
|
|
145
|
-
<div className="container mx-auto max-w-6xl">
|
|
146
|
-
<h1 className="text-5xl font-bold mb-6">OSSA Blog</h1>
|
|
147
|
-
<p className="text-xl opacity-90 max-w-3xl mb-4">
|
|
148
|
-
Insights, research, and updates on the open standard for AI agents
|
|
149
|
-
</p>
|
|
150
|
-
{featuredPost && featuredPost.title && featuredPost.excerpt && (
|
|
151
|
-
<p className="text-lg opacity-80 max-w-3xl">
|
|
152
|
-
Start with our featured article: <strong>"{featuredPost.title}"</strong> - {featuredPost.excerpt}
|
|
153
|
-
</p>
|
|
154
|
-
)}
|
|
155
|
-
</div>
|
|
156
|
-
</div>
|
|
157
|
-
|
|
158
|
-
{/* Featured Post */}
|
|
159
|
-
{featuredPost && (
|
|
160
|
-
<div className="container mx-auto max-w-6xl px-4 -mt-10">
|
|
161
|
-
<Link
|
|
162
|
-
href={`/blog/${featuredPost.slug}`}
|
|
163
|
-
className="block bg-white rounded-xl shadow-xl hover:shadow-2xl transition-all duration-300 overflow-hidden"
|
|
164
|
-
>
|
|
165
|
-
<div className="p-8 md:p-12">
|
|
166
|
-
<div className="flex items-center gap-3 mb-4">
|
|
167
|
-
<span className="inline-block px-3 py-1 text-xs font-semibold text-white bg-primary rounded-full">
|
|
168
|
-
Featured
|
|
169
|
-
</span>
|
|
170
|
-
<span className="inline-block px-3 py-1 text-xs font-semibold text-primary bg-blue-100 rounded-full">
|
|
171
|
-
{featuredPost.category}
|
|
172
|
-
</span>
|
|
173
|
-
</div>
|
|
174
|
-
|
|
175
|
-
<h2 className="text-3xl md:text-4xl font-bold mb-4 text-gray-900 hover:text-primary transition-colors">
|
|
176
|
-
{featuredPost.title}
|
|
177
|
-
</h2>
|
|
178
|
-
|
|
179
|
-
<p className="text-lg text-gray-600 mb-6 max-w-4xl">
|
|
180
|
-
{featuredPost.excerpt}
|
|
181
|
-
</p>
|
|
182
|
-
|
|
183
|
-
<div className="flex items-center justify-between">
|
|
184
|
-
<div className="flex items-center gap-4 text-sm text-gray-500">
|
|
185
|
-
<span className="font-medium">{featuredPost.author}</span>
|
|
186
|
-
<span>•</span>
|
|
187
|
-
<span>{featuredPost.formattedDate}</span>
|
|
188
|
-
</div>
|
|
189
|
-
<span className="text-primary font-medium">Read article →</span>
|
|
190
|
-
</div>
|
|
191
|
-
</div>
|
|
192
|
-
</Link>
|
|
193
|
-
</div>
|
|
194
|
-
)}
|
|
195
|
-
|
|
196
|
-
{/* Blog Posts Grid */}
|
|
197
|
-
<div className="container mx-auto max-w-6xl px-4 py-16">
|
|
198
|
-
<h2 className="text-2xl font-bold mb-8 text-gray-900">Latest Posts</h2>
|
|
199
|
-
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
|
200
|
-
{otherPosts.map((post) => (
|
|
201
|
-
<Link
|
|
202
|
-
key={post.slug}
|
|
203
|
-
href={`/blog/${post.slug}`}
|
|
204
|
-
className="bg-white p-6 rounded-lg shadow-lg hover:shadow-xl transition-all duration-300 block border border-gray-200"
|
|
205
|
-
>
|
|
206
|
-
<div className="mb-4">
|
|
207
|
-
<span className="inline-block px-3 py-1 text-xs font-semibold text-primary bg-blue-100 rounded-full">
|
|
208
|
-
{post.category}
|
|
209
|
-
</span>
|
|
210
|
-
</div>
|
|
211
|
-
|
|
212
|
-
<h2 className="text-2xl font-bold mb-3 text-gray-900 hover:text-primary transition-colors">
|
|
213
|
-
{post.title}
|
|
214
|
-
</h2>
|
|
215
|
-
|
|
216
|
-
<p className="text-gray-600 mb-4 line-clamp-3">
|
|
217
|
-
{post.excerpt}
|
|
218
|
-
</p>
|
|
219
|
-
|
|
220
|
-
<div className="flex items-center justify-between text-sm text-gray-500">
|
|
221
|
-
<span>{post.author}</span>
|
|
222
|
-
<span>{post.formattedDate}</span>
|
|
223
|
-
</div>
|
|
224
|
-
|
|
225
|
-
{post.tags.length > 0 && (
|
|
226
|
-
<div className="mt-4 flex flex-wrap gap-2">
|
|
227
|
-
{post.tags.map((tag) => (
|
|
228
|
-
<span
|
|
229
|
-
key={tag}
|
|
230
|
-
className="text-xs px-2 py-1 bg-gray-100 text-gray-600 rounded"
|
|
231
|
-
>
|
|
232
|
-
{tag}
|
|
233
|
-
</span>
|
|
234
|
-
))}
|
|
235
|
-
</div>
|
|
236
|
-
)}
|
|
237
|
-
</Link>
|
|
238
|
-
))}
|
|
239
|
-
</div>
|
|
240
|
-
|
|
241
|
-
{otherPosts.length === 0 && !featuredPost && (
|
|
242
|
-
<div className="text-center py-12">
|
|
243
|
-
<p className="text-gray-500 text-lg">No blog posts yet. Check back soon!</p>
|
|
244
|
-
</div>
|
|
245
|
-
)}
|
|
246
|
-
</div>
|
|
247
|
-
</div>
|
|
248
|
-
);
|
|
249
|
-
}
|