@aion0/forge 0.5.22 → 0.5.23
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
CHANGED
|
@@ -1,38 +1,12 @@
|
|
|
1
|
-
# Forge v0.5.
|
|
1
|
+
# Forge v0.5.23
|
|
2
2
|
|
|
3
3
|
Released: 2026-04-03
|
|
4
4
|
|
|
5
|
-
## Changes since v0.5.
|
|
6
|
-
|
|
7
|
-
### Features
|
|
8
|
-
- feat: workspace model config, headless mode for non-claude agents
|
|
9
|
-
- feat: unified terminal picker, model resolution, VibeCoding agent fix
|
|
10
|
-
- feat: smith 'starting' state, terminal picker, boundSessionId preservation
|
|
11
|
-
- feat: playwright plugin supports headed mode (show browser window)
|
|
12
|
-
- feat: QA preset auto-creates playwright config, test dir, and starts dev server
|
|
13
|
-
- feat: Plugin system enhancements — instances, MCP tools, agent integration
|
|
14
|
-
- feat: Pipeline supports plugin nodes (mode: plugin)
|
|
15
|
-
- feat: Plugin system — types, registry, executor, built-in plugins, API
|
|
5
|
+
## Changes since v0.5.22
|
|
16
6
|
|
|
17
7
|
### Bug Fixes
|
|
18
|
-
- fix:
|
|
19
|
-
- fix:
|
|
20
|
-
- fix: settings agent config save, cliType unification, add form improvements
|
|
21
|
-
- fix: smith restart race condition and session binding improvements
|
|
22
|
-
- fix: terminal-standalone cleanup and correctness fixes
|
|
23
|
-
- fix: workspace-standalone and session-monitor correctness/perf fixes
|
|
24
|
-
- fix: plugin shell executor hardened against child process crashes
|
|
25
|
-
- fix: plugin shell executor uses async exec instead of execSync
|
|
26
|
-
- fix: QA preset uses bash commands as primary, MCP tools as optional
|
|
27
|
-
- fix: playwright plugin uses mode-prefixed actions to avoid shell multiline issues
|
|
28
|
-
- fix: plugin instance config saves schema defaults when user doesn't modify fields
|
|
29
|
-
- fix: playwright check_url falls back to config.base_url when params.url empty
|
|
30
|
-
- fix: plugin instance form uses proper input types (select/boolean/number)
|
|
31
|
-
- fix: plugin system bug fixes from code review
|
|
32
|
-
- fix: plugin executor handles empty cwd + builtin dir fallback to source
|
|
33
|
-
|
|
34
|
-
### Refactoring
|
|
35
|
-
- refactor: orchestrator perf + correctness improvements
|
|
8
|
+
- fix: agent deletion now removes from settings (was only removing from local state)
|
|
9
|
+
- fix: fallback to default agent when configured agentId is deleted from Settings
|
|
36
10
|
|
|
37
11
|
|
|
38
|
-
**Full Changelog**: https://github.com/aiwatching/forge/compare/v0.5.
|
|
12
|
+
**Full Changelog**: https://github.com/aiwatching/forge/compare/v0.5.22...v0.5.23
|
|
@@ -1232,7 +1232,12 @@ function AgentsSection({ settings, setSettings }: { settings: any; setSettings:
|
|
|
1232
1232
|
if (!confirm(`Remove "${id}" agent?`)) return;
|
|
1233
1233
|
const updated = agents.filter(a => a.id !== id);
|
|
1234
1234
|
setAgents(updated);
|
|
1235
|
-
|
|
1235
|
+
// Remove from settings directly (saveAgentConfig only handles add/update, not delete)
|
|
1236
|
+
setSettings((prev: any) => {
|
|
1237
|
+
const agentsCfg = { ...(prev.agents || {}) };
|
|
1238
|
+
delete agentsCfg[id];
|
|
1239
|
+
return { ...prev, agents: agentsCfg };
|
|
1240
|
+
});
|
|
1236
1241
|
};
|
|
1237
1242
|
|
|
1238
1243
|
const addAgent = () => {
|
|
@@ -308,6 +308,18 @@ export class WorkspaceOrchestrator extends EventEmitter {
|
|
|
308
308
|
updateAgentConfig(id: string, config: WorkspaceAgentConfig): void {
|
|
309
309
|
const entry = this.agents.get(id);
|
|
310
310
|
if (!entry) return;
|
|
311
|
+
// Validate agentId exists — fallback to default if deleted from Settings
|
|
312
|
+
if (config.agentId) {
|
|
313
|
+
try {
|
|
314
|
+
const { listAgents, getDefaultAgentId } = require('../agents/index');
|
|
315
|
+
const validAgents = new Set((listAgents() as any[]).map((a: any) => a.id));
|
|
316
|
+
if (!validAgents.has(config.agentId)) {
|
|
317
|
+
const fallback = getDefaultAgentId() || 'claude';
|
|
318
|
+
console.log(`[workspace] ${config.label}: agent "${config.agentId}" not found, falling back to "${fallback}"`);
|
|
319
|
+
config.agentId = fallback;
|
|
320
|
+
}
|
|
321
|
+
} catch {}
|
|
322
|
+
}
|
|
311
323
|
const conflict = this.validateOutputs(config, id);
|
|
312
324
|
if (conflict) throw new Error(conflict);
|
|
313
325
|
const cycleErr = this.detectCycle(id, config.dependsOn);
|
|
@@ -879,6 +891,23 @@ export class WorkspaceOrchestrator extends EventEmitter {
|
|
|
879
891
|
installForgeSkills(this.projectPath, this.workspaceId, '', Number(process.env.PORT) || 8403);
|
|
880
892
|
} catch {}
|
|
881
893
|
|
|
894
|
+
// Validate agent IDs — fallback to default if configured agent was deleted from Settings
|
|
895
|
+
let defaultAgentId = 'claude';
|
|
896
|
+
try {
|
|
897
|
+
const { listAgents, getDefaultAgentId } = await import('../agents/index') as any;
|
|
898
|
+
const validAgents = new Set((listAgents() as any[]).map(a => a.id));
|
|
899
|
+
defaultAgentId = getDefaultAgentId() || 'claude';
|
|
900
|
+
for (const [id, entry] of this.agents) {
|
|
901
|
+
if (entry.config.type === 'input') continue;
|
|
902
|
+
if (entry.config.agentId && !validAgents.has(entry.config.agentId)) {
|
|
903
|
+
console.log(`[daemon] ${entry.config.label}: agent "${entry.config.agentId}" not found, falling back to "${defaultAgentId}"`);
|
|
904
|
+
entry.config.agentId = defaultAgentId;
|
|
905
|
+
this.emit('event', { type: 'log', agentId: id, entry: { type: 'system', subtype: 'warning', content: `Agent "${entry.config.agentId}" not found in Settings — using default "${defaultAgentId}"`, timestamp: new Date().toISOString() } } as any);
|
|
906
|
+
this.saveNow();
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
} catch {}
|
|
910
|
+
|
|
882
911
|
// Start each smith one by one, verify each starts correctly
|
|
883
912
|
let started = 0;
|
|
884
913
|
let failed = 0;
|
package/package.json
CHANGED