feat(modules): enable group modules + dangling-import plan check (Phase 4b C4)
Lift the Phase-4-lite restrictions now that import resolution is lexical: - `create_group_script` (group_scripts_api): allow `kind = module` and group scripts with `import`s; record the import edges. Module-shape and sandbox-ceiling validation stay. - The declarative apply path already reconciles group modules generically (`BundleScript.kind` + `owner.script_owner()` flow through `reconcile_node_tx`); no change needed beyond stale-comment fixes. Adds the §5.5 dangling-import plan check (single-node plan/apply): `check_imports_resolve` rejects an `import "<m>"` that resolves to neither a bundle-local module nor a module reachable lexically up the node's chain — caught at plan time instead of as a runtime 404. Roots resolution at the node's owner (an app node reaches ancestor group modules; a group node walks its own ancestry). ApplyService gains an injected `ModuleSource`. The tree path opts out (a node may import a module created by another node in the same uncommitted tx); the runtime check is the backstop there. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -330,7 +330,7 @@ pub async fn build_app(
|
||||
docs,
|
||||
dl_service.clone(),
|
||||
events,
|
||||
modules,
|
||||
modules.clone(),
|
||||
http,
|
||||
files,
|
||||
pubsub,
|
||||
@@ -474,6 +474,7 @@ pub async fn build_app(
|
||||
vars: Arc::new(PostgresVarsRepo::new(pool.clone())),
|
||||
apps: apps_repo.clone(),
|
||||
groups: groups_repo.clone(),
|
||||
modules: modules.clone(),
|
||||
domains: domains_repo.clone(),
|
||||
authz: authz.clone(),
|
||||
validator: engine.clone(),
|
||||
|
||||
Reference in New Issue
Block a user