feat(task-graph): materialize object dependsOn edges#479
Open
wan9chi wants to merge 1 commit into
Open
Conversation
Object-form `dependsOn` entries — `{ "task": "build", "from": "dependencies" }`
— run a task in the direct workspace packages listed under a package.json
dependency field (`dependencies`, `devDependencies`, and/or `peerDependencies`).
The earlier implementation expanded these selections at query time, so they
never appeared in the global task graph. This reimplements the feature at
graph-load time: each object entry is resolved against the package dependency
graph and the matching `package#task` selections are added as ordinary task
graph edges (`add_package_dependency_edges`). Only direct dependencies are
followed, and an edge is added only when the dependency package defines the
task.
Because the selections are now plain task graph edges, they appear in the
global graph and flow through the existing dependency machinery for free —
including `--ignore-depends-on`, which drops them at query time like any other
`dependsOn` edge.
The fixture asserts edge construction through the rendered global
`task_graph.md` (every `from` variant, recursive cross-package chains, and the
exclusion of peer-only and missing-task dependencies). The only behavior the
static graph cannot express — `--ignore-depends-on` removing the materialized
edges at query time — is kept as the single per-case plan snapshot.
Co-authored-by: GPT-5 Codex <codex@openai.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QowxsN8vDKKbQdaSMdxL67
c850975 to
7a3bf10
Compare
65e6b2c to
77cb1a0
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 65e6b2ce67
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
Stacked on #478 (the revert of the query-time implementation).
Object-form
dependsOnentries —{ "task": "build", "from": ["dependencies", "devDependencies"] }— run a task in the direct workspace packages listed under a package.json dependency field. The previous implementation (#467/#469, reverted in #478) expanded these at query time, so the selections never appeared in the global task graph.This reimplements the feature at graph-load time: each object entry is resolved against the package dependency graph and the matching
package#taskselections become ordinary task graph edges (add_package_dependency_edges). Because they are now plain edges:--ignore-depends-on, which drops them at query time like any otherdependsOnedge.Only direct dependencies are followed, and an edge is added only when the dependency package actually defines the task. Supported fields are
dependencies,devDependencies, andpeerDependencies.Snapshot coverage
Because the edges now live in the global task graph, the fixture asserts edge construction through the rendered
task_graph.md: everyfromvariant, recursive cross-package chains, and the exclusion of peer-only and missing-task dependencies are all visible there. The only behavior the static graph cannot express —--ignore-depends-onremoving the materialized edges at query time — is kept as the single per-case plan snapshot. The other four per-case snapshots in the original change were redundant re-assertions of edges already shown intask_graph.md, so they were dropped.Behavior note vs #467/#469
The reverted query-stage impl also preserved ordering among the sibling dependency tasks selected by a single object
dependsOn(e.g.ui#build → shared#buildwhenapp#testselected both anduidepends onshared), scoped to that one query's execution graph. The graph-stage model intentionally does not: every edge here is global, and a globalui#build → shared#buildedge would make a plainvp run ui#buildalso buildshared, contradicting vp's rule that topological ordering applies only with-r/-t. Ordering among selected dependencies instead comes from each task declaring its owndependsOn(the recursive-expansion path documented intask-query.md).🤖 Generated with Claude Code
https://claude.ai/code/session_01QowxsN8vDKKbQdaSMdxL67