Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
2a2ea51
♻️ `WorkChain`: make the stepper pluggable
GeigerJ2 Jul 20, 2026
4a931aa
♻️ `WorkChain`: make the awaitable barrier a policy
GeigerJ2 Jul 21, 2026
b41c28f
✨ `orm`: add `WorkGraphNode` for work graphs
GeigerJ2 Jul 21, 2026
c8aaf30
✨ `workgraph`: add the `enums` module
GeigerJ2 Jul 21, 2026
9fc0f56
✨ `workgraph`: add `utils` nested-dict helpers
GeigerJ2 Jul 21, 2026
d5b8aa8
✨ `NoneData`: node type for Python `None`
GeigerJ2 Jul 21, 2026
785d778
♻️ `JsonableData`: accept more serializable inputs
GeigerJ2 Jul 21, 2026
58b5108
✨ `serializer`: serialize values into data nodes
GeigerJ2 Jul 21, 2026
85b8af8
✨ `workgraph`: node-graph dep + serialize_ports
GeigerJ2 Jul 22, 2026
912f3e9
✨ `orm`: DateTime/Function data + deserializer
GeigerJ2 Jul 22, 2026
547e211
👌 `JsonableData`: add `.value` alias for `.obj`
GeigerJ2 Jul 22, 2026
f571f7e
🔧 `pre-commit`: exempt the `aiida/workgraph` subtree
GeigerJ2 Aug 6, 2026
9fb7064
♻️ `WorkChain`: extract `WorkflowProcess` base
GeigerJ2 Aug 6, 2026
98eb30a
✨ `workgraph`: relocate the subsystem into core
GeigerJ2 Aug 6, 2026
dd8f410
♻️ `WorkGraphProcess`: subclass `WorkflowProcess`
GeigerJ2 Aug 6, 2026
2a3855a
♻️ engine: name the shared base `Workflow`, move it up
GeigerJ2 Aug 6, 2026
aaf519f
♻️ `workgraph`: detect task types via a marker, not imports
GeigerJ2 Aug 6, 2026
e0aba7a
✨ `workgraph`: register the entry points in core
GeigerJ2 Aug 6, 2026
aa92fc7
📚 docs: add the WorkGraph-into-core AEP
GeigerJ2 Aug 7, 2026
3361203
Merge branch 'main' into refactor/workgraph-into-core
GeigerJ2 Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ repos:
src/aiida/transports/cli.py|
src/aiida/transports/plugins/local.py|
src/aiida/transports/plugins/ssh.py|

src/aiida/workgraph/.*|
)$

- id: generate-conda-environment
Expand Down
1 change: 1 addition & 0 deletions docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
'IPython.sphinxext.ipython_directive',
'aiida.sphinxext',
'sphinx_design',
'sphinxcontrib.mermaid',
'sphinx_copybutton',
'sphinxext.rediraffe',
'notfound.extension',
Expand Down
13 changes: 13 additions & 0 deletions docs/source/internals/aep/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.. _internals:aep:

===========================
AiiDA Enhancement Proposals
===========================

Design proposals for substantial changes to AiiDA. Historically tracked in a separate repository and, more recently,
as GitHub issues; going forward they live here alongside the code they describe.

.. toctree::
:maxdepth: 1

workgraph_into_core
234 changes: 234 additions & 0 deletions docs/source/internals/aep/workgraph_into_core.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions docs/source/internals/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Internal architecture
engine
broker
rest_api
aep/index

.. todo::

Expand Down
1 change: 1 addition & 0 deletions environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ dependencies:
- jedi<0.19
- jinja2~=3.0
- kiwipy[rmq]~=0.9.0
- node-graph~=0.6.5
- numpy<3,>=1.21
- paramiko~=3.0
- pgsu~=0.3.0
Expand Down
78 changes: 78 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ dependencies = [
'jedi<0.19',
'jinja2~=3.0',
'kiwipy[rmq]~=0.9.0',
'node-graph~=0.6.5',
'numpy>=1.21,<3',
'paramiko~=3.0',
'pgsu~=0.3.0',
Expand Down Expand Up @@ -86,6 +87,9 @@ requires-python = '>=3.10'
[project.entry-points.'aiida.calculations.monitors']
'core.always_kill' = 'aiida.calculations.monitors.base:always_kill'

[project.entry-points."aiida.cmdline"]
"workgraph" = "aiida.workgraph.cli.cmd_workgraph:workgraph"

[project.entry-points.'aiida.cmdline.computer.configure']
'core.local' = 'aiida.transports.plugins.local:CONFIGURE_LOCAL_CMD'
'core.ssh' = 'aiida.transports.plugins.ssh:CONFIGURE_SSH_CMD'
Expand Down Expand Up @@ -118,13 +122,16 @@ requires-python = '>=3.10'
'core.code.containerized' = 'aiida.orm.nodes.data.code.containerized:ContainerizedCode'
'core.code.installed' = 'aiida.orm.nodes.data.code.installed:InstalledCode'
'core.code.portable' = 'aiida.orm.nodes.data.code.portable:PortableCode'
'core.datetime' = 'aiida.orm.nodes.data.datetime:DateTimeData'
'core.dict' = 'aiida.orm.nodes.data.dict:Dict'
'core.enum' = 'aiida.orm.nodes.data.enum:EnumData'
'core.float' = 'aiida.orm.nodes.data.float:Float'
'core.folder' = 'aiida.orm.nodes.data.folder:FolderData'
'core.function' = 'aiida.orm.nodes.data.function:FunctionData'
'core.int' = 'aiida.orm.nodes.data.int:Int'
'core.jsonable' = 'aiida.orm.nodes.data.jsonable:JsonableData'
'core.list' = 'aiida.orm.nodes.data.list:List'
'core.none' = 'aiida.orm.nodes.data.none:NoneData'
'core.numeric' = 'aiida.orm.nodes.data.numeric:NumericType'
'core.orbital' = 'aiida.orm.nodes.data.orbital:OrbitalData'
'core.remote' = 'aiida.orm.nodes.data.remote.base:RemoteData'
Expand Down Expand Up @@ -152,6 +159,7 @@ requires-python = '>=3.10'
'process.workflow' = 'aiida.orm.nodes.process.workflow.workflow:WorkflowNode'
'process.workflow.workchain' = 'aiida.orm.nodes.process.workflow.workchain:WorkChainNode'
'process.workflow.workfunction' = 'aiida.orm.nodes.process.workflow.workfunction:WorkFunctionNode'
'process.workflow.workgraph' = 'aiida.orm.nodes.process.workflow.workgraph:WorkGraphNode'

[project.entry-points.'aiida.orm']
'core.auth_info' = 'aiida.orm.authinfos:AuthInfo'
Expand Down Expand Up @@ -211,6 +219,67 @@ requires-python = '>=3.10'
[project.entry-points.'aiida.workflows']
'core.arithmetic.add_multiply' = 'aiida.workflows.arithmetic.add_multiply:add_multiply'
'core.arithmetic.multiply_add' = 'aiida.workflows.arithmetic.multiply_add:MultiplyAddWorkChain'
"workgraph.process" = "aiida.workgraph.engine.process:WorkGraphProcess"

[project.entry-points."aiida_workgraph.property"]
"workgraph.aiida_float_vector" = "aiida.workgraph.properties.builtins:PropertyAiiDAFloatVector"
"workgraph.aiida_int_vector" = "aiida.workgraph.properties.builtins:PropertyAiiDAIntVector"
"workgraph.aiida_structuredata" = "aiida.workgraph.properties.builtins:PropertyStructureData"
"workgraph.any" = "aiida.workgraph.properties.builtins:PropertyAny"
"workgraph.bool" = "aiida.workgraph.properties.builtins:PropertyBool"
"workgraph.dict" = "aiida.workgraph.properties.builtins:PropertyDict"
"workgraph.float" = "aiida.workgraph.properties.builtins:PropertyFloat"
"workgraph.int" = "aiida.workgraph.properties.builtins:PropertyInt"
"workgraph.list" = "aiida.workgraph.properties.builtins:PropertyList"
"workgraph.string" = "aiida.workgraph.properties.builtins:PropertyString"

[project.entry-points."aiida_workgraph.socket"]
"workgraph.aiida_float_vector" = "aiida.workgraph.sockets.builtins:SocketAiiDAFloatVector"
"workgraph.aiida_int_vector" = "aiida.workgraph.sockets.builtins:SocketAiiDAIntVector"
"workgraph.aiida_structuredata" = "aiida.workgraph.sockets.builtins:SocketStructureData"
"workgraph.annotated" = "aiida.workgraph.sockets.builtins:SocketAnnotated"
"workgraph.any" = "aiida.workgraph.sockets.builtins:SocketAny"
"workgraph.bool" = "aiida.workgraph.sockets.builtins:SocketBool"
"workgraph.dict" = "aiida.workgraph.sockets.builtins:SocketDict"
"workgraph.float" = "aiida.workgraph.sockets.builtins:SocketFloat"
"workgraph.int" = "aiida.workgraph.sockets.builtins:SocketInt"
"workgraph.list" = "aiida.workgraph.sockets.builtins:SocketList"
"workgraph.namespace" = "aiida.workgraph.socket:TaskSocketNamespace"
"workgraph.string" = "aiida.workgraph.sockets.builtins:SocketString"

[project.entry-points."aiida_workgraph.task"]
"workgraph.aiida_dict" = "aiida.workgraph.tasks.builtins:aiida_dict"
"workgraph.aiida_float" = "aiida.workgraph.tasks.builtins:aiida_float"
"workgraph.aiida_int" = "aiida.workgraph.tasks.builtins:aiida_int"
"workgraph.aiida_list" = "aiida.workgraph.tasks.builtins:aiida_list"
"workgraph.aiida_process" = "aiida.workgraph.tasks.aiida:AiiDAProcessTask"
"workgraph.aiida_string" = "aiida.workgraph.tasks.builtins:aiida_string"
"workgraph.any" = "aiida.workgraph.task:Task"
"workgraph.gather_item" = "aiida.workgraph.tasks.builtins:GatherItem"
"workgraph.get_context" = "aiida.workgraph.tasks.builtins:GetContext"
"workgraph.graph_level" = "aiida.workgraph.tasks.builtins:GraphLevelTask"
"workgraph.if_zone" = "aiida.workgraph.tasks.builtins:If"
"workgraph.load_code" = "aiida.workgraph.tasks.builtins:AiiDACode"
"workgraph.load_node" = "aiida.workgraph.tasks.builtins:AiiDANode"
"workgraph.map_item" = "aiida.workgraph.tasks.builtins:MapItem"
"workgraph.map_zone" = "aiida.workgraph.tasks.builtins:Map"
"workgraph.monitor_file" = "aiida.workgraph.tasks.monitors:monitor_file"
"workgraph.monitor_task" = "aiida.workgraph.tasks.monitors:monitor_task"
"workgraph.monitor_time" = "aiida.workgraph.tasks.monitors:monitor_time"
"workgraph.select" = "aiida.workgraph.tasks.builtins:Select"
"workgraph.set_context" = "aiida.workgraph.tasks.builtins:SetContext"
"workgraph.subgraph_task" = "aiida.workgraph.tasks.subgraph_task:SubGraphTask"
"workgraph.test_add" = "aiida.workgraph.executors.test:add"
"workgraph.test_arithmetic_multiply_add" = "aiida.workgraph.tasks.test:TestArithmeticMultiplyAdd"
"workgraph.test_sum_diff" = "aiida.workgraph.executors.test:sum_diff"
"workgraph.while_zone" = "aiida.workgraph.tasks.builtins:While"
"workgraph.zone" = "aiida.workgraph.tasks.builtins:Zone"

[project.entry-points."aiida_workgraph.type_mapping"]
"workgraph.builtins_mapping" = "aiida.workgraph.orm.mapping:builtins_type_mapping"

[project.entry-points."aiida_workgraph.type_promotion"]
"workgraph.builtins_mapping" = "aiida.workgraph.orm.mapping:TYPE_PROMOTIONS"

[project.optional-dependencies]
atomic_tools = [
Expand All @@ -226,6 +295,7 @@ bpython = [
'bpython~=0.20'
]
docs = [
'sphinxcontrib-mermaid~=1.0',
'pydata-sphinx-theme~=0.15.1',
'sphinx~=7.2.0',
'sphinx-copybutton~=0.5.0',
Expand Down Expand Up @@ -410,6 +480,7 @@ module = [
'graphviz.*',
'kiwipy.*',
'mayavi.*',
'node_graph.*',
'pgsu.*',
'pgtest.*',
'trogon.*',
Expand Down Expand Up @@ -514,6 +585,13 @@ select = [
'NPY201' # numpy compatibility
]

[tool.ruff.lint.per-file-ignores]
# The relocated WorkGraph subsystem uses CamelCase for its public control-flow / task-type API
# (``If`` / ``While`` / ``Map`` / ``Zone``, ``TaskPool``, the ``*_TaskSpec`` factory functions),
# which pep8-naming (N802/N803/N806) would otherwise flag. PLW2901/PLR1704 are pre-existing
# WorkGraph loop/argument patterns to clean up in a follow-up.
'src/aiida/workgraph/**' = ['N802', 'N803', 'N806', 'PLW2901', 'PLR1704']

# Mark some classes as generic, per https://docs.astral.sh/ruff/settings/#lint_pyflakes_extend-generics
# Needed due to https://github.com/astral-sh/ruff/issues/9298
[tool.ruff.lint.pyflakes]
Expand Down
1 change: 1 addition & 0 deletions src/aiida/engine/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
'WithNonDb',
'WithSerialize',
'WorkChain',
'Workflow',
'append_',
'assign_',
'await_processes',
Expand Down
2 changes: 2 additions & 0 deletions src/aiida/engine/processes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from .process import *
from .process_spec import *
from .workchains import *
from .workflow import *

__all__ = (
'PORT_NAMESPACE_SEPARATOR',
Expand Down Expand Up @@ -51,6 +52,7 @@
'WithNonDb',
'WithSerialize',
'WorkChain',
'Workflow',
'append_',
'assign_',
'calcfunction',
Expand Down
Loading
Loading