@bluefly/openstandardagents 0.4.9 → 0.5.1

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 (259) hide show
  1. package/.version.json +3 -3
  2. package/CHANGELOG.md +35 -4
  3. package/README.md +77 -62
  4. package/dist/.version.json +3 -3
  5. package/dist/adapters/a2a/a2a-protocol.js +4 -2
  6. package/dist/adapters/a2a/a2a-tool.js +4 -2
  7. package/dist/adapters/a2a/mcp-integration.d.ts +2 -1
  8. package/dist/adapters/a2a/mcp-integration.js +6 -3
  9. package/dist/adapters/browser/browser-exporter.d.ts +26 -0
  10. package/dist/adapters/browser/browser-exporter.js +73 -0
  11. package/dist/adapters/browser/browser-runner.d.ts +23 -0
  12. package/dist/adapters/browser/browser-runner.js +46 -0
  13. package/dist/adapters/browser/index.d.ts +9 -0
  14. package/dist/adapters/browser/index.js +9 -0
  15. package/dist/adapters/claude-code/adapter.js +2 -2
  16. package/dist/adapters/docker/generators.js +19 -19
  17. package/dist/adapters/docker/index.d.ts +2 -0
  18. package/dist/adapters/docker/index.js +2 -0
  19. package/dist/adapters/docker/openclaw-bridge.d.ts +57 -0
  20. package/dist/adapters/docker/openclaw-bridge.js +173 -0
  21. package/dist/adapters/drupal/generator.js +76 -76
  22. package/dist/adapters/drupal/index.d.ts +1 -0
  23. package/dist/adapters/drupal/index.js +2 -0
  24. package/dist/adapters/drupal/twig-renderer.d.ts +23 -0
  25. package/dist/adapters/drupal/twig-renderer.js +99 -0
  26. package/dist/adapters/gitlab/agent-generator.js +2 -1
  27. package/dist/adapters/openai-agents/adapter.js +2 -2
  28. package/dist/api/index.js +2 -1
  29. package/dist/api/routes/mcp.router.js +3 -1
  30. package/dist/api/routes/wizard.router.js +3 -1
  31. package/dist/cli/commands/agent/discover-type.command.js +1 -1
  32. package/dist/cli/commands/agent-card.command.js +37 -10
  33. package/dist/cli/commands/agents-sync.command.d.ts +2 -2
  34. package/dist/cli/commands/agents-sync.command.js +27 -17
  35. package/dist/cli/commands/catalog/config.js +1 -1
  36. package/dist/cli/commands/catalog/validate.command.js +2 -2
  37. package/dist/cli/commands/config.command.js +2 -2
  38. package/dist/cli/commands/daemon.command.js +32 -8
  39. package/dist/cli/commands/discover.d.ts +1 -1
  40. package/dist/cli/commands/discover.js +16 -8
  41. package/dist/cli/commands/economics.command.d.ts +9 -0
  42. package/dist/cli/commands/economics.command.js +113 -0
  43. package/dist/cli/commands/export.command.js +6 -3
  44. package/dist/cli/commands/mcp.command.js +3 -1
  45. package/dist/cli/commands/memory.command.d.ts +18 -0
  46. package/dist/cli/commands/memory.command.js +168 -0
  47. package/dist/cli/commands/publish.command.js +7 -4
  48. package/dist/cli/commands/serve-builder-routes.js +1 -1
  49. package/dist/cli/commands/usie-skills.command.d.ts +24 -0
  50. package/dist/cli/commands/usie-skills.command.js +297 -0
  51. package/dist/cli/commands/validate.command.js +8 -1
  52. package/dist/cli/commands/verify.d.ts +3 -3
  53. package/dist/cli/commands/verify.js +12 -6
  54. package/dist/cli/commands/workspace.command.d.ts +1 -0
  55. package/dist/cli/commands/workspace.command.js +28 -4
  56. package/dist/cli/index.js +12 -0
  57. package/dist/cli/schema-driven/schema-loader.js +5 -5
  58. package/dist/cli/workspace-validate.d.ts +23 -0
  59. package/dist/cli/workspace-validate.js +117 -0
  60. package/dist/data/platform-matrix.js +1 -4
  61. package/dist/generated/types.d.ts +97 -97
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.js +2 -0
  64. package/dist/mcp-server/index.js +658 -982
  65. package/dist/mesh/discovery-gkg.d.ts +26 -0
  66. package/dist/mesh/discovery-gkg.js +92 -0
  67. package/dist/messenger/Handler/AgentBatchHandler.js +3 -2
  68. package/dist/messenger/Handler/AgentExecutionHandler.js +6 -1
  69. package/dist/package.json +43 -14
  70. package/dist/sdks/shared/types.d.ts +1 -1
  71. package/dist/services/agent-card-generator.js +6 -2
  72. package/dist/services/daemon/audit-log.service.js +3 -1
  73. package/dist/services/daemon/execution.service.js +8 -4
  74. package/dist/services/daemon/fs-watcher.service.js +6 -7
  75. package/dist/services/daemon/pairing.service.js +2 -1
  76. package/dist/services/daemon/skill-aggregator.service.js +105 -21
  77. package/dist/services/daemon/sse-endpoints.js +1 -1
  78. package/dist/services/daemon/ws-server.js +10 -3
  79. package/dist/services/export/langchain/langchain-exporter.js +2 -2
  80. package/dist/services/export/langchain/memory-generator.js +2 -2
  81. package/dist/services/export/testing/test-generator.js +1 -1
  82. package/dist/services/governance/cedar-provider.js +12 -8
  83. package/dist/services/governance/cedar-validator.service.js +1 -1
  84. package/dist/services/mcp/bridge.service.js +40 -9
  85. package/dist/services/openapi-extensions-validation.d.ts +20 -0
  86. package/dist/services/openapi-extensions-validation.js +193 -0
  87. package/dist/services/release-automation/merge-request.service.d.ts +4 -4
  88. package/dist/services/release-automation/release-buttons.js +3 -3
  89. package/dist/services/release-automation/schemas/release.schema.d.ts +3 -3
  90. package/dist/services/runtime/openai.adapter.d.ts +46 -13
  91. package/dist/services/runtime/openai.adapter.js +169 -131
  92. package/dist/services/skill-registry.service.d.ts +1 -1
  93. package/dist/services/skills-pipeline/skills-research.service.js +47 -7
  94. package/dist/services/taxonomy-service.d.ts +3 -3
  95. package/dist/services/trust/trust.service.js +6 -4
  96. package/dist/services/validation-zod.service.js +3 -22
  97. package/dist/services/validators/index.d.ts +1 -0
  98. package/dist/services/validators/index.js +1 -0
  99. package/dist/services/validators/registry.d.ts +21 -0
  100. package/dist/services/validators/registry.js +42 -0
  101. package/dist/skills/test-skill/package.json +1 -1
  102. package/dist/spec/extensions/cognition.schema.json +87 -0
  103. package/dist/spec/extensions/role-manifest.md +188 -0
  104. package/dist/spec/layer4-economics/duadp-examples.json +44 -0
  105. package/dist/spec/v0.4/agent.schema.json +14 -0
  106. package/dist/spec/v0.4/extensions/mcp/README.md +1 -1
  107. package/dist/spec/v0.5/agent-builder-openapi.yaml +230 -0
  108. package/dist/spec/v0.5/agent.schema.json +34 -2
  109. package/dist/spec/v0.5/extensions/cognition/cognition.schema.json +78 -1
  110. package/dist/spec/v0.5/extensions/economics/context-pack.schema.json +91 -0
  111. package/dist/spec/v0.5/extensions/economics/execution-profile.schema.json +148 -0
  112. package/dist/spec/v0.5/extensions/economics/failure-semantics.schema.json +32 -0
  113. package/dist/spec/v0.5/extensions/economics/replay-packet.schema.json +120 -0
  114. package/dist/spec/v0.5/memory-hierarchy.yaml +120 -0
  115. package/dist/spec/v0.5/role.schema.json +268 -0
  116. package/dist/spec/v1/agent-card.schema.json +254 -0
  117. package/dist/types/cognition.zod.d.ts +312 -0
  118. package/dist/types/cognition.zod.js +223 -0
  119. package/dist/types/identity.zod.d.ts +5 -5
  120. package/dist/types/index.d.ts +54 -6
  121. package/dist/types/index.js +6 -2
  122. package/dist/types/personality.zod.d.ts +3 -3
  123. package/dist/types/role.d.ts +126 -0
  124. package/dist/types/role.js +38 -0
  125. package/dist/utils/http-client.d.ts +22 -0
  126. package/dist/utils/http-client.js +51 -0
  127. package/dist/utils/index.d.ts +3 -0
  128. package/dist/utils/index.js +3 -0
  129. package/dist/utils/proxy-resolver.d.ts +36 -0
  130. package/dist/utils/proxy-resolver.js +59 -0
  131. package/dist/utils/user-agent.d.ts +11 -0
  132. package/dist/utils/user-agent.js +17 -0
  133. package/dist/validation/validator.js +1 -1
  134. package/dist/validation/version-compliance.js +1 -1
  135. package/examples/agents/01-customer-support-bot/agent.ossa.yaml +24 -31
  136. package/examples/agents/05-sales-assistant/agent.ossa.yaml +35 -23
  137. package/examples/agents/07-research-assistant/agent.ossa.yaml +27 -21
  138. package/examples/agents/10-meeting-assistant/agent.ossa.yaml +27 -35
  139. package/examples/agents/security-audit-agent.ossa.yaml +234 -0
  140. package/examples/agentscope/react-assistant/README.md +1 -1
  141. package/examples/agentscope/react-assistant/agent.ossa.yaml +37 -33
  142. package/examples/drupal/content-moderator.ossa.yaml +2 -2
  143. package/examples/drupal/drupal-contributor-agent/.eslintrc.json +58 -0
  144. package/examples/drupal/drupal-contributor-agent/.prettierrc.json +10 -0
  145. package/examples/drupal/drupal-contributor-agent/package.json +55 -0
  146. package/examples/drupal/drupal-contributor-agent/src/core/index.ts +10 -0
  147. package/examples/drupal/drupal-contributor-agent/src/index.ts +17 -0
  148. package/examples/drupal/drupal-contributor-agent/src/types/index.ts +180 -0
  149. package/examples/drupal/drupal-contributor-agent/tsconfig.json +36 -0
  150. package/examples/drupal/drupal-contributor.ossa.yaml +247 -0
  151. package/examples/export/langchain/production-agent-with-memory/README.md +1 -1
  152. package/examples/export/langchain/production-agent-with-memory/agent.ossa.yaml +13 -23
  153. package/examples/export/langchain/production-agent-with-streaming/agent.ossa.yaml +1 -15
  154. package/examples/export/langchain/production-agent-with-tools/agent.ossa.yaml +28 -29
  155. package/examples/getting-started/01-minimal-agent.ossa.yaml +1 -1
  156. package/examples/getting-started/02-agent-with-tools.ossa.yaml +1 -1
  157. package/examples/getting-started/03-agent-with-safety.ossa.yaml +1 -1
  158. package/examples/getting-started/04-agent-with-messaging.ossa.yaml +1 -1
  159. package/examples/getting-started/05-workflow-composition.ossa.yaml +1 -1
  160. package/examples/getting-started/README.md +3 -3
  161. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  162. package/examples/gitlab-agents/gitlab-ci-agent.ossa.yaml +221 -0
  163. package/examples/hierarchical-agent.ossa.yaml +10 -53
  164. package/examples/kagent/ossa-kagent-anthropic.ossa.yaml +2 -25
  165. package/examples/kagent/ossa-kagent-mcp-tools.ossa.yaml +2 -30
  166. package/examples/kagent/ossa-kagent-multi-tool.ossa.yaml +2 -18
  167. package/examples/kagent/ossa-kagent-poc.ossa.yaml +2 -16
  168. package/examples/pipeline-agent.ossa.yaml +3 -3
  169. package/examples/platform-specific/claude-code-subagent.yaml +1 -1
  170. package/examples/platform-specific/cursor-coding-agent.yaml +1 -1
  171. package/examples/platform-specific/warp-terminal-agent.yaml +1 -1
  172. package/examples/production-ready/01-customer-support-bot/agent.ossa.yaml +24 -31
  173. package/examples/production-ready/05-sales-assistant/agent.ossa.yaml +35 -23
  174. package/examples/production-ready/07-research-assistant/agent.ossa.yaml +27 -19
  175. package/examples/production-ready/10-meeting-assistant/agent.ossa.yaml +27 -35
  176. package/examples/roles/drupal-developer.role.yaml +37 -0
  177. package/examples/roles/platform-operator.role.yaml +28 -0
  178. package/examples/roles/security-auditor.role.yaml +27 -0
  179. package/examples/swarm-agent.ossa.yaml +13 -51
  180. package/examples/team-agent.ossa.yaml +12 -61
  181. package/examples/team-lead-teammate.ossa.yaml +12 -17
  182. package/openapi/agent-cognition-sessions.yaml +580 -0
  183. package/openapi/agent-communication.yaml +260 -212
  184. package/openapi/agent-crud.yaml +237 -207
  185. package/openapi/agent-discovery.yaml +119 -81
  186. package/openapi/agent-identity.yaml +219 -187
  187. package/openapi/agent-taxonomy.yaml +95 -38
  188. package/openapi/agents-md-service.yaml +103 -30
  189. package/openapi/cli/openapi.yaml +147 -40
  190. package/openapi/core/ossa-core-api.openapi.yaml +327 -271
  191. package/openapi/core/ossa-registry-api.openapi.yaml +299 -236
  192. package/openapi/core/ossa-registry.openapi.yaml +299 -159
  193. package/openapi/core/unified-agent-gateway.openapi.yaml +234 -170
  194. package/openapi/daemon-api.openapi.yaml +323 -181
  195. package/openapi/dev-cli/openapi.yaml +137 -113
  196. package/openapi/github-sync.yaml +62 -19
  197. package/openapi/marketplace-plugin.openapi.yaml +539 -466
  198. package/openapi/ossa-api.openapi.yaml +354 -213
  199. package/openapi/ossa-cli-enhancements.openapi.yaml +109 -90
  200. package/openapi/ossa-cli.yaml +260 -184
  201. package/openapi/protocols/sse-streams.yaml +66 -74
  202. package/openapi/protocols/websocket-events.yaml +61 -54
  203. package/openapi/reference-implementations/aiflow-bridge-api.openapi.yaml +37 -20
  204. package/openapi/reference-implementations/compliance-agent-api.openapi.yaml +35 -23
  205. package/openapi/reference-implementations/crewai-agent-api.openapi.yaml +29 -18
  206. package/openapi/reference-implementations/critic-agent-api.openapi.yaml +45 -19
  207. package/openapi/reference-implementations/document-analyzer-api.openapi.yaml +30 -24
  208. package/openapi/reference-implementations/drupal-agent-api.openapi.yaml +101 -50
  209. package/openapi/reference-implementations/getting-started-hello-world-api.openapi.yaml +33 -22
  210. package/openapi/reference-implementations/gitlab-ml-recommender-api.openapi.yaml +20 -16
  211. package/openapi/reference-implementations/governor-agent-api.openapi.yaml +41 -23
  212. package/openapi/reference-implementations/helm-generator.openapi.yaml +88 -46
  213. package/openapi/reference-implementations/integrator-agent-api.openapi.yaml +30 -20
  214. package/openapi/reference-implementations/judge-agent-api.openapi.yaml +22 -16
  215. package/openapi/reference-implementations/k8s-troubleshooter-api.openapi.yaml +32 -18
  216. package/openapi/reference-implementations/langchain-agent-api.openapi.yaml +32 -21
  217. package/openapi/reference-implementations/monitor-agent-api.openapi.yaml +34 -21
  218. package/openapi/reference-implementations/orchestrator-agent-api.openapi.yaml +49 -27
  219. package/openapi/reference-implementations/quickstart-support-agent-api.openapi.yaml +27 -19
  220. package/openapi/reference-implementations/self-evolving-ecosystem.openapi.yaml +427 -293
  221. package/openapi/reference-implementations/worker-agent-api.openapi.yaml +34 -23
  222. package/openapi/reference-implementations/workflow-orchestrator-api.openapi.yaml +35 -21
  223. package/openapi/release-automation.openapi.yaml +48 -14
  224. package/openapi/schemas/common/agent.yaml +30 -29
  225. package/openapi/schemas/common/economics.yaml +98 -0
  226. package/openapi/schemas/common/errors.yaml +13 -3
  227. package/openapi/schemas/common/metadata.yaml +22 -7
  228. package/openapi/schemas/common/pagination.yaml +18 -6
  229. package/openapi/schemas/common/security.yaml +13 -5
  230. package/openapi/schemas/index.yaml +49 -42
  231. package/openapi/uadp-asyncapi.yaml +5 -3
  232. package/openapi/uadp-openapi.yaml +243 -165
  233. package/openapi/version-management.openapi.yaml +142 -135
  234. package/package.json +43 -14
  235. package/spec/extensions/cognition.schema.json +87 -0
  236. package/spec/extensions/role-manifest.md +188 -0
  237. package/spec/layer4-economics/duadp-examples.json +44 -0
  238. package/spec/v0.4/agent.schema.json +14 -0
  239. package/spec/v0.4/extensions/mcp/README.md +1 -1
  240. package/spec/v0.5/agent-builder-openapi.yaml +230 -0
  241. package/spec/v0.5/agent.schema.json +34 -2
  242. package/spec/v0.5/extensions/cognition/cognition.schema.json +78 -1
  243. package/spec/v0.5/extensions/economics/context-pack.schema.json +91 -0
  244. package/spec/v0.5/extensions/economics/execution-profile.schema.json +148 -0
  245. package/spec/v0.5/extensions/economics/failure-semantics.schema.json +32 -0
  246. package/spec/v0.5/extensions/economics/replay-packet.schema.json +120 -0
  247. package/spec/v0.5/memory-hierarchy.yaml +120 -0
  248. package/spec/v0.5/role.schema.json +268 -0
  249. package/spec/v1/agent-card.schema.json +254 -0
  250. package/dist/adapters/a2a/__tests__/mcp-integration.spec.d.ts +0 -5
  251. package/dist/adapters/a2a/__tests__/mcp-integration.spec.js +0 -268
  252. package/dist/adapters/a2a/__tests__/mcp-transport.spec.d.ts +0 -5
  253. package/dist/adapters/a2a/__tests__/mcp-transport.spec.js +0 -203
  254. package/dist/mcp-server/__tests__/mcp-server.spec.d.ts +0 -8
  255. package/dist/mcp-server/__tests__/mcp-server.spec.js +0 -557
  256. package/dist/validation/__tests__/error-codes.test.d.ts +0 -5
  257. package/dist/validation/__tests__/error-codes.test.js +0 -252
  258. package/dist/version-management/core/version-manager.test.d.ts +0 -2
  259. package/dist/version-management/core/version-manager.test.js +0 -210
@@ -1,557 +0,0 @@
1
- /**
2
- * OSSA MCP Server — Integration Tests
3
- *
4
- * Tests all 7 tools end-to-end using the MCP SDK Client.
5
- * Uses vitest + @modelcontextprotocol/sdk.
6
- */
7
- import { describe, it, expect, beforeAll, afterAll } from 'vitest';
8
- import { Client } from '@modelcontextprotocol/sdk/client/index.js';
9
- import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
10
- import * as path from 'node:path';
11
- import * as fs from 'node:fs';
12
- import * as os from 'node:os';
13
- const SERVER_PATH = path.resolve(import.meta.dirname, '../../../dist/mcp-server/index.js');
14
- const FIXTURE_DIR = path.resolve(import.meta.dirname, '../../../spec/reference/reference-agents');
15
- let client;
16
- let transport;
17
- let tmpDir;
18
- beforeAll(async () => {
19
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ossa-mcp-test-'));
20
- transport = new StdioClientTransport({
21
- command: 'node',
22
- args: [SERVER_PATH],
23
- env: { ...process.env, LOG_LEVEL: 'silent' },
24
- });
25
- client = new Client({ name: 'ossa-mcp-test', version: '1.0.0' }, { capabilities: {} });
26
- await client.connect(transport);
27
- }, 15000);
28
- afterAll(async () => {
29
- await client?.close();
30
- // cleanup tmpDir
31
- if (tmpDir && fs.existsSync(tmpDir)) {
32
- fs.rmSync(tmpDir, { recursive: true, force: true });
33
- }
34
- });
35
- describe('ossa_validate', () => {
36
- it('validates a valid manifest', async () => {
37
- const manifestPath = path.join(FIXTURE_DIR, 'compliance-auditor/manifest.ossa.yaml');
38
- const result = await client.callTool({
39
- name: 'ossa_validate',
40
- arguments: { path: manifestPath },
41
- });
42
- expect(result.isError).toBeFalsy();
43
- const data = JSON.parse(result.content[0].text);
44
- expect(data.valid).toBe(true);
45
- expect(data.manifest_path).toBe(manifestPath);
46
- });
47
- it('returns error for non-existent file', async () => {
48
- const result = await client.callTool({
49
- name: 'ossa_validate',
50
- arguments: { path: '/tmp/does-not-exist.ossa.yaml' },
51
- });
52
- expect(result.isError).toBe(true);
53
- });
54
- });
55
- describe('ossa_scaffold', () => {
56
- it('scaffolds a new agent with full directory structure', async () => {
57
- const result = await client.callTool({
58
- name: 'ossa_scaffold',
59
- arguments: {
60
- name: 'test-agent',
61
- output_dir: tmpDir,
62
- description: 'A test agent for CI',
63
- role: 'You are a test agent.',
64
- type: 'worker',
65
- },
66
- });
67
- expect(result.isError).toBeFalsy();
68
- const data = JSON.parse(result.content[0].text);
69
- expect(data.success).toBe(true);
70
- expect(data.files_created).toContain('manifest.ossa.yaml');
71
- expect(data.files_created).toContain('AGENTS.md');
72
- expect(data.files_created).toContain('prompts/');
73
- expect(data.files_created).toContain('tools/');
74
- // Verify files on disk
75
- const agentDir = path.join(tmpDir, 'test-agent');
76
- expect(fs.existsSync(path.join(agentDir, 'manifest.ossa.yaml'))).toBe(true);
77
- expect(fs.existsSync(path.join(agentDir, 'AGENTS.md'))).toBe(true);
78
- expect(fs.existsSync(path.join(agentDir, 'prompts'))).toBe(true);
79
- expect(fs.existsSync(path.join(agentDir, 'tools'))).toBe(true);
80
- });
81
- it('rejects duplicate directory', async () => {
82
- // test-agent already created above
83
- const result = await client.callTool({
84
- name: 'ossa_scaffold',
85
- arguments: { name: 'test-agent', output_dir: tmpDir },
86
- });
87
- expect(result.isError).toBe(true);
88
- const data = JSON.parse(result.content[0].text);
89
- expect(data.error).toContain('already exists');
90
- });
91
- it('rejects invalid DNS-1123 names', async () => {
92
- const result = await client.callTool({
93
- name: 'ossa_scaffold',
94
- arguments: { name: 'InvalidName!', output_dir: tmpDir },
95
- });
96
- expect(result.isError).toBe(true);
97
- });
98
- });
99
- describe('ossa_generate', () => {
100
- it('generates agent-card.json from scaffolded manifest', async () => {
101
- // Use the scaffolded manifest (known-good structure)
102
- const manifestPath = path.join(tmpDir, 'test-agent/manifest.ossa.yaml');
103
- const result = await client.callTool({
104
- name: 'ossa_generate',
105
- arguments: { path: manifestPath },
106
- });
107
- // Agent card generation may fail for minimal manifests — that's OK
108
- const data = JSON.parse(result.content[0].text);
109
- expect(data).toBeDefined();
110
- });
111
- it('returns structured error for manifests missing capabilities', async () => {
112
- const manifestPath = path.join(FIXTURE_DIR, 'compliance-auditor/manifest.ossa.yaml');
113
- const result = await client.callTool({
114
- name: 'ossa_generate',
115
- arguments: { path: manifestPath },
116
- });
117
- // Should return error (not crash) when manifest lacks spec.capabilities
118
- const data = JSON.parse(result.content[0].text);
119
- expect(data).toBeDefined();
120
- });
121
- });
122
- describe('ossa_publish', () => {
123
- it('dry-run returns payload without sending', async () => {
124
- // Use scaffolded manifest
125
- const manifestPath = path.join(tmpDir, 'test-agent/manifest.ossa.yaml');
126
- const result = await client.callTool({
127
- name: 'ossa_publish',
128
- arguments: { path: manifestPath, dry_run: true },
129
- });
130
- expect(result.isError).toBeFalsy();
131
- const data = JSON.parse(result.content[0].text);
132
- expect(data.dry_run).toBe(true);
133
- expect(data.payload).toBeDefined();
134
- expect(data.payload.manifest).toBeDefined();
135
- });
136
- it('returns instructions when no registry configured', async () => {
137
- const manifestPath = path.join(tmpDir, 'test-agent/manifest.ossa.yaml');
138
- const result = await client.callTool({
139
- name: 'ossa_publish',
140
- arguments: { path: manifestPath },
141
- });
142
- expect(result.isError).toBeFalsy();
143
- const data = JSON.parse(result.content[0].text);
144
- expect(data.next_steps).toBeDefined();
145
- expect(data.next_steps.length).toBeGreaterThan(0);
146
- });
147
- });
148
- describe('ossa_list', () => {
149
- it('discovers agents in spec/reference', async () => {
150
- const result = await client.callTool({
151
- name: 'ossa_list',
152
- arguments: { directory: FIXTURE_DIR, format: 'json' },
153
- });
154
- expect(result.isError).toBeFalsy();
155
- const data = JSON.parse(result.content[0].text);
156
- expect(data.count).toBeGreaterThanOrEqual(1);
157
- expect(data.agents).toBeInstanceOf(Array);
158
- expect(data.agents[0]).toHaveProperty('name');
159
- expect(data.agents[0]).toHaveProperty('path');
160
- });
161
- it('returns summary format by default', async () => {
162
- const result = await client.callTool({
163
- name: 'ossa_list',
164
- arguments: { directory: FIXTURE_DIR },
165
- });
166
- expect(result.isError).toBeFalsy();
167
- const data = JSON.parse(result.content[0].text);
168
- expect(data.count).toBeGreaterThanOrEqual(1);
169
- // Summary format returns strings, not objects
170
- expect(typeof data.agents[0]).toBe('string');
171
- });
172
- });
173
- describe('ossa_inspect', () => {
174
- it('deep-inspects a manifest', async () => {
175
- const manifestPath = path.join(FIXTURE_DIR, 'compliance-auditor/manifest.ossa.yaml');
176
- const result = await client.callTool({
177
- name: 'ossa_inspect',
178
- arguments: { path: manifestPath },
179
- });
180
- expect(result.isError).toBeFalsy();
181
- const data = JSON.parse(result.content[0].text);
182
- expect(data.name).toBeDefined();
183
- expect(data.kind).toBeDefined();
184
- expect(data.apiVersion).toBeDefined();
185
- expect(data.validation).toBeDefined();
186
- expect(data.validation.valid).toBeDefined();
187
- expect(data.file_size_bytes).toBeGreaterThan(0);
188
- });
189
- });
190
- describe('ossa_convert', () => {
191
- const manifestPath = path.join(FIXTURE_DIR, 'compliance-auditor/manifest.ossa.yaml');
192
- it('converts to kagent v1alpha2 format with Agent + ModelConfig', async () => {
193
- const result = await client.callTool({
194
- name: 'ossa_convert',
195
- arguments: { path: manifestPath, target: 'kagent' },
196
- });
197
- expect(result.isError).toBeFalsy();
198
- const data = JSON.parse(result.content[0].text);
199
- expect(data.target).toBe('kagent');
200
- // v1alpha2 multi-resource output: Agent + ModelConfig
201
- expect(data.content._ossa_multi_resource).toBe(true);
202
- expect(data.content.resources).toBeInstanceOf(Array);
203
- expect(data.content.resources.length).toBe(2);
204
- // Agent CRD
205
- const agent = data.content.agent;
206
- expect(agent.apiVersion).toBe('kagent.dev/v1alpha2');
207
- expect(agent.kind).toBe('Agent');
208
- expect(agent.spec.type).toBe('Declarative');
209
- expect(agent.spec.declarative.modelConfig).toBeDefined();
210
- expect(agent.spec.declarative.systemMessage).toBeDefined();
211
- // ModelConfig CRD
212
- const modelCfg = data.content.modelConfig;
213
- expect(modelCfg.apiVersion).toBe('kagent.dev/v1alpha2');
214
- expect(modelCfg.kind).toBe('ModelConfig');
215
- });
216
- it('converts to docker-compose format', async () => {
217
- const result = await client.callTool({
218
- name: 'ossa_convert',
219
- arguments: { path: manifestPath, target: 'docker' },
220
- });
221
- expect(result.isError).toBeFalsy();
222
- const data = JSON.parse(result.content[0].text);
223
- expect(data.target).toBe('docker');
224
- expect(data.content.version).toBe('3.8');
225
- expect(data.content.services).toBeDefined();
226
- });
227
- it('converts to langchain format', async () => {
228
- const result = await client.callTool({
229
- name: 'ossa_convert',
230
- arguments: { path: manifestPath, target: 'langchain' },
231
- });
232
- expect(result.isError).toBeFalsy();
233
- const data = JSON.parse(result.content[0].text);
234
- expect(data.target).toBe('langchain');
235
- expect(data.content._type).toBe('agent');
236
- });
237
- it('converts to crewai format', async () => {
238
- const result = await client.callTool({
239
- name: 'ossa_convert',
240
- arguments: { path: manifestPath, target: 'crewai' },
241
- });
242
- expect(result.isError).toBeFalsy();
243
- const data = JSON.parse(result.content[0].text);
244
- expect(data.target).toBe('crewai');
245
- expect(data.content.agents).toBeInstanceOf(Array);
246
- });
247
- it('converts to anthropic format', async () => {
248
- const result = await client.callTool({
249
- name: 'ossa_convert',
250
- arguments: { path: manifestPath, target: 'anthropic' },
251
- });
252
- expect(result.isError).toBeFalsy();
253
- const data = JSON.parse(result.content[0].text);
254
- expect(data.target).toBe('anthropic');
255
- expect(data.content.model).toBeDefined();
256
- expect(data.content.system).toBeDefined();
257
- });
258
- it('converts to a2a agent-card format', async () => {
259
- const result = await client.callTool({
260
- name: 'ossa_convert',
261
- arguments: { path: manifestPath, target: 'agent-card' },
262
- });
263
- expect(result.isError).toBeFalsy();
264
- const data = JSON.parse(result.content[0].text);
265
- expect(data.target).toBe('agent-card');
266
- expect(data.content.name).toBeDefined();
267
- expect(data.content.description).toBeDefined();
268
- expect(data.content.url).toBeDefined();
269
- expect(data.content.capabilities).toBeDefined();
270
- expect(data.content.skills).toBeInstanceOf(Array);
271
- });
272
- it('converts to openai format', async () => {
273
- const result = await client.callTool({
274
- name: 'ossa_convert',
275
- arguments: { path: manifestPath, target: 'openai' },
276
- });
277
- expect(result.isError).toBeFalsy();
278
- const data = JSON.parse(result.content[0].text);
279
- expect(data.target).toBe('openai');
280
- expect(data.content.model).toBeDefined();
281
- expect(data.content.instructions).toBeDefined();
282
- expect(data.content.tools).toBeInstanceOf(Array);
283
- if (data.content.tools.length > 0) {
284
- expect(data.content.tools[0].type).toBe('function');
285
- expect(data.content.tools[0].function.name).toBeDefined();
286
- }
287
- });
288
- it('converts to autogen format', async () => {
289
- const result = await client.callTool({
290
- name: 'ossa_convert',
291
- arguments: { path: manifestPath, target: 'autogen' },
292
- });
293
- expect(result.isError).toBeFalsy();
294
- const data = JSON.parse(result.content[0].text);
295
- expect(data.target).toBe('autogen');
296
- expect(data.content.name).toBeDefined();
297
- expect(data.content.system_message).toBeDefined();
298
- expect(data.content.llm_config).toBeDefined();
299
- expect(data.content.llm_config.config_list).toBeInstanceOf(Array);
300
- });
301
- it('converts to semantic-kernel format', async () => {
302
- const result = await client.callTool({
303
- name: 'ossa_convert',
304
- arguments: { path: manifestPath, target: 'semantic-kernel' },
305
- });
306
- expect(result.isError).toBeFalsy();
307
- const data = JSON.parse(result.content[0].text);
308
- expect(data.target).toBe('semantic-kernel');
309
- expect(data.content.name).toBeDefined();
310
- expect(data.content.instructions).toBeDefined();
311
- expect(data.content.execution_settings).toBeDefined();
312
- expect(data.content.plugins).toBeInstanceOf(Array);
313
- });
314
- it('agent-card includes all platform adapters with SDK references', async () => {
315
- const result = await client.callTool({
316
- name: 'ossa_convert',
317
- arguments: { path: manifestPath, target: 'agent-card' },
318
- });
319
- expect(result.isError).toBeFalsy();
320
- const data = JSON.parse(result.content[0].text);
321
- const adapters = data.content.adapters;
322
- expect(adapters).toBeDefined();
323
- // All 12 platforms present
324
- const expectedPlatforms = [
325
- 'openai',
326
- 'anthropic',
327
- 'google_genai',
328
- 'langchain',
329
- 'langflow',
330
- 'crewai',
331
- 'autogen',
332
- 'semantic_kernel',
333
- 'llamaindex',
334
- 'dspy',
335
- 'kagent',
336
- 'gitlab_duo',
337
- ];
338
- for (const platform of expectedPlatforms) {
339
- expect(adapters[platform]).toBeDefined();
340
- }
341
- // Each adapter has sdk, config, usage
342
- expect(adapters.openai.sdk.npm).toBe('openai');
343
- expect(adapters.openai.sdk.pip).toBe('openai');
344
- expect(adapters.openai.config).toBeDefined();
345
- expect(adapters.openai.usage).toBeDefined();
346
- expect(adapters.anthropic.sdk.npm).toBe('@anthropic-ai/sdk');
347
- expect(adapters.anthropic.sdk.pip).toBe('anthropic');
348
- expect(adapters.google_genai.sdk.npm).toBe('@google/generative-ai');
349
- expect(adapters.langchain.sdk.pip).toBeInstanceOf(Array);
350
- expect(adapters.llamaindex.sdk.pip).toBe('llama-index');
351
- expect(adapters.dspy.sdk.pip).toBe('dspy');
352
- // MCP section
353
- expect(data.content.mcp).toBeDefined();
354
- expect(data.content.mcp.tools).toBeInstanceOf(Array);
355
- // OSSA contract
356
- expect(data.content.ossa).toBeDefined();
357
- expect(data.content.ossa.role).toBeDefined();
358
- });
359
- it('converts to gitlab-duo format', async () => {
360
- const result = await client.callTool({
361
- name: 'ossa_convert',
362
- arguments: { path: manifestPath, target: 'gitlab-duo' },
363
- });
364
- expect(result.isError).toBeFalsy();
365
- const data = JSON.parse(result.content[0].text);
366
- expect(data.target).toBe('gitlab-duo');
367
- expect(data.content.name).toBeDefined();
368
- });
369
- it('writes converted output to disk', async () => {
370
- const outDir = path.join(tmpDir, 'convert-output');
371
- const result = await client.callTool({
372
- name: 'ossa_convert',
373
- arguments: { path: manifestPath, target: 'kagent', output_dir: outDir },
374
- });
375
- expect(result.isError).toBeFalsy();
376
- const data = JSON.parse(result.content[0].text);
377
- expect(data.written_to).toBeDefined();
378
- expect(fs.existsSync(data.written_to)).toBe(true);
379
- });
380
- });
381
- describe('ossa_workspace', () => {
382
- it('initializes a workspace', async () => {
383
- const wsDir = path.join(tmpDir, 'ws-test');
384
- fs.mkdirSync(wsDir, { recursive: true });
385
- const result = await client.callTool({
386
- name: 'ossa_workspace',
387
- arguments: { action: 'init', directory: wsDir, name: 'test-workspace' },
388
- });
389
- expect(result.isError).toBeFalsy();
390
- const data = JSON.parse(result.content[0].text);
391
- expect(data.action).toBe('init');
392
- expect(data.status).toBe('created');
393
- expect(fs.existsSync(path.join(wsDir, '.agents-workspace'))).toBe(true);
394
- });
395
- it('discovers agents in a directory', async () => {
396
- const result = await client.callTool({
397
- name: 'ossa_workspace',
398
- arguments: { action: 'discover', directory: FIXTURE_DIR },
399
- });
400
- expect(result.isError).toBeFalsy();
401
- const data = JSON.parse(result.content[0].text);
402
- expect(data.action).toBe('discover');
403
- expect(data.count).toBeGreaterThanOrEqual(1);
404
- expect(data.agents).toBeInstanceOf(Array);
405
- expect(data.agents[0].name).toBeDefined();
406
- });
407
- it('shows workspace status', async () => {
408
- const wsDir = path.join(tmpDir, 'ws-test');
409
- const result = await client.callTool({
410
- name: 'ossa_workspace',
411
- arguments: { action: 'status', directory: wsDir },
412
- });
413
- expect(result.isError).toBeFalsy();
414
- const data = JSON.parse(result.content[0].text);
415
- expect(data.action).toBe('status');
416
- expect(data.initialized).toBe(true);
417
- });
418
- });
419
- describe('ossa_diff', () => {
420
- it('compares two manifests and detects differences', async () => {
421
- // Create two slightly different manifests for comparison
422
- const dirA = path.join(tmpDir, 'diff-a');
423
- const dirB = path.join(tmpDir, 'diff-b');
424
- fs.mkdirSync(dirA, { recursive: true });
425
- fs.mkdirSync(dirB, { recursive: true });
426
- fs.writeFileSync(path.join(dirA, 'manifest.ossa.yaml'), `apiVersion: ossa/v0.4\nkind: Agent\nmetadata:\n name: agent-a\n version: 1.0.0\nspec:\n role: Agent A\n tools:\n - name: tool-one\n`);
427
- fs.writeFileSync(path.join(dirB, 'manifest.ossa.yaml'), `apiVersion: ossa/v0.4\nkind: Agent\nmetadata:\n name: agent-b\n version: 2.0.0\nspec:\n role: Agent B\n tools:\n - name: tool-two\n`);
428
- const result = await client.callTool({
429
- name: 'ossa_diff',
430
- arguments: {
431
- path_a: path.join(dirA, 'manifest.ossa.yaml'),
432
- path_b: path.join(dirB, 'manifest.ossa.yaml'),
433
- },
434
- });
435
- expect(result.isError).toBeFalsy();
436
- const data = JSON.parse(result.content[0].text);
437
- expect(data.total_changes).toBeGreaterThanOrEqual(1);
438
- expect(data.changes).toBeInstanceOf(Array);
439
- expect(data.breaking_changes).toBeInstanceOf(Array);
440
- expect(data.breaking_changes.length).toBeGreaterThan(0); // name changed = breaking
441
- expect(typeof data.compatible).toBe('boolean');
442
- expect(data.compatible).toBe(false); // name changed
443
- });
444
- });
445
- describe('ossa_migrate', () => {
446
- it('migrates a manifest to v0.4', async () => {
447
- const manifestPath = path.join(tmpDir, 'test-agent/manifest.ossa.yaml');
448
- const result = await client.callTool({
449
- name: 'ossa_migrate',
450
- arguments: { path: manifestPath, target_version: 'ossa/v0.4' },
451
- });
452
- expect(result.isError).toBeFalsy();
453
- const data = JSON.parse(result.content[0].text);
454
- expect(data.migrated).toBeDefined();
455
- });
456
- it('writes migrated manifest to output dir', async () => {
457
- const manifestPath = path.join(tmpDir, 'test-agent/manifest.ossa.yaml');
458
- const outDir = path.join(tmpDir, 'migrate-output');
459
- const result = await client.callTool({
460
- name: 'ossa_migrate',
461
- arguments: { path: manifestPath, output_dir: outDir },
462
- });
463
- expect(result.isError).toBeFalsy();
464
- const data = JSON.parse(result.content[0].text);
465
- if (data.written_to) {
466
- expect(fs.existsSync(data.written_to)).toBe(true);
467
- }
468
- });
469
- });
470
- describe('MCP resources', () => {
471
- it('lists all OSSA resources', async () => {
472
- const resources = await client.listResources();
473
- expect(resources.resources.length).toBeGreaterThanOrEqual(5);
474
- const uris = resources.resources.map((r) => r.uri);
475
- expect(uris).toContain('ossa://schema/v0.4/agent');
476
- expect(uris).toContain('ossa://template/minimal');
477
- expect(uris).toContain('ossa://template/full');
478
- expect(uris).toContain('ossa://guide/mcp-ossa-a2a');
479
- expect(uris).toContain('ossa://platforms/supported');
480
- });
481
- it('reads minimal template', async () => {
482
- const result = await client.readResource({
483
- uri: 'ossa://template/minimal',
484
- });
485
- expect(result.contents.length).toBe(1);
486
- expect(result.contents[0].text).toContain('apiVersion: ossa/v0.4');
487
- expect(result.contents[0].text).toContain('kind: Agent');
488
- });
489
- it('reads full template with all sections', async () => {
490
- const result = await client.readResource({ uri: 'ossa://template/full' });
491
- expect(result.contents[0].text).toContain('spec:');
492
- expect(result.contents[0].text).toContain('tools:');
493
- expect(result.contents[0].text).toContain('autonomy:');
494
- expect(result.contents[0].text).toContain('extensions:');
495
- expect(result.contents[0].text).toContain('token_efficiency:');
496
- });
497
- it('reads MCP→OSSA→A2A guide', async () => {
498
- const result = await client.readResource({
499
- uri: 'ossa://guide/mcp-ossa-a2a',
500
- });
501
- expect(result.contents[0].text).toContain('MCP');
502
- expect(result.contents[0].text).toContain('OSSA');
503
- expect(result.contents[0].text).toContain('A2A');
504
- });
505
- it('reads supported platforms with SDK references', async () => {
506
- const result = await client.readResource({
507
- uri: 'ossa://platforms/supported',
508
- });
509
- const platforms = JSON.parse(result.contents[0].text);
510
- expect(platforms.total).toBeGreaterThanOrEqual(14);
511
- expect(platforms.platforms).toBeInstanceOf(Array);
512
- const openai = platforms.platforms.find((p) => p.id === 'openai');
513
- expect(openai.sdk.npm).toBe('openai');
514
- expect(openai.sdk.pip).toBe('openai');
515
- });
516
- });
517
- describe('MCP prompts', () => {
518
- it('lists all prompts', async () => {
519
- const prompts = await client.listPrompts();
520
- expect(prompts.prompts.length).toBeGreaterThanOrEqual(4);
521
- const names = prompts.prompts.map((p) => p.name);
522
- expect(names).toContain('create-agent');
523
- expect(names).toContain('convert-for-platform');
524
- expect(names).toContain('explain-manifest');
525
- expect(names).toContain('what-is-ossa');
526
- });
527
- it('gets create-agent prompt', async () => {
528
- const result = await client.getPrompt({
529
- name: 'create-agent',
530
- arguments: { description: 'a code review bot' },
531
- });
532
- expect(result.messages.length).toBeGreaterThanOrEqual(1);
533
- expect(JSON.stringify(result.messages[0].content)).toContain('code review bot');
534
- });
535
- it('gets what-is-ossa prompt', async () => {
536
- const result = await client.getPrompt({ name: 'what-is-ossa' });
537
- expect(result.messages.length).toBeGreaterThanOrEqual(1);
538
- expect(JSON.stringify(result.messages[0].content)).toContain('OSSA');
539
- });
540
- });
541
- describe('error handling', () => {
542
- it('returns error for unknown tool', async () => {
543
- const result = await client.callTool({
544
- name: 'ossa_nonexistent',
545
- arguments: {},
546
- });
547
- expect(result.isError).toBe(true);
548
- });
549
- it('returns error for missing required arguments', async () => {
550
- const result = await client.callTool({
551
- name: 'ossa_validate',
552
- arguments: {},
553
- });
554
- expect(result.isError).toBe(true);
555
- });
556
- });
557
- //# sourceMappingURL=mcp-server.spec.js.map
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for OSSA Error Codes
3
- */
4
- export {};
5
- //# sourceMappingURL=error-codes.test.d.ts.map