@bluefly/openstandardagents 0.4.6 → 0.4.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/.version.json +3 -3
- package/CHANGELOG.md +16 -0
- package/README.md +1 -0
- package/dist/.version.json +3 -3
- package/dist/adapters/mcp/converter.js +4 -3
- package/dist/adapters/npm/adapter.js +2 -1
- package/dist/adapters/openai-agents/adapter.js +1 -1
- package/dist/cli/commands/config.command.d.ts +7 -0
- package/dist/cli/commands/config.command.js +92 -0
- package/dist/cli/commands/migrate.command.js +1 -1
- package/dist/cli/commands/sign.command.d.ts +3 -0
- package/dist/cli/commands/sign.command.js +42 -0
- package/dist/cli/commands/skills.command.js +4 -6
- package/dist/config/cli-config.d.ts +33 -0
- package/dist/config/cli-config.js +107 -0
- package/dist/mcp-server/index.js +0 -0
- package/dist/package.json +8 -9
- package/dist/services/governance/cedar-provider.js +2 -1
- package/dist/services/release-automation/base-crud.service.d.ts +93 -0
- package/dist/services/release-automation/base-crud.service.js +68 -0
- package/dist/services/release-automation/generate-changelog.d.ts +7 -0
- package/dist/services/release-automation/generate-changelog.js +288 -0
- package/dist/services/release-automation/increment-dev-tag.d.ts +7 -0
- package/dist/services/release-automation/increment-dev-tag.js +160 -0
- package/dist/services/release-automation/index.d.ts +12 -0
- package/dist/services/release-automation/index.js +12 -0
- package/dist/services/release-automation/merge-request.service.d.ts +119 -0
- package/dist/services/release-automation/merge-request.service.js +212 -0
- package/dist/services/release-automation/milestone.service.d.ts +104 -0
- package/dist/services/release-automation/milestone.service.js +207 -0
- package/dist/services/release-automation/release-agent.service.d.ts +39 -0
- package/dist/services/release-automation/release-agent.service.js +43 -0
- package/dist/services/release-automation/release-buttons.d.ts +7 -0
- package/dist/services/release-automation/release-buttons.js +207 -0
- package/dist/services/release-automation/release.service.d.ts +118 -0
- package/dist/services/release-automation/release.service.js +207 -0
- package/dist/services/release-automation/schemas/release.schema.d.ts +299 -0
- package/dist/services/release-automation/schemas/release.schema.js +272 -0
- package/dist/services/release-automation/tag.service.d.ts +99 -0
- package/dist/services/release-automation/tag.service.js +183 -0
- package/dist/services/release-automation/webhook.service.d.ts +37 -0
- package/dist/services/release-automation/webhook.service.js +187 -0
- package/dist/skills/test-skill/README.md +36 -0
- package/dist/skills/test-skill/SKILL.md +31 -0
- package/dist/skills/test-skill/index.d.ts +31 -0
- package/dist/skills/test-skill/install.js +44 -0
- package/dist/skills/test-skill/package.json +36 -0
- package/dist/spec/reference/reference-agents/compliance-auditor/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/doc-agent/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/mr-reviewer/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/ossa-validator-v0.3/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/pipeline-fixer/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/release-orchestrator/manifest.ossa.yaml +1 -1
- package/dist/spec/uadp/README.md +393 -0
- package/dist/spec/uadp/openapi.yaml +387 -0
- package/dist/spec/uadp/schemas/uadp-agents-response.schema.json +68 -0
- package/dist/spec/uadp/schemas/uadp-federation-response.schema.json +46 -0
- package/dist/spec/uadp/schemas/uadp-manifest.schema.json +82 -0
- package/dist/spec/uadp/schemas/uadp-skills-response.schema.json +72 -0
- package/dist/spec/v0.4/agent-card.schema.json +1 -1
- package/dist/spec/v0.4/agent.schema.json +15 -15
- package/dist/spec/v0.4/extensions/a2a/a2a.schema.json +1 -1
- package/dist/spec/v0.4/extensions/ag2/ag2.schema.json +1 -1
- package/dist/spec/v0.4/extensions/crewai/crewai.schema.json +1 -1
- package/dist/spec/v0.4/extensions/kagent/kagent.schema.json +1 -1
- package/dist/spec/v0.4/extensions/langchain/langchain.schema.json +1 -1
- package/dist/spec/v0.4/extensions/langgraph/langgraph.schema.json +1 -1
- package/dist/spec/v0.4/extensions/mcp/mcp.schema.json +1 -1
- package/dist/spec/v0.5/agent-card.schema.json +477 -0
- package/dist/spec/v0.5/agent.schema.json +1556 -0
- package/dist/spec/v0.5/conformance/profiles/baseline.json +19 -0
- package/dist/spec/v0.5/conformance/profiles/enterprise.json +20 -0
- package/dist/spec/v0.5/extensions/a2a/README.md +193 -0
- package/dist/spec/v0.5/extensions/a2a/a2a.schema.json +77 -0
- package/dist/spec/v0.5/extensions/ag2/ag2.schema.json +277 -0
- package/dist/spec/v0.5/extensions/cognition/cognition.schema.json +94 -0
- package/dist/spec/v0.5/extensions/cognition/thought-node.schema.json +80 -0
- package/dist/spec/v0.5/extensions/crewai/crewai.schema.json +256 -0
- package/dist/spec/v0.5/extensions/drupal/drupal.schema.json +318 -0
- package/dist/spec/v0.5/extensions/evals/evals.schema.json +597 -0
- package/dist/spec/v0.5/extensions/governance/governance-extension.yaml +161 -0
- package/dist/spec/v0.5/extensions/identity/identity.schema.json +302 -0
- package/dist/spec/v0.5/extensions/kagent/README.md +315 -0
- package/dist/spec/v0.5/extensions/kagent/kagent.schema.json +624 -0
- package/dist/spec/v0.5/extensions/langchain/langchain.schema.json +243 -0
- package/dist/spec/v0.5/extensions/langgraph/langgraph.schema.json +211 -0
- package/dist/spec/v0.5/extensions/mcp/README.md +276 -0
- package/dist/spec/v0.5/extensions/mcp/mcp.schema.json +84 -0
- package/dist/spec/v0.5/extensions/memory/memory.schema.json +7 -0
- package/dist/spec/v0.5/extensions/team/team.schema.json +304 -0
- package/dist/spec/v0.5/extensions/token-efficiency/token-efficiency.schema.json +47 -0
- package/dist/spec/v0.5/mcp.schema.json +1 -0
- package/dist/spec/v0.5/skill.schema.json +1 -0
- package/dist/spec/v0.5/validator.schema.json +282 -0
- package/dist/validation/error-codes.js +1 -1
- package/examples/a2a/agent-handoff.ossa.yaml +1 -1
- package/examples/a2a/service-discovery.ossa.yaml +1 -1
- package/examples/adapters/drupal-eca-mapping.yaml +1 -1
- package/examples/adapters/drupal-eca-task.yaml +1 -1
- package/examples/adapters/drupal-flowdrop-mapping.yaml +1 -1
- package/examples/adapters/drupal-maestro-mapping.yaml +1 -1
- package/examples/adapters/mistral-agent.yaml +1 -1
- package/examples/adapters/symfony-messenger-task.yaml +1 -1
- package/examples/adapters/symfony-messenger-workflow.yaml +1 -1
- 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 +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/agent-taxonomy-example.ossa.yaml +1 -1
- package/examples/agents/01-customer-support-bot/agent.ossa.yaml +1 -1
- package/examples/agents/02-code-review-agent/agent.ossa.yaml +1 -1
- package/examples/agents/03-data-analysis-agent/agent.ossa.yaml +1 -1
- package/examples/agents/04-content-moderator/agent.ossa.yaml +1 -1
- package/examples/agents/05-sales-assistant/agent.ossa.yaml +1 -1
- package/examples/agents/06-devops-agent/agent.ossa.yaml +1 -1
- package/examples/agents/07-research-assistant/agent.ossa.yaml +1 -1
- package/examples/agents/08-email-triage-agent/agent.ossa.yaml +1 -1
- package/examples/agents/09-security-scanner/agent.ossa.yaml +1 -1
- package/examples/agents/10-meeting-assistant/agent.ossa.yaml +1 -1
- package/examples/agents/architecture-healer-enterprise.yaml +1 -1
- package/examples/agents/dependency-healer-npm.yaml +1 -1
- package/examples/agents/spec-healer-openapi.yaml +1 -1
- package/examples/agents/wiki-healer-production.yaml +1 -1
- package/examples/agents-md/monorepo-agent.ossa.yaml +1 -1
- package/examples/agentscope/react-assistant/README.md +111 -0
- package/examples/agentscope/react-assistant/agent.ossa.yaml +132 -0
- package/examples/agentscope/react-assistant/skills/code-analysis/SKILL.md +18 -0
- package/examples/agentscope/react-assistant/skills/question-answering/SKILL.md +18 -0
- package/examples/autonomous-evolution/self-evolving-agent.ossa.yaml +1 -1
- package/examples/bridges/.gitlab-ci.yml +2 -2
- package/examples/build-once-use-everywhere/agent.ossa.yaml +1 -1
- package/examples/claude-code/code-reviewer.ossa.yaml +1 -1
- package/examples/claude-code/ossa-validator.ossa.yaml +1 -1
- package/examples/common_npm/agent-router.ossa.yaml +1 -1
- package/examples/contracts/data-consumer.ossa.yaml +1 -1
- package/examples/contracts/data-producer-v2.ossa.yaml +1 -1
- package/examples/contracts/data-producer.ossa.yaml +1 -1
- package/examples/drupal/QUICKSTART.md +17 -3
- package/examples/drupal/ai_agents_agentscope/README.md +62 -0
- package/examples/drupal/ai_agents_agentscope/ai_agents_agentscope.info.yml +13 -0
- package/examples/drupal/ai_agents_agentscope/ai_agents_agentscope.services.yml +4 -0
- package/examples/drupal/ai_agents_agentscope/config/install/ai_agents_agentscope.settings.yml +3 -0
- package/examples/drupal/ai_agents_agentscope/config/schema/ai_agents_agentscope.schema.yml +14 -0
- package/examples/drupal/ai_agents_agentscope/src/AgentScopeRuntime.php +11 -0
- package/examples/drupal/ai_agents_agentscope/src/Plugin/AiAgent/AgentScopeAgent.php +10 -0
- package/examples/drupal/ai_agents_agentscope/src/Plugin/AiProvider/AgentScopeProvider.php +217 -0
- package/examples/drupal/ai_agents_agentscope/src/Plugin/Derivative/AgentScopeDeriver.php +10 -0
- package/examples/drupal/ai_agents_agentscope/src/Service/AgentScopeAdapter.php +9 -0
- package/examples/drupal/content-moderator.ossa.yaml +1 -1
- package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -1
- package/examples/export/langchain/production-agent-with-memory/agent.ossa.yaml +1 -1
- package/examples/export/langchain/production-agent-with-tools/agent.ossa.yaml +1 -1
- package/examples/extensions/agents-md-advanced.yml +1 -1
- package/examples/extensions/agents-md-basic.yml +1 -1
- package/examples/extensions/agents-md-sync.yml +1 -1
- package/examples/extensions/agents-md-v1.yml +1 -1
- package/examples/extensions/drupal-v1.yml +1 -1
- package/examples/extensions/encryption-multi-provider.yaml +4 -4
- package/examples/extensions/kagent-v1.yml +1 -1
- package/examples/extensions/knowledge-sources.yaml +1 -1
- package/examples/extensions/mcp-full-featured.yaml +1 -1
- package/examples/getting-started/01-minimal-agent.ossa.yaml +1 -1
- package/examples/getting-started/02-agent-with-tools.ossa.yaml +1 -1
- package/examples/getting-started/03-agent-with-safety.ossa.yaml +1 -1
- package/examples/getting-started/04-agent-with-messaging.ossa.yaml +1 -1
- package/examples/getting-started/05-workflow-composition.ossa.yaml +1 -1
- package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
- package/examples/gitlab-agents/daily-code-scan/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/duo-comment-responder/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/mr-reviewer/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/pipeline-auto-fix/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/pre-commit-quality-check/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/pre-push-validation/.gitlab-ci.yml +2 -2
- package/examples/hierarchical-agent.ossa.yaml +1 -1
- package/examples/infrastructure/token-rotation/manifest.ossa.yaml +1 -1
- package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +1 -1
- 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 -1
- package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
- package/examples/kagent/security-scanner.ossa.yaml +1 -1
- package/examples/knowledge-graph/drupal-agent-with-kg.ossa.yaml +1 -1
- package/examples/mcp/browser-puppeteer.ossa.yaml +1 -1
- package/examples/mcp/database-mcp.ossa.yaml +1 -1
- package/examples/mcp/filesystem-mcp.ossa.yaml +1 -1
- package/examples/messaging/dependency-healer.ossa.yaml +1 -1
- package/examples/messaging/incident-responder.ossa.yaml +1 -1
- package/examples/messaging/routing-rules.ossa.yaml +1 -1
- package/examples/messaging/security-scanner.ossa.yaml +1 -1
- package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
- package/examples/migrations/langchain/01-python-react-agent-after.ossa.yaml +1 -1
- package/examples/migrations/langchain/02-typescript-conversational-after.ossa.yaml +1 -1
- package/examples/migrations/langchain/03-sequential-chain-after.ossa.yaml +1 -1
- package/examples/migrations/langchain/04-config-based-after.ossa.yaml +1 -1
- package/examples/migrations/swarm-to-ossa/after-handoffs.ossa.yaml +6 -6
- package/examples/migrations/swarm-to-ossa/after-triage-agent.ossa.yaml +3 -3
- package/examples/mr-reviewer-with-governance.ossa.yaml +1 -1
- package/examples/multi-agent/conditional-router.ossa.yaml +1 -1
- package/examples/multi-agent/parallel-execution.ossa.yaml +1 -1
- package/examples/multi-agent/sequential-pipeline.ossa.yaml +1 -1
- package/examples/multi-agent-research-workflow.ossa.yaml +1 -1
- package/examples/multi-platform/single-manifest/agent.ossa.yaml +1 -1
- package/examples/observability/activity-stream-full.yaml +1 -1
- package/examples/openai/basic-agent.ossa.yaml +1 -1
- package/examples/ossa-templates/01-code-assistant.ossa.yaml +1 -1
- package/examples/ossa-templates/02-security-scanner.ossa.yaml +1 -1
- package/examples/ossa-templates/03-ci-pipeline.ossa.yaml +1 -1
- package/examples/ossa-templates/04-code-reviewer.ossa.yaml +1 -1
- package/examples/ossa-templates/05-doc-generator.ossa.yaml +1 -1
- package/examples/ossa-templates/06-compliance-validator.ossa.yaml +1 -1
- package/examples/ossa-templates/07-workflow-orchestrator.ossa.yaml +1 -1
- package/examples/ossa-templates/08-content-writer.ossa.yaml +1 -1
- package/examples/ossa-templates/09-test-generator.ossa.yaml +1 -1
- package/examples/ossa-templates/10-data-transformer.ossa.yaml +1 -1
- package/examples/ossa-templates/11-react-performance-expert.ossa.yaml +1 -1
- package/examples/ossa-templates/12-typescript-type-safety-expert.ossa.yaml +1 -1
- package/examples/ossa-templates/13-accessibility-champion.ossa.yaml +1 -1
- package/examples/ossa-templates/14-security-hardening-agent.ossa.yaml +1 -1
- package/examples/pipeline-agent.ossa.yaml +1 -1
- package/examples/production/document-analyzer-openai.yml +1 -1
- package/examples/production-ready/01-customer-support-bot/agent.ossa.yaml +1 -1
- package/examples/production-ready/02-code-review-agent/agent.ossa.yaml +1 -1
- package/examples/production-ready/03-data-analysis-agent/agent.ossa.yaml +1 -1
- package/examples/production-ready/04-content-moderator/agent.ossa.yaml +1 -1
- package/examples/production-ready/05-sales-assistant/agent.ossa.yaml +1 -1
- package/examples/production-ready/06-devops-agent/agent.ossa.yaml +1 -1
- package/examples/production-ready/07-research-assistant/agent.ossa.yaml +1 -1
- package/examples/production-ready/08-email-triage-agent/agent.ossa.yaml +1 -1
- package/examples/production-ready/09-security-scanner/agent.ossa.yaml +1 -1
- package/examples/production-ready/10-meeting-assistant/agent.ossa.yaml +1 -1
- package/examples/quickstart/support-agent.ossa.yaml +1 -1
- package/examples/real-world/gitlab-cicd-optimizer.ossa.yaml +1 -1
- package/examples/real-world/rag-documentation-assistant.ossa.yaml +1 -1
- package/examples/registry/agents/code-reviewer/agent.yaml +1 -1
- package/examples/registry/agents/security-scanner/agent.yaml +1 -1
- package/examples/runtime-adapters/bedrock-claude-example.ossa.yaml +1 -1
- package/examples/schema/reusable-components.yaml +1 -1
- package/examples/showcase/ci-pipeline.ossa.yaml +1 -1
- package/examples/showcase/code-assistant.ossa.yaml +1 -1
- package/examples/showcase/code-reviewer.ossa.yaml +1 -1
- package/examples/showcase/compliance-checker.ossa.yaml +1 -1
- package/examples/showcase/compliance-validator.ossa.yaml +1 -1
- package/examples/showcase/content-writer.ossa.yaml +1 -1
- package/examples/showcase/customer-support.ossa.yaml +1 -1
- package/examples/showcase/data-processing-pipeline.ossa.yaml +1 -1
- package/examples/showcase/data-transformer.ossa.yaml +1 -1
- package/examples/showcase/doc-generator.ossa.yaml +1 -1
- package/examples/showcase/full-power-agent.ossa.yaml +1 -1
- package/examples/showcase/security-scanner-enhanced.ossa.yaml +1 -1
- package/examples/showcase/security-scanner.ossa.yaml +1 -1
- package/examples/showcase/team-leader.ossa.yaml +1 -1
- package/examples/showcase/test-generator.ossa.yaml +1 -1
- package/examples/showcase/workflow-orchestrator.ossa.yaml +1 -1
- package/examples/skills-example.ossa.yaml +1 -1
- package/examples/swarm-agent.ossa.yaml +1 -1
- package/examples/tasks/batch-email-sender.yaml +1 -1
- package/examples/tasks/data-transform.yaml +1 -1
- package/examples/tasks/publish-content.yaml +1 -1
- package/examples/team-agent.ossa.yaml +1 -1
- package/examples/templates/ossa-compliance.yaml +1 -1
- package/examples/unified/security-scanner.ossa.yaml +1 -1
- package/examples/workflows/batch-email-campaign.yaml +1 -1
- package/examples/workflows/content-review-publish.yaml +1 -1
- package/examples/workflows/simple-etl.yaml +1 -1
- package/package.json +6 -7
- package/spec/reference/reference-agents/compliance-auditor/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/doc-agent/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/mr-reviewer/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/ossa-validator-v0.3/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/pipeline-fixer/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/release-orchestrator/manifest.ossa.yaml +1 -1
- package/spec/v0.4/agent-card.schema.json +1 -1
- package/spec/v0.4/agent.schema.json +84 -15
- package/spec/v0.4/extensions/a2a/a2a.schema.json +1 -1
- package/spec/v0.4/extensions/ag2/ag2.schema.json +1 -1
- package/spec/v0.4/extensions/crewai/crewai.schema.json +1 -1
- package/spec/v0.4/extensions/kagent/kagent.schema.json +1 -1
- package/spec/v0.4/extensions/langchain/langchain.schema.json +1 -1
- package/spec/v0.4/extensions/langgraph/langgraph.schema.json +1 -1
- package/spec/v0.4/extensions/mcp/mcp.schema.json +1 -1
- package/templates/agent-types/claude-agent.ossa.yaml +1 -1
- package/templates/agent-types/kagent.ossa.yaml +1 -1
- package/templates/agent-types/langchain-agent.ossa.yaml +1 -1
- package/templates/agent-types/openapi-agent.ossa.yaml +1 -1
- package/templates/agent-types/swarm-agents.ossa.yaml +1 -1
- package/templates/ci-cd/gitlab-ci.deploy.yml +2 -2
- package/templates/validators/capability-compatibility.ossa.yaml +1 -1
- package/templates/validators/coordination-consistency.ossa.yaml +1 -1
- package/templates/validators/pattern-requirements.ossa.yaml +1 -1
- package/templates/validators/transport-compatibility.ossa.yaml +1 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Release Button Handlers
|
|
4
|
+
* Manual triggers for controlled releases
|
|
5
|
+
*/
|
|
6
|
+
import { Gitlab } from '@gitbeaker/rest';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
const gitlab = new Gitlab({
|
|
9
|
+
token: process.env.CI_JOB_TOKEN,
|
|
10
|
+
});
|
|
11
|
+
async function releaseToNpm() {
|
|
12
|
+
console.log('🚀 Starting npm release...');
|
|
13
|
+
const packageJson = JSON.parse(execSync('cat package.json').toString());
|
|
14
|
+
const packageName = packageJson.name;
|
|
15
|
+
const version = packageJson.version;
|
|
16
|
+
// Determine version type and appropriate tag
|
|
17
|
+
const isRC = version.includes('-rc');
|
|
18
|
+
const isDev = version.includes('-dev');
|
|
19
|
+
const isPrerelease = isRC || isDev || version.includes('-alpha') || version.includes('-beta');
|
|
20
|
+
// Determine npm tag based on version type
|
|
21
|
+
let npmTag = 'latest';
|
|
22
|
+
if (isRC) {
|
|
23
|
+
npmTag = 'rc';
|
|
24
|
+
}
|
|
25
|
+
else if (isDev) {
|
|
26
|
+
npmTag = 'dev';
|
|
27
|
+
}
|
|
28
|
+
else if (isPrerelease) {
|
|
29
|
+
npmTag = 'next';
|
|
30
|
+
}
|
|
31
|
+
console.log(`📦 Package: ${packageName}@${version}`);
|
|
32
|
+
console.log(`🏷️ Publishing with tag: ${npmTag}`);
|
|
33
|
+
// 1. Dry run first
|
|
34
|
+
console.log('Running dry-run...');
|
|
35
|
+
execSync(`npm publish --dry-run --tag ${npmTag}`, { stdio: 'inherit' });
|
|
36
|
+
// 2. Get current latest version before publishing (for legacy tag update)
|
|
37
|
+
let previousLatest = null;
|
|
38
|
+
if (!isPrerelease) {
|
|
39
|
+
try {
|
|
40
|
+
previousLatest = execSync(`npm view ${packageName} dist-tags.latest 2>/dev/null`)
|
|
41
|
+
.toString()
|
|
42
|
+
.trim();
|
|
43
|
+
console.log(`📌 Current latest version: ${previousLatest}`);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
console.log('No previous latest version found');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// 3. Actual publish with appropriate tag
|
|
50
|
+
console.log(`Publishing to npm with --tag ${npmTag}...`);
|
|
51
|
+
execSync(`npm publish --access public --tag ${npmTag}`, { stdio: 'inherit' });
|
|
52
|
+
// 4. For stable releases, update legacy tag to previous stable
|
|
53
|
+
if (!isPrerelease && previousLatest && previousLatest !== version) {
|
|
54
|
+
console.log(`📌 Updating legacy tag to point to ${previousLatest}...`);
|
|
55
|
+
try {
|
|
56
|
+
execSync(`npm dist-tag add ${packageName}@${previousLatest} legacy`, {
|
|
57
|
+
stdio: 'inherit',
|
|
58
|
+
});
|
|
59
|
+
console.log(`✅ Legacy tag updated to ${previousLatest}`);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.warn(`⚠️ Failed to update legacy tag: ${error}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// 5. Verify package is downloadable
|
|
66
|
+
console.log('Verifying package...');
|
|
67
|
+
execSync(`npm view ${packageName}@${version}`, { stdio: 'inherit' });
|
|
68
|
+
// 6. Verify dist-tags are correct
|
|
69
|
+
console.log('Verifying dist-tags...');
|
|
70
|
+
execSync(`npm view ${packageName} dist-tags`, { stdio: 'inherit' });
|
|
71
|
+
// 7. Run smoke tests on published package
|
|
72
|
+
console.log('Running smoke tests...');
|
|
73
|
+
const tempDir = execSync('mktemp -d').toString().trim();
|
|
74
|
+
execSync(`cd ${tempDir} && npm install ${packageName}@${version}`, {
|
|
75
|
+
stdio: 'inherit',
|
|
76
|
+
});
|
|
77
|
+
execSync(`cd ${tempDir} && npx ${packageName} --version`, {
|
|
78
|
+
stdio: 'inherit',
|
|
79
|
+
});
|
|
80
|
+
console.log('✅ npm release successful');
|
|
81
|
+
}
|
|
82
|
+
async function releaseToGitHub() {
|
|
83
|
+
console.log('🐙 Starting GitHub release...');
|
|
84
|
+
const packageJson = JSON.parse(execSync('cat package.json').toString());
|
|
85
|
+
const version = packageJson.version;
|
|
86
|
+
const tag = `v${version}`;
|
|
87
|
+
// 1. Create GitHub release
|
|
88
|
+
const releaseNotes = execSync(`git tag -l --format='%(contents)' ${tag}`).toString();
|
|
89
|
+
execSync(`gh release create ${tag} \
|
|
90
|
+
--title "Release ${version}" \
|
|
91
|
+
--notes "${releaseNotes}" \
|
|
92
|
+
--repo blueflyio/openstandardagents`, { stdio: 'inherit' });
|
|
93
|
+
// 2. Upload artifacts
|
|
94
|
+
execSync(`gh release upload ${tag} dist/*.tgz \
|
|
95
|
+
--repo blueflyio/openstandardagents`, { stdio: 'inherit' });
|
|
96
|
+
console.log('✅ GitHub release successful');
|
|
97
|
+
}
|
|
98
|
+
async function deployWebsite() {
|
|
99
|
+
console.log('🌐 Starting website deployment...');
|
|
100
|
+
// Note: We're already in website/ directory from CI before_script
|
|
101
|
+
// Check if we're in website directory, if not, cd into it
|
|
102
|
+
const cwd = process.cwd();
|
|
103
|
+
const isInWebsite = cwd.endsWith('website');
|
|
104
|
+
const websiteDir = isInWebsite ? '.' : 'website';
|
|
105
|
+
// 1. Build website
|
|
106
|
+
execSync(`cd ${websiteDir} && npm run build`, { stdio: 'inherit' });
|
|
107
|
+
// 2. Run pre-deploy checks
|
|
108
|
+
execSync(`cd ${websiteDir} && npm run lighthouse`, { stdio: 'inherit' });
|
|
109
|
+
// 3. Deploy to production
|
|
110
|
+
execSync(`cd ${websiteDir} && npm run deploy`, { stdio: 'inherit' });
|
|
111
|
+
// 4. Verify deployment
|
|
112
|
+
const response = execSync('curl -s -o /dev/null -w "%{http_code}" https://openstandardagents.org').toString();
|
|
113
|
+
if (response !== '200') {
|
|
114
|
+
throw new Error(`Website deployment failed: HTTP ${response}`);
|
|
115
|
+
}
|
|
116
|
+
console.log('✅ Website deployment successful');
|
|
117
|
+
}
|
|
118
|
+
async function announceRelease() {
|
|
119
|
+
console.log('📢 Announcing release...');
|
|
120
|
+
const packageJson = JSON.parse(execSync('cat package.json').toString());
|
|
121
|
+
const version = packageJson.version;
|
|
122
|
+
// 1. Create announcement issue
|
|
123
|
+
const projectId = process.env.CI_PROJECT_ID;
|
|
124
|
+
const issueTitle = `🎉 Release ${version} Announcement`;
|
|
125
|
+
const issueDescription = `## Release ${version} is now available!
|
|
126
|
+
|
|
127
|
+
### 📦 Installation
|
|
128
|
+
\`\`\`bash
|
|
129
|
+
npm install openstandardagents@${version}
|
|
130
|
+
\`\`\`
|
|
131
|
+
|
|
132
|
+
### 🔗 Links
|
|
133
|
+
- [npm Package](https://www.npmjs.com/package/openstandardagents/v/${version})
|
|
134
|
+
- [GitHub Release](https://github.com/blueflyio/openstandardagents/releases/tag/v${version})
|
|
135
|
+
- [Documentation](https://openstandardagents.org/docs)
|
|
136
|
+
- [Changelog](https://openstandardagents.org/docs/changelog)
|
|
137
|
+
|
|
138
|
+
### 📣 Share
|
|
139
|
+
Please help spread the word about this release!`;
|
|
140
|
+
await gitlab.Issues.create(projectId, issueTitle, {
|
|
141
|
+
description: issueDescription,
|
|
142
|
+
labels: 'announcement,release',
|
|
143
|
+
});
|
|
144
|
+
// 2. Notifications: set SLACK_WEBHOOK_URL or RELEASE_EMAIL to enable
|
|
145
|
+
const webhook = process.env.SLACK_WEBHOOK_URL;
|
|
146
|
+
const email = process.env.RELEASE_EMAIL;
|
|
147
|
+
if (webhook) {
|
|
148
|
+
try {
|
|
149
|
+
await fetch(webhook, {
|
|
150
|
+
method: 'POST',
|
|
151
|
+
headers: { 'Content-Type': 'application/json' },
|
|
152
|
+
body: JSON.stringify({
|
|
153
|
+
text: `Release announced: ${issueTitle}`,
|
|
154
|
+
unfurl_links: false,
|
|
155
|
+
}),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
console.warn('Slack notification failed:', e);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (email) {
|
|
163
|
+
try {
|
|
164
|
+
const nodemailer = await import('nodemailer');
|
|
165
|
+
const opts = process.env.SMTP_URL ??
|
|
166
|
+
process.env.MAIL_TRANSPORT ?? { jsonTransport: true };
|
|
167
|
+
const transport = nodemailer.default.createTransport(opts);
|
|
168
|
+
await transport.sendMail({
|
|
169
|
+
from: process.env.RELEASE_MAIL_FROM || 'release@localhost',
|
|
170
|
+
to: email,
|
|
171
|
+
subject: `Release announced: ${process.env.npm_package_version || 'release'}`,
|
|
172
|
+
text: 'Release has been announced. See Slack or logs for details.',
|
|
173
|
+
});
|
|
174
|
+
console.log(`Release notification sent to ${email}`);
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
console.warn('Email send failed (set SMTP_URL or install nodemailer):', e);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
console.log('✅ Release announced');
|
|
181
|
+
}
|
|
182
|
+
// Main handler
|
|
183
|
+
async function main() {
|
|
184
|
+
const action = process.env.RELEASE_ACTION;
|
|
185
|
+
switch (action) {
|
|
186
|
+
case 'npm':
|
|
187
|
+
await releaseToNpm();
|
|
188
|
+
break;
|
|
189
|
+
case 'github':
|
|
190
|
+
await releaseToGitHub();
|
|
191
|
+
break;
|
|
192
|
+
case 'website':
|
|
193
|
+
await deployWebsite();
|
|
194
|
+
break;
|
|
195
|
+
case 'announce':
|
|
196
|
+
await announceRelease();
|
|
197
|
+
break;
|
|
198
|
+
default:
|
|
199
|
+
console.error(`Unknown action: ${action}`);
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
main().catch((error) => {
|
|
204
|
+
console.error('❌ Release failed:', error);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=release-buttons.js.map
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release CRUD Service
|
|
3
|
+
* Implements full CRUD operations for releases
|
|
4
|
+
*/
|
|
5
|
+
import { type Release, type CreateReleaseRequest, type UpdateReleaseRequest } from './schemas/release.schema.js';
|
|
6
|
+
import { BaseCrudService } from './base-crud.service.js';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* Release Filter Input
|
|
10
|
+
*/
|
|
11
|
+
declare const ReleaseFilterSchema: z.ZodObject<{
|
|
12
|
+
version: z.ZodOptional<z.ZodString>;
|
|
13
|
+
state: z.ZodOptional<z.ZodEnum<{
|
|
14
|
+
deprecated: "deprecated";
|
|
15
|
+
dev: "dev";
|
|
16
|
+
draft: "draft";
|
|
17
|
+
rc: "rc";
|
|
18
|
+
released: "released";
|
|
19
|
+
}>>;
|
|
20
|
+
page: z.ZodDefault<z.ZodNumber>;
|
|
21
|
+
perPage: z.ZodDefault<z.ZodNumber>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
type ReleaseFilter = z.infer<typeof ReleaseFilterSchema>;
|
|
24
|
+
/**
|
|
25
|
+
* Release Service - CRUD operations
|
|
26
|
+
*/
|
|
27
|
+
export declare class ReleaseService extends BaseCrudService<Release, CreateReleaseRequest, UpdateReleaseRequest, ReleaseFilter> {
|
|
28
|
+
protected createSchema: z.ZodObject<{
|
|
29
|
+
version: z.ZodString;
|
|
30
|
+
milestoneId: z.ZodOptional<z.ZodNumber>;
|
|
31
|
+
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
protected updateSchema: z.ZodObject<{
|
|
34
|
+
state: z.ZodOptional<z.ZodEnum<{
|
|
35
|
+
deprecated: "deprecated";
|
|
36
|
+
dev: "dev";
|
|
37
|
+
draft: "draft";
|
|
38
|
+
rc: "rc";
|
|
39
|
+
released: "released";
|
|
40
|
+
}>>;
|
|
41
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
protected filterSchema: z.ZodObject<{
|
|
44
|
+
version: z.ZodOptional<z.ZodString>;
|
|
45
|
+
state: z.ZodOptional<z.ZodEnum<{
|
|
46
|
+
deprecated: "deprecated";
|
|
47
|
+
dev: "dev";
|
|
48
|
+
draft: "draft";
|
|
49
|
+
rc: "rc";
|
|
50
|
+
released: "released";
|
|
51
|
+
}>>;
|
|
52
|
+
page: z.ZodDefault<z.ZodNumber>;
|
|
53
|
+
perPage: z.ZodDefault<z.ZodNumber>;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
protected entitySchema: z.ZodObject<{
|
|
56
|
+
id: z.ZodString;
|
|
57
|
+
version: z.ZodString;
|
|
58
|
+
state: z.ZodEnum<{
|
|
59
|
+
deprecated: "deprecated";
|
|
60
|
+
dev: "dev";
|
|
61
|
+
draft: "draft";
|
|
62
|
+
rc: "rc";
|
|
63
|
+
released: "released";
|
|
64
|
+
}>;
|
|
65
|
+
milestoneId: z.ZodOptional<z.ZodNumber>;
|
|
66
|
+
tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
67
|
+
mergeRequestId: z.ZodOptional<z.ZodNumber>;
|
|
68
|
+
createdAt: z.ZodString;
|
|
69
|
+
updatedAt: z.ZodString;
|
|
70
|
+
releasedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
71
|
+
metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
72
|
+
}, z.core.$strip>;
|
|
73
|
+
private gitlab;
|
|
74
|
+
private projectId;
|
|
75
|
+
constructor(gitlabToken: string, projectId?: string | number);
|
|
76
|
+
/**
|
|
77
|
+
* Create a new release
|
|
78
|
+
*/
|
|
79
|
+
create(input: CreateReleaseRequest): Promise<Release>;
|
|
80
|
+
/**
|
|
81
|
+
* Read release by ID (version)
|
|
82
|
+
*/
|
|
83
|
+
read(id: string | number): Promise<Release | null>;
|
|
84
|
+
/**
|
|
85
|
+
* Update release
|
|
86
|
+
*/
|
|
87
|
+
update(id: string | number, input: UpdateReleaseRequest): Promise<Release>;
|
|
88
|
+
/**
|
|
89
|
+
* Delete release
|
|
90
|
+
*/
|
|
91
|
+
delete(id: string | number): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* List releases with filtering and pagination
|
|
94
|
+
*/
|
|
95
|
+
list(filters?: ReleaseFilter): Promise<{
|
|
96
|
+
items: Release[];
|
|
97
|
+
pagination: {
|
|
98
|
+
page: number;
|
|
99
|
+
perPage: number;
|
|
100
|
+
total: number;
|
|
101
|
+
totalPages: number;
|
|
102
|
+
};
|
|
103
|
+
}>;
|
|
104
|
+
/**
|
|
105
|
+
* Helper: Find release by version
|
|
106
|
+
*/
|
|
107
|
+
private findByVersion;
|
|
108
|
+
/**
|
|
109
|
+
* Helper: Convert GitLab tag to Release entity
|
|
110
|
+
*/
|
|
111
|
+
private tagToRelease;
|
|
112
|
+
/**
|
|
113
|
+
* Helper: Determine release state from tag name
|
|
114
|
+
*/
|
|
115
|
+
private determineReleaseState;
|
|
116
|
+
}
|
|
117
|
+
export {};
|
|
118
|
+
//# sourceMappingURL=release.service.d.ts.map
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release CRUD Service
|
|
3
|
+
* Implements full CRUD operations for releases
|
|
4
|
+
*/
|
|
5
|
+
import { Gitlab } from '@gitbeaker/rest';
|
|
6
|
+
import { ReleaseSchema, CreateReleaseRequestSchema, UpdateReleaseRequestSchema, } from './schemas/release.schema.js';
|
|
7
|
+
import { BaseCrudService } from './base-crud.service.js';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
/**
|
|
10
|
+
* Release Filter Input
|
|
11
|
+
*/
|
|
12
|
+
const ReleaseFilterSchema = z.object({
|
|
13
|
+
version: z.string().optional(),
|
|
14
|
+
state: z.enum(['draft', 'dev', 'rc', 'released', 'deprecated']).optional(),
|
|
15
|
+
page: z.number().int().positive().default(1),
|
|
16
|
+
perPage: z.number().int().positive().min(1).max(100).default(20),
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Release Service - CRUD operations
|
|
20
|
+
*/
|
|
21
|
+
export class ReleaseService extends BaseCrudService {
|
|
22
|
+
createSchema = CreateReleaseRequestSchema;
|
|
23
|
+
updateSchema = UpdateReleaseRequestSchema;
|
|
24
|
+
filterSchema = ReleaseFilterSchema;
|
|
25
|
+
entitySchema = ReleaseSchema;
|
|
26
|
+
gitlab;
|
|
27
|
+
projectId;
|
|
28
|
+
constructor(gitlabToken, projectId = process.env.CI_PROJECT_ID || '') {
|
|
29
|
+
super();
|
|
30
|
+
this.gitlab = new Gitlab({ token: gitlabToken });
|
|
31
|
+
this.projectId = projectId;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create a new release
|
|
35
|
+
*/
|
|
36
|
+
async create(input) {
|
|
37
|
+
try {
|
|
38
|
+
const validated = this.validateCreate(input);
|
|
39
|
+
// Check if release already exists
|
|
40
|
+
const existing = await this.findByVersion(validated.version);
|
|
41
|
+
if (existing) {
|
|
42
|
+
throw new Error(`Release ${validated.version} already exists`);
|
|
43
|
+
}
|
|
44
|
+
// Create release entity
|
|
45
|
+
const release = {
|
|
46
|
+
id: validated.version,
|
|
47
|
+
version: validated.version.replace(/^v/, ''),
|
|
48
|
+
state: 'draft',
|
|
49
|
+
milestoneId: validated.milestoneId,
|
|
50
|
+
tags: [],
|
|
51
|
+
mergeRequestId: undefined,
|
|
52
|
+
createdAt: new Date().toISOString(),
|
|
53
|
+
updatedAt: new Date().toISOString(),
|
|
54
|
+
releasedAt: null,
|
|
55
|
+
metadata: validated.metadata || {},
|
|
56
|
+
};
|
|
57
|
+
return this.validateEntity(release);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
this.handleValidationError(error);
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Read release by ID (version)
|
|
66
|
+
*/
|
|
67
|
+
async read(id) {
|
|
68
|
+
this.validateId(id);
|
|
69
|
+
try {
|
|
70
|
+
// Try to find by version
|
|
71
|
+
const version = String(id).replace(/^v/, '');
|
|
72
|
+
const release = await this.findByVersion(version);
|
|
73
|
+
return release;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Update release
|
|
81
|
+
*/
|
|
82
|
+
async update(id, input) {
|
|
83
|
+
this.validateId(id);
|
|
84
|
+
const validated = this.validateUpdate(input);
|
|
85
|
+
const existing = await this.read(id);
|
|
86
|
+
if (!existing) {
|
|
87
|
+
this.throwNotFound('Release', id);
|
|
88
|
+
}
|
|
89
|
+
const updated = {
|
|
90
|
+
...existing,
|
|
91
|
+
...validated,
|
|
92
|
+
updatedAt: new Date().toISOString(),
|
|
93
|
+
releasedAt: validated.state === 'released'
|
|
94
|
+
? new Date().toISOString()
|
|
95
|
+
: existing.releasedAt,
|
|
96
|
+
};
|
|
97
|
+
return this.validateEntity(updated);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Delete release
|
|
101
|
+
*/
|
|
102
|
+
async delete(id) {
|
|
103
|
+
this.validateId(id);
|
|
104
|
+
const existing = await this.read(id);
|
|
105
|
+
if (!existing) {
|
|
106
|
+
this.throwNotFound('Release', id);
|
|
107
|
+
}
|
|
108
|
+
if (existing.state === 'released') {
|
|
109
|
+
throw new Error('Cannot delete a released version. Deprecate instead.');
|
|
110
|
+
}
|
|
111
|
+
// In a real implementation, you would delete from storage here
|
|
112
|
+
// For now, we just validate the operation
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* List releases with filtering and pagination
|
|
116
|
+
*/
|
|
117
|
+
async list(filters) {
|
|
118
|
+
const validatedFilters = this.validateFilter(filters || {});
|
|
119
|
+
try {
|
|
120
|
+
// Get all tags from GitLab
|
|
121
|
+
const tags = await this.gitlab.Tags.all(this.projectId, {
|
|
122
|
+
perPage: 100,
|
|
123
|
+
});
|
|
124
|
+
// Filter and map to releases
|
|
125
|
+
const releases = tags
|
|
126
|
+
.map((tag) => this.tagToRelease(tag))
|
|
127
|
+
.filter((release) => {
|
|
128
|
+
if (validatedFilters.version) {
|
|
129
|
+
return release.version.includes(validatedFilters.version);
|
|
130
|
+
}
|
|
131
|
+
if (validatedFilters.state) {
|
|
132
|
+
return release.state === validatedFilters.state;
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
});
|
|
136
|
+
// Sort by version (newest first)
|
|
137
|
+
releases.sort((a, b) => {
|
|
138
|
+
return b.version.localeCompare(a.version, undefined, {
|
|
139
|
+
numeric: true,
|
|
140
|
+
sensitivity: 'base',
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
// Paginate
|
|
144
|
+
const total = releases.length;
|
|
145
|
+
const page = validatedFilters.page;
|
|
146
|
+
const perPage = validatedFilters.perPage;
|
|
147
|
+
const start = (page - 1) * perPage;
|
|
148
|
+
const end = start + perPage;
|
|
149
|
+
const paginated = releases.slice(start, end);
|
|
150
|
+
return {
|
|
151
|
+
items: paginated.map((r) => this.validateEntity(r)),
|
|
152
|
+
pagination: this.calculatePagination(total, page, perPage),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
throw new Error(`Failed to list releases: ${error}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Helper: Find release by version
|
|
161
|
+
*/
|
|
162
|
+
async findByVersion(version) {
|
|
163
|
+
try {
|
|
164
|
+
const tags = await this.gitlab.Tags.all(this.projectId, {
|
|
165
|
+
search: version,
|
|
166
|
+
});
|
|
167
|
+
const matchingTag = tags.find((tag) => tag.name.includes(version) || tag.name === `v${version}`);
|
|
168
|
+
if (matchingTag) {
|
|
169
|
+
return this.tagToRelease(matchingTag);
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Helper: Convert GitLab tag to Release entity
|
|
179
|
+
*/
|
|
180
|
+
tagToRelease(tag) {
|
|
181
|
+
const version = tag.name.replace(/^v/, '');
|
|
182
|
+
const state = this.determineReleaseState(tag.name);
|
|
183
|
+
return {
|
|
184
|
+
id: tag.name,
|
|
185
|
+
version,
|
|
186
|
+
state,
|
|
187
|
+
tags: [tag.name],
|
|
188
|
+
createdAt: new Date().toISOString(),
|
|
189
|
+
updatedAt: new Date().toISOString(),
|
|
190
|
+
releasedAt: state === 'released' ? new Date().toISOString() : null,
|
|
191
|
+
metadata: {},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Helper: Determine release state from tag name
|
|
196
|
+
*/
|
|
197
|
+
determineReleaseState(tagName) {
|
|
198
|
+
if (tagName.includes('-dev.'))
|
|
199
|
+
return 'dev';
|
|
200
|
+
if (tagName.includes('-rc.'))
|
|
201
|
+
return 'rc';
|
|
202
|
+
if (tagName.match(/^v?[0-9]+\.[0-9]+\.[0-9]+$/))
|
|
203
|
+
return 'released';
|
|
204
|
+
return 'draft';
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=release.service.js.map
|