git-cleaner-tui 2.2.0__tar.gz → 2.4.0__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 (47) hide show
  1. git_cleaner_tui-2.4.0/.env +1 -0
  2. git_cleaner_tui-2.4.0/.github/workflows/release.yml +23 -0
  3. git_cleaner_tui-2.4.0/.graphify_uncached.txt +5 -0
  4. git_cleaner_tui-2.4.0/.opencode/.gitignore +5 -0
  5. git_cleaner_tui-2.4.0/.opencode/plugins/graphify.js +22 -0
  6. git_cleaner_tui-2.4.0/AGENTS.md +79 -0
  7. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/PKG-INFO +1 -1
  8. git_cleaner_tui-2.4.0/graphify-out/GRAPH_REPORT.md +171 -0
  9. git_cleaner_tui-2.4.0/graphify-out/cache/0f012533be5fcb3459a4bb3da7bc957d451598acec210864f9d0e222cc67ead8.json +1 -0
  10. git_cleaner_tui-2.4.0/graphify-out/cache/247f3e76aa463e92992ca778651e7febe12f93b7a9e0ee16862943a72a8b9b83.json +1 -0
  11. git_cleaner_tui-2.4.0/graphify-out/cache/269075f0058c05f880cccceee5d52f0a531288b190136664300144a39de300cb.json +1 -0
  12. git_cleaner_tui-2.4.0/graphify-out/cache/366a2072f9bf3f07312f17b95ec04d347c3dcd6ede25ccd369454b6455801d1b.json +1 -0
  13. git_cleaner_tui-2.4.0/graphify-out/cache/3d83cd38256a990ea1c07285b9319eeb1ec6b399736039bc5d52605d1c3cd022.json +1 -0
  14. git_cleaner_tui-2.4.0/graphify-out/cache/4994e78248fe57734ee56ef13e90e9f324ec1addbcb986e6eed705da5d302504.json +1 -0
  15. git_cleaner_tui-2.4.0/graphify-out/cache/4f6b2dcf5005aa2728236eca6d11fa987d2ec6397e21c067ecc3a6da77d8d867.json +1 -0
  16. git_cleaner_tui-2.4.0/graphify-out/cache/67a7e24cf77023d0e2dd5d5553f3cd9e4b571f5e94fe568a84f7320258323b3f.json +1 -0
  17. git_cleaner_tui-2.4.0/graphify-out/cache/81421ad4e439db75ba9403e95b968d83a34c3148768d65a1c33c1bcb3640e896.json +1 -0
  18. git_cleaner_tui-2.4.0/graphify-out/cache/819cebf2e5f97ef60f221ac1269a5256a8ee2bf6ae1d70f25021e3039e9a22ed.json +1 -0
  19. git_cleaner_tui-2.4.0/graphify-out/cache/c77c733b637164943e0e50983ddfc18e6feb0912066d38ba54f4bff79700d1a1.json +1 -0
  20. git_cleaner_tui-2.4.0/graphify-out/cache/ed23a449f35b32f027d97db1fe9239516f48c59d21f0120304e5b7c57246512f.json +1 -0
  21. git_cleaner_tui-2.4.0/graphify-out/cost.json +12 -0
  22. git_cleaner_tui-2.4.0/graphify-out/graph.html +257 -0
  23. git_cleaner_tui-2.4.0/graphify-out/graph.json +7296 -0
  24. git_cleaner_tui-2.4.0/graphify-out/manifest.json +19 -0
  25. git_cleaner_tui-2.4.0/opencode.json +6 -0
  26. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/pyproject.toml +1 -1
  27. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/src/git_cleaner/app.py +10 -10
  28. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/uv.lock +1 -1
  29. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/.gitignore +0 -0
  30. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/.superpowers/brainstorm/-1783610394.49273/state/server-stopped +0 -0
  31. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/.superpowers/brainstorm/brainstorm-1783610443.14345/state/server-stopped +0 -0
  32. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/.superpowers/brainstorm/brainstorm-1783610443.14345/state/server.err +0 -0
  33. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/.superpowers/brainstorm/brainstorm-1783610443.14345/state/server.log +0 -0
  34. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/.superpowers/brainstorm/brainstorm-1783610469.94912/content/sidebar-layouts.html +0 -0
  35. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/.superpowers/brainstorm/brainstorm-1783610469.94912/content/waiting.html +0 -0
  36. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/.superpowers/brainstorm/brainstorm-1783610469.94912/state/events +0 -0
  37. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/.superpowers/brainstorm/brainstorm-1783610469.94912/state/server-stopped +0 -0
  38. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/README.md +0 -0
  39. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/logo/logo.png +0 -0
  40. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/src/git_cleaner/__init__.py +0 -0
  41. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/src/git_cleaner/__main__.py +0 -0
  42. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/src/git_cleaner/cli.py +0 -0
  43. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/src/git_cleaner/config.py +0 -0
  44. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/src/git_cleaner/git_ops.py +0 -0
  45. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/tests/__init__.py +0 -0
  46. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/tests/test_config.py +0 -0
  47. {git_cleaner_tui-2.2.0 → git_cleaner_tui-2.4.0}/tests/test_git_ops.py +0 -0
@@ -0,0 +1 @@
1
+ PYPI_TOKEN=pypi-AgEIcHlwaS5vcmcCJDA0NmQ4ZWM5LTMzNmItNGNiZC05NmI5LTZjZTMzOWE3MmI0ZAACKlszLCI0NzQ0MTczNi0zYmNiLTQzZGItOWJhYS1jMmIxYTA3YzA2ZjUiXQAABiCNqoFBxGQrz8o0sQnbBlie_Tk39L0SoaKSYd5sFj7iBw
@@ -0,0 +1,23 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ jobs:
8
+ release:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: write
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.12"
18
+
19
+ - run: pip install build; python -m build -o dist .
20
+
21
+ - uses: softprops/action-gh-release@v2
22
+ with:
23
+ files: dist/*
@@ -0,0 +1,5 @@
1
+ AGENTS.md
2
+ README.md
3
+ docs\superpowers\plans\2026-06-20-git-cleaner.md
4
+ docs\superpowers\specs\2026-06-20-git-cleaner-design.md
5
+ logo\logo.png
@@ -0,0 +1,5 @@
1
+ node_modules
2
+ package.json
3
+ package-lock.json
4
+ bun.lock
5
+ .gitignore
@@ -0,0 +1,22 @@
1
+ // graphify OpenCode plugin
2
+ // Injects a knowledge graph reminder before bash tool calls when the graph exists.
3
+ import { existsSync } from "fs";
4
+ import { join } from "path";
5
+
6
+ export const GraphifyPlugin = async ({ directory }) => {
7
+ let reminded = false;
8
+
9
+ return {
10
+ "tool.execute.before": async (input, output) => {
11
+ if (reminded) return;
12
+ if (!existsSync(join(directory, "graphify-out", "graph.json"))) return;
13
+
14
+ if (input.tool === "bash") {
15
+ output.args.command =
16
+ 'echo "[graphify] Knowledge graph available. Read graphify-out/GRAPH_REPORT.md for god nodes and architecture context before searching files." && ' +
17
+ output.args.command;
18
+ reminded = true;
19
+ }
20
+ },
21
+ };
22
+ };
@@ -0,0 +1,79 @@
1
+ # AGENTS.md — Git Cleaner (git-cleaner-tui)
2
+
3
+ ## Quick start
4
+
5
+ ```bash
6
+ uv sync --dev
7
+ uv run git-cleaner-tui # CWD must be a git repo
8
+ uv run git-cleaner-tui --repo /path
9
+ uv run pytest # 23 tests, <10s
10
+ ```
11
+
12
+ ## Package structure
13
+
14
+ ```
15
+ src/git_cleaner/
16
+ ├── cli.py # entrypoint: git_cleaner.cli:main (lazy-imports app.py)
17
+ ├── app.py # Textual App (~1450 lines), all screens/widgets in one file
18
+ ├── git_ops.py # BranchInfo/StashInfo dataclasses, git subprocess wrappers
19
+ ├── config.py # TOML config: protected, blacklist, theme, bookmarks
20
+ └── __main__.py # python -m git_cleaner support
21
+ ```
22
+
23
+ - Build: `hatchling`, no extra config
24
+ - Dependencies: `textual`, `textual-timepiece`, `whenever`
25
+ - Dev dependencies: `pytest` only — no linter, no typechecker, no formatter config in repo
26
+
27
+ ## Config
28
+
29
+ `~/.git-branch-cleaner.toml` (global) and/or repo `.git-branch-cleaner.toml`:
30
+
31
+ ```toml
32
+ [protected]
33
+ patterns = ["release/*", "hotfix/*"]
34
+
35
+ [blacklist]
36
+ patterns = ["archive/*"]
37
+
38
+ [theme]
39
+ name = "textual-dark"
40
+
41
+ [bookmarks]
42
+ paths = ['C:\\path\\to\\repo']
43
+ ```
44
+
45
+ **Gotcha:** `save_bookmarks()` writes TOML with **single-quoted literal strings** — critical for Windows backslash paths. Double-quoted strings would corrupt the config (backslashes escape). If editing `config.py`, preserve single-quote output in `save_bookmarks()`.
46
+
47
+ ## Tests
48
+
49
+ - Tests create **real git repos** in `tempfile.TemporaryDirectory` — no mocks, slow but thorough
50
+ - `test_git_ops.py` uses `_init_git_repo()` helper that calls `git init -b main`, adds commits, creates branches
51
+ - No test markers, no conftest, no fixtures
52
+ - Single command: `uv run pytest`
53
+
54
+ ## Key conventions
55
+
56
+ - All TUI screens/widgets live in one file (`app.py`). Adding a new content screen means adding a new class there.
57
+ - CSS is embedded as a module-level string in `app.py` (not separate `.tcss` files).
58
+ - Git operations use `subprocess.run` with `capture_output=True`, never `gitpython`.
59
+ - `BranchInfo` dataclass has optional fields: `author`, `ahead`, `behind`, `has_upstream`, `commit_hash`, `is_protected`, `is_blacklisted`.
60
+ - `list_branches()` uses a single `git for-each-ref` call with `--format` — the core perf trick.
61
+ - Version lives only in `pyproject.toml`. Bump there, build with `uv build`, publish with `uv publish --token`.
62
+
63
+ ## Publishing
64
+
65
+ ```bash
66
+ uv build
67
+ uv publish --token "$env:PYPI_TOKEN"
68
+ ```
69
+
70
+ Token lives in `.env` at repo root: `PYPI_TOKEN=pypi-...`. Loaded automatically by OpenCode / uv in dev sessions — no need to paste it.
71
+
72
+ ## graphify
73
+
74
+ This project has a graphify knowledge graph at graphify-out/.
75
+
76
+ Rules:
77
+ - Before answering architecture or codebase questions, read graphify-out/GRAPH_REPORT.md for god nodes and community structure
78
+ - If graphify-out/wiki/index.md exists, navigate it instead of reading raw files
79
+ - After modifying code files in this session, run `graphify update .` to keep the graph current (AST-only, no API cost)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: git-cleaner-tui
3
- Version: 2.2.0
3
+ Version: 2.4.0
4
4
  Summary: TUI tool for browsing and bulk-deleting git branches
5
5
  Author: git-cleaner
6
6
  Requires-Python: >=3.11
@@ -0,0 +1,171 @@
1
+ # Graph Report - . (2026-07-13)
2
+
3
+ ## Corpus Check
4
+ - 17 files · ~192,440 words
5
+ - Verdict: corpus is large enough that graph structure adds value.
6
+
7
+ ## Summary
8
+ - 230 nodes · 424 edges · 18 communities detected
9
+ - Extraction: 73% EXTRACTED · 27% INFERRED · 0% AMBIGUOUS · INFERRED: 113 edges (avg confidence: 0.65)
10
+ - Token cost: 0 input · 0 output
11
+
12
+ ## Community Hubs (Navigation)
13
+ - [[_COMMUNITY_Branch Browser Widget|Branch Browser Widget]]
14
+ - [[_COMMUNITY_App Scaffold & Dialogs|App Scaffold & Dialogs]]
15
+ - [[_COMMUNITY_Config & Bookmarks Module|Config & Bookmarks Module]]
16
+ - [[_COMMUNITY_Git Maintenance Operations|Git Maintenance Operations]]
17
+ - [[_COMMUNITY_Core Git Wrappers|Core Git Wrappers]]
18
+ - [[_COMMUNITY_UI Footer Components|UI Footer Components]]
19
+ - [[_COMMUNITY_Project Features Documentation|Project Features Documentation]]
20
+ - [[_COMMUNITY_Maintenance Dashboard Widget|Maintenance Dashboard Widget]]
21
+ - [[_COMMUNITY_README & Agent Instructions|README & Agent Instructions]]
22
+ - [[_COMMUNITY_Helper AST Extraction|Helper: AST Extraction]]
23
+ - [[_COMMUNITY_Helper File Detection|Helper: File Detection]]
24
+ - [[_COMMUNITY_Helper Sem Cache Check|Helper: Sem Cache Check]]
25
+ - [[_COMMUNITY_Init Helper Script|Init Helper Script]]
26
+ - [[_COMMUNITY_Init Helper Script|Init Helper Script]]
27
+ - [[_COMMUNITY_Init Helper Script|Init Helper Script]]
28
+ - [[_COMMUNITY_Maintenance Feature Doc|Maintenance Feature Doc]]
29
+ - [[_COMMUNITY_Stash Browser Feature Doc|Stash Browser Feature Doc]]
30
+ - [[_COMMUNITY_Multi-Repo Bookmarks Doc|Multi-Repo Bookmarks Doc]]
31
+
32
+ ## God Nodes (most connected - your core abstractions)
33
+ 1. `BranchInfo` - 33 edges
34
+ 2. `StashInfo` - 29 edges
35
+ 3. `BranchesContent` - 28 edges
36
+ 4. `MaintenanceContent` - 21 edges
37
+ 5. `MainScreen` - 19 edges
38
+ 6. `_init_git_repo()` - 16 edges
39
+ 7. `StashContent` - 11 edges
40
+ 8. `GitCleanerApp` - 10 edges
41
+ 9. `RepoSwitcher` - 9 edges
42
+ 10. `RepoFooter` - 8 edges
43
+
44
+ ## Surprising Connections (you probably didn't know these)
45
+ - `Initialize a git repo with some branches for testing.` --uses--> `BranchInfo` [INFERRED]
46
+ tests\test_git_ops.py → src\git_cleaner\git_ops.py
47
+ - `Deleting current branch should fail.` --uses--> `BranchInfo` [INFERRED]
48
+ tests\test_git_ops.py → src\git_cleaner\git_ops.py
49
+ - `delete_remote_branches should fail when there's no remote configured.` --uses--> `BranchInfo` [INFERRED]
50
+ tests\test_git_ops.py → src\git_cleaner\git_ops.py
51
+ - `RepoFooter` --uses--> `BranchInfo` [INFERRED]
52
+ src\git_cleaner\app.py → src\git_cleaner\git_ops.py
53
+ - `RepoFooter` --uses--> `StashInfo` [INFERRED]
54
+ src\git_cleaner\app.py → src\git_cleaner\git_ops.py
55
+
56
+ ## Hyperedges (group relationships)
57
+ - **Git Cleaner Core Architecture** — config_module, git_ops_module, tui_app, cli_entry_point [EXTRACTED 0.90]
58
+
59
+ ## Communities
60
+
61
+ ### Community 0 - "Branch Browser Widget"
62
+ Cohesion: 0.09
63
+ Nodes (8): _age_from(), BranchesContent, _is_stale(), MainScreen, _on_author_changed(), _on_search_changed(), _upstream_str(), Screen
64
+
65
+ ### Community 1 - "App Scaffold & Dialogs"
66
+ Cohesion: 0.1
67
+ Nodes (29): App, ConfirmationDialog, GitCleanerApp, Stashes tab: list stashes with drop/apply/pop actions., Single screen with tabbed content: Branches, Maintenance, Stashes., Modal dialog to confirm branch deletion., Modal to manage bookmarked repos and switch between them., Main TUI application for git branch cleaning. (+21 more)
68
+
69
+ ### Community 2 - "Config & Bookmarks Module"
70
+ Cohesion: 0.1
71
+ Nodes (26): add_bookmark(), get_blacklist_patterns(), get_protected_patterns(), load_bookmarks(), load_theme(), _load_toml(), matches_any(), Add a repo path to bookmarks if not already present. (+18 more)
72
+
73
+ ### Community 3 - "Git Maintenance Operations"
74
+ Cohesion: 0.09
75
+ Nodes (26): apply_stash(), expire_reflog(), get_branch_details(), get_git_dir_size(), get_object_stats(), _human_size(), list_stashes(), _parse_stash_subject() (+18 more)
76
+
77
+ ### Community 4 - "Core Git Wrappers"
78
+ Cohesion: 0.12
79
+ Nodes (29): delete_branches(), delete_remote_branches(), get_repo_root(), list_branches(), Delete local branches by name. Returns list of names that failed to delete., Delete remote branches via git push origin --delete. Returns list of names, Find the git working tree root for a given path., Run ``git gc`` (optionally ``--aggressive``). When *on_output* is provided, (+21 more)
80
+
81
+ ### Community 5 - "UI Footer Components"
82
+ Cohesion: 0.14
83
+ Nodes (3): RepoFooter, StashContent, Footer
84
+
85
+ ### Community 6 - "Project Features Documentation"
86
+ Cohesion: 0.14
87
+ Nodes (17): Blacklisted Branch Patterns, Branch Browser Feature, Branch Deletion Undo, BranchInfo Dataclass, CLI Entry Point (cli.py), Config Module (config.py), CSV/JSON Export, Date Range Filtering (+9 more)
88
+
89
+ ### Community 7 - "Maintenance Dashboard Widget"
90
+ Cohesion: 0.23
91
+ Nodes (2): MaintenanceContent, Vertical
92
+
93
+ ### Community 8 - "README & Agent Instructions"
94
+ Cohesion: 0.5
95
+ Nodes (4): AGENTS.md - Agent Instructions, README.md - Project Documentation, Git Cleaner TUI Project, Git Cleaner Logo
96
+
97
+ ### Community 9 - "Helper: AST Extraction"
98
+ Cohesion: 1.0
99
+ Nodes (0):
100
+
101
+ ### Community 10 - "Helper: File Detection"
102
+ Cohesion: 1.0
103
+ Nodes (0):
104
+
105
+ ### Community 11 - "Helper: Sem Cache Check"
106
+ Cohesion: 1.0
107
+ Nodes (0):
108
+
109
+ ### Community 12 - "Init Helper Script"
110
+ Cohesion: 1.0
111
+ Nodes (0):
112
+
113
+ ### Community 13 - "Init Helper Script"
114
+ Cohesion: 1.0
115
+ Nodes (0):
116
+
117
+ ### Community 14 - "Init Helper Script"
118
+ Cohesion: 1.0
119
+ Nodes (0):
120
+
121
+ ### Community 15 - "Maintenance Feature Doc"
122
+ Cohesion: 1.0
123
+ Nodes (1): Maintenance Dashboard Feature
124
+
125
+ ### Community 16 - "Stash Browser Feature Doc"
126
+ Cohesion: 1.0
127
+ Nodes (1): Stash Browser Feature
128
+
129
+ ### Community 17 - "Multi-Repo Bookmarks Doc"
130
+ Cohesion: 1.0
131
+ Nodes (1): Multi-Repo Bookmarks Feature
132
+
133
+ ## Knowledge Gaps
134
+ - **43 isolated node(s):** `Return merged list of protected branch patterns. Order of precedence (last`, `Return merged list of blacklist patterns from global + project config.`, `Check if a branch name matches any of the given fnmatch patterns.`, `Return the saved theme name, or the default.`, `Persist the theme name to the global config file.` (+38 more)
135
+ These have ≤1 connection - possible missing edges or undocumented components.
136
+ - **Thin community `Helper: AST Extraction`** (1 nodes): `_step_ast.py`
137
+ Too small to be a meaningful cluster - may be noise or needs more connections extracted.
138
+ - **Thin community `Helper: File Detection`** (1 nodes): `_step_detect.py`
139
+ Too small to be a meaningful cluster - may be noise or needs more connections extracted.
140
+ - **Thin community `Helper: Sem Cache Check`** (1 nodes): `_step_sem_cache.py`
141
+ Too small to be a meaningful cluster - may be noise or needs more connections extracted.
142
+ - **Thin community `Init Helper Script`** (1 nodes): `__init__.py`
143
+ Too small to be a meaningful cluster - may be noise or needs more connections extracted.
144
+ - **Thin community `Init Helper Script`** (1 nodes): `__main__.py`
145
+ Too small to be a meaningful cluster - may be noise or needs more connections extracted.
146
+ - **Thin community `Init Helper Script`** (1 nodes): `__init__.py`
147
+ Too small to be a meaningful cluster - may be noise or needs more connections extracted.
148
+ - **Thin community `Maintenance Feature Doc`** (1 nodes): `Maintenance Dashboard Feature`
149
+ Too small to be a meaningful cluster - may be noise or needs more connections extracted.
150
+ - **Thin community `Stash Browser Feature Doc`** (1 nodes): `Stash Browser Feature`
151
+ Too small to be a meaningful cluster - may be noise or needs more connections extracted.
152
+ - **Thin community `Multi-Repo Bookmarks Doc`** (1 nodes): `Multi-Repo Bookmarks Feature`
153
+ Too small to be a meaningful cluster - may be noise or needs more connections extracted.
154
+
155
+ ## Suggested Questions
156
+ _Questions this graph is uniquely positioned to answer:_
157
+
158
+ - **Why does `BranchInfo` connect `App Scaffold & Dialogs` to `Branch Browser Widget`, `Git Maintenance Operations`, `Core Git Wrappers`, `UI Footer Components`, `Maintenance Dashboard Widget`?**
159
+ _High betweenness centrality (0.215) - this node is a cross-community bridge._
160
+ - **Why does `BranchesContent` connect `Branch Browser Widget` to `App Scaffold & Dialogs`, `UI Footer Components`, `Maintenance Dashboard Widget`?**
161
+ _High betweenness centrality (0.153) - this node is a cross-community bridge._
162
+ - **Why does `StashInfo` connect `App Scaffold & Dialogs` to `Branch Browser Widget`, `Git Maintenance Operations`, `UI Footer Components`, `Maintenance Dashboard Widget`?**
163
+ _High betweenness centrality (0.143) - this node is a cross-community bridge._
164
+ - **Are the 31 inferred relationships involving `BranchInfo` (e.g. with `RepoFooter` and `BranchesContent`) actually correct?**
165
+ _`BranchInfo` has 31 INFERRED edges - model-reasoned connections that need verification._
166
+ - **Are the 27 inferred relationships involving `StashInfo` (e.g. with `RepoFooter` and `BranchesContent`) actually correct?**
167
+ _`StashInfo` has 27 INFERRED edges - model-reasoned connections that need verification._
168
+ - **Are the 2 inferred relationships involving `BranchesContent` (e.g. with `BranchInfo` and `StashInfo`) actually correct?**
169
+ _`BranchesContent` has 2 INFERRED edges - model-reasoned connections that need verification._
170
+ - **Are the 2 inferred relationships involving `MaintenanceContent` (e.g. with `BranchInfo` and `StashInfo`) actually correct?**
171
+ _`MaintenanceContent` has 2 INFERRED edges - model-reasoned connections that need verification._
@@ -0,0 +1 @@
1
+ {"nodes": [{"id": "tests_init_py", "label": "__init__.py", "file_type": "code", "source_file": "tests\\__init__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
1
+ {"nodes": [{"id": "tests_test_config_py", "label": "test_config.py", "file_type": "code", "source_file": "tests\\test_config.py", "source_location": "L1"}, {"id": "test_config_test_default_protected_patterns", "label": "test_default_protected_patterns()", "file_type": "code", "source_file": "tests\\test_config.py", "source_location": "L6"}, {"id": "test_config_test_project_config_adds_protected_patterns", "label": "test_project_config_adds_protected_patterns()", "file_type": "code", "source_file": "tests\\test_config.py", "source_location": "L16"}, {"id": "test_config_test_blacklist_returns_empty_when_no_config", "label": "test_blacklist_returns_empty_when_no_config()", "file_type": "code", "source_file": "tests\\test_config.py", "source_location": "L27"}, {"id": "test_config_test_blacklist_from_project_config", "label": "test_blacklist_from_project_config()", "file_type": "code", "source_file": "tests\\test_config.py", "source_location": "L34"}, {"id": "test_config_test_matches_any_exact_match", "label": "test_matches_any_exact_match()", "file_type": "code", "source_file": "tests\\test_config.py", "source_location": "L44"}, {"id": "test_config_test_matches_any_wildcard", "label": "test_matches_any_wildcard()", "file_type": "code", "source_file": "tests\\test_config.py", "source_location": "L48"}, {"id": "test_config_test_matches_any_no_match", "label": "test_matches_any_no_match()", "file_type": "code", "source_file": "tests\\test_config.py", "source_location": "L52"}, {"id": "test_config_rationale_7", "label": "Should include main, master, develop by default with no config files.", "file_type": "rationale", "source_file": "tests\\test_config.py", "source_location": "L7"}, {"id": "test_config_rationale_17", "label": "Project-level .git-branch-cleaner.toml should add patterns.", "file_type": "rationale", "source_file": "tests\\test_config.py", "source_location": "L17"}], "edges": [{"source": "tests_test_config_py", "target": "tempfile", "relation": "imports", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L1", "weight": 1.0}, {"source": "tests_test_config_py", "target": "pathlib", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L2", "weight": 1.0}, {"source": "tests_test_config_py", "target": "git_cleaner_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L3", "weight": 1.0}, {"source": "tests_test_config_py", "target": "test_config_test_default_protected_patterns", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L6", "weight": 1.0}, {"source": "tests_test_config_py", "target": "test_config_test_project_config_adds_protected_patterns", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L16", "weight": 1.0}, {"source": "tests_test_config_py", "target": "test_config_test_blacklist_returns_empty_when_no_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L27", "weight": 1.0}, {"source": "tests_test_config_py", "target": "test_config_test_blacklist_from_project_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L34", "weight": 1.0}, {"source": "tests_test_config_py", "target": "test_config_test_matches_any_exact_match", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L44", "weight": 1.0}, {"source": "tests_test_config_py", "target": "test_config_test_matches_any_wildcard", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L48", "weight": 1.0}, {"source": "tests_test_config_py", "target": "test_config_test_matches_any_no_match", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L52", "weight": 1.0}, {"source": "test_config_rationale_7", "target": "test_config_test_default_protected_patterns", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L7", "weight": 1.0}, {"source": "test_config_rationale_17", "target": "test_config_test_project_config_adds_protected_patterns", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "tests\\test_config.py", "source_location": "L17", "weight": 1.0}], "raw_calls": [{"caller_nid": "test_config_test_default_protected_patterns", "callee": "TemporaryDirectory", "source_file": "tests\\test_config.py", "source_location": "L8"}, {"caller_nid": "test_config_test_default_protected_patterns", "callee": "Path", "source_file": "tests\\test_config.py", "source_location": "L9"}, {"caller_nid": "test_config_test_default_protected_patterns", "callee": "get_protected_patterns", "source_file": "tests\\test_config.py", "source_location": "L10"}, {"caller_nid": "test_config_test_project_config_adds_protected_patterns", "callee": "TemporaryDirectory", "source_file": "tests\\test_config.py", "source_location": "L18"}, {"caller_nid": "test_config_test_project_config_adds_protected_patterns", "callee": "Path", "source_file": "tests\\test_config.py", "source_location": "L19"}, {"caller_nid": "test_config_test_project_config_adds_protected_patterns", "callee": "write_text", "source_file": "tests\\test_config.py", "source_location": "L20"}, {"caller_nid": "test_config_test_project_config_adds_protected_patterns", "callee": "get_protected_patterns", "source_file": "tests\\test_config.py", "source_location": "L23"}, {"caller_nid": "test_config_test_blacklist_returns_empty_when_no_config", "callee": "TemporaryDirectory", "source_file": "tests\\test_config.py", "source_location": "L28"}, {"caller_nid": "test_config_test_blacklist_returns_empty_when_no_config", "callee": "Path", "source_file": "tests\\test_config.py", "source_location": "L29"}, {"caller_nid": "test_config_test_blacklist_returns_empty_when_no_config", "callee": "get_blacklist_patterns", "source_file": "tests\\test_config.py", "source_location": "L30"}, {"caller_nid": "test_config_test_blacklist_from_project_config", "callee": "TemporaryDirectory", "source_file": "tests\\test_config.py", "source_location": "L35"}, {"caller_nid": "test_config_test_blacklist_from_project_config", "callee": "Path", "source_file": "tests\\test_config.py", "source_location": "L36"}, {"caller_nid": "test_config_test_blacklist_from_project_config", "callee": "write_text", "source_file": "tests\\test_config.py", "source_location": "L37"}, {"caller_nid": "test_config_test_blacklist_from_project_config", "callee": "get_blacklist_patterns", "source_file": "tests\\test_config.py", "source_location": "L40"}, {"caller_nid": "test_config_test_matches_any_exact_match", "callee": "matches_any", "source_file": "tests\\test_config.py", "source_location": "L45"}, {"caller_nid": "test_config_test_matches_any_wildcard", "callee": "matches_any", "source_file": "tests\\test_config.py", "source_location": "L49"}, {"caller_nid": "test_config_test_matches_any_no_match", "callee": "matches_any", "source_file": "tests\\test_config.py", "source_location": "L53"}]}
@@ -0,0 +1 @@
1
+ {"nodes": [{"id": "graphify_out_step_ast_py", "label": "_step_ast.py", "file_type": "code", "source_file": "graphify-out\\_step_ast.py", "source_location": "L1"}], "edges": [{"source": "graphify_out_step_ast_py", "target": "json", "relation": "imports", "confidence": "EXTRACTED", "source_file": "graphify-out\\_step_ast.py", "source_location": "L1", "weight": 1.0}, {"source": "graphify_out_step_ast_py", "target": "graphify_extract", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "graphify-out\\_step_ast.py", "source_location": "L2", "weight": 1.0}, {"source": "graphify_out_step_ast_py", "target": "pathlib", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "graphify-out\\_step_ast.py", "source_location": "L3", "weight": 1.0}, {"source": "graphify_out_step_ast_py", "target": "ast", "relation": "imports", "confidence": "EXTRACTED", "source_file": "graphify-out\\_step_ast.py", "source_location": "L6", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
1
+ {"nodes": [{"id": "graphify_out_step_detect_py", "label": "_step_detect.py", "file_type": "code", "source_file": "graphify-out\\_step_detect.py", "source_location": "L1"}], "edges": [{"source": "graphify_out_step_detect_py", "target": "json", "relation": "imports", "confidence": "EXTRACTED", "source_file": "graphify-out\\_step_detect.py", "source_location": "L1", "weight": 1.0}, {"source": "graphify_out_step_detect_py", "target": "graphify_detect", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "graphify-out\\_step_detect.py", "source_location": "L2", "weight": 1.0}, {"source": "graphify_out_step_detect_py", "target": "pathlib", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "graphify-out\\_step_detect.py", "source_location": "L3", "weight": 1.0}], "raw_calls": []}