@bluefly/openstandardagents 0.2.7 → 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 (277) hide show
  1. package/.devfile.yaml +1 -1
  2. package/.env.example +1 -1
  3. package/.version.json +2 -2
  4. package/.wiki-config.json +24 -0
  5. package/CHANGELOG.md +11 -18
  6. package/CODEOWNERS +75 -0
  7. package/CONTRIBUTING.md +1 -1
  8. package/README.md +171 -243
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/repositories/schema.repository.d.ts +6 -1
  14. package/dist/repositories/schema.repository.d.ts.map +1 -1
  15. package/dist/repositories/schema.repository.js +49 -27
  16. package/dist/repositories/schema.repository.js.map +1 -1
  17. package/dist/services/migration.service.d.ts +4 -3
  18. package/dist/services/migration.service.d.ts.map +1 -1
  19. package/dist/services/migration.service.js +11 -10
  20. package/dist/services/migration.service.js.map +1 -1
  21. package/dist/services/release-automation/release.service.js +1 -1
  22. package/dist/services/release-automation/release.service.js.map +1 -1
  23. package/dist/services/release-automation/schemas/release.schema.js +1 -1
  24. package/dist/services/runtime/claude/claude-adapter.js +1 -1
  25. package/dist/services/runtime/claude/claude-adapter.js.map +1 -1
  26. package/dist/spec/v0.2.8/CHANGELOG.md +401 -0
  27. package/dist/spec/v0.2.8/README.md +72 -0
  28. package/dist/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
  29. package/dist/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  30. package/dist/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
  31. package/{spec/v0.2.6-dev/ossa-0.2.5.schema.json → dist/spec/v0.2.8/ossa-0.2.8.schema.json} +1509 -52
  32. package/dist/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
  33. package/dist/types/index.d.ts +3 -2
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/utils/index.d.ts +6 -0
  36. package/dist/utils/index.d.ts.map +1 -0
  37. package/dist/utils/index.js +6 -0
  38. package/dist/utils/index.js.map +1 -0
  39. package/dist/utils/version.d.ts +68 -0
  40. package/dist/utils/version.d.ts.map +1 -0
  41. package/dist/utils/version.js +156 -0
  42. package/dist/utils/version.js.map +1 -0
  43. package/eslint-report.json +1 -0
  44. package/examples/adk-integration/code-review-workflow.yml +1 -1
  45. package/examples/adk-integration/customer-support.yml +1 -1
  46. package/examples/adk-integration/data-pipeline.yml +1 -1
  47. package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
  48. package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
  49. package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
  50. package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
  51. package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
  52. package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
  53. package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
  54. package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
  55. package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
  56. package/examples/anthropic/claude-assistant.ossa.json +1 -1
  57. package/examples/autogen/multi-agent.ossa.json +1 -1
  58. package/examples/claude-code/code-reviewer.ossa.yaml +78 -0
  59. package/examples/claude-code/ossa-validator.ossa.yaml +80 -0
  60. package/examples/common_npm/agent-router.ossa.yaml +1 -0
  61. package/examples/common_npm/agent-router.v0.2.2.ossa.yaml +1 -1
  62. package/examples/crewai/research-team.ossa.json +1 -1
  63. package/examples/cursor/code-review-agent.ossa.json +1 -1
  64. package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -0
  65. package/examples/drupal/gitlab-ml-recommender.v0.2.2.ossa.yaml +1 -1
  66. package/examples/extensions/drupal-v1.yml +1 -1
  67. package/examples/extensions/kagent-v1.yml +1 -1
  68. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  69. package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +4 -4
  70. package/examples/kagent/compliance-validator.ossa.yaml +1 -1
  71. package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
  72. package/examples/kagent/documentation-agent.ossa.yaml +1 -1
  73. package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -0
  74. package/examples/kagent/k8s-troubleshooter-v1.v0.2.2.ossa.yaml +1 -1
  75. package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
  76. package/examples/kagent/security-scanner.ossa.yaml +1 -1
  77. package/examples/langchain/chain-agent.ossa.json +1 -1
  78. package/examples/langflow/workflow-agent.ossa.json +1 -1
  79. package/examples/langgraph/state-machine-agent.ossa.json +1 -1
  80. package/examples/llamaindex/rag-agent.ossa.json +1 -1
  81. package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
  82. package/examples/multi-agent/README.md +74 -0
  83. package/examples/multi-agent/conditional-router.ossa.yaml +42 -0
  84. package/examples/multi-agent/parallel-execution.ossa.yaml +54 -0
  85. package/examples/multi-agent/sequential-pipeline.ossa.yaml +45 -0
  86. package/examples/openai/basic-agent.ossa.yaml +1 -1
  87. package/examples/openai/multi-tool-agent.ossa.json +1 -1
  88. package/examples/openai/swarm-agent.ossa.json +1 -1
  89. package/examples/production/document-analyzer-openai.yml +1 -1
  90. package/examples/quickstart/support-agent.ossa.yaml +1 -1
  91. package/examples/spec-examples/audit-agent.yml +1 -1
  92. package/examples/spec-examples/chat-agent.yml +1 -1
  93. package/examples/spec-examples/compliance-agent.yml +1 -1
  94. package/examples/spec-examples/monitoring-agent.yml +1 -1
  95. package/examples/spec-examples/workflow-agent.yml +1 -1
  96. package/examples/templates/ossa-compliance.yaml +1 -1
  97. package/examples/vercel/edge-agent.ossa.json +1 -1
  98. package/gl-code-quality-report.json +62 -0
  99. package/llms-ctx-full.txt +39 -0
  100. package/llms-ctx.txt +39 -0
  101. package/llms.txt +47 -0
  102. package/package.json +3 -2
  103. package/scripts/eslint-to-codequality.cjs +34 -0
  104. package/scripts/generate-llms-ctx.sh +17 -0
  105. package/scripts/generate-schema-docs.ts +31 -10
  106. package/scripts/sync-version.js +4 -12
  107. package/scripts/validate-schema.ts +2 -1
  108. package/spec/v0.2.8/CHANGELOG.md +401 -0
  109. package/spec/v0.2.8/README.md +72 -0
  110. package/spec/v0.2.8/migrations/v0.2.3-to-v0.2.4.md +599 -0
  111. package/spec/v0.2.8/migrations/v0.2.5-RC-to-v0.2.6.md +65 -0
  112. package/spec/v0.2.8/migrations/v0.2.6-to-v0.2.8.md +81 -0
  113. package/{dist/spec/v0.2.6-dev/ossa-0.2.5.schema.json → spec/v0.2.8/ossa-0.2.8.schema.json} +1509 -52
  114. package/spec/v0.2.8/ossa-0.2.8.yaml +581 -0
  115. package/test-results/junit.xml +299 -0
  116. package/bin/validate-ossa-0.2.5-RC.ts +0 -244
  117. package/dist/spec/v0.2.6-dev/ossa-0.2.6-dev.schema.json +0 -1696
  118. package/scripts/lib/exec.ts +0 -37
  119. package/scripts/lib/file-ops.ts +0 -58
  120. package/scripts/lib/version.ts +0 -83
  121. package/spec/v0.2.6-dev/ossa-0.2.6-dev.schema.json +0 -1696
  122. package/website/.lighthouserc.ts +0 -24
  123. package/website/.prettierrc +0 -10
  124. package/website/DESIGN_SYSTEM_IMPLEMENTATION.md +0 -445
  125. package/website/Dockerfile +0 -30
  126. package/website/app/about/page.tsx +0 -304
  127. package/website/app/blog/[slug]/page.tsx +0 -208
  128. package/website/app/blog/page.tsx +0 -249
  129. package/website/app/design-guide/page.tsx +0 -511
  130. package/website/app/docs/[[...slug]]/page.tsx +0 -847
  131. package/website/app/docs/core-concepts/project-structure/page.tsx +0 -349
  132. package/website/app/ecosystem/page.tsx +0 -410
  133. package/website/app/examples/page.tsx +0 -133
  134. package/website/app/globals.scss +0 -370
  135. package/website/app/layout.tsx +0 -106
  136. package/website/app/license/page.tsx +0 -183
  137. package/website/app/not-found.tsx +0 -18
  138. package/website/app/page.tsx +0 -686
  139. package/website/app/page.tsx.bak +0 -679
  140. package/website/app/page.tsx.bak2 +0 -649
  141. package/website/app/playground/page.tsx +0 -487
  142. package/website/app/robots.ts +0 -19
  143. package/website/app/rss.xml/route.ts +0 -74
  144. package/website/app/schema/page.tsx +0 -1001
  145. package/website/app/sitemap.ts +0 -56
  146. package/website/app/specification/page.tsx +0 -287
  147. package/website/components/InstallCommand.tsx +0 -96
  148. package/website/components/Logo.tsx +0 -97
  149. package/website/components/StructuredData.tsx +0 -65
  150. package/website/components/docs/DocsSearch.tsx +0 -104
  151. package/website/components/docs/DocsSidebar.tsx +0 -155
  152. package/website/components/docs/MarkdownContent.tsx +0 -401
  153. package/website/components/docs/VersionSelector.tsx +0 -105
  154. package/website/components/examples/ExamplesViewer.tsx +0 -293
  155. package/website/components/layout/Footer.tsx +0 -116
  156. package/website/components/layout/Header.tsx +0 -172
  157. package/website/components/schema/SchemaComponentsAccordion.tsx +0 -84
  158. package/website/components/schema/SchemaExplorer.tsx +0 -213
  159. package/website/components/ui/Badge.tsx +0 -82
  160. package/website/components/ui/Button.tsx +0 -116
  161. package/website/components/ui/Card.tsx +0 -167
  162. package/website/components/ui/Checkbox.tsx +0 -141
  163. package/website/components/ui/Input.tsx +0 -169
  164. package/website/components/ui/Radio.tsx +0 -141
  165. package/website/components/ui/Select.tsx +0 -182
  166. package/website/components/ui/Tag.tsx +0 -158
  167. package/website/components/ui/Textarea.tsx +0 -195
  168. package/website/components/ui/index.ts +0 -11
  169. package/website/content/blog/OpenAPI-AI-Agents-Standard.md +0 -285
  170. package/website/content/blog/Why-Formal-Standards-Matter-Now.md +0 -198
  171. package/website/content/blog/gitlab-kubernetes-agent-ecosystem.md +0 -286
  172. package/website/content/blog/introducing-ossa-framework.md +0 -328
  173. package/website/content/blog/ossa-production-results.md +0 -279
  174. package/website/content/blog/welcome-to-ossa.md +0 -43
  175. package/website/content/blog/why-ai-agents-need-open-standard.md +0 -98
  176. package/website/content/docs/00-home.md +0 -153
  177. package/website/content/docs/adapters/openai-adapter.md +0 -693
  178. package/website/content/docs/agents/catalog.md +0 -28
  179. package/website/content/docs/aiflow-framework-integration-with-ossa.md +0 -107
  180. package/website/content/docs/api-reference/index.md +0 -38
  181. package/website/content/docs/api-reference/ossa-core-api.md +0 -634
  182. package/website/content/docs/api-reference/ossa-registry-api.md +0 -515
  183. package/website/content/docs/api-reference/unified-agent-gateway.md +0 -599
  184. package/website/content/docs/architecture/execution-flow.md +0 -335
  185. package/website/content/docs/architecture/multi-agent-systems.md +0 -737
  186. package/website/content/docs/architecture/overview.md +0 -121
  187. package/website/content/docs/architecture/stack-integration.md +0 -461
  188. package/website/content/docs/changelog.md +0 -246
  189. package/website/content/docs/cli-reference/index.md +0 -111
  190. package/website/content/docs/cli-reference/ossa-agents.md +0 -70
  191. package/website/content/docs/cli-reference/ossa-export.md +0 -56
  192. package/website/content/docs/cli-reference/ossa-generate.md +0 -66
  193. package/website/content/docs/cli-reference/ossa-gitlab-agent.md +0 -57
  194. package/website/content/docs/cli-reference/ossa-import.md +0 -56
  195. package/website/content/docs/cli-reference/ossa-init.md +0 -57
  196. package/website/content/docs/cli-reference/ossa-migrate.md +0 -62
  197. package/website/content/docs/cli-reference/ossa-run.md +0 -66
  198. package/website/content/docs/cli-reference/ossa-schema.md +0 -57
  199. package/website/content/docs/cli-reference/ossa-setup.md +0 -57
  200. package/website/content/docs/cli-reference/ossa-validate.md +0 -66
  201. package/website/content/docs/configuration/index.md +0 -97
  202. package/website/content/docs/contributing.md +0 -599
  203. package/website/content/docs/deployment/github-mirroring.md +0 -924
  204. package/website/content/docs/documentation.md +0 -100
  205. package/website/content/docs/ecosystem/framework-support.md +0 -1361
  206. package/website/content/docs/ecosystem/overview.md +0 -366
  207. package/website/content/docs/errors/index.md +0 -10
  208. package/website/content/docs/examples/aiflow-framework-integration-with-ossa.md +0 -107
  209. package/website/content/docs/examples/catalog.md +0 -300
  210. package/website/content/docs/for-audiences/students-researchers.md +0 -122
  211. package/website/content/docs/getting-started/index.md +0 -92
  212. package/website/content/docs/getting-started/installation.md +0 -155
  213. package/website/content/docs/getting-started/running-agents.md +0 -309
  214. package/website/content/docs/getting-started.md +0 -91
  215. package/website/content/docs/integrations/aiflow.md +0 -104
  216. package/website/content/docs/integrations/drupal.md +0 -105
  217. package/website/content/docs/migration-guides/agent-schema-comparison.md +0 -232
  218. package/website/content/docs/migration-guides/anthropic-mcp-to-ossa.md +0 -1750
  219. package/website/content/docs/migration-guides/crewai-to-ossa.md +0 -274
  220. package/website/content/docs/migration-guides/drupal-eca-to-ossa.md +0 -2017
  221. package/website/content/docs/migration-guides/general-agent-schema.yml +0 -247
  222. package/website/content/docs/migration-guides/index.md +0 -133
  223. package/website/content/docs/migration-guides/langchain-to-ossa.md +0 -1714
  224. package/website/content/docs/migration-guides/langflow-to-ossa.md +0 -2075
  225. package/website/content/docs/migration-guides/migration-manifest.json +0 -64
  226. package/website/content/docs/migration-guides/openai-to-ossa.md +0 -1202
  227. package/website/content/docs/openapi-extensions/examples.md +0 -550
  228. package/website/content/docs/openapi-extensions/index.md +0 -551
  229. package/website/content/docs/openapi-extensions/operation-extensions.md +0 -457
  230. package/website/content/docs/openapi-extensions/root-extensions.md +0 -410
  231. package/website/content/docs/ossa-compliant-badge.md +0 -251
  232. package/website/content/docs/pre-release/index.md +0 -175
  233. package/website/content/docs/quick-reference.md +0 -17
  234. package/website/content/docs/readme.md +0 -35
  235. package/website/content/docs/releases/v0.2.6.md +0 -99
  236. package/website/content/docs/schema-reference/agent-capabilities.md +0 -50
  237. package/website/content/docs/schema-reference/agent-id.md +0 -52
  238. package/website/content/docs/schema-reference/agent-name.md +0 -50
  239. package/website/content/docs/schema-reference/agent-role.md +0 -54
  240. package/website/content/docs/schema-reference/agent-spec.md +0 -406
  241. package/website/content/docs/schema-reference/agent-version.md +0 -50
  242. package/website/content/docs/schema-reference/autonomy.md +0 -568
  243. package/website/content/docs/schema-reference/constraints.md +0 -543
  244. package/website/content/docs/schema-reference/index.md +0 -45
  245. package/website/content/docs/schema-reference/llm-config.md +0 -445
  246. package/website/content/docs/schema-reference/observability.md +0 -654
  247. package/website/content/docs/schema-reference/ossa-manifest.md +0 -309
  248. package/website/content/docs/schema-reference/taxonomy.md +0 -509
  249. package/website/content/docs/schema-reference/tools.md +0 -628
  250. package/website/content/docs/templates/blog-post.md +0 -43
  251. package/website/content/docs/types-reference/index.md +0 -105
  252. package/website/content/docs/use-cases/00-index.md +0 -395
  253. package/website/content/docs/use-cases/cicd-code-review.md +0 -1236
  254. package/website/content/docs/use-cases/customer-support.md +0 -1234
  255. package/website/content/docs/use-cases/enterprise-compliance.md +0 -1208
  256. package/website/content/docs/use-cases/research-multi-agent.md +0 -1161
  257. package/website/content/docs/versioning.md +0 -288
  258. package/website/dev.sh +0 -53
  259. package/website/docker-compose.dev.yml +0 -36
  260. package/website/lib/version.ts +0 -35
  261. package/website/lib/versions.json +0 -103
  262. package/website/next.config.ts +0 -18
  263. package/website/nginx.conf +0 -32
  264. package/website/package-lock.json +0 -9679
  265. package/website/package.json +0 -59
  266. package/website/postcss.config.mjs +0 -9
  267. package/website/scripts/fetch-versions.js +0 -166
  268. package/website/scripts/generate-examples-index.js +0 -163
  269. package/website/scripts/merge-docs-to-wiki.ts +0 -207
  270. package/website/scripts/sync-version.js +0 -72
  271. package/website/scripts/sync-wiki.ts +0 -322
  272. package/website/scripts/upload-wiki.ts +0 -199
  273. package/website/styles/_spacing.scss +0 -453
  274. package/website/styles/_tokens.scss +0 -245
  275. package/website/styles/_typography.scss +0 -361
  276. package/website/styles/_variables.scss +0 -287
  277. package/website/tailwind.config.ts +0 -170
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB;AAoCD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,YAAY,UAAQ,GAAG,WAAW,CAiDhE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAc/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9D"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * OSSA Version Utilities
3
+ *
4
+ * Provides dynamic version detection from package.json
5
+ * NEVER hardcode version strings - use these utilities
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ // Cache the version info once resolved
11
+ let cachedVersionInfo = null;
12
+ /**
13
+ * Find package.json by searching upward from a starting directory
14
+ */
15
+ function findPackageJson(startDir) {
16
+ let current = startDir;
17
+ for (let i = 0; i < 10; i++) {
18
+ const candidate = path.resolve(current, 'package.json');
19
+ if (fs.existsSync(candidate)) {
20
+ return candidate;
21
+ }
22
+ const parent = path.dirname(current);
23
+ if (parent === current)
24
+ break;
25
+ current = parent;
26
+ }
27
+ return null;
28
+ }
29
+ /**
30
+ * Parse version string into components
31
+ */
32
+ function parseVersion(version) {
33
+ // Handle versions like "0.2.8", "0.2.8-RC", "0.2.8-beta.1"
34
+ const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/);
35
+ if (!match) {
36
+ throw new Error(`Invalid version format: ${version}`);
37
+ }
38
+ return {
39
+ major: parseInt(match[1], 10),
40
+ minor: parseInt(match[2], 10),
41
+ patch: parseInt(match[3], 10),
42
+ prerelease: match[4]
43
+ };
44
+ }
45
+ /**
46
+ * Get OSSA version information dynamically from package.json
47
+ *
48
+ * @param forceRefresh - If true, bypasses cache and re-reads package.json
49
+ * @returns VersionInfo object with all version details
50
+ *
51
+ * @example
52
+ * const { version, schemaPath, apiVersion } = getVersionInfo();
53
+ * console.log(`Using OSSA ${version}`);
54
+ * console.log(`Schema at: ${schemaPath}`);
55
+ */
56
+ export function getVersionInfo(forceRefresh = false) {
57
+ if (cachedVersionInfo && !forceRefresh) {
58
+ return cachedVersionInfo;
59
+ }
60
+ let version = '0.2.8'; // Ultimate fallback
61
+ // Try to find package.json
62
+ // Strategy 1: From this file's location (works in dist)
63
+ try {
64
+ const __filename = fileURLToPath(import.meta.url);
65
+ const __dirname = path.dirname(__filename);
66
+ const pkgPath = findPackageJson(__dirname);
67
+ if (pkgPath) {
68
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
69
+ version = pkg.version;
70
+ }
71
+ }
72
+ catch {
73
+ // Strategy 2: From process.cwd()
74
+ try {
75
+ const pkgPath = findPackageJson(process.cwd());
76
+ if (pkgPath) {
77
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
78
+ version = pkg.version;
79
+ }
80
+ }
81
+ catch {
82
+ // Use fallback
83
+ }
84
+ }
85
+ // Strategy 3: Check environment variable override
86
+ if (process.env.OSSA_VERSION) {
87
+ version = process.env.OSSA_VERSION;
88
+ }
89
+ const parsed = parseVersion(version);
90
+ const schemaDir = `v${version}`;
91
+ const schemaFile = `ossa-${version}.schema.json`;
92
+ cachedVersionInfo = {
93
+ version,
94
+ ...parsed,
95
+ schemaDir,
96
+ schemaFile,
97
+ schemaPath: `spec/${schemaDir}/${schemaFile}`,
98
+ apiVersion: `ossa.io/${schemaDir}`
99
+ };
100
+ return cachedVersionInfo;
101
+ }
102
+ /**
103
+ * Get just the version string (convenience function)
104
+ */
105
+ export function getVersion() {
106
+ return getVersionInfo().version;
107
+ }
108
+ /**
109
+ * Get the schema path (convenience function)
110
+ */
111
+ export function getSchemaPath() {
112
+ return getVersionInfo().schemaPath;
113
+ }
114
+ /**
115
+ * Get the API version for manifests (convenience function)
116
+ */
117
+ export function getApiVersion() {
118
+ return getVersionInfo().apiVersion;
119
+ }
120
+ /**
121
+ * Get the schema directory (e.g., "v0.2.8")
122
+ */
123
+ export function getSchemaDir() {
124
+ return getVersionInfo().schemaDir;
125
+ }
126
+ /**
127
+ * Check if version is a prerelease
128
+ */
129
+ export function isPrerelease() {
130
+ return getVersionInfo().prerelease !== undefined;
131
+ }
132
+ /**
133
+ * Get supported schema versions (for migration, validation)
134
+ * Returns versions in descending order (newest first)
135
+ */
136
+ export function getSupportedVersions() {
137
+ const current = getVersionInfo();
138
+ // Generate supported versions dynamically
139
+ // Current version + 2 previous minor versions
140
+ const versions = [current.version];
141
+ // Add previous minor versions if they exist
142
+ for (let i = 1; i <= 2; i++) {
143
+ if (current.minor - i >= 0) {
144
+ versions.push(`${current.major}.${current.minor - i}.0`);
145
+ }
146
+ }
147
+ return versions;
148
+ }
149
+ /**
150
+ * Resolve absolute path to schema file
151
+ */
152
+ export function resolveSchemaPath(projectRoot) {
153
+ const root = projectRoot || process.cwd();
154
+ return path.resolve(root, getVersionInfo().schemaPath);
155
+ }
156
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ [{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/export.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/generate.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/github-sync.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/gitlab-agent.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/import.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/init.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/migrate.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/release.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/run.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/schema.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/setup.command.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'options' is defined but never used. Allowed unused args must match /^_/u.","line":214,"column":15,"nodeType":null,"messageId":"unusedVar","endLine":214,"endColumn":22}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * OSSA Setup Command\n * Professional setup commands for branch protection and release automation\n * Follows DRY, OpenAPI, Zod, CRUD principles\n */\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\nimport { z } from 'zod';\n\n/**\n * Zod Schema for Setup Options\n */\nconst SetupOptionsSchema = z.object({\n force: z.boolean().optional().default(false),\n verbose: z.boolean().optional().default(false),\n});\n\ntype SetupOptions = z.infer<typeof SetupOptionsSchema>;\n\n/**\n * Base Setup Service (DRY)\n */\nclass SetupService {\n protected projectRoot: string;\n\n constructor() {\n this.projectRoot = this.findProjectRoot();\n }\n\n protected findProjectRoot(): string {\n let current = process.cwd();\n for (let i = 0; i < 10; i++) {\n const packageJson = path.join(current, 'package.json');\n if (fs.existsSync(packageJson)) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return process.cwd();\n }\n\n protected log(message: string, type: 'info' | 'success' | 'warning' | 'error' = 'info'): void {\n const colors = {\n info: chalk.blue,\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n };\n console.log(colors[type](message));\n }\n\n protected exec(command: string, options?: { cwd?: string; silent?: boolean }): string {\n try {\n const result = execSync(command, {\n cwd: options?.cwd || this.projectRoot,\n encoding: 'utf-8',\n stdio: options?.silent ? 'pipe' : 'inherit',\n });\n return result.toString();\n } catch {\n throw new Error(`Command failed: ${command}`);\n }\n }\n\n protected fileExists(filePath: string): boolean {\n return fs.existsSync(path.resolve(this.projectRoot, filePath));\n }\n\n protected ensureDirectory(dirPath: string): void {\n const fullPath = path.resolve(this.projectRoot, dirPath);\n if (!fs.existsSync(fullPath)) {\n fs.mkdirSync(fullPath, { recursive: true });\n }\n }\n}\n\n/**\n * Branch Protection Setup Service\n */\nclass BranchProtectionService extends SetupService {\n private readonly protectedBranches = ['main', 'development'];\n private readonly hooksDir = '.git/hooks';\n private readonly hookFile = 'post-checkout';\n\n async setup(options: SetupOptions): Promise<void> {\n this.log('🔒 Setting up branch protection for main and development...', 'info');\n this.log('');\n\n // Ensure hooks directory exists\n this.ensureDirectory(this.hooksDir);\n\n // Create post-checkout hook\n await this.createPostCheckoutHook(options.force);\n\n // Configure git hooks path\n this.exec('git config core.hooksPath .git/hooks', { silent: true });\n\n this.log('');\n this.log('✅ Branch protection installed!', 'success');\n this.log('');\n this.log(`Protected branches: ${this.protectedBranches.join(', ')}`);\n this.log('');\n this.log(\n 'The hook will automatically switch you back if you try to checkout these branches.'\n );\n this.log('');\n }\n\n private async createPostCheckoutHook(force: boolean): Promise<void> {\n const hookPath = path.resolve(this.projectRoot, this.hooksDir, this.hookFile);\n\n if (fs.existsSync(hookPath) && !force) {\n this.log(`✅ Post-checkout hook already exists`, 'info');\n // Ensure it's executable\n fs.chmodSync(hookPath, 0o755);\n return;\n }\n\n const hookContent = this.generateHookContent();\n fs.writeFileSync(hookPath, hookContent, { mode: 0o755 });\n\n this.log(`✅ Created post-checkout hook`, 'success');\n }\n\n private generateHookContent(): string {\n return `#!/bin/bash\n#\n# Git Post-Checkout Hook\n# Prevents checking out main and development branches locally\n# Enforces feature branch workflow\n#\n\n# Post-checkout hook receives:\n# $1 = previous HEAD\n# $2 = new HEAD\n# $3 = flag (0=file checkout, 1=branch checkout)\n\n# Only block branch checkouts, not file checkouts\nif [ \"$3\" != \"1\" ]; then\n exit 0\nfi\n\n# Get current branch name\nCURRENT_BRANCH=$(git branch --show-current 2>/dev/null)\n\n# Protected branches that cannot be checked out locally\nPROTECTED_BRANCHES=\"main development\"\n\n# Check if we're on a protected branch\nfor PROTECTED in $PROTECTED_BRANCHES; do\n if [ \"$CURRENT_BRANCH\" = \"$PROTECTED\" ]; then\n echo \"\"\n echo \"❌ ERROR: Cannot work on '$PROTECTED' branch locally\"\n echo \"\"\n echo \"This project enforces a feature branch workflow:\"\n echo \" • Work is done on feature branches\"\n echo \" • Feature branches → merge to development (via MR)\"\n echo \" • Development → merge to main (via MR)\"\n echo \"\"\n echo \"Switching you back to your previous branch...\"\n echo \"\"\n \n # Switch back to previous branch or a safe default\n PREVIOUS_BRANCH=$(git reflog | grep \"checkout:\" | head -2 | tail -1 | awk '{print $NF}' | sed 's|.*:||')\n \n if [ -n \"$PREVIOUS_BRANCH\" ] && [ \"$PREVIOUS_BRANCH\" != \"$PROTECTED\" ]; then\n git checkout \"$PREVIOUS_BRANCH\" 2>/dev/null\n echo \"✅ Switched back to: $PREVIOUS_BRANCH\"\n else\n # Try to find a feature branch\n FEATURE_BRANCH=$(git branch -a | grep -E \"feat/|feature/\" | head -1 | sed 's|.*/||' | xargs)\n if [ -n \"$FEATURE_BRANCH\" ]; then\n git checkout \"$FEATURE_BRANCH\" 2>/dev/null\n echo \"✅ Switched to feature branch: $FEATURE_BRANCH\"\n else\n echo \"⚠️ Could not auto-switch. Please manually checkout a feature branch:\"\n echo \" git checkout -b feat/your-feature development\"\n fi\n fi\n \n echo \"\"\n echo \"To work on this project:\"\n echo \" 1. Create a feature branch: git checkout -b feat/your-feature development\"\n echo \" 2. Make your changes\"\n echo \" 3. Push and create a merge request\"\n echo \"\"\n echo \"If you need to view $PROTECTED:\"\n echo \" • Use: git worktree add ../project-$PROTECTED $PROTECTED\"\n echo \" • Or view on GitLab: https://gitlab.com/blueflyio/openstandardagents/-/tree/$PROTECTED\"\n echo \"\"\n exit 1\n fi\ndone\n\n# Allow checkout\nexit 0\n`;\n }\n}\n\n/**\n * Release Automation Setup Service\n */\nclass ReleaseAutomationService extends SetupService {\n private readonly requiredDependencies = ['@gitbeaker/rest', '@octokit/rest'];\n private readonly requiredEnvVars = ['GITLAB_TOKEN', 'NPM_TOKEN', 'GITHUB_TOKEN'];\n\n async setup(options: SetupOptions): Promise<void> {\n this.log('🚀 Release Automation Setup', 'info');\n this.log('==============================', 'info');\n this.log('');\n\n // Check branch\n await this.checkBranch();\n\n // Check dependencies\n await this.checkDependencies();\n\n // Check CI/CD variables\n this.checkCICDVariables();\n\n // Check webhooks\n this.checkWebhooks();\n\n // Run tests\n await this.runTests();\n\n this.log('');\n this.log('==============================', 'info');\n this.log('✅ Setup checks complete!', 'success');\n this.log('');\n this.log('Next steps:');\n this.log(' 1. Configure webhooks in GitLab UI');\n this.log(' 2. Set CI/CD variables in GitLab UI');\n this.log(' 3. Create test milestone: v0.2.8-test');\n this.log(' 4. Verify automation works');\n this.log('');\n }\n\n private async checkBranch(): Promise<void> {\n try {\n const branch = this.exec('git branch --show-current', { silent: true }).trim();\n if (branch !== 'development') {\n this.log(\n `⚠️ Warning: Not on development branch (current: ${branch})`,\n 'warning'\n );\n this.log(' Switch to development first: git checkout development', 'warning');\n throw new Error('Must be on development branch');\n }\n this.log('✅ On development branch', 'success');\n this.log('');\n } catch (error) {\n if (error instanceof Error && error.message === 'Must be on development branch') {\n throw error;\n }\n throw new Error('Failed to check git branch');\n }\n }\n\n private async checkDependencies(): Promise<void> {\n this.log('📦 Checking dependencies...', 'info');\n\n for (const dep of this.requiredDependencies) {\n try {\n this.exec(`npm list ${dep}`, { silent: true });\n this.log(` ✅ ${dep}`, 'success');\n } catch {\n this.log(` ❌ ${dep} not found`, 'error');\n this.log(' Run: npm install', 'error');\n throw new Error(`Missing dependency: ${dep}`);\n }\n }\n\n this.log('✅ Dependencies installed', 'success');\n this.log('');\n }\n\n private checkCICDVariables(): void {\n this.log('🔐 Checking CI/CD variables...', 'info');\n this.log('');\n this.log('Required variables (set in GitLab UI):');\n for (const varName of this.requiredEnvVars) {\n const exists = !!process.env[varName];\n const status = exists ? '✅' : '❌';\n this.log(` ${status} ${varName}${exists ? ' (set)' : ' (missing)'}`);\n }\n this.log('');\n this.log('To set these:');\n this.log(' 1. Go to: Settings → CI/CD → Variables');\n this.log(' 2. Add each variable');\n this.log(' 3. Mark as \\'Protected\\' and \\'Masked\\'');\n this.log('');\n }\n\n private checkWebhooks(): void {\n this.log('🔗 Webhooks to configure:', 'info');\n this.log('');\n this.log('Webhook 1: Milestone Events');\n this.log(' URL: https://your-webhook-endpoint.com/milestone');\n this.log(' Trigger: Milestone events');\n this.log('');\n this.log('Webhook 2: Push Events');\n this.log(' URL: https://your-webhook-endpoint.com/push');\n this.log(' Trigger: Push events (development branch)');\n this.log('');\n this.log('To configure:');\n this.log(' Go to: Settings → Webhooks');\n this.log('');\n }\n\n private async runTests(): Promise<void> {\n this.log('🧪 Running tests...', 'info');\n try {\n this.exec('npm test', { silent: false });\n this.log('✅ All tests passing', 'success');\n } catch {\n this.log('❌ Tests failed', 'error');\n throw new Error('Tests failed');\n }\n }\n}\n\n/**\n * Main Setup Command\n */\nexport const setupCommand = new Command('setup')\n .description('Setup OSSA project tools and automation')\n .option('-f, --force', 'Force overwrite existing configuration')\n .option('-v, --verbose', 'Verbose output');\n\n/**\n * Branch Protection Subcommand\n */\nconst branchProtectionSubcommand = new Command('branch-protection')\n .alias('bp')\n .description('Setup git hooks to prevent checking out main/development locally')\n .option('-f, --force', 'Force overwrite existing hooks')\n .option('-v, --verbose', 'Verbose output')\n .action(async (options: { force?: boolean; verbose?: boolean }) => {\n try {\n const validated = SetupOptionsSchema.parse(options);\n const service = new BranchProtectionService();\n await service.setup(validated);\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error(chalk.red('Validation error:'), error.issues);\n process.exit(1);\n }\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n/**\n * Release Automation Subcommand\n */\nconst releaseAutomationSubcommand = new Command('release-automation')\n .alias('ra')\n .description('Setup release automation (dependencies, CI/CD variables, webhooks)')\n .option('-f, --force', 'Force setup even if checks fail')\n .option('-v, --verbose', 'Verbose output')\n .action(async (options: { force?: boolean; verbose?: boolean }) => {\n try {\n const validated = SetupOptionsSchema.parse(options);\n const service = new ReleaseAutomationService();\n await service.setup(validated);\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error(chalk.red('Validation error:'), error.issues);\n process.exit(1);\n }\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// Register subcommands\nsetupCommand.addCommand(branchProtectionSubcommand);\nsetupCommand.addCommand(releaseAutomationSubcommand);\n\n","usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/sync.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/commands/validate.command.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/cli/index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/di-container.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/repositories/manifest.repository.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/repositories/schema.repository.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/generation.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/github-sync/github-client.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/github-sync/gitlab-client.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/github-sync/schemas.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/github-sync/sync.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/gitlab-agent.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/migration.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/release-automation/base-crud.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/release-automation/index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/release-automation/merge-request.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/release-automation/milestone.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/release-automation/release.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/release-automation/schemas/release.schema.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/release-automation/tag.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/release-automation/webhook.service.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'project' is assigned a value but never used.","line":50,"column":15,"nodeType":null,"messageId":"unusedVar","endLine":50,"endColumn":22},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'project' is assigned a value but never used.","line":117,"column":13,"nodeType":null,"messageId":"unusedVar","endLine":117,"endColumn":20},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'project' is assigned a value but never used.","line":145,"column":13,"nodeType":null,"messageId":"unusedVar","endLine":145,"endColumn":20}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Webhook Service\n * Handles GitLab webhooks with Zod validation\n */\n\nimport {\n MilestoneWebhookPayloadSchema,\n PushWebhookPayloadSchema,\n WebhookResponseSchema,\n type MilestoneWebhookPayload,\n type PushWebhookPayload,\n type WebhookResponse,\n} from './schemas/release.schema.js';\nimport { ReleaseService } from './release.service.js';\nimport { MilestoneService } from './milestone.service.js';\nimport { TagService } from './tag.service.js';\nimport { MergeRequestService } from './merge-request.service.js';\n\n/**\n * Webhook Service\n * DRY: Centralized webhook handling\n */\nexport class WebhookService {\n private releaseService: ReleaseService;\n private milestoneService: MilestoneService;\n private tagService: TagService;\n private mergeRequestService: MergeRequestService;\n\n constructor(\n gitlabToken: string,\n projectId: string | number = process.env.CI_PROJECT_ID || ''\n ) {\n this.releaseService = new ReleaseService(gitlabToken, projectId);\n this.milestoneService = new MilestoneService(gitlabToken, projectId);\n this.tagService = new TagService(gitlabToken, projectId);\n this.mergeRequestService = new MergeRequestService(gitlabToken, projectId);\n }\n\n /**\n * Handle milestone webhook\n */\n async handleMilestoneWebhook(\n payload: unknown\n ): Promise<WebhookResponse> {\n try {\n // Validate payload with Zod\n const validated = MilestoneWebhookPayloadSchema.parse(payload);\n const actions: WebhookResponse['actions'] = [];\n\n const { project, object_attributes: milestone } = validated;\n\n // Determine if this is a create or close event\n const isNewMilestone =\n milestone.state === 'active' &&\n new Date(milestone.created_at).getTime() ===\n new Date(milestone.updated_at).getTime();\n\n if (isNewMilestone) {\n // Milestone created - create dev tag and branch\n const action = await this.handleMilestoneCreate(validated);\n if (action) actions.push(action);\n } else if (milestone.state === 'closed') {\n // Milestone closed - create RC\n const action = await this.handleMilestoneClose(validated);\n if (action) actions.push(action);\n }\n\n return WebhookResponseSchema.parse({\n success: true,\n message: `Milestone ${milestone.title} processed`,\n actions,\n });\n } catch (error) {\n return WebhookResponseSchema.parse({\n success: false,\n message: `Webhook processing failed: ${error}`,\n actions: [],\n });\n }\n }\n\n /**\n * Handle push webhook\n */\n async handlePushWebhook(payload: unknown): Promise<WebhookResponse> {\n try {\n // Validate payload with Zod\n const validated = PushWebhookPayloadSchema.parse(payload);\n const actions: WebhookResponse['actions'] = [];\n\n // Only process development branch pushes\n if (validated.ref === 'refs/heads/development') {\n const action = await this.handleDevelopmentPush(validated);\n if (action) actions.push(action);\n }\n\n return WebhookResponseSchema.parse({\n success: true,\n message: 'Push webhook processed',\n actions,\n });\n } catch (error) {\n return WebhookResponseSchema.parse({\n success: false,\n message: `Webhook processing failed: ${error}`,\n actions: [],\n });\n }\n }\n\n /**\n * Handle milestone creation\n */\n private async handleMilestoneCreate(\n payload: MilestoneWebhookPayload\n ): Promise<{ type: string; status: string; details?: Record<string, unknown> } | null> {\n const { project, object_attributes: milestone } = payload;\n const version = milestone.title.replace(/^v/, '');\n\n // Create initial dev tag\n const devTag = `v${version}-dev.0`;\n await this.tagService.create({\n name: devTag,\n ref: 'development',\n message: `Initial dev tag for ${milestone.title}`,\n });\n\n return {\n type: 'milestone_created',\n status: 'success',\n details: {\n milestoneId: milestone.id,\n tag: devTag,\n version,\n },\n };\n }\n\n /**\n * Handle milestone closure\n */\n private async handleMilestoneClose(\n payload: MilestoneWebhookPayload\n ): Promise<{ type: string; status: string; details?: Record<string, unknown> } | null> {\n const { project, object_attributes: milestone } = payload;\n const version = milestone.title.replace(/^v/, '');\n\n // Get milestone statistics\n const milestoneData = await this.milestoneService.read(milestone.id);\n if (!milestoneData) {\n throw new Error(`Milestone ${milestone.id} not found`);\n }\n\n // Check all issues are closed\n if (milestoneData.statistics.openIssues > 0) {\n throw new Error(\n `Cannot create RC: ${milestoneData.statistics.openIssues} issues still open`\n );\n }\n\n // Create RC tag\n const rcTag = `v${version}-rc.1`;\n await this.tagService.create({\n name: rcTag,\n ref: 'development',\n message: `Release candidate for ${milestone.title}`,\n });\n\n // Create MR: development → main\n const mr = await this.mergeRequestService.create({\n sourceBranch: 'development',\n targetBranch: 'main',\n title: `Release ${milestone.title}`,\n description: `Release candidate ${rcTag} for milestone ${milestone.title}`,\n labels: ['release', 'automation'],\n milestoneId: milestone.id,\n });\n\n return {\n type: 'milestone_closed',\n status: 'success',\n details: {\n milestoneId: milestone.id,\n rcTag,\n mergeRequestId: mr.id,\n },\n };\n }\n\n /**\n * Handle development branch push\n */\n private async handleDevelopmentPush(\n payload: PushWebhookPayload\n ): Promise<{ type: string; status: string; details?: Record<string, unknown> } | null> {\n // Auto-increment dev tag\n // This would be implemented based on current version detection\n // For now, return success\n\n return {\n type: 'dev_tag_incremented',\n status: 'success',\n details: {\n branch: payload.ref,\n commits: payload.commits.length,\n },\n };\n }\n}\n\n","usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/runtime/claude/capability-mapper.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/runtime/claude/claude-adapter.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'options' is defined but never used. Allowed unused args must match /^_/u.","line":268,"column":5,"nodeType":null,"messageId":"unusedVar","endLine":268,"endColumn":12}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Claude Runtime Adapter\n * Runs OSSA agents using Anthropic's Claude API\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { ManifestParser } from './manifest-parser.js';\nimport { CapabilityMapper } from './capability-mapper.js';\nimport type {\n OssaManifestWithAnthropic,\n ClaudeMessage,\n ClaudeRunOptions,\n ClaudeAdapterConfig,\n AgentInfo,\n ToolHandler,\n ClaudeTool,\n} from './types.js';\n\n/**\n * Claude adapter for executing OSSA agents\n */\nexport class ClaudeAdapter {\n private client: Anthropic;\n private parser: ManifestParser;\n private mapper: CapabilityMapper;\n private messages: ClaudeMessage[] = [];\n private conversationHistory: Anthropic.MessageParam[] = [];\n\n constructor(config: ClaudeAdapterConfig) {\n // Initialize Anthropic client\n this.client = new Anthropic({\n apiKey: config.apiKey || process.env.ANTHROPIC_API_KEY,\n });\n\n // Initialize parser and mapper\n this.parser = new ManifestParser(config.manifest);\n this.mapper = new CapabilityMapper();\n\n // Validate manifest\n const validation = this.parser.validate();\n if (!validation.valid) {\n throw new Error(\n `Invalid OSSA manifest: ${validation.errors.join(', ')}`\n );\n }\n\n // Check if Anthropic integration is enabled\n if (!this.parser.isAnthropicEnabled()) {\n console.warn(\n 'Warning: Anthropic extension is disabled in manifest'\n );\n }\n\n // Initialize tools\n this.initializeTools();\n }\n\n /**\n * Initialize tools from manifest\n */\n private initializeTools(): void {\n // Map Claude extension tools first (highest priority)\n const anthropicExt = this.parser.getAnthropicExtension();\n if (anthropicExt?.tools) {\n this.mapper.mapClaudeTools(anthropicExt.tools);\n }\n\n // Map OSSA spec tools\n const specTools = this.parser.getSpecTools();\n this.mapper.mapOssaTools(specTools);\n\n // Map MCP capabilities if any\n for (const tool of specTools) {\n if (tool.type === 'mcp' && tool.capabilities) {\n this.mapper.mapMcpCapabilities(tool.capabilities);\n } else if (tool.type === 'http') {\n this.mapper.mapHttpTool(tool);\n }\n }\n }\n\n /**\n * Register a tool handler\n */\n registerToolHandler(name: string, handler: ToolHandler): boolean {\n return this.mapper.registerToolHandler(name, handler);\n }\n\n /**\n * Execute a tool call\n */\n private async executeTool(\n name: string,\n input: Record<string, unknown>\n ): Promise<string> {\n const tool = this.mapper.getTool(name);\n if (!tool) {\n return JSON.stringify({\n error: `Tool '${name}' not found`,\n });\n }\n\n if (tool.handler) {\n try {\n return await tool.handler(input);\n } catch (error) {\n return JSON.stringify({\n error: `Error executing ${name}: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n // Default: return placeholder response\n return JSON.stringify({\n message: `Tool '${name}' executed`,\n input,\n note: 'No handler registered for this tool',\n });\n }\n\n /**\n * Initialize the conversation\n */\n initialize(): void {\n this.messages = [];\n this.conversationHistory = [];\n }\n\n /**\n * Send a message and get a response\n */\n async chat(\n userMessage: string,\n options?: ClaudeRunOptions\n ): Promise<string> {\n // Add user message to history\n this.conversationHistory.push({\n role: 'user',\n content: userMessage,\n });\n\n const tools = this.mapper.getClaudeTools();\n let turnCount = 0;\n const maxTurns = options?.maxTurns || 10;\n\n while (turnCount < maxTurns) {\n turnCount++;\n\n if (options?.verbose) {\n console.log(`\\n[Turn ${turnCount}/${maxTurns}]`);\n }\n\n // Call Claude API\n const response = await this.client.messages.create({\n model: this.parser.getModel(),\n max_tokens: this.parser.getMaxTokens(),\n temperature: this.parser.getTemperature(),\n system: this.parser.getSystemPrompt(),\n messages: this.conversationHistory,\n tools: tools.length > 0 ? tools : undefined,\n stop_sequences: this.parser.getStopSequences(),\n });\n\n if (options?.verbose) {\n console.log(\n ` Model: ${response.model}, Stop: ${response.stop_reason}`\n );\n console.log(\n ` Tokens: ${response.usage.input_tokens} in, ${response.usage.output_tokens} out`\n );\n }\n\n // Add assistant response to history\n this.conversationHistory.push({\n role: 'assistant',\n content: response.content,\n });\n\n // Check if we need to execute tools\n const toolUses = response.content.filter(\n (block) => block.type === 'tool_use'\n );\n\n if (toolUses.length > 0) {\n if (options?.verbose) {\n console.log(` [Executing ${toolUses.length} tool(s)...]`);\n }\n\n // Execute all tool calls\n const toolResults: Array<{\n type: 'tool_result';\n tool_use_id: string;\n content: string;\n }> = [];\n\n for (const toolUse of toolUses) {\n if (toolUse.type !== 'tool_use') continue;\n\n const { id, name, input } = toolUse;\n\n if (options?.verbose) {\n console.log(\n ` → ${name}(${JSON.stringify(input).substring(0, 100)}...)`\n );\n }\n\n const result = await this.executeTool(\n name,\n input as Record<string, unknown>\n );\n\n if (options?.verbose) {\n console.log(\n ` ← ${result.substring(0, 100)}${result.length > 100 ? '...' : ''}`\n );\n }\n\n toolResults.push({\n type: 'tool_result',\n tool_use_id: id,\n content: result,\n });\n }\n\n // Add tool results to conversation\n this.conversationHistory.push({\n role: 'user',\n content: toolResults,\n });\n\n // Continue the loop to get final response\n continue;\n }\n\n // Check if we have a text response\n const textBlocks = response.content.filter(\n (block) => block.type === 'text'\n );\n\n if (textBlocks.length > 0) {\n return textBlocks\n .map((block) => (block.type === 'text' ? block.text : ''))\n .join('\\n');\n }\n\n // No text and no tool calls - unexpected\n if (response.stop_reason === 'end_turn') {\n return '';\n }\n\n // Max tokens or stop sequence reached\n if (\n response.stop_reason === 'max_tokens' ||\n response.stop_reason === 'stop_sequence'\n ) {\n return '[Response truncated due to length limit]';\n }\n }\n\n return '[Max turns reached without completion]';\n }\n\n /**\n * Stream a response (for future implementation)\n */\n async chatStream(\n userMessage: string,\n options?: ClaudeRunOptions\n ): Promise<AsyncIterable<string>> {\n // Add user message to history\n this.conversationHistory.push({\n role: 'user',\n content: userMessage,\n });\n\n const tools = this.mapper.getClaudeTools();\n\n const stream = await this.client.messages.stream({\n model: this.parser.getModel(),\n max_tokens: this.parser.getMaxTokens(),\n temperature: this.parser.getTemperature(),\n system: this.parser.getSystemPrompt(),\n messages: this.conversationHistory,\n tools: tools.length > 0 ? tools : undefined,\n });\n\n // Return async generator\n return (async function* () {\n for await (const chunk of stream) {\n if (\n chunk.type === 'content_block_delta' &&\n chunk.delta.type === 'text_delta'\n ) {\n yield chunk.delta.text;\n }\n }\n })();\n }\n\n /**\n * Get agent information\n */\n getAgentInfo(): AgentInfo {\n const metadata = this.parser.getMetadata();\n const tools = Array.from(this.mapper.getTools().keys());\n\n return {\n name: metadata.name,\n model: this.parser.getModel(),\n tools,\n provider: 'anthropic',\n };\n }\n\n /**\n * Get conversation history\n */\n getConversationHistory(): Anthropic.MessageParam[] {\n return this.conversationHistory;\n }\n\n /**\n * Clear conversation history\n */\n clearHistory(): void {\n this.conversationHistory = [];\n this.messages = [];\n }\n\n /**\n * Get available tools\n */\n getTools(): ClaudeTool[] {\n return this.mapper.getClaudeTools();\n }\n\n /**\n * Get the Anthropic client (for advanced usage)\n */\n getClient(): Anthropic {\n return this.client;\n }\n\n /**\n * Get the manifest parser\n */\n getParser(): ManifestParser {\n return this.parser;\n }\n\n /**\n * Get the capability mapper\n */\n getMapper(): CapabilityMapper {\n return this.mapper;\n }\n\n /**\n * Create a Claude adapter from a manifest file\n */\n static async fromFile(\n manifestPath: string,\n apiKey?: string\n ): Promise<ClaudeAdapter> {\n const fs = await import('fs/promises');\n const manifestContent = await fs.readFile(manifestPath, 'utf-8');\n const manifest = JSON.parse(\n manifestContent\n ) as OssaManifestWithAnthropic;\n\n return new ClaudeAdapter({\n manifest,\n apiKey,\n });\n }\n\n /**\n * Create a Claude adapter from a manifest object\n */\n static fromManifest(\n manifest: OssaManifestWithAnthropic,\n apiKey?: string\n ): ClaudeAdapter {\n return new ClaudeAdapter({\n manifest,\n apiKey,\n });\n }\n}\n","usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/runtime/claude/manifest-parser.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/runtime/claude/types.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/runtime/openai.adapter.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validation.service.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/anthropic.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/autogen.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/crewai.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/cursor.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/langchain.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/langflow.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/langgraph.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/llamaindex.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/openai.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/services/validators/vercel-ai.validator.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/types/index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/types/openapi-extensions.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/utils/index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/Users/flux423/Sites/LLM/openstandardagents/src/utils/version.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]
@@ -1,7 +1,7 @@
1
1
  # Example: ADK Code Review Workflow with OSSA Agents
2
2
  # This demonstrates how OSSA agents work with ADK orchestration patterns
3
3
 
4
- apiVersion: '@ossa/v0.1.9'
4
+ apiVersion: ossa/v0.2.8
5
5
  kind: Workflow
6
6
  metadata:
7
7
  name: code-review-workflow
@@ -1,7 +1,7 @@
1
1
  # Example: ADK Customer Support System with OSSA Agents
2
2
  # Demonstrates Coordinator and Dispatcher patterns
3
3
 
4
- apiVersion: '@ossa/v0.1.9'
4
+ apiVersion: ossa/v0.2.8
5
5
  kind: Workflow
6
6
  metadata:
7
7
  name: customer-support-system
@@ -1,7 +1,7 @@
1
1
  # Example: ADK Data Processing Pipeline with OSSA Agents
2
2
  # Demonstrates LoopAgent and ConditionalAgent patterns
3
3
 
4
- apiVersion: '@ossa/v0.1.9'
4
+ apiVersion: ossa/v0.2.8
5
5
  kind: Workflow
6
6
  metadata:
7
7
  name: data-processing-pipeline
@@ -1,7 +1,7 @@
1
1
  # Hybrid Model Strategy: Fast Local Planning + Premium Development
2
2
  # Demonstrates using fast Ollama models for planning agents and Claude for development
3
3
 
4
- apiVersion: ossa.io/v0.1.9
4
+ apiVersion: ossa/v0.2.8
5
5
  kind: Workflow
6
6
  metadata:
7
7
  name: hybrid-development-workflow
@@ -1,4 +1,4 @@
1
- apiVersion: ossa.io/v0.1.9
1
+ apiVersion: ossa/v0.2.8
2
2
  kind: Agent
3
3
  metadata:
4
4
  name: code-quality-critic
@@ -1,4 +1,4 @@
1
- apiVersion: ossa.io/v0.1.9
1
+ apiVersion: ossa/v0.2.8
2
2
  kind: Agent
3
3
  metadata:
4
4
  name: policy-compliance-governor
@@ -1,4 +1,4 @@
1
- apiVersion: ossa.io/v0.1.9
1
+ apiVersion: ossa/v0.2.8
2
2
  kind: Agent
3
3
  metadata:
4
4
  name: multi-system-integrator
@@ -1,4 +1,4 @@
1
- apiVersion: ossa.io/v0.1.9
1
+ apiVersion: ossa/v0.2.8
2
2
  kind: Agent
3
3
  metadata:
4
4
  name: decision-arbitration-judge
@@ -1,4 +1,4 @@
1
- apiVersion: ossa.io/v0.1.9
1
+ apiVersion: ossa/v0.2.8
2
2
  kind: Agent
3
3
  metadata:
4
4
  name: system-performance-monitor
@@ -20,7 +20,7 @@
20
20
  # ============================================================================
21
21
 
22
22
  # OSSA manifest version - defines the schema and features available
23
- apiVersion: ossa.io/v0.1.9
23
+ apiVersion: ossa/v0.2.8
24
24
 
25
25
  # Kind declares this as an Agent manifest (vs. Bridge, Tool, etc.)
26
26
  kind: Agent
@@ -1,4 +1,4 @@
1
- apiVersion: ossa.io/v0.1.9-alpha.1
1
+ apiVersion: ossa/v0.2.8-alpha.1
2
2
  kind: Agent
3
3
  metadata:
4
4
  name: financial-data-processor
@@ -1,4 +1,4 @@
1
- apiVersion: ossa.io/v0.1.9
1
+ apiVersion: ossa/v0.2.8
2
2
  kind: Agent
3
3
  metadata:
4
4
  name: data-processing-worker
@@ -1,5 +1,5 @@
1
1
  {
2
- "apiVersion": "ossa/v0.2.4",
2
+ "apiVersion": "ossa/v0.2.8",
3
3
  "kind": "Agent",
4
4
  "metadata": {
5
5
  "name": "claude-assistant",
@@ -1,5 +1,5 @@
1
1
  {
2
- "apiVersion": "ossa/v0.2.4",
2
+ "apiVersion": "ossa/v0.2.8",
3
3
  "kind": "Agent",
4
4
  "metadata": {
5
5
  "name": "autogen-assistant",
@@ -0,0 +1,78 @@
1
+ apiVersion: ossa/v0.2.8
2
+ kind: Agent
3
+ metadata:
4
+ name: claude-code-reviewer
5
+ version: 1.0.0
6
+ description: Claude Code agent for TypeScript/Node.js code review
7
+
8
+ spec:
9
+ role: |
10
+ You are a senior code reviewer specializing in TypeScript, Node.js,
11
+ and OSSA specification compliance. Review code for quality, security,
12
+ and adherence to best practices.
13
+
14
+ llm:
15
+ provider: anthropic
16
+ model: claude-sonnet-4-5-20250929
17
+ temperature: 0.2
18
+ max_tokens: 16384
19
+
20
+ capabilities:
21
+ - name: review_code
22
+ description: Review code changes for quality and security
23
+ input_schema:
24
+ type: object
25
+ properties:
26
+ file_paths:
27
+ type: array
28
+ items:
29
+ type: string
30
+ focus_areas:
31
+ type: array
32
+ items:
33
+ type: string
34
+ enum: [security, performance, types, tests, docs]
35
+ required: [file_paths]
36
+
37
+ - name: suggest_improvements
38
+ description: Suggest code improvements and refactoring
39
+ input_schema:
40
+ type: object
41
+ properties:
42
+ file_path:
43
+ type: string
44
+ improvement_type:
45
+ type: string
46
+ enum: [refactor, optimize, simplify, secure]
47
+ required: [file_path, improvement_type]
48
+
49
+ constraints:
50
+ max_file_size: 100000
51
+ allowed_extensions:
52
+ - .ts
53
+ - .tsx
54
+ - .js
55
+ - .json
56
+ - .yaml
57
+ - .yml
58
+
59
+ extensions:
60
+ claude_code:
61
+ enabled: true
62
+ agent_type: reviewer
63
+ capabilities:
64
+ - file_read
65
+ - grep_search
66
+ - glob_search
67
+ review_focus:
68
+ - type_safety
69
+ - error_handling
70
+ - security_vulnerabilities
71
+ - code_clarity
72
+ - test_coverage
73
+
74
+ anthropic:
75
+ enabled: true
76
+ model: claude-sonnet-4-5-20250929
77
+ max_tokens: 16384
78
+ temperature: 0.2
@@ -0,0 +1,80 @@
1
+ apiVersion: ossa/v0.2.8
2
+ kind: Agent
3
+ metadata:
4
+ name: ossa-validator
5
+ version: 1.0.0
6
+ description: Claude Code agent for OSSA manifest validation and generation
7
+
8
+ spec:
9
+ role: |
10
+ You are an OSSA specification expert that helps users validate,
11
+ create, and migrate AI agent manifests to the OSSA standard.
12
+
13
+ llm:
14
+ provider: anthropic
15
+ model: claude-sonnet-4-5-20250929
16
+ temperature: 0.3
17
+ max_tokens: 8192
18
+
19
+ capabilities:
20
+ - name: validate
21
+ description: Validate OSSA manifests against schema
22
+ input_schema:
23
+ type: object
24
+ properties:
25
+ manifest_path:
26
+ type: string
27
+ description: Path to OSSA manifest file
28
+ required: [manifest_path]
29
+
30
+ - name: generate
31
+ description: Generate OSSA manifests from templates
32
+ input_schema:
33
+ type: object
34
+ properties:
35
+ agent_type:
36
+ type: string
37
+ enum: [chat, workflow, compliance, worker]
38
+ name:
39
+ type: string
40
+ required: [agent_type, name]
41
+
42
+ - name: migrate
43
+ description: Migrate manifests between OSSA versions
44
+ input_schema:
45
+ type: object
46
+ properties:
47
+ source_path:
48
+ type: string
49
+ target_version:
50
+ type: string
51
+ default: "0.2.8"
52
+ required: [source_path]
53
+
54
+ tools:
55
+ - name: ossa_validate
56
+ description: Run OSSA CLI validation
57
+ handler: bash
58
+ command: npm run cli -- validate ${manifest_path}
59
+
60
+ - name: ossa_generate
61
+ description: Generate new OSSA manifest
62
+ handler: bash
63
+ command: npm run cli -- generate ${agent_type} --name "${name}"
64
+
65
+ extensions:
66
+ claude_code:
67
+ enabled: true
68
+ agent_type: specialist
69
+ capabilities:
70
+ - file_read
71
+ - file_write
72
+ - bash_execute
73
+ allowed_commands:
74
+ - "npm run cli --"
75
+ - "npm run test"
76
+ - "npm run build"
77
+ workspace_paths:
78
+ - "spec/"
79
+ - "examples/"
80
+ - "src/"
@@ -1,3 +1,4 @@
1
+ apiVersion: ossa/v0.2.8
1
2
  ossaVersion: "1.0"
2
3
 
3
4
  agent:
@@ -1,4 +1,4 @@
1
- apiVersion: ossa/v1
1
+ apiVersion: ossa/v0.2.8
2
2
  kind: Agent
3
3
  metadata:
4
4
  name: agent-router
@@ -1,5 +1,5 @@
1
1
  {
2
- "apiVersion": "ossa/v0.2.4",
2
+ "apiVersion": "ossa/v0.2.8",
3
3
  "kind": "Agent",
4
4
  "metadata": {
5
5
  "name": "research-agent",
@@ -1,5 +1,5 @@
1
1
  {
2
- "apiVersion": "ossa/v0.2.4",
2
+ "apiVersion": "ossa/v0.2.8",
3
3
  "kind": "Agent",
4
4
  "metadata": {
5
5
  "name": "code-review-agent",
@@ -37,6 +37,7 @@
37
37
  # ============================================================================
38
38
 
39
39
  # OSSA specification version - defines which features are available
40
+ apiVersion: ossa/v0.2.8
40
41
  ossaVersion: "1.0"
41
42
 
42
43
  # Agent metadata and configuration
@@ -1,4 +1,4 @@
1
- apiVersion: ossa/v1
1
+ apiVersion: ossa/v0.2.8
2
2
  kind: Agent
3
3
  metadata:
4
4
  name: gitlab-ml-recommender
@@ -2,7 +2,7 @@
2
2
  # Extension specification for Drupal LLM Platform deployment
3
3
  # Compatible with Drupal 10+ and llm-platform modules
4
4
 
5
- apiVersion: ossa/v1
5
+ apiVersion: ossa/v0.2.8
6
6
  kind: ExtensionSchema
7
7
  metadata:
8
8
  name: drupal-extension