@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.
Files changed (300) hide show
  1. package/.version.json +3 -3
  2. package/CHANGELOG.md +16 -0
  3. package/README.md +1 -0
  4. package/dist/.version.json +3 -3
  5. package/dist/adapters/mcp/converter.js +4 -3
  6. package/dist/adapters/npm/adapter.js +2 -1
  7. package/dist/adapters/openai-agents/adapter.js +1 -1
  8. package/dist/cli/commands/config.command.d.ts +7 -0
  9. package/dist/cli/commands/config.command.js +92 -0
  10. package/dist/cli/commands/migrate.command.js +1 -1
  11. package/dist/cli/commands/sign.command.d.ts +3 -0
  12. package/dist/cli/commands/sign.command.js +42 -0
  13. package/dist/cli/commands/skills.command.js +4 -6
  14. package/dist/config/cli-config.d.ts +33 -0
  15. package/dist/config/cli-config.js +107 -0
  16. package/dist/mcp-server/index.js +0 -0
  17. package/dist/package.json +8 -9
  18. package/dist/services/governance/cedar-provider.js +2 -1
  19. package/dist/services/release-automation/base-crud.service.d.ts +93 -0
  20. package/dist/services/release-automation/base-crud.service.js +68 -0
  21. package/dist/services/release-automation/generate-changelog.d.ts +7 -0
  22. package/dist/services/release-automation/generate-changelog.js +288 -0
  23. package/dist/services/release-automation/increment-dev-tag.d.ts +7 -0
  24. package/dist/services/release-automation/increment-dev-tag.js +160 -0
  25. package/dist/services/release-automation/index.d.ts +12 -0
  26. package/dist/services/release-automation/index.js +12 -0
  27. package/dist/services/release-automation/merge-request.service.d.ts +119 -0
  28. package/dist/services/release-automation/merge-request.service.js +212 -0
  29. package/dist/services/release-automation/milestone.service.d.ts +104 -0
  30. package/dist/services/release-automation/milestone.service.js +207 -0
  31. package/dist/services/release-automation/release-agent.service.d.ts +39 -0
  32. package/dist/services/release-automation/release-agent.service.js +43 -0
  33. package/dist/services/release-automation/release-buttons.d.ts +7 -0
  34. package/dist/services/release-automation/release-buttons.js +207 -0
  35. package/dist/services/release-automation/release.service.d.ts +118 -0
  36. package/dist/services/release-automation/release.service.js +207 -0
  37. package/dist/services/release-automation/schemas/release.schema.d.ts +299 -0
  38. package/dist/services/release-automation/schemas/release.schema.js +272 -0
  39. package/dist/services/release-automation/tag.service.d.ts +99 -0
  40. package/dist/services/release-automation/tag.service.js +183 -0
  41. package/dist/services/release-automation/webhook.service.d.ts +37 -0
  42. package/dist/services/release-automation/webhook.service.js +187 -0
  43. package/dist/skills/test-skill/README.md +36 -0
  44. package/dist/skills/test-skill/SKILL.md +31 -0
  45. package/dist/skills/test-skill/index.d.ts +31 -0
  46. package/dist/skills/test-skill/install.js +44 -0
  47. package/dist/skills/test-skill/package.json +36 -0
  48. package/dist/spec/reference/reference-agents/compliance-auditor/manifest.ossa.yaml +1 -1
  49. package/dist/spec/reference/reference-agents/doc-agent/manifest.ossa.yaml +1 -1
  50. package/dist/spec/reference/reference-agents/mr-reviewer/manifest.ossa.yaml +1 -1
  51. package/dist/spec/reference/reference-agents/ossa-validator-v0.3/manifest.ossa.yaml +1 -1
  52. package/dist/spec/reference/reference-agents/pipeline-fixer/manifest.ossa.yaml +1 -1
  53. package/dist/spec/reference/reference-agents/release-orchestrator/manifest.ossa.yaml +1 -1
  54. package/dist/spec/uadp/README.md +393 -0
  55. package/dist/spec/uadp/openapi.yaml +387 -0
  56. package/dist/spec/uadp/schemas/uadp-agents-response.schema.json +68 -0
  57. package/dist/spec/uadp/schemas/uadp-federation-response.schema.json +46 -0
  58. package/dist/spec/uadp/schemas/uadp-manifest.schema.json +82 -0
  59. package/dist/spec/uadp/schemas/uadp-skills-response.schema.json +72 -0
  60. package/dist/spec/v0.4/agent-card.schema.json +1 -1
  61. package/dist/spec/v0.4/agent.schema.json +15 -15
  62. package/dist/spec/v0.4/extensions/a2a/a2a.schema.json +1 -1
  63. package/dist/spec/v0.4/extensions/ag2/ag2.schema.json +1 -1
  64. package/dist/spec/v0.4/extensions/crewai/crewai.schema.json +1 -1
  65. package/dist/spec/v0.4/extensions/kagent/kagent.schema.json +1 -1
  66. package/dist/spec/v0.4/extensions/langchain/langchain.schema.json +1 -1
  67. package/dist/spec/v0.4/extensions/langgraph/langgraph.schema.json +1 -1
  68. package/dist/spec/v0.4/extensions/mcp/mcp.schema.json +1 -1
  69. package/dist/spec/v0.5/agent-card.schema.json +477 -0
  70. package/dist/spec/v0.5/agent.schema.json +1556 -0
  71. package/dist/spec/v0.5/conformance/profiles/baseline.json +19 -0
  72. package/dist/spec/v0.5/conformance/profiles/enterprise.json +20 -0
  73. package/dist/spec/v0.5/extensions/a2a/README.md +193 -0
  74. package/dist/spec/v0.5/extensions/a2a/a2a.schema.json +77 -0
  75. package/dist/spec/v0.5/extensions/ag2/ag2.schema.json +277 -0
  76. package/dist/spec/v0.5/extensions/cognition/cognition.schema.json +94 -0
  77. package/dist/spec/v0.5/extensions/cognition/thought-node.schema.json +80 -0
  78. package/dist/spec/v0.5/extensions/crewai/crewai.schema.json +256 -0
  79. package/dist/spec/v0.5/extensions/drupal/drupal.schema.json +318 -0
  80. package/dist/spec/v0.5/extensions/evals/evals.schema.json +597 -0
  81. package/dist/spec/v0.5/extensions/governance/governance-extension.yaml +161 -0
  82. package/dist/spec/v0.5/extensions/identity/identity.schema.json +302 -0
  83. package/dist/spec/v0.5/extensions/kagent/README.md +315 -0
  84. package/dist/spec/v0.5/extensions/kagent/kagent.schema.json +624 -0
  85. package/dist/spec/v0.5/extensions/langchain/langchain.schema.json +243 -0
  86. package/dist/spec/v0.5/extensions/langgraph/langgraph.schema.json +211 -0
  87. package/dist/spec/v0.5/extensions/mcp/README.md +276 -0
  88. package/dist/spec/v0.5/extensions/mcp/mcp.schema.json +84 -0
  89. package/dist/spec/v0.5/extensions/memory/memory.schema.json +7 -0
  90. package/dist/spec/v0.5/extensions/team/team.schema.json +304 -0
  91. package/dist/spec/v0.5/extensions/token-efficiency/token-efficiency.schema.json +47 -0
  92. package/dist/spec/v0.5/mcp.schema.json +1 -0
  93. package/dist/spec/v0.5/skill.schema.json +1 -0
  94. package/dist/spec/v0.5/validator.schema.json +282 -0
  95. package/dist/validation/error-codes.js +1 -1
  96. package/examples/a2a/agent-handoff.ossa.yaml +1 -1
  97. package/examples/a2a/service-discovery.ossa.yaml +1 -1
  98. package/examples/adapters/drupal-eca-mapping.yaml +1 -1
  99. package/examples/adapters/drupal-eca-task.yaml +1 -1
  100. package/examples/adapters/drupal-flowdrop-mapping.yaml +1 -1
  101. package/examples/adapters/drupal-maestro-mapping.yaml +1 -1
  102. package/examples/adapters/mistral-agent.yaml +1 -1
  103. package/examples/adapters/symfony-messenger-task.yaml +1 -1
  104. package/examples/adapters/symfony-messenger-workflow.yaml +1 -1
  105. package/examples/adk-integration/code-review-workflow.yml +1 -1
  106. package/examples/adk-integration/customer-support.yml +1 -1
  107. package/examples/adk-integration/data-pipeline.yml +1 -1
  108. package/examples/advanced/reasoning-agent.yaml +1 -1
  109. package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
  110. package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
  111. package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
  112. package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
  113. package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
  114. package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
  115. package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
  116. package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
  117. package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
  118. package/examples/agent-taxonomy-example.ossa.yaml +1 -1
  119. package/examples/agents/01-customer-support-bot/agent.ossa.yaml +1 -1
  120. package/examples/agents/02-code-review-agent/agent.ossa.yaml +1 -1
  121. package/examples/agents/03-data-analysis-agent/agent.ossa.yaml +1 -1
  122. package/examples/agents/04-content-moderator/agent.ossa.yaml +1 -1
  123. package/examples/agents/05-sales-assistant/agent.ossa.yaml +1 -1
  124. package/examples/agents/06-devops-agent/agent.ossa.yaml +1 -1
  125. package/examples/agents/07-research-assistant/agent.ossa.yaml +1 -1
  126. package/examples/agents/08-email-triage-agent/agent.ossa.yaml +1 -1
  127. package/examples/agents/09-security-scanner/agent.ossa.yaml +1 -1
  128. package/examples/agents/10-meeting-assistant/agent.ossa.yaml +1 -1
  129. package/examples/agents/architecture-healer-enterprise.yaml +1 -1
  130. package/examples/agents/dependency-healer-npm.yaml +1 -1
  131. package/examples/agents/spec-healer-openapi.yaml +1 -1
  132. package/examples/agents/wiki-healer-production.yaml +1 -1
  133. package/examples/agents-md/monorepo-agent.ossa.yaml +1 -1
  134. package/examples/agentscope/react-assistant/README.md +111 -0
  135. package/examples/agentscope/react-assistant/agent.ossa.yaml +132 -0
  136. package/examples/agentscope/react-assistant/skills/code-analysis/SKILL.md +18 -0
  137. package/examples/agentscope/react-assistant/skills/question-answering/SKILL.md +18 -0
  138. package/examples/autonomous-evolution/self-evolving-agent.ossa.yaml +1 -1
  139. package/examples/bridges/.gitlab-ci.yml +2 -2
  140. package/examples/build-once-use-everywhere/agent.ossa.yaml +1 -1
  141. package/examples/claude-code/code-reviewer.ossa.yaml +1 -1
  142. package/examples/claude-code/ossa-validator.ossa.yaml +1 -1
  143. package/examples/common_npm/agent-router.ossa.yaml +1 -1
  144. package/examples/contracts/data-consumer.ossa.yaml +1 -1
  145. package/examples/contracts/data-producer-v2.ossa.yaml +1 -1
  146. package/examples/contracts/data-producer.ossa.yaml +1 -1
  147. package/examples/drupal/QUICKSTART.md +17 -3
  148. package/examples/drupal/ai_agents_agentscope/README.md +62 -0
  149. package/examples/drupal/ai_agents_agentscope/ai_agents_agentscope.info.yml +13 -0
  150. package/examples/drupal/ai_agents_agentscope/ai_agents_agentscope.services.yml +4 -0
  151. package/examples/drupal/ai_agents_agentscope/config/install/ai_agents_agentscope.settings.yml +3 -0
  152. package/examples/drupal/ai_agents_agentscope/config/schema/ai_agents_agentscope.schema.yml +14 -0
  153. package/examples/drupal/ai_agents_agentscope/src/AgentScopeRuntime.php +11 -0
  154. package/examples/drupal/ai_agents_agentscope/src/Plugin/AiAgent/AgentScopeAgent.php +10 -0
  155. package/examples/drupal/ai_agents_agentscope/src/Plugin/AiProvider/AgentScopeProvider.php +217 -0
  156. package/examples/drupal/ai_agents_agentscope/src/Plugin/Derivative/AgentScopeDeriver.php +10 -0
  157. package/examples/drupal/ai_agents_agentscope/src/Service/AgentScopeAdapter.php +9 -0
  158. package/examples/drupal/content-moderator.ossa.yaml +1 -1
  159. package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -1
  160. package/examples/export/langchain/production-agent-with-memory/agent.ossa.yaml +1 -1
  161. package/examples/export/langchain/production-agent-with-tools/agent.ossa.yaml +1 -1
  162. package/examples/extensions/agents-md-advanced.yml +1 -1
  163. package/examples/extensions/agents-md-basic.yml +1 -1
  164. package/examples/extensions/agents-md-sync.yml +1 -1
  165. package/examples/extensions/agents-md-v1.yml +1 -1
  166. package/examples/extensions/drupal-v1.yml +1 -1
  167. package/examples/extensions/encryption-multi-provider.yaml +4 -4
  168. package/examples/extensions/kagent-v1.yml +1 -1
  169. package/examples/extensions/knowledge-sources.yaml +1 -1
  170. package/examples/extensions/mcp-full-featured.yaml +1 -1
  171. package/examples/getting-started/01-minimal-agent.ossa.yaml +1 -1
  172. package/examples/getting-started/02-agent-with-tools.ossa.yaml +1 -1
  173. package/examples/getting-started/03-agent-with-safety.ossa.yaml +1 -1
  174. package/examples/getting-started/04-agent-with-messaging.ossa.yaml +1 -1
  175. package/examples/getting-started/05-workflow-composition.ossa.yaml +1 -1
  176. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  177. package/examples/gitlab-agents/daily-code-scan/.gitlab-ci.yml +2 -2
  178. package/examples/gitlab-agents/duo-comment-responder/.gitlab-ci.yml +2 -2
  179. package/examples/gitlab-agents/mr-reviewer/.gitlab-ci.yml +2 -2
  180. package/examples/gitlab-agents/pipeline-auto-fix/.gitlab-ci.yml +2 -2
  181. package/examples/gitlab-agents/pre-commit-quality-check/.gitlab-ci.yml +2 -2
  182. package/examples/gitlab-agents/pre-push-validation/.gitlab-ci.yml +2 -2
  183. package/examples/hierarchical-agent.ossa.yaml +1 -1
  184. package/examples/infrastructure/token-rotation/manifest.ossa.yaml +1 -1
  185. package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +1 -1
  186. package/examples/kagent/compliance-validator.ossa.yaml +1 -1
  187. package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
  188. package/examples/kagent/documentation-agent.ossa.yaml +1 -1
  189. package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -1
  190. package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
  191. package/examples/kagent/security-scanner.ossa.yaml +1 -1
  192. package/examples/knowledge-graph/drupal-agent-with-kg.ossa.yaml +1 -1
  193. package/examples/mcp/browser-puppeteer.ossa.yaml +1 -1
  194. package/examples/mcp/database-mcp.ossa.yaml +1 -1
  195. package/examples/mcp/filesystem-mcp.ossa.yaml +1 -1
  196. package/examples/messaging/dependency-healer.ossa.yaml +1 -1
  197. package/examples/messaging/incident-responder.ossa.yaml +1 -1
  198. package/examples/messaging/routing-rules.ossa.yaml +1 -1
  199. package/examples/messaging/security-scanner.ossa.yaml +1 -1
  200. package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
  201. package/examples/migrations/langchain/01-python-react-agent-after.ossa.yaml +1 -1
  202. package/examples/migrations/langchain/02-typescript-conversational-after.ossa.yaml +1 -1
  203. package/examples/migrations/langchain/03-sequential-chain-after.ossa.yaml +1 -1
  204. package/examples/migrations/langchain/04-config-based-after.ossa.yaml +1 -1
  205. package/examples/migrations/swarm-to-ossa/after-handoffs.ossa.yaml +6 -6
  206. package/examples/migrations/swarm-to-ossa/after-triage-agent.ossa.yaml +3 -3
  207. package/examples/mr-reviewer-with-governance.ossa.yaml +1 -1
  208. package/examples/multi-agent/conditional-router.ossa.yaml +1 -1
  209. package/examples/multi-agent/parallel-execution.ossa.yaml +1 -1
  210. package/examples/multi-agent/sequential-pipeline.ossa.yaml +1 -1
  211. package/examples/multi-agent-research-workflow.ossa.yaml +1 -1
  212. package/examples/multi-platform/single-manifest/agent.ossa.yaml +1 -1
  213. package/examples/observability/activity-stream-full.yaml +1 -1
  214. package/examples/openai/basic-agent.ossa.yaml +1 -1
  215. package/examples/ossa-templates/01-code-assistant.ossa.yaml +1 -1
  216. package/examples/ossa-templates/02-security-scanner.ossa.yaml +1 -1
  217. package/examples/ossa-templates/03-ci-pipeline.ossa.yaml +1 -1
  218. package/examples/ossa-templates/04-code-reviewer.ossa.yaml +1 -1
  219. package/examples/ossa-templates/05-doc-generator.ossa.yaml +1 -1
  220. package/examples/ossa-templates/06-compliance-validator.ossa.yaml +1 -1
  221. package/examples/ossa-templates/07-workflow-orchestrator.ossa.yaml +1 -1
  222. package/examples/ossa-templates/08-content-writer.ossa.yaml +1 -1
  223. package/examples/ossa-templates/09-test-generator.ossa.yaml +1 -1
  224. package/examples/ossa-templates/10-data-transformer.ossa.yaml +1 -1
  225. package/examples/ossa-templates/11-react-performance-expert.ossa.yaml +1 -1
  226. package/examples/ossa-templates/12-typescript-type-safety-expert.ossa.yaml +1 -1
  227. package/examples/ossa-templates/13-accessibility-champion.ossa.yaml +1 -1
  228. package/examples/ossa-templates/14-security-hardening-agent.ossa.yaml +1 -1
  229. package/examples/pipeline-agent.ossa.yaml +1 -1
  230. package/examples/production/document-analyzer-openai.yml +1 -1
  231. package/examples/production-ready/01-customer-support-bot/agent.ossa.yaml +1 -1
  232. package/examples/production-ready/02-code-review-agent/agent.ossa.yaml +1 -1
  233. package/examples/production-ready/03-data-analysis-agent/agent.ossa.yaml +1 -1
  234. package/examples/production-ready/04-content-moderator/agent.ossa.yaml +1 -1
  235. package/examples/production-ready/05-sales-assistant/agent.ossa.yaml +1 -1
  236. package/examples/production-ready/06-devops-agent/agent.ossa.yaml +1 -1
  237. package/examples/production-ready/07-research-assistant/agent.ossa.yaml +1 -1
  238. package/examples/production-ready/08-email-triage-agent/agent.ossa.yaml +1 -1
  239. package/examples/production-ready/09-security-scanner/agent.ossa.yaml +1 -1
  240. package/examples/production-ready/10-meeting-assistant/agent.ossa.yaml +1 -1
  241. package/examples/quickstart/support-agent.ossa.yaml +1 -1
  242. package/examples/real-world/gitlab-cicd-optimizer.ossa.yaml +1 -1
  243. package/examples/real-world/rag-documentation-assistant.ossa.yaml +1 -1
  244. package/examples/registry/agents/code-reviewer/agent.yaml +1 -1
  245. package/examples/registry/agents/security-scanner/agent.yaml +1 -1
  246. package/examples/runtime-adapters/bedrock-claude-example.ossa.yaml +1 -1
  247. package/examples/schema/reusable-components.yaml +1 -1
  248. package/examples/showcase/ci-pipeline.ossa.yaml +1 -1
  249. package/examples/showcase/code-assistant.ossa.yaml +1 -1
  250. package/examples/showcase/code-reviewer.ossa.yaml +1 -1
  251. package/examples/showcase/compliance-checker.ossa.yaml +1 -1
  252. package/examples/showcase/compliance-validator.ossa.yaml +1 -1
  253. package/examples/showcase/content-writer.ossa.yaml +1 -1
  254. package/examples/showcase/customer-support.ossa.yaml +1 -1
  255. package/examples/showcase/data-processing-pipeline.ossa.yaml +1 -1
  256. package/examples/showcase/data-transformer.ossa.yaml +1 -1
  257. package/examples/showcase/doc-generator.ossa.yaml +1 -1
  258. package/examples/showcase/full-power-agent.ossa.yaml +1 -1
  259. package/examples/showcase/security-scanner-enhanced.ossa.yaml +1 -1
  260. package/examples/showcase/security-scanner.ossa.yaml +1 -1
  261. package/examples/showcase/team-leader.ossa.yaml +1 -1
  262. package/examples/showcase/test-generator.ossa.yaml +1 -1
  263. package/examples/showcase/workflow-orchestrator.ossa.yaml +1 -1
  264. package/examples/skills-example.ossa.yaml +1 -1
  265. package/examples/swarm-agent.ossa.yaml +1 -1
  266. package/examples/tasks/batch-email-sender.yaml +1 -1
  267. package/examples/tasks/data-transform.yaml +1 -1
  268. package/examples/tasks/publish-content.yaml +1 -1
  269. package/examples/team-agent.ossa.yaml +1 -1
  270. package/examples/templates/ossa-compliance.yaml +1 -1
  271. package/examples/unified/security-scanner.ossa.yaml +1 -1
  272. package/examples/workflows/batch-email-campaign.yaml +1 -1
  273. package/examples/workflows/content-review-publish.yaml +1 -1
  274. package/examples/workflows/simple-etl.yaml +1 -1
  275. package/package.json +6 -7
  276. package/spec/reference/reference-agents/compliance-auditor/manifest.ossa.yaml +1 -1
  277. package/spec/reference/reference-agents/doc-agent/manifest.ossa.yaml +1 -1
  278. package/spec/reference/reference-agents/mr-reviewer/manifest.ossa.yaml +1 -1
  279. package/spec/reference/reference-agents/ossa-validator-v0.3/manifest.ossa.yaml +1 -1
  280. package/spec/reference/reference-agents/pipeline-fixer/manifest.ossa.yaml +1 -1
  281. package/spec/reference/reference-agents/release-orchestrator/manifest.ossa.yaml +1 -1
  282. package/spec/v0.4/agent-card.schema.json +1 -1
  283. package/spec/v0.4/agent.schema.json +84 -15
  284. package/spec/v0.4/extensions/a2a/a2a.schema.json +1 -1
  285. package/spec/v0.4/extensions/ag2/ag2.schema.json +1 -1
  286. package/spec/v0.4/extensions/crewai/crewai.schema.json +1 -1
  287. package/spec/v0.4/extensions/kagent/kagent.schema.json +1 -1
  288. package/spec/v0.4/extensions/langchain/langchain.schema.json +1 -1
  289. package/spec/v0.4/extensions/langgraph/langgraph.schema.json +1 -1
  290. package/spec/v0.4/extensions/mcp/mcp.schema.json +1 -1
  291. package/templates/agent-types/claude-agent.ossa.yaml +1 -1
  292. package/templates/agent-types/kagent.ossa.yaml +1 -1
  293. package/templates/agent-types/langchain-agent.ossa.yaml +1 -1
  294. package/templates/agent-types/openapi-agent.ossa.yaml +1 -1
  295. package/templates/agent-types/swarm-agents.ossa.yaml +1 -1
  296. package/templates/ci-cd/gitlab-ci.deploy.yml +2 -2
  297. package/templates/validators/capability-compatibility.ossa.yaml +1 -1
  298. package/templates/validators/coordination-consistency.ossa.yaml +1 -1
  299. package/templates/validators/pattern-requirements.ossa.yaml +1 -1
  300. 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