forgeos 0.1.0-alpha.65 → 0.1.0-alpha.67
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/.npmignore +19 -19
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +24 -0
- package/LICENSE +21 -21
- package/README.md +525 -525
- package/adapters/java/README.md +68 -68
- package/adapters/java/pom.xml +47 -47
- package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -20
- package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -16
- package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -38
- package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -16
- package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -4
- package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -94
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -12
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -11
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -8
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -179
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -121
- package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -14
- package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -14
- package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -6
- package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -25
- package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -18
- package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -36
- package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -65
- package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -18
- package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -6
- package/adapters/java-spring-boot-starter/README.md +32 -32
- package/adapters/java-spring-boot-starter/pom.xml +49 -49
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -22
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -15
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -16
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -18
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -16
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -104
- package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -1
- package/bin/forge.mjs +38 -38
- package/docs/agent-fabric.md +131 -0
- package/examples/java-billing/pom.xml +60 -60
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -4
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -11
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -127
- package/package.json +5 -4
- package/packages/eslint-plugin-forge/index.ts +15 -15
- package/packages/eslint-plugin-forge/package.json +10 -10
- package/packages/eslint-plugin-forge/src/check-source.ts +95 -95
- package/packages/eslint-plugin-forge/src/load-artifacts.ts +24 -24
- package/packages/eslint-plugin-forge/src/rule-no-forge-guard-violation.ts +93 -93
- package/schemas/agent-fabric/v0.1/control-event.schema.json +281 -281
- package/scripts/field-test-forgeos.mjs +1021 -1021
- package/src/forge/_generated/releaseManifest.json +1 -1
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/agent-adapters/index.ts +7 -3
- package/src/forge/agent-adapters/types.ts +1 -0
- package/src/forge/agent-fabric/attached-snapshot.ts +55 -0
- package/src/forge/agent-fabric/attached-task-contract.ts +105 -0
- package/src/forge/agent-fabric/attached-task-service.ts +127 -0
- package/src/forge/agent-fabric/attached-task-store.ts +109 -0
- package/src/forge/agent-fabric/codex-adversarial-review.ts +229 -0
- package/src/forge/agent-fabric/codex-sdk-worker.ts +163 -0
- package/src/forge/agent-fabric/index.ts +19 -0
- package/src/forge/agent-fabric/local-adaptive-digest-worker.mjs +26 -26
- package/src/forge/agent-fabric/local-change-review-service.ts +374 -0
- package/src/forge/agent-fabric/local-task-server.ts +324 -249
- package/src/forge/agent-fabric/managed-environment.ts +205 -0
- package/src/forge/agent-fabric/managed-run-contract.ts +102 -0
- package/src/forge/agent-fabric/managed-run-service.ts +392 -0
- package/src/forge/agent-fabric/managed-run-store.ts +135 -0
- package/src/forge/agent-fabric/managed-workspace.ts +214 -0
- package/src/forge/agent-fabric/readiness.ts +26 -0
- package/src/forge/agent-fabric/workflow-engine.ts +218 -0
- package/src/forge/agent-fabric/workflow-task-actions.ts +104 -0
- package/src/forge/agent-fabric/workflow-templates.ts +11 -0
- package/src/forge/agent-memory/bridge.ts +309 -47
- package/src/forge/agent-memory/context-pack.ts +8 -1
- package/src/forge/agent-memory/hook-runner.ts +38 -19
- package/src/forge/agent-memory/mcp.ts +500 -286
- package/src/forge/agent-memory/sources/codex-hook-runner.mjs +343 -234
- package/src/forge/agent-memory/sources/codex.ts +49 -7
- package/src/forge/agent-memory/types.ts +11 -0
- package/src/forge/bench.ts +154 -154
- package/src/forge/cair/action-journal.ts +61 -61
- package/src/forge/cair/action-parser.ts +314 -314
- package/src/forge/cair/action-validator.ts +40 -40
- package/src/forge/cair/actions.ts +1818 -1818
- package/src/forge/cair/format.ts +77 -77
- package/src/forge/cair/index.ts +106 -106
- package/src/forge/cair/query.ts +478 -478
- package/src/forge/cair/snapshot.ts +315 -315
- package/src/forge/cair/types.ts +248 -248
- package/src/forge/cli/ai.ts +816 -816
- package/src/forge/cli/codex-app-server.ts +877 -877
- package/src/forge/cli/fabric.ts +205 -131
- package/src/forge/cli/index.ts +26 -26
- package/src/forge/cli/main.ts +259 -245
- package/src/forge/cli/next-actions.ts +23 -23
- package/src/forge/cli/parse.ts +3574 -3542
- package/src/forge/cli/release.ts +309 -309
- package/src/forge/cli/self-host.ts +510 -510
- package/src/forge/compiler/ai-registry/parse.ts +219 -219
- package/src/forge/compiler/app-graph/classify.ts +10 -10
- package/src/forge/compiler/app-graph/dup-symbol.ts +29 -29
- package/src/forge/compiler/app-graph/extract.ts +231 -231
- package/src/forge/compiler/app-graph/forge-apis.ts +25 -25
- package/src/forge/compiler/app-graph/index.ts +11 -11
- package/src/forge/compiler/app-graph/module-graph.ts +151 -151
- package/src/forge/compiler/app-graph/parser.ts +71 -71
- package/src/forge/compiler/app-graph/symbols.ts +48 -48
- package/src/forge/compiler/app-graph/types.ts +43 -43
- package/src/forge/compiler/app-graph/versions.ts +14 -14
- package/src/forge/compiler/cache/index.ts +17 -17
- package/src/forge/compiler/cache/key.ts +46 -46
- package/src/forge/compiler/cache/scheduler.ts +72 -72
- package/src/forge/compiler/cache/store.ts +78 -78
- package/src/forge/compiler/classifier/capabilities.ts +64 -64
- package/src/forge/compiler/classifier/classify.ts +76 -76
- package/src/forge/compiler/classifier/contexts.ts +188 -188
- package/src/forge/compiler/classifier/index.ts +18 -18
- package/src/forge/compiler/classifier/runtime-matrix.ts +45 -45
- package/src/forge/compiler/classifier/secrets.ts +31 -31
- package/src/forge/compiler/classifier/signals.ts +95 -95
- package/src/forge/compiler/client-sdk/build-manifest.ts +210 -210
- package/src/forge/compiler/data-graph/sql/serialize.ts +89 -89
- package/src/forge/compiler/data-graph/sql/types.ts +38 -38
- package/src/forge/compiler/diagnostics/index.ts +57 -57
- package/src/forge/compiler/emitter/artifact-kind.ts +14 -14
- package/src/forge/compiler/emitter/barrel.ts +47 -47
- package/src/forge/compiler/emitter/constants.ts +7 -7
- package/src/forge/compiler/emitter/emit.ts +223 -223
- package/src/forge/compiler/emitter/index.ts +24 -24
- package/src/forge/compiler/emitter/lock.ts +61 -61
- package/src/forge/compiler/external-manifest/registry.ts +205 -205
- package/src/forge/compiler/external-manifest/types.ts +91 -91
- package/src/forge/compiler/external-manifest/validate.ts +373 -373
- package/src/forge/compiler/frontend-graph/build.ts +623 -623
- package/src/forge/compiler/guards/artifacts.ts +96 -96
- package/src/forge/compiler/guards/check-import-guards.ts +106 -106
- package/src/forge/compiler/guards/index.ts +11 -11
- package/src/forge/compiler/guards/propagate-contexts.ts +57 -57
- package/src/forge/compiler/index.ts +17 -17
- package/src/forge/compiler/integration/index.ts +17 -17
- package/src/forge/compiler/integration/snapshot.ts +54 -54
- package/src/forge/compiler/integration/templates/convex.ts +70 -70
- package/src/forge/compiler/orchestrator/discover.ts +214 -214
- package/src/forge/compiler/orchestrator/guards.ts +5 -5
- package/src/forge/compiler/orchestrator/index.ts +27 -27
- package/src/forge/compiler/orchestrator/orphans.ts +51 -51
- package/src/forge/compiler/orchestrator/profile.ts +23 -23
- package/src/forge/compiler/orchestrator/serialize.ts +979 -979
- package/src/forge/compiler/orchestrator/verify.ts +35 -35
- package/src/forge/compiler/package-graph/capabilities-stub.ts +33 -33
- package/src/forge/compiler/package-graph/checksum.ts +107 -107
- package/src/forge/compiler/package-graph/exports-discovery.ts +91 -91
- package/src/forge/compiler/package-graph/extract-dts.ts +32 -32
- package/src/forge/compiler/package-graph/index.ts +24 -24
- package/src/forge/compiler/package-graph/jsdoc.ts +50 -50
- package/src/forge/compiler/package-graph/oracle.ts +326 -326
- package/src/forge/compiler/package-graph/read-file.ts +21 -21
- package/src/forge/compiler/package-graph/resolve.ts +131 -131
- package/src/forge/compiler/package-manager/adapter.ts +240 -240
- package/src/forge/compiler/package-manager/commands.ts +51 -51
- package/src/forge/compiler/package-manager/detect.ts +65 -65
- package/src/forge/compiler/package-manager/executor.ts +146 -146
- package/src/forge/compiler/package-manager/index.ts +22 -22
- package/src/forge/compiler/package-manager/parse-spec.ts +16 -16
- package/src/forge/compiler/primitives/compare.ts +26 -26
- package/src/forge/compiler/primitives/hash.ts +29 -29
- package/src/forge/compiler/primitives/header.ts +43 -43
- package/src/forge/compiler/primitives/index.ts +45 -45
- package/src/forge/compiler/primitives/paths.ts +24 -24
- package/src/forge/compiler/primitives/serialize.ts +66 -66
- package/src/forge/compiler/primitives/sort.ts +87 -87
- package/src/forge/compiler/recipes/helpers.ts +37 -37
- package/src/forge/compiler/sandbox/artifact-sanitize.ts +26 -26
- package/src/forge/compiler/sandbox/backends/child.ts +123 -123
- package/src/forge/compiler/sandbox/backends/docker.ts +173 -173
- package/src/forge/compiler/sandbox/index.ts +51 -51
- package/src/forge/compiler/sandbox/inspect.ts +143 -143
- package/src/forge/compiler/sandbox/inspector-entry.ts +115 -115
- package/src/forge/compiler/sandbox/limits.ts +31 -31
- package/src/forge/compiler/sandbox/scrub-env.ts +60 -60
- package/src/forge/compiler/sandbox/secret-scan.ts +54 -54
- package/src/forge/compiler/sandbox/serialize.ts +106 -106
- package/src/forge/compiler/sandbox/types.ts +7 -7
- package/src/forge/compiler/test-graph/build.ts +285 -285
- package/src/forge/compiler/types/app-graph.ts +87 -87
- package/src/forge/compiler/types/capability.ts +29 -29
- package/src/forge/compiler/types/classification.ts +9 -9
- package/src/forge/compiler/types/diagnostic.ts +2 -2
- package/src/forge/compiler/types/frontend-graph.ts +81 -81
- package/src/forge/compiler/types/import-guards.ts +19 -19
- package/src/forge/compiler/types/index.ts +98 -98
- package/src/forge/compiler/types/json.ts +3 -3
- package/src/forge/compiler/types/lock.ts +37 -37
- package/src/forge/compiler/types/runtime-matrix.ts +16 -16
- package/src/forge/compiler/types/runtime.ts +30 -30
- package/src/forge/compiler/types/sandbox.ts +24 -24
- package/src/forge/delta/broker-runner.mjs +5 -0
- package/src/forge/delta/broker.ts +429 -0
- package/src/forge/delta/classifier.ts +52 -52
- package/src/forge/delta/explain.ts +238 -238
- package/src/forge/delta/git-observer.ts +24 -0
- package/src/forge/delta/ids.ts +40 -40
- package/src/forge/delta/index.ts +25 -25
- package/src/forge/delta/process-identity.ts +31 -0
- package/src/forge/delta/queue-status.ts +190 -0
- package/src/forge/delta/redaction.ts +50 -50
- package/src/forge/delta/schema.ts +135 -135
- package/src/forge/delta/session.ts +142 -142
- package/src/forge/delta/status.ts +82 -145
- package/src/forge/delta/store.ts +77 -32
- package/src/forge/delta/timeline.ts +178 -178
- package/src/forge/dev/types.ts +63 -63
- package/src/forge/dev/watch.ts +119 -119
- package/src/forge/intent/index.ts +509 -509
- package/src/forge/make/types.ts +153 -153
- package/src/forge/refactor/index.ts +1937 -1937
- package/src/forge/refactor/runtime-rename.ts +598 -598
- package/src/forge/repair/rules/index.ts +476 -476
- package/src/forge/review/types.ts +211 -211
- package/src/forge/runtime/db/generated-client.ts +305 -305
- package/src/forge/runtime/db/pglite-adapter.ts +33 -11
- package/src/forge/runtime/runner/run-entry.ts +236 -236
- package/src/forge/version.ts +1 -1
- package/templates/agent-workroom/AGENTS.md +29 -29
- package/templates/agent-workroom/README.md +34 -34
- package/templates/agent-workroom/forge.config.ts +3 -3
- package/templates/agent-workroom/package.json +34 -34
- package/templates/agent-workroom/pnpm-workspace.yaml +2 -2
- package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -10
- package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -61
- package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -119
- package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -52
- package/templates/agent-workroom/src/forge/schema.ts +54 -54
- package/templates/agent-workroom/src/policies.ts +6 -6
- package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -11
- package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -63
- package/templates/agent-workroom/tsconfig.json +16 -16
- package/templates/agent-workroom/web/index.html +13 -13
- package/templates/agent-workroom/web/package.json +21 -21
- package/templates/agent-workroom/web/src/App.tsx +345 -345
- package/templates/agent-workroom/web/src/main.tsx +13 -13
- package/templates/agent-workroom/web/src/styles.css +545 -545
- package/templates/agent-workroom/web/tsconfig.json +27 -27
- package/templates/b2b-support-web/package.json +37 -37
- package/templates/b2b-support-web/pnpm-workspace.yaml +2 -2
- package/templates/b2b-support-web/web/package.json +21 -21
- package/templates/minimal-web/package.json +34 -34
- package/templates/minimal-web/pnpm-workspace.yaml +2 -2
- package/templates/minimal-web/web/index.html +13 -13
- package/templates/minimal-web/web/src/styles.css +190 -190
- package/templates/nuxt-web/.vscode/settings.json +14 -14
- package/templates/nuxt-web/.yarnrc.yml +1 -1
- package/templates/nuxt-web/README.md +30 -30
- package/templates/nuxt-web/forge.config.ts +3 -3
- package/templates/nuxt-web/package.json +34 -34
- package/templates/nuxt-web/pnpm-workspace.yaml +2 -2
- package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -11
- package/templates/nuxt-web/src/commands/createNote.ts +26 -26
- package/templates/nuxt-web/src/forge/schema.ts +12 -12
- package/templates/nuxt-web/src/policies.ts +6 -6
- package/templates/nuxt-web/src/queries/listNotes.ts +8 -8
- package/templates/nuxt-web/src/queries/liveNotes.ts +8 -8
- package/templates/nuxt-web/tsconfig.json +17 -17
- package/templates/nuxt-web/web/app.vue +67 -67
- package/templates/nuxt-web/web/components/LiveNotes.vue +89 -89
- package/templates/nuxt-web/web/components/NoteComposer.vue +100 -100
- package/templates/nuxt-web/web/composables/forge.ts +13 -13
- package/templates/nuxt-web/web/composables/useNotes.ts +24 -24
- package/templates/nuxt-web/web/nuxt.config.ts +11 -11
- package/templates/nuxt-web/web/package.json +19 -19
- package/templates/nuxt-web/web/plugins/forge.client.ts +10 -10
- package/templates/nuxt-web/web/plugins/forge.server.ts +10 -10
- package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -7
- package/templates/nuxt-web/web/tsconfig.json +6 -6
- package/templates/vendor-access/.vscode/settings.json +14 -14
- package/templates/vendor-access/README.md +30 -30
- package/templates/vendor-access/package.json +35 -35
- package/templates/vendor-access/pnpm-workspace.yaml +2 -2
- package/templates/vendor-access/tsconfig.json +17 -17
- package/templates/vendor-access/web/index.html +13 -13
- package/templates/vendor-access/web/package.json +21 -21
- package/templates/vendor-access/web/src/styles.css +682 -682
- package/templates/vendor-access/web/tsconfig.json +18 -18
|
@@ -1,11 +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
|
-
}
|
|
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
|
+
}
|
|
@@ -1,127 +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
|
-
}
|
|
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/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.67",
|
|
4
4
|
"description": "Agent-native application framework and compiler for building Forge apps without a mandatory dashboard.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -105,6 +105,7 @@
|
|
|
105
105
|
"@ai-sdk/anthropic": "^3.0.84",
|
|
106
106
|
"@ai-sdk/openai": "^3.0.71",
|
|
107
107
|
"@electric-sql/pglite": "^0.2.17",
|
|
108
|
+
"@openai/codex-sdk": "0.160.0",
|
|
108
109
|
"@types/react": "^19.2.17",
|
|
109
110
|
"ai": "^6.0.205",
|
|
110
111
|
"jose": "^6.2.3",
|
|
@@ -118,8 +119,8 @@
|
|
|
118
119
|
"zod": "^3.25.76"
|
|
119
120
|
},
|
|
120
121
|
"devDependencies": {
|
|
121
|
-
"@changesets/changelog-github": "^0.
|
|
122
|
-
"@changesets/cli": "^
|
|
122
|
+
"@changesets/changelog-github": "^1.0.1",
|
|
123
|
+
"@changesets/cli": "^3.0.3",
|
|
123
124
|
"@types/bun": "1.3.14",
|
|
124
125
|
"@types/node": "^24.0.0",
|
|
125
126
|
"@types/react-test-renderer": "^19.1.0",
|
|
@@ -130,4 +131,4 @@
|
|
|
130
131
|
"overrides": {
|
|
131
132
|
"read-yaml-file": "^3.0.0"
|
|
132
133
|
}
|
|
133
|
-
}
|
|
134
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
export {
|
|
2
|
-
loadForgeGuardArtifacts,
|
|
3
|
-
type ForgeGuardArtifacts,
|
|
4
|
-
} from "./src/load-artifacts.ts";
|
|
5
|
-
export {
|
|
6
|
-
checkSourceForgeGuards,
|
|
7
|
-
type ForgeGuardSourceViolation,
|
|
8
|
-
} from "./src/check-source.ts";
|
|
9
|
-
export {
|
|
10
|
-
runForgeGuardRule,
|
|
11
|
-
forgeGuardRuleDefinition,
|
|
12
|
-
formatViolationMessage,
|
|
13
|
-
type ForgeEslintContext,
|
|
14
|
-
type ForgeEslintSettings,
|
|
15
|
-
} from "./src/rule-no-forge-guard-violation.ts";
|
|
1
|
+
export {
|
|
2
|
+
loadForgeGuardArtifacts,
|
|
3
|
+
type ForgeGuardArtifacts,
|
|
4
|
+
} from "./src/load-artifacts.ts";
|
|
5
|
+
export {
|
|
6
|
+
checkSourceForgeGuards,
|
|
7
|
+
type ForgeGuardSourceViolation,
|
|
8
|
+
} from "./src/check-source.ts";
|
|
9
|
+
export {
|
|
10
|
+
runForgeGuardRule,
|
|
11
|
+
forgeGuardRuleDefinition,
|
|
12
|
+
formatViolationMessage,
|
|
13
|
+
type ForgeEslintContext,
|
|
14
|
+
type ForgeEslintSettings,
|
|
15
|
+
} from "./src/rule-no-forge-guard-violation.ts";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "eslint-plugin-forge",
|
|
3
|
-
"version": "0.0.0",
|
|
4
|
-
"private": true,
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./index.ts",
|
|
7
|
-
"exports": {
|
|
8
|
-
".": "./index.ts"
|
|
9
|
-
}
|
|
10
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "eslint-plugin-forge",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./index.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./index.ts"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
import { lookupMatrixEntry } from "../../../src/forge/compiler/classifier/runtime-matrix.ts";
|
|
2
|
-
import type { ImportGuardsArtifact } from "../../../src/forge/compiler/types/import-guards.ts";
|
|
3
|
-
import type { RuntimeContext } from "../../../src/forge/compiler/types/runtime.ts";
|
|
4
|
-
import type { RuntimeMatrix } from "../../../src/forge/compiler/types/runtime-matrix.ts";
|
|
5
|
-
import { parsePackageSpecifier } from "../../../src/forge/compiler/app-graph/module-graph.ts";
|
|
6
|
-
|
|
7
|
-
export interface ForgeGuardSourceViolation {
|
|
8
|
-
packageName: string;
|
|
9
|
-
context: RuntimeContext;
|
|
10
|
-
rationale: string;
|
|
11
|
-
line: number;
|
|
12
|
-
column: number;
|
|
13
|
-
endColumn: number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const IMPORT_PATTERN =
|
|
17
|
-
/(?:import\s+(?:type\s+)?(?:[\w*{}\s,]+from\s+)?|export\s+(?:type\s+)?(?:[\w*{}\s,]+from\s+)?)['"]([^'"]+)['"]|require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
|
|
18
|
-
|
|
19
|
-
function lineColumnAtOffset(
|
|
20
|
-
source: string,
|
|
21
|
-
offset: number,
|
|
22
|
-
): { line: number; column: number } {
|
|
23
|
-
const before = source.slice(0, offset);
|
|
24
|
-
const lines = before.split("\n");
|
|
25
|
-
return {
|
|
26
|
-
line: lines.length,
|
|
27
|
-
column: (lines.at(-1)?.length ?? 0) + 1,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function effectiveContextsForFile(
|
|
32
|
-
file: string,
|
|
33
|
-
guards: ImportGuardsArtifact,
|
|
34
|
-
): RuntimeContext[] {
|
|
35
|
-
const normalized = file.replace(/\\/g, "/");
|
|
36
|
-
const entry = guards.moduleContexts.find(
|
|
37
|
-
(module) =>
|
|
38
|
-
module.file === normalized ||
|
|
39
|
-
normalized.endsWith(`/${module.file}`) ||
|
|
40
|
-
module.file.endsWith(normalized),
|
|
41
|
-
);
|
|
42
|
-
return entry?.effectiveContexts ?? [];
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function checkSourceForgeGuards(
|
|
46
|
-
filePath: string,
|
|
47
|
-
source: string,
|
|
48
|
-
importGuards: ImportGuardsArtifact,
|
|
49
|
-
runtimeMatrix: RuntimeMatrix,
|
|
50
|
-
): ForgeGuardSourceViolation[] {
|
|
51
|
-
const effectiveContexts = effectiveContextsForFile(filePath, importGuards);
|
|
52
|
-
if (effectiveContexts.length === 0) {
|
|
53
|
-
return [];
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const violations: ForgeGuardSourceViolation[] = [];
|
|
57
|
-
|
|
58
|
-
for (const match of source.matchAll(IMPORT_PATTERN)) {
|
|
59
|
-
const specifier = match[1] ?? match[2];
|
|
60
|
-
if (!specifier) {
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const parsed = parsePackageSpecifier(specifier);
|
|
65
|
-
if (!parsed) {
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const matrixEntry = lookupMatrixEntry(runtimeMatrix, parsed.packageName);
|
|
70
|
-
if (matrixEntry == null) {
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const offset = match.index ?? 0;
|
|
75
|
-
const start = lineColumnAtOffset(source, offset);
|
|
76
|
-
const endColumn = start.column + match[0].length;
|
|
77
|
-
|
|
78
|
-
for (const context of effectiveContexts) {
|
|
79
|
-
if (!matrixEntry.compatible.includes(context)) {
|
|
80
|
-
violations.push({
|
|
81
|
-
packageName: parsed.packageName,
|
|
82
|
-
context,
|
|
83
|
-
rationale:
|
|
84
|
-
matrixEntry.rationale[context] ??
|
|
85
|
-
"package is incompatible with this runtime context",
|
|
86
|
-
line: start.line,
|
|
87
|
-
column: start.column,
|
|
88
|
-
endColumn,
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return violations;
|
|
95
|
-
}
|
|
1
|
+
import { lookupMatrixEntry } from "../../../src/forge/compiler/classifier/runtime-matrix.ts";
|
|
2
|
+
import type { ImportGuardsArtifact } from "../../../src/forge/compiler/types/import-guards.ts";
|
|
3
|
+
import type { RuntimeContext } from "../../../src/forge/compiler/types/runtime.ts";
|
|
4
|
+
import type { RuntimeMatrix } from "../../../src/forge/compiler/types/runtime-matrix.ts";
|
|
5
|
+
import { parsePackageSpecifier } from "../../../src/forge/compiler/app-graph/module-graph.ts";
|
|
6
|
+
|
|
7
|
+
export interface ForgeGuardSourceViolation {
|
|
8
|
+
packageName: string;
|
|
9
|
+
context: RuntimeContext;
|
|
10
|
+
rationale: string;
|
|
11
|
+
line: number;
|
|
12
|
+
column: number;
|
|
13
|
+
endColumn: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const IMPORT_PATTERN =
|
|
17
|
+
/(?:import\s+(?:type\s+)?(?:[\w*{}\s,]+from\s+)?|export\s+(?:type\s+)?(?:[\w*{}\s,]+from\s+)?)['"]([^'"]+)['"]|require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
|
|
18
|
+
|
|
19
|
+
function lineColumnAtOffset(
|
|
20
|
+
source: string,
|
|
21
|
+
offset: number,
|
|
22
|
+
): { line: number; column: number } {
|
|
23
|
+
const before = source.slice(0, offset);
|
|
24
|
+
const lines = before.split("\n");
|
|
25
|
+
return {
|
|
26
|
+
line: lines.length,
|
|
27
|
+
column: (lines.at(-1)?.length ?? 0) + 1,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function effectiveContextsForFile(
|
|
32
|
+
file: string,
|
|
33
|
+
guards: ImportGuardsArtifact,
|
|
34
|
+
): RuntimeContext[] {
|
|
35
|
+
const normalized = file.replace(/\\/g, "/");
|
|
36
|
+
const entry = guards.moduleContexts.find(
|
|
37
|
+
(module) =>
|
|
38
|
+
module.file === normalized ||
|
|
39
|
+
normalized.endsWith(`/${module.file}`) ||
|
|
40
|
+
module.file.endsWith(normalized),
|
|
41
|
+
);
|
|
42
|
+
return entry?.effectiveContexts ?? [];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function checkSourceForgeGuards(
|
|
46
|
+
filePath: string,
|
|
47
|
+
source: string,
|
|
48
|
+
importGuards: ImportGuardsArtifact,
|
|
49
|
+
runtimeMatrix: RuntimeMatrix,
|
|
50
|
+
): ForgeGuardSourceViolation[] {
|
|
51
|
+
const effectiveContexts = effectiveContextsForFile(filePath, importGuards);
|
|
52
|
+
if (effectiveContexts.length === 0) {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const violations: ForgeGuardSourceViolation[] = [];
|
|
57
|
+
|
|
58
|
+
for (const match of source.matchAll(IMPORT_PATTERN)) {
|
|
59
|
+
const specifier = match[1] ?? match[2];
|
|
60
|
+
if (!specifier) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const parsed = parsePackageSpecifier(specifier);
|
|
65
|
+
if (!parsed) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const matrixEntry = lookupMatrixEntry(runtimeMatrix, parsed.packageName);
|
|
70
|
+
if (matrixEntry == null) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const offset = match.index ?? 0;
|
|
75
|
+
const start = lineColumnAtOffset(source, offset);
|
|
76
|
+
const endColumn = start.column + match[0].length;
|
|
77
|
+
|
|
78
|
+
for (const context of effectiveContexts) {
|
|
79
|
+
if (!matrixEntry.compatible.includes(context)) {
|
|
80
|
+
violations.push({
|
|
81
|
+
packageName: parsed.packageName,
|
|
82
|
+
context,
|
|
83
|
+
rationale:
|
|
84
|
+
matrixEntry.rationale[context] ??
|
|
85
|
+
"package is incompatible with this runtime context",
|
|
86
|
+
line: start.line,
|
|
87
|
+
column: start.column,
|
|
88
|
+
endColumn,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return violations;
|
|
95
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { stripDeterministicHeader } from "../../../src/forge/compiler/primitives/header.ts";
|
|
3
|
-
import type { ImportGuardsArtifact } from "../../../src/forge/compiler/types/import-guards.ts";
|
|
4
|
-
import type { RuntimeMatrix } from "../../../src/forge/compiler/types/runtime-matrix.ts";
|
|
5
|
-
|
|
6
|
-
export interface ForgeGuardArtifacts {
|
|
7
|
-
importGuards: ImportGuardsArtifact;
|
|
8
|
-
runtimeMatrix: RuntimeMatrix;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function parseGeneratedJson<T>(path: string): T {
|
|
12
|
-
const raw = stripDeterministicHeader(readFileSync(path, "utf8"));
|
|
13
|
-
return JSON.parse(raw) as T;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function loadForgeGuardArtifacts(
|
|
17
|
-
importGuardsPath: string,
|
|
18
|
-
runtimeMatrixPath: string,
|
|
19
|
-
): ForgeGuardArtifacts {
|
|
20
|
-
const importGuards = parseGeneratedJson<ImportGuardsArtifact>(importGuardsPath);
|
|
21
|
-
const runtimeMatrix = parseGeneratedJson<RuntimeMatrix>(runtimeMatrixPath);
|
|
22
|
-
|
|
23
|
-
return { importGuards, runtimeMatrix };
|
|
24
|
-
}
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { stripDeterministicHeader } from "../../../src/forge/compiler/primitives/header.ts";
|
|
3
|
+
import type { ImportGuardsArtifact } from "../../../src/forge/compiler/types/import-guards.ts";
|
|
4
|
+
import type { RuntimeMatrix } from "../../../src/forge/compiler/types/runtime-matrix.ts";
|
|
5
|
+
|
|
6
|
+
export interface ForgeGuardArtifacts {
|
|
7
|
+
importGuards: ImportGuardsArtifact;
|
|
8
|
+
runtimeMatrix: RuntimeMatrix;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function parseGeneratedJson<T>(path: string): T {
|
|
12
|
+
const raw = stripDeterministicHeader(readFileSync(path, "utf8"));
|
|
13
|
+
return JSON.parse(raw) as T;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function loadForgeGuardArtifacts(
|
|
17
|
+
importGuardsPath: string,
|
|
18
|
+
runtimeMatrixPath: string,
|
|
19
|
+
): ForgeGuardArtifacts {
|
|
20
|
+
const importGuards = parseGeneratedJson<ImportGuardsArtifact>(importGuardsPath);
|
|
21
|
+
const runtimeMatrix = parseGeneratedJson<RuntimeMatrix>(runtimeMatrixPath);
|
|
22
|
+
|
|
23
|
+
return { importGuards, runtimeMatrix };
|
|
24
|
+
}
|