starforge-kernel 0.1.2__tar.gz → 0.1.3__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.
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/PKG-INFO +1 -1
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/pyproject.toml +1 -1
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/__init__.py +1 -1
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/core/spec.py +6 -1
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/mcp.py +21 -12
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge_kernel.egg-info/PKG-INFO +1 -1
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_mcp_module.py +3 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/README.md +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/setup.cfg +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/core/__init__.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/core/checkpoints.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/core/figures.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/core/previews.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/core/provenance.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/core/runner.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/core/serializers.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/index/__init__.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/index/scanner.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/kernel/__init__.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/kernel/__main__.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/kernel/server.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge/kernel/worker.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge_kernel.egg-info/SOURCES.txt +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge_kernel.egg-info/dependency_links.txt +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge_kernel.egg-info/requires.txt +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge_kernel.egg-info/top_level.txt +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_decorator.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_figures.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_indexer.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_kernel_protocol.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_m1_features.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_previews.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_provenance.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_runner_end_to_end.py +0 -0
- {starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/tests/test_serializers.py +0 -0
|
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|
|
6
6
|
# PyPI name `starforge` is squatted by a dormant Galaxy tool (see DESIGN.md §4);
|
|
7
7
|
# the import name is still `starforge`.
|
|
8
8
|
name = "starforge-kernel"
|
|
9
|
-
version = "0.1.
|
|
9
|
+
version = "0.1.3"
|
|
10
10
|
description = "*Forge — pipeline canvas, checkpointing, and stale/hydrate execution for the repo you already have open"
|
|
11
11
|
readme = "README.md"
|
|
12
12
|
authors = [{ name = "Jonathan Potter" }]
|
|
@@ -123,4 +123,9 @@ class PipelineDoc:
|
|
|
123
123
|
return cls.from_json(Path(path).read_text(encoding="utf-8"))
|
|
124
124
|
|
|
125
125
|
def save(self, path: str | Path) -> None:
|
|
126
|
-
|
|
126
|
+
# Atomic: the canvas (or any watcher) must never observe a truncated
|
|
127
|
+
# or empty file mid-write — agents and humans edit concurrently.
|
|
128
|
+
target = Path(path)
|
|
129
|
+
tmp = target.with_name(target.name + ".tmp")
|
|
130
|
+
tmp.write_text(self.to_json() + "\n", encoding="utf-8")
|
|
131
|
+
tmp.replace(target)
|
|
@@ -207,14 +207,11 @@ def main() -> None:
|
|
|
207
207
|
[
|
|
208
208
|
"*Forge MCP server",
|
|
209
209
|
f" workspace : {Path(default_workspace).resolve()}",
|
|
210
|
-
" transport : stdio
|
|
211
|
-
" (Silence is normal: agents launch this server themselves;",
|
|
212
|
-
" you rarely need to run it manually.)",
|
|
210
|
+
" transport : stdio (waiting for an MCP client on stdin)",
|
|
213
211
|
f" tools : {', '.join(TOOL_NAMES)}",
|
|
214
212
|
"",
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
' { "command": "python", "args": ["-m", "starforge.mcp"] } (cwd = your repo)',
|
|
213
|
+
"Register with an agent via \"*Forge: Set Up MCP for Agents\" in VS Code, or:",
|
|
214
|
+
' { "command": "python", "args": ["-m", "starforge.mcp"] } (cwd = repo root)',
|
|
218
215
|
"",
|
|
219
216
|
"Ctrl+C to exit.",
|
|
220
217
|
]
|
|
@@ -226,12 +223,24 @@ def main() -> None:
|
|
|
226
223
|
"starforge",
|
|
227
224
|
instructions=(
|
|
228
225
|
"Author and run *Forge pipelines in this workspace. Blocks are @block-decorated "
|
|
229
|
-
"functions in the repo (see list_blocks for ids/params/outputs)
|
|
230
|
-
"
|
|
231
|
-
"
|
|
232
|
-
"
|
|
233
|
-
"
|
|
234
|
-
|
|
226
|
+
"functions in the repo (see list_blocks for ids/params/outputs); the decorator is "
|
|
227
|
+
"behavior-neutral, so blocks remain plain callables you can invoke directly when "
|
|
228
|
+
"testing logic outside a pipeline. New @block functions are picked up automatically "
|
|
229
|
+
"on save — no registration step. Pipelines are .forge JSON documents shaped like: "
|
|
230
|
+
'{"schema": "starforge/1", "name": "demo", '
|
|
231
|
+
'"nodes": [{"id": "n1", "block": "module:function", "params": {"x": 1}, '
|
|
232
|
+
'"position": {"x": 80, "y": 80}}], '
|
|
233
|
+
'"edges": [{"id": "e1", "source": "n1", "source_output": "output", '
|
|
234
|
+
'"target": "n2", "target_param": "data"}]}. '
|
|
235
|
+
"Canvas annotation boxes live in a top-level \"comments\" array, each shaped "
|
|
236
|
+
'{"id": "c1", "title": "...", "description": "...", "position": {"x": 0, "y": 0}, '
|
|
237
|
+
'"width": 280, "height": 150, "color": "#6366f1"} — these exact field names; '
|
|
238
|
+
"comments never affect execution. "
|
|
239
|
+
"Edges target parameter NAMES; unwired params use doc literals or signature "
|
|
240
|
+
"defaults; `T | None` params with no default receive None. write_pipeline "
|
|
241
|
+
"validates and returns per-node staleness; run_pipeline executes only stale nodes "
|
|
242
|
+
"(pass `target` to run one node's ancestor cone); inspect_node returns checkpoint "
|
|
243
|
+
f"previews. Default workspace: {Path(default_workspace).resolve()}"
|
|
235
244
|
),
|
|
236
245
|
)
|
|
237
246
|
|
|
@@ -23,6 +23,9 @@ def test_write_read_list_state_roundtrip(workspace):
|
|
|
23
23
|
assert mcp.list_pipelines(ws) == [".forge/pipelines/demo.forge"]
|
|
24
24
|
doc = mcp.read_pipeline(ws, ".forge/pipelines/demo.forge")
|
|
25
25
|
assert [n["id"] for n in doc["nodes"]] == ["n1", "n2", "n3"]
|
|
26
|
+
# Saves are atomic — no temp residue for watchers to trip over.
|
|
27
|
+
pipelines_dir = workspace.root / ".forge" / "pipelines"
|
|
28
|
+
assert [p.name for p in pipelines_dir.glob("*.tmp")] == []
|
|
26
29
|
|
|
27
30
|
|
|
28
31
|
def test_write_pipeline_rejects_bad_docs_and_escapes(workspace):
|
|
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
|
{starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge_kernel.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge_kernel.egg-info/requires.txt
RENAMED
|
File without changes
|
{starforge_kernel-0.1.2 → starforge_kernel-0.1.3}/src/starforge_kernel.egg-info/top_level.txt
RENAMED
|
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
|