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.
Files changed (230) hide show
  1. package/AGENTS.md +6 -5
  2. package/CHANGELOG.md +22 -0
  3. package/adapters/java/README.md +68 -0
  4. package/adapters/java/pom.xml +34 -0
  5. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  6. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  7. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  8. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  9. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  10. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  11. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  12. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  25. package/adapters/java/target/classes/dev/forgeos/adapter/Auth.class +0 -0
  26. package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
  27. package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
  28. package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
  29. package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
  30. package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
  31. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
  32. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
  33. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
  34. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
  35. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
  36. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
  37. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
  38. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
  39. package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
  40. package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
  41. package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
  42. package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
  43. package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
  44. package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
  45. package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
  46. package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
  47. package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
  48. package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
  49. package/adapters/java/target/maven-archiver/pom.properties +3 -0
  50. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
  51. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -0
  52. package/adapters/java-spring-boot-starter/README.md +32 -0
  53. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  54. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  55. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  56. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  57. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  58. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  59. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  60. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  61. package/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  62. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
  63. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
  64. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
  65. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
  66. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
  67. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
  68. package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
  69. package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
  70. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
  71. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
  72. package/docs/changelog.md +8 -0
  73. package/docs/forge-protocol.md +33 -0
  74. package/examples/java-billing/pom.xml +52 -0
  75. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  76. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  77. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  78. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
  79. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
  80. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
  81. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
  82. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
  83. package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
  84. package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
  85. package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
  86. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
  87. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
  88. package/package.json +4 -1
  89. package/src/forge/_generated/actionSubscriptions.json +1 -1
  90. package/src/forge/_generated/actionSubscriptions.ts +3 -3
  91. package/src/forge/_generated/agentAdapterManifest.json +1 -1
  92. package/src/forge/_generated/agentAdapterManifest.ts +3 -3
  93. package/src/forge/_generated/agentContract.json +1 -1
  94. package/src/forge/_generated/agentContract.ts +1274 -7
  95. package/src/forge/_generated/agentQuickstart.md +1 -1
  96. package/src/forge/_generated/agentTools.json +1 -1
  97. package/src/forge/_generated/agentTools.md +1 -1
  98. package/src/forge/_generated/agentTools.ts +2 -2
  99. package/src/forge/_generated/aiContext.ts +1 -1
  100. package/src/forge/_generated/aiModels.ts +1 -1
  101. package/src/forge/_generated/aiProviders.ts +1 -1
  102. package/src/forge/_generated/aiRegistry.json +1 -1
  103. package/src/forge/_generated/aiRegistry.ts +3 -3
  104. package/src/forge/_generated/api.json +1 -1
  105. package/src/forge/_generated/api.ts +1 -1
  106. package/src/forge/_generated/appGraph.json +1 -1
  107. package/src/forge/_generated/appGraph.ts +165 -98
  108. package/src/forge/_generated/appMap.md +1 -1
  109. package/src/forge/_generated/artifactManifest.json +1 -1
  110. package/src/forge/_generated/artifactManifest.ts +2 -2
  111. package/src/forge/_generated/authClaims.ts +1 -1
  112. package/src/forge/_generated/authConfig.ts +1 -1
  113. package/src/forge/_generated/authContext.ts +1 -1
  114. package/src/forge/_generated/authRegistry.ts +1 -1
  115. package/src/forge/_generated/buildInfo.json +1 -1
  116. package/src/forge/_generated/buildInfo.ts +4 -4
  117. package/src/forge/_generated/capabilityMap.json +1 -1
  118. package/src/forge/_generated/capabilityMap.md +1 -1
  119. package/src/forge/_generated/capabilityMap.ts +2 -2
  120. package/src/forge/_generated/client.ts +1 -1
  121. package/src/forge/_generated/clientApi.ts +1 -1
  122. package/src/forge/_generated/clientManifest.json +1 -1
  123. package/src/forge/_generated/clientManifest.ts +14 -3
  124. package/src/forge/_generated/clientTypes.ts +1 -1
  125. package/src/forge/_generated/configRegistry.ts +1 -1
  126. package/src/forge/_generated/dataGraph.json +1 -1
  127. package/src/forge/_generated/dataGraph.ts +3 -3
  128. package/src/forge/_generated/db.ts +1 -1
  129. package/src/forge/_generated/dbSecurityManifest.ts +1 -1
  130. package/src/forge/_generated/dbSessionContext.ts +1 -1
  131. package/src/forge/_generated/deployManifest.json +1 -1
  132. package/src/forge/_generated/deployManifest.ts +7 -7
  133. package/src/forge/_generated/devManifest.json +1 -1
  134. package/src/forge/_generated/devManifest.ts +3 -3
  135. package/src/forge/_generated/envSchema.ts +1 -1
  136. package/src/forge/_generated/externalServices.ts +1 -1
  137. package/src/forge/_generated/frontendGraph.ts +1 -1
  138. package/src/forge/_generated/importGuards.json +1 -1
  139. package/src/forge/_generated/importGuards.ts +35 -1
  140. package/src/forge/_generated/index.ts +3 -1
  141. package/src/forge/_generated/liveProductionManifest.ts +1 -1
  142. package/src/forge/_generated/liveProtocol.ts +1 -1
  143. package/src/forge/_generated/liveQueryRegistry.json +1 -1
  144. package/src/forge/_generated/liveQueryRegistry.ts +3 -3
  145. package/src/forge/_generated/liveTransportConfig.ts +1 -1
  146. package/src/forge/_generated/makeRegistry.json +1 -1
  147. package/src/forge/_generated/makeRegistry.ts +8 -8
  148. package/src/forge/_generated/makeTemplates.json +1 -1
  149. package/src/forge/_generated/makeTemplates.ts +2 -2
  150. package/src/forge/_generated/mockMap.ts +1 -1
  151. package/src/forge/_generated/operationPlaybooks.md +6 -6
  152. package/src/forge/_generated/packageGraph.json +1 -1
  153. package/src/forge/_generated/packageGraph.ts +52412 -2
  154. package/src/forge/_generated/packageUpgradeRegistry.json +1 -1
  155. package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
  156. package/src/forge/_generated/permissionMatrix.json +1 -1
  157. package/src/forge/_generated/permissionMatrix.ts +3 -3
  158. package/src/forge/_generated/policyRegistry.json +1 -1
  159. package/src/forge/_generated/policyRegistry.ts +3 -3
  160. package/src/forge/_generated/queryRegistry.json +1 -1
  161. package/src/forge/_generated/queryRegistry.ts +3 -3
  162. package/src/forge/_generated/react.d.ts +1 -1
  163. package/src/forge/_generated/react.ts +1 -1
  164. package/src/forge/_generated/reactManifest.json +1 -1
  165. package/src/forge/_generated/reactManifest.ts +3 -3
  166. package/src/forge/_generated/releaseManifest.json +1 -1
  167. package/src/forge/_generated/releaseManifest.ts +3 -3
  168. package/src/forge/_generated/rlsPolicies.sql +1 -1
  169. package/src/forge/_generated/rlsPolicies.ts +1 -1
  170. package/src/forge/_generated/runtimeGraph.json +1 -1
  171. package/src/forge/_generated/runtimeGraph.ts +3 -3
  172. package/src/forge/_generated/runtimeMatrix.json +1 -1
  173. package/src/forge/_generated/runtimeMatrix.ts +70357 -1
  174. package/src/forge/_generated/runtimeRegistry.ts +1 -1
  175. package/src/forge/_generated/runtimeRules.md +1 -1
  176. package/src/forge/_generated/secretRegistry.ts +1 -1
  177. package/src/forge/_generated/secretsContext.ts +1 -1
  178. package/src/forge/_generated/serverApi.ts +1 -1
  179. package/src/forge/_generated/sourceMapManifest.json +1 -1
  180. package/src/forge/_generated/sourceMapManifest.ts +2 -2
  181. package/src/forge/_generated/sqlPlan.ts +1 -1
  182. package/src/forge/_generated/subscriptionManifest.json +1 -1
  183. package/src/forge/_generated/subscriptionManifest.ts +3 -3
  184. package/src/forge/_generated/symbolicationManifest.json +1 -1
  185. package/src/forge/_generated/symbolicationManifest.ts +2 -2
  186. package/src/forge/_generated/telemetryRegistry.json +1 -1
  187. package/src/forge/_generated/telemetryRegistry.ts +3 -3
  188. package/src/forge/_generated/telemetrySinks.json +1 -1
  189. package/src/forge/_generated/telemetrySinks.ts +2 -2
  190. package/src/forge/_generated/tenantScope.json +1 -1
  191. package/src/forge/_generated/tenantScope.ts +3 -3
  192. package/src/forge/_generated/testGraph.json +1 -1
  193. package/src/forge/_generated/testGraph.ts +95 -5
  194. package/src/forge/_generated/testPlanRegistry.json +1 -1
  195. package/src/forge/_generated/testPlanRegistry.ts +2 -2
  196. package/src/forge/_generated/uiRoutes.ts +1 -1
  197. package/src/forge/_generated/uiScenarios.ts +1 -1
  198. package/src/forge/_generated/uiTestManifest.json +1 -1
  199. package/src/forge/_generated/uiTestManifest.ts +2 -2
  200. package/src/forge/_generated/vue.d.ts +25 -0
  201. package/src/forge/_generated/vue.ts +30 -0
  202. package/src/forge/_generated/vueManifest.json +1 -0
  203. package/src/forge/_generated/vueManifest.ts +19 -0
  204. package/src/forge/_generated/workflowRegistry.json +1 -1
  205. package/src/forge/_generated/workflowRegistry.ts +3 -3
  206. package/src/forge/_generated/workflowSubscriptions.json +1 -1
  207. package/src/forge/_generated/workflowSubscriptions.ts +3 -3
  208. package/src/forge/agent-adapters/index.ts +1 -1
  209. package/src/forge/brownfield-import/index.ts +726 -0
  210. package/src/forge/brownfield-import/types.ts +127 -0
  211. package/src/forge/cli/commands.ts +27 -0
  212. package/src/forge/cli/parse.ts +27 -1
  213. package/src/forge/cli/verify.ts +2 -0
  214. package/src/forge/compiler/agent-contract/build.ts +10 -9
  215. package/src/forge/compiler/client-sdk/build-manifest.ts +55 -0
  216. package/src/forge/compiler/client-sdk/render-client.ts +66 -1
  217. package/src/forge/compiler/diagnostics/create.ts +6 -1
  218. package/src/forge/compiler/emitter/barrel.ts +3 -0
  219. package/src/forge/compiler/frontend-graph/build.ts +85 -13
  220. package/src/forge/compiler/make-registry/build.ts +6 -7
  221. package/src/forge/compiler/orchestrator/plan.ts +13 -0
  222. package/src/forge/compiler/orchestrator/serialize.ts +6 -0
  223. package/src/forge/compiler/types/cli.ts +1 -0
  224. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  225. package/src/forge/intent/index.ts +11 -6
  226. package/src/forge/make/index.ts +23 -3
  227. package/src/forge/make/templates.ts +153 -0
  228. package/src/forge/make/types.ts +2 -1
  229. package/src/forge/version.ts +1 -1
  230. package/src/forge/vue/index.ts +407 -0
@@ -0,0 +1,127 @@
1
+ export type BrownfieldImportSubcommand = "analyze" | "inspect";
2
+
3
+ export interface BrownfieldImportCommandOptions {
4
+ subcommand: BrownfieldImportSubcommand;
5
+ json: boolean;
6
+ dryRun: boolean;
7
+ workspaceRoot: string;
8
+ entry?: string;
9
+ target?: string;
10
+ }
11
+
12
+ export type ImportedAssurance = "static-scan";
13
+ export type ImportedReviewStatus = "needs-review" | "approved" | "rejected";
14
+ export type ImportedEntryKind = "command" | "query" | "unknown";
15
+ export type ImportedRouteSource = "next-app-router" | "next-pages-api" | "express" | "nest" | "unknown";
16
+
17
+ export interface ImportedDependencyInventory {
18
+ dependencies: string[];
19
+ devDependencies: string[];
20
+ scripts: string[];
21
+ frameworks: string[];
22
+ dataPackages: string[];
23
+ externalPackages: string[];
24
+ }
25
+
26
+ export interface ImportedInventory {
27
+ schemaVersion: "0.1.0";
28
+ origin: "imported";
29
+ assurance: ImportedAssurance;
30
+ workspaceRoot: string;
31
+ generatedAt: string;
32
+ packageName?: string;
33
+ dependencies: ImportedDependencyInventory;
34
+ filesScanned: number;
35
+ sourceFiles: string[];
36
+ env: {
37
+ processEnv: string[];
38
+ envFiles: string[];
39
+ };
40
+ }
41
+
42
+ export interface ImportedRoute {
43
+ id: string;
44
+ method: string;
45
+ path: string;
46
+ file: string;
47
+ source: ImportedRouteSource;
48
+ handler?: string;
49
+ confidence: number;
50
+ }
51
+
52
+ export interface ImportedFrontendCall {
53
+ id: string;
54
+ file: string;
55
+ client: "fetch" | "axios";
56
+ method: string;
57
+ url: string;
58
+ routeId?: string;
59
+ confidence: number;
60
+ }
61
+
62
+ export interface ImportedCandidateEntry {
63
+ id: string;
64
+ name: string;
65
+ kind: ImportedEntryKind;
66
+ method: string;
67
+ path: string;
68
+ routeId: string;
69
+ file: string;
70
+ origin: "imported";
71
+ assurance: ImportedAssurance;
72
+ reviewStatus: ImportedReviewStatus;
73
+ visibleToAgent: boolean;
74
+ needsApproval: boolean;
75
+ confidence: number;
76
+ risks: string[];
77
+ evidence: string[];
78
+ }
79
+
80
+ export interface ImportedRiskFinding {
81
+ code: string;
82
+ severity: "info" | "warning" | "error";
83
+ file?: string;
84
+ routeId?: string;
85
+ message: string;
86
+ }
87
+
88
+ export interface ImportedRiskReport {
89
+ schemaVersion: "0.1.0";
90
+ summary: {
91
+ routeCount: number;
92
+ frontendCallCount: number;
93
+ candidateCount: number;
94
+ commandCount: number;
95
+ queryCount: number;
96
+ hiddenFromAgents: number;
97
+ needsApproval: number;
98
+ };
99
+ findings: ImportedRiskFinding[];
100
+ }
101
+
102
+ export interface BrownfieldImportArtifacts {
103
+ inventory: string;
104
+ routes: string;
105
+ frontendCalls: string;
106
+ candidateEntries: string;
107
+ riskReport: string;
108
+ migrationPlan: string;
109
+ importedAgentContract: string;
110
+ }
111
+
112
+ export interface BrownfieldImportResult {
113
+ schemaVersion: "0.1.0";
114
+ feature: "H49";
115
+ subcommand: BrownfieldImportSubcommand;
116
+ workspaceRoot: string;
117
+ wroteArtifacts: boolean;
118
+ artifacts: BrownfieldImportArtifacts;
119
+ inventory: ImportedInventory | null;
120
+ routes: ImportedRoute[];
121
+ frontendCalls: ImportedFrontendCall[];
122
+ candidateEntries: ImportedCandidateEntry[];
123
+ riskReport: ImportedRiskReport | null;
124
+ migrationPlan: string | null;
125
+ exitCode: 0 | 1;
126
+ failureKind?: string;
127
+ }
@@ -160,6 +160,12 @@ import {
160
160
  formatForgeDoJson,
161
161
  runForgeDoCommand,
162
162
  } from "../intent/index.ts";
163
+ import {
164
+ formatBrownfieldImportHuman,
165
+ formatBrownfieldImportJson,
166
+ inspectBrownfieldImport,
167
+ runBrownfieldImportCommand,
168
+ } from "../brownfield-import/index.ts";
163
169
  import {
164
170
  formatAgentHuman,
165
171
  formatAgentJson,
@@ -518,6 +524,18 @@ export async function runInspectCommand(
518
524
  };
519
525
  }
520
526
 
527
+ if (target === "imported") {
528
+ const result = inspectBrownfieldImport(workspaceRoot);
529
+ return {
530
+ target,
531
+ data: formatBrownfieldImportJson(result),
532
+ warnings: [],
533
+ errors: [],
534
+ exitCode: result.exitCode,
535
+ failureKind: result.failureKind,
536
+ };
537
+ }
538
+
521
539
  if (target === "all") {
522
540
  const aggregatePaths: Array<[string, string]> = [
523
541
  ["app", `${GENERATED_DIR}/appGraph.json`],
@@ -973,6 +991,15 @@ export async function executeCommand(command: ForgeCommand): Promise<number> {
973
991
  }
974
992
  return result.exitCode;
975
993
  }
994
+ case "import": {
995
+ const result = runBrownfieldImportCommand(command.options);
996
+ if (command.options.json) {
997
+ process.stdout.write(formatJsonResult(formatBrownfieldImportJson(result)));
998
+ } else {
999
+ process.stdout.write(formatBrownfieldImportHuman(result));
1000
+ }
1001
+ return result.exitCode;
1002
+ }
976
1003
  case "inspect": {
977
1004
  const result = await runInspectCommand(
978
1005
  command.target,
@@ -48,6 +48,7 @@ import type {
48
48
  } from "../ui/types.ts";
49
49
  import type { ForgeDoOptions } from "../intent/types.ts";
50
50
  import type { BenchCommandOptions, BenchSubcommand } from "../bench.ts";
51
+ import type { BrownfieldImportCommandOptions } from "../brownfield-import/types.ts";
51
52
 
52
53
  export type ForgeCommand =
53
54
  | { kind: "version"; json: boolean }
@@ -168,6 +169,7 @@ export type ForgeCommand =
168
169
  | { kind: "review"; options: ReviewCommandOptions }
169
170
  | { kind: "ui"; options: UiCommandOptions }
170
171
  | { kind: "manifest"; subcommand: "validate" | "import"; path: string; json: boolean; workspaceRoot: string }
172
+ | { kind: "import"; options: BrownfieldImportCommandOptions }
171
173
  | { kind: "delta"; subcommand: "status"; json: boolean; workspaceRoot: string }
172
174
  | { kind: "timeline"; target?: string; kindFilter?: string; sessionId?: string; limit?: number; json: boolean; rebuild: boolean; forAgent: boolean; workspaceRoot: string }
173
175
  | { kind: "explain"; thing: string; json: boolean; workspaceRoot: string }
@@ -360,6 +362,7 @@ export const TOP_LEVEL_COMMANDS = [
360
362
  "timeline",
361
363
  "explain",
362
364
  "manifest",
365
+ "import",
363
366
  "generate",
364
367
  "add",
365
368
  "inspect",
@@ -416,6 +419,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
416
419
  "agent-adapters",
417
420
  "capability-map",
418
421
  "framework",
422
+ "imported",
419
423
  "ui",
420
424
  "ui-scenarios",
421
425
  "ui-routes",
@@ -1266,7 +1270,7 @@ export function parseCli(argv: string[]): ParsedCli {
1266
1270
  event: parseOptionValue(argv, "--event"),
1267
1271
  trigger: parseOptionValue(argv, "--trigger"),
1268
1272
  component: parseOptionValue(argv, "--component"),
1269
- framework: parseOptionValue(argv, "--framework") as "vite" | "next" | undefined,
1273
+ framework: parseOptionValue(argv, "--framework") as "vite" | "next" | "nuxt" | undefined,
1270
1274
  withAi: parseFlag(argv, "--with-ai"),
1271
1275
  withCrud: parseFlag(argv, "--with-crud"),
1272
1276
  withLiveQuery: parseFlag(argv, "--with-livequery"),
@@ -1711,6 +1715,28 @@ export function parseCli(argv: string[]): ParsedCli {
1711
1715
  errors,
1712
1716
  };
1713
1717
  }
1718
+ case "import": {
1719
+ const subcommand = rest[0];
1720
+ if (subcommand !== "analyze" && subcommand !== "inspect") {
1721
+ errors.push("forge import requires subcommand analyze or inspect");
1722
+ return { command: null, workspaceRoot, errors };
1723
+ }
1724
+ return {
1725
+ command: {
1726
+ kind: "import",
1727
+ options: {
1728
+ subcommand,
1729
+ json: parseFlag(argv, "--json"),
1730
+ dryRun: parseFlag(argv, "--dry-run"),
1731
+ workspaceRoot,
1732
+ entry: parseOptionValue(argv, "--entry"),
1733
+ target: parseOptionValue(argv, "--target"),
1734
+ },
1735
+ },
1736
+ workspaceRoot,
1737
+ errors,
1738
+ };
1739
+ }
1714
1740
  case "add": {
1715
1741
  const alias = rest[0];
1716
1742
  if (!alias) {
@@ -350,6 +350,7 @@ const STRICT_TEST_FALLBACK_MS_BY_PATH: Array<{ pattern: RegExp; estimatedMs: num
350
350
  { pattern: /^tests\/external-manifest\/external-runtime-cli\.test\.ts$/, estimatedMs: 6_000 },
351
351
  { pattern: /^tests\/external-manifest\/external-runtime-node-cli\.test\.ts$/, estimatedMs: 12_000 },
352
352
  { pattern: /^tests\/external-manifest\/go-adapter-conformance\.test\.ts$/, estimatedMs: 5_000 },
353
+ { pattern: /^tests\/external-manifest\/java-adapter-conformance\.test\.ts$/, estimatedMs: 20_000 },
353
354
  { pattern: /^tests\/impact\/h28-impact\.test\.ts$/, estimatedMs: 8_000 },
354
355
  { pattern: /^tests\/impact\/h28-impact-runner\.test\.ts$/, estimatedMs: 7_000 },
355
356
  { pattern: /^tests\/impact\/h28-impact-runner-diagnostics\.test\.ts$/, estimatedMs: 3_000 },
@@ -378,6 +379,7 @@ const STRICT_ISOLATED_TEST_PATTERNS = [
378
379
  /^tests\/dev\//,
379
380
  /^tests\/external-manifest\/external-manifest\.test\.ts$/,
380
381
  /^tests\/external-manifest\/go-adapter-conformance\.test\.ts$/,
382
+ /^tests\/external-manifest\/java-adapter-conformance\.test\.ts$/,
381
383
  /^tests\/external-manifest\/external-runtime-bridge\.test\.ts$/,
382
384
  /^tests\/external-manifest\/external-runtime-node-cli\.test\.ts$/,
383
385
  /^tests\/impact\/h28-impact\.test\.ts$/,
@@ -453,17 +453,17 @@ function playbooks(): AgentPlaybook[] {
453
453
  "Run forge dev --once --json for a one-shot diagnostic cycle.",
454
454
  "Use --api-only, --web-only, --no-watch, or --no-worker only when narrowing the loop intentionally.",
455
455
  "When a web app exists, forge dev starts the API runtime and the web dev server together and prints both URLs.",
456
- "Use generated client and React hooks through web/lib/forge.ts.",
456
+ "Use generated client bindings through web/lib/forge.ts, web/src/lib/forge.ts, or Nuxt web/composables/forge.ts.",
457
457
  ],
458
458
  },
459
459
  {
460
460
  title: "Add or update frontend",
461
461
  steps: [
462
- "Run forge make ui --framework vite --dry-run --json when the app does not have a web root.",
462
+ "Run forge make ui --framework vite --dry-run --json or forge make ui --framework nuxt --dry-run --json when the app does not have a web root.",
463
463
  "Run forge make ai-chat support --dry-run --json to add a chat surface backed by /ai/agents/chat streaming and /ai/agents/run JSON automation.",
464
- "Use web/lib/forge.ts as the generated client bridge.",
465
- "Mount ForgeProvider once in the web app provider/layout layer; use devAuth for local development.",
466
- "Use useQuery, useCommand, and useLiveQuery instead of raw /commands or /queries fetches.",
464
+ "Use web/lib/forge.ts, web/src/lib/forge.ts, or web/composables/forge.ts as the generated client bridge.",
465
+ "Mount ForgeProvider or install the Nuxt Forge plugin once in the web app provider/layout layer; use devAuth for local development.",
466
+ "Use useQuery/useCommand/useLiveQuery or useForgeQuery/useForgeCommand/useForgeLiveQuery instead of raw /commands or /queries fetches.",
467
467
  "Run forge generate so frontendGraph and agentContract include routes and bindings.",
468
468
  "Run forge inspect capabilities --json to confirm UI actions map to runtime capabilities.",
469
469
  "Run forge dev --once --json and forge doctor --json.",
@@ -1502,9 +1502,9 @@ ${contract.frontend.dev ? `- Web URL: ${contract.frontend.dev.url}
1502
1502
 
1503
1503
  Rules:
1504
1504
 
1505
- - Use the local \`web/**/lib/forge.ts\` bridge to generated hooks.
1506
- - Mount \`<ForgeProvider devAuth>\` in local development.
1507
- - Use \`useQuery\`, \`useCommand\`, and \`useLiveQuery\` instead of raw Forge endpoint fetches in React components.
1505
+ - Use the local \`web/**/lib/forge.ts\` or Nuxt \`web/composables/forge.ts\` bridge to generated bindings.
1506
+ - Mount \`<ForgeProvider devAuth>\` or install the Nuxt Forge plugin in local development.
1507
+ - Use \`useQuery\`/\`useCommand\`/\`useLiveQuery\` or \`useForgeQuery\`/\`useForgeCommand\`/\`useForgeLiveQuery\` instead of raw Forge endpoint fetches in components.
1508
1508
  - Keep frontend routes reflected in \`src/forge/_generated/frontendGraph.json\`.
1509
1509
 
1510
1510
  ## Common tasks
@@ -1537,6 +1537,7 @@ Use:
1537
1537
  forge make resource <name> --fields title:text,status:enum(open,closed) --dry-run --json
1538
1538
  forge make resource <name> --fields title:text,status:enum(open,closed) --with-ui --yes
1539
1539
  forge make ui --framework vite --dry-run --json
1540
+ forge make ui --framework nuxt --dry-run --json
1540
1541
  forge make ai-chat support --dry-run --json
1541
1542
  \`\`\`
1542
1543
 
@@ -1553,7 +1554,7 @@ forge inspect frontend --json
1553
1554
  forge inspect capabilities --json
1554
1555
  \`\`\`
1555
1556
 
1556
- \`forge dev\` starts the API runtime and web app together when \`web/\` exists. \`forge dev --once --json\` reports routes, components, \`ForgeProvider\`, bridge files, generated client bindings, direct runtime fetch warnings, capability-map parity warnings, and fix hints.
1557
+ \`forge dev\` starts the API runtime and web app together when \`web/\` exists. \`forge dev --once --json\` reports routes, components, providers/plugins, bridge files, generated client bindings, direct runtime fetch warnings, capability-map parity warnings, and fix hints.
1557
1558
 
1558
1559
  ### Apply a feature blueprint
1559
1560
 
@@ -23,6 +23,10 @@ export interface ClientManifest {
23
23
  entrypoint: string;
24
24
  hooks: string[];
25
25
  };
26
+ vue: {
27
+ entrypoint: string;
28
+ composables: string[];
29
+ };
26
30
  excluded: {
27
31
  actions: string[];
28
32
  workflows: string[];
@@ -43,6 +47,18 @@ export interface ReactManifest {
43
47
  clientSafe: true;
44
48
  }
45
49
 
50
+ export interface VueManifest {
51
+ schemaVersion: string;
52
+ generatorVersion: string;
53
+ inputHash: string;
54
+ entrypoint: string;
55
+ composables: string[];
56
+ queries: string[];
57
+ commands: string[];
58
+ liveQueries: string[];
59
+ clientSafe: true;
60
+ }
61
+
46
62
  const SERVER_ADAPTER_SUFFIX = ".server.ts";
47
63
 
48
64
  function collectServerAdapters(classified: ClassifiedPackage[]): string[] {
@@ -117,6 +133,17 @@ export function buildClientManifest(
117
133
  "useLiveQuery",
118
134
  ],
119
135
  },
136
+ vue: {
137
+ entrypoint: "src/forge/_generated/vue.ts",
138
+ composables: [
139
+ "provideForge",
140
+ "useForgeClient",
141
+ "useForgeAuth",
142
+ "useForgeQuery",
143
+ "useForgeCommand",
144
+ "useForgeLiveQuery",
145
+ ],
146
+ },
120
147
  excluded: {
121
148
  actions,
122
149
  workflows,
@@ -153,3 +180,31 @@ export function buildReactManifest(clientManifest: ClientManifest): ReactManifes
153
180
  clientSafe: true,
154
181
  };
155
182
  }
183
+
184
+ export function buildVueManifest(clientManifest: ClientManifest): VueManifest {
185
+ const composables = [
186
+ "provideForge",
187
+ "useForgeClient",
188
+ "useForgeAuth",
189
+ "useForgeQuery",
190
+ "useForgeCommand",
191
+ "useForgeLiveQuery",
192
+ ];
193
+
194
+ return {
195
+ schemaVersion: "1.0.0",
196
+ generatorVersion: GENERATOR_VERSION,
197
+ inputHash: hashStable(
198
+ canonicalJson({
199
+ clientInputHash: clientManifest.inputHash,
200
+ composables,
201
+ }),
202
+ ),
203
+ entrypoint: "src/forge/_generated/vue.ts",
204
+ composables,
205
+ queries: clientManifest.queries,
206
+ commands: clientManifest.commands,
207
+ liveQueries: clientManifest.liveQueries,
208
+ clientSafe: true,
209
+ };
210
+ }
@@ -1,4 +1,4 @@
1
- import type { ClientManifest, ReactManifest } from "./build-manifest.ts";
1
+ import type { ClientManifest, ReactManifest, VueManifest } from "./build-manifest.ts";
2
2
 
3
3
  export function renderClientTypesTs(): string {
4
4
  return `export type ForgeStaticAuth = {
@@ -535,3 +535,68 @@ export declare const useLiveQuery: import("forge/react").ForgeReactBindings["use
535
535
  export function renderReactManifestTs(manifest: ReactManifest): string {
536
536
  return `export const reactManifest = ${JSON.stringify(manifest, null, 2)} as const;\n`;
537
537
  }
538
+
539
+ export function renderVueTs(): string {
540
+ return `import { createForgeVueBindings } from "forge/vue";
541
+ import { createForgeClient } from "./client.ts";
542
+
543
+ export type {
544
+ ForgeDevAuthConfig,
545
+ ForgeVueAuth,
546
+ ForgeVueAuthProvider,
547
+ ForgeVueBindings,
548
+ ForgeVueClient,
549
+ ForgeVueClientConfig,
550
+ ForgeVueError,
551
+ ForgeVuePluginOptions,
552
+ UseForgeCommandOptions,
553
+ UseForgeCommandResult,
554
+ UseForgeLiveQueryOptions,
555
+ UseForgeLiveQueryResult,
556
+ UseForgeQueryOptions,
557
+ UseForgeQueryResult,
558
+ } from "forge/vue";
559
+
560
+ const forgeVue = createForgeVueBindings(createForgeClient);
561
+
562
+ export const ForgeVuePlugin = forgeVue.ForgeVuePlugin;
563
+ export const provideForge = forgeVue.provideForge;
564
+ export const useForgeClient = forgeVue.useForgeClient;
565
+ export const useForgeAuth = forgeVue.useForgeAuth;
566
+ export const useForgeQuery = forgeVue.useForgeQuery;
567
+ export const useForgeCommand = forgeVue.useForgeCommand;
568
+ export const useForgeLiveQuery = forgeVue.useForgeLiveQuery;
569
+ `;
570
+ }
571
+
572
+ export function renderVueDts(): string {
573
+ return `export type {
574
+ ForgeDevAuthConfig,
575
+ ForgeVueAuth,
576
+ ForgeVueAuthProvider,
577
+ ForgeVueBindings,
578
+ ForgeVueClient,
579
+ ForgeVueClientConfig,
580
+ ForgeVueError,
581
+ ForgeVuePluginOptions,
582
+ UseForgeCommandOptions,
583
+ UseForgeCommandResult,
584
+ UseForgeLiveQueryOptions,
585
+ UseForgeLiveQueryResult,
586
+ UseForgeQueryOptions,
587
+ UseForgeQueryResult,
588
+ } from "forge/vue";
589
+
590
+ export declare const ForgeVuePlugin: import("forge/vue").ForgeVueBindings["ForgeVuePlugin"];
591
+ export declare const provideForge: import("forge/vue").ForgeVueBindings["provideForge"];
592
+ export declare const useForgeClient: import("forge/vue").ForgeVueBindings["useForgeClient"];
593
+ export declare const useForgeAuth: import("forge/vue").ForgeVueBindings["useForgeAuth"];
594
+ export declare const useForgeQuery: import("forge/vue").ForgeVueBindings["useForgeQuery"];
595
+ export declare const useForgeCommand: import("forge/vue").ForgeVueBindings["useForgeCommand"];
596
+ export declare const useForgeLiveQuery: import("forge/vue").ForgeVueBindings["useForgeLiveQuery"];
597
+ `;
598
+ }
599
+
600
+ export function renderVueManifestTs(manifest: VueManifest): string {
601
+ return `export const vueManifest = ${JSON.stringify(manifest, null, 2)} as const;\n`;
602
+ }
@@ -106,7 +106,12 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
106
106
  if (code.startsWith("FORGE_FRONTEND_")) {
107
107
  return {
108
108
  fixHint: "Use the generated frontend bridge and inspect src/forge/_generated/frontendGraph.json before editing UI wiring.",
109
- suggestedCommands: ["forge inspect frontend --json", "forge make ui --framework vite --dry-run --json", "forge generate"],
109
+ suggestedCommands: [
110
+ "forge inspect frontend --json",
111
+ "forge make ui --framework vite --dry-run --json",
112
+ "forge make ui --framework nuxt --dry-run --json",
113
+ "forge generate",
114
+ ],
110
115
  docs: ["src/forge/_generated/frontendGraph.json", "AGENTS.md"],
111
116
  };
112
117
  }
@@ -33,6 +33,9 @@ export function buildBarrelIndexBody(exportFilePaths: string[]): string {
33
33
 
34
34
  const lines = unique.map((path) => {
35
35
  const exportPath = toBarrelExportPath(path);
36
+ if (exportPath === "./vue") {
37
+ return `export * as vue from "${exportPath}";`;
38
+ }
36
39
  return `export * from "${exportPath}";`;
37
40
  });
38
41