@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,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base CRUD Service
|
|
3
|
+
* DRY: Reusable CRUD operations for all release automation entities
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Base CRUD Service Implementation
|
|
8
|
+
* DRY: Provides common CRUD operations
|
|
9
|
+
*/
|
|
10
|
+
export class BaseCrudService {
|
|
11
|
+
/**
|
|
12
|
+
* Validate and parse input using Zod
|
|
13
|
+
*/
|
|
14
|
+
validateCreate(input) {
|
|
15
|
+
return this.createSchema.parse(input);
|
|
16
|
+
}
|
|
17
|
+
validateUpdate(input) {
|
|
18
|
+
return this.updateSchema.parse(input);
|
|
19
|
+
}
|
|
20
|
+
validateFilter(input) {
|
|
21
|
+
return this.filterSchema.parse(input || {});
|
|
22
|
+
}
|
|
23
|
+
validateEntity(entity) {
|
|
24
|
+
return this.entitySchema.parse(entity);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Helper: Calculate pagination metadata
|
|
28
|
+
*/
|
|
29
|
+
calculatePagination(total, page, perPage) {
|
|
30
|
+
return {
|
|
31
|
+
page,
|
|
32
|
+
perPage,
|
|
33
|
+
total,
|
|
34
|
+
totalPages: Math.ceil(total / perPage),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Helper: Validate ID format
|
|
39
|
+
*/
|
|
40
|
+
validateId(id) {
|
|
41
|
+
if (typeof id === 'string' && id.length === 0) {
|
|
42
|
+
throw new Error('ID cannot be empty');
|
|
43
|
+
}
|
|
44
|
+
if (typeof id === 'number' && id <= 0) {
|
|
45
|
+
throw new Error('ID must be positive');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Helper: Handle not found errors
|
|
50
|
+
*/
|
|
51
|
+
throwNotFound(resource, id) {
|
|
52
|
+
throw new Error(`${resource} with ID ${id} not found`);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Helper: Handle validation errors
|
|
56
|
+
*/
|
|
57
|
+
handleValidationError(error) {
|
|
58
|
+
if (error instanceof z.ZodError) {
|
|
59
|
+
const details = error.issues.map((e) => ({
|
|
60
|
+
path: e.path.join('.'),
|
|
61
|
+
message: e.message,
|
|
62
|
+
}));
|
|
63
|
+
throw new Error(`Validation failed: ${details.map((d) => d.message).join(', ')}`);
|
|
64
|
+
}
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=base-crud.service.js.map
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Automated Changelog Generator from Milestone Issues
|
|
4
|
+
* Generates changelog from closed issues in a milestone
|
|
5
|
+
*/
|
|
6
|
+
import { Gitlab } from '@gitbeaker/rest';
|
|
7
|
+
import { writeFileSync } from 'fs';
|
|
8
|
+
import { execSync } from 'child_process';
|
|
9
|
+
// CI_SERVER_HOST is just 'gitlab.com' without protocol - ensure we have the full URL
|
|
10
|
+
const gitlabHost = process.env.CI_SERVER_HOST
|
|
11
|
+
? process.env.CI_SERVER_HOST.startsWith('http')
|
|
12
|
+
? process.env.CI_SERVER_HOST
|
|
13
|
+
: `https://${process.env.CI_SERVER_HOST}`
|
|
14
|
+
: 'https://gitlab.com';
|
|
15
|
+
const gitlab = new Gitlab({
|
|
16
|
+
host: gitlabHost,
|
|
17
|
+
token: process.env.GITLAB_PUSH_TOKEN || process.env.CI_JOB_TOKEN,
|
|
18
|
+
});
|
|
19
|
+
const projectId = process.env.CI_PROJECT_ID;
|
|
20
|
+
/**
|
|
21
|
+
* Categorize issues by type based on labels and title
|
|
22
|
+
*/
|
|
23
|
+
function categorizeIssue(issue) {
|
|
24
|
+
const title = issue.title.toLowerCase();
|
|
25
|
+
const labels = issue.labels.map((l) => l.toLowerCase());
|
|
26
|
+
// Check labels first
|
|
27
|
+
if (labels.some((l) => l.includes('breaking')))
|
|
28
|
+
return 'breaking';
|
|
29
|
+
if (labels.some((l) => l.includes('feature') || l.includes('enhancement')))
|
|
30
|
+
return 'features';
|
|
31
|
+
if (labels.some((l) => l.includes('bug') || l.includes('fix')))
|
|
32
|
+
return 'fixes';
|
|
33
|
+
if (labels.some((l) => l.includes('security')))
|
|
34
|
+
return 'security';
|
|
35
|
+
if (labels.some((l) => l.includes('performance')))
|
|
36
|
+
return 'performance';
|
|
37
|
+
if (labels.some((l) => l.includes('documentation') || l.includes('docs')))
|
|
38
|
+
return 'documentation';
|
|
39
|
+
if (labels.some((l) => l.includes('deprecation')))
|
|
40
|
+
return 'deprecations';
|
|
41
|
+
// Check title patterns
|
|
42
|
+
if (title.startsWith('feat:') || title.startsWith('feature:'))
|
|
43
|
+
return 'features';
|
|
44
|
+
if (title.startsWith('fix:'))
|
|
45
|
+
return 'fixes';
|
|
46
|
+
if (title.startsWith('docs:'))
|
|
47
|
+
return 'documentation';
|
|
48
|
+
if (title.startsWith('perf:'))
|
|
49
|
+
return 'performance';
|
|
50
|
+
if (title.startsWith('security:'))
|
|
51
|
+
return 'security';
|
|
52
|
+
return 'other';
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate emoji for category
|
|
56
|
+
*/
|
|
57
|
+
function getCategoryEmoji(category) {
|
|
58
|
+
const emojiMap = {
|
|
59
|
+
breaking: '💥',
|
|
60
|
+
features: '✨',
|
|
61
|
+
fixes: '🐛',
|
|
62
|
+
security: '🔒',
|
|
63
|
+
performance: '⚡',
|
|
64
|
+
documentation: '📚',
|
|
65
|
+
deprecations: '⚠️',
|
|
66
|
+
other: '🔧',
|
|
67
|
+
};
|
|
68
|
+
return emojiMap[category] || '🔧';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get category title
|
|
72
|
+
*/
|
|
73
|
+
function getCategoryTitle(category) {
|
|
74
|
+
const titleMap = {
|
|
75
|
+
breaking: 'Breaking Changes',
|
|
76
|
+
features: 'Features',
|
|
77
|
+
fixes: 'Bug Fixes',
|
|
78
|
+
security: 'Security',
|
|
79
|
+
performance: 'Performance',
|
|
80
|
+
documentation: 'Documentation',
|
|
81
|
+
deprecations: 'Deprecations',
|
|
82
|
+
other: 'Other Changes',
|
|
83
|
+
};
|
|
84
|
+
return titleMap[category] || 'Other Changes';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Fetch all issues for a milestone
|
|
88
|
+
*/
|
|
89
|
+
async function fetchMilestoneIssues(milestoneId) {
|
|
90
|
+
try {
|
|
91
|
+
const issues = (await gitlab.Issues.all({
|
|
92
|
+
projectId,
|
|
93
|
+
milestoneId: milestoneId.toString(),
|
|
94
|
+
state: 'closed',
|
|
95
|
+
perPage: 100,
|
|
96
|
+
}));
|
|
97
|
+
return issues.map((issue) => ({
|
|
98
|
+
iid: issue.iid,
|
|
99
|
+
title: issue.title,
|
|
100
|
+
labels: issue.labels || [],
|
|
101
|
+
web_url: issue.web_url,
|
|
102
|
+
author: issue.author,
|
|
103
|
+
closed_at: issue.closed_at,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error('Error fetching milestone issues:', error);
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Fetch milestone data
|
|
113
|
+
*/
|
|
114
|
+
async function fetchMilestone(milestoneId) {
|
|
115
|
+
try {
|
|
116
|
+
const milestone = (await gitlab.ProjectMilestones.show(projectId, milestoneId));
|
|
117
|
+
return {
|
|
118
|
+
id: milestone.id,
|
|
119
|
+
title: milestone.title,
|
|
120
|
+
description: milestone.description || '',
|
|
121
|
+
state: milestone.state,
|
|
122
|
+
due_date: milestone.due_date,
|
|
123
|
+
web_url: milestone.web_url,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
console.error('Error fetching milestone:', error);
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Generate changelog content
|
|
133
|
+
*/
|
|
134
|
+
function generateChangelog(milestone, issues, version) {
|
|
135
|
+
const releaseDate = new Date().toISOString().split('T')[0];
|
|
136
|
+
// Group issues by category
|
|
137
|
+
const categorized = {};
|
|
138
|
+
issues.forEach((issue) => {
|
|
139
|
+
const category = categorizeIssue(issue);
|
|
140
|
+
if (!categorized[category]) {
|
|
141
|
+
categorized[category] = [];
|
|
142
|
+
}
|
|
143
|
+
categorized[category].push(issue);
|
|
144
|
+
});
|
|
145
|
+
// Sort categories by importance
|
|
146
|
+
const categoryOrder = [
|
|
147
|
+
'breaking',
|
|
148
|
+
'security',
|
|
149
|
+
'features',
|
|
150
|
+
'fixes',
|
|
151
|
+
'performance',
|
|
152
|
+
'deprecations',
|
|
153
|
+
'documentation',
|
|
154
|
+
'other',
|
|
155
|
+
];
|
|
156
|
+
let changelog = `# Changelog - v${version}\n\n`;
|
|
157
|
+
changelog += `**Release Date:** ${releaseDate}\n\n`;
|
|
158
|
+
changelog += `**Milestone:** [${milestone.title}](${milestone.web_url})\n\n`;
|
|
159
|
+
if (milestone.description) {
|
|
160
|
+
changelog += `## Overview\n\n${milestone.description}\n\n`;
|
|
161
|
+
}
|
|
162
|
+
changelog += `## What's Changed\n\n`;
|
|
163
|
+
// Generate sections for each category
|
|
164
|
+
categoryOrder.forEach((category) => {
|
|
165
|
+
if (categorized[category] && categorized[category].length > 0) {
|
|
166
|
+
const emoji = getCategoryEmoji(category);
|
|
167
|
+
const title = getCategoryTitle(category);
|
|
168
|
+
changelog += `### ${emoji} ${title}\n\n`;
|
|
169
|
+
categorized[category].forEach((issue) => {
|
|
170
|
+
const cleanTitle = issue.title
|
|
171
|
+
.replace(/^(feat|fix|docs|perf|security|chore|refactor|test|build|ci):\s*/i, '')
|
|
172
|
+
.trim();
|
|
173
|
+
changelog += `- ${cleanTitle} ([#${issue.iid}](${issue.web_url}))\n`;
|
|
174
|
+
});
|
|
175
|
+
changelog += `\n`;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
// Add statistics
|
|
179
|
+
changelog += `## Statistics\n\n`;
|
|
180
|
+
changelog += `- **Total Issues Closed:** ${issues.length}\n`;
|
|
181
|
+
const contributors = new Set(issues.map((i) => i.author.username));
|
|
182
|
+
changelog += `- **Contributors:** ${contributors.size}\n`;
|
|
183
|
+
if (milestone.due_date) {
|
|
184
|
+
changelog += `- **Planned Release Date:** ${milestone.due_date}\n`;
|
|
185
|
+
}
|
|
186
|
+
changelog += `- **Actual Release Date:** ${releaseDate}\n\n`;
|
|
187
|
+
// Add contributors list
|
|
188
|
+
if (contributors.size > 0) {
|
|
189
|
+
changelog += `## Contributors\n\n`;
|
|
190
|
+
changelog += `Thanks to all contributors who made this release possible:\n\n`;
|
|
191
|
+
Array.from(contributors)
|
|
192
|
+
.sort()
|
|
193
|
+
.forEach((username) => {
|
|
194
|
+
changelog += `- @${username}\n`;
|
|
195
|
+
});
|
|
196
|
+
changelog += `\n`;
|
|
197
|
+
}
|
|
198
|
+
// Add links
|
|
199
|
+
changelog += `## Links\n\n`;
|
|
200
|
+
changelog += `- [Milestone](${milestone.web_url})\n`;
|
|
201
|
+
changelog += `- [Full Changelog](https://gitlab.com/${process.env.CI_PROJECT_PATH}/-/compare/v${getPreviousVersion(version)}...v${version})\n`;
|
|
202
|
+
changelog += `- [npm Package](https://www.npmjs.com/package/@bluefly/openstandardagents/v/${version})\n`;
|
|
203
|
+
changelog += `- [Documentation](https://openstandardagents.org/)\n`;
|
|
204
|
+
return changelog;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get previous version (simple implementation)
|
|
208
|
+
*/
|
|
209
|
+
function getPreviousVersion(version) {
|
|
210
|
+
try {
|
|
211
|
+
const tags = execSync('git tag --sort=-version:refname')
|
|
212
|
+
.toString()
|
|
213
|
+
.trim()
|
|
214
|
+
.split('\n')
|
|
215
|
+
.filter((tag) => tag.startsWith('v') && tag !== `v${version}`);
|
|
216
|
+
return tags[0] || '0.0.0';
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
return '0.0.0';
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Main execution
|
|
224
|
+
*/
|
|
225
|
+
async function main() {
|
|
226
|
+
const milestoneId = process.env.MILESTONE_ID || process.env.CI_MILESTONE_ID;
|
|
227
|
+
const version = process.env.RELEASE_VERSION || process.env.CI_COMMIT_TAG?.replace(/^v/, '');
|
|
228
|
+
const outputPath = process.env.CHANGELOG_OUTPUT || './RELEASE_NOTES.md';
|
|
229
|
+
if (!milestoneId) {
|
|
230
|
+
console.error('❌ ERROR: MILESTONE_ID not set');
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
if (!version) {
|
|
234
|
+
console.error('❌ ERROR: RELEASE_VERSION not set');
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
console.log('📝 Generating Changelog');
|
|
238
|
+
console.log('======================');
|
|
239
|
+
console.log(`Milestone ID: ${milestoneId}`);
|
|
240
|
+
console.log(`Version: v${version}`);
|
|
241
|
+
console.log('');
|
|
242
|
+
// Fetch milestone data
|
|
243
|
+
console.log('Fetching milestone data...');
|
|
244
|
+
const milestone = await fetchMilestone(parseInt(milestoneId));
|
|
245
|
+
if (!milestone) {
|
|
246
|
+
console.error('❌ ERROR: Failed to fetch milestone');
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
console.log(`Milestone: ${milestone.title}`);
|
|
250
|
+
console.log(`State: ${milestone.state}`);
|
|
251
|
+
console.log('');
|
|
252
|
+
// Fetch issues
|
|
253
|
+
console.log('Fetching closed issues...');
|
|
254
|
+
const issues = await fetchMilestoneIssues(parseInt(milestoneId));
|
|
255
|
+
console.log(`Found ${issues.length} closed issues`);
|
|
256
|
+
console.log('');
|
|
257
|
+
if (issues.length === 0) {
|
|
258
|
+
console.warn('⚠️ WARNING: No closed issues found in milestone');
|
|
259
|
+
}
|
|
260
|
+
// Generate changelog
|
|
261
|
+
console.log('Generating changelog...');
|
|
262
|
+
const changelog = generateChangelog(milestone, issues, version);
|
|
263
|
+
// Write to file
|
|
264
|
+
writeFileSync(outputPath, changelog, 'utf-8');
|
|
265
|
+
console.log(`✅ Changelog written to: ${outputPath}`);
|
|
266
|
+
console.log('');
|
|
267
|
+
console.log('Preview:');
|
|
268
|
+
console.log('--------');
|
|
269
|
+
console.log(changelog);
|
|
270
|
+
// Also export to environment
|
|
271
|
+
console.log('');
|
|
272
|
+
console.log('Exported environment variables:');
|
|
273
|
+
console.log(`CHANGELOG_PATH=${outputPath}`);
|
|
274
|
+
console.log(`ISSUE_COUNT=${issues.length}`);
|
|
275
|
+
console.log(`MILESTONE_TITLE=${milestone.title}`);
|
|
276
|
+
// Write dotenv file for GitLab CI
|
|
277
|
+
const envContent = `CHANGELOG_PATH=${outputPath}
|
|
278
|
+
ISSUE_COUNT=${issues.length}
|
|
279
|
+
MILESTONE_TITLE=${milestone.title}
|
|
280
|
+
MILESTONE_URL=${milestone.web_url}
|
|
281
|
+
`;
|
|
282
|
+
writeFileSync('changelog.env', envContent, 'utf-8');
|
|
283
|
+
}
|
|
284
|
+
main().catch((error) => {
|
|
285
|
+
console.error('❌ Changelog generation failed:', error);
|
|
286
|
+
process.exit(1);
|
|
287
|
+
});
|
|
288
|
+
//# sourceMappingURL=generate-changelog.js.map
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Auto-increment dev tag on successful merge to development
|
|
4
|
+
* Runs in CI after merge
|
|
5
|
+
*/
|
|
6
|
+
import { Gitlab } from '@gitbeaker/rest';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
const gitlab = new Gitlab({
|
|
9
|
+
token: process.env.GITLAB_TOKEN || process.env.CI_JOB_TOKEN,
|
|
10
|
+
});
|
|
11
|
+
async function incrementDevTag() {
|
|
12
|
+
const projectId = process.env.CI_PROJECT_ID;
|
|
13
|
+
const commitSha = process.env.CI_COMMIT_SHA;
|
|
14
|
+
const commitMessage = process.env.CI_COMMIT_MESSAGE || '';
|
|
15
|
+
const commitAuthor = process.env.GITLAB_USER_NAME || 'GitLab CI';
|
|
16
|
+
const pipelineUrl = process.env.CI_PIPELINE_URL || '';
|
|
17
|
+
// Get current milestone from package.json
|
|
18
|
+
const packageJson = JSON.parse(execSync('cat package.json').toString());
|
|
19
|
+
const version = packageJson.version; // e.g., "0.2.6-dev.5"
|
|
20
|
+
if (!version.includes('-dev.')) {
|
|
21
|
+
console.log('Not a dev version, skipping');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// Extract base version and increment
|
|
25
|
+
const [baseVersion, devPart] = version.split('-dev.');
|
|
26
|
+
const currentNum = parseInt(devPart);
|
|
27
|
+
const nextNum = currentNum + 1;
|
|
28
|
+
const nextVersion = `${baseVersion}-dev.${nextNum}`;
|
|
29
|
+
const tagName = `v${nextVersion}`;
|
|
30
|
+
// Get commit details for rich tag description
|
|
31
|
+
const commitDate = new Date().toISOString();
|
|
32
|
+
const shortSha = commitSha.substring(0, 8);
|
|
33
|
+
// Get recent commits since last tag
|
|
34
|
+
let recentCommits = '';
|
|
35
|
+
try {
|
|
36
|
+
const lastTag = `v${baseVersion}-dev.${currentNum}`;
|
|
37
|
+
recentCommits = execSync(`git log ${lastTag}..HEAD --oneline --no-merges`)
|
|
38
|
+
.toString()
|
|
39
|
+
.trim();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
recentCommits = execSync('git log -5 --oneline --no-merges')
|
|
43
|
+
.toString()
|
|
44
|
+
.trim();
|
|
45
|
+
}
|
|
46
|
+
// Create rich tag description
|
|
47
|
+
const tagDescription = `# Development Release ${tagName}
|
|
48
|
+
|
|
49
|
+
**Auto-generated development tag** - ${commitDate}
|
|
50
|
+
|
|
51
|
+
## 📦 Version Information
|
|
52
|
+
- **Version**: ${nextVersion}
|
|
53
|
+
- **Base Version**: ${baseVersion}
|
|
54
|
+
- **Dev Iteration**: ${nextNum}
|
|
55
|
+
- **Commit**: ${shortSha}
|
|
56
|
+
- **Author**: ${commitAuthor}
|
|
57
|
+
|
|
58
|
+
## 🔗 Links
|
|
59
|
+
- **Pipeline**: ${pipelineUrl}
|
|
60
|
+
- **Commit**: https://gitlab.com/blueflyio/openstandardagents/-/commit/${commitSha}
|
|
61
|
+
|
|
62
|
+
## 📝 Recent Changes
|
|
63
|
+
\`\`\`
|
|
64
|
+
${recentCommits}
|
|
65
|
+
\`\`\`
|
|
66
|
+
|
|
67
|
+
## ⚠️ Development Release
|
|
68
|
+
This is a development release and should not be used in production.
|
|
69
|
+
- Not published to npm
|
|
70
|
+
- May contain breaking changes
|
|
71
|
+
- For testing and development only
|
|
72
|
+
|
|
73
|
+
## 🚀 Next Steps
|
|
74
|
+
When milestone is complete and closed:
|
|
75
|
+
1. RC tag will be created automatically
|
|
76
|
+
2. MR to main will be created
|
|
77
|
+
3. After approval, production release will be triggered
|
|
78
|
+
`;
|
|
79
|
+
// Create new tag (correct API signature: projectId, tagName, ref, options)
|
|
80
|
+
await gitlab.Tags.create(projectId, tagName, commitSha, {
|
|
81
|
+
message: tagDescription,
|
|
82
|
+
});
|
|
83
|
+
console.log(`✅ Created tag: ${tagName}`);
|
|
84
|
+
// Update package.json version
|
|
85
|
+
execSync(`npm version ${nextVersion} --no-git-tag-version`);
|
|
86
|
+
// Commit version bump
|
|
87
|
+
execSync('git config user.name "GitLab CI"');
|
|
88
|
+
execSync('git config user.email "ci@gitlab.com"');
|
|
89
|
+
execSync('git add package.json package-lock.json');
|
|
90
|
+
execSync(`git commit -m "chore: bump version to ${nextVersion} [skip ci]"`);
|
|
91
|
+
execSync('git push origin development');
|
|
92
|
+
console.log(`✅ Bumped version to: ${nextVersion}`);
|
|
93
|
+
// Check if milestone is complete and create MR if needed
|
|
94
|
+
await checkMilestoneAndCreateMR(projectId, baseVersion);
|
|
95
|
+
}
|
|
96
|
+
async function checkMilestoneAndCreateMR(projectId, version) {
|
|
97
|
+
try {
|
|
98
|
+
// Find milestone for this version
|
|
99
|
+
const milestones = await gitlab.ProjectMilestones.all(projectId, {
|
|
100
|
+
state: 'closed',
|
|
101
|
+
search: version,
|
|
102
|
+
});
|
|
103
|
+
if (milestones.length === 0) {
|
|
104
|
+
console.log('ℹ️ No closed milestone found, skipping MR creation');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const milestone = milestones[0];
|
|
108
|
+
// Check if MR already exists
|
|
109
|
+
const existingMRs = await gitlab.MergeRequests.all({
|
|
110
|
+
projectId,
|
|
111
|
+
sourceBranch: 'development',
|
|
112
|
+
targetBranch: 'main',
|
|
113
|
+
state: 'opened',
|
|
114
|
+
});
|
|
115
|
+
if (existingMRs.length > 0) {
|
|
116
|
+
console.log('ℹ️ MR already exists, skipping');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Create MR to main
|
|
120
|
+
const mr = await gitlab.MergeRequests.create(projectId, 'development', 'main', `Release ${version}`, {
|
|
121
|
+
description: `## 🚀 Release ${version}
|
|
122
|
+
|
|
123
|
+
**Milestone**: ${milestone.title}
|
|
124
|
+
**Status**: Ready for Release
|
|
125
|
+
|
|
126
|
+
### ✅ Pre-Release Checklist
|
|
127
|
+
- [x] All milestone issues closed
|
|
128
|
+
- [x] All tests passing
|
|
129
|
+
- [x] Security scans passed
|
|
130
|
+
- [x] Documentation updated
|
|
131
|
+
- [x] Changelog updated
|
|
132
|
+
|
|
133
|
+
### 📋 Approval Required
|
|
134
|
+
- [ ] Technical Lead approval
|
|
135
|
+
- [ ] Security Lead approval
|
|
136
|
+
- [ ] Product Owner approval
|
|
137
|
+
- [ ] Release Manager approval
|
|
138
|
+
|
|
139
|
+
### 🎯 Release Actions (Manual Triggers)
|
|
140
|
+
After all approvals, use pipeline buttons to:
|
|
141
|
+
1. 🚀 Release to npm
|
|
142
|
+
2. 🐙 Release to GitHub
|
|
143
|
+
3. 🌐 Deploy Website
|
|
144
|
+
4. 📢 Announce Release
|
|
145
|
+
|
|
146
|
+
**DO NOT MERGE MANUALLY** - This MR will auto-merge after successful release.
|
|
147
|
+
`,
|
|
148
|
+
removeSourceBranch: false,
|
|
149
|
+
squash: false,
|
|
150
|
+
labels: 'release,automation',
|
|
151
|
+
milestoneId: milestone.id,
|
|
152
|
+
});
|
|
153
|
+
console.log(`✅ Created MR: !${mr.iid} - ${mr.web_url}`);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.log('ℹ️ Could not create MR:', error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
incrementDevTag().catch(console.error);
|
|
160
|
+
//# sourceMappingURL=increment-dev-tag.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release Automation - Main Export
|
|
3
|
+
* CRUD, DRY, OpenAPI, Zod-based release automation system
|
|
4
|
+
*/
|
|
5
|
+
export * from './schemas/release.schema.js';
|
|
6
|
+
export * from './base-crud.service.js';
|
|
7
|
+
export * from './release.service.js';
|
|
8
|
+
export * from './milestone.service.js';
|
|
9
|
+
export * from './tag.service.js';
|
|
10
|
+
export * from './merge-request.service.js';
|
|
11
|
+
export * from './webhook.service.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release Automation - Main Export
|
|
3
|
+
* CRUD, DRY, OpenAPI, Zod-based release automation system
|
|
4
|
+
*/
|
|
5
|
+
export * from './schemas/release.schema.js';
|
|
6
|
+
export * from './base-crud.service.js';
|
|
7
|
+
export * from './release.service.js';
|
|
8
|
+
export * from './milestone.service.js';
|
|
9
|
+
export * from './tag.service.js';
|
|
10
|
+
export * from './merge-request.service.js';
|
|
11
|
+
export * from './webhook.service.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge Request CRUD Service
|
|
3
|
+
* Implements full CRUD operations for merge requests
|
|
4
|
+
*/
|
|
5
|
+
import { type MergeRequest, type CreateMergeRequestRequest, type UpdateMergeRequestRequest } from './schemas/release.schema.js';
|
|
6
|
+
import { BaseCrudService } from './base-crud.service.js';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* Merge Request Filter Input
|
|
10
|
+
*/
|
|
11
|
+
declare const MergeRequestFilterSchema: z.ZodObject<{
|
|
12
|
+
state: z.ZodOptional<z.ZodEnum<{
|
|
13
|
+
closed: "closed";
|
|
14
|
+
opened: "opened";
|
|
15
|
+
merged: "merged";
|
|
16
|
+
locked: "locked";
|
|
17
|
+
}>>;
|
|
18
|
+
page: z.ZodDefault<z.ZodNumber>;
|
|
19
|
+
perPage: z.ZodDefault<z.ZodNumber>;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
type MergeRequestFilter = z.infer<typeof MergeRequestFilterSchema>;
|
|
22
|
+
/**
|
|
23
|
+
* Merge Request Service - CRUD operations
|
|
24
|
+
*/
|
|
25
|
+
export declare class MergeRequestService extends BaseCrudService<MergeRequest, CreateMergeRequestRequest, UpdateMergeRequestRequest, MergeRequestFilter> {
|
|
26
|
+
protected createSchema: z.ZodObject<{
|
|
27
|
+
sourceBranch: z.ZodString;
|
|
28
|
+
targetBranch: z.ZodString;
|
|
29
|
+
title: z.ZodString;
|
|
30
|
+
description: z.ZodOptional<z.ZodString>;
|
|
31
|
+
labels: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
32
|
+
milestoneId: z.ZodOptional<z.ZodNumber>;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
protected updateSchema: z.ZodObject<{
|
|
35
|
+
title: z.ZodOptional<z.ZodString>;
|
|
36
|
+
description: z.ZodOptional<z.ZodString>;
|
|
37
|
+
state: z.ZodOptional<z.ZodEnum<{
|
|
38
|
+
closed: "closed";
|
|
39
|
+
opened: "opened";
|
|
40
|
+
merged: "merged";
|
|
41
|
+
locked: "locked";
|
|
42
|
+
}>>;
|
|
43
|
+
labels: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
protected filterSchema: z.ZodObject<{
|
|
46
|
+
state: z.ZodOptional<z.ZodEnum<{
|
|
47
|
+
closed: "closed";
|
|
48
|
+
opened: "opened";
|
|
49
|
+
merged: "merged";
|
|
50
|
+
locked: "locked";
|
|
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.ZodNumber;
|
|
57
|
+
title: z.ZodString;
|
|
58
|
+
description: z.ZodOptional<z.ZodString>;
|
|
59
|
+
sourceBranch: z.ZodString;
|
|
60
|
+
targetBranch: z.ZodString;
|
|
61
|
+
state: z.ZodEnum<{
|
|
62
|
+
closed: "closed";
|
|
63
|
+
opened: "opened";
|
|
64
|
+
merged: "merged";
|
|
65
|
+
locked: "locked";
|
|
66
|
+
}>;
|
|
67
|
+
mergeStatus: z.ZodOptional<z.ZodEnum<{
|
|
68
|
+
can_be_merged: "can_be_merged";
|
|
69
|
+
cannot_be_merged: "cannot_be_merged";
|
|
70
|
+
checking: "checking";
|
|
71
|
+
unchecked: "unchecked";
|
|
72
|
+
}>>;
|
|
73
|
+
createdAt: z.ZodString;
|
|
74
|
+
updatedAt: z.ZodString;
|
|
75
|
+
mergedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
76
|
+
labels: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
77
|
+
approvals: z.ZodDefault<z.ZodObject<{
|
|
78
|
+
required: z.ZodDefault<z.ZodNumber>;
|
|
79
|
+
received: z.ZodDefault<z.ZodNumber>;
|
|
80
|
+
}, z.core.$strip>>;
|
|
81
|
+
}, z.core.$strip>;
|
|
82
|
+
private gitlab;
|
|
83
|
+
private projectId;
|
|
84
|
+
constructor(gitlabToken: string, projectId?: string | number);
|
|
85
|
+
/**
|
|
86
|
+
* Create a new merge request
|
|
87
|
+
*/
|
|
88
|
+
create(input: CreateMergeRequestRequest): Promise<MergeRequest>;
|
|
89
|
+
/**
|
|
90
|
+
* Read merge request by ID
|
|
91
|
+
*/
|
|
92
|
+
read(id: string | number): Promise<MergeRequest | null>;
|
|
93
|
+
/**
|
|
94
|
+
* Update merge request
|
|
95
|
+
*/
|
|
96
|
+
update(id: string | number, input: UpdateMergeRequestRequest): Promise<MergeRequest>;
|
|
97
|
+
/**
|
|
98
|
+
* Delete merge request
|
|
99
|
+
*/
|
|
100
|
+
delete(id: string | number): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* List merge requests with filtering and pagination
|
|
103
|
+
*/
|
|
104
|
+
list(filters?: MergeRequestFilter): Promise<{
|
|
105
|
+
items: MergeRequest[];
|
|
106
|
+
pagination: {
|
|
107
|
+
page: number;
|
|
108
|
+
perPage: number;
|
|
109
|
+
total: number;
|
|
110
|
+
totalPages: number;
|
|
111
|
+
};
|
|
112
|
+
}>;
|
|
113
|
+
/**
|
|
114
|
+
* Helper: Get merge request approvals
|
|
115
|
+
*/
|
|
116
|
+
private getApprovals;
|
|
117
|
+
}
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=merge-request.service.d.ts.map
|