@bluefly/openstandardagents 0.5.0 → 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 (170) hide show
  1. package/.version.json +3 -3
  2. package/CHANGELOG.md +43 -12
  3. package/README.md +31 -26
  4. package/bin/postinstall +0 -0
  5. package/dist/.version.json +3 -3
  6. package/dist/adapters/a2a/a2a-protocol.js +4 -2
  7. package/dist/adapters/a2a/a2a-tool.js +4 -2
  8. package/dist/adapters/a2a/mcp-integration.d.ts +2 -1
  9. package/dist/adapters/a2a/mcp-integration.js +6 -3
  10. package/dist/adapters/browser/browser-exporter.d.ts +26 -0
  11. package/dist/adapters/browser/browser-exporter.js +73 -0
  12. package/dist/adapters/browser/browser-runner.d.ts +23 -0
  13. package/dist/adapters/browser/browser-runner.js +46 -0
  14. package/dist/adapters/browser/index.d.ts +9 -0
  15. package/dist/adapters/browser/index.js +9 -0
  16. package/dist/adapters/docker/index.d.ts +2 -0
  17. package/dist/adapters/docker/index.js +2 -0
  18. package/dist/adapters/docker/openclaw-bridge.d.ts +57 -0
  19. package/dist/adapters/docker/openclaw-bridge.js +173 -0
  20. package/dist/adapters/drupal/index.d.ts +1 -0
  21. package/dist/adapters/drupal/index.js +2 -0
  22. package/dist/adapters/drupal/twig-renderer.d.ts +23 -0
  23. package/dist/adapters/drupal/twig-renderer.js +99 -0
  24. package/dist/adapters/gitlab/agent-generator.js +2 -1
  25. package/dist/api/index.js +2 -1
  26. package/dist/api/routes/mcp.router.js +3 -1
  27. package/dist/api/routes/wizard.router.js +3 -1
  28. package/dist/cli/commands/agent/discover-type.command.js +1 -1
  29. package/dist/cli/commands/agent-card.command.js +37 -10
  30. package/dist/cli/commands/agents-sync.command.d.ts +2 -2
  31. package/dist/cli/commands/agents-sync.command.js +27 -17
  32. package/dist/cli/commands/catalog/config.js +1 -1
  33. package/dist/cli/commands/catalog/validate.command.js +2 -2
  34. package/dist/cli/commands/config.command.js +2 -2
  35. package/dist/cli/commands/daemon.command.js +32 -8
  36. package/dist/cli/commands/discover.d.ts +1 -1
  37. package/dist/cli/commands/discover.js +16 -8
  38. package/dist/cli/commands/economics.command.d.ts +9 -0
  39. package/dist/cli/commands/economics.command.js +113 -0
  40. package/dist/cli/commands/export.command.js +6 -3
  41. package/dist/cli/commands/mcp.command.js +3 -1
  42. package/dist/cli/commands/memory.command.d.ts +18 -0
  43. package/dist/cli/commands/memory.command.js +168 -0
  44. package/dist/cli/commands/publish.command.js +7 -4
  45. package/dist/cli/commands/serve-builder-routes.js +1 -1
  46. package/dist/cli/commands/usie-skills.command.d.ts +24 -0
  47. package/dist/cli/commands/usie-skills.command.js +297 -0
  48. package/dist/cli/commands/validate.command.js +8 -1
  49. package/dist/cli/commands/verify.d.ts +3 -3
  50. package/dist/cli/commands/verify.js +12 -6
  51. package/dist/cli/commands/workspace.command.d.ts +1 -0
  52. package/dist/cli/commands/workspace.command.js +28 -4
  53. package/dist/cli/index.js +12 -0
  54. package/dist/cli/workspace-validate.d.ts +23 -0
  55. package/dist/cli/workspace-validate.js +117 -0
  56. package/dist/data/platform-matrix.js +1 -4
  57. package/dist/generated/types.d.ts +97 -97
  58. package/dist/index.d.ts +2 -0
  59. package/dist/index.js +2 -0
  60. package/dist/mcp-server/index.js +658 -982
  61. package/dist/mesh/discovery-gkg.d.ts +26 -0
  62. package/dist/mesh/discovery-gkg.js +92 -0
  63. package/dist/messenger/Handler/AgentBatchHandler.js +3 -2
  64. package/dist/messenger/Handler/AgentExecutionHandler.js +6 -1
  65. package/dist/package.json +20 -4
  66. package/dist/sdks/shared/types.d.ts +1 -1
  67. package/dist/services/agent-card-generator.js +6 -2
  68. package/dist/services/daemon/audit-log.service.js +3 -1
  69. package/dist/services/daemon/execution.service.js +8 -4
  70. package/dist/services/daemon/fs-watcher.service.js +6 -7
  71. package/dist/services/daemon/pairing.service.js +2 -1
  72. package/dist/services/daemon/skill-aggregator.service.js +105 -21
  73. package/dist/services/daemon/sse-endpoints.js +1 -1
  74. package/dist/services/daemon/ws-server.js +10 -3
  75. package/dist/services/governance/cedar-provider.js +12 -8
  76. package/dist/services/governance/cedar-validator.service.js +1 -1
  77. package/dist/services/mcp/bridge.service.js +40 -9
  78. package/dist/services/openapi-extensions-validation.d.ts +20 -0
  79. package/dist/services/openapi-extensions-validation.js +193 -0
  80. package/dist/services/release-automation/merge-request.service.d.ts +4 -4
  81. package/dist/services/release-automation/release-buttons.js +3 -3
  82. package/dist/services/release-automation/schemas/release.schema.d.ts +3 -3
  83. package/dist/services/runtime/openai.adapter.d.ts +46 -13
  84. package/dist/services/runtime/openai.adapter.js +169 -131
  85. package/dist/services/skill-registry.service.d.ts +1 -1
  86. package/dist/services/skills-pipeline/skills-research.service.js +47 -7
  87. package/dist/services/trust/trust.service.js +6 -4
  88. package/dist/services/validation-zod.service.js +3 -22
  89. package/dist/services/validators/index.d.ts +1 -0
  90. package/dist/services/validators/index.js +1 -0
  91. package/dist/services/validators/registry.d.ts +21 -0
  92. package/dist/services/validators/registry.js +42 -0
  93. package/dist/skills/test-skill/package.json +1 -1
  94. package/dist/spec/extensions/cognition.schema.json +87 -0
  95. package/dist/spec/layer4-economics/duadp-examples.json +44 -0
  96. package/dist/spec/v0.4/agent.schema.json +14 -0
  97. package/dist/spec/v0.5/agent-builder-openapi.yaml +230 -0
  98. package/dist/spec/v0.5/agent.schema.json +32 -1
  99. package/dist/spec/v0.5/extensions/cognition/cognition.schema.json +78 -1
  100. package/dist/spec/v0.5/extensions/economics/context-pack.schema.json +91 -0
  101. package/dist/spec/v0.5/extensions/economics/execution-profile.schema.json +148 -0
  102. package/dist/spec/v0.5/extensions/economics/failure-semantics.schema.json +32 -0
  103. package/dist/spec/v0.5/extensions/economics/replay-packet.schema.json +120 -0
  104. package/dist/spec/v0.5/extensions/mcp/README.md +1 -1
  105. package/dist/spec/v0.5/memory-hierarchy.yaml +120 -0
  106. package/dist/spec/v1/agent-card.schema.json +254 -0
  107. package/dist/types/cognition.zod.d.ts +312 -0
  108. package/dist/types/cognition.zod.js +223 -0
  109. package/dist/types/identity.zod.d.ts +5 -5
  110. package/dist/types/index.d.ts +53 -7
  111. package/dist/types/index.js +4 -2
  112. package/dist/types/personality.zod.d.ts +3 -3
  113. package/dist/utils/http-client.d.ts +22 -0
  114. package/dist/utils/http-client.js +51 -0
  115. package/dist/utils/index.d.ts +3 -0
  116. package/dist/utils/index.js +3 -0
  117. package/dist/utils/proxy-resolver.d.ts +36 -0
  118. package/dist/utils/proxy-resolver.js +59 -0
  119. package/dist/utils/user-agent.d.ts +11 -0
  120. package/dist/utils/user-agent.js +17 -0
  121. package/dist/validation/version-compliance.js +1 -1
  122. package/examples/agentscope/react-assistant/README.md +1 -1
  123. package/examples/agentscope/react-assistant/agent.ossa.yaml +1 -1
  124. package/examples/drupal/drupal-contributor-agent/.eslintrc.json +58 -0
  125. package/examples/drupal/drupal-contributor-agent/.prettierrc.json +10 -0
  126. package/examples/drupal/drupal-contributor-agent/package.json +55 -0
  127. package/examples/drupal/drupal-contributor-agent/src/core/index.ts +10 -0
  128. package/examples/drupal/drupal-contributor-agent/src/index.ts +17 -0
  129. package/examples/drupal/drupal-contributor-agent/src/types/index.ts +180 -0
  130. package/examples/drupal/drupal-contributor-agent/tsconfig.json +36 -0
  131. package/examples/getting-started/01-minimal-agent.ossa.yaml +1 -1
  132. package/examples/getting-started/02-agent-with-tools.ossa.yaml +1 -1
  133. package/examples/getting-started/03-agent-with-safety.ossa.yaml +1 -1
  134. package/examples/getting-started/04-agent-with-messaging.ossa.yaml +1 -1
  135. package/examples/getting-started/05-workflow-composition.ossa.yaml +1 -1
  136. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  137. package/examples/reference-implementations/python-client/examples/basic_usage.py +0 -0
  138. package/examples/reference-implementations/python-client/examples/publish_agent.py +0 -0
  139. package/openapi/agent-cognition-sessions.yaml +580 -0
  140. package/openapi/agent-crud.yaml +20 -20
  141. package/openapi/core/ossa-registry-api.openapi.yaml +1 -1
  142. package/openapi/ossa-cli-enhancements.openapi.yaml +1 -1
  143. package/openapi/release-automation.openapi.yaml +1 -1
  144. package/openapi/schemas/common/economics.yaml +98 -0
  145. package/openapi/uadp-asyncapi.yaml +1 -1
  146. package/openapi/uadp-openapi.yaml +2 -2
  147. package/package.json +114 -96
  148. package/spec/extensions/cognition.schema.json +87 -0
  149. package/spec/layer4-economics/duadp-examples.json +44 -0
  150. package/spec/v0.4/agent.schema.json +14 -0
  151. package/spec/v0.5/agent-builder-openapi.yaml +230 -0
  152. package/spec/v0.5/agent.schema.json +32 -1
  153. package/spec/v0.5/extensions/cognition/cognition.schema.json +78 -1
  154. package/spec/v0.5/extensions/economics/context-pack.schema.json +91 -0
  155. package/spec/v0.5/extensions/economics/execution-profile.schema.json +148 -0
  156. package/spec/v0.5/extensions/economics/failure-semantics.schema.json +32 -0
  157. package/spec/v0.5/extensions/economics/replay-packet.schema.json +120 -0
  158. package/spec/v0.5/extensions/mcp/README.md +1 -1
  159. package/spec/v0.5/memory-hierarchy.yaml +120 -0
  160. package/spec/v1/agent-card.schema.json +254 -0
  161. package/dist/adapters/a2a/__tests__/mcp-integration.spec.d.ts +0 -5
  162. package/dist/adapters/a2a/__tests__/mcp-integration.spec.js +0 -268
  163. package/dist/adapters/a2a/__tests__/mcp-transport.spec.d.ts +0 -5
  164. package/dist/adapters/a2a/__tests__/mcp-transport.spec.js +0 -203
  165. package/dist/mcp-server/__tests__/mcp-server.spec.d.ts +0 -8
  166. package/dist/mcp-server/__tests__/mcp-server.spec.js +0 -566
  167. package/dist/validation/__tests__/error-codes.test.d.ts +0 -5
  168. package/dist/validation/__tests__/error-codes.test.js +0 -252
  169. package/dist/version-management/core/version-manager.test.d.ts +0 -2
  170. package/dist/version-management/core/version-manager.test.js +0 -210
@@ -1,252 +0,0 @@
1
- /**
2
- * Tests for OSSA Error Codes
3
- */
4
- import { OSSAErrorCode, ERROR_CATALOG, getErrorDetails, searchErrorsByTag, searchErrorsBySeverity, getAllErrorCodes, getErrorCountBySeverity, } from '../error-codes';
5
- describe('Error Codes', () => {
6
- describe('OSSAErrorCode enum', () => {
7
- it('should have 101 error codes', () => {
8
- const codes = Object.values(OSSAErrorCode);
9
- expect(codes.length).toBe(101);
10
- });
11
- it('should have correct format (OSSA-XXX)', () => {
12
- const codes = Object.values(OSSAErrorCode);
13
- codes.forEach((code) => {
14
- expect(code).toMatch(/^OSSA-\d{3}$/);
15
- });
16
- });
17
- it('should have sequential codes', () => {
18
- expect(OSSAErrorCode.OSSA_001).toBe('OSSA-001');
19
- expect(OSSAErrorCode.OSSA_100).toBe('OSSA-100');
20
- expect(OSSAErrorCode.OSSA_200).toBe('OSSA-200');
21
- expect(OSSAErrorCode.OSSA_906).toBe('OSSA-906');
22
- });
23
- });
24
- describe('ERROR_CATALOG', () => {
25
- it('should have entry for every error code', () => {
26
- const codes = Object.values(OSSAErrorCode);
27
- codes.forEach((code) => {
28
- expect(ERROR_CATALOG[code]).toBeDefined();
29
- expect(ERROR_CATALOG[code].code).toBe(code);
30
- });
31
- });
32
- it('should have required fields for all errors', () => {
33
- Object.values(ERROR_CATALOG).forEach((error) => {
34
- expect(error.code).toBeDefined();
35
- expect(error.severity).toMatch(/^(error|warning|info)$/);
36
- expect(error.message).toBeDefined();
37
- expect(error.remediation).toBeDefined();
38
- expect(error.docsUrl).toBeDefined();
39
- expect(error.docsUrl).toContain('openstandardagents.org');
40
- });
41
- });
42
- it('should have tags for all errors', () => {
43
- Object.values(ERROR_CATALOG).forEach((error) => {
44
- expect(error.tags).toBeDefined();
45
- expect(Array.isArray(error.tags)).toBe(true);
46
- expect(error.tags.length).toBeGreaterThan(0);
47
- });
48
- });
49
- });
50
- describe('getErrorDetails', () => {
51
- it('should return error details for valid code', () => {
52
- const details = getErrorDetails(OSSAErrorCode.OSSA_001);
53
- expect(details).toBeDefined();
54
- expect(details.code).toBe(OSSAErrorCode.OSSA_001);
55
- expect(details.message).toBe('Missing required field');
56
- expect(details.severity).toBe('error');
57
- });
58
- it('should return undefined for invalid code', () => {
59
- const details = getErrorDetails('INVALID');
60
- expect(details).toBeUndefined();
61
- });
62
- });
63
- describe('searchErrorsByTag', () => {
64
- it('should find errors by tag', () => {
65
- const didErrors = searchErrorsByTag('did');
66
- expect(didErrors.length).toBeGreaterThan(0);
67
- didErrors.forEach((error) => {
68
- expect(error.tags).toContain('did');
69
- });
70
- });
71
- it('should find schema errors', () => {
72
- const schemaErrors = searchErrorsByTag('schema');
73
- expect(schemaErrors.length).toBeGreaterThan(0);
74
- });
75
- it('should find genetics errors', () => {
76
- const geneticsErrors = searchErrorsByTag('genetics');
77
- expect(geneticsErrors.length).toBeGreaterThan(0);
78
- });
79
- it('should return empty array for non-existent tag', () => {
80
- const errors = searchErrorsByTag('non-existent-tag');
81
- expect(errors.length).toBe(0);
82
- });
83
- });
84
- describe('searchErrorsBySeverity', () => {
85
- it('should find all errors', () => {
86
- const errors = searchErrorsBySeverity('error');
87
- expect(errors.length).toBeGreaterThan(0);
88
- errors.forEach((error) => {
89
- expect(error.severity).toBe('error');
90
- });
91
- });
92
- it('should find all warnings', () => {
93
- const warnings = searchErrorsBySeverity('warning');
94
- expect(warnings.length).toBeGreaterThan(0);
95
- warnings.forEach((warning) => {
96
- expect(warning.severity).toBe('warning');
97
- });
98
- });
99
- it('should find all info', () => {
100
- const info = searchErrorsBySeverity('info');
101
- expect(info.length).toBeGreaterThan(0);
102
- info.forEach((infoItem) => {
103
- expect(infoItem.severity).toBe('info');
104
- });
105
- });
106
- });
107
- describe('getAllErrorCodes', () => {
108
- it('should return all error codes', () => {
109
- const codes = getAllErrorCodes();
110
- expect(codes.length).toBe(101);
111
- expect(codes).toContain(OSSAErrorCode.OSSA_001);
112
- expect(codes).toContain(OSSAErrorCode.OSSA_906);
113
- });
114
- });
115
- describe('getErrorCountBySeverity', () => {
116
- it('should count errors by severity', () => {
117
- const counts = getErrorCountBySeverity();
118
- expect(counts.error).toBeGreaterThan(0);
119
- expect(counts.warning).toBeGreaterThan(0);
120
- expect(counts.info).toBeGreaterThan(0);
121
- expect(counts.error + counts.warning + counts.info).toBe(101);
122
- });
123
- it('should have approximately 70% errors', () => {
124
- const counts = getErrorCountBySeverity();
125
- const errorPercentage = (counts.error / 101) * 100;
126
- expect(errorPercentage).toBeGreaterThan(60);
127
- expect(errorPercentage).toBeLessThan(80);
128
- });
129
- });
130
- describe('Category Coverage', () => {
131
- it('should have schema validation errors (001-099)', () => {
132
- const schemaErrors = [
133
- OSSAErrorCode.OSSA_001,
134
- OSSAErrorCode.OSSA_010,
135
- OSSAErrorCode.OSSA_015,
136
- ];
137
- schemaErrors.forEach((code) => {
138
- expect(ERROR_CATALOG[code]).toBeDefined();
139
- });
140
- });
141
- it('should have identity errors (100-199)', () => {
142
- const identityErrors = [
143
- OSSAErrorCode.OSSA_100,
144
- OSSAErrorCode.OSSA_110,
145
- OSSAErrorCode.OSSA_112,
146
- ];
147
- identityErrors.forEach((code) => {
148
- expect(ERROR_CATALOG[code]).toBeDefined();
149
- });
150
- });
151
- it('should have genetics errors (200-299)', () => {
152
- const geneticsErrors = [
153
- OSSAErrorCode.OSSA_200,
154
- OSSAErrorCode.OSSA_210,
155
- OSSAErrorCode.OSSA_212,
156
- ];
157
- geneticsErrors.forEach((code) => {
158
- expect(ERROR_CATALOG[code]).toBeDefined();
159
- });
160
- });
161
- it('should have lifecycle errors (300-399)', () => {
162
- const lifecycleErrors = [
163
- OSSAErrorCode.OSSA_300,
164
- OSSAErrorCode.OSSA_310,
165
- OSSAErrorCode.OSSA_311,
166
- ];
167
- lifecycleErrors.forEach((code) => {
168
- expect(ERROR_CATALOG[code]).toBeDefined();
169
- });
170
- });
171
- it('should have economics errors (400-499)', () => {
172
- const economicsErrors = [
173
- OSSAErrorCode.OSSA_400,
174
- OSSAErrorCode.OSSA_410,
175
- OSSAErrorCode.OSSA_411,
176
- ];
177
- economicsErrors.forEach((code) => {
178
- expect(ERROR_CATALOG[code]).toBeDefined();
179
- });
180
- });
181
- it('should have taxonomy errors (500-599)', () => {
182
- const taxonomyErrors = [
183
- OSSAErrorCode.OSSA_500,
184
- OSSAErrorCode.OSSA_505,
185
- OSSAErrorCode.OSSA_508,
186
- ];
187
- taxonomyErrors.forEach((code) => {
188
- expect(ERROR_CATALOG[code]).toBeDefined();
189
- });
190
- });
191
- it('should have access control errors (600-699)', () => {
192
- const accessErrors = [
193
- OSSAErrorCode.OSSA_600,
194
- OSSAErrorCode.OSSA_610,
195
- OSSAErrorCode.OSSA_614,
196
- ];
197
- accessErrors.forEach((code) => {
198
- expect(ERROR_CATALOG[code]).toBeDefined();
199
- });
200
- });
201
- it('should have revolutionary features errors (700-799)', () => {
202
- const revolutionaryErrors = [
203
- OSSAErrorCode.OSSA_700,
204
- OSSAErrorCode.OSSA_705,
205
- OSSAErrorCode.OSSA_706,
206
- ];
207
- revolutionaryErrors.forEach((code) => {
208
- expect(ERROR_CATALOG[code]).toBeDefined();
209
- });
210
- });
211
- it('should have naming errors (800-899)', () => {
212
- const namingErrors = [
213
- OSSAErrorCode.OSSA_800,
214
- OSSAErrorCode.OSSA_805,
215
- OSSAErrorCode.OSSA_806,
216
- ];
217
- namingErrors.forEach((code) => {
218
- expect(ERROR_CATALOG[code]).toBeDefined();
219
- });
220
- });
221
- it('should have catalog errors (900-999)', () => {
222
- const catalogErrors = [
223
- OSSAErrorCode.OSSA_900,
224
- OSSAErrorCode.OSSA_905,
225
- OSSAErrorCode.OSSA_906,
226
- ];
227
- catalogErrors.forEach((code) => {
228
- expect(ERROR_CATALOG[code]).toBeDefined();
229
- });
230
- });
231
- });
232
- describe('Error Examples', () => {
233
- it('should have examples for OSSA-001', () => {
234
- const details = getErrorDetails(OSSAErrorCode.OSSA_001);
235
- expect(details.examples).toBeDefined();
236
- expect(details.examples.length).toBeGreaterThan(0);
237
- expect(details.examples[0].invalid).toBeDefined();
238
- expect(details.examples[0].valid).toBeDefined();
239
- });
240
- it('should have examples for OSSA-010', () => {
241
- const details = getErrorDetails(OSSAErrorCode.OSSA_010);
242
- expect(details.examples).toBeDefined();
243
- expect(details.examples.length).toBeGreaterThan(0);
244
- });
245
- it('should have examples for OSSA-100', () => {
246
- const details = getErrorDetails(OSSAErrorCode.OSSA_100);
247
- expect(details.examples).toBeDefined();
248
- expect(details.examples.length).toBeGreaterThan(0);
249
- });
250
- });
251
- });
252
- //# sourceMappingURL=error-codes.test.js.map
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=version-manager.test.d.ts.map
@@ -1,210 +0,0 @@
1
- import { VersionManager } from './version-manager';
2
- import * as fs from 'fs/promises';
3
- import * as path from 'path';
4
- import * as os from 'os';
5
- describe('VersionManager', () => {
6
- let versionManager;
7
- let tempDir;
8
- beforeEach(async () => {
9
- versionManager = new VersionManager();
10
- tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ossa-version-test-'));
11
- });
12
- afterEach(async () => {
13
- await fs.rm(tempDir, { recursive: true, force: true });
14
- });
15
- describe('validate', () => {
16
- it('should validate correct semantic versions', () => {
17
- const testCases = [
18
- '0.4.2',
19
- 'v0.4.2',
20
- '1.2.3',
21
- '1.2.3-alpha.1',
22
- '2.0.0-rc.1+build.123',
23
- ];
24
- testCases.forEach((version) => {
25
- const result = versionManager.validate(version);
26
- expect(result.valid).toBe(true);
27
- expect(result.success).toBe(true);
28
- expect(result.parsed).toBeDefined();
29
- });
30
- });
31
- it('should reject invalid semantic versions', () => {
32
- const testCases = ['0.4', '1.2.3.4', 'latest', 'v1', 'invalid'];
33
- testCases.forEach((version) => {
34
- const result = versionManager.validate(version);
35
- expect(result.valid).toBe(false);
36
- expect(result.errors).toBeDefined();
37
- });
38
- });
39
- it('should parse version components correctly', () => {
40
- const result = versionManager.validate('1.2.3-alpha.1');
41
- expect(result.valid).toBe(true);
42
- expect(result.parsed).toEqual({
43
- major: 1,
44
- minor: 2,
45
- patch: 3,
46
- prerelease: 'alpha.1',
47
- build: undefined,
48
- });
49
- });
50
- });
51
- describe('bump', () => {
52
- it('should bump major version', () => {
53
- const result = versionManager.bump('0.4.2', 'major');
54
- expect(result.success).toBe(true);
55
- expect(result.oldVersion).toBe('0.4.2');
56
- expect(result.newVersion).toBe('1.0.0');
57
- expect(result.bumpType).toBe('major');
58
- });
59
- it('should bump minor version', () => {
60
- const result = versionManager.bump('0.4.2', 'minor');
61
- expect(result.success).toBe(true);
62
- expect(result.newVersion).toBe('0.5.0');
63
- });
64
- it('should bump patch version', () => {
65
- const result = versionManager.bump('0.4.2', 'patch');
66
- expect(result.success).toBe(true);
67
- expect(result.newVersion).toBe('0.4.3');
68
- });
69
- it('should bump to prerelease', () => {
70
- const result = versionManager.bump('0.4.2', 'prerelease', 'alpha');
71
- expect(result.success).toBe(true);
72
- expect(result.newVersion).toBe('0.4.3-alpha.0');
73
- });
74
- it('should handle versions with v prefix', () => {
75
- const result = versionManager.bump('v0.4.2', 'patch');
76
- expect(result.success).toBe(true);
77
- expect(result.oldVersion).toBe('0.4.2');
78
- expect(result.newVersion).toBe('0.4.3');
79
- });
80
- });
81
- describe('substitute', () => {
82
- it('should replace placeholders in files', async () => {
83
- // Create test files
84
- const testFile1 = path.join(tempDir, 'test1.md');
85
- const testFile2 = path.join(tempDir, 'test2.json');
86
- await fs.writeFile(testFile1, '# Version {{VERSION}}\n\nThis is version {{VERSION}} of the project.');
87
- await fs.writeFile(testFile2, JSON.stringify({
88
- apiVersion: 'ossa/v{{VERSION}}',
89
- version: '{{VERSION}}',
90
- }));
91
- const result = await versionManager.substitute({
92
- version: '0.4.2',
93
- paths: ['**/*.md', '**/*.json'],
94
- cwd: tempDir,
95
- });
96
- expect(result.success).toBe(true);
97
- expect(result.versionUsed).toBe('v0.4.2');
98
- expect(result.filesProcessed).toBe(2);
99
- expect(result.replacementsMade).toBe(4);
100
- // Verify file contents
101
- const content1 = await fs.readFile(testFile1, 'utf-8');
102
- expect(content1).toContain('# Version v0.4.2');
103
- expect(content1).toContain('This is version v0.4.2 of the project.');
104
- const content2 = await fs.readFile(testFile2, 'utf-8');
105
- const json = JSON.parse(content2);
106
- expect(json.apiVersion).toBe('ossa/vv0.4.2');
107
- expect(json.version).toBe('v0.4.2');
108
- });
109
- it('should support dry run mode', async () => {
110
- const testFile = path.join(tempDir, 'test.md');
111
- await fs.writeFile(testFile, '# Version {{VERSION}}');
112
- const result = await versionManager.substitute({
113
- version: '0.4.2',
114
- paths: ['**/*.md'],
115
- cwd: tempDir,
116
- dryRun: true,
117
- });
118
- expect(result.success).toBe(true);
119
- expect(result.dryRun).toBe(true);
120
- expect(result.replacementsMade).toBe(1);
121
- // Verify file was NOT modified
122
- const content = await fs.readFile(testFile, 'utf-8');
123
- expect(content).toBe('# Version {{VERSION}}');
124
- });
125
- it('should handle custom placeholders', async () => {
126
- const testFile = path.join(tempDir, 'test.md');
127
- await fs.writeFile(testFile, '# Version $VERSION');
128
- const result = await versionManager.substitute({
129
- version: '0.4.2',
130
- paths: ['**/*.md'],
131
- cwd: tempDir,
132
- placeholder: '$VERSION',
133
- });
134
- expect(result.success).toBe(true);
135
- expect(result.replacementsMade).toBe(1);
136
- const content = await fs.readFile(testFile, 'utf-8');
137
- expect(content).toBe('# Version v0.4.2');
138
- });
139
- it('should respect exclude patterns', async () => {
140
- // Create files
141
- const includedFile = path.join(tempDir, 'included.md');
142
- const excludedDir = path.join(tempDir, 'node_modules');
143
- await fs.mkdir(excludedDir);
144
- const excludedFile = path.join(excludedDir, 'excluded.md');
145
- await fs.writeFile(includedFile, '{{VERSION}}');
146
- await fs.writeFile(excludedFile, '{{VERSION}}');
147
- const result = await versionManager.substitute({
148
- version: '0.4.2',
149
- paths: ['**/*.md'],
150
- exclude: ['node_modules/**'],
151
- cwd: tempDir,
152
- });
153
- expect(result.filesProcessed).toBe(1);
154
- expect(result.replacementsMade).toBe(1);
155
- // Verify excluded file was NOT modified
156
- const excludedContent = await fs.readFile(excludedFile, 'utf-8');
157
- expect(excludedContent).toBe('{{VERSION}}');
158
- });
159
- });
160
- describe('restore', () => {
161
- it('should restore specific version to placeholder', async () => {
162
- const testFile = path.join(tempDir, 'test.md');
163
- await fs.writeFile(testFile, '# Version v0.4.2\n\nThis is v0.4.2.');
164
- const result = await versionManager.restore({
165
- version: '0.4.2',
166
- paths: ['**/*.md'],
167
- cwd: tempDir,
168
- });
169
- expect(result.success).toBe(true);
170
- expect(result.replacementsMade).toBe(2);
171
- const content = await fs.readFile(testFile, 'utf-8');
172
- expect(content).toBe('# Version {{VERSION}}\n\nThis is {{VERSION}}.');
173
- });
174
- it('should restore all versions to placeholder', async () => {
175
- const testFile = path.join(tempDir, 'test.md');
176
- await fs.writeFile(testFile, 'v0.4.2, v0.4.1, v1.0.0, and even 2.3.4');
177
- const result = await versionManager.restore({
178
- restoreAll: true,
179
- paths: ['**/*.md'],
180
- cwd: tempDir,
181
- });
182
- expect(result.success).toBe(true);
183
- expect(result.replacementsMade).toBe(4);
184
- const content = await fs.readFile(testFile, 'utf-8');
185
- expect(content).toBe('{{VERSION}}, {{VERSION}}, {{VERSION}}, and even {{VERSION}}');
186
- });
187
- });
188
- describe('detect', () => {
189
- it('should detect version from package.json', async () => {
190
- const packageJson = path.join(tempDir, 'package.json');
191
- await fs.writeFile(packageJson, JSON.stringify({ name: 'test', version: '0.4.2' }));
192
- const result = await versionManager.detect({ directory: tempDir });
193
- expect(result.success).toBe(true);
194
- expect(result.version).toBe('0.4.2');
195
- expect(result.source).toBe('package_json');
196
- });
197
- it('should detect version from VERSION file', async () => {
198
- const versionFile = path.join(tempDir, 'VERSION');
199
- await fs.writeFile(versionFile, 'v0.4.2\n');
200
- const result = await versionManager.detect({ directory: tempDir });
201
- expect(result.success).toBe(true);
202
- expect(result.version).toBe('v0.4.2');
203
- expect(result.source).toBe('VERSION_file');
204
- });
205
- it('should throw error when no version found', async () => {
206
- await expect(versionManager.detect({ directory: tempDir })).rejects.toThrow('Could not detect version from any source');
207
- });
208
- });
209
- });
210
- //# sourceMappingURL=version-manager.test.js.map