diff --git a/AGENTS.md b/AGENTS.md index 43ef2c8..976a37f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ ## Scope -Build and maintain Phast as a deliberately small Python + Prefab + MCP application platform. +Build and maintain Phast app as a deliberately small Python + Prefab + MCP application platform. ## Product model diff --git a/README.md b/README.md index 8540fbd..80229af 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# phast +# Phast app -Canonical source of truth for Phast. +Canonical source of truth for Phast app. > **Connect your tools once. Bring your tool belt anywhere.** -Phast gives a person one portable MCP plus a programmable Prefab home. Connect `my.phast.app/mcp` to an agent to create and manage Phasts. A created Phast has two matching surfaces: +Phast app gives a person one portable MCP plus a programmable Prefab home. Connect `my.phast.app/mcp` to an agent to create and manage Phast apps. A created Phast app has two matching surfaces: - `user.phast.app` — human / Prefab home - `user.phast.app/mcp` — the user's portable MCP tool belt @@ -29,10 +29,33 @@ Connect once to `my.phast.app/mcp` → create/manage `user.phast.app` → search ## Boundaries -- **Phast composes.** It owns the portable MCP/tool belt and Prefab composition. -- **Oracle discovers.** Provider/MCP/OAuth discovery comes from the capability graph, not a hard-coded Phast directory. -- **Persimmons holds secrets.** Phast stores connection/authority references, not secret values. +- **Phast app composes.** It owns the portable MCP/tool belt and Prefab composition. +- **Oracle discovers.** Provider/MCP/OAuth discovery comes from the capability graph, not a hard-coded Phast app directory. +- **Persimmons holds secrets.** Phast app stores connection/authority references, not secret values. - **Factory builds/operates.** Provisioning uses bounded deterministic infrastructure routes. -- **Clients are replaceable.** ChatGPT, Claude, Codex, or another MCP client should be able to use the same Phast without recollecting the user's tools. +- **Clients are replaceable.** ChatGPT, Claude, Codex, or another MCP client should be able to use the same Phast app without recollecting the user's tools. V0 is intentionally not arbitrary app generation. Prove the portable-tool-belt + editable-home loop first. + +## Naming and copy + +Use **Phast app** when naming the product or one of its instances; use +**Phast apps** for the plural. Write “your Phast app,” “create a Phast app,” +and “My Phast app” for the management connector. Existing all-caps display +styles may use “PHAST APP.” Apply this to page titles, metadata, navigation, +buttons, examples, generated homes, MCP display text, and documentation. + +Keep deliberate substitutions for “fast”: “make something phast,” +“built phast,” and “make MCP apps phast.” Do not rename literal domains, +URLs, `phast.json`, environment variables, CSS classes, tool names, or +schema keys/values as part of a copy edit. Preserve user-chosen app names. + +The public copy lives in `index.html` (phast.app), `my/index.html` +(my.phast.app), and `server.py` (generated personal homes and MCP display +text). `phast.json` supplies the management display name. Review these +surfaces together when changing product naming. + +Chair review: the standalone “PHAST.” wordmark and the “My Phast” connector +label could be separate brand treatments. This change proposes “PHAST APP.” +and “My Phast app” consistently; the chair should confirm those treatments. +The phrase “your Phast” names an app instance, so it becomes “your Phast app.” diff --git a/__init__.py b/__init__.py index ef13255..67015ff 100644 --- a/__init__.py +++ b/__init__.py @@ -1 +1 @@ -"""Phast application runtime.""" +"""Phast app runtime.""" diff --git a/index.html b/index.html index eca8d60..6c29397 100644 --- a/index.html +++ b/index.html @@ -4,8 +4,8 @@ - -phast + +Phast app @@ -26,14 +26,14 @@

MAKE SOMETHINGPHAST

01 CONNECTadd my.phast.app/mcp
-
02 MAKEcreate your Phast
+
02 MAKEcreate your Phast app
03 TUNEtools + prefab widgets
04 RUNuse it from any agent
-

Connect your tools once.
Bring your tool belt anywhere. ChatGPT, Claude, Codex — same Phast, same tools, same home.

-BUILD YOUR PHAST→ +

Connect your tools once.
Bring your tool belt anywhere. ChatGPT, Claude, Codex — same Phast app, same tools, same home.

+BUILD YOUR PHAST APP→

one connector // many personal MCPs

diff --git a/my/index.html b/my/index.html index 36d3362..d27de41 100644 --- a/my/index.html +++ b/my/index.html @@ -20,17 +20,17 @@
-
PHAST.MY PHAST // CONTROL MCP
+
PHAST APP.MY PHAST APP // CONTROL MCP

START HERE // ONE CONNECTION

YOUR MCP.BUILT PHAST.

-

Add My Phast to your agent once. Then create personal MCPs, add tools, stream Prefab, and keep what works.

https://my.phast.app/mcp
+

Add My Phast app to your agent once. Then create personal MCPs, add tools, stream Prefab, and keep what works.

https://my.phast.app/mcp

ZERO → PERSONAL MCP

CHAT IS THE SETUP UI
-
01 // CONNECT

ADD MY PHAST

Connect the management MCP in ChatGPT, Claude, Codex, or another MCP client. Authenticate once with Teahub.

MCP my.phast.app/mcp
-
02 // CREATE

TELL YOUR AGENT

No project wizard. Name it in chat. Wildcard DNS, TLS, home, and MCP are already waiting.

YOU create me a phast called sunday
-
03 // TUNE

BUILD THE BELT

Add providers, tools, and Prefab widgets. Your agent and your web home edit the same Phast.

YOU add github + a PR widget
+
01 // CONNECT

ADD MY PHAST APP

Connect the management MCP in ChatGPT, Claude, Codex, or another MCP client. Authenticate once with Teahub.

MCP my.phast.app/mcp
+
02 // CREATE

TELL YOUR AGENT

No project wizard. Name it in chat. Wildcard DNS, TLS, home, and MCP are already waiting.

YOU create me a Phast app called sunday
+
03 // TUNE

BUILD THE BELT

Add providers, tools, and Prefab widgets. Your agent and your web home edit the same Phast app.

YOU add github + a PR widget
diff --git a/phast.json b/phast.json index 180b1b6..fda1061 100644 --- a/phast.json +++ b/phast.json @@ -2,7 +2,7 @@ "schema_version": 1, "kind": "phast", "slug": "my", - "name": "My Phast", + "name": "My Phast app", "host": "my.phast.app", "surfaces": {"human": "/", "mcp": "/mcp"}, "tools": { diff --git a/server.py b/server.py index 6fee17b..46ca422 100644 --- a/server.py +++ b/server.py @@ -95,7 +95,7 @@ def path(value: str) -> Path: def read(value: str) -> dict[str, Any]: p = path(value) if not p.exists(): - raise KeyError("unknown Phast") + raise KeyError("unknown Phast app") return json.loads(p.read_text()) @@ -120,7 +120,7 @@ def write(value: str, data: dict[str, Any]) -> dict[str, Any]: def mine(value: str) -> dict[str, Any]: data = read(value) if data.get("owner") != actor(): - raise PermissionError("not your Phast") + raise PermissionError("not your Phast app") return data @@ -180,14 +180,14 @@ def human(data: dict[str, Any]) -> str: '' + "" + data["name"] - + " - phast" + + " - Phast app" + "" - + "
phast." + + "
Phast app." + data["host"] + "/mcp

" + data["name"] @@ -198,9 +198,9 @@ def human(data: dict[str, Any]) -> str: m = FastMCP( - "My Phast", + "My Phast app", version="0.2.0", - instructions="Create and manage portable Phast MCP tool belts and Prefab homes.", + instructions="Create and manage portable Phast app MCP tool belts and Prefab homes.", auth=auth("https://my.phast.app"), mask_error_details=True, ) @@ -317,7 +317,7 @@ def inst(value: str): personal = FastMCP( data["name"], version="0.2.0", - instructions="Portable personal Phast MCP.", + instructions="Portable personal Phast app MCP.", auth=auth("https://my.phast.app", "https://" + data["host"]), mask_error_details=True, ) @@ -385,7 +385,7 @@ class Router: try: data = read(value) except Exception: - await JSONResponse({"error": "unknown Phast"}, status_code=404)(scope, receive, send) + await JSONResponse({"error": "unknown Phast app"}, status_code=404)(scope, receive, send) return if request_path == "/" and method in {"GET", "HEAD"}: