forgeos 0.1.0-alpha.2 → 0.1.0-alpha.4

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 (180) hide show
  1. package/AGENTS.md +38 -3
  2. package/CHANGELOG.md +29 -0
  3. package/README.md +25 -10
  4. package/package.json +8 -5
  5. package/src/forge/_generated/actionSubscriptions.json +2 -2
  6. package/src/forge/_generated/actionSubscriptions.ts +3 -3
  7. package/src/forge/_generated/agentAdapterManifest.json +2 -2
  8. package/src/forge/_generated/agentAdapterManifest.ts +3 -3
  9. package/src/forge/_generated/agentContract.json +2 -2
  10. package/src/forge/_generated/agentContract.ts +183 -50
  11. package/src/forge/_generated/agentQuickstart.md +3 -1
  12. package/src/forge/_generated/agentTools.json +2 -0
  13. package/src/forge/_generated/agentTools.md +16 -0
  14. package/src/forge/_generated/agentTools.ts +12 -0
  15. package/src/forge/_generated/aiContext.ts +67 -1
  16. package/src/forge/_generated/aiModels.json +2 -2
  17. package/src/forge/_generated/aiModels.ts +17 -1
  18. package/src/forge/_generated/aiProviders.json +1 -1
  19. package/src/forge/_generated/aiProviders.ts +1 -1
  20. package/src/forge/_generated/aiRegistry.json +2 -2
  21. package/src/forge/_generated/aiRegistry.ts +7 -5
  22. package/src/forge/_generated/api.json +2 -2
  23. package/src/forge/_generated/api.ts +1 -1
  24. package/src/forge/_generated/appGraph.json +2 -2
  25. package/src/forge/_generated/appGraph.ts +512 -260
  26. package/src/forge/_generated/appMap.md +21 -1
  27. package/src/forge/_generated/artifactManifest.json +2 -2
  28. package/src/forge/_generated/artifactManifest.ts +2 -2
  29. package/src/forge/_generated/authClaims.json +1 -1
  30. package/src/forge/_generated/authClaims.ts +1 -1
  31. package/src/forge/_generated/authConfig.json +1 -1
  32. package/src/forge/_generated/authConfig.ts +1 -1
  33. package/src/forge/_generated/authContext.ts +1 -1
  34. package/src/forge/_generated/authRegistry.json +1 -1
  35. package/src/forge/_generated/authRegistry.ts +1 -1
  36. package/src/forge/_generated/buildInfo.json +2 -2
  37. package/src/forge/_generated/buildInfo.ts +4 -4
  38. package/src/forge/_generated/capabilityMap.json +2 -2
  39. package/src/forge/_generated/capabilityMap.md +1 -1
  40. package/src/forge/_generated/capabilityMap.ts +2 -2
  41. package/src/forge/_generated/client.ts +1 -1
  42. package/src/forge/_generated/clientApi.ts +1 -1
  43. package/src/forge/_generated/clientManifest.json +2 -2
  44. package/src/forge/_generated/clientManifest.ts +3 -3
  45. package/src/forge/_generated/clientTypes.ts +1 -1
  46. package/src/forge/_generated/configRegistry.json +1 -1
  47. package/src/forge/_generated/configRegistry.ts +1 -1
  48. package/src/forge/_generated/dataGraph.json +2 -2
  49. package/src/forge/_generated/dataGraph.ts +3 -3
  50. package/src/forge/_generated/db.json +1 -1
  51. package/src/forge/_generated/db.ts +1 -1
  52. package/src/forge/_generated/dbSecurityManifest.json +1 -1
  53. package/src/forge/_generated/dbSecurityManifest.ts +1 -1
  54. package/src/forge/_generated/dbSessionContext.json +1 -1
  55. package/src/forge/_generated/dbSessionContext.ts +1 -1
  56. package/src/forge/_generated/deployManifest.json +2 -2
  57. package/src/forge/_generated/deployManifest.ts +7 -7
  58. package/src/forge/_generated/devManifest.json +2 -2
  59. package/src/forge/_generated/devManifest.ts +18 -3
  60. package/src/forge/_generated/envSchema.json +1 -1
  61. package/src/forge/_generated/envSchema.ts +1 -1
  62. package/src/forge/_generated/frontendGraph.json +1 -1
  63. package/src/forge/_generated/frontendGraph.ts +1 -1
  64. package/src/forge/_generated/importGuards.json +1 -1
  65. package/src/forge/_generated/importGuards.ts +1 -1
  66. package/src/forge/_generated/index.ts +2 -1
  67. package/src/forge/_generated/liveProductionManifest.json +1 -1
  68. package/src/forge/_generated/liveProductionManifest.ts +1 -1
  69. package/src/forge/_generated/liveProtocol.json +1 -1
  70. package/src/forge/_generated/liveProtocol.ts +1 -1
  71. package/src/forge/_generated/liveQueryRegistry.json +2 -2
  72. package/src/forge/_generated/liveQueryRegistry.ts +3 -3
  73. package/src/forge/_generated/liveTransportConfig.json +1 -1
  74. package/src/forge/_generated/liveTransportConfig.ts +1 -1
  75. package/src/forge/_generated/makeRegistry.json +2 -2
  76. package/src/forge/_generated/makeRegistry.ts +16 -2
  77. package/src/forge/_generated/makeTemplates.json +2 -2
  78. package/src/forge/_generated/makeTemplates.ts +6 -1
  79. package/src/forge/_generated/mockMap.json +1 -1
  80. package/src/forge/_generated/mockMap.ts +1 -1
  81. package/src/forge/_generated/operationPlaybooks.md +34 -14
  82. package/src/forge/_generated/packageGraph.json +2 -2
  83. package/src/forge/_generated/packageGraph.ts +8808 -4723
  84. package/src/forge/_generated/packageUpgradeRegistry.json +2 -2
  85. package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
  86. package/src/forge/_generated/permissionMatrix.json +2 -2
  87. package/src/forge/_generated/permissionMatrix.ts +3 -3
  88. package/src/forge/_generated/policyRegistry.json +2 -2
  89. package/src/forge/_generated/policyRegistry.ts +3 -3
  90. package/src/forge/_generated/queryRegistry.json +2 -2
  91. package/src/forge/_generated/queryRegistry.ts +3 -3
  92. package/src/forge/_generated/react.d.ts +1 -1
  93. package/src/forge/_generated/react.ts +1 -1
  94. package/src/forge/_generated/reactManifest.json +2 -2
  95. package/src/forge/_generated/reactManifest.ts +3 -3
  96. package/src/forge/_generated/releaseManifest.json +2 -2
  97. package/src/forge/_generated/releaseManifest.ts +3 -3
  98. package/src/forge/_generated/rlsPolicies.json +1 -1
  99. package/src/forge/_generated/rlsPolicies.sql +1 -1
  100. package/src/forge/_generated/rlsPolicies.ts +1 -1
  101. package/src/forge/_generated/runtimeGraph.json +2 -2
  102. package/src/forge/_generated/runtimeGraph.ts +3 -3
  103. package/src/forge/_generated/runtimeMatrix.json +2 -2
  104. package/src/forge/_generated/runtimeMatrix.ts +8684 -1939
  105. package/src/forge/_generated/runtimeRegistry.ts +1 -1
  106. package/src/forge/_generated/runtimeRules.md +13 -1
  107. package/src/forge/_generated/secretRegistry.json +1 -1
  108. package/src/forge/_generated/secretRegistry.ts +1 -1
  109. package/src/forge/_generated/secretsContext.ts +1 -1
  110. package/src/forge/_generated/serverApi.ts +1 -1
  111. package/src/forge/_generated/sourceMapManifest.json +2 -2
  112. package/src/forge/_generated/sourceMapManifest.ts +2 -2
  113. package/src/forge/_generated/sqlPlan.json +1 -1
  114. package/src/forge/_generated/sqlPlan.ts +1 -1
  115. package/src/forge/_generated/subscriptionManifest.json +2 -2
  116. package/src/forge/_generated/subscriptionManifest.ts +3 -3
  117. package/src/forge/_generated/symbolicationManifest.json +2 -2
  118. package/src/forge/_generated/symbolicationManifest.ts +2 -2
  119. package/src/forge/_generated/telemetryRegistry.json +2 -2
  120. package/src/forge/_generated/telemetryRegistry.ts +3 -3
  121. package/src/forge/_generated/telemetrySinks.json +2 -2
  122. package/src/forge/_generated/telemetrySinks.ts +2 -2
  123. package/src/forge/_generated/tenantScope.json +2 -2
  124. package/src/forge/_generated/tenantScope.ts +3 -3
  125. package/src/forge/_generated/testGraph.json +2 -2
  126. package/src/forge/_generated/testGraph.ts +339 -17
  127. package/src/forge/_generated/testPlanRegistry.json +2 -2
  128. package/src/forge/_generated/testPlanRegistry.ts +2 -2
  129. package/src/forge/_generated/uiRoutes.json +1 -1
  130. package/src/forge/_generated/uiRoutes.ts +1 -1
  131. package/src/forge/_generated/uiScenarios.json +1 -1
  132. package/src/forge/_generated/uiScenarios.ts +1 -1
  133. package/src/forge/_generated/uiTestManifest.json +2 -2
  134. package/src/forge/_generated/uiTestManifest.ts +2 -2
  135. package/src/forge/_generated/workflowRegistry.json +2 -2
  136. package/src/forge/_generated/workflowRegistry.ts +3 -3
  137. package/src/forge/_generated/workflowSubscriptions.json +2 -2
  138. package/src/forge/_generated/workflowSubscriptions.ts +3 -3
  139. package/src/forge/cli/ai.ts +351 -1
  140. package/src/forge/cli/auth.ts +36 -1
  141. package/src/forge/cli/commands.ts +19 -0
  142. package/src/forge/cli/parse.ts +67 -8
  143. package/src/forge/cli/rls.ts +529 -17
  144. package/src/forge/cli/secrets.ts +46 -1
  145. package/src/forge/cli/security.ts +269 -0
  146. package/src/forge/compiler/agent-contract/build.ts +289 -8
  147. package/src/forge/compiler/agent-contract/types.ts +43 -0
  148. package/src/forge/compiler/ai-registry/build.ts +62 -1
  149. package/src/forge/compiler/ai-registry/constants.ts +1 -1
  150. package/src/forge/compiler/ai-registry/parse.ts +98 -4
  151. package/src/forge/compiler/app-graph/forge-apis.ts +1 -0
  152. package/src/forge/compiler/dev-manifest/build.ts +3 -0
  153. package/src/forge/compiler/diagnostics/codes.ts +15 -0
  154. package/src/forge/compiler/diagnostics/create.ts +1 -1
  155. package/src/forge/compiler/make-registry/build.ts +13 -0
  156. package/src/forge/compiler/orchestrator/plan.ts +11 -0
  157. package/src/forge/compiler/orchestrator/serialize.ts +68 -0
  158. package/src/forge/compiler/package-graph/compiler.ts +13 -3
  159. package/src/forge/compiler/types/ai-registry.ts +25 -1
  160. package/src/forge/compiler/types/app-graph.ts +1 -0
  161. package/src/forge/compiler/types/cli.ts +1 -0
  162. package/src/forge/compiler/types/dev-manifest.ts +3 -0
  163. package/src/forge/dev/server.ts +508 -1
  164. package/src/forge/make/index.ts +126 -3
  165. package/src/forge/make/templates.ts +188 -0
  166. package/src/forge/make/types.ts +1 -0
  167. package/src/forge/runtime/ai/context.ts +210 -5
  168. package/src/forge/runtime/ai/types.ts +70 -0
  169. package/src/forge/runtime/auth/claims.ts +32 -0
  170. package/src/forge/runtime/auth/errors.ts +2 -0
  171. package/src/forge/runtime/context/create-context.ts +30 -6
  172. package/src/forge/runtime/db/memory-adapter.ts +2 -2
  173. package/src/forge/runtime/telemetry/scrubber.ts +56 -5
  174. package/src/forge/runtime/webhooks/security.ts +184 -0
  175. package/src/forge/server.ts +93 -0
  176. package/src/forge/version.ts +1 -1
  177. package/templates/b2b-support-web/package.json +1 -0
  178. package/templates/b2b-support-web/tsconfig.json +4 -1
  179. package/templates/minimal-web/package.json +1 -0
  180. package/templates/minimal-web/tsconfig.json +3 -1
@@ -0,0 +1,269 @@
1
+ import type { DbAdapterKind } from "../runtime/db/adapter.ts";
2
+ import type { AuthCommandResult } from "./auth.ts";
3
+ import { runAuthCommand } from "./auth.ts";
4
+ import type { RlsCommandResult } from "./rls.ts";
5
+ import { runRlsCommand } from "./rls.ts";
6
+ import type { SecretsCommandResult } from "./secrets.ts";
7
+ import { runSecretsCommand } from "./secrets.ts";
8
+ import type { AiCommandResult } from "./ai.ts";
9
+ import { runAiCommand } from "./ai.ts";
10
+ import { runCheckCommand } from "./commands.ts";
11
+ import type { GenerateResult } from "../compiler/types/cli.ts";
12
+
13
+ export type SecuritySubcommand = "prove";
14
+
15
+ export interface SecurityInvariantEvidence {
16
+ id: string;
17
+ artifact: string;
18
+ level: "checked" | "tested" | "proved";
19
+ summary: string;
20
+ tests: string[];
21
+ commands: string[];
22
+ }
23
+
24
+ export interface SecurityCommandOptions {
25
+ subcommand: SecuritySubcommand;
26
+ workspaceRoot: string;
27
+ json: boolean;
28
+ db: DbAdapterKind;
29
+ databaseUrl?: string;
30
+ }
31
+
32
+ export interface SecurityProofResult {
33
+ ok: boolean;
34
+ schemaVersion: "0.1.0";
35
+ kind: "security-proof";
36
+ assurance: "structural-only" | "postgres-proved";
37
+ proofs: {
38
+ forgeCheck: GenerateResult;
39
+ auth: AuthCommandResult;
40
+ secrets: SecretsCommandResult;
41
+ rls: RlsCommandResult;
42
+ rlsMutation: RlsCommandResult;
43
+ agentRedteam: AiCommandResult;
44
+ };
45
+ evidence: {
46
+ invariants: SecurityInvariantEvidence[];
47
+ };
48
+ summary: {
49
+ passed: string[];
50
+ failed: string[];
51
+ warnings: string[];
52
+ };
53
+ exitCode: 0 | 1;
54
+ }
55
+
56
+ function invariantEvidence(): SecurityInvariantEvidence[] {
57
+ return [
58
+ {
59
+ id: "INV-001",
60
+ artifact: "auth-negative",
61
+ level: "tested",
62
+ summary: "Production auth rejects invalid JWT/OIDC tokens and ignores dev headers in jwt mode.",
63
+ tests: ["tests/security/auth-negative.test.ts"],
64
+ commands: ["node ./bin/forge-bun.mjs test tests/security/auth-negative.test.ts --timeout 120000"],
65
+ },
66
+ {
67
+ id: "INV-002",
68
+ artifact: "tenant-isolation",
69
+ level: "tested",
70
+ summary: "Runtime and HTTP APIs block cross-tenant reads, writes, tenant spoofing, and unsafe tenant filters.",
71
+ tests: [
72
+ "tests/security/tenant-isolation/runtime-api.test.ts",
73
+ "tests/security/tenant-isolation/http-runtime.test.ts",
74
+ ],
75
+ commands: ["node ./bin/forge-bun.mjs test tests/security/tenant-isolation --timeout 120000"],
76
+ },
77
+ {
78
+ id: "INV-003",
79
+ artifact: "rls-test",
80
+ level: "proved",
81
+ summary: "Postgres RLS probes and structural mutation checks protect tenant-scoped tables.",
82
+ tests: [
83
+ "tests/security/rls-postgres-adversarial.test.ts",
84
+ "tests/security/rls-mutation.test.ts",
85
+ ],
86
+ commands: [
87
+ "node ./bin/forge.mjs rls test --db postgres --json",
88
+ "node ./bin/forge.mjs rls mutate-test --json",
89
+ ],
90
+ },
91
+ {
92
+ id: "INV-004",
93
+ artifact: "runtime-boundaries",
94
+ level: "tested",
95
+ summary: "Commands reject forbidden AI, agent, network, secret, filesystem, and process.env usage.",
96
+ tests: ["tests/security/runtime-boundaries.test.ts"],
97
+ commands: ["node ./bin/forge-bun.mjs test tests/security/runtime-boundaries.test.ts --timeout 120000"],
98
+ },
99
+ {
100
+ id: "INV-005",
101
+ artifact: "runtime-boundaries",
102
+ level: "tested",
103
+ summary: "Queries and liveQueries remain read-only and side-effect free.",
104
+ tests: ["tests/security/runtime-boundaries.test.ts"],
105
+ commands: ["node ./bin/forge-bun.mjs test tests/security/runtime-boundaries.test.ts --timeout 120000"],
106
+ },
107
+ {
108
+ id: "INV-006",
109
+ artifact: "agent-tools",
110
+ level: "tested",
111
+ summary: "Generated agent tools carry Forge auth, tenant, policy, runtime, and risk metadata.",
112
+ tests: ["tests/security/agent-tools.test.ts"],
113
+ commands: ["node ./bin/forge-bun.mjs test tests/security/agent-tools.test.ts --timeout 120000"],
114
+ },
115
+ {
116
+ id: "INV-007",
117
+ artifact: "agent-tools",
118
+ level: "tested",
119
+ summary: "Write, destructive, and external agent tools require approval metadata.",
120
+ tests: ["tests/security/agent-tools.test.ts"],
121
+ commands: ["node ./bin/forge-bun.mjs test tests/security/agent-tools.test.ts --timeout 120000"],
122
+ },
123
+ {
124
+ id: "INV-008",
125
+ artifact: "secret-redaction",
126
+ level: "tested",
127
+ summary: "Generated artifacts and telemetry scrub secret names and known secret values.",
128
+ tests: ["tests/security/secret-redaction.test.ts"],
129
+ commands: ["node ./bin/forge-bun.mjs test tests/security/secret-redaction.test.ts --timeout 120000"],
130
+ },
131
+ {
132
+ id: "INV-009",
133
+ artifact: "webhooks",
134
+ level: "tested",
135
+ summary: "Webhook helpers reject invalid signatures, stale timestamps, tampered payloads, and replayed event IDs.",
136
+ tests: ["tests/security/webhooks/webhook-security.test.ts"],
137
+ commands: ["node ./bin/forge-bun.mjs test tests/security/webhooks --timeout 120000"],
138
+ },
139
+ {
140
+ id: "INV-010",
141
+ artifact: "release-supply-chain",
142
+ level: "checked",
143
+ summary: "Release workflow uses Trusted Publishing, provenance, smoke tests, security proof, and generated release evidence.",
144
+ tests: ["tests/ci/publish-workflow.test.ts"],
145
+ commands: ["npm run release:smoke", "npm run release:evidence"],
146
+ },
147
+ ];
148
+ }
149
+
150
+ function passed(name: string, ok: boolean, summary: SecurityProofResult["summary"]): void {
151
+ if (ok) {
152
+ summary.passed.push(name);
153
+ } else {
154
+ summary.failed.push(name);
155
+ }
156
+ }
157
+
158
+ export async function runSecurityCommand(
159
+ options: SecurityCommandOptions,
160
+ ): Promise<SecurityProofResult> {
161
+ const forgeCheck = await runCheckCommand(options.workspaceRoot, { strictSecrets: true });
162
+ const auth = await runAuthCommand({
163
+ subcommand: "prove",
164
+ workspaceRoot: options.workspaceRoot,
165
+ json: true,
166
+ });
167
+ const secrets = await runSecretsCommand({
168
+ subcommand: "prove",
169
+ workspaceRoot: options.workspaceRoot,
170
+ json: true,
171
+ redacted: true,
172
+ });
173
+ const rls = await runRlsCommand({
174
+ subcommand: "test",
175
+ workspaceRoot: options.workspaceRoot,
176
+ db: options.db,
177
+ databaseUrl: options.databaseUrl,
178
+ json: true,
179
+ });
180
+ const rlsMutation = await runRlsCommand({
181
+ subcommand: "mutate-test",
182
+ workspaceRoot: options.workspaceRoot,
183
+ db: options.db,
184
+ databaseUrl: options.databaseUrl,
185
+ json: true,
186
+ });
187
+ const agentRedteam = await runAiCommand({
188
+ subcommand: "redteam",
189
+ workspaceRoot: options.workspaceRoot,
190
+ json: true,
191
+ });
192
+
193
+ const summary: SecurityProofResult["summary"] = {
194
+ passed: [],
195
+ failed: [],
196
+ warnings: [],
197
+ };
198
+ passed("forge-check", forgeCheck.exitCode === 0, summary);
199
+ passed("auth-proof", auth.exitCode === 0, summary);
200
+ passed("secrets-proof", secrets.exitCode === 0, summary);
201
+ passed("rls-proof", rls.exitCode === 0, summary);
202
+ passed("rls-mutation-proof", rlsMutation.exitCode === 0, summary);
203
+ passed("agent-redteam", agentRedteam.exitCode === 0, summary);
204
+
205
+ if (auth.mode === "dev-headers") {
206
+ summary.warnings.push("auth-proof uses local-only dev-headers mode");
207
+ }
208
+ for (const diagnostic of rls.diagnostics) {
209
+ if (diagnostic.severity === "warning") {
210
+ summary.warnings.push(`${diagnostic.code}: ${diagnostic.message}`);
211
+ }
212
+ }
213
+ for (const diagnostic of rlsMutation.diagnostics) {
214
+ if (diagnostic.severity === "warning") {
215
+ summary.warnings.push(`${diagnostic.code}: ${diagnostic.message}`);
216
+ }
217
+ }
218
+ for (const diagnostic of agentRedteam.diagnostics ?? []) {
219
+ if (diagnostic.severity === "warning") {
220
+ summary.warnings.push(`${diagnostic.code}: ${diagnostic.message}`);
221
+ }
222
+ }
223
+
224
+ const ok = summary.failed.length === 0;
225
+ const assurance =
226
+ options.db === "postgres" &&
227
+ rls.exitCode === 0 &&
228
+ Boolean((rls.data as { skipped?: boolean } | undefined)?.skipped) === false
229
+ ? "postgres-proved"
230
+ : "structural-only";
231
+ return {
232
+ ok,
233
+ schemaVersion: "0.1.0",
234
+ kind: "security-proof",
235
+ assurance,
236
+ proofs: {
237
+ forgeCheck,
238
+ auth,
239
+ secrets,
240
+ rls,
241
+ rlsMutation,
242
+ agentRedteam,
243
+ },
244
+ evidence: {
245
+ invariants: invariantEvidence(),
246
+ },
247
+ summary,
248
+ exitCode: ok ? 0 : 1,
249
+ };
250
+ }
251
+
252
+ export function formatSecurityJson(result: SecurityProofResult): string {
253
+ return `${JSON.stringify(result, null, 2)}\n`;
254
+ }
255
+
256
+ export function formatSecurityHuman(result: SecurityProofResult): string {
257
+ const lines = [
258
+ "Forge Security Proof",
259
+ "",
260
+ `Status: ${result.ok ? "ok" : "failed"}`,
261
+ `Assurance: ${result.assurance}`,
262
+ `Passed: ${result.summary.passed.join(", ") || "none"}`,
263
+ `Failed: ${result.summary.failed.join(", ") || "none"}`,
264
+ ];
265
+ if (result.summary.warnings.length > 0) {
266
+ lines.push("", "Warnings:", ...result.summary.warnings.map((warning) => `- ${warning}`));
267
+ }
268
+ return `${lines.join("\n")}\n`;
269
+ }