sysgraph 0.0.14__tar.gz → 0.0.16__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. {sysgraph-0.0.14/src/sysgraph.egg-info → sysgraph-0.0.16}/PKG-INFO +32 -1
  2. {sysgraph-0.0.14 → sysgraph-0.0.16}/README.md +31 -0
  3. sysgraph-0.0.16/src/sysgraph/__init__.py +1 -0
  4. sysgraph-0.0.16/src/sysgraph/dist/assets/index-D4kwmDWy.css +1 -0
  5. sysgraph-0.0.14/src/sysgraph/dist/assets/index-DbxwxpDd.js → sysgraph-0.0.16/src/sysgraph/dist/assets/index-D5t1fx8g.js +99 -99
  6. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph/dist/index.html +26 -10
  7. {sysgraph-0.0.14 → sysgraph-0.0.16/src/sysgraph.egg-info}/PKG-INFO +32 -1
  8. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph.egg-info/SOURCES.txt +2 -2
  9. sysgraph-0.0.14/src/sysgraph/__init__.py +0 -1
  10. sysgraph-0.0.14/src/sysgraph/dist/assets/index-Ba1ztXgb.css +0 -1
  11. {sysgraph-0.0.14 → sysgraph-0.0.16}/LICENSE +0 -0
  12. {sysgraph-0.0.14 → sysgraph-0.0.16}/MANIFEST.in +0 -0
  13. {sysgraph-0.0.14 → sysgraph-0.0.16}/pyproject.toml +0 -0
  14. {sysgraph-0.0.14 → sysgraph-0.0.16}/setup.cfg +0 -0
  15. {sysgraph-0.0.14 → sysgraph-0.0.16}/setup.py +0 -0
  16. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph/__main__.py +0 -0
  17. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph/app.py +0 -0
  18. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph/constants.py +0 -0
  19. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph/discovery.py +0 -0
  20. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph/dist/assets/icon-TKtfQOgj.png +0 -0
  21. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph/graph.py +0 -0
  22. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph/main.py +0 -0
  23. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph/model.py +0 -0
  24. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph.egg-info/dependency_links.txt +0 -0
  25. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph.egg-info/entry_points.txt +0 -0
  26. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph.egg-info/not-zip-safe +0 -0
  27. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph.egg-info/requires.txt +0 -0
  28. {sysgraph-0.0.14 → sysgraph-0.0.16}/src/sysgraph.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sysgraph
3
- Version: 0.0.14
3
+ Version: 0.0.16
4
4
  Summary: Visualizer for processes and their interconnections
5
5
  Home-page: https://github.com/gubenkoved/sysgraph
6
6
  Author: Eugene Gubenkov
@@ -106,6 +106,37 @@ The `--pid=host` and `--net=host` flags allow the container to see host processe
106
106
  2. It builds a graph of processes (nodes) and their IPC channels (edges).
107
107
  3. The **browser frontend** fetches the graph via `GET /api/graph` and renders it using [force-graph](https://github.com/vasturiano/force-graph) with d3 physics simulation.
108
108
 
109
+ ## Development
110
+
111
+ ### Prerequisites
112
+ - Python ≥ 3.12, Linux, Docker
113
+ - Node.js 22 runs inside Docker; no host installation required
114
+
115
+ ### Backend
116
+ ```bash
117
+ python3 -m venv .venv && source .venv/bin/activate
118
+ pip install -e . && pip install -r requirements-dev.in
119
+ python src/sysgraph/app.py # → http://localhost:8000
120
+ ```
121
+
122
+ ### Frontend (TypeScript + Vite)
123
+ ```bash
124
+ ./scripts/build-ui.sh # production build → src/sysgraph/dist/
125
+ ./scripts/dev-ui.sh # Vite dev server with HMR on :5173
126
+ ./scripts/typecheck-ui.sh # TypeScript type checking
127
+ ./scripts/lint-ui.sh # Biome linter (pass --fix to auto-fix)
128
+ ```
129
+
130
+ ### Tests
131
+ ```bash
132
+ pytest src/sysgraph/tests/ # requires Linux /proc
133
+ ```
134
+
135
+ ### Python linting
136
+ ```bash
137
+ ./scripts/lint.sh # ruff check + ruff format + isort
138
+ ```
139
+
109
140
  ## License
110
141
 
111
142
  [MIT](LICENSE)
@@ -63,6 +63,37 @@ The `--pid=host` and `--net=host` flags allow the container to see host processe
63
63
  2. It builds a graph of processes (nodes) and their IPC channels (edges).
64
64
  3. The **browser frontend** fetches the graph via `GET /api/graph` and renders it using [force-graph](https://github.com/vasturiano/force-graph) with d3 physics simulation.
65
65
 
66
+ ## Development
67
+
68
+ ### Prerequisites
69
+ - Python ≥ 3.12, Linux, Docker
70
+ - Node.js 22 runs inside Docker; no host installation required
71
+
72
+ ### Backend
73
+ ```bash
74
+ python3 -m venv .venv && source .venv/bin/activate
75
+ pip install -e . && pip install -r requirements-dev.in
76
+ python src/sysgraph/app.py # → http://localhost:8000
77
+ ```
78
+
79
+ ### Frontend (TypeScript + Vite)
80
+ ```bash
81
+ ./scripts/build-ui.sh # production build → src/sysgraph/dist/
82
+ ./scripts/dev-ui.sh # Vite dev server with HMR on :5173
83
+ ./scripts/typecheck-ui.sh # TypeScript type checking
84
+ ./scripts/lint-ui.sh # Biome linter (pass --fix to auto-fix)
85
+ ```
86
+
87
+ ### Tests
88
+ ```bash
89
+ pytest src/sysgraph/tests/ # requires Linux /proc
90
+ ```
91
+
92
+ ### Python linting
93
+ ```bash
94
+ ./scripts/lint.sh # ruff check + ruff format + isort
95
+ ```
96
+
66
97
  ## License
67
98
 
68
99
  [MIT](LICENSE)
@@ -0,0 +1 @@
1
+ __version__ = "0.0.16"
@@ -0,0 +1 @@
1
+ :root{--z-toolbar: 100;--z-search-help: 150;--z-context-menu: 200;--z-details-panel: 50;--z-selection-overlay: 10;--z-version-badge: 10;--z-zoom-indicator: 10;--bg-toolbar: rgba(255, 255, 255, .95);--bg-panel: rgba(255, 255, 255, .97);--border-subtle: rgba(0, 0, 0, .08);--border-light: rgba(0, 0, 0, .1);--border-medium: rgba(0, 0, 0, .12);--shadow-xs: rgba(0, 0, 0, .08);--shadow-sm: rgba(0, 0, 0, .14);--shadow-md: rgba(0, 0, 0, .15);--accent-primary: #1a56db;--accent-info: #1a73e8;--accent-danger: #dc2626;--toolbar-height: 48px;--spacing-xs: 4px;--spacing-sm: 6px;--spacing-md: 8px;--spacing-lg: 16px;--font-family: "Ubuntu", "Segoe UI", "Arial", sans-serif;--font-size-xs: 11px;--font-size-sm: 12px;--font-size-md: 13px;--radius-sm: 4px;--radius-md: 8px;--radius-lg: 12px;--button-height: 28px;--icon-button-size: 24px;--tp-base-background-color: hsla(230, 5%, 90%, 1);--tp-base-shadow-color: hsla(0, 0%, 0%, .1);--tp-button-background-color: hsla(230, 7%, 75%, 1);--tp-button-background-color-active: hsla(230, 7%, 60%, 1);--tp-button-background-color-focus: hsla(230, 7%, 65%, 1);--tp-button-background-color-hover: hsla(230, 7%, 70%, 1);--tp-button-foreground-color: hsla(230, 10%, 30%, 1);--tp-container-background-color: hsla(230, 15%, 30%, .2);--tp-container-background-color-active: hsla(230, 15%, 30%, .32);--tp-container-background-color-focus: hsla(230, 15%, 30%, .28);--tp-container-background-color-hover: hsla(230, 15%, 30%, .24);--tp-container-foreground-color: hsla(230, 10%, 30%, 1);--tp-groove-foreground-color: hsla(230, 15%, 30%, .1);--tp-input-background-color: hsla(230, 15%, 30%, .1);--tp-input-background-color-active: hsla(230, 15%, 30%, .22);--tp-input-background-color-focus: hsla(230, 15%, 30%, .18);--tp-input-background-color-hover: hsla(230, 15%, 30%, .14);--tp-input-foreground-color: hsla(230, 10%, 30%, 1);--tp-label-foreground-color: hsla(230, 10%, 30%, .7);--tp-monitor-background-color: hsla(230, 15%, 30%, .1);--tp-monitor-foreground-color: hsla(230, 10%, 30%, .5)}html,body{height:100%;margin:0;overflow:hidden;font-family:var(--font-family)}#toolbar{position:fixed;top:0;left:0;right:0;height:var(--toolbar-height);z-index:var(--z-toolbar);background:var(--bg-toolbar);border-bottom:1px solid var(--border-light);display:flex;align-items:center;padding:0 var(--spacing-lg);gap:var(--spacing-sm);box-shadow:0 1px 3px var(--shadow-xs)}#toolbar md-outlined-button{--md-outlined-button-container-height: var(--button-height);--md-outlined-button-label-text-size: var(--font-size-sm);--md-outlined-button-label-text-weight: 500;--md-outlined-button-icon-size: 16px;--md-outlined-button-leading-space: 10px;--md-outlined-button-trailing-space: 12px;--md-outlined-button-icon-offset: -2px;--md-outlined-button-container-shape: var(--radius-sm)}md-outlined-button.active{--md-outlined-button-container-color: #d0e1ff;--md-outlined-button-label-text-color: var(--accent-primary);--md-outlined-button-outline-color: var(--accent-primary);--md-outlined-button-icon-color: var(--accent-primary)}md-outlined-button.danger{--md-outlined-button-label-text-color: var(--accent-danger);--md-outlined-button-outline-color: var(--accent-danger);--md-outlined-button-icon-color: var(--accent-danger)}.toolbar-separator{width:1px;height:var(--icon-button-size);background:var(--border-light)}#searchInput{width:240px;height:var(--button-height);--md-outlined-text-field-container-shape: var(--radius-sm);--md-outlined-text-field-top-space: var(--spacing-xs);--md-outlined-text-field-bottom-space: var(--spacing-xs);--md-outlined-text-field-input-text-size: var(--font-size-sm);--md-outlined-text-field-label-text-size: var(--font-size-sm)}#searchHelpTrigger{--md-icon-button-icon-size: 18px;--md-icon-button-state-layer-height: var(--button-height);--md-icon-button-state-layer-width: var(--button-height);height:var(--button-height);width:var(--button-height)}.search-help-anchor{position:relative;display:inline-flex}#searchHelp{display:none;position:absolute;top:100%;left:0;margin-top:var(--spacing-xs);z-index:var(--z-search-help);border:1px solid var(--border-medium);border-radius:var(--radius-md);padding:10px 14px;box-shadow:0 4px 12px var(--shadow-md);font-size:var(--font-size-sm);line-height:1.5;background:#1e293b;color:#fff}#searchHelp.open{display:block}#searchHelp code{background:#ffffff1f;padding:1px var(--spacing-xs);border-radius:3px}#content{position:fixed;top:var(--toolbar-height);left:0;right:0;bottom:0}#graph{width:100%;height:100%;position:relative}.details-panel{position:absolute;top:var(--spacing-md);left:var(--spacing-md);width:fit-content;max-width:420px;height:auto;min-width:200px;min-height:120px;max-height:min(350px,calc(100% - var(--spacing-lg)));z-index:var(--z-details-panel);background:var(--bg-panel);box-shadow:0 2px 12px var(--shadow-sm);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);display:none;flex-direction:column;overflow:hidden;resize:both}.details-panel.open{display:flex}.details-panel .panel-header{display:flex;align-items:center;height:var(--button-height);padding:0 2px 0 10px;border-bottom:1px solid var(--border-subtle);flex-shrink:0;cursor:grab;-webkit-user-select:none;user-select:none}.details-panel .panel-header:active{cursor:grabbing}.details-panel .panel-title{font-size:var(--font-size-sm);font-weight:500;color:#333;flex:1}.details-panel md-icon-button{--md-icon-button-icon-size: 16px;--md-icon-button-state-layer-height: var(--icon-button-size);--md-icon-button-state-layer-width: var(--icon-button-size);height:var(--icon-button-size);width:var(--icon-button-size)}.details-panel .panel-body{flex:1;overflow-y:auto;min-height:0;padding:var(--spacing-md);font-family:var(--font-family)}#detailsPanel{border-left:3px solid var(--accent-info)}#detailsPanel .panel-header{background:#1a73e80f}#contextMenu{display:none;position:fixed;z-index:var(--z-context-menu);background:var(--bg-panel);border:1px solid var(--border-medium);border-radius:var(--spacing-sm);padding:var(--spacing-xs) 0;box-shadow:0 4px 12px var(--shadow-md);min-width:160px;font-size:var(--font-size-md)}.context-menu-item{padding:var(--spacing-sm) 14px;cursor:pointer;-webkit-user-select:none;user-select:none}.context-menu-item:hover{background:#0000000f}.context-menu-divider{height:1px;margin:var(--spacing-xs) 0;background:var(--border-medium)}.tp-rotv{font-family:var(--font-family)!important;opacity:.9}#settingsPane{max-height:calc(100% - 20px);position:absolute;overflow-y:auto;right:10px;top:10px}#version-badge{position:fixed;bottom:var(--spacing-sm);right:var(--spacing-md);font-size:var(--font-size-xs);color:#0000004d;pointer-events:none;z-index:var(--z-version-badge);font-family:var(--font-family)}#zoom-indicator{position:fixed;bottom:var(--spacing-md);left:var(--spacing-md);z-index:var(--z-zoom-indicator);display:flex;align-items:center;gap:0;background:var(--bg-toolbar);border:1px solid var(--border-subtle);border-radius:var(--radius-md);box-shadow:0 1px 4px var(--shadow-xs);padding:0 var(--spacing-xs)}#zoom-indicator md-icon-button{--md-icon-button-icon-size: 16px;--md-icon-button-state-layer-height: var(--button-height);--md-icon-button-state-layer-width: var(--button-height);height:var(--button-height);width:var(--button-height)}#zoomLevel{font-size:var(--font-size-xs);font-family:var(--font-family);color:#555;min-width:34px;text-align:center;-webkit-user-select:none;user-select:none;cursor:pointer;border-radius:var(--radius-sm);padding:2px var(--spacing-xs);transition:background .1s}#zoomLevel:hover{background:#0000000f}.muted{color:#666}hr{border:none;border-top:1px solid var(--border-subtle);margin:var(--spacing-sm) 0}