@aion0/forge 0.10.69 → 0.10.70
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/RELEASE_NOTES.md +16 -6
- package/bin/forge-server.mjs +16 -0
- package/lib/pipeline.ts +4 -0
- package/package.json +1 -1
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,13 +1,23 @@
|
|
|
1
|
-
# Forge v0.10.
|
|
1
|
+
# Forge v0.10.70
|
|
2
2
|
|
|
3
3
|
Released: 2026-06-11
|
|
4
4
|
|
|
5
|
-
## Changes since v0.10.
|
|
5
|
+
## Changes since v0.10.69
|
|
6
6
|
|
|
7
7
|
### Other
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
8
|
+
- revert: remove CLI quick-setup wizard + AUTH_SECRET persist (keep BRIDGE/CHAT port fixes)
|
|
9
|
+
- feat(setup): ask for department in enterprise wizard
|
|
10
|
+
- fix(auth): persist AUTH_SECRET so sessions survive refresh/restart
|
|
11
|
+
- fix(server): per-instance CHAT_PORT (webPort+5) — fixes 2nd-instance settings/sync
|
|
12
|
+
- feat(server): minimal first-run quick setup (public/enterprise)
|
|
13
|
+
- revert: remove first-run wizard + AUTH_SECRET persist + onboarding tweaks
|
|
14
|
+
- fix(setup): skip first-run wizard when instance already configured
|
|
15
|
+
- fix(setup): normalize half-typed email against tenant domain
|
|
16
|
+
- fix(auth): persist AUTH_SECRET so sessions survive refresh/restart
|
|
17
|
+
- fix(onboarding): show banner only, don't auto-open the modal each load
|
|
18
|
+
- fix(server): per-instance BRIDGE_PORT (webPort+4) + wizard sets onboardingCompleted
|
|
19
|
+
- feat(server): first-run public/enterprise quick-setup wizard
|
|
20
|
+
- fix(pipeline): run finalizePipeline on git-preflight abort
|
|
11
21
|
|
|
12
22
|
|
|
13
|
-
**Full Changelog**: https://github.com/aiwatching/forge/compare/v0.10.
|
|
23
|
+
**Full Changelog**: https://github.com/aiwatching/forge/compare/v0.10.69...v0.10.70
|
package/bin/forge-server.mjs
CHANGED
|
@@ -123,6 +123,19 @@ const workspacePort = parseInt(getArg('--workspace-port')) || (webPort + 2);
|
|
|
123
123
|
// second instance (dev-test on a different webPort) collided with the
|
|
124
124
|
// main instance. Offset from webPort like every other service.
|
|
125
125
|
const mcpPort = parseInt(getArg('--mcp-port')) || (webPort + 3);
|
|
126
|
+
// Browser-bridge standalone. Was hardcoded to 8407 everywhere (standalone,
|
|
127
|
+
// bridge-info route, extension fallback), so a second instance (e.g. --port
|
|
128
|
+
// 4000) reused the 8403 instance's bridge → the extension connected to the
|
|
129
|
+
// wrong instance and its token was rejected. Offset from webPort like the
|
|
130
|
+
// others; default 8403+4 = 8407 keeps existing single-instance pairings.
|
|
131
|
+
const bridgePort = parseInt(getArg('--bridge-port')) || (webPort + 4);
|
|
132
|
+
// Chat standalone. Was hardcoded to 8408 everywhere — a second instance
|
|
133
|
+
// (--port 4000) failed to bind it, then its next-server fell back to the
|
|
134
|
+
// 8408 default and hit the FIRST instance's chat standalone with a token
|
|
135
|
+
// signed for the wrong instance → "Sync failed: unauthorized" on
|
|
136
|
+
// settings/marketplace. Offset like bridge; default 8403+5 = 8408 keeps
|
|
137
|
+
// existing single-instance behaviour.
|
|
138
|
+
const chatPort = parseInt(getArg('--chat-port')) || (webPort + 5);
|
|
126
139
|
const DATA_DIR = getArg('--dir')?.replace(/^~/, homedir()) || join(homedir(), '.forge', 'data');
|
|
127
140
|
|
|
128
141
|
const PID_FILE = join(DATA_DIR, 'forge.pid');
|
|
@@ -245,6 +258,8 @@ process.env.PORT = String(webPort);
|
|
|
245
258
|
process.env.TERMINAL_PORT = String(terminalPort);
|
|
246
259
|
process.env.WORKSPACE_PORT = String(workspacePort);
|
|
247
260
|
process.env.MCP_PORT = String(mcpPort);
|
|
261
|
+
process.env.BRIDGE_PORT = String(bridgePort);
|
|
262
|
+
process.env.CHAT_PORT = String(chatPort);
|
|
248
263
|
process.env.FORGE_DATA_DIR = DATA_DIR;
|
|
249
264
|
|
|
250
265
|
// ── Password setup (first run or --reset-password) ──
|
|
@@ -318,6 +333,7 @@ if (!isStop && !addEnterpriseKeyOnly) {
|
|
|
318
333
|
}
|
|
319
334
|
}
|
|
320
335
|
|
|
336
|
+
|
|
321
337
|
// ── Enterprise keys (--enterprise-key=…) ──
|
|
322
338
|
//
|
|
323
339
|
// Each key is encrypted with AES-256-GCM via the same `.encrypt-key`
|
package/lib/pipeline.ts
CHANGED
|
@@ -1068,6 +1068,10 @@ export function startPipeline(
|
|
|
1068
1068
|
pipeline.error = `${blocked.message}${blocked.action ? `\nRun: ${blocked.action}` : ''}`;
|
|
1069
1069
|
pipeline.completedAt = new Date().toISOString();
|
|
1070
1070
|
savePipeline(pipeline);
|
|
1071
|
+
// Same settle housekeeping every other failure path gets — without it
|
|
1072
|
+
// schedule/binding-fired runs linger as "running" in pipeline_runs
|
|
1073
|
+
// until zombie reconciliation catches them.
|
|
1074
|
+
finalizePipeline(pipeline);
|
|
1071
1075
|
void notifyAuthBlocked({
|
|
1072
1076
|
title: `Pipeline aborted — git auth required (${workflowName})`,
|
|
1073
1077
|
body: blocked.message,
|
package/package.json
CHANGED