autoforge-ai 0.1.11 → 0.1.12

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/.env.example CHANGED
@@ -30,11 +30,18 @@
30
30
  # ANTHROPIC_DEFAULT_HAIKU_MODEL=claude-3-5-haiku@20241022
31
31
 
32
32
  # ===================
33
- # Alternative API Providers (GLM, Ollama, Kimi, Custom)
33
+ # Alternative API Providers (Azure, GLM, Ollama, Kimi, Custom)
34
34
  # ===================
35
35
  # Configure via Settings UI (recommended) or set env vars below.
36
36
  # When both are set, env vars take precedence.
37
37
  #
38
+ # Azure Anthropic (Claude):
39
+ # ANTHROPIC_BASE_URL=https://your-resource.services.ai.azure.com/anthropic
40
+ # ANTHROPIC_API_KEY=your-azure-api-key
41
+ # ANTHROPIC_DEFAULT_OPUS_MODEL=claude-opus-4-6
42
+ # ANTHROPIC_DEFAULT_SONNET_MODEL=claude-sonnet-4-5
43
+ # ANTHROPIC_DEFAULT_HAIKU_MODEL=claude-haiku-4-5
44
+ #
38
45
  # GLM (Zhipu AI):
39
46
  # ANTHROPIC_BASE_URL=https://api.z.ai/api/anthropic
40
47
  # ANTHROPIC_AUTH_TOKEN=your-glm-api-key
package/client.py CHANGED
@@ -141,7 +141,6 @@ def get_extra_read_paths() -> list[Path]:
141
141
  # overhead and preventing agents from calling tools meant for other roles.
142
142
  #
143
143
  # Tools intentionally omitted from ALL agent lists (UI/orchestrator only):
144
- # feature_get_ready, feature_get_blocked, feature_get_graph,
145
144
  # feature_remove_dependency
146
145
  #
147
146
  # The ghost tool "feature_release_testing" was removed entirely -- it was
@@ -151,6 +150,9 @@ CODING_AGENT_TOOLS = [
151
150
  "mcp__features__feature_get_stats",
152
151
  "mcp__features__feature_get_by_id",
153
152
  "mcp__features__feature_get_summary",
153
+ "mcp__features__feature_get_ready",
154
+ "mcp__features__feature_get_blocked",
155
+ "mcp__features__feature_get_graph",
154
156
  "mcp__features__feature_claim_and_get",
155
157
  "mcp__features__feature_mark_in_progress",
156
158
  "mcp__features__feature_mark_passing",
@@ -163,12 +165,18 @@ TESTING_AGENT_TOOLS = [
163
165
  "mcp__features__feature_get_stats",
164
166
  "mcp__features__feature_get_by_id",
165
167
  "mcp__features__feature_get_summary",
168
+ "mcp__features__feature_get_ready",
169
+ "mcp__features__feature_get_blocked",
170
+ "mcp__features__feature_get_graph",
166
171
  "mcp__features__feature_mark_passing",
167
172
  "mcp__features__feature_mark_failing",
168
173
  ]
169
174
 
170
175
  INITIALIZER_AGENT_TOOLS = [
171
176
  "mcp__features__feature_get_stats",
177
+ "mcp__features__feature_get_ready",
178
+ "mcp__features__feature_get_blocked",
179
+ "mcp__features__feature_get_graph",
172
180
  "mcp__features__feature_create_bulk",
173
181
  "mcp__features__feature_create",
174
182
  "mcp__features__feature_add_dependency",
@@ -342,6 +350,7 @@ def create_client(
342
350
  is_vertex = sdk_env.get("CLAUDE_CODE_USE_VERTEX") == "1"
343
351
  is_alternative_api = bool(base_url) or is_vertex
344
352
  is_ollama = "localhost:11434" in base_url or "127.0.0.1:11434" in base_url
353
+ is_azure = "services.ai.azure.com" in base_url
345
354
  model = convert_model_for_vertex(model)
346
355
  if sdk_env:
347
356
  print(f" - API overrides: {', '.join(sdk_env.keys())}")
@@ -351,8 +360,10 @@ def create_client(
351
360
  print(f" - Vertex AI Mode: Using GCP project '{project_id}' with model '{model}' in region '{region}'")
352
361
  elif is_ollama:
353
362
  print(" - Ollama Mode: Using local models")
363
+ elif is_azure:
364
+ print(f" - Azure Mode: Using {base_url}")
354
365
  elif "ANTHROPIC_BASE_URL" in sdk_env:
355
- print(f" - GLM Mode: Using {sdk_env['ANTHROPIC_BASE_URL']}")
366
+ print(f" - Alternative API: Using {sdk_env['ANTHROPIC_BASE_URL']}")
356
367
 
357
368
  # Create a wrapper for bash_security_hook that passes project_dir via context
358
369
  async def bash_hook_with_context(input_data, tool_use_id=None, context=None):
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autoforge-ai",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "Autonomous coding agent with web UI - build complete apps with AI",
5
5
  "license": "AGPL-3.0",
6
6
  "bin": {
@@ -194,6 +194,7 @@ class ParallelOrchestrator:
194
194
  # Legacy alias for backward compatibility
195
195
  self.running_agents = self.running_coding_agents
196
196
  self.abort_events: dict[int, threading.Event] = {}
197
+ self._testing_session_counter = 0
197
198
  self.is_running = False
198
199
 
199
200
  # Track feature failures to prevent infinite retry loops
@@ -846,7 +847,7 @@ class ParallelOrchestrator:
846
847
  "encoding": "utf-8",
847
848
  "errors": "replace",
848
849
  "cwd": str(self.project_dir), # Run from project dir so CLI creates .claude/ in project
849
- "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": ""},
850
+ "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": "", "PLAYWRIGHT_CLI_SESSION": f"coding-{feature_id}"},
850
851
  }
851
852
  if sys.platform == "win32":
852
853
  popen_kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
@@ -909,7 +910,7 @@ class ParallelOrchestrator:
909
910
  "encoding": "utf-8",
910
911
  "errors": "replace",
911
912
  "cwd": str(self.project_dir), # Run from project dir so CLI creates .claude/ in project
912
- "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": ""},
913
+ "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": "", "PLAYWRIGHT_CLI_SESSION": f"coding-{primary_id}"},
913
914
  }
914
915
  if sys.platform == "win32":
915
916
  popen_kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
@@ -1013,8 +1014,9 @@ class ParallelOrchestrator:
1013
1014
  "encoding": "utf-8",
1014
1015
  "errors": "replace",
1015
1016
  "cwd": str(self.project_dir), # Run from project dir so CLI creates .claude/ in project
1016
- "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": ""},
1017
+ "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": "", "PLAYWRIGHT_CLI_SESSION": f"testing-{self._testing_session_counter}"},
1017
1018
  }
1019
+ self._testing_session_counter += 1
1018
1020
  if sys.platform == "win32":
1019
1021
  popen_kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
1020
1022
 
package/registry.py CHANGED
@@ -676,6 +676,18 @@ API_PROVIDERS: dict[str, dict[str, Any]] = {
676
676
  ],
677
677
  "default_model": "glm-4.7",
678
678
  },
679
+ "azure": {
680
+ "name": "Azure Anthropic (Claude)",
681
+ "base_url": "",
682
+ "requires_auth": True,
683
+ "auth_env_var": "ANTHROPIC_API_KEY",
684
+ "models": [
685
+ {"id": "claude-opus-4-6", "name": "Claude Opus"},
686
+ {"id": "claude-sonnet-4-5", "name": "Claude Sonnet"},
687
+ {"id": "claude-haiku-4-5", "name": "Claude Haiku"},
688
+ ],
689
+ "default_model": "claude-opus-4-6",
690
+ },
679
691
  "ollama": {
680
692
  "name": "Ollama (Local)",
681
693
  "base_url": "http://localhost:11434",