flowforge-map 0.4.0__tar.gz → 0.4.1__tar.gz
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.
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/PKG-INFO +23 -14
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/README.md +22 -13
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/pyproject.toml +1 -1
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/.gitignore +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/LICENSE +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/agent/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/agent/server.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/agent.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/apps.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/checks.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/connectors.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/flowmap.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/issues.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/keys.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/lock.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/projects.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/runs.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/scan.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/security.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/settings.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/api/stats.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/apps.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/checks/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/checks/models.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/checks/probes.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/cli.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/cli_ui.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/connectors/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/connectors/catalog.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/connectors/models.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/connectors/presets.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/connectors/registry.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/connectors/runtime.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/connectors/secrets.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/example_data.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flow/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flow/advice.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flow/curly.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flow/index.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flow/order.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flow/reach.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flow/rewrite.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flowmap/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flowmap/diff.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flowmap/fixture.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flowmap/models.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flowmap/planner.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flowmap/service.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/flowmap/validate.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/home.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/main.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/nodes/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/nodes/base.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/nodes/check_node.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/nodes/http_node.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/nodes/llm_node.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/nodes/local_node.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/nodes/mcp_node.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/nodes/mock_node.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/project_states.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/projects.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/facts.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/files.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/manifests.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/mcp_config.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/models.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/patterns.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/python_ast.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/scanner.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/services.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scan/urls.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scheduler/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scheduler/cache.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scheduler/critical_path.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scheduler/durations.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scheduler/executor.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scheduler/graph.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/scheduler/rate_limit.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/schema.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/finders.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/findings.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/fixes.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/keystore.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/local_only.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/lock.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/logfilter.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/masks.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/security/wire.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/settings.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/spa.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/state.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/storage.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/templating.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/flowforge/terminal.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/workflows/diamond_mock.json +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/backend/workflows/stripe_to_razorpay.json +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/.env.example +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/.gitignore +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/.mcp.json +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/README.md +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/config.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/mcp_servers/currency.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/planner.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/requirements.txt +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/services/__init__.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/services/geo.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/services/llm.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/services/mcp_tools.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/services/weather.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/tools/packing_list.py +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/examples/trip-planner/trips/.gitkeep +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/classic.html +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/AddConnector-Bi8J4U4d.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/Catalog-CA9b5nAc.css +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/Catalog-zd0ADYry.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/ChecksPage-B77bP82v.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/Connector-D4bc9fm5.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/ExportPage-X83lvpEi.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/ExportPage-e2bor7CC.css +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/FlowMapPage-BrnQhApb.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/Health-DROS3rFg.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/Health-FLn--j7D.css +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/HowDrawn-CazyemwU.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/IssuesPage-DI9W3uIc.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/KeysPage-B2vcuxeq.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/Later-89_57i-0.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/LiveRun-DgaIy_Hy.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/LiveRun-NyTlzZhk.css +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/Recheck-IaxmWKc4.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/RunHistory-DeusCIFP.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/SettingsPage-CF0lFy0X.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/SettingsPage-DrMN0pie.css +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/client-8TP7XnGi.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/flowmap-DhjGiCkH.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/flowmap-qRSp4v09.css +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/how-Bunfi3hG.css +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/icons-B5HLu6t-.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/index-Bl5rbBs-.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/index-BygBw1rS.css +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/links-BKyTYkee.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/mapId-CAn3Vwt1.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/sse-Bbzu7IqU.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/status-BtyVLBUd.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/assets/useChecks-Dgca8Xe7.js +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/favicon.svg +0 -0
- {flowforge_map-0.4.0 → flowforge_map-0.4.1}/frontend/dist/index.html +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: flowforge-map
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: Map what your app depends on (LLMs, MCP servers, APIs), check their health and security, and see what could run faster. Local and free; the scan needs no AI.
|
|
5
5
|
Project-URL: Homepage, https://github.com/Vishwa-Thangapandiyan/flowforge-agent-orchestrator
|
|
6
6
|
Project-URL: Issues, https://github.com/Vishwa-Thangapandiyan/flowforge-agent-orchestrator/issues
|
|
@@ -37,22 +37,28 @@ Description-Content-Type: text/markdown
|
|
|
37
37
|
|
|
38
38
|
# FlowForge
|
|
39
39
|
|
|
40
|
-
**
|
|
40
|
+
**See everything your AI app depends on: whether it's up, whether it's safe, and what's slowing it down.**
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
```bash
|
|
43
|
+
npx flowforge-map --example # a sample app's map in your browser: no keys, nothing sent
|
|
44
|
+
```
|
|
43
45
|
|
|
44
|
-
|
|
46
|
+

|
|
45
47
|
|
|
46
|
-
|
|
48
|
+
| | |
|
|
49
|
+
|---|---|
|
|
50
|
+
| 🗺 **Map** | Every LLM, MCP server, HTTP API and local program your code calls, each with the `file:line` it came from |
|
|
51
|
+
| 💚 **Check now** | Green, amber or red for each one, with its latency. When something is down, it tells you why |
|
|
52
|
+
| ⚡ **Faster** | Reads the order your code makes its calls and shows which ones could run together, with the time you'd save |
|
|
53
|
+
| 🛡 **Issues** | Keys written in code, plain `http://`, MCP servers that aren't pinned. Fix one on a new branch, or send it to your agent |
|
|
54
|
+
| 🔑 **Keys** | Paste a key once. **Add to code** writes it to a git-ignored file your app reads; FlowForge only ever hands your agent a mask |
|
|
55
|
+
| 🤖 **Your agent** | One MCP entry gives Claude Code, Codex or Antigravity the map, the advice and the issues |
|
|
47
56
|
|
|
48
|
-
|
|
49
|
-
- finds the bottleneck chain with a **longest-path DP** (critical path), predicted before the run and measured after it
|
|
50
|
-
- runs independent steps concurrently under limited resources (`k` slots + per-provider rate limits) using **critical-path list scheduling** (HLFET), which is within `(2 − 1/k)` of optimal (Graham's bound)
|
|
51
|
-
- makes duplicate calls only once through **memoization** (single-flight in-run cache + a safe persistent cache)
|
|
57
|
+

|
|
52
58
|
|
|
53
|
-
**Free
|
|
59
|
+
**Free and local.** MIT, no account, no paid service. FlowForge keeps its data on your machine, and the scan is plain code that sends nothing to any LLM.
|
|
54
60
|
|
|
55
|
-
**
|
|
61
|
+
**Under the hood:** a DAG scheduler runs the checks concurrently under rate limits. It uses a topological sort, a critical-path DP and HLFET list scheduling (within `(2 − 1/k)` of optimal), and it caches repeat calls. See [Scheduling policies and benchmarks](#scheduling-policies-and-benchmarks).
|
|
56
62
|
|
|
57
63
|
> FlowForge started as a Design and Analysis of Algorithms course project. That version is frozen on the [`DAA`](../../tree/DAA) branch. `main` is the product.
|
|
58
64
|
|
|
@@ -65,7 +71,7 @@ npx flowforge-map --example # try it: a sample app's maps in your browser,
|
|
|
65
71
|
npx flowforge-map --repo . # map the folder you're in
|
|
66
72
|
```
|
|
67
73
|
|
|
68
|
-
That's all: no Python, no virtual env. The first run downloads FlowForge's ready-made program for your computer (about 60 MB, checked against the release's checksums) into `~/.flowforge/bin`; after that it starts at once, even offline. Works on Windows, macOS (Apple
|
|
74
|
+
That's all: no Python, no virtual env. The first run downloads FlowForge's ready-made program for your computer (about 60 MB, checked against the release's checksums) into `~/.flowforge/bin`; after that it starts at once, even offline. Works on Windows, macOS (Apple chips) and Linux x64 with Node 18+. Your data lives in `~/.flowforge`.
|
|
69
75
|
|
|
70
76
|
| You have | Run | |
|
|
71
77
|
|---|---|---|
|
|
@@ -74,7 +80,7 @@ That's all: no Python, no virtual env. The first run downloads FlowForge's ready
|
|
|
74
80
|
| Python people | `uvx flowforge-map` or `pipx install flowforge-map` | Python 3.12+; no virtual env to manage |
|
|
75
81
|
| No terminal | the desktop app (Releases) | download and open; **Settings → Terminal** adds the `flowforge` command too (Linux .rpm/.deb have it already) |
|
|
76
82
|
|
|
77
|
-
Every way gives the same `flowforge` command: `npx flowforge-map status`, `npx flowforge-map key add STRIPE_KEY`, and so on. Linux ARM and Windows ARM have no ready-made build yet, so `npx` uses `uvx` there.
|
|
83
|
+
Every way gives the same `flowforge` command: `npx flowforge-map status`, `npx flowforge-map key add STRIPE_KEY`, and so on. Intel Macs, Linux ARM and Windows ARM have no ready-made build yet, so `npx` uses `uvx` there.
|
|
78
84
|
|
|
79
85
|
The first time, a short welcome walks you through three steps, each one skippable: your app's folder (or the example), pairing your coding agent once, and a lock for your keys. **⚙ Settings** at the bottom of the rail keeps what applies to every project: your agent, the theme and map style, the Vault's lock, and your data (each project's size, the MCP servers it may start, its check history, and the version, with **Check for updates**, which asks pypi.org only when you press it).
|
|
80
86
|
|
|
@@ -147,7 +153,6 @@ Switch the map to **Flow**. FlowForge reads your Python (by its syntax tree), Da
|
|
|
147
153
|
- **Faster** compares "as written" (the slowest action, one call after another) with "could be", and lists the calls that don't need each other's results. **Show the change** writes out the `asyncio.gather`, Dart's `(a, b).wait` or `Promise.all` (now → could be, ready to copy) when it's safe; **Copy prompt for your coding agent** hands the rest to Claude Code, Codex or any agent. FlowForge never edits your code.
|
|
148
154
|
- **Watch it run** plays the could-be schedule; pointing at a block lights up its path. Five map styles: Studio, Boxed, Blueprint, Metro, Soft.
|
|
149
155
|
|
|
150
|
-
|
|
151
156
|
### Many projects
|
|
152
157
|
|
|
153
158
|
The home page lists every app you've mapped, with its dependencies, what needs fixing and missing keys. **+ New project** takes your app's folder, scans it and shows its map. The project tile at the top of the rail switches between the projects you have open, and each one comes back where you left it. **×** closes a project from that list without deleting it. Each project keeps its own map, checks, issues and keys; `flowforge --repo PATH` opens (or adds) that folder's project.
|
|
@@ -164,6 +169,8 @@ Pair your agent once and it sees every project: `flowforge mcp` with no folder a
|
|
|
164
169
|
|
|
165
170
|
### Fix what's unsafe, with one click
|
|
166
171
|
|
|
172
|
+

|
|
173
|
+
|
|
167
174
|
The **Issues** page lists what the scan found unsafe, and every issue has one button:
|
|
168
175
|
|
|
169
176
|
| Issue | Button | What happens |
|
|
@@ -175,6 +182,8 @@ Fix needs a git repo and the file committed. FlowForge works out the change itse
|
|
|
175
182
|
|
|
176
183
|
### Keys your coding agent never sees
|
|
177
184
|
|
|
185
|
+

|
|
186
|
+
|
|
178
187
|
**Add to code.** The **Keys** page lists each place your code needs a key, with its `file:line`. Paste the key and press **Add to code**:
|
|
179
188
|
|
|
180
189
|
```
|
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
# FlowForge
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**See everything your AI app depends on: whether it's up, whether it's safe, and what's slowing it down.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
```bash
|
|
6
|
+
npx flowforge-map --example # a sample app's map in your browser: no keys, nothing sent
|
|
7
|
+
```
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+

|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
| | |
|
|
12
|
+
|---|---|
|
|
13
|
+
| 🗺 **Map** | Every LLM, MCP server, HTTP API and local program your code calls, each with the `file:line` it came from |
|
|
14
|
+
| 💚 **Check now** | Green, amber or red for each one, with its latency. When something is down, it tells you why |
|
|
15
|
+
| ⚡ **Faster** | Reads the order your code makes its calls and shows which ones could run together, with the time you'd save |
|
|
16
|
+
| 🛡 **Issues** | Keys written in code, plain `http://`, MCP servers that aren't pinned. Fix one on a new branch, or send it to your agent |
|
|
17
|
+
| 🔑 **Keys** | Paste a key once. **Add to code** writes it to a git-ignored file your app reads; FlowForge only ever hands your agent a mask |
|
|
18
|
+
| 🤖 **Your agent** | One MCP entry gives Claude Code, Codex or Antigravity the map, the advice and the issues |
|
|
10
19
|
|
|
11
|
-
|
|
12
|
-
- finds the bottleneck chain with a **longest-path DP** (critical path), predicted before the run and measured after it
|
|
13
|
-
- runs independent steps concurrently under limited resources (`k` slots + per-provider rate limits) using **critical-path list scheduling** (HLFET), which is within `(2 − 1/k)` of optimal (Graham's bound)
|
|
14
|
-
- makes duplicate calls only once through **memoization** (single-flight in-run cache + a safe persistent cache)
|
|
20
|
+

|
|
15
21
|
|
|
16
|
-
**Free
|
|
22
|
+
**Free and local.** MIT, no account, no paid service. FlowForge keeps its data on your machine, and the scan is plain code that sends nothing to any LLM.
|
|
17
23
|
|
|
18
|
-
**
|
|
24
|
+
**Under the hood:** a DAG scheduler runs the checks concurrently under rate limits. It uses a topological sort, a critical-path DP and HLFET list scheduling (within `(2 − 1/k)` of optimal), and it caches repeat calls. See [Scheduling policies and benchmarks](#scheduling-policies-and-benchmarks).
|
|
19
25
|
|
|
20
26
|
> FlowForge started as a Design and Analysis of Algorithms course project. That version is frozen on the [`DAA`](../../tree/DAA) branch. `main` is the product.
|
|
21
27
|
|
|
@@ -28,7 +34,7 @@ npx flowforge-map --example # try it: a sample app's maps in your browser,
|
|
|
28
34
|
npx flowforge-map --repo . # map the folder you're in
|
|
29
35
|
```
|
|
30
36
|
|
|
31
|
-
That's all: no Python, no virtual env. The first run downloads FlowForge's ready-made program for your computer (about 60 MB, checked against the release's checksums) into `~/.flowforge/bin`; after that it starts at once, even offline. Works on Windows, macOS (Apple
|
|
37
|
+
That's all: no Python, no virtual env. The first run downloads FlowForge's ready-made program for your computer (about 60 MB, checked against the release's checksums) into `~/.flowforge/bin`; after that it starts at once, even offline. Works on Windows, macOS (Apple chips) and Linux x64 with Node 18+. Your data lives in `~/.flowforge`.
|
|
32
38
|
|
|
33
39
|
| You have | Run | |
|
|
34
40
|
|---|---|---|
|
|
@@ -37,7 +43,7 @@ That's all: no Python, no virtual env. The first run downloads FlowForge's ready
|
|
|
37
43
|
| Python people | `uvx flowforge-map` or `pipx install flowforge-map` | Python 3.12+; no virtual env to manage |
|
|
38
44
|
| No terminal | the desktop app (Releases) | download and open; **Settings → Terminal** adds the `flowforge` command too (Linux .rpm/.deb have it already) |
|
|
39
45
|
|
|
40
|
-
Every way gives the same `flowforge` command: `npx flowforge-map status`, `npx flowforge-map key add STRIPE_KEY`, and so on. Linux ARM and Windows ARM have no ready-made build yet, so `npx` uses `uvx` there.
|
|
46
|
+
Every way gives the same `flowforge` command: `npx flowforge-map status`, `npx flowforge-map key add STRIPE_KEY`, and so on. Intel Macs, Linux ARM and Windows ARM have no ready-made build yet, so `npx` uses `uvx` there.
|
|
41
47
|
|
|
42
48
|
The first time, a short welcome walks you through three steps, each one skippable: your app's folder (or the example), pairing your coding agent once, and a lock for your keys. **⚙ Settings** at the bottom of the rail keeps what applies to every project: your agent, the theme and map style, the Vault's lock, and your data (each project's size, the MCP servers it may start, its check history, and the version, with **Check for updates**, which asks pypi.org only when you press it).
|
|
43
49
|
|
|
@@ -110,7 +116,6 @@ Switch the map to **Flow**. FlowForge reads your Python (by its syntax tree), Da
|
|
|
110
116
|
- **Faster** compares "as written" (the slowest action, one call after another) with "could be", and lists the calls that don't need each other's results. **Show the change** writes out the `asyncio.gather`, Dart's `(a, b).wait` or `Promise.all` (now → could be, ready to copy) when it's safe; **Copy prompt for your coding agent** hands the rest to Claude Code, Codex or any agent. FlowForge never edits your code.
|
|
111
117
|
- **Watch it run** plays the could-be schedule; pointing at a block lights up its path. Five map styles: Studio, Boxed, Blueprint, Metro, Soft.
|
|
112
118
|
|
|
113
|
-
|
|
114
119
|
### Many projects
|
|
115
120
|
|
|
116
121
|
The home page lists every app you've mapped, with its dependencies, what needs fixing and missing keys. **+ New project** takes your app's folder, scans it and shows its map. The project tile at the top of the rail switches between the projects you have open, and each one comes back where you left it. **×** closes a project from that list without deleting it. Each project keeps its own map, checks, issues and keys; `flowforge --repo PATH` opens (or adds) that folder's project.
|
|
@@ -127,6 +132,8 @@ Pair your agent once and it sees every project: `flowforge mcp` with no folder a
|
|
|
127
132
|
|
|
128
133
|
### Fix what's unsafe, with one click
|
|
129
134
|
|
|
135
|
+

|
|
136
|
+
|
|
130
137
|
The **Issues** page lists what the scan found unsafe, and every issue has one button:
|
|
131
138
|
|
|
132
139
|
| Issue | Button | What happens |
|
|
@@ -138,6 +145,8 @@ Fix needs a git repo and the file committed. FlowForge works out the change itse
|
|
|
138
145
|
|
|
139
146
|
### Keys your coding agent never sees
|
|
140
147
|
|
|
148
|
+

|
|
149
|
+
|
|
141
150
|
**Add to code.** The **Keys** page lists each place your code needs a key, with its `file:line`. Paste the key and press **Add to code**:
|
|
142
151
|
|
|
143
152
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "flowforge-map" # on PyPI: "flowforge" is taken by a near-identical name (D34)
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.1"
|
|
4
4
|
description = "Map what your app depends on (LLMs, MCP servers, APIs), check their health and security, and see what could run faster. Local and free; the scan needs no AI."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|