Skip to content

feat: merge claude modifications and fixes#1

Open
pranaysb wants to merge 23 commits into
mainfrom
claude-code-modification
Open

feat: merge claude modifications and fixes#1
pranaysb wants to merge 23 commits into
mainfrom
claude-code-modification

Conversation

@pranaysb

Copy link
Copy Markdown
Owner

This PR merges the improvements from the claude-code-modification branch into main. Features and fixes include:

  • Unblocked async event loop & explicit SSE success handling
  • Fixed schema validator self-healing infinite loop
  • Implemented E2B sandbox executor
  • Added 39 passing unit tests covering nodes, parsers, and execution
  • 100% benchmark success rate for small OpenAPI specifications

pranaysb and others added 15 commits July 13, 2026 00:17
These were committed before .gitignore covered them, so git kept tracking
them. apiforge.db had grown to 20MB of local job history.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Includes schema validator node, test linter, SSE checkpoint audit logging,
reliability parsing-error fallback, and frontend timeline tweaks that were
in the working tree before the audit fixes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Large vendor specs (github 12MB, stripe 7.5MB, discord 1.1MB) are
gitignored with fetch instructions in benchmarks/README.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The schema validator regenerated scripts blind on every retry: diagnoser
feedback, the previous failed script, and its stderr were never fed back
into the prompt, so failures repeated identically until max retries.
Observed failing 5/5 attempts on a 2-endpoint spec.

- Feed diagnostic_feedback + previous script + previous stderr into the
  schema validator prompt
- Lint schema-validation scripts before execution (syntax, pytest ban,
  MockTransport enforcement in SYNTHETIC mode) via a shared
  lint_test_script() helper also used by test_linter_node
- Guard the diagnoser against misdiagnosis: a SyntaxError raised by the
  test script itself can never be an SDK bug, so never patch the SDK
  for it (observed: it patched models.py for a one-line script error)
- Declare the endpoint/state fields actually used (schema_validated,
  validation_mode, execution_stdout/stderr, auth_credentials)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ccess

- Iterate the synchronous LangGraph stream in a worker thread; multi-second
  LLM/executor calls were blocking the event loop, stalling every other
  request during a job run (health check now responds in ~3ms mid-run)
- Final SDK integrity gate now injects httpx.MockTransport instead of
  calling the real base_url; petstore jobs failed with ConnectionRefused
  even after all 20 endpoint tests passed
- Treat ValidationError from the mocked empty payload as a pass (proves
  the method runs Pydantic validation), and accept plain dict/scalar
  returns for free-form map schemas
- Add explicit success:true/false to SSE 'complete' events
- Clean up job_locks entries after completion (unbounded growth)
- Extract normalize_base_url() so tests exercise the real logic
- reliability: recognize Groq tool_use_failed errors explicitly as
  retryable parsing failures (previously matched by string luck)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Any parseable YAML/JSON (e.g. 'hello: world') previously created a job.
Now requires an openapi/swagger version field and non-empty paths (422
otherwise), and extract_endpoints tolerates malformed path items.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaces the stub: runs generated code in an isolated E2B cloud sandbox
(fresh sandbox per execution) instead of the host machine. Enabled via
USE_E2B_EXECUTOR=true + E2B_API_KEY. LocalExecutor remains the default.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Drops unused SDKOutput model and LLM imports from sdk_builder, the
unused determine_dependencies() stub, and duplicated imports in config.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ggraph

- pytest previously failed to collect (ModuleNotFoundError: app); add
  pythonpath/testpaths config so 'poetry run pytest' works
- Rewrite test_relative_url to import the real normalize_base_url
  instead of duplicating the logic inline
- New tests: openapi parser + spec validation, test-script linter, SDK
  consistency validator, graph routing, sdk_builder zip packaging,
  upload API (with isolated in-memory DB), ReliabilityManager failover
  with a mocked LLM (key rotation, model fallback, exhaustion)
- Upgrade langgraph 0.2 -> 0.4 to resolve the checkpoint-postgres
  incompatibility warning; all tests and E2E pass on 0.4.10

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Job status no longer inferred by substring-matching 'failed' in the
message (kept only as fallback for older backends). Replaces the 'any'
cast with an EndpointInfo interface — eslint is clean again.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
petstore:        FAILED (22 retries) -> SUCCESS in 723s (3 retries, 20/20 endpoints)
jsonplaceholder: FAILED (15 retries) -> SUCCESS in 32s (0 retries)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 18, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
api-forge-ai Ready Ready Preview, Comment Jul 22, 2026 5:20am

pranaysb and others added 8 commits July 22, 2026 10:33
An unhandled exception (e.g. the DB-schema mismatch this surfaced) produced
a 500 with no Access-Control-Allow-Origin header, so the browser reported
it to JS as an opaque 'Failed to fetch' instead of a readable error.

Two wrong fixes tried and rejected before this one (see main.py comments
and tests/test_error_handling.py for the regression coverage):
1. @app.exception_handler(Exception) - routes through Starlette's
   ServerErrorMiddleware, which sits outside every add_middleware() layer
   including CORS, regardless of registration order.
2. An @app.middleware("http") handler registered AFTER CORSMiddleware -
   Starlette's add_middleware() prepends (insert(0, ...)), so the LAST
   registered middleware ends up OUTERMOST. Registering after CORS put it
   outside CORS, same bypass.

Fix: register the exception-catching middleware BEFORE CORSMiddleware, so
CORS ends up outermost and wraps its responses too. Verified against the
live uvicorn process (not just TestClient) with a temporary crash route.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A spec with a non-empty 'paths' object but no GET/POST/etc. under any of
them (e.g. only a path-level 'parameters' key) passed validation and
created a job with 0 endpoints - confirmed live via curl. Reject with 422
instead, matching the empty-paths case already handled.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… preview

- Drag-and-drop zone plus project name field
- Client-side spec preview: parses JSON specs immediately to show title,
  endpoint count, and method/path chips before upload; validates YAML by
  shape. Blocks submit on oversized files, malformed JSON, missing
  openapi/swagger field, empty paths, or paths with no HTTP operations -
  mirrors the backend's validation so users get instant feedback instead
  of a round trip
- Upload error messages now include a hint keyed off the HTTP status
  (413/422/429/400) instead of a generic failure message
- Add a 'How it works' pipeline explainer (7 agent nodes) and a shared Nav
  component used across all pages
- Fix globals.css: an unconditional prefers-color-scheme dark override was
  flipping body text to near-white, making the nav logo unreadable in
  dark-mode browsers, despite the whole UI being an explicitly light-only
  design. Removed the override.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…/lib/

The generic Python-template 'lib/' and 'lib64/' entries matched any
directory with that name anywhere in the repo, including the frontend's
src/lib/ — meaning any new file added there (e.g. lib/pipeline.ts, added
in this branch) would never show up in git status and could be silently
lost. Scope both entries to backend/ (poetry installs the venv outside
the repo anyway, so nothing here currently relies on the old pattern).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Overall progress bar and stat cards (succeeded/failed/retries/model/
  failovers) aggregated client-side from the execution log history
- Per-endpoint status grid (method + path + color-coded status + retry count)
- Collapsible glossary explaining what each of the 7 pipeline nodes does
  (shared PIPELINE_NODES data in lib/pipeline.ts, also used on the home page)
- Added explanatory rendering for sdk_validator, schema_validator, and
  test_linter nodes, which previously showed only a bare header with no
  content
- Explicit success/failure banner text surfaced from the SSE stream

Note: NODE_DOT_COLOR (Tailwind classes like bg-indigo-500) is intentionally
kept in each consuming .tsx file rather than centralized in pipeline.ts —
classes referenced only from a .ts file were silently dropped by the
build's content scanner (confirmed empirically: identical classes defined
in a .tsx file compiled fine, the .ts-only ones did not). Keep any future
per-node Tailwind classes colocated in the .tsx files, not lib/pipeline.ts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Skeleton loading states for projects and jobs lists
- Empty states with a CTA to upload when there are no projects/jobs
- Unified status badge colors (adds PENDING), job duration display
- Whole job row is now a Link (was a separate button)
- Fixed a react-hooks/set-state-in-effect lint error: loading state is now
  derived (jobsLoadedFor vs selectedProjectId) instead of a synchronous
  setState() call at the top of the jobs-fetch effect

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Unused (not imported anywhere) and its SSE URL was wrong (missing /jobs/
prefix), so it could never have worked as written.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Backend (uvicorn :8000) and frontend (next dev :3000) configs so
preview_start can launch both for local testing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant