From 5c9979005b838140af0982429bb27507a0d543af Mon Sep 17 00:00:00 2001 From: vinodhalaharvi-claude Date: Thu, 21 May 2026 09:58:22 +0000 Subject: [PATCH] =?UTF-8?q?script:=20PR-A.4=20=E2=80=94=20promote=20transl?= =?UTF-8?q?ator=20from=20internal/=20to=20pkg/script/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Makes the translator importable from outside the agentscript module so loom can depend on it. Go's internal/ rule confines internal/agentscript/script/ to the agentscript module; loom is a separate module and cannot import it. This moves the whole translator package to pkg/script/, matching the repo's existing pkg/ convention for importable code. Pure move + import-path rewrite — no logic changes: - git mv internal/agentscript/script -> pkg/script (carries ast/, registry/, resolved/ sub-packages and all phase files). - Rewrote every import of .../internal/agentscript/script -> .../pkg/script across the package's own cross-imports, the tests, and cmd/agentscript-run. The legacy in-process runtime (grammar.go, runtime.go, conditional.go, loop.go, translator.go, registry.go, emoji_style.go) stays in internal/agentscript/ — it's the old DSL evaluator, not part of the public translator surface, and correctly remains module-private. Public surface now available at github.com/vinodhalaharvi/agentscript/pkg/script: - Compile(ctx, registry, Source) (sibyl.Plan, error) — source to validated Plan, no submission. - Submit / SubmitWith / Run — start the Plan as a Sibyl PlanWorkflow. - DefaultRegistry() / EchoSpec() — the builtin registry; front ends extend it. registry.Names() lists builtins (for an LLM prompt). - Parse / Resolve / ResolveWith / Lower / Finalize / Validate — the individual phases, for callers that want finer control. - Typed errors (UnknownBuiltinError, ArityError, ArgTypeError) so a caller can distinguish 'bad DSL' from 'execution failure'. Docs updated to the new path and current status: - docs/dsl-to-sibyl-translator.md: status line now 'Translator MVP complete'; the phase table marks Lower/Finalize/Validate/Submit Merged at pkg/script/ and notes the lowering target is Sibyl's serializable Plan (not the removed in-process DAG). - README.md: the two internal/agentscript/script/ path references corrected to pkg/script/. Verified after the move: build clean, pkg/script tests pass, and the demo still compiles identically — agentscript-run --dry-run examples/translator-echo.as produces the same two-node Plan (n1 requires n0). All CI steps pass: go mod tidy (no change — pure move), go vet -structtag=false, gofmt, staticcheck, go test -race ./..., go build ./.... --- README.md | 4 +-- cmd/agentscript-run/main.go | 2 +- docs/dsl-to-sibyl-translator.md | 26 ++++++++++++------- .../agentscript => pkg}/script/ast/ast.go | 0 .../agentscript => pkg}/script/builtins.go | 2 +- {internal/agentscript => pkg}/script/lower.go | 4 +-- .../agentscript => pkg}/script/lower_test.go | 4 +-- {internal/agentscript => pkg}/script/parse.go | 2 +- .../agentscript => pkg}/script/parse_test.go | 4 +-- .../script/registry/registry.go | 0 .../script/registry/registry_test.go | 2 +- .../agentscript => pkg}/script/resolve.go | 6 ++--- .../script/resolve_test.go | 8 +++--- .../script/resolved/resolved.go | 4 +-- .../agentscript => pkg}/script/source.go | 0 .../agentscript => pkg}/script/submit.go | 2 +- 16 files changed, 39 insertions(+), 31 deletions(-) rename {internal/agentscript => pkg}/script/ast/ast.go (100%) rename {internal/agentscript => pkg}/script/builtins.go (94%) rename {internal/agentscript => pkg}/script/lower.go (97%) rename {internal/agentscript => pkg}/script/lower_test.go (97%) rename {internal/agentscript => pkg}/script/parse.go (98%) rename {internal/agentscript => pkg}/script/parse_test.go (98%) rename {internal/agentscript => pkg}/script/registry/registry.go (100%) rename {internal/agentscript => pkg}/script/registry/registry_test.go (97%) rename {internal/agentscript => pkg}/script/resolve.go (96%) rename {internal/agentscript => pkg}/script/resolve_test.go (96%) rename {internal/agentscript => pkg}/script/resolved/resolved.go (90%) rename {internal/agentscript => pkg}/script/source.go (100%) rename {internal/agentscript => pkg}/script/submit.go (97%) diff --git a/README.md b/README.md index 9767152..90dbfd3 100644 --- a/README.md +++ b/README.md @@ -273,7 +273,7 @@ A second execution path is being built: an arrow-first translator that compiles AgentScript into [Sibyl](https://github.com/vinodhalaharvi/sibyl) DAGs for durable, Temporal-backed execution. The design is documented in [`docs/dsl-to-sibyl-translator.md`](docs/dsl-to-sibyl-translator.md); the -translator code is under `internal/agentscript/script/`. The existing +translator code is under `pkg/script/`. The existing in-process runtime continues to serve as the fast "memory" backend. ## Project Structure @@ -366,7 +366,7 @@ go test ./... go test -race ./... # A single package -go test ./internal/agentscript/script/... +go test ./pkg/script/... ``` CI (GitHub Actions) runs `go mod tidy`, `go vet -structtag=false`, `gofmt`, diff --git a/cmd/agentscript-run/main.go b/cmd/agentscript-run/main.go index 2396bd4..15be0aa 100644 --- a/cmd/agentscript-run/main.go +++ b/cmd/agentscript-run/main.go @@ -30,7 +30,7 @@ import ( sibyl "github.com/vinodhalaharvi/sibyl/agent" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script" + "github.com/vinodhalaharvi/agentscript/pkg/script" ) func main() { diff --git a/docs/dsl-to-sibyl-translator.md b/docs/dsl-to-sibyl-translator.md index b6d6740..2810c97 100644 --- a/docs/dsl-to-sibyl-translator.md +++ b/docs/dsl-to-sibyl-translator.md @@ -1,6 +1,6 @@ # AgentScript → Sibyl: DSL Translator Design Memo -**Status:** Partially implemented. Parse and Resolve are merged; Lower → Submit and the CLI are in progress. See "Implementation status" below. +**Status:** Translator MVP complete. The full pipeline (Parse → Resolve → Lower → Finalize → Validate → Submit) is merged and importable at `pkg/script/`; `echo` runs end-to-end against Sibyl's `PlanWorkflow`. See "Implementation status" below. **Companion repo:** [vinodhalaharvi/sibyl](https://github.com/vinodhalaharvi/sibyl) (the execution layer) **Implements against:** Sibyl's `agents.WithOAuth` behavior, `ConvergeWorkflow`, `ToolAgentArrow`, `SupervisorWorkflow`, and the existing DAG execution model. @@ -12,17 +12,25 @@ The translator is being built in slices (see §14). Current state: | Phase | Arrow | Status | |-------|-------|--------| -| Parse | `Arrow[Source, AST]` | **Merged** — `internal/agentscript/script/parse.go` | -| Resolve | `Arrow[AST, ResolvedAST]` | **Merged** — `internal/agentscript/script/resolve.go` + `registry/` | -| Lower | `Arrow[ResolvedAST, DAGFragment]` | Pending | -| Finalize | `Arrow[DAGFragment, sibyl.DAG]` | Pending | -| Validate | `Arrow[sibyl.DAG, sibyl.DAG]` | Pending | -| Submit | `Arrow[sibyl.DAG, WorkflowHandle]` | Pending | +| Parse | `Arrow[Source, AST]` | **Merged** — `pkg/script/parse.go` | +| Resolve | `Arrow[AST, ResolvedAST]` | **Merged** — `pkg/script/resolve.go` + `registry/` | +| Lower | `Arrow[ResolvedAST, Lowered]` | **Merged** — `pkg/script/lower.go` | +| Finalize | `Arrow[Lowered, sibyl.Plan]` | **Merged** — `pkg/script/lower.go` | +| Validate | `Arrow[sibyl.Plan, sibyl.Plan]` | **Merged** — `pkg/script/lower.go` | +| Submit | `Arrow[sibyl.Plan, WorkflowHandle]` | **Merged** — `pkg/script/submit.go` | + +The full pipeline (`Compile` = Parse..Validate, `Run` = Compile + Submit) +is in `pkg/script/submit.go`, importable from outside the module. The +lowering target is Sibyl's serializable `Plan` (a DAG of named-activity +references) executed by the generic `PlanWorkflow` — not the removed +in-process closure DAG. The first builtin, `echo`, binds to Sibyl's +`Echo` activity; the `agentscript-run` CLI compiles a `.as` file to a +Plan (`--dry-run` to print it, otherwise submit to a Temporal worker). On the Sibyl side, the convergence-primitive arrows this memo depends on (`ConvergeArrow`, `SupervisorArrow`; `ToolAgentArrow` already existed) are -merged. The sections below describe the full design; phases marked Pending -above are specified but not yet built. +merged, as are the serializable `Plan`, `PlanWorkflow`, and `Echo` +activity the translator lowers into. --- diff --git a/internal/agentscript/script/ast/ast.go b/pkg/script/ast/ast.go similarity index 100% rename from internal/agentscript/script/ast/ast.go rename to pkg/script/ast/ast.go diff --git a/internal/agentscript/script/builtins.go b/pkg/script/builtins.go similarity index 94% rename from internal/agentscript/script/builtins.go rename to pkg/script/builtins.go index 1fec008..d8a643b 100644 --- a/internal/agentscript/script/builtins.go +++ b/pkg/script/builtins.go @@ -12,7 +12,7 @@ package script import ( sibyl "github.com/vinodhalaharvi/sibyl/agent" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/registry" + "github.com/vinodhalaharvi/agentscript/pkg/script/registry" ) // EchoSpec is the BuiltinSpec for the echo builtin. It takes one diff --git a/internal/agentscript/script/lower.go b/pkg/script/lower.go similarity index 97% rename from internal/agentscript/script/lower.go rename to pkg/script/lower.go index 14dc24e..835ae19 100644 --- a/internal/agentscript/script/lower.go +++ b/pkg/script/lower.go @@ -28,8 +28,8 @@ import ( sibyl "github.com/vinodhalaharvi/sibyl/agent" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/ast" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/resolved" + "github.com/vinodhalaharvi/agentscript/pkg/script/ast" + "github.com/vinodhalaharvi/agentscript/pkg/script/resolved" ) // fragment is a partial plan under construction. Nodes accumulate as the diff --git a/internal/agentscript/script/lower_test.go b/pkg/script/lower_test.go similarity index 97% rename from internal/agentscript/script/lower_test.go rename to pkg/script/lower_test.go index 0728506..dd9b9bd 100644 --- a/internal/agentscript/script/lower_test.go +++ b/pkg/script/lower_test.go @@ -6,8 +6,8 @@ import ( sibyl "github.com/vinodhalaharvi/sibyl/agent" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/registry" + "github.com/vinodhalaharvi/agentscript/pkg/script" + "github.com/vinodhalaharvi/agentscript/pkg/script/registry" ) // compile is a helper: source → Plan via the full Compile pipeline using diff --git a/internal/agentscript/script/parse.go b/pkg/script/parse.go similarity index 98% rename from internal/agentscript/script/parse.go rename to pkg/script/parse.go index 7547fec..5465c28 100644 --- a/internal/agentscript/script/parse.go +++ b/pkg/script/parse.go @@ -25,7 +25,7 @@ import ( "github.com/alecthomas/participle/v2" "github.com/alecthomas/participle/v2/lexer" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/ast" + "github.com/vinodhalaharvi/agentscript/pkg/script/ast" ) // === Parse arrow =========================================================== diff --git a/internal/agentscript/script/parse_test.go b/pkg/script/parse_test.go similarity index 98% rename from internal/agentscript/script/parse_test.go rename to pkg/script/parse_test.go index 746a8ab..53781f2 100644 --- a/internal/agentscript/script/parse_test.go +++ b/pkg/script/parse_test.go @@ -6,8 +6,8 @@ import ( "strings" "testing" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/ast" + "github.com/vinodhalaharvi/agentscript/pkg/script" + "github.com/vinodhalaharvi/agentscript/pkg/script/ast" ) // === Helpers =============================================================== diff --git a/internal/agentscript/script/registry/registry.go b/pkg/script/registry/registry.go similarity index 100% rename from internal/agentscript/script/registry/registry.go rename to pkg/script/registry/registry.go diff --git a/internal/agentscript/script/registry/registry_test.go b/pkg/script/registry/registry_test.go similarity index 97% rename from internal/agentscript/script/registry/registry_test.go rename to pkg/script/registry/registry_test.go index 3cfeeec..44e4333 100644 --- a/internal/agentscript/script/registry/registry_test.go +++ b/pkg/script/registry/registry_test.go @@ -3,7 +3,7 @@ package registry_test import ( "testing" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/registry" + "github.com/vinodhalaharvi/agentscript/pkg/script/registry" ) func echoSpec() registry.BuiltinSpec { diff --git a/internal/agentscript/script/resolve.go b/pkg/script/resolve.go similarity index 96% rename from internal/agentscript/script/resolve.go rename to pkg/script/resolve.go index 7426bd6..fc9b295 100644 --- a/internal/agentscript/script/resolve.go +++ b/pkg/script/resolve.go @@ -17,9 +17,9 @@ import ( "fmt" "strings" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/ast" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/registry" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/resolved" + "github.com/vinodhalaharvi/agentscript/pkg/script/ast" + "github.com/vinodhalaharvi/agentscript/pkg/script/registry" + "github.com/vinodhalaharvi/agentscript/pkg/script/resolved" ) // Resolve binds an AST to a Registry, producing a ResolvedAST. Because diff --git a/internal/agentscript/script/resolve_test.go b/pkg/script/resolve_test.go similarity index 96% rename from internal/agentscript/script/resolve_test.go rename to pkg/script/resolve_test.go index 8c29821..b87d695 100644 --- a/internal/agentscript/script/resolve_test.go +++ b/pkg/script/resolve_test.go @@ -5,10 +5,10 @@ import ( "errors" "testing" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/ast" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/registry" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/resolved" + "github.com/vinodhalaharvi/agentscript/pkg/script" + "github.com/vinodhalaharvi/agentscript/pkg/script/ast" + "github.com/vinodhalaharvi/agentscript/pkg/script/registry" + "github.com/vinodhalaharvi/agentscript/pkg/script/resolved" ) // === Test registry helpers ================================================= diff --git a/internal/agentscript/script/resolved/resolved.go b/pkg/script/resolved/resolved.go similarity index 90% rename from internal/agentscript/script/resolved/resolved.go rename to pkg/script/resolved/resolved.go index 56a445f..9da3a8e 100644 --- a/internal/agentscript/script/resolved/resolved.go +++ b/pkg/script/resolved/resolved.go @@ -9,8 +9,8 @@ package resolved import ( - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/ast" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/registry" + "github.com/vinodhalaharvi/agentscript/pkg/script/ast" + "github.com/vinodhalaharvi/agentscript/pkg/script/registry" ) // AST is a fully resolved program: a list of resolved blocks. diff --git a/internal/agentscript/script/source.go b/pkg/script/source.go similarity index 100% rename from internal/agentscript/script/source.go rename to pkg/script/source.go diff --git a/internal/agentscript/script/submit.go b/pkg/script/submit.go similarity index 97% rename from internal/agentscript/script/submit.go rename to pkg/script/submit.go index e14f2ae..bdc2c92 100644 --- a/internal/agentscript/script/submit.go +++ b/pkg/script/submit.go @@ -19,7 +19,7 @@ import ( sibyl "github.com/vinodhalaharvi/sibyl/agent" - "github.com/vinodhalaharvi/agentscript/internal/agentscript/script/registry" + "github.com/vinodhalaharvi/agentscript/pkg/script/registry" ) // Compile runs Parse >>> Resolve >>> Lower >>> Finalize >>> Validate,