@bluefly/openstandardagents 0.2.5-RC → 0.2.8
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/ISSUE_TEMPLATE/bug_report.yml +63 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +40 -0
- package/.github/workflows/dependabot-comment.yml +34 -0
- package/.github/workflows/pr-comment.yml +33 -0
- package/.husky/pre-commit +5 -0
- package/.kiro/config.json +21 -0
- package/.kiro/settings/mcp.json +61 -0
- package/.kiro/specs/scripts-migration-api-first/design.md +883 -0
- package/.kiro/specs/scripts-migration-api-first/requirements.md +165 -0
- package/.kiro/specs/scripts-migration-api-first/tasks.md +539 -0
- package/.kiro/specs/{website-design-audit → website-brand-identity}/design.md +381 -0
- package/.kiro/specs/{website-design-audit → website-brand-identity}/requirements.md +88 -0
- package/.kiro/specs/website-brand-identity/tasks.md +981 -0
- package/.version.json +2 -2
- package/.wiki-config.json +24 -0
- package/CHANGELOG.md +34 -18
- package/CODEOWNERS +75 -0
- package/CONTRIBUTING.md +1 -1
- package/README.md +176 -239
- package/bin/ossa-dev +42 -0
- package/bin/ossa-export +32 -0
- package/bin/ossa-generate +60 -0
- package/bin/ossa-health +40 -0
- package/bin/ossa-init +26 -0
- 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 +63 -36
- package/dist/repositories/schema.repository.js.map +1 -1
- package/dist/services/github-sync/github-client.d.ts +14 -0
- package/dist/services/github-sync/github-client.d.ts.map +1 -0
- package/dist/services/github-sync/github-client.js +41 -0
- package/dist/services/github-sync/github-client.js.map +1 -0
- package/dist/services/github-sync/gitlab-client.d.ts +17 -0
- package/dist/services/github-sync/gitlab-client.d.ts.map +1 -0
- package/dist/services/github-sync/gitlab-client.js +42 -0
- package/dist/services/github-sync/gitlab-client.js.map +1 -0
- package/dist/services/github-sync/schemas.d.ts +46 -0
- package/dist/services/github-sync/schemas.d.ts.map +1 -0
- package/dist/services/github-sync/schemas.js +36 -0
- package/dist/services/github-sync/schemas.js.map +1 -0
- package/dist/services/github-sync/sync.service.d.ts +27 -0
- package/dist/services/github-sync/sync.service.d.ts.map +1 -0
- package/dist/services/github-sync/sync.service.js +99 -0
- package/dist/services/github-sync/sync.service.js.map +1 -0
- 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/runtime/claude/capability-mapper.d.ts +84 -0
- package/dist/services/runtime/claude/capability-mapper.d.ts.map +1 -0
- package/dist/services/runtime/claude/capability-mapper.js +245 -0
- package/dist/services/runtime/claude/capability-mapper.js.map +1 -0
- package/dist/services/runtime/claude/claude-adapter.d.ts +80 -0
- package/dist/services/runtime/claude/claude-adapter.d.ts.map +1 -0
- package/dist/services/runtime/claude/claude-adapter.js +287 -0
- package/dist/services/runtime/claude/claude-adapter.js.map +1 -0
- package/dist/services/runtime/claude/manifest-parser.d.ts +77 -0
- package/dist/services/runtime/claude/manifest-parser.d.ts.map +1 -0
- package/dist/services/runtime/claude/manifest-parser.js +169 -0
- package/dist/services/runtime/claude/manifest-parser.js.map +1 -0
- package/dist/services/runtime/claude/types.d.ts +115 -0
- package/dist/services/runtime/claude/types.d.ts.map +1 -0
- package/dist/services/runtime/claude/types.js +6 -0
- package/dist/services/runtime/claude/types.js.map +1 -0
- package/dist/services/validation.service.d.ts.map +1 -1
- package/dist/services/validation.service.js +12 -1
- package/dist/services/validation.service.js.map +1 -1
- package/dist/spec/v0.2.4/ossa-0.2.4.schema.json +85 -208
- package/dist/spec/v0.2.6/CHANGELOG.md +401 -0
- package/dist/spec/v0.2.6/README.md +72 -0
- package/dist/spec/v0.2.6/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/dist/spec/v0.2.6/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
- package/dist/spec/{v0.2.4/ossa-0.2.4-dev.schema.json → v0.2.6/ossa-0.2.6.schema.json} +128 -38
- package/dist/spec/v0.2.6/ossa-0.2.6.yaml +581 -0
- package/dist/spec/v0.2.6-dev/CHANGELOG.md +164 -0
- package/dist/spec/v0.2.6-dev/README.md +75 -0
- package/dist/spec/v0.2.6-dev/migrations/v0.2.2-to-v0.2.3.md +343 -0
- package/dist/spec/v0.2.6-dev/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/dist/spec/v0.2.6-dev/ossa-0.2.5.yaml +581 -0
- package/dist/spec/v0.2.6-dev/ossa-0.2.6-dev.yaml +448 -0
- package/dist/spec/v0.2.7/core/agentgraph.md +324 -0
- package/dist/spec/v0.2.7/resources/agentgraph.yaml +135 -0
- 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/dist/spec/v0.2.8/ossa-0.2.8.schema.json +3153 -0
- package/dist/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -1
- 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/brand-guide/01-brand-overview.md +37 -0
- package/docs/brand-guide/02-logo-usage.md +43 -0
- package/docs/brand-guide/03-color-palette.md +70 -0
- package/docs/brand-guide/04-typography.md +82 -0
- package/docs/brand-guide/05-voice-and-tone.md +108 -0
- package/docs/brand-guide/06-visual-elements.md +137 -0
- package/docs/brand-guide/07-application-examples.md +153 -0
- package/docs/brand-guide/OssaLogo/OssA_Logo.svg +21 -0
- package/docs/brand-guide/OssaLogo/brand.af +0 -0
- package/docs/brand-guide/README.md +107 -0
- package/docs/comparison.md +315 -0
- package/docs/operations/automation-roadmap.md +245 -0
- package/docs/operations/github-sync-strategy.md +357 -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/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/anthropic/claude-assistant.ossa.json +5 -4
- package/examples/autogen/multi-agent.ossa.json +6 -4
- 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 +14 -5
- package/examples/cursor/code-review-agent.ossa.json +21 -6
- 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/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 +21 -5
- package/examples/langflow/workflow-agent.ossa.json +2 -3
- package/examples/langgraph/state-machine-agent.ossa.json +2 -3
- package/examples/llamaindex/rag-agent.ossa.json +2 -3
- 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 +33 -10
- package/examples/openai/swarm-agent.ossa.json +18 -5
- 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 +5 -4
- 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/openapi/github-sync.yaml +115 -0
- package/package.json +26 -4
- package/scripts/README.md +103 -0
- package/scripts/auto-rebase-mrs.ts +106 -0
- package/scripts/batch-dependabot.sh +57 -0
- package/scripts/configure-gitlab-branch-protection.ts +95 -0
- package/scripts/create-issue-helper.ts +238 -0
- package/scripts/create-milestone-issue.ts +73 -0
- package/scripts/eslint-to-codequality.cjs +34 -0
- package/scripts/fix-schema-formats.js +82 -0
- package/scripts/generate-agents-catalog.ts +77 -0
- package/scripts/generate-api-docs.ts +218 -0
- package/scripts/generate-cli-docs.ts +410 -0
- package/scripts/generate-config-docs.ts +109 -0
- package/scripts/generate-errors-docs.ts +76 -0
- package/scripts/generate-examples-docs.ts +99 -0
- package/scripts/generate-llms-ctx.sh +17 -0
- package/scripts/generate-schema-docs.ts +317 -0
- package/scripts/generate-types-docs.ts +48 -0
- package/scripts/lowercase-docs.ts +43 -0
- package/scripts/manage-milestone-mrs.ts +279 -0
- package/scripts/rebase-all-mrs.sh +75 -0
- package/scripts/sync-github-pr.sh +48 -0
- package/scripts/sync-version.js +32 -0
- package/scripts/sync-wiki.sh +50 -0
- package/scripts/validate-all.js +127 -0
- package/scripts/validate-schema.ts +2 -1
- package/spec/v0.2.4/ossa-0.2.4.schema.json +85 -208
- package/spec/v0.2.6/CHANGELOG.md +401 -0
- package/spec/v0.2.6/README.md +72 -0
- package/spec/v0.2.6/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/spec/v0.2.6/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
- package/spec/{v0.2.4/ossa-0.2.4-dev.schema.json → v0.2.6/ossa-0.2.6.schema.json} +128 -38
- package/spec/v0.2.6/ossa-0.2.6.yaml +581 -0
- package/spec/v0.2.6-dev/CHANGELOG.md +164 -0
- package/spec/v0.2.6-dev/README.md +75 -0
- package/spec/v0.2.6-dev/migrations/v0.2.2-to-v0.2.3.md +343 -0
- package/spec/v0.2.6-dev/migrations/v0.2.3-to-v0.2.4.md +599 -0
- package/spec/v0.2.6-dev/ossa-0.2.5.yaml +581 -0
- package/spec/v0.2.6-dev/ossa-0.2.6-dev.yaml +448 -0
- package/spec/v0.2.7/core/agentgraph.md +324 -0
- package/spec/v0.2.7/resources/agentgraph.yaml +135 -0
- 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.8/ossa-0.2.8.schema.json +3153 -0
- package/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
- package/test-results/junit.xml +299 -0
- package/.kiro/specs/agent-buildkit-templates/design.md +0 -495
- package/.kiro/specs/agent-buildkit-templates/requirements.md +0 -165
- package/.kiro/specs/kiro-ide-supercharger/README.md +0 -202
- package/.kiro/specs/kiro-ide-supercharger/design.md +0 -1005
- package/.kiro/specs/kiro-ide-supercharger/requirements.md +0 -141
- package/.kiro/specs/kiro-ide-supercharger/tasks.md +0 -507
- package/bin/validate-ossa-0.2.5-RC.ts +0 -244
- package/docs/issue-19-completion-summary.md +0 -648
- package/docs/issue-19-validation.md +0 -351
- 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/Dockerfile +0 -30
- package/website/app/about/page.tsx +0 -295
- 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 -375
- package/website/app/examples/page.tsx +0 -133
- package/website/app/globals.scss +0 -135
- 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 -474
- 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 -168
- package/website/components/schema/SchemaComponentsAccordion.tsx +0 -84
- package/website/components/schema/SchemaExplorer.tsx +0 -213
- 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/AIFlow-Framework-Integration-with-OSSA.md +0 -107
- package/website/content/docs/Examples.md +0 -71
- package/website/content/docs/OpenAPI-Extensions.md +0 -934
- package/website/content/docs/adapters/openai-adapter.md +0 -693
- 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/contributing.md +0 -599
- package/website/content/docs/core-concepts/Project-Structure.md +0 -348
- package/website/content/docs/ecosystem/framework-support.md +0 -819
- package/website/content/docs/ecosystem/overview.md +0 -366
- package/website/content/docs/examples/AIFlow-Framework-Integration-with-OSSA.md +0 -107
- package/website/content/docs/examples/Migration-Guides.md +0 -214
- package/website/content/docs/for-audiences/Architects.md +0 -224
- package/website/content/docs/for-audiences/Developers.md +0 -220
- package/website/content/docs/for-audiences/Enterprises.md +0 -256
- package/website/content/docs/for-audiences/Students-Researchers.md +0 -122
- package/website/content/docs/getting-started/5-Minute-Overview.md +0 -85
- package/website/content/docs/getting-started/First-Agent.md +0 -196
- package/website/content/docs/getting-started/Hello-World.md +0 -184
- package/website/content/docs/getting-started/Installation.md +0 -155
- package/website/content/docs/getting-started/index.md +0 -92
- 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/00-INDEX.md +0 -76
- package/website/content/docs/migration-guides/README.md +0 -133
- 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/schema-reference/agent-spec.md +0 -406
- 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 -176
- 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/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/lib/version.ts +0 -35
- package/website/lib/versions.json +0 -78
- 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/_variables.scss +0 -36
- package/website/tailwind.config.ts +0 -136
- /package/dist/spec/v0.2.4/{ossa-0.2.4-dev.yaml → ossa-0.2.4.yaml} +0 -0
- /package/spec/v0.2.4/{ossa-0.2.4-dev.yaml → ossa-0.2.4.yaml} +0 -0
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env npx tsx
|
|
2
|
-
/**
|
|
3
|
-
* GitLab Wiki Sync Script
|
|
4
|
-
*
|
|
5
|
-
* Fetches wiki pages from GitLab and saves them to content/docs for static site generation.
|
|
6
|
-
* Run this during build or manually with: npx tsx scripts/sync-wiki.ts
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import fs from 'fs';
|
|
10
|
-
import path from 'path';
|
|
11
|
-
import os from 'os';
|
|
12
|
-
|
|
13
|
-
// Load .env.local first to get project path
|
|
14
|
-
loadEnvLocal();
|
|
15
|
-
|
|
16
|
-
// Get GITLAB_HOST from env or CI variables, with fallback
|
|
17
|
-
const GITLAB_HOST = process.env.GITLAB_HOST || process.env.CI_SERVER_HOST || 'gitlab.com';
|
|
18
|
-
// Get project path from env (GITLAB_PROJECT_PATH) or fallback to default
|
|
19
|
-
const PROJECT_PATH = process.env.GITLAB_PROJECT_PATH || 'blueflyio/openstandardagents';
|
|
20
|
-
const DOCS_DIR = path.join(process.cwd(), 'content/docs');
|
|
21
|
-
const BLOG_DIR = path.join(process.cwd(), 'content/blog');
|
|
22
|
-
|
|
23
|
-
interface WikiPage {
|
|
24
|
-
slug: string;
|
|
25
|
-
title: string;
|
|
26
|
-
content: string;
|
|
27
|
-
format: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function loadEnvLocal(): void {
|
|
31
|
-
// Check multiple common locations for .env.local
|
|
32
|
-
const envPaths: string[] = [];
|
|
33
|
-
|
|
34
|
-
// If ENV_FILE is set, use that first
|
|
35
|
-
if (process.env.ENV_FILE) {
|
|
36
|
-
envPaths.push(process.env.ENV_FILE);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Current directory and parent directories (walk up to 5 levels)
|
|
40
|
-
let currentDir = process.cwd();
|
|
41
|
-
for (let i = 0; i < 5; i++) {
|
|
42
|
-
envPaths.push(path.join(currentDir, '.env.local'));
|
|
43
|
-
const parentDir = path.dirname(currentDir);
|
|
44
|
-
if (parentDir === currentDir) break; // Reached filesystem root
|
|
45
|
-
currentDir = parentDir;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// User home directory
|
|
49
|
-
envPaths.push(path.join(os.homedir(), '.env.local'));
|
|
50
|
-
|
|
51
|
-
for (const envLocalPath of envPaths) {
|
|
52
|
-
if (fs.existsSync(envLocalPath)) {
|
|
53
|
-
try {
|
|
54
|
-
const envContent = fs.readFileSync(envLocalPath, 'utf-8');
|
|
55
|
-
envContent.split('\n').forEach(line => {
|
|
56
|
-
const trimmed = line.trim();
|
|
57
|
-
if (trimmed && !trimmed.startsWith('#')) {
|
|
58
|
-
const [key, ...valueParts] = trimmed.split('=');
|
|
59
|
-
if (key && valueParts.length > 0) {
|
|
60
|
-
const value = valueParts.join('=').replace(/^["']|["']$/g, '').trim();
|
|
61
|
-
if (!process.env[key] && value) {
|
|
62
|
-
process.env[key] = value;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
// Load from first found file only
|
|
68
|
-
return;
|
|
69
|
-
} catch (error) {
|
|
70
|
-
// Continue to next location if this one fails
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async function getGitLabToken(): Promise<string | null> {
|
|
78
|
-
// .env.local already loaded at top level
|
|
79
|
-
|
|
80
|
-
// Try environment variables (check multiple possible names)
|
|
81
|
-
if (process.env.GITLAB_TOKEN) {
|
|
82
|
-
return process.env.GITLAB_TOKEN;
|
|
83
|
-
}
|
|
84
|
-
if (process.env.GITLAB_PUSH_TOKEN) {
|
|
85
|
-
return process.env.GITLAB_PUSH_TOKEN;
|
|
86
|
-
}
|
|
87
|
-
if (process.env.CI_JOB_TOKEN) {
|
|
88
|
-
return process.env.CI_JOB_TOKEN;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Try reading from ~/.tokens/gitlab
|
|
92
|
-
const tokenPath = path.join(process.env.HOME || '', '.tokens', 'gitlab');
|
|
93
|
-
if (fs.existsSync(tokenPath)) {
|
|
94
|
-
return fs.readFileSync(tokenPath, 'utf-8').trim();
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
async function fetchWikiPages(): Promise<WikiPage[]> {
|
|
101
|
-
const token = await getGitLabToken();
|
|
102
|
-
|
|
103
|
-
if (!token) {
|
|
104
|
-
console.log('⚠️ No GitLab token found - skipping wiki sync');
|
|
105
|
-
console.log(' Set GITLAB_TOKEN env var or create ~/.tokens/gitlab to enable sync');
|
|
106
|
-
return [];
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const encodedPath = encodeURIComponent(PROJECT_PATH);
|
|
110
|
-
|
|
111
|
-
const response = await fetch(
|
|
112
|
-
`https://${GITLAB_HOST}/api/v4/projects/${encodedPath}/wikis?with_content=1`,
|
|
113
|
-
{
|
|
114
|
-
headers: {
|
|
115
|
-
'PRIVATE-TOKEN': token,
|
|
116
|
-
},
|
|
117
|
-
}
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
if (!response.ok) {
|
|
121
|
-
// Handle auth errors gracefully - use existing content
|
|
122
|
-
if (response.status === 401 || response.status === 403) {
|
|
123
|
-
console.log(`⚠️ Wiki API returned ${response.status} - using existing content`);
|
|
124
|
-
console.log(' Token may lack wiki read permission');
|
|
125
|
-
return [];
|
|
126
|
-
}
|
|
127
|
-
throw new Error(`Failed to fetch wiki pages: ${response.status} ${response.statusText}`);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return response.json();
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function slugToFilePath(slug: string): string {
|
|
134
|
-
// Convert GitLab wiki slug to local file path
|
|
135
|
-
// e.g., "Getting-Started/5-Minute-Overview" -> "getting-started/5-minute-overview.md"
|
|
136
|
-
const parts = slug.split('/');
|
|
137
|
-
|
|
138
|
-
// Lowercase everything for URL-friendly paths
|
|
139
|
-
if (parts.length > 1) {
|
|
140
|
-
const dirs = parts.slice(0, -1).map(d => d.toLowerCase());
|
|
141
|
-
const filename = parts[parts.length - 1].toLowerCase();
|
|
142
|
-
return path.join(...dirs, `${filename}.md`);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return `${slug.toLowerCase()}.md`;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
function processContent(content: string, title: string): string {
|
|
149
|
-
// Add frontmatter if not present
|
|
150
|
-
if (!content.startsWith('---')) {
|
|
151
|
-
const frontmatter = `---
|
|
152
|
-
title: "${title.replace(/"/g, '\\"')}"
|
|
153
|
-
---
|
|
154
|
-
|
|
155
|
-
`;
|
|
156
|
-
return frontmatter + content;
|
|
157
|
-
}
|
|
158
|
-
return content;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
function processBlogContent(content: string, title: string): string {
|
|
162
|
-
// Extract or generate blog metadata from content
|
|
163
|
-
let bodyContent = content;
|
|
164
|
-
let existingMeta: Record<string, string> = {};
|
|
165
|
-
|
|
166
|
-
// Parse existing frontmatter if present
|
|
167
|
-
if (content.startsWith('---')) {
|
|
168
|
-
const endIndex = content.indexOf('---', 3);
|
|
169
|
-
if (endIndex !== -1) {
|
|
170
|
-
const frontmatterText = content.substring(3, endIndex).trim();
|
|
171
|
-
bodyContent = content.substring(endIndex + 3).trim();
|
|
172
|
-
|
|
173
|
-
// Parse simple key: value frontmatter
|
|
174
|
-
frontmatterText.split('\n').forEach(line => {
|
|
175
|
-
const colonIndex = line.indexOf(':');
|
|
176
|
-
if (colonIndex > 0) {
|
|
177
|
-
const key = line.substring(0, colonIndex).trim();
|
|
178
|
-
const value = line.substring(colonIndex + 1).trim();
|
|
179
|
-
existingMeta[key] = value;
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Look for author in content (e.g., "**Thomas Scola**")
|
|
186
|
-
const authorMatch = bodyContent.match(/\*\*([^*]+)\*\*\s*\n\s*\*([^*]+)\*/);
|
|
187
|
-
const extractedAuthor = authorMatch ? authorMatch[1].trim() : null;
|
|
188
|
-
|
|
189
|
-
// Try to extract excerpt from abstract or first paragraph
|
|
190
|
-
let excerpt = '';
|
|
191
|
-
const abstractMatch = bodyContent.match(/###\s*Abstract\s*\n+([^\n#]+)/i);
|
|
192
|
-
if (abstractMatch) {
|
|
193
|
-
excerpt = abstractMatch[1].substring(0, 200).trim();
|
|
194
|
-
if (abstractMatch[1].length > 200) excerpt += '...';
|
|
195
|
-
} else {
|
|
196
|
-
const lines = bodyContent.split('\n');
|
|
197
|
-
const firstPara = lines.find(line =>
|
|
198
|
-
line.trim() &&
|
|
199
|
-
!line.startsWith('#') &&
|
|
200
|
-
!line.startsWith('*') &&
|
|
201
|
-
!line.startsWith('[')
|
|
202
|
-
);
|
|
203
|
-
if (firstPara) {
|
|
204
|
-
excerpt = firstPara.substring(0, 200).trim();
|
|
205
|
-
if (firstPara.length > 200) excerpt += '...';
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Build final frontmatter with blog-specific fields
|
|
210
|
-
const finalTitle = existingMeta.title || title;
|
|
211
|
-
const date = existingMeta.date || new Date().toISOString().split('T')[0];
|
|
212
|
-
const author = existingMeta.author || extractedAuthor || 'OSSA Team';
|
|
213
|
-
const category = existingMeta.category || 'Research';
|
|
214
|
-
const tags = existingMeta.tags || '["OSSA", "AI Agents", "Standards"]';
|
|
215
|
-
const finalExcerpt = existingMeta.excerpt || excerpt;
|
|
216
|
-
|
|
217
|
-
const frontmatter = `---
|
|
218
|
-
title: "${finalTitle.replace(/"/g, '\\"').replace(/\\/g, '')}"
|
|
219
|
-
date: "${date}"
|
|
220
|
-
author: "${author}"
|
|
221
|
-
category: "${category}"
|
|
222
|
-
tags: ${tags}
|
|
223
|
-
excerpt: "${finalExcerpt.replace(/"/g, '\\"')}"
|
|
224
|
-
---
|
|
225
|
-
|
|
226
|
-
`;
|
|
227
|
-
return frontmatter + bodyContent;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
async function syncWiki(): Promise<void> {
|
|
231
|
-
console.log('🔄 Syncing GitLab wiki...');
|
|
232
|
-
|
|
233
|
-
// Fetch all wiki pages
|
|
234
|
-
const pages = await fetchWikiPages();
|
|
235
|
-
|
|
236
|
-
// If no pages returned (no token or empty wiki), skip sync
|
|
237
|
-
if (pages.length === 0) {
|
|
238
|
-
console.log('📋 No pages to sync - using existing content');
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
console.log(`📚 Found ${pages.length} wiki pages`);
|
|
243
|
-
|
|
244
|
-
// Track synced files for cleanup
|
|
245
|
-
const syncedDocs = new Set<string>();
|
|
246
|
-
const syncedBlogs = new Set<string>();
|
|
247
|
-
|
|
248
|
-
for (const page of pages) {
|
|
249
|
-
// Skip Home page (we have our own docs landing)
|
|
250
|
-
if (page.slug === 'Home') {
|
|
251
|
-
console.log(`⏭️ Skipping Home page (using custom landing)`);
|
|
252
|
-
continue;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Handle Blog pages separately
|
|
256
|
-
if (page.slug === 'Blog' || page.slug.startsWith('Blog/')) {
|
|
257
|
-
// Skip the Blog index and template pages
|
|
258
|
-
if (page.slug === 'Blog' || page.slug === 'Blog/Template') {
|
|
259
|
-
console.log(`⏭️ Skipping ${page.slug} (not a blog post)`);
|
|
260
|
-
continue;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Extract blog post name from slug (Blog/My-Post -> My-Post)
|
|
264
|
-
const blogSlug = page.slug.replace('Blog/', '');
|
|
265
|
-
const filename = `${blogSlug}.md`;
|
|
266
|
-
const fullPath = path.join(BLOG_DIR, filename);
|
|
267
|
-
|
|
268
|
-
// Ensure blog directory exists
|
|
269
|
-
if (!fs.existsSync(BLOG_DIR)) {
|
|
270
|
-
fs.mkdirSync(BLOG_DIR, { recursive: true });
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// Process and write blog content
|
|
274
|
-
const processedContent = processBlogContent(page.content, page.title);
|
|
275
|
-
fs.writeFileSync(fullPath, processedContent);
|
|
276
|
-
syncedBlogs.add(filename);
|
|
277
|
-
|
|
278
|
-
console.log(`📝 Blog: ${page.slug} -> content/blog/${filename}`);
|
|
279
|
-
continue;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// Regular docs pages
|
|
283
|
-
const relativePath = slugToFilePath(page.slug);
|
|
284
|
-
const fullPath = path.join(DOCS_DIR, relativePath);
|
|
285
|
-
const dirPath = path.dirname(fullPath);
|
|
286
|
-
|
|
287
|
-
// Ensure directory exists
|
|
288
|
-
if (!fs.existsSync(dirPath)) {
|
|
289
|
-
fs.mkdirSync(dirPath, { recursive: true });
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Process and write content
|
|
293
|
-
const processedContent = processContent(page.content, page.title);
|
|
294
|
-
fs.writeFileSync(fullPath, processedContent);
|
|
295
|
-
syncedDocs.add(relativePath);
|
|
296
|
-
|
|
297
|
-
console.log(`✅ ${page.slug} -> ${relativePath}`);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
console.log(`\n✨ Synced ${syncedDocs.size} docs + ${syncedBlogs.size} blog posts`);
|
|
301
|
-
|
|
302
|
-
// Write manifest for tracking
|
|
303
|
-
const manifest = {
|
|
304
|
-
lastSync: new Date().toISOString(),
|
|
305
|
-
source: `https://${GITLAB_HOST}/${PROJECT_PATH}/-/wikis/home`,
|
|
306
|
-
docs: Array.from(syncedDocs).sort(),
|
|
307
|
-
blogs: Array.from(syncedBlogs).sort(),
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
fs.writeFileSync(
|
|
311
|
-
path.join(DOCS_DIR, '.wiki-sync-manifest.json'),
|
|
312
|
-
JSON.stringify(manifest, null, 2)
|
|
313
|
-
);
|
|
314
|
-
|
|
315
|
-
console.log('📋 Updated .wiki-sync-manifest.json');
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Run if called directly
|
|
319
|
-
syncWiki().catch((error) => {
|
|
320
|
-
console.error('❌ Wiki sync failed:', error.message);
|
|
321
|
-
process.exit(1);
|
|
322
|
-
});
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env npx tsx
|
|
2
|
-
/**
|
|
3
|
-
* Upload Wiki Export to GitLab
|
|
4
|
-
*
|
|
5
|
-
* Uploads prepared wiki files from .wiki-export to GitLab wiki via API
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import fs from 'fs';
|
|
9
|
-
import path from 'path';
|
|
10
|
-
import os from 'os';
|
|
11
|
-
|
|
12
|
-
// Load .env.local first to get project path
|
|
13
|
-
loadEnvLocal();
|
|
14
|
-
|
|
15
|
-
const GITLAB_HOST = process.env.GITLAB_HOST || process.env.CI_SERVER_HOST || 'gitlab.com';
|
|
16
|
-
// Get project path from env (GITLAB_PROJECT_PATH) or fallback to default
|
|
17
|
-
const PROJECT_PATH = process.env.GITLAB_PROJECT_PATH || 'blueflyio/openstandardagents';
|
|
18
|
-
const EXPORT_DIR = path.join(process.cwd(), '.wiki-export');
|
|
19
|
-
|
|
20
|
-
function loadEnvLocal(): void {
|
|
21
|
-
// Check multiple common locations for .env.local
|
|
22
|
-
const envPaths: string[] = [];
|
|
23
|
-
|
|
24
|
-
// If ENV_FILE is set, use that first
|
|
25
|
-
if (process.env.ENV_FILE) {
|
|
26
|
-
envPaths.push(process.env.ENV_FILE);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Current directory and parent directories (walk up to 5 levels)
|
|
30
|
-
let currentDir = process.cwd();
|
|
31
|
-
for (let i = 0; i < 5; i++) {
|
|
32
|
-
envPaths.push(path.join(currentDir, '.env.local'));
|
|
33
|
-
const parentDir = path.dirname(currentDir);
|
|
34
|
-
if (parentDir === currentDir) break; // Reached filesystem root
|
|
35
|
-
currentDir = parentDir;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// User home directory
|
|
39
|
-
envPaths.push(path.join(os.homedir(), '.env.local'));
|
|
40
|
-
|
|
41
|
-
for (const envLocalPath of envPaths) {
|
|
42
|
-
if (fs.existsSync(envLocalPath)) {
|
|
43
|
-
try {
|
|
44
|
-
const envContent = fs.readFileSync(envLocalPath, 'utf-8');
|
|
45
|
-
envContent.split('\n').forEach(line => {
|
|
46
|
-
const trimmed = line.trim();
|
|
47
|
-
if (trimmed && !trimmed.startsWith('#')) {
|
|
48
|
-
const [key, ...valueParts] = trimmed.split('=');
|
|
49
|
-
if (key && valueParts.length > 0) {
|
|
50
|
-
const value = valueParts.join('=').replace(/^["']|["']$/g, '').trim();
|
|
51
|
-
if (!process.env[key] && value) {
|
|
52
|
-
process.env[key] = value;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
// Load from first found file only
|
|
58
|
-
return;
|
|
59
|
-
} catch (error) {
|
|
60
|
-
// Continue to next location if this one fails
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async function getGitLabToken(): Promise<string | null> {
|
|
68
|
-
// .env.local already loaded at top level
|
|
69
|
-
|
|
70
|
-
// Try environment variables (check multiple possible names)
|
|
71
|
-
if (process.env.GITLAB_TOKEN) {
|
|
72
|
-
return process.env.GITLAB_TOKEN;
|
|
73
|
-
}
|
|
74
|
-
if (process.env.GITLAB_PUSH_TOKEN) {
|
|
75
|
-
return process.env.GITLAB_PUSH_TOKEN;
|
|
76
|
-
}
|
|
77
|
-
if (process.env.CI_JOB_TOKEN) {
|
|
78
|
-
return process.env.CI_JOB_TOKEN;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const tokenPath = path.join(process.env.HOME || '', '.tokens', 'gitlab');
|
|
82
|
-
if (fs.existsSync(tokenPath)) {
|
|
83
|
-
return fs.readFileSync(tokenPath, 'utf-8').trim();
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async function uploadWikiPage(slug: string, content: string): Promise<boolean> {
|
|
90
|
-
const token = await getGitLabToken();
|
|
91
|
-
if (!token) {
|
|
92
|
-
console.error('❌ No GitLab token found');
|
|
93
|
-
console.error(' Set GITLAB_TOKEN env var or create ~/.tokens/gitlab');
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const encodedPath = encodeURIComponent(PROJECT_PATH);
|
|
98
|
-
const url = `https://${GITLAB_HOST}/api/v4/projects/${encodedPath}/wikis`;
|
|
99
|
-
|
|
100
|
-
try {
|
|
101
|
-
const response = await fetch(url, {
|
|
102
|
-
method: 'POST',
|
|
103
|
-
headers: {
|
|
104
|
-
'PRIVATE-TOKEN': token,
|
|
105
|
-
'Content-Type': 'application/json',
|
|
106
|
-
},
|
|
107
|
-
body: JSON.stringify({
|
|
108
|
-
title: slug,
|
|
109
|
-
content: content,
|
|
110
|
-
format: 'markdown',
|
|
111
|
-
}),
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
if (response.ok) {
|
|
115
|
-
return true;
|
|
116
|
-
} else if (response.status === 409 || response.status === 400) {
|
|
117
|
-
// Page already exists, try to update it
|
|
118
|
-
const updateUrl = `${url}/${encodeURIComponent(slug)}`;
|
|
119
|
-
const updateResponse = await fetch(updateUrl, {
|
|
120
|
-
method: 'PUT',
|
|
121
|
-
headers: {
|
|
122
|
-
'PRIVATE-TOKEN': token,
|
|
123
|
-
'Content-Type': 'application/json',
|
|
124
|
-
},
|
|
125
|
-
body: JSON.stringify({
|
|
126
|
-
content: content,
|
|
127
|
-
format: 'markdown',
|
|
128
|
-
}),
|
|
129
|
-
});
|
|
130
|
-
if (updateResponse.ok) {
|
|
131
|
-
return true;
|
|
132
|
-
} else {
|
|
133
|
-
const errorText = await updateResponse.text();
|
|
134
|
-
console.error(` Update error: ${updateResponse.status} ${updateResponse.statusText}`);
|
|
135
|
-
console.error(` ${errorText.substring(0, 200)}`);
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
} else {
|
|
139
|
-
const errorText = await response.text();
|
|
140
|
-
console.error(` API error: ${response.status} ${response.statusText}`);
|
|
141
|
-
console.error(` ${errorText.substring(0, 200)}`);
|
|
142
|
-
return false;
|
|
143
|
-
}
|
|
144
|
-
} catch (error: any) {
|
|
145
|
-
console.error(` Network error: ${error.message}`);
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
async function uploadWikiFiles(): Promise<void> {
|
|
151
|
-
console.log('🔄 Uploading wiki files to GitLab...\n');
|
|
152
|
-
|
|
153
|
-
if (!fs.existsSync(EXPORT_DIR)) {
|
|
154
|
-
console.error('❌ .wiki-export directory not found');
|
|
155
|
-
console.error(' Run: npm run merge-docs-to-wiki first');
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const manifestPath = path.join(EXPORT_DIR, 'MANIFEST.json');
|
|
160
|
-
if (!fs.existsSync(manifestPath)) {
|
|
161
|
-
console.error('❌ MANIFEST.json not found');
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
166
|
-
console.log(`📚 Found ${manifest.length} files to upload\n`);
|
|
167
|
-
|
|
168
|
-
let successCount = 0;
|
|
169
|
-
let failCount = 0;
|
|
170
|
-
|
|
171
|
-
for (const item of manifest) {
|
|
172
|
-
const filePath = path.join(EXPORT_DIR, `${item.slug}.md`);
|
|
173
|
-
if (!fs.existsSync(filePath)) {
|
|
174
|
-
console.log(`⚠️ ${item.slug} - file not found, skipping`);
|
|
175
|
-
failCount++;
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
180
|
-
console.log(`📤 Uploading ${item.slug}...`);
|
|
181
|
-
|
|
182
|
-
const success = await uploadWikiPage(item.slug, content);
|
|
183
|
-
if (success) {
|
|
184
|
-
console.log(`✅ ${item.slug} - uploaded successfully`);
|
|
185
|
-
successCount++;
|
|
186
|
-
} else {
|
|
187
|
-
console.log(`❌ ${item.slug} - upload failed`);
|
|
188
|
-
failCount++;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
console.log(`\n✨ Upload complete: ${successCount} succeeded, ${failCount} failed`);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
uploadWikiFiles().catch((error) => {
|
|
196
|
-
console.error('❌ Upload failed:', error.message);
|
|
197
|
-
process.exit(1);
|
|
198
|
-
});
|
|
199
|
-
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
// OSSA Design System - Centralized Color Variables
|
|
2
|
-
// Update colors here to change them site-wide
|
|
3
|
-
|
|
4
|
-
// Brand Colors
|
|
5
|
-
$ossa-primary: #4A3ECD; // Main blue-purple - OSSA hub/standard
|
|
6
|
-
$ossa-secondary: #1CB9ED; // Cyan-blue - Agent nodes
|
|
7
|
-
$ossa-accent: #9060EA; // Purple accent
|
|
8
|
-
|
|
9
|
-
// Semantic Colors - Muted for better visual harmony
|
|
10
|
-
$ossa-success: #10b981; // Muted green
|
|
11
|
-
$ossa-warning: #f59e0b; // Muted amber
|
|
12
|
-
$ossa-error: #ef4444; // Muted red
|
|
13
|
-
$ossa-info: #06b6d4; // Muted cyan
|
|
14
|
-
|
|
15
|
-
// Neutral Colors
|
|
16
|
-
$ossa-dark: #212529;
|
|
17
|
-
$ossa-gray-900: #343a40;
|
|
18
|
-
$ossa-gray-700: #495057;
|
|
19
|
-
$ossa-gray-500: #6c757d;
|
|
20
|
-
$ossa-gray-300: #dee2e6;
|
|
21
|
-
$ossa-gray-100: #f8f9fa;
|
|
22
|
-
$ossa-white: #ffffff;
|
|
23
|
-
|
|
24
|
-
// Gradients - Lightest blue to darkest purple, blue spans more
|
|
25
|
-
// Order: secondary (lightest blue #1CB9ED) -> primary (blue-purple #4A3ECD) -> accent (darkest purple #9060EA)
|
|
26
|
-
$gradient-brand: linear-gradient(135deg, $ossa-secondary 0%, $ossa-secondary 40%, $ossa-primary 70%, $ossa-accent 100%);
|
|
27
|
-
$gradient-hero: linear-gradient(135deg, $ossa-secondary 0%, $ossa-secondary 35%, $ossa-primary 65%, $ossa-accent 100%);
|
|
28
|
-
$gradient-button: linear-gradient(135deg, $ossa-secondary 0%, $ossa-secondary 45%, $ossa-primary 75%, $ossa-accent 100%);
|
|
29
|
-
|
|
30
|
-
// Code Colors
|
|
31
|
-
$code-bg: #1e1e1e;
|
|
32
|
-
$code-text: #d4d4d4;
|
|
33
|
-
$code-keyword: #569cd6;
|
|
34
|
-
$code-string: #ce9178;
|
|
35
|
-
$code-comment: #6a9955;
|
|
36
|
-
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import type { Config } from 'tailwindcss';
|
|
2
|
-
|
|
3
|
-
const config: Config = {
|
|
4
|
-
content: [
|
|
5
|
-
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
|
|
6
|
-
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
|
7
|
-
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
|
8
|
-
],
|
|
9
|
-
theme: {
|
|
10
|
-
extend: {
|
|
11
|
-
colors: {
|
|
12
|
-
primary: {
|
|
13
|
-
DEFAULT: 'var(--ossa-primary)', // From SCSS variables - #4A3ECD
|
|
14
|
-
50: '#f5f4fd',
|
|
15
|
-
100: '#e8e5fa',
|
|
16
|
-
200: '#d4cff5',
|
|
17
|
-
300: '#b5abee',
|
|
18
|
-
400: '#8f7ee4',
|
|
19
|
-
500: 'var(--ossa-primary)', // #4A3ECD - from SCSS
|
|
20
|
-
600: '#3d2fb8',
|
|
21
|
-
700: '#322598',
|
|
22
|
-
800: '#2a1f7a',
|
|
23
|
-
900: '#241f65',
|
|
24
|
-
950: '#15113a',
|
|
25
|
-
},
|
|
26
|
-
secondary: {
|
|
27
|
-
DEFAULT: 'var(--ossa-secondary)', // From SCSS variables - #1CB9ED
|
|
28
|
-
50: '#ecfbff',
|
|
29
|
-
100: '#d1f5fe',
|
|
30
|
-
200: '#a8e9fd',
|
|
31
|
-
300: '#6fd8fa',
|
|
32
|
-
400: '#2ec0f5',
|
|
33
|
-
500: 'var(--ossa-secondary)', // #1CB9ED - from SCSS
|
|
34
|
-
600: '#0a9dd1',
|
|
35
|
-
700: '#087da9',
|
|
36
|
-
800: '#0c6688',
|
|
37
|
-
900: '#105570',
|
|
38
|
-
950: '#08374a',
|
|
39
|
-
},
|
|
40
|
-
accent: {
|
|
41
|
-
DEFAULT: 'var(--ossa-accent)', // From SCSS variables - #9060EA
|
|
42
|
-
50: '#f7f4fe',
|
|
43
|
-
100: '#ede9fd',
|
|
44
|
-
200: '#ddd4fb',
|
|
45
|
-
300: '#c5b3f8',
|
|
46
|
-
400: '#a887f3',
|
|
47
|
-
500: 'var(--ossa-accent)', // #9060EA - from SCSS
|
|
48
|
-
600: '#7c3aed',
|
|
49
|
-
700: '#6b28d9',
|
|
50
|
-
800: '#5923b8',
|
|
51
|
-
900: '#4b1f97',
|
|
52
|
-
950: '#2d0f5c',
|
|
53
|
-
},
|
|
54
|
-
// Semantic colors - centralized and muted
|
|
55
|
-
// These reference CSS variables which come from SCSS variables in styles/_variables.scss
|
|
56
|
-
// Update colors in ONE place: styles/_variables.scss
|
|
57
|
-
success: {
|
|
58
|
-
DEFAULT: 'var(--ossa-success)',
|
|
59
|
-
50: '#ecfdf5',
|
|
60
|
-
100: '#d1fae5',
|
|
61
|
-
200: '#a7f3d0',
|
|
62
|
-
300: '#6ee7b7',
|
|
63
|
-
400: '#34d399',
|
|
64
|
-
500: 'var(--ossa-success)', // #10b981 - from SCSS
|
|
65
|
-
600: '#059669',
|
|
66
|
-
700: '#047857',
|
|
67
|
-
800: '#065f46',
|
|
68
|
-
900: '#064e3b',
|
|
69
|
-
},
|
|
70
|
-
warning: {
|
|
71
|
-
DEFAULT: 'var(--ossa-warning)',
|
|
72
|
-
50: '#fffbeb',
|
|
73
|
-
100: '#fef3c7',
|
|
74
|
-
200: '#fde68a',
|
|
75
|
-
300: '#fcd34d',
|
|
76
|
-
400: '#fbbf24',
|
|
77
|
-
500: 'var(--ossa-warning)', // #f59e0b - from SCSS
|
|
78
|
-
600: '#d97706',
|
|
79
|
-
700: '#b45309',
|
|
80
|
-
800: '#92400e',
|
|
81
|
-
900: '#78350f',
|
|
82
|
-
},
|
|
83
|
-
error: {
|
|
84
|
-
DEFAULT: 'var(--ossa-error)',
|
|
85
|
-
50: '#fef2f2',
|
|
86
|
-
100: '#fee2e2',
|
|
87
|
-
200: '#fecaca',
|
|
88
|
-
300: '#fca5a5',
|
|
89
|
-
400: '#f87171',
|
|
90
|
-
500: 'var(--ossa-error)', // #ef4444 - from SCSS
|
|
91
|
-
600: '#dc2626',
|
|
92
|
-
700: '#b91c1c',
|
|
93
|
-
800: '#991b1b',
|
|
94
|
-
900: '#7f1d1d',
|
|
95
|
-
},
|
|
96
|
-
info: {
|
|
97
|
-
DEFAULT: 'var(--ossa-info)',
|
|
98
|
-
50: '#ecfeff',
|
|
99
|
-
100: '#cffafe',
|
|
100
|
-
200: '#a5f3fc',
|
|
101
|
-
300: '#67e8f9',
|
|
102
|
-
400: '#22d3ee',
|
|
103
|
-
500: 'var(--ossa-info)', // #06b6d4 - from SCSS
|
|
104
|
-
600: '#0891b2',
|
|
105
|
-
700: '#0e7490',
|
|
106
|
-
800: '#155e75',
|
|
107
|
-
900: '#164e63',
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
fontFamily: {
|
|
111
|
-
sans: ['Inter', 'system-ui', '-apple-system', 'sans-serif'],
|
|
112
|
-
mono: ['JetBrains Mono', 'Menlo', 'Monaco', 'Courier New', 'monospace'],
|
|
113
|
-
body: ['Inter', 'system-ui', '-apple-system', 'sans-serif'],
|
|
114
|
-
heading: ['Inter', 'system-ui', '-apple-system', 'sans-serif'],
|
|
115
|
-
code: ['JetBrains Mono', 'Menlo', 'Monaco', 'Courier New', 'monospace'],
|
|
116
|
-
},
|
|
117
|
-
typography: {
|
|
118
|
-
DEFAULT: {
|
|
119
|
-
css: {
|
|
120
|
-
maxWidth: 'none',
|
|
121
|
-
color: '#334155',
|
|
122
|
-
a: {
|
|
123
|
-
color: '#0284c7',
|
|
124
|
-
'&:hover': {
|
|
125
|
-
color: '#0369a1',
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
|
-
plugins: [],
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
export default config;
|
|
File without changes
|
|
File without changes
|