forgeos 0.1.0-alpha.13 → 0.1.0-alpha.14

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 (225) hide show
  1. package/AGENTS.md +6 -5
  2. package/CHANGELOG.md +12 -0
  3. package/adapters/java/README.md +68 -0
  4. package/adapters/java/pom.xml +34 -0
  5. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  6. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  7. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  8. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  9. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  10. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  11. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  12. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  25. package/adapters/java/target/classes/dev/forgeos/adapter/Auth.class +0 -0
  26. package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
  27. package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
  28. package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
  29. package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
  30. package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
  31. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
  32. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
  33. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
  34. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
  35. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
  36. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
  37. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
  38. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
  39. package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
  40. package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
  41. package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
  42. package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
  43. package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
  44. package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
  45. package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
  46. package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
  47. package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
  48. package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
  49. package/adapters/java/target/maven-archiver/pom.properties +3 -0
  50. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
  51. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -0
  52. package/adapters/java-spring-boot-starter/README.md +32 -0
  53. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  54. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  55. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  56. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  57. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  58. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  59. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  60. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  61. package/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  62. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
  63. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
  64. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
  65. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
  66. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
  67. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
  68. package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
  69. package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
  70. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
  71. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
  72. package/docs/forge-protocol.md +33 -0
  73. package/examples/java-billing/pom.xml +52 -0
  74. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  75. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  76. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  77. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
  78. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
  79. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
  80. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
  81. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
  82. package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
  83. package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
  84. package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
  85. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
  86. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
  87. package/package.json +4 -1
  88. package/src/forge/_generated/actionSubscriptions.json +1 -1
  89. package/src/forge/_generated/actionSubscriptions.ts +3 -3
  90. package/src/forge/_generated/agentAdapterManifest.json +1 -1
  91. package/src/forge/_generated/agentAdapterManifest.ts +3 -3
  92. package/src/forge/_generated/agentContract.json +1 -1
  93. package/src/forge/_generated/agentContract.ts +1274 -7
  94. package/src/forge/_generated/agentQuickstart.md +1 -1
  95. package/src/forge/_generated/agentTools.json +1 -1
  96. package/src/forge/_generated/agentTools.md +1 -1
  97. package/src/forge/_generated/agentTools.ts +2 -2
  98. package/src/forge/_generated/aiContext.ts +1 -1
  99. package/src/forge/_generated/aiModels.ts +1 -1
  100. package/src/forge/_generated/aiProviders.ts +1 -1
  101. package/src/forge/_generated/aiRegistry.json +1 -1
  102. package/src/forge/_generated/aiRegistry.ts +3 -3
  103. package/src/forge/_generated/api.json +1 -1
  104. package/src/forge/_generated/api.ts +1 -1
  105. package/src/forge/_generated/appGraph.json +1 -1
  106. package/src/forge/_generated/appGraph.ts +107 -78
  107. package/src/forge/_generated/appMap.md +1 -1
  108. package/src/forge/_generated/artifactManifest.json +1 -1
  109. package/src/forge/_generated/artifactManifest.ts +2 -2
  110. package/src/forge/_generated/authClaims.ts +1 -1
  111. package/src/forge/_generated/authConfig.ts +1 -1
  112. package/src/forge/_generated/authContext.ts +1 -1
  113. package/src/forge/_generated/authRegistry.ts +1 -1
  114. package/src/forge/_generated/buildInfo.json +1 -1
  115. package/src/forge/_generated/buildInfo.ts +4 -4
  116. package/src/forge/_generated/capabilityMap.json +1 -1
  117. package/src/forge/_generated/capabilityMap.md +1 -1
  118. package/src/forge/_generated/capabilityMap.ts +2 -2
  119. package/src/forge/_generated/client.ts +1 -1
  120. package/src/forge/_generated/clientApi.ts +1 -1
  121. package/src/forge/_generated/clientManifest.json +1 -1
  122. package/src/forge/_generated/clientManifest.ts +14 -3
  123. package/src/forge/_generated/clientTypes.ts +1 -1
  124. package/src/forge/_generated/configRegistry.ts +1 -1
  125. package/src/forge/_generated/dataGraph.json +1 -1
  126. package/src/forge/_generated/dataGraph.ts +3 -3
  127. package/src/forge/_generated/db.ts +1 -1
  128. package/src/forge/_generated/dbSecurityManifest.ts +1 -1
  129. package/src/forge/_generated/dbSessionContext.ts +1 -1
  130. package/src/forge/_generated/deployManifest.json +1 -1
  131. package/src/forge/_generated/deployManifest.ts +7 -7
  132. package/src/forge/_generated/devManifest.json +1 -1
  133. package/src/forge/_generated/devManifest.ts +3 -3
  134. package/src/forge/_generated/envSchema.ts +1 -1
  135. package/src/forge/_generated/externalServices.ts +1 -1
  136. package/src/forge/_generated/frontendGraph.ts +1 -1
  137. package/src/forge/_generated/importGuards.json +1 -1
  138. package/src/forge/_generated/importGuards.ts +35 -1
  139. package/src/forge/_generated/index.ts +3 -1
  140. package/src/forge/_generated/liveProductionManifest.ts +1 -1
  141. package/src/forge/_generated/liveProtocol.ts +1 -1
  142. package/src/forge/_generated/liveQueryRegistry.json +1 -1
  143. package/src/forge/_generated/liveQueryRegistry.ts +3 -3
  144. package/src/forge/_generated/liveTransportConfig.ts +1 -1
  145. package/src/forge/_generated/makeRegistry.json +1 -1
  146. package/src/forge/_generated/makeRegistry.ts +8 -8
  147. package/src/forge/_generated/makeTemplates.json +1 -1
  148. package/src/forge/_generated/makeTemplates.ts +2 -2
  149. package/src/forge/_generated/mockMap.ts +1 -1
  150. package/src/forge/_generated/operationPlaybooks.md +6 -6
  151. package/src/forge/_generated/packageGraph.json +1 -1
  152. package/src/forge/_generated/packageGraph.ts +52412 -2
  153. package/src/forge/_generated/packageUpgradeRegistry.json +1 -1
  154. package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
  155. package/src/forge/_generated/permissionMatrix.json +1 -1
  156. package/src/forge/_generated/permissionMatrix.ts +3 -3
  157. package/src/forge/_generated/policyRegistry.json +1 -1
  158. package/src/forge/_generated/policyRegistry.ts +3 -3
  159. package/src/forge/_generated/queryRegistry.json +1 -1
  160. package/src/forge/_generated/queryRegistry.ts +3 -3
  161. package/src/forge/_generated/react.d.ts +1 -1
  162. package/src/forge/_generated/react.ts +1 -1
  163. package/src/forge/_generated/reactManifest.json +1 -1
  164. package/src/forge/_generated/reactManifest.ts +3 -3
  165. package/src/forge/_generated/releaseManifest.json +1 -1
  166. package/src/forge/_generated/releaseManifest.ts +3 -3
  167. package/src/forge/_generated/rlsPolicies.sql +1 -1
  168. package/src/forge/_generated/rlsPolicies.ts +1 -1
  169. package/src/forge/_generated/runtimeGraph.json +1 -1
  170. package/src/forge/_generated/runtimeGraph.ts +3 -3
  171. package/src/forge/_generated/runtimeMatrix.json +1 -1
  172. package/src/forge/_generated/runtimeMatrix.ts +70357 -1
  173. package/src/forge/_generated/runtimeRegistry.ts +1 -1
  174. package/src/forge/_generated/runtimeRules.md +1 -1
  175. package/src/forge/_generated/secretRegistry.ts +1 -1
  176. package/src/forge/_generated/secretsContext.ts +1 -1
  177. package/src/forge/_generated/serverApi.ts +1 -1
  178. package/src/forge/_generated/sourceMapManifest.json +1 -1
  179. package/src/forge/_generated/sourceMapManifest.ts +2 -2
  180. package/src/forge/_generated/sqlPlan.ts +1 -1
  181. package/src/forge/_generated/subscriptionManifest.json +1 -1
  182. package/src/forge/_generated/subscriptionManifest.ts +3 -3
  183. package/src/forge/_generated/symbolicationManifest.json +1 -1
  184. package/src/forge/_generated/symbolicationManifest.ts +2 -2
  185. package/src/forge/_generated/telemetryRegistry.json +1 -1
  186. package/src/forge/_generated/telemetryRegistry.ts +3 -3
  187. package/src/forge/_generated/telemetrySinks.json +1 -1
  188. package/src/forge/_generated/telemetrySinks.ts +2 -2
  189. package/src/forge/_generated/tenantScope.json +1 -1
  190. package/src/forge/_generated/tenantScope.ts +3 -3
  191. package/src/forge/_generated/testGraph.json +1 -1
  192. package/src/forge/_generated/testGraph.ts +71 -5
  193. package/src/forge/_generated/testPlanRegistry.json +1 -1
  194. package/src/forge/_generated/testPlanRegistry.ts +2 -2
  195. package/src/forge/_generated/uiRoutes.ts +1 -1
  196. package/src/forge/_generated/uiScenarios.ts +1 -1
  197. package/src/forge/_generated/uiTestManifest.json +1 -1
  198. package/src/forge/_generated/uiTestManifest.ts +2 -2
  199. package/src/forge/_generated/vue.d.ts +25 -0
  200. package/src/forge/_generated/vue.ts +30 -0
  201. package/src/forge/_generated/vueManifest.json +1 -0
  202. package/src/forge/_generated/vueManifest.ts +19 -0
  203. package/src/forge/_generated/workflowRegistry.json +1 -1
  204. package/src/forge/_generated/workflowRegistry.ts +3 -3
  205. package/src/forge/_generated/workflowSubscriptions.json +1 -1
  206. package/src/forge/_generated/workflowSubscriptions.ts +3 -3
  207. package/src/forge/agent-adapters/index.ts +1 -1
  208. package/src/forge/cli/parse.ts +1 -1
  209. package/src/forge/cli/verify.ts +2 -0
  210. package/src/forge/compiler/agent-contract/build.ts +10 -9
  211. package/src/forge/compiler/client-sdk/build-manifest.ts +55 -0
  212. package/src/forge/compiler/client-sdk/render-client.ts +66 -1
  213. package/src/forge/compiler/diagnostics/create.ts +6 -1
  214. package/src/forge/compiler/emitter/barrel.ts +3 -0
  215. package/src/forge/compiler/frontend-graph/build.ts +85 -13
  216. package/src/forge/compiler/make-registry/build.ts +6 -7
  217. package/src/forge/compiler/orchestrator/plan.ts +13 -0
  218. package/src/forge/compiler/orchestrator/serialize.ts +6 -0
  219. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  220. package/src/forge/intent/index.ts +11 -6
  221. package/src/forge/make/index.ts +23 -3
  222. package/src/forge/make/templates.ts +153 -0
  223. package/src/forge/make/types.ts +2 -1
  224. package/src/forge/version.ts +1 -1
  225. package/src/forge/vue/index.ts +407 -0
@@ -0,0 +1,104 @@
1
+ package dev.forgeos.adapter.spring;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import dev.forgeos.adapter.Forge;
5
+ import dev.forgeos.adapter.ForgeContext;
6
+ import dev.forgeos.adapter.ForgeHandler;
7
+ import dev.forgeos.adapter.ForgeRegistry;
8
+ import java.lang.reflect.InvocationTargetException;
9
+ import java.lang.reflect.Method;
10
+ import java.lang.reflect.Parameter;
11
+ import org.springframework.aop.support.AopUtils;
12
+ import org.springframework.context.ApplicationContext;
13
+ import org.springframework.core.annotation.AnnotatedElementUtils;
14
+ import org.springframework.util.ReflectionUtils;
15
+
16
+ public final class ForgeSpringRuntime {
17
+ private ForgeSpringRuntime() {
18
+ }
19
+
20
+ public static ForgeRegistry buildRegistry(ApplicationContext context) {
21
+ String[] serviceBeanNames = context.getBeanNamesForAnnotation(ForgeExternalService.class);
22
+ if (serviceBeanNames.length == 0) {
23
+ throw new IllegalStateException("no @ForgeExternalService bean found");
24
+ }
25
+
26
+ Object serviceBean = context.getBean(serviceBeanNames[0]);
27
+ Class<?> serviceClass = AopUtils.getTargetClass(serviceBean);
28
+ ForgeExternalService service = AnnotatedElementUtils.findMergedAnnotation(
29
+ serviceClass,
30
+ ForgeExternalService.class
31
+ );
32
+ if (service == null) {
33
+ throw new IllegalStateException("selected bean is missing @ForgeExternalService");
34
+ }
35
+
36
+ ForgeRegistry registry = Forge.service(service.name(),
37
+ Forge.framework(service.framework()),
38
+ Forge.baseUrl(service.baseUrl()),
39
+ Forge.health(service.health())
40
+ );
41
+
42
+ ReflectionUtils.doWithMethods(serviceClass, method -> registerMethod(registry, serviceBean, method));
43
+ return registry;
44
+ }
45
+
46
+ private static void registerMethod(ForgeRegistry registry, Object bean, Method method) {
47
+ ForgeCommand command = AnnotatedElementUtils.findMergedAnnotation(method, ForgeCommand.class);
48
+ if (command != null) {
49
+ registry.command(command.name(), handlerFor(bean, method),
50
+ command.description().isBlank() ? entry -> { } : Forge.description(command.description()),
51
+ command.path().isBlank() ? entry -> { } : Forge.path(command.path()),
52
+ command.policy().isBlank() ? entry -> { } : Forge.policy(command.policy()),
53
+ Forge.tenantScoped(command.tenantScoped()),
54
+ Forge.transaction(command.transaction()),
55
+ Forge.risk(command.risk()),
56
+ Forge.needsApproval(command.needsApproval()),
57
+ Forge.effects(command.effects())
58
+ );
59
+ }
60
+
61
+ ForgeQuery query = AnnotatedElementUtils.findMergedAnnotation(method, ForgeQuery.class);
62
+ if (query != null) {
63
+ registry.query(query.name(), handlerFor(bean, method),
64
+ query.description().isBlank() ? entry -> { } : Forge.description(query.description()),
65
+ query.path().isBlank() ? entry -> { } : Forge.path(query.path()),
66
+ query.policy().isBlank() ? entry -> { } : Forge.policy(query.policy()),
67
+ Forge.tenantScoped(query.tenantScoped()),
68
+ Forge.readOnly()
69
+ );
70
+ }
71
+ }
72
+
73
+ private static ForgeHandler handlerFor(Object bean, Method method) {
74
+ ReflectionUtils.makeAccessible(method);
75
+ return (context, args) -> {
76
+ try {
77
+ return method.invoke(bean, argumentsFor(method, context, args));
78
+ } catch (InvocationTargetException error) {
79
+ Throwable target = error.getTargetException();
80
+ if (target instanceof Exception exception) {
81
+ throw exception;
82
+ }
83
+ throw new RuntimeException(target);
84
+ }
85
+ };
86
+ }
87
+
88
+ private static Object[] argumentsFor(Method method, ForgeContext context, JsonNode args) throws Exception {
89
+ Parameter[] parameters = method.getParameters();
90
+ Object[] values = new Object[parameters.length];
91
+ for (int index = 0; index < parameters.length; index += 1) {
92
+ Class<?> type = parameters[index].getType();
93
+ if (type.equals(ForgeContext.class)) {
94
+ values[index] = context;
95
+ } else {
96
+ JsonNode safeArgs = args == null || args.isNull()
97
+ ? dev.forgeos.adapter.Json.MAPPER.createObjectNode()
98
+ : args;
99
+ values[index] = dev.forgeos.adapter.Json.MAPPER.treeToValue(safeArgs, type);
100
+ }
101
+ }
102
+ return values;
103
+ }
104
+ }
@@ -0,0 +1,3 @@
1
+ artifactId=forge-java-spring-boot-starter
2
+ groupId=dev.forgeos
3
+ version=0.1.0-alpha.11
@@ -0,0 +1,6 @@
1
+ dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class
2
+ dev/forgeos/adapter/spring/ForgeSpringRuntime.class
3
+ dev/forgeos/adapter/spring/ForgeExternalService.class
4
+ dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class
5
+ dev/forgeos/adapter/spring/ForgeQuery.class
6
+ dev/forgeos/adapter/spring/ForgeCommand.class
@@ -0,0 +1,6 @@
1
+ /home/runner/work/forge/forge/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java
2
+ /home/runner/work/forge/forge/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java
3
+ /home/runner/work/forge/forge/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java
4
+ /home/runner/work/forge/forge/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java
5
+ /home/runner/work/forge/forge/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java
6
+ /home/runner/work/forge/forge/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java
@@ -107,6 +107,39 @@ forge query billing.listInvoices --args '{}'
107
107
  forge run query billing.listInvoices --args '{}'
108
108
  ```
109
109
 
110
+ ## Java Adapter
111
+
112
+ Forge ships a minimal Java adapter under `adapters/java`. The adapter is a small
113
+ SDK for JVM services that want to join the Forge external runtime protocol
114
+ without requiring Forge to parse Java source code.
115
+
116
+ ```java
117
+ ForgeRegistry app = Forge.service("billing",
118
+ Forge.framework("java/jdk-http"),
119
+ Forge.baseUrl("http://127.0.0.1:8788"));
120
+
121
+ app.command("createInvoice",
122
+ Forge.handle(CreateInvoiceInput.class, Billing::createInvoice),
123
+ Forge.policy("billing.manage"),
124
+ Forge.tenantScoped(true),
125
+ Forge.needsApproval(true));
126
+
127
+ app.query("listInvoices",
128
+ Forge.handle(EmptyInput.class, Billing::listInvoices),
129
+ Forge.policy("billing.manage"),
130
+ Forge.tenantScoped(true),
131
+ Forge.readOnly());
132
+ ```
133
+
134
+ The adapter exposes `GET /manifest`, `GET /health`, `POST /commands/:name`, and
135
+ `POST /queries/:name`. The `examples/java-billing` app demonstrates manifest
136
+ export, HTTP serving, policy enforcement through the Forge bridge, generated
137
+ client calls, and agent tool registration.
138
+
139
+ Spring Boot users can start from `adapters/java-spring-boot-starter`, which
140
+ provides `@ForgeExternalService`, `@ForgeCommand`, and `@ForgeQuery` annotations
141
+ plus a `ForgeRegistry` auto-configuration hook.
142
+
110
143
  ## Runtime Bridge
111
144
 
112
145
  Forge accepts the normal JSON body:
@@ -0,0 +1,52 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://maven.apache.org/POM/4.0.0"
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+ <modelVersion>4.0.0</modelVersion>
6
+
7
+ <groupId>dev.forgeos.examples</groupId>
8
+ <artifactId>java-billing</artifactId>
9
+ <version>0.1.0-alpha.11</version>
10
+ <name>Forge Java Billing Example</name>
11
+
12
+ <properties>
13
+ <maven.compiler.release>17</maven.compiler.release>
14
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15
+ </properties>
16
+
17
+ <dependencies>
18
+ <dependency>
19
+ <groupId>dev.forgeos</groupId>
20
+ <artifactId>forge-java-adapter</artifactId>
21
+ <version>0.1.0-alpha.11</version>
22
+ </dependency>
23
+ </dependencies>
24
+
25
+ <build>
26
+ <plugins>
27
+ <plugin>
28
+ <groupId>org.apache.maven.plugins</groupId>
29
+ <artifactId>maven-shade-plugin</artifactId>
30
+ <version>3.6.0</version>
31
+ <executions>
32
+ <execution>
33
+ <phase>package</phase>
34
+ <goals>
35
+ <goal>shade</goal>
36
+ </goals>
37
+ <configuration>
38
+ <createDependencyReducedPom>false</createDependencyReducedPom>
39
+ <shadedArtifactAttached>true</shadedArtifactAttached>
40
+ <shadedClassifierName>all</shadedClassifierName>
41
+ <transformers>
42
+ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
43
+ <mainClass>dev.forgeos.examples.billing.Main</mainClass>
44
+ </transformer>
45
+ </transformers>
46
+ </configuration>
47
+ </execution>
48
+ </executions>
49
+ </plugin>
50
+ </plugins>
51
+ </build>
52
+ </project>
@@ -0,0 +1,4 @@
1
+ package dev.forgeos.examples.billing;
2
+
3
+ public record CreateInvoiceInput(String title) {
4
+ }
@@ -0,0 +1,11 @@
1
+ package dev.forgeos.examples.billing;
2
+
3
+ public record Invoice(
4
+ String id,
5
+ String title,
6
+ String tenant,
7
+ String traceId,
8
+ String authKind,
9
+ String userId
10
+ ) {
11
+ }
@@ -0,0 +1,127 @@
1
+ package dev.forgeos.examples.billing;
2
+
3
+ import com.sun.net.httpserver.HttpServer;
4
+ import dev.forgeos.adapter.Forge;
5
+ import dev.forgeos.adapter.ForgeContext;
6
+ import dev.forgeos.adapter.ForgeHttpHandler;
7
+ import dev.forgeos.adapter.ForgeRegistry;
8
+ import dev.forgeos.adapter.Risk;
9
+ import dev.forgeos.adapter.Schemas;
10
+ import dev.forgeos.adapter.TransactionMode;
11
+ import java.util.Map;
12
+
13
+ public final class Main {
14
+ private Main() {
15
+ }
16
+
17
+ public static void main(String[] args) throws Exception {
18
+ Options options = Options.parse(args);
19
+ ForgeRegistry app = newBillingApp(options.baseUrl());
20
+
21
+ if (options.manifest()) {
22
+ app.writeManifest(System.out, options.baseUrl());
23
+ return;
24
+ }
25
+
26
+ String[] addressParts = options.addr().split(":", 2);
27
+ String host = addressParts[0];
28
+ int port = Integer.parseInt(addressParts.length > 1 ? addressParts[1] : "8788");
29
+ HttpServer server = ForgeHttpHandler.listen(app, host, port);
30
+ System.err.printf("java billing external service listening on http://%s%n", options.addr());
31
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> server.stop(0)));
32
+ }
33
+
34
+ static ForgeRegistry newBillingApp(String baseUrl) {
35
+ ForgeRegistry app = Forge.service("billing",
36
+ Forge.framework("java/jdk-http"),
37
+ Forge.baseUrl(baseUrl),
38
+ Forge.health("/health")
39
+ );
40
+
41
+ app.command("createInvoice", Forge.handle(CreateInvoiceInput.class, Main::createInvoice),
42
+ Forge.description("Create an invoice in the external Java billing service."),
43
+ Forge.policy("billing.manage"),
44
+ Forge.tenantScoped(true),
45
+ Forge.transaction(TransactionMode.EXTERNAL_MANAGED),
46
+ Forge.risk(Risk.WRITE),
47
+ Forge.needsApproval(true),
48
+ Forge.effects("invoice.created"),
49
+ Forge.inputSchema(Schemas.object(Map.of("title", Schemas.string()), "title")),
50
+ Forge.outputSchema(invoiceSchema())
51
+ );
52
+
53
+ app.query("listInvoices", Forge.handle(EmptyInput.class, Main::listInvoices),
54
+ Forge.description("List invoices visible to the current tenant."),
55
+ Forge.policy("billing.manage"),
56
+ Forge.tenantScoped(true),
57
+ Forge.readOnly(),
58
+ Forge.outputSchema(Schemas.array(invoiceSchema()))
59
+ );
60
+
61
+ return app;
62
+ }
63
+
64
+ static Invoice createInvoice(ForgeContext context, CreateInvoiceInput input) {
65
+ if (input.title() == null || input.title().isBlank()) {
66
+ throw new IllegalArgumentException("title is required");
67
+ }
68
+ if (context.auth().tenantId() == null || context.auth().tenantId().isBlank()) {
69
+ throw new IllegalArgumentException("tenant id is required");
70
+ }
71
+ return new Invoice(
72
+ "inv_java_1",
73
+ input.title(),
74
+ context.auth().tenantId(),
75
+ context.forge().traceId(),
76
+ context.auth().kind(),
77
+ context.auth().userId()
78
+ );
79
+ }
80
+
81
+ static Invoice[] listInvoices(ForgeContext context, EmptyInput input) {
82
+ if (context.auth().tenantId() == null || context.auth().tenantId().isBlank()) {
83
+ throw new IllegalArgumentException("tenant id is required");
84
+ }
85
+ return new Invoice[] {
86
+ new Invoice("inv_java_1", "Java adapter invoice", context.auth().tenantId(), null, null, null)
87
+ };
88
+ }
89
+
90
+ static Map<String, Object> invoiceSchema() {
91
+ return Schemas.object(Map.of(
92
+ "id", Schemas.string(),
93
+ "title", Schemas.string(),
94
+ "tenant", Schemas.string(),
95
+ "traceId", Schemas.string(),
96
+ "authKind", Schemas.string(),
97
+ "userId", Schemas.string()
98
+ ), "id", "tenant");
99
+ }
100
+
101
+ record EmptyInput() {
102
+ }
103
+
104
+ record Options(String addr, String baseUrl, boolean manifest) {
105
+ static Options parse(String[] args) {
106
+ String addr = "127.0.0.1:8788";
107
+ String baseUrl = null;
108
+ boolean manifest = false;
109
+
110
+ for (int index = 0; index < args.length; index += 1) {
111
+ String arg = args[index];
112
+ if ("--manifest".equals(arg)) {
113
+ manifest = true;
114
+ } else if ("--addr".equals(arg) && index + 1 < args.length) {
115
+ addr = args[++index];
116
+ } else if ("--base-url".equals(arg) && index + 1 < args.length) {
117
+ baseUrl = args[++index];
118
+ }
119
+ }
120
+
121
+ if (baseUrl == null || baseUrl.isBlank()) {
122
+ baseUrl = "http://" + addr;
123
+ }
124
+ return new Options(addr, baseUrl, manifest);
125
+ }
126
+ }
127
+ }
@@ -0,0 +1,3 @@
1
+ artifactId=java-billing
2
+ groupId=dev.forgeos.examples
3
+ version=0.1.0-alpha.11
@@ -0,0 +1,5 @@
1
+ dev/forgeos/examples/billing/Main.class
2
+ dev/forgeos/examples/billing/Invoice.class
3
+ dev/forgeos/examples/billing/Main$EmptyInput.class
4
+ dev/forgeos/examples/billing/Main$Options.class
5
+ dev/forgeos/examples/billing/CreateInvoiceInput.class
@@ -0,0 +1,3 @@
1
+ /home/runner/work/forge/forge/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java
2
+ /home/runner/work/forge/forge/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java
3
+ /home/runner/work/forge/forge/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forgeos",
3
- "version": "0.1.0-alpha.13",
3
+ "version": "0.1.0-alpha.14",
4
4
  "description": "Agent-native application framework and compiler for building Forge apps without a mandatory dashboard.",
5
5
  "type": "module",
6
6
  "files": [
@@ -8,6 +8,7 @@
8
8
  "bin/",
9
9
  "docs/forge-protocol.md",
10
10
  "examples/go-billing/",
11
+ "examples/java-billing/",
11
12
  "packages/eslint-plugin-forge/",
12
13
  "schemas/",
13
14
  "src/",
@@ -28,6 +29,7 @@
28
29
  },
29
30
  "exports": {
30
31
  "./react": "./src/forge/react/index.ts",
32
+ "./vue": "./src/forge/vue/index.ts",
31
33
  "./server": "./src/forge/server.ts",
32
34
  "./policy": "./src/forge/policy.ts"
33
35
  },
@@ -92,6 +94,7 @@
92
94
  "tree-sitter-typescript": "^0.23.2",
93
95
  "tsx": "^4.20.6",
94
96
  "typescript": "^5.7.3",
97
+ "vue": "^3.5.38",
95
98
  "zod": "^3.25.76"
96
99
  },
97
100
  "devDependencies": {
@@ -1 +1 @@
1
- {"analyzerVersion":"0.1.0","byEvent":{},"diagnostics":[],"generatorVersion":"0.1.0-alpha.13","inputHash":"79dfb93d1a653eb26b0d381ff9c014bbef73c8158c15f809deddf3411cea3a5d","schemaVersion":"0.1.0","subscriptions":[]}
1
+ {"analyzerVersion":"0.1.0","byEvent":{},"diagnostics":[],"generatorVersion":"0.1.0-alpha.14","inputHash":"d246f50ec0b6590b208e20bd19a4b0e5c2fccbbef8dc850013ebc8351f868252","schemaVersion":"0.1.0","subscriptions":[]}
@@ -1,10 +1,10 @@
1
- // @forge-generated generator=0.1.0-alpha.13 input=3f5e1915da753f2190d1baa076ce591a66915ab697552bf8768f4c1c6850b945 content=2df7d5aabe3501aa7f5d24b5fc84d006307908b2897f588606b7705274989936
1
+ // @forge-generated generator=0.1.0-alpha.14 input=675f1561e5787d5107285fb1d3627501242d220f0be03e89adf99930e6c23c69 content=a0a1ce2e74d08ddee1b164b1f3108ec4307c66c766459b641464f4de997c0c8c
2
2
  export const actionSubscriptions = {
3
3
  "analyzerVersion": "0.1.0",
4
4
  "byEvent": {},
5
5
  "diagnostics": [],
6
- "generatorVersion": "0.1.0-alpha.13",
7
- "inputHash": "79dfb93d1a653eb26b0d381ff9c014bbef73c8158c15f809deddf3411cea3a5d",
6
+ "generatorVersion": "0.1.0-alpha.14",
7
+ "inputHash": "d246f50ec0b6590b208e20bd19a4b0e5c2fccbbef8dc850013ebc8351f868252",
8
8
  "schemaVersion": "0.1.0",
9
9
  "subscriptions": []
10
10
  } as const;
@@ -1 +1 @@
1
- {"generatorVersion":"0.1.0-alpha.13","schemaVersion":"0.1.0","sourceHash":"sha256:fde2362416ceb1ddb623130e6b4de62db4e32a9f4fdbc323262fe67fd68ff2a8","targets":[{"adapterVersion":"agent-adapter-0.1.0","default":true,"files":["AGENTS.md",".forge/agent/context.json",".forge/agent/commands.json",".forge/agent/done-criteria.json",".forge/agent/playbooks/add-command.md",".forge/agent/playbooks/add-query.md",".forge/agent/playbooks/add-livequery.md",".forge/agent/playbooks/add-resource.md",".forge/agent/playbooks/refactor-field.md",".forge/agent/playbooks/fix-policy-denied.md",".forge/agent/playbooks/fix-guard-violation.md",".forge/agent/playbooks/upgrade-package.md",".forge/agent/playbooks/debug-trace.md",".forge/agent/playbooks/frontend-change.md",".forge/agent/playbooks/self-host-check.md"],"formatVersion":"2026-06","name":"generic"},{"adapterVersion":"agent-adapter-0.1.0","files":[".codex/skills/forge-add-command/SKILL.md",".codex/skills/forge-add-resource/SKILL.md",".codex/skills/forge-fix-guard-violation/SKILL.md",".codex/skills/forge-fix-policy-denied/SKILL.md",".codex/skills/forge-upgrade-package/SKILL.md",".codex/skills/forge-debug-trace/SKILL.md",".codex/agents/forge-explorer.toml",".codex/agents/forge-worker.toml",".codex/agents/forge-reviewer.toml",".codex/agents/forge-security.toml"],"formatVersion":"2026-06","name":"codex","optional":true},{"adapterVersion":"agent-adapter-0.1.0","files":[".cursor/rules/forge-runtime.mdc",".cursor/rules/forge-frontend.mdc",".cursor/rules/forge-security.mdc",".cursor/rules/forge-workflow.mdc"],"formatVersion":"2026-06","name":"cursor","optional":true},{"adapterVersion":"agent-adapter-0.1.0","files":["CLAUDE.md",".claude/forge-runtime.md",".claude/forge-playbooks.md",".claude/forge-security.md"],"formatVersion":"2026-06","name":"claude","optional":true}]}
1
+ {"generatorVersion":"0.1.0-alpha.14","schemaVersion":"0.1.0","sourceHash":"sha256:face40ad496840bd608c73a8795f1fc7a76c78b6d5b8642f28deb72582224a2b","targets":[{"adapterVersion":"agent-adapter-0.1.0","default":true,"files":["AGENTS.md",".forge/agent/context.json",".forge/agent/commands.json",".forge/agent/done-criteria.json",".forge/agent/playbooks/add-command.md",".forge/agent/playbooks/add-query.md",".forge/agent/playbooks/add-livequery.md",".forge/agent/playbooks/add-resource.md",".forge/agent/playbooks/refactor-field.md",".forge/agent/playbooks/fix-policy-denied.md",".forge/agent/playbooks/fix-guard-violation.md",".forge/agent/playbooks/upgrade-package.md",".forge/agent/playbooks/debug-trace.md",".forge/agent/playbooks/frontend-change.md",".forge/agent/playbooks/self-host-check.md"],"formatVersion":"2026-06","name":"generic"},{"adapterVersion":"agent-adapter-0.1.0","files":[".codex/skills/forge-add-command/SKILL.md",".codex/skills/forge-add-resource/SKILL.md",".codex/skills/forge-fix-guard-violation/SKILL.md",".codex/skills/forge-fix-policy-denied/SKILL.md",".codex/skills/forge-upgrade-package/SKILL.md",".codex/skills/forge-debug-trace/SKILL.md",".codex/agents/forge-explorer.toml",".codex/agents/forge-worker.toml",".codex/agents/forge-reviewer.toml",".codex/agents/forge-security.toml"],"formatVersion":"2026-06","name":"codex","optional":true},{"adapterVersion":"agent-adapter-0.1.0","files":[".cursor/rules/forge-runtime.mdc",".cursor/rules/forge-frontend.mdc",".cursor/rules/forge-security.mdc",".cursor/rules/forge-workflow.mdc"],"formatVersion":"2026-06","name":"cursor","optional":true},{"adapterVersion":"agent-adapter-0.1.0","files":["CLAUDE.md",".claude/forge-runtime.md",".claude/forge-playbooks.md",".claude/forge-security.md"],"formatVersion":"2026-06","name":"claude","optional":true}]}
@@ -1,8 +1,8 @@
1
- // @forge-generated generator=0.1.0-alpha.13 input=3f5e1915da753f2190d1baa076ce591a66915ab697552bf8768f4c1c6850b945 content=cac006bd558c685a57f6ed482c28a92547fa6652a1691f8feccbdfc1a2de8448
1
+ // @forge-generated generator=0.1.0-alpha.14 input=675f1561e5787d5107285fb1d3627501242d220f0be03e89adf99930e6c23c69 content=e32860557c691386b8cc2d8931b3e4023ca20888000b75485d740e5104cca881
2
2
  export const agentAdapterManifest = {
3
- "generatorVersion": "0.1.0-alpha.13",
3
+ "generatorVersion": "0.1.0-alpha.14",
4
4
  "schemaVersion": "0.1.0",
5
- "sourceHash": "sha256:fde2362416ceb1ddb623130e6b4de62db4e32a9f4fdbc323262fe67fd68ff2a8",
5
+ "sourceHash": "sha256:face40ad496840bd608c73a8795f1fc7a76c78b6d5b8642f28deb72582224a2b",
6
6
  "targets": [
7
7
  {
8
8
  "adapterVersion": "agent-adapter-0.1.0",