@bluefly/openstandardagents 0.2.5-RC → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/.devfile.yaml +1 -1
  2. package/.env.example +1 -1
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +63 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.yml +40 -0
  5. package/.github/workflows/dependabot-comment.yml +34 -0
  6. package/.github/workflows/pr-comment.yml +33 -0
  7. package/.husky/pre-commit +5 -0
  8. package/.kiro/config.json +21 -0
  9. package/.kiro/settings/mcp.json +61 -0
  10. package/.kiro/specs/scripts-migration-api-first/design.md +883 -0
  11. package/.kiro/specs/scripts-migration-api-first/requirements.md +165 -0
  12. package/.kiro/specs/scripts-migration-api-first/tasks.md +539 -0
  13. package/.kiro/specs/{website-design-audit → website-brand-identity}/design.md +381 -0
  14. package/.kiro/specs/{website-design-audit → website-brand-identity}/requirements.md +88 -0
  15. package/.kiro/specs/website-brand-identity/tasks.md +981 -0
  16. package/.version.json +2 -2
  17. package/.wiki-config.json +24 -0
  18. package/CHANGELOG.md +34 -18
  19. package/CODEOWNERS +75 -0
  20. package/CONTRIBUTING.md +1 -1
  21. package/README.md +176 -239
  22. package/bin/ossa-dev +42 -0
  23. package/bin/ossa-export +32 -0
  24. package/bin/ossa-generate +60 -0
  25. package/bin/ossa-health +40 -0
  26. package/bin/ossa-init +26 -0
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/repositories/schema.repository.d.ts +6 -1
  32. package/dist/repositories/schema.repository.d.ts.map +1 -1
  33. package/dist/repositories/schema.repository.js +63 -36
  34. package/dist/repositories/schema.repository.js.map +1 -1
  35. package/dist/services/github-sync/github-client.d.ts +14 -0
  36. package/dist/services/github-sync/github-client.d.ts.map +1 -0
  37. package/dist/services/github-sync/github-client.js +41 -0
  38. package/dist/services/github-sync/github-client.js.map +1 -0
  39. package/dist/services/github-sync/gitlab-client.d.ts +17 -0
  40. package/dist/services/github-sync/gitlab-client.d.ts.map +1 -0
  41. package/dist/services/github-sync/gitlab-client.js +42 -0
  42. package/dist/services/github-sync/gitlab-client.js.map +1 -0
  43. package/dist/services/github-sync/schemas.d.ts +46 -0
  44. package/dist/services/github-sync/schemas.d.ts.map +1 -0
  45. package/dist/services/github-sync/schemas.js +36 -0
  46. package/dist/services/github-sync/schemas.js.map +1 -0
  47. package/dist/services/github-sync/sync.service.d.ts +27 -0
  48. package/dist/services/github-sync/sync.service.d.ts.map +1 -0
  49. package/dist/services/github-sync/sync.service.js +99 -0
  50. package/dist/services/github-sync/sync.service.js.map +1 -0
  51. package/dist/services/migration.service.d.ts +4 -3
  52. package/dist/services/migration.service.d.ts.map +1 -1
  53. package/dist/services/migration.service.js +11 -10
  54. package/dist/services/migration.service.js.map +1 -1
  55. package/dist/services/release-automation/release.service.js +1 -1
  56. package/dist/services/release-automation/release.service.js.map +1 -1
  57. package/dist/services/release-automation/schemas/release.schema.js +1 -1
  58. package/dist/services/runtime/claude/capability-mapper.d.ts +84 -0
  59. package/dist/services/runtime/claude/capability-mapper.d.ts.map +1 -0
  60. package/dist/services/runtime/claude/capability-mapper.js +245 -0
  61. package/dist/services/runtime/claude/capability-mapper.js.map +1 -0
  62. package/dist/services/runtime/claude/claude-adapter.d.ts +80 -0
  63. package/dist/services/runtime/claude/claude-adapter.d.ts.map +1 -0
  64. package/dist/services/runtime/claude/claude-adapter.js +287 -0
  65. package/dist/services/runtime/claude/claude-adapter.js.map +1 -0
  66. package/dist/services/runtime/claude/manifest-parser.d.ts +77 -0
  67. package/dist/services/runtime/claude/manifest-parser.d.ts.map +1 -0
  68. package/dist/services/runtime/claude/manifest-parser.js +169 -0
  69. package/dist/services/runtime/claude/manifest-parser.js.map +1 -0
  70. package/dist/services/runtime/claude/types.d.ts +115 -0
  71. package/dist/services/runtime/claude/types.d.ts.map +1 -0
  72. package/dist/services/runtime/claude/types.js +6 -0
  73. package/dist/services/runtime/claude/types.js.map +1 -0
  74. package/dist/services/validation.service.d.ts.map +1 -1
  75. package/dist/services/validation.service.js +12 -1
  76. package/dist/services/validation.service.js.map +1 -1
  77. package/dist/spec/v0.2.4/ossa-0.2.4.schema.json +85 -208
  78. package/dist/spec/v0.2.6/CHANGELOG.md +401 -0
  79. package/dist/spec/v0.2.6/README.md +72 -0
  80. package/dist/spec/v0.2.6/migrations/v0.2.3-to-v0.2.4.md +599 -0
  81. package/dist/spec/v0.2.6/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  82. package/dist/spec/{v0.2.4/ossa-0.2.4-dev.schema.json → v0.2.6/ossa-0.2.6.schema.json} +128 -38
  83. package/dist/spec/v0.2.6/ossa-0.2.6.yaml +581 -0
  84. package/dist/spec/v0.2.6-dev/CHANGELOG.md +164 -0
  85. package/dist/spec/v0.2.6-dev/README.md +75 -0
  86. package/dist/spec/v0.2.6-dev/migrations/v0.2.2-to-v0.2.3.md +343 -0
  87. package/dist/spec/v0.2.6-dev/migrations/v0.2.3-to-v0.2.4.md +599 -0
  88. package/dist/spec/v0.2.6-dev/ossa-0.2.5.yaml +581 -0
  89. package/dist/spec/v0.2.6-dev/ossa-0.2.6-dev.yaml +448 -0
  90. package/dist/spec/v0.2.7/core/agentgraph.md +324 -0
  91. package/dist/spec/v0.2.7/resources/agentgraph.yaml +135 -0
  92. package/dist/spec/v0.2.8/CHANGELOG.md +401 -0
  93. package/dist/spec/v0.2.8/README.md +72 -0
  94. package/dist/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
  95. package/dist/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  96. package/dist/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
  97. package/dist/spec/v0.2.8/ossa-0.2.8.schema.json +3153 -0
  98. package/dist/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
  99. package/dist/types/index.d.ts +3 -2
  100. package/dist/types/index.d.ts.map +1 -1
  101. package/dist/utils/index.d.ts +6 -0
  102. package/dist/utils/index.d.ts.map +1 -0
  103. package/dist/utils/index.js +6 -0
  104. package/dist/utils/index.js.map +1 -0
  105. package/dist/utils/version.d.ts +68 -0
  106. package/dist/utils/version.d.ts.map +1 -0
  107. package/dist/utils/version.js +156 -0
  108. package/dist/utils/version.js.map +1 -0
  109. package/docs/brand-guide/01-brand-overview.md +37 -0
  110. package/docs/brand-guide/02-logo-usage.md +43 -0
  111. package/docs/brand-guide/03-color-palette.md +70 -0
  112. package/docs/brand-guide/04-typography.md +82 -0
  113. package/docs/brand-guide/05-voice-and-tone.md +108 -0
  114. package/docs/brand-guide/06-visual-elements.md +137 -0
  115. package/docs/brand-guide/07-application-examples.md +153 -0
  116. package/docs/brand-guide/OssaLogo/OssA_Logo.svg +21 -0
  117. package/docs/brand-guide/OssaLogo/brand.af +0 -0
  118. package/docs/brand-guide/README.md +107 -0
  119. package/docs/comparison.md +315 -0
  120. package/docs/operations/automation-roadmap.md +245 -0
  121. package/docs/operations/github-sync-strategy.md +357 -0
  122. package/eslint-report.json +1 -0
  123. package/examples/adk-integration/code-review-workflow.yml +1 -1
  124. package/examples/adk-integration/customer-support.yml +1 -1
  125. package/examples/adk-integration/data-pipeline.yml +1 -1
  126. package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
  127. package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
  128. package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
  129. package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
  130. package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
  131. package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
  132. package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
  133. package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
  134. package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
  135. package/examples/anthropic/claude-assistant.ossa.json +5 -4
  136. package/examples/autogen/multi-agent.ossa.json +6 -4
  137. package/examples/claude-code/code-reviewer.ossa.yaml +78 -0
  138. package/examples/claude-code/ossa-validator.ossa.yaml +80 -0
  139. package/examples/common_npm/agent-router.ossa.yaml +1 -0
  140. package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +1 -1
  141. package/examples/crewai/research-team.ossa.json +14 -5
  142. package/examples/cursor/code-review-agent.ossa.json +21 -6
  143. package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -0
  144. package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +1 -1
  145. package/examples/extensions/drupal-v1.yml +1 -1
  146. package/examples/extensions/kagent-v1.yml +1 -1
  147. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  148. package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +4 -4
  149. package/examples/kagent/compliance-validator.ossa.yaml +1 -1
  150. package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
  151. package/examples/kagent/documentation-agent.ossa.yaml +1 -1
  152. package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -0
  153. package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +1 -1
  154. package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
  155. package/examples/kagent/security-scanner.ossa.yaml +1 -1
  156. package/examples/langchain/chain-agent.ossa.json +21 -5
  157. package/examples/langflow/workflow-agent.ossa.json +2 -3
  158. package/examples/langgraph/state-machine-agent.ossa.json +2 -3
  159. package/examples/llamaindex/rag-agent.ossa.json +2 -3
  160. package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
  161. package/examples/multi-agent/README.md +74 -0
  162. package/examples/multi-agent/conditional-router.ossa.yaml +42 -0
  163. package/examples/multi-agent/parallel-execution.ossa.yaml +54 -0
  164. package/examples/multi-agent/sequential-pipeline.ossa.yaml +45 -0
  165. package/examples/openai/basic-agent.ossa.yaml +1 -1
  166. package/examples/openai/multi-tool-agent.ossa.json +33 -10
  167. package/examples/openai/swarm-agent.ossa.json +18 -5
  168. package/examples/production/document-analyzer-openai.yml +1 -1
  169. package/examples/quickstart/support-agent.ossa.yaml +1 -1
  170. package/examples/spec-examples/audit-agent.yml +1 -1
  171. package/examples/spec-examples/chat-agent.yml +1 -1
  172. package/examples/spec-examples/compliance-agent.yml +1 -1
  173. package/examples/spec-examples/monitoring-agent.yml +1 -1
  174. package/examples/spec-examples/workflow-agent.yml +1 -1
  175. package/examples/templates/ossa-compliance.yaml +1 -1
  176. package/examples/vercel/edge-agent.ossa.json +5 -4
  177. package/gl-code-quality-report.json +62 -0
  178. package/llms-ctx-full.txt +39 -0
  179. package/llms-ctx.txt +39 -0
  180. package/llms.txt +47 -0
  181. package/openapi/github-sync.yaml +115 -0
  182. package/package.json +26 -4
  183. package/scripts/README.md +103 -0
  184. package/scripts/auto-rebase-mrs.ts +106 -0
  185. package/scripts/batch-dependabot.sh +57 -0
  186. package/scripts/configure-gitlab-branch-protection.ts +95 -0
  187. package/scripts/create-issue-helper.ts +238 -0
  188. package/scripts/create-milestone-issue.ts +73 -0
  189. package/scripts/eslint-to-codequality.cjs +34 -0
  190. package/scripts/fix-schema-formats.js +82 -0
  191. package/scripts/generate-agents-catalog.ts +77 -0
  192. package/scripts/generate-api-docs.ts +218 -0
  193. package/scripts/generate-cli-docs.ts +410 -0
  194. package/scripts/generate-config-docs.ts +109 -0
  195. package/scripts/generate-errors-docs.ts +76 -0
  196. package/scripts/generate-examples-docs.ts +99 -0
  197. package/scripts/generate-llms-ctx.sh +17 -0
  198. package/scripts/generate-schema-docs.ts +317 -0
  199. package/scripts/generate-types-docs.ts +48 -0
  200. package/scripts/lowercase-docs.ts +43 -0
  201. package/scripts/manage-milestone-mrs.ts +279 -0
  202. package/scripts/rebase-all-mrs.sh +75 -0
  203. package/scripts/sync-github-pr.sh +48 -0
  204. package/scripts/sync-version.js +32 -0
  205. package/scripts/sync-wiki.sh +50 -0
  206. package/scripts/validate-all.js +127 -0
  207. package/scripts/validate-schema.ts +2 -1
  208. package/spec/v0.2.4/ossa-0.2.4.schema.json +85 -208
  209. package/spec/v0.2.6/CHANGELOG.md +401 -0
  210. package/spec/v0.2.6/README.md +72 -0
  211. package/spec/v0.2.6/migrations/v0.2.3-to-v0.2.4.md +599 -0
  212. package/spec/v0.2.6/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  213. package/spec/{v0.2.4/ossa-0.2.4-dev.schema.json → v0.2.6/ossa-0.2.6.schema.json} +128 -38
  214. package/spec/v0.2.6/ossa-0.2.6.yaml +581 -0
  215. package/spec/v0.2.6-dev/CHANGELOG.md +164 -0
  216. package/spec/v0.2.6-dev/README.md +75 -0
  217. package/spec/v0.2.6-dev/migrations/v0.2.2-to-v0.2.3.md +343 -0
  218. package/spec/v0.2.6-dev/migrations/v0.2.3-to-v0.2.4.md +599 -0
  219. package/spec/v0.2.6-dev/ossa-0.2.5.yaml +581 -0
  220. package/spec/v0.2.6-dev/ossa-0.2.6-dev.yaml +448 -0
  221. package/spec/v0.2.7/core/agentgraph.md +324 -0
  222. package/spec/v0.2.7/resources/agentgraph.yaml +135 -0
  223. package/spec/v0.2.8/CHANGELOG.md +401 -0
  224. package/spec/v0.2.8/README.md +72 -0
  225. package/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
  226. package/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  227. package/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
  228. package/spec/v0.2.8/ossa-0.2.8.schema.json +3153 -0
  229. package/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
  230. package/test-results/junit.xml +299 -0
  231. package/.kiro/specs/agent-buildkit-templates/design.md +0 -495
  232. package/.kiro/specs/agent-buildkit-templates/requirements.md +0 -165
  233. package/.kiro/specs/kiro-ide-supercharger/README.md +0 -202
  234. package/.kiro/specs/kiro-ide-supercharger/design.md +0 -1005
  235. package/.kiro/specs/kiro-ide-supercharger/requirements.md +0 -141
  236. package/.kiro/specs/kiro-ide-supercharger/tasks.md +0 -507
  237. package/bin/validate-ossa-0.2.5-RC.ts +0 -244
  238. package/docs/issue-19-completion-summary.md +0 -648
  239. package/docs/issue-19-validation.md +0 -351
  240. package/scripts/lib/exec.ts +0 -37
  241. package/scripts/lib/file-ops.ts +0 -58
  242. package/scripts/lib/version.ts +0 -83
  243. package/website/.lighthouserc.ts +0 -24
  244. package/website/.prettierrc +0 -10
  245. package/website/Dockerfile +0 -30
  246. package/website/app/about/page.tsx +0 -295
  247. package/website/app/blog/[slug]/page.tsx +0 -208
  248. package/website/app/blog/page.tsx +0 -249
  249. package/website/app/design-guide/page.tsx +0 -511
  250. package/website/app/docs/[[...slug]]/page.tsx +0 -847
  251. package/website/app/docs/core-concepts/project-structure/page.tsx +0 -349
  252. package/website/app/ecosystem/page.tsx +0 -375
  253. package/website/app/examples/page.tsx +0 -133
  254. package/website/app/globals.scss +0 -135
  255. package/website/app/layout.tsx +0 -106
  256. package/website/app/license/page.tsx +0 -183
  257. package/website/app/not-found.tsx +0 -18
  258. package/website/app/page.tsx +0 -474
  259. package/website/app/playground/page.tsx +0 -487
  260. package/website/app/robots.ts +0 -19
  261. package/website/app/rss.xml/route.ts +0 -74
  262. package/website/app/schema/page.tsx +0 -1001
  263. package/website/app/sitemap.ts +0 -56
  264. package/website/app/specification/page.tsx +0 -287
  265. package/website/components/InstallCommand.tsx +0 -96
  266. package/website/components/Logo.tsx +0 -97
  267. package/website/components/StructuredData.tsx +0 -65
  268. package/website/components/docs/DocsSearch.tsx +0 -104
  269. package/website/components/docs/DocsSidebar.tsx +0 -155
  270. package/website/components/docs/MarkdownContent.tsx +0 -401
  271. package/website/components/docs/VersionSelector.tsx +0 -105
  272. package/website/components/examples/ExamplesViewer.tsx +0 -293
  273. package/website/components/layout/Footer.tsx +0 -116
  274. package/website/components/layout/Header.tsx +0 -168
  275. package/website/components/schema/SchemaComponentsAccordion.tsx +0 -84
  276. package/website/components/schema/SchemaExplorer.tsx +0 -213
  277. package/website/content/blog/OpenAPI-AI-Agents-Standard.md +0 -285
  278. package/website/content/blog/Why-Formal-Standards-Matter-Now.md +0 -198
  279. package/website/content/blog/gitlab-kubernetes-agent-ecosystem.md +0 -286
  280. package/website/content/blog/introducing-ossa-framework.md +0 -328
  281. package/website/content/blog/ossa-production-results.md +0 -279
  282. package/website/content/blog/welcome-to-ossa.md +0 -43
  283. package/website/content/blog/why-ai-agents-need-open-standard.md +0 -98
  284. package/website/content/docs/00-HOME.md +0 -153
  285. package/website/content/docs/AIFlow-Framework-Integration-with-OSSA.md +0 -107
  286. package/website/content/docs/Examples.md +0 -71
  287. package/website/content/docs/OpenAPI-Extensions.md +0 -934
  288. package/website/content/docs/adapters/openai-adapter.md +0 -693
  289. package/website/content/docs/architecture/execution-flow.md +0 -335
  290. package/website/content/docs/architecture/multi-agent-systems.md +0 -737
  291. package/website/content/docs/architecture/overview.md +0 -121
  292. package/website/content/docs/architecture/stack-integration.md +0 -461
  293. package/website/content/docs/changelog.md +0 -246
  294. package/website/content/docs/contributing.md +0 -599
  295. package/website/content/docs/core-concepts/Project-Structure.md +0 -348
  296. package/website/content/docs/ecosystem/framework-support.md +0 -819
  297. package/website/content/docs/ecosystem/overview.md +0 -366
  298. package/website/content/docs/examples/AIFlow-Framework-Integration-with-OSSA.md +0 -107
  299. package/website/content/docs/examples/Migration-Guides.md +0 -214
  300. package/website/content/docs/for-audiences/Architects.md +0 -224
  301. package/website/content/docs/for-audiences/Developers.md +0 -220
  302. package/website/content/docs/for-audiences/Enterprises.md +0 -256
  303. package/website/content/docs/for-audiences/Students-Researchers.md +0 -122
  304. package/website/content/docs/getting-started/5-Minute-Overview.md +0 -85
  305. package/website/content/docs/getting-started/First-Agent.md +0 -196
  306. package/website/content/docs/getting-started/Hello-World.md +0 -184
  307. package/website/content/docs/getting-started/Installation.md +0 -155
  308. package/website/content/docs/getting-started/index.md +0 -92
  309. package/website/content/docs/getting-started/running-agents.md +0 -309
  310. package/website/content/docs/getting-started.md +0 -91
  311. package/website/content/docs/integrations/aiflow.md +0 -104
  312. package/website/content/docs/integrations/drupal.md +0 -105
  313. package/website/content/docs/migration-guides/00-INDEX.md +0 -76
  314. package/website/content/docs/migration-guides/README.md +0 -133
  315. package/website/content/docs/migration-guides/agent-schema-comparison.md +0 -232
  316. package/website/content/docs/migration-guides/anthropic-mcp-to-ossa.md +0 -1750
  317. package/website/content/docs/migration-guides/crewai-to-ossa.md +0 -274
  318. package/website/content/docs/migration-guides/drupal-eca-to-ossa.md +0 -2017
  319. package/website/content/docs/migration-guides/general-agent-schema.yml +0 -247
  320. package/website/content/docs/migration-guides/index.md +0 -133
  321. package/website/content/docs/migration-guides/langchain-to-ossa.md +0 -1714
  322. package/website/content/docs/migration-guides/langflow-to-ossa.md +0 -2075
  323. package/website/content/docs/migration-guides/migration-manifest.json +0 -64
  324. package/website/content/docs/migration-guides/openai-to-ossa.md +0 -1202
  325. package/website/content/docs/openapi-extensions/examples.md +0 -550
  326. package/website/content/docs/openapi-extensions/index.md +0 -551
  327. package/website/content/docs/openapi-extensions/operation-extensions.md +0 -457
  328. package/website/content/docs/openapi-extensions/root-extensions.md +0 -410
  329. package/website/content/docs/ossa-compliant-badge.md +0 -251
  330. package/website/content/docs/pre-release/index.md +0 -175
  331. package/website/content/docs/quick-reference.md +0 -17
  332. package/website/content/docs/readme.md +0 -35
  333. package/website/content/docs/schema-reference/agent-spec.md +0 -406
  334. package/website/content/docs/schema-reference/autonomy.md +0 -568
  335. package/website/content/docs/schema-reference/constraints.md +0 -543
  336. package/website/content/docs/schema-reference/index.md +0 -176
  337. package/website/content/docs/schema-reference/llm-config.md +0 -445
  338. package/website/content/docs/schema-reference/observability.md +0 -654
  339. package/website/content/docs/schema-reference/ossa-manifest.md +0 -309
  340. package/website/content/docs/schema-reference/taxonomy.md +0 -509
  341. package/website/content/docs/schema-reference/tools.md +0 -628
  342. package/website/content/docs/templates/blog-post.md +0 -43
  343. package/website/content/docs/use-cases/00-index.md +0 -395
  344. package/website/content/docs/use-cases/cicd-code-review.md +0 -1236
  345. package/website/content/docs/use-cases/customer-support.md +0 -1234
  346. package/website/content/docs/use-cases/enterprise-compliance.md +0 -1208
  347. package/website/content/docs/use-cases/research-multi-agent.md +0 -1161
  348. package/website/content/docs/versioning.md +0 -288
  349. package/website/lib/version.ts +0 -35
  350. package/website/lib/versions.json +0 -78
  351. package/website/next.config.ts +0 -18
  352. package/website/nginx.conf +0 -32
  353. package/website/package-lock.json +0 -9679
  354. package/website/package.json +0 -59
  355. package/website/postcss.config.mjs +0 -9
  356. package/website/scripts/fetch-versions.js +0 -166
  357. package/website/scripts/generate-examples-index.js +0 -163
  358. package/website/scripts/merge-docs-to-wiki.ts +0 -207
  359. package/website/scripts/sync-version.js +0 -72
  360. package/website/scripts/sync-wiki.ts +0 -322
  361. package/website/scripts/upload-wiki.ts +0 -199
  362. package/website/styles/_variables.scss +0 -36
  363. package/website/tailwind.config.ts +0 -136
  364. /package/dist/spec/v0.2.4/{ossa-0.2.4-dev.yaml → ossa-0.2.4.yaml} +0 -0
  365. /package/spec/v0.2.4/{ossa-0.2.4-dev.yaml → ossa-0.2.4.yaml} +0 -0
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+ # Generate llms-ctx.txt files from llms.txt
3
+
4
+ set -e
5
+
6
+ echo "Installing llms-txt..."
7
+ pip install llms-txt --quiet
8
+
9
+ echo "Generating llms-ctx.txt (without Optional)..."
10
+ llms_txt2ctx llms.txt -o llms-ctx.txt
11
+
12
+ echo "Generating llms-ctx-full.txt (with Optional)..."
13
+ llms_txt2ctx llms.txt -o llms-ctx-full.txt --include-optional
14
+
15
+ echo "✅ Generated:"
16
+ echo " - llms-ctx.txt ($(wc -l < llms-ctx.txt) lines)"
17
+ echo " - llms-ctx-full.txt ($(wc -l < llms-ctx-full.txt) lines)"
@@ -0,0 +1,317 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Generate schema documentation from JSON Schema
4
+ *
5
+ * Usage: npm run docs:schema:generate
6
+ */
7
+
8
+ import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';
9
+ import { join, resolve } from 'path';
10
+
11
+ // Dynamic version detection - find latest spec directory
12
+ function getLatestSchemaVersion(): { dir: string; file: string } {
13
+ const specDir = join(process.cwd(), 'spec');
14
+ const dirs = readdirSync(specDir, { withFileTypes: true })
15
+ .filter(d => d.isDirectory() && d.name.startsWith('v'))
16
+ .map(d => d.name)
17
+ .sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
18
+
19
+ if (dirs.length === 0) {
20
+ throw new Error('No schema version directories found in spec/');
21
+ }
22
+
23
+ const latestDir = dirs[0];
24
+ const version = latestDir.slice(1); // Remove 'v' prefix
25
+ return {
26
+ dir: latestDir,
27
+ file: `ossa-${version}.schema.json`
28
+ };
29
+ }
30
+
31
+ interface SchemaProperty {
32
+ type: string | string[];
33
+ description?: string;
34
+ format?: string;
35
+ pattern?: string;
36
+ enum?: string[];
37
+ minimum?: number;
38
+ maximum?: number;
39
+ minLength?: number;
40
+ maxLength?: number;
41
+ required?: boolean;
42
+ default?: any;
43
+ examples?: any[];
44
+ properties?: Record<string, SchemaProperty>;
45
+ items?: SchemaProperty;
46
+ }
47
+
48
+ // Dynamic paths based on detected version
49
+ const schemaVersion = getLatestSchemaVersion();
50
+ const SPEC_DIR = join(process.cwd(), 'spec', schemaVersion.dir);
51
+ const OUTPUT_DIR = join(process.cwd(), 'docs/schema-reference');
52
+
53
+ // Field documentation metadata
54
+ const FIELD_DOCS: Record<string, {
55
+ why: string;
56
+ how: string;
57
+ where: string;
58
+ examples: string[];
59
+ relatedFields: string[];
60
+ relatedDocs: string[];
61
+ }> = {
62
+ 'agent.id': {
63
+ why: 'Unique identifier for agent registration, API routing, and inter-agent communication',
64
+ how: 'Use DNS-1123 subdomain format: lowercase alphanumeric with hyphens, max 63 chars',
65
+ where: 'Used in API endpoints (/agents/{id}), Kubernetes resources, and registry URLs',
66
+ examples: [
67
+ 'my-agent',
68
+ 'data-processor-v2',
69
+ 'compliance-checker-prod'
70
+ ],
71
+ relatedFields: ['agent.name', 'agent.version', 'agent.role'],
72
+ relatedDocs: ['../cli-reference/ossa-validate.md', '../api-reference/core-api.md']
73
+ },
74
+ 'agent.name': {
75
+ why: 'Human-readable name for display in UIs and documentation',
76
+ how: 'Use descriptive names that clearly indicate the agent\'s purpose',
77
+ where: 'Displayed in agent lists, dashboards, and documentation',
78
+ examples: [
79
+ 'Data Processing Agent',
80
+ 'Compliance Checker',
81
+ 'Customer Support Bot'
82
+ ],
83
+ relatedFields: ['agent.id', 'agent.description'],
84
+ relatedDocs: ['../guides/creating-agents.md']
85
+ },
86
+ 'agent.version': {
87
+ why: 'Track agent versions for compatibility, rollback, and change management',
88
+ how: 'Use semantic versioning (MAJOR.MINOR.PATCH)',
89
+ where: 'Used in registry, deployment manifests, and API responses',
90
+ examples: [
91
+ '1.0.0',
92
+ '2.1.3',
93
+ '0.1.0-beta'
94
+ ],
95
+ relatedFields: ['agent.id', 'ossaVersion'],
96
+ relatedDocs: ['../guides/versioning.md']
97
+ },
98
+ 'agent.role': {
99
+ why: 'Classify agents by their function in the system for routing and orchestration',
100
+ how: 'Choose from predefined roles or use custom roles',
101
+ where: 'Used for agent discovery, filtering, and orchestration patterns',
102
+ examples: [
103
+ 'worker',
104
+ 'orchestrator',
105
+ 'compliance',
106
+ 'monitor'
107
+ ],
108
+ relatedFields: ['agent.capabilities', 'agent.taxonomy'],
109
+ relatedDocs: ['../architecture/multi-agent-systems.md']
110
+ },
111
+ 'agent.capabilities': {
112
+ why: 'Define what the agent can do, enabling capability-based routing and discovery',
113
+ how: 'List all capabilities with input/output schemas and descriptions',
114
+ where: 'Used by orchestrators to route tasks and by registry for discovery',
115
+ examples: [
116
+ 'process_data',
117
+ 'validate_compliance',
118
+ 'generate_report'
119
+ ],
120
+ relatedFields: ['agent.tools', 'agent.role'],
121
+ relatedDocs: ['../guides/defining-capabilities.md']
122
+ }
123
+ };
124
+
125
+ function generateFieldDoc(fieldPath: string, property: SchemaProperty): string {
126
+ const metadata = FIELD_DOCS[fieldPath] || {
127
+ why: 'No documentation available',
128
+ how: 'No documentation available',
129
+ where: 'No documentation available',
130
+ examples: [],
131
+ relatedFields: [],
132
+ relatedDocs: []
133
+ };
134
+
135
+ let doc = `# ${fieldPath}\n\n`;
136
+
137
+ // Type and requirements
138
+ const typeStr = Array.isArray(property.type) ? property.type.join(' | ') : property.type;
139
+ doc += `**Type**: \`${typeStr}\`\n`;
140
+ doc += `**Required**: ${property.required ? 'Yes' : 'No'}\n`;
141
+ if (property.format) {
142
+ doc += `**Format**: ${property.format}\n`;
143
+ }
144
+ doc += '\n';
145
+
146
+ // Description
147
+ if (property.description) {
148
+ doc += `## Description\n\n${property.description}\n\n`;
149
+ }
150
+
151
+ // Why
152
+ doc += `## Why This Field Exists\n\n${metadata.why}\n\n`;
153
+
154
+ // How
155
+ doc += `## How to Use\n\n${metadata.how}\n\n`;
156
+
157
+ // Where
158
+ doc += `## Where It's Used\n\n${metadata.where}\n\n`;
159
+
160
+ // Format requirements
161
+ if (property.pattern) {
162
+ doc += `## Format Requirements\n\n`;
163
+ doc += `Must match pattern: \`${property.pattern}\`\n\n`;
164
+ }
165
+
166
+ if (property.enum) {
167
+ doc += `## Allowed Values\n\n`;
168
+ for (const value of property.enum) {
169
+ doc += `- \`${value}\`\n`;
170
+ }
171
+ doc += '\n';
172
+ }
173
+
174
+ if (property.minimum !== undefined || property.maximum !== undefined) {
175
+ doc += `## Constraints\n\n`;
176
+ if (property.minimum !== undefined) {
177
+ doc += `- Minimum: ${property.minimum}\n`;
178
+ }
179
+ if (property.maximum !== undefined) {
180
+ doc += `- Maximum: ${property.maximum}\n`;
181
+ }
182
+ doc += '\n';
183
+ }
184
+
185
+ if (property.minLength !== undefined || property.maxLength !== undefined) {
186
+ doc += `## Length Constraints\n\n`;
187
+ if (property.minLength !== undefined) {
188
+ doc += `- Minimum length: ${property.minLength}\n`;
189
+ }
190
+ if (property.maxLength !== undefined) {
191
+ doc += `- Maximum length: ${property.maxLength}\n`;
192
+ }
193
+ doc += '\n';
194
+ }
195
+
196
+ // Examples
197
+ if (metadata.examples.length > 0) {
198
+ doc += `## Examples\n\n`;
199
+ for (const example of metadata.examples) {
200
+ doc += `\`\`\`yaml\n${fieldPath}: ${example}\n\`\`\`\n\n`;
201
+ }
202
+ }
203
+
204
+ // Validation
205
+ doc += `## Validation\n\n`;
206
+ doc += `\`\`\`bash\nossa validate agent.ossa.yaml\n\`\`\`\n\n`;
207
+
208
+ // Related fields
209
+ if (metadata.relatedFields.length > 0) {
210
+ doc += `## Related Fields\n\n`;
211
+ for (const field of metadata.relatedFields) {
212
+ const filename = field.replace(/\./g, '-') + '.md';
213
+ doc += `- [${field}](./${filename})\n`;
214
+ }
215
+ doc += '\n';
216
+ }
217
+
218
+ // Related documentation
219
+ if (metadata.relatedDocs.length > 0) {
220
+ doc += `## Related Documentation\n\n`;
221
+ for (const docLink of metadata.relatedDocs) {
222
+ doc += `- [${docLink.split('/').pop()?.replace('.md', '')}](${docLink})\n`;
223
+ }
224
+ doc += '\n';
225
+ }
226
+
227
+ return doc;
228
+ }
229
+
230
+ function main() {
231
+ console.log('🚀 Generating schema documentation...\n');
232
+
233
+ // Create output directory
234
+ mkdirSync(OUTPUT_DIR, { recursive: true });
235
+
236
+ // Read schema dynamically
237
+ const schemaPath = join(SPEC_DIR, schemaVersion.file);
238
+ console.log(`📜 Using schema: ${schemaVersion.dir}/${schemaVersion.file}`);
239
+ const schemaContent = readFileSync(schemaPath, 'utf-8');
240
+ const schema = JSON.parse(schemaContent);
241
+
242
+ console.log(`📁 Processing schema fields...\n`);
243
+
244
+ // Generate documentation for documented fields
245
+ let count = 0;
246
+ for (const [fieldPath, metadata] of Object.entries(FIELD_DOCS)) {
247
+ // Create a mock property for now (in real implementation, extract from schema)
248
+ const property: SchemaProperty = {
249
+ type: 'string',
250
+ description: `The ${fieldPath} field`,
251
+ required: true
252
+ };
253
+
254
+ const docContent = generateFieldDoc(fieldPath, property);
255
+ const filename = fieldPath.replace(/\./g, '-') + '.md';
256
+ const outputFile = join(OUTPUT_DIR, filename);
257
+
258
+ writeFileSync(outputFile, docContent);
259
+ console.log(`✅ Generated: ${filename}`);
260
+ count++;
261
+ }
262
+
263
+ // Generate index
264
+ const indexContent = `# Schema Reference
265
+
266
+ Complete reference for the OSSA agent manifest schema.
267
+
268
+ ## Overview
269
+
270
+ The OSSA schema defines the structure of agent manifests. Every field serves a specific purpose in the agent lifecycle.
271
+
272
+ ## Core Fields
273
+
274
+ ### Agent Identification
275
+ - [agent.id](./agent-id.md) - Unique agent identifier
276
+ - [agent.name](./agent-name.md) - Human-readable name
277
+ - [agent.version](./agent-version.md) - Semantic version
278
+ - [agent.role](./agent-role.md) - Agent role classification
279
+
280
+ ### Agent Capabilities
281
+ - [agent.capabilities](./agent-capabilities.md) - What the agent can do
282
+
283
+ ## Schema Versions
284
+
285
+ - **Current**: ${schemaVersion.dir}
286
+
287
+ See [Versioning Guide](../guides/versioning.md) for migration information.
288
+
289
+ ## Validation
290
+
291
+ Validate your agent manifests:
292
+
293
+ \`\`\`bash
294
+ ossa validate agent.ossa.yaml
295
+ \`\`\`
296
+
297
+ ## Complete Schema
298
+
299
+ View the complete JSON Schema:
300
+ - [${schemaVersion.dir} Schema](https://github.com/blueflyio/openstandardagents/blob/main/spec/${schemaVersion.dir}/${schemaVersion.file})
301
+
302
+ ## Related Documentation
303
+
304
+ - [CLI Reference](../cli-reference/index.md)
305
+ - [API Reference](../api-reference/index.md)
306
+ - [Creating Agents Guide](../guides/creating-agents.md)
307
+ `;
308
+
309
+ writeFileSync(join(OUTPUT_DIR, 'index.md'), indexContent);
310
+ console.log(`✅ Generated: index.md`);
311
+
312
+ console.log(`\n✨ Schema documentation generated successfully!`);
313
+ console.log(`📂 Output: ${OUTPUT_DIR}`);
314
+ console.log(`📊 Fields documented: ${count}`);
315
+ }
316
+
317
+ main();
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env tsx
2
+ import { readFileSync, writeFileSync, mkdirSync } from 'fs';
3
+ import { join } from 'path';
4
+
5
+ const TYPES_FILE = join(process.cwd(), 'src/types/index.ts');
6
+ const OUTPUT_FILE = join(process.cwd(), 'website/content/docs/types-reference/index.md');
7
+
8
+ const content = readFileSync(TYPES_FILE, 'utf-8');
9
+
10
+ // Extract interfaces and types
11
+ const interfaces = content.match(/export interface \w+[^}]+}/gs) || [];
12
+ const types = content.match(/export type \w+ = [^;]+;/gs) || [];
13
+
14
+ let doc = `# TypeScript Types Reference
15
+
16
+ Auto-generated from \`src/types/index.ts\`
17
+
18
+ ## Interfaces
19
+
20
+ `;
21
+
22
+ for (const iface of interfaces) {
23
+ const name = iface.match(/interface (\w+)/)?.[1];
24
+ if (name) {
25
+ doc += `### ${name}\n\n\`\`\`typescript\n${iface}\n\`\`\`\n\n`;
26
+ }
27
+ }
28
+
29
+ doc += `## Type Aliases\n\n`;
30
+
31
+ for (const type of types) {
32
+ const name = type.match(/type (\w+)/)?.[1];
33
+ if (name) {
34
+ doc += `### ${name}\n\n\`\`\`typescript\n${type}\n\`\`\`\n\n`;
35
+ }
36
+ }
37
+
38
+ doc += `## Usage
39
+
40
+ \`\`\`typescript
41
+ import { OSSAManifest, AgentSpec } from '@bluefly/openstandardagents';
42
+ \`\`\`
43
+ `;
44
+
45
+ mkdirSync(join(process.cwd(), 'website/content/docs/types-reference'), { recursive: true });
46
+ writeFileSync(OUTPUT_FILE, doc);
47
+
48
+ console.log(`✅ Generated types reference: ${interfaces.length} interfaces, ${types.length} types`);
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Convert all documentation filenames to lowercase
4
+ */
5
+
6
+ import { readdirSync, renameSync, statSync } from 'fs';
7
+ import { join, basename, dirname } from 'path';
8
+
9
+ const DOCS_DIR = join(process.cwd(), 'website/content/docs');
10
+
11
+ function lowercaseFiles(dir: string) {
12
+ const entries = readdirSync(dir);
13
+
14
+ for (const entry of entries) {
15
+ const fullPath = join(dir, entry);
16
+ const stat = statSync(fullPath);
17
+
18
+ if (stat.isDirectory()) {
19
+ // Recursively process subdirectories
20
+ lowercaseFiles(fullPath);
21
+
22
+ // Rename directory if needed
23
+ const lowerEntry = entry.toLowerCase();
24
+ if (entry !== lowerEntry) {
25
+ const newPath = join(dirname(fullPath), lowerEntry);
26
+ console.log(`📁 Renaming: ${entry} → ${lowerEntry}`);
27
+ renameSync(fullPath, newPath);
28
+ }
29
+ } else if (entry.endsWith('.md')) {
30
+ // Rename file if needed
31
+ const lowerEntry = entry.toLowerCase();
32
+ if (entry !== lowerEntry) {
33
+ const newPath = join(dirname(fullPath), lowerEntry);
34
+ console.log(`📄 Renaming: ${entry} → ${lowerEntry}`);
35
+ renameSync(fullPath, newPath);
36
+ }
37
+ }
38
+ }
39
+ }
40
+
41
+ console.log('🔄 Converting documentation filenames to lowercase...\n');
42
+ lowercaseFiles(DOCS_DIR);
43
+ console.log('\n✅ Done!');
@@ -0,0 +1,279 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Manage Merge Requests for a specific milestone
4
+ * Helps clean up and organize MRs for controlled releases
5
+ */
6
+
7
+ import { Gitlab } from '@gitbeaker/node';
8
+ import { Command } from 'commander';
9
+
10
+ const gitlab = new Gitlab({
11
+ token: process.env.GITLAB_TOKEN || process.env.GITLAB_ACCESS_TOKEN,
12
+ host: 'https://gitlab.com',
13
+ });
14
+
15
+ const PROJECT_ID = '76265294'; // blueflyio/openstandardagents
16
+
17
+ interface MRInfo {
18
+ iid: number;
19
+ title: string;
20
+ state: string;
21
+ target_branch: string;
22
+ source_branch: string;
23
+ milestone?: { title: string };
24
+ has_conflicts: boolean;
25
+ merge_status: string;
26
+ web_url: string;
27
+ }
28
+
29
+ async function listMRsInMilestone(milestone: string) {
30
+ console.log(`\n📋 Listing MRs in milestone: ${milestone}\n`);
31
+
32
+ const mrs = await gitlab.MergeRequests.all({
33
+ projectId: PROJECT_ID,
34
+ state: 'opened',
35
+ milestone,
36
+ });
37
+
38
+ if (mrs.length === 0) {
39
+ console.log('No open MRs found in this milestone.');
40
+ return;
41
+ }
42
+
43
+ console.log(`Found ${mrs.length} open MRs:\n`);
44
+
45
+ for (const mr of mrs) {
46
+ const status = mr.has_conflicts ? '❌ CONFLICTS' : '✅ Clean';
47
+ const target = mr.target_branch === 'development' ? '✅ dev' : `⚠️ ${mr.target_branch}`;
48
+
49
+ console.log(`!${mr.iid}: ${mr.title}`);
50
+ console.log(` Target: ${target} | Status: ${status}`);
51
+ console.log(` ${mr.web_url}\n`);
52
+ }
53
+ }
54
+
55
+ async function listMRsNotInMilestone(milestone: string) {
56
+ console.log(`\n📋 Listing open MRs NOT in milestone: ${milestone}\n`);
57
+
58
+ const allMRs = await gitlab.MergeRequests.all({
59
+ projectId: PROJECT_ID,
60
+ state: 'opened',
61
+ });
62
+
63
+ const outsideMRs = allMRs.filter(
64
+ (mr: any) => !mr.milestone || mr.milestone.title !== milestone
65
+ );
66
+
67
+ if (outsideMRs.length === 0) {
68
+ console.log('All open MRs are in the milestone.');
69
+ return;
70
+ }
71
+
72
+ console.log(`Found ${outsideMRs.length} MRs outside milestone:\n`);
73
+
74
+ for (const mr of outsideMRs) {
75
+ const milestoneText = mr.milestone ? mr.milestone.title : 'No milestone';
76
+ console.log(`!${mr.iid}: ${mr.title}`);
77
+ console.log(` Milestone: ${milestoneText}`);
78
+ console.log(` Target: ${mr.target_branch}`);
79
+ console.log(` ${mr.web_url}\n`);
80
+ }
81
+ }
82
+
83
+ async function retargetMR(mrId: number, targetBranch: string) {
84
+ console.log(`\n🎯 Retargeting MR !${mrId} to ${targetBranch}...\n`);
85
+
86
+ try {
87
+ await gitlab.MergeRequests.edit(PROJECT_ID, mrId, {
88
+ target_branch: targetBranch,
89
+ });
90
+
91
+ console.log(`✅ Successfully retargeted MR !${mrId} to ${targetBranch}`);
92
+ } catch (error: any) {
93
+ console.error(`❌ Failed to retarget MR: ${error.message}`);
94
+ process.exit(1);
95
+ }
96
+ }
97
+
98
+ async function closeMR(mrId: number, reason: string) {
99
+ console.log(`\n🚫 Closing MR !${mrId}...\n`);
100
+
101
+ try {
102
+ // Add comment explaining closure
103
+ await gitlab.MergeRequestNotes.create(PROJECT_ID, mrId, {
104
+ body: `Closing this MR: ${reason}\n\nIf this work is still needed, please rebase and assign to the appropriate milestone.`,
105
+ });
106
+
107
+ // Close the MR
108
+ await gitlab.MergeRequests.edit(PROJECT_ID, mrId, {
109
+ state_event: 'close',
110
+ });
111
+
112
+ console.log(`✅ Successfully closed MR !${mrId}`);
113
+ } catch (error: any) {
114
+ console.error(`❌ Failed to close MR: ${error.message}`);
115
+ process.exit(1);
116
+ }
117
+ }
118
+
119
+ async function rebaseMR(mrId: number) {
120
+ console.log(`\n🔄 Rebasing MR !${mrId}...\n`);
121
+
122
+ try {
123
+ await gitlab.MergeRequests.rebase(PROJECT_ID, mrId);
124
+ console.log(`✅ Rebase initiated for MR !${mrId}`);
125
+ console.log(' Check the MR page for rebase status.');
126
+ } catch (error: any) {
127
+ console.error(`❌ Failed to rebase MR: ${error.message}`);
128
+ process.exit(1);
129
+ }
130
+ }
131
+
132
+ async function assignMilestone(mrId: number, milestone: string) {
133
+ console.log(`\n🏷️ Assigning MR !${mrId} to milestone ${milestone}...\n`);
134
+
135
+ try {
136
+ // Get milestone ID
137
+ const milestones = await gitlab.ProjectMilestones.all(PROJECT_ID);
138
+ const targetMilestone = milestones.find((m: any) => m.title === milestone);
139
+
140
+ if (!targetMilestone) {
141
+ throw new Error(`Milestone "${milestone}" not found`);
142
+ }
143
+
144
+ await gitlab.MergeRequests.edit(PROJECT_ID, mrId, {
145
+ milestone_id: targetMilestone.id,
146
+ });
147
+
148
+ console.log(`✅ Successfully assigned MR !${mrId} to milestone ${milestone}`);
149
+ } catch (error: any) {
150
+ console.error(`❌ Failed to assign milestone: ${error.message}`);
151
+ process.exit(1);
152
+ }
153
+ }
154
+
155
+ async function bulkRetarget(milestone: string, targetBranch: string) {
156
+ console.log(`\n🎯 Bulk retargeting all MRs in ${milestone} to ${targetBranch}...\n`);
157
+
158
+ const mrs = await gitlab.MergeRequests.all({
159
+ projectId: PROJECT_ID,
160
+ state: 'opened',
161
+ milestone,
162
+ });
163
+
164
+ console.log(`Found ${mrs.length} MRs to retarget\n`);
165
+
166
+ for (const mr of mrs) {
167
+ if (mr.target_branch !== targetBranch) {
168
+ console.log(`Retargeting !${mr.iid}: ${mr.title}`);
169
+ await retargetMR(mr.iid, targetBranch);
170
+ } else {
171
+ console.log(`Skipping !${mr.iid}: already targets ${targetBranch}`);
172
+ }
173
+ }
174
+
175
+ console.log(`\n✅ Bulk retarget complete`);
176
+ }
177
+
178
+ async function bulkRebase(milestone: string) {
179
+ console.log(`\n🔄 Bulk rebasing all MRs in ${milestone}...\n`);
180
+
181
+ const mrs = await gitlab.MergeRequests.all({
182
+ projectId: PROJECT_ID,
183
+ state: 'opened',
184
+ milestone,
185
+ });
186
+
187
+ console.log(`Found ${mrs.length} MRs to rebase\n`);
188
+
189
+ for (const mr of mrs) {
190
+ if (mr.has_conflicts) {
191
+ console.log(`Rebasing !${mr.iid}: ${mr.title} (has conflicts)`);
192
+ await rebaseMR(mr.iid);
193
+ // Wait a bit between rebases
194
+ await new Promise((resolve) => setTimeout(resolve, 2000));
195
+ } else {
196
+ console.log(`Skipping !${mr.iid}: no conflicts`);
197
+ }
198
+ }
199
+
200
+ console.log(`\n✅ Bulk rebase complete`);
201
+ }
202
+
203
+ // CLI
204
+ const program = new Command();
205
+
206
+ program
207
+ .name('manage-milestone-mrs')
208
+ .description('Manage merge requests for milestone-based releases')
209
+ .version('1.0.0');
210
+
211
+ program
212
+ .command('list')
213
+ .description('List all MRs in a milestone')
214
+ .requiredOption('-m, --milestone <milestone>', 'Milestone name (e.g., v0.2.6)')
215
+ .action(async (options) => {
216
+ await listMRsInMilestone(options.milestone);
217
+ });
218
+
219
+ program
220
+ .command('list-outside')
221
+ .description('List all MRs NOT in a milestone')
222
+ .requiredOption('-m, --milestone <milestone>', 'Milestone name (e.g., v0.2.6)')
223
+ .action(async (options) => {
224
+ await listMRsNotInMilestone(options.milestone);
225
+ });
226
+
227
+ program
228
+ .command('retarget')
229
+ .description('Retarget an MR to a different branch')
230
+ .requiredOption('-i, --id <id>', 'MR ID (e.g., 123)')
231
+ .requiredOption('-t, --target <branch>', 'Target branch (e.g., development)')
232
+ .action(async (options) => {
233
+ await retargetMR(parseInt(options.id), options.target);
234
+ });
235
+
236
+ program
237
+ .command('close')
238
+ .description('Close an MR with a reason')
239
+ .requiredOption('-i, --id <id>', 'MR ID (e.g., 123)')
240
+ .requiredOption('-r, --reason <reason>', 'Reason for closing')
241
+ .action(async (options) => {
242
+ await closeMR(parseInt(options.id), options.reason);
243
+ });
244
+
245
+ program
246
+ .command('rebase')
247
+ .description('Rebase an MR')
248
+ .requiredOption('-i, --id <id>', 'MR ID (e.g., 123)')
249
+ .action(async (options) => {
250
+ await rebaseMR(parseInt(options.id));
251
+ });
252
+
253
+ program
254
+ .command('assign')
255
+ .description('Assign an MR to a milestone')
256
+ .requiredOption('-i, --id <id>', 'MR ID (e.g., 123)')
257
+ .requiredOption('-m, --milestone <milestone>', 'Milestone name (e.g., v0.2.6)')
258
+ .action(async (options) => {
259
+ await assignMilestone(parseInt(options.id), options.milestone);
260
+ });
261
+
262
+ program
263
+ .command('bulk-retarget')
264
+ .description('Retarget all MRs in a milestone to a branch')
265
+ .requiredOption('-m, --milestone <milestone>', 'Milestone name (e.g., v0.2.6)')
266
+ .requiredOption('-t, --target <branch>', 'Target branch (e.g., development)')
267
+ .action(async (options) => {
268
+ await bulkRetarget(options.milestone, options.target);
269
+ });
270
+
271
+ program
272
+ .command('bulk-rebase')
273
+ .description('Rebase all MRs with conflicts in a milestone')
274
+ .requiredOption('-m, --milestone <milestone>', 'Milestone name (e.g., v0.2.6)')
275
+ .action(async (options) => {
276
+ await bulkRebase(options.milestone);
277
+ });
278
+
279
+ program.parse();