forgeos 0.1.0-alpha.11 → 0.1.0-alpha.13

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 (150) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +22 -1
  3. package/README.md +7 -0
  4. package/docs/changelog.md +1 -1
  5. package/package.json +1 -1
  6. package/src/forge/_generated/actionSubscriptions.json +1 -1
  7. package/src/forge/_generated/actionSubscriptions.ts +3 -3
  8. package/src/forge/_generated/agentAdapterManifest.json +1 -1
  9. package/src/forge/_generated/agentAdapterManifest.ts +3 -3
  10. package/src/forge/_generated/agentContract.json +1 -1
  11. package/src/forge/_generated/agentContract.ts +2 -2
  12. package/src/forge/_generated/agentQuickstart.md +1 -1
  13. package/src/forge/_generated/agentTools.json +1 -1
  14. package/src/forge/_generated/agentTools.md +1 -1
  15. package/src/forge/_generated/agentTools.ts +2 -2
  16. package/src/forge/_generated/aiContext.ts +1 -1
  17. package/src/forge/_generated/aiModels.ts +1 -1
  18. package/src/forge/_generated/aiProviders.ts +1 -1
  19. package/src/forge/_generated/aiRegistry.json +1 -1
  20. package/src/forge/_generated/aiRegistry.ts +3 -3
  21. package/src/forge/_generated/api.json +1 -1
  22. package/src/forge/_generated/api.ts +1 -1
  23. package/src/forge/_generated/appGraph.json +1 -1
  24. package/src/forge/_generated/appGraph.ts +626 -71
  25. package/src/forge/_generated/appMap.md +1 -1
  26. package/src/forge/_generated/artifactManifest.json +1 -1
  27. package/src/forge/_generated/artifactManifest.ts +2 -2
  28. package/src/forge/_generated/authClaims.ts +1 -1
  29. package/src/forge/_generated/authConfig.ts +1 -1
  30. package/src/forge/_generated/authContext.ts +1 -1
  31. package/src/forge/_generated/authRegistry.ts +1 -1
  32. package/src/forge/_generated/buildInfo.json +1 -1
  33. package/src/forge/_generated/buildInfo.ts +4 -4
  34. package/src/forge/_generated/capabilityMap.json +1 -1
  35. package/src/forge/_generated/capabilityMap.md +1 -1
  36. package/src/forge/_generated/capabilityMap.ts +2 -2
  37. package/src/forge/_generated/client.ts +1 -1
  38. package/src/forge/_generated/clientApi.ts +1 -1
  39. package/src/forge/_generated/clientManifest.json +1 -1
  40. package/src/forge/_generated/clientManifest.ts +3 -3
  41. package/src/forge/_generated/clientTypes.ts +1 -1
  42. package/src/forge/_generated/configRegistry.ts +1 -1
  43. package/src/forge/_generated/dataGraph.json +1 -1
  44. package/src/forge/_generated/dataGraph.ts +3 -3
  45. package/src/forge/_generated/db.ts +1 -1
  46. package/src/forge/_generated/dbSecurityManifest.ts +1 -1
  47. package/src/forge/_generated/dbSessionContext.ts +1 -1
  48. package/src/forge/_generated/deployManifest.json +1 -1
  49. package/src/forge/_generated/deployManifest.ts +7 -7
  50. package/src/forge/_generated/devManifest.json +1 -1
  51. package/src/forge/_generated/devManifest.ts +3 -3
  52. package/src/forge/_generated/envSchema.ts +1 -1
  53. package/src/forge/_generated/externalServices.ts +1 -1
  54. package/src/forge/_generated/frontendGraph.ts +1 -1
  55. package/src/forge/_generated/importGuards.ts +1 -1
  56. package/src/forge/_generated/index.ts +1 -1
  57. package/src/forge/_generated/liveProductionManifest.ts +1 -1
  58. package/src/forge/_generated/liveProtocol.ts +1 -1
  59. package/src/forge/_generated/liveQueryRegistry.json +1 -1
  60. package/src/forge/_generated/liveQueryRegistry.ts +3 -3
  61. package/src/forge/_generated/liveTransportConfig.ts +1 -1
  62. package/src/forge/_generated/makeRegistry.json +1 -1
  63. package/src/forge/_generated/makeRegistry.ts +2 -2
  64. package/src/forge/_generated/makeTemplates.ts +1 -1
  65. package/src/forge/_generated/mockMap.ts +1 -1
  66. package/src/forge/_generated/operationPlaybooks.md +1 -1
  67. package/src/forge/_generated/packageGraph.json +1 -1
  68. package/src/forge/_generated/packageGraph.ts +2 -2
  69. package/src/forge/_generated/packageUpgradeRegistry.json +1 -1
  70. package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
  71. package/src/forge/_generated/permissionMatrix.json +1 -1
  72. package/src/forge/_generated/permissionMatrix.ts +3 -3
  73. package/src/forge/_generated/policyRegistry.json +1 -1
  74. package/src/forge/_generated/policyRegistry.ts +3 -3
  75. package/src/forge/_generated/queryRegistry.json +1 -1
  76. package/src/forge/_generated/queryRegistry.ts +3 -3
  77. package/src/forge/_generated/react.d.ts +1 -1
  78. package/src/forge/_generated/react.ts +1 -1
  79. package/src/forge/_generated/reactManifest.json +1 -1
  80. package/src/forge/_generated/reactManifest.ts +3 -3
  81. package/src/forge/_generated/releaseManifest.json +1 -1
  82. package/src/forge/_generated/releaseManifest.ts +3 -3
  83. package/src/forge/_generated/rlsPolicies.sql +1 -1
  84. package/src/forge/_generated/rlsPolicies.ts +1 -1
  85. package/src/forge/_generated/runtimeGraph.json +1 -1
  86. package/src/forge/_generated/runtimeGraph.ts +3 -3
  87. package/src/forge/_generated/runtimeMatrix.ts +1 -1
  88. package/src/forge/_generated/runtimeRegistry.ts +1 -1
  89. package/src/forge/_generated/runtimeRules.md +1 -1
  90. package/src/forge/_generated/secretRegistry.ts +1 -1
  91. package/src/forge/_generated/secretsContext.ts +1 -1
  92. package/src/forge/_generated/serverApi.ts +1 -1
  93. package/src/forge/_generated/sourceMapManifest.json +1 -1
  94. package/src/forge/_generated/sourceMapManifest.ts +2 -2
  95. package/src/forge/_generated/sqlPlan.ts +1 -1
  96. package/src/forge/_generated/subscriptionManifest.json +1 -1
  97. package/src/forge/_generated/subscriptionManifest.ts +3 -3
  98. package/src/forge/_generated/symbolicationManifest.json +1 -1
  99. package/src/forge/_generated/symbolicationManifest.ts +2 -2
  100. package/src/forge/_generated/telemetryRegistry.json +1 -1
  101. package/src/forge/_generated/telemetryRegistry.ts +3 -3
  102. package/src/forge/_generated/telemetrySinks.json +1 -1
  103. package/src/forge/_generated/telemetrySinks.ts +2 -2
  104. package/src/forge/_generated/tenantScope.json +1 -1
  105. package/src/forge/_generated/tenantScope.ts +3 -3
  106. package/src/forge/_generated/testGraph.json +1 -1
  107. package/src/forge/_generated/testGraph.ts +75 -3
  108. package/src/forge/_generated/testPlanRegistry.json +1 -1
  109. package/src/forge/_generated/testPlanRegistry.ts +2 -2
  110. package/src/forge/_generated/uiRoutes.ts +1 -1
  111. package/src/forge/_generated/uiScenarios.ts +1 -1
  112. package/src/forge/_generated/uiTestManifest.json +1 -1
  113. package/src/forge/_generated/uiTestManifest.ts +2 -2
  114. package/src/forge/_generated/workflowRegistry.json +1 -1
  115. package/src/forge/_generated/workflowRegistry.ts +3 -3
  116. package/src/forge/_generated/workflowSubscriptions.json +1 -1
  117. package/src/forge/_generated/workflowSubscriptions.ts +3 -3
  118. package/src/forge/agent-adapters/index.ts +36 -2
  119. package/src/forge/agent-adapters/types.ts +10 -1
  120. package/src/forge/agent-memory/bridge.ts +228 -0
  121. package/src/forge/agent-memory/context-pack.ts +104 -0
  122. package/src/forge/agent-memory/mcp.ts +224 -0
  123. package/src/forge/agent-memory/normalize.ts +249 -0
  124. package/src/forge/agent-memory/redaction.ts +94 -0
  125. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  126. package/src/forge/agent-memory/sources/codex.ts +58 -0
  127. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  128. package/src/forge/agent-memory/types.ts +112 -0
  129. package/src/forge/cli/build.ts +19 -3
  130. package/src/forge/cli/commands.ts +56 -0
  131. package/src/forge/cli/dev.ts +17 -8
  132. package/src/forge/cli/main.ts +12 -1
  133. package/src/forge/cli/new.ts +1 -0
  134. package/src/forge/cli/parse.ts +159 -2
  135. package/src/forge/delta/classifier.ts +52 -0
  136. package/src/forge/delta/explain.ts +126 -0
  137. package/src/forge/delta/git-observer.ts +43 -0
  138. package/src/forge/delta/ids.ts +44 -0
  139. package/src/forge/delta/index.ts +6 -0
  140. package/src/forge/delta/recorder.ts +350 -0
  141. package/src/forge/delta/redaction.ts +50 -0
  142. package/src/forge/delta/schema.ts +238 -0
  143. package/src/forge/delta/session.ts +141 -0
  144. package/src/forge/delta/status.ts +68 -0
  145. package/src/forge/delta/store.ts +2573 -0
  146. package/src/forge/delta/timeline.ts +104 -0
  147. package/src/forge/dev/server.ts +39 -0
  148. package/src/forge/dev/types.ts +2 -0
  149. package/src/forge/dev/watch.ts +17 -7
  150. package/src/forge/version.ts +1 -1
@@ -0,0 +1,141 @@
1
+ import { DeltaStore, type DeltaWorkSessionDetails, type DeltaWorkSessionSummary } from "./store.ts";
2
+
3
+ export type DeltaSessionSubcommand = "list" | "show" | "rename" | "merge" | "split" | "detach";
4
+
5
+ export interface DeltaSessionCommandInput {
6
+ workspaceRoot: string;
7
+ subcommand: DeltaSessionSubcommand;
8
+ sessionId?: string;
9
+ title?: string;
10
+ sourceSessionId?: string;
11
+ operationId?: string;
12
+ limit?: number;
13
+ }
14
+
15
+ export interface DeltaSessionCommandResult {
16
+ ok: boolean;
17
+ subcommand: DeltaSessionSubcommand;
18
+ sessions?: DeltaWorkSessionSummary[];
19
+ session?: DeltaWorkSessionDetails;
20
+ detached?: boolean;
21
+ message?: string;
22
+ exitCode: number;
23
+ }
24
+
25
+ export async function runDeltaSessionCommand(input: DeltaSessionCommandInput): Promise<DeltaSessionCommandResult> {
26
+ const store = await DeltaStore.open(input.workspaceRoot);
27
+ try {
28
+ switch (input.subcommand) {
29
+ case "list":
30
+ return {
31
+ ok: true,
32
+ subcommand: input.subcommand,
33
+ sessions: await store.listWorkSessions(input.limit),
34
+ exitCode: 0,
35
+ };
36
+ case "show": {
37
+ const session = await store.getWorkSessionDetails(input.sessionId ?? "current");
38
+ return session
39
+ ? { ok: true, subcommand: input.subcommand, session, exitCode: 0 }
40
+ : { ok: false, subcommand: input.subcommand, message: "work session not found", exitCode: 1 };
41
+ }
42
+ case "rename": {
43
+ if (!input.title) {
44
+ return { ok: false, subcommand: input.subcommand, message: "forge session rename requires a title", exitCode: 1 };
45
+ }
46
+ const session = await store.renameWorkSession(input.sessionId ?? "current", input.title);
47
+ return session
48
+ ? { ok: true, subcommand: input.subcommand, session, exitCode: 0 }
49
+ : { ok: false, subcommand: input.subcommand, message: "work session not found", exitCode: 1 };
50
+ }
51
+ case "merge": {
52
+ if (!input.sourceSessionId) {
53
+ return { ok: false, subcommand: input.subcommand, message: "forge session merge requires a source session", exitCode: 1 };
54
+ }
55
+ const session = await store.mergeWorkSessions(input.sessionId ?? "current", input.sourceSessionId);
56
+ return session
57
+ ? { ok: true, subcommand: input.subcommand, session, exitCode: 0 }
58
+ : { ok: false, subcommand: input.subcommand, message: "work session merge failed", exitCode: 1 };
59
+ }
60
+ case "split": {
61
+ if (!input.operationId) {
62
+ return { ok: false, subcommand: input.subcommand, message: "forge session split requires an operation id", exitCode: 1 };
63
+ }
64
+ const session = await store.splitWorkSession(input.sessionId ?? "current", input.operationId);
65
+ return session
66
+ ? { ok: true, subcommand: input.subcommand, session, exitCode: 0 }
67
+ : { ok: false, subcommand: input.subcommand, message: "work session split failed", exitCode: 1 };
68
+ }
69
+ case "detach": {
70
+ if (!input.operationId) {
71
+ return { ok: false, subcommand: input.subcommand, message: "forge session detach requires an operation id", exitCode: 1 };
72
+ }
73
+ const detached = await store.detachWorkSessionOperation(input.operationId);
74
+ return { ok: detached, subcommand: input.subcommand, detached, exitCode: detached ? 0 : 1 };
75
+ }
76
+ }
77
+ } finally {
78
+ await store.close();
79
+ }
80
+ }
81
+
82
+ export function formatDeltaSessionHuman(result: DeltaSessionCommandResult): string {
83
+ if (!result.ok) {
84
+ return `${result.message ?? "session command failed"}\n`;
85
+ }
86
+ if (result.sessions) {
87
+ const lines = ["Work Sessions", ""];
88
+ if (result.sessions.length === 0) {
89
+ lines.push("none");
90
+ } else {
91
+ for (const session of result.sessions) {
92
+ lines.push(`${session.id} ${session.status} ${session.confidence.toFixed(2)} ${session.title}`);
93
+ }
94
+ }
95
+ return `${lines.join("\n")}\n`;
96
+ }
97
+ if (result.session) {
98
+ return formatWorkSessionDetails(result.session);
99
+ }
100
+ if (result.detached !== undefined) {
101
+ return result.detached ? "operation detached\n" : "operation was not linked\n";
102
+ }
103
+ return "session ok\n";
104
+ }
105
+
106
+ export function formatDeltaSessionJson(result: DeltaSessionCommandResult): string {
107
+ return `${JSON.stringify(result, null, 2)}\n`;
108
+ }
109
+
110
+ export function formatWorkSessionDetails(session: DeltaWorkSessionDetails): string {
111
+ const lines = ["Work Session", ""];
112
+ lines.push(`id: ${session.id}`);
113
+ lines.push(`title: ${session.title}`);
114
+ lines.push(`status: ${session.status}`);
115
+ lines.push(`confidence: ${session.confidence.toFixed(2)}`);
116
+ if (session.gitBranch) {
117
+ lines.push(`branch: ${session.gitBranch}`);
118
+ }
119
+ if (session.summary) {
120
+ lines.push(`summary: ${session.summary}`);
121
+ }
122
+ lines.push("");
123
+ lines.push("Why:");
124
+ if (session.reasons.length === 0) {
125
+ lines.push(" no stored signals");
126
+ } else {
127
+ for (const reason of session.reasons.slice(0, 8)) {
128
+ lines.push(` - ${reason.signal}${reason.value ? `: ${reason.value}` : ""} (${reason.weight})`);
129
+ }
130
+ }
131
+ lines.push("");
132
+ lines.push("Operations:");
133
+ if (session.operations.length === 0) {
134
+ lines.push(" none");
135
+ } else {
136
+ for (const operation of session.operations.slice(-12)) {
137
+ lines.push(` ${operation.timestamp.slice(11, 16)} ${operation.kind}${operation.summary ? ` ${operation.summary}` : ""}`);
138
+ }
139
+ }
140
+ return `${lines.join("\n")}\n`;
141
+ }
@@ -0,0 +1,68 @@
1
+ import { DeltaStore, type DeltaStatus } from "./store.ts";
2
+
3
+ export interface DeltaStatusResult extends DeltaStatus {
4
+ exitCode: 0;
5
+ }
6
+
7
+ export async function runDeltaStatus(workspaceRoot: string): Promise<DeltaStatusResult> {
8
+ const store = await DeltaStore.open(workspaceRoot);
9
+ try {
10
+ return {
11
+ ...(await store.status()),
12
+ exitCode: 0,
13
+ };
14
+ } finally {
15
+ await store.close();
16
+ }
17
+ }
18
+
19
+ export function formatDeltaStatusHuman(result: DeltaStatusResult): string {
20
+ const lines = ["Forge Delta", ""];
21
+ lines.push("Status:");
22
+ lines.push(` ${result.recording ? "recording enabled" : "recording disabled"}`);
23
+ lines.push(` local store: ${result.store}`);
24
+ lines.push("");
25
+ lines.push("Current work session:");
26
+ if (result.workSession) {
27
+ lines.push(` ${result.workSession.id}`);
28
+ lines.push(` title: ${result.workSession.title}`);
29
+ lines.push(` status: ${result.workSession.status}`);
30
+ lines.push(` confidence: ${result.workSession.confidence.toFixed(2)}`);
31
+ lines.push(` operations: ${result.workSession.operationCount}`);
32
+ if (result.workSession.gitBranch) {
33
+ lines.push(` branch: ${result.workSession.gitBranch}`);
34
+ }
35
+ if (result.workSession.reasons.length > 0) {
36
+ lines.push("");
37
+ lines.push("Why this session:");
38
+ for (const reason of result.workSession.reasons.slice(0, 5)) {
39
+ lines.push(` - ${reason.signal}${reason.value ? `: ${reason.value}` : ""}`);
40
+ }
41
+ }
42
+ } else {
43
+ lines.push(" none");
44
+ }
45
+ lines.push("");
46
+ lines.push("Latest recorder session:");
47
+ if (result.session) {
48
+ lines.push(` ${result.session.id}`);
49
+ lines.push(` started: ${result.session.startedAt}`);
50
+ lines.push(` operations: ${result.session.operationCount}`);
51
+ } else {
52
+ lines.push(" none");
53
+ }
54
+ lines.push("");
55
+ lines.push("Recent operations:");
56
+ if (result.recentOperations.length === 0) {
57
+ lines.push(" none");
58
+ } else {
59
+ for (const operation of result.recentOperations) {
60
+ lines.push(` ${operation.timestamp.slice(11, 16)} ${operation.kind}${operation.summary ? ` ${operation.summary}` : ""}`);
61
+ }
62
+ }
63
+ return `${lines.join("\n")}\n`;
64
+ }
65
+
66
+ export function formatDeltaStatusJson(result: DeltaStatusResult): string {
67
+ return `${JSON.stringify(result, null, 2)}\n`;
68
+ }