feat: serve docs flat at /<repo>/ with no redirects

- collect.py copies each repo's built site contents directly to a
  top-level <repo>/ dir (was libs|apis|wiki/<repo>/site nesting)
- nginx uses `index index.html lib/index.html api/index.html` so
  /dagpipe/ -> lib/index.html, /auth-server/ -> api/index.html are
  served internally with no redirects
- _index regenerates links against the flat layout
  (/dagpipe/lib/, /auth-server/api/, /mongo-ops/, /blog/...)
- config.yml static entries point at vendored blog/ + media-manager/
- Dockerfile copies per-repo dirs flat into the nginx html root
- removed stale libs/, apis/, wiki/, tutorials/ category trees
This commit is contained in:
2026-09-11 21:32:30 +05:30
parent 0c25cbb19f
commit a32eeaf2b4
882 changed files with 85 additions and 1982 deletions

6
hexa/mcp/index.json Normal file
View File

@@ -0,0 +1,6 @@
{
"project": "hexa",
"type": "docforge-model",
"modules_count": 9,
"source": "docforge"
}

View File

@@ -0,0 +1,116 @@
{
"module": "hexa.check_matches",
"content": {
"path": "hexa.check_matches",
"docstring": "Verify that two hexa representations agree.",
"objects": {
"annotations": {
"name": "annotations",
"kind": "alias",
"path": "hexa.check_matches.annotations",
"signature": "<bound method Alias.signature of Alias('annotations', '__future__.annotations')>",
"docstring": null
},
"Path": {
"name": "Path",
"kind": "alias",
"path": "hexa.check_matches.Path",
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
"docstring": null
},
"PortNode": {
"name": "PortNode",
"kind": "class",
"path": "hexa.check_matches.PortNode",
"signature": "<bound method Alias.signature of Alias('PortNode', 'hexa.model.PortNode')>",
"docstring": "A node in the hexa port tree.\n\nParameters\n----------\nname : str\n Slot name, e.g. ``\"parser\"``, ``\"amount_balance\"``.\nkind : str\n One of ``\"leaf\"``, ``\"port\"``, or ``\"parent\"``.\n - ``\"leaf\"``: no children (e.g. ``NumberPort``)\n - ``\"port\"``: has children (e.g. ``TransactionParserPort``)\n - ``\"parent\"``: the root of the tree (e.g. ``ExtractionPipeline``)\nport_cls : str\n ABC class name that gives this port its shape, e.g.\n ``\"TransactionParserPort\"``. Every port has a concrete typed shape.\nattributes : dict[str, ConfigValue]\n Annotated attributes: ``name -> type_expr`` for scalars, or a nested\n ``dict`` of sub-attributes (a struct) for grouped/structured values.\nchildren : list[PortNode]\n Nested port slots.\nmethods : dict[str, MethodSpec]\n Abstract methods keyed by method name.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.check_matches.PortNode.name",
"signature": "<bound method Alias.signature of Alias('name', 'hexa.model.PortNode.name')>",
"docstring": null
},
"port_cls": {
"name": "port_cls",
"kind": "attribute",
"path": "hexa.check_matches.PortNode.port_cls",
"signature": "<bound method Alias.signature of Alias('port_cls', 'hexa.model.PortNode.port_cls')>",
"docstring": null
},
"kind": {
"name": "kind",
"kind": "attribute",
"path": "hexa.check_matches.PortNode.kind",
"signature": "<bound method Alias.signature of Alias('kind', 'hexa.model.PortNode.kind')>",
"docstring": null
},
"attributes": {
"name": "attributes",
"kind": "attribute",
"path": "hexa.check_matches.PortNode.attributes",
"signature": "<bound method Alias.signature of Alias('attributes', 'hexa.model.PortNode.attributes')>",
"docstring": null
},
"children": {
"name": "children",
"kind": "attribute",
"path": "hexa.check_matches.PortNode.children",
"signature": "<bound method Alias.signature of Alias('children', 'hexa.model.PortNode.children')>",
"docstring": null
},
"methods": {
"name": "methods",
"kind": "attribute",
"path": "hexa.check_matches.PortNode.methods",
"signature": "<bound method Alias.signature of Alias('methods', 'hexa.model.PortNode.methods')>",
"docstring": null
},
"find": {
"name": "find",
"kind": "function",
"path": "hexa.check_matches.PortNode.find",
"signature": "<bound method Alias.signature of Alias('find', 'hexa.model.PortNode.find')>",
"docstring": "Find a direct child by slot name."
},
"walk": {
"name": "walk",
"kind": "function",
"path": "hexa.check_matches.PortNode.walk",
"signature": "<bound method Alias.signature of Alias('walk', 'hexa.model.PortNode.walk')>",
"docstring": "Return all nodes in depth-first order (self first)."
},
"diff": {
"name": "diff",
"kind": "function",
"path": "hexa.check_matches.PortNode.diff",
"signature": "<bound method Alias.signature of Alias('diff', 'hexa.model.PortNode.diff')>",
"docstring": "Return a list of human-readable difference strings.\n\nAn empty list means the trees are equal."
}
}
},
"parse_abc": {
"name": "parse_abc",
"kind": "function",
"path": "hexa.check_matches.parse_abc",
"signature": "<bound method Alias.signature of Alias('parse_abc', 'hexa.parse_abc.parse_abc')>",
"docstring": "Parse an ABC Python module into a :class:`PortNode` tree.\n\nABC classes become port nodes. A nested-struct attribute is expressed as a\n``@dataclass`` annotation on an ABC port (e.g. ``source: ExtractionSource``\nwhere ``ExtractionSource`` is a ``@dataclass``); the dataclass's fields are\nexpanded into a nested ``attributes`` entry.\n\nParameters\n----------\nmodule_or_path : str | Path | Any\n A file path to a ``.py`` file, a module import string, or a loaded module.\n\nReturns\n-------\nPortNode\n The root node of the tree."
},
"parse_yaml": {
"name": "parse_yaml",
"kind": "function",
"path": "hexa.check_matches.parse_yaml",
"signature": "<bound method Alias.signature of Alias('parse_yaml', 'hexa.parse_yaml.parse_yaml')>",
"docstring": "Parse a hexa YAML spec file into a :class:`PortNode` tree.\n\nParameters\n----------\npath : str | Path\n Path to the ``.yaml`` file.\n\nReturns\n-------\nPortNode\n The root node of the parsed tree.\n\nRaises\n------\nValueError\n On structural errors in the YAML."
},
"check_matches": {
"name": "check_matches",
"kind": "function",
"path": "hexa.check_matches.check_matches",
"signature": "<bound method Function.signature of Function('check_matches', 12, 33)>",
"docstring": "Verify two representations agree.\n\nParameters\n----------\npath_a : str | Path\n Path to a .yaml or .py file.\npath_b : str | Path\n Path to a .yaml or .py file.\n\nReturns\n-------\nbool | list[str]\n True if they match exactly, otherwise a list of difference strings."
}
}
}
}

View File

@@ -0,0 +1,79 @@
{
"module": "hexa.cli",
"content": {
"path": "hexa.cli",
"docstring": "Command-line interface for hexa utilities.",
"objects": {
"argparse": {
"name": "argparse",
"kind": "alias",
"path": "hexa.cli.argparse",
"signature": "<bound method Alias.signature of Alias('argparse', 'argparse')>",
"docstring": null
},
"sys": {
"name": "sys",
"kind": "alias",
"path": "hexa.cli.sys",
"signature": "<bound method Alias.signature of Alias('sys', 'sys')>",
"docstring": null
},
"Path": {
"name": "Path",
"kind": "alias",
"path": "hexa.cli.Path",
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
"docstring": null
},
"pprint": {
"name": "pprint",
"kind": "alias",
"path": "hexa.cli.pprint",
"signature": "<bound method Alias.signature of Alias('pprint', 'pprint.pprint')>",
"docstring": null
},
"check_matches": {
"name": "check_matches",
"kind": "function",
"path": "hexa.cli.check_matches",
"signature": "<bound method Alias.signature of Alias('check_matches', 'hexa.check_matches.check_matches')>",
"docstring": "Verify two representations agree.\n\nParameters\n----------\npath_a : str | Path\n Path to a .yaml or .py file.\npath_b : str | Path\n Path to a .yaml or .py file.\n\nReturns\n-------\nbool | list[str]\n True if they match exactly, otherwise a list of difference strings."
},
"generate_abc": {
"name": "generate_abc",
"kind": "function",
"path": "hexa.cli.generate_abc",
"signature": "<bound method Alias.signature of Alias('generate_abc', 'hexa.generate_abc.generate_abc')>",
"docstring": "Generate ABC Python source from a :class:`PortNode` tree.\n\nParameters\n----------\nnode : PortNode\n The root of the parsed YAML (or generated) tree.\nout_path : str | Path | None\n Optional file path to write the generated source to.\n\nReturns\n-------\nstr\n The generated Python source code."
},
"generate_yaml": {
"name": "generate_yaml",
"kind": "function",
"path": "hexa.cli.generate_yaml",
"signature": "<bound method Alias.signature of Alias('generate_yaml', 'hexa.generate_yaml.generate_yaml')>",
"docstring": "Generate YAML source from a :class:`PortNode` tree.\n\nParameters\n----------\nnode : PortNode\n The root of the tree.\nout_path : str | Path | None\n Optional file path to write the generated source to.\n\nReturns\n-------\nstr\n The generated YAML source."
},
"parse_abc": {
"name": "parse_abc",
"kind": "function",
"path": "hexa.cli.parse_abc",
"signature": "<bound method Alias.signature of Alias('parse_abc', 'hexa.parse_abc.parse_abc')>",
"docstring": "Parse an ABC Python module into a :class:`PortNode` tree.\n\nABC classes become port nodes. A nested-struct attribute is expressed as a\n``@dataclass`` annotation on an ABC port (e.g. ``source: ExtractionSource``\nwhere ``ExtractionSource`` is a ``@dataclass``); the dataclass's fields are\nexpanded into a nested ``attributes`` entry.\n\nParameters\n----------\nmodule_or_path : str | Path | Any\n A file path to a ``.py`` file, a module import string, or a loaded module.\n\nReturns\n-------\nPortNode\n The root node of the tree."
},
"parse_yaml": {
"name": "parse_yaml",
"kind": "function",
"path": "hexa.cli.parse_yaml",
"signature": "<bound method Alias.signature of Alias('parse_yaml', 'hexa.parse_yaml.parse_yaml')>",
"docstring": "Parse a hexa YAML spec file into a :class:`PortNode` tree.\n\nParameters\n----------\npath : str | Path\n Path to the ``.yaml`` file.\n\nReturns\n-------\nPortNode\n The root node of the parsed tree.\n\nRaises\n------\nValueError\n On structural errors in the YAML."
},
"main": {
"name": "main",
"kind": "function",
"path": "hexa.cli.main",
"signature": "<bound method Function.signature of Function('main', 15, 87)>",
"docstring": null
}
}
}
}

View File

@@ -0,0 +1,58 @@
{
"module": "hexa.container",
"content": {
"path": "hexa.container",
"docstring": "Container to build a wired hexa pipeline from annotations.",
"objects": {
"annotations": {
"name": "annotations",
"kind": "alias",
"path": "hexa.container.annotations",
"signature": "<bound method Alias.signature of Alias('annotations', '__future__.annotations')>",
"docstring": null
},
"inspect": {
"name": "inspect",
"kind": "alias",
"path": "hexa.container.inspect",
"signature": "<bound method Alias.signature of Alias('inspect', 'inspect')>",
"docstring": null
},
"UnionType": {
"name": "UnionType",
"kind": "alias",
"path": "hexa.container.UnionType",
"signature": "<bound method Alias.signature of Alias('UnionType', 'types.UnionType')>",
"docstring": null
},
"Any": {
"name": "Any",
"kind": "alias",
"path": "hexa.container.Any",
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
"docstring": null
},
"TypeVar": {
"name": "TypeVar",
"kind": "alias",
"path": "hexa.container.TypeVar",
"signature": "<bound method Alias.signature of Alias('TypeVar', 'typing.TypeVar')>",
"docstring": null
},
"T": {
"name": "T",
"kind": "attribute",
"path": "hexa.container.T",
"signature": null,
"docstring": null
},
"build": {
"name": "build",
"kind": "function",
"path": "hexa.container.build",
"signature": "<bound method Function.signature of Function('build', 12, 97)>",
"docstring": "Recursively instantiate the port tree from annotations.\n\nParameters\n----------\ncls : type\n The root class to build (e.g. ``AxisExtractionPipeline``).\ninstances : dict, optional\n ``{slot_name: object}`` injected verbatim into every node whose\n annotations contain that name (runtime values — repos, handlers,\n clients — that must not be re-constructed). Applied to the whole\n tree by name.\nconfig : dict, optional\n ``{field_name: value}`` propagated by name to every node's annotated\n config fields (non-port attributes), replacing the default ``None``.\n\nReturns\n-------\ninstance\n A fully wired instance of ``cls`` and all its nested ports."
}
}
}
}

View File

@@ -0,0 +1,123 @@
{
"module": "hexa.generate_abc",
"content": {
"path": "hexa.generate_abc",
"docstring": "Generate _abc.py source from a hexa PortNode tree.",
"objects": {
"annotations": {
"name": "annotations",
"kind": "alias",
"path": "hexa.generate_abc.annotations",
"signature": "<bound method Alias.signature of Alias('annotations', '__future__.annotations')>",
"docstring": null
},
"io": {
"name": "io",
"kind": "alias",
"path": "hexa.generate_abc.io",
"signature": "<bound method Alias.signature of Alias('io', 'io')>",
"docstring": null
},
"re": {
"name": "re",
"kind": "alias",
"path": "hexa.generate_abc.re",
"signature": "<bound method Alias.signature of Alias('re', 're')>",
"docstring": null
},
"Path": {
"name": "Path",
"kind": "alias",
"path": "hexa.generate_abc.Path",
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
"docstring": null
},
"NestedConfig": {
"name": "NestedConfig",
"kind": "attribute",
"path": "hexa.generate_abc.NestedConfig",
"signature": "<bound method Alias.signature of Alias('NestedConfig', 'hexa.model.NestedConfig')>",
"docstring": null
},
"PortNode": {
"name": "PortNode",
"kind": "class",
"path": "hexa.generate_abc.PortNode",
"signature": "<bound method Alias.signature of Alias('PortNode', 'hexa.model.PortNode')>",
"docstring": "A node in the hexa port tree.\n\nParameters\n----------\nname : str\n Slot name, e.g. ``\"parser\"``, ``\"amount_balance\"``.\nkind : str\n One of ``\"leaf\"``, ``\"port\"``, or ``\"parent\"``.\n - ``\"leaf\"``: no children (e.g. ``NumberPort``)\n - ``\"port\"``: has children (e.g. ``TransactionParserPort``)\n - ``\"parent\"``: the root of the tree (e.g. ``ExtractionPipeline``)\nport_cls : str\n ABC class name that gives this port its shape, e.g.\n ``\"TransactionParserPort\"``. Every port has a concrete typed shape.\nattributes : dict[str, ConfigValue]\n Annotated attributes: ``name -> type_expr`` for scalars, or a nested\n ``dict`` of sub-attributes (a struct) for grouped/structured values.\nchildren : list[PortNode]\n Nested port slots.\nmethods : dict[str, MethodSpec]\n Abstract methods keyed by method name.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.generate_abc.PortNode.name",
"signature": "<bound method Alias.signature of Alias('name', 'hexa.model.PortNode.name')>",
"docstring": null
},
"port_cls": {
"name": "port_cls",
"kind": "attribute",
"path": "hexa.generate_abc.PortNode.port_cls",
"signature": "<bound method Alias.signature of Alias('port_cls', 'hexa.model.PortNode.port_cls')>",
"docstring": null
},
"kind": {
"name": "kind",
"kind": "attribute",
"path": "hexa.generate_abc.PortNode.kind",
"signature": "<bound method Alias.signature of Alias('kind', 'hexa.model.PortNode.kind')>",
"docstring": null
},
"attributes": {
"name": "attributes",
"kind": "attribute",
"path": "hexa.generate_abc.PortNode.attributes",
"signature": "<bound method Alias.signature of Alias('attributes', 'hexa.model.PortNode.attributes')>",
"docstring": null
},
"children": {
"name": "children",
"kind": "attribute",
"path": "hexa.generate_abc.PortNode.children",
"signature": "<bound method Alias.signature of Alias('children', 'hexa.model.PortNode.children')>",
"docstring": null
},
"methods": {
"name": "methods",
"kind": "attribute",
"path": "hexa.generate_abc.PortNode.methods",
"signature": "<bound method Alias.signature of Alias('methods', 'hexa.model.PortNode.methods')>",
"docstring": null
},
"find": {
"name": "find",
"kind": "function",
"path": "hexa.generate_abc.PortNode.find",
"signature": "<bound method Alias.signature of Alias('find', 'hexa.model.PortNode.find')>",
"docstring": "Find a direct child by slot name."
},
"walk": {
"name": "walk",
"kind": "function",
"path": "hexa.generate_abc.PortNode.walk",
"signature": "<bound method Alias.signature of Alias('walk', 'hexa.model.PortNode.walk')>",
"docstring": "Return all nodes in depth-first order (self first)."
},
"diff": {
"name": "diff",
"kind": "function",
"path": "hexa.generate_abc.PortNode.diff",
"signature": "<bound method Alias.signature of Alias('diff', 'hexa.model.PortNode.diff')>",
"docstring": "Return a list of human-readable difference strings.\n\nAn empty list means the trees are equal."
}
}
},
"generate_abc": {
"name": "generate_abc",
"kind": "function",
"path": "hexa.generate_abc.generate_abc",
"signature": "<bound method Function.signature of Function('generate_abc', 12, 88)>",
"docstring": "Generate ABC Python source from a :class:`PortNode` tree.\n\nParameters\n----------\nnode : PortNode\n The root of the parsed YAML (or generated) tree.\nout_path : str | Path | None\n Optional file path to write the generated source to.\n\nReturns\n-------\nstr\n The generated Python source code."
}
}
}
}

View File

@@ -0,0 +1,160 @@
{
"module": "hexa.generate_yaml",
"content": {
"path": "hexa.generate_yaml",
"docstring": "Generate YAML spec (nested mapping form) from a hexa PortNode tree.",
"objects": {
"annotations": {
"name": "annotations",
"kind": "alias",
"path": "hexa.generate_yaml.annotations",
"signature": "<bound method Alias.signature of Alias('annotations', '__future__.annotations')>",
"docstring": null
},
"io": {
"name": "io",
"kind": "alias",
"path": "hexa.generate_yaml.io",
"signature": "<bound method Alias.signature of Alias('io', 'io')>",
"docstring": null
},
"Path": {
"name": "Path",
"kind": "alias",
"path": "hexa.generate_yaml.Path",
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
"docstring": null
},
"Any": {
"name": "Any",
"kind": "alias",
"path": "hexa.generate_yaml.Any",
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
"docstring": null
},
"yaml": {
"name": "yaml",
"kind": "alias",
"path": "hexa.generate_yaml.yaml",
"signature": "<bound method Alias.signature of Alias('yaml', 'yaml')>",
"docstring": null
},
"MethodSpec": {
"name": "MethodSpec",
"kind": "class",
"path": "hexa.generate_yaml.MethodSpec",
"signature": "<bound method Alias.signature of Alias('MethodSpec', 'hexa.model.MethodSpec')>",
"docstring": "Specification of a single abstract method.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.generate_yaml.MethodSpec.name",
"signature": "<bound method Alias.signature of Alias('name', 'hexa.model.MethodSpec.name')>",
"docstring": null
},
"args": {
"name": "args",
"kind": "attribute",
"path": "hexa.generate_yaml.MethodSpec.args",
"signature": "<bound method Alias.signature of Alias('args', 'hexa.model.MethodSpec.args')>",
"docstring": null
},
"kwargs": {
"name": "kwargs",
"kind": "attribute",
"path": "hexa.generate_yaml.MethodSpec.kwargs",
"signature": "<bound method Alias.signature of Alias('kwargs', 'hexa.model.MethodSpec.kwargs')>",
"docstring": null
}
}
},
"NestedConfig": {
"name": "NestedConfig",
"kind": "attribute",
"path": "hexa.generate_yaml.NestedConfig",
"signature": "<bound method Alias.signature of Alias('NestedConfig', 'hexa.model.NestedConfig')>",
"docstring": null
},
"PortNode": {
"name": "PortNode",
"kind": "class",
"path": "hexa.generate_yaml.PortNode",
"signature": "<bound method Alias.signature of Alias('PortNode', 'hexa.model.PortNode')>",
"docstring": "A node in the hexa port tree.\n\nParameters\n----------\nname : str\n Slot name, e.g. ``\"parser\"``, ``\"amount_balance\"``.\nkind : str\n One of ``\"leaf\"``, ``\"port\"``, or ``\"parent\"``.\n - ``\"leaf\"``: no children (e.g. ``NumberPort``)\n - ``\"port\"``: has children (e.g. ``TransactionParserPort``)\n - ``\"parent\"``: the root of the tree (e.g. ``ExtractionPipeline``)\nport_cls : str\n ABC class name that gives this port its shape, e.g.\n ``\"TransactionParserPort\"``. Every port has a concrete typed shape.\nattributes : dict[str, ConfigValue]\n Annotated attributes: ``name -> type_expr`` for scalars, or a nested\n ``dict`` of sub-attributes (a struct) for grouped/structured values.\nchildren : list[PortNode]\n Nested port slots.\nmethods : dict[str, MethodSpec]\n Abstract methods keyed by method name.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.generate_yaml.PortNode.name",
"signature": "<bound method Alias.signature of Alias('name', 'hexa.model.PortNode.name')>",
"docstring": null
},
"port_cls": {
"name": "port_cls",
"kind": "attribute",
"path": "hexa.generate_yaml.PortNode.port_cls",
"signature": "<bound method Alias.signature of Alias('port_cls', 'hexa.model.PortNode.port_cls')>",
"docstring": null
},
"kind": {
"name": "kind",
"kind": "attribute",
"path": "hexa.generate_yaml.PortNode.kind",
"signature": "<bound method Alias.signature of Alias('kind', 'hexa.model.PortNode.kind')>",
"docstring": null
},
"attributes": {
"name": "attributes",
"kind": "attribute",
"path": "hexa.generate_yaml.PortNode.attributes",
"signature": "<bound method Alias.signature of Alias('attributes', 'hexa.model.PortNode.attributes')>",
"docstring": null
},
"children": {
"name": "children",
"kind": "attribute",
"path": "hexa.generate_yaml.PortNode.children",
"signature": "<bound method Alias.signature of Alias('children', 'hexa.model.PortNode.children')>",
"docstring": null
},
"methods": {
"name": "methods",
"kind": "attribute",
"path": "hexa.generate_yaml.PortNode.methods",
"signature": "<bound method Alias.signature of Alias('methods', 'hexa.model.PortNode.methods')>",
"docstring": null
},
"find": {
"name": "find",
"kind": "function",
"path": "hexa.generate_yaml.PortNode.find",
"signature": "<bound method Alias.signature of Alias('find', 'hexa.model.PortNode.find')>",
"docstring": "Find a direct child by slot name."
},
"walk": {
"name": "walk",
"kind": "function",
"path": "hexa.generate_yaml.PortNode.walk",
"signature": "<bound method Alias.signature of Alias('walk', 'hexa.model.PortNode.walk')>",
"docstring": "Return all nodes in depth-first order (self first)."
},
"diff": {
"name": "diff",
"kind": "function",
"path": "hexa.generate_yaml.PortNode.diff",
"signature": "<bound method Alias.signature of Alias('diff', 'hexa.model.PortNode.diff')>",
"docstring": "Return a list of human-readable difference strings.\n\nAn empty list means the trees are equal."
}
}
},
"generate_yaml": {
"name": "generate_yaml",
"kind": "function",
"path": "hexa.generate_yaml.generate_yaml",
"signature": "<bound method Function.signature of Function('generate_yaml', 14, 38)>",
"docstring": "Generate YAML source from a :class:`PortNode` tree.\n\nParameters\n----------\nnode : PortNode\n The root of the tree.\nout_path : str | Path | None\n Optional file path to write the generated source to.\n\nReturns\n-------\nstr\n The generated YAML source."
}
}
}
}

1134
hexa/mcp/modules/hexa.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,146 @@
{
"module": "hexa.model",
"content": {
"path": "hexa.model",
"docstring": "Shared neutral model for hexa port trees.\n\nAll utilities (``parse_yaml``, ``generate_abc``, ``parse_abc``,\n``generate_yaml``, ``check_matches``) serialize through this single model.\nIt is NOT tied to any sample — any port tree fits.",
"objects": {
"annotations": {
"name": "annotations",
"kind": "alias",
"path": "hexa.model.annotations",
"signature": "<bound method Alias.signature of Alias('annotations', '__future__.annotations')>",
"docstring": null
},
"dataclass": {
"name": "dataclass",
"kind": "alias",
"path": "hexa.model.dataclass",
"signature": "<bound method Alias.signature of Alias('dataclass', 'dataclasses.dataclass')>",
"docstring": null
},
"field": {
"name": "field",
"kind": "alias",
"path": "hexa.model.field",
"signature": "<bound method Alias.signature of Alias('field', 'dataclasses.field')>",
"docstring": null
},
"NestedConfig": {
"name": "NestedConfig",
"kind": "attribute",
"path": "hexa.model.NestedConfig",
"signature": null,
"docstring": null
},
"ConfigValue": {
"name": "ConfigValue",
"kind": "attribute",
"path": "hexa.model.ConfigValue",
"signature": null,
"docstring": null
},
"MethodSpec": {
"name": "MethodSpec",
"kind": "class",
"path": "hexa.model.MethodSpec",
"signature": "<bound method Class.signature of Class('MethodSpec', 19, 34)>",
"docstring": "Specification of a single abstract method.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.model.MethodSpec.name",
"signature": null,
"docstring": null
},
"args": {
"name": "args",
"kind": "attribute",
"path": "hexa.model.MethodSpec.args",
"signature": null,
"docstring": null
},
"kwargs": {
"name": "kwargs",
"kind": "attribute",
"path": "hexa.model.MethodSpec.kwargs",
"signature": null,
"docstring": null
}
}
},
"PortNode": {
"name": "PortNode",
"kind": "class",
"path": "hexa.model.PortNode",
"signature": "<bound method Class.signature of Class('PortNode', 37, 149)>",
"docstring": "A node in the hexa port tree.\n\nParameters\n----------\nname : str\n Slot name, e.g. ``\"parser\"``, ``\"amount_balance\"``.\nkind : str\n One of ``\"leaf\"``, ``\"port\"``, or ``\"parent\"``.\n - ``\"leaf\"``: no children (e.g. ``NumberPort``)\n - ``\"port\"``: has children (e.g. ``TransactionParserPort``)\n - ``\"parent\"``: the root of the tree (e.g. ``ExtractionPipeline``)\nport_cls : str\n ABC class name that gives this port its shape, e.g.\n ``\"TransactionParserPort\"``. Every port has a concrete typed shape.\nattributes : dict[str, ConfigValue]\n Annotated attributes: ``name -> type_expr`` for scalars, or a nested\n ``dict`` of sub-attributes (a struct) for grouped/structured values.\nchildren : list[PortNode]\n Nested port slots.\nmethods : dict[str, MethodSpec]\n Abstract methods keyed by method name.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.model.PortNode.name",
"signature": null,
"docstring": null
},
"port_cls": {
"name": "port_cls",
"kind": "attribute",
"path": "hexa.model.PortNode.port_cls",
"signature": null,
"docstring": null
},
"kind": {
"name": "kind",
"kind": "attribute",
"path": "hexa.model.PortNode.kind",
"signature": null,
"docstring": null
},
"attributes": {
"name": "attributes",
"kind": "attribute",
"path": "hexa.model.PortNode.attributes",
"signature": null,
"docstring": null
},
"children": {
"name": "children",
"kind": "attribute",
"path": "hexa.model.PortNode.children",
"signature": null,
"docstring": null
},
"methods": {
"name": "methods",
"kind": "attribute",
"path": "hexa.model.PortNode.methods",
"signature": null,
"docstring": null
},
"find": {
"name": "find",
"kind": "function",
"path": "hexa.model.PortNode.find",
"signature": "<bound method Function.signature of Function('find', 73, 78)>",
"docstring": "Find a direct child by slot name."
},
"walk": {
"name": "walk",
"kind": "function",
"path": "hexa.model.PortNode.walk",
"signature": "<bound method Function.signature of Function('walk', 80, 85)>",
"docstring": "Return all nodes in depth-first order (self first)."
},
"diff": {
"name": "diff",
"kind": "function",
"path": "hexa.model.PortNode.diff",
"signature": "<bound method Function.signature of Function('diff', 103, 149)>",
"docstring": "Return a list of human-readable difference strings.\n\nAn empty list means the trees are equal."
}
}
}
}
}
}

View File

@@ -0,0 +1,181 @@
{
"module": "hexa.parse_abc",
"content": {
"path": "hexa.parse_abc",
"docstring": "Parse an ABC Python module into a hexa PortNode tree.",
"objects": {
"annotations": {
"name": "annotations",
"kind": "alias",
"path": "hexa.parse_abc.annotations",
"signature": "<bound method Alias.signature of Alias('annotations', '__future__.annotations')>",
"docstring": null
},
"dataclasses": {
"name": "dataclasses",
"kind": "alias",
"path": "hexa.parse_abc.dataclasses",
"signature": "<bound method Alias.signature of Alias('dataclasses', 'dataclasses')>",
"docstring": null
},
"importlib": {
"name": "importlib",
"kind": "alias",
"path": "hexa.parse_abc.importlib",
"signature": "<bound method Alias.signature of Alias('importlib', 'importlib')>",
"docstring": null
},
"inspect": {
"name": "inspect",
"kind": "alias",
"path": "hexa.parse_abc.inspect",
"signature": "<bound method Alias.signature of Alias('inspect', 'inspect')>",
"docstring": null
},
"sys": {
"name": "sys",
"kind": "alias",
"path": "hexa.parse_abc.sys",
"signature": "<bound method Alias.signature of Alias('sys', 'sys')>",
"docstring": null
},
"ABC": {
"name": "ABC",
"kind": "alias",
"path": "hexa.parse_abc.ABC",
"signature": "<bound method Alias.signature of Alias('ABC', 'abc.ABC')>",
"docstring": null
},
"Path": {
"name": "Path",
"kind": "alias",
"path": "hexa.parse_abc.Path",
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
"docstring": null
},
"Any": {
"name": "Any",
"kind": "alias",
"path": "hexa.parse_abc.Any",
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
"docstring": null
},
"ConfigValue": {
"name": "ConfigValue",
"kind": "attribute",
"path": "hexa.parse_abc.ConfigValue",
"signature": "<bound method Alias.signature of Alias('ConfigValue', 'hexa.model.ConfigValue')>",
"docstring": null
},
"MethodSpec": {
"name": "MethodSpec",
"kind": "class",
"path": "hexa.parse_abc.MethodSpec",
"signature": "<bound method Alias.signature of Alias('MethodSpec', 'hexa.model.MethodSpec')>",
"docstring": "Specification of a single abstract method.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.parse_abc.MethodSpec.name",
"signature": "<bound method Alias.signature of Alias('name', 'hexa.model.MethodSpec.name')>",
"docstring": null
},
"args": {
"name": "args",
"kind": "attribute",
"path": "hexa.parse_abc.MethodSpec.args",
"signature": "<bound method Alias.signature of Alias('args', 'hexa.model.MethodSpec.args')>",
"docstring": null
},
"kwargs": {
"name": "kwargs",
"kind": "attribute",
"path": "hexa.parse_abc.MethodSpec.kwargs",
"signature": "<bound method Alias.signature of Alias('kwargs', 'hexa.model.MethodSpec.kwargs')>",
"docstring": null
}
}
},
"PortNode": {
"name": "PortNode",
"kind": "class",
"path": "hexa.parse_abc.PortNode",
"signature": "<bound method Alias.signature of Alias('PortNode', 'hexa.model.PortNode')>",
"docstring": "A node in the hexa port tree.\n\nParameters\n----------\nname : str\n Slot name, e.g. ``\"parser\"``, ``\"amount_balance\"``.\nkind : str\n One of ``\"leaf\"``, ``\"port\"``, or ``\"parent\"``.\n - ``\"leaf\"``: no children (e.g. ``NumberPort``)\n - ``\"port\"``: has children (e.g. ``TransactionParserPort``)\n - ``\"parent\"``: the root of the tree (e.g. ``ExtractionPipeline``)\nport_cls : str\n ABC class name that gives this port its shape, e.g.\n ``\"TransactionParserPort\"``. Every port has a concrete typed shape.\nattributes : dict[str, ConfigValue]\n Annotated attributes: ``name -> type_expr`` for scalars, or a nested\n ``dict`` of sub-attributes (a struct) for grouped/structured values.\nchildren : list[PortNode]\n Nested port slots.\nmethods : dict[str, MethodSpec]\n Abstract methods keyed by method name.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.parse_abc.PortNode.name",
"signature": "<bound method Alias.signature of Alias('name', 'hexa.model.PortNode.name')>",
"docstring": null
},
"port_cls": {
"name": "port_cls",
"kind": "attribute",
"path": "hexa.parse_abc.PortNode.port_cls",
"signature": "<bound method Alias.signature of Alias('port_cls', 'hexa.model.PortNode.port_cls')>",
"docstring": null
},
"kind": {
"name": "kind",
"kind": "attribute",
"path": "hexa.parse_abc.PortNode.kind",
"signature": "<bound method Alias.signature of Alias('kind', 'hexa.model.PortNode.kind')>",
"docstring": null
},
"attributes": {
"name": "attributes",
"kind": "attribute",
"path": "hexa.parse_abc.PortNode.attributes",
"signature": "<bound method Alias.signature of Alias('attributes', 'hexa.model.PortNode.attributes')>",
"docstring": null
},
"children": {
"name": "children",
"kind": "attribute",
"path": "hexa.parse_abc.PortNode.children",
"signature": "<bound method Alias.signature of Alias('children', 'hexa.model.PortNode.children')>",
"docstring": null
},
"methods": {
"name": "methods",
"kind": "attribute",
"path": "hexa.parse_abc.PortNode.methods",
"signature": "<bound method Alias.signature of Alias('methods', 'hexa.model.PortNode.methods')>",
"docstring": null
},
"find": {
"name": "find",
"kind": "function",
"path": "hexa.parse_abc.PortNode.find",
"signature": "<bound method Alias.signature of Alias('find', 'hexa.model.PortNode.find')>",
"docstring": "Find a direct child by slot name."
},
"walk": {
"name": "walk",
"kind": "function",
"path": "hexa.parse_abc.PortNode.walk",
"signature": "<bound method Alias.signature of Alias('walk', 'hexa.model.PortNode.walk')>",
"docstring": "Return all nodes in depth-first order (self first)."
},
"diff": {
"name": "diff",
"kind": "function",
"path": "hexa.parse_abc.PortNode.diff",
"signature": "<bound method Alias.signature of Alias('diff', 'hexa.model.PortNode.diff')>",
"docstring": "Return a list of human-readable difference strings.\n\nAn empty list means the trees are equal."
}
}
},
"parse_abc": {
"name": "parse_abc",
"kind": "function",
"path": "hexa.parse_abc.parse_abc",
"signature": "<bound method Function.signature of Function('parse_abc', 17, 81)>",
"docstring": "Parse an ABC Python module into a :class:`PortNode` tree.\n\nABC classes become port nodes. A nested-struct attribute is expressed as a\n``@dataclass`` annotation on an ABC port (e.g. ``source: ExtractionSource``\nwhere ``ExtractionSource`` is a ``@dataclass``); the dataclass's fields are\nexpanded into a nested ``attributes`` entry.\n\nParameters\n----------\nmodule_or_path : str | Path | Any\n A file path to a ``.py`` file, a module import string, or a loaded module.\n\nReturns\n-------\nPortNode\n The root node of the tree."
}
}
}
}

View File

@@ -0,0 +1,153 @@
{
"module": "hexa.parse_yaml",
"content": {
"path": "hexa.parse_yaml",
"docstring": "Parse a hexa YAML spec into a :class:`PortNode` tree.\n\nThe YAML grammar uses a nested mapping format built from three member kinds:\n\n- **attribute**: a ``name: type`` scalar (e.g. ``source_type: str``)\n- **nested struct**: a ``name:`` mapping of sub-attributes (e.g. ``source:``)\n- **port**: a ``name:`` mapping whose single key is a class whose value is a\n body, or a class key with a ``...`` body. A port carries a class shape.\n\nExample::\n\n RootClassName:\n attr: type # scalar attribute\n source: # nested struct (all scalar sub-attributes)\n source_type: str\n bank: str\n methods: # reserved block of functions\n run:\n args: [a, b]\n ingest: # port (single non-scalar class key)\n IngestPort:\n source_type: str\n methods: {Method: ...}\n\nDisambiguation of a mapping value:\n A mapping with exactly one key whose value is a non-scalar body (a mapping,\n ``...``, or a list) is a **port**. Any other mapping (multiple keys, or all\n scalar-typed values) is a **nested struct** of attributes.\n\nSee ``samples/minimal/sample.yaml`` and\n``samples/extraction_pipeline/extraction_pipeline.yaml`` for examples.",
"objects": {
"annotations": {
"name": "annotations",
"kind": "alias",
"path": "hexa.parse_yaml.annotations",
"signature": "<bound method Alias.signature of Alias('annotations', '__future__.annotations')>",
"docstring": null
},
"Path": {
"name": "Path",
"kind": "alias",
"path": "hexa.parse_yaml.Path",
"signature": "<bound method Alias.signature of Alias('Path', 'pathlib.Path')>",
"docstring": null
},
"Any": {
"name": "Any",
"kind": "alias",
"path": "hexa.parse_yaml.Any",
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
"docstring": null
},
"yaml": {
"name": "yaml",
"kind": "alias",
"path": "hexa.parse_yaml.yaml",
"signature": "<bound method Alias.signature of Alias('yaml', 'yaml')>",
"docstring": null
},
"ConfigValue": {
"name": "ConfigValue",
"kind": "attribute",
"path": "hexa.parse_yaml.ConfigValue",
"signature": "<bound method Alias.signature of Alias('ConfigValue', 'hexa.model.ConfigValue')>",
"docstring": null
},
"MethodSpec": {
"name": "MethodSpec",
"kind": "class",
"path": "hexa.parse_yaml.MethodSpec",
"signature": "<bound method Alias.signature of Alias('MethodSpec', 'hexa.model.MethodSpec')>",
"docstring": "Specification of a single abstract method.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.parse_yaml.MethodSpec.name",
"signature": "<bound method Alias.signature of Alias('name', 'hexa.model.MethodSpec.name')>",
"docstring": null
},
"args": {
"name": "args",
"kind": "attribute",
"path": "hexa.parse_yaml.MethodSpec.args",
"signature": "<bound method Alias.signature of Alias('args', 'hexa.model.MethodSpec.args')>",
"docstring": null
},
"kwargs": {
"name": "kwargs",
"kind": "attribute",
"path": "hexa.parse_yaml.MethodSpec.kwargs",
"signature": "<bound method Alias.signature of Alias('kwargs', 'hexa.model.MethodSpec.kwargs')>",
"docstring": null
}
}
},
"PortNode": {
"name": "PortNode",
"kind": "class",
"path": "hexa.parse_yaml.PortNode",
"signature": "<bound method Alias.signature of Alias('PortNode', 'hexa.model.PortNode')>",
"docstring": "A node in the hexa port tree.\n\nParameters\n----------\nname : str\n Slot name, e.g. ``\"parser\"``, ``\"amount_balance\"``.\nkind : str\n One of ``\"leaf\"``, ``\"port\"``, or ``\"parent\"``.\n - ``\"leaf\"``: no children (e.g. ``NumberPort``)\n - ``\"port\"``: has children (e.g. ``TransactionParserPort``)\n - ``\"parent\"``: the root of the tree (e.g. ``ExtractionPipeline``)\nport_cls : str\n ABC class name that gives this port its shape, e.g.\n ``\"TransactionParserPort\"``. Every port has a concrete typed shape.\nattributes : dict[str, ConfigValue]\n Annotated attributes: ``name -> type_expr`` for scalars, or a nested\n ``dict`` of sub-attributes (a struct) for grouped/structured values.\nchildren : list[PortNode]\n Nested port slots.\nmethods : dict[str, MethodSpec]\n Abstract methods keyed by method name.",
"members": {
"name": {
"name": "name",
"kind": "attribute",
"path": "hexa.parse_yaml.PortNode.name",
"signature": "<bound method Alias.signature of Alias('name', 'hexa.model.PortNode.name')>",
"docstring": null
},
"port_cls": {
"name": "port_cls",
"kind": "attribute",
"path": "hexa.parse_yaml.PortNode.port_cls",
"signature": "<bound method Alias.signature of Alias('port_cls', 'hexa.model.PortNode.port_cls')>",
"docstring": null
},
"kind": {
"name": "kind",
"kind": "attribute",
"path": "hexa.parse_yaml.PortNode.kind",
"signature": "<bound method Alias.signature of Alias('kind', 'hexa.model.PortNode.kind')>",
"docstring": null
},
"attributes": {
"name": "attributes",
"kind": "attribute",
"path": "hexa.parse_yaml.PortNode.attributes",
"signature": "<bound method Alias.signature of Alias('attributes', 'hexa.model.PortNode.attributes')>",
"docstring": null
},
"children": {
"name": "children",
"kind": "attribute",
"path": "hexa.parse_yaml.PortNode.children",
"signature": "<bound method Alias.signature of Alias('children', 'hexa.model.PortNode.children')>",
"docstring": null
},
"methods": {
"name": "methods",
"kind": "attribute",
"path": "hexa.parse_yaml.PortNode.methods",
"signature": "<bound method Alias.signature of Alias('methods', 'hexa.model.PortNode.methods')>",
"docstring": null
},
"find": {
"name": "find",
"kind": "function",
"path": "hexa.parse_yaml.PortNode.find",
"signature": "<bound method Alias.signature of Alias('find', 'hexa.model.PortNode.find')>",
"docstring": "Find a direct child by slot name."
},
"walk": {
"name": "walk",
"kind": "function",
"path": "hexa.parse_yaml.PortNode.walk",
"signature": "<bound method Alias.signature of Alias('walk', 'hexa.model.PortNode.walk')>",
"docstring": "Return all nodes in depth-first order (self first)."
},
"diff": {
"name": "diff",
"kind": "function",
"path": "hexa.parse_yaml.PortNode.diff",
"signature": "<bound method Alias.signature of Alias('diff', 'hexa.model.PortNode.diff')>",
"docstring": "Return a list of human-readable difference strings.\n\nAn empty list means the trees are equal."
}
}
},
"parse_yaml": {
"name": "parse_yaml",
"kind": "function",
"path": "hexa.parse_yaml.parse_yaml",
"signature": "<bound method Function.signature of Function('parse_yaml', 44, 72)>",
"docstring": "Parse a hexa YAML spec file into a :class:`PortNode` tree.\n\nParameters\n----------\npath : str | Path\n Path to the ``.yaml`` file.\n\nReturns\n-------\nPortNode\n The root node of the parsed tree.\n\nRaises\n------\nValueError\n On structural errors in the YAML."
}
}
}
}

38
hexa/mcp/nav.json Normal file
View File

@@ -0,0 +1,38 @@
[
{
"module": "hexa",
"resource": "doc://modules/hexa"
},
{
"module": "hexa.check_matches",
"resource": "doc://modules/hexa.check_matches"
},
{
"module": "hexa.cli",
"resource": "doc://modules/hexa.cli"
},
{
"module": "hexa.container",
"resource": "doc://modules/hexa.container"
},
{
"module": "hexa.generate_abc",
"resource": "doc://modules/hexa.generate_abc"
},
{
"module": "hexa.generate_yaml",
"resource": "doc://modules/hexa.generate_yaml"
},
{
"module": "hexa.model",
"resource": "doc://modules/hexa.model"
},
{
"module": "hexa.parse_abc",
"resource": "doc://modules/hexa.parse_abc"
},
{
"module": "hexa.parse_yaml",
"resource": "doc://modules/hexa.parse_yaml"
}
]