forgeos 0.1.0-alpha.13 → 0.1.0-alpha.15
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.
- package/AGENTS.md +6 -5
- package/CHANGELOG.md +22 -0
- package/adapters/java/README.md +68 -0
- package/adapters/java/pom.xml +34 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Auth.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
- package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java/target/maven-archiver/pom.properties +3 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -0
- package/adapters/java-spring-boot-starter/README.md +32 -0
- package/adapters/java-spring-boot-starter/pom.xml +36 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
- package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
- package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
- package/docs/changelog.md +8 -0
- package/docs/forge-protocol.md +33 -0
- package/examples/java-billing/pom.xml +52 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
- package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
- package/package.json +4 -1
- package/src/forge/_generated/actionSubscriptions.json +1 -1
- package/src/forge/_generated/actionSubscriptions.ts +3 -3
- package/src/forge/_generated/agentAdapterManifest.json +1 -1
- package/src/forge/_generated/agentAdapterManifest.ts +3 -3
- package/src/forge/_generated/agentContract.json +1 -1
- package/src/forge/_generated/agentContract.ts +1274 -7
- package/src/forge/_generated/agentQuickstart.md +1 -1
- package/src/forge/_generated/agentTools.json +1 -1
- package/src/forge/_generated/agentTools.md +1 -1
- package/src/forge/_generated/agentTools.ts +2 -2
- package/src/forge/_generated/aiContext.ts +1 -1
- package/src/forge/_generated/aiModels.ts +1 -1
- package/src/forge/_generated/aiProviders.ts +1 -1
- package/src/forge/_generated/aiRegistry.json +1 -1
- package/src/forge/_generated/aiRegistry.ts +3 -3
- package/src/forge/_generated/api.json +1 -1
- package/src/forge/_generated/api.ts +1 -1
- package/src/forge/_generated/appGraph.json +1 -1
- package/src/forge/_generated/appGraph.ts +165 -98
- package/src/forge/_generated/appMap.md +1 -1
- package/src/forge/_generated/artifactManifest.json +1 -1
- package/src/forge/_generated/artifactManifest.ts +2 -2
- package/src/forge/_generated/authClaims.ts +1 -1
- package/src/forge/_generated/authConfig.ts +1 -1
- package/src/forge/_generated/authContext.ts +1 -1
- package/src/forge/_generated/authRegistry.ts +1 -1
- package/src/forge/_generated/buildInfo.json +1 -1
- package/src/forge/_generated/buildInfo.ts +4 -4
- package/src/forge/_generated/capabilityMap.json +1 -1
- package/src/forge/_generated/capabilityMap.md +1 -1
- package/src/forge/_generated/capabilityMap.ts +2 -2
- package/src/forge/_generated/client.ts +1 -1
- package/src/forge/_generated/clientApi.ts +1 -1
- package/src/forge/_generated/clientManifest.json +1 -1
- package/src/forge/_generated/clientManifest.ts +14 -3
- package/src/forge/_generated/clientTypes.ts +1 -1
- package/src/forge/_generated/configRegistry.ts +1 -1
- package/src/forge/_generated/dataGraph.json +1 -1
- package/src/forge/_generated/dataGraph.ts +3 -3
- package/src/forge/_generated/db.ts +1 -1
- package/src/forge/_generated/dbSecurityManifest.ts +1 -1
- package/src/forge/_generated/dbSessionContext.ts +1 -1
- package/src/forge/_generated/deployManifest.json +1 -1
- package/src/forge/_generated/deployManifest.ts +7 -7
- package/src/forge/_generated/devManifest.json +1 -1
- package/src/forge/_generated/devManifest.ts +3 -3
- package/src/forge/_generated/envSchema.ts +1 -1
- package/src/forge/_generated/externalServices.ts +1 -1
- package/src/forge/_generated/frontendGraph.ts +1 -1
- package/src/forge/_generated/importGuards.json +1 -1
- package/src/forge/_generated/importGuards.ts +35 -1
- package/src/forge/_generated/index.ts +3 -1
- package/src/forge/_generated/liveProductionManifest.ts +1 -1
- package/src/forge/_generated/liveProtocol.ts +1 -1
- package/src/forge/_generated/liveQueryRegistry.json +1 -1
- package/src/forge/_generated/liveQueryRegistry.ts +3 -3
- package/src/forge/_generated/liveTransportConfig.ts +1 -1
- package/src/forge/_generated/makeRegistry.json +1 -1
- package/src/forge/_generated/makeRegistry.ts +8 -8
- package/src/forge/_generated/makeTemplates.json +1 -1
- package/src/forge/_generated/makeTemplates.ts +2 -2
- package/src/forge/_generated/mockMap.ts +1 -1
- package/src/forge/_generated/operationPlaybooks.md +6 -6
- package/src/forge/_generated/packageGraph.json +1 -1
- package/src/forge/_generated/packageGraph.ts +52412 -2
- package/src/forge/_generated/packageUpgradeRegistry.json +1 -1
- package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
- package/src/forge/_generated/permissionMatrix.json +1 -1
- package/src/forge/_generated/permissionMatrix.ts +3 -3
- package/src/forge/_generated/policyRegistry.json +1 -1
- package/src/forge/_generated/policyRegistry.ts +3 -3
- package/src/forge/_generated/queryRegistry.json +1 -1
- package/src/forge/_generated/queryRegistry.ts +3 -3
- package/src/forge/_generated/react.d.ts +1 -1
- package/src/forge/_generated/react.ts +1 -1
- package/src/forge/_generated/reactManifest.json +1 -1
- package/src/forge/_generated/reactManifest.ts +3 -3
- package/src/forge/_generated/releaseManifest.json +1 -1
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/_generated/rlsPolicies.sql +1 -1
- package/src/forge/_generated/rlsPolicies.ts +1 -1
- package/src/forge/_generated/runtimeGraph.json +1 -1
- package/src/forge/_generated/runtimeGraph.ts +3 -3
- package/src/forge/_generated/runtimeMatrix.json +1 -1
- package/src/forge/_generated/runtimeMatrix.ts +70357 -1
- package/src/forge/_generated/runtimeRegistry.ts +1 -1
- package/src/forge/_generated/runtimeRules.md +1 -1
- package/src/forge/_generated/secretRegistry.ts +1 -1
- package/src/forge/_generated/secretsContext.ts +1 -1
- package/src/forge/_generated/serverApi.ts +1 -1
- package/src/forge/_generated/sourceMapManifest.json +1 -1
- package/src/forge/_generated/sourceMapManifest.ts +2 -2
- package/src/forge/_generated/sqlPlan.ts +1 -1
- package/src/forge/_generated/subscriptionManifest.json +1 -1
- package/src/forge/_generated/subscriptionManifest.ts +3 -3
- package/src/forge/_generated/symbolicationManifest.json +1 -1
- package/src/forge/_generated/symbolicationManifest.ts +2 -2
- package/src/forge/_generated/telemetryRegistry.json +1 -1
- package/src/forge/_generated/telemetryRegistry.ts +3 -3
- package/src/forge/_generated/telemetrySinks.json +1 -1
- package/src/forge/_generated/telemetrySinks.ts +2 -2
- package/src/forge/_generated/tenantScope.json +1 -1
- package/src/forge/_generated/tenantScope.ts +3 -3
- package/src/forge/_generated/testGraph.json +1 -1
- package/src/forge/_generated/testGraph.ts +95 -5
- package/src/forge/_generated/testPlanRegistry.json +1 -1
- package/src/forge/_generated/testPlanRegistry.ts +2 -2
- package/src/forge/_generated/uiRoutes.ts +1 -1
- package/src/forge/_generated/uiScenarios.ts +1 -1
- package/src/forge/_generated/uiTestManifest.json +1 -1
- package/src/forge/_generated/uiTestManifest.ts +2 -2
- package/src/forge/_generated/vue.d.ts +25 -0
- package/src/forge/_generated/vue.ts +30 -0
- package/src/forge/_generated/vueManifest.json +1 -0
- package/src/forge/_generated/vueManifest.ts +19 -0
- package/src/forge/_generated/workflowRegistry.json +1 -1
- package/src/forge/_generated/workflowRegistry.ts +3 -3
- package/src/forge/_generated/workflowSubscriptions.json +1 -1
- package/src/forge/_generated/workflowSubscriptions.ts +3 -3
- package/src/forge/agent-adapters/index.ts +1 -1
- package/src/forge/brownfield-import/index.ts +726 -0
- package/src/forge/brownfield-import/types.ts +127 -0
- package/src/forge/cli/commands.ts +27 -0
- package/src/forge/cli/parse.ts +27 -1
- package/src/forge/cli/verify.ts +2 -0
- package/src/forge/compiler/agent-contract/build.ts +10 -9
- package/src/forge/compiler/client-sdk/build-manifest.ts +55 -0
- package/src/forge/compiler/client-sdk/render-client.ts +66 -1
- package/src/forge/compiler/diagnostics/create.ts +6 -1
- package/src/forge/compiler/emitter/barrel.ts +3 -0
- package/src/forge/compiler/frontend-graph/build.ts +85 -13
- package/src/forge/compiler/make-registry/build.ts +6 -7
- package/src/forge/compiler/orchestrator/plan.ts +13 -0
- package/src/forge/compiler/orchestrator/serialize.ts +6 -0
- package/src/forge/compiler/types/cli.ts +1 -0
- package/src/forge/compiler/types/frontend-graph.ts +2 -2
- package/src/forge/intent/index.ts +11 -6
- package/src/forge/make/index.ts +23 -3
- package/src/forge/make/templates.ts +153 -0
- package/src/forge/make/types.ts +2 -1
- package/src/forge/version.ts +1 -1
- 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 @@
|
|
|
1
|
+
dev.forgeos.adapter.spring.ForgeSpringAutoConfiguration
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
dev.forgeos.adapter.spring.ForgeSpringAutoConfiguration
|
|
Binary file
|
|
Binary file
|
package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar
ADDED
|
Binary file
|
|
@@ -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
|
package/docs/changelog.md
CHANGED
|
@@ -4,6 +4,14 @@ Release history for the `forgeos` npm package (`alpha` dist-tag).
|
|
|
4
4
|
|
|
5
5
|
The canonical source file in the repository is `CHANGELOG.md`.
|
|
6
6
|
|
|
7
|
+
## 0.1.0-alpha.15
|
|
8
|
+
|
|
9
|
+
Brownfield import analysis:
|
|
10
|
+
|
|
11
|
+
- Added H49 `forge import analyze`, `forge import inspect`, and `forge inspect imported --json`.
|
|
12
|
+
- Emits `.forge/import` inventory, route, frontend call, candidate entry, risk, migration plan, and imported agent contract artifacts.
|
|
13
|
+
- Keeps every imported entry hidden from agents until review, with approval required for command-like or risky static detections.
|
|
14
|
+
|
|
7
15
|
## 0.1.0-alpha.11
|
|
8
16
|
|
|
9
17
|
Strict verify performance:
|
package/docs/forge-protocol.md
CHANGED
|
@@ -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,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
|
+
}
|
package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class
ADDED
|
Binary file
|
|
Binary file
|
package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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.
|
|
3
|
+
"version": "0.1.0-alpha.15",
|
|
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.
|
|
1
|
+
{"analyzerVersion":"0.1.0","byEvent":{},"diagnostics":[],"generatorVersion":"0.1.0-alpha.15","inputHash":"cf4b38527209eb93b75b8f585c4b76ed442a8608d81a1e63785449a6a7d0f317","schemaVersion":"0.1.0","subscriptions":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// @forge-generated generator=0.1.0-alpha.
|
|
1
|
+
// @forge-generated generator=0.1.0-alpha.15 input=50ce058c9a7e6379325bc880214b9b81c3a8f5ef6fda220882d61252e27ec10f content=8085271bd36aca4694f48d2ef71ea44656e03b520e952951747f87559cbdd0cd
|
|
2
2
|
export const actionSubscriptions = {
|
|
3
3
|
"analyzerVersion": "0.1.0",
|
|
4
4
|
"byEvent": {},
|
|
5
5
|
"diagnostics": [],
|
|
6
|
-
"generatorVersion": "0.1.0-alpha.
|
|
7
|
-
"inputHash": "
|
|
6
|
+
"generatorVersion": "0.1.0-alpha.15",
|
|
7
|
+
"inputHash": "cf4b38527209eb93b75b8f585c4b76ed442a8608d81a1e63785449a6a7d0f317",
|
|
8
8
|
"schemaVersion": "0.1.0",
|
|
9
9
|
"subscriptions": []
|
|
10
10
|
} as const;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"generatorVersion":"0.1.0-alpha.
|
|
1
|
+
{"generatorVersion":"0.1.0-alpha.15","schemaVersion":"0.1.0","sourceHash":"sha256:db33c02b7c577b4a90e4cbe54adfb14cf3a42b86d29729665ac6d709b8b18075","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.
|
|
1
|
+
// @forge-generated generator=0.1.0-alpha.15 input=50ce058c9a7e6379325bc880214b9b81c3a8f5ef6fda220882d61252e27ec10f content=9ba520221dc67100b75e451ce0bc42357ba4e4d953164891f49f4511034c42dd
|
|
2
2
|
export const agentAdapterManifest = {
|
|
3
|
-
"generatorVersion": "0.1.0-alpha.
|
|
3
|
+
"generatorVersion": "0.1.0-alpha.15",
|
|
4
4
|
"schemaVersion": "0.1.0",
|
|
5
|
-
"sourceHash": "sha256:
|
|
5
|
+
"sourceHash": "sha256:db33c02b7c577b4a90e4cbe54adfb14cf3a42b86d29729665ac6d709b8b18075",
|
|
6
6
|
"targets": [
|
|
7
7
|
{
|
|
8
8
|
"adapterVersion": "agent-adapter-0.1.0",
|