From 0bad84cad4b5797f3d0b650e3eefbf1eea9893a6 Mon Sep 17 00:00:00 2001 From: Tom Softreck Date: Sat, 19 Sep 2026 22:56:02 +0200 Subject: [PATCH 1/7] chore(PLF-157): record already-satisfied inspect_helpers split ticket completion in sprint state The koru-scan 'Split large module: inspect_helpers' finding (discovery 2026-09-19T12:42Z, evidence artifact sha256 28f5e52d) was captured against the pre-split snapshot (121L, 6 methods, CC=17) and is stale per its own staleness_check: the regenerated project/analysis.toon.yaml (sha256 85dcab30) LAYERS entry now reads inspect_helpers 25L 0C 0m CC=0.0 <-0. The requested split was already delivered by PLF-130 (commit d598aee, merged 6562be8): tag-based change filtering moved to tagi.utils.change_filter (120L, CC=5) and statistics aggregation/rendering to tagi.utils.change_stats (42L, CC=1), with inspect_helpers.py retained as a 25-line compatibility facade re-exporting all six public names. Focused regression tests shipped with that split: tests/test_change_filter.py (16 tests) and tests/test_change_stats.py (5 tests) pin filtering modes, tag normalization and stats rendering through the facade. Verified: a fresh code2llm scan of src (-f all --no-chunk --toon-yaml, temp output) reproduces the post-split rows (change_filter 120L CC=5, change_stats 42L CC=1, inspect_helpers 25L CC=0.0) with no large/hot flag on any of the three modules; 127/127 pytest pass (venv); ruff findings on the split modules are the pre-existing baseline (no files modified in this ticket). No source change is required. Marked PLF-157 done via planfile and staged only its ticket-block removal, leaving unrelated queue churn uncommitted. Co-authored-by: Koru Agent --- .planfile/sprints/current.yaml | 105 --------------------------------- 1 file changed, 105 deletions(-) diff --git a/.planfile/sprints/current.yaml b/.planfile/sprints/current.yaml index ddc0668..e14cec8 100644 --- a/.planfile/sprints/current.yaml +++ b/.planfile/sprints/current.yaml @@ -3777,111 +3777,6 @@ sprint: key: semcod/tagi#169 url: https://github.com/semcod/tagi/issues/169 updated_at: '2026-09-19T11:41:05.586678+00:00' - PLF-157: - assignee: null - backend: github - blocked_by: [] - blocks: [] - created_at: '2026-09-19T12:42:18.834682+00:00' - description: ' - - `project/analysis.toon.yaml` flags `inspect_helpers` in LAYERS as a large/hot - module (121 lines, 0 classes, 6 methods, CC=17). Extract cohesive submodules - around stable responsibilities and add focused regression tests before broad - edits. - - - --- - - - **Strategy Metadata:** - - - planfile_id: PLF-157 - - ' - execution: - attempt: 0 - max_attempts: 1 - queue: default - state: ready - executor: - kind: human - mode: interactive - external_id: '172' - files: - - src/tagi/utils/inspect_helpers.py - - project/analysis.toon.yaml - history: - - action: created - message: '`project/analysis.toon.yaml` flags `inspect_helpers` in LAYERS as - a large/hot module (121 lines, 0 classes, 6 methods, CC=17). Extract cohesive - submodules around stable responsibilities and add focused regression tests - before broad edits.' - source: koru task - timestamp: '2026-09-19T12:42:18.834682+00:00' - id: PLF-157 - inputs: - api_headers: {} - api_method: GET - api_timeout_seconds: 30.0 - env_keys: [] - prompt: '`project/analysis.toon.yaml` flags `inspect_helpers` in LAYERS as - a large/hot module (121 lines, 0 classes, 6 methods, CC=17). Extract cohesive - submodules around stable responsibilities and add focused regression tests - before broad edits.' - integration: - - github - labels: - - planfile - - managed - - koru - - nl-task - - llm-ready - - priority-high - - code2llm - - architecture - - large-module - - refactor - - scan - metadata: - deduplication_key: PLF-157 - name: 'Split large module: inspect_helpers' - outputs: - artifacts: [] - notes: [] - priority: high - source: - context: - dedupe_key: koru-scan:code2llm_layer_hotspot:src/tagi/utils/inspect_helpers.py:project/analysis.toon.yaml - evidence: - artifact: - mtime_ns: 1789820718961281621 - path: project/analysis.toon.yaml - sha256: 28f5e52d781bb3dc5180c4411848287482185ddd7898976d85fe5df0d5cd3580 - size_bytes: 10363 - kind: code2llm_analysis - regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project - --no-chunk --exclude '*.md' --planfile-apply --planfile-source koru-project-discovery - --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi - --planfile-limit 20 - schema: koru.ticket_evidence.v1 - staleness_check: Regenerate the artifact and compare artifact.sha256 before - assuming this ticket still reflects the current code. - input: '`project/analysis.toon.yaml` flags `inspect_helpers` in LAYERS as - a large/hot module (121 lines, 0 classes, 6 methods, CC=17). Extract cohesive - submodules around stable responsibilities and add focused regression tests - before broad edits.' - signal: code2llm_layer_hotspot - timestamp: '2026-09-19T12:42:18.834682+00:00' - tool: koru-scan - sprint: current - status: open - sync: - github: - id: '172' - key: semcod/tagi#172 - url: https://github.com/semcod/tagi/issues/172 - updated_at: '2026-09-19T12:42:18.834682+00:00' PLF-158: acceptance_criteria: [] blocked_by: [] From 4235663d5b080e8fafe85f143258c78bc00976a0 Mon Sep 17 00:00:00 2001 From: Tom Softreck Date: Sat, 19 Sep 2026 22:59:17 +0200 Subject: [PATCH 2/7] chore(PLF-158): record already-satisfied path_lower smell ticket completion in sprint state The code2llm 'Shotgun Surgery: path_lower' finding (src/tagi/heuristics/metrics.py:33, dedupe key code2llm:smell:shotgun_surgery:src/tagi/heuristics/metrics.py:33) was captured against the pre-fix metrics.py, before the refactor landed. The path_lower shotgun surgery (8 functions) was already removed by d122d74 (PLF-146), which centralized lowercased-path matching in tagi.utils.paths (path_key/path_matches/path_endswith) and routed config, heuristics tags and metrics call sites through it. Current src/ contains no path_lower binding (only a docstring reference to the removed smell in utils/paths.py). No source change is required; this mirrors the identical already-satisfied PLF-155 finding (tags.py:57). Verified: rg finds zero path_lower bindings in src/; a fresh code2llm run with the documented discovery flags (-f all --no-chunk --exclude '*.md' --exclude plugins, temp output) reports zero shotgun-surgery findings and its generated planfile tickets contain no path_lower smell; 127/127 pytest pass (venv); ruff on metrics.py/utils/paths.py/tags.py/config.py reports only the pre-existing baseline (I001, UP035, UP006, F401, BLE001, UP045) identical at HEAD. Marked PLF-158 done via planfile and staged only its ticket-block removal, leaving unrelated queue churn uncommitted. Co-authored-by: Koru Agent --- .planfile/sprints/current.yaml | 43 ---------------------------------- 1 file changed, 43 deletions(-) diff --git a/.planfile/sprints/current.yaml b/.planfile/sprints/current.yaml index e14cec8..812df8c 100644 --- a/.planfile/sprints/current.yaml +++ b/.planfile/sprints/current.yaml @@ -3777,49 +3777,6 @@ sprint: key: semcod/tagi#169 url: https://github.com/semcod/tagi/issues/169 updated_at: '2026-09-19T11:41:05.586678+00:00' - PLF-158: - acceptance_criteria: [] - blocked_by: [] - blocks: [] - children: [] - contract_version: planfile.ticket/v1 - created_at: '2026-09-19T17:29:11.164575Z' - description: 'code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:33`. - - - Mutation of variable ''path_lower'' spans 8 functions. Changing this logic - requires work in many places. - - - Make the smallest refactor that removes the smell and run local tests. - - - code2llm-dedupe: code2llm:smell:shotgun_surgery:src/tagi/heuristics/metrics.py:33:Shotgun - Surgery: path_lower' - dsl: SODL/1 id=evt_1a6aaf76c4ba5b63b56256bc event_hash=7d65339256becf3c499f5189e7c46b90588d4a52675bacd47945b39cbfdb3882 - timestamp=2026-09-19T17%3A29%3A11.164575%2B00%3A00 kind=task source=planfile.ticket - ticket_id=PLF-158 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-158%2Fcommand%2Fcreate - mode=apply status=open correlation_id=PLF-158 causation_id=- input_hash=9ac39162431fbacf71cb140d6f58f295cc0f944ad37b22cbe0a4b4d07a17d58c - receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTEuMTY0NTc1WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgU2hvdGd1biBTdXJnZXJ5OiBwYXRoX2xvd2VyYCBpbiBgc3JjL3RhZ2kvaGV1cmlzdGljcy9tZXRyaWNzLnB5OjMzYC5cblxuTXV0YXRpb24gb2YgdmFyaWFibGUgJ3BhdGhfbG93ZXInIHNwYW5zIDggZnVuY3Rpb25zLiBDaGFuZ2luZyB0aGlzIGxvZ2ljIHJlcXVpcmVzIHdvcmsgaW4gbWFueSBwbGFjZXMuXG5cbk1ha2UgdGhlIHNtYWxsZXN0IHJlZmFjdG9yIHRoYXQgcmVtb3ZlcyB0aGUgc21lbGwgYW5kIHJ1biBsb2NhbCB0ZXN0cy5cblxuY29kZTJsbG0tZGVkdXBlOiBjb2RlMmxsbTpzbWVsbDpzaG90Z3VuX3N1cmdlcnk6c3JjL3RhZ2kvaGV1cmlzdGljcy9tZXRyaWNzLnB5OjMzOlNob3RndW4gU3VyZ2VyeTogcGF0aF9sb3dlciIsImZpbGVzIjpbInNyYy90YWdpL2hldXJpc3RpY3MvbWV0cmljcy5weSJdLCJpZCI6IlBMRi0xNTgiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwic2hvdGd1bi1zdXJnZXJ5Il0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IFNob3RndW4gU3VyZ2VyeTogcGF0aF9sb3dlciIsInByaW9yaXR5IjoiaGlnaCIsInNvdXJjZSI6eyJjb250ZXh0Ijp7fSwidGltZXN0YW1wIjoiMjAyNi0wOS0xOVQxNzoyOToxMS4xNTQ5MzZaIiwidG9vbCI6ImtvcnUtc2NhbiJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQxNzoyOToxMS4xNjQ1NzlaIn19 - files: - - src/tagi/heuristics/metrics.py - history: [] - id: PLF-158 - labels: - - llm-ready - - code2llm - - code-smell - - shotgun-surgery - name: 'Address code smell: Shotgun Surgery: path_lower' - priority: high - source: - context: {} - timestamp: '2026-09-19T17:29:11.154936Z' - tool: koru-scan - sprint: current - status: open - sync: {} - updated_at: '2026-09-19T17:29:11.164579Z' PLF-159: acceptance_criteria: [] blocked_by: [] From fa58b9c68a2ada1692cee2b7e34bf2cb8a915e36 Mon Sep 17 00:00:00 2001 From: Tom Softreck Date: Sat, 19 Sep 2026 23:03:51 +0200 Subject: [PATCH 3/7] chore(PLF-159): record already-satisfied tags smell ticket completion in sprint state The code2llm 'Shotgun Surgery: tags' finding (src/tagi/heuristics/tags.py:48, dedupe key code2llm:smell:shotgun_surgery:src/tagi/heuristics/tags.py:48) was captured by the 17:29Z koru-scan against the pre-fix tree, before the refactor landed. The tags shotgun surgery (5 functions: _tag_change, _custom_config_tags, summary_tag, generate_conventional_message, get_heuristics_for_path) was already removed by fc4e93d (PLF-147), which gave each tags binding a distinct name (valid_tags, unique_tags, tag_set, comprehension) leaving _tag_change the single owner of the canonical 'tags' accumulation (span 5 -> 1). No source change is required. Verified: rg finds tags bindings/mutations only inside _tag_change in src/tagi; fresh code2llm runs with the documented discovery flags (-f all --no-chunk --exclude '*.md', temp output) and with --data-flow report zero shotgun-surgery findings; 127/127 pytest pass (venv); ruff on tags.py/_tags.py/formats.py/config.py reports only the pre-existing baseline (I001, UP035, UP006, UP045, BLE001, F401), identical at HEAD. Marked PLF-159 done via planfile and staged only its ticket-block removal, leaving unrelated queue churn uncommitted. Co-authored-by: Koru Agent --- .planfile/sprints/current.yaml | 43 ---------------------------------- 1 file changed, 43 deletions(-) diff --git a/.planfile/sprints/current.yaml b/.planfile/sprints/current.yaml index 812df8c..79f36fa 100644 --- a/.planfile/sprints/current.yaml +++ b/.planfile/sprints/current.yaml @@ -3777,49 +3777,6 @@ sprint: key: semcod/tagi#169 url: https://github.com/semcod/tagi/issues/169 updated_at: '2026-09-19T11:41:05.586678+00:00' - PLF-159: - acceptance_criteria: [] - blocked_by: [] - blocks: [] - children: [] - contract_version: planfile.ticket/v1 - created_at: '2026-09-19T17:29:11.918031Z' - description: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/heuristics/tags.py:48`. - - - Mutation of variable ''tags'' spans 5 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests. - - - code2llm-dedupe: code2llm:smell:shotgun_surgery:src/tagi/heuristics/tags.py:48:Shotgun - Surgery: tags' - dsl: SODL/1 id=evt_83500b9a1eed7d17acb5d9fb event_hash=0742737296da2c07434ecfea4dcb1c8cb6ae655a488c87cdba0103bd8a11bb02 - timestamp=2026-09-19T17%3A29%3A11.918031%2B00%3A00 kind=task source=planfile.ticket - ticket_id=PLF-159 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-159%2Fcommand%2Fcreate - mode=apply status=open correlation_id=PLF-159 causation_id=- input_hash=55fc906af39db774bbbb80466d1102d53e7300ae63a8527729323d5cc7d9d5ec - receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTEuOTE4MDMxWiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgU2hvdGd1biBTdXJnZXJ5OiB0YWdzYCBpbiBgc3JjL3RhZ2kvaGV1cmlzdGljcy90YWdzLnB5OjQ4YC5cblxuTXV0YXRpb24gb2YgdmFyaWFibGUgJ3RhZ3MnIHNwYW5zIDUgZnVuY3Rpb25zLiBDaGFuZ2luZyB0aGlzIGxvZ2ljIHJlcXVpcmVzIHdvcmsgaW4gbWFueSBwbGFjZXMuXG5cbk1ha2UgdGhlIHNtYWxsZXN0IHJlZmFjdG9yIHRoYXQgcmVtb3ZlcyB0aGUgc21lbGwgYW5kIHJ1biBsb2NhbCB0ZXN0cy5cblxuY29kZTJsbG0tZGVkdXBlOiBjb2RlMmxsbTpzbWVsbDpzaG90Z3VuX3N1cmdlcnk6c3JjL3RhZ2kvaGV1cmlzdGljcy90YWdzLnB5OjQ4OlNob3RndW4gU3VyZ2VyeTogdGFncyIsImZpbGVzIjpbInNyYy90YWdpL2hldXJpc3RpY3MvdGFncy5weSJdLCJpZCI6IlBMRi0xNTkiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwic2hvdGd1bi1zdXJnZXJ5Il0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IFNob3RndW4gU3VyZ2VyeTogdGFncyIsInByaW9yaXR5IjoiaGlnaCIsInNvdXJjZSI6eyJjb250ZXh0Ijp7fSwidGltZXN0YW1wIjoiMjAyNi0wOS0xOVQxNzoyOToxMS44NDA4MzlaIiwidG9vbCI6ImtvcnUtc2NhbiJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQxNzoyOToxMS45MTgwMzdaIn19 - files: - - src/tagi/heuristics/tags.py - history: [] - id: PLF-159 - labels: - - llm-ready - - code2llm - - code-smell - - shotgun-surgery - name: 'Address code smell: Shotgun Surgery: tags' - priority: high - source: - context: {} - timestamp: '2026-09-19T17:29:11.840839Z' - tool: koru-scan - sprint: current - status: open - sync: {} - updated_at: '2026-09-19T17:29:11.918037Z' PLF-160: acceptance_criteria: [] blocked_by: [] From e8173c9fc6c0bd5b8d47ff6e7c2370098e87a050 Mon Sep 17 00:00:00 2001 From: Tom Softreck Date: Sat, 19 Sep 2026 23:14:56 +0200 Subject: [PATCH 4/7] chore(PLF-175): refresh code2llm project context and create discovery tickets Whole-project discovery pass: - regenerate code2llm artifacts (analysis, calls, flow, context, map, evolution, project-yaml, prompt, index) plus fresh src-scoped redup duplication report in project/ - koru scan --apply --semcod-artifacts --source koru-scan: no automated suggestions (repo clean by scan thresholds) - IDE analysis of fresh artifacts created focused planfile tickets: PLF-177 dedupe cli tag helpers (4x _ensure_tag_prefix, 2x _resolve_send_target/_is_known_tag), PLF-178 unit tests for analyzer/dependency_graph.py, PLF-179 unit tests for providers/koru.py - record new tickets and PLF-175 completion in sprint state Gates: pytest 127 passed; regix gates all passed. Co-authored-by: Koru Agent --- .planfile/sprints/current.yaml | 1282 ++++++++++----- .planfile/sprints/current.yaml.fast.json | 2 +- project/README.md | 4 +- project/analysis.toon.yaml | 67 +- project/calls.mmd | 332 ++-- project/calls.toon.yaml | 116 +- project/calls.yaml | 1804 ++++++++++++---------- project/compact_flow.mmd | 20 +- project/context.md | 73 +- project/duplication.toon.yaml | 149 +- project/evolution.toon.yaml | 6 +- project/flow.mmd | 12 +- project/index.html | 4 +- project/map.toon.yaml | 52 +- project/mermaid.export | 133 +- project/planfile-tickets.yaml | 62 +- project/project.toon.yaml | 14 +- project/prompt.txt | 4 +- 18 files changed, 2466 insertions(+), 1670 deletions(-) diff --git a/.planfile/sprints/current.yaml b/.planfile/sprints/current.yaml index 79f36fa..7176f15 100644 --- a/.planfile/sprints/current.yaml +++ b/.planfile/sprints/current.yaml @@ -360,6 +360,13 @@ sprint: - code2llm - code-smell - data-clump + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-088 name: 'Address code smell: Data Clump: body, repo_path, title' @@ -477,6 +484,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-089 name: 'Address code smell: God Function: _calculate_complexity' @@ -592,6 +606,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-090 name: 'Address code smell: God Function: _calculate_impact' @@ -707,6 +728,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-091 name: 'Address code smell: God Function: _load_config' @@ -822,6 +850,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-092 name: 'Address code smell: God Function: analyze_python_imports' @@ -937,6 +972,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-093 name: 'Address code smell: God Function: apply_tags' @@ -1052,6 +1094,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-094 name: 'Address code smell: God Function: build_report_header' @@ -1173,6 +1222,13 @@ sprint: - code2llm - code-smell - data-clump + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-109 name: 'Address code smell: Data Clump: title, repo_path, body' @@ -1296,6 +1352,13 @@ sprint: - code2llm - code-smell - data-clump + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-118 name: 'Address code smell: Data Clump: repo_path, title, body' @@ -1413,6 +1476,13 @@ sprint: - code2llm - refactor - complexity + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-119 name: 'Reduce cyclomatic complexity: src.tagi.utils.inspect_helpers.resolve_filtered_changes @@ -1528,6 +1598,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-120 name: 'Address code smell: God Function: calculate_risk_score' @@ -1643,6 +1720,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-126 name: 'Address code smell: God Function: group_by_branch' @@ -1758,6 +1842,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-127 name: 'Address code smell: God Function: hooks_command' @@ -1873,6 +1964,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-128 name: 'Address code smell: God Function: inspect_command' @@ -1988,6 +2086,13 @@ sprint: - code2llm - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-129 name: 'Address code smell: God Function: preview_changes' @@ -2095,6 +2200,13 @@ sprint: - refactor - scan - complexity + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-131 name: 'Reduce cyclomatic complexity: resolve_filtered_changes (CC=17, limit=15)' @@ -2184,6 +2296,13 @@ sprint: - code2llm - refactor - scan + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-132 name: 'code2llm refactor: split 1 high-CC methods' @@ -2285,6 +2404,13 @@ sprint: - 'priority: normal' - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-138 name: 'Address code smell: God Function: build_statistics_section' @@ -2406,6 +2532,13 @@ sprint: - 'priority: normal' - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-139 name: 'Address code smell: God Function: build_tag_distribution_section' @@ -2524,6 +2657,13 @@ sprint: - 'priority: normal' - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-140 name: 'Address code smell: God Function: display_statistics_table' @@ -2577,126 +2717,6 @@ sprint: key: semcod/tagi#145 url: https://github.com/semcod/tagi/issues/145 updated_at: '2026-09-18T20:31:21.515076+00:00' - PLF-141: - assignee: null - backend: github - blocked_by: [] - blocks: [] - created_at: '2026-09-18T20:46:53.090400+00:00' - description: ' - - code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/diff.py:20`. - - - Mutation of variable ''result'' spans 24 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - execution: - attempt: 0 - max_attempts: 1 - queue: default - state: ready - executor: - kind: human - mode: interactive - external_id: '147' - files: - - src/tagi/scanner/diff.py - history: - - action: created - message: 'code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/diff.py:20`. - - - Mutation of variable ''result'' spans 24 functions. Changing this logic - requires work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - source: koru task - timestamp: '2026-09-18T20:46:53.090400+00:00' - id: PLF-141 - inputs: - api_headers: {} - api_method: GET - api_timeout_seconds: 30.0 - env_keys: [] - prompt: 'code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/diff.py:20`. - - - Mutation of variable ''result'' spans 24 functions. Changing this logic - requires work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - integration: - - github - labels: - - planfile - - managed - - koru - - nl-task - - llm-ready - - priority-high - - 'priority: high' - - code2llm - - code-smell - - shotgun-surgery - metadata: - deduplication_key: PLF-141 - name: 'Address code smell: Shotgun Surgery: result' - outputs: - artifacts: [] - notes: [] - priority: high - source: - context: - dedupe_key: 'code2llm:smell:shotgun_surgery:src/tagi/scanner/diff.py:20:Shotgun - Surgery: result' - evidence: - artifact: - mtime_ns: 1789764409471628814 - path: project/analysis.toon.yaml - sha256: 8272c84ad525516fbd4040cd83b4fb110a3f4e91aa510378427c65686d9f3018 - size_bytes: 10424 - files: - - mtime_ns: 1779802548044288725 - path: src/tagi/scanner/diff.py - sha256: 5c96c6b90833c3d6205e40b53b402d2b1eca555c135ff8bbd9cd94f8931716f2 - size_bytes: 708 - kind: code2llm_discovery - planfile_tickets: - mtime_ns: 1789764409534879854 - path: project/planfile-tickets.yaml - sha256: e229a798269d410a9ccbb63568a783f63de2465f87ad7c4d3acd2a5c0b1ec43a - size_bytes: 16701 - regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project - --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source - koru-project-discovery --planfile-sprint current --planfile-project - /home/tom/github/semcod/tagi --planfile-limit 20 - schema: koru.ticket_evidence.v1 - staleness_check: Regenerate artifacts and compare artifact.sha256 / files[].sha256 - before assuming this ticket is still current. - input: 'code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/diff.py:20`. - - - Mutation of variable ''result'' spans 24 functions. Changing this logic - requires work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - signal: code2llm_smell_shotgun_surgery - timestamp: '2026-09-18T20:46:53.090400+00:00' - tool: koru-project-discovery - sprint: current - status: open - sync: - github: - id: '147' - key: semcod/tagi#147 - url: https://github.com/semcod/tagi/issues/147 - updated_at: '2026-09-18T20:46:53.090400+00:00' PLF-142: assignee: null backend: github @@ -2766,6 +2786,13 @@ sprint: - 'priority: normal' - code-smell - data-clump + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-142 name: 'Address code smell: Data Clump: repo_path, body, title' @@ -2884,6 +2911,13 @@ sprint: - 'priority: normal' - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-143 name: 'Address code smell: God Function: group_changes' @@ -3006,6 +3040,13 @@ sprint: - 'priority: normal' - code-smell - data-clump + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-145 name: 'Address code smell: Data Clump: body, title, repo_path' @@ -3061,253 +3102,13 @@ sprint: key: semcod/tagi#152 url: https://github.com/semcod/tagi/issues/152 updated_at: '2026-09-18T21:51:29.650993+00:00' - PLF-146: + PLF-149: assignee: null backend: github blocked_by: [] blocks: [] - created_at: '2026-09-19T06:26:13.380402+00:00' - description: ' - - code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:46`. - - - Mutation of variable ''path_lower'' spans 8 functions. Changing this logic - requires work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - execution: - attempt: 0 - max_attempts: 1 - queue: default - state: ready - executor: - kind: human - mode: interactive - external_id: '153' - files: - - src/tagi/heuristics/metrics.py - history: - - action: created - message: 'code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:46`. - - - Mutation of variable ''path_lower'' spans 8 functions. Changing this logic - requires work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - source: koru task - timestamp: '2026-09-19T06:26:13.380402+00:00' - id: PLF-146 - inputs: - api_headers: {} - api_method: GET - api_timeout_seconds: 30.0 - env_keys: [] - prompt: 'code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:46`. - - - Mutation of variable ''path_lower'' spans 8 functions. Changing this logic - requires work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - integration: - - github - labels: - - planfile - - managed - - koru - - nl-task - - llm-ready - - priority-high - - 'priority: high' - - code2llm - - code-smell - - shotgun-surgery - metadata: - deduplication_key: PLF-146 - name: 'Address code smell: Shotgun Surgery: path_lower' - outputs: - artifacts: [] - notes: [] - priority: high - source: - context: - dedupe_key: 'code2llm:smell:shotgun_surgery:src/tagi/heuristics/metrics.py:46:Shotgun - Surgery: path_lower' - evidence: - artifact: - mtime_ns: 1789799169500661533 - path: project/analysis.toon.yaml - sha256: e121c107d051daf013a3c36bbcbc8717b86b66089c73a3586f38da06dbdec891 - size_bytes: 10356 - files: - - mtime_ns: 1779811310790143885 - path: src/tagi/heuristics/metrics.py - sha256: dcd2cc0255c4f2ee3eee8aaae72af3e54f0aa6a78598d290d61eb44299401b2d - size_bytes: 6521 - kind: code2llm_discovery - planfile_tickets: - mtime_ns: 1789799169537365843 - path: project/planfile-tickets.yaml - sha256: 1d4adc5d27067e26cec142ccc46490afbb9b85cb5d197c470f6353698b37aceb - size_bytes: 17914 - regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project - --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source - koru-project-discovery --planfile-sprint current --planfile-project - /home/tom/github/semcod/tagi --planfile-limit 20 - schema: koru.ticket_evidence.v1 - staleness_check: Regenerate artifacts and compare artifact.sha256 / files[].sha256 - before assuming this ticket is still current. - input: 'code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:46`. - - - Mutation of variable ''path_lower'' spans 8 functions. Changing this logic - requires work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - signal: code2llm_smell_shotgun_surgery - timestamp: '2026-09-19T06:26:13.380402+00:00' - tool: koru-project-discovery - sprint: current - status: open - sync: - github: - id: '153' - key: semcod/tagi#153 - url: https://github.com/semcod/tagi/issues/153 - updated_at: '2026-09-19T06:26:13.380402+00:00' - PLF-147: - assignee: null - backend: github - blocked_by: [] - blocks: [] - created_at: '2026-09-19T06:31:54.694978+00:00' - description: ' - - code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/formats.py:16`. - - - Mutation of variable ''tags'' spans 6 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - execution: - attempt: 0 - max_attempts: 1 - queue: default - state: ready - executor: - kind: human - mode: interactive - external_id: '154' - files: - - src/tagi/composer/formats.py - history: - - action: created - message: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/formats.py:16`. - - - Mutation of variable ''tags'' spans 6 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - source: koru task - timestamp: '2026-09-19T06:31:54.694978+00:00' - id: PLF-147 - inputs: - api_headers: {} - api_method: GET - api_timeout_seconds: 30.0 - env_keys: [] - prompt: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/formats.py:16`. - - - Mutation of variable ''tags'' spans 6 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - integration: - - github - labels: - - planfile - - managed - - koru - - nl-task - - llm-ready - - priority-high - - 'priority: high' - - code2llm - - code-smell - - shotgun-surgery - metadata: - deduplication_key: PLF-147 - name: 'Address code smell: Shotgun Surgery: tags' - outputs: - artifacts: [] - notes: [] - priority: high - source: - context: - dedupe_key: 'code2llm:smell:shotgun_surgery:src/tagi/composer/formats.py:16:Shotgun - Surgery: tags' - evidence: - artifact: - mtime_ns: 1789799169500661533 - path: project/analysis.toon.yaml - sha256: e121c107d051daf013a3c36bbcbc8717b86b66089c73a3586f38da06dbdec891 - size_bytes: 10356 - files: - - mtime_ns: 1789764358606193196 - path: src/tagi/composer/formats.py - sha256: f83369fc3a57d03450699627061999b0e07c463e547289218fda64626fb0e6c0 - size_bytes: 3495 - kind: code2llm_discovery - planfile_tickets: - mtime_ns: 1789799169537365843 - path: project/planfile-tickets.yaml - sha256: 1d4adc5d27067e26cec142ccc46490afbb9b85cb5d197c470f6353698b37aceb - size_bytes: 17914 - regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project - --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source - koru-project-discovery --planfile-sprint current --planfile-project - /home/tom/github/semcod/tagi --planfile-limit 20 - schema: koru.ticket_evidence.v1 - staleness_check: Regenerate artifacts and compare artifact.sha256 / files[].sha256 - before assuming this ticket is still current. - input: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/formats.py:16`. - - - Mutation of variable ''tags'' spans 6 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - signal: code2llm_smell_shotgun_surgery - timestamp: '2026-09-19T06:31:54.694978+00:00' - tool: koru-project-discovery - sprint: current - status: open - sync: - github: - id: '154' - key: semcod/tagi#154 - url: https://github.com/semcod/tagi/issues/154 - updated_at: '2026-09-19T06:31:54.694978+00:00' - PLF-149: - assignee: null - backend: github - blocked_by: [] - blocks: [] - created_at: '2026-09-19T08:19:14.641869+00:00' - description: ' + created_at: '2026-09-19T08:19:14.641869+00:00' + description: ' code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`. @@ -3364,6 +3165,13 @@ sprint: - 'priority: normal' - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-149 name: 'Address code smell: God Function: publish_command' @@ -3486,6 +3294,13 @@ sprint: - 'priority: normal' - code-smell - data-clump + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-152 name: 'Address code smell: Data Clump: title, body, repo_path' @@ -3604,6 +3419,13 @@ sprint: - 'priority: normal' - code-smell - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' metadata: deduplication_key: PLF-154 name: 'Address code smell: God Function: scan_repo' @@ -3723,6 +3545,13 @@ sprint: - code2llm - code-smell - shotgun-surgery + - 'priority: high' + - 'priority: high' + - 'priority: high' + - 'priority: high' + - 'priority: high' + - 'priority: high' + - 'priority: high' metadata: deduplication_key: PLF-156 name: 'Address code smell: Shotgun Surgery: provider' @@ -4197,3 +4026,730 @@ sprint: status: open sync: {} updated_at: '2026-09-19T17:29:19.641514Z' + PLF-171: + backend: github + blocked_by: [] + blocks: [] + created_at: '2026-09-19T17:43:09.548402+00:00' + description: 'code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`. + + + Function ''_tag_change'' is oversized: CC=2, fan-out=9, mutations=9. + + + Make the smallest refactor that removes the smell and run local tests.' + execution: + attempt: 0 + max_attempts: 1 + queue: default + state: ready + executor: + kind: human + mode: interactive + external_id: '187' + files: + - src/tagi/heuristics/tags.py + history: + - action: created + message: 'code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`. + + + Function ''_tag_change'' is oversized: CC=2, fan-out=9, mutations=9. + + + Make the smallest refactor that removes the smell and run local tests.' + source: koru task + timestamp: '2026-09-19T17:43:09.548402+00:00' + id: PLF-171 + inputs: + api_headers: {} + api_method: GET + api_timeout_seconds: 30.0 + env_keys: [] + prompt: 'code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`. + + + Function ''_tag_change'' is oversized: CC=2, fan-out=9, mutations=9. + + + Make the smallest refactor that removes the smell and run local tests.' + integration: + - github + labels: + - koru + - nl-task + - llm-ready + - code2llm + - code-smell + - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + name: 'Address code smell: God Function: _tag_change' + outputs: + artifacts: [] + notes: [] + priority: normal + source: + context: + dedupe_key: 'code2llm:smell:god_function:src/tagi/heuristics/tags.py:22:God + Function: _tag_change' + evidence: + artifact: + mtime_ns: 1789838949904540410 + path: project/analysis.toon.yaml + sha256: a20fa29c7d952fbcda7207db98cbe6042565fe78c7e14633a3065728be7842c6 + size_bytes: 9689 + files: + - mtime_ns: 1789830262593470416 + path: src/tagi/heuristics/tags.py + sha256: a4f450ad5caf03cfd4f6b956809d7dfb0dabd3f6f7da91aad7e2202ac7576f69 + size_bytes: 3411 + kind: code2llm_discovery + planfile_tickets: + mtime_ns: 1789838959872519685 + path: project/planfile-tickets.yaml + sha256: b5faa6f4e5d625a802e28855d7954530f8835c2a1c4377ec4676a9e843e17d04 + size_bytes: 8004 + regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project + --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source + koru-project-discovery --planfile-sprint current --planfile-project + /home/tom/github/semcod/tagi --planfile-limit 20 + schema: koru.ticket_evidence.v1 + staleness_check: Regenerate artifacts and compare artifact.sha256 / files[].sha256 + before assuming this ticket is still current. + input: 'code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`. + + + Function ''_tag_change'' is oversized: CC=2, fan-out=9, mutations=9. + + + Make the smallest refactor that removes the smell and run local tests.' + signal: code2llm_smell_god_function + timestamp: '2026-09-19T17:43:09.548402+00:00' + tool: koru-project-discovery + sprint: current + status: open + sync: + github: + id: '187' + key: semcod/tagi#187 + url: https://github.com/semcod/tagi/issues/187 + updated_at: '2026-09-19T17:43:09.548402+00:00' + PLF-172: + backend: github + blocked_by: [] + blocks: [] + created_at: '2026-09-19T17:53:12.889023+00:00' + description: 'code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`. + + + Function ''send_command'' is oversized: CC=7, fan-out=13, mutations=9. + + + Make the smallest refactor that removes the smell and run local tests.' + execution: + attempt: 0 + max_attempts: 1 + queue: default + state: ready + executor: + kind: human + mode: interactive + external_id: '188' + files: + - src/tagi/cli/git_operations.py + history: + - action: created + message: 'code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`. + + + Function ''send_command'' is oversized: CC=7, fan-out=13, mutations=9. + + + Make the smallest refactor that removes the smell and run local tests.' + source: koru task + timestamp: '2026-09-19T17:53:12.889023+00:00' + id: PLF-172 + inputs: + api_headers: {} + api_method: GET + api_timeout_seconds: 30.0 + env_keys: [] + prompt: 'code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`. + + + Function ''send_command'' is oversized: CC=7, fan-out=13, mutations=9. + + + Make the smallest refactor that removes the smell and run local tests.' + integration: + - github + labels: + - koru + - nl-task + - llm-ready + - code2llm + - code-smell + - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + name: 'Address code smell: God Function: send_command' + outputs: + artifacts: [] + notes: [] + priority: normal + source: + context: + dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/git_operations.py:90:God + Function: send_command' + evidence: + artifact: + mtime_ns: 1789838949904540410 + path: project/analysis.toon.yaml + sha256: a20fa29c7d952fbcda7207db98cbe6042565fe78c7e14633a3065728be7842c6 + size_bytes: 9689 + files: + - mtime_ns: 1789824641491087908 + path: src/tagi/cli/git_operations.py + sha256: 049eb6ec4314014115e3471ce64f037758ab685f40cb9896fe129daf8618d861 + size_bytes: 6307 + kind: code2llm_discovery + planfile_tickets: + mtime_ns: 1789838959872519685 + path: project/planfile-tickets.yaml + sha256: b5faa6f4e5d625a802e28855d7954530f8835c2a1c4377ec4676a9e843e17d04 + size_bytes: 8004 + regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project + --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source + koru-project-discovery --planfile-sprint current --planfile-project + /home/tom/github/semcod/tagi --planfile-limit 20 + schema: koru.ticket_evidence.v1 + staleness_check: Regenerate artifacts and compare artifact.sha256 / files[].sha256 + before assuming this ticket is still current. + input: 'code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`. + + + Function ''send_command'' is oversized: CC=7, fan-out=13, mutations=9. + + + Make the smallest refactor that removes the smell and run local tests.' + signal: code2llm_smell_god_function + timestamp: '2026-09-19T17:53:12.889023+00:00' + tool: koru-project-discovery + sprint: current + status: open + sync: + github: + id: '188' + key: semcod/tagi#188 + url: https://github.com/semcod/tagi/issues/188 + updated_at: '2026-09-19T17:53:12.889023+00:00' + PLF-173: + backend: github + blocked_by: [] + blocks: [] + created_at: '2026-09-19T18:16:24.472046+00:00' + description: 'code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`. + + + Function ''setup_logger'' is oversized: CC=4, fan-out=13, mutations=14. + + + Make the smallest refactor that removes the smell and run local tests.' + execution: + attempt: 0 + max_attempts: 1 + queue: default + state: ready + executor: + kind: human + mode: interactive + external_id: '189' + files: + - src/tagi/utils/logger.py + history: + - action: created + message: 'code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`. + + + Function ''setup_logger'' is oversized: CC=4, fan-out=13, mutations=14. + + + Make the smallest refactor that removes the smell and run local tests.' + source: koru task + timestamp: '2026-09-19T18:16:24.472046+00:00' + id: PLF-173 + inputs: + api_headers: {} + api_method: GET + api_timeout_seconds: 30.0 + env_keys: [] + prompt: 'code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`. + + + Function ''setup_logger'' is oversized: CC=4, fan-out=13, mutations=14. + + + Make the smallest refactor that removes the smell and run local tests.' + integration: + - github + labels: + - koru + - nl-task + - llm-ready + - code2llm + - code-smell + - god-function + - 'priority: normal' + - 'priority: normal' + - 'priority: normal' + name: 'Address code smell: God Function: setup_logger' + outputs: + artifacts: [] + notes: [] + priority: normal + source: + context: + dedupe_key: 'code2llm:smell:god_function:src/tagi/utils/logger.py:9:God + Function: setup_logger' + evidence: + artifact: + mtime_ns: 1789838949904540410 + path: project/analysis.toon.yaml + sha256: a20fa29c7d952fbcda7207db98cbe6042565fe78c7e14633a3065728be7842c6 + size_bytes: 9689 + files: + - mtime_ns: 1779809465287675064 + path: src/tagi/utils/logger.py + sha256: 25d7171aee4d351bc65d315acfa6d09d6e91491346c2ac3cca945577d7397c89 + size_bytes: 1747 + kind: code2llm_discovery + planfile_tickets: + mtime_ns: 1789838959872519685 + path: project/planfile-tickets.yaml + sha256: b5faa6f4e5d625a802e28855d7954530f8835c2a1c4377ec4676a9e843e17d04 + size_bytes: 8004 + regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project + --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source + koru-project-discovery --planfile-sprint current --planfile-project + /home/tom/github/semcod/tagi --planfile-limit 20 + schema: koru.ticket_evidence.v1 + staleness_check: Regenerate artifacts and compare artifact.sha256 / files[].sha256 + before assuming this ticket is still current. + input: 'code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`. + + + Function ''setup_logger'' is oversized: CC=4, fan-out=13, mutations=14. + + + Make the smallest refactor that removes the smell and run local tests.' + signal: code2llm_smell_god_function + timestamp: '2026-09-19T18:16:24.472046+00:00' + tool: koru-project-discovery + sprint: current + status: open + sync: + github: + id: '189' + key: semcod/tagi#189 + url: https://github.com/semcod/tagi/issues/189 + updated_at: '2026-09-19T18:16:24.472046+00:00' + PLF-174: + backend: github + blocked_by: [] + blocks: [] + created_at: '2026-09-19T18:25:22.064458+00:00' + description: 'code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`. + + + Function ''summary_command'' is oversized: CC=7, fan-out=13, mutations=17. + + + Make the smallest refactor that removes the smell and run local tests.' + execution: + attempt: 0 + max_attempts: 1 + queue: default + state: ready + executor: + kind: human + mode: interactive + external_id: '190' + files: + - src/tagi/cli/utility_commands.py + history: + - action: created + message: 'code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`. + + + Function ''summary_command'' is oversized: CC=7, fan-out=13, mutations=17. + + + Make the smallest refactor that removes the smell and run local tests.' + source: koru task + timestamp: '2026-09-19T18:25:22.064458+00:00' + id: PLF-174 + inputs: + api_headers: {} + api_method: GET + api_timeout_seconds: 30.0 + env_keys: [] + prompt: 'code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`. + + + Function ''summary_command'' is oversized: CC=7, fan-out=13, mutations=17. + + + Make the smallest refactor that removes the smell and run local tests.' + integration: + - github + labels: + - koru + - nl-task + - llm-ready + - code2llm + - code-smell + - god-function + - 'priority: normal' + - 'priority: normal' + name: 'Address code smell: God Function: summary_command' + outputs: + artifacts: [] + notes: [] + priority: normal + source: + context: + dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/utility_commands.py:25:God + Function: summary_command' + evidence: + artifact: + mtime_ns: 1789838949904540410 + path: project/analysis.toon.yaml + sha256: a20fa29c7d952fbcda7207db98cbe6042565fe78c7e14633a3065728be7842c6 + size_bytes: 9689 + files: + - mtime_ns: 1789817932257139916 + path: src/tagi/cli/utility_commands.py + sha256: e8d62787b625b75ab02154b4de181d4c5ab9cf2443e7bec06574c0ec46b63499 + size_bytes: 7253 + kind: code2llm_discovery + planfile_tickets: + mtime_ns: 1789838959872519685 + path: project/planfile-tickets.yaml + sha256: b5faa6f4e5d625a802e28855d7954530f8835c2a1c4377ec4676a9e843e17d04 + size_bytes: 8004 + regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project + --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source + koru-project-discovery --planfile-sprint current --planfile-project + /home/tom/github/semcod/tagi --planfile-limit 20 + schema: koru.ticket_evidence.v1 + staleness_check: Regenerate artifacts and compare artifact.sha256 / files[].sha256 + before assuming this ticket is still current. + input: 'code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`. + + + Function ''summary_command'' is oversized: CC=7, fan-out=13, mutations=17. + + + Make the smallest refactor that removes the smell and run local tests.' + signal: code2llm_smell_god_function + timestamp: '2026-09-19T18:25:22.064458+00:00' + tool: koru-project-discovery + sprint: current + status: open + sync: + github: + id: '190' + key: semcod/tagi#190 + url: https://github.com/semcod/tagi/issues/190 + updated_at: '2026-09-19T18:25:22.064458+00:00' + PLF-176: + backend: github + blocked_by: [] + blocks: [] + created_at: '2026-09-19T19:49:31.353399+00:00' + description: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`. + + + Mutation of variable ''tags'' spans 5 functions. Changing this logic requires + work in many places. + + + Make the smallest refactor that removes the smell and run local tests.' + execution: + attempt: 0 + max_attempts: 1 + queue: default + state: ready + executor: + kind: human + mode: interactive + external_id: '193' + files: + - src/tagi/composer/_tags.py + history: + - action: created + message: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`. + + + Mutation of variable ''tags'' spans 5 functions. Changing this logic requires + work in many places. + + + Make the smallest refactor that removes the smell and run local tests.' + source: koru task + timestamp: '2026-09-19T19:49:31.353399+00:00' + id: PLF-176 + inputs: + api_headers: {} + api_method: GET + api_timeout_seconds: 30.0 + env_keys: [] + prompt: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`. + + + Mutation of variable ''tags'' spans 5 functions. Changing this logic requires + work in many places. + + + Make the smallest refactor that removes the smell and run local tests.' + integration: + - github + labels: + - koru + - nl-task + - llm-ready + - code2llm + - code-smell + - shotgun-surgery + name: 'Address code smell: Shotgun Surgery: tags' + outputs: + artifacts: [] + notes: [] + priority: high + source: + context: + dedupe_key: 'code2llm:smell:shotgun_surgery:src/tagi/composer/_tags.py:20:Shotgun + Surgery: tags' + evidence: + artifact: + mtime_ns: 1789847360141767983 + path: project/analysis.toon.yaml + sha256: 661fceb25106c0f600fa86e3b2a2eb625295fb450e7315531abb66b52e13a02a + size_bytes: 12168 + files: + - mtime_ns: 1789820644380550921 + path: src/tagi/composer/_tags.py + sha256: 84f953c3818378853cdb9345e86066e66fa04ccc0177985fdf2665c7fe5ebdc6 + size_bytes: 1361 + kind: code2llm_discovery + planfile_tickets: + mtime_ns: 1789847360243915139 + path: project/planfile-tickets.yaml + sha256: c9219bc012e7516e3794f3e0b448f30861f9296138744f977d5f94044cbdfe2a + size_bytes: 6743 + regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project + --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source + koru-project-discovery --planfile-sprint current --planfile-project + /home/tom/github/semcod/tagi --planfile-limit 20 + schema: koru.ticket_evidence.v1 + staleness_check: Regenerate artifacts and compare artifact.sha256 / files[].sha256 + before assuming this ticket is still current. + input: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`. + + + Mutation of variable ''tags'' spans 5 functions. Changing this logic requires + work in many places. + + + Make the smallest refactor that removes the smell and run local tests.' + signal: code2llm_smell_shotgun_surgery + timestamp: '2026-09-19T19:49:31.353399+00:00' + tool: koru-project-discovery + sprint: current + status: open + sync: + github: + id: '193' + key: semcod/tagi#193 + url: https://github.com/semcod/tagi/issues/193 + updated_at: '2026-09-19T19:49:31.353399+00:00' + PLF-177: + acceptance_criteria: [] + blocked_by: [] + blocks: [] + children: [] + contract_version: planfile.ticket/v1 + created_at: '2026-09-19T21:13:19.174193Z' + description: 'Fresh redup scan (project/duplication.toon.yaml, 2026-09-19) flags + copy-pasted helpers introduced by the cli module split: + + + - _ensure_tag_prefix: 4 identical copies (src/tagi/cli/main.py:50, git_operations.py:21, + publishing_commands.py:16, utility_commands.py:18) — 24 duplicated lines. + + - _resolve_send_target + _is_known_tag: duplicated between src/tagi/cli/main.py:57-83 + and git_operations.py:28-56 (19+10 lines), with comment drift between the + two copies. + + + Extract these into one shared cli helper module (e.g. src/tagi/cli/tag_targets.py), + import it from all four command modules, and keep behavior identical. + + + Acceptance criteria: + + - redup scan of src/ reports no EXAC groups for these helpers (dup groups + 7 -> <=4). + + - python -m pytest -q stays green (127 passed).' + dsl: SODL/1 id=evt_6d8071ad9e575f187c0d44fc event_hash=09dee25ffd62e51fcf5519f07cf9cdb658a69ceb037eb39c11b0a66d7d2508f3 + timestamp=2026-09-19T21%3A13%3A19.174193%2B00%3A00 kind=task source=planfile.ticket + ticket_id=PLF-177 actor=koru-project-discovery oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-177%2Fcommand%2Fcreate + mode=apply status=open correlation_id=PLF-177 causation_id=- input_hash=c3d47241fd79a8d7580afdb743ddae69f661a9bc415f8a9439190b58d9951b52 + receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMjE6MTM6MTkuMTc0MTkzWiIsImRlc2NyaXB0aW9uIjoiRnJlc2ggcmVkdXAgc2NhbiAocHJvamVjdC9kdXBsaWNhdGlvbi50b29uLnlhbWwsIDIwMjYtMDktMTkpIGZsYWdzIGNvcHktcGFzdGVkIGhlbHBlcnMgaW50cm9kdWNlZCBieSB0aGUgY2xpIG1vZHVsZSBzcGxpdDpcblxuLSBfZW5zdXJlX3RhZ19wcmVmaXg6IDQgaWRlbnRpY2FsIGNvcGllcyAoc3JjL3RhZ2kvY2xpL21haW4ucHk6NTAsIGdpdF9vcGVyYXRpb25zLnB5OjIxLCBwdWJsaXNoaW5nX2NvbW1hbmRzLnB5OjE2LCB1dGlsaXR5X2NvbW1hbmRzLnB5OjE4KSDigJQgMjQgZHVwbGljYXRlZCBsaW5lcy5cbi0gX3Jlc29sdmVfc2VuZF90YXJnZXQgKyBfaXNfa25vd25fdGFnOiBkdXBsaWNhdGVkIGJldHdlZW4gc3JjL3RhZ2kvY2xpL21haW4ucHk6NTctODMgYW5kIGdpdF9vcGVyYXRpb25zLnB5OjI4LTU2ICgxOSsxMCBsaW5lcyksIHdpdGggY29tbWVudCBkcmlmdCBiZXR3ZWVuIHRoZSB0d28gY29waWVzLlxuXG5FeHRyYWN0IHRoZXNlIGludG8gb25lIHNoYXJlZCBjbGkgaGVscGVyIG1vZHVsZSAoZS5nLiBzcmMvdGFnaS9jbGkvdGFnX3RhcmdldHMucHkpLCBpbXBvcnQgaXQgZnJvbSBhbGwgZm91ciBjb21tYW5kIG1vZHVsZXMsIGFuZCBrZWVwIGJlaGF2aW9yIGlkZW50aWNhbC5cblxuQWNjZXB0YW5jZSBjcml0ZXJpYTpcbi0gcmVkdXAgc2NhbiBvZiBzcmMvIHJlcG9ydHMgbm8gRVhBQyBncm91cHMgZm9yIHRoZXNlIGhlbHBlcnMgKGR1cCBncm91cHMgNyAtPiA8PTQpLlxuLSBweXRob24gLW0gcHl0ZXN0IC1xIHN0YXlzIGdyZWVuICgxMjcgcGFzc2VkKS4iLCJmaWxlcyI6WyJzcmMvdGFnaS9jbGkvbWFpbi5weSIsInNyYy90YWdpL2NsaS9naXRfb3BlcmF0aW9ucy5weSIsInNyYy90YWdpL2NsaS9wdWJsaXNoaW5nX2NvbW1hbmRzLnB5Iiwic3JjL3RhZ2kvY2xpL3V0aWxpdHlfY29tbWFuZHMucHkiXSwiaWQiOiJQTEYtMTc3IiwibGFiZWxzIjpbImtvcnUiLCJubC10YXNrIiwibGxtLXJlYWR5IiwicHJvamVjdC1kaXNjb3ZlcnkiLCJkdXBsaWNhdGlvbiJdLCJuYW1lIjoiRGVkdXBsaWNhdGUgY2xpIHRhZyBoZWxwZXJzIChfZW5zdXJlX3RhZ19wcmVmaXgsIF9pc19rbm93bl90YWcsIF9yZXNvbHZlX3NlbmRfdGFyZ2V0KSIsInByaW9yaXR5IjoiaGlnaCIsInNvdXJjZSI6eyJjb250ZXh0Ijp7fSwidGltZXN0YW1wIjoiMjAyNi0wOS0xOVQyMToxMzoxOS4xNTg3NzdaIiwidG9vbCI6ImtvcnUtcHJvamVjdC1kaXNjb3ZlcnkifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMjE6MTM6MTkuMTc0MTk4WiJ9fQ + files: + - src/tagi/cli/main.py + - src/tagi/cli/git_operations.py + - src/tagi/cli/publishing_commands.py + - src/tagi/cli/utility_commands.py + history: [] + id: PLF-177 + labels: + - koru + - nl-task + - llm-ready + - project-discovery + - duplication + name: Deduplicate cli tag helpers (_ensure_tag_prefix, _is_known_tag, _resolve_send_target) + priority: high + source: + context: {} + timestamp: '2026-09-19T21:13:19.158777Z' + tool: koru-project-discovery + sprint: current + status: open + sync: {} + updated_at: '2026-09-19T21:13:19.174198Z' + PLF-178: + acceptance_criteria: [] + blocked_by: [] + blocks: [] + children: [] + contract_version: planfile.ticket/v1 + created_at: '2026-09-19T21:13:25.344158Z' + description: 'src/tagi/analyzer/dependency_graph.py is the largest module in + the codebase (276L, 16 functions, CC=7) and has no dedicated test coverage + (verified 2026-09-19: no tests/ file imports it; only a path fixture mention). + + + It implements pure graph algorithms used by planning: build_dependency_graph, + find_dependency_order, detect_cycles, get_critical_path, levels. + + + Add tests/test_dependency_graph.py covering: + + - build_dependency_graph from python import analysis (incl. _collect_import_names + edge cases). + + - find_dependency_order: deterministic order, dependencies before dependents. + + - detect_cycles: acyclic graph -> [], cyclic graph -> reported cycle (incl. + self-loop). + + - get_critical_path: longest path in a diamond graph. + + - levels/_drain_level partitioning. + + + Acceptance criteria: + + - python -m pytest -q green with the new tests included. + + - Coverage of the module''s public functions without mocking internals.' + dsl: SODL/1 id=evt_7078a45181f0dc0a74954bb8 event_hash=6bc21c34be2c3bd2a2b9b78df0201095dfdbbf142a1d02d1c0d9b28f28f88bba + timestamp=2026-09-19T21%3A13%3A25.344158%2B00%3A00 kind=task source=planfile.ticket + ticket_id=PLF-178 actor=koru-project-discovery oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-178%2Fcommand%2Fcreate + mode=apply status=open correlation_id=PLF-178 causation_id=- input_hash=ae3d0bc4ac06e679201e277c56e8950193680a23891a710c80eb024e664f08d2 + receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMjE6MTM6MjUuMzQ0MTU4WiIsImRlc2NyaXB0aW9uIjoic3JjL3RhZ2kvYW5hbHl6ZXIvZGVwZW5kZW5jeV9ncmFwaC5weSBpcyB0aGUgbGFyZ2VzdCBtb2R1bGUgaW4gdGhlIGNvZGViYXNlICgyNzZMLCAxNiBmdW5jdGlvbnMsIENDPTcpIGFuZCBoYXMgbm8gZGVkaWNhdGVkIHRlc3QgY292ZXJhZ2UgKHZlcmlmaWVkIDIwMjYtMDktMTk6IG5vIHRlc3RzLyBmaWxlIGltcG9ydHMgaXQ7IG9ubHkgYSBwYXRoIGZpeHR1cmUgbWVudGlvbikuXG5cbkl0IGltcGxlbWVudHMgcHVyZSBncmFwaCBhbGdvcml0aG1zIHVzZWQgYnkgcGxhbm5pbmc6IGJ1aWxkX2RlcGVuZGVuY3lfZ3JhcGgsIGZpbmRfZGVwZW5kZW5jeV9vcmRlciwgZGV0ZWN0X2N5Y2xlcywgZ2V0X2NyaXRpY2FsX3BhdGgsIGxldmVscy5cblxuQWRkIHRlc3RzL3Rlc3RfZGVwZW5kZW5jeV9ncmFwaC5weSBjb3ZlcmluZzpcbi0gYnVpbGRfZGVwZW5kZW5jeV9ncmFwaCBmcm9tIHB5dGhvbiBpbXBvcnQgYW5hbHlzaXMgKGluY2wuIF9jb2xsZWN0X2ltcG9ydF9uYW1lcyBlZGdlIGNhc2VzKS5cbi0gZmluZF9kZXBlbmRlbmN5X29yZGVyOiBkZXRlcm1pbmlzdGljIG9yZGVyLCBkZXBlbmRlbmNpZXMgYmVmb3JlIGRlcGVuZGVudHMuXG4tIGRldGVjdF9jeWNsZXM6IGFjeWNsaWMgZ3JhcGggLT4gW10sIGN5Y2xpYyBncmFwaCAtPiByZXBvcnRlZCBjeWNsZSAoaW5jbC4gc2VsZi1sb29wKS5cbi0gZ2V0X2NyaXRpY2FsX3BhdGg6IGxvbmdlc3QgcGF0aCBpbiBhIGRpYW1vbmQgZ3JhcGguXG4tIGxldmVscy9fZHJhaW5fbGV2ZWwgcGFydGl0aW9uaW5nLlxuXG5BY2NlcHRhbmNlIGNyaXRlcmlhOlxuLSBweXRob24gLW0gcHl0ZXN0IC1xIGdyZWVuIHdpdGggdGhlIG5ldyB0ZXN0cyBpbmNsdWRlZC5cbi0gQ292ZXJhZ2Ugb2YgdGhlIG1vZHVsZSdzIHB1YmxpYyBmdW5jdGlvbnMgd2l0aG91dCBtb2NraW5nIGludGVybmFscy4iLCJmaWxlcyI6WyJzcmMvdGFnaS9hbmFseXplci9kZXBlbmRlbmN5X2dyYXBoLnB5Il0sImlkIjoiUExGLTE3OCIsImxhYmVscyI6WyJrb3J1IiwibmwtdGFzayIsImxsbS1yZWFkeSIsInByb2plY3QtZGlzY292ZXJ5IiwidGVzdHMiXSwibmFtZSI6IkFkZCB1bml0IHRlc3RzIGZvciBhbmFseXplci9kZXBlbmRlbmN5X2dyYXBoLnB5IiwicHJpb3JpdHkiOiJoaWdoIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDIxOjEzOjI1LjMzMTQ0N1oiLCJ0b29sIjoia29ydS1wcm9qZWN0LWRpc2NvdmVyeSJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQyMToxMzoyNS4zNDQxNjVaIn19 + files: + - src/tagi/analyzer/dependency_graph.py + history: [] + id: PLF-178 + labels: + - koru + - nl-task + - llm-ready + - project-discovery + - tests + name: Add unit tests for analyzer/dependency_graph.py + priority: high + source: + context: {} + timestamp: '2026-09-19T21:13:25.331447Z' + tool: koru-project-discovery + sprint: current + status: open + sync: {} + updated_at: '2026-09-19T21:13:25.344165Z' + PLF-179: + acceptance_criteria: [] + blocked_by: [] + blocks: [] + children: [] + contract_version: planfile.ticket/v1 + created_at: '2026-09-19T21:13:31.396943Z' + description: 'src/tagi/providers/koru.py (171L, CC=8) implements KoruProvider, + including analyze_deployment_priority flagged by code2llm as high fan-out + (10, limit 10 — project/project.toon.yaml ALERTS). It has no test coverage + (verified 2026-09-19); github/gitlab providers each have a dedicated test + module, koru does not. + + + Add tests/test_koru_provider.py following the test_github_provider.py/test_gitlab_provider.py + pattern, covering: + + - is_authenticated / get_auth_status for token-present and token-missing cases. + + - analyze_deployment_priority output shape for representative inputs. + + - create_pr / detect_remote behavior with a stubbed transport. + + - Error paths (missing config, failed command). + + + Acceptance criteria: + + - python -m pytest -q green with the new tests included. + + - No network access in tests (stub/mocked transport only).' + dsl: SODL/1 id=evt_66de8743a3eefd20e509044a event_hash=35a4ce7177c8b0a23e2cfef6be335c571ee64328a9a7ce75f2879f68559faad0 + timestamp=2026-09-19T21%3A13%3A31.396943%2B00%3A00 kind=task source=planfile.ticket + ticket_id=PLF-179 actor=koru-project-discovery oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-179%2Fcommand%2Fcreate + mode=apply status=open correlation_id=PLF-179 causation_id=- input_hash=efe4ccacd819cd7b58a15895e0fd785559b241912e310199661481ecb3252de5 + receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMjE6MTM6MzEuMzk2OTQzWiIsImRlc2NyaXB0aW9uIjoic3JjL3RhZ2kvcHJvdmlkZXJzL2tvcnUucHkgKDE3MUwsIENDPTgpIGltcGxlbWVudHMgS29ydVByb3ZpZGVyLCBpbmNsdWRpbmcgYW5hbHl6ZV9kZXBsb3ltZW50X3ByaW9yaXR5IGZsYWdnZWQgYnkgY29kZTJsbG0gYXMgaGlnaCBmYW4tb3V0ICgxMCwgbGltaXQgMTAg4oCUIHByb2plY3QvcHJvamVjdC50b29uLnlhbWwgQUxFUlRTKS4gSXQgaGFzIG5vIHRlc3QgY292ZXJhZ2UgKHZlcmlmaWVkIDIwMjYtMDktMTkpOyBnaXRodWIvZ2l0bGFiIHByb3ZpZGVycyBlYWNoIGhhdmUgYSBkZWRpY2F0ZWQgdGVzdCBtb2R1bGUsIGtvcnUgZG9lcyBub3QuXG5cbkFkZCB0ZXN0cy90ZXN0X2tvcnVfcHJvdmlkZXIucHkgZm9sbG93aW5nIHRoZSB0ZXN0X2dpdGh1Yl9wcm92aWRlci5weS90ZXN0X2dpdGxhYl9wcm92aWRlci5weSBwYXR0ZXJuLCBjb3ZlcmluZzpcbi0gaXNfYXV0aGVudGljYXRlZCAvIGdldF9hdXRoX3N0YXR1cyBmb3IgdG9rZW4tcHJlc2VudCBhbmQgdG9rZW4tbWlzc2luZyBjYXNlcy5cbi0gYW5hbHl6ZV9kZXBsb3ltZW50X3ByaW9yaXR5IG91dHB1dCBzaGFwZSBmb3IgcmVwcmVzZW50YXRpdmUgaW5wdXRzLlxuLSBjcmVhdGVfcHIgLyBkZXRlY3RfcmVtb3RlIGJlaGF2aW9yIHdpdGggYSBzdHViYmVkIHRyYW5zcG9ydC5cbi0gRXJyb3IgcGF0aHMgKG1pc3NpbmcgY29uZmlnLCBmYWlsZWQgY29tbWFuZCkuXG5cbkFjY2VwdGFuY2UgY3JpdGVyaWE6XG4tIHB5dGhvbiAtbSBweXRlc3QgLXEgZ3JlZW4gd2l0aCB0aGUgbmV3IHRlc3RzIGluY2x1ZGVkLlxuLSBObyBuZXR3b3JrIGFjY2VzcyBpbiB0ZXN0cyAoc3R1Yi9tb2NrZWQgdHJhbnNwb3J0IG9ubHkpLiIsImZpbGVzIjpbInNyYy90YWdpL3Byb3ZpZGVycy9rb3J1LnB5Il0sImlkIjoiUExGLTE3OSIsImxhYmVscyI6WyJrb3J1IiwibmwtdGFzayIsImxsbS1yZWFkeSIsInByb2plY3QtZGlzY292ZXJ5IiwidGVzdHMiXSwibmFtZSI6IkFkZCB1bml0IHRlc3RzIGZvciBwcm92aWRlcnMva29ydS5weSAoS29ydVByb3ZpZGVyKSIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDIxOjEzOjMxLjM4NzQxNloiLCJ0b29sIjoia29ydS1wcm9qZWN0LWRpc2NvdmVyeSJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQyMToxMzozMS4zOTY5NTJaIn19 + files: + - src/tagi/providers/koru.py + history: [] + id: PLF-179 + labels: + - koru + - nl-task + - llm-ready + - project-discovery + - tests + name: Add unit tests for providers/koru.py (KoruProvider) + priority: normal + source: + context: {} + timestamp: '2026-09-19T21:13:31.387416Z' + tool: koru-project-discovery + sprint: current + status: open + sync: {} + updated_at: '2026-09-19T21:13:31.396952Z' diff --git a/.planfile/sprints/current.yaml.fast.json b/.planfile/sprints/current.yaml.fast.json index 658c37e..4ef5da6 100644 --- a/.planfile/sprints/current.yaml.fast.json +++ b/.planfile/sprints/current.yaml.fast.json @@ -1 +1 @@ -{"version": 1, "yaml_mtime_ns": 1789839112659613381, "data": {"sprint": {"id": "current", "name": "Current", "status": "active", "tickets": {"GITHUB-138": {"assignee": null, "backend": "github", "description": "\ncode2llm reports `Shotgun Surgery: tags` in `src/tagi/heuristics/tags.py:66`.\n\nMutation of variable 'tags' spans 6 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.\n\n---\n\n**Strategy Metadata:**\n- repository: semcod/tagi\n- planfile_id: semcod/tagi:2521ebe187e61bb2:PLF-115\n", "external_id": "138", "history": [{"action": "update", "changes": ["sprint"], "reason": "move_ticket", "source": "planfile.store", "timestamp": "2026-09-19T17:21:43.578226+00:00"}], "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "semcod/tagi:2521ebe187e61bb2:PLF-115"}, "name": "Address code smell: Shotgun Surgery: tags", "sprint": "current", "status": "open", "sync": {"github": {"id": "138", "key": "semcod/tagi#138", "url": "https://github.com/semcod/tagi/issues/138"}}, "updated_at": "2026-09-19T17:21:43.578177+00:00"}, "GITHUB-6": {"assignee": null, "backend": "github", "description": "\n## Cel i etap\n\nKampania wellmanifest/docs v0.4.0 dla **semcod/tagi**. Etap: **PLAN / poczekalnia**.\nTo zgłoszenie nie uruchamia wykonawcy ani nie nadaje uprawnień do usuwania danych, zmiany chronionego CI lub samodzielnego merge.\n\nStandard: https://github.com/wellmanifest/docs/tree/867241833a7e69188d595505d116115736438c7a\nPrzed rozpoczęciem sprawdzić, czy istniejąca adopcja i zadania już realizują ten zakres; wznowić pasujące zadanie zamiast tworzyć konkurencyjne.\n\n## Obserwacja wejściowa (2026-09-14, lokalny checkout)\n\n- Rewizja: `3b550841ed6c7be485c5056a7a45aaae3a9f7d16`; liczba śledzonych Markdown pod docs/: **5**.\n- To inwentaryzacja ścieżek, nie aktualny audyt treści ani dowód duplikacji. Ponowić względem aktualnej gałęzi domyślnej `main`.\n- `docs/README.md`\n- `docs/configuration.md`\n- `docs/information/internal-dependencies.md`\n- `docs/provider-detection.md`\n- `docs/troubleshooting.md`\n\n## Zakres i kryteria odbioru\n\n- [ ] AC-01: Zmapować docs, indeksy, changelogi, obecne i historyczne tickety (Planfile/project/SQLite), issues i PR-y. Uzgodnić statusy z kodem oraz dowodami scalenia; nie zamykać zadań na podstawie starego TODO.\n- [ ] AC-02: Dla każdej rodziny dokumentów wskazać właściciela, kanoniczną ścieżkę i decyzję: zachować / zaktualizować / scalić / superseded. Podobieństwo tekstu nie jest dowodem zbędności; nie usuwać unikalnych wymagań, dowodów ani zarządzanych kopii standardów.\n- [ ] AC-03: Migrować małymi partiami do krótkich plików WIELKIMI_LITERAMI.md w odpowiednich kategoriach FEATURE, BUGFIX, SERVICE, INFORMATION, ANALYSIS, REFACTORING lub DECISION. Pilność zapisać jako P0–P3, nie jako typ dokumentu. Zachować wyjątki organizacyjne i zgodność historycznego v1.\n- [ ] AC-04: Zachować stare linki i kotwice przez poprawne mapy dawnych ścieżek; zaktualizować docs/README.md i odnośniki z changeloga bez powielania treści. Udokumentować każdą usuniętą kopię i dowód zachowania jej unikalnej treści; nie kasować historii ticketów.\n- [ ] AC-05: Przyjąć immutable pin standardu w procesie właściwym dla repo i podłączyć preflight oraz finalny checker do istniejącego CI. Sprawdzić zaufane base/HEAD. Globalny filtr fleet standardu ograniczony do subactor/* nie dowodzi pokrycia semcod/autogrammar; raportować i rozwiązać tę lukę bez obejścia bramy.\n- [ ] AC-06: DSL jest opcjonalny tylko dla formalnych FEATURE/BUGFIX; użyć parsera przypiętego przez policy-dsl.lock.json. DSL nie wykonuje testów ani nie zatwierdza zmiany. Nie przepisywać całej dokumentacji na DSL.\n- [ ] AC-07: Sprawdzić linki i kotwice, zachowanie wymagań, governance, testy projektu i ponowne uruchomienie bez dodatkowych zmian. Oddzielić liczbę plików od jakości i kompletności migracji.\n- [ ] AC-08: Osobny ograniczony ticket/worktree/PR zgodnie z zasadami repo; niezależny review i chroniona publikacja. Raport końcowy: pokrycie, pominięcia, konflikty, model rzeczywiście użyty, wyniki kontroli i URL scalonego PR.\n\n## Kolejność\n\nAudyt read-only → uzgodnienie istniejących zadań → plan migracji → pilotaż → małe partie → przegląd i publikacja.\nPierwsza grupa pilotażowa: semcod/koru, semcod/goal, semcod/taskand-glm53. Pozostałe repo oczekują oceny pilotażu; samo utworzenie issue nie włącza automatyzacji.\nNie nadpisywać brudnych checkoutów, nie zmieniać aplikacji ani statusów historycznych zadań w ramach samego porządkowania docs.\n\n## Powiązane wcześniejsze zgłoszenia\n\n- Audyt GitHub nie znalazł powiązanego zgłoszenia po tytule; nadal sprawdzić lokalne i historyczne zadania.\n\n\n---\n\n**Strategy Metadata:**\n- deduplication_key: wellmanifest-docs-v04:semcod/tagi\n- campaign: wellmanifest-docs-v04\n- standard_revision: 867241833a7e69188d595505d116115736438c7a\n- phase: PLAN\n", "external_id": "6", "history": [{"action": "update", "changes": ["sprint"], "reason": "move_ticket", "source": "planfile.store", "timestamp": "2026-09-19T17:21:44.611616+00:00"}], "integration": ["github"], "labels": ["documentation", "docs-standard-v04", "planning-only", "priority-normal", "planfile", "managed"], "metadata": {"deduplication_key": "wellmanifest-docs-v04:semcod/tagi"}, "name": "[DOCS] Standaryzacja dokumentacji, uzgodnienie historii i deduplikacja", "sprint": "current", "status": "open", "sync": {"github": {"id": "6", "key": "semcod/tagi#6", "url": "https://github.com/semcod/tagi/issues/6"}}, "updated_at": "2026-09-19T17:21:44.611586+00:00"}, "GITHUB-7": {"assignee": null, "backend": "github", "description": "\n\nAudit date: 2026-09-15. Scope: this repository only; planning, not authorization to modify source or deploy.\n\nObserved local checkout SHA: `3b550841ed6c7be485c5056a7a45aaae3a9f7d16`. Local declared adoption status: `review-required`.\n\nComparison is against observed GitHub default-branch commits and VERSION, not an assertion that every changed commit requires an upgrade.\n\nNo declarations means unavailable evidence, not proof that no standard is followed. Select applicable wellmanifest packs; do not install every pack indiscriminately.\n\n- wellmanifest/docs: adopted `ebe7501063ef4f3e63ded610c2d3183010ca636e` (version None); observed upstream `aa92136b4e94f48355c39fb206286aba024c6aa4` (version 0.5.0); pin-differs-review-required. Declaration: `.governance/docs.json`.\n\n## Acceptance criteria\n\n- [ ] Reconcile actual applicable standard adoptions with deployed/default-branch state; record unknowns and exemptions.\n- [ ] For each differing pin, compare version and relevant artifacts; use the managed adopter in a separate bounded implementation ticket only when needed.\n- [ ] Preserve project overrides, dirty work, historical tasks and stable document links; never edit managed hashes to bypass validation.\n- [ ] Verify local Planfile ID to GitHub issue mapping and retry deduplication without broad bidirectional sync.\n- [ ] Run managed governance and stack checks after any separately authorized adoption; report declared versus protected-CI coverage.\n\nExisting related work (reconcile/reuse scope; do not duplicate implementation):\n- https://github.com/semcod/tagi/issues/6\n\n---\n\n**Strategy Metadata:**\n- deduplication_key: dev-quality-fleet-readiness-v1:semcod/tagi\n- planfile_id: PLF-012\n", "external_id": "7", "history": [{"action": "update", "changes": ["sprint"], "reason": "move_ticket", "source": "planfile.store", "timestamp": "2026-09-19T17:21:45.359903+00:00"}], "integration": ["github"], "labels": ["planfile", "managed"], "metadata": {"deduplication_key": "dev-quality-fleet-readiness-v1:semcod/tagi"}, "name": "[WELLMANIFEST] Reconcile adopted standards and verify Planfile delivery", "sprint": "current", "status": "open", "sync": {"github": {"id": "7", "key": "semcod/tagi#7", "url": "https://github.com/semcod/tagi/issues/7"}}, "updated_at": "2026-09-19T17:21:45.359877+00:00"}, "PLF-088": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T22:59:24.712993+00:00", "description": "\ncode2llm reports `Data Clump: body, repo_path, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, repo_path, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "84", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: body, repo_path, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, repo_path, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T22:59:24.712993+00:00"}], "id": "PLF-088", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: body, repo_path, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, repo_path, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "data-clump"], "metadata": {"deduplication_key": "PLF-088"}, "name": "Address code smell: Data Clump: body, repo_path, title", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: body, repo_path, title", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1789683999494622908, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: body, repo_path, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, repo_path, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-17T22:59:24.712993+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "84", "key": "semcod/tagi#84", "url": "https://github.com/semcod/tagi/issues/84"}}, "updated_at": "2026-09-17T22:59:24.712993+00:00"}, "PLF-089": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:00:40.968749+00:00", "description": "\ncode2llm reports `God Function: _calculate_complexity` in `src/tagi/heuristics/metrics.py:46`.\n\nFunction '_calculate_complexity' is oversized: CC=5, fan-out=6, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "85", "files": ["src/tagi/heuristics/metrics.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: _calculate_complexity` in `src/tagi/heuristics/metrics.py:46`.\n\nFunction '_calculate_complexity' is oversized: CC=5, fan-out=6, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:00:40.968749+00:00"}], "id": "PLF-089", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: _calculate_complexity` in `src/tagi/heuristics/metrics.py:46`.\n\nFunction '_calculate_complexity' is oversized: CC=5, fan-out=6, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-089"}, "name": "Address code smell: God Function: _calculate_complexity", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/heuristics/metrics.py:46:God Function: _calculate_complexity", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779811310790143885, "path": "src/tagi/heuristics/metrics.py", "sha256": "dcd2cc0255c4f2ee3eee8aaae72af3e54f0aa6a78598d290d61eb44299401b2d", "size_bytes": 6521}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: _calculate_complexity` in `src/tagi/heuristics/metrics.py:46`.\n\nFunction '_calculate_complexity' is oversized: CC=5, fan-out=6, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:00:40.968749+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "85", "key": "semcod/tagi#85", "url": "https://github.com/semcod/tagi/issues/85"}}, "updated_at": "2026-09-17T23:00:40.968749+00:00"}, "PLF-090": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:02:04.118321+00:00", "description": "\ncode2llm reports `God Function: _calculate_impact` in `src/tagi/heuristics/metrics.py:78`.\n\nFunction '_calculate_impact' is oversized: CC=5, fan-out=3, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "86", "files": ["src/tagi/heuristics/metrics.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: _calculate_impact` in `src/tagi/heuristics/metrics.py:78`.\n\nFunction '_calculate_impact' is oversized: CC=5, fan-out=3, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:02:04.118321+00:00"}], "id": "PLF-090", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: _calculate_impact` in `src/tagi/heuristics/metrics.py:78`.\n\nFunction '_calculate_impact' is oversized: CC=5, fan-out=3, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-090"}, "name": "Address code smell: God Function: _calculate_impact", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/heuristics/metrics.py:78:God Function: _calculate_impact", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779811310790143885, "path": "src/tagi/heuristics/metrics.py", "sha256": "dcd2cc0255c4f2ee3eee8aaae72af3e54f0aa6a78598d290d61eb44299401b2d", "size_bytes": 6521}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: _calculate_impact` in `src/tagi/heuristics/metrics.py:78`.\n\nFunction '_calculate_impact' is oversized: CC=5, fan-out=3, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:02:04.118321+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "86", "key": "semcod/tagi#86", "url": "https://github.com/semcod/tagi/issues/86"}}, "updated_at": "2026-09-17T23:02:04.118321+00:00"}, "PLF-091": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:03:33.158245+00:00", "description": "\ncode2llm reports `God Function: _load_config` in `src/tagi/config.py:30`.\n\nFunction '_load_config' is oversized: CC=13, fan-out=6, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "87", "files": ["src/tagi/config.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: _load_config` in `src/tagi/config.py:30`.\n\nFunction '_load_config' is oversized: CC=13, fan-out=6, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:03:33.158245+00:00"}], "id": "PLF-091", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: _load_config` in `src/tagi/config.py:30`.\n\nFunction '_load_config' is oversized: CC=13, fan-out=6, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-091"}, "name": "Address code smell: God Function: _load_config", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/config.py:30:God Function: _load_config", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779802844828755285, "path": "src/tagi/config.py", "sha256": "a3f500d3b7d42e797a2054b5ec56c45baf27c8a5e9877c20c9f23f63c091433a", "size_bytes": 4314}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: _load_config` in `src/tagi/config.py:30`.\n\nFunction '_load_config' is oversized: CC=13, fan-out=6, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:03:33.158245+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "87", "key": "semcod/tagi#87", "url": "https://github.com/semcod/tagi/issues/87"}}, "updated_at": "2026-09-17T23:03:33.158245+00:00"}, "PLF-092": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:05:09.293887+00:00", "description": "\ncode2llm reports `God Function: analyze_python_imports` in `src/tagi/analyzer/dependency_graph.py:9`.\n\nFunction 'analyze_python_imports' is oversized: CC=8, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "88", "files": ["src/tagi/analyzer/dependency_graph.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: analyze_python_imports` in `src/tagi/analyzer/dependency_graph.py:9`.\n\nFunction 'analyze_python_imports' is oversized: CC=8, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:05:09.293887+00:00"}], "id": "PLF-092", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: analyze_python_imports` in `src/tagi/analyzer/dependency_graph.py:9`.\n\nFunction 'analyze_python_imports' is oversized: CC=8, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-092"}, "name": "Address code smell: God Function: analyze_python_imports", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/analyzer/dependency_graph.py:9:God Function: analyze_python_imports", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779810400712577609, "path": "src/tagi/analyzer/dependency_graph.py", "sha256": "56c60106b3e4d548089071146800fdcc6eddfdcb2b14c53bce8d7532487723bf", "size_bytes": 5250}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: analyze_python_imports` in `src/tagi/analyzer/dependency_graph.py:9`.\n\nFunction 'analyze_python_imports' is oversized: CC=8, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:05:09.293887+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "88", "key": "semcod/tagi#88", "url": "https://github.com/semcod/tagi/issues/88"}}, "updated_at": "2026-09-17T23:05:09.293887+00:00"}, "PLF-093": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:06:54.291030+00:00", "description": "\ncode2llm reports `God Function: apply_tags` in `src/tagi/heuristics/tags.py:12`.\n\nFunction 'apply_tags' is oversized: CC=11, fan-out=10, mutations=16.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "89", "files": ["src/tagi/heuristics/tags.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: apply_tags` in `src/tagi/heuristics/tags.py:12`.\n\nFunction 'apply_tags' is oversized: CC=11, fan-out=10, mutations=16.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:06:54.291030+00:00"}], "id": "PLF-093", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: apply_tags` in `src/tagi/heuristics/tags.py:12`.\n\nFunction 'apply_tags' is oversized: CC=11, fan-out=10, mutations=16.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-093"}, "name": "Address code smell: God Function: apply_tags", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/heuristics/tags.py:12:God Function: apply_tags", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779811321149251584, "path": "src/tagi/heuristics/tags.py", "sha256": "098c64d70cd068c2113523675c53a957d92d646558f9295490c4d6f027c5d064", "size_bytes": 3404}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: apply_tags` in `src/tagi/heuristics/tags.py:12`.\n\nFunction 'apply_tags' is oversized: CC=11, fan-out=10, mutations=16.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:06:54.291030+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "89", "key": "semcod/tagi#89", "url": "https://github.com/semcod/tagi/issues/89"}}, "updated_at": "2026-09-17T23:06:54.291030+00:00"}, "PLF-094": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:08:50.360840+00:00", "description": "\ncode2llm reports `God Function: build_report_header` in `src/tagi/utils/summary_helpers.py:9`.\n\nFunction 'build_report_header' is oversized: CC=1, fan-out=2, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "90", "files": ["src/tagi/utils/summary_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: build_report_header` in `src/tagi/utils/summary_helpers.py:9`.\n\nFunction 'build_report_header' is oversized: CC=1, fan-out=2, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:08:50.360840+00:00"}], "id": "PLF-094", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: build_report_header` in `src/tagi/utils/summary_helpers.py:9`.\n\nFunction 'build_report_header' is oversized: CC=1, fan-out=2, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-094"}, "name": "Address code smell: God Function: build_report_header", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/utils/summary_helpers.py:9:God Function: build_report_header", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779814990412632237, "path": "src/tagi/utils/summary_helpers.py", "sha256": "a887228547f1b705ca84a96f28fc2d6e62d0ea14bf143f32faa9a31fe3d7c1f4", "size_bytes": 3017}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: build_report_header` in `src/tagi/utils/summary_helpers.py:9`.\n\nFunction 'build_report_header' is oversized: CC=1, fan-out=2, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:08:50.360840+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "90", "key": "semcod/tagi#90", "url": "https://github.com/semcod/tagi/issues/90"}}, "updated_at": "2026-09-17T23:08:50.360840+00:00"}, "PLF-109": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T09:38:21.536635+00:00", "description": "\ncode2llm reports `Data Clump: title, repo_path, body` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, repo_path, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "105", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: title, repo_path, body` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, repo_path, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T09:38:21.536635+00:00"}], "id": "PLF-109", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: title, repo_path, body` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, repo_path, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "data-clump"], "metadata": {"deduplication_key": "PLF-109"}, "name": "Address code smell: Data Clump: title, repo_path, body", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: title, repo_path, body", "evidence": {"artifact": {"mtime_ns": 1789722832140537337, "path": "project/analysis.toon.yaml", "sha256": "9227c40940ca4b556af8287eff9e84ce13c73372481f6eeaf0baec8aca773183", "size_bytes": 10381}, "files": [{"mtime_ns": 1789683999494622908, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789722832246791207, "path": "project/planfile-tickets.yaml", "sha256": "7a9953a26921f7b5cc634a034b7a538112d1ddfd75b1718c00dd8d817d84ffa1", "size_bytes": 30378}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: title, repo_path, body` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, repo_path, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-18T09:38:21.536635+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "105", "key": "semcod/tagi#105", "url": "https://github.com/semcod/tagi/issues/105"}}, "updated_at": "2026-09-18T09:38:21.536635+00:00"}, "PLF-118": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T14:31:50.817670+00:00", "description": "\ncode2llm reports `Data Clump: repo_path, title, body` in `src/tagi/cli/provider_commands.py:52`.\n\nArguments (repo_path, title, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "120", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: repo_path, title, body` in `src/tagi/cli/provider_commands.py:52`.\n\nArguments (repo_path, title, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T14:31:50.817670+00:00"}], "id": "PLF-118", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: repo_path, title, body` in `src/tagi/cli/provider_commands.py:52`.\n\nArguments (repo_path, title, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "data-clump"], "metadata": {"deduplication_key": "PLF-118"}, "name": "Address code smell: Data Clump: repo_path, title, body", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:52:Data Clump: repo_path, title, body", "evidence": {"artifact": {"mtime_ns": 1789739375335946512, "path": "project/analysis.toon.yaml", "sha256": "e383157236def469e5391fba233c9fa81738ef3ca0eafbc8c835538ac4a7d28d", "size_bytes": 10289}, "files": [{"mtime_ns": 1789739346063914074, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789739375343946523, "path": "project/planfile-tickets.yaml", "sha256": "2d45686552b801deab82b10b66dedd6931f7dbc2cb2cdde8e0d1e76d2fdb06d8", "size_bytes": 29675}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: repo_path, title, body` in `src/tagi/cli/provider_commands.py:52`.\n\nArguments (repo_path, title, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-18T14:31:50.817670+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "120", "key": "semcod/tagi#120", "url": "https://github.com/semcod/tagi/issues/120"}}, "updated_at": "2026-09-18T14:31:50.817670+00:00"}, "PLF-119": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T14:43:06.846910+00:00", "description": "\ncode2llm reports `src.tagi.utils.inspect_helpers.resolve_filtered_changes` at `src/tagi/utils/inspect_helpers.py:10` with cyclomatic complexity 17 (limit 15).\n\nExtract smaller functions, flatten conditionals, or split strategy branches. Re-run code2llm after the change and keep tests green.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "121", "files": ["src/tagi/utils/inspect_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `src.tagi.utils.inspect_helpers.resolve_filtered_changes` at `src/tagi/utils/inspect_helpers.py:10` with cyclomatic complexity 17 (limit 15).\n\nExtract smaller functions, flatten conditionals, or split strategy branches. Re-run code2llm after the change and keep tests green.", "source": "koru task", "timestamp": "2026-09-18T14:43:06.846910+00:00"}], "id": "PLF-119", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `src.tagi.utils.inspect_helpers.resolve_filtered_changes` at `src/tagi/utils/inspect_helpers.py:10` with cyclomatic complexity 17 (limit 15).\n\nExtract smaller functions, flatten conditionals, or split strategy branches. Re-run code2llm after the change and keep tests green."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "refactor", "complexity"], "metadata": {"deduplication_key": "PLF-119"}, "name": "Reduce cyclomatic complexity: src.tagi.utils.inspect_helpers.resolve_filtered_changes (CC=17)", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:cc:src/tagi/utils/inspect_helpers.py:src.tagi.utils.inspect_helpers.resolve_filtered_changes", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1789740908491220682, "path": "src/tagi/utils/inspect_helpers.py", "sha256": "d344cd14a3264e66e6d12340f6dba4af3713defdc5d9c246f6aba695357c0ea3", "size_bytes": 3655}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `src.tagi.utils.inspect_helpers.resolve_filtered_changes` at `src/tagi/utils/inspect_helpers.py:10` with cyclomatic complexity 17 (limit 15).\n\nExtract smaller functions, flatten conditionals, or split strategy branches. Re-run code2llm after the change and keep tests green.", "signal": "code2llm_cc"}, "timestamp": "2026-09-18T14:43:06.846910+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "121", "key": "semcod/tagi#121", "url": "https://github.com/semcod/tagi/issues/121"}}, "updated_at": "2026-09-18T14:43:06.846910+00:00"}, "PLF-120": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T14:47:32.219905+00:00", "description": "\ncode2llm reports `God Function: calculate_risk_score` in `src/tagi/heuristics/scoring.py:8`.\n\nFunction 'calculate_risk_score' is oversized: CC=7, fan-out=1, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "122", "files": ["src/tagi/heuristics/scoring.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: calculate_risk_score` in `src/tagi/heuristics/scoring.py:8`.\n\nFunction 'calculate_risk_score' is oversized: CC=7, fan-out=1, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T14:47:32.219905+00:00"}], "id": "PLF-120", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: calculate_risk_score` in `src/tagi/heuristics/scoring.py:8`.\n\nFunction 'calculate_risk_score' is oversized: CC=7, fan-out=1, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-120"}, "name": "Address code smell: God Function: calculate_risk_score", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/heuristics/scoring.py:8:God Function: calculate_risk_score", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1779802847615519629, "path": "src/tagi/heuristics/scoring.py", "sha256": "d9dd32ed33121c23414ebae66d33fcd25489b6bcdc29342d9942e6a5fb33e652", "size_bytes": 777}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: calculate_risk_score` in `src/tagi/heuristics/scoring.py:8`.\n\nFunction 'calculate_risk_score' is oversized: CC=7, fan-out=1, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T14:47:32.219905+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "122", "key": "semcod/tagi#122", "url": "https://github.com/semcod/tagi/issues/122"}}, "updated_at": "2026-09-18T14:47:32.219905+00:00"}, "PLF-126": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T15:46:34.272245+00:00", "description": "\ncode2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "128", "files": ["src/tagi/planner/branch_grouper.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T15:46:34.272245+00:00"}], "id": "PLF-126", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-126"}, "name": "Address code smell: God Function: group_by_branch", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/planner/branch_grouper.py:7:God Function: group_by_branch", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1779810382570385717, "path": "src/tagi/planner/branch_grouper.py", "sha256": "7495814bca28a8dda4134f4498a644fc1c4bfaf3fbc141de4c45b3cfa5cd96eb", "size_bytes": 2702}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T15:46:34.272245+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "128", "key": "semcod/tagi#128", "url": "https://github.com/semcod/tagi/issues/128"}}, "updated_at": "2026-09-18T15:46:34.272245+00:00"}, "PLF-127": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:24:25.964206+00:00", "description": "\ncode2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "129", "files": ["src/tagi/cli/utility_commands.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T16:24:25.964206+00:00"}], "id": "PLF-127", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-127"}, "name": "Address code smell: God Function: hooks_command", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/cli/utility_commands.py:131:God Function: hooks_command", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1789740908490220674, "path": "src/tagi/cli/utility_commands.py", "sha256": "a78c23996b91860bd73b82a719e52a8fffcc68bf0e6756e7379c01e30d578c1a", "size_bytes": 7225}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T16:24:25.964206+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "129", "key": "semcod/tagi#129", "url": "https://github.com/semcod/tagi/issues/129"}}, "updated_at": "2026-09-18T16:24:25.964206+00:00"}, "PLF-128": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:29:19.809691+00:00", "description": "\ncode2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "130", "files": ["src/tagi/cli/inspection_commands.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T16:29:19.809691+00:00"}], "id": "PLF-128", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-128"}, "name": "Address code smell: God Function: inspect_command", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/cli/inspection_commands.py:19:God Function: inspect_command", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1789740908490220674, "path": "src/tagi/cli/inspection_commands.py", "sha256": "666b4944feb18f6673bbbfb664cda2a082ec1a041b67fdaff58a8d80976bd198", "size_bytes": 4284}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T16:29:19.809691+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "130", "key": "semcod/tagi#130", "url": "https://github.com/semcod/tagi/issues/130"}}, "updated_at": "2026-09-18T16:29:19.809691+00:00"}, "PLF-129": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:34:15.855415+00:00", "description": "\ncode2llm reports `God Function: preview_changes` in `src/tagi/planner/preview.py:29`.\n\nFunction 'preview_changes' is oversized: CC=3, fan-out=5, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "131", "files": ["src/tagi/planner/preview.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: preview_changes` in `src/tagi/planner/preview.py:29`.\n\nFunction 'preview_changes' is oversized: CC=3, fan-out=5, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T16:34:15.855415+00:00"}], "id": "PLF-129", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: preview_changes` in `src/tagi/planner/preview.py:29`.\n\nFunction 'preview_changes' is oversized: CC=3, fan-out=5, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-129"}, "name": "Address code smell: God Function: preview_changes", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/planner/preview.py:29:God Function: preview_changes", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1789739375293946457, "path": "src/tagi/planner/preview.py", "sha256": "8d3998cd67c562eb08e3ae5ecdcf2feaaff4d9f1ca864344a214c44d81b83a41", "size_bytes": 1363}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: preview_changes` in `src/tagi/planner/preview.py:29`.\n\nFunction 'preview_changes' is oversized: CC=3, fan-out=5, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T16:34:15.855415+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "131", "key": "semcod/tagi#131", "url": "https://github.com/semcod/tagi/issues/131"}}, "updated_at": "2026-09-18T16:34:15.855415+00:00"}, "PLF-131": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:49:07.021464+00:00", "description": "\n`project/analysis.toon.yaml` reports `resolve_filtered_changes` with CC=17 (limit=15), defined in `src/tagi/utils/inspect_helpers.py:10`. Extract sub-functions, simplify conditionals, or split into strategy pattern. Preserve behaviour — this is a pure refactor.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "133", "files": ["src/tagi/utils/inspect_helpers.py"], "history": [{"action": "created", "message": "`project/analysis.toon.yaml` reports `resolve_filtered_changes` with CC=17 (limit=15), defined in `src/tagi/utils/inspect_helpers.py:10`. Extract sub-functions, simplify conditionals, or split into strategy pattern. Preserve behaviour — this is a pure refactor.", "source": "koru task", "timestamp": "2026-09-18T16:49:07.021464+00:00"}], "id": "PLF-131", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "`project/analysis.toon.yaml` reports `resolve_filtered_changes` with CC=17 (limit=15), defined in `src/tagi/utils/inspect_helpers.py:10`. Extract sub-functions, simplify conditionals, or split into strategy pattern. Preserve behaviour — this is a pure refactor."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "refactor", "scan", "complexity"], "metadata": {"deduplication_key": "PLF-131"}, "name": "Reduce cyclomatic complexity: resolve_filtered_changes (CC=17, limit=15)", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "koru-scan:code2llm_cc:src/tagi/utils/inspect_helpers.py", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "kind": "code2llm_analysis", "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude '*.md' --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate the artifact and compare artifact.sha256 before assuming this ticket still reflects the current code."}, "input": "`project/analysis.toon.yaml` reports `resolve_filtered_changes` with CC=17 (limit=15), defined in `src/tagi/utils/inspect_helpers.py:10`. Extract sub-functions, simplify conditionals, or split into strategy pattern. Preserve behaviour — this is a pure refactor.", "signal": "code2llm_cc"}, "timestamp": "2026-09-18T16:49:07.021464+00:00", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "133", "key": "semcod/tagi#133", "url": "https://github.com/semcod/tagi/issues/133"}}, "updated_at": "2026-09-18T16:49:07.021464+00:00"}, "PLF-132": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:49:07.642356+00:00", "description": "\nREFACTOR item from `project/analysis.toon.yaml`: **split 1 high-CC methods** (CC>15). Execute this refactor step; re-run the source.context.evidence.regenerate_command to verify.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "134", "files": ["project/analysis.toon.yaml"], "history": [{"action": "created", "message": "REFACTOR item from `project/analysis.toon.yaml`: **split 1 high-CC methods** (CC>15). Execute this refactor step; re-run the source.context.evidence.regenerate_command to verify.", "source": "koru task", "timestamp": "2026-09-18T16:49:07.642356+00:00"}], "id": "PLF-132", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "REFACTOR item from `project/analysis.toon.yaml`: **split 1 high-CC methods** (CC>15). Execute this refactor step; re-run the source.context.evidence.regenerate_command to verify."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "refactor", "scan"], "metadata": {"deduplication_key": "PLF-132"}, "name": "code2llm refactor: split 1 high-CC methods", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "semcod:code2llm:refactor:project/analysis.toon.yaml", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "kind": "code2llm_analysis", "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude '*.md' --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate the artifact and compare artifact.sha256 before assuming this ticket still reflects the current code."}, "input": "REFACTOR item from `project/analysis.toon.yaml`: **split 1 high-CC methods** (CC>15). Execute this refactor step; re-run the source.context.evidence.regenerate_command to verify.", "signal": "code2llm_refactor"}, "timestamp": "2026-09-18T16:49:07.642356+00:00", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "134", "key": "semcod/tagi#134", "url": "https://github.com/semcod/tagi/issues/134"}}, "updated_at": "2026-09-18T16:49:07.642356+00:00"}, "PLF-135": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T19:36:57.323254+00:00", "description": "\ncode2llm reports `Shotgun Surgery: builder` in `src/tagi/utils/summary_helpers.py:71`.\n\nMutation of variable 'builder' spans 11 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "140", "files": ["src/tagi/utils/summary_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: builder` in `src/tagi/utils/summary_helpers.py:71`.\n\nMutation of variable 'builder' spans 11 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T19:36:57.323254+00:00"}], "id": "PLF-135", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: builder` in `src/tagi/utils/summary_helpers.py:71`.\n\nMutation of variable 'builder' spans 11 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-135"}, "name": "Address code smell: Shotgun Surgery: builder", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/utils/summary_helpers.py:71:Shotgun Surgery: builder", "evidence": {"artifact": {"mtime_ns": 1789760212841277131, "path": "project/analysis.toon.yaml", "sha256": "e779a23e78575a5ca1103e1494c9f5b9bf0ac7bdcb3ffbbab82e37914fa8de0a", "size_bytes": 10336}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/utils/summary_helpers.py", "sha256": "5b80ca05e1202f10e13c9873597a0a11ddf86af9b7cdcb2a9bb2dfb60c233e6a", "size_bytes": 3117}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789760212873891603, "path": "project/planfile-tickets.yaml", "sha256": "d0c2d6eb3eb46612e13fa7d7f524e92e895a3f31556b19210c5499cec6308586", "size_bytes": 22328}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: builder` in `src/tagi/utils/summary_helpers.py:71`.\n\nMutation of variable 'builder' spans 11 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-18T19:36:57.323254+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "140", "key": "semcod/tagi#140", "url": "https://github.com/semcod/tagi/issues/140"}}, "updated_at": "2026-09-18T19:36:57.323254+00:00"}, "PLF-136": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T19:41:42.348704+00:00", "description": "\ncode2llm reports `Shotgun Surgery: cmd` in `src/tagi/scanner/diff.py:6`.\n\nMutation of variable 'cmd' spans 13 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "141", "files": ["src/tagi/scanner/diff.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: cmd` in `src/tagi/scanner/diff.py:6`.\n\nMutation of variable 'cmd' spans 13 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T19:41:42.348704+00:00"}], "id": "PLF-136", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: cmd` in `src/tagi/scanner/diff.py:6`.\n\nMutation of variable 'cmd' spans 13 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-136"}, "name": "Address code smell: Shotgun Surgery: cmd", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/scanner/diff.py:6:Shotgun Surgery: cmd", "evidence": {"artifact": {"mtime_ns": 1789760212841277131, "path": "project/analysis.toon.yaml", "sha256": "e779a23e78575a5ca1103e1494c9f5b9bf0ac7bdcb3ffbbab82e37914fa8de0a", "size_bytes": 10336}, "files": [{"mtime_ns": 1779802548044288725, "path": "src/tagi/scanner/diff.py", "sha256": "5c96c6b90833c3d6205e40b53b402d2b1eca555c135ff8bbd9cd94f8931716f2", "size_bytes": 708}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789760212873891603, "path": "project/planfile-tickets.yaml", "sha256": "d0c2d6eb3eb46612e13fa7d7f524e92e895a3f31556b19210c5499cec6308586", "size_bytes": 22328}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: cmd` in `src/tagi/scanner/diff.py:6`.\n\nMutation of variable 'cmd' spans 13 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-18T19:41:42.348704+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "141", "key": "semcod/tagi#141", "url": "https://github.com/semcod/tagi/issues/141"}}, "updated_at": "2026-09-18T19:41:42.348704+00:00"}, "PLF-137": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T19:46:39.220367+00:00", "description": "\ncode2llm reports `Shotgun Surgery: logger` in `src/tagi/utils/logger.py:9`.\n\nMutation of variable 'logger' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "142", "files": ["src/tagi/utils/logger.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: logger` in `src/tagi/utils/logger.py:9`.\n\nMutation of variable 'logger' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T19:46:39.220367+00:00"}], "id": "PLF-137", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: logger` in `src/tagi/utils/logger.py:9`.\n\nMutation of variable 'logger' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-137"}, "name": "Address code smell: Shotgun Surgery: logger", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/utils/logger.py:9:Shotgun Surgery: logger", "evidence": {"artifact": {"mtime_ns": 1789760212841277131, "path": "project/analysis.toon.yaml", "sha256": "e779a23e78575a5ca1103e1494c9f5b9bf0ac7bdcb3ffbbab82e37914fa8de0a", "size_bytes": 10336}, "files": [{"mtime_ns": 1779809465287675064, "path": "src/tagi/utils/logger.py", "sha256": "25d7171aee4d351bc65d315acfa6d09d6e91491346c2ac3cca945577d7397c89", "size_bytes": 1747}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789760212873891603, "path": "project/planfile-tickets.yaml", "sha256": "d0c2d6eb3eb46612e13fa7d7f524e92e895a3f31556b19210c5499cec6308586", "size_bytes": 22328}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: logger` in `src/tagi/utils/logger.py:9`.\n\nMutation of variable 'logger' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-18T19:46:39.220367+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "142", "key": "semcod/tagi#142", "url": "https://github.com/semcod/tagi/issues/142"}}, "updated_at": "2026-09-18T19:46:39.220367+00:00"}, "PLF-138": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T19:51:27.884743+00:00", "description": "\ncode2llm reports `God Function: build_statistics_section` in `src/tagi/utils/summary_helpers.py:31`.\n\nFunction 'build_statistics_section' is oversized: CC=2, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "143", "files": ["src/tagi/utils/summary_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: build_statistics_section` in `src/tagi/utils/summary_helpers.py:31`.\n\nFunction 'build_statistics_section' is oversized: CC=2, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T19:51:27.884743+00:00"}], "id": "PLF-138", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: build_statistics_section` in `src/tagi/utils/summary_helpers.py:31`.\n\nFunction 'build_statistics_section' is oversized: CC=2, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-138"}, "name": "Address code smell: God Function: build_statistics_section", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/utils/summary_helpers.py:31:God Function: build_statistics_section", "evidence": {"artifact": {"mtime_ns": 1789760212841277131, "path": "project/analysis.toon.yaml", "sha256": "e779a23e78575a5ca1103e1494c9f5b9bf0ac7bdcb3ffbbab82e37914fa8de0a", "size_bytes": 10336}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/utils/summary_helpers.py", "sha256": "5b80ca05e1202f10e13c9873597a0a11ddf86af9b7cdcb2a9bb2dfb60c233e6a", "size_bytes": 3117}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789760212873891603, "path": "project/planfile-tickets.yaml", "sha256": "d0c2d6eb3eb46612e13fa7d7f524e92e895a3f31556b19210c5499cec6308586", "size_bytes": 22328}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: build_statistics_section` in `src/tagi/utils/summary_helpers.py:31`.\n\nFunction 'build_statistics_section' is oversized: CC=2, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T19:51:27.884743+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "143", "key": "semcod/tagi#143", "url": "https://github.com/semcod/tagi/issues/143"}}, "updated_at": "2026-09-18T19:51:27.884743+00:00"}, "PLF-139": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T20:26:23.964964+00:00", "description": "\ncode2llm reports `God Function: build_tag_distribution_section` in `src/tagi/utils/summary_helpers.py:71`.\n\nFunction 'build_tag_distribution_section' is oversized: CC=5, fan-out=6, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "144", "files": ["src/tagi/utils/summary_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: build_tag_distribution_section` in `src/tagi/utils/summary_helpers.py:71`.\n\nFunction 'build_tag_distribution_section' is oversized: CC=5, fan-out=6, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T20:26:23.964964+00:00"}], "id": "PLF-139", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: build_tag_distribution_section` in `src/tagi/utils/summary_helpers.py:71`.\n\nFunction 'build_tag_distribution_section' is oversized: CC=5, fan-out=6, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-139"}, "name": "Address code smell: God Function: build_tag_distribution_section", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/utils/summary_helpers.py:71:God Function: build_tag_distribution_section", "evidence": {"artifact": {"mtime_ns": 1789760212841277131, "path": "project/analysis.toon.yaml", "sha256": "e779a23e78575a5ca1103e1494c9f5b9bf0ac7bdcb3ffbbab82e37914fa8de0a", "size_bytes": 10336}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/utils/summary_helpers.py", "sha256": "5b80ca05e1202f10e13c9873597a0a11ddf86af9b7cdcb2a9bb2dfb60c233e6a", "size_bytes": 3117}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789760212873891603, "path": "project/planfile-tickets.yaml", "sha256": "d0c2d6eb3eb46612e13fa7d7f524e92e895a3f31556b19210c5499cec6308586", "size_bytes": 22328}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: build_tag_distribution_section` in `src/tagi/utils/summary_helpers.py:71`.\n\nFunction 'build_tag_distribution_section' is oversized: CC=5, fan-out=6, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T20:26:23.964964+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "144", "key": "semcod/tagi#144", "url": "https://github.com/semcod/tagi/issues/144"}}, "updated_at": "2026-09-18T20:26:23.964964+00:00"}, "PLF-140": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T20:31:21.515076+00:00", "description": "\ncode2llm reports `God Function: display_statistics_table` in `src/tagi/utils/inspect_helpers.py:109`.\n\nFunction 'display_statistics_table' is oversized: CC=1, fan-out=7, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "145", "files": ["src/tagi/utils/inspect_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: display_statistics_table` in `src/tagi/utils/inspect_helpers.py:109`.\n\nFunction 'display_statistics_table' is oversized: CC=1, fan-out=7, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T20:31:21.515076+00:00"}], "id": "PLF-140", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: display_statistics_table` in `src/tagi/utils/inspect_helpers.py:109`.\n\nFunction 'display_statistics_table' is oversized: CC=1, fan-out=7, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-140"}, "name": "Address code smell: God Function: display_statistics_table", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/utils/inspect_helpers.py:109:God Function: display_statistics_table", "evidence": {"artifact": {"mtime_ns": 1789760212841277131, "path": "project/analysis.toon.yaml", "sha256": "e779a23e78575a5ca1103e1494c9f5b9bf0ac7bdcb3ffbbab82e37914fa8de0a", "size_bytes": 10336}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/utils/inspect_helpers.py", "sha256": "1c596a23769394791c6155c0d18ffff189732a3df1916a648adcfab4b50d7606", "size_bytes": 3639}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789760212873891603, "path": "project/planfile-tickets.yaml", "sha256": "d0c2d6eb3eb46612e13fa7d7f524e92e895a3f31556b19210c5499cec6308586", "size_bytes": 22328}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: display_statistics_table` in `src/tagi/utils/inspect_helpers.py:109`.\n\nFunction 'display_statistics_table' is oversized: CC=1, fan-out=7, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T20:31:21.515076+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "145", "key": "semcod/tagi#145", "url": "https://github.com/semcod/tagi/issues/145"}}, "updated_at": "2026-09-18T20:31:21.515076+00:00"}, "PLF-141": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T20:46:53.090400+00:00", "description": "\ncode2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/diff.py:20`.\n\nMutation of variable 'result' spans 24 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "147", "files": ["src/tagi/scanner/diff.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/diff.py:20`.\n\nMutation of variable 'result' spans 24 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T20:46:53.090400+00:00"}], "id": "PLF-141", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/diff.py:20`.\n\nMutation of variable 'result' spans 24 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-141"}, "name": "Address code smell: Shotgun Surgery: result", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/scanner/diff.py:20:Shotgun Surgery: result", "evidence": {"artifact": {"mtime_ns": 1789764409471628814, "path": "project/analysis.toon.yaml", "sha256": "8272c84ad525516fbd4040cd83b4fb110a3f4e91aa510378427c65686d9f3018", "size_bytes": 10424}, "files": [{"mtime_ns": 1779802548044288725, "path": "src/tagi/scanner/diff.py", "sha256": "5c96c6b90833c3d6205e40b53b402d2b1eca555c135ff8bbd9cd94f8931716f2", "size_bytes": 708}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789764409534879854, "path": "project/planfile-tickets.yaml", "sha256": "e229a798269d410a9ccbb63568a783f63de2465f87ad7c4d3acd2a5c0b1ec43a", "size_bytes": 16701}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/diff.py:20`.\n\nMutation of variable 'result' spans 24 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-18T20:46:53.090400+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "147", "key": "semcod/tagi#147", "url": "https://github.com/semcod/tagi/issues/147"}}, "updated_at": "2026-09-18T20:46:53.090400+00:00"}, "PLF-142": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T20:51:58.051382+00:00", "description": "\ncode2llm reports `Data Clump: repo_path, body, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (repo_path, body, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "148", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: repo_path, body, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (repo_path, body, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T20:51:58.051382+00:00"}], "id": "PLF-142", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: repo_path, body, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (repo_path, body, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "data-clump"], "metadata": {"deduplication_key": "PLF-142"}, "name": "Address code smell: Data Clump: repo_path, body, title", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: repo_path, body, title", "evidence": {"artifact": {"mtime_ns": 1789764409471628814, "path": "project/analysis.toon.yaml", "sha256": "8272c84ad525516fbd4040cd83b4fb110a3f4e91aa510378427c65686d9f3018", "size_bytes": 10424}, "files": [{"mtime_ns": 1789739346063914074, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789764409534879854, "path": "project/planfile-tickets.yaml", "sha256": "e229a798269d410a9ccbb63568a783f63de2465f87ad7c4d3acd2a5c0b1ec43a", "size_bytes": 16701}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: repo_path, body, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (repo_path, body, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-18T20:51:58.051382+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "148", "key": "semcod/tagi#148", "url": "https://github.com/semcod/tagi/issues/148"}}, "updated_at": "2026-09-18T20:51:58.051382+00:00"}, "PLF-143": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T21:27:31.437891+00:00", "description": "\ncode2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=5, fan-out=9, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "149", "files": ["src/tagi/planner/grouper.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=5, fan-out=9, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T21:27:31.437891+00:00"}], "id": "PLF-143", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=5, fan-out=9, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-143"}, "name": "Address code smell: God Function: group_changes", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/planner/grouper.py:10:God Function: group_changes", "evidence": {"artifact": {"mtime_ns": 1789764409471628814, "path": "project/analysis.toon.yaml", "sha256": "8272c84ad525516fbd4040cd83b4fb110a3f4e91aa510378427c65686d9f3018", "size_bytes": 10424}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/planner/grouper.py", "sha256": "4f19a41a6d0fb1cc5e82e8210e9a0087aab90c22cb5b01a3879a9aff253b83f0", "size_bytes": 2197}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789764409534879854, "path": "project/planfile-tickets.yaml", "sha256": "e229a798269d410a9ccbb63568a783f63de2465f87ad7c4d3acd2a5c0b1ec43a", "size_bytes": 16701}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=5, fan-out=9, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T21:27:31.437891+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "149", "key": "semcod/tagi#149", "url": "https://github.com/semcod/tagi/issues/149"}}, "updated_at": "2026-09-18T21:27:31.437891+00:00"}, "PLF-144": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T21:45:19.766961+00:00", "description": "\ncode2llm reports `Shotgun Surgery: total_lines` in `src/tagi/utils/inspect_helpers.py:96`.\n\nMutation of variable 'total_lines' spans 7 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "151", "files": ["src/tagi/utils/inspect_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: total_lines` in `src/tagi/utils/inspect_helpers.py:96`.\n\nMutation of variable 'total_lines' spans 7 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T21:45:19.766961+00:00"}], "id": "PLF-144", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: total_lines` in `src/tagi/utils/inspect_helpers.py:96`.\n\nMutation of variable 'total_lines' spans 7 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-144"}, "name": "Address code smell: Shotgun Surgery: total_lines", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/utils/inspect_helpers.py:96:Shotgun Surgery: total_lines", "evidence": {"artifact": {"mtime_ns": 1789767907486023009, "path": "project/analysis.toon.yaml", "sha256": "bffe51d44d6fb6464a866f3f92775ba60121d5c8ee5912e7e28815233ae3b49c", "size_bytes": 10335}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/utils/inspect_helpers.py", "sha256": "1c596a23769394791c6155c0d18ffff189732a3df1916a648adcfab4b50d7606", "size_bytes": 3639}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789767907544471268, "path": "project/planfile-tickets.yaml", "sha256": "a1a17bb7fff1116657c2c5c8dc0925997c5d311418d5770edcae36e65433c9b5", "size_bytes": 16073}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: total_lines` in `src/tagi/utils/inspect_helpers.py:96`.\n\nMutation of variable 'total_lines' spans 7 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-18T21:45:19.766961+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "151", "key": "semcod/tagi#151", "url": "https://github.com/semcod/tagi/issues/151"}}, "updated_at": "2026-09-18T21:45:19.766961+00:00"}, "PLF-145": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T21:51:29.650993+00:00", "description": "\ncode2llm reports `Data Clump: body, title, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, title, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "152", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: body, title, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, title, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T21:51:29.650993+00:00"}], "id": "PLF-145", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: body, title, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, title, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "data-clump"], "metadata": {"deduplication_key": "PLF-145"}, "name": "Address code smell: Data Clump: body, title, repo_path", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: body, title, repo_path", "evidence": {"artifact": {"mtime_ns": 1789767907486023009, "path": "project/analysis.toon.yaml", "sha256": "bffe51d44d6fb6464a866f3f92775ba60121d5c8ee5912e7e28815233ae3b49c", "size_bytes": 10335}, "files": [{"mtime_ns": 1789739346063914074, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789767907544471268, "path": "project/planfile-tickets.yaml", "sha256": "a1a17bb7fff1116657c2c5c8dc0925997c5d311418d5770edcae36e65433c9b5", "size_bytes": 16073}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: body, title, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, title, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-18T21:51:29.650993+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "152", "key": "semcod/tagi#152", "url": "https://github.com/semcod/tagi/issues/152"}}, "updated_at": "2026-09-18T21:51:29.650993+00:00"}, "PLF-146": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T06:26:13.380402+00:00", "description": "\ncode2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:46`.\n\nMutation of variable 'path_lower' spans 8 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "153", "files": ["src/tagi/heuristics/metrics.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:46`.\n\nMutation of variable 'path_lower' spans 8 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T06:26:13.380402+00:00"}], "id": "PLF-146", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:46`.\n\nMutation of variable 'path_lower' spans 8 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-146"}, "name": "Address code smell: Shotgun Surgery: path_lower", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/heuristics/metrics.py:46:Shotgun Surgery: path_lower", "evidence": {"artifact": {"mtime_ns": 1789799169500661533, "path": "project/analysis.toon.yaml", "sha256": "e121c107d051daf013a3c36bbcbc8717b86b66089c73a3586f38da06dbdec891", "size_bytes": 10356}, "files": [{"mtime_ns": 1779811310790143885, "path": "src/tagi/heuristics/metrics.py", "sha256": "dcd2cc0255c4f2ee3eee8aaae72af3e54f0aa6a78598d290d61eb44299401b2d", "size_bytes": 6521}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789799169537365843, "path": "project/planfile-tickets.yaml", "sha256": "1d4adc5d27067e26cec142ccc46490afbb9b85cb5d197c470f6353698b37aceb", "size_bytes": 17914}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:46`.\n\nMutation of variable 'path_lower' spans 8 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T06:26:13.380402+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "153", "key": "semcod/tagi#153", "url": "https://github.com/semcod/tagi/issues/153"}}, "updated_at": "2026-09-19T06:26:13.380402+00:00"}, "PLF-147": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T06:31:54.694978+00:00", "description": "\ncode2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/formats.py:16`.\n\nMutation of variable 'tags' spans 6 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "154", "files": ["src/tagi/composer/formats.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/formats.py:16`.\n\nMutation of variable 'tags' spans 6 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T06:31:54.694978+00:00"}], "id": "PLF-147", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/formats.py:16`.\n\nMutation of variable 'tags' spans 6 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-147"}, "name": "Address code smell: Shotgun Surgery: tags", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/composer/formats.py:16:Shotgun Surgery: tags", "evidence": {"artifact": {"mtime_ns": 1789799169500661533, "path": "project/analysis.toon.yaml", "sha256": "e121c107d051daf013a3c36bbcbc8717b86b66089c73a3586f38da06dbdec891", "size_bytes": 10356}, "files": [{"mtime_ns": 1789764358606193196, "path": "src/tagi/composer/formats.py", "sha256": "f83369fc3a57d03450699627061999b0e07c463e547289218fda64626fb0e6c0", "size_bytes": 3495}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789799169537365843, "path": "project/planfile-tickets.yaml", "sha256": "1d4adc5d27067e26cec142ccc46490afbb9b85cb5d197c470f6353698b37aceb", "size_bytes": 17914}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/formats.py:16`.\n\nMutation of variable 'tags' spans 6 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T06:31:54.694978+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "154", "key": "semcod/tagi#154", "url": "https://github.com/semcod/tagi/issues/154"}}, "updated_at": "2026-09-19T06:31:54.694978+00:00"}, "PLF-148": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T07:27:50.494870+00:00", "description": "\ncode2llm reports `Shotgun Surgery: result` in `src/tagi/analyzer/dependency_graph.py:63`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "156", "files": ["src/tagi/analyzer/dependency_graph.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: result` in `src/tagi/analyzer/dependency_graph.py:63`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T07:27:50.494870+00:00"}], "id": "PLF-148", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: result` in `src/tagi/analyzer/dependency_graph.py:63`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-148"}, "name": "Address code smell: Shotgun Surgery: result", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/analyzer/dependency_graph.py:63:Shotgun Surgery: result", "evidence": {"artifact": {"mtime_ns": 1789802857834310989, "path": "project/analysis.toon.yaml", "sha256": "44a5f094bf6499c25df8785d2a63dd595472e178a113134af703aac0487df20a", "size_bytes": 10359}, "files": [{"mtime_ns": 1779810400712577609, "path": "src/tagi/analyzer/dependency_graph.py", "sha256": "56c60106b3e4d548089071146800fdcc6eddfdcb2b14c53bce8d7532487723bf", "size_bytes": 5250}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789802857902888579, "path": "project/planfile-tickets.yaml", "sha256": "c9019adbb39ec2478f27730553edf309610f894cd81234454f75961b809bd01d", "size_bytes": 17909}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: result` in `src/tagi/analyzer/dependency_graph.py:63`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T07:27:50.494870+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "156", "key": "semcod/tagi#156", "url": "https://github.com/semcod/tagi/issues/156"}}, "updated_at": "2026-09-19T07:27:50.494870+00:00"}, "PLF-149": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T08:19:14.641869+00:00", "description": "\ncode2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "158", "files": ["src/tagi/cli/publishing_commands.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T08:19:14.641869+00:00"}], "id": "PLF-149", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-149"}, "name": "Address code smell: God Function: publish_command", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/cli/publishing_commands.py:23:God Function: publish_command", "evidence": {"artifact": {"mtime_ns": 1789805947979310038, "path": "project/analysis.toon.yaml", "sha256": "ff985a6d1df91bec113e0985da69266b7986b65971924ccd9f4fa7cbaea12c51", "size_bytes": 10323}, "files": [{"mtime_ns": 1789740908490220674, "path": "src/tagi/cli/publishing_commands.py", "sha256": "f11201cd601fcd3d52ba6ec5ff5b958f5663f79327593c81377c25c83574a07e", "size_bytes": 5238}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789805948011262070, "path": "project/planfile-tickets.yaml", "sha256": "f8d503084189f0acc6b3277c59858501898b3b2ea7986cead8d6db848b15eb71", "size_bytes": 15477}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-19T08:19:14.641869+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "158", "key": "semcod/tagi#158", "url": "https://github.com/semcod/tagi/issues/158"}}, "updated_at": "2026-09-19T08:19:14.641869+00:00"}, "PLF-150": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T08:40:27.418771+00:00", "description": "\ncode2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/files.py:6`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "160", "files": ["src/tagi/scanner/files.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/files.py:6`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T08:40:27.418771+00:00"}], "id": "PLF-150", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/files.py:6`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-150"}, "name": "Address code smell: Shotgun Surgery: result", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/scanner/files.py:6:Shotgun Surgery: result", "evidence": {"artifact": {"mtime_ns": 1789807219128678462, "path": "project/analysis.toon.yaml", "sha256": "a9502e24eae6c96a2813522009e1147c99df0b92b64fc43761c84a0421cc05d6", "size_bytes": 10335}, "files": [{"mtime_ns": 1789767804220314391, "path": "src/tagi/scanner/files.py", "sha256": "1ce0abad16143ad14121aeb0637546495be090e81833345c8be620477c946379", "size_bytes": 926}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789807219187356177, "path": "project/planfile-tickets.yaml", "sha256": "09f4267be8bbb0b623e89df1b4ad1ff583984dcab632ff1913d74642fffd254a", "size_bytes": 16076}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/files.py:6`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T08:40:27.418771+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "160", "key": "semcod/tagi#160", "url": "https://github.com/semcod/tagi/issues/160"}}, "updated_at": "2026-09-19T08:40:27.418771+00:00"}, "PLF-151": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T09:18:02.657696+00:00", "description": "\ncode2llm reports `Shotgun Surgery: total_lines` in `src/tagi/utils/send_helpers.py:8`.\n\nMutation of variable 'total_lines' spans 7 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "161", "files": ["src/tagi/utils/send_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: total_lines` in `src/tagi/utils/send_helpers.py:8`.\n\nMutation of variable 'total_lines' spans 7 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T09:18:02.657696+00:00"}], "id": "PLF-151", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: total_lines` in `src/tagi/utils/send_helpers.py:8`.\n\nMutation of variable 'total_lines' spans 7 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-151"}, "name": "Address code smell: Shotgun Surgery: total_lines", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/utils/send_helpers.py:8:Shotgun Surgery: total_lines", "evidence": {"artifact": {"mtime_ns": 1789807219128678462, "path": "project/analysis.toon.yaml", "sha256": "a9502e24eae6c96a2813522009e1147c99df0b92b64fc43761c84a0421cc05d6", "size_bytes": 10335}, "files": [{"mtime_ns": 1789807158230776613, "path": "src/tagi/utils/send_helpers.py", "sha256": "4e906f5b078ec49cd7523dfc93f794833dc887242454c6dca376f8af17483733", "size_bytes": 847}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789807219187356177, "path": "project/planfile-tickets.yaml", "sha256": "09f4267be8bbb0b623e89df1b4ad1ff583984dcab632ff1913d74642fffd254a", "size_bytes": 16076}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: total_lines` in `src/tagi/utils/send_helpers.py:8`.\n\nMutation of variable 'total_lines' spans 7 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T09:18:02.657696+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "161", "key": "semcod/tagi#161", "url": "https://github.com/semcod/tagi/issues/161"}}, "updated_at": "2026-09-19T09:18:02.657696+00:00"}, "PLF-152": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T09:23:37.677573+00:00", "description": "\ncode2llm reports `Data Clump: title, body, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, body, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "162", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: title, body, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, body, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T09:23:37.677573+00:00"}], "id": "PLF-152", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: title, body, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, body, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "data-clump"], "metadata": {"deduplication_key": "PLF-152"}, "name": "Address code smell: Data Clump: title, body, repo_path", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: title, body, repo_path", "evidence": {"artifact": {"mtime_ns": 1789807219128678462, "path": "project/analysis.toon.yaml", "sha256": "a9502e24eae6c96a2813522009e1147c99df0b92b64fc43761c84a0421cc05d6", "size_bytes": 10335}, "files": [{"mtime_ns": 1789739346063914074, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789807219187356177, "path": "project/planfile-tickets.yaml", "sha256": "09f4267be8bbb0b623e89df1b4ad1ff583984dcab632ff1913d74642fffd254a", "size_bytes": 16076}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: title, body, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, body, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-19T09:23:37.677573+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "162", "key": "semcod/tagi#162", "url": "https://github.com/semcod/tagi/issues/162"}}, "updated_at": "2026-09-19T09:23:37.677573+00:00"}, "PLF-153": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T09:36:55.436585+00:00", "description": "\ncode2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/status.py:11`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "164", "files": ["src/tagi/scanner/status.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/status.py:11`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T09:36:55.436585+00:00"}], "id": "PLF-153", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/status.py:11`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-153"}, "name": "Address code smell: Shotgun Surgery: result", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/scanner/status.py:11:Shotgun Surgery: result", "evidence": {"artifact": {"mtime_ns": 1789810611546472552, "path": "project/analysis.toon.yaml", "sha256": "090d0a720b05f5191311983d22448bcf4753a2b60aa85c9ec6774f82c106a062", "size_bytes": 10253}, "files": [{"mtime_ns": 1789802617196896179, "path": "src/tagi/scanner/status.py", "sha256": "9b3ee07333cf0ae9ffcc6f3b02ead6d78b0c482d9994a0f4c84b528e9c944c29", "size_bytes": 1793}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789810611575073648, "path": "project/planfile-tickets.yaml", "sha256": "35e39935b4bf719d67de6de49341d2513dcd8a8946734749853b959382267ca0", "size_bytes": 16691}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: result` in `src/tagi/scanner/status.py:11`.\n\nMutation of variable 'result' spans 21 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T09:36:55.436585+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "164", "key": "semcod/tagi#164", "url": "https://github.com/semcod/tagi/issues/164"}}, "updated_at": "2026-09-19T09:36:55.436585+00:00"}, "PLF-154": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T10:22:37.567988+00:00", "description": "\ncode2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "166", "files": ["src/tagi/scanner/status.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T10:22:37.567988+00:00"}], "id": "PLF-154", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function"], "metadata": {"deduplication_key": "PLF-154"}, "name": "Address code smell: God Function: scan_repo", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/scanner/status.py:11:God Function: scan_repo", "evidence": {"artifact": {"mtime_ns": 1789813353805427459, "path": "project/analysis.toon.yaml", "sha256": "f1d18ecd10d02bf68405fbaa6d1f4aed3810ef5648f6751abd385aac2c885d3f", "size_bytes": 10381}, "files": [{"mtime_ns": 1789802617196896179, "path": "src/tagi/scanner/status.py", "sha256": "9b3ee07333cf0ae9ffcc6f3b02ead6d78b0c482d9994a0f4c84b528e9c944c29", "size_bytes": 1793}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789813353833486323, "path": "project/planfile-tickets.yaml", "sha256": "b4eaec2f196e1ecce19683ba5643c0f530a19e7ec6d4dd4a62d1fa3ac24f032d", "size_bytes": 14766}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-19T10:22:37.567988+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "166", "key": "semcod/tagi#166", "url": "https://github.com/semcod/tagi/issues/166"}}, "updated_at": "2026-09-19T10:22:37.567988+00:00"}, "PLF-155": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T10:49:16.509027+00:00", "description": "\ncode2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/tags.py:57`.\n\nMutation of variable 'path_lower' spans 8 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "168", "files": ["src/tagi/heuristics/tags.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/tags.py:57`.\n\nMutation of variable 'path_lower' spans 8 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T10:49:16.509027+00:00"}], "id": "PLF-155", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/tags.py:57`.\n\nMutation of variable 'path_lower' spans 8 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-155"}, "name": "Address code smell: Shotgun Surgery: path_lower", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/heuristics/tags.py:57:Shotgun Surgery: path_lower", "evidence": {"artifact": {"mtime_ns": 1789814952782525610, "path": "project/analysis.toon.yaml", "sha256": "0b4667123d8ba68e72937f0d888d34497c85fbaa99ce8d7195d2bfaa19de1d9f", "size_bytes": 10366}, "files": [{"mtime_ns": 1789814872390483855, "path": "src/tagi/heuristics/tags.py", "sha256": "83621bcdf280f42f072878df2f2475f25ec874bd8f7ecc8bcc5e04bb8e163174", "size_bytes": 3136}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789814952811053566, "path": "project/planfile-tickets.yaml", "sha256": "5ebd22cb45332ff8e61df65ac32e80d19ec57d2a54d226b6d4fd70230700cd67", "size_bytes": 15989}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/tags.py:57`.\n\nMutation of variable 'path_lower' spans 8 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T10:49:16.509027+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "168", "key": "semcod/tagi#168", "url": "https://github.com/semcod/tagi/issues/168"}}, "updated_at": "2026-09-19T10:49:16.509027+00:00"}, "PLF-156": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T11:41:05.586678+00:00", "description": "\ncode2llm reports `Shotgun Surgery: provider` in `src/tagi/cli/publishing_commands.py:23`.\n\nMutation of variable 'provider' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "169", "files": ["src/tagi/cli/publishing_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: provider` in `src/tagi/cli/publishing_commands.py:23`.\n\nMutation of variable 'provider' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T11:41:05.586678+00:00"}], "id": "PLF-156", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: provider` in `src/tagi/cli/publishing_commands.py:23`.\n\nMutation of variable 'provider' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "PLF-156"}, "name": "Address code smell: Shotgun Surgery: provider", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/cli/publishing_commands.py:23:Shotgun Surgery: provider", "evidence": {"artifact": {"mtime_ns": 1789818000281070860, "path": "project/analysis.toon.yaml", "sha256": "cd908a3fbfce8ab1a9cb171c6ddd2c4d40624145f1441f5d326ee7e671012aac", "size_bytes": 10295}, "files": [{"mtime_ns": 1789817932257139916, "path": "src/tagi/cli/publishing_commands.py", "sha256": "542f145664f4f91fb291e1c1e5d781c33f4ac054622645e7c6aac58fb21568d8", "size_bytes": 5359}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789818000309685535, "path": "project/planfile-tickets.yaml", "sha256": "8895c5115dd230d0481573e88b83b8923b258e1938589013ec204cf9a5817478", "size_bytes": 16648}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: provider` in `src/tagi/cli/publishing_commands.py:23`.\n\nMutation of variable 'provider' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T11:41:05.586678+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "169", "key": "semcod/tagi#169", "url": "https://github.com/semcod/tagi/issues/169"}}, "updated_at": "2026-09-19T11:41:05.586678+00:00"}, "PLF-157": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T12:42:18.834682+00:00", "description": "\n`project/analysis.toon.yaml` flags `inspect_helpers` in LAYERS as a large/hot module (121 lines, 0 classes, 6 methods, CC=17). Extract cohesive submodules around stable responsibilities and add focused regression tests before broad edits.\n\n---\n\n**Strategy Metadata:**\n- planfile_id: PLF-157\n", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "172", "files": ["src/tagi/utils/inspect_helpers.py", "project/analysis.toon.yaml"], "history": [{"action": "created", "message": "`project/analysis.toon.yaml` flags `inspect_helpers` in LAYERS as a large/hot module (121 lines, 0 classes, 6 methods, CC=17). Extract cohesive submodules around stable responsibilities and add focused regression tests before broad edits.", "source": "koru task", "timestamp": "2026-09-19T12:42:18.834682+00:00"}], "id": "PLF-157", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "`project/analysis.toon.yaml` flags `inspect_helpers` in LAYERS as a large/hot module (121 lines, 0 classes, 6 methods, CC=17). Extract cohesive submodules around stable responsibilities and add focused regression tests before broad edits."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "code2llm", "architecture", "large-module", "refactor", "scan"], "metadata": {"deduplication_key": "PLF-157"}, "name": "Split large module: inspect_helpers", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "koru-scan:code2llm_layer_hotspot:src/tagi/utils/inspect_helpers.py:project/analysis.toon.yaml", "evidence": {"artifact": {"mtime_ns": 1789820718961281621, "path": "project/analysis.toon.yaml", "sha256": "28f5e52d781bb3dc5180c4411848287482185ddd7898976d85fe5df0d5cd3580", "size_bytes": 10363}, "kind": "code2llm_analysis", "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude '*.md' --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate the artifact and compare artifact.sha256 before assuming this ticket still reflects the current code."}, "input": "`project/analysis.toon.yaml` flags `inspect_helpers` in LAYERS as a large/hot module (121 lines, 0 classes, 6 methods, CC=17). Extract cohesive submodules around stable responsibilities and add focused regression tests before broad edits.", "signal": "code2llm_layer_hotspot"}, "timestamp": "2026-09-19T12:42:18.834682+00:00", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "172", "key": "semcod/tagi#172", "url": "https://github.com/semcod/tagi/issues/172"}}, "updated_at": "2026-09-19T12:42:18.834682+00:00"}, "PLF-158": {"id": "PLF-158", "name": "Address code smell: Shotgun Surgery: path_lower", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "high", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:11.154936Z", "context": {}}, "description": "code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:33`.\n\nMutation of variable 'path_lower' spans 8 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:shotgun_surgery:src/tagi/heuristics/metrics.py:33:Shotgun Surgery: path_lower", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "shotgun-surgery"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/heuristics/metrics.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_1a6aaf76c4ba5b63b56256bc event_hash=7d65339256becf3c499f5189e7c46b90588d4a52675bacd47945b39cbfdb3882 timestamp=2026-09-19T17%3A29%3A11.164575%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-158 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-158%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-158 causation_id=- input_hash=9ac39162431fbacf71cb140d6f58f295cc0f944ad37b22cbe0a4b4d07a17d58c receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTEuMTY0NTc1WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgU2hvdGd1biBTdXJnZXJ5OiBwYXRoX2xvd2VyYCBpbiBgc3JjL3RhZ2kvaGV1cmlzdGljcy9tZXRyaWNzLnB5OjMzYC5cblxuTXV0YXRpb24gb2YgdmFyaWFibGUgJ3BhdGhfbG93ZXInIHNwYW5zIDggZnVuY3Rpb25zLiBDaGFuZ2luZyB0aGlzIGxvZ2ljIHJlcXVpcmVzIHdvcmsgaW4gbWFueSBwbGFjZXMuXG5cbk1ha2UgdGhlIHNtYWxsZXN0IHJlZmFjdG9yIHRoYXQgcmVtb3ZlcyB0aGUgc21lbGwgYW5kIHJ1biBsb2NhbCB0ZXN0cy5cblxuY29kZTJsbG0tZGVkdXBlOiBjb2RlMmxsbTpzbWVsbDpzaG90Z3VuX3N1cmdlcnk6c3JjL3RhZ2kvaGV1cmlzdGljcy9tZXRyaWNzLnB5OjMzOlNob3RndW4gU3VyZ2VyeTogcGF0aF9sb3dlciIsImZpbGVzIjpbInNyYy90YWdpL2hldXJpc3RpY3MvbWV0cmljcy5weSJdLCJpZCI6IlBMRi0xNTgiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwic2hvdGd1bi1zdXJnZXJ5Il0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IFNob3RndW4gU3VyZ2VyeTogcGF0aF9sb3dlciIsInByaW9yaXR5IjoiaGlnaCIsInNvdXJjZSI6eyJjb250ZXh0Ijp7fSwidGltZXN0YW1wIjoiMjAyNi0wOS0xOVQxNzoyOToxMS4xNTQ5MzZaIiwidG9vbCI6ImtvcnUtc2NhbiJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQxNzoyOToxMS4xNjQ1NzlaIn19", "created_at": "2026-09-19T17:29:11.164575Z", "updated_at": "2026-09-19T17:29:11.164579Z"}, "PLF-159": {"id": "PLF-159", "name": "Address code smell: Shotgun Surgery: tags", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "high", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:11.840839Z", "context": {}}, "description": "code2llm reports `Shotgun Surgery: tags` in `src/tagi/heuristics/tags.py:48`.\n\nMutation of variable 'tags' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:shotgun_surgery:src/tagi/heuristics/tags.py:48:Shotgun Surgery: tags", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "shotgun-surgery"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/heuristics/tags.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_83500b9a1eed7d17acb5d9fb event_hash=0742737296da2c07434ecfea4dcb1c8cb6ae655a488c87cdba0103bd8a11bb02 timestamp=2026-09-19T17%3A29%3A11.918031%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-159 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-159%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-159 causation_id=- input_hash=55fc906af39db774bbbb80466d1102d53e7300ae63a8527729323d5cc7d9d5ec receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTEuOTE4MDMxWiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgU2hvdGd1biBTdXJnZXJ5OiB0YWdzYCBpbiBgc3JjL3RhZ2kvaGV1cmlzdGljcy90YWdzLnB5OjQ4YC5cblxuTXV0YXRpb24gb2YgdmFyaWFibGUgJ3RhZ3MnIHNwYW5zIDUgZnVuY3Rpb25zLiBDaGFuZ2luZyB0aGlzIGxvZ2ljIHJlcXVpcmVzIHdvcmsgaW4gbWFueSBwbGFjZXMuXG5cbk1ha2UgdGhlIHNtYWxsZXN0IHJlZmFjdG9yIHRoYXQgcmVtb3ZlcyB0aGUgc21lbGwgYW5kIHJ1biBsb2NhbCB0ZXN0cy5cblxuY29kZTJsbG0tZGVkdXBlOiBjb2RlMmxsbTpzbWVsbDpzaG90Z3VuX3N1cmdlcnk6c3JjL3RhZ2kvaGV1cmlzdGljcy90YWdzLnB5OjQ4OlNob3RndW4gU3VyZ2VyeTogdGFncyIsImZpbGVzIjpbInNyYy90YWdpL2hldXJpc3RpY3MvdGFncy5weSJdLCJpZCI6IlBMRi0xNTkiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwic2hvdGd1bi1zdXJnZXJ5Il0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IFNob3RndW4gU3VyZ2VyeTogdGFncyIsInByaW9yaXR5IjoiaGlnaCIsInNvdXJjZSI6eyJjb250ZXh0Ijp7fSwidGltZXN0YW1wIjoiMjAyNi0wOS0xOVQxNzoyOToxMS44NDA4MzlaIiwidG9vbCI6ImtvcnUtc2NhbiJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQxNzoyOToxMS45MTgwMzdaIn19", "created_at": "2026-09-19T17:29:11.918031Z", "updated_at": "2026-09-19T17:29:11.918037Z"}, "PLF-160": {"id": "PLF-160", "name": "Address code smell: God Function: _tag_change", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:12.733568Z", "context": {}}, "description": "code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`.\n\nFunction '_tag_change' is oversized: CC=2, fan-out=9, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/heuristics/tags.py:22:God Function: _tag_change", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/heuristics/tags.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_497220cc3af4ef6b44f321c3 event_hash=a649a48467d378efbc3eebe005661ba3d1c88c8e725799f28033db9affdbbb57 timestamp=2026-09-19T17%3A29%3A12.755466%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-160 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-160%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-160 causation_id=- input_hash=d5a7a2d67eb7957053bde0d4b9463b298a084ab459be7d414caed735bd81f544 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTIuNzU1NDY2WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBfdGFnX2NoYW5nZWAgaW4gYHNyYy90YWdpL2hldXJpc3RpY3MvdGFncy5weToyMmAuXG5cbkZ1bmN0aW9uICdfdGFnX2NoYW5nZScgaXMgb3ZlcnNpemVkOiBDQz0yLCBmYW4tb3V0PTksIG11dGF0aW9ucz05LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2hldXJpc3RpY3MvdGFncy5weToyMjpHb2QgRnVuY3Rpb246IF90YWdfY2hhbmdlIiwiZmlsZXMiOlsic3JjL3RhZ2kvaGV1cmlzdGljcy90YWdzLnB5Il0sImlkIjoiUExGLTE2MCIsImxhYmVscyI6WyJsbG0tcmVhZHkiLCJjb2RlMmxsbSIsImNvZGUtc21lbGwiLCJnb2QtZnVuY3Rpb24iXSwibmFtZSI6IkFkZHJlc3MgY29kZSBzbWVsbDogR29kIEZ1bmN0aW9uOiBfdGFnX2NoYW5nZSIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjEyLjczMzU2OFoiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjEyLjc1NTQ3M1oifX0", "created_at": "2026-09-19T17:29:12.755466Z", "updated_at": "2026-09-19T17:29:12.755473Z"}, "PLF-161": {"id": "PLF-161", "name": "Address code smell: God Function: group_by_branch", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:13.529332Z", "context": {}}, "description": "code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/planner/branch_grouper.py:7:God Function: group_by_branch", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/planner/branch_grouper.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_40ff20aedf6162ed4834abaf event_hash=ae5af7901b1b3af57cda8f54258ded6d81ca63c88f1e1b8a8f7254067bf0755b timestamp=2026-09-19T17%3A29%3A13.553848%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-161 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-161%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-161 causation_id=- input_hash=cd07a286a6639b4e972faffab3383ed91fe4f5633f91a51914165a850a9c5675 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTMuNTUzODQ4WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBncm91cF9ieV9icmFuY2hgIGluIGBzcmMvdGFnaS9wbGFubmVyL2JyYW5jaF9ncm91cGVyLnB5OjdgLlxuXG5GdW5jdGlvbiAnZ3JvdXBfYnlfYnJhbmNoJyBpcyBvdmVyc2l6ZWQ6IENDPTgsIGZhbi1vdXQ9OSwgbXV0YXRpb25zPTEyLlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL3BsYW5uZXIvYnJhbmNoX2dyb3VwZXIucHk6NzpHb2QgRnVuY3Rpb246IGdyb3VwX2J5X2JyYW5jaCIsImZpbGVzIjpbInNyYy90YWdpL3BsYW5uZXIvYnJhbmNoX2dyb3VwZXIucHkiXSwiaWQiOiJQTEYtMTYxIiwibGFiZWxzIjpbImxsbS1yZWFkeSIsImNvZGUybGxtIiwiY29kZS1zbWVsbCIsImdvZC1mdW5jdGlvbiJdLCJuYW1lIjoiQWRkcmVzcyBjb2RlIHNtZWxsOiBHb2QgRnVuY3Rpb246IGdyb3VwX2J5X2JyYW5jaCIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjEzLjUyOTMzMloiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjEzLjU1Mzg1NloifX0", "created_at": "2026-09-19T17:29:13.553848Z", "updated_at": "2026-09-19T17:29:13.553856Z"}, "PLF-162": {"id": "PLF-162", "name": "Address code smell: God Function: group_changes", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:14.207997Z", "context": {}}, "description": "code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=4, fan-out=9, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/planner/grouper.py:10:God Function: group_changes", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/planner/grouper.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_b95ba0e76679eda0c97bba36 event_hash=418a0c25b25afd250b00e7a387e426e863671c3329af84e74d55cff355f6f2eb timestamp=2026-09-19T17%3A29%3A14.217920%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-162 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-162%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-162 causation_id=- input_hash=c9fb74d7097f7bdd1d19ca0ec5c5aee2e5a324a718d1d790022871040c7abc1f receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTQuMjE3OTIwWiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBncm91cF9jaGFuZ2VzYCBpbiBgc3JjL3RhZ2kvcGxhbm5lci9ncm91cGVyLnB5OjEwYC5cblxuRnVuY3Rpb24gJ2dyb3VwX2NoYW5nZXMnIGlzIG92ZXJzaXplZDogQ0M9NCwgZmFuLW91dD05LCBtdXRhdGlvbnM9Ny5cblxuTWFrZSB0aGUgc21hbGxlc3QgcmVmYWN0b3IgdGhhdCByZW1vdmVzIHRoZSBzbWVsbCBhbmQgcnVuIGxvY2FsIHRlc3RzLlxuXG5jb2RlMmxsbS1kZWR1cGU6IGNvZGUybGxtOnNtZWxsOmdvZF9mdW5jdGlvbjpzcmMvdGFnaS9wbGFubmVyL2dyb3VwZXIucHk6MTA6R29kIEZ1bmN0aW9uOiBncm91cF9jaGFuZ2VzIiwiZmlsZXMiOlsic3JjL3RhZ2kvcGxhbm5lci9ncm91cGVyLnB5Il0sImlkIjoiUExGLTE2MiIsImxhYmVscyI6WyJsbG0tcmVhZHkiLCJjb2RlMmxsbSIsImNvZGUtc21lbGwiLCJnb2QtZnVuY3Rpb24iXSwibmFtZSI6IkFkZHJlc3MgY29kZSBzbWVsbDogR29kIEZ1bmN0aW9uOiBncm91cF9jaGFuZ2VzIiwicHJpb3JpdHkiOiJub3JtYWwiLCJzb3VyY2UiOnsiY29udGV4dCI6e30sInRpbWVzdGFtcCI6IjIwMjYtMDktMTlUMTc6Mjk6MTQuMjA3OTk3WiIsInRvb2wiOiJrb3J1LXNjYW4ifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTQuMjE3OTI2WiJ9fQ", "created_at": "2026-09-19T17:29:14.217920Z", "updated_at": "2026-09-19T17:29:14.217926Z"}, "PLF-163": {"id": "PLF-163", "name": "Address code smell: God Function: hooks_command", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:14.875281Z", "context": {}}, "description": "code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=4.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/utility_commands.py:131:God Function: hooks_command", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/cli/utility_commands.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_3456b70183d69035897be1ff event_hash=dcc172d6f7418092c72c96f93076690043898fe23b41adf1ed8d2e8802c015b5 timestamp=2026-09-19T17%3A29%3A14.903316%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-163 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-163%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-163 causation_id=- input_hash=6aa365062d5ca56c343e0cc1d3fd5999a256e8568e58eca110b735652b5eac5f receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTQuOTAzMzE2WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBob29rc19jb21tYW5kYCBpbiBgc3JjL3RhZ2kvY2xpL3V0aWxpdHlfY29tbWFuZHMucHk6MTMxYC5cblxuRnVuY3Rpb24gJ2hvb2tzX2NvbW1hbmQnIGlzIG92ZXJzaXplZDogQ0M9MTAsIGZhbi1vdXQ9MTEsIG11dGF0aW9ucz00LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2NsaS91dGlsaXR5X2NvbW1hbmRzLnB5OjEzMTpHb2QgRnVuY3Rpb246IGhvb2tzX2NvbW1hbmQiLCJmaWxlcyI6WyJzcmMvdGFnaS9jbGkvdXRpbGl0eV9jb21tYW5kcy5weSJdLCJpZCI6IlBMRi0xNjMiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwiZ29kLWZ1bmN0aW9uIl0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IEdvZCBGdW5jdGlvbjogaG9va3NfY29tbWFuZCIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjE0Ljg3NTI4MVoiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjE0LjkwMzMyMFoifX0", "created_at": "2026-09-19T17:29:14.903316Z", "updated_at": "2026-09-19T17:29:14.903320Z"}, "PLF-164": {"id": "PLF-164", "name": "Address code smell: God Function: inspect_command", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:15.595077Z", "context": {}}, "description": "code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=4.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/inspection_commands.py:19:God Function: inspect_command", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/cli/inspection_commands.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_72c0878785f684fd4b360e9a event_hash=c75a481d991bd9324699cfe999d1e5a55a0880e05808c693bd7e5add09025fe8 timestamp=2026-09-19T17%3A29%3A15.623939%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-164 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-164%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-164 causation_id=- input_hash=df0f54865b3784cf2bba77531b3782646c3aec9122da332fe5e35cffd6b56107 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTUuNjIzOTM5WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBpbnNwZWN0X2NvbW1hbmRgIGluIGBzcmMvdGFnaS9jbGkvaW5zcGVjdGlvbl9jb21tYW5kcy5weToxOWAuXG5cbkZ1bmN0aW9uICdpbnNwZWN0X2NvbW1hbmQnIGlzIG92ZXJzaXplZDogQ0M9NywgZmFuLW91dD0xMSwgbXV0YXRpb25zPTQuXG5cbk1ha2UgdGhlIHNtYWxsZXN0IHJlZmFjdG9yIHRoYXQgcmVtb3ZlcyB0aGUgc21lbGwgYW5kIHJ1biBsb2NhbCB0ZXN0cy5cblxuY29kZTJsbG0tZGVkdXBlOiBjb2RlMmxsbTpzbWVsbDpnb2RfZnVuY3Rpb246c3JjL3RhZ2kvY2xpL2luc3BlY3Rpb25fY29tbWFuZHMucHk6MTk6R29kIEZ1bmN0aW9uOiBpbnNwZWN0X2NvbW1hbmQiLCJmaWxlcyI6WyJzcmMvdGFnaS9jbGkvaW5zcGVjdGlvbl9jb21tYW5kcy5weSJdLCJpZCI6IlBMRi0xNjQiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwiZ29kLWZ1bmN0aW9uIl0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IEdvZCBGdW5jdGlvbjogaW5zcGVjdF9jb21tYW5kIiwicHJpb3JpdHkiOiJub3JtYWwiLCJzb3VyY2UiOnsiY29udGV4dCI6e30sInRpbWVzdGFtcCI6IjIwMjYtMDktMTlUMTc6Mjk6MTUuNTk1MDc3WiIsInRvb2wiOiJrb3J1LXNjYW4ifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTUuNjIzOTQ1WiJ9fQ", "created_at": "2026-09-19T17:29:15.623939Z", "updated_at": "2026-09-19T17:29:15.623945Z"}, "PLF-165": {"id": "PLF-165", "name": "Address code smell: God Function: publish_command", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:16.288264Z", "context": {}}, "description": "code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/publishing_commands.py:23:God Function: publish_command", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/cli/publishing_commands.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_8ee5b7a15bf8f1ed3bd37a9c event_hash=0af6d85bc54117becab5c7789f9fe1f6c2a07c864cb603dff4ad7c3eb0d89e56 timestamp=2026-09-19T17%3A29%3A16.307020%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-165 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-165%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-165 causation_id=- input_hash=23669a6559bd153e37565e6d65a50fd41a34620dd2ac8b48c23aafaaabee74ca receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTYuMzA3MDIwWiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBwdWJsaXNoX2NvbW1hbmRgIGluIGBzcmMvdGFnaS9jbGkvcHVibGlzaGluZ19jb21tYW5kcy5weToyM2AuXG5cbkZ1bmN0aW9uICdwdWJsaXNoX2NvbW1hbmQnIGlzIG92ZXJzaXplZDogQ0M9MTEsIGZhbi1vdXQ9MTQsIG11dGF0aW9ucz04LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2NsaS9wdWJsaXNoaW5nX2NvbW1hbmRzLnB5OjIzOkdvZCBGdW5jdGlvbjogcHVibGlzaF9jb21tYW5kIiwiZmlsZXMiOlsic3JjL3RhZ2kvY2xpL3B1Ymxpc2hpbmdfY29tbWFuZHMucHkiXSwiaWQiOiJQTEYtMTY1IiwibGFiZWxzIjpbImxsbS1yZWFkeSIsImNvZGUybGxtIiwiY29kZS1zbWVsbCIsImdvZC1mdW5jdGlvbiJdLCJuYW1lIjoiQWRkcmVzcyBjb2RlIHNtZWxsOiBHb2QgRnVuY3Rpb246IHB1Ymxpc2hfY29tbWFuZCIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjE2LjI4ODI2NFoiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjE2LjMwNzAyNVoifX0", "created_at": "2026-09-19T17:29:16.307020Z", "updated_at": "2026-09-19T17:29:16.307025Z"}, "PLF-166": {"id": "PLF-166", "name": "Address code smell: God Function: scan_repo", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:17.052266Z", "context": {}}, "description": "code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/scanner/status.py:11:God Function: scan_repo", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/scanner/status.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_461a86c7b0a0152501eed031 event_hash=d3d5dab3966ea45333fb4e595c94233dcf1c91486df0c625edb042d87ac1aa38 timestamp=2026-09-19T17%3A29%3A17.068246%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-166 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-166%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-166 causation_id=- input_hash=c0d3402362def21068249a3d8ceb948960cbb839b08276ab267d9c01a6b2b391 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuMDY4MjQ2WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBzY2FuX3JlcG9gIGluIGBzcmMvdGFnaS9zY2FubmVyL3N0YXR1cy5weToxMWAuXG5cbkZ1bmN0aW9uICdzY2FuX3JlcG8nIGlzIG92ZXJzaXplZDogQ0M9NywgZmFuLW91dD0xNSwgbXV0YXRpb25zPTguXG5cbk1ha2UgdGhlIHNtYWxsZXN0IHJlZmFjdG9yIHRoYXQgcmVtb3ZlcyB0aGUgc21lbGwgYW5kIHJ1biBsb2NhbCB0ZXN0cy5cblxuY29kZTJsbG0tZGVkdXBlOiBjb2RlMmxsbTpzbWVsbDpnb2RfZnVuY3Rpb246c3JjL3RhZ2kvc2Nhbm5lci9zdGF0dXMucHk6MTE6R29kIEZ1bmN0aW9uOiBzY2FuX3JlcG8iLCJmaWxlcyI6WyJzcmMvdGFnaS9zY2FubmVyL3N0YXR1cy5weSJdLCJpZCI6IlBMRi0xNjYiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwiZ29kLWZ1bmN0aW9uIl0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IEdvZCBGdW5jdGlvbjogc2Nhbl9yZXBvIiwicHJpb3JpdHkiOiJub3JtYWwiLCJzb3VyY2UiOnsiY29udGV4dCI6e30sInRpbWVzdGFtcCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuMDUyMjY2WiIsInRvb2wiOiJrb3J1LXNjYW4ifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuMDY4MjUxWiJ9fQ", "created_at": "2026-09-19T17:29:17.068246Z", "updated_at": "2026-09-19T17:29:17.068251Z"}, "PLF-167": {"id": "PLF-167", "name": "Address code smell: God Function: send_command", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:17.839900Z", "context": {}}, "description": "code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`.\n\nFunction 'send_command' is oversized: CC=7, fan-out=13, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/git_operations.py:90:God Function: send_command", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/cli/git_operations.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_0070ec25d0348db59a671c5a event_hash=d7877a6e71bb42c74984c67804b78e6e0716161794288ff8b9c77019e0d52b30 timestamp=2026-09-19T17%3A29%3A17.860410%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-167 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-167%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-167 causation_id=- input_hash=094dbbace041d2eb7af5002d22008dba9b42c08b5bfe88e6f924ea8a577809c4 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuODYwNDEwWiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBzZW5kX2NvbW1hbmRgIGluIGBzcmMvdGFnaS9jbGkvZ2l0X29wZXJhdGlvbnMucHk6OTBgLlxuXG5GdW5jdGlvbiAnc2VuZF9jb21tYW5kJyBpcyBvdmVyc2l6ZWQ6IENDPTcsIGZhbi1vdXQ9MTMsIG11dGF0aW9ucz05LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2NsaS9naXRfb3BlcmF0aW9ucy5weTo5MDpHb2QgRnVuY3Rpb246IHNlbmRfY29tbWFuZCIsImZpbGVzIjpbInNyYy90YWdpL2NsaS9naXRfb3BlcmF0aW9ucy5weSJdLCJpZCI6IlBMRi0xNjciLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwiZ29kLWZ1bmN0aW9uIl0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IEdvZCBGdW5jdGlvbjogc2VuZF9jb21tYW5kIiwicHJpb3JpdHkiOiJub3JtYWwiLCJzb3VyY2UiOnsiY29udGV4dCI6e30sInRpbWVzdGFtcCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuODM5OTAwWiIsInRvb2wiOiJrb3J1LXNjYW4ifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuODYwNDE3WiJ9fQ", "created_at": "2026-09-19T17:29:17.860410Z", "updated_at": "2026-09-19T17:29:17.860417Z"}, "PLF-168": {"id": "PLF-168", "name": "Address code smell: God Function: setup_logger", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:18.740949Z", "context": {}}, "description": "code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`.\n\nFunction 'setup_logger' is oversized: CC=4, fan-out=13, mutations=14.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/utils/logger.py:9:God Function: setup_logger", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/utils/logger.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_f0359544002aed038d929132 event_hash=d257a0ac3a625f71ba5bf32550ced9e807cf2dfce823a01aeeaa442df5607306 timestamp=2026-09-19T17%3A29%3A18.761477%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-168 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-168%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-168 causation_id=- input_hash=5455099356079369221e96f911f718af3f22a074c77828cfce5d271410ed75e8 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTguNzYxNDc3WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBzZXR1cF9sb2dnZXJgIGluIGBzcmMvdGFnaS91dGlscy9sb2dnZXIucHk6OWAuXG5cbkZ1bmN0aW9uICdzZXR1cF9sb2dnZXInIGlzIG92ZXJzaXplZDogQ0M9NCwgZmFuLW91dD0xMywgbXV0YXRpb25zPTE0LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL3V0aWxzL2xvZ2dlci5weTo5OkdvZCBGdW5jdGlvbjogc2V0dXBfbG9nZ2VyIiwiZmlsZXMiOlsic3JjL3RhZ2kvdXRpbHMvbG9nZ2VyLnB5Il0sImlkIjoiUExGLTE2OCIsImxhYmVscyI6WyJsbG0tcmVhZHkiLCJjb2RlMmxsbSIsImNvZGUtc21lbGwiLCJnb2QtZnVuY3Rpb24iXSwibmFtZSI6IkFkZHJlc3MgY29kZSBzbWVsbDogR29kIEZ1bmN0aW9uOiBzZXR1cF9sb2dnZXIiLCJwcmlvcml0eSI6Im5vcm1hbCIsInNvdXJjZSI6eyJjb250ZXh0Ijp7fSwidGltZXN0YW1wIjoiMjAyNi0wOS0xOVQxNzoyOToxOC43NDA5NDlaIiwidG9vbCI6ImtvcnUtc2NhbiJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQxNzoyOToxOC43NjE0ODNaIn19", "created_at": "2026-09-19T17:29:18.761477Z", "updated_at": "2026-09-19T17:29:18.761483Z"}, "PLF-169": {"id": "PLF-169", "name": "Address code smell: God Function: summary_command", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-scan", "timestamp": "2026-09-19T17:29:19.612901Z", "context": {}}, "description": "code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`.\n\nFunction 'summary_command' is oversized: CC=7, fan-out=13, mutations=17.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/utility_commands.py:25:God Function: summary_command", "acceptance_criteria": [], "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/cli/utility_commands.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_e1d3735ae7f1ce6cfd509c69 event_hash=4a5cf616d161a2108e26202203152fecce7c4581229df2b6b8f59e5262182551 timestamp=2026-09-19T17%3A29%3A19.641507%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-169 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-169%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-169 causation_id=- input_hash=7eb42404efc63ebac74b06bba227b2078d3f968671273d50246688c2b076a63c receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTkuNjQxNTA3WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBzdW1tYXJ5X2NvbW1hbmRgIGluIGBzcmMvdGFnaS9jbGkvdXRpbGl0eV9jb21tYW5kcy5weToyNWAuXG5cbkZ1bmN0aW9uICdzdW1tYXJ5X2NvbW1hbmQnIGlzIG92ZXJzaXplZDogQ0M9NywgZmFuLW91dD0xMywgbXV0YXRpb25zPTE3LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2NsaS91dGlsaXR5X2NvbW1hbmRzLnB5OjI1OkdvZCBGdW5jdGlvbjogc3VtbWFyeV9jb21tYW5kIiwiZmlsZXMiOlsic3JjL3RhZ2kvY2xpL3V0aWxpdHlfY29tbWFuZHMucHkiXSwiaWQiOiJQTEYtMTY5IiwibGFiZWxzIjpbImxsbS1yZWFkeSIsImNvZGUybGxtIiwiY29kZS1zbWVsbCIsImdvZC1mdW5jdGlvbiJdLCJuYW1lIjoiQWRkcmVzcyBjb2RlIHNtZWxsOiBHb2QgRnVuY3Rpb246IHN1bW1hcnlfY29tbWFuZCIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjE5LjYxMjkwMVoiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjE5LjY0MTUxNFoifX0", "created_at": "2026-09-19T17:29:19.641507Z", "updated_at": "2026-09-19T17:29:19.641514Z"}}}}} \ No newline at end of file +{"version": 1, "yaml_mtime_ns": 1789852468222781064, "data": {"sprint": {"id": "current", "name": "Current", "status": "active", "tickets": {"GITHUB-138": {"assignee": null, "backend": "github", "description": "\ncode2llm reports `Shotgun Surgery: tags` in `src/tagi/heuristics/tags.py:66`.\n\nMutation of variable 'tags' spans 6 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.\n\n---\n\n**Strategy Metadata:**\n- repository: semcod/tagi\n- planfile_id: semcod/tagi:2521ebe187e61bb2:PLF-115\n", "external_id": "138", "history": [{"action": "update", "changes": ["sprint"], "reason": "move_ticket", "source": "planfile.store", "timestamp": "2026-09-19T17:21:43.578226+00:00"}], "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "code2llm", "code-smell", "shotgun-surgery"], "metadata": {"deduplication_key": "semcod/tagi:2521ebe187e61bb2:PLF-115"}, "name": "Address code smell: Shotgun Surgery: tags", "sprint": "current", "status": "open", "sync": {"github": {"id": "138", "key": "semcod/tagi#138", "url": "https://github.com/semcod/tagi/issues/138"}}, "updated_at": "2026-09-19T17:21:43.578177+00:00"}, "GITHUB-6": {"assignee": null, "backend": "github", "description": "\n## Cel i etap\n\nKampania wellmanifest/docs v0.4.0 dla **semcod/tagi**. Etap: **PLAN / poczekalnia**.\nTo zgłoszenie nie uruchamia wykonawcy ani nie nadaje uprawnień do usuwania danych, zmiany chronionego CI lub samodzielnego merge.\n\nStandard: https://github.com/wellmanifest/docs/tree/867241833a7e69188d595505d116115736438c7a\nPrzed rozpoczęciem sprawdzić, czy istniejąca adopcja i zadania już realizują ten zakres; wznowić pasujące zadanie zamiast tworzyć konkurencyjne.\n\n## Obserwacja wejściowa (2026-09-14, lokalny checkout)\n\n- Rewizja: `3b550841ed6c7be485c5056a7a45aaae3a9f7d16`; liczba śledzonych Markdown pod docs/: **5**.\n- To inwentaryzacja ścieżek, nie aktualny audyt treści ani dowód duplikacji. Ponowić względem aktualnej gałęzi domyślnej `main`.\n- `docs/README.md`\n- `docs/configuration.md`\n- `docs/information/internal-dependencies.md`\n- `docs/provider-detection.md`\n- `docs/troubleshooting.md`\n\n## Zakres i kryteria odbioru\n\n- [ ] AC-01: Zmapować docs, indeksy, changelogi, obecne i historyczne tickety (Planfile/project/SQLite), issues i PR-y. Uzgodnić statusy z kodem oraz dowodami scalenia; nie zamykać zadań na podstawie starego TODO.\n- [ ] AC-02: Dla każdej rodziny dokumentów wskazać właściciela, kanoniczną ścieżkę i decyzję: zachować / zaktualizować / scalić / superseded. Podobieństwo tekstu nie jest dowodem zbędności; nie usuwać unikalnych wymagań, dowodów ani zarządzanych kopii standardów.\n- [ ] AC-03: Migrować małymi partiami do krótkich plików WIELKIMI_LITERAMI.md w odpowiednich kategoriach FEATURE, BUGFIX, SERVICE, INFORMATION, ANALYSIS, REFACTORING lub DECISION. Pilność zapisać jako P0–P3, nie jako typ dokumentu. Zachować wyjątki organizacyjne i zgodność historycznego v1.\n- [ ] AC-04: Zachować stare linki i kotwice przez poprawne mapy dawnych ścieżek; zaktualizować docs/README.md i odnośniki z changeloga bez powielania treści. Udokumentować każdą usuniętą kopię i dowód zachowania jej unikalnej treści; nie kasować historii ticketów.\n- [ ] AC-05: Przyjąć immutable pin standardu w procesie właściwym dla repo i podłączyć preflight oraz finalny checker do istniejącego CI. Sprawdzić zaufane base/HEAD. Globalny filtr fleet standardu ograniczony do subactor/* nie dowodzi pokrycia semcod/autogrammar; raportować i rozwiązać tę lukę bez obejścia bramy.\n- [ ] AC-06: DSL jest opcjonalny tylko dla formalnych FEATURE/BUGFIX; użyć parsera przypiętego przez policy-dsl.lock.json. DSL nie wykonuje testów ani nie zatwierdza zmiany. Nie przepisywać całej dokumentacji na DSL.\n- [ ] AC-07: Sprawdzić linki i kotwice, zachowanie wymagań, governance, testy projektu i ponowne uruchomienie bez dodatkowych zmian. Oddzielić liczbę plików od jakości i kompletności migracji.\n- [ ] AC-08: Osobny ograniczony ticket/worktree/PR zgodnie z zasadami repo; niezależny review i chroniona publikacja. Raport końcowy: pokrycie, pominięcia, konflikty, model rzeczywiście użyty, wyniki kontroli i URL scalonego PR.\n\n## Kolejność\n\nAudyt read-only → uzgodnienie istniejących zadań → plan migracji → pilotaż → małe partie → przegląd i publikacja.\nPierwsza grupa pilotażowa: semcod/koru, semcod/goal, semcod/taskand-glm53. Pozostałe repo oczekują oceny pilotażu; samo utworzenie issue nie włącza automatyzacji.\nNie nadpisywać brudnych checkoutów, nie zmieniać aplikacji ani statusów historycznych zadań w ramach samego porządkowania docs.\n\n## Powiązane wcześniejsze zgłoszenia\n\n- Audyt GitHub nie znalazł powiązanego zgłoszenia po tytule; nadal sprawdzić lokalne i historyczne zadania.\n\n\n---\n\n**Strategy Metadata:**\n- deduplication_key: wellmanifest-docs-v04:semcod/tagi\n- campaign: wellmanifest-docs-v04\n- standard_revision: 867241833a7e69188d595505d116115736438c7a\n- phase: PLAN\n", "external_id": "6", "history": [{"action": "update", "changes": ["sprint"], "reason": "move_ticket", "source": "planfile.store", "timestamp": "2026-09-19T17:21:44.611616+00:00"}], "integration": ["github"], "labels": ["documentation", "docs-standard-v04", "planning-only", "priority-normal", "planfile", "managed"], "metadata": {"deduplication_key": "wellmanifest-docs-v04:semcod/tagi"}, "name": "[DOCS] Standaryzacja dokumentacji, uzgodnienie historii i deduplikacja", "sprint": "current", "status": "open", "sync": {"github": {"id": "6", "key": "semcod/tagi#6", "url": "https://github.com/semcod/tagi/issues/6"}}, "updated_at": "2026-09-19T17:21:44.611586+00:00"}, "GITHUB-7": {"assignee": null, "backend": "github", "description": "\n\nAudit date: 2026-09-15. Scope: this repository only; planning, not authorization to modify source or deploy.\n\nObserved local checkout SHA: `3b550841ed6c7be485c5056a7a45aaae3a9f7d16`. Local declared adoption status: `review-required`.\n\nComparison is against observed GitHub default-branch commits and VERSION, not an assertion that every changed commit requires an upgrade.\n\nNo declarations means unavailable evidence, not proof that no standard is followed. Select applicable wellmanifest packs; do not install every pack indiscriminately.\n\n- wellmanifest/docs: adopted `ebe7501063ef4f3e63ded610c2d3183010ca636e` (version None); observed upstream `aa92136b4e94f48355c39fb206286aba024c6aa4` (version 0.5.0); pin-differs-review-required. Declaration: `.governance/docs.json`.\n\n## Acceptance criteria\n\n- [ ] Reconcile actual applicable standard adoptions with deployed/default-branch state; record unknowns and exemptions.\n- [ ] For each differing pin, compare version and relevant artifacts; use the managed adopter in a separate bounded implementation ticket only when needed.\n- [ ] Preserve project overrides, dirty work, historical tasks and stable document links; never edit managed hashes to bypass validation.\n- [ ] Verify local Planfile ID to GitHub issue mapping and retry deduplication without broad bidirectional sync.\n- [ ] Run managed governance and stack checks after any separately authorized adoption; report declared versus protected-CI coverage.\n\nExisting related work (reconcile/reuse scope; do not duplicate implementation):\n- https://github.com/semcod/tagi/issues/6\n\n---\n\n**Strategy Metadata:**\n- deduplication_key: dev-quality-fleet-readiness-v1:semcod/tagi\n- planfile_id: PLF-012\n", "external_id": "7", "history": [{"action": "update", "changes": ["sprint"], "reason": "move_ticket", "source": "planfile.store", "timestamp": "2026-09-19T17:21:45.359903+00:00"}], "integration": ["github"], "labels": ["planfile", "managed"], "metadata": {"deduplication_key": "dev-quality-fleet-readiness-v1:semcod/tagi"}, "name": "[WELLMANIFEST] Reconcile adopted standards and verify Planfile delivery", "sprint": "current", "status": "open", "sync": {"github": {"id": "7", "key": "semcod/tagi#7", "url": "https://github.com/semcod/tagi/issues/7"}}, "updated_at": "2026-09-19T17:21:45.359877+00:00"}, "PLF-088": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T22:59:24.712993+00:00", "description": "\ncode2llm reports `Data Clump: body, repo_path, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, repo_path, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "84", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: body, repo_path, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, repo_path, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T22:59:24.712993+00:00"}], "id": "PLF-088", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: body, repo_path, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, repo_path, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "data-clump", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-088"}, "name": "Address code smell: Data Clump: body, repo_path, title", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: body, repo_path, title", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1789683999494622908, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: body, repo_path, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, repo_path, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-17T22:59:24.712993+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "84", "key": "semcod/tagi#84", "url": "https://github.com/semcod/tagi/issues/84"}}, "updated_at": "2026-09-17T22:59:24.712993+00:00"}, "PLF-089": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:00:40.968749+00:00", "description": "\ncode2llm reports `God Function: _calculate_complexity` in `src/tagi/heuristics/metrics.py:46`.\n\nFunction '_calculate_complexity' is oversized: CC=5, fan-out=6, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "85", "files": ["src/tagi/heuristics/metrics.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: _calculate_complexity` in `src/tagi/heuristics/metrics.py:46`.\n\nFunction '_calculate_complexity' is oversized: CC=5, fan-out=6, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:00:40.968749+00:00"}], "id": "PLF-089", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: _calculate_complexity` in `src/tagi/heuristics/metrics.py:46`.\n\nFunction '_calculate_complexity' is oversized: CC=5, fan-out=6, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-089"}, "name": "Address code smell: God Function: _calculate_complexity", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/heuristics/metrics.py:46:God Function: _calculate_complexity", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779811310790143885, "path": "src/tagi/heuristics/metrics.py", "sha256": "dcd2cc0255c4f2ee3eee8aaae72af3e54f0aa6a78598d290d61eb44299401b2d", "size_bytes": 6521}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: _calculate_complexity` in `src/tagi/heuristics/metrics.py:46`.\n\nFunction '_calculate_complexity' is oversized: CC=5, fan-out=6, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:00:40.968749+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "85", "key": "semcod/tagi#85", "url": "https://github.com/semcod/tagi/issues/85"}}, "updated_at": "2026-09-17T23:00:40.968749+00:00"}, "PLF-090": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:02:04.118321+00:00", "description": "\ncode2llm reports `God Function: _calculate_impact` in `src/tagi/heuristics/metrics.py:78`.\n\nFunction '_calculate_impact' is oversized: CC=5, fan-out=3, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "86", "files": ["src/tagi/heuristics/metrics.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: _calculate_impact` in `src/tagi/heuristics/metrics.py:78`.\n\nFunction '_calculate_impact' is oversized: CC=5, fan-out=3, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:02:04.118321+00:00"}], "id": "PLF-090", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: _calculate_impact` in `src/tagi/heuristics/metrics.py:78`.\n\nFunction '_calculate_impact' is oversized: CC=5, fan-out=3, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-090"}, "name": "Address code smell: God Function: _calculate_impact", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/heuristics/metrics.py:78:God Function: _calculate_impact", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779811310790143885, "path": "src/tagi/heuristics/metrics.py", "sha256": "dcd2cc0255c4f2ee3eee8aaae72af3e54f0aa6a78598d290d61eb44299401b2d", "size_bytes": 6521}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: _calculate_impact` in `src/tagi/heuristics/metrics.py:78`.\n\nFunction '_calculate_impact' is oversized: CC=5, fan-out=3, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:02:04.118321+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "86", "key": "semcod/tagi#86", "url": "https://github.com/semcod/tagi/issues/86"}}, "updated_at": "2026-09-17T23:02:04.118321+00:00"}, "PLF-091": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:03:33.158245+00:00", "description": "\ncode2llm reports `God Function: _load_config` in `src/tagi/config.py:30`.\n\nFunction '_load_config' is oversized: CC=13, fan-out=6, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "87", "files": ["src/tagi/config.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: _load_config` in `src/tagi/config.py:30`.\n\nFunction '_load_config' is oversized: CC=13, fan-out=6, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:03:33.158245+00:00"}], "id": "PLF-091", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: _load_config` in `src/tagi/config.py:30`.\n\nFunction '_load_config' is oversized: CC=13, fan-out=6, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-091"}, "name": "Address code smell: God Function: _load_config", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/config.py:30:God Function: _load_config", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779802844828755285, "path": "src/tagi/config.py", "sha256": "a3f500d3b7d42e797a2054b5ec56c45baf27c8a5e9877c20c9f23f63c091433a", "size_bytes": 4314}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: _load_config` in `src/tagi/config.py:30`.\n\nFunction '_load_config' is oversized: CC=13, fan-out=6, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:03:33.158245+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "87", "key": "semcod/tagi#87", "url": "https://github.com/semcod/tagi/issues/87"}}, "updated_at": "2026-09-17T23:03:33.158245+00:00"}, "PLF-092": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:05:09.293887+00:00", "description": "\ncode2llm reports `God Function: analyze_python_imports` in `src/tagi/analyzer/dependency_graph.py:9`.\n\nFunction 'analyze_python_imports' is oversized: CC=8, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "88", "files": ["src/tagi/analyzer/dependency_graph.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: analyze_python_imports` in `src/tagi/analyzer/dependency_graph.py:9`.\n\nFunction 'analyze_python_imports' is oversized: CC=8, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:05:09.293887+00:00"}], "id": "PLF-092", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: analyze_python_imports` in `src/tagi/analyzer/dependency_graph.py:9`.\n\nFunction 'analyze_python_imports' is oversized: CC=8, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-092"}, "name": "Address code smell: God Function: analyze_python_imports", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/analyzer/dependency_graph.py:9:God Function: analyze_python_imports", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779810400712577609, "path": "src/tagi/analyzer/dependency_graph.py", "sha256": "56c60106b3e4d548089071146800fdcc6eddfdcb2b14c53bce8d7532487723bf", "size_bytes": 5250}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: analyze_python_imports` in `src/tagi/analyzer/dependency_graph.py:9`.\n\nFunction 'analyze_python_imports' is oversized: CC=8, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:05:09.293887+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "88", "key": "semcod/tagi#88", "url": "https://github.com/semcod/tagi/issues/88"}}, "updated_at": "2026-09-17T23:05:09.293887+00:00"}, "PLF-093": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:06:54.291030+00:00", "description": "\ncode2llm reports `God Function: apply_tags` in `src/tagi/heuristics/tags.py:12`.\n\nFunction 'apply_tags' is oversized: CC=11, fan-out=10, mutations=16.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "89", "files": ["src/tagi/heuristics/tags.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: apply_tags` in `src/tagi/heuristics/tags.py:12`.\n\nFunction 'apply_tags' is oversized: CC=11, fan-out=10, mutations=16.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:06:54.291030+00:00"}], "id": "PLF-093", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: apply_tags` in `src/tagi/heuristics/tags.py:12`.\n\nFunction 'apply_tags' is oversized: CC=11, fan-out=10, mutations=16.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-093"}, "name": "Address code smell: God Function: apply_tags", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/heuristics/tags.py:12:God Function: apply_tags", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779811321149251584, "path": "src/tagi/heuristics/tags.py", "sha256": "098c64d70cd068c2113523675c53a957d92d646558f9295490c4d6f027c5d064", "size_bytes": 3404}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: apply_tags` in `src/tagi/heuristics/tags.py:12`.\n\nFunction 'apply_tags' is oversized: CC=11, fan-out=10, mutations=16.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:06:54.291030+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "89", "key": "semcod/tagi#89", "url": "https://github.com/semcod/tagi/issues/89"}}, "updated_at": "2026-09-17T23:06:54.291030+00:00"}, "PLF-094": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-17T23:08:50.360840+00:00", "description": "\ncode2llm reports `God Function: build_report_header` in `src/tagi/utils/summary_helpers.py:9`.\n\nFunction 'build_report_header' is oversized: CC=1, fan-out=2, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "90", "files": ["src/tagi/utils/summary_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: build_report_header` in `src/tagi/utils/summary_helpers.py:9`.\n\nFunction 'build_report_header' is oversized: CC=1, fan-out=2, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-17T23:08:50.360840+00:00"}], "id": "PLF-094", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: build_report_header` in `src/tagi/utils/summary_helpers.py:9`.\n\nFunction 'build_report_header' is oversized: CC=1, fan-out=2, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-094"}, "name": "Address code smell: God Function: build_report_header", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/utils/summary_helpers.py:9:God Function: build_report_header", "evidence": {"artifact": {"mtime_ns": 1789685545813892871, "path": "project/analysis.toon.yaml", "sha256": "56388ccd6ea846f313f89eee0672e29af4d29e58ce0898052bd8ff8ebb956a7b", "size_bytes": 10159}, "files": [{"mtime_ns": 1779814990412632237, "path": "src/tagi/utils/summary_helpers.py", "sha256": "a887228547f1b705ca84a96f28fc2d6e62d0ea14bf143f32faa9a31fe3d7c1f4", "size_bytes": 3017}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789685545874477122, "path": "project/planfile-tickets.yaml", "sha256": "b10db9962e41e134f1374ebe04fdb8c3effa635fcb0f2d59f06498c1ae2f5b2a", "size_bytes": 29760}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: build_report_header` in `src/tagi/utils/summary_helpers.py:9`.\n\nFunction 'build_report_header' is oversized: CC=1, fan-out=2, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-17T23:08:50.360840+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "90", "key": "semcod/tagi#90", "url": "https://github.com/semcod/tagi/issues/90"}}, "updated_at": "2026-09-17T23:08:50.360840+00:00"}, "PLF-109": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T09:38:21.536635+00:00", "description": "\ncode2llm reports `Data Clump: title, repo_path, body` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, repo_path, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "105", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: title, repo_path, body` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, repo_path, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T09:38:21.536635+00:00"}], "id": "PLF-109", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: title, repo_path, body` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, repo_path, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "data-clump", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-109"}, "name": "Address code smell: Data Clump: title, repo_path, body", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: title, repo_path, body", "evidence": {"artifact": {"mtime_ns": 1789722832140537337, "path": "project/analysis.toon.yaml", "sha256": "9227c40940ca4b556af8287eff9e84ce13c73372481f6eeaf0baec8aca773183", "size_bytes": 10381}, "files": [{"mtime_ns": 1789683999494622908, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789722832246791207, "path": "project/planfile-tickets.yaml", "sha256": "7a9953a26921f7b5cc634a034b7a538112d1ddfd75b1718c00dd8d817d84ffa1", "size_bytes": 30378}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: title, repo_path, body` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, repo_path, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-18T09:38:21.536635+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "105", "key": "semcod/tagi#105", "url": "https://github.com/semcod/tagi/issues/105"}}, "updated_at": "2026-09-18T09:38:21.536635+00:00"}, "PLF-118": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T14:31:50.817670+00:00", "description": "\ncode2llm reports `Data Clump: repo_path, title, body` in `src/tagi/cli/provider_commands.py:52`.\n\nArguments (repo_path, title, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "120", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: repo_path, title, body` in `src/tagi/cli/provider_commands.py:52`.\n\nArguments (repo_path, title, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T14:31:50.817670+00:00"}], "id": "PLF-118", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: repo_path, title, body` in `src/tagi/cli/provider_commands.py:52`.\n\nArguments (repo_path, title, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "data-clump", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-118"}, "name": "Address code smell: Data Clump: repo_path, title, body", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:52:Data Clump: repo_path, title, body", "evidence": {"artifact": {"mtime_ns": 1789739375335946512, "path": "project/analysis.toon.yaml", "sha256": "e383157236def469e5391fba233c9fa81738ef3ca0eafbc8c835538ac4a7d28d", "size_bytes": 10289}, "files": [{"mtime_ns": 1789739346063914074, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789739375343946523, "path": "project/planfile-tickets.yaml", "sha256": "2d45686552b801deab82b10b66dedd6931f7dbc2cb2cdde8e0d1e76d2fdb06d8", "size_bytes": 29675}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: repo_path, title, body` in `src/tagi/cli/provider_commands.py:52`.\n\nArguments (repo_path, title, body) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-18T14:31:50.817670+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "120", "key": "semcod/tagi#120", "url": "https://github.com/semcod/tagi/issues/120"}}, "updated_at": "2026-09-18T14:31:50.817670+00:00"}, "PLF-119": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T14:43:06.846910+00:00", "description": "\ncode2llm reports `src.tagi.utils.inspect_helpers.resolve_filtered_changes` at `src/tagi/utils/inspect_helpers.py:10` with cyclomatic complexity 17 (limit 15).\n\nExtract smaller functions, flatten conditionals, or split strategy branches. Re-run code2llm after the change and keep tests green.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "121", "files": ["src/tagi/utils/inspect_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `src.tagi.utils.inspect_helpers.resolve_filtered_changes` at `src/tagi/utils/inspect_helpers.py:10` with cyclomatic complexity 17 (limit 15).\n\nExtract smaller functions, flatten conditionals, or split strategy branches. Re-run code2llm after the change and keep tests green.", "source": "koru task", "timestamp": "2026-09-18T14:43:06.846910+00:00"}], "id": "PLF-119", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `src.tagi.utils.inspect_helpers.resolve_filtered_changes` at `src/tagi/utils/inspect_helpers.py:10` with cyclomatic complexity 17 (limit 15).\n\nExtract smaller functions, flatten conditionals, or split strategy branches. Re-run code2llm after the change and keep tests green."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "refactor", "complexity", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-119"}, "name": "Reduce cyclomatic complexity: src.tagi.utils.inspect_helpers.resolve_filtered_changes (CC=17)", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:cc:src/tagi/utils/inspect_helpers.py:src.tagi.utils.inspect_helpers.resolve_filtered_changes", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1789740908491220682, "path": "src/tagi/utils/inspect_helpers.py", "sha256": "d344cd14a3264e66e6d12340f6dba4af3713defdc5d9c246f6aba695357c0ea3", "size_bytes": 3655}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `src.tagi.utils.inspect_helpers.resolve_filtered_changes` at `src/tagi/utils/inspect_helpers.py:10` with cyclomatic complexity 17 (limit 15).\n\nExtract smaller functions, flatten conditionals, or split strategy branches. Re-run code2llm after the change and keep tests green.", "signal": "code2llm_cc"}, "timestamp": "2026-09-18T14:43:06.846910+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "121", "key": "semcod/tagi#121", "url": "https://github.com/semcod/tagi/issues/121"}}, "updated_at": "2026-09-18T14:43:06.846910+00:00"}, "PLF-120": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T14:47:32.219905+00:00", "description": "\ncode2llm reports `God Function: calculate_risk_score` in `src/tagi/heuristics/scoring.py:8`.\n\nFunction 'calculate_risk_score' is oversized: CC=7, fan-out=1, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "122", "files": ["src/tagi/heuristics/scoring.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: calculate_risk_score` in `src/tagi/heuristics/scoring.py:8`.\n\nFunction 'calculate_risk_score' is oversized: CC=7, fan-out=1, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T14:47:32.219905+00:00"}], "id": "PLF-120", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: calculate_risk_score` in `src/tagi/heuristics/scoring.py:8`.\n\nFunction 'calculate_risk_score' is oversized: CC=7, fan-out=1, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-120"}, "name": "Address code smell: God Function: calculate_risk_score", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/heuristics/scoring.py:8:God Function: calculate_risk_score", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1779802847615519629, "path": "src/tagi/heuristics/scoring.py", "sha256": "d9dd32ed33121c23414ebae66d33fcd25489b6bcdc29342d9942e6a5fb33e652", "size_bytes": 777}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: calculate_risk_score` in `src/tagi/heuristics/scoring.py:8`.\n\nFunction 'calculate_risk_score' is oversized: CC=7, fan-out=1, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T14:47:32.219905+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "122", "key": "semcod/tagi#122", "url": "https://github.com/semcod/tagi/issues/122"}}, "updated_at": "2026-09-18T14:47:32.219905+00:00"}, "PLF-126": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T15:46:34.272245+00:00", "description": "\ncode2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "128", "files": ["src/tagi/planner/branch_grouper.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T15:46:34.272245+00:00"}], "id": "PLF-126", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-126"}, "name": "Address code smell: God Function: group_by_branch", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/planner/branch_grouper.py:7:God Function: group_by_branch", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1779810382570385717, "path": "src/tagi/planner/branch_grouper.py", "sha256": "7495814bca28a8dda4134f4498a644fc1c4bfaf3fbc141de4c45b3cfa5cd96eb", "size_bytes": 2702}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T15:46:34.272245+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "128", "key": "semcod/tagi#128", "url": "https://github.com/semcod/tagi/issues/128"}}, "updated_at": "2026-09-18T15:46:34.272245+00:00"}, "PLF-127": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:24:25.964206+00:00", "description": "\ncode2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "129", "files": ["src/tagi/cli/utility_commands.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T16:24:25.964206+00:00"}], "id": "PLF-127", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-127"}, "name": "Address code smell: God Function: hooks_command", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/cli/utility_commands.py:131:God Function: hooks_command", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1789740908490220674, "path": "src/tagi/cli/utility_commands.py", "sha256": "a78c23996b91860bd73b82a719e52a8fffcc68bf0e6756e7379c01e30d578c1a", "size_bytes": 7225}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T16:24:25.964206+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "129", "key": "semcod/tagi#129", "url": "https://github.com/semcod/tagi/issues/129"}}, "updated_at": "2026-09-18T16:24:25.964206+00:00"}, "PLF-128": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:29:19.809691+00:00", "description": "\ncode2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "130", "files": ["src/tagi/cli/inspection_commands.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T16:29:19.809691+00:00"}], "id": "PLF-128", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-128"}, "name": "Address code smell: God Function: inspect_command", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/cli/inspection_commands.py:19:God Function: inspect_command", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1789740908490220674, "path": "src/tagi/cli/inspection_commands.py", "sha256": "666b4944feb18f6673bbbfb664cda2a082ec1a041b67fdaff58a8d80976bd198", "size_bytes": 4284}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T16:29:19.809691+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "130", "key": "semcod/tagi#130", "url": "https://github.com/semcod/tagi/issues/130"}}, "updated_at": "2026-09-18T16:29:19.809691+00:00"}, "PLF-129": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:34:15.855415+00:00", "description": "\ncode2llm reports `God Function: preview_changes` in `src/tagi/planner/preview.py:29`.\n\nFunction 'preview_changes' is oversized: CC=3, fan-out=5, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "131", "files": ["src/tagi/planner/preview.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: preview_changes` in `src/tagi/planner/preview.py:29`.\n\nFunction 'preview_changes' is oversized: CC=3, fan-out=5, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T16:34:15.855415+00:00"}], "id": "PLF-129", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: preview_changes` in `src/tagi/planner/preview.py:29`.\n\nFunction 'preview_changes' is oversized: CC=3, fan-out=5, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-129"}, "name": "Address code smell: God Function: preview_changes", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/planner/preview.py:29:God Function: preview_changes", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "files": [{"mtime_ns": 1789739375293946457, "path": "src/tagi/planner/preview.py", "sha256": "8d3998cd67c562eb08e3ae5ecdcf2feaaff4d9f1ca864344a214c44d81b83a41", "size_bytes": 1363}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789742585705778183, "path": "project/planfile-tickets.yaml", "sha256": "00e016113d76f457efd919f00242693f50364860d6fbf24ad2a4413700bab4cc", "size_bytes": 16625}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: preview_changes` in `src/tagi/planner/preview.py:29`.\n\nFunction 'preview_changes' is oversized: CC=3, fan-out=5, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T16:34:15.855415+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "131", "key": "semcod/tagi#131", "url": "https://github.com/semcod/tagi/issues/131"}}, "updated_at": "2026-09-18T16:34:15.855415+00:00"}, "PLF-131": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:49:07.021464+00:00", "description": "\n`project/analysis.toon.yaml` reports `resolve_filtered_changes` with CC=17 (limit=15), defined in `src/tagi/utils/inspect_helpers.py:10`. Extract sub-functions, simplify conditionals, or split into strategy pattern. Preserve behaviour — this is a pure refactor.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "133", "files": ["src/tagi/utils/inspect_helpers.py"], "history": [{"action": "created", "message": "`project/analysis.toon.yaml` reports `resolve_filtered_changes` with CC=17 (limit=15), defined in `src/tagi/utils/inspect_helpers.py:10`. Extract sub-functions, simplify conditionals, or split into strategy pattern. Preserve behaviour — this is a pure refactor.", "source": "koru task", "timestamp": "2026-09-18T16:49:07.021464+00:00"}], "id": "PLF-131", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "`project/analysis.toon.yaml` reports `resolve_filtered_changes` with CC=17 (limit=15), defined in `src/tagi/utils/inspect_helpers.py:10`. Extract sub-functions, simplify conditionals, or split into strategy pattern. Preserve behaviour — this is a pure refactor."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "refactor", "scan", "complexity", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-131"}, "name": "Reduce cyclomatic complexity: resolve_filtered_changes (CC=17, limit=15)", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "koru-scan:code2llm_cc:src/tagi/utils/inspect_helpers.py", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "kind": "code2llm_analysis", "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude '*.md' --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate the artifact and compare artifact.sha256 before assuming this ticket still reflects the current code."}, "input": "`project/analysis.toon.yaml` reports `resolve_filtered_changes` with CC=17 (limit=15), defined in `src/tagi/utils/inspect_helpers.py:10`. Extract sub-functions, simplify conditionals, or split into strategy pattern. Preserve behaviour — this is a pure refactor.", "signal": "code2llm_cc"}, "timestamp": "2026-09-18T16:49:07.021464+00:00", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "133", "key": "semcod/tagi#133", "url": "https://github.com/semcod/tagi/issues/133"}}, "updated_at": "2026-09-18T16:49:07.021464+00:00"}, "PLF-132": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T16:49:07.642356+00:00", "description": "\nREFACTOR item from `project/analysis.toon.yaml`: **split 1 high-CC methods** (CC>15). Execute this refactor step; re-run the source.context.evidence.regenerate_command to verify.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "134", "files": ["project/analysis.toon.yaml"], "history": [{"action": "created", "message": "REFACTOR item from `project/analysis.toon.yaml`: **split 1 high-CC methods** (CC>15). Execute this refactor step; re-run the source.context.evidence.regenerate_command to verify.", "source": "koru task", "timestamp": "2026-09-18T16:49:07.642356+00:00"}], "id": "PLF-132", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "REFACTOR item from `project/analysis.toon.yaml`: **split 1 high-CC methods** (CC>15). Execute this refactor step; re-run the source.context.evidence.regenerate_command to verify."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "refactor", "scan", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-132"}, "name": "code2llm refactor: split 1 high-CC methods", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "semcod:code2llm:refactor:project/analysis.toon.yaml", "evidence": {"artifact": {"mtime_ns": 1789742585715921903, "path": "project/analysis.toon.yaml", "sha256": "e9a3774622db919b2300b3dd93ce594a90a967409e255cdfb0080ffd22180384", "size_bytes": 10331}, "kind": "code2llm_analysis", "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude '*.md' --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate the artifact and compare artifact.sha256 before assuming this ticket still reflects the current code."}, "input": "REFACTOR item from `project/analysis.toon.yaml`: **split 1 high-CC methods** (CC>15). Execute this refactor step; re-run the source.context.evidence.regenerate_command to verify.", "signal": "code2llm_refactor"}, "timestamp": "2026-09-18T16:49:07.642356+00:00", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "134", "key": "semcod/tagi#134", "url": "https://github.com/semcod/tagi/issues/134"}}, "updated_at": "2026-09-18T16:49:07.642356+00:00"}, "PLF-138": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T19:51:27.884743+00:00", "description": "\ncode2llm reports `God Function: build_statistics_section` in `src/tagi/utils/summary_helpers.py:31`.\n\nFunction 'build_statistics_section' is oversized: CC=2, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "143", "files": ["src/tagi/utils/summary_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: build_statistics_section` in `src/tagi/utils/summary_helpers.py:31`.\n\nFunction 'build_statistics_section' is oversized: CC=2, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T19:51:27.884743+00:00"}], "id": "PLF-138", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: build_statistics_section` in `src/tagi/utils/summary_helpers.py:31`.\n\nFunction 'build_statistics_section' is oversized: CC=2, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-138"}, "name": "Address code smell: God Function: build_statistics_section", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/utils/summary_helpers.py:31:God Function: build_statistics_section", "evidence": {"artifact": {"mtime_ns": 1789760212841277131, "path": "project/analysis.toon.yaml", "sha256": "e779a23e78575a5ca1103e1494c9f5b9bf0ac7bdcb3ffbbab82e37914fa8de0a", "size_bytes": 10336}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/utils/summary_helpers.py", "sha256": "5b80ca05e1202f10e13c9873597a0a11ddf86af9b7cdcb2a9bb2dfb60c233e6a", "size_bytes": 3117}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789760212873891603, "path": "project/planfile-tickets.yaml", "sha256": "d0c2d6eb3eb46612e13fa7d7f524e92e895a3f31556b19210c5499cec6308586", "size_bytes": 22328}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: build_statistics_section` in `src/tagi/utils/summary_helpers.py:31`.\n\nFunction 'build_statistics_section' is oversized: CC=2, fan-out=6, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T19:51:27.884743+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "143", "key": "semcod/tagi#143", "url": "https://github.com/semcod/tagi/issues/143"}}, "updated_at": "2026-09-18T19:51:27.884743+00:00"}, "PLF-139": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T20:26:23.964964+00:00", "description": "\ncode2llm reports `God Function: build_tag_distribution_section` in `src/tagi/utils/summary_helpers.py:71`.\n\nFunction 'build_tag_distribution_section' is oversized: CC=5, fan-out=6, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "144", "files": ["src/tagi/utils/summary_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: build_tag_distribution_section` in `src/tagi/utils/summary_helpers.py:71`.\n\nFunction 'build_tag_distribution_section' is oversized: CC=5, fan-out=6, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T20:26:23.964964+00:00"}], "id": "PLF-139", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: build_tag_distribution_section` in `src/tagi/utils/summary_helpers.py:71`.\n\nFunction 'build_tag_distribution_section' is oversized: CC=5, fan-out=6, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-139"}, "name": "Address code smell: God Function: build_tag_distribution_section", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/utils/summary_helpers.py:71:God Function: build_tag_distribution_section", "evidence": {"artifact": {"mtime_ns": 1789760212841277131, "path": "project/analysis.toon.yaml", "sha256": "e779a23e78575a5ca1103e1494c9f5b9bf0ac7bdcb3ffbbab82e37914fa8de0a", "size_bytes": 10336}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/utils/summary_helpers.py", "sha256": "5b80ca05e1202f10e13c9873597a0a11ddf86af9b7cdcb2a9bb2dfb60c233e6a", "size_bytes": 3117}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789760212873891603, "path": "project/planfile-tickets.yaml", "sha256": "d0c2d6eb3eb46612e13fa7d7f524e92e895a3f31556b19210c5499cec6308586", "size_bytes": 22328}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: build_tag_distribution_section` in `src/tagi/utils/summary_helpers.py:71`.\n\nFunction 'build_tag_distribution_section' is oversized: CC=5, fan-out=6, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T20:26:23.964964+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "144", "key": "semcod/tagi#144", "url": "https://github.com/semcod/tagi/issues/144"}}, "updated_at": "2026-09-18T20:26:23.964964+00:00"}, "PLF-140": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T20:31:21.515076+00:00", "description": "\ncode2llm reports `God Function: display_statistics_table` in `src/tagi/utils/inspect_helpers.py:109`.\n\nFunction 'display_statistics_table' is oversized: CC=1, fan-out=7, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "145", "files": ["src/tagi/utils/inspect_helpers.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: display_statistics_table` in `src/tagi/utils/inspect_helpers.py:109`.\n\nFunction 'display_statistics_table' is oversized: CC=1, fan-out=7, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T20:31:21.515076+00:00"}], "id": "PLF-140", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: display_statistics_table` in `src/tagi/utils/inspect_helpers.py:109`.\n\nFunction 'display_statistics_table' is oversized: CC=1, fan-out=7, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-140"}, "name": "Address code smell: God Function: display_statistics_table", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/utils/inspect_helpers.py:109:God Function: display_statistics_table", "evidence": {"artifact": {"mtime_ns": 1789760212841277131, "path": "project/analysis.toon.yaml", "sha256": "e779a23e78575a5ca1103e1494c9f5b9bf0ac7bdcb3ffbbab82e37914fa8de0a", "size_bytes": 10336}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/utils/inspect_helpers.py", "sha256": "1c596a23769394791c6155c0d18ffff189732a3df1916a648adcfab4b50d7606", "size_bytes": 3639}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789760212873891603, "path": "project/planfile-tickets.yaml", "sha256": "d0c2d6eb3eb46612e13fa7d7f524e92e895a3f31556b19210c5499cec6308586", "size_bytes": 22328}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: display_statistics_table` in `src/tagi/utils/inspect_helpers.py:109`.\n\nFunction 'display_statistics_table' is oversized: CC=1, fan-out=7, mutations=10.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T20:31:21.515076+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "145", "key": "semcod/tagi#145", "url": "https://github.com/semcod/tagi/issues/145"}}, "updated_at": "2026-09-18T20:31:21.515076+00:00"}, "PLF-142": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T20:51:58.051382+00:00", "description": "\ncode2llm reports `Data Clump: repo_path, body, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (repo_path, body, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "148", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: repo_path, body, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (repo_path, body, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T20:51:58.051382+00:00"}], "id": "PLF-142", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: repo_path, body, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (repo_path, body, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "data-clump", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-142"}, "name": "Address code smell: Data Clump: repo_path, body, title", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: repo_path, body, title", "evidence": {"artifact": {"mtime_ns": 1789764409471628814, "path": "project/analysis.toon.yaml", "sha256": "8272c84ad525516fbd4040cd83b4fb110a3f4e91aa510378427c65686d9f3018", "size_bytes": 10424}, "files": [{"mtime_ns": 1789739346063914074, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789764409534879854, "path": "project/planfile-tickets.yaml", "sha256": "e229a798269d410a9ccbb63568a783f63de2465f87ad7c4d3acd2a5c0b1ec43a", "size_bytes": 16701}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: repo_path, body, title` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (repo_path, body, title) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-18T20:51:58.051382+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "148", "key": "semcod/tagi#148", "url": "https://github.com/semcod/tagi/issues/148"}}, "updated_at": "2026-09-18T20:51:58.051382+00:00"}, "PLF-143": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T21:27:31.437891+00:00", "description": "\ncode2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=5, fan-out=9, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "149", "files": ["src/tagi/planner/grouper.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=5, fan-out=9, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T21:27:31.437891+00:00"}], "id": "PLF-143", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=5, fan-out=9, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-143"}, "name": "Address code smell: God Function: group_changes", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/planner/grouper.py:10:God Function: group_changes", "evidence": {"artifact": {"mtime_ns": 1789764409471628814, "path": "project/analysis.toon.yaml", "sha256": "8272c84ad525516fbd4040cd83b4fb110a3f4e91aa510378427c65686d9f3018", "size_bytes": 10424}, "files": [{"mtime_ns": 1789760157304512513, "path": "src/tagi/planner/grouper.py", "sha256": "4f19a41a6d0fb1cc5e82e8210e9a0087aab90c22cb5b01a3879a9aff253b83f0", "size_bytes": 2197}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789764409534879854, "path": "project/planfile-tickets.yaml", "sha256": "e229a798269d410a9ccbb63568a783f63de2465f87ad7c4d3acd2a5c0b1ec43a", "size_bytes": 16701}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=5, fan-out=9, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-18T21:27:31.437891+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "149", "key": "semcod/tagi#149", "url": "https://github.com/semcod/tagi/issues/149"}}, "updated_at": "2026-09-18T21:27:31.437891+00:00"}, "PLF-145": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-18T21:51:29.650993+00:00", "description": "\ncode2llm reports `Data Clump: body, title, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, title, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "152", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: body, title, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, title, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-18T21:51:29.650993+00:00"}], "id": "PLF-145", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: body, title, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, title, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "data-clump", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-145"}, "name": "Address code smell: Data Clump: body, title, repo_path", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: body, title, repo_path", "evidence": {"artifact": {"mtime_ns": 1789767907486023009, "path": "project/analysis.toon.yaml", "sha256": "bffe51d44d6fb6464a866f3f92775ba60121d5c8ee5912e7e28815233ae3b49c", "size_bytes": 10335}, "files": [{"mtime_ns": 1789739346063914074, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789767907544471268, "path": "project/planfile-tickets.yaml", "sha256": "a1a17bb7fff1116657c2c5c8dc0925997c5d311418d5770edcae36e65433c9b5", "size_bytes": 16073}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: body, title, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (body, title, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-18T21:51:29.650993+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "152", "key": "semcod/tagi#152", "url": "https://github.com/semcod/tagi/issues/152"}}, "updated_at": "2026-09-18T21:51:29.650993+00:00"}, "PLF-149": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T08:19:14.641869+00:00", "description": "\ncode2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "158", "files": ["src/tagi/cli/publishing_commands.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T08:19:14.641869+00:00"}], "id": "PLF-149", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-149"}, "name": "Address code smell: God Function: publish_command", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/cli/publishing_commands.py:23:God Function: publish_command", "evidence": {"artifact": {"mtime_ns": 1789805947979310038, "path": "project/analysis.toon.yaml", "sha256": "ff985a6d1df91bec113e0985da69266b7986b65971924ccd9f4fa7cbaea12c51", "size_bytes": 10323}, "files": [{"mtime_ns": 1789740908490220674, "path": "src/tagi/cli/publishing_commands.py", "sha256": "f11201cd601fcd3d52ba6ec5ff5b958f5663f79327593c81377c25c83574a07e", "size_bytes": 5238}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789805948011262070, "path": "project/planfile-tickets.yaml", "sha256": "f8d503084189f0acc6b3277c59858501898b3b2ea7986cead8d6db848b15eb71", "size_bytes": 15477}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=0.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-19T08:19:14.641869+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "158", "key": "semcod/tagi#158", "url": "https://github.com/semcod/tagi/issues/158"}}, "updated_at": "2026-09-19T08:19:14.641869+00:00"}, "PLF-152": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T09:23:37.677573+00:00", "description": "\ncode2llm reports `Data Clump: title, body, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, body, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "162", "files": ["src/tagi/cli/provider_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Data Clump: title, body, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, body, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T09:23:37.677573+00:00"}], "id": "PLF-152", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Data Clump: title, body, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, body, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "data-clump", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-152"}, "name": "Address code smell: Data Clump: title, body, repo_path", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:data_clump:src/tagi/cli/provider_commands.py:34:Data Clump: title, body, repo_path", "evidence": {"artifact": {"mtime_ns": 1789807219128678462, "path": "project/analysis.toon.yaml", "sha256": "a9502e24eae6c96a2813522009e1147c99df0b92b64fc43761c84a0421cc05d6", "size_bytes": 10335}, "files": [{"mtime_ns": 1789739346063914074, "path": "src/tagi/cli/provider_commands.py", "sha256": "68ce18c77819dae347a71d285994bba864fa304bce74de2420ca81f96c3f8225", "size_bytes": 2695}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789807219187356177, "path": "project/planfile-tickets.yaml", "sha256": "09f4267be8bbb0b623e89df1b4ad1ff583984dcab632ff1913d74642fffd254a", "size_bytes": 16076}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Data Clump: title, body, repo_path` in `src/tagi/cli/provider_commands.py:34`.\n\nArguments (title, body, repo_path) are used together in multiple functions: src.tagi.cli.provider_commands._pr_spec, src.tagi.cli.provider_commands.create_pr, src.tagi.cli.provider_commands.create_mr.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_data_clump"}, "timestamp": "2026-09-19T09:23:37.677573+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "162", "key": "semcod/tagi#162", "url": "https://github.com/semcod/tagi/issues/162"}}, "updated_at": "2026-09-19T09:23:37.677573+00:00"}, "PLF-154": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T10:22:37.567988+00:00", "description": "\ncode2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "166", "files": ["src/tagi/scanner/status.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T10:22:37.567988+00:00"}], "id": "PLF-154", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["priority-normal", "planfile", "managed", "koru", "nl-task", "llm-ready", "code2llm", "priority: normal", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "metadata": {"deduplication_key": "PLF-154"}, "name": "Address code smell: God Function: scan_repo", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/scanner/status.py:11:God Function: scan_repo", "evidence": {"artifact": {"mtime_ns": 1789813353805427459, "path": "project/analysis.toon.yaml", "sha256": "f1d18ecd10d02bf68405fbaa6d1f4aed3810ef5648f6751abd385aac2c885d3f", "size_bytes": 10381}, "files": [{"mtime_ns": 1789802617196896179, "path": "src/tagi/scanner/status.py", "sha256": "9b3ee07333cf0ae9ffcc6f3b02ead6d78b0c482d9994a0f4c84b528e9c944c29", "size_bytes": 1793}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789813353833486323, "path": "project/planfile-tickets.yaml", "sha256": "b4eaec2f196e1ecce19683ba5643c0f530a19e7ec6d4dd4a62d1fa3ac24f032d", "size_bytes": 14766}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-19T10:22:37.567988+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "166", "key": "semcod/tagi#166", "url": "https://github.com/semcod/tagi/issues/166"}}, "updated_at": "2026-09-19T10:22:37.567988+00:00"}, "PLF-156": {"assignee": null, "backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T11:41:05.586678+00:00", "description": "\ncode2llm reports `Shotgun Surgery: provider` in `src/tagi/cli/publishing_commands.py:23`.\n\nMutation of variable 'provider' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "169", "files": ["src/tagi/cli/publishing_commands.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: provider` in `src/tagi/cli/publishing_commands.py:23`.\n\nMutation of variable 'provider' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T11:41:05.586678+00:00"}], "id": "PLF-156", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: provider` in `src/tagi/cli/publishing_commands.py:23`.\n\nMutation of variable 'provider' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["planfile", "managed", "koru", "nl-task", "llm-ready", "priority-high", "priority: high", "code2llm", "code-smell", "shotgun-surgery", "priority: high", "priority: high", "priority: high", "priority: high", "priority: high", "priority: high", "priority: high"], "metadata": {"deduplication_key": "PLF-156"}, "name": "Address code smell: Shotgun Surgery: provider", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/cli/publishing_commands.py:23:Shotgun Surgery: provider", "evidence": {"artifact": {"mtime_ns": 1789818000281070860, "path": "project/analysis.toon.yaml", "sha256": "cd908a3fbfce8ab1a9cb171c6ddd2c4d40624145f1441f5d326ee7e671012aac", "size_bytes": 10295}, "files": [{"mtime_ns": 1789817932257139916, "path": "src/tagi/cli/publishing_commands.py", "sha256": "542f145664f4f91fb291e1c1e5d781c33f4ac054622645e7c6aac58fb21568d8", "size_bytes": 5359}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789818000309685535, "path": "project/planfile-tickets.yaml", "sha256": "8895c5115dd230d0481573e88b83b8923b258e1938589013ec204cf9a5817478", "size_bytes": 16648}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: provider` in `src/tagi/cli/publishing_commands.py:23`.\n\nMutation of variable 'provider' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T11:41:05.586678+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "closed", "sync": {"github": {"id": "169", "key": "semcod/tagi#169", "url": "https://github.com/semcod/tagi/issues/169"}}, "updated_at": "2026-09-19T11:41:05.586678+00:00"}, "PLF-160": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:12.755466Z", "description": "code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`.\n\nFunction '_tag_change' is oversized: CC=2, fan-out=9, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/heuristics/tags.py:22:God Function: _tag_change", "dsl": "SODL/1 id=evt_497220cc3af4ef6b44f321c3 event_hash=a649a48467d378efbc3eebe005661ba3d1c88c8e725799f28033db9affdbbb57 timestamp=2026-09-19T17%3A29%3A12.755466%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-160 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-160%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-160 causation_id=- input_hash=d5a7a2d67eb7957053bde0d4b9463b298a084ab459be7d414caed735bd81f544 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTIuNzU1NDY2WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBfdGFnX2NoYW5nZWAgaW4gYHNyYy90YWdpL2hldXJpc3RpY3MvdGFncy5weToyMmAuXG5cbkZ1bmN0aW9uICdfdGFnX2NoYW5nZScgaXMgb3ZlcnNpemVkOiBDQz0yLCBmYW4tb3V0PTksIG11dGF0aW9ucz05LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2hldXJpc3RpY3MvdGFncy5weToyMjpHb2QgRnVuY3Rpb246IF90YWdfY2hhbmdlIiwiZmlsZXMiOlsic3JjL3RhZ2kvaGV1cmlzdGljcy90YWdzLnB5Il0sImlkIjoiUExGLTE2MCIsImxhYmVscyI6WyJsbG0tcmVhZHkiLCJjb2RlMmxsbSIsImNvZGUtc21lbGwiLCJnb2QtZnVuY3Rpb24iXSwibmFtZSI6IkFkZHJlc3MgY29kZSBzbWVsbDogR29kIEZ1bmN0aW9uOiBfdGFnX2NoYW5nZSIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjEyLjczMzU2OFoiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjEyLjc1NTQ3M1oifX0", "files": ["src/tagi/heuristics/tags.py"], "history": [], "id": "PLF-160", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: _tag_change", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:12.733568Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:12.755473Z"}, "PLF-161": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:13.553848Z", "description": "code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\nFunction 'group_by_branch' is oversized: CC=8, fan-out=9, mutations=12.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/planner/branch_grouper.py:7:God Function: group_by_branch", "dsl": "SODL/1 id=evt_40ff20aedf6162ed4834abaf event_hash=ae5af7901b1b3af57cda8f54258ded6d81ca63c88f1e1b8a8f7254067bf0755b timestamp=2026-09-19T17%3A29%3A13.553848%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-161 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-161%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-161 causation_id=- input_hash=cd07a286a6639b4e972faffab3383ed91fe4f5633f91a51914165a850a9c5675 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTMuNTUzODQ4WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBncm91cF9ieV9icmFuY2hgIGluIGBzcmMvdGFnaS9wbGFubmVyL2JyYW5jaF9ncm91cGVyLnB5OjdgLlxuXG5GdW5jdGlvbiAnZ3JvdXBfYnlfYnJhbmNoJyBpcyBvdmVyc2l6ZWQ6IENDPTgsIGZhbi1vdXQ9OSwgbXV0YXRpb25zPTEyLlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL3BsYW5uZXIvYnJhbmNoX2dyb3VwZXIucHk6NzpHb2QgRnVuY3Rpb246IGdyb3VwX2J5X2JyYW5jaCIsImZpbGVzIjpbInNyYy90YWdpL3BsYW5uZXIvYnJhbmNoX2dyb3VwZXIucHkiXSwiaWQiOiJQTEYtMTYxIiwibGFiZWxzIjpbImxsbS1yZWFkeSIsImNvZGUybGxtIiwiY29kZS1zbWVsbCIsImdvZC1mdW5jdGlvbiJdLCJuYW1lIjoiQWRkcmVzcyBjb2RlIHNtZWxsOiBHb2QgRnVuY3Rpb246IGdyb3VwX2J5X2JyYW5jaCIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjEzLjUyOTMzMloiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjEzLjU1Mzg1NloifX0", "files": ["src/tagi/planner/branch_grouper.py"], "history": [], "id": "PLF-161", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: group_by_branch", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:13.529332Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:13.553856Z"}, "PLF-162": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:14.217920Z", "description": "code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\nFunction 'group_changes' is oversized: CC=4, fan-out=9, mutations=7.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/planner/grouper.py:10:God Function: group_changes", "dsl": "SODL/1 id=evt_b95ba0e76679eda0c97bba36 event_hash=418a0c25b25afd250b00e7a387e426e863671c3329af84e74d55cff355f6f2eb timestamp=2026-09-19T17%3A29%3A14.217920%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-162 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-162%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-162 causation_id=- input_hash=c9fb74d7097f7bdd1d19ca0ec5c5aee2e5a324a718d1d790022871040c7abc1f receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTQuMjE3OTIwWiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBncm91cF9jaGFuZ2VzYCBpbiBgc3JjL3RhZ2kvcGxhbm5lci9ncm91cGVyLnB5OjEwYC5cblxuRnVuY3Rpb24gJ2dyb3VwX2NoYW5nZXMnIGlzIG92ZXJzaXplZDogQ0M9NCwgZmFuLW91dD05LCBtdXRhdGlvbnM9Ny5cblxuTWFrZSB0aGUgc21hbGxlc3QgcmVmYWN0b3IgdGhhdCByZW1vdmVzIHRoZSBzbWVsbCBhbmQgcnVuIGxvY2FsIHRlc3RzLlxuXG5jb2RlMmxsbS1kZWR1cGU6IGNvZGUybGxtOnNtZWxsOmdvZF9mdW5jdGlvbjpzcmMvdGFnaS9wbGFubmVyL2dyb3VwZXIucHk6MTA6R29kIEZ1bmN0aW9uOiBncm91cF9jaGFuZ2VzIiwiZmlsZXMiOlsic3JjL3RhZ2kvcGxhbm5lci9ncm91cGVyLnB5Il0sImlkIjoiUExGLTE2MiIsImxhYmVscyI6WyJsbG0tcmVhZHkiLCJjb2RlMmxsbSIsImNvZGUtc21lbGwiLCJnb2QtZnVuY3Rpb24iXSwibmFtZSI6IkFkZHJlc3MgY29kZSBzbWVsbDogR29kIEZ1bmN0aW9uOiBncm91cF9jaGFuZ2VzIiwicHJpb3JpdHkiOiJub3JtYWwiLCJzb3VyY2UiOnsiY29udGV4dCI6e30sInRpbWVzdGFtcCI6IjIwMjYtMDktMTlUMTc6Mjk6MTQuMjA3OTk3WiIsInRvb2wiOiJrb3J1LXNjYW4ifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTQuMjE3OTI2WiJ9fQ", "files": ["src/tagi/planner/grouper.py"], "history": [], "id": "PLF-162", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: group_changes", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:14.207997Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:14.217926Z"}, "PLF-163": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:14.903316Z", "description": "code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\nFunction 'hooks_command' is oversized: CC=10, fan-out=11, mutations=4.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/utility_commands.py:131:God Function: hooks_command", "dsl": "SODL/1 id=evt_3456b70183d69035897be1ff event_hash=dcc172d6f7418092c72c96f93076690043898fe23b41adf1ed8d2e8802c015b5 timestamp=2026-09-19T17%3A29%3A14.903316%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-163 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-163%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-163 causation_id=- input_hash=6aa365062d5ca56c343e0cc1d3fd5999a256e8568e58eca110b735652b5eac5f receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTQuOTAzMzE2WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBob29rc19jb21tYW5kYCBpbiBgc3JjL3RhZ2kvY2xpL3V0aWxpdHlfY29tbWFuZHMucHk6MTMxYC5cblxuRnVuY3Rpb24gJ2hvb2tzX2NvbW1hbmQnIGlzIG92ZXJzaXplZDogQ0M9MTAsIGZhbi1vdXQ9MTEsIG11dGF0aW9ucz00LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2NsaS91dGlsaXR5X2NvbW1hbmRzLnB5OjEzMTpHb2QgRnVuY3Rpb246IGhvb2tzX2NvbW1hbmQiLCJmaWxlcyI6WyJzcmMvdGFnaS9jbGkvdXRpbGl0eV9jb21tYW5kcy5weSJdLCJpZCI6IlBMRi0xNjMiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwiZ29kLWZ1bmN0aW9uIl0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IEdvZCBGdW5jdGlvbjogaG9va3NfY29tbWFuZCIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjE0Ljg3NTI4MVoiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjE0LjkwMzMyMFoifX0", "files": ["src/tagi/cli/utility_commands.py"], "history": [], "id": "PLF-163", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: hooks_command", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:14.875281Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:14.903320Z"}, "PLF-164": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:15.623939Z", "description": "code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\nFunction 'inspect_command' is oversized: CC=7, fan-out=11, mutations=4.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/inspection_commands.py:19:God Function: inspect_command", "dsl": "SODL/1 id=evt_72c0878785f684fd4b360e9a event_hash=c75a481d991bd9324699cfe999d1e5a55a0880e05808c693bd7e5add09025fe8 timestamp=2026-09-19T17%3A29%3A15.623939%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-164 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-164%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-164 causation_id=- input_hash=df0f54865b3784cf2bba77531b3782646c3aec9122da332fe5e35cffd6b56107 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTUuNjIzOTM5WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBpbnNwZWN0X2NvbW1hbmRgIGluIGBzcmMvdGFnaS9jbGkvaW5zcGVjdGlvbl9jb21tYW5kcy5weToxOWAuXG5cbkZ1bmN0aW9uICdpbnNwZWN0X2NvbW1hbmQnIGlzIG92ZXJzaXplZDogQ0M9NywgZmFuLW91dD0xMSwgbXV0YXRpb25zPTQuXG5cbk1ha2UgdGhlIHNtYWxsZXN0IHJlZmFjdG9yIHRoYXQgcmVtb3ZlcyB0aGUgc21lbGwgYW5kIHJ1biBsb2NhbCB0ZXN0cy5cblxuY29kZTJsbG0tZGVkdXBlOiBjb2RlMmxsbTpzbWVsbDpnb2RfZnVuY3Rpb246c3JjL3RhZ2kvY2xpL2luc3BlY3Rpb25fY29tbWFuZHMucHk6MTk6R29kIEZ1bmN0aW9uOiBpbnNwZWN0X2NvbW1hbmQiLCJmaWxlcyI6WyJzcmMvdGFnaS9jbGkvaW5zcGVjdGlvbl9jb21tYW5kcy5weSJdLCJpZCI6IlBMRi0xNjQiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwiZ29kLWZ1bmN0aW9uIl0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IEdvZCBGdW5jdGlvbjogaW5zcGVjdF9jb21tYW5kIiwicHJpb3JpdHkiOiJub3JtYWwiLCJzb3VyY2UiOnsiY29udGV4dCI6e30sInRpbWVzdGFtcCI6IjIwMjYtMDktMTlUMTc6Mjk6MTUuNTk1MDc3WiIsInRvb2wiOiJrb3J1LXNjYW4ifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTUuNjIzOTQ1WiJ9fQ", "files": ["src/tagi/cli/inspection_commands.py"], "history": [], "id": "PLF-164", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: inspect_command", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:15.595077Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:15.623945Z"}, "PLF-165": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:16.307020Z", "description": "code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\nFunction 'publish_command' is oversized: CC=11, fan-out=14, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/publishing_commands.py:23:God Function: publish_command", "dsl": "SODL/1 id=evt_8ee5b7a15bf8f1ed3bd37a9c event_hash=0af6d85bc54117becab5c7789f9fe1f6c2a07c864cb603dff4ad7c3eb0d89e56 timestamp=2026-09-19T17%3A29%3A16.307020%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-165 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-165%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-165 causation_id=- input_hash=23669a6559bd153e37565e6d65a50fd41a34620dd2ac8b48c23aafaaabee74ca receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTYuMzA3MDIwWiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBwdWJsaXNoX2NvbW1hbmRgIGluIGBzcmMvdGFnaS9jbGkvcHVibGlzaGluZ19jb21tYW5kcy5weToyM2AuXG5cbkZ1bmN0aW9uICdwdWJsaXNoX2NvbW1hbmQnIGlzIG92ZXJzaXplZDogQ0M9MTEsIGZhbi1vdXQ9MTQsIG11dGF0aW9ucz04LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2NsaS9wdWJsaXNoaW5nX2NvbW1hbmRzLnB5OjIzOkdvZCBGdW5jdGlvbjogcHVibGlzaF9jb21tYW5kIiwiZmlsZXMiOlsic3JjL3RhZ2kvY2xpL3B1Ymxpc2hpbmdfY29tbWFuZHMucHkiXSwiaWQiOiJQTEYtMTY1IiwibGFiZWxzIjpbImxsbS1yZWFkeSIsImNvZGUybGxtIiwiY29kZS1zbWVsbCIsImdvZC1mdW5jdGlvbiJdLCJuYW1lIjoiQWRkcmVzcyBjb2RlIHNtZWxsOiBHb2QgRnVuY3Rpb246IHB1Ymxpc2hfY29tbWFuZCIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjE2LjI4ODI2NFoiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjE2LjMwNzAyNVoifX0", "files": ["src/tagi/cli/publishing_commands.py"], "history": [], "id": "PLF-165", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: publish_command", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:16.288264Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:16.307025Z"}, "PLF-166": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:17.068246Z", "description": "code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\nFunction 'scan_repo' is oversized: CC=7, fan-out=15, mutations=8.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/scanner/status.py:11:God Function: scan_repo", "dsl": "SODL/1 id=evt_461a86c7b0a0152501eed031 event_hash=d3d5dab3966ea45333fb4e595c94233dcf1c91486df0c625edb042d87ac1aa38 timestamp=2026-09-19T17%3A29%3A17.068246%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-166 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-166%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-166 causation_id=- input_hash=c0d3402362def21068249a3d8ceb948960cbb839b08276ab267d9c01a6b2b391 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuMDY4MjQ2WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBzY2FuX3JlcG9gIGluIGBzcmMvdGFnaS9zY2FubmVyL3N0YXR1cy5weToxMWAuXG5cbkZ1bmN0aW9uICdzY2FuX3JlcG8nIGlzIG92ZXJzaXplZDogQ0M9NywgZmFuLW91dD0xNSwgbXV0YXRpb25zPTguXG5cbk1ha2UgdGhlIHNtYWxsZXN0IHJlZmFjdG9yIHRoYXQgcmVtb3ZlcyB0aGUgc21lbGwgYW5kIHJ1biBsb2NhbCB0ZXN0cy5cblxuY29kZTJsbG0tZGVkdXBlOiBjb2RlMmxsbTpzbWVsbDpnb2RfZnVuY3Rpb246c3JjL3RhZ2kvc2Nhbm5lci9zdGF0dXMucHk6MTE6R29kIEZ1bmN0aW9uOiBzY2FuX3JlcG8iLCJmaWxlcyI6WyJzcmMvdGFnaS9zY2FubmVyL3N0YXR1cy5weSJdLCJpZCI6IlBMRi0xNjYiLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwiZ29kLWZ1bmN0aW9uIl0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IEdvZCBGdW5jdGlvbjogc2Nhbl9yZXBvIiwicHJpb3JpdHkiOiJub3JtYWwiLCJzb3VyY2UiOnsiY29udGV4dCI6e30sInRpbWVzdGFtcCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuMDUyMjY2WiIsInRvb2wiOiJrb3J1LXNjYW4ifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuMDY4MjUxWiJ9fQ", "files": ["src/tagi/scanner/status.py"], "history": [], "id": "PLF-166", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: scan_repo", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:17.052266Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:17.068251Z"}, "PLF-167": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:17.860410Z", "description": "code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`.\n\nFunction 'send_command' is oversized: CC=7, fan-out=13, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/git_operations.py:90:God Function: send_command", "dsl": "SODL/1 id=evt_0070ec25d0348db59a671c5a event_hash=d7877a6e71bb42c74984c67804b78e6e0716161794288ff8b9c77019e0d52b30 timestamp=2026-09-19T17%3A29%3A17.860410%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-167 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-167%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-167 causation_id=- input_hash=094dbbace041d2eb7af5002d22008dba9b42c08b5bfe88e6f924ea8a577809c4 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuODYwNDEwWiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBzZW5kX2NvbW1hbmRgIGluIGBzcmMvdGFnaS9jbGkvZ2l0X29wZXJhdGlvbnMucHk6OTBgLlxuXG5GdW5jdGlvbiAnc2VuZF9jb21tYW5kJyBpcyBvdmVyc2l6ZWQ6IENDPTcsIGZhbi1vdXQ9MTMsIG11dGF0aW9ucz05LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2NsaS9naXRfb3BlcmF0aW9ucy5weTo5MDpHb2QgRnVuY3Rpb246IHNlbmRfY29tbWFuZCIsImZpbGVzIjpbInNyYy90YWdpL2NsaS9naXRfb3BlcmF0aW9ucy5weSJdLCJpZCI6IlBMRi0xNjciLCJsYWJlbHMiOlsibGxtLXJlYWR5IiwiY29kZTJsbG0iLCJjb2RlLXNtZWxsIiwiZ29kLWZ1bmN0aW9uIl0sIm5hbWUiOiJBZGRyZXNzIGNvZGUgc21lbGw6IEdvZCBGdW5jdGlvbjogc2VuZF9jb21tYW5kIiwicHJpb3JpdHkiOiJub3JtYWwiLCJzb3VyY2UiOnsiY29udGV4dCI6e30sInRpbWVzdGFtcCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuODM5OTAwWiIsInRvb2wiOiJrb3J1LXNjYW4ifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTcuODYwNDE3WiJ9fQ", "files": ["src/tagi/cli/git_operations.py"], "history": [], "id": "PLF-167", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: send_command", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:17.839900Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:17.860417Z"}, "PLF-168": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:18.761477Z", "description": "code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`.\n\nFunction 'setup_logger' is oversized: CC=4, fan-out=13, mutations=14.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/utils/logger.py:9:God Function: setup_logger", "dsl": "SODL/1 id=evt_f0359544002aed038d929132 event_hash=d257a0ac3a625f71ba5bf32550ced9e807cf2dfce823a01aeeaa442df5607306 timestamp=2026-09-19T17%3A29%3A18.761477%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-168 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-168%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-168 causation_id=- input_hash=5455099356079369221e96f911f718af3f22a074c77828cfce5d271410ed75e8 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTguNzYxNDc3WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBzZXR1cF9sb2dnZXJgIGluIGBzcmMvdGFnaS91dGlscy9sb2dnZXIucHk6OWAuXG5cbkZ1bmN0aW9uICdzZXR1cF9sb2dnZXInIGlzIG92ZXJzaXplZDogQ0M9NCwgZmFuLW91dD0xMywgbXV0YXRpb25zPTE0LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL3V0aWxzL2xvZ2dlci5weTo5OkdvZCBGdW5jdGlvbjogc2V0dXBfbG9nZ2VyIiwiZmlsZXMiOlsic3JjL3RhZ2kvdXRpbHMvbG9nZ2VyLnB5Il0sImlkIjoiUExGLTE2OCIsImxhYmVscyI6WyJsbG0tcmVhZHkiLCJjb2RlMmxsbSIsImNvZGUtc21lbGwiLCJnb2QtZnVuY3Rpb24iXSwibmFtZSI6IkFkZHJlc3MgY29kZSBzbWVsbDogR29kIEZ1bmN0aW9uOiBzZXR1cF9sb2dnZXIiLCJwcmlvcml0eSI6Im5vcm1hbCIsInNvdXJjZSI6eyJjb250ZXh0Ijp7fSwidGltZXN0YW1wIjoiMjAyNi0wOS0xOVQxNzoyOToxOC43NDA5NDlaIiwidG9vbCI6ImtvcnUtc2NhbiJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQxNzoyOToxOC43NjE0ODNaIn19", "files": ["src/tagi/utils/logger.py"], "history": [], "id": "PLF-168", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: setup_logger", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:18.740949Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:18.761483Z"}, "PLF-169": {"acceptance_criteria": [], "blocked_by": [], "blocks": [], "children": [], "contract_version": "planfile.ticket/v1", "created_at": "2026-09-19T17:29:19.641507Z", "description": "code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`.\n\nFunction 'summary_command' is oversized: CC=7, fan-out=13, mutations=17.\n\nMake the smallest refactor that removes the smell and run local tests.\n\ncode2llm-dedupe: code2llm:smell:god_function:src/tagi/cli/utility_commands.py:25:God Function: summary_command", "dsl": "SODL/1 id=evt_e1d3735ae7f1ce6cfd509c69 event_hash=4a5cf616d161a2108e26202203152fecce7c4581229df2b6b8f59e5262182551 timestamp=2026-09-19T17%3A29%3A19.641507%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-169 actor=koru-scan oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-169%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-169 causation_id=- input_hash=7eb42404efc63ebac74b06bba227b2078d3f968671273d50246688c2b076a63c receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMTc6Mjk6MTkuNjQxNTA3WiIsImRlc2NyaXB0aW9uIjoiY29kZTJsbG0gcmVwb3J0cyBgR29kIEZ1bmN0aW9uOiBzdW1tYXJ5X2NvbW1hbmRgIGluIGBzcmMvdGFnaS9jbGkvdXRpbGl0eV9jb21tYW5kcy5weToyNWAuXG5cbkZ1bmN0aW9uICdzdW1tYXJ5X2NvbW1hbmQnIGlzIG92ZXJzaXplZDogQ0M9NywgZmFuLW91dD0xMywgbXV0YXRpb25zPTE3LlxuXG5NYWtlIHRoZSBzbWFsbGVzdCByZWZhY3RvciB0aGF0IHJlbW92ZXMgdGhlIHNtZWxsIGFuZCBydW4gbG9jYWwgdGVzdHMuXG5cbmNvZGUybGxtLWRlZHVwZTogY29kZTJsbG06c21lbGw6Z29kX2Z1bmN0aW9uOnNyYy90YWdpL2NsaS91dGlsaXR5X2NvbW1hbmRzLnB5OjI1OkdvZCBGdW5jdGlvbjogc3VtbWFyeV9jb21tYW5kIiwiZmlsZXMiOlsic3JjL3RhZ2kvY2xpL3V0aWxpdHlfY29tbWFuZHMucHkiXSwiaWQiOiJQTEYtMTY5IiwibGFiZWxzIjpbImxsbS1yZWFkeSIsImNvZGUybGxtIiwiY29kZS1zbWVsbCIsImdvZC1mdW5jdGlvbiJdLCJuYW1lIjoiQWRkcmVzcyBjb2RlIHNtZWxsOiBHb2QgRnVuY3Rpb246IHN1bW1hcnlfY29tbWFuZCIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDE3OjI5OjE5LjYxMjkwMVoiLCJ0b29sIjoia29ydS1zY2FuIn0sInNwcmludCI6ImN1cnJlbnQiLCJzdGF0dXMiOiJvcGVuIiwic3luYyI6e30sInVwZGF0ZWRfYXQiOiIyMDI2LTA5LTE5VDE3OjI5OjE5LjY0MTUxNFoifX0", "files": ["src/tagi/cli/utility_commands.py"], "history": [], "id": "PLF-169", "labels": ["llm-ready", "code2llm", "code-smell", "god-function"], "name": "Address code smell: God Function: summary_command", "priority": "normal", "source": {"context": {}, "timestamp": "2026-09-19T17:29:19.612901Z", "tool": "koru-scan"}, "sprint": "current", "status": "open", "sync": {}, "updated_at": "2026-09-19T17:29:19.641514Z"}, "PLF-171": {"backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T17:43:09.548402+00:00", "description": "code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`.\n\nFunction '_tag_change' is oversized: CC=2, fan-out=9, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "187", "files": ["src/tagi/heuristics/tags.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`.\n\nFunction '_tag_change' is oversized: CC=2, fan-out=9, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T17:43:09.548402+00:00"}], "id": "PLF-171", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`.\n\nFunction '_tag_change' is oversized: CC=2, fan-out=9, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "name": "Address code smell: God Function: _tag_change", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/heuristics/tags.py:22:God Function: _tag_change", "evidence": {"artifact": {"mtime_ns": 1789838949904540410, "path": "project/analysis.toon.yaml", "sha256": "a20fa29c7d952fbcda7207db98cbe6042565fe78c7e14633a3065728be7842c6", "size_bytes": 9689}, "files": [{"mtime_ns": 1789830262593470416, "path": "src/tagi/heuristics/tags.py", "sha256": "a4f450ad5caf03cfd4f6b956809d7dfb0dabd3f6f7da91aad7e2202ac7576f69", "size_bytes": 3411}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789838959872519685, "path": "project/planfile-tickets.yaml", "sha256": "b5faa6f4e5d625a802e28855d7954530f8835c2a1c4377ec4676a9e843e17d04", "size_bytes": 8004}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`.\n\nFunction '_tag_change' is oversized: CC=2, fan-out=9, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-19T17:43:09.548402+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "187", "key": "semcod/tagi#187", "url": "https://github.com/semcod/tagi/issues/187"}}, "updated_at": "2026-09-19T17:43:09.548402+00:00"}, "PLF-172": {"backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T17:53:12.889023+00:00", "description": "code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`.\n\nFunction 'send_command' is oversized: CC=7, fan-out=13, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "188", "files": ["src/tagi/cli/git_operations.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`.\n\nFunction 'send_command' is oversized: CC=7, fan-out=13, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T17:53:12.889023+00:00"}], "id": "PLF-172", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`.\n\nFunction 'send_command' is oversized: CC=7, fan-out=13, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal", "priority: normal"], "name": "Address code smell: God Function: send_command", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/cli/git_operations.py:90:God Function: send_command", "evidence": {"artifact": {"mtime_ns": 1789838949904540410, "path": "project/analysis.toon.yaml", "sha256": "a20fa29c7d952fbcda7207db98cbe6042565fe78c7e14633a3065728be7842c6", "size_bytes": 9689}, "files": [{"mtime_ns": 1789824641491087908, "path": "src/tagi/cli/git_operations.py", "sha256": "049eb6ec4314014115e3471ce64f037758ab685f40cb9896fe129daf8618d861", "size_bytes": 6307}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789838959872519685, "path": "project/planfile-tickets.yaml", "sha256": "b5faa6f4e5d625a802e28855d7954530f8835c2a1c4377ec4676a9e843e17d04", "size_bytes": 8004}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`.\n\nFunction 'send_command' is oversized: CC=7, fan-out=13, mutations=9.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-19T17:53:12.889023+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "188", "key": "semcod/tagi#188", "url": "https://github.com/semcod/tagi/issues/188"}}, "updated_at": "2026-09-19T17:53:12.889023+00:00"}, "PLF-173": {"backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T18:16:24.472046+00:00", "description": "code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`.\n\nFunction 'setup_logger' is oversized: CC=4, fan-out=13, mutations=14.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "189", "files": ["src/tagi/utils/logger.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`.\n\nFunction 'setup_logger' is oversized: CC=4, fan-out=13, mutations=14.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T18:16:24.472046+00:00"}], "id": "PLF-173", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`.\n\nFunction 'setup_logger' is oversized: CC=4, fan-out=13, mutations=14.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal", "priority: normal"], "name": "Address code smell: God Function: setup_logger", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/utils/logger.py:9:God Function: setup_logger", "evidence": {"artifact": {"mtime_ns": 1789838949904540410, "path": "project/analysis.toon.yaml", "sha256": "a20fa29c7d952fbcda7207db98cbe6042565fe78c7e14633a3065728be7842c6", "size_bytes": 9689}, "files": [{"mtime_ns": 1779809465287675064, "path": "src/tagi/utils/logger.py", "sha256": "25d7171aee4d351bc65d315acfa6d09d6e91491346c2ac3cca945577d7397c89", "size_bytes": 1747}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789838959872519685, "path": "project/planfile-tickets.yaml", "sha256": "b5faa6f4e5d625a802e28855d7954530f8835c2a1c4377ec4676a9e843e17d04", "size_bytes": 8004}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`.\n\nFunction 'setup_logger' is oversized: CC=4, fan-out=13, mutations=14.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-19T18:16:24.472046+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "189", "key": "semcod/tagi#189", "url": "https://github.com/semcod/tagi/issues/189"}}, "updated_at": "2026-09-19T18:16:24.472046+00:00"}, "PLF-174": {"backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T18:25:22.064458+00:00", "description": "code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`.\n\nFunction 'summary_command' is oversized: CC=7, fan-out=13, mutations=17.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "190", "files": ["src/tagi/cli/utility_commands.py"], "history": [{"action": "created", "message": "code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`.\n\nFunction 'summary_command' is oversized: CC=7, fan-out=13, mutations=17.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T18:25:22.064458+00:00"}], "id": "PLF-174", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`.\n\nFunction 'summary_command' is oversized: CC=7, fan-out=13, mutations=17.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["koru", "nl-task", "llm-ready", "code2llm", "code-smell", "god-function", "priority: normal", "priority: normal"], "name": "Address code smell: God Function: summary_command", "outputs": {"artifacts": [], "notes": []}, "priority": "normal", "source": {"context": {"dedupe_key": "code2llm:smell:god_function:src/tagi/cli/utility_commands.py:25:God Function: summary_command", "evidence": {"artifact": {"mtime_ns": 1789838949904540410, "path": "project/analysis.toon.yaml", "sha256": "a20fa29c7d952fbcda7207db98cbe6042565fe78c7e14633a3065728be7842c6", "size_bytes": 9689}, "files": [{"mtime_ns": 1789817932257139916, "path": "src/tagi/cli/utility_commands.py", "sha256": "e8d62787b625b75ab02154b4de181d4c5ab9cf2443e7bec06574c0ec46b63499", "size_bytes": 7253}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789838959872519685, "path": "project/planfile-tickets.yaml", "sha256": "b5faa6f4e5d625a802e28855d7954530f8835c2a1c4377ec4676a9e843e17d04", "size_bytes": 8004}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`.\n\nFunction 'summary_command' is oversized: CC=7, fan-out=13, mutations=17.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_god_function"}, "timestamp": "2026-09-19T18:25:22.064458+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "190", "key": "semcod/tagi#190", "url": "https://github.com/semcod/tagi/issues/190"}}, "updated_at": "2026-09-19T18:25:22.064458+00:00"}, "PLF-176": {"backend": "github", "blocked_by": [], "blocks": [], "created_at": "2026-09-19T19:49:31.353399+00:00", "description": "code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`.\n\nMutation of variable 'tags' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "execution": {"attempt": 0, "max_attempts": 1, "queue": "default", "state": "ready"}, "executor": {"kind": "human", "mode": "interactive"}, "external_id": "193", "files": ["src/tagi/composer/_tags.py"], "history": [{"action": "created", "message": "code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`.\n\nMutation of variable 'tags' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "source": "koru task", "timestamp": "2026-09-19T19:49:31.353399+00:00"}], "id": "PLF-176", "inputs": {"api_headers": {}, "api_method": "GET", "api_timeout_seconds": 30.0, "env_keys": [], "prompt": "code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`.\n\nMutation of variable 'tags' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests."}, "integration": ["github"], "labels": ["koru", "nl-task", "llm-ready", "code2llm", "code-smell", "shotgun-surgery"], "name": "Address code smell: Shotgun Surgery: tags", "outputs": {"artifacts": [], "notes": []}, "priority": "high", "source": {"context": {"dedupe_key": "code2llm:smell:shotgun_surgery:src/tagi/composer/_tags.py:20:Shotgun Surgery: tags", "evidence": {"artifact": {"mtime_ns": 1789847360141767983, "path": "project/analysis.toon.yaml", "sha256": "661fceb25106c0f600fa86e3b2a2eb625295fb450e7315531abb66b52e13a02a", "size_bytes": 12168}, "files": [{"mtime_ns": 1789820644380550921, "path": "src/tagi/composer/_tags.py", "sha256": "84f953c3818378853cdb9345e86066e66fa04ccc0177985fdf2665c7fe5ebdc6", "size_bytes": 1361}], "kind": "code2llm_discovery", "planfile_tickets": {"mtime_ns": 1789847360243915139, "path": "project/planfile-tickets.yaml", "sha256": "c9219bc012e7516e3794f3e0b448f30861f9296138744f977d5f94044cbdfe2a", "size_bytes": 6743}, "regenerate_command": "code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source koru-project-discovery --planfile-sprint current --planfile-project /home/tom/github/semcod/tagi --planfile-limit 20", "schema": "koru.ticket_evidence.v1", "staleness_check": "Regenerate artifacts and compare artifact.sha256 / files[].sha256 before assuming this ticket is still current."}, "input": "code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`.\n\nMutation of variable 'tags' spans 5 functions. Changing this logic requires work in many places.\n\nMake the smallest refactor that removes the smell and run local tests.", "signal": "code2llm_smell_shotgun_surgery"}, "timestamp": "2026-09-19T19:49:31.353399+00:00", "tool": "koru-project-discovery"}, "sprint": "current", "status": "open", "sync": {"github": {"id": "193", "key": "semcod/tagi#193", "url": "https://github.com/semcod/tagi/issues/193"}}, "updated_at": "2026-09-19T19:49:31.353399+00:00"}, "PLF-177": {"id": "PLF-177", "name": "Deduplicate cli tag helpers (_ensure_tag_prefix, _is_known_tag, _resolve_send_target)", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "high", "sprint": "current", "source": {"tool": "koru-project-discovery", "timestamp": "2026-09-19T21:13:19.158777Z", "context": {}}, "description": "Fresh redup scan (project/duplication.toon.yaml, 2026-09-19) flags copy-pasted helpers introduced by the cli module split:\n\n- _ensure_tag_prefix: 4 identical copies (src/tagi/cli/main.py:50, git_operations.py:21, publishing_commands.py:16, utility_commands.py:18) — 24 duplicated lines.\n- _resolve_send_target + _is_known_tag: duplicated between src/tagi/cli/main.py:57-83 and git_operations.py:28-56 (19+10 lines), with comment drift between the two copies.\n\nExtract these into one shared cli helper module (e.g. src/tagi/cli/tag_targets.py), import it from all four command modules, and keep behavior identical.\n\nAcceptance criteria:\n- redup scan of src/ reports no EXAC groups for these helpers (dup groups 7 -> <=4).\n- python -m pytest -q stays green (127 passed).", "acceptance_criteria": [], "labels": ["koru", "nl-task", "llm-ready", "project-discovery", "duplication"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/cli/main.py", "src/tagi/cli/git_operations.py", "src/tagi/cli/publishing_commands.py", "src/tagi/cli/utility_commands.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_6d8071ad9e575f187c0d44fc event_hash=09dee25ffd62e51fcf5519f07cf9cdb658a69ceb037eb39c11b0a66d7d2508f3 timestamp=2026-09-19T21%3A13%3A19.174193%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-177 actor=koru-project-discovery oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-177%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-177 causation_id=- input_hash=c3d47241fd79a8d7580afdb743ddae69f661a9bc415f8a9439190b58d9951b52 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMjE6MTM6MTkuMTc0MTkzWiIsImRlc2NyaXB0aW9uIjoiRnJlc2ggcmVkdXAgc2NhbiAocHJvamVjdC9kdXBsaWNhdGlvbi50b29uLnlhbWwsIDIwMjYtMDktMTkpIGZsYWdzIGNvcHktcGFzdGVkIGhlbHBlcnMgaW50cm9kdWNlZCBieSB0aGUgY2xpIG1vZHVsZSBzcGxpdDpcblxuLSBfZW5zdXJlX3RhZ19wcmVmaXg6IDQgaWRlbnRpY2FsIGNvcGllcyAoc3JjL3RhZ2kvY2xpL21haW4ucHk6NTAsIGdpdF9vcGVyYXRpb25zLnB5OjIxLCBwdWJsaXNoaW5nX2NvbW1hbmRzLnB5OjE2LCB1dGlsaXR5X2NvbW1hbmRzLnB5OjE4KSDigJQgMjQgZHVwbGljYXRlZCBsaW5lcy5cbi0gX3Jlc29sdmVfc2VuZF90YXJnZXQgKyBfaXNfa25vd25fdGFnOiBkdXBsaWNhdGVkIGJldHdlZW4gc3JjL3RhZ2kvY2xpL21haW4ucHk6NTctODMgYW5kIGdpdF9vcGVyYXRpb25zLnB5OjI4LTU2ICgxOSsxMCBsaW5lcyksIHdpdGggY29tbWVudCBkcmlmdCBiZXR3ZWVuIHRoZSB0d28gY29waWVzLlxuXG5FeHRyYWN0IHRoZXNlIGludG8gb25lIHNoYXJlZCBjbGkgaGVscGVyIG1vZHVsZSAoZS5nLiBzcmMvdGFnaS9jbGkvdGFnX3RhcmdldHMucHkpLCBpbXBvcnQgaXQgZnJvbSBhbGwgZm91ciBjb21tYW5kIG1vZHVsZXMsIGFuZCBrZWVwIGJlaGF2aW9yIGlkZW50aWNhbC5cblxuQWNjZXB0YW5jZSBjcml0ZXJpYTpcbi0gcmVkdXAgc2NhbiBvZiBzcmMvIHJlcG9ydHMgbm8gRVhBQyBncm91cHMgZm9yIHRoZXNlIGhlbHBlcnMgKGR1cCBncm91cHMgNyAtPiA8PTQpLlxuLSBweXRob24gLW0gcHl0ZXN0IC1xIHN0YXlzIGdyZWVuICgxMjcgcGFzc2VkKS4iLCJmaWxlcyI6WyJzcmMvdGFnaS9jbGkvbWFpbi5weSIsInNyYy90YWdpL2NsaS9naXRfb3BlcmF0aW9ucy5weSIsInNyYy90YWdpL2NsaS9wdWJsaXNoaW5nX2NvbW1hbmRzLnB5Iiwic3JjL3RhZ2kvY2xpL3V0aWxpdHlfY29tbWFuZHMucHkiXSwiaWQiOiJQTEYtMTc3IiwibGFiZWxzIjpbImtvcnUiLCJubC10YXNrIiwibGxtLXJlYWR5IiwicHJvamVjdC1kaXNjb3ZlcnkiLCJkdXBsaWNhdGlvbiJdLCJuYW1lIjoiRGVkdXBsaWNhdGUgY2xpIHRhZyBoZWxwZXJzIChfZW5zdXJlX3RhZ19wcmVmaXgsIF9pc19rbm93bl90YWcsIF9yZXNvbHZlX3NlbmRfdGFyZ2V0KSIsInByaW9yaXR5IjoiaGlnaCIsInNvdXJjZSI6eyJjb250ZXh0Ijp7fSwidGltZXN0YW1wIjoiMjAyNi0wOS0xOVQyMToxMzoxOS4xNTg3NzdaIiwidG9vbCI6ImtvcnUtcHJvamVjdC1kaXNjb3ZlcnkifSwic3ByaW50IjoiY3VycmVudCIsInN0YXR1cyI6Im9wZW4iLCJzeW5jIjp7fSwidXBkYXRlZF9hdCI6IjIwMjYtMDktMTlUMjE6MTM6MTkuMTc0MTk4WiJ9fQ", "created_at": "2026-09-19T21:13:19.174193Z", "updated_at": "2026-09-19T21:13:19.174198Z"}, "PLF-178": {"id": "PLF-178", "name": "Add unit tests for analyzer/dependency_graph.py", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "high", "sprint": "current", "source": {"tool": "koru-project-discovery", "timestamp": "2026-09-19T21:13:25.331447Z", "context": {}}, "description": "src/tagi/analyzer/dependency_graph.py is the largest module in the codebase (276L, 16 functions, CC=7) and has no dedicated test coverage (verified 2026-09-19: no tests/ file imports it; only a path fixture mention).\n\nIt implements pure graph algorithms used by planning: build_dependency_graph, find_dependency_order, detect_cycles, get_critical_path, levels.\n\nAdd tests/test_dependency_graph.py covering:\n- build_dependency_graph from python import analysis (incl. _collect_import_names edge cases).\n- find_dependency_order: deterministic order, dependencies before dependents.\n- detect_cycles: acyclic graph -> [], cyclic graph -> reported cycle (incl. self-loop).\n- get_critical_path: longest path in a diamond graph.\n- levels/_drain_level partitioning.\n\nAcceptance criteria:\n- python -m pytest -q green with the new tests included.\n- Coverage of the module's public functions without mocking internals.", "acceptance_criteria": [], "labels": ["koru", "nl-task", "llm-ready", "project-discovery", "tests"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/analyzer/dependency_graph.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_7078a45181f0dc0a74954bb8 event_hash=6bc21c34be2c3bd2a2b9b78df0201095dfdbbf142a1d02d1c0d9b28f28f88bba timestamp=2026-09-19T21%3A13%3A25.344158%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-178 actor=koru-project-discovery oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-178%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-178 causation_id=- input_hash=ae3d0bc4ac06e679201e277c56e8950193680a23891a710c80eb024e664f08d2 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMjE6MTM6MjUuMzQ0MTU4WiIsImRlc2NyaXB0aW9uIjoic3JjL3RhZ2kvYW5hbHl6ZXIvZGVwZW5kZW5jeV9ncmFwaC5weSBpcyB0aGUgbGFyZ2VzdCBtb2R1bGUgaW4gdGhlIGNvZGViYXNlICgyNzZMLCAxNiBmdW5jdGlvbnMsIENDPTcpIGFuZCBoYXMgbm8gZGVkaWNhdGVkIHRlc3QgY292ZXJhZ2UgKHZlcmlmaWVkIDIwMjYtMDktMTk6IG5vIHRlc3RzLyBmaWxlIGltcG9ydHMgaXQ7IG9ubHkgYSBwYXRoIGZpeHR1cmUgbWVudGlvbikuXG5cbkl0IGltcGxlbWVudHMgcHVyZSBncmFwaCBhbGdvcml0aG1zIHVzZWQgYnkgcGxhbm5pbmc6IGJ1aWxkX2RlcGVuZGVuY3lfZ3JhcGgsIGZpbmRfZGVwZW5kZW5jeV9vcmRlciwgZGV0ZWN0X2N5Y2xlcywgZ2V0X2NyaXRpY2FsX3BhdGgsIGxldmVscy5cblxuQWRkIHRlc3RzL3Rlc3RfZGVwZW5kZW5jeV9ncmFwaC5weSBjb3ZlcmluZzpcbi0gYnVpbGRfZGVwZW5kZW5jeV9ncmFwaCBmcm9tIHB5dGhvbiBpbXBvcnQgYW5hbHlzaXMgKGluY2wuIF9jb2xsZWN0X2ltcG9ydF9uYW1lcyBlZGdlIGNhc2VzKS5cbi0gZmluZF9kZXBlbmRlbmN5X29yZGVyOiBkZXRlcm1pbmlzdGljIG9yZGVyLCBkZXBlbmRlbmNpZXMgYmVmb3JlIGRlcGVuZGVudHMuXG4tIGRldGVjdF9jeWNsZXM6IGFjeWNsaWMgZ3JhcGggLT4gW10sIGN5Y2xpYyBncmFwaCAtPiByZXBvcnRlZCBjeWNsZSAoaW5jbC4gc2VsZi1sb29wKS5cbi0gZ2V0X2NyaXRpY2FsX3BhdGg6IGxvbmdlc3QgcGF0aCBpbiBhIGRpYW1vbmQgZ3JhcGguXG4tIGxldmVscy9fZHJhaW5fbGV2ZWwgcGFydGl0aW9uaW5nLlxuXG5BY2NlcHRhbmNlIGNyaXRlcmlhOlxuLSBweXRob24gLW0gcHl0ZXN0IC1xIGdyZWVuIHdpdGggdGhlIG5ldyB0ZXN0cyBpbmNsdWRlZC5cbi0gQ292ZXJhZ2Ugb2YgdGhlIG1vZHVsZSdzIHB1YmxpYyBmdW5jdGlvbnMgd2l0aG91dCBtb2NraW5nIGludGVybmFscy4iLCJmaWxlcyI6WyJzcmMvdGFnaS9hbmFseXplci9kZXBlbmRlbmN5X2dyYXBoLnB5Il0sImlkIjoiUExGLTE3OCIsImxhYmVscyI6WyJrb3J1IiwibmwtdGFzayIsImxsbS1yZWFkeSIsInByb2plY3QtZGlzY292ZXJ5IiwidGVzdHMiXSwibmFtZSI6IkFkZCB1bml0IHRlc3RzIGZvciBhbmFseXplci9kZXBlbmRlbmN5X2dyYXBoLnB5IiwicHJpb3JpdHkiOiJoaWdoIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDIxOjEzOjI1LjMzMTQ0N1oiLCJ0b29sIjoia29ydS1wcm9qZWN0LWRpc2NvdmVyeSJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQyMToxMzoyNS4zNDQxNjVaIn19", "created_at": "2026-09-19T21:13:25.344158Z", "updated_at": "2026-09-19T21:13:25.344165Z"}, "PLF-179": {"id": "PLF-179", "name": "Add unit tests for providers/koru.py (KoruProvider)", "contract_version": "planfile.ticket/v1", "status": "open", "priority": "normal", "sprint": "current", "source": {"tool": "koru-project-discovery", "timestamp": "2026-09-19T21:13:31.387416Z", "context": {}}, "description": "src/tagi/providers/koru.py (171L, CC=8) implements KoruProvider, including analyze_deployment_priority flagged by code2llm as high fan-out (10, limit 10 — project/project.toon.yaml ALERTS). It has no test coverage (verified 2026-09-19); github/gitlab providers each have a dedicated test module, koru does not.\n\nAdd tests/test_koru_provider.py following the test_github_provider.py/test_gitlab_provider.py pattern, covering:\n- is_authenticated / get_auth_status for token-present and token-missing cases.\n- analyze_deployment_priority output shape for representative inputs.\n- create_pr / detect_remote behavior with a stubbed transport.\n- Error paths (missing config, failed command).\n\nAcceptance criteria:\n- python -m pytest -q green with the new tests included.\n- No network access in tests (stub/mocked transport only).", "acceptance_criteria": [], "labels": ["koru", "nl-task", "llm-ready", "project-discovery", "tests"], "blocked_by": [], "blocks": [], "children": [], "files": ["src/tagi/providers/koru.py"], "sync": {}, "history": [], "dsl": "SODL/1 id=evt_66de8743a3eefd20e509044a event_hash=35a4ce7177c8b0a23e2cfef6be335c571ee64328a9a7ce75f2879f68559faad0 timestamp=2026-09-19T21%3A13%3A31.396943%2B00%3A00 kind=task source=planfile.ticket ticket_id=PLF-179 actor=koru-project-discovery oql=ticket.create uri=planfile%3A%2F%2Ftickets%2FPLF-179%2Fcommand%2Fcreate mode=apply status=open correlation_id=PLF-179 causation_id=- input_hash=efe4ccacd819cd7b58a15895e0fd785559b241912e310199661481ecb3252de5 receipt_ref=- replayable=true data=eyJwYXlsb2FkIjp7ImFjY2VwdGFuY2VfY3JpdGVyaWEiOltdLCJibG9ja2VkX2J5IjpbXSwiYmxvY2tzIjpbXSwiY2hpbGRyZW4iOltdLCJjb250cmFjdF92ZXJzaW9uIjoicGxhbmZpbGUudGlja2V0L3YxIiwiY3JlYXRlZF9hdCI6IjIwMjYtMDktMTlUMjE6MTM6MzEuMzk2OTQzWiIsImRlc2NyaXB0aW9uIjoic3JjL3RhZ2kvcHJvdmlkZXJzL2tvcnUucHkgKDE3MUwsIENDPTgpIGltcGxlbWVudHMgS29ydVByb3ZpZGVyLCBpbmNsdWRpbmcgYW5hbHl6ZV9kZXBsb3ltZW50X3ByaW9yaXR5IGZsYWdnZWQgYnkgY29kZTJsbG0gYXMgaGlnaCBmYW4tb3V0ICgxMCwgbGltaXQgMTAg4oCUIHByb2plY3QvcHJvamVjdC50b29uLnlhbWwgQUxFUlRTKS4gSXQgaGFzIG5vIHRlc3QgY292ZXJhZ2UgKHZlcmlmaWVkIDIwMjYtMDktMTkpOyBnaXRodWIvZ2l0bGFiIHByb3ZpZGVycyBlYWNoIGhhdmUgYSBkZWRpY2F0ZWQgdGVzdCBtb2R1bGUsIGtvcnUgZG9lcyBub3QuXG5cbkFkZCB0ZXN0cy90ZXN0X2tvcnVfcHJvdmlkZXIucHkgZm9sbG93aW5nIHRoZSB0ZXN0X2dpdGh1Yl9wcm92aWRlci5weS90ZXN0X2dpdGxhYl9wcm92aWRlci5weSBwYXR0ZXJuLCBjb3ZlcmluZzpcbi0gaXNfYXV0aGVudGljYXRlZCAvIGdldF9hdXRoX3N0YXR1cyBmb3IgdG9rZW4tcHJlc2VudCBhbmQgdG9rZW4tbWlzc2luZyBjYXNlcy5cbi0gYW5hbHl6ZV9kZXBsb3ltZW50X3ByaW9yaXR5IG91dHB1dCBzaGFwZSBmb3IgcmVwcmVzZW50YXRpdmUgaW5wdXRzLlxuLSBjcmVhdGVfcHIgLyBkZXRlY3RfcmVtb3RlIGJlaGF2aW9yIHdpdGggYSBzdHViYmVkIHRyYW5zcG9ydC5cbi0gRXJyb3IgcGF0aHMgKG1pc3NpbmcgY29uZmlnLCBmYWlsZWQgY29tbWFuZCkuXG5cbkFjY2VwdGFuY2UgY3JpdGVyaWE6XG4tIHB5dGhvbiAtbSBweXRlc3QgLXEgZ3JlZW4gd2l0aCB0aGUgbmV3IHRlc3RzIGluY2x1ZGVkLlxuLSBObyBuZXR3b3JrIGFjY2VzcyBpbiB0ZXN0cyAoc3R1Yi9tb2NrZWQgdHJhbnNwb3J0IG9ubHkpLiIsImZpbGVzIjpbInNyYy90YWdpL3Byb3ZpZGVycy9rb3J1LnB5Il0sImlkIjoiUExGLTE3OSIsImxhYmVscyI6WyJrb3J1IiwibmwtdGFzayIsImxsbS1yZWFkeSIsInByb2plY3QtZGlzY292ZXJ5IiwidGVzdHMiXSwibmFtZSI6IkFkZCB1bml0IHRlc3RzIGZvciBwcm92aWRlcnMva29ydS5weSAoS29ydVByb3ZpZGVyKSIsInByaW9yaXR5Ijoibm9ybWFsIiwic291cmNlIjp7ImNvbnRleHQiOnt9LCJ0aW1lc3RhbXAiOiIyMDI2LTA5LTE5VDIxOjEzOjMxLjM4NzQxNloiLCJ0b29sIjoia29ydS1wcm9qZWN0LWRpc2NvdmVyeSJ9LCJzcHJpbnQiOiJjdXJyZW50Iiwic3RhdHVzIjoib3BlbiIsInN5bmMiOnt9LCJ1cGRhdGVkX2F0IjoiMjAyNi0wOS0xOVQyMToxMzozMS4zOTY5NTJaIn19", "created_at": "2026-09-19T21:13:31.396943Z", "updated_at": "2026-09-19T21:13:31.396952Z"}}}}} \ No newline at end of file diff --git a/project/README.md b/project/README.md index b8c335a..2cf48ae 100644 --- a/project/README.md +++ b/project/README.md @@ -333,8 +333,8 @@ code2llm ./ -f yaml --separate-orphans **Generated by**: `code2llm ./ -f all --readme` **Analysis Date**: 2026-09-19 -**Total Functions**: 225 +**Total Functions**: 229 **Total Classes**: 27 -**Modules**: 75 +**Modules**: 77 For more information about code2llm, visit: https://github.com/tom-sapletta/code2llm diff --git a/project/analysis.toon.yaml b/project/analysis.toon.yaml index 24a9178..3d65975 100644 --- a/project/analysis.toon.yaml +++ b/project/analysis.toon.yaml @@ -1,6 +1,6 @@ -# code2llm | 75f 5609L | python:66,yaml:5,txt:2,toml:1,shell:1 | 2026-09-19 -# generated in 0.03s -# CC̅=2.9 | critical:0/225 | dups:0 | cycles:2 +# code2llm | 77f 5590L | python:68,yaml:5,txt:2,toml:1,shell:1 | 2026-09-19 +# generated in 0.01s +# CC̅=2.8 | critical:0/229 | dups:0 | cycles:2 HEALTH[0]: ok @@ -14,13 +14,13 @@ PIPELINES[122]: PURITY: 100% pure [3] Src [_apply_sections]: _apply_sections PURITY: 100% pure - [4] Src [get_tag_for_path]: get_tag_for_path + [4] Src [get_tag_for_path]: get_tag_for_path → path_matches → path_key PURITY: 100% pure [5] Src [get_custom_tags_for_pattern]: get_custom_tags_for_pattern PURITY: 100% pure [6] Src [get_tag_color]: get_tag_color PURITY: 100% pure - [7] Src [get_heuristics_for_path]: get_heuristics_for_path + [7] Src [get_heuristics_for_path]: get_heuristics_for_path → path_matches → path_key PURITY: 100% pure [8] Src [get_tags_for_path]: get_tags_for_path PURITY: 100% pure @@ -70,9 +70,9 @@ PIPELINES[122]: PURITY: 100% pure [31] Src [preview_changes]: preview_changes PURITY: 100% pure - [32] Src [group_by_branch]: group_by_branch + [32] Src [group_by_branch]: group_by_branch → run_command PURITY: 100% pure - [33] Src [get_branch_info]: get_branch_info + [33] Src [get_branch_info]: get_branch_info → run_command PURITY: 100% pure [34] Src [select_by_tags]: select_by_tags PURITY: 100% pure @@ -84,11 +84,11 @@ PIPELINES[122]: PURITY: 100% pure [38] Src [filter_command]: filter_command → resolve_filtered_changes → _resolve_tag_enums → _normalize_tag PURITY: 100% pure - [39] Src [file_command]: file_command → get_diff + [39] Src [file_command]: file_command → get_diff → run_command PURITY: 100% pure - [40] Src [create_pr]: create_pr → get_provider → detect_git_provider + [40] Src [create_pr]: create_pr → get_provider → detect_git_provider → run_command PURITY: 100% pure - [41] Src [create_mr]: create_mr → get_provider → detect_git_provider + [41] Src [create_mr]: create_mr → get_provider → detect_git_provider → run_command PURITY: 100% pure [42] Src [scan_command]: scan_command → scan_and_tag PURITY: 100% pure @@ -102,7 +102,7 @@ PIPELINES[122]: PURITY: 100% pure [47] Src [_resolve_send_target]: _resolve_send_target → _is_known_tag → _ensure_tag_prefix PURITY: 100% pure - [48] Src [detect_provider]: detect_provider → detect_provider_command → get_provider → detect_git_provider + [48] Src [detect_provider]: detect_provider → detect_provider_command → get_provider → detect_git_provider → ...(1 more) PURITY: 100% pure [49] Src [publish_command]: publish_command → scan_and_tag PURITY: 100% pure @@ -110,9 +110,9 @@ PIPELINES[122]: PURITY: 100% pure LAYERS: - src/ CC̄=2.9 ←in:0 →out:0 + src/ CC̄=2.8 ←in:0 →out:0 │ dependency_graph 276L 1C 16m CC=7 ←0 - │ metrics 228L 0C 11m CC=5 ←1 + │ metrics 223L 0C 11m CC=5 ←1 │ design_tokens 221L 7C 3m CC=2 ←0 │ utility_commands 211L 0C 5m CC=10 ←0 │ koru 171L 2C 10m CC=8 ←0 @@ -121,30 +121,30 @@ LAYERS: │ formats 141L 0C 9m CC=5 ←0 │ publishing_commands 139L 0C 3m CC=11 ←0 │ hooks 127L 0C 7m CC=5 ←1 - │ config 126L 1C 12m CC=4 ←5 │ inspection_commands 120L 0C 3m CC=7 ←0 │ change_filter 120L 0C 9m CC=5 ←5 + │ config 118L 1C 12m CC=4 ←5 │ main 113L 0C 6m CC=5 ←1 │ summary_helpers 113L 0C 5m CC=5 ←0 │ sorter 104L 0C 3m CC=5 ←1 │ core_commands 94L 0C 5m CC=7 ←0 - │ tags 89L 0C 5m CC=4 ←0 - │ branch_grouper 88L 0C 2m CC=8 ←0 - │ provider_commands 79L 0C 5m CC=4 ←1 + │ tags 88L 0C 5m CC=4 ←0 + │ branch_grouper 81L 0C 2m CC=8 ←0 │ display_utils 79L 0C 4m CC=5 ←3 + │ provider_commands 78L 0C 5m CC=4 ←1 │ grouper 74L 0C 4m CC=5 ←0 - │ git 72L 1C 9m CC=4 ←0 │ logger 71L 0C 2m CC=4 ←2 - │ base 70L 2C 8m CC=2 ←0 - │ status 66L 0C 2m CC=7 ←0 + │ git 67L 1C 9m CC=4 ←0 + │ base 66L 2C 8m CC=2 ←0 │ commit_message 64L 0C 2m CC=5 ←1 │ change 60L 4C 1m CC=1 ←0 + │ status 60L 0C 2m CC=7 ←0 │ llx_adapter 55L 1C 4m CC=4 ←0 - │ detect_provider 54L 0C 2m CC=4 ←4 │ _tags 52L 0C 4m CC=7 ←2 - │ gitlab 47L 1C 5m CC=4 ←0 + │ detect_provider 52L 0C 2m CC=5 ←4 │ __init__ 47L 0C 0m CC=0.0 ←0 │ pr 46L 0C 2m CC=5 ←2 + │ gitlab 45L 1C 5m CC=4 ←0 │ selector 44L 0C 5m CC=8 ←1 │ preview 43L 0C 2m CC=7 ←0 │ change_stats 42L 0C 2m CC=1 ←3 @@ -152,23 +152,25 @@ LAYERS: │ publish_helpers 40L 0C 2m CC=1 ←1 │ summary 39L 0C 2m CC=8 ←0 │ publish 39L 1C 4m CC=3 ←0 - │ github 38L 1C 5m CC=2 ←0 + │ github 36L 1C 5m CC=2 ←0 │ send_helpers 34L 0C 1m CC=2 ←2 │ risk 33L 0C 2m CC=3 ←7 │ auth 32L 0C 2m CC=2 ←2 │ __init__ 32L 0C 0m CC=0.0 ←0 - │ files 29L 0C 1m CC=7 ←1 - │ diff 29L 0C 2m CC=1 ←1 │ scan_utils 25L 0C 1m CC=3 ←5 + │ files 25L 0C 1m CC=7 ←1 │ inspect_helpers 25L 0C 0m CC=0.0 ←0 + │ paths 24L 0C 3m CC=1 ←3 │ line_builder 23L 1C 4m CC=1 ←0 │ plan 23L 2C 0m CC=0.0 ←0 │ _templates 21L 0C 1m CC=2 ←1 │ rules 20L 0C 3m CC=1 ←0 + │ commands 20L 0C 1m CC=1 ←8 │ __init__ 18L 0C 0m CC=0.0 ←0 │ group 16L 1C 0m CC=0.0 ←0 │ detector 15L 0C 1m CC=3 ←0 │ __init__ 14L 0C 0m CC=0.0 ←0 + │ diff 13L 0C 2m CC=1 ←1 │ __init__ 13L 0C 0m CC=0.0 ←0 │ __init__ 13L 0C 0m CC=0.0 ←0 │ __init__ 12L 0C 0m CC=0.0 ←0 @@ -192,7 +194,20 @@ LAYERS: │ generated-cli-tests.testql.toon.yaml 20L 0C 0m CC=0.0 ←0 │ -COUPLING: no cross-package imports detected +COUPLING: + src.tagi tagi.utils tagi.scanner tagi.providers tagi.cli tagi.planner tagi.executor + src.tagi ── 3 4 ←8 1 hub + tagi.utils ←3 ── ←4 ←1 ←4 ←2 ←1 hub + tagi.scanner 2 4 ── + tagi.providers 8 1 ── !! fan-out + tagi.cli ←1 4 ── + tagi.planner 2 ── + tagi.executor 1 ── + CYCLES: 2 + HUB: tagi.utils/ (fan-in=15) + HUB: src.tagi/ (fan-in=10) + SMELL: src.tagi/ fan-out=8 → split needed + SMELL: tagi.providers/ fan-out=9 → split needed EXTERNAL: validation: run `vallm batch .` → validation.toon diff --git a/project/calls.mmd b/project/calls.mmd index 6616f89..7020803 100644 --- a/project/calls.mmd +++ b/project/calls.mmd @@ -1,143 +1,169 @@ flowchart LR -%% generated in 0.00s +%% generated in 0.01s subgraph src__tagi - src__tagi__analyzer__dependency_graph__detect_cycles["detect_cycles"] - src__tagi__cli__main___is_known_tag["_is_known_tag"] - src__tagi__providers__gitlab__GitLabProvider__get_auth_status["get_auth_status"] - src__tagi__composer__formats__generate_simple_message["generate_simple_message"] + src__tagi__analyzer__dependency_graph___mark["_mark"] + src__tagi__providers__utils__auth__get_auth_status_from_result["get_auth_status_from_result"] + src__tagi__utils__summary_helpers__build_statistics_section["build_statistics_section"] + src__tagi__cli__utility_commands__hooks_command["hooks_command"] + src__tagi__cli__git_operations__send_command["send_command"] + src__tagi__analyzer__metrics__MetricsCollector__collect["collect"] + src__tagi__composer__formats___detailed_file_lines["_detailed_file_lines"] + src__tagi__config__Config__get_heuristics_for_path["get_heuristics_for_path"] + src__tagi__heuristics__tags___size_tags["_size_tags"] + src__tagi__utils__change_filter___normalize_tag["_normalize_tag"] + src__tagi__utils__change_filter__filter_changes_by_tag["filter_changes_by_tag"] + src__tagi__composer__formats__generate_conventional_message["generate_conventional_message"] + src__tagi__cli__publishing_commands__publish_command["publish_command"] + src__tagi__composer__commit_message___improve_with_llm["_improve_with_llm"] + src__tagi__composer___tags__infer_scope["infer_scope"] + src__tagi__utils__send_helpers__create_change_group["create_change_group"] + src__tagi__analyzer__dependency_graph___cycle_from["_cycle_from"] + src__tagi__hooks___pre_commit_hook["_pre_commit_hook"] + src__tagi__analyzer__dependency_graph___next_critical_node["_next_critical_node"] + src__tagi__cli__utility_commands___ensure_tag_prefix["_ensure_tag_prefix"] + src__tagi__cli__inspection_commands__inspect_command["inspect_command"] + src__tagi__cli__utility_commands__summary_command["summary_command"] + src__tagi__config__load_config["load_config"] + src__tagi__heuristics__rules__get_custom_rules["get_custom_rules"] + src__tagi__cli__publishing_commands__deploy_command["deploy_command"] + src__tagi__composer___templates__render_template["render_template"] + src__tagi__utils__publish_helpers__create_publish_group["create_publish_group"] + src__tagi__utils__paths__path_key["path_key"] + src__tagi__composer___tags__all_tags["all_tags"] + src__tagi__hooks__install_hooks["install_hooks"] src__tagi__cli__inspection_commands__filter_command["filter_command"] - src__tagi__cli__provider_commands___pr_spec["_pr_spec"] + src__tagi__hooks__check_hooks_installed["check_hooks_installed"] src__tagi__heuristics__metrics___calculate_complexity["_calculate_complexity"] - src__tagi__hooks__install_hooks["install_hooks"] - src__tagi__cli__core_commands__list_groups_command["list_groups_command"] + src__tagi__cli__git_operations___resolve_send_target["_resolve_send_target"] + src__tagi__cli__display_utils___display_changes_grouped["_display_changes_grouped"] + src__tagi__cli__core_commands__scan_command["scan_command"] + src__tagi__composer__formats__generate_simple_message["generate_simple_message"] + src__tagi__heuristics__scoring___change_type_risk_weight["_change_type_risk_weight"] + src__tagi__cli__display_utils___format_tags["_format_tags"] + src__tagi__config__Config__get_tag_for_path["get_tag_for_path"] + src__tagi__heuristics__metrics___calculate_test_impact["_calculate_test_impact"] + src__tagi__heuristics__metrics___extension_complexity_weight["_extension_complexity_weight"] + src__tagi__utils__change_filter___changes_matching_any["_changes_matching_any"] + src__tagi__analyzer__dependency_graph__analyze_python_imports["analyze_python_imports"] + src__tagi__cli__main__detect_provider["detect_provider"] + src__tagi__planner__grouper__group_by_tag["group_by_tag"] + src__tagi__cli__git_operations___execute_git_operations["_execute_git_operations"] + src__tagi__cli__core_commands__list_command["list_command"] + src__tagi__composer__formats___describe_changes["_describe_changes"] + src__tagi__planner__selector__select_changes_by_tag["select_changes_by_tag"] + src__tagi__utils__change_filter__filter_changes_by_tags_all["filter_changes_by_tags_all"] + src__tagi__utils__change_filter__resolve_filtered_changes["resolve_filtered_changes"] + src__tagi__utils__risk__average_risk["average_risk"] + src__tagi__composer___tags__summary_tag["summary_tag"] + src__tagi__cli__core_commands___do_list_groups["_do_list_groups"] + src__tagi__analyzer__dependency_graph__get_critical_path["get_critical_path"] + src__tagi__planner__grouper___get_primary_tag["_get_primary_tag"] + src__tagi__hooks__uninstall_hooks["uninstall_hooks"] + src__tagi__planner__sorter__group_by_complexity["group_by_complexity"] src__tagi__cli__git_operations___ensure_tag_prefix["_ensure_tag_prefix"] - src__tagi__cli__git_operations___is_known_tag["_is_known_tag"] - src__tagi__heuristics__tags___custom_config_tags["_custom_config_tags"] src__tagi__heuristics__rules__get_custom_heuristics["get_custom_heuristics"] - src__tagi__analyzer__dependency_graph___dfs_visit["_dfs_visit"] - src__tagi__utils__send_helpers__create_change_group["create_change_group"] - src__tagi__providers__utils__pr__build_pr_command["build_pr_command"] - src__tagi__cli__provider_commands__create_mr["create_mr"] - src__tagi__utils__change_filter___resolve_tag_enums["_resolve_tag_enums"] + src__tagi__analyzer__dependency_graph___longest_path_length["_longest_path_length"] + src__tagi__utils__paths__path_endswith["path_endswith"] src__tagi__heuristics__tags___tag_change["_tag_change"] - src__tagi__cli__provider_commands___current_branch["_current_branch"] - src__tagi__utils__change_filter___changes_matching_tag["_changes_matching_tag"] - src__tagi__providers__utils__pr__execute_pr_command["execute_pr_command"] - src__tagi__scanner__diff__get_diff["get_diff"] - src__tagi__cli__inspection_commands__file_command["file_command"] - src__tagi__cli__main__setup_logging["setup_logging"] - src__tagi__config__load_config["load_config"] - src__tagi__heuristics__scoring___tag_risk_weight["_tag_risk_weight"] - src__tagi__cli__git_operations___execute_git_operations["_execute_git_operations"] - src__tagi__composer___tags__all_tag_values["all_tag_values"] + src__tagi__cli__main___configure_command_logging["_configure_command_logging"] + src__tagi__planner__grouper__group_changes["group_changes"] + src__tagi__composer__formats___commit_type["_commit_type"] + src__tagi__utils__change_filter___resolve_tag_enums["_resolve_tag_enums"] + src__tagi__heuristics__scoring___lines_risk_weight["_lines_risk_weight"] src__tagi__heuristics__tags__apply_path_tags["apply_path_tags"] - src__tagi__analyzer__dependency_graph__build_dependency_graph["build_dependency_graph"] - src__tagi__utils__publish_helpers__create_publish_group["create_publish_group"] - src__tagi__providers__github__GitHubProvider__is_authenticated["is_authenticated"] - src__tagi__composer__formats__generate_conventional_message["generate_conventional_message"] - src__tagi__analyzer__dependency_graph___collect_import_names["_collect_import_names"] - src__tagi__analyzer__dependency_graph__get_critical_path["get_critical_path"] - src__tagi__composer___templates__render_template["render_template"] - src__tagi__utils__change_filter___changes_matching_all["_changes_matching_all"] - src__tagi__cli__main___resolve_send_target["_resolve_send_target"] - src__tagi__cli__utility_commands___ensure_tag_prefix["_ensure_tag_prefix"] - src__tagi__planner__grouper___get_primary_tag["_get_primary_tag"] - src__tagi__cli__display_utils___display_changes_grouped["_display_changes_grouped"] - src__tagi__cli__utility_commands__hooks_command["hooks_command"] - src__tagi__cli__inspection_commands__inspect_command["inspect_command"] - src__tagi__utils__change_filter__resolve_filtered_changes["resolve_filtered_changes"] - src__tagi__scanner__status__scan_repo["scan_repo"] + src__tagi__utils__publish_helpers__detect_and_get_provider["detect_and_get_provider"] + src__tagi__heuristics__metrics___extension_impact_weight["_extension_impact_weight"] + src__tagi__cli__display_utils___display_groups["_display_groups"] + src__tagi__composer__summary__generate_summary["generate_summary"] + src__tagi__utils__change_filter___changes_matching_tag["_changes_matching_tag"] src__tagi__heuristics__scoring__calculate_risk_score["calculate_risk_score"] - src__tagi__cli__provider_commands__detect_provider_command["detect_provider_command"] - src__tagi__cli__scan_utils__scan_and_tag["scan_and_tag"] - src__tagi__cli__core_commands___do_list_groups["_do_list_groups"] - src__tagi__cli__publishing_commands___ensure_tag_prefix["_ensure_tag_prefix"] + src__tagi__utils__paths__path_matches["path_matches"] src__tagi__analyzer__dependency_graph___find_longest_start["_find_longest_start"] - src__tagi__hooks___pre_commit_hook["_pre_commit_hook"] - src__tagi__cli__display_utils___display_groups["_display_groups"] - src__tagi__composer__formats___commit_type["_commit_type"] + src__tagi__utils__change_filter___changes_matching_all["_changes_matching_all"] + src__tagi__composer__formats___count_tags["_count_tags"] + src__tagi__cli__inspection_commands__file_command["file_command"] + src__tagi__cli__main___is_known_tag["_is_known_tag"] + src__tagi__utils__change_filter__filter_changes_by_tags_any["filter_changes_by_tags_any"] + src__tagi__cli__main___ensure_tag_prefix["_ensure_tag_prefix"] + src__tagi__cli__git_operations__auto_command["auto_command"] + src__tagi__utils__change_stats__calculate_tag_statistics["calculate_tag_statistics"] src__tagi__heuristics__metrics___calculate_dependency_depth["_calculate_dependency_depth"] - src__tagi__composer__summary__generate_summary["generate_summary"] - src__tagi__config__Config__should_ignore["should_ignore"] + src__tagi__utils__change_stats__display_statistics_table["display_statistics_table"] + src__tagi__composer__commit_message__generate_commit_message["generate_commit_message"] + src__tagi__providers__utils__pr__build_pr_command["build_pr_command"] + src__tagi__utils__risk__total_lines_changed["total_lines_changed"] + src__tagi__heuristics__scoring___tag_risk_weight["_tag_risk_weight"] + src__tagi__analyzer__dependency_graph___collect_import_names["_collect_import_names"] + src__tagi__heuristics__tags__apply_tags["apply_tags"] + src__tagi__composer__formats__generate_detailed_message["generate_detailed_message"] + src__tagi__cli__core_commands__stats_command["stats_command"] + src__tagi__analyzer__dependency_graph__detect_cycles["detect_cycles"] + src__tagi__cli__display_utils___display_changes["_display_changes"] + src__tagi__cli__git_operations___is_known_tag["_is_known_tag"] src__tagi__heuristics__metrics___calculate_impact["_calculate_impact"] - src__tagi__providers__gitlab__GitLabProvider__create_pr["create_pr"] - src__tagi__heuristics__metrics___extension_complexity_weight["_extension_complexity_weight"] - src__tagi__hooks__uninstall_hooks["uninstall_hooks"] - src__tagi__utils__change_filter___changes_matching_any["_changes_matching_any"] - src__tagi__composer__commit_message___improve_with_llm["_improve_with_llm"] + src__tagi__hooks__run_hook["run_hook"] + src__tagi__providers__utils__auth__is_authenticated_from_result["is_authenticated_from_result"] + src__tagi__composer__formats__generate_oneline_message["generate_oneline_message"] + src__tagi__heuristics__tags___custom_config_tags["_custom_config_tags"] + src__tagi__composer___tags__all_tag_values["all_tag_values"] + src__tagi__providers__utils__pr__execute_pr_command["execute_pr_command"] + src__tagi__cli__main__setup_logging["setup_logging"] src__tagi__hooks__list_hooks["list_hooks"] - src__tagi__analyzer__dependency_graph__analyze_python_imports["analyze_python_imports"] + src__tagi__config__Config__should_ignore["should_ignore"] + src__tagi__cli__main___resolve_send_target["_resolve_send_target"] src__tagi__utils__logger__setup_logger["setup_logger"] - src__tagi__cli__publishing_commands__publish_command["publish_command"] - src__tagi__analyzer__dependency_graph___mark["_mark"] - src__tagi__analyzer__dependency_graph___reconstruct_critical_path["_reconstruct_critical_path"] - src__tagi__utils__change_filter__filter_changes_by_tags_any["filter_changes_by_tags_any"] - src__tagi__hooks___hooks_dir["_hooks_dir"] - src__tagi__cli__utility_commands__summary_command["summary_command"] - src__tagi__composer__formats__generate_detailed_message["generate_detailed_message"] - src__tagi__heuristics__metrics___extension_impact_weight["_extension_impact_weight"] - src__tagi__composer__formats__generate_oneline_message["generate_oneline_message"] - src__tagi__cli__main__detect_provider["detect_provider"] - src__tagi__composer__formats___count_tags["_count_tags"] - src__tagi__hooks__check_hooks_installed["check_hooks_installed"] - src__tagi__heuristics__tags___size_tags["_size_tags"] + src__tagi__cli__scan_utils__scan_and_tag["scan_and_tag"] src__tagi__heuristics__rules___get_config_attr["_get_config_attr"] - src__tagi__analyzer__dependency_graph___longest_path_length["_longest_path_length"] - src__tagi__cli__main___configure_command_logging["_configure_command_logging"] + src__tagi__heuristics__metrics___calculate_stability["_calculate_stability"] src__tagi__cli__utility_commands__draft_command["draft_command"] - src__tagi__composer___tags__summary_tag["summary_tag"] - src__tagi__utils__risk__average_risk["average_risk"] - src__tagi__composer__formats___describe_changes["_describe_changes"] - src__tagi__providers__utils__auth__is_authenticated_from_result["is_authenticated_from_result"] - src__tagi__cli__git_operations__send_command["send_command"] - src__tagi__hooks__run_hook["run_hook"] - src__tagi__planner__selector__select_changes_by_tag["select_changes_by_tag"] src__tagi__heuristics__metrics__calculate_metrics["calculate_metrics"] - src__tagi__scanner__status__parse_status["parse_status"] - src__tagi__heuristics__metrics___calculate_stability["_calculate_stability"] - src__tagi__cli__display_utils___format_tags["_format_tags"] - src__tagi__cli__git_operations___resolve_send_target["_resolve_send_target"] - src__tagi__planner__grouper__group_changes["group_changes"] - src__tagi__heuristics__metrics___calculate_test_impact["_calculate_test_impact"] - src__tagi__utils__detect_provider__get_provider["get_provider"] - src__tagi__heuristics__tags__apply_tags["apply_tags"] - src__tagi__providers__utils__auth__get_auth_status_from_result["get_auth_status_from_result"] - src__tagi__utils__change_filter__filter_changes_by_tag["filter_changes_by_tag"] - src__tagi__providers__github__GitHubProvider__get_auth_status["get_auth_status"] - src__tagi__scanner__files__count_lines_changed["count_lines_changed"] - src__tagi__composer__formats___detailed_file_lines["_detailed_file_lines"] - src__tagi__cli__display_utils___display_changes["_display_changes"] - src__tagi__planner__grouper__group_by_tag["group_by_tag"] - src__tagi__analyzer__metrics__MetricsCollector__collect["collect"] - src__tagi__utils__risk__total_lines_changed["total_lines_changed"] - src__tagi__cli__core_commands__list_command["list_command"] - src__tagi__providers__gitlab__GitLabProvider__is_authenticated["is_authenticated"] - src__tagi__planner__sorter__sort_by_complexity["sort_by_complexity"] - src__tagi__cli__provider_commands__create_pr["create_pr"] - src__tagi__analyzer__dependency_graph___cycle_from["_cycle_from"] - src__tagi__utils__change_stats__calculate_tag_statistics["calculate_tag_statistics"] - src__tagi__utils__publish_helpers__detect_and_get_provider["detect_and_get_provider"] - src__tagi__cli__core_commands__stats_command["stats_command"] - src__tagi__composer__commit_message__generate_commit_message["generate_commit_message"] - src__tagi__cli__publishing_commands__deploy_command["deploy_command"] - src__tagi__utils__summary_helpers__build_statistics_section["build_statistics_section"] - src__tagi__cli__main___ensure_tag_prefix["_ensure_tag_prefix"] - src__tagi__utils__change_filter__filter_changes_by_tags_all["filter_changes_by_tags_all"] - src__tagi__cli__core_commands__scan_command["scan_command"] - src__tagi__composer___tags__all_tags["all_tags"] - src__tagi__heuristics__scoring___lines_risk_weight["_lines_risk_weight"] - src__tagi__cli__git_operations__auto_command["auto_command"] + src__tagi__cli__core_commands__list_groups_command["list_groups_command"] + src__tagi__cli__publishing_commands___ensure_tag_prefix["_ensure_tag_prefix"] + src__tagi__analyzer__dependency_graph___dfs_visit["_dfs_visit"] + src__tagi__analyzer__dependency_graph___reconstruct_critical_path["_reconstruct_critical_path"] src__tagi__cli__git_operations___filter_by_tag["_filter_by_tag"] - src__tagi__utils__change_filter___normalize_tag["_normalize_tag"] - src__tagi__utils__detect_provider__detect_git_provider["detect_git_provider"] - src__tagi__heuristics__rules__get_custom_rules["get_custom_rules"] - src__tagi__analyzer__dependency_graph___next_critical_node["_next_critical_node"] - src__tagi__composer___tags__infer_scope["infer_scope"] - src__tagi__planner__sorter__group_by_complexity["group_by_complexity"] - src__tagi__utils__change_stats__display_statistics_table["display_statistics_table"] - src__tagi__providers__github__GitHubProvider__create_pr["create_pr"] - src__tagi__heuristics__scoring___change_type_risk_weight["_change_type_risk_weight"] + src__tagi__hooks___hooks_dir["_hooks_dir"] + src__tagi__analyzer__dependency_graph__build_dependency_graph["build_dependency_graph"] + src__tagi__planner__sorter__sort_by_complexity["sort_by_complexity"] + end + subgraph tagi__cli + tagi__cli__provider_commands__detect_provider_command["detect_provider_command"] + tagi__cli__provider_commands__create_pr["create_pr"] + tagi__cli__provider_commands__create_mr["create_mr"] + tagi__cli__provider_commands___current_branch["_current_branch"] + tagi__cli__provider_commands___pr_spec["_pr_spec"] + end + subgraph tagi__executor + tagi__executor__git__GitExecutor___run_command["_run_command"] + end + subgraph tagi__planner + tagi__planner__branch_grouper__group_by_branch["group_by_branch"] + tagi__planner__branch_grouper__get_branch_info["get_branch_info"] + end + subgraph tagi__providers + tagi__providers__gitlab__GitLabProvider__is_authenticated["is_authenticated"] + tagi__providers__github__GitHubProvider__is_authenticated["is_authenticated"] + tagi__providers__github__GitHubProvider__get_auth_status["get_auth_status"] + tagi__providers__base__BaseProvider___run_command["_run_command"] + tagi__providers__github__GitHubProvider__create_pr["create_pr"] + tagi__providers__gitlab__GitLabProvider__get_auth_status["get_auth_status"] + tagi__providers__gitlab__GitLabProvider__create_pr["create_pr"] + end + subgraph tagi__scanner + tagi__scanner__status__scan_repo["scan_repo"] + tagi__scanner__files__count_lines_changed["count_lines_changed"] + tagi__scanner__diff__get_staged_diff["get_staged_diff"] + tagi__scanner__diff__get_diff["get_diff"] + tagi__scanner__status__parse_status["parse_status"] + end + subgraph tagi__utils + tagi__utils__detect_provider__get_provider["get_provider"] + tagi__utils__detect_provider__detect_git_provider["detect_git_provider"] + tagi__utils__commands__run_command["run_command"] end + src__tagi__config__Config__get_tag_for_path --> src__tagi__utils__paths__path_matches + src__tagi__config__Config__get_heuristics_for_path --> src__tagi__utils__paths__path_matches + src__tagi__config__Config__should_ignore --> src__tagi__utils__paths__path_matches src__tagi__hooks___pre_commit_hook --> src__tagi__hooks___hooks_dir src__tagi__hooks__install_hooks --> src__tagi__hooks___pre_commit_hook src__tagi__hooks__install_hooks --> src__tagi__hooks___hooks_dir @@ -161,11 +187,13 @@ flowchart LR src__tagi__planner__grouper__group_changes --> src__tagi__utils__risk__total_lines_changed src__tagi__planner__grouper__group_changes --> src__tagi__utils__risk__average_risk src__tagi__planner__grouper__group_by_tag --> src__tagi__planner__selector__select_changes_by_tag + tagi__planner__branch_grouper__group_by_branch --> tagi__utils__commands__run_command + tagi__planner__branch_grouper__get_branch_info --> tagi__utils__commands__run_command src__tagi__cli__git_operations___is_known_tag --> src__tagi__cli__git_operations___ensure_tag_prefix src__tagi__cli__git_operations___resolve_send_target --> src__tagi__cli__git_operations___is_known_tag src__tagi__cli__git_operations___filter_by_tag --> src__tagi__utils__change_filter__resolve_filtered_changes src__tagi__cli__git_operations___filter_by_tag --> src__tagi__cli__git_operations___ensure_tag_prefix - src__tagi__cli__git_operations___execute_git_operations --> src__tagi__utils__detect_provider__get_provider + src__tagi__cli__git_operations___execute_git_operations --> tagi__utils__detect_provider__get_provider src__tagi__cli__git_operations__send_command --> src__tagi__cli__git_operations___resolve_send_target src__tagi__cli__git_operations__auto_command --> src__tagi__cli__main___configure_command_logging src__tagi__cli__git_operations__auto_command --> src__tagi__cli__git_operations__send_command @@ -177,13 +205,14 @@ flowchart LR src__tagi__cli__inspection_commands__filter_command --> src__tagi__utils__change_stats__display_statistics_table src__tagi__cli__inspection_commands__filter_command --> src__tagi__cli__display_utils___display_changes src__tagi__cli__inspection_commands__filter_command --> src__tagi__cli__scan_utils__scan_and_tag - src__tagi__cli__inspection_commands__file_command --> src__tagi__scanner__diff__get_diff - src__tagi__cli__provider_commands__detect_provider_command --> src__tagi__utils__detect_provider__get_provider - src__tagi__cli__provider_commands___pr_spec --> src__tagi__cli__provider_commands___current_branch - src__tagi__cli__provider_commands__create_pr --> src__tagi__utils__detect_provider__get_provider - src__tagi__cli__provider_commands__create_pr --> src__tagi__cli__provider_commands___pr_spec - src__tagi__cli__provider_commands__create_mr --> src__tagi__utils__detect_provider__get_provider - src__tagi__cli__provider_commands__create_mr --> src__tagi__cli__provider_commands___pr_spec + src__tagi__cli__inspection_commands__file_command --> tagi__scanner__diff__get_diff + tagi__cli__provider_commands__detect_provider_command --> tagi__utils__detect_provider__get_provider + tagi__cli__provider_commands___current_branch --> tagi__utils__commands__run_command + tagi__cli__provider_commands___pr_spec --> tagi__cli__provider_commands___current_branch + tagi__cli__provider_commands__create_pr --> tagi__utils__detect_provider__get_provider + tagi__cli__provider_commands__create_pr --> tagi__cli__provider_commands___pr_spec + tagi__cli__provider_commands__create_mr --> tagi__utils__detect_provider__get_provider + tagi__cli__provider_commands__create_mr --> tagi__cli__provider_commands___pr_spec src__tagi__cli__core_commands__scan_command --> src__tagi__cli__scan_utils__scan_and_tag src__tagi__cli__core_commands__scan_command --> src__tagi__cli__display_utils___display_changes_grouped src__tagi__cli__core_commands__scan_command --> src__tagi__cli__display_utils___display_changes @@ -202,7 +231,7 @@ flowchart LR src__tagi__cli__main___configure_command_logging --> src__tagi__utils__logger__setup_logger src__tagi__cli__main___is_known_tag --> src__tagi__cli__main___ensure_tag_prefix src__tagi__cli__main___resolve_send_target --> src__tagi__cli__main___is_known_tag - src__tagi__cli__main__detect_provider --> src__tagi__cli__provider_commands__detect_provider_command + src__tagi__cli__main__detect_provider --> tagi__cli__provider_commands__detect_provider_command src__tagi__cli__publishing_commands__publish_command --> src__tagi__cli__scan_utils__scan_and_tag src__tagi__cli__publishing_commands__publish_command --> src__tagi__cli__publishing_commands___ensure_tag_prefix src__tagi__cli__publishing_commands__publish_command --> src__tagi__utils__publish_helpers__create_publish_group @@ -215,20 +244,27 @@ flowchart LR src__tagi__cli__utility_commands__draft_command --> src__tagi__cli__utility_commands___ensure_tag_prefix src__tagi__cli__utility_commands__draft_command --> src__tagi__utils__send_helpers__create_change_group src__tagi__cli__utility_commands__draft_command --> src__tagi__composer__commit_message__generate_commit_message - src__tagi__providers__gitlab__GitLabProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result - src__tagi__providers__gitlab__GitLabProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result - src__tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command - src__tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command - src__tagi__providers__github__GitHubProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result - src__tagi__providers__github__GitHubProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result - src__tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command - src__tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command - src__tagi__scanner__status__scan_repo --> src__tagi__config__load_config - src__tagi__scanner__status__scan_repo --> src__tagi__config__Config__should_ignore - src__tagi__scanner__status__scan_repo --> src__tagi__scanner__status__parse_status + tagi__providers__base__BaseProvider___run_command --> tagi__utils__commands__run_command + tagi__providers__gitlab__GitLabProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result + tagi__providers__gitlab__GitLabProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result + tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command + tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command + tagi__providers__github__GitHubProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result + tagi__providers__github__GitHubProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result + tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command + tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command + tagi__scanner__files__count_lines_changed --> tagi__utils__commands__run_command + tagi__scanner__status__scan_repo --> tagi__utils__commands__run_command + tagi__scanner__status__scan_repo --> src__tagi__config__load_config + tagi__scanner__status__scan_repo --> src__tagi__config__Config__should_ignore + tagi__scanner__status__scan_repo --> tagi__scanner__status__parse_status + tagi__scanner__diff__get_diff --> tagi__utils__commands__run_command + tagi__scanner__diff__get_staged_diff --> tagi__utils__commands__run_command src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___lines_risk_weight src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___tag_risk_weight src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___change_type_risk_weight + src__tagi__heuristics__metrics___extension_complexity_weight --> src__tagi__utils__paths__path_endswith + src__tagi__heuristics__metrics___extension_impact_weight --> src__tagi__utils__paths__path_endswith src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_complexity src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_impact src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_stability @@ -236,14 +272,18 @@ flowchart LR src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_dependency_depth src__tagi__heuristics__metrics___calculate_complexity --> src__tagi__heuristics__metrics___extension_complexity_weight src__tagi__heuristics__metrics___calculate_impact --> src__tagi__heuristics__metrics___extension_impact_weight + src__tagi__heuristics__metrics___calculate_test_impact --> src__tagi__utils__paths__path_endswith + src__tagi__heuristics__metrics___calculate_test_impact --> src__tagi__utils__paths__path_matches + src__tagi__heuristics__metrics___calculate_dependency_depth --> src__tagi__utils__paths__path_endswith src__tagi__heuristics__tags__apply_tags --> src__tagi__config__load_config src__tagi__heuristics__tags__apply_tags --> src__tagi__heuristics__tags___tag_change src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags___custom_config_tags - src__tagi__heuristics__tags___tag_change --> src__tagi__scanner__files__count_lines_changed + src__tagi__heuristics__tags___tag_change --> tagi__scanner__files__count_lines_changed src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__metrics__calculate_metrics src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__scoring__calculate_risk_score src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags__apply_path_tags src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags___size_tags + src__tagi__heuristics__tags__apply_path_tags --> src__tagi__utils__paths__path_matches src__tagi__heuristics__rules___get_config_attr --> src__tagi__config__load_config src__tagi__heuristics__rules__get_custom_rules --> src__tagi__heuristics__rules___get_config_attr src__tagi__heuristics__rules__get_custom_heuristics --> src__tagi__heuristics__rules___get_config_attr @@ -263,16 +303,20 @@ flowchart LR src__tagi__composer__commit_message__generate_commit_message --> src__tagi__config__load_config src__tagi__composer___tags__all_tag_values --> src__tagi__composer___tags__all_tags src__tagi__composer___tags__summary_tag --> src__tagi__composer___tags__all_tags + tagi__executor__git__GitExecutor___run_command --> tagi__utils__commands__run_command src__tagi__utils__summary_helpers__build_statistics_section --> src__tagi__utils__risk__total_lines_changed src__tagi__utils__summary_helpers__build_statistics_section --> src__tagi__utils__risk__average_risk - src__tagi__utils__publish_helpers__detect_and_get_provider --> src__tagi__utils__detect_provider__get_provider + src__tagi__utils__publish_helpers__detect_and_get_provider --> tagi__utils__detect_provider__get_provider src__tagi__utils__publish_helpers__create_publish_group --> src__tagi__utils__risk__total_lines_changed src__tagi__utils__publish_helpers__create_publish_group --> src__tagi__utils__risk__average_risk - src__tagi__utils__detect_provider__get_provider --> src__tagi__utils__detect_provider__detect_git_provider + tagi__utils__detect_provider__get_provider --> tagi__utils__detect_provider__detect_git_provider + tagi__utils__detect_provider__detect_git_provider --> tagi__utils__commands__run_command src__tagi__utils__send_helpers__create_change_group --> src__tagi__utils__risk__total_lines_changed src__tagi__utils__send_helpers__create_change_group --> src__tagi__utils__risk__average_risk src__tagi__utils__change_stats__calculate_tag_statistics --> src__tagi__utils__risk__total_lines_changed src__tagi__utils__change_stats__calculate_tag_statistics --> src__tagi__utils__risk__average_risk + src__tagi__utils__paths__path_matches --> src__tagi__utils__paths__path_key + src__tagi__utils__paths__path_endswith --> src__tagi__utils__paths__path_key src__tagi__utils__change_filter___resolve_tag_enums --> src__tagi__utils__change_filter___normalize_tag src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___resolve_tag_enums src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___changes_matching_any diff --git a/project/calls.toon.yaml b/project/calls.toon.yaml index 1fc6976..05b4dae 100644 --- a/project/calls.toon.yaml +++ b/project/calls.toon.yaml @@ -1,7 +1,7 @@ # code2llm call graph | /home/tom/github/semcod/tagi -# generated in 0.06s -# nodes: 136 | edges: 144 | modules: 40 -# CC̄=2.9 +# generated in 0.07s +# nodes: 147 | edges: 165 | modules: 45 +# CC̄=2.8 HUBS[20]: src.tagi.cli.publishing_commands.publish_command @@ -16,10 +16,10 @@ HUBS[20]: CC=5 in:0 out:22 total:22 src.tagi.cli.inspection_commands.inspect_command CC=7 in:0 out:17 total:17 - src.tagi.cli.scan_utils.scan_and_tag - CC=3 in:11 out:6 total:17 src.tagi.utils.logger.setup_logger CC=4 in:2 out:15 total:17 + src.tagi.cli.scan_utils.scan_and_tag + CC=3 in:11 out:6 total:17 src.tagi.cli.utility_commands.draft_command CC=4 in:0 out:17 total:17 src.tagi.cli.inspection_commands.filter_command @@ -28,7 +28,7 @@ HUBS[20]: CC=5 in:9 out:7 total:16 src.tagi.utils.change_stats.display_statistics_table CC=1 in:4 out:12 total:16 - src.tagi.scanner.status.scan_repo + tagi.scanner.status.scan_repo CC=7 in:0 out:15 total:15 src.tagi.cli.core_commands.stats_command CC=7 in:0 out:15 total:15 @@ -40,8 +40,8 @@ HUBS[20]: CC=2 in:1 out:10 total:11 src.tagi.cli.display_utils._display_changes CC=3 in:3 out:8 total:11 - src.tagi.analyzer.dependency_graph._dfs_visit - CC=5 in:2 out:8 total:10 + tagi.utils.commands.run_command + CC=1 in:10 out:1 total:11 src.tagi.utils.risk.average_risk CC=3 in:8 out:2 total:10 @@ -89,12 +89,6 @@ MODULES: _resolve_send_target CC=5 out:5 detect_provider CC=1 out:1 setup_logging CC=2 out:4 - src.tagi.cli.provider_commands [5 funcs] - _current_branch CC=2 out:2 - _pr_spec CC=1 out:2 - create_mr CC=4 out:8 - create_pr CC=4 out:8 - detect_provider_command CC=2 out:3 src.tagi.cli.publishing_commands [3 funcs] _ensure_tag_prefix CC=2 out:1 deploy_command CC=5 out:22 @@ -127,17 +121,19 @@ MODULES: generate_simple_message CC=5 out:6 src.tagi.composer.summary [1 funcs] generate_summary CC=8 out:8 - src.tagi.config [2 funcs] - should_ignore CC=3 out:2 + src.tagi.config [4 funcs] + get_heuristics_for_path CC=4 out:2 + get_tag_for_path CC=3 out:2 + should_ignore CC=2 out:2 load_config CC=1 out:1 src.tagi.heuristics.metrics [8 funcs] _calculate_complexity CC=1 out:6 - _calculate_dependency_depth CC=4 out:4 + _calculate_dependency_depth CC=4 out:3 _calculate_impact CC=1 out:3 _calculate_stability CC=1 out:2 - _calculate_test_impact CC=4 out:2 - _extension_complexity_weight CC=3 out:2 - _extension_impact_weight CC=3 out:2 + _calculate_test_impact CC=4 out:3 + _extension_complexity_weight CC=3 out:1 + _extension_impact_weight CC=3 out:1 calculate_metrics CC=1 out:6 src.tagi.heuristics.rules [3 funcs] _get_config_attr CC=1 out:2 @@ -171,27 +167,12 @@ MODULES: src.tagi.planner.sorter [2 funcs] group_by_complexity CC=5 out:7 sort_by_complexity CC=1 out:4 - src.tagi.providers.github [3 funcs] - create_pr CC=1 out:3 - get_auth_status CC=1 out:2 - is_authenticated CC=1 out:2 - src.tagi.providers.gitlab [3 funcs] - create_pr CC=1 out:3 - get_auth_status CC=1 out:2 - is_authenticated CC=1 out:2 src.tagi.providers.utils.auth [2 funcs] get_auth_status_from_result CC=2 out:0 is_authenticated_from_result CC=1 out:0 src.tagi.providers.utils.pr [2 funcs] build_pr_command CC=5 out:2 execute_pr_command CC=2 out:0 - src.tagi.scanner.diff [1 funcs] - get_diff CC=1 out:1 - src.tagi.scanner.files [1 funcs] - count_lines_changed CC=7 out:7 - src.tagi.scanner.status [2 funcs] - parse_status CC=4 out:0 - scan_repo CC=7 out:15 src.tagi.utils.change_filter [9 funcs] _changes_matching_all CC=4 out:1 _changes_matching_any CC=4 out:1 @@ -205,11 +186,12 @@ MODULES: src.tagi.utils.change_stats [2 funcs] calculate_tag_statistics CC=1 out:2 display_statistics_table CC=1 out:12 - src.tagi.utils.detect_provider [2 funcs] - detect_git_provider CC=4 out:2 - get_provider CC=3 out:3 src.tagi.utils.logger [1 funcs] setup_logger CC=4 out:15 + src.tagi.utils.paths [3 funcs] + path_endswith CC=1 out:2 + path_key CC=1 out:1 + path_matches CC=1 out:2 src.tagi.utils.publish_helpers [2 funcs] create_publish_group CC=1 out:4 detect_and_get_provider CC=1 out:1 @@ -220,8 +202,45 @@ MODULES: create_change_group CC=2 out:4 src.tagi.utils.summary_helpers [1 funcs] build_statistics_section CC=1 out:4 + tagi.cli.provider_commands [5 funcs] + _current_branch CC=2 out:2 + _pr_spec CC=1 out:2 + create_mr CC=4 out:8 + create_pr CC=4 out:8 + detect_provider_command CC=2 out:3 + tagi.executor.git [1 funcs] + _run_command CC=1 out:1 + tagi.planner.branch_grouper [2 funcs] + get_branch_info CC=5 out:6 + group_by_branch CC=8 out:10 + tagi.providers.base [1 funcs] + _run_command CC=1 out:1 + tagi.providers.github [3 funcs] + create_pr CC=1 out:3 + get_auth_status CC=1 out:2 + is_authenticated CC=1 out:2 + tagi.providers.gitlab [3 funcs] + create_pr CC=1 out:3 + get_auth_status CC=1 out:2 + is_authenticated CC=1 out:2 + tagi.scanner.diff [2 funcs] + get_diff CC=1 out:1 + get_staged_diff CC=1 out:1 + tagi.scanner.files [1 funcs] + count_lines_changed CC=7 out:7 + tagi.scanner.status [2 funcs] + parse_status CC=4 out:0 + scan_repo CC=7 out:15 + tagi.utils.commands [1 funcs] + run_command CC=1 out:1 + tagi.utils.detect_provider [2 funcs] + detect_git_provider CC=5 out:2 + get_provider CC=3 out:3 EDGES: + src.tagi.config.Config.get_tag_for_path → src.tagi.utils.paths.path_matches + src.tagi.config.Config.get_heuristics_for_path → src.tagi.utils.paths.path_matches + src.tagi.config.Config.should_ignore → src.tagi.utils.paths.path_matches src.tagi.hooks._pre_commit_hook → src.tagi.hooks._hooks_dir src.tagi.hooks.install_hooks → src.tagi.hooks._pre_commit_hook src.tagi.hooks.install_hooks → src.tagi.hooks._hooks_dir @@ -245,11 +264,13 @@ EDGES: src.tagi.planner.grouper.group_changes → src.tagi.utils.risk.total_lines_changed src.tagi.planner.grouper.group_changes → src.tagi.utils.risk.average_risk src.tagi.planner.grouper.group_by_tag → src.tagi.planner.selector.select_changes_by_tag + tagi.planner.branch_grouper.group_by_branch → tagi.utils.commands.run_command + tagi.planner.branch_grouper.get_branch_info → tagi.utils.commands.run_command src.tagi.cli.git_operations._is_known_tag → src.tagi.cli.git_operations._ensure_tag_prefix src.tagi.cli.git_operations._resolve_send_target → src.tagi.cli.git_operations._is_known_tag src.tagi.cli.git_operations._filter_by_tag → src.tagi.utils.change_filter.resolve_filtered_changes src.tagi.cli.git_operations._filter_by_tag → src.tagi.cli.git_operations._ensure_tag_prefix - src.tagi.cli.git_operations._execute_git_operations → src.tagi.utils.detect_provider.get_provider + src.tagi.cli.git_operations._execute_git_operations → tagi.utils.detect_provider.get_provider src.tagi.cli.git_operations.send_command → src.tagi.cli.git_operations._resolve_send_target src.tagi.cli.git_operations.auto_command → src.tagi.cli.main._configure_command_logging src.tagi.cli.git_operations.auto_command → src.tagi.cli.git_operations.send_command @@ -261,14 +282,9 @@ EDGES: src.tagi.cli.inspection_commands.filter_command → src.tagi.utils.change_stats.display_statistics_table src.tagi.cli.inspection_commands.filter_command → src.tagi.cli.display_utils._display_changes src.tagi.cli.inspection_commands.filter_command → src.tagi.cli.scan_utils.scan_and_tag - src.tagi.cli.inspection_commands.file_command → src.tagi.scanner.diff.get_diff - src.tagi.cli.provider_commands.detect_provider_command → src.tagi.utils.detect_provider.get_provider - src.tagi.cli.provider_commands._pr_spec → src.tagi.cli.provider_commands._current_branch - src.tagi.cli.provider_commands.create_pr → src.tagi.utils.detect_provider.get_provider - src.tagi.cli.provider_commands.create_pr → src.tagi.cli.provider_commands._pr_spec - src.tagi.cli.provider_commands.create_mr → src.tagi.utils.detect_provider.get_provider - src.tagi.cli.provider_commands.create_mr → src.tagi.cli.provider_commands._pr_spec - src.tagi.cli.core_commands.scan_command → src.tagi.cli.scan_utils.scan_and_tag - src.tagi.cli.core_commands.scan_command → src.tagi.cli.display_utils._display_changes_grouped - src.tagi.cli.core_commands.scan_command → src.tagi.cli.display_utils._display_changes - src.tagi.cli.core_commands.list_groups_command → src.tagi.cli.core_commands._do_list_groups + src.tagi.cli.inspection_commands.file_command → tagi.scanner.diff.get_diff + tagi.cli.provider_commands.detect_provider_command → tagi.utils.detect_provider.get_provider + tagi.cli.provider_commands._current_branch → tagi.utils.commands.run_command + tagi.cli.provider_commands._pr_spec → tagi.cli.provider_commands._current_branch + tagi.cli.provider_commands.create_pr → tagi.utils.detect_provider.get_provider + tagi.cli.provider_commands.create_pr → tagi.cli.provider_commands._pr_spec diff --git a/project/calls.yaml b/project/calls.yaml index 92aa937..9ae2de2 100644 --- a/project/calls.yaml +++ b/project/calls.yaml @@ -1,108 +1,115 @@ project: /home/tom/github/semcod/tagi generated_from: code2llm call graph analysis stats: - total_nodes: 136 - total_edges: 144 - modules_count: 40 + total_nodes: 147 + total_edges: 165 + modules_count: 45 nodes: - src.tagi.analyzer.dependency_graph.detect_cycles: - name: detect_cycles + src.tagi.analyzer.dependency_graph._mark: + name: _mark module: src.tagi.analyzer.dependency_graph - line: 184 - cyclomatic_complexity: 4 - calls_out: 1 - calls_in: 0 - src.tagi.cli.main._is_known_tag: - name: _is_known_tag - module: src.tagi.cli.main - line: 57 + line: 147 + cyclomatic_complexity: 1 + calls_out: 0 + calls_in: 2 + src.tagi.providers.utils.auth.get_auth_status_from_result: + name: get_auth_status_from_result + module: src.tagi.providers.utils.auth + line: 7 cyclomatic_complexity: 2 - calls_out: 2 - calls_in: 1 - src.tagi.providers.gitlab.GitLabProvider.get_auth_status: - name: get_auth_status - module: src.tagi.providers.gitlab - line: 21 + calls_out: 0 + calls_in: 2 + src.tagi.utils.summary_helpers.build_statistics_section: + name: build_statistics_section + module: src.tagi.utils.summary_helpers + line: 31 cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 0 - src.tagi.composer.formats.generate_simple_message: - name: generate_simple_message - module: src.tagi.composer.formats - line: 102 - cyclomatic_complexity: 5 - calls_out: 6 + calls_out: 4 calls_in: 0 - src.tagi.cli.inspection_commands.filter_command: - name: filter_command - module: src.tagi.cli.inspection_commands - line: 56 - cyclomatic_complexity: 6 - calls_out: 16 + src.tagi.cli.utility_commands.hooks_command: + name: hooks_command + module: src.tagi.cli.utility_commands + line: 131 + cyclomatic_complexity: 10 + calls_out: 26 calls_in: 0 - src.tagi.cli.provider_commands._pr_spec: - name: _pr_spec - module: src.tagi.cli.provider_commands - line: 37 - cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 2 - src.tagi.heuristics.metrics._calculate_complexity: - name: _calculate_complexity - module: src.tagi.heuristics.metrics - line: 89 - cyclomatic_complexity: 1 - calls_out: 6 + src.tagi.cli.git_operations.send_command: + name: send_command + module: src.tagi.cli.git_operations + line: 90 + cyclomatic_complexity: 7 + calls_out: 26 calls_in: 1 - src.tagi.hooks.install_hooks: - name: install_hooks - module: src.tagi.hooks - line: 17 - cyclomatic_complexity: 2 + src.tagi.analyzer.metrics.MetricsCollector.collect: + name: collect + module: src.tagi.analyzer.metrics + line: 25 + cyclomatic_complexity: 10 calls_out: 5 calls_in: 0 - src.tagi.cli.core_commands.list_groups_command: - name: list_groups_command - module: src.tagi.cli.core_commands - line: 33 - cyclomatic_complexity: 1 + src.tagi.composer.formats._detailed_file_lines: + name: _detailed_file_lines + module: src.tagi.composer.formats + line: 75 + cyclomatic_complexity: 3 + calls_out: 1 + calls_in: 1 + src.tagi.config.Config.get_heuristics_for_path: + name: get_heuristics_for_path + module: src.tagi.config + line: 89 + cyclomatic_complexity: 4 calls_out: 2 calls_in: 0 - src.tagi.cli.git_operations._ensure_tag_prefix: - name: _ensure_tag_prefix - module: src.tagi.cli.git_operations - line: 21 + src.tagi.heuristics.tags._size_tags: + name: _size_tags + module: src.tagi.heuristics.tags + line: 60 + cyclomatic_complexity: 3 + calls_out: 0 + calls_in: 1 + src.tagi.utils.change_filter._normalize_tag: + name: _normalize_tag + module: src.tagi.utils.change_filter + line: 14 cyclomatic_complexity: 2 calls_out: 1 calls_in: 2 - src.tagi.cli.git_operations._is_known_tag: - name: _is_known_tag - module: src.tagi.cli.git_operations - line: 28 + src.tagi.utils.change_filter.filter_changes_by_tag: + name: filter_changes_by_tag + module: src.tagi.utils.change_filter + line: 84 + cyclomatic_complexity: 1 + calls_out: 1 + calls_in: 0 + src.tagi.composer.formats.generate_conventional_message: + name: generate_conventional_message + module: src.tagi.composer.formats + line: 42 + cyclomatic_complexity: 4 + calls_out: 5 + calls_in: 0 + src.tagi.cli.publishing_commands.publish_command: + name: publish_command + module: src.tagi.cli.publishing_commands + line: 23 + cyclomatic_complexity: 11 + calls_out: 36 + calls_in: 0 + src.tagi.composer.commit_message._improve_with_llm: + name: _improve_with_llm + module: src.tagi.composer.commit_message + line: 52 cyclomatic_complexity: 2 calls_out: 2 calls_in: 1 - src.tagi.heuristics.tags._custom_config_tags: - name: _custom_config_tags - module: src.tagi.heuristics.tags - line: 48 - cyclomatic_complexity: 3 - calls_out: 3 + src.tagi.composer._tags.infer_scope: + name: infer_scope + module: src.tagi.composer._tags + line: 41 + cyclomatic_complexity: 7 + calls_out: 2 calls_in: 1 - src.tagi.heuristics.rules.get_custom_heuristics: - name: get_custom_heuristics - module: src.tagi.heuristics.rules - line: 18 - cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 0 - src.tagi.analyzer.dependency_graph._dfs_visit: - name: _dfs_visit - module: src.tagi.analyzer.dependency_graph - line: 158 - cyclomatic_complexity: 5 - calls_out: 8 - calls_in: 2 src.tagi.utils.send_helpers.create_change_group: name: create_change_group module: src.tagi.utils.send_helpers @@ -110,118 +117,83 @@ nodes: cyclomatic_complexity: 2 calls_out: 4 calls_in: 2 - src.tagi.providers.utils.pr.build_pr_command: - name: build_pr_command - module: src.tagi.providers.utils.pr - line: 10 - cyclomatic_complexity: 5 - calls_out: 2 - calls_in: 2 - src.tagi.cli.provider_commands.create_mr: - name: create_mr - module: src.tagi.cli.provider_commands - line: 62 - cyclomatic_complexity: 4 - calls_out: 8 - calls_in: 0 - src.tagi.utils.change_filter._resolve_tag_enums: - name: _resolve_tag_enums - module: src.tagi.utils.change_filter - line: 24 + src.tagi.analyzer.dependency_graph._cycle_from: + name: _cycle_from + module: src.tagi.analyzer.dependency_graph + line: 152 + cyclomatic_complexity: 1 + calls_out: 1 + calls_in: 1 + tagi.utils.detect_provider.get_provider: + name: get_provider + module: tagi.utils.detect_provider + line: 12 cyclomatic_complexity: 3 calls_out: 3 - calls_in: 1 - src.tagi.heuristics.tags._tag_change: - name: _tag_change - module: src.tagi.heuristics.tags - line: 22 - cyclomatic_complexity: 2 - calls_out: 10 - calls_in: 1 - src.tagi.cli.provider_commands._current_branch: - name: _current_branch - module: src.tagi.cli.provider_commands - line: 27 - cyclomatic_complexity: 2 + calls_in: 6 + src.tagi.hooks._pre_commit_hook: + name: _pre_commit_hook + module: src.tagi.hooks + line: 13 + cyclomatic_complexity: 1 + calls_out: 1 + calls_in: 3 + src.tagi.analyzer.dependency_graph._next_critical_node: + name: _next_critical_node + module: src.tagi.analyzer.dependency_graph + line: 226 + cyclomatic_complexity: 5 calls_out: 2 calls_in: 1 - src.tagi.utils.change_filter._changes_matching_tag: - name: _changes_matching_tag - module: src.tagi.utils.change_filter - line: 19 - cyclomatic_complexity: 3 - calls_out: 0 - calls_in: 1 - src.tagi.providers.utils.pr.execute_pr_command: - name: execute_pr_command - module: src.tagi.providers.utils.pr - line: 35 + src.tagi.cli.utility_commands._ensure_tag_prefix: + name: _ensure_tag_prefix + module: src.tagi.cli.utility_commands + line: 18 cyclomatic_complexity: 2 - calls_out: 0 - calls_in: 2 - src.tagi.scanner.diff.get_diff: - name: get_diff - module: src.tagi.scanner.diff - line: 6 - cyclomatic_complexity: 1 calls_out: 1 - calls_in: 3 - src.tagi.cli.inspection_commands.file_command: - name: file_command + calls_in: 1 + src.tagi.cli.inspection_commands.inspect_command: + name: inspect_command module: src.tagi.cli.inspection_commands - line: 89 + line: 19 cyclomatic_complexity: 7 - calls_out: 14 + calls_out: 17 calls_in: 0 - src.tagi.cli.main.setup_logging: - name: setup_logging - module: src.tagi.cli.main - line: 37 - cyclomatic_complexity: 2 - calls_out: 4 + src.tagi.cli.utility_commands.summary_command: + name: summary_command + module: src.tagi.cli.utility_commands + line: 25 + cyclomatic_complexity: 7 + calls_out: 28 calls_in: 0 src.tagi.config.load_config: name: load_config module: src.tagi.config - line: 124 + line: 116 cyclomatic_complexity: 1 calls_out: 1 calls_in: 6 - src.tagi.heuristics.scoring._tag_risk_weight: - name: _tag_risk_weight - module: src.tagi.heuristics.scoring - line: 34 - cyclomatic_complexity: 3 - calls_out: 2 - calls_in: 1 - src.tagi.cli.git_operations._execute_git_operations: - name: _execute_git_operations - module: src.tagi.cli.git_operations - line: 71 - cyclomatic_complexity: 5 - calls_out: 11 - calls_in: 1 - src.tagi.composer._tags.all_tag_values: - name: all_tag_values - module: src.tagi.composer._tags - line: 15 - cyclomatic_complexity: 2 + src.tagi.heuristics.rules.get_custom_rules: + name: get_custom_rules + module: src.tagi.heuristics.rules + line: 13 + cyclomatic_complexity: 1 calls_out: 1 calls_in: 0 - src.tagi.heuristics.tags.apply_path_tags: - name: apply_path_tags - module: src.tagi.heuristics.tags - line: 69 - cyclomatic_complexity: 4 + src.tagi.cli.publishing_commands.deploy_command: + name: deploy_command + module: src.tagi.cli.publishing_commands + line: 96 + cyclomatic_complexity: 5 + calls_out: 22 + calls_in: 0 + src.tagi.composer._templates.render_template: + name: render_template + module: src.tagi.composer._templates + line: 10 + cyclomatic_complexity: 2 calls_out: 2 calls_in: 1 - src.tagi.analyzer.dependency_graph.build_dependency_graph: - name: build_dependency_graph - module: src.tagi.analyzer.dependency_graph - line: 54 - cyclomatic_complexity: 3 - calls_out: 4 - calls_in: 0 src.tagi.utils.publish_helpers.create_publish_group: name: create_publish_group module: src.tagi.utils.publish_helpers @@ -229,68 +201,61 @@ nodes: cyclomatic_complexity: 1 calls_out: 4 calls_in: 1 - src.tagi.providers.github.GitHubProvider.is_authenticated: + src.tagi.utils.paths.path_key: + name: path_key + module: src.tagi.utils.paths + line: 12 + cyclomatic_complexity: 1 + calls_out: 1 + calls_in: 2 + tagi.providers.gitlab.GitLabProvider.is_authenticated: name: is_authenticated - module: src.tagi.providers.github - line: 15 + module: tagi.providers.gitlab + line: 16 cyclomatic_complexity: 1 calls_out: 2 calls_in: 0 - src.tagi.composer.formats.generate_conventional_message: - name: generate_conventional_message - module: src.tagi.composer.formats - line: 42 - cyclomatic_complexity: 4 + src.tagi.composer._tags.all_tags: + name: all_tags + module: src.tagi.composer._tags + line: 8 + cyclomatic_complexity: 3 + calls_out: 2 + calls_in: 3 + src.tagi.hooks.install_hooks: + name: install_hooks + module: src.tagi.hooks + line: 17 + cyclomatic_complexity: 2 calls_out: 5 calls_in: 0 - src.tagi.analyzer.dependency_graph._collect_import_names: - name: _collect_import_names - module: src.tagi.analyzer.dependency_graph - line: 10 - cyclomatic_complexity: 7 - calls_out: 5 - calls_in: 1 - src.tagi.analyzer.dependency_graph.get_critical_path: - name: get_critical_path - module: src.tagi.analyzer.dependency_graph - line: 262 - cyclomatic_complexity: 2 - calls_out: 2 + src.tagi.cli.inspection_commands.filter_command: + name: filter_command + module: src.tagi.cli.inspection_commands + line: 56 + cyclomatic_complexity: 6 + calls_out: 16 calls_in: 0 - src.tagi.composer._templates.render_template: - name: render_template - module: src.tagi.composer._templates - line: 10 + src.tagi.hooks.check_hooks_installed: + name: check_hooks_installed + module: src.tagi.hooks + line: 68 cyclomatic_complexity: 2 - calls_out: 2 + calls_out: 3 calls_in: 1 - src.tagi.utils.change_filter._changes_matching_all: - name: _changes_matching_all - module: src.tagi.utils.change_filter - line: 40 - cyclomatic_complexity: 4 - calls_out: 1 + src.tagi.heuristics.metrics._calculate_complexity: + name: _calculate_complexity + module: src.tagi.heuristics.metrics + line: 88 + cyclomatic_complexity: 1 + calls_out: 6 calls_in: 1 - src.tagi.cli.main._resolve_send_target: + src.tagi.cli.git_operations._resolve_send_target: name: _resolve_send_target - module: src.tagi.cli.main - line: 66 + module: src.tagi.cli.git_operations + line: 37 cyclomatic_complexity: 5 calls_out: 5 - calls_in: 0 - src.tagi.cli.utility_commands._ensure_tag_prefix: - name: _ensure_tag_prefix - module: src.tagi.cli.utility_commands - line: 18 - cyclomatic_complexity: 2 - calls_out: 1 - calls_in: 1 - src.tagi.planner.grouper._get_primary_tag: - name: _get_primary_tag - module: src.tagi.planner.grouper - line: 54 - cyclomatic_complexity: 4 - calls_out: 0 calls_in: 1 src.tagi.cli.display_utils._display_changes_grouped: name: _display_changes_grouped @@ -299,138 +264,166 @@ nodes: cyclomatic_complexity: 5 calls_out: 3 calls_in: 1 - src.tagi.cli.utility_commands.hooks_command: - name: hooks_command - module: src.tagi.cli.utility_commands - line: 131 - cyclomatic_complexity: 10 - calls_out: 26 - calls_in: 0 - src.tagi.cli.inspection_commands.inspect_command: - name: inspect_command - module: src.tagi.cli.inspection_commands - line: 19 - cyclomatic_complexity: 7 - calls_out: 17 + src.tagi.cli.core_commands.scan_command: + name: scan_command + module: src.tagi.cli.core_commands + line: 14 + cyclomatic_complexity: 3 + calls_out: 7 calls_in: 0 - src.tagi.utils.change_filter.resolve_filtered_changes: - name: resolve_filtered_changes - module: src.tagi.utils.change_filter - line: 45 + src.tagi.composer.formats.generate_simple_message: + name: generate_simple_message + module: src.tagi.composer.formats + line: 102 cyclomatic_complexity: 5 - calls_out: 7 - calls_in: 9 - src.tagi.scanner.status.scan_repo: - name: scan_repo - module: src.tagi.scanner.status - line: 11 - cyclomatic_complexity: 7 - calls_out: 15 + calls_out: 6 calls_in: 0 - src.tagi.heuristics.scoring.calculate_risk_score: - name: calculate_risk_score + src.tagi.heuristics.scoring._change_type_risk_weight: + name: _change_type_risk_weight module: src.tagi.heuristics.scoring - line: 20 + line: 39 cyclomatic_complexity: 1 - calls_out: 4 - calls_in: 1 - src.tagi.cli.provider_commands.detect_provider_command: - name: detect_provider_command - module: src.tagi.cli.provider_commands - line: 17 - cyclomatic_complexity: 2 - calls_out: 3 - calls_in: 1 - src.tagi.cli.scan_utils.scan_and_tag: - name: scan_and_tag - module: src.tagi.cli.scan_utils - line: 10 - cyclomatic_complexity: 3 - calls_out: 6 - calls_in: 11 - src.tagi.cli.core_commands._do_list_groups: - name: _do_list_groups - module: src.tagi.cli.core_commands - line: 47 - cyclomatic_complexity: 4 - calls_out: 7 - calls_in: 2 - src.tagi.cli.publishing_commands._ensure_tag_prefix: - name: _ensure_tag_prefix - module: src.tagi.cli.publishing_commands - line: 16 - cyclomatic_complexity: 2 calls_out: 1 - calls_in: 2 - src.tagi.analyzer.dependency_graph._find_longest_start: - name: _find_longest_start - module: src.tagi.analyzer.dependency_graph - line: 221 - cyclomatic_complexity: 1 - calls_out: 2 calls_in: 1 - src.tagi.hooks._pre_commit_hook: - name: _pre_commit_hook - module: src.tagi.hooks - line: 13 + tagi.providers.github.GitHubProvider.is_authenticated: + name: is_authenticated + module: tagi.providers.github + line: 15 cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 3 - src.tagi.cli.display_utils._display_groups: - name: _display_groups + calls_out: 2 + calls_in: 0 + src.tagi.cli.display_utils._format_tags: + name: _format_tags module: src.tagi.cli.display_utils - line: 52 + line: 35 + cyclomatic_complexity: 5 + calls_out: 3 + calls_in: 4 + src.tagi.config.Config.get_tag_for_path: + name: get_tag_for_path + module: src.tagi.config + line: 73 + cyclomatic_complexity: 3 + calls_out: 2 + calls_in: 0 + src.tagi.heuristics.metrics._calculate_test_impact: + name: _calculate_test_impact + module: src.tagi.heuristics.metrics + line: 134 cyclomatic_complexity: 4 - calls_out: 6 + calls_out: 3 calls_in: 1 - src.tagi.composer.formats._commit_type: - name: _commit_type - module: src.tagi.composer.formats - line: 27 + src.tagi.heuristics.metrics._extension_complexity_weight: + name: _extension_complexity_weight + module: src.tagi.heuristics.metrics + line: 34 cyclomatic_complexity: 3 - calls_out: 0 + calls_out: 1 calls_in: 1 - src.tagi.heuristics.metrics._calculate_dependency_depth: - name: _calculate_dependency_depth - module: src.tagi.heuristics.metrics - line: 151 + src.tagi.utils.change_filter._changes_matching_any: + name: _changes_matching_any + module: src.tagi.utils.change_filter + line: 35 cyclomatic_complexity: 4 + calls_out: 1 + calls_in: 1 + src.tagi.analyzer.dependency_graph.analyze_python_imports: + name: analyze_python_imports + module: src.tagi.analyzer.dependency_graph + line: 33 + cyclomatic_complexity: 2 calls_out: 4 calls_in: 1 - src.tagi.composer.summary.generate_summary: - name: generate_summary - module: src.tagi.composer.summary - line: 10 - cyclomatic_complexity: 8 - calls_out: 8 + src.tagi.cli.main.detect_provider: + name: detect_provider + module: src.tagi.cli.main + line: 111 + cyclomatic_complexity: 1 + calls_out: 1 calls_in: 0 - src.tagi.config.Config.should_ignore: - name: should_ignore - module: src.tagi.config - line: 113 - cyclomatic_complexity: 3 - calls_out: 2 + src.tagi.planner.grouper.group_by_tag: + name: group_by_tag + module: src.tagi.planner.grouper + line: 37 + cyclomatic_complexity: 1 + calls_out: 1 + calls_in: 0 + src.tagi.cli.git_operations._execute_git_operations: + name: _execute_git_operations + module: src.tagi.cli.git_operations + line: 71 + cyclomatic_complexity: 5 + calls_out: 11 calls_in: 1 - src.tagi.heuristics.metrics._calculate_impact: - name: _calculate_impact - module: src.tagi.heuristics.metrics - line: 107 + src.tagi.cli.core_commands.list_command: + name: list_command + module: src.tagi.cli.core_commands + line: 40 cyclomatic_complexity: 1 - calls_out: 3 + calls_out: 2 + calls_in: 0 + src.tagi.composer.formats._describe_changes: + name: _describe_changes + module: src.tagi.composer.formats + line: 35 + cyclomatic_complexity: 2 + calls_out: 2 calls_in: 1 - src.tagi.providers.gitlab.GitLabProvider.create_pr: - name: create_pr - module: src.tagi.providers.gitlab - line: 41 + src.tagi.planner.selector.select_changes_by_tag: + name: select_changes_by_tag + module: src.tagi.planner.selector + line: 8 + cyclomatic_complexity: 3 + calls_out: 0 + calls_in: 1 + src.tagi.utils.change_filter.filter_changes_by_tags_all: + name: filter_changes_by_tags_all + module: src.tagi.utils.change_filter + line: 110 cyclomatic_complexity: 1 - calls_out: 3 + calls_out: 1 calls_in: 0 - src.tagi.heuristics.metrics._extension_complexity_weight: - name: _extension_complexity_weight - module: src.tagi.heuristics.metrics - line: 33 + src.tagi.utils.change_filter.resolve_filtered_changes: + name: resolve_filtered_changes + module: src.tagi.utils.change_filter + line: 45 + cyclomatic_complexity: 5 + calls_out: 7 + calls_in: 9 + src.tagi.utils.risk.average_risk: + name: average_risk + module: src.tagi.utils.risk + line: 22 cyclomatic_complexity: 3 calls_out: 2 + calls_in: 8 + src.tagi.composer._tags.summary_tag: + name: summary_tag + module: src.tagi.composer._tags + line: 20 + cyclomatic_complexity: 3 + calls_out: 2 + calls_in: 4 + src.tagi.cli.core_commands._do_list_groups: + name: _do_list_groups + module: src.tagi.cli.core_commands + line: 47 + cyclomatic_complexity: 4 + calls_out: 7 + calls_in: 2 + src.tagi.analyzer.dependency_graph.get_critical_path: + name: get_critical_path + module: src.tagi.analyzer.dependency_graph + line: 262 + cyclomatic_complexity: 2 + calls_out: 2 + calls_in: 0 + src.tagi.planner.grouper._get_primary_tag: + name: _get_primary_tag + module: src.tagi.planner.grouper + line: 54 + cyclomatic_complexity: 4 + calls_out: 0 calls_in: 1 src.tagi.hooks.uninstall_hooks: name: uninstall_hooks @@ -439,108 +432,192 @@ nodes: cyclomatic_complexity: 3 calls_out: 3 calls_in: 0 - src.tagi.utils.change_filter._changes_matching_any: - name: _changes_matching_any - module: src.tagi.utils.change_filter - line: 35 - cyclomatic_complexity: 4 + src.tagi.planner.sorter.group_by_complexity: + name: group_by_complexity + module: src.tagi.planner.sorter + line: 80 + cyclomatic_complexity: 5 + calls_out: 7 + calls_in: 0 + src.tagi.cli.git_operations._ensure_tag_prefix: + name: _ensure_tag_prefix + module: src.tagi.cli.git_operations + line: 21 + cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 2 + src.tagi.heuristics.rules.get_custom_heuristics: + name: get_custom_heuristics + module: src.tagi.heuristics.rules + line: 18 + cyclomatic_complexity: 1 calls_out: 1 + calls_in: 0 + src.tagi.analyzer.dependency_graph._longest_path_length: + name: _longest_path_length + module: src.tagi.analyzer.dependency_graph + line: 203 + cyclomatic_complexity: 4 + calls_out: 3 + calls_in: 2 + src.tagi.utils.paths.path_endswith: + name: path_endswith + module: src.tagi.utils.paths + line: 22 + cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 6 + src.tagi.heuristics.tags._tag_change: + name: _tag_change + module: src.tagi.heuristics.tags + line: 23 + cyclomatic_complexity: 2 + calls_out: 10 calls_in: 1 - src.tagi.composer.commit_message._improve_with_llm: - name: _improve_with_llm - module: src.tagi.composer.commit_message - line: 52 + src.tagi.cli.main._configure_command_logging: + name: _configure_command_logging + module: src.tagi.cli.main + line: 44 cyclomatic_complexity: 2 calls_out: 2 calls_in: 1 - src.tagi.hooks.list_hooks: - name: list_hooks - module: src.tagi.hooks - line: 86 - cyclomatic_complexity: 5 - calls_out: 7 - calls_in: 0 - src.tagi.analyzer.dependency_graph.analyze_python_imports: - name: analyze_python_imports - module: src.tagi.analyzer.dependency_graph - line: 33 + tagi.cli.provider_commands.detect_provider_command: + name: detect_provider_command + module: tagi.cli.provider_commands + line: 17 cyclomatic_complexity: 2 - calls_out: 4 + calls_out: 3 calls_in: 1 - src.tagi.utils.logger.setup_logger: - name: setup_logger - module: src.tagi.utils.logger - line: 9 + src.tagi.planner.grouper.group_changes: + name: group_changes + module: src.tagi.planner.grouper + line: 10 cyclomatic_complexity: 4 - calls_out: 15 - calls_in: 2 - src.tagi.cli.publishing_commands.publish_command: - name: publish_command - module: src.tagi.cli.publishing_commands - line: 23 - cyclomatic_complexity: 11 - calls_out: 36 + calls_out: 10 calls_in: 0 - src.tagi.analyzer.dependency_graph._mark: - name: _mark - module: src.tagi.analyzer.dependency_graph - line: 147 - cyclomatic_complexity: 1 - calls_out: 0 - calls_in: 2 - src.tagi.analyzer.dependency_graph._reconstruct_critical_path: - name: _reconstruct_critical_path - module: src.tagi.analyzer.dependency_graph - line: 244 + src.tagi.composer.formats._commit_type: + name: _commit_type + module: src.tagi.composer.formats + line: 27 cyclomatic_complexity: 3 - calls_out: 4 + calls_out: 0 calls_in: 1 - src.tagi.utils.change_filter.filter_changes_by_tags_any: - name: filter_changes_by_tags_any + tagi.providers.github.GitHubProvider.get_auth_status: + name: get_auth_status + module: tagi.providers.github + line: 19 + cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 0 + src.tagi.utils.change_filter._resolve_tag_enums: + name: _resolve_tag_enums module: src.tagi.utils.change_filter - line: 97 + line: 24 + cyclomatic_complexity: 3 + calls_out: 3 + calls_in: 1 + src.tagi.heuristics.scoring._lines_risk_weight: + name: _lines_risk_weight + module: src.tagi.heuristics.scoring + line: 29 cyclomatic_complexity: 1 calls_out: 1 calls_in: 1 - src.tagi.hooks._hooks_dir: - name: _hooks_dir - module: src.tagi.hooks - line: 9 + src.tagi.heuristics.tags.apply_path_tags: + name: apply_path_tags + module: src.tagi.heuristics.tags + line: 70 + cyclomatic_complexity: 4 + calls_out: 2 + calls_in: 1 + src.tagi.utils.publish_helpers.detect_and_get_provider: + name: detect_and_get_provider + module: src.tagi.utils.publish_helpers + line: 10 cyclomatic_complexity: 1 calls_out: 1 - calls_in: 4 - src.tagi.cli.utility_commands.summary_command: - name: summary_command - module: src.tagi.cli.utility_commands - line: 25 - cyclomatic_complexity: 7 - calls_out: 28 - calls_in: 0 - src.tagi.composer.formats.generate_detailed_message: - name: generate_detailed_message - module: src.tagi.composer.formats - line: 84 - cyclomatic_complexity: 3 - calls_out: 6 calls_in: 0 src.tagi.heuristics.metrics._extension_impact_weight: name: _extension_impact_weight module: src.tagi.heuristics.metrics line: 42 cyclomatic_complexity: 3 - calls_out: 2 + calls_out: 1 calls_in: 1 - src.tagi.composer.formats.generate_oneline_message: - name: generate_oneline_message - module: src.tagi.composer.formats - line: 115 - cyclomatic_complexity: 4 - calls_out: 3 + tagi.planner.branch_grouper.group_by_branch: + name: group_by_branch + module: tagi.planner.branch_grouper + line: 7 + cyclomatic_complexity: 8 + calls_out: 10 calls_in: 0 - src.tagi.cli.main.detect_provider: - name: detect_provider - module: src.tagi.cli.main - line: 111 + tagi.planner.branch_grouper.get_branch_info: + name: get_branch_info + module: tagi.planner.branch_grouper + line: 56 + cyclomatic_complexity: 5 + calls_out: 6 + calls_in: 0 + src.tagi.cli.display_utils._display_groups: + name: _display_groups + module: src.tagi.cli.display_utils + line: 52 + cyclomatic_complexity: 4 + calls_out: 6 + calls_in: 1 + tagi.scanner.status.scan_repo: + name: scan_repo + module: tagi.scanner.status + line: 11 + cyclomatic_complexity: 7 + calls_out: 15 + calls_in: 0 + src.tagi.composer.summary.generate_summary: + name: generate_summary + module: src.tagi.composer.summary + line: 10 + cyclomatic_complexity: 8 + calls_out: 8 + calls_in: 0 + src.tagi.utils.change_filter._changes_matching_tag: + name: _changes_matching_tag + module: src.tagi.utils.change_filter + line: 19 + cyclomatic_complexity: 3 + calls_out: 0 + calls_in: 1 + src.tagi.heuristics.scoring.calculate_risk_score: + name: calculate_risk_score + module: src.tagi.heuristics.scoring + line: 20 + cyclomatic_complexity: 1 + calls_out: 4 + calls_in: 1 + src.tagi.utils.paths.path_matches: + name: path_matches + module: src.tagi.utils.paths + line: 17 + cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 6 + src.tagi.analyzer.dependency_graph._find_longest_start: + name: _find_longest_start + module: src.tagi.analyzer.dependency_graph + line: 221 + cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 1 + src.tagi.utils.change_filter._changes_matching_all: + name: _changes_matching_all + module: src.tagi.utils.change_filter + line: 40 + cyclomatic_complexity: 4 + calls_out: 1 + calls_in: 1 + tagi.providers.base.BaseProvider._run_command: + name: _run_command + module: tagi.providers.base + line: 50 cyclomatic_complexity: 1 calls_out: 1 calls_in: 0 @@ -551,82 +628,173 @@ nodes: cyclomatic_complexity: 3 calls_out: 1 calls_in: 1 - src.tagi.hooks.check_hooks_installed: - name: check_hooks_installed - module: src.tagi.hooks - line: 68 + src.tagi.cli.inspection_commands.file_command: + name: file_command + module: src.tagi.cli.inspection_commands + line: 89 + cyclomatic_complexity: 7 + calls_out: 14 + calls_in: 0 + src.tagi.cli.main._is_known_tag: + name: _is_known_tag + module: src.tagi.cli.main + line: 57 cyclomatic_complexity: 2 - calls_out: 3 - calls_in: 1 - src.tagi.heuristics.tags._size_tags: - name: _size_tags - module: src.tagi.heuristics.tags - line: 59 - cyclomatic_complexity: 3 - calls_out: 0 + calls_out: 2 calls_in: 1 - src.tagi.heuristics.rules._get_config_attr: - name: _get_config_attr - module: src.tagi.heuristics.rules - line: 8 + src.tagi.utils.change_filter.filter_changes_by_tags_any: + name: filter_changes_by_tags_any + module: src.tagi.utils.change_filter + line: 97 cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 2 - src.tagi.analyzer.dependency_graph._longest_path_length: - name: _longest_path_length - module: src.tagi.analyzer.dependency_graph - line: 203 - cyclomatic_complexity: 4 - calls_out: 3 - calls_in: 2 - src.tagi.cli.main._configure_command_logging: - name: _configure_command_logging + calls_out: 1 + calls_in: 1 + src.tagi.cli.main._ensure_tag_prefix: + name: _ensure_tag_prefix module: src.tagi.cli.main - line: 44 + line: 50 cyclomatic_complexity: 2 - calls_out: 2 + calls_out: 1 calls_in: 1 - src.tagi.cli.utility_commands.draft_command: - name: draft_command - module: src.tagi.cli.utility_commands - line: 180 + tagi.cli.provider_commands.create_pr: + name: create_pr + module: tagi.cli.provider_commands + line: 41 cyclomatic_complexity: 4 - calls_out: 17 + calls_out: 8 calls_in: 0 - src.tagi.composer._tags.summary_tag: - name: summary_tag - module: src.tagi.composer._tags - line: 20 - cyclomatic_complexity: 3 + src.tagi.cli.git_operations.auto_command: + name: auto_command + module: src.tagi.cli.git_operations + line: 148 + cyclomatic_complexity: 1 + calls_out: 8 + calls_in: 0 + src.tagi.utils.change_stats.calculate_tag_statistics: + name: calculate_tag_statistics + module: src.tagi.utils.change_stats + line: 17 + cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 3 + src.tagi.heuristics.metrics._calculate_dependency_depth: + name: _calculate_dependency_depth + module: src.tagi.heuristics.metrics + line: 148 + cyclomatic_complexity: 4 + calls_out: 3 + calls_in: 1 + tagi.utils.detect_provider.detect_git_provider: + name: detect_git_provider + module: tagi.utils.detect_provider + line: 29 + cyclomatic_complexity: 5 calls_out: 2 + calls_in: 1 + src.tagi.utils.change_stats.display_statistics_table: + name: display_statistics_table + module: src.tagi.utils.change_stats + line: 29 + cyclomatic_complexity: 1 + calls_out: 12 calls_in: 4 - src.tagi.utils.risk.average_risk: - name: average_risk + src.tagi.composer.commit_message.generate_commit_message: + name: generate_commit_message + module: src.tagi.composer.commit_message + line: 36 + cyclomatic_complexity: 5 + calls_out: 8 + calls_in: 1 + src.tagi.providers.utils.pr.build_pr_command: + name: build_pr_command + module: src.tagi.providers.utils.pr + line: 10 + cyclomatic_complexity: 5 + calls_out: 2 + calls_in: 2 + src.tagi.utils.risk.total_lines_changed: + name: total_lines_changed module: src.tagi.utils.risk - line: 22 + line: 8 + cyclomatic_complexity: 2 + calls_out: 1 + calls_in: 8 + src.tagi.heuristics.scoring._tag_risk_weight: + name: _tag_risk_weight + module: src.tagi.heuristics.scoring + line: 34 cyclomatic_complexity: 3 calls_out: 2 - calls_in: 8 - src.tagi.composer.formats._describe_changes: - name: _describe_changes - module: src.tagi.composer.formats - line: 35 + calls_in: 1 + src.tagi.analyzer.dependency_graph._collect_import_names: + name: _collect_import_names + module: src.tagi.analyzer.dependency_graph + line: 10 + cyclomatic_complexity: 7 + calls_out: 5 + calls_in: 1 + src.tagi.heuristics.tags.apply_tags: + name: apply_tags + module: src.tagi.heuristics.tags + line: 13 cyclomatic_complexity: 2 calls_out: 2 + calls_in: 0 + tagi.scanner.files.count_lines_changed: + name: count_lines_changed + module: tagi.scanner.files + line: 8 + cyclomatic_complexity: 7 + calls_out: 7 calls_in: 1 - src.tagi.providers.utils.auth.is_authenticated_from_result: - name: is_authenticated_from_result - module: src.tagi.providers.utils.auth - line: 23 + src.tagi.composer.formats.generate_detailed_message: + name: generate_detailed_message + module: src.tagi.composer.formats + line: 84 + cyclomatic_complexity: 3 + calls_out: 6 + calls_in: 0 + src.tagi.cli.core_commands.stats_command: + name: stats_command + module: src.tagi.cli.core_commands + line: 65 + cyclomatic_complexity: 7 + calls_out: 15 + calls_in: 0 + tagi.scanner.diff.get_staged_diff: + name: get_staged_diff + module: tagi.scanner.diff + line: 11 cyclomatic_complexity: 1 - calls_out: 0 - calls_in: 2 - src.tagi.cli.git_operations.send_command: - name: send_command + calls_out: 1 + calls_in: 0 + src.tagi.analyzer.dependency_graph.detect_cycles: + name: detect_cycles + module: src.tagi.analyzer.dependency_graph + line: 184 + cyclomatic_complexity: 4 + calls_out: 1 + calls_in: 0 + src.tagi.cli.display_utils._display_changes: + name: _display_changes + module: src.tagi.cli.display_utils + line: 14 + cyclomatic_complexity: 3 + calls_out: 8 + calls_in: 3 + src.tagi.cli.git_operations._is_known_tag: + name: _is_known_tag module: src.tagi.cli.git_operations - line: 90 - cyclomatic_complexity: 7 - calls_out: 26 + line: 28 + cyclomatic_complexity: 2 + calls_out: 2 + calls_in: 1 + src.tagi.heuristics.metrics._calculate_impact: + name: _calculate_impact + module: src.tagi.heuristics.metrics + line: 106 + cyclomatic_complexity: 1 + calls_out: 3 calls_in: 1 src.tagi.hooks.run_hook: name: run_hook @@ -635,258 +803,209 @@ nodes: cyclomatic_complexity: 2 calls_out: 5 calls_in: 0 - src.tagi.planner.selector.select_changes_by_tag: - name: select_changes_by_tag - module: src.tagi.planner.selector - line: 8 - cyclomatic_complexity: 3 - calls_out: 0 - calls_in: 1 - src.tagi.heuristics.metrics.calculate_metrics: - name: calculate_metrics - module: src.tagi.heuristics.metrics - line: 51 + src.tagi.providers.utils.auth.is_authenticated_from_result: + name: is_authenticated_from_result + module: src.tagi.providers.utils.auth + line: 23 cyclomatic_complexity: 1 - calls_out: 6 - calls_in: 1 - src.tagi.scanner.status.parse_status: - name: parse_status - module: src.tagi.scanner.status - line: 57 - cyclomatic_complexity: 4 calls_out: 0 - calls_in: 1 - src.tagi.heuristics.metrics._calculate_stability: - name: _calculate_stability - module: src.tagi.heuristics.metrics - line: 118 + calls_in: 2 + tagi.utils.commands.run_command: + name: run_command + module: tagi.utils.commands + line: 12 cyclomatic_complexity: 1 - calls_out: 2 - calls_in: 1 - src.tagi.cli.display_utils._format_tags: - name: _format_tags - module: src.tagi.cli.display_utils - line: 35 - cyclomatic_complexity: 5 - calls_out: 3 - calls_in: 4 - src.tagi.cli.git_operations._resolve_send_target: - name: _resolve_send_target - module: src.tagi.cli.git_operations - line: 37 - cyclomatic_complexity: 5 - calls_out: 5 - calls_in: 1 - src.tagi.planner.grouper.group_changes: - name: group_changes - module: src.tagi.planner.grouper - line: 10 + calls_out: 1 + calls_in: 10 + src.tagi.composer.formats.generate_oneline_message: + name: generate_oneline_message + module: src.tagi.composer.formats + line: 115 cyclomatic_complexity: 4 - calls_out: 10 + calls_out: 3 calls_in: 0 - src.tagi.heuristics.metrics._calculate_test_impact: - name: _calculate_test_impact - module: src.tagi.heuristics.metrics - line: 135 - cyclomatic_complexity: 4 - calls_out: 2 - calls_in: 1 - src.tagi.utils.detect_provider.get_provider: - name: get_provider - module: src.tagi.utils.detect_provider - line: 12 + src.tagi.heuristics.tags._custom_config_tags: + name: _custom_config_tags + module: src.tagi.heuristics.tags + line: 49 cyclomatic_complexity: 3 calls_out: 3 - calls_in: 6 - src.tagi.heuristics.tags.apply_tags: - name: apply_tags - module: src.tagi.heuristics.tags - line: 12 + calls_in: 1 + src.tagi.composer._tags.all_tag_values: + name: all_tag_values + module: src.tagi.composer._tags + line: 15 cyclomatic_complexity: 2 - calls_out: 2 + calls_out: 1 calls_in: 0 - src.tagi.providers.utils.auth.get_auth_status_from_result: - name: get_auth_status_from_result - module: src.tagi.providers.utils.auth - line: 7 + tagi.cli.provider_commands.create_mr: + name: create_mr + module: tagi.cli.provider_commands + line: 61 + cyclomatic_complexity: 4 + calls_out: 8 + calls_in: 0 + src.tagi.providers.utils.pr.execute_pr_command: + name: execute_pr_command + module: src.tagi.providers.utils.pr + line: 35 cyclomatic_complexity: 2 calls_out: 0 calls_in: 2 - src.tagi.utils.change_filter.filter_changes_by_tag: - name: filter_changes_by_tag - module: src.tagi.utils.change_filter - line: 84 - cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 0 - src.tagi.providers.github.GitHubProvider.get_auth_status: - name: get_auth_status - module: src.tagi.providers.github - line: 20 - cyclomatic_complexity: 1 + tagi.cli.provider_commands._current_branch: + name: _current_branch + module: tagi.cli.provider_commands + line: 27 + cyclomatic_complexity: 2 calls_out: 2 + calls_in: 1 + src.tagi.cli.main.setup_logging: + name: setup_logging + module: src.tagi.cli.main + line: 37 + cyclomatic_complexity: 2 + calls_out: 4 calls_in: 0 - src.tagi.scanner.files.count_lines_changed: - name: count_lines_changed - module: src.tagi.scanner.files - line: 6 - cyclomatic_complexity: 7 + src.tagi.hooks.list_hooks: + name: list_hooks + module: src.tagi.hooks + line: 86 + cyclomatic_complexity: 5 calls_out: 7 + calls_in: 0 + tagi.cli.provider_commands._pr_spec: + name: _pr_spec + module: tagi.cli.provider_commands + line: 36 + cyclomatic_complexity: 1 + calls_out: 2 + calls_in: 2 + src.tagi.config.Config.should_ignore: + name: should_ignore + module: src.tagi.config + line: 111 + cyclomatic_complexity: 2 + calls_out: 2 calls_in: 1 - src.tagi.composer.formats._detailed_file_lines: - name: _detailed_file_lines - module: src.tagi.composer.formats - line: 75 - cyclomatic_complexity: 3 - calls_out: 1 - calls_in: 1 - src.tagi.cli.display_utils._display_changes: - name: _display_changes - module: src.tagi.cli.display_utils - line: 14 + src.tagi.cli.main._resolve_send_target: + name: _resolve_send_target + module: src.tagi.cli.main + line: 66 + cyclomatic_complexity: 5 + calls_out: 5 + calls_in: 0 + src.tagi.utils.logger.setup_logger: + name: setup_logger + module: src.tagi.utils.logger + line: 9 + cyclomatic_complexity: 4 + calls_out: 15 + calls_in: 2 + src.tagi.cli.scan_utils.scan_and_tag: + name: scan_and_tag + module: src.tagi.cli.scan_utils + line: 10 cyclomatic_complexity: 3 - calls_out: 8 - calls_in: 3 - src.tagi.planner.grouper.group_by_tag: - name: group_by_tag - module: src.tagi.planner.grouper - line: 37 + calls_out: 6 + calls_in: 11 + tagi.scanner.diff.get_diff: + name: get_diff + module: tagi.scanner.diff + line: 6 cyclomatic_complexity: 1 calls_out: 1 - calls_in: 0 - src.tagi.analyzer.metrics.MetricsCollector.collect: - name: collect - module: src.tagi.analyzer.metrics - line: 25 - cyclomatic_complexity: 10 - calls_out: 5 - calls_in: 0 - src.tagi.utils.risk.total_lines_changed: - name: total_lines_changed - module: src.tagi.utils.risk + calls_in: 3 + src.tagi.heuristics.rules._get_config_attr: + name: _get_config_attr + module: src.tagi.heuristics.rules line: 8 - cyclomatic_complexity: 2 - calls_out: 1 - calls_in: 8 - src.tagi.cli.core_commands.list_command: - name: list_command - module: src.tagi.cli.core_commands - line: 40 cyclomatic_complexity: 1 calls_out: 2 - calls_in: 0 - src.tagi.providers.gitlab.GitLabProvider.is_authenticated: - name: is_authenticated - module: src.tagi.providers.gitlab - line: 16 + calls_in: 2 + src.tagi.heuristics.metrics._calculate_stability: + name: _calculate_stability + module: src.tagi.heuristics.metrics + line: 117 cyclomatic_complexity: 1 calls_out: 2 + calls_in: 1 + src.tagi.cli.utility_commands.draft_command: + name: draft_command + module: src.tagi.cli.utility_commands + line: 180 + cyclomatic_complexity: 4 + calls_out: 17 calls_in: 0 - src.tagi.planner.sorter.sort_by_complexity: - name: sort_by_complexity - module: src.tagi.planner.sorter - line: 7 - cyclomatic_complexity: 1 - calls_out: 4 - calls_in: 2 - src.tagi.cli.provider_commands.create_pr: + tagi.providers.github.GitHubProvider.create_pr: name: create_pr - module: src.tagi.cli.provider_commands - line: 42 - cyclomatic_complexity: 4 - calls_out: 8 + module: tagi.providers.github + line: 30 + cyclomatic_complexity: 1 + calls_out: 3 calls_in: 0 - src.tagi.analyzer.dependency_graph._cycle_from: - name: _cycle_from - module: src.tagi.analyzer.dependency_graph - line: 152 + src.tagi.heuristics.metrics.calculate_metrics: + name: calculate_metrics + module: src.tagi.heuristics.metrics + line: 50 cyclomatic_complexity: 1 - calls_out: 1 + calls_out: 6 calls_in: 1 - src.tagi.utils.change_stats.calculate_tag_statistics: - name: calculate_tag_statistics - module: src.tagi.utils.change_stats - line: 17 + src.tagi.cli.core_commands.list_groups_command: + name: list_groups_command + module: src.tagi.cli.core_commands + line: 33 cyclomatic_complexity: 1 calls_out: 2 - calls_in: 3 - src.tagi.utils.publish_helpers.detect_and_get_provider: - name: detect_and_get_provider - module: src.tagi.utils.publish_helpers - line: 10 + calls_in: 0 + tagi.executor.git.GitExecutor._run_command: + name: _run_command + module: tagi.executor.git + line: 15 cyclomatic_complexity: 1 calls_out: 1 calls_in: 0 - src.tagi.cli.core_commands.stats_command: - name: stats_command - module: src.tagi.cli.core_commands - line: 65 - cyclomatic_complexity: 7 - calls_out: 15 - calls_in: 0 - src.tagi.composer.commit_message.generate_commit_message: - name: generate_commit_message - module: src.tagi.composer.commit_message - line: 36 - cyclomatic_complexity: 5 - calls_out: 8 - calls_in: 1 - src.tagi.cli.publishing_commands.deploy_command: - name: deploy_command - module: src.tagi.cli.publishing_commands - line: 96 - cyclomatic_complexity: 5 - calls_out: 22 + tagi.providers.gitlab.GitLabProvider.get_auth_status: + name: get_auth_status + module: tagi.providers.gitlab + line: 20 + cyclomatic_complexity: 1 + calls_out: 2 calls_in: 0 - src.tagi.utils.summary_helpers.build_statistics_section: - name: build_statistics_section - module: src.tagi.utils.summary_helpers - line: 31 + tagi.providers.gitlab.GitLabProvider.create_pr: + name: create_pr + module: tagi.providers.gitlab + line: 39 cyclomatic_complexity: 1 - calls_out: 4 + calls_out: 3 calls_in: 0 - src.tagi.cli.main._ensure_tag_prefix: + src.tagi.cli.publishing_commands._ensure_tag_prefix: name: _ensure_tag_prefix - module: src.tagi.cli.main - line: 50 + module: src.tagi.cli.publishing_commands + line: 16 cyclomatic_complexity: 2 calls_out: 1 - calls_in: 1 - src.tagi.utils.change_filter.filter_changes_by_tags_all: - name: filter_changes_by_tags_all - module: src.tagi.utils.change_filter - line: 110 - cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 0 - src.tagi.cli.core_commands.scan_command: - name: scan_command - module: src.tagi.cli.core_commands - line: 14 - cyclomatic_complexity: 3 - calls_out: 7 - calls_in: 0 - src.tagi.composer._tags.all_tags: - name: all_tags - module: src.tagi.composer._tags - line: 8 + calls_in: 2 + src.tagi.analyzer.dependency_graph._dfs_visit: + name: _dfs_visit + module: src.tagi.analyzer.dependency_graph + line: 158 + cyclomatic_complexity: 5 + calls_out: 8 + calls_in: 2 + src.tagi.analyzer.dependency_graph._reconstruct_critical_path: + name: _reconstruct_critical_path + module: src.tagi.analyzer.dependency_graph + line: 244 cyclomatic_complexity: 3 - calls_out: 2 - calls_in: 3 - src.tagi.heuristics.scoring._lines_risk_weight: - name: _lines_risk_weight - module: src.tagi.heuristics.scoring - line: 29 - cyclomatic_complexity: 1 - calls_out: 1 + calls_out: 4 + calls_in: 1 + tagi.scanner.status.parse_status: + name: parse_status + module: tagi.scanner.status + line: 51 + cyclomatic_complexity: 4 + calls_out: 0 calls_in: 1 - src.tagi.cli.git_operations.auto_command: - name: auto_command - module: src.tagi.cli.git_operations - line: 148 - cyclomatic_complexity: 1 - calls_out: 8 - calls_in: 0 src.tagi.cli.git_operations._filter_by_tag: name: _filter_by_tag module: src.tagi.cli.git_operations @@ -894,70 +1013,37 @@ nodes: cyclomatic_complexity: 3 calls_out: 4 calls_in: 1 - src.tagi.utils.change_filter._normalize_tag: - name: _normalize_tag - module: src.tagi.utils.change_filter - line: 14 - cyclomatic_complexity: 2 - calls_out: 1 - calls_in: 2 - src.tagi.utils.detect_provider.detect_git_provider: - name: detect_git_provider - module: src.tagi.utils.detect_provider - line: 29 - cyclomatic_complexity: 4 - calls_out: 2 - calls_in: 1 - src.tagi.heuristics.rules.get_custom_rules: - name: get_custom_rules - module: src.tagi.heuristics.rules - line: 13 + src.tagi.hooks._hooks_dir: + name: _hooks_dir + module: src.tagi.hooks + line: 9 cyclomatic_complexity: 1 calls_out: 1 - calls_in: 0 - src.tagi.analyzer.dependency_graph._next_critical_node: - name: _next_critical_node - module: src.tagi.analyzer.dependency_graph - line: 226 - cyclomatic_complexity: 5 - calls_out: 2 - calls_in: 1 - src.tagi.composer._tags.infer_scope: - name: infer_scope - module: src.tagi.composer._tags - line: 41 - cyclomatic_complexity: 7 - calls_out: 2 - calls_in: 1 - src.tagi.planner.sorter.group_by_complexity: - name: group_by_complexity - module: src.tagi.planner.sorter - line: 80 - cyclomatic_complexity: 5 - calls_out: 7 - calls_in: 0 - src.tagi.utils.change_stats.display_statistics_table: - name: display_statistics_table - module: src.tagi.utils.change_stats - line: 29 - cyclomatic_complexity: 1 - calls_out: 12 calls_in: 4 - src.tagi.providers.github.GitHubProvider.create_pr: - name: create_pr - module: src.tagi.providers.github - line: 32 - cyclomatic_complexity: 1 - calls_out: 3 + src.tagi.analyzer.dependency_graph.build_dependency_graph: + name: build_dependency_graph + module: src.tagi.analyzer.dependency_graph + line: 54 + cyclomatic_complexity: 3 + calls_out: 4 calls_in: 0 - src.tagi.heuristics.scoring._change_type_risk_weight: - name: _change_type_risk_weight - module: src.tagi.heuristics.scoring - line: 39 + src.tagi.planner.sorter.sort_by_complexity: + name: sort_by_complexity + module: src.tagi.planner.sorter + line: 7 cyclomatic_complexity: 1 - calls_out: 1 - calls_in: 1 + calls_out: 4 + calls_in: 2 edges: +- caller: src.tagi.config.Config.get_tag_for_path + callee: src.tagi.utils.paths.path_matches + call_type: resolved +- caller: src.tagi.config.Config.get_heuristics_for_path + callee: src.tagi.utils.paths.path_matches + call_type: resolved +- caller: src.tagi.config.Config.should_ignore + callee: src.tagi.utils.paths.path_matches + call_type: resolved - caller: src.tagi.hooks._pre_commit_hook callee: src.tagi.hooks._hooks_dir call_type: resolved @@ -1027,6 +1113,12 @@ edges: - caller: src.tagi.planner.grouper.group_by_tag callee: src.tagi.planner.selector.select_changes_by_tag call_type: resolved +- caller: tagi.planner.branch_grouper.group_by_branch + callee: tagi.utils.commands.run_command + call_type: resolved +- caller: tagi.planner.branch_grouper.get_branch_info + callee: tagi.utils.commands.run_command + call_type: resolved - caller: src.tagi.cli.git_operations._is_known_tag callee: src.tagi.cli.git_operations._ensure_tag_prefix call_type: resolved @@ -1040,7 +1132,7 @@ edges: callee: src.tagi.cli.git_operations._ensure_tag_prefix call_type: resolved - caller: src.tagi.cli.git_operations._execute_git_operations - callee: src.tagi.utils.detect_provider.get_provider + callee: tagi.utils.detect_provider.get_provider call_type: resolved - caller: src.tagi.cli.git_operations.send_command callee: src.tagi.cli.git_operations._resolve_send_target @@ -1076,25 +1168,28 @@ edges: callee: src.tagi.cli.scan_utils.scan_and_tag call_type: resolved - caller: src.tagi.cli.inspection_commands.file_command - callee: src.tagi.scanner.diff.get_diff + callee: tagi.scanner.diff.get_diff call_type: resolved -- caller: src.tagi.cli.provider_commands.detect_provider_command - callee: src.tagi.utils.detect_provider.get_provider +- caller: tagi.cli.provider_commands.detect_provider_command + callee: tagi.utils.detect_provider.get_provider call_type: resolved -- caller: src.tagi.cli.provider_commands._pr_spec - callee: src.tagi.cli.provider_commands._current_branch +- caller: tagi.cli.provider_commands._current_branch + callee: tagi.utils.commands.run_command call_type: resolved -- caller: src.tagi.cli.provider_commands.create_pr - callee: src.tagi.utils.detect_provider.get_provider +- caller: tagi.cli.provider_commands._pr_spec + callee: tagi.cli.provider_commands._current_branch call_type: resolved -- caller: src.tagi.cli.provider_commands.create_pr - callee: src.tagi.cli.provider_commands._pr_spec +- caller: tagi.cli.provider_commands.create_pr + callee: tagi.utils.detect_provider.get_provider call_type: resolved -- caller: src.tagi.cli.provider_commands.create_mr - callee: src.tagi.utils.detect_provider.get_provider +- caller: tagi.cli.provider_commands.create_pr + callee: tagi.cli.provider_commands._pr_spec call_type: resolved -- caller: src.tagi.cli.provider_commands.create_mr - callee: src.tagi.cli.provider_commands._pr_spec +- caller: tagi.cli.provider_commands.create_mr + callee: tagi.utils.detect_provider.get_provider + call_type: resolved +- caller: tagi.cli.provider_commands.create_mr + callee: tagi.cli.provider_commands._pr_spec call_type: resolved - caller: src.tagi.cli.core_commands.scan_command callee: src.tagi.cli.scan_utils.scan_and_tag @@ -1151,7 +1246,7 @@ edges: callee: src.tagi.cli.main._is_known_tag call_type: resolved - caller: src.tagi.cli.main.detect_provider - callee: src.tagi.cli.provider_commands.detect_provider_command + callee: tagi.cli.provider_commands.detect_provider_command call_type: resolved - caller: src.tagi.cli.publishing_commands.publish_command callee: src.tagi.cli.scan_utils.scan_and_tag @@ -1189,38 +1284,53 @@ edges: - caller: src.tagi.cli.utility_commands.draft_command callee: src.tagi.composer.commit_message.generate_commit_message call_type: resolved -- caller: src.tagi.providers.gitlab.GitLabProvider.is_authenticated +- caller: tagi.providers.base.BaseProvider._run_command + callee: tagi.utils.commands.run_command + call_type: resolved +- caller: tagi.providers.gitlab.GitLabProvider.is_authenticated callee: src.tagi.providers.utils.auth.is_authenticated_from_result call_type: resolved -- caller: src.tagi.providers.gitlab.GitLabProvider.get_auth_status +- caller: tagi.providers.gitlab.GitLabProvider.get_auth_status callee: src.tagi.providers.utils.auth.get_auth_status_from_result call_type: resolved -- caller: src.tagi.providers.gitlab.GitLabProvider.create_pr +- caller: tagi.providers.gitlab.GitLabProvider.create_pr callee: src.tagi.providers.utils.pr.execute_pr_command call_type: resolved -- caller: src.tagi.providers.gitlab.GitLabProvider.create_pr +- caller: tagi.providers.gitlab.GitLabProvider.create_pr callee: src.tagi.providers.utils.pr.build_pr_command call_type: resolved -- caller: src.tagi.providers.github.GitHubProvider.is_authenticated +- caller: tagi.providers.github.GitHubProvider.is_authenticated callee: src.tagi.providers.utils.auth.is_authenticated_from_result call_type: resolved -- caller: src.tagi.providers.github.GitHubProvider.get_auth_status +- caller: tagi.providers.github.GitHubProvider.get_auth_status callee: src.tagi.providers.utils.auth.get_auth_status_from_result call_type: resolved -- caller: src.tagi.providers.github.GitHubProvider.create_pr +- caller: tagi.providers.github.GitHubProvider.create_pr callee: src.tagi.providers.utils.pr.execute_pr_command call_type: resolved -- caller: src.tagi.providers.github.GitHubProvider.create_pr +- caller: tagi.providers.github.GitHubProvider.create_pr callee: src.tagi.providers.utils.pr.build_pr_command call_type: resolved -- caller: src.tagi.scanner.status.scan_repo +- caller: tagi.scanner.files.count_lines_changed + callee: tagi.utils.commands.run_command + call_type: resolved +- caller: tagi.scanner.status.scan_repo + callee: tagi.utils.commands.run_command + call_type: resolved +- caller: tagi.scanner.status.scan_repo callee: src.tagi.config.load_config call_type: resolved -- caller: src.tagi.scanner.status.scan_repo +- caller: tagi.scanner.status.scan_repo callee: src.tagi.config.Config.should_ignore call_type: resolved -- caller: src.tagi.scanner.status.scan_repo - callee: src.tagi.scanner.status.parse_status +- caller: tagi.scanner.status.scan_repo + callee: tagi.scanner.status.parse_status + call_type: resolved +- caller: tagi.scanner.diff.get_diff + callee: tagi.utils.commands.run_command + call_type: resolved +- caller: tagi.scanner.diff.get_staged_diff + callee: tagi.utils.commands.run_command call_type: resolved - caller: src.tagi.heuristics.scoring.calculate_risk_score callee: src.tagi.heuristics.scoring._lines_risk_weight @@ -1231,6 +1341,12 @@ edges: - caller: src.tagi.heuristics.scoring.calculate_risk_score callee: src.tagi.heuristics.scoring._change_type_risk_weight call_type: resolved +- caller: src.tagi.heuristics.metrics._extension_complexity_weight + callee: src.tagi.utils.paths.path_endswith + call_type: resolved +- caller: src.tagi.heuristics.metrics._extension_impact_weight + callee: src.tagi.utils.paths.path_endswith + call_type: resolved - caller: src.tagi.heuristics.metrics.calculate_metrics callee: src.tagi.heuristics.metrics._calculate_complexity call_type: resolved @@ -1252,6 +1368,15 @@ edges: - caller: src.tagi.heuristics.metrics._calculate_impact callee: src.tagi.heuristics.metrics._extension_impact_weight call_type: resolved +- caller: src.tagi.heuristics.metrics._calculate_test_impact + callee: src.tagi.utils.paths.path_endswith + call_type: resolved +- caller: src.tagi.heuristics.metrics._calculate_test_impact + callee: src.tagi.utils.paths.path_matches + call_type: resolved +- caller: src.tagi.heuristics.metrics._calculate_dependency_depth + callee: src.tagi.utils.paths.path_endswith + call_type: resolved - caller: src.tagi.heuristics.tags.apply_tags callee: src.tagi.config.load_config call_type: resolved @@ -1262,7 +1387,7 @@ edges: callee: src.tagi.heuristics.tags._custom_config_tags call_type: resolved - caller: src.tagi.heuristics.tags._tag_change - callee: src.tagi.scanner.files.count_lines_changed + callee: tagi.scanner.files.count_lines_changed call_type: resolved - caller: src.tagi.heuristics.tags._tag_change callee: src.tagi.heuristics.metrics.calculate_metrics @@ -1276,6 +1401,9 @@ edges: - caller: src.tagi.heuristics.tags._tag_change callee: src.tagi.heuristics.tags._size_tags call_type: resolved +- caller: src.tagi.heuristics.tags.apply_path_tags + callee: src.tagi.utils.paths.path_matches + call_type: resolved - caller: src.tagi.heuristics.rules._get_config_attr callee: src.tagi.config.load_config call_type: resolved @@ -1333,6 +1461,9 @@ edges: - caller: src.tagi.composer._tags.summary_tag callee: src.tagi.composer._tags.all_tags call_type: resolved +- caller: tagi.executor.git.GitExecutor._run_command + callee: tagi.utils.commands.run_command + call_type: resolved - caller: src.tagi.utils.summary_helpers.build_statistics_section callee: src.tagi.utils.risk.total_lines_changed call_type: resolved @@ -1340,7 +1471,7 @@ edges: callee: src.tagi.utils.risk.average_risk call_type: resolved - caller: src.tagi.utils.publish_helpers.detect_and_get_provider - callee: src.tagi.utils.detect_provider.get_provider + callee: tagi.utils.detect_provider.get_provider call_type: resolved - caller: src.tagi.utils.publish_helpers.create_publish_group callee: src.tagi.utils.risk.total_lines_changed @@ -1348,8 +1479,11 @@ edges: - caller: src.tagi.utils.publish_helpers.create_publish_group callee: src.tagi.utils.risk.average_risk call_type: resolved -- caller: src.tagi.utils.detect_provider.get_provider - callee: src.tagi.utils.detect_provider.detect_git_provider +- caller: tagi.utils.detect_provider.get_provider + callee: tagi.utils.detect_provider.detect_git_provider + call_type: resolved +- caller: tagi.utils.detect_provider.detect_git_provider + callee: tagi.utils.commands.run_command call_type: resolved - caller: src.tagi.utils.send_helpers.create_change_group callee: src.tagi.utils.risk.total_lines_changed @@ -1363,6 +1497,12 @@ edges: - caller: src.tagi.utils.change_stats.calculate_tag_statistics callee: src.tagi.utils.risk.average_risk call_type: resolved +- caller: src.tagi.utils.paths.path_matches + callee: src.tagi.utils.paths.path_key + call_type: resolved +- caller: src.tagi.utils.paths.path_endswith + callee: src.tagi.utils.paths.path_key + call_type: resolved - caller: src.tagi.utils.change_filter._resolve_tag_enums callee: src.tagi.utils.change_filter._normalize_tag call_type: resolved @@ -1436,12 +1576,6 @@ modules: - src.tagi.cli.main._resolve_send_target - src.tagi.cli.main.detect_provider - src.tagi.cli.main.setup_logging - src.tagi.cli.provider_commands: - - src.tagi.cli.provider_commands._current_branch - - src.tagi.cli.provider_commands._pr_spec - - src.tagi.cli.provider_commands.create_mr - - src.tagi.cli.provider_commands.create_pr - - src.tagi.cli.provider_commands.detect_provider_command src.tagi.cli.publishing_commands: - src.tagi.cli.publishing_commands._ensure_tag_prefix - src.tagi.cli.publishing_commands.deploy_command @@ -1475,6 +1609,8 @@ modules: src.tagi.composer.summary: - src.tagi.composer.summary.generate_summary src.tagi.config: + - src.tagi.config.Config.get_heuristics_for_path + - src.tagi.config.Config.get_tag_for_path - src.tagi.config.Config.should_ignore - src.tagi.config.load_config src.tagi.heuristics.metrics: @@ -1518,27 +1654,12 @@ modules: src.tagi.planner.sorter: - src.tagi.planner.sorter.group_by_complexity - src.tagi.planner.sorter.sort_by_complexity - src.tagi.providers.github: - - src.tagi.providers.github.GitHubProvider.create_pr - - src.tagi.providers.github.GitHubProvider.get_auth_status - - src.tagi.providers.github.GitHubProvider.is_authenticated - src.tagi.providers.gitlab: - - src.tagi.providers.gitlab.GitLabProvider.create_pr - - src.tagi.providers.gitlab.GitLabProvider.get_auth_status - - src.tagi.providers.gitlab.GitLabProvider.is_authenticated src.tagi.providers.utils.auth: - src.tagi.providers.utils.auth.get_auth_status_from_result - src.tagi.providers.utils.auth.is_authenticated_from_result src.tagi.providers.utils.pr: - src.tagi.providers.utils.pr.build_pr_command - src.tagi.providers.utils.pr.execute_pr_command - src.tagi.scanner.diff: - - src.tagi.scanner.diff.get_diff - src.tagi.scanner.files: - - src.tagi.scanner.files.count_lines_changed - src.tagi.scanner.status: - - src.tagi.scanner.status.parse_status - - src.tagi.scanner.status.scan_repo src.tagi.utils.change_filter: - src.tagi.utils.change_filter._changes_matching_all - src.tagi.utils.change_filter._changes_matching_any @@ -1552,11 +1673,12 @@ modules: src.tagi.utils.change_stats: - src.tagi.utils.change_stats.calculate_tag_statistics - src.tagi.utils.change_stats.display_statistics_table - src.tagi.utils.detect_provider: - - src.tagi.utils.detect_provider.detect_git_provider - - src.tagi.utils.detect_provider.get_provider src.tagi.utils.logger: - src.tagi.utils.logger.setup_logger + src.tagi.utils.paths: + - src.tagi.utils.paths.path_endswith + - src.tagi.utils.paths.path_key + - src.tagi.utils.paths.path_matches src.tagi.utils.publish_helpers: - src.tagi.utils.publish_helpers.create_publish_group - src.tagi.utils.publish_helpers.detect_and_get_provider @@ -1567,6 +1689,40 @@ modules: - src.tagi.utils.send_helpers.create_change_group src.tagi.utils.summary_helpers: - src.tagi.utils.summary_helpers.build_statistics_section + tagi.cli.provider_commands: + - tagi.cli.provider_commands._current_branch + - tagi.cli.provider_commands._pr_spec + - tagi.cli.provider_commands.create_mr + - tagi.cli.provider_commands.create_pr + - tagi.cli.provider_commands.detect_provider_command + tagi.executor.git: + - tagi.executor.git.GitExecutor._run_command + tagi.planner.branch_grouper: + - tagi.planner.branch_grouper.get_branch_info + - tagi.planner.branch_grouper.group_by_branch + tagi.providers.base: + - tagi.providers.base.BaseProvider._run_command + tagi.providers.github: + - tagi.providers.github.GitHubProvider.create_pr + - tagi.providers.github.GitHubProvider.get_auth_status + - tagi.providers.github.GitHubProvider.is_authenticated + tagi.providers.gitlab: + - tagi.providers.gitlab.GitLabProvider.create_pr + - tagi.providers.gitlab.GitLabProvider.get_auth_status + - tagi.providers.gitlab.GitLabProvider.is_authenticated + tagi.scanner.diff: + - tagi.scanner.diff.get_diff + - tagi.scanner.diff.get_staged_diff + tagi.scanner.files: + - tagi.scanner.files.count_lines_changed + tagi.scanner.status: + - tagi.scanner.status.parse_status + - tagi.scanner.status.scan_repo + tagi.utils.commands: + - tagi.utils.commands.run_command + tagi.utils.detect_provider: + - tagi.utils.detect_provider.detect_git_provider + - tagi.utils.detect_provider.get_provider entry_points: - src.tagi.analyzer.dependency_graph._LevelOrder.__init__ - src.tagi.analyzer.dependency_graph._LevelOrder._drain_level @@ -1592,8 +1748,6 @@ entry_points: - src.tagi.cli.main._resolve_send_target - src.tagi.cli.main.detect_provider - src.tagi.cli.main.setup_logging -- src.tagi.cli.provider_commands.create_mr -- src.tagi.cli.provider_commands.create_pr - src.tagi.cli.publishing_commands.deploy_command - src.tagi.cli.publishing_commands.publish_command - src.tagi.cli.utility_commands.draft_command @@ -1618,15 +1772,6 @@ entry_points: - src.tagi.config.Config.get_tag_for_path - src.tagi.config.Config.get_tags_for_path - src.tagi.config.Config.get_template -- src.tagi.executor.git.GitExecutor.__init__ -- src.tagi.executor.git.GitExecutor._run_command -- src.tagi.executor.git.GitExecutor.add -- src.tagi.executor.git.GitExecutor.commit -- src.tagi.executor.git.GitExecutor.get_current_branch -- src.tagi.executor.git.GitExecutor.get_remote_url -- src.tagi.executor.git.GitExecutor.has_staged_changes -- src.tagi.executor.git.GitExecutor.push -- src.tagi.executor.git.GitExecutor.status - src.tagi.executor.publish.PublishExecutor.__init__ - src.tagi.executor.publish.PublishExecutor.dry_run - src.tagi.executor.publish.PublishExecutor.publish @@ -1646,8 +1791,6 @@ entry_points: - src.tagi.llm.llx_adapter.LlxAdapter.improve_message - src.tagi.llm.llx_adapter.LlxAdapter.is_available - src.tagi.models.change.ChangeMetrics.to_vector -- src.tagi.planner.branch_grouper.get_branch_info -- src.tagi.planner.branch_grouper.group_by_branch - src.tagi.planner.grouper.group_by_risk - src.tagi.planner.grouper.group_by_tag - src.tagi.planner.grouper.group_changes @@ -1659,25 +1802,7 @@ entry_points: - src.tagi.planner.selector.select_small_changes - src.tagi.planner.sorter.group_by_complexity - src.tagi.planner.sorter.sort_by_tag_priority -- src.tagi.providers.base.BaseProvider.__init__ -- src.tagi.providers.base.BaseProvider._check_git_remote_for_provider -- src.tagi.providers.base.BaseProvider._get_git_remote_url -- src.tagi.providers.base.BaseProvider._run_command -- src.tagi.providers.base.BaseProvider.create_pr -- src.tagi.providers.base.BaseProvider.detect_remote -- src.tagi.providers.base.BaseProvider.get_auth_status -- src.tagi.providers.base.BaseProvider.is_authenticated - src.tagi.providers.detector.detect_provider -- src.tagi.providers.github.GitHubProvider.create_pr -- src.tagi.providers.github.GitHubProvider.detect_remote -- src.tagi.providers.github.GitHubProvider.get_auth_status -- src.tagi.providers.github.GitHubProvider.get_token -- src.tagi.providers.github.GitHubProvider.is_authenticated -- src.tagi.providers.gitlab.GitLabProvider.create_pr -- src.tagi.providers.gitlab.GitLabProvider.detect_remote -- src.tagi.providers.gitlab.GitLabProvider.get_auth_status -- src.tagi.providers.gitlab.GitLabProvider.get_configured_host -- src.tagi.providers.gitlab.GitLabProvider.is_authenticated - src.tagi.providers.koru.KoruProvider.__init__ - src.tagi.providers.koru.KoruProvider._deployment_recommendations - src.tagi.providers.koru.KoruProvider._make_api_request @@ -1688,8 +1813,6 @@ entry_points: - src.tagi.providers.koru.KoruProvider.get_topology - src.tagi.providers.koru.KoruProvider.is_available - src.tagi.providers.koru.KoruProvider.run_quality_gates -- src.tagi.scanner.diff.get_staged_diff -- src.tagi.scanner.status.scan_repo - src.tagi.ui.design_tokens.DesignTokens.__init__ - src.tagi.ui.design_tokens.DesignTokens.get_css_string - src.tagi.ui.design_tokens.DesignTokens.get_css_variables @@ -1705,3 +1828,36 @@ entry_points: - src.tagi.utils.summary_helpers.build_report_header - src.tagi.utils.summary_helpers.build_statistics_section - src.tagi.utils.summary_helpers.build_tag_distribution_section +- tagi.cli.provider_commands.create_mr +- tagi.cli.provider_commands.create_pr +- tagi.executor.git.GitExecutor.__init__ +- tagi.executor.git.GitExecutor._run_command +- tagi.executor.git.GitExecutor.add +- tagi.executor.git.GitExecutor.commit +- tagi.executor.git.GitExecutor.get_current_branch +- tagi.executor.git.GitExecutor.get_remote_url +- tagi.executor.git.GitExecutor.has_staged_changes +- tagi.executor.git.GitExecutor.push +- tagi.executor.git.GitExecutor.status +- tagi.planner.branch_grouper.get_branch_info +- tagi.planner.branch_grouper.group_by_branch +- tagi.providers.base.BaseProvider.__init__ +- tagi.providers.base.BaseProvider._check_git_remote_for_provider +- tagi.providers.base.BaseProvider._get_git_remote_url +- tagi.providers.base.BaseProvider._run_command +- tagi.providers.base.BaseProvider.create_pr +- tagi.providers.base.BaseProvider.detect_remote +- tagi.providers.base.BaseProvider.get_auth_status +- tagi.providers.base.BaseProvider.is_authenticated +- tagi.providers.github.GitHubProvider.create_pr +- tagi.providers.github.GitHubProvider.detect_remote +- tagi.providers.github.GitHubProvider.get_auth_status +- tagi.providers.github.GitHubProvider.get_token +- tagi.providers.github.GitHubProvider.is_authenticated +- tagi.providers.gitlab.GitLabProvider.create_pr +- tagi.providers.gitlab.GitLabProvider.detect_remote +- tagi.providers.gitlab.GitLabProvider.get_auth_status +- tagi.providers.gitlab.GitLabProvider.get_configured_host +- tagi.providers.gitlab.GitLabProvider.is_authenticated +- tagi.scanner.diff.get_staged_diff +- tagi.scanner.status.scan_repo diff --git a/project/compact_flow.mmd b/project/compact_flow.mmd index 79c3aeb..c0d95b7 100644 --- a/project/compact_flow.mmd +++ b/project/compact_flow.mmd @@ -1,3 +1,19 @@ flowchart TD -%% generated in 0.00s - src__tagi["src.tagi
225 funcs"] +%% generated in 0.01s + src__tagi["src.tagi
187 funcs"] + tagi__cli["tagi.cli
5 funcs"] + tagi__executor["tagi.executor
9 funcs"] + tagi__planner["tagi.planner
2 funcs"] + tagi__providers["tagi.providers
18 funcs"] + tagi__scanner["tagi.scanner
5 funcs"] + tagi__utils["tagi.utils
3 funcs"] + tagi__providers ==>|8| src__tagi + src__tagi ==>|4| tagi__scanner + tagi__cli ==>|4| tagi__utils + tagi__scanner ==>|4| tagi__utils + src__tagi -->|3| tagi__utils + tagi__planner -->|2| tagi__utils + tagi__scanner -->|2| src__tagi + src__tagi -->|1| tagi__cli + tagi__providers -->|1| tagi__utils + tagi__executor -->|1| tagi__utils diff --git a/project/context.md b/project/context.md index 31f765a..dd05785 100644 --- a/project/context.md +++ b/project/context.md @@ -5,11 +5,11 @@ - **Project**: /home/tom/github/semcod/tagi - **Primary Language**: python -- **Languages**: python: 66, yaml: 5, txt: 2, toml: 1, shell: 1 +- **Languages**: python: 68, yaml: 5, txt: 2, toml: 1, shell: 1 - **Analysis Mode**: static -- **Total Functions**: 225 +- **Total Functions**: 229 - **Total Classes**: 27 -- **Modules**: 75 +- **Modules**: 77 - **Entry Points**: 137 ## Architecture by Module @@ -37,7 +37,7 @@ - **Functions**: 9 - **File**: `formats.py` -### src.tagi.executor.git +### tagi.executor.git - **Functions**: 9 - **Classes**: 1 - **File**: `git.py` @@ -46,7 +46,7 @@ - **Functions**: 9 - **File**: `change_filter.py` -### src.tagi.providers.base +### tagi.providers.base - **Functions**: 8 - **Classes**: 2 - **File**: `base.py` @@ -72,7 +72,7 @@ - **Functions**: 5 - **File**: `selector.py` -### src.tagi.cli.provider_commands +### tagi.cli.provider_commands - **Functions**: 5 - **File**: `provider_commands.py` @@ -84,12 +84,12 @@ - **Functions**: 5 - **File**: `utility_commands.py` -### src.tagi.providers.gitlab +### tagi.providers.gitlab - **Functions**: 5 - **Classes**: 1 - **File**: `gitlab.py` -### src.tagi.providers.github +### tagi.providers.github - **Functions**: 5 - **Classes**: 1 - **File**: `github.py` @@ -138,9 +138,9 @@ Main execution flows into the system: > Show statistics about changes. - **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, src.tagi.utils.change_stats.display_statistics_table, console.print, console.print, src.tagi.utils.change_stats.calculate_tag_statistics -### src.tagi.scanner.status.scan_repo +### tagi.scanner.status.scan_repo > Scan repository for uncommitted changes using git status --porcelain. -- **Calls**: subprocess.run, None.split, os.path.exists, ValueError, src.tagi.config.load_config, RuntimeError, line.split, None.strip +- **Calls**: tagi.utils.commands.run_command, None.split, os.path.exists, ValueError, src.tagi.config.load_config, RuntimeError, line.split, None.strip ### src.tagi.cli.inspection_commands.file_command > Show detailed information about a specific file. @@ -158,7 +158,7 @@ Main execution flows into the system: > Group changes by their primary tag. - **Calls**: defaultdict, grouped.items, sorted, ChangeGroup, groups.append, src.tagi.planner.grouper._get_primary_tag, None.append, None.append -### src.tagi.planner.branch_grouper.group_by_branch +### tagi.planner.branch_grouper.group_by_branch > Group changes by the git branch they were modified on. Args: @@ -166,7 +166,7 @@ Args: repo_path: Path to the git repository Ret -- **Calls**: GitExecutor, executor.get_current_branch, None.append, subprocess.run, None.split, None.strip, result.stdout.strip, b.strip +- **Calls**: GitExecutor, executor.get_current_branch, None.append, tagi.utils.commands.run_command, None.split, None.strip, contains.stdout.strip, b.strip ### src.tagi.providers.koru.KoruProvider.analyze_deployment_priority > Analyze deployment priority using Koru API. @@ -180,13 +180,13 @@ Ret > Automatically scan, order, and send all changes. - **Calls**: typer.Argument, typer.Option, typer.Option, typer.Option, typer.Option, src.tagi.cli.main._configure_command_logging, console.print, src.tagi.cli.git_operations.send_command -### src.tagi.cli.provider_commands.create_pr +### tagi.cli.provider_commands.create_pr > Create a GitHub pull request. -- **Calls**: src.tagi.utils.detect_provider.get_provider, isinstance, console.print, github_provider.create_pr, src.tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print +- **Calls**: tagi.utils.detect_provider.get_provider, isinstance, console.print, github_provider.create_pr, tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print -### src.tagi.cli.provider_commands.create_mr +### tagi.cli.provider_commands.create_mr > Create a GitLab merge request. -- **Calls**: src.tagi.utils.detect_provider.get_provider, isinstance, console.print, gitlab_provider.create_pr, src.tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print +- **Calls**: tagi.utils.detect_provider.get_provider, isinstance, console.print, gitlab_provider.create_pr, tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print ### src.tagi.composer.summary.generate_summary > Generate a summary of changes. @@ -218,7 +218,7 @@ Args: > Scan repository for uncommitted changes. - **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, console.print, src.tagi.cli.display_utils._display_changes_grouped, src.tagi.cli.display_utils._display_changes -### src.tagi.planner.branch_grouper.get_branch_info +### tagi.planner.branch_grouper.get_branch_info > Get information about all branches in the repository. Args: @@ -226,7 +226,7 @@ Args: Returns: Dictionary mapping branch nam -- **Calls**: subprocess.run, None.split, None.strip, result.stdout.strip, None.replace, line.strip +- **Calls**: tagi.utils.commands.run_command, None.split, None.strip, branch_listing.stdout.strip, None.replace, line.strip ### src.tagi.providers.koru.KoruProvider._make_api_request > Make request to Koru API. @@ -301,7 +301,8 @@ stats_command [src.tagi.cli.core_commands] ### Flow 9: scan_repo ``` -scan_repo [src.tagi.scanner.status] +scan_repo [tagi.scanner.status] + └─ →> run_command └─ →> load_config ``` @@ -322,27 +323,27 @@ file_command [src.tagi.cli.inspection_commands] - **Methods**: 10 - **Key Methods**: src.tagi.providers.koru.KoruProvider.__init__, src.tagi.providers.koru.KoruProvider._make_api_request, src.tagi.providers.koru.KoruProvider.get_topology, src.tagi.providers.koru.KoruProvider.get_planfile_tickets, src.tagi.providers.koru.KoruProvider.run_quality_gates, src.tagi.providers.koru.KoruProvider.get_context_brief, src.tagi.providers.koru.KoruProvider._deployment_recommendations, src.tagi.providers.koru.KoruProvider.analyze_deployment_priority, src.tagi.providers.koru.KoruProvider.deploy_group, src.tagi.providers.koru.KoruProvider.is_available -### src.tagi.executor.git.GitExecutor +### tagi.executor.git.GitExecutor > Executor for git commands. - **Methods**: 9 -- **Key Methods**: src.tagi.executor.git.GitExecutor.__init__, src.tagi.executor.git.GitExecutor._run_command, src.tagi.executor.git.GitExecutor.add, src.tagi.executor.git.GitExecutor.commit, src.tagi.executor.git.GitExecutor.push, src.tagi.executor.git.GitExecutor.status, src.tagi.executor.git.GitExecutor.get_current_branch, src.tagi.executor.git.GitExecutor.get_remote_url, src.tagi.executor.git.GitExecutor.has_staged_changes +- **Key Methods**: tagi.executor.git.GitExecutor.__init__, tagi.executor.git.GitExecutor._run_command, tagi.executor.git.GitExecutor.add, tagi.executor.git.GitExecutor.commit, tagi.executor.git.GitExecutor.push, tagi.executor.git.GitExecutor.status, tagi.executor.git.GitExecutor.get_current_branch, tagi.executor.git.GitExecutor.get_remote_url, tagi.executor.git.GitExecutor.has_staged_changes -### src.tagi.providers.base.BaseProvider +### tagi.providers.base.BaseProvider > Base class for Git hosting providers. - **Methods**: 8 -- **Key Methods**: src.tagi.providers.base.BaseProvider.__init__, src.tagi.providers.base.BaseProvider.is_authenticated, src.tagi.providers.base.BaseProvider.get_auth_status, src.tagi.providers.base.BaseProvider.create_pr, src.tagi.providers.base.BaseProvider.detect_remote, src.tagi.providers.base.BaseProvider._run_command, src.tagi.providers.base.BaseProvider._get_git_remote_url, src.tagi.providers.base.BaseProvider._check_git_remote_for_provider +- **Key Methods**: tagi.providers.base.BaseProvider.__init__, tagi.providers.base.BaseProvider.is_authenticated, tagi.providers.base.BaseProvider.get_auth_status, tagi.providers.base.BaseProvider.create_pr, tagi.providers.base.BaseProvider.detect_remote, tagi.providers.base.BaseProvider._run_command, tagi.providers.base.BaseProvider._get_git_remote_url, tagi.providers.base.BaseProvider._check_git_remote_for_provider - **Inherits**: ABC -### src.tagi.providers.gitlab.GitLabProvider +### tagi.providers.gitlab.GitLabProvider > GitLab provider using glab CLI. - **Methods**: 5 -- **Key Methods**: src.tagi.providers.gitlab.GitLabProvider.is_authenticated, src.tagi.providers.gitlab.GitLabProvider.get_auth_status, src.tagi.providers.gitlab.GitLabProvider.get_configured_host, src.tagi.providers.gitlab.GitLabProvider.create_pr, src.tagi.providers.gitlab.GitLabProvider.detect_remote +- **Key Methods**: tagi.providers.gitlab.GitLabProvider.is_authenticated, tagi.providers.gitlab.GitLabProvider.get_auth_status, tagi.providers.gitlab.GitLabProvider.get_configured_host, tagi.providers.gitlab.GitLabProvider.create_pr, tagi.providers.gitlab.GitLabProvider.detect_remote - **Inherits**: BaseProvider -### src.tagi.providers.github.GitHubProvider +### tagi.providers.github.GitHubProvider > GitHub provider using gh CLI. - **Methods**: 5 -- **Key Methods**: src.tagi.providers.github.GitHubProvider.is_authenticated, src.tagi.providers.github.GitHubProvider.get_auth_status, src.tagi.providers.github.GitHubProvider.get_token, src.tagi.providers.github.GitHubProvider.create_pr, src.tagi.providers.github.GitHubProvider.detect_remote +- **Key Methods**: tagi.providers.github.GitHubProvider.is_authenticated, tagi.providers.github.GitHubProvider.get_auth_status, tagi.providers.github.GitHubProvider.get_token, tagi.providers.github.GitHubProvider.create_pr, tagi.providers.github.GitHubProvider.detect_remote - **Inherits**: BaseProvider ### src.tagi.analyzer.metrics.MetricsCollector @@ -406,7 +407,7 @@ file_command [src.tagi.cli.inspection_commands] > Group of related changes. - **Methods**: 0 -### src.tagi.providers.base.PrSpec +### tagi.providers.base.PrSpec > Pull/merge request parameters. - **Methods**: 0 @@ -418,7 +419,7 @@ Key functions that process and transform data: > Format tags for display with descriptions if available. - **Output to**: None.join, tag_strings.append, config.get_tag_description -### src.tagi.scanner.status.parse_status +### tagi.scanner.status.parse_status > Parse git status code to ChangeType. ## Behavioral Patterns @@ -446,26 +447,26 @@ Functions exposed as public API (no underscore prefix): - `src.tagi.cli.utility_commands.draft_command` - 17 calls - `src.tagi.cli.inspection_commands.filter_command` - 16 calls - `src.tagi.cli.core_commands.stats_command` - 15 calls -- `src.tagi.scanner.status.scan_repo` - 15 calls +- `tagi.scanner.status.scan_repo` - 15 calls - `src.tagi.utils.logger.setup_logger` - 15 calls - `src.tagi.cli.inspection_commands.file_command` - 14 calls - `src.tagi.ui.design_tokens.DesignTokens.get_css_variables` - 14 calls - `src.tagi.cli.utility_commands.init_command` - 13 calls - `src.tagi.utils.change_stats.display_statistics_table` - 12 calls - `src.tagi.planner.grouper.group_changes` - 10 calls -- `src.tagi.planner.branch_grouper.group_by_branch` - 10 calls +- `tagi.planner.branch_grouper.group_by_branch` - 10 calls - `src.tagi.providers.koru.KoruProvider.analyze_deployment_priority` - 10 calls - `src.tagi.cli.git_operations.auto_command` - 8 calls -- `src.tagi.cli.provider_commands.create_pr` - 8 calls -- `src.tagi.cli.provider_commands.create_mr` - 8 calls +- `tagi.cli.provider_commands.create_pr` - 8 calls +- `tagi.cli.provider_commands.create_mr` - 8 calls - `src.tagi.composer.summary.generate_summary` - 8 calls - `src.tagi.composer.commit_message.generate_commit_message` - 8 calls - `src.tagi.hooks.list_hooks` - 7 calls - `src.tagi.planner.sorter.group_by_complexity` - 7 calls - `src.tagi.cli.core_commands.scan_command` - 7 calls -- `src.tagi.scanner.files.count_lines_changed` - 7 calls +- `tagi.scanner.files.count_lines_changed` - 7 calls - `src.tagi.utils.change_filter.resolve_filtered_changes` - 7 calls -- `src.tagi.planner.branch_grouper.get_branch_info` - 6 calls +- `tagi.planner.branch_grouper.get_branch_info` - 6 calls - `src.tagi.cli.scan_utils.scan_and_tag` - 6 calls - `src.tagi.heuristics.metrics.calculate_metrics` - 6 calls - `src.tagi.composer.formats.generate_detailed_message` - 6 calls @@ -512,7 +513,7 @@ graph TD stats_command --> print stats_command --> scan_and_tag stats_command --> display_statistics_t - scan_repo --> run + scan_repo --> run_command scan_repo --> split ``` diff --git a/project/duplication.toon.yaml b/project/duplication.toon.yaml index 7da8a6a..84fbf61 100644 --- a/project/duplication.toon.yaml +++ b/project/duplication.toon.yaml @@ -1,110 +1,61 @@ -# redup/duplication | 10 groups | 47f 3609L | 2026-05-26 +# redup/duplication | 7 groups | 53f 4261L | 2026-09-19 SUMMARY: - files_scanned: 47 - total_lines: 3609 - dup_groups: 10 - dup_fragments: 20 + files_scanned: 53 + total_lines: 4261 + dup_groups: 7 + dup_fragments: 16 saved_lines: 77 - scan_ms: 2213 + scan_ms: 661 -HOTSPOTS[7] (files with most duplication): - src/tagi/utils/inspect_helpers.py dup=54L groups=2 frags=3 (1.5%) - src/tagi/cli.py dup=39L groups=3 frags=5 (1.1%) - src/tagi/providers/github.py dup=17L groups=4 frags=4 (0.5%) - src/tagi/providers/gitlab.py dup=17L groups=4 frags=4 (0.5%) - src/tagi/utils/publish_helpers.py dup=12L groups=1 frags=1 (0.3%) - src/tagi/providers/detector.py dup=9L groups=1 frags=1 (0.2%) - src/tagi/heuristics/rules.py dup=6L groups=1 frags=2 (0.2%) +DUPLICATES[7] (ranked by impact): + [7418edf7ccbdf120] EXAC _ensure_tag_prefix L=8 N=4 saved=24 sim=1.00 + src/tagi/cli/main.py:0-7 (_ensure_tag_prefix) + src/tagi/cli/git_operations.py:0-7 (_ensure_tag_prefix) + src/tagi/cli/publishing_commands.py:0-7 (_ensure_tag_prefix) + src/tagi/cli/utility_commands.py:0-7 (_ensure_tag_prefix) + [b657bfb2319252a0] EXAC _resolve_send_target L=19 N=2 saved=19 sim=1.00 + src/tagi/cli/main.py:0-18 (_resolve_send_target) + src/tagi/cli/git_operations.py:0-23 (_resolve_send_target) + [17c84d2d23917fb1] EXAC _is_known_tag L=10 N=2 saved=10 sim=1.00 + src/tagi/cli/main.py:0-9 (_is_known_tag) + src/tagi/cli/git_operations.py:0-9 (_is_known_tag) + [a099544d601e75e0] STRU get_token L=8 N=2 saved=8 sim=1.00 + src/tagi/providers/github.py:0-7 (get_token) + src/tagi/executor/git.py:0-7 (get_current_branch) + [baf70879846cca92] STRU _changes_matching_tag L=6 N=2 saved=6 sim=1.00 + src/tagi/utils/change_filter.py:0-5 (_changes_matching_tag) + src/tagi/planner/selector.py:0-5 (select_changes_by_tag) + [ec5f29e9c3061809] EXAC __init__ L=5 N=2 saved=5 sim=1.00 + src/tagi/providers/base.py:0-4 (__init__) + src/tagi/executor/git.py:0-3 (__init__) + [161e0f409941bbdc] STRU is_authenticated L=5 N=2 saved=5 sim=1.00 + src/tagi/providers/github.py:0-4 (is_authenticated) + src/tagi/providers/gitlab.py:0-4 (is_authenticated) -DUPLICATES[10] (ranked by impact): - [69031414365d89a7] STRU filter_changes_by_tags_any L=21 N=2 saved=21 sim=1.00 - src/tagi/utils/inspect_helpers.py:23-43 (filter_changes_by_tags_any) - src/tagi/utils/inspect_helpers.py:46-66 (filter_changes_by_tags_all) - [34f34aac7a5602b7] STRU filter_changes_by_tag L=12 N=2 saved=12 sim=1.00 - src/tagi/utils/inspect_helpers.py:9-20 (filter_changes_by_tag) - src/tagi/utils/publish_helpers.py:28-39 (filter_changes_by_tag) - [59cf75b9ca253237] STRU create_pr L=10 N=2 saved=10 sim=1.00 - src/tagi/cli.py:772-781 (create_pr) - src/tagi/cli.py:784-793 (create_mr) - [0defbec6f6d556b3] EXAC detect_provider L=9 N=2 saved=9 sim=1.00 - src/tagi/cli.py:761-769 (detect_provider) - src/tagi/providers/detector.py:7-15 (detect_provider) - [2f1566a469905cc9] STRU create_pr L=6 N=2 saved=6 sim=1.00 - src/tagi/providers/github.py:30-35 (create_pr) - src/tagi/providers/gitlab.py:36-41 (create_pr) - [54c9428ffca26dbc] STRU list_groups L=5 N=2 saved=5 sim=1.00 - src/tagi/cli.py:117-121 (list_groups) - src/tagi/cli.py:125-129 (list_cmd) - [9aaebb2fb961d57d] STRU is_authenticated L=4 N=2 saved=4 sim=1.00 - src/tagi/providers/github.py:13-16 (is_authenticated) - src/tagi/providers/gitlab.py:11-14 (is_authenticated) - [180c7709efe6a452] STRU get_auth_status L=4 N=2 saved=4 sim=1.00 - src/tagi/providers/github.py:18-21 (get_auth_status) - src/tagi/providers/gitlab.py:16-19 (get_auth_status) - [9e51ade4e046160f] STRU get_custom_rules L=3 N=2 saved=3 sim=1.00 - src/tagi/heuristics/rules.py:14-16 (get_custom_rules) - src/tagi/heuristics/rules.py:19-21 (get_custom_heuristics) - [ead418deaec12c72] STRU detect_remote L=3 N=2 saved=3 sim=1.00 - src/tagi/providers/github.py:37-39 (detect_remote) - src/tagi/providers/gitlab.py:43-45 (detect_remote) - -REFACTOR[10] (ranked by priority): - [1] ○ extract_function → src/tagi/utils/utils/filter_changes_by_tags_any.py - WHY: 2 occurrences of 21-line block across 1 files — saves 21 lines - FILES: src/tagi/utils/inspect_helpers.py - [2] ○ extract_function → src/tagi/utils/utils/filter_changes_by_tag.py - WHY: 2 occurrences of 12-line block across 2 files — saves 12 lines - FILES: src/tagi/utils/inspect_helpers.py, src/tagi/utils/publish_helpers.py - [3] ○ extract_function → src/tagi/utils/create_pr.py - WHY: 2 occurrences of 10-line block across 1 files — saves 10 lines - FILES: src/tagi/cli.py - [4] ○ extract_function → src/tagi/utils/detect_provider.py - WHY: 2 occurrences of 9-line block across 2 files — saves 9 lines - FILES: src/tagi/cli.py, src/tagi/providers/detector.py - [5] ○ extract_function → src/tagi/providers/utils/create_pr.py +REFACTOR[7] (ranked by priority): + [1] ○ extract_function → src/tagi/cli/utils/_ensure_tag_prefix.py + WHY: 4 occurrences of 8-line block across 4 files — saves 24 lines + FILES: src/tagi/cli/git_operations.py, src/tagi/cli/main.py, src/tagi/cli/publishing_commands.py, src/tagi/cli/utility_commands.py + [2] ○ extract_function → src/tagi/cli/utils/_resolve_send_target.py + WHY: 2 occurrences of 19-line block across 2 files — saves 19 lines + FILES: src/tagi/cli/git_operations.py, src/tagi/cli/main.py + [3] ○ extract_function → src/tagi/cli/utils/_is_known_tag.py + WHY: 2 occurrences of 10-line block across 2 files — saves 10 lines + FILES: src/tagi/cli/git_operations.py, src/tagi/cli/main.py + [4] ○ extract_function → src/tagi/utils/get_token.py + WHY: 2 occurrences of 8-line block across 2 files — saves 8 lines + FILES: src/tagi/executor/git.py, src/tagi/providers/github.py + [5] ○ extract_function → src/tagi/utils/_changes_matching_tag.py WHY: 2 occurrences of 6-line block across 2 files — saves 6 lines - FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py - [6] ○ extract_function → src/tagi/utils/list_groups.py - WHY: 2 occurrences of 5-line block across 1 files — saves 5 lines - FILES: src/tagi/cli.py + FILES: src/tagi/planner/selector.py, src/tagi/utils/change_filter.py + [6] ○ extract_function → src/tagi/utils/__init__.py + WHY: 2 occurrences of 5-line block across 2 files — saves 5 lines + FILES: src/tagi/executor/git.py, src/tagi/providers/base.py [7] ○ extract_function → src/tagi/providers/utils/is_authenticated.py - WHY: 2 occurrences of 4-line block across 2 files — saves 4 lines - FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py - [8] ○ extract_function → src/tagi/providers/utils/get_auth_status.py - WHY: 2 occurrences of 4-line block across 2 files — saves 4 lines + WHY: 2 occurrences of 5-line block across 2 files — saves 5 lines FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py - [9] ○ extract_function → src/tagi/heuristics/utils/get_custom_rules.py - WHY: 2 occurrences of 3-line block across 1 files — saves 3 lines - FILES: src/tagi/heuristics/rules.py - [10] ○ extract_function → src/tagi/providers/utils/detect_remote.py - WHY: 2 occurrences of 3-line block across 2 files — saves 3 lines - FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py - -QUICK_WINS[5] (low risk, high savings — do first): - [1] extract_function saved=21L → src/tagi/utils/utils/filter_changes_by_tags_any.py - FILES: inspect_helpers.py - [2] extract_function saved=12L → src/tagi/utils/utils/filter_changes_by_tag.py - FILES: inspect_helpers.py, publish_helpers.py - [3] extract_function saved=10L → src/tagi/utils/create_pr.py - FILES: cli.py - [4] extract_function saved=9L → src/tagi/utils/detect_provider.py - FILES: cli.py, detector.py - [5] extract_function saved=6L → src/tagi/providers/utils/create_pr.py - FILES: github.py, gitlab.py - -EFFORT_ESTIMATE (total ≈ 2.6h): - medium filter_changes_by_tags_any saved=21L ~42min - easy filter_changes_by_tag saved=12L ~24min - easy create_pr saved=10L ~20min - easy detect_provider saved=9L ~18min - easy create_pr saved=6L ~12min - easy list_groups saved=5L ~10min - easy is_authenticated saved=4L ~8min - easy get_auth_status saved=4L ~8min - easy get_custom_rules saved=3L ~6min - easy detect_remote saved=3L ~6min METRICS-TARGET: - dup_groups: 10 → 0 + dup_groups: 7 → 0 saved_lines: 77 lines recoverable diff --git a/project/evolution.toon.yaml b/project/evolution.toon.yaml index 6d9fa71..7aa6bc3 100644 --- a/project/evolution.toon.yaml +++ b/project/evolution.toon.yaml @@ -1,4 +1,4 @@ -# code2llm/evolution | 225 func | 51f | 2026-09-19 +# code2llm/evolution | 229 func | 53f | 2026-09-19 # generated in 0.00s NEXT[1] (ranked by impact): @@ -11,7 +11,7 @@ RISKS[1]: ⚠ Splitting goal.yaml may break 0 import paths METRICS-TARGET: - CC̄: 2.9 → ≤2.0 + CC̄: 2.8 → ≤2.0 max-CC: 11 → ≤5 god-modules: 1 → 0 high-CC(≥15): 0 → ≤0 @@ -42,4 +42,4 @@ PATTERNS (language parser shared logic): - Standardized FunctionInfo/ClassInfo models HISTORY: - prev CC̄=2.9 → now CC̄=2.9 + prev CC̄=2.8 → now CC̄=2.8 diff --git a/project/flow.mmd b/project/flow.mmd index e8f955f..0857963 100644 --- a/project/flow.mmd +++ b/project/flow.mmd @@ -1,9 +1,17 @@ flowchart TD -%% generated in 0.00s +%% generated in 0.01s %% Entry points (blue) classDef entry fill:#4dabf7,stroke:#1971c2,color:#fff + subgraph CLI + tagi__cli__provider_commands__detect_provider_command["detect_provider_command"] + tagi__cli__provider_commands___current_branch["_current_branch"] + tagi__cli__provider_commands___pr_spec["_pr_spec"] + tagi__cli__provider_commands__create_pr["create_pr"] + tagi__cli__provider_commands__create_mr["create_mr"] + end + subgraph Core src__tagi__config__Config___load_config["_load_config"] src__tagi__config__Config___apply_sections["_apply_sections"] @@ -20,7 +28,7 @@ flowchart TD src__tagi__hooks__run_hook["run_hook"] src__tagi__analyzer__dependency_graph__build_dependency_graph["build_dependency_graph"] src__tagi__analyzer__dependency_graph___LevelOrder__levels["levels"] - ...["+135 more"] + ...["+133 more"] end class src__tagi__config__Config___load_config,src__tagi__config__Config___apply_sections,src__tagi__config__Config__get_tag_for_path,src__tagi__config__Config__get_custom_tags_for_pattern,src__tagi__config__Config__get_tag_color,src__tagi__config__Config__get_heuristics_for_path,src__tagi__config__Config__get_tags_for_path,src__tagi__config__Config__get_tag_description,src__tagi__config__Config__get_template,src__tagi__hooks__install_hooks entry diff --git a/project/index.html b/project/index.html index b80cff4..22dab0c 100644 --- a/project/index.html +++ b/project/index.html @@ -1,5 +1,5 @@ - + @@ -481,7 +481,7 @@

Analysis Results

// Initialize mermaid mermaid.initialize({ startOnLoad: false, theme: 'dark' }); - const files = [{"name": "calls.png", "rel_path": "calls.png", "path": "calls.png", "size": "65.0KB", "icon": "🖼️", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "compact_flow.png", "rel_path": "compact_flow.png", "path": "compact_flow.png", "size": "2.3KB", "icon": "🖼️", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "flow.png", "rel_path": "flow.png", "path": "flow.png", "size": "18.4KB", "icon": "🖼️", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "README.md", "rel_path": "README.md", "path": "README.md", "size": "9.4KB", "icon": "📝", "type": "markdown", "type_name": "Markdown", "content": "# code2llm - Generated Analysis Files\n\n\nThis directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase. # noqa: E501\n\n## 📁 Generated Files Overview\n\nWhen you run `code2llm ./ -f all`, the following files are created:\n\n### 🎯 Core Analysis Files\n\n| File | Format | Purpose | Key Insights |\n|------|--------|---------|--------------|\n| `evolution.toon.yaml` | **YAML** | **📋 Refactoring queue** - Prioritized improvements | 0 refactoring actions needed |\n| `map.toon.yaml` | **YAML** | **🗺️ Structural map + project header** - Modules, imports, exports, signatures, stats, alerts, hotspots, trend | Project architecture overview |\n\n### 🤖 LLM-Ready Documentation\n\n| File | Format | Purpose | Use Case |\n|------|--------|---------|----------|\n| `prompt.txt` | **Text** | **📝 Ready-to-send prompt** - Lists all files with instructions | Attach to LLM conversation as context guide |\n| `context.md` | **Markdown** | **📖 LLM narrative** - Architecture summary | Paste into ChatGPT/Claude for code analysis |\n\n### 📊 Visualizations\n\n| File | Format | Purpose | Description |\n|------|--------|---------|-------------|\n| `flow.mmd` | **Mermaid** | **🔄 Control flow diagram** | Function call paths with complexity styling |\n| `calls.mmd` | **Mermaid** | **📞 Call graph** | Function dependencies (edges only) |\n| `compact_flow.mmd` | **Mermaid** | **📦 Module overview** | Aggregated module-level view |\n\n## 🚀 Quick Start Commands\n\n### Basic Analysis\n```bash\n# Quick health check (TOON format only)\ncode2llm ./ -f toon\n\n# Generate all formats (what created these files)\ncode2llm ./ -f all\n\n# LLM-ready context only\ncode2llm ./ -f context\n```\n\n### Performance Options\n```bash\n# Fast analysis for large projects\ncode2llm ./ -f toon --strategy quick\n\n# Memory-limited analysis\ncode2llm ./ -f all --max-memory 500\n\n# Skip PNG generation (faster)\ncode2llm ./ -f all --no-png\n```\n\n### Refactoring Focus\n```bash\n# Get refactoring recommendations\ncode2llm ./ -f evolution\n\n# Focus on specific code smells\ncode2llm ./ -f toon --refactor --smell god_function\n\n# Data flow analysis\ncode2llm ./ -f flow --data-flow\n```\n\n## 📖 Understanding Each File\n\n### `analysis.toon` - Health Diagnostics\n**Purpose**: Quick overview of code health issues\n**Key sections**:\n- **HEALTH**: Critical issues (🔴) and warnings (🟡)\n- **REFACTOR**: Prioritized refactoring actions\n- **COUPLING**: Module dependencies and potential cycles\n- **LAYERS**: Package complexity metrics\n- **FUNCTIONS**: High-complexity functions (CC ≥ 10)\n- **CLASSES**: Complex classes needing attention\n\n**Example usage**:\n```bash\n# View health issues\ncat analysis.toon | head -30\n\n# Check refactoring priorities\ngrep \"REFACTOR\" analysis.toon\n```\n\n### `evolution.toon.yaml` - Refactoring Queue\n**Purpose**: Step-by-step refactoring plan\n**Key sections**:\n- **NEXT**: Immediate actions to take\n- **RISKS**: Potential breaking changes\n- **METRICS-TARGET**: Success criteria\n\n**Example usage**:\n```bash\n# Get refactoring plan\ncat evolution.toon.yaml\n\n# Track progress\ngrep \"NEXT\" evolution.toon.yaml\n```\n\n### `flow.toon` - Legacy Data Flow Analysis\n**Purpose**: Understand data movement through the system (legacy / explicit opt-in)\n**Key sections**:\n- **PIPELINES**: Data processing chains\n- **CONTRACTS**: Function input/output contracts\n- **SIDE_EFFECTS**: Functions with external impacts\n\n**Example usage**:\n```bash\n# Find data pipelines\ngrep \"PIPELINES\" flow.toon\n\n# Identify side effects\ngrep \"SIDE_EFFECTS\" flow.toon\n```\n\n### `map.toon.yaml` - Structural Map + Project Header\n**Purpose**: High-level architecture overview plus compact project header\n**Key sections**:\n- **MODULES**: All modules with basic stats\n- **IMPORTS**: Dependency relationships\n- **EXPORTS**: Public API surface and signatures\n- **HEADER**: Stats, alerts, hotspots, evolution trend\n\n**Example usage**:\n```bash\n# See project structure\ncat map.toon.yaml | head -50\n\n# Find public APIs\ngrep \"SIGNATURES\" map.toon.yaml\n```\n\n### `project.toon.yaml` - Compact Analysis View\n**Purpose**: Compact module view generated from project.yaml data\n**Status**: Legacy view generated on demand from unified project.yaml\n\n**Example usage**:\n```bash\n# View compact project structure\ncat project.toon.yaml | head -30\n\n# Find largest files\ngrep -E \"^ .*[0-9]{3,}$\" project.toon.yaml | sort -t',' -k2 -n -r | head -10\n```\n\n### `prompt.txt` - Ready-to-Send LLM Prompt\n**Purpose**: Pre-formatted prompt listing all generated files for LLM conversation\n**Generation**: Written when `code2llm` runs with a source path and requests `-f all` (including `--no-chunk`) or `code2logic` # noqa: E501\n**Contents**:\n- **Files section**: Lists all existing generated files with descriptions, including `project.toon.yaml` when generated by `-f all` # noqa: E501\n- **Source files section**: Highlights important source files such as `cli_exports/orchestrator.py`\n- **Missing section**: Shows which files weren't generated (if any)\n- **Task section**: Refactoring brief with concrete execution instructions, not just analysis\n- **Priority Order section**: State-dependent refactoring priorities, starting with blockers and then architecture cleanup # noqa: E501\n- **Requirements section**: Guidelines for suggested changes\n\n**Example usage**:\n```bash\n# View the prompt\ncat prompt.txt\n\n# Copy to clipboard and paste into ChatGPT/Claude\ncat prompt.txt | pbcopy # macOS\ncat prompt.txt | xclip -sel clip # Linux\n```\n\n### `context.md` - LLM Narrative\n**Purpose**: Ready-to-paste context for AI assistants\n**Key sections**:\n- **Overview**: Project statistics\n- **Architecture**: Module breakdown\n- **Entry Points**: Public interfaces\n- **Patterns**: Design patterns detected\n\n**Example usage**:\n```bash\n# Copy to clipboard for LLM\ncat context.md | pbcopy # macOS\ncat context.md | xclip -sel clip # Linux\n\n# Use with Claude/ChatGPT for code analysis\n```\n\n### Visualization Files (`*.mmd`, `*.png`)\n**Purpose**: Visual understanding of code structure\n**Files**:\n- `flow.mmd` - Detailed control flow with complexity colors\n- `calls.mmd` - Simple call graph\n- `compact_flow.mmd` - High-level module view\n- `*.png` - Pre-rendered images\n\n**Example usage**:\n```bash\n# View diagrams\nopen flow.png # macOS\nxdg-open flow.png # Linux\n\n# Edit in Mermaid Live Editor\n# Copy content of .mmd files to https://mermaid.live\n```\n\n## 🔍 Common Analysis Patterns\n\n### 1. Code Health Assessment\n```bash\n# Quick health check\ncode2llm ./ -f toon\ncat analysis.toon | grep -E \"(HEALTH|REFACTOR)\"\n```\n\n### 2. Refactoring Planning\n```bash\n# Get refactoring queue\ncode2llm ./ -f evolution\ncat evolution.toon.yaml\n\n# Focus on specific issues\ncode2llm ./ -f toon --refactor --smell god_function\n```\n\n### 3. LLM Assistance\n```bash\n# Generate context for AI\ncode2llm ./ -f context\ncat context.md\n\n# Use with Claude: \"Based on this context, help me refactor the god modules\"\n```\n\n### 4. Team Documentation\n```bash\n# Generate all docs for team\ncode2llm ./ -f all -o ./docs/\n\n# Create visual diagrams\nopen docs/flow.png\n```\n\n## 📊 Interpreting Metrics\n\n### Complexity Metrics (CC)\n- **🔴 Critical (≥5.0)**: Immediate refactoring needed\n- **🟠 High (3.0-4.9)**: Consider refactoring\n- **🟡 Medium (1.5-2.9)**: Monitor complexity\n- **🟢 Low (0.1-1.4)**: Acceptable\n- **⚪ Basic (0.0)**: Simple functions\n\n### Module Health\n- **GOD Module**: Too large (>500 lines, >20 methods)\n- **HUB**: High fan-out (calls many modules)\n- **FAN-IN**: High incoming dependencies\n- **CYCLES**: Circular dependencies\n\n### Data Flow Indicators\n- **PIPELINE**: Sequential data processing\n- **CONTRACT**: Clear input/output specification\n- **SIDE_EFFECT**: External state modification\n\n## 🛠️ Integration Examples\n\n### CI/CD Pipeline\n```bash\n#!/bin/bash\n# Analyze code quality in CI\ncode2llm ./ -f toon -o ./analysis\nif grep -q \"🔴 GOD\" ./analysis/analysis.toon; then\n echo \"❌ God modules detected\"\n exit 1\nfi\n```\n\n### Pre-commit Hook\n```bash\n#!/bin/sh\n# .git/hooks/pre-commit\ncode2llm ./ -f toon -o ./temp_analysis\nif grep -q \"🔴\" ./temp_analysis/analysis.toon; then\n echo \"⚠️ Critical issues found. Review before committing.\"\nfi\nrm -rf ./temp_analysis\n```\n\n### Documentation Generation\n```bash\n# Generate docs for README\ncode2llm ./ -f context -o ./docs/\necho \"## Architecture\" >> README.md\ncat docs/context.md >> README.md\n```\n\n## 📚 Next Steps\n\n1. **Review `analysis.toon`** - Identify critical issues\n2. **Check `evolution.toon.yaml`** - Plan refactoring priorities\n3. **Use `context.md`** - Get LLM assistance for complex changes\n4. **Reference visualizations** - Understand system architecture\n5. **Track progress** - Re-run analysis after changes\n\n## 🔧 Advanced Usage\n\n### Custom Analysis\n```bash\n# Deep analysis with all insights\ncode2llm ./ -m hybrid -f all --max-depth 15 -v\n\n# Performance-optimized\ncode2llm ./ -m static -f toon --strategy quick\n\n# Refactoring-focused\ncode2llm ./ -f toon,evolution --refactor\n```\n\n### Output Customization\n```bash\n# Separate output directories\ncode2llm ./ -f all -o ./analysis-$(date +%Y%m%d)\n\n# Split YAML into multiple files\ncode2llm ./ -f yaml --split-output\n\n# Separate orphaned functions\ncode2llm ./ -f yaml --separate-orphans\n```\n\n---\n\n**Generated by**: `code2llm ./ -f all --readme` \n**Analysis Date**: 2026-09-19 \n**Total Functions**: 225 \n**Total Classes**: 27 \n**Modules**: 75 \n\nFor more information about code2llm, visit: https://github.com/tom-sapletta/code2llm\n", "is_subdir": false}, {"name": "context.md", "rel_path": "context.md", "path": "context.md", "size": "21.2KB", "icon": "📝", "type": "markdown", "type_name": "Markdown", "content": "# System Architecture Analysis\n\n\n## Overview\n\n- **Project**: /home/tom/github/semcod/tagi\n- **Primary Language**: python\n- **Languages**: python: 66, yaml: 5, txt: 2, toml: 1, shell: 1\n- **Analysis Mode**: static\n- **Total Functions**: 225\n- **Total Classes**: 27\n- **Modules**: 75\n- **Entry Points**: 137\n\n## Architecture by Module\n\n### src.tagi.analyzer.dependency_graph\n- **Functions**: 16\n- **Classes**: 1\n- **File**: `dependency_graph.py`\n\n### src.tagi.config\n- **Functions**: 12\n- **Classes**: 1\n- **File**: `config.py`\n\n### src.tagi.heuristics.metrics\n- **Functions**: 11\n- **File**: `metrics.py`\n\n### src.tagi.providers.koru\n- **Functions**: 10\n- **Classes**: 2\n- **File**: `koru.py`\n\n### src.tagi.composer.formats\n- **Functions**: 9\n- **File**: `formats.py`\n\n### src.tagi.executor.git\n- **Functions**: 9\n- **Classes**: 1\n- **File**: `git.py`\n\n### src.tagi.utils.change_filter\n- **Functions**: 9\n- **File**: `change_filter.py`\n\n### src.tagi.providers.base\n- **Functions**: 8\n- **Classes**: 2\n- **File**: `base.py`\n\n### src.tagi.hooks\n- **Functions**: 7\n- **File**: `hooks.py`\n\n### src.tagi.cli.git_operations\n- **Functions**: 7\n- **File**: `git_operations.py`\n\n### src.tagi.analyzer.metrics\n- **Functions**: 6\n- **Classes**: 1\n- **File**: `metrics.py`\n\n### src.tagi.cli.main\n- **Functions**: 6\n- **File**: `main.py`\n\n### src.tagi.planner.selector\n- **Functions**: 5\n- **File**: `selector.py`\n\n### src.tagi.cli.provider_commands\n- **Functions**: 5\n- **File**: `provider_commands.py`\n\n### src.tagi.cli.core_commands\n- **Functions**: 5\n- **File**: `core_commands.py`\n\n### src.tagi.cli.utility_commands\n- **Functions**: 5\n- **File**: `utility_commands.py`\n\n### src.tagi.providers.gitlab\n- **Functions**: 5\n- **Classes**: 1\n- **File**: `gitlab.py`\n\n### src.tagi.providers.github\n- **Functions**: 5\n- **Classes**: 1\n- **File**: `github.py`\n\n### src.tagi.heuristics.tags\n- **Functions**: 5\n- **File**: `tags.py`\n\n### src.tagi.utils.summary_helpers\n- **Functions**: 5\n- **File**: `summary_helpers.py`\n\n## Key Entry Points\n\nMain execution flows into the system:\n\n### src.tagi.cli.publishing_commands.publish_command\n> Create a PR or MR for the changes.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, typer.Option, typer.Option, _cli._configure_command_logging, console.print, src.tagi.cli.scan_utils.scan_and_tag\n\n### src.tagi.cli.utility_commands.summary_command\n> Generate a comprehensive summary report of all changes.\n- **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, summary_lines.append, summary_lines.append, summary_lines.append, summary_lines.append\n\n### src.tagi.cli.utility_commands.hooks_command\n> Manage git hooks integration for tagi.\n- **Calls**: typer.Argument, typer.Option, typer.Option, typer.Option, None.resolve, src.tagi.hooks.check_hooks_installed, tagi_list_hooks, tagi_install_hooks\n\n### src.tagi.cli.publishing_commands.deploy_command\n> Deploy changes to target environment.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, typer.Option, typer.Option, _cli._configure_command_logging, console.print, src.tagi.cli.scan_utils.scan_and_tag\n\n### src.tagi.cli.inspection_commands.inspect_command\n> Inspect a specific change group.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, console.print, src.tagi.utils.change_filter.resolve_filtered_changes, None.get_tag_description, src.tagi.utils.change_stats.display_statistics_table, src.tagi.cli.display_utils._display_changes\n\n### src.tagi.cli.utility_commands.draft_command\n> Draft a commit message for a change group.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, src.tagi.cli.utility_commands._ensure_tag_prefix, src.tagi.utils.send_helpers.create_change_group, src.tagi.composer.commit_message.generate_commit_message\n\n### src.tagi.cli.inspection_commands.filter_command\n> Filter changes by tags.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, typer.Option, console.print, src.tagi.utils.change_filter.resolve_filtered_changes, src.tagi.utils.change_stats.display_statistics_table, src.tagi.cli.display_utils._display_changes\n\n### src.tagi.cli.core_commands.stats_command\n> Show statistics about changes.\n- **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, src.tagi.utils.change_stats.display_statistics_table, console.print, console.print, src.tagi.utils.change_stats.calculate_tag_statistics\n\n### src.tagi.scanner.status.scan_repo\n> Scan repository for uncommitted changes using git status --porcelain.\n- **Calls**: subprocess.run, None.split, os.path.exists, ValueError, src.tagi.config.load_config, RuntimeError, line.split, None.strip\n\n### src.tagi.cli.inspection_commands.file_command\n> Show detailed information about a specific file.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, console.print, console.print, console.print, console.print, console.print\n\n### src.tagi.ui.design_tokens.DesignTokens.get_css_variables\n> Get CSS variables for specified theme.\n- **Calls**: variables.update, variables.update, variables.update, variables.update, variables.update, variables.update, variables.update, str\n\n### src.tagi.cli.utility_commands.init_command\n> Initialize tagi configuration in the repository.\n- **Calls**: typer.Argument, typer.Option, None.resolve, console.print, config_path.exists, console.print, console.print, example_path.exists\n\n### src.tagi.planner.grouper.group_changes\n> Group changes by their primary tag.\n- **Calls**: defaultdict, grouped.items, sorted, ChangeGroup, groups.append, src.tagi.planner.grouper._get_primary_tag, None.append, None.append\n\n### src.tagi.planner.branch_grouper.group_by_branch\n> Group changes by the git branch they were modified on.\n\nArgs:\n changes: List of changes to group\n repo_path: Path to the git repository\n \nRet\n- **Calls**: GitExecutor, executor.get_current_branch, None.append, subprocess.run, None.split, None.strip, result.stdout.strip, b.strip\n\n### src.tagi.providers.koru.KoruProvider.analyze_deployment_priority\n> Analyze deployment priority using Koru API.\n- **Calls**: self.get_topology, self.get_planfile_tickets, self.get_context_brief, self.run_quality_gates, self._deployment_recommendations, KoruDeploymentPlan, deployment_groups.append, priority_order.append\n\n### src.tagi.providers.koru.KoruProvider._deployment_recommendations\n> Generate recommendations based on Koru context.\n- **Calls**: quality_gates.get, topology.get, recommendations.append, recommendations.append, recommendations.append, recommendations.append, recommendations.append, len\n\n### src.tagi.cli.git_operations.auto_command\n> Automatically scan, order, and send all changes.\n- **Calls**: typer.Argument, typer.Option, typer.Option, typer.Option, typer.Option, src.tagi.cli.main._configure_command_logging, console.print, src.tagi.cli.git_operations.send_command\n\n### src.tagi.cli.provider_commands.create_pr\n> Create a GitHub pull request.\n- **Calls**: src.tagi.utils.detect_provider.get_provider, isinstance, console.print, github_provider.create_pr, src.tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print\n\n### src.tagi.cli.provider_commands.create_mr\n> Create a GitLab merge request.\n- **Calls**: src.tagi.utils.detect_provider.get_provider, isinstance, console.print, gitlab_provider.create_pr, src.tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print\n\n### src.tagi.composer.summary.generate_summary\n> Generate a summary of changes.\n- **Calls**: sum, sum, sum, None.text, LineBuilder, len, src.tagi.utils.risk.total_lines_changed, src.tagi.utils.risk.average_risk\n\n### src.tagi.config.Config._load_config\n> Load configuration from tagi.toml if it exists.\n- **Calls**: self._apply_sections, Path, config_path.exists, print, open, tomli.load, print\n\n### src.tagi.hooks.list_hooks\n> List all git hooks in the repository.\n\nArgs:\n repo_path: Path to the git repository\n \nReturns:\n List of hook names\n- **Calls**: src.tagi.hooks._hooks_dir, hooks_dir.iterdir, sorted, hooks_dir.exists, hook_file.is_file, hooks.append, hook_file.stat\n\n### src.tagi.planner.sorter.group_by_complexity\n> Group changes into complexity tiers (simple, medium, complex).\n\nArgs:\n changes: List of changes to group\n num_groups: Number of complexity group\n- **Calls**: src.tagi.planner.sorter.sort_by_complexity, max, range, len, len, len, groups.append\n\n### src.tagi.cli.core_commands.scan_command\n> Scan repository for uncommitted changes.\n- **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, console.print, src.tagi.cli.display_utils._display_changes_grouped, src.tagi.cli.display_utils._display_changes\n\n### src.tagi.planner.branch_grouper.get_branch_info\n> Get information about all branches in the repository.\n\nArgs:\n repo_path: Path to the git repository\n \nReturns:\n Dictionary mapping branch nam\n- **Calls**: subprocess.run, None.split, None.strip, result.stdout.strip, None.replace, line.strip\n\n### src.tagi.providers.koru.KoruProvider._make_api_request\n> Make request to Koru API.\n- **Calls**: str, httpx.Client, client.post, response.raise_for_status, response.json, logger.warning\n\n### src.tagi.composer.formats.generate_detailed_message\n> Generate a detailed commit message.\n- **Calls**: src.tagi.composer.formats._count_tags, None.text, LineBuilder, src.tagi.composer.formats._detailed_file_lines, len, tag_counts.most_common\n\n### src.tagi.composer.formats.generate_simple_message\n> Generate a simple commit message.\n- **Calls**: len, src.tagi.composer._tags.summary_tag, src.tagi.composer._tags.summary_tag, len, None.join, len\n\n### src.tagi.composer.summary.generate_file_list\n> Generate a formatted list of files.\n- **Calls**: None.text, len, file_lines.append, LineBuilder, None.join, len\n\n### src.tagi.ui.design_tokens.DesignTokens.__init__\n- **Calls**: ColorTokens, SpacingTokens, TypographyTokens, BorderRadiusTokens, ShadowTokens, LayoutTokens\n\n## Process Flows\n\nKey execution flows identified:\n\n### Flow 1: publish_command\n```\npublish_command [src.tagi.cli.publishing_commands]\n```\n\n### Flow 2: summary_command\n```\nsummary_command [src.tagi.cli.utility_commands]\n └─ →> scan_and_tag\n```\n\n### Flow 3: hooks_command\n```\nhooks_command [src.tagi.cli.utility_commands]\n```\n\n### Flow 4: deploy_command\n```\ndeploy_command [src.tagi.cli.publishing_commands]\n```\n\n### Flow 5: inspect_command\n```\ninspect_command [src.tagi.cli.inspection_commands]\n └─ →> resolve_filtered_changes\n └─> _resolve_tag_enums\n └─> _normalize_tag\n └─> _changes_matching_any\n```\n\n### Flow 6: draft_command\n```\ndraft_command [src.tagi.cli.utility_commands]\n └─ →> scan_and_tag\n```\n\n### Flow 7: filter_command\n```\nfilter_command [src.tagi.cli.inspection_commands]\n```\n\n### Flow 8: stats_command\n```\nstats_command [src.tagi.cli.core_commands]\n └─ →> scan_and_tag\n └─ →> display_statistics_table\n```\n\n### Flow 9: scan_repo\n```\nscan_repo [src.tagi.scanner.status]\n └─ →> load_config\n```\n\n### Flow 10: file_command\n```\nfile_command [src.tagi.cli.inspection_commands]\n```\n\n## Key Classes\n\n### src.tagi.config.Config\n> Configuration loaded from tagi.toml.\n- **Methods**: 11\n- **Key Methods**: src.tagi.config.Config.__init__, src.tagi.config.Config._load_config, src.tagi.config.Config._apply_sections, src.tagi.config.Config.get_tag_for_path, src.tagi.config.Config.get_custom_tags_for_pattern, src.tagi.config.Config.get_tag_color, src.tagi.config.Config.get_heuristics_for_path, src.tagi.config.Config.get_tags_for_path, src.tagi.config.Config.get_tag_description, src.tagi.config.Config.get_template\n\n### src.tagi.providers.koru.KoruProvider\n> Integration with Koru API for deployment analysis.\n- **Methods**: 10\n- **Key Methods**: src.tagi.providers.koru.KoruProvider.__init__, src.tagi.providers.koru.KoruProvider._make_api_request, src.tagi.providers.koru.KoruProvider.get_topology, src.tagi.providers.koru.KoruProvider.get_planfile_tickets, src.tagi.providers.koru.KoruProvider.run_quality_gates, src.tagi.providers.koru.KoruProvider.get_context_brief, src.tagi.providers.koru.KoruProvider._deployment_recommendations, src.tagi.providers.koru.KoruProvider.analyze_deployment_priority, src.tagi.providers.koru.KoruProvider.deploy_group, src.tagi.providers.koru.KoruProvider.is_available\n\n### src.tagi.executor.git.GitExecutor\n> Executor for git commands.\n- **Methods**: 9\n- **Key Methods**: src.tagi.executor.git.GitExecutor.__init__, src.tagi.executor.git.GitExecutor._run_command, src.tagi.executor.git.GitExecutor.add, src.tagi.executor.git.GitExecutor.commit, src.tagi.executor.git.GitExecutor.push, src.tagi.executor.git.GitExecutor.status, src.tagi.executor.git.GitExecutor.get_current_branch, src.tagi.executor.git.GitExecutor.get_remote_url, src.tagi.executor.git.GitExecutor.has_staged_changes\n\n### src.tagi.providers.base.BaseProvider\n> Base class for Git hosting providers.\n- **Methods**: 8\n- **Key Methods**: src.tagi.providers.base.BaseProvider.__init__, src.tagi.providers.base.BaseProvider.is_authenticated, src.tagi.providers.base.BaseProvider.get_auth_status, src.tagi.providers.base.BaseProvider.create_pr, src.tagi.providers.base.BaseProvider.detect_remote, src.tagi.providers.base.BaseProvider._run_command, src.tagi.providers.base.BaseProvider._get_git_remote_url, src.tagi.providers.base.BaseProvider._check_git_remote_for_provider\n- **Inherits**: ABC\n\n### src.tagi.providers.gitlab.GitLabProvider\n> GitLab provider using glab CLI.\n- **Methods**: 5\n- **Key Methods**: src.tagi.providers.gitlab.GitLabProvider.is_authenticated, src.tagi.providers.gitlab.GitLabProvider.get_auth_status, src.tagi.providers.gitlab.GitLabProvider.get_configured_host, src.tagi.providers.gitlab.GitLabProvider.create_pr, src.tagi.providers.gitlab.GitLabProvider.detect_remote\n- **Inherits**: BaseProvider\n\n### src.tagi.providers.github.GitHubProvider\n> GitHub provider using gh CLI.\n- **Methods**: 5\n- **Key Methods**: src.tagi.providers.github.GitHubProvider.is_authenticated, src.tagi.providers.github.GitHubProvider.get_auth_status, src.tagi.providers.github.GitHubProvider.get_token, src.tagi.providers.github.GitHubProvider.create_pr, src.tagi.providers.github.GitHubProvider.detect_remote\n- **Inherits**: BaseProvider\n\n### src.tagi.analyzer.metrics.MetricsCollector\n> Collect and analyze metrics about changes.\n- **Methods**: 4\n- **Key Methods**: src.tagi.analyzer.metrics.MetricsCollector.__init__, src.tagi.analyzer.metrics.MetricsCollector.collect, src.tagi.analyzer.metrics.MetricsCollector.to_json, src.tagi.analyzer.metrics.MetricsCollector.save\n\n### src.tagi.llm.llx_adapter.LlxAdapter\n> Adapter for LLX library for optional LLM integration.\n- **Methods**: 4\n- **Key Methods**: src.tagi.llm.llx_adapter.LlxAdapter.__init__, src.tagi.llm.llx_adapter.LlxAdapter.is_available, src.tagi.llm.llx_adapter.LlxAdapter.improve_message, src.tagi.llm.llx_adapter.LlxAdapter.improve_description\n\n### src.tagi.executor.publish.PublishExecutor\n> Executor for publishing changes.\n- **Methods**: 4\n- **Key Methods**: src.tagi.executor.publish.PublishExecutor.__init__, src.tagi.executor.publish.PublishExecutor.stage_and_commit, src.tagi.executor.publish.PublishExecutor.publish, src.tagi.executor.publish.PublishExecutor.dry_run\n\n### src.tagi.utils.line_builder.LineBuilder\n> Single place where report line lists are created and mutated.\n- **Methods**: 4\n- **Key Methods**: src.tagi.utils.line_builder.LineBuilder.__init__, src.tagi.utils.line_builder.LineBuilder.add, src.tagi.utils.line_builder.LineBuilder.as_list, src.tagi.utils.line_builder.LineBuilder.text\n\n### src.tagi.analyzer.dependency_graph._LevelOrder\n> Level-by-level topological order over a dependency graph (Kahn's algorithm).\n- **Methods**: 3\n- **Key Methods**: src.tagi.analyzer.dependency_graph._LevelOrder.__init__, src.tagi.analyzer.dependency_graph._LevelOrder.levels, src.tagi.analyzer.dependency_graph._LevelOrder._drain_level\n\n### src.tagi.ui.design_tokens.DesignTokens\n> Main design tokens container.\n- **Methods**: 3\n- **Key Methods**: src.tagi.ui.design_tokens.DesignTokens.__init__, src.tagi.ui.design_tokens.DesignTokens.get_css_variables, src.tagi.ui.design_tokens.DesignTokens.get_css_string\n\n### src.tagi.models.change.ChangeMetrics\n> Numerical metrics for change analysis.\n- **Methods**: 1\n- **Key Methods**: src.tagi.models.change.ChangeMetrics.to_vector\n\n### src.tagi.models.plan.PlanStep\n> A single step in an execution plan.\n- **Methods**: 0\n\n### src.tagi.models.plan.Plan\n> An execution plan for shipping changes.\n- **Methods**: 0\n\n### src.tagi.models.change.ChangeType\n> Type of git change.\n- **Methods**: 0\n- **Inherits**: str, Enum\n\n### src.tagi.models.change.Tag\n> Hashtag categories for changes.\n- **Methods**: 0\n- **Inherits**: str, Enum\n\n### src.tagi.models.change.Change\n> Represents a single file change.\n- **Methods**: 0\n\n### src.tagi.models.group.ChangeGroup\n> Group of related changes.\n- **Methods**: 0\n\n### src.tagi.providers.base.PrSpec\n> Pull/merge request parameters.\n- **Methods**: 0\n\n## Data Transformation Functions\n\nKey functions that process and transform data:\n\n### src.tagi.cli.display_utils._format_tags\n> Format tags for display with descriptions if available.\n- **Output to**: None.join, tag_strings.append, config.get_tag_description\n\n### src.tagi.scanner.status.parse_status\n> Parse git status code to ChangeType.\n\n## Behavioral Patterns\n\n### recursion__dfs_visit\n- **Type**: recursion\n- **Confidence**: 0.90\n- **Functions**: src.tagi.analyzer.dependency_graph._dfs_visit\n\n### recursion__longest_path_length\n- **Type**: recursion\n- **Confidence**: 0.90\n- **Functions**: src.tagi.analyzer.dependency_graph._longest_path_length\n\n## Public API Surface\n\nFunctions exposed as public API (no underscore prefix):\n\n- `src.tagi.cli.publishing_commands.publish_command` - 36 calls\n- `src.tagi.cli.utility_commands.summary_command` - 28 calls\n- `src.tagi.cli.git_operations.send_command` - 26 calls\n- `src.tagi.cli.utility_commands.hooks_command` - 26 calls\n- `src.tagi.cli.publishing_commands.deploy_command` - 22 calls\n- `src.tagi.cli.inspection_commands.inspect_command` - 17 calls\n- `src.tagi.cli.utility_commands.draft_command` - 17 calls\n- `src.tagi.cli.inspection_commands.filter_command` - 16 calls\n- `src.tagi.cli.core_commands.stats_command` - 15 calls\n- `src.tagi.scanner.status.scan_repo` - 15 calls\n- `src.tagi.utils.logger.setup_logger` - 15 calls\n- `src.tagi.cli.inspection_commands.file_command` - 14 calls\n- `src.tagi.ui.design_tokens.DesignTokens.get_css_variables` - 14 calls\n- `src.tagi.cli.utility_commands.init_command` - 13 calls\n- `src.tagi.utils.change_stats.display_statistics_table` - 12 calls\n- `src.tagi.planner.grouper.group_changes` - 10 calls\n- `src.tagi.planner.branch_grouper.group_by_branch` - 10 calls\n- `src.tagi.providers.koru.KoruProvider.analyze_deployment_priority` - 10 calls\n- `src.tagi.cli.git_operations.auto_command` - 8 calls\n- `src.tagi.cli.provider_commands.create_pr` - 8 calls\n- `src.tagi.cli.provider_commands.create_mr` - 8 calls\n- `src.tagi.composer.summary.generate_summary` - 8 calls\n- `src.tagi.composer.commit_message.generate_commit_message` - 8 calls\n- `src.tagi.hooks.list_hooks` - 7 calls\n- `src.tagi.planner.sorter.group_by_complexity` - 7 calls\n- `src.tagi.cli.core_commands.scan_command` - 7 calls\n- `src.tagi.scanner.files.count_lines_changed` - 7 calls\n- `src.tagi.utils.change_filter.resolve_filtered_changes` - 7 calls\n- `src.tagi.planner.branch_grouper.get_branch_info` - 6 calls\n- `src.tagi.cli.scan_utils.scan_and_tag` - 6 calls\n- `src.tagi.heuristics.metrics.calculate_metrics` - 6 calls\n- `src.tagi.composer.formats.generate_detailed_message` - 6 calls\n- `src.tagi.composer.formats.generate_simple_message` - 6 calls\n- `src.tagi.composer.summary.generate_file_list` - 6 calls\n- `src.tagi.hooks.install_hooks` - 5 calls\n- `src.tagi.hooks.run_hook` - 5 calls\n- `src.tagi.analyzer.metrics.MetricsCollector.collect` - 5 calls\n- `src.tagi.analyzer.metrics.generate_report` - 5 calls\n- `src.tagi.planner.preview.preview_plan` - 5 calls\n- `src.tagi.heuristics.metrics.calculate_vector_distance` - 5 calls\n\n## System Interactions\n\nHow components interact:\n\n```mermaid\ngraph TD\n publish_command --> Argument\n publish_command --> Option\n summary_command --> Argument\n summary_command --> Option\n summary_command --> print\n summary_command --> scan_and_tag\n summary_command --> append\n hooks_command --> Argument\n hooks_command --> Option\n hooks_command --> resolve\n deploy_command --> Argument\n deploy_command --> Option\n inspect_command --> Argument\n inspect_command --> Option\n inspect_command --> print\n inspect_command --> resolve_filtered_cha\n draft_command --> Argument\n draft_command --> Option\n draft_command --> print\n draft_command --> scan_and_tag\n filter_command --> Argument\n filter_command --> Option\n filter_command --> print\n stats_command --> Argument\n stats_command --> Option\n stats_command --> print\n stats_command --> scan_and_tag\n stats_command --> display_statistics_t\n scan_repo --> run\n scan_repo --> split\n```\n\n## Reverse Engineering Guidelines\n\n1. **Entry Points**: Start analysis from the entry points listed above\n2. **Core Logic**: Focus on classes with many methods\n3. **Data Flow**: Follow data transformation functions\n4. **Process Flows**: Use the flow diagrams for execution paths\n5. **API Surface**: Public API functions reveal the interface\n\n## Context for LLM\n\nMaintain the identified architectural patterns and public API surface when suggesting changes.", "is_subdir": false}, {"name": "calls.mmd", "rel_path": "calls.mmd", "path": "calls.mmd", "size": "25.3KB", "icon": "📈", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart LR\n%% generated in 0.00s\n subgraph src__tagi\n src__tagi__analyzer__dependency_graph__detect_cycles["detect_cycles"]\n src__tagi__cli__main___is_known_tag["_is_known_tag"]\n src__tagi__providers__gitlab__GitLabProvider__get_auth_status["get_auth_status"]\n src__tagi__composer__formats__generate_simple_message["generate_simple_message"]\n src__tagi__cli__inspection_commands__filter_command["filter_command"]\n src__tagi__cli__provider_commands___pr_spec["_pr_spec"]\n src__tagi__heuristics__metrics___calculate_complexity["_calculate_complexity"]\n src__tagi__hooks__install_hooks["install_hooks"]\n src__tagi__cli__core_commands__list_groups_command["list_groups_command"]\n src__tagi__cli__git_operations___ensure_tag_prefix["_ensure_tag_prefix"]\n src__tagi__cli__git_operations___is_known_tag["_is_known_tag"]\n src__tagi__heuristics__tags___custom_config_tags["_custom_config_tags"]\n src__tagi__heuristics__rules__get_custom_heuristics["get_custom_heuristics"]\n src__tagi__analyzer__dependency_graph___dfs_visit["_dfs_visit"]\n src__tagi__utils__send_helpers__create_change_group["create_change_group"]\n src__tagi__providers__utils__pr__build_pr_command["build_pr_command"]\n src__tagi__cli__provider_commands__create_mr["create_mr"]\n src__tagi__utils__change_filter___resolve_tag_enums["_resolve_tag_enums"]\n src__tagi__heuristics__tags___tag_change["_tag_change"]\n src__tagi__cli__provider_commands___current_branch["_current_branch"]\n src__tagi__utils__change_filter___changes_matching_tag["_changes_matching_tag"]\n src__tagi__providers__utils__pr__execute_pr_command["execute_pr_command"]\n src__tagi__scanner__diff__get_diff["get_diff"]\n src__tagi__cli__inspection_commands__file_command["file_command"]\n src__tagi__cli__main__setup_logging["setup_logging"]\n src__tagi__config__load_config["load_config"]\n src__tagi__heuristics__scoring___tag_risk_weight["_tag_risk_weight"]\n src__tagi__cli__git_operations___execute_git_operations["_execute_git_operations"]\n src__tagi__composer___tags__all_tag_values["all_tag_values"]\n src__tagi__heuristics__tags__apply_path_tags["apply_path_tags"]\n src__tagi__analyzer__dependency_graph__build_dependency_graph["build_dependency_graph"]\n src__tagi__utils__publish_helpers__create_publish_group["create_publish_group"]\n src__tagi__providers__github__GitHubProvider__is_authenticated["is_authenticated"]\n src__tagi__composer__formats__generate_conventional_message["generate_conventional_message"]\n src__tagi__analyzer__dependency_graph___collect_import_names["_collect_import_names"]\n src__tagi__analyzer__dependency_graph__get_critical_path["get_critical_path"]\n src__tagi__composer___templates__render_template["render_template"]\n src__tagi__utils__change_filter___changes_matching_all["_changes_matching_all"]\n src__tagi__cli__main___resolve_send_target["_resolve_send_target"]\n src__tagi__cli__utility_commands___ensure_tag_prefix["_ensure_tag_prefix"]\n src__tagi__planner__grouper___get_primary_tag["_get_primary_tag"]\n src__tagi__cli__display_utils___display_changes_grouped["_display_changes_grouped"]\n src__tagi__cli__utility_commands__hooks_command["hooks_command"]\n src__tagi__cli__inspection_commands__inspect_command["inspect_command"]\n src__tagi__utils__change_filter__resolve_filtered_changes["resolve_filtered_changes"]\n src__tagi__scanner__status__scan_repo["scan_repo"]\n src__tagi__heuristics__scoring__calculate_risk_score["calculate_risk_score"]\n src__tagi__cli__provider_commands__detect_provider_command["detect_provider_command"]\n src__tagi__cli__scan_utils__scan_and_tag["scan_and_tag"]\n src__tagi__cli__core_commands___do_list_groups["_do_list_groups"]\n src__tagi__cli__publishing_commands___ensure_tag_prefix["_ensure_tag_prefix"]\n src__tagi__analyzer__dependency_graph___find_longest_start["_find_longest_start"]\n src__tagi__hooks___pre_commit_hook["_pre_commit_hook"]\n src__tagi__cli__display_utils___display_groups["_display_groups"]\n src__tagi__composer__formats___commit_type["_commit_type"]\n src__tagi__heuristics__metrics___calculate_dependency_depth["_calculate_dependency_depth"]\n src__tagi__composer__summary__generate_summary["generate_summary"]\n src__tagi__config__Config__should_ignore["should_ignore"]\n src__tagi__heuristics__metrics___calculate_impact["_calculate_impact"]\n src__tagi__providers__gitlab__GitLabProvider__create_pr["create_pr"]\n src__tagi__heuristics__metrics___extension_complexity_weight["_extension_complexity_weight"]\n src__tagi__hooks__uninstall_hooks["uninstall_hooks"]\n src__tagi__utils__change_filter___changes_matching_any["_changes_matching_any"]\n src__tagi__composer__commit_message___improve_with_llm["_improve_with_llm"]\n src__tagi__hooks__list_hooks["list_hooks"]\n src__tagi__analyzer__dependency_graph__analyze_python_imports["analyze_python_imports"]\n src__tagi__utils__logger__setup_logger["setup_logger"]\n src__tagi__cli__publishing_commands__publish_command["publish_command"]\n src__tagi__analyzer__dependency_graph___mark["_mark"]\n src__tagi__analyzer__dependency_graph___reconstruct_critical_path["_reconstruct_critical_path"]\n src__tagi__utils__change_filter__filter_changes_by_tags_any["filter_changes_by_tags_any"]\n src__tagi__hooks___hooks_dir["_hooks_dir"]\n src__tagi__cli__utility_commands__summary_command["summary_command"]\n src__tagi__composer__formats__generate_detailed_message["generate_detailed_message"]\n src__tagi__heuristics__metrics___extension_impact_weight["_extension_impact_weight"]\n src__tagi__composer__formats__generate_oneline_message["generate_oneline_message"]\n src__tagi__cli__main__detect_provider["detect_provider"]\n src__tagi__composer__formats___count_tags["_count_tags"]\n src__tagi__hooks__check_hooks_installed["check_hooks_installed"]\n src__tagi__heuristics__tags___size_tags["_size_tags"]\n src__tagi__heuristics__rules___get_config_attr["_get_config_attr"]\n src__tagi__analyzer__dependency_graph___longest_path_length["_longest_path_length"]\n src__tagi__cli__main___configure_command_logging["_configure_command_logging"]\n src__tagi__cli__utility_commands__draft_command["draft_command"]\n src__tagi__composer___tags__summary_tag["summary_tag"]\n src__tagi__utils__risk__average_risk["average_risk"]\n src__tagi__composer__formats___describe_changes["_describe_changes"]\n src__tagi__providers__utils__auth__is_authenticated_from_result["is_authenticated_from_result"]\n src__tagi__cli__git_operations__send_command["send_command"]\n src__tagi__hooks__run_hook["run_hook"]\n src__tagi__planner__selector__select_changes_by_tag["select_changes_by_tag"]\n src__tagi__heuristics__metrics__calculate_metrics["calculate_metrics"]\n src__tagi__scanner__status__parse_status["parse_status"]\n src__tagi__heuristics__metrics___calculate_stability["_calculate_stability"]\n src__tagi__cli__display_utils___format_tags["_format_tags"]\n src__tagi__cli__git_operations___resolve_send_target["_resolve_send_target"]\n src__tagi__planner__grouper__group_changes["group_changes"]\n src__tagi__heuristics__metrics___calculate_test_impact["_calculate_test_impact"]\n src__tagi__utils__detect_provider__get_provider["get_provider"]\n src__tagi__heuristics__tags__apply_tags["apply_tags"]\n src__tagi__providers__utils__auth__get_auth_status_from_result["get_auth_status_from_result"]\n src__tagi__utils__change_filter__filter_changes_by_tag["filter_changes_by_tag"]\n src__tagi__providers__github__GitHubProvider__get_auth_status["get_auth_status"]\n src__tagi__scanner__files__count_lines_changed["count_lines_changed"]\n src__tagi__composer__formats___detailed_file_lines["_detailed_file_lines"]\n src__tagi__cli__display_utils___display_changes["_display_changes"]\n src__tagi__planner__grouper__group_by_tag["group_by_tag"]\n src__tagi__analyzer__metrics__MetricsCollector__collect["collect"]\n src__tagi__utils__risk__total_lines_changed["total_lines_changed"]\n src__tagi__cli__core_commands__list_command["list_command"]\n src__tagi__providers__gitlab__GitLabProvider__is_authenticated["is_authenticated"]\n src__tagi__planner__sorter__sort_by_complexity["sort_by_complexity"]\n src__tagi__cli__provider_commands__create_pr["create_pr"]\n src__tagi__analyzer__dependency_graph___cycle_from["_cycle_from"]\n src__tagi__utils__change_stats__calculate_tag_statistics["calculate_tag_statistics"]\n src__tagi__utils__publish_helpers__detect_and_get_provider["detect_and_get_provider"]\n src__tagi__cli__core_commands__stats_command["stats_command"]\n src__tagi__composer__commit_message__generate_commit_message["generate_commit_message"]\n src__tagi__cli__publishing_commands__deploy_command["deploy_command"]\n src__tagi__utils__summary_helpers__build_statistics_section["build_statistics_section"]\n src__tagi__cli__main___ensure_tag_prefix["_ensure_tag_prefix"]\n src__tagi__utils__change_filter__filter_changes_by_tags_all["filter_changes_by_tags_all"]\n src__tagi__cli__core_commands__scan_command["scan_command"]\n src__tagi__composer___tags__all_tags["all_tags"]\n src__tagi__heuristics__scoring___lines_risk_weight["_lines_risk_weight"]\n src__tagi__cli__git_operations__auto_command["auto_command"]\n src__tagi__cli__git_operations___filter_by_tag["_filter_by_tag"]\n src__tagi__utils__change_filter___normalize_tag["_normalize_tag"]\n src__tagi__utils__detect_provider__detect_git_provider["detect_git_provider"]\n src__tagi__heuristics__rules__get_custom_rules["get_custom_rules"]\n src__tagi__analyzer__dependency_graph___next_critical_node["_next_critical_node"]\n src__tagi__composer___tags__infer_scope["infer_scope"]\n src__tagi__planner__sorter__group_by_complexity["group_by_complexity"]\n src__tagi__utils__change_stats__display_statistics_table["display_statistics_table"]\n src__tagi__providers__github__GitHubProvider__create_pr["create_pr"]\n src__tagi__heuristics__scoring___change_type_risk_weight["_change_type_risk_weight"]\n end\n src__tagi__hooks___pre_commit_hook --> src__tagi__hooks___hooks_dir\n src__tagi__hooks__install_hooks --> src__tagi__hooks___pre_commit_hook\n src__tagi__hooks__install_hooks --> src__tagi__hooks___hooks_dir\n src__tagi__hooks__uninstall_hooks --> src__tagi__hooks___pre_commit_hook\n src__tagi__hooks__check_hooks_installed --> src__tagi__hooks___pre_commit_hook\n src__tagi__hooks__list_hooks --> src__tagi__hooks___hooks_dir\n src__tagi__hooks__run_hook --> src__tagi__hooks___hooks_dir\n src__tagi__analyzer__dependency_graph__analyze_python_imports --> src__tagi__analyzer__dependency_graph___collect_import_names\n src__tagi__analyzer__dependency_graph__build_dependency_graph --> src__tagi__analyzer__dependency_graph__analyze_python_imports\n src__tagi__analyzer__dependency_graph___dfs_visit --> src__tagi__analyzer__dependency_graph___mark\n src__tagi__analyzer__dependency_graph___dfs_visit --> src__tagi__analyzer__dependency_graph___cycle_from\n src__tagi__analyzer__dependency_graph__detect_cycles --> src__tagi__analyzer__dependency_graph___dfs_visit\n src__tagi__analyzer__dependency_graph___find_longest_start --> src__tagi__analyzer__dependency_graph___longest_path_length\n src__tagi__analyzer__dependency_graph___reconstruct_critical_path --> src__tagi__analyzer__dependency_graph___next_critical_node\n src__tagi__analyzer__dependency_graph__get_critical_path --> src__tagi__analyzer__dependency_graph___find_longest_start\n src__tagi__analyzer__dependency_graph__get_critical_path --> src__tagi__analyzer__dependency_graph___reconstruct_critical_path\n src__tagi__analyzer__metrics__MetricsCollector__collect --> src__tagi__utils__risk__total_lines_changed\n src__tagi__analyzer__metrics__MetricsCollector__collect --> src__tagi__utils__risk__average_risk\n src__tagi__planner__sorter__group_by_complexity --> src__tagi__planner__sorter__sort_by_complexity\n src__tagi__planner__grouper__group_changes --> src__tagi__planner__grouper___get_primary_tag\n src__tagi__planner__grouper__group_changes --> src__tagi__utils__risk__total_lines_changed\n src__tagi__planner__grouper__group_changes --> src__tagi__utils__risk__average_risk\n src__tagi__planner__grouper__group_by_tag --> src__tagi__planner__selector__select_changes_by_tag\n src__tagi__cli__git_operations___is_known_tag --> src__tagi__cli__git_operations___ensure_tag_prefix\n src__tagi__cli__git_operations___resolve_send_target --> src__tagi__cli__git_operations___is_known_tag\n src__tagi__cli__git_operations___filter_by_tag --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__cli__git_operations___filter_by_tag --> src__tagi__cli__git_operations___ensure_tag_prefix\n src__tagi__cli__git_operations___execute_git_operations --> src__tagi__utils__detect_provider__get_provider\n src__tagi__cli__git_operations__send_command --> src__tagi__cli__git_operations___resolve_send_target\n src__tagi__cli__git_operations__auto_command --> src__tagi__cli__main___configure_command_logging\n src__tagi__cli__git_operations__auto_command --> src__tagi__cli__git_operations__send_command\n src__tagi__cli__inspection_commands__inspect_command --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__cli__inspection_commands__inspect_command --> src__tagi__utils__change_stats__display_statistics_table\n src__tagi__cli__inspection_commands__inspect_command --> src__tagi__cli__display_utils___display_changes\n src__tagi__cli__inspection_commands__inspect_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__inspection_commands__filter_command --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__cli__inspection_commands__filter_command --> src__tagi__utils__change_stats__display_statistics_table\n src__tagi__cli__inspection_commands__filter_command --> src__tagi__cli__display_utils___display_changes\n src__tagi__cli__inspection_commands__filter_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__inspection_commands__file_command --> src__tagi__scanner__diff__get_diff\n src__tagi__cli__provider_commands__detect_provider_command --> src__tagi__utils__detect_provider__get_provider\n src__tagi__cli__provider_commands___pr_spec --> src__tagi__cli__provider_commands___current_branch\n src__tagi__cli__provider_commands__create_pr --> src__tagi__utils__detect_provider__get_provider\n src__tagi__cli__provider_commands__create_pr --> src__tagi__cli__provider_commands___pr_spec\n src__tagi__cli__provider_commands__create_mr --> src__tagi__utils__detect_provider__get_provider\n src__tagi__cli__provider_commands__create_mr --> src__tagi__cli__provider_commands___pr_spec\n src__tagi__cli__core_commands__scan_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__core_commands__scan_command --> src__tagi__cli__display_utils___display_changes_grouped\n src__tagi__cli__core_commands__scan_command --> src__tagi__cli__display_utils___display_changes\n src__tagi__cli__core_commands__list_groups_command --> src__tagi__cli__core_commands___do_list_groups\n src__tagi__cli__core_commands__list_command --> src__tagi__cli__core_commands___do_list_groups\n src__tagi__cli__core_commands___do_list_groups --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__core_commands___do_list_groups --> src__tagi__utils__change_stats__calculate_tag_statistics\n src__tagi__cli__core_commands___do_list_groups --> src__tagi__utils__change_stats__display_statistics_table\n src__tagi__cli__core_commands__stats_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__core_commands__stats_command --> src__tagi__utils__change_stats__display_statistics_table\n src__tagi__cli__core_commands__stats_command --> src__tagi__utils__change_stats__calculate_tag_statistics\n src__tagi__cli__display_utils___display_changes --> src__tagi__cli__display_utils___format_tags\n src__tagi__cli__display_utils___display_groups --> src__tagi__cli__display_utils___format_tags\n src__tagi__cli__display_utils___display_changes_grouped --> src__tagi__cli__display_utils___display_groups\n src__tagi__cli__main__setup_logging --> src__tagi__utils__logger__setup_logger\n src__tagi__cli__main___configure_command_logging --> src__tagi__utils__logger__setup_logger\n src__tagi__cli__main___is_known_tag --> src__tagi__cli__main___ensure_tag_prefix\n src__tagi__cli__main___resolve_send_target --> src__tagi__cli__main___is_known_tag\n src__tagi__cli__main__detect_provider --> src__tagi__cli__provider_commands__detect_provider_command\n src__tagi__cli__publishing_commands__publish_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__publishing_commands__publish_command --> src__tagi__cli__publishing_commands___ensure_tag_prefix\n src__tagi__cli__publishing_commands__publish_command --> src__tagi__utils__publish_helpers__create_publish_group\n src__tagi__cli__publishing_commands__deploy_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__publishing_commands__deploy_command --> src__tagi__cli__publishing_commands___ensure_tag_prefix\n src__tagi__cli__utility_commands__summary_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__utility_commands__summary_command --> src__tagi__utils__change_stats__calculate_tag_statistics\n src__tagi__cli__utility_commands__hooks_command --> src__tagi__hooks__check_hooks_installed\n src__tagi__cli__utility_commands__draft_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__utility_commands__draft_command --> src__tagi__cli__utility_commands___ensure_tag_prefix\n src__tagi__cli__utility_commands__draft_command --> src__tagi__utils__send_helpers__create_change_group\n src__tagi__cli__utility_commands__draft_command --> src__tagi__composer__commit_message__generate_commit_message\n src__tagi__providers__gitlab__GitLabProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result\n src__tagi__providers__gitlab__GitLabProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result\n src__tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command\n src__tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command\n src__tagi__providers__github__GitHubProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result\n src__tagi__providers__github__GitHubProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result\n src__tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command\n src__tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command\n src__tagi__scanner__status__scan_repo --> src__tagi__config__load_config\n src__tagi__scanner__status__scan_repo --> src__tagi__config__Config__should_ignore\n src__tagi__scanner__status__scan_repo --> src__tagi__scanner__status__parse_status\n src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___lines_risk_weight\n src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___tag_risk_weight\n src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___change_type_risk_weight\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_complexity\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_impact\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_stability\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_test_impact\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_dependency_depth\n src__tagi__heuristics__metrics___calculate_complexity --> src__tagi__heuristics__metrics___extension_complexity_weight\n src__tagi__heuristics__metrics___calculate_impact --> src__tagi__heuristics__metrics___extension_impact_weight\n src__tagi__heuristics__tags__apply_tags --> src__tagi__config__load_config\n src__tagi__heuristics__tags__apply_tags --> src__tagi__heuristics__tags___tag_change\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags___custom_config_tags\n src__tagi__heuristics__tags___tag_change --> src__tagi__scanner__files__count_lines_changed\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__metrics__calculate_metrics\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__scoring__calculate_risk_score\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags__apply_path_tags\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags___size_tags\n src__tagi__heuristics__rules___get_config_attr --> src__tagi__config__load_config\n src__tagi__heuristics__rules__get_custom_rules --> src__tagi__heuristics__rules___get_config_attr\n src__tagi__heuristics__rules__get_custom_heuristics --> src__tagi__heuristics__rules___get_config_attr\n src__tagi__composer__formats__generate_conventional_message --> src__tagi__composer__formats___commit_type\n src__tagi__composer__formats__generate_conventional_message --> src__tagi__composer___tags__infer_scope\n src__tagi__composer__formats__generate_conventional_message --> src__tagi__composer__formats___describe_changes\n src__tagi__composer__formats__generate_conventional_message --> src__tagi__composer___tags__all_tags\n src__tagi__composer__formats__generate_detailed_message --> src__tagi__composer__formats___count_tags\n src__tagi__composer__formats__generate_detailed_message --> src__tagi__composer__formats___detailed_file_lines\n src__tagi__composer__formats__generate_simple_message --> src__tagi__composer___tags__summary_tag\n src__tagi__composer__formats__generate_oneline_message --> src__tagi__composer___tags__summary_tag\n src__tagi__composer__summary__generate_summary --> src__tagi__utils__risk__total_lines_changed\n src__tagi__composer__summary__generate_summary --> src__tagi__utils__risk__average_risk\n src__tagi__composer__commit_message__generate_commit_message --> src__tagi__composer___templates__render_template\n src__tagi__composer__commit_message__generate_commit_message --> src__tagi__composer__commit_message___improve_with_llm\n src__tagi__composer__commit_message__generate_commit_message --> src__tagi__composer___tags__summary_tag\n src__tagi__composer__commit_message__generate_commit_message --> src__tagi__config__load_config\n src__tagi__composer___tags__all_tag_values --> src__tagi__composer___tags__all_tags\n src__tagi__composer___tags__summary_tag --> src__tagi__composer___tags__all_tags\n src__tagi__utils__summary_helpers__build_statistics_section --> src__tagi__utils__risk__total_lines_changed\n src__tagi__utils__summary_helpers__build_statistics_section --> src__tagi__utils__risk__average_risk\n src__tagi__utils__publish_helpers__detect_and_get_provider --> src__tagi__utils__detect_provider__get_provider\n src__tagi__utils__publish_helpers__create_publish_group --> src__tagi__utils__risk__total_lines_changed\n src__tagi__utils__publish_helpers__create_publish_group --> src__tagi__utils__risk__average_risk\n src__tagi__utils__detect_provider__get_provider --> src__tagi__utils__detect_provider__detect_git_provider\n src__tagi__utils__send_helpers__create_change_group --> src__tagi__utils__risk__total_lines_changed\n src__tagi__utils__send_helpers__create_change_group --> src__tagi__utils__risk__average_risk\n src__tagi__utils__change_stats__calculate_tag_statistics --> src__tagi__utils__risk__total_lines_changed\n src__tagi__utils__change_stats__calculate_tag_statistics --> src__tagi__utils__risk__average_risk\n src__tagi__utils__change_filter___resolve_tag_enums --> src__tagi__utils__change_filter___normalize_tag\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___resolve_tag_enums\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___changes_matching_any\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___changes_matching_tag\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___changes_matching_all\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___normalize_tag\n src__tagi__utils__change_filter__filter_changes_by_tag --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__utils__change_filter__filter_changes_by_tags_any --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__utils__change_filter__filter_changes_by_tags_all --> src__tagi__utils__change_filter__resolve_filtered_changes\n", "is_subdir": false}, {"name": "compact_flow.mmd", "rel_path": "compact_flow.mmd", "path": "compact_flow.mmd", "size": "75B", "icon": "📈", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart TD\n%% generated in 0.00s\n src__tagi["src.tagi<br/>225 funcs"]\n", "is_subdir": false}, {"name": "flow.mmd", "rel_path": "flow.mmd", "path": "flow.mmd", "size": "1.6KB", "icon": "📈", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart TD\n%% generated in 0.00s\n\n %% Entry points (blue)\n classDef entry fill:#4dabf7,stroke:#1971c2,color:#fff\n\n subgraph Core\n src__tagi__config__Config___load_config["_load_config"]\n src__tagi__config__Config___apply_sections["_apply_sections"]\n src__tagi__config__Config__get_tag_for_path["get_tag_for_path"]\n src__tagi__config__Config__get_custom_tags_for_pattern["get_custom_tags_for_pattern"]\n src__tagi__config__Config__get_tag_color["get_tag_color"]\n src__tagi__config__Config__get_heuristics_for_path["get_heuristics_for_path"]\n src__tagi__config__Config__get_tags_for_path["get_tags_for_path"]\n src__tagi__config__Config__get_tag_description["get_tag_description"]\n src__tagi__config__Config__get_template["get_template"]\n src__tagi__hooks__install_hooks["install_hooks"]\n src__tagi__hooks__uninstall_hooks["uninstall_hooks"]\n src__tagi__hooks__list_hooks["list_hooks"]\n src__tagi__hooks__run_hook["run_hook"]\n src__tagi__analyzer__dependency_graph__build_dependency_graph["build_dependency_graph"]\n src__tagi__analyzer__dependency_graph___LevelOrder__levels["levels"]\n ...["+135 more"]\n end\n\n class src__tagi__config__Config___load_config,src__tagi__config__Config___apply_sections,src__tagi__config__Config__get_tag_for_path,src__tagi__config__Config__get_custom_tags_for_pattern,src__tagi__config__Config__get_tag_color,src__tagi__config__Config__get_heuristics_for_path,src__tagi__config__Config__get_tags_for_path,src__tagi__config__Config__get_tag_description,src__tagi__config__Config__get_template,src__tagi__hooks__install_hooks entry\n", "is_subdir": false}, {"name": "prompt.txt", "rel_path": "prompt.txt", "path": "prompt.txt", "size": "2.9KB", "icon": "📄", "type": "text", "type_name": "Text", "content": "You are an AI assistant helping me understand and improve a codebase.\n# generated in 0.00s\nUse the attached/generated files as the authoritative context.\nYour goal is to refactor the project based on these files, not just summarize it.\n\nwe are in project path: tagi\n\nFiles for analysis:\n\nNote: project/validation.toon.yaml and project/duplication.toon.yaml are generated by external tools (vallm and redup)\n- analysis.toon.yaml (Health diagnostics - complexity metrics, god modules, coupling issues, refactoring priorities) [9KB]\n- map.toon.yaml (Structural map - files, sizes, imports, exports, signatures, project header) [16KB]\n- evolution.toon.yaml (Refactoring queue - ranked actions by impact/effort, risks, metrics targets, history) [1KB]\n- project.toon.yaml (Compact project overview - generated from project.yaml data) [2KB]\n- context.md (LLM narrative - architecture summary and project context) [21KB]\n- README.md (Generated documentation - overview and usage guide) [9KB]\n\nTask:\n- Treat this prompt as a refactoring brief: identify the highest-priority changes and prepare concrete edits.\n- Use the file set to decide whether the first pass should focus on correctness, duplication, complexity reduction, or architecture cleanup.\n- If you can safely implement the refactor, do it; otherwise give an exact file-by-file change plan and test plan.\n- Use analysis.toon.yaml to locate high-CC functions and god modules that should be split first.\n- Keep module boundaries intact and update imports/exports according to map.toon.yaml.\n- Use evolution.toon.yaml as the execution backlog and work from the top-ranked items.\n- Keep project.toon.yaml aligned with the refactored architecture.\n\nPriority Order:\nP1 — Split or simplify the highest-CC / god modules identified in analysis.toon.yaml.\nP1 — Preserve module boundaries and update imports/exports according to map.toon.yaml.\nP2 — Keep the compact project overview in project.toon.yaml aligned with the refactor.\nP2 — Execute the highest-impact items from evolution.toon.yaml in order of benefit/risk.\n\nFocus Areas for Analysis:\n1. **Code Health Analysis** - Review complexity metrics, god modules, coupling issues from analysis.toon.yaml\n2. **Structural Map** - Use map.toon.yaml to inspect imports, exports, signatures, and the project header\n3. **Refactoring Priorities** - Examine ranked refactoring actions and risk assessment from evolution.toon.yaml\n4. **Project Overview** - Review the compact project overview from project.toon.yaml\n\nAnalysis Strategy:\n- Start with analysis.toon.yaml for health metrics, then map.toon.yaml for structure and signatures\n- Review evolution.toon.yaml for action priorities and next steps\n- Compare the compact project overview in project.toon.yaml with the main analysis files\n\nConstraints:\n- Prefer minimal, incremental changes.\n- Maintain full backward compatibility.\n- Base recommendations on concrete metrics from the provided files.\n- If uncertain, ask clarifying questions.\n", "is_subdir": false}, {"name": "logic.pl", "rel_path": "logic.pl", "path": "logic.pl", "size": "21.3KB", "icon": "📄", "type": "unknown", "type_name": "PL", "content": "[Binary file]", "is_subdir": false}, {"name": "mermaid.export", "rel_path": "mermaid.export", "path": "mermaid.export", "size": "21.4KB", "icon": "📄", "type": "unknown", "type_name": "EXPORT", "content": "[Binary file]", "is_subdir": false}, {"name": "analysis.toon.yaml", "rel_path": "analysis.toon.yaml", "path": "analysis.toon.yaml", "size": "9.5KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# code2llm | 75f 5609L | python:66,yaml:5,txt:2,toml:1,shell:1 | 2026-09-19\n# generated in 0.03s\n# CC̅=2.9 | critical:0/225 | dups:0 | cycles:2\n\nHEALTH[0]: ok\n\nREFACTOR[1]:\n 1. break 2 circular dependencies\n\nPIPELINES[122]:\n [1] Src [__init__]: __init__\n PURITY: 100% pure\n [2] Src [_load_config]: _load_config\n PURITY: 100% pure\n [3] Src [_apply_sections]: _apply_sections\n PURITY: 100% pure\n [4] Src [get_tag_for_path]: get_tag_for_path\n PURITY: 100% pure\n [5] Src [get_custom_tags_for_pattern]: get_custom_tags_for_pattern\n PURITY: 100% pure\n [6] Src [get_tag_color]: get_tag_color\n PURITY: 100% pure\n [7] Src [get_heuristics_for_path]: get_heuristics_for_path\n PURITY: 100% pure\n [8] Src [get_tags_for_path]: get_tags_for_path\n PURITY: 100% pure\n [9] Src [get_tag_description]: get_tag_description\n PURITY: 100% pure\n [10] Src [get_template]: get_template\n PURITY: 100% pure\n [11] Src [install_hooks]: install_hooks → _pre_commit_hook → _hooks_dir\n PURITY: 100% pure\n [12] Src [uninstall_hooks]: uninstall_hooks → _pre_commit_hook → _hooks_dir\n PURITY: 100% pure\n [13] Src [list_hooks]: list_hooks → _hooks_dir\n PURITY: 100% pure\n [14] Src [run_hook]: run_hook → _hooks_dir\n PURITY: 100% pure\n [15] Src [build_dependency_graph]: build_dependency_graph → analyze_python_imports → _collect_import_names\n PURITY: 100% pure\n [16] Src [__init__]: __init__\n PURITY: 100% pure\n [17] Src [levels]: levels\n PURITY: 100% pure\n [18] Src [_drain_level]: _drain_level\n PURITY: 100% pure\n [19] Src [find_dependency_order]: find_dependency_order\n PURITY: 100% pure\n [20] Src [detect_cycles]: detect_cycles → _dfs_visit → _mark\n PURITY: 100% pure\n [21] Src [get_critical_path]: get_critical_path → _find_longest_start → _longest_path_length\n PURITY: 100% pure\n [22] Src [collect]: collect → total_lines_changed\n PURITY: 100% pure\n [23] Src [to_json]: to_json\n PURITY: 100% pure\n [24] Src [save]: save\n PURITY: 100% pure\n [25] Src [generate_report]: generate_report\n PURITY: 100% pure\n [26] Src [sort_by_tag_priority]: sort_by_tag_priority\n PURITY: 100% pure\n [27] Src [group_by_complexity]: group_by_complexity → sort_by_complexity\n PURITY: 100% pure\n [28] Src [group_changes]: group_changes → _get_primary_tag\n PURITY: 100% pure\n [29] Src [group_by_tag]: group_by_tag → select_changes_by_tag\n PURITY: 100% pure\n [30] Src [preview_plan]: preview_plan\n PURITY: 100% pure\n [31] Src [preview_changes]: preview_changes\n PURITY: 100% pure\n [32] Src [group_by_branch]: group_by_branch\n PURITY: 100% pure\n [33] Src [get_branch_info]: get_branch_info\n PURITY: 100% pure\n [34] Src [select_by_tags]: select_by_tags\n PURITY: 100% pure\n [35] Src [select_safe_changes]: select_safe_changes\n PURITY: 100% pure\n [36] Src [auto_command]: auto_command → _configure_command_logging → setup_logger\n PURITY: 100% pure\n [37] Src [inspect_command]: inspect_command → resolve_filtered_changes → _resolve_tag_enums → _normalize_tag\n PURITY: 100% pure\n [38] Src [filter_command]: filter_command → resolve_filtered_changes → _resolve_tag_enums → _normalize_tag\n PURITY: 100% pure\n [39] Src [file_command]: file_command → get_diff\n PURITY: 100% pure\n [40] Src [create_pr]: create_pr → get_provider → detect_git_provider\n PURITY: 100% pure\n [41] Src [create_mr]: create_mr → get_provider → detect_git_provider\n PURITY: 100% pure\n [42] Src [scan_command]: scan_command → scan_and_tag\n PURITY: 100% pure\n [43] Src [list_groups_command]: list_groups_command → _do_list_groups → scan_and_tag\n PURITY: 100% pure\n [44] Src [list_command]: list_command → _do_list_groups → scan_and_tag\n PURITY: 100% pure\n [45] Src [stats_command]: stats_command → scan_and_tag\n PURITY: 100% pure\n [46] Src [setup_logging]: setup_logging → setup_logger\n PURITY: 100% pure\n [47] Src [_resolve_send_target]: _resolve_send_target → _is_known_tag → _ensure_tag_prefix\n PURITY: 100% pure\n [48] Src [detect_provider]: detect_provider → detect_provider_command → get_provider → detect_git_provider\n PURITY: 100% pure\n [49] Src [publish_command]: publish_command → scan_and_tag\n PURITY: 100% pure\n [50] Src [deploy_command]: deploy_command → scan_and_tag\n PURITY: 100% pure\n\nLAYERS:\n src/ CC̄=2.9 ←in:0 →out:0\n │ dependency_graph 276L 1C 16m CC=7 ←0\n │ metrics 228L 0C 11m CC=5 ←1\n │ design_tokens 221L 7C 3m CC=2 ←0\n │ utility_commands 211L 0C 5m CC=10 ←0\n │ koru 171L 2C 10m CC=8 ←0\n │ git_operations 170L 0C 7m CC=7 ←0\n │ metrics 153L 1C 6m CC=10 ←0\n │ formats 141L 0C 9m CC=5 ←0\n │ publishing_commands 139L 0C 3m CC=11 ←0\n │ hooks 127L 0C 7m CC=5 ←1\n │ config 126L 1C 12m CC=4 ←5\n │ inspection_commands 120L 0C 3m CC=7 ←0\n │ change_filter 120L 0C 9m CC=5 ←5\n │ main 113L 0C 6m CC=5 ←1\n │ summary_helpers 113L 0C 5m CC=5 ←0\n │ sorter 104L 0C 3m CC=5 ←1\n │ core_commands 94L 0C 5m CC=7 ←0\n │ tags 89L 0C 5m CC=4 ←0\n │ branch_grouper 88L 0C 2m CC=8 ←0\n │ provider_commands 79L 0C 5m CC=4 ←1\n │ display_utils 79L 0C 4m CC=5 ←3\n │ grouper 74L 0C 4m CC=5 ←0\n │ git 72L 1C 9m CC=4 ←0\n │ logger 71L 0C 2m CC=4 ←2\n │ base 70L 2C 8m CC=2 ←0\n │ status 66L 0C 2m CC=7 ←0\n │ commit_message 64L 0C 2m CC=5 ←1\n │ change 60L 4C 1m CC=1 ←0\n │ llx_adapter 55L 1C 4m CC=4 ←0\n │ detect_provider 54L 0C 2m CC=4 ←4\n │ _tags 52L 0C 4m CC=7 ←2\n │ gitlab 47L 1C 5m CC=4 ←0\n │ __init__ 47L 0C 0m CC=0.0 ←0\n │ pr 46L 0C 2m CC=5 ←2\n │ selector 44L 0C 5m CC=8 ←1\n │ preview 43L 0C 2m CC=7 ←0\n │ change_stats 42L 0C 2m CC=1 ←3\n │ scoring 41L 0C 4m CC=3 ←1\n │ publish_helpers 40L 0C 2m CC=1 ←1\n │ summary 39L 0C 2m CC=8 ←0\n │ publish 39L 1C 4m CC=3 ←0\n │ github 38L 1C 5m CC=2 ←0\n │ send_helpers 34L 0C 1m CC=2 ←2\n │ risk 33L 0C 2m CC=3 ←7\n │ auth 32L 0C 2m CC=2 ←2\n │ __init__ 32L 0C 0m CC=0.0 ←0\n │ files 29L 0C 1m CC=7 ←1\n │ diff 29L 0C 2m CC=1 ←1\n │ scan_utils 25L 0C 1m CC=3 ←5\n │ inspect_helpers 25L 0C 0m CC=0.0 ←0\n │ line_builder 23L 1C 4m CC=1 ←0\n │ plan 23L 2C 0m CC=0.0 ←0\n │ _templates 21L 0C 1m CC=2 ←1\n │ rules 20L 0C 3m CC=1 ←0\n │ __init__ 18L 0C 0m CC=0.0 ←0\n │ group 16L 1C 0m CC=0.0 ←0\n │ detector 15L 0C 1m CC=3 ←0\n │ __init__ 14L 0C 0m CC=0.0 ←0\n │ __init__ 13L 0C 0m CC=0.0 ←0\n │ __init__ 13L 0C 0m CC=0.0 ←0\n │ __init__ 12L 0C 0m CC=0.0 ←0\n │ __init__ 11L 0C 0m CC=0.0 ←0\n │ __init__ 9L 0C 0m CC=0.0 ←0\n │ __init__ 7L 0C 0m CC=0.0 ←0\n │ __main__ 6L 0C 0m CC=0.0 ←0\n │ __init__ 1L 0C 0m CC=0.0 ←0\n │\n ./ CC̄=0.0 ←in:0 →out:0\n │ !! goal.yaml 539L 0C 0m CC=0.0 ←0\n │ koru.yaml 133L 0C 0m CC=0.0 ←0\n │ wup.yaml 100L 0C 0m CC=0.0 ←0\n │ regix.yaml 93L 0C 0m CC=0.0 ←0\n │ tree.txt 89L 0C 0m CC=0.0 ←0\n │ pyproject.toml 49L 0C 0m CC=0.0 ←0\n │ project.sh 48L 0C 0m CC=0.0 ←0\n │ local.dev.txt 11L 0C 0m CC=0.0 ←0\n │\n testql-scenarios/ CC̄=0.0 ←in:0 →out:0\n │ generated-cli-tests.testql.toon.yaml 20L 0C 0m CC=0.0 ←0\n │\n\nCOUPLING: no cross-package imports detected\n\nEXTERNAL:\n validation: run `vallm batch .` → validation.toon\n duplication: run `redup scan .` → duplication.toon\n", "is_subdir": false}, {"name": "calls.toon.yaml", "rel_path": "calls.toon.yaml", "path": "calls.toon.yaml", "size": "12.4KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# code2llm call graph | /home/tom/github/semcod/tagi\n# generated in 0.06s\n# nodes: 136 | edges: 144 | modules: 40\n# CC̄=2.9\n\nHUBS[20]:\n src.tagi.cli.publishing_commands.publish_command\n CC=11 in:0 out:36 total:36\n src.tagi.cli.utility_commands.summary_command\n CC=7 in:0 out:28 total:28\n src.tagi.cli.git_operations.send_command\n CC=7 in:1 out:26 total:27\n src.tagi.cli.utility_commands.hooks_command\n CC=10 in:0 out:26 total:26\n src.tagi.cli.publishing_commands.deploy_command\n CC=5 in:0 out:22 total:22\n src.tagi.cli.inspection_commands.inspect_command\n CC=7 in:0 out:17 total:17\n src.tagi.cli.scan_utils.scan_and_tag\n CC=3 in:11 out:6 total:17\n src.tagi.utils.logger.setup_logger\n CC=4 in:2 out:15 total:17\n src.tagi.cli.utility_commands.draft_command\n CC=4 in:0 out:17 total:17\n src.tagi.cli.inspection_commands.filter_command\n CC=6 in:0 out:16 total:16\n src.tagi.utils.change_filter.resolve_filtered_changes\n CC=5 in:9 out:7 total:16\n src.tagi.utils.change_stats.display_statistics_table\n CC=1 in:4 out:12 total:16\n src.tagi.scanner.status.scan_repo\n CC=7 in:0 out:15 total:15\n src.tagi.cli.core_commands.stats_command\n CC=7 in:0 out:15 total:15\n src.tagi.cli.inspection_commands.file_command\n CC=7 in:0 out:14 total:14\n src.tagi.cli.git_operations._execute_git_operations\n CC=5 in:1 out:11 total:12\n src.tagi.heuristics.tags._tag_change\n CC=2 in:1 out:10 total:11\n src.tagi.cli.display_utils._display_changes\n CC=3 in:3 out:8 total:11\n src.tagi.analyzer.dependency_graph._dfs_visit\n CC=5 in:2 out:8 total:10\n src.tagi.utils.risk.average_risk\n CC=3 in:8 out:2 total:10\n\nMODULES:\n src.tagi.analyzer.dependency_graph [12 funcs]\n _collect_import_names CC=7 out:5\n _cycle_from CC=1 out:1\n _dfs_visit CC=5 out:8\n _find_longest_start CC=1 out:2\n _longest_path_length CC=4 out:3\n _mark CC=1 out:0\n _next_critical_node CC=5 out:2\n _reconstruct_critical_path CC=3 out:4\n analyze_python_imports CC=2 out:4\n build_dependency_graph CC=3 out:4\n src.tagi.analyzer.metrics [1 funcs]\n collect CC=10 out:5\n src.tagi.cli.core_commands [5 funcs]\n _do_list_groups CC=4 out:7\n list_command CC=1 out:2\n list_groups_command CC=1 out:2\n scan_command CC=3 out:7\n stats_command CC=7 out:15\n src.tagi.cli.display_utils [4 funcs]\n _display_changes CC=3 out:8\n _display_changes_grouped CC=5 out:3\n _display_groups CC=4 out:6\n _format_tags CC=5 out:3\n src.tagi.cli.git_operations [7 funcs]\n _ensure_tag_prefix CC=2 out:1\n _execute_git_operations CC=5 out:11\n _filter_by_tag CC=3 out:4\n _is_known_tag CC=2 out:2\n _resolve_send_target CC=5 out:5\n auto_command CC=1 out:8\n send_command CC=7 out:26\n src.tagi.cli.inspection_commands [3 funcs]\n file_command CC=7 out:14\n filter_command CC=6 out:16\n inspect_command CC=7 out:17\n src.tagi.cli.main [6 funcs]\n _configure_command_logging CC=2 out:2\n _ensure_tag_prefix CC=2 out:1\n _is_known_tag CC=2 out:2\n _resolve_send_target CC=5 out:5\n detect_provider CC=1 out:1\n setup_logging CC=2 out:4\n src.tagi.cli.provider_commands [5 funcs]\n _current_branch CC=2 out:2\n _pr_spec CC=1 out:2\n create_mr CC=4 out:8\n create_pr CC=4 out:8\n detect_provider_command CC=2 out:3\n src.tagi.cli.publishing_commands [3 funcs]\n _ensure_tag_prefix CC=2 out:1\n deploy_command CC=5 out:22\n publish_command CC=11 out:36\n src.tagi.cli.scan_utils [1 funcs]\n scan_and_tag CC=3 out:6\n src.tagi.cli.utility_commands [4 funcs]\n _ensure_tag_prefix CC=2 out:1\n draft_command CC=4 out:17\n hooks_command CC=10 out:26\n summary_command CC=7 out:28\n src.tagi.composer._tags [4 funcs]\n all_tag_values CC=2 out:1\n all_tags CC=3 out:2\n infer_scope CC=7 out:2\n summary_tag CC=3 out:2\n src.tagi.composer._templates [1 funcs]\n render_template CC=2 out:2\n src.tagi.composer.commit_message [2 funcs]\n _improve_with_llm CC=2 out:2\n generate_commit_message CC=5 out:8\n src.tagi.composer.formats [8 funcs]\n _commit_type CC=3 out:0\n _count_tags CC=3 out:1\n _describe_changes CC=2 out:2\n _detailed_file_lines CC=3 out:1\n generate_conventional_message CC=4 out:5\n generate_detailed_message CC=3 out:6\n generate_oneline_message CC=4 out:3\n generate_simple_message CC=5 out:6\n src.tagi.composer.summary [1 funcs]\n generate_summary CC=8 out:8\n src.tagi.config [2 funcs]\n should_ignore CC=3 out:2\n load_config CC=1 out:1\n src.tagi.heuristics.metrics [8 funcs]\n _calculate_complexity CC=1 out:6\n _calculate_dependency_depth CC=4 out:4\n _calculate_impact CC=1 out:3\n _calculate_stability CC=1 out:2\n _calculate_test_impact CC=4 out:2\n _extension_complexity_weight CC=3 out:2\n _extension_impact_weight CC=3 out:2\n calculate_metrics CC=1 out:6\n src.tagi.heuristics.rules [3 funcs]\n _get_config_attr CC=1 out:2\n get_custom_heuristics CC=1 out:1\n get_custom_rules CC=1 out:1\n src.tagi.heuristics.scoring [4 funcs]\n _change_type_risk_weight CC=1 out:1\n _lines_risk_weight CC=1 out:1\n _tag_risk_weight CC=3 out:2\n calculate_risk_score CC=1 out:4\n src.tagi.heuristics.tags [5 funcs]\n _custom_config_tags CC=3 out:3\n _size_tags CC=3 out:0\n _tag_change CC=2 out:10\n apply_path_tags CC=4 out:2\n apply_tags CC=2 out:2\n src.tagi.hooks [7 funcs]\n _hooks_dir CC=1 out:1\n _pre_commit_hook CC=1 out:1\n check_hooks_installed CC=2 out:3\n install_hooks CC=2 out:5\n list_hooks CC=5 out:7\n run_hook CC=2 out:5\n uninstall_hooks CC=3 out:3\n src.tagi.planner.grouper [3 funcs]\n _get_primary_tag CC=4 out:0\n group_by_tag CC=1 out:1\n group_changes CC=4 out:10\n src.tagi.planner.selector [1 funcs]\n select_changes_by_tag CC=3 out:0\n src.tagi.planner.sorter [2 funcs]\n group_by_complexity CC=5 out:7\n sort_by_complexity CC=1 out:4\n src.tagi.providers.github [3 funcs]\n create_pr CC=1 out:3\n get_auth_status CC=1 out:2\n is_authenticated CC=1 out:2\n src.tagi.providers.gitlab [3 funcs]\n create_pr CC=1 out:3\n get_auth_status CC=1 out:2\n is_authenticated CC=1 out:2\n src.tagi.providers.utils.auth [2 funcs]\n get_auth_status_from_result CC=2 out:0\n is_authenticated_from_result CC=1 out:0\n src.tagi.providers.utils.pr [2 funcs]\n build_pr_command CC=5 out:2\n execute_pr_command CC=2 out:0\n src.tagi.scanner.diff [1 funcs]\n get_diff CC=1 out:1\n src.tagi.scanner.files [1 funcs]\n count_lines_changed CC=7 out:7\n src.tagi.scanner.status [2 funcs]\n parse_status CC=4 out:0\n scan_repo CC=7 out:15\n src.tagi.utils.change_filter [9 funcs]\n _changes_matching_all CC=4 out:1\n _changes_matching_any CC=4 out:1\n _changes_matching_tag CC=3 out:0\n _normalize_tag CC=2 out:1\n _resolve_tag_enums CC=3 out:3\n filter_changes_by_tag CC=1 out:1\n filter_changes_by_tags_all CC=1 out:1\n filter_changes_by_tags_any CC=1 out:1\n resolve_filtered_changes CC=5 out:7\n src.tagi.utils.change_stats [2 funcs]\n calculate_tag_statistics CC=1 out:2\n display_statistics_table CC=1 out:12\n src.tagi.utils.detect_provider [2 funcs]\n detect_git_provider CC=4 out:2\n get_provider CC=3 out:3\n src.tagi.utils.logger [1 funcs]\n setup_logger CC=4 out:15\n src.tagi.utils.publish_helpers [2 funcs]\n create_publish_group CC=1 out:4\n detect_and_get_provider CC=1 out:1\n src.tagi.utils.risk [2 funcs]\n average_risk CC=3 out:2\n total_lines_changed CC=2 out:1\n src.tagi.utils.send_helpers [1 funcs]\n create_change_group CC=2 out:4\n src.tagi.utils.summary_helpers [1 funcs]\n build_statistics_section CC=1 out:4\n\nEDGES:\n src.tagi.hooks._pre_commit_hook → src.tagi.hooks._hooks_dir\n src.tagi.hooks.install_hooks → src.tagi.hooks._pre_commit_hook\n src.tagi.hooks.install_hooks → src.tagi.hooks._hooks_dir\n src.tagi.hooks.uninstall_hooks → src.tagi.hooks._pre_commit_hook\n src.tagi.hooks.check_hooks_installed → src.tagi.hooks._pre_commit_hook\n src.tagi.hooks.list_hooks → src.tagi.hooks._hooks_dir\n src.tagi.hooks.run_hook → src.tagi.hooks._hooks_dir\n src.tagi.analyzer.dependency_graph.analyze_python_imports → src.tagi.analyzer.dependency_graph._collect_import_names\n src.tagi.analyzer.dependency_graph.build_dependency_graph → src.tagi.analyzer.dependency_graph.analyze_python_imports\n src.tagi.analyzer.dependency_graph._dfs_visit → src.tagi.analyzer.dependency_graph._mark\n src.tagi.analyzer.dependency_graph._dfs_visit → src.tagi.analyzer.dependency_graph._cycle_from\n src.tagi.analyzer.dependency_graph.detect_cycles → src.tagi.analyzer.dependency_graph._dfs_visit\n src.tagi.analyzer.dependency_graph._find_longest_start → src.tagi.analyzer.dependency_graph._longest_path_length\n src.tagi.analyzer.dependency_graph._reconstruct_critical_path → src.tagi.analyzer.dependency_graph._next_critical_node\n src.tagi.analyzer.dependency_graph.get_critical_path → src.tagi.analyzer.dependency_graph._find_longest_start\n src.tagi.analyzer.dependency_graph.get_critical_path → src.tagi.analyzer.dependency_graph._reconstruct_critical_path\n src.tagi.analyzer.metrics.MetricsCollector.collect → src.tagi.utils.risk.total_lines_changed\n src.tagi.analyzer.metrics.MetricsCollector.collect → src.tagi.utils.risk.average_risk\n src.tagi.planner.sorter.group_by_complexity → src.tagi.planner.sorter.sort_by_complexity\n src.tagi.planner.grouper.group_changes → src.tagi.planner.grouper._get_primary_tag\n src.tagi.planner.grouper.group_changes → src.tagi.utils.risk.total_lines_changed\n src.tagi.planner.grouper.group_changes → src.tagi.utils.risk.average_risk\n src.tagi.planner.grouper.group_by_tag → src.tagi.planner.selector.select_changes_by_tag\n src.tagi.cli.git_operations._is_known_tag → src.tagi.cli.git_operations._ensure_tag_prefix\n src.tagi.cli.git_operations._resolve_send_target → src.tagi.cli.git_operations._is_known_tag\n src.tagi.cli.git_operations._filter_by_tag → src.tagi.utils.change_filter.resolve_filtered_changes\n src.tagi.cli.git_operations._filter_by_tag → src.tagi.cli.git_operations._ensure_tag_prefix\n src.tagi.cli.git_operations._execute_git_operations → src.tagi.utils.detect_provider.get_provider\n src.tagi.cli.git_operations.send_command → src.tagi.cli.git_operations._resolve_send_target\n src.tagi.cli.git_operations.auto_command → src.tagi.cli.main._configure_command_logging\n src.tagi.cli.git_operations.auto_command → src.tagi.cli.git_operations.send_command\n src.tagi.cli.inspection_commands.inspect_command → src.tagi.utils.change_filter.resolve_filtered_changes\n src.tagi.cli.inspection_commands.inspect_command → src.tagi.utils.change_stats.display_statistics_table\n src.tagi.cli.inspection_commands.inspect_command → src.tagi.cli.display_utils._display_changes\n src.tagi.cli.inspection_commands.inspect_command → src.tagi.cli.scan_utils.scan_and_tag\n src.tagi.cli.inspection_commands.filter_command → src.tagi.utils.change_filter.resolve_filtered_changes\n src.tagi.cli.inspection_commands.filter_command → src.tagi.utils.change_stats.display_statistics_table\n src.tagi.cli.inspection_commands.filter_command → src.tagi.cli.display_utils._display_changes\n src.tagi.cli.inspection_commands.filter_command → src.tagi.cli.scan_utils.scan_and_tag\n src.tagi.cli.inspection_commands.file_command → src.tagi.scanner.diff.get_diff\n src.tagi.cli.provider_commands.detect_provider_command → src.tagi.utils.detect_provider.get_provider\n src.tagi.cli.provider_commands._pr_spec → src.tagi.cli.provider_commands._current_branch\n src.tagi.cli.provider_commands.create_pr → src.tagi.utils.detect_provider.get_provider\n src.tagi.cli.provider_commands.create_pr → src.tagi.cli.provider_commands._pr_spec\n src.tagi.cli.provider_commands.create_mr → src.tagi.utils.detect_provider.get_provider\n src.tagi.cli.provider_commands.create_mr → src.tagi.cli.provider_commands._pr_spec\n src.tagi.cli.core_commands.scan_command → src.tagi.cli.scan_utils.scan_and_tag\n src.tagi.cli.core_commands.scan_command → src.tagi.cli.display_utils._display_changes_grouped\n src.tagi.cli.core_commands.scan_command → src.tagi.cli.display_utils._display_changes\n src.tagi.cli.core_commands.list_groups_command → src.tagi.cli.core_commands._do_list_groups\n", "is_subdir": false}, {"name": "calls.yaml", "rel_path": "calls.yaml", "path": "calls.yaml", "size": "58.3KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "project: /home/tom/github/semcod/tagi\ngenerated_from: code2llm call graph analysis\nstats:\n total_nodes: 136\n total_edges: 144\n modules_count: 40\nnodes:\n src.tagi.analyzer.dependency_graph.detect_cycles:\n name: detect_cycles\n module: src.tagi.analyzer.dependency_graph\n line: 184\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 0\n src.tagi.cli.main._is_known_tag:\n name: _is_known_tag\n module: src.tagi.cli.main\n line: 57\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.providers.gitlab.GitLabProvider.get_auth_status:\n name: get_auth_status\n module: src.tagi.providers.gitlab\n line: 21\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.composer.formats.generate_simple_message:\n name: generate_simple_message\n module: src.tagi.composer.formats\n line: 102\n cyclomatic_complexity: 5\n calls_out: 6\n calls_in: 0\n src.tagi.cli.inspection_commands.filter_command:\n name: filter_command\n module: src.tagi.cli.inspection_commands\n line: 56\n cyclomatic_complexity: 6\n calls_out: 16\n calls_in: 0\n src.tagi.cli.provider_commands._pr_spec:\n name: _pr_spec\n module: src.tagi.cli.provider_commands\n line: 37\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 2\n src.tagi.heuristics.metrics._calculate_complexity:\n name: _calculate_complexity\n module: src.tagi.heuristics.metrics\n line: 89\n cyclomatic_complexity: 1\n calls_out: 6\n calls_in: 1\n src.tagi.hooks.install_hooks:\n name: install_hooks\n module: src.tagi.hooks\n line: 17\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.tagi.cli.core_commands.list_groups_command:\n name: list_groups_command\n module: src.tagi.cli.core_commands\n line: 33\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.cli.git_operations._ensure_tag_prefix:\n name: _ensure_tag_prefix\n module: src.tagi.cli.git_operations\n line: 21\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 2\n src.tagi.cli.git_operations._is_known_tag:\n name: _is_known_tag\n module: src.tagi.cli.git_operations\n line: 28\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.heuristics.tags._custom_config_tags:\n name: _custom_config_tags\n module: src.tagi.heuristics.tags\n line: 48\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 1\n src.tagi.heuristics.rules.get_custom_heuristics:\n name: get_custom_heuristics\n module: src.tagi.heuristics.rules\n line: 18\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.analyzer.dependency_graph._dfs_visit:\n name: _dfs_visit\n module: src.tagi.analyzer.dependency_graph\n line: 158\n cyclomatic_complexity: 5\n calls_out: 8\n calls_in: 2\n src.tagi.utils.send_helpers.create_change_group:\n name: create_change_group\n module: src.tagi.utils.send_helpers\n line: 8\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 2\n src.tagi.providers.utils.pr.build_pr_command:\n name: build_pr_command\n module: src.tagi.providers.utils.pr\n line: 10\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 2\n src.tagi.cli.provider_commands.create_mr:\n name: create_mr\n module: src.tagi.cli.provider_commands\n line: 62\n cyclomatic_complexity: 4\n calls_out: 8\n calls_in: 0\n src.tagi.utils.change_filter._resolve_tag_enums:\n name: _resolve_tag_enums\n module: src.tagi.utils.change_filter\n line: 24\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 1\n src.tagi.heuristics.tags._tag_change:\n name: _tag_change\n module: src.tagi.heuristics.tags\n line: 22\n cyclomatic_complexity: 2\n calls_out: 10\n calls_in: 1\n src.tagi.cli.provider_commands._current_branch:\n name: _current_branch\n module: src.tagi.cli.provider_commands\n line: 27\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.utils.change_filter._changes_matching_tag:\n name: _changes_matching_tag\n module: src.tagi.utils.change_filter\n line: 19\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 1\n src.tagi.providers.utils.pr.execute_pr_command:\n name: execute_pr_command\n module: src.tagi.providers.utils.pr\n line: 35\n cyclomatic_complexity: 2\n calls_out: 0\n calls_in: 2\n src.tagi.scanner.diff.get_diff:\n name: get_diff\n module: src.tagi.scanner.diff\n line: 6\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 3\n src.tagi.cli.inspection_commands.file_command:\n name: file_command\n module: src.tagi.cli.inspection_commands\n line: 89\n cyclomatic_complexity: 7\n calls_out: 14\n calls_in: 0\n src.tagi.cli.main.setup_logging:\n name: setup_logging\n module: src.tagi.cli.main\n line: 37\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.tagi.config.load_config:\n name: load_config\n module: src.tagi.config\n line: 124\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 6\n src.tagi.heuristics.scoring._tag_risk_weight:\n name: _tag_risk_weight\n module: src.tagi.heuristics.scoring\n line: 34\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n src.tagi.cli.git_operations._execute_git_operations:\n name: _execute_git_operations\n module: src.tagi.cli.git_operations\n line: 71\n cyclomatic_complexity: 5\n calls_out: 11\n calls_in: 1\n src.tagi.composer._tags.all_tag_values:\n name: all_tag_values\n module: src.tagi.composer._tags\n line: 15\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n src.tagi.heuristics.tags.apply_path_tags:\n name: apply_path_tags\n module: src.tagi.heuristics.tags\n line: 69\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 1\n src.tagi.analyzer.dependency_graph.build_dependency_graph:\n name: build_dependency_graph\n module: src.tagi.analyzer.dependency_graph\n line: 54\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 0\n src.tagi.utils.publish_helpers.create_publish_group:\n name: create_publish_group\n module: src.tagi.utils.publish_helpers\n line: 22\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 1\n src.tagi.providers.github.GitHubProvider.is_authenticated:\n name: is_authenticated\n module: src.tagi.providers.github\n line: 15\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.composer.formats.generate_conventional_message:\n name: generate_conventional_message\n module: src.tagi.composer.formats\n line: 42\n cyclomatic_complexity: 4\n calls_out: 5\n calls_in: 0\n src.tagi.analyzer.dependency_graph._collect_import_names:\n name: _collect_import_names\n module: src.tagi.analyzer.dependency_graph\n line: 10\n cyclomatic_complexity: 7\n calls_out: 5\n calls_in: 1\n src.tagi.analyzer.dependency_graph.get_critical_path:\n name: get_critical_path\n module: src.tagi.analyzer.dependency_graph\n line: 262\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.tagi.composer._templates.render_template:\n name: render_template\n module: src.tagi.composer._templates\n line: 10\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.utils.change_filter._changes_matching_all:\n name: _changes_matching_all\n module: src.tagi.utils.change_filter\n line: 40\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 1\n src.tagi.cli.main._resolve_send_target:\n name: _resolve_send_target\n module: src.tagi.cli.main\n line: 66\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 0\n src.tagi.cli.utility_commands._ensure_tag_prefix:\n name: _ensure_tag_prefix\n module: src.tagi.cli.utility_commands\n line: 18\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n src.tagi.planner.grouper._get_primary_tag:\n name: _get_primary_tag\n module: src.tagi.planner.grouper\n line: 54\n cyclomatic_complexity: 4\n calls_out: 0\n calls_in: 1\n src.tagi.cli.display_utils._display_changes_grouped:\n name: _display_changes_grouped\n module: src.tagi.cli.display_utils\n line: 64\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 1\n src.tagi.cli.utility_commands.hooks_command:\n name: hooks_command\n module: src.tagi.cli.utility_commands\n line: 131\n cyclomatic_complexity: 10\n calls_out: 26\n calls_in: 0\n src.tagi.cli.inspection_commands.inspect_command:\n name: inspect_command\n module: src.tagi.cli.inspection_commands\n line: 19\n cyclomatic_complexity: 7\n calls_out: 17\n calls_in: 0\n src.tagi.utils.change_filter.resolve_filtered_changes:\n name: resolve_filtered_changes\n module: src.tagi.utils.change_filter\n line: 45\n cyclomatic_complexity: 5\n calls_out: 7\n calls_in: 9\n src.tagi.scanner.status.scan_repo:\n name: scan_repo\n module: src.tagi.scanner.status\n line: 11\n cyclomatic_complexity: 7\n calls_out: 15\n calls_in: 0\n src.tagi.heuristics.scoring.calculate_risk_score:\n name: calculate_risk_score\n module: src.tagi.heuristics.scoring\n line: 20\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 1\n src.tagi.cli.provider_commands.detect_provider_command:\n name: detect_provider_command\n module: src.tagi.cli.provider_commands\n line: 17\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 1\n src.tagi.cli.scan_utils.scan_and_tag:\n name: scan_and_tag\n module: src.tagi.cli.scan_utils\n line: 10\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 11\n src.tagi.cli.core_commands._do_list_groups:\n name: _do_list_groups\n module: src.tagi.cli.core_commands\n line: 47\n cyclomatic_complexity: 4\n calls_out: 7\n calls_in: 2\n src.tagi.cli.publishing_commands._ensure_tag_prefix:\n name: _ensure_tag_prefix\n module: src.tagi.cli.publishing_commands\n line: 16\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 2\n src.tagi.analyzer.dependency_graph._find_longest_start:\n name: _find_longest_start\n module: src.tagi.analyzer.dependency_graph\n line: 221\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 1\n src.tagi.hooks._pre_commit_hook:\n name: _pre_commit_hook\n module: src.tagi.hooks\n line: 13\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 3\n src.tagi.cli.display_utils._display_groups:\n name: _display_groups\n module: src.tagi.cli.display_utils\n line: 52\n cyclomatic_complexity: 4\n calls_out: 6\n calls_in: 1\n src.tagi.composer.formats._commit_type:\n name: _commit_type\n module: src.tagi.composer.formats\n line: 27\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 1\n src.tagi.heuristics.metrics._calculate_dependency_depth:\n name: _calculate_dependency_depth\n module: src.tagi.heuristics.metrics\n line: 151\n cyclomatic_complexity: 4\n calls_out: 4\n calls_in: 1\n src.tagi.composer.summary.generate_summary:\n name: generate_summary\n module: src.tagi.composer.summary\n line: 10\n cyclomatic_complexity: 8\n calls_out: 8\n calls_in: 0\n src.tagi.config.Config.should_ignore:\n name: should_ignore\n module: src.tagi.config\n line: 113\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n src.tagi.heuristics.metrics._calculate_impact:\n name: _calculate_impact\n module: src.tagi.heuristics.metrics\n line: 107\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 1\n src.tagi.providers.gitlab.GitLabProvider.create_pr:\n name: create_pr\n module: src.tagi.providers.gitlab\n line: 41\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.tagi.heuristics.metrics._extension_complexity_weight:\n name: _extension_complexity_weight\n module: src.tagi.heuristics.metrics\n line: 33\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n src.tagi.hooks.uninstall_hooks:\n name: uninstall_hooks\n module: src.tagi.hooks\n line: 49\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 0\n src.tagi.utils.change_filter._changes_matching_any:\n name: _changes_matching_any\n module: src.tagi.utils.change_filter\n line: 35\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 1\n src.tagi.composer.commit_message._improve_with_llm:\n name: _improve_with_llm\n module: src.tagi.composer.commit_message\n line: 52\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.hooks.list_hooks:\n name: list_hooks\n module: src.tagi.hooks\n line: 86\n cyclomatic_complexity: 5\n calls_out: 7\n calls_in: 0\n src.tagi.analyzer.dependency_graph.analyze_python_imports:\n name: analyze_python_imports\n module: src.tagi.analyzer.dependency_graph\n line: 33\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 1\n src.tagi.utils.logger.setup_logger:\n name: setup_logger\n module: src.tagi.utils.logger\n line: 9\n cyclomatic_complexity: 4\n calls_out: 15\n calls_in: 2\n src.tagi.cli.publishing_commands.publish_command:\n name: publish_command\n module: src.tagi.cli.publishing_commands\n line: 23\n cyclomatic_complexity: 11\n calls_out: 36\n calls_in: 0\n src.tagi.analyzer.dependency_graph._mark:\n name: _mark\n module: src.tagi.analyzer.dependency_graph\n line: 147\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 2\n src.tagi.analyzer.dependency_graph._reconstruct_critical_path:\n name: _reconstruct_critical_path\n module: src.tagi.analyzer.dependency_graph\n line: 244\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 1\n src.tagi.utils.change_filter.filter_changes_by_tags_any:\n name: filter_changes_by_tags_any\n module: src.tagi.utils.change_filter\n line: 97\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.tagi.hooks._hooks_dir:\n name: _hooks_dir\n module: src.tagi.hooks\n line: 9\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 4\n src.tagi.cli.utility_commands.summary_command:\n name: summary_command\n module: src.tagi.cli.utility_commands\n line: 25\n cyclomatic_complexity: 7\n calls_out: 28\n calls_in: 0\n src.tagi.composer.formats.generate_detailed_message:\n name: generate_detailed_message\n module: src.tagi.composer.formats\n line: 84\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 0\n src.tagi.heuristics.metrics._extension_impact_weight:\n name: _extension_impact_weight\n module: src.tagi.heuristics.metrics\n line: 42\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n src.tagi.composer.formats.generate_oneline_message:\n name: generate_oneline_message\n module: src.tagi.composer.formats\n line: 115\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 0\n src.tagi.cli.main.detect_provider:\n name: detect_provider\n module: src.tagi.cli.main\n line: 111\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.composer.formats._count_tags:\n name: _count_tags\n module: src.tagi.composer.formats\n line: 66\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 1\n src.tagi.hooks.check_hooks_installed:\n name: check_hooks_installed\n module: src.tagi.hooks\n line: 68\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 1\n src.tagi.heuristics.tags._size_tags:\n name: _size_tags\n module: src.tagi.heuristics.tags\n line: 59\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 1\n src.tagi.heuristics.rules._get_config_attr:\n name: _get_config_attr\n module: src.tagi.heuristics.rules\n line: 8\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 2\n src.tagi.analyzer.dependency_graph._longest_path_length:\n name: _longest_path_length\n module: src.tagi.analyzer.dependency_graph\n line: 203\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 2\n src.tagi.cli.main._configure_command_logging:\n name: _configure_command_logging\n module: src.tagi.cli.main\n line: 44\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.cli.utility_commands.draft_command:\n name: draft_command\n module: src.tagi.cli.utility_commands\n line: 180\n cyclomatic_complexity: 4\n calls_out: 17\n calls_in: 0\n src.tagi.composer._tags.summary_tag:\n name: summary_tag\n module: src.tagi.composer._tags\n line: 20\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 4\n src.tagi.utils.risk.average_risk:\n name: average_risk\n module: src.tagi.utils.risk\n line: 22\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 8\n src.tagi.composer.formats._describe_changes:\n name: _describe_changes\n module: src.tagi.composer.formats\n line: 35\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.providers.utils.auth.is_authenticated_from_result:\n name: is_authenticated_from_result\n module: src.tagi.providers.utils.auth\n line: 23\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 2\n src.tagi.cli.git_operations.send_command:\n name: send_command\n module: src.tagi.cli.git_operations\n line: 90\n cyclomatic_complexity: 7\n calls_out: 26\n calls_in: 1\n src.tagi.hooks.run_hook:\n name: run_hook\n module: src.tagi.hooks\n line: 107\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.tagi.planner.selector.select_changes_by_tag:\n name: select_changes_by_tag\n module: src.tagi.planner.selector\n line: 8\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 1\n src.tagi.heuristics.metrics.calculate_metrics:\n name: calculate_metrics\n module: src.tagi.heuristics.metrics\n line: 51\n cyclomatic_complexity: 1\n calls_out: 6\n calls_in: 1\n src.tagi.scanner.status.parse_status:\n name: parse_status\n module: src.tagi.scanner.status\n line: 57\n cyclomatic_complexity: 4\n calls_out: 0\n calls_in: 1\n src.tagi.heuristics.metrics._calculate_stability:\n name: _calculate_stability\n module: src.tagi.heuristics.metrics\n line: 118\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 1\n src.tagi.cli.display_utils._format_tags:\n name: _format_tags\n module: src.tagi.cli.display_utils\n line: 35\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 4\n src.tagi.cli.git_operations._resolve_send_target:\n name: _resolve_send_target\n module: src.tagi.cli.git_operations\n line: 37\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 1\n src.tagi.planner.grouper.group_changes:\n name: group_changes\n module: src.tagi.planner.grouper\n line: 10\n cyclomatic_complexity: 4\n calls_out: 10\n calls_in: 0\n src.tagi.heuristics.metrics._calculate_test_impact:\n name: _calculate_test_impact\n module: src.tagi.heuristics.metrics\n line: 135\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 1\n src.tagi.utils.detect_provider.get_provider:\n name: get_provider\n module: src.tagi.utils.detect_provider\n line: 12\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 6\n src.tagi.heuristics.tags.apply_tags:\n name: apply_tags\n module: src.tagi.heuristics.tags\n line: 12\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.tagi.providers.utils.auth.get_auth_status_from_result:\n name: get_auth_status_from_result\n module: src.tagi.providers.utils.auth\n line: 7\n cyclomatic_complexity: 2\n calls_out: 0\n calls_in: 2\n src.tagi.utils.change_filter.filter_changes_by_tag:\n name: filter_changes_by_tag\n module: src.tagi.utils.change_filter\n line: 84\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.providers.github.GitHubProvider.get_auth_status:\n name: get_auth_status\n module: src.tagi.providers.github\n line: 20\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.scanner.files.count_lines_changed:\n name: count_lines_changed\n module: src.tagi.scanner.files\n line: 6\n cyclomatic_complexity: 7\n calls_out: 7\n calls_in: 1\n src.tagi.composer.formats._detailed_file_lines:\n name: _detailed_file_lines\n module: src.tagi.composer.formats\n line: 75\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 1\n src.tagi.cli.display_utils._display_changes:\n name: _display_changes\n module: src.tagi.cli.display_utils\n line: 14\n cyclomatic_complexity: 3\n calls_out: 8\n calls_in: 3\n src.tagi.planner.grouper.group_by_tag:\n name: group_by_tag\n module: src.tagi.planner.grouper\n line: 37\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.analyzer.metrics.MetricsCollector.collect:\n name: collect\n module: src.tagi.analyzer.metrics\n line: 25\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.tagi.utils.risk.total_lines_changed:\n name: total_lines_changed\n module: src.tagi.utils.risk\n line: 8\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 8\n src.tagi.cli.core_commands.list_command:\n name: list_command\n module: src.tagi.cli.core_commands\n line: 40\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.providers.gitlab.GitLabProvider.is_authenticated:\n name: is_authenticated\n module: src.tagi.providers.gitlab\n line: 16\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.planner.sorter.sort_by_complexity:\n name: sort_by_complexity\n module: src.tagi.planner.sorter\n line: 7\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 2\n src.tagi.cli.provider_commands.create_pr:\n name: create_pr\n module: src.tagi.cli.provider_commands\n line: 42\n cyclomatic_complexity: 4\n calls_out: 8\n calls_in: 0\n src.tagi.analyzer.dependency_graph._cycle_from:\n name: _cycle_from\n module: src.tagi.analyzer.dependency_graph\n line: 152\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.tagi.utils.change_stats.calculate_tag_statistics:\n name: calculate_tag_statistics\n module: src.tagi.utils.change_stats\n line: 17\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 3\n src.tagi.utils.publish_helpers.detect_and_get_provider:\n name: detect_and_get_provider\n module: src.tagi.utils.publish_helpers\n line: 10\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.cli.core_commands.stats_command:\n name: stats_command\n module: src.tagi.cli.core_commands\n line: 65\n cyclomatic_complexity: 7\n calls_out: 15\n calls_in: 0\n src.tagi.composer.commit_message.generate_commit_message:\n name: generate_commit_message\n module: src.tagi.composer.commit_message\n line: 36\n cyclomatic_complexity: 5\n calls_out: 8\n calls_in: 1\n src.tagi.cli.publishing_commands.deploy_command:\n name: deploy_command\n module: src.tagi.cli.publishing_commands\n line: 96\n cyclomatic_complexity: 5\n calls_out: 22\n calls_in: 0\n src.tagi.utils.summary_helpers.build_statistics_section:\n name: build_statistics_section\n module: src.tagi.utils.summary_helpers\n line: 31\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.tagi.cli.main._ensure_tag_prefix:\n name: _ensure_tag_prefix\n module: src.tagi.cli.main\n line: 50\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n src.tagi.utils.change_filter.filter_changes_by_tags_all:\n name: filter_changes_by_tags_all\n module: src.tagi.utils.change_filter\n line: 110\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.cli.core_commands.scan_command:\n name: scan_command\n module: src.tagi.cli.core_commands\n line: 14\n cyclomatic_complexity: 3\n calls_out: 7\n calls_in: 0\n src.tagi.composer._tags.all_tags:\n name: all_tags\n module: src.tagi.composer._tags\n line: 8\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 3\n src.tagi.heuristics.scoring._lines_risk_weight:\n name: _lines_risk_weight\n module: src.tagi.heuristics.scoring\n line: 29\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.tagi.cli.git_operations.auto_command:\n name: auto_command\n module: src.tagi.cli.git_operations\n line: 148\n cyclomatic_complexity: 1\n calls_out: 8\n calls_in: 0\n src.tagi.cli.git_operations._filter_by_tag:\n name: _filter_by_tag\n module: src.tagi.cli.git_operations\n line: 60\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 1\n src.tagi.utils.change_filter._normalize_tag:\n name: _normalize_tag\n module: src.tagi.utils.change_filter\n line: 14\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 2\n src.tagi.utils.detect_provider.detect_git_provider:\n name: detect_git_provider\n module: src.tagi.utils.detect_provider\n line: 29\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 1\n src.tagi.heuristics.rules.get_custom_rules:\n name: get_custom_rules\n module: src.tagi.heuristics.rules\n line: 13\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.analyzer.dependency_graph._next_critical_node:\n name: _next_critical_node\n module: src.tagi.analyzer.dependency_graph\n line: 226\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 1\n src.tagi.composer._tags.infer_scope:\n name: infer_scope\n module: src.tagi.composer._tags\n line: 41\n cyclomatic_complexity: 7\n calls_out: 2\n calls_in: 1\n src.tagi.planner.sorter.group_by_complexity:\n name: group_by_complexity\n module: src.tagi.planner.sorter\n line: 80\n cyclomatic_complexity: 5\n calls_out: 7\n calls_in: 0\n src.tagi.utils.change_stats.display_statistics_table:\n name: display_statistics_table\n module: src.tagi.utils.change_stats\n line: 29\n cyclomatic_complexity: 1\n calls_out: 12\n calls_in: 4\n src.tagi.providers.github.GitHubProvider.create_pr:\n name: create_pr\n module: src.tagi.providers.github\n line: 32\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.tagi.heuristics.scoring._change_type_risk_weight:\n name: _change_type_risk_weight\n module: src.tagi.heuristics.scoring\n line: 39\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\nedges:\n- caller: src.tagi.hooks._pre_commit_hook\n callee: src.tagi.hooks._hooks_dir\n call_type: resolved\n- caller: src.tagi.hooks.install_hooks\n callee: src.tagi.hooks._pre_commit_hook\n call_type: resolved\n- caller: src.tagi.hooks.install_hooks\n callee: src.tagi.hooks._hooks_dir\n call_type: resolved\n- caller: src.tagi.hooks.uninstall_hooks\n callee: src.tagi.hooks._pre_commit_hook\n call_type: resolved\n- caller: src.tagi.hooks.check_hooks_installed\n callee: src.tagi.hooks._pre_commit_hook\n call_type: resolved\n- caller: src.tagi.hooks.list_hooks\n callee: src.tagi.hooks._hooks_dir\n call_type: resolved\n- caller: src.tagi.hooks.run_hook\n callee: src.tagi.hooks._hooks_dir\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.analyze_python_imports\n callee: src.tagi.analyzer.dependency_graph._collect_import_names\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.build_dependency_graph\n callee: src.tagi.analyzer.dependency_graph.analyze_python_imports\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph._dfs_visit\n callee: src.tagi.analyzer.dependency_graph._mark\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph._dfs_visit\n callee: src.tagi.analyzer.dependency_graph._cycle_from\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.detect_cycles\n callee: src.tagi.analyzer.dependency_graph._dfs_visit\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph._find_longest_start\n callee: src.tagi.analyzer.dependency_graph._longest_path_length\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph._reconstruct_critical_path\n callee: src.tagi.analyzer.dependency_graph._next_critical_node\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.get_critical_path\n callee: src.tagi.analyzer.dependency_graph._find_longest_start\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.get_critical_path\n callee: src.tagi.analyzer.dependency_graph._reconstruct_critical_path\n call_type: resolved\n- caller: src.tagi.analyzer.metrics.MetricsCollector.collect\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.analyzer.metrics.MetricsCollector.collect\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.planner.sorter.group_by_complexity\n callee: src.tagi.planner.sorter.sort_by_complexity\n call_type: resolved\n- caller: src.tagi.planner.grouper.group_changes\n callee: src.tagi.planner.grouper._get_primary_tag\n call_type: resolved\n- caller: src.tagi.planner.grouper.group_changes\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.planner.grouper.group_changes\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.planner.grouper.group_by_tag\n callee: src.tagi.planner.selector.select_changes_by_tag\n call_type: resolved\n- caller: src.tagi.cli.git_operations._is_known_tag\n callee: src.tagi.cli.git_operations._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.git_operations._resolve_send_target\n callee: src.tagi.cli.git_operations._is_known_tag\n call_type: resolved\n- caller: src.tagi.cli.git_operations._filter_by_tag\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.cli.git_operations._filter_by_tag\n callee: src.tagi.cli.git_operations._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.git_operations._execute_git_operations\n callee: src.tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: src.tagi.cli.git_operations.send_command\n callee: src.tagi.cli.git_operations._resolve_send_target\n call_type: resolved\n- caller: src.tagi.cli.git_operations.auto_command\n callee: src.tagi.cli.main._configure_command_logging\n call_type: resolved\n- caller: src.tagi.cli.git_operations.auto_command\n callee: src.tagi.cli.git_operations.send_command\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.inspect_command\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.inspect_command\n callee: src.tagi.utils.change_stats.display_statistics_table\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.inspect_command\n callee: src.tagi.cli.display_utils._display_changes\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.inspect_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.filter_command\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.filter_command\n callee: src.tagi.utils.change_stats.display_statistics_table\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.filter_command\n callee: src.tagi.cli.display_utils._display_changes\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.filter_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.file_command\n callee: src.tagi.scanner.diff.get_diff\n call_type: resolved\n- caller: src.tagi.cli.provider_commands.detect_provider_command\n callee: src.tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: src.tagi.cli.provider_commands._pr_spec\n callee: src.tagi.cli.provider_commands._current_branch\n call_type: resolved\n- caller: src.tagi.cli.provider_commands.create_pr\n callee: src.tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: src.tagi.cli.provider_commands.create_pr\n callee: src.tagi.cli.provider_commands._pr_spec\n call_type: resolved\n- caller: src.tagi.cli.provider_commands.create_mr\n callee: src.tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: src.tagi.cli.provider_commands.create_mr\n callee: src.tagi.cli.provider_commands._pr_spec\n call_type: resolved\n- caller: src.tagi.cli.core_commands.scan_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.core_commands.scan_command\n callee: src.tagi.cli.display_utils._display_changes_grouped\n call_type: resolved\n- caller: src.tagi.cli.core_commands.scan_command\n callee: src.tagi.cli.display_utils._display_changes\n call_type: resolved\n- caller: src.tagi.cli.core_commands.list_groups_command\n callee: src.tagi.cli.core_commands._do_list_groups\n call_type: resolved\n- caller: src.tagi.cli.core_commands.list_command\n callee: src.tagi.cli.core_commands._do_list_groups\n call_type: resolved\n- caller: src.tagi.cli.core_commands._do_list_groups\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.core_commands._do_list_groups\n callee: src.tagi.utils.change_stats.calculate_tag_statistics\n call_type: resolved\n- caller: src.tagi.cli.core_commands._do_list_groups\n callee: src.tagi.utils.change_stats.display_statistics_table\n call_type: resolved\n- caller: src.tagi.cli.core_commands.stats_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.core_commands.stats_command\n callee: src.tagi.utils.change_stats.display_statistics_table\n call_type: resolved\n- caller: src.tagi.cli.core_commands.stats_command\n callee: src.tagi.utils.change_stats.calculate_tag_statistics\n call_type: resolved\n- caller: src.tagi.cli.display_utils._display_changes\n callee: src.tagi.cli.display_utils._format_tags\n call_type: resolved\n- caller: src.tagi.cli.display_utils._display_groups\n callee: src.tagi.cli.display_utils._format_tags\n call_type: resolved\n- caller: src.tagi.cli.display_utils._display_changes_grouped\n callee: src.tagi.cli.display_utils._display_groups\n call_type: resolved\n- caller: src.tagi.cli.main.setup_logging\n callee: src.tagi.utils.logger.setup_logger\n call_type: resolved\n- caller: src.tagi.cli.main._configure_command_logging\n callee: src.tagi.utils.logger.setup_logger\n call_type: resolved\n- caller: src.tagi.cli.main._is_known_tag\n callee: src.tagi.cli.main._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.main._resolve_send_target\n callee: src.tagi.cli.main._is_known_tag\n call_type: resolved\n- caller: src.tagi.cli.main.detect_provider\n callee: src.tagi.cli.provider_commands.detect_provider_command\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.publish_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.publish_command\n callee: src.tagi.cli.publishing_commands._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.publish_command\n callee: src.tagi.utils.publish_helpers.create_publish_group\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.deploy_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.deploy_command\n callee: src.tagi.cli.publishing_commands._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.summary_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.summary_command\n callee: src.tagi.utils.change_stats.calculate_tag_statistics\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.hooks_command\n callee: src.tagi.hooks.check_hooks_installed\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.draft_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.draft_command\n callee: src.tagi.cli.utility_commands._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.draft_command\n callee: src.tagi.utils.send_helpers.create_change_group\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.draft_command\n callee: src.tagi.composer.commit_message.generate_commit_message\n call_type: resolved\n- caller: src.tagi.providers.gitlab.GitLabProvider.is_authenticated\n callee: src.tagi.providers.utils.auth.is_authenticated_from_result\n call_type: resolved\n- caller: src.tagi.providers.gitlab.GitLabProvider.get_auth_status\n callee: src.tagi.providers.utils.auth.get_auth_status_from_result\n call_type: resolved\n- caller: src.tagi.providers.gitlab.GitLabProvider.create_pr\n callee: src.tagi.providers.utils.pr.execute_pr_command\n call_type: resolved\n- caller: src.tagi.providers.gitlab.GitLabProvider.create_pr\n callee: src.tagi.providers.utils.pr.build_pr_command\n call_type: resolved\n- caller: src.tagi.providers.github.GitHubProvider.is_authenticated\n callee: src.tagi.providers.utils.auth.is_authenticated_from_result\n call_type: resolved\n- caller: src.tagi.providers.github.GitHubProvider.get_auth_status\n callee: src.tagi.providers.utils.auth.get_auth_status_from_result\n call_type: resolved\n- caller: src.tagi.providers.github.GitHubProvider.create_pr\n callee: src.tagi.providers.utils.pr.execute_pr_command\n call_type: resolved\n- caller: src.tagi.providers.github.GitHubProvider.create_pr\n callee: src.tagi.providers.utils.pr.build_pr_command\n call_type: resolved\n- caller: src.tagi.scanner.status.scan_repo\n callee: src.tagi.config.load_config\n call_type: resolved\n- caller: src.tagi.scanner.status.scan_repo\n callee: src.tagi.config.Config.should_ignore\n call_type: resolved\n- caller: src.tagi.scanner.status.scan_repo\n callee: src.tagi.scanner.status.parse_status\n call_type: resolved\n- caller: src.tagi.heuristics.scoring.calculate_risk_score\n callee: src.tagi.heuristics.scoring._lines_risk_weight\n call_type: resolved\n- caller: src.tagi.heuristics.scoring.calculate_risk_score\n callee: src.tagi.heuristics.scoring._tag_risk_weight\n call_type: resolved\n- caller: src.tagi.heuristics.scoring.calculate_risk_score\n callee: src.tagi.heuristics.scoring._change_type_risk_weight\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_complexity\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_impact\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_stability\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_test_impact\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_dependency_depth\n call_type: resolved\n- caller: src.tagi.heuristics.metrics._calculate_complexity\n callee: src.tagi.heuristics.metrics._extension_complexity_weight\n call_type: resolved\n- caller: src.tagi.heuristics.metrics._calculate_impact\n callee: src.tagi.heuristics.metrics._extension_impact_weight\n call_type: resolved\n- caller: src.tagi.heuristics.tags.apply_tags\n callee: src.tagi.config.load_config\n call_type: resolved\n- caller: src.tagi.heuristics.tags.apply_tags\n callee: src.tagi.heuristics.tags._tag_change\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.tags._custom_config_tags\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.scanner.files.count_lines_changed\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.metrics.calculate_metrics\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.scoring.calculate_risk_score\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.tags.apply_path_tags\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.tags._size_tags\n call_type: resolved\n- caller: src.tagi.heuristics.rules._get_config_attr\n callee: src.tagi.config.load_config\n call_type: resolved\n- caller: src.tagi.heuristics.rules.get_custom_rules\n callee: src.tagi.heuristics.rules._get_config_attr\n call_type: resolved\n- caller: src.tagi.heuristics.rules.get_custom_heuristics\n callee: src.tagi.heuristics.rules._get_config_attr\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_conventional_message\n callee: src.tagi.composer.formats._commit_type\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_conventional_message\n callee: src.tagi.composer._tags.infer_scope\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_conventional_message\n callee: src.tagi.composer.formats._describe_changes\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_conventional_message\n callee: src.tagi.composer._tags.all_tags\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_detailed_message\n callee: src.tagi.composer.formats._count_tags\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_detailed_message\n callee: src.tagi.composer.formats._detailed_file_lines\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_simple_message\n callee: src.tagi.composer._tags.summary_tag\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_oneline_message\n callee: src.tagi.composer._tags.summary_tag\n call_type: resolved\n- caller: src.tagi.composer.summary.generate_summary\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.composer.summary.generate_summary\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.composer.commit_message.generate_commit_message\n callee: src.tagi.composer._templates.render_template\n call_type: resolved\n- caller: src.tagi.composer.commit_message.generate_commit_message\n callee: src.tagi.composer.commit_message._improve_with_llm\n call_type: resolved\n- caller: src.tagi.composer.commit_message.generate_commit_message\n callee: src.tagi.composer._tags.summary_tag\n call_type: resolved\n- caller: src.tagi.composer.commit_message.generate_commit_message\n callee: src.tagi.config.load_config\n call_type: resolved\n- caller: src.tagi.composer._tags.all_tag_values\n callee: src.tagi.composer._tags.all_tags\n call_type: resolved\n- caller: src.tagi.composer._tags.summary_tag\n callee: src.tagi.composer._tags.all_tags\n call_type: resolved\n- caller: src.tagi.utils.summary_helpers.build_statistics_section\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.utils.summary_helpers.build_statistics_section\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.utils.publish_helpers.detect_and_get_provider\n callee: src.tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: src.tagi.utils.publish_helpers.create_publish_group\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.utils.publish_helpers.create_publish_group\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.utils.detect_provider.get_provider\n callee: src.tagi.utils.detect_provider.detect_git_provider\n call_type: resolved\n- caller: src.tagi.utils.send_helpers.create_change_group\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.utils.send_helpers.create_change_group\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.utils.change_stats.calculate_tag_statistics\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.utils.change_stats.calculate_tag_statistics\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.utils.change_filter._resolve_tag_enums\n callee: src.tagi.utils.change_filter._normalize_tag\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._resolve_tag_enums\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._changes_matching_any\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._changes_matching_tag\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._changes_matching_all\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._normalize_tag\n call_type: resolved\n- caller: src.tagi.utils.change_filter.filter_changes_by_tag\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.utils.change_filter.filter_changes_by_tags_any\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.utils.change_filter.filter_changes_by_tags_all\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\nmodules:\n src.tagi.analyzer.dependency_graph:\n - src.tagi.analyzer.dependency_graph._collect_import_names\n - src.tagi.analyzer.dependency_graph._cycle_from\n - src.tagi.analyzer.dependency_graph._dfs_visit\n - src.tagi.analyzer.dependency_graph._find_longest_start\n - src.tagi.analyzer.dependency_graph._longest_path_length\n - src.tagi.analyzer.dependency_graph._mark\n - src.tagi.analyzer.dependency_graph._next_critical_node\n - src.tagi.analyzer.dependency_graph._reconstruct_critical_path\n - src.tagi.analyzer.dependency_graph.analyze_python_imports\n - src.tagi.analyzer.dependency_graph.build_dependency_graph\n - src.tagi.analyzer.dependency_graph.detect_cycles\n - src.tagi.analyzer.dependency_graph.get_critical_path\n src.tagi.analyzer.metrics:\n - src.tagi.analyzer.metrics.MetricsCollector.collect\n src.tagi.cli.core_commands:\n - src.tagi.cli.core_commands._do_list_groups\n - src.tagi.cli.core_commands.list_command\n - src.tagi.cli.core_commands.list_groups_command\n - src.tagi.cli.core_commands.scan_command\n - src.tagi.cli.core_commands.stats_command\n src.tagi.cli.display_utils:\n - src.tagi.cli.display_utils._display_changes\n - src.tagi.cli.display_utils._display_changes_grouped\n - src.tagi.cli.display_utils._display_groups\n - src.tagi.cli.display_utils._format_tags\n src.tagi.cli.git_operations:\n - src.tagi.cli.git_operations._ensure_tag_prefix\n - src.tagi.cli.git_operations._execute_git_operations\n - src.tagi.cli.git_operations._filter_by_tag\n - src.tagi.cli.git_operations._is_known_tag\n - src.tagi.cli.git_operations._resolve_send_target\n - src.tagi.cli.git_operations.auto_command\n - src.tagi.cli.git_operations.send_command\n src.tagi.cli.inspection_commands:\n - src.tagi.cli.inspection_commands.file_command\n - src.tagi.cli.inspection_commands.filter_command\n - src.tagi.cli.inspection_commands.inspect_command\n src.tagi.cli.main:\n - src.tagi.cli.main._configure_command_logging\n - src.tagi.cli.main._ensure_tag_prefix\n - src.tagi.cli.main._is_known_tag\n - src.tagi.cli.main._resolve_send_target\n - src.tagi.cli.main.detect_provider\n - src.tagi.cli.main.setup_logging\n src.tagi.cli.provider_commands:\n - src.tagi.cli.provider_commands._current_branch\n - src.tagi.cli.provider_commands._pr_spec\n - src.tagi.cli.provider_commands.create_mr\n - src.tagi.cli.provider_commands.create_pr\n - src.tagi.cli.provider_commands.detect_provider_command\n src.tagi.cli.publishing_commands:\n - src.tagi.cli.publishing_commands._ensure_tag_prefix\n - src.tagi.cli.publishing_commands.deploy_command\n - src.tagi.cli.publishing_commands.publish_command\n src.tagi.cli.scan_utils:\n - src.tagi.cli.scan_utils.scan_and_tag\n src.tagi.cli.utility_commands:\n - src.tagi.cli.utility_commands._ensure_tag_prefix\n - src.tagi.cli.utility_commands.draft_command\n - src.tagi.cli.utility_commands.hooks_command\n - src.tagi.cli.utility_commands.summary_command\n src.tagi.composer._tags:\n - src.tagi.composer._tags.all_tag_values\n - src.tagi.composer._tags.all_tags\n - src.tagi.composer._tags.infer_scope\n - src.tagi.composer._tags.summary_tag\n src.tagi.composer._templates:\n - src.tagi.composer._templates.render_template\n src.tagi.composer.commit_message:\n - src.tagi.composer.commit_message._improve_with_llm\n - src.tagi.composer.commit_message.generate_commit_message\n src.tagi.composer.formats:\n - src.tagi.composer.formats._commit_type\n - src.tagi.composer.formats._count_tags\n - src.tagi.composer.formats._describe_changes\n - src.tagi.composer.formats._detailed_file_lines\n - src.tagi.composer.formats.generate_conventional_message\n - src.tagi.composer.formats.generate_detailed_message\n - src.tagi.composer.formats.generate_oneline_message\n - src.tagi.composer.formats.generate_simple_message\n src.tagi.composer.summary:\n - src.tagi.composer.summary.generate_summary\n src.tagi.config:\n - src.tagi.config.Config.should_ignore\n - src.tagi.config.load_config\n src.tagi.heuristics.metrics:\n - src.tagi.heuristics.metrics._calculate_complexity\n - src.tagi.heuristics.metrics._calculate_dependency_depth\n - src.tagi.heuristics.metrics._calculate_impact\n - src.tagi.heuristics.metrics._calculate_stability\n - src.tagi.heuristics.metrics._calculate_test_impact\n - src.tagi.heuristics.metrics._extension_complexity_weight\n - src.tagi.heuristics.metrics._extension_impact_weight\n - src.tagi.heuristics.metrics.calculate_metrics\n src.tagi.heuristics.rules:\n - src.tagi.heuristics.rules._get_config_attr\n - src.tagi.heuristics.rules.get_custom_heuristics\n - src.tagi.heuristics.rules.get_custom_rules\n src.tagi.heuristics.scoring:\n - src.tagi.heuristics.scoring._change_type_risk_weight\n - src.tagi.heuristics.scoring._lines_risk_weight\n - src.tagi.heuristics.scoring._tag_risk_weight\n - src.tagi.heuristics.scoring.calculate_risk_score\n src.tagi.heuristics.tags:\n - src.tagi.heuristics.tags._custom_config_tags\n - src.tagi.heuristics.tags._size_tags\n - src.tagi.heuristics.tags._tag_change\n - src.tagi.heuristics.tags.apply_path_tags\n - src.tagi.heuristics.tags.apply_tags\n src.tagi.hooks:\n - src.tagi.hooks._hooks_dir\n - src.tagi.hooks._pre_commit_hook\n - src.tagi.hooks.check_hooks_installed\n - src.tagi.hooks.install_hooks\n - src.tagi.hooks.list_hooks\n - src.tagi.hooks.run_hook\n - src.tagi.hooks.uninstall_hooks\n src.tagi.planner.grouper:\n - src.tagi.planner.grouper._get_primary_tag\n - src.tagi.planner.grouper.group_by_tag\n - src.tagi.planner.grouper.group_changes\n src.tagi.planner.selector:\n - src.tagi.planner.selector.select_changes_by_tag\n src.tagi.planner.sorter:\n - src.tagi.planner.sorter.group_by_complexity\n - src.tagi.planner.sorter.sort_by_complexity\n src.tagi.providers.github:\n - src.tagi.providers.github.GitHubProvider.create_pr\n - src.tagi.providers.github.GitHubProvider.get_auth_status\n - src.tagi.providers.github.GitHubProvider.is_authenticated\n src.tagi.providers.gitlab:\n - src.tagi.providers.gitlab.GitLabProvider.create_pr\n - src.tagi.providers.gitlab.GitLabProvider.get_auth_status\n - src.tagi.providers.gitlab.GitLabProvider.is_authenticated\n src.tagi.providers.utils.auth:\n - src.tagi.providers.utils.auth.get_auth_status_from_result\n - src.tagi.providers.utils.auth.is_authenticated_from_result\n src.tagi.providers.utils.pr:\n - src.tagi.providers.utils.pr.build_pr_command\n - src.tagi.providers.utils.pr.execute_pr_command\n src.tagi.scanner.diff:\n - src.tagi.scanner.diff.get_diff\n src.tagi.scanner.files:\n - src.tagi.scanner.files.count_lines_changed\n src.tagi.scanner.status:\n - src.tagi.scanner.status.parse_status\n - src.tagi.scanner.status.scan_repo\n src.tagi.utils.change_filter:\n - src.tagi.utils.change_filter._changes_matching_all\n - src.tagi.utils.change_filter._changes_matching_any\n - src.tagi.utils.change_filter._changes_matching_tag\n - src.tagi.utils.change_filter._normalize_tag\n - src.tagi.utils.change_filter._resolve_tag_enums\n - src.tagi.utils.change_filter.filter_changes_by_tag\n - src.tagi.utils.change_filter.filter_changes_by_tags_all\n - src.tagi.utils.change_filter.filter_changes_by_tags_any\n - src.tagi.utils.change_filter.resolve_filtered_changes\n src.tagi.utils.change_stats:\n - src.tagi.utils.change_stats.calculate_tag_statistics\n - src.tagi.utils.change_stats.display_statistics_table\n src.tagi.utils.detect_provider:\n - src.tagi.utils.detect_provider.detect_git_provider\n - src.tagi.utils.detect_provider.get_provider\n src.tagi.utils.logger:\n - src.tagi.utils.logger.setup_logger\n src.tagi.utils.publish_helpers:\n - src.tagi.utils.publish_helpers.create_publish_group\n - src.tagi.utils.publish_helpers.detect_and_get_provider\n src.tagi.utils.risk:\n - src.tagi.utils.risk.average_risk\n - src.tagi.utils.risk.total_lines_changed\n src.tagi.utils.send_helpers:\n - src.tagi.utils.send_helpers.create_change_group\n src.tagi.utils.summary_helpers:\n - src.tagi.utils.summary_helpers.build_statistics_section\nentry_points:\n- src.tagi.analyzer.dependency_graph._LevelOrder.__init__\n- src.tagi.analyzer.dependency_graph._LevelOrder._drain_level\n- src.tagi.analyzer.dependency_graph._LevelOrder.levels\n- src.tagi.analyzer.dependency_graph.build_dependency_graph\n- src.tagi.analyzer.dependency_graph.detect_cycles\n- src.tagi.analyzer.dependency_graph.find_dependency_order\n- src.tagi.analyzer.dependency_graph.get_critical_path\n- src.tagi.analyzer.metrics.MetricsCollector.__init__\n- src.tagi.analyzer.metrics.MetricsCollector.collect\n- src.tagi.analyzer.metrics.MetricsCollector.save\n- src.tagi.analyzer.metrics.MetricsCollector.to_json\n- src.tagi.analyzer.metrics.compare_metrics\n- src.tagi.analyzer.metrics.generate_report\n- src.tagi.cli.core_commands.list_command\n- src.tagi.cli.core_commands.list_groups_command\n- src.tagi.cli.core_commands.scan_command\n- src.tagi.cli.core_commands.stats_command\n- src.tagi.cli.git_operations.auto_command\n- src.tagi.cli.inspection_commands.file_command\n- src.tagi.cli.inspection_commands.filter_command\n- src.tagi.cli.inspection_commands.inspect_command\n- src.tagi.cli.main._resolve_send_target\n- src.tagi.cli.main.detect_provider\n- src.tagi.cli.main.setup_logging\n- src.tagi.cli.provider_commands.create_mr\n- src.tagi.cli.provider_commands.create_pr\n- src.tagi.cli.publishing_commands.deploy_command\n- src.tagi.cli.publishing_commands.publish_command\n- src.tagi.cli.utility_commands.draft_command\n- src.tagi.cli.utility_commands.hooks_command\n- src.tagi.cli.utility_commands.init_command\n- src.tagi.cli.utility_commands.summary_command\n- src.tagi.composer._tags.all_tag_values\n- src.tagi.composer.formats.generate_conventional_message\n- src.tagi.composer.formats.generate_detailed_message\n- src.tagi.composer.formats.generate_files_message\n- src.tagi.composer.formats.generate_oneline_message\n- src.tagi.composer.formats.generate_simple_message\n- src.tagi.composer.summary.generate_file_list\n- src.tagi.composer.summary.generate_summary\n- src.tagi.config.Config.__init__\n- src.tagi.config.Config._apply_sections\n- src.tagi.config.Config._load_config\n- src.tagi.config.Config.get_custom_tags_for_pattern\n- src.tagi.config.Config.get_heuristics_for_path\n- src.tagi.config.Config.get_tag_color\n- src.tagi.config.Config.get_tag_description\n- src.tagi.config.Config.get_tag_for_path\n- src.tagi.config.Config.get_tags_for_path\n- src.tagi.config.Config.get_template\n- src.tagi.executor.git.GitExecutor.__init__\n- src.tagi.executor.git.GitExecutor._run_command\n- src.tagi.executor.git.GitExecutor.add\n- src.tagi.executor.git.GitExecutor.commit\n- src.tagi.executor.git.GitExecutor.get_current_branch\n- src.tagi.executor.git.GitExecutor.get_remote_url\n- src.tagi.executor.git.GitExecutor.has_staged_changes\n- src.tagi.executor.git.GitExecutor.push\n- src.tagi.executor.git.GitExecutor.status\n- src.tagi.executor.publish.PublishExecutor.__init__\n- src.tagi.executor.publish.PublishExecutor.dry_run\n- src.tagi.executor.publish.PublishExecutor.publish\n- src.tagi.executor.publish.PublishExecutor.stage_and_commit\n- src.tagi.heuristics.metrics.calculate_vector_distance\n- src.tagi.heuristics.metrics.filter_by_metrics\n- src.tagi.heuristics.metrics.sort_by_metric\n- src.tagi.heuristics.rules.get_custom_heuristics\n- src.tagi.heuristics.rules.get_custom_rules\n- src.tagi.heuristics.tags.apply_tags\n- src.tagi.hooks.install_hooks\n- src.tagi.hooks.list_hooks\n- src.tagi.hooks.run_hook\n- src.tagi.hooks.uninstall_hooks\n- src.tagi.llm.llx_adapter.LlxAdapter.__init__\n- src.tagi.llm.llx_adapter.LlxAdapter.improve_description\n- src.tagi.llm.llx_adapter.LlxAdapter.improve_message\n- src.tagi.llm.llx_adapter.LlxAdapter.is_available\n- src.tagi.models.change.ChangeMetrics.to_vector\n- src.tagi.planner.branch_grouper.get_branch_info\n- src.tagi.planner.branch_grouper.group_by_branch\n- src.tagi.planner.grouper.group_by_risk\n- src.tagi.planner.grouper.group_by_tag\n- src.tagi.planner.grouper.group_changes\n- src.tagi.planner.preview.preview_changes\n- src.tagi.planner.preview.preview_plan\n- src.tagi.planner.selector.select_by_tags\n- src.tagi.planner.selector.select_low_risk_changes\n- src.tagi.planner.selector.select_safe_changes\n- src.tagi.planner.selector.select_small_changes\n- src.tagi.planner.sorter.group_by_complexity\n- src.tagi.planner.sorter.sort_by_tag_priority\n- src.tagi.providers.base.BaseProvider.__init__\n- src.tagi.providers.base.BaseProvider._check_git_remote_for_provider\n- src.tagi.providers.base.BaseProvider._get_git_remote_url\n- src.tagi.providers.base.BaseProvider._run_command\n- src.tagi.providers.base.BaseProvider.create_pr\n- src.tagi.providers.base.BaseProvider.detect_remote\n- src.tagi.providers.base.BaseProvider.get_auth_status\n- src.tagi.providers.base.BaseProvider.is_authenticated\n- src.tagi.providers.detector.detect_provider\n- src.tagi.providers.github.GitHubProvider.create_pr\n- src.tagi.providers.github.GitHubProvider.detect_remote\n- src.tagi.providers.github.GitHubProvider.get_auth_status\n- src.tagi.providers.github.GitHubProvider.get_token\n- src.tagi.providers.github.GitHubProvider.is_authenticated\n- src.tagi.providers.gitlab.GitLabProvider.create_pr\n- src.tagi.providers.gitlab.GitLabProvider.detect_remote\n- src.tagi.providers.gitlab.GitLabProvider.get_auth_status\n- src.tagi.providers.gitlab.GitLabProvider.get_configured_host\n- src.tagi.providers.gitlab.GitLabProvider.is_authenticated\n- src.tagi.providers.koru.KoruProvider.__init__\n- src.tagi.providers.koru.KoruProvider._deployment_recommendations\n- src.tagi.providers.koru.KoruProvider._make_api_request\n- src.tagi.providers.koru.KoruProvider.analyze_deployment_priority\n- src.tagi.providers.koru.KoruProvider.deploy_group\n- src.tagi.providers.koru.KoruProvider.get_context_brief\n- src.tagi.providers.koru.KoruProvider.get_planfile_tickets\n- src.tagi.providers.koru.KoruProvider.get_topology\n- src.tagi.providers.koru.KoruProvider.is_available\n- src.tagi.providers.koru.KoruProvider.run_quality_gates\n- src.tagi.scanner.diff.get_staged_diff\n- src.tagi.scanner.status.scan_repo\n- src.tagi.ui.design_tokens.DesignTokens.__init__\n- src.tagi.ui.design_tokens.DesignTokens.get_css_string\n- src.tagi.ui.design_tokens.DesignTokens.get_css_variables\n- src.tagi.utils.change_filter.filter_changes_by_tag\n- src.tagi.utils.change_filter.filter_changes_by_tags_all\n- src.tagi.utils.line_builder.LineBuilder.__init__\n- src.tagi.utils.line_builder.LineBuilder.add\n- src.tagi.utils.line_builder.LineBuilder.as_list\n- src.tagi.utils.line_builder.LineBuilder.text\n- src.tagi.utils.publish_helpers.detect_and_get_provider\n- src.tagi.utils.summary_helpers.build_changes_by_type_section\n- src.tagi.utils.summary_helpers.build_file_list_section\n- src.tagi.utils.summary_helpers.build_report_header\n- src.tagi.utils.summary_helpers.build_statistics_section\n- src.tagi.utils.summary_helpers.build_tag_distribution_section\n", "is_subdir": false}, {"name": "duplication.toon.yaml", "rel_path": "duplication.toon.yaml", "path": "duplication.toon.yaml", "size": "5.9KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# redup/duplication | 10 groups | 47f 3609L | 2026-05-26\n\nSUMMARY:\n files_scanned: 47\n total_lines: 3609\n dup_groups: 10\n dup_fragments: 20\n saved_lines: 77\n scan_ms: 2213\n\nHOTSPOTS[7] (files with most duplication):\n src/tagi/utils/inspect_helpers.py dup=54L groups=2 frags=3 (1.5%)\n src/tagi/cli.py dup=39L groups=3 frags=5 (1.1%)\n src/tagi/providers/github.py dup=17L groups=4 frags=4 (0.5%)\n src/tagi/providers/gitlab.py dup=17L groups=4 frags=4 (0.5%)\n src/tagi/utils/publish_helpers.py dup=12L groups=1 frags=1 (0.3%)\n src/tagi/providers/detector.py dup=9L groups=1 frags=1 (0.2%)\n src/tagi/heuristics/rules.py dup=6L groups=1 frags=2 (0.2%)\n\nDUPLICATES[10] (ranked by impact):\n [69031414365d89a7] STRU filter_changes_by_tags_any L=21 N=2 saved=21 sim=1.00\n src/tagi/utils/inspect_helpers.py:23-43 (filter_changes_by_tags_any)\n src/tagi/utils/inspect_helpers.py:46-66 (filter_changes_by_tags_all)\n [34f34aac7a5602b7] STRU filter_changes_by_tag L=12 N=2 saved=12 sim=1.00\n src/tagi/utils/inspect_helpers.py:9-20 (filter_changes_by_tag)\n src/tagi/utils/publish_helpers.py:28-39 (filter_changes_by_tag)\n [59cf75b9ca253237] STRU create_pr L=10 N=2 saved=10 sim=1.00\n src/tagi/cli.py:772-781 (create_pr)\n src/tagi/cli.py:784-793 (create_mr)\n [0defbec6f6d556b3] EXAC detect_provider L=9 N=2 saved=9 sim=1.00\n src/tagi/cli.py:761-769 (detect_provider)\n src/tagi/providers/detector.py:7-15 (detect_provider)\n [2f1566a469905cc9] STRU create_pr L=6 N=2 saved=6 sim=1.00\n src/tagi/providers/github.py:30-35 (create_pr)\n src/tagi/providers/gitlab.py:36-41 (create_pr)\n [54c9428ffca26dbc] STRU list_groups L=5 N=2 saved=5 sim=1.00\n src/tagi/cli.py:117-121 (list_groups)\n src/tagi/cli.py:125-129 (list_cmd)\n [9aaebb2fb961d57d] STRU is_authenticated L=4 N=2 saved=4 sim=1.00\n src/tagi/providers/github.py:13-16 (is_authenticated)\n src/tagi/providers/gitlab.py:11-14 (is_authenticated)\n [180c7709efe6a452] STRU get_auth_status L=4 N=2 saved=4 sim=1.00\n src/tagi/providers/github.py:18-21 (get_auth_status)\n src/tagi/providers/gitlab.py:16-19 (get_auth_status)\n [9e51ade4e046160f] STRU get_custom_rules L=3 N=2 saved=3 sim=1.00\n src/tagi/heuristics/rules.py:14-16 (get_custom_rules)\n src/tagi/heuristics/rules.py:19-21 (get_custom_heuristics)\n [ead418deaec12c72] STRU detect_remote L=3 N=2 saved=3 sim=1.00\n src/tagi/providers/github.py:37-39 (detect_remote)\n src/tagi/providers/gitlab.py:43-45 (detect_remote)\n\nREFACTOR[10] (ranked by priority):\n [1] ○ extract_function → src/tagi/utils/utils/filter_changes_by_tags_any.py\n WHY: 2 occurrences of 21-line block across 1 files — saves 21 lines\n FILES: src/tagi/utils/inspect_helpers.py\n [2] ○ extract_function → src/tagi/utils/utils/filter_changes_by_tag.py\n WHY: 2 occurrences of 12-line block across 2 files — saves 12 lines\n FILES: src/tagi/utils/inspect_helpers.py, src/tagi/utils/publish_helpers.py\n [3] ○ extract_function → src/tagi/utils/create_pr.py\n WHY: 2 occurrences of 10-line block across 1 files — saves 10 lines\n FILES: src/tagi/cli.py\n [4] ○ extract_function → src/tagi/utils/detect_provider.py\n WHY: 2 occurrences of 9-line block across 2 files — saves 9 lines\n FILES: src/tagi/cli.py, src/tagi/providers/detector.py\n [5] ○ extract_function → src/tagi/providers/utils/create_pr.py\n WHY: 2 occurrences of 6-line block across 2 files — saves 6 lines\n FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py\n [6] ○ extract_function → src/tagi/utils/list_groups.py\n WHY: 2 occurrences of 5-line block across 1 files — saves 5 lines\n FILES: src/tagi/cli.py\n [7] ○ extract_function → src/tagi/providers/utils/is_authenticated.py\n WHY: 2 occurrences of 4-line block across 2 files — saves 4 lines\n FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py\n [8] ○ extract_function → src/tagi/providers/utils/get_auth_status.py\n WHY: 2 occurrences of 4-line block across 2 files — saves 4 lines\n FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py\n [9] ○ extract_function → src/tagi/heuristics/utils/get_custom_rules.py\n WHY: 2 occurrences of 3-line block across 1 files — saves 3 lines\n FILES: src/tagi/heuristics/rules.py\n [10] ○ extract_function → src/tagi/providers/utils/detect_remote.py\n WHY: 2 occurrences of 3-line block across 2 files — saves 3 lines\n FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py\n\nQUICK_WINS[5] (low risk, high savings — do first):\n [1] extract_function saved=21L → src/tagi/utils/utils/filter_changes_by_tags_any.py\n FILES: inspect_helpers.py\n [2] extract_function saved=12L → src/tagi/utils/utils/filter_changes_by_tag.py\n FILES: inspect_helpers.py, publish_helpers.py\n [3] extract_function saved=10L → src/tagi/utils/create_pr.py\n FILES: cli.py\n [4] extract_function saved=9L → src/tagi/utils/detect_provider.py\n FILES: cli.py, detector.py\n [5] extract_function saved=6L → src/tagi/providers/utils/create_pr.py\n FILES: github.py, gitlab.py\n\nEFFORT_ESTIMATE (total ≈ 2.6h):\n medium filter_changes_by_tags_any saved=21L ~42min\n easy filter_changes_by_tag saved=12L ~24min\n easy create_pr saved=10L ~20min\n easy detect_provider saved=9L ~18min\n easy create_pr saved=6L ~12min\n easy list_groups saved=5L ~10min\n easy is_authenticated saved=4L ~8min\n easy get_auth_status saved=4L ~8min\n easy get_custom_rules saved=3L ~6min\n easy detect_remote saved=3L ~6min\n\nMETRICS-TARGET:\n dup_groups: 10 → 0\n saved_lines: 77 lines recoverable\n", "is_subdir": false}, {"name": "evolution.toon.yaml", "rel_path": "evolution.toon.yaml", "path": "evolution.toon.yaml", "size": "1.5KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# code2llm/evolution | 225 func | 51f | 2026-09-19\n# generated in 0.00s\n\nNEXT[1] (ranked by impact):\n [1] !! SPLIT goal.yaml\n WHY: 539L, 0 classes, max CC=0\n EFFORT: ~4h IMPACT: 0\n\n\nRISKS[1]:\n ⚠ Splitting goal.yaml may break 0 import paths\n\nMETRICS-TARGET:\n CC̄: 2.9 → ≤2.0\n max-CC: 11 → ≤5\n god-modules: 1 → 0\n high-CC(≥15): 0 → ≤0\n hub-types: 0 → ≤0\n\nPATTERNS (language parser shared logic):\n _extract_declarations() in base.py — unified extraction for:\n - TypeScript: interfaces, types, classes, functions, arrow funcs\n - PHP: namespaces, traits, classes, functions, includes\n - Ruby: modules, classes, methods, requires\n - C++: classes, structs, functions, #includes\n - C#: classes, interfaces, methods, usings\n - Java: classes, interfaces, methods, imports\n - Go: packages, functions, structs\n - Rust: modules, functions, traits, use statements\n\n Shared regex patterns per language:\n - import: language-specific import/require/using patterns\n - class: class/struct/trait declarations with inheritance\n - function: function/method signatures with visibility\n - brace_tracking: for C-family languages ({ })\n - end_keyword_tracking: for Ruby (module/class/def...end)\n\n Benefits:\n - Consistent extraction logic across all languages\n - Reduced code duplication (~70% reduction in parser LOC)\n - Easier maintenance: fix once, apply everywhere\n - Standardized FunctionInfo/ClassInfo models\n\nHISTORY:\n prev CC̄=2.9 → now CC̄=2.9\n", "is_subdir": false}, {"name": "map.toon.yaml", "rel_path": "map.toon.yaml", "path": "map.toon.yaml", "size": "16.9KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# tagi | 75f 5609L | yaml:5,txt:2,toml:1,shell:1,python:66 | 2026-09-19\n# generated in 0.01s\n# stats: 225 func | 0 cls | 75 mod | CC̄=2.9 | critical:0 | cycles:0\n# alerts[5]: fan-out scan_repo=15; fan-out publish_command=14; fan-out send_command=13; fan-out setup_logger=13; fan-out summary_command=13\n# hotspots[5]: scan_repo fan=15; publish_command fan=14; send_command fan=13; summary_command fan=13; setup_logger fan=13\n# evolution: CC̄ 2.9→2.9 (flat 0.0)\n# Keys: M=modules, D=details, i=imports, e=exports, c=classes, f=functions, m=methods\nM[75]:\n goal.yaml,539\n koru.yaml,133\n local.dev.txt,11\n project.sh,48\n pyproject.toml,49\n regix.yaml,93\n src/tagi/__init__.py,47\n src/tagi/__main__.py,6\n src/tagi/analyzer/dependency_graph.py,276\n src/tagi/analyzer/metrics.py,153\n src/tagi/cli/__init__.py,32\n src/tagi/cli/core_commands.py,94\n src/tagi/cli/display_utils.py,79\n src/tagi/cli/git_operations.py,170\n src/tagi/cli/inspection_commands.py,120\n src/tagi/cli/main.py,113\n src/tagi/cli/provider_commands.py,79\n src/tagi/cli/publishing_commands.py,139\n src/tagi/cli/scan_utils.py,25\n src/tagi/cli/utility_commands.py,211\n src/tagi/composer/__init__.py,12\n src/tagi/composer/_tags.py,52\n src/tagi/composer/_templates.py,21\n src/tagi/composer/commit_message.py,64\n src/tagi/composer/formats.py,141\n src/tagi/composer/summary.py,39\n src/tagi/config.py,126\n src/tagi/executor/__init__.py,9\n src/tagi/executor/git.py,72\n src/tagi/executor/publish.py,39\n src/tagi/heuristics/__init__.py,13\n src/tagi/heuristics/metrics.py,228\n src/tagi/heuristics/rules.py,20\n src/tagi/heuristics/scoring.py,41\n src/tagi/heuristics/tags.py,89\n src/tagi/hooks.py,127\n src/tagi/llm/__init__.py,7\n src/tagi/llm/llx_adapter.py,55\n src/tagi/models/__init__.py,14\n src/tagi/models/change.py,60\n src/tagi/models/group.py,16\n src/tagi/models/plan.py,23\n src/tagi/planner/__init__.py,18\n src/tagi/planner/branch_grouper.py,88\n src/tagi/planner/grouper.py,74\n src/tagi/planner/preview.py,43\n src/tagi/planner/selector.py,44\n src/tagi/planner/sorter.py,104\n src/tagi/providers/__init__.py,11\n src/tagi/providers/base.py,70\n src/tagi/providers/detector.py,15\n src/tagi/providers/github.py,38\n src/tagi/providers/gitlab.py,47\n src/tagi/providers/koru.py,171\n src/tagi/providers/utils/__init__.py,1\n src/tagi/providers/utils/auth.py,32\n src/tagi/providers/utils/pr.py,46\n src/tagi/scanner/__init__.py,13\n src/tagi/scanner/diff.py,29\n src/tagi/scanner/files.py,29\n src/tagi/scanner/status.py,66\n src/tagi/ui/design_tokens.py,221\n src/tagi/utils/change_filter.py,120\n src/tagi/utils/change_stats.py,42\n src/tagi/utils/detect_provider.py,54\n src/tagi/utils/inspect_helpers.py,25\n src/tagi/utils/line_builder.py,23\n src/tagi/utils/logger.py,71\n src/tagi/utils/publish_helpers.py,40\n src/tagi/utils/risk.py,33\n src/tagi/utils/send_helpers.py,34\n src/tagi/utils/summary_helpers.py,113\n testql-scenarios/generated-cli-tests.testql.toon.yaml,20\n tree.txt,89\n wup.yaml,100\nD:\n src/tagi/cli/publishing_commands.py:\n e: _ensure_tag_prefix,publish_command,deploy_command\n _ensure_tag_prefix(tag)\n publish_command(tag;repo_path;dry_run;template;verbose)\n deploy_command(tag;repo_path;environment;dry_run;verbose)\n src/tagi/analyzer/metrics.py:\n e: MetricsCollector,generate_report,compare_metrics\n MetricsCollector: __init__(0),collect(1),to_json(0),save(1) # Collect and analyze metrics about changes...\n generate_report(metrics)\n compare_metrics(metrics1;metrics2)\n src/tagi/cli/utility_commands.py:\n e: _ensure_tag_prefix,summary_command,init_command,hooks_command,draft_command\n _ensure_tag_prefix(tag)\n summary_command(repo_path;output)\n init_command(repo_path;force)\n hooks_command(repo_path;install;uninstall;list_hooks)\n draft_command(tag;repo_path;template)\n src/tagi/planner/branch_grouper.py:\n e: group_by_branch,get_branch_info\n group_by_branch(changes;repo_path)\n get_branch_info(repo_path)\n src/tagi/planner/selector.py:\n e: select_changes_by_tag,select_low_risk_changes,select_small_changes,select_by_tags,select_safe_changes\n select_changes_by_tag(changes;tag)\n select_low_risk_changes(changes;threshold)\n select_small_changes(changes;max_lines)\n select_by_tags(changes;tags;require_all)\n select_safe_changes(changes)\n src/tagi/providers/koru.py:\n e: KoruDeploymentPlan,KoruProvider\n KoruDeploymentPlan: # Deployment plan from Koru API...\n KoruProvider: __init__(3),_make_api_request(3),get_topology(0),get_planfile_tickets(0),run_quality_gates(0),get_context_brief(0),_deployment_recommendations(4),analyze_deployment_priority(1),deploy_group(3),is_available(0) # Integration with Koru API for deployment analysis...\n src/tagi/composer/summary.py:\n e: generate_summary,generate_file_list\n generate_summary(changes)\n generate_file_list(changes;max_files)\n src/tagi/analyzer/dependency_graph.py:\n e: _LevelOrder,_collect_import_names,analyze_python_imports,build_dependency_graph,find_dependency_order,_mark,_cycle_from,_dfs_visit,detect_cycles,_longest_path_length,_find_longest_start,_next_critical_node,_reconstruct_critical_path,get_critical_path\n _LevelOrder: __init__(1),levels(0),_drain_level(0) # Level-by-level topological order over a dependency graph (Ka...\n _collect_import_names(tree)\n analyze_python_imports(file_path;repo_path)\n build_dependency_graph(changes;repo_path)\n find_dependency_order(graph)\n _mark(node;color;value)\n _cycle_from(node;path)\n _dfs_visit(node;graph;color;path;cycles)\n detect_cycles(graph)\n _longest_path_length(node;graph;memo)\n _find_longest_start(graph;memo)\n _next_critical_node(node;graph;memo;visited)\n _reconstruct_critical_path(start_node;graph;memo)\n get_critical_path(graph)\n src/tagi/planner/preview.py:\n e: preview_plan,preview_changes\n preview_plan(changes;tag)\n preview_changes(group)\n src/tagi/cli/git_operations.py:\n e: _ensure_tag_prefix,_is_known_tag,_resolve_send_target,_filter_by_tag,_execute_git_operations,send_command,auto_command\n _ensure_tag_prefix(tag)\n _is_known_tag(value)\n _resolve_send_target(target;repo_path)\n _filter_by_tag(changes;tag)\n _execute_git_operations(changes;commit_message;push;repo_path)\n send_command(target;repo_path;auto_order;dry_run;push;template;verbose)\n auto_command(repo_path;dry_run;push;template;verbose)\n src/tagi/cli/inspection_commands.py:\n e: inspect_command,filter_command,file_command\n inspect_command(tag;repo_path;diff)\n filter_command(tags;repo_path;mode;diff)\n file_command(file_path;repo_path;diff)\n src/tagi/cli/core_commands.py:\n e: scan_command,list_groups_command,list_command,_do_list_groups,stats_command\n scan_command(repo_path;grouped)\n list_groups_command(repo_path)\n list_command(repo_path)\n _do_list_groups(repo_path)\n stats_command(repo_path;verbose)\n src/tagi/scanner/files.py:\n e: count_lines_changed\n count_lines_changed(file_path;repo_path)\n src/tagi/scanner/status.py:\n e: scan_repo,parse_status\n scan_repo(repo_path)\n parse_status(status)\n src/tagi/composer/_tags.py:\n e: all_tags,all_tag_values,summary_tag,infer_scope\n all_tags(changes)\n all_tag_values(changes)\n summary_tag(changes)\n infer_scope(changes)\n src/tagi/hooks.py:\n e: _hooks_dir,_pre_commit_hook,install_hooks,uninstall_hooks,check_hooks_installed,list_hooks,run_hook\n _hooks_dir(repo_path)\n _pre_commit_hook(repo_path)\n install_hooks(repo_path)\n uninstall_hooks(repo_path)\n check_hooks_installed(repo_path)\n list_hooks(repo_path)\n run_hook(hook_name;repo_path)\n src/tagi/planner/sorter.py:\n e: sort_by_complexity,sort_by_tag_priority,group_by_complexity\n sort_by_complexity(changes)\n sort_by_tag_priority(changes;tag_order)\n group_by_complexity(changes;num_groups)\n src/tagi/planner/grouper.py:\n e: group_changes,group_by_tag,group_by_risk,_get_primary_tag\n group_changes(changes)\n group_by_tag(changes;tag)\n group_by_risk(changes;threshold)\n _get_primary_tag(tags)\n src/tagi/cli/display_utils.py:\n e: _display_changes,_format_tags,_display_groups,_display_changes_grouped\n _display_changes(changes)\n _format_tags(tags;config)\n _display_groups(groups)\n _display_changes_grouped(changes)\n src/tagi/cli/main.py:\n e: setup_logging,_configure_command_logging,_ensure_tag_prefix,_is_known_tag,_resolve_send_target,detect_provider\n setup_logging(verbose)\n _configure_command_logging(verbose)\n _ensure_tag_prefix(tag)\n _is_known_tag(value)\n _resolve_send_target(target;repo_path)\n detect_provider(repo_path)\n src/tagi/providers/utils/pr.py:\n e: build_pr_command,execute_pr_command\n build_pr_command(tool;pr_type;spec)\n execute_pr_command(result)\n src/tagi/heuristics/metrics.py:\n e: _extension_complexity_weight,_extension_impact_weight,calculate_metrics,_calculate_complexity,_calculate_impact,_calculate_stability,_calculate_test_impact,_calculate_dependency_depth,filter_by_metrics,sort_by_metric,calculate_vector_distance\n _extension_complexity_weight(path)\n _extension_impact_weight(path)\n calculate_metrics(change;repo_path)\n _calculate_complexity(change)\n _calculate_impact(change)\n _calculate_stability(change)\n _calculate_test_impact(change)\n _calculate_dependency_depth(change)\n filter_by_metrics(changes;min_risk;max_risk;min_complexity;max_complexity;min_impact;max_impact)\n sort_by_metric(changes;metric;ascending)\n calculate_vector_distance(change1;change2)\n src/tagi/composer/formats.py:\n e: _commit_type,_describe_changes,generate_conventional_message,_count_tags,_detailed_file_lines,generate_detailed_message,generate_simple_message,generate_oneline_message,generate_files_message\n _commit_type(tags)\n _describe_changes(changes)\n generate_conventional_message(changes)\n _count_tags(changes)\n _detailed_file_lines(changes)\n generate_detailed_message(changes)\n generate_simple_message(changes)\n generate_oneline_message(changes)\n generate_files_message(changes)\n src/tagi/composer/commit_message.py:\n e: generate_commit_message,_improve_with_llm\n generate_commit_message(changes;template;repo_path;use_llm)\n _improve_with_llm(message;repo_path;files_str)\n src/tagi/utils/summary_helpers.py:\n e: build_report_header,build_statistics_section,build_changes_by_type_section,build_tag_distribution_section,build_file_list_section\n build_report_header(repo_path;changes)\n build_statistics_section(changes)\n build_changes_by_type_section(changes)\n build_tag_distribution_section(changes;config)\n build_file_list_section(changes)\n src/tagi/utils/change_filter.py:\n e: _normalize_tag,_changes_matching_tag,_resolve_tag_enums,_changes_matching_any,_changes_matching_all,resolve_filtered_changes,filter_changes_by_tag,filter_changes_by_tags_any,filter_changes_by_tags_all\n _normalize_tag(value)\n _changes_matching_tag(changes;tag_enum)\n _resolve_tag_enums(tags)\n _changes_matching_any(changes;tag_enums)\n _changes_matching_all(changes;tag_enums)\n resolve_filtered_changes(changes;tags;mode)\n filter_changes_by_tag(changes;tag)\n filter_changes_by_tags_any(changes;tags)\n filter_changes_by_tags_all(changes;tags)\n src/tagi/config.py:\n e: Config,load_config\n Config: __init__(1),_load_config(0),_apply_sections(1),get_tag_for_path(1),get_custom_tags_for_pattern(1),get_tag_color(1),get_heuristics_for_path(1),get_tags_for_path(1),get_tag_description(1),get_template(1),should_ignore(1) # Configuration loaded from tagi.toml...\n load_config(repo_path)\n src/tagi/cli/provider_commands.py:\n e: detect_provider_command,_current_branch,_pr_spec,create_pr,create_mr\n detect_provider_command(repo_path)\n _current_branch(repo_path)\n _pr_spec(spec;repo_path)\n create_pr(spec;repo_path)\n create_mr(spec;repo_path)\n src/tagi/providers/gitlab.py:\n e: GitLabProvider\n GitLabProvider(BaseProvider): is_authenticated(0),get_auth_status(0),get_configured_host(0),create_pr(1),detect_remote(0) # GitLab provider using glab CLI...\n src/tagi/heuristics/tags.py:\n e: apply_tags,_tag_change,_custom_config_tags,_size_tags,apply_path_tags\n apply_tags(changes;repo_path)\n _tag_change(change;repo_path;custom_tags_for)\n _custom_config_tags(custom_tags_for;path)\n _size_tags(lines_changed;has_other_tags)\n apply_path_tags(change;lines_changed)\n src/tagi/llm/llx_adapter.py:\n e: LlxAdapter\n LlxAdapter: __init__(2),is_available(0),improve_message(2),improve_description(2) # Adapter for LLX library for optional LLM integration...\n src/tagi/executor/git.py:\n e: GitExecutor\n GitExecutor: __init__(1),_run_command(1),add(1),commit(2),push(3),status(0),get_current_branch(0),get_remote_url(1),has_staged_changes(0) # Executor for git commands...\n src/tagi/utils/detect_provider.py:\n e: get_provider,detect_git_provider\n get_provider(repo_path)\n detect_git_provider(repo_path)\n src/tagi/utils/logger.py:\n e: setup_logger,get_logger\n setup_logger(name;level;log_file;verbose)\n get_logger(name)\n src/tagi/cli/scan_utils.py:\n e: scan_and_tag\n scan_and_tag(repo_path)\n src/tagi/providers/detector.py:\n e: detect_provider\n detect_provider(repo_path)\n src/tagi/heuristics/scoring.py:\n e: calculate_risk_score,_lines_risk_weight,_tag_risk_weight,_change_type_risk_weight\n calculate_risk_score(change;tags)\n _lines_risk_weight(lines_changed)\n _tag_risk_weight(tags)\n _change_type_risk_weight(change_type)\n src/tagi/executor/publish.py:\n e: PublishExecutor\n PublishExecutor: __init__(1),stage_and_commit(3),publish(6),dry_run(2) # Executor for publishing changes...\n src/tagi/utils/risk.py:\n e: total_lines_changed,average_risk\n total_lines_changed(changes)\n average_risk(changes)\n src/tagi/providers/base.py:\n e: PrSpec,BaseProvider\n PrSpec: # Pull/merge request parameters...\n BaseProvider(ABC): __init__(1),is_authenticated(0),get_auth_status(0),create_pr(1),detect_remote(0),_run_command(1),_get_git_remote_url(0),_check_git_remote_for_provider(1) # Base class for Git hosting providers...\n src/tagi/providers/github.py:\n e: GitHubProvider\n GitHubProvider(BaseProvider): is_authenticated(0),get_auth_status(0),get_token(0),create_pr(1),detect_remote(0) # GitHub provider using gh CLI...\n src/tagi/providers/utils/auth.py:\n e: get_auth_status_from_result,is_authenticated_from_result\n get_auth_status_from_result(result)\n is_authenticated_from_result(result)\n src/tagi/composer/_templates.py:\n e: render_template\n render_template(template)\n src/tagi/utils/send_helpers.py:\n e: create_change_group\n create_change_group(changes;tag)\n src/tagi/ui/design_tokens.py:\n e: ColorTokens,SpacingTokens,TypographyTokens,BorderRadiusTokens,ShadowTokens,LayoutTokens,DesignTokens\n ColorTokens: # Color design tokens...\n SpacingTokens: # Spacing design tokens...\n TypographyTokens: # Typography design tokens...\n BorderRadiusTokens: # Border radius design tokens...\n ShadowTokens: # Shadow design tokens...\n LayoutTokens: # Layout design tokens...\n DesignTokens: __init__(0),get_css_variables(1),get_css_string(1) # Main design tokens container...\n src/tagi/models/change.py:\n e: ChangeType,Tag,ChangeMetrics,Change\n ChangeType(str,Enum): # Type of git change...\n Tag(str,Enum): # Hashtag categories for changes...\n ChangeMetrics: to_vector(0) # Numerical metrics for change analysis...\n Change: # Represents a single file change...\n src/tagi/scanner/diff.py:\n e: get_diff,get_staged_diff\n get_diff(file_path;repo_path)\n get_staged_diff(file_path;repo_path)\n src/tagi/heuristics/rules.py:\n e: _get_config_attr,get_custom_rules,get_custom_heuristics\n _get_config_attr(repo_path;attr_name)\n get_custom_rules(repo_path)\n get_custom_heuristics(repo_path)\n src/tagi/utils/publish_helpers.py:\n e: detect_and_get_provider,create_publish_group\n detect_and_get_provider(repo_path)\n create_publish_group(changes;tag)\n src/tagi/utils/change_stats.py:\n e: calculate_tag_statistics,display_statistics_table\n calculate_tag_statistics(changes)\n display_statistics_table(changes;console)\n src/tagi/utils/line_builder.py:\n e: LineBuilder\n LineBuilder: __init__(1),add(0),as_list(0),text(0) # Single place where report line lists are created and mutated...\n goal.yaml:\n regix.yaml:\n local.dev.txt:\n koru.yaml:\n wup.yaml:\n pyproject.toml:\n tree.txt:\n project.sh:\n src/tagi/__init__.py:\n src/tagi/__main__.py:\n src/tagi/planner/__init__.py:\n src/tagi/models/plan.py:\n e: PlanStep,Plan\n PlanStep: # A single step in an execution plan...\n Plan: # An execution plan for shipping changes...\n src/tagi/models/__init__.py:\n src/tagi/models/group.py:\n e: ChangeGroup\n ChangeGroup: # Group of related changes...\n src/tagi/cli/__init__.py:\n src/tagi/providers/__init__.py:\n src/tagi/providers/utils/__init__.py:\n src/tagi/scanner/__init__.py:\n src/tagi/heuristics/__init__.py:\n src/tagi/llm/__init__.py:\n src/tagi/composer/__init__.py:\n src/tagi/executor/__init__.py:\n src/tagi/utils/inspect_helpers.py:\n testql-scenarios/generated-cli-tests.testql.toon.yaml:\n", "is_subdir": false}, {"name": "planfile-tickets.yaml", "rel_path": "planfile-tickets.yaml", "path": "planfile-tickets.yaml", "size": "7.8KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "source: koru-scan\n# generated in 9.95s\nschema: code2llm.planfile_tickets.v1\nproject_root: /home/tom/github/semcod/tagi\ntickets:\n- signal: code2llm_smell_shotgun_surgery\n title: 'Address code smell: Shotgun Surgery: path_lower'\n description: 'code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:33`.\n\n\n Mutation of variable ''path_lower'' spans 8 functions. Changing this logic requires\n work in many places.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - shotgun-surgery\n files:\n - src/tagi/heuristics/metrics.py\n dedupe_key: 'code2llm:smell:shotgun_surgery:src/tagi/heuristics/metrics.py:33:Shotgun\n Surgery: path_lower'\n- signal: code2llm_smell_shotgun_surgery\n title: 'Address code smell: Shotgun Surgery: tags'\n description: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/heuristics/tags.py:48`.\n\n\n Mutation of variable ''tags'' spans 5 functions. Changing this logic requires\n work in many places.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: high\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - shotgun-surgery\n files:\n - src/tagi/heuristics/tags.py\n dedupe_key: 'code2llm:smell:shotgun_surgery:src/tagi/heuristics/tags.py:48:Shotgun\n Surgery: tags'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: _tag_change'\n description: 'code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`.\n\n\n Function ''_tag_change'' is oversized: CC=2, fan-out=9, mutations=9.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/heuristics/tags.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/heuristics/tags.py:22:God Function:\n _tag_change'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: group_by_branch'\n description: 'code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\n\n Function ''group_by_branch'' is oversized: CC=8, fan-out=9, mutations=12.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/planner/branch_grouper.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/planner/branch_grouper.py:7:God\n Function: group_by_branch'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: group_changes'\n description: 'code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\n\n Function ''group_changes'' is oversized: CC=4, fan-out=9, mutations=7.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/planner/grouper.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/planner/grouper.py:10:God Function:\n group_changes'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: hooks_command'\n description: 'code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\n\n Function ''hooks_command'' is oversized: CC=10, fan-out=11, mutations=4.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/utility_commands.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/utility_commands.py:131:God\n Function: hooks_command'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: inspect_command'\n description: 'code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\n\n Function ''inspect_command'' is oversized: CC=7, fan-out=11, mutations=4.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/inspection_commands.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/inspection_commands.py:19:God\n Function: inspect_command'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: publish_command'\n description: 'code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\n\n Function ''publish_command'' is oversized: CC=11, fan-out=14, mutations=8.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/publishing_commands.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/publishing_commands.py:23:God\n Function: publish_command'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: scan_repo'\n description: 'code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\n\n Function ''scan_repo'' is oversized: CC=7, fan-out=15, mutations=8.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/scanner/status.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/scanner/status.py:11:God Function:\n scan_repo'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: send_command'\n description: 'code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`.\n\n\n Function ''send_command'' is oversized: CC=7, fan-out=13, mutations=9.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/git_operations.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/git_operations.py:90:God Function:\n send_command'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: setup_logger'\n description: 'code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`.\n\n\n Function ''setup_logger'' is oversized: CC=4, fan-out=13, mutations=14.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/utils/logger.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/utils/logger.py:9:God Function:\n setup_logger'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: summary_command'\n description: 'code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`.\n\n\n Function ''summary_command'' is oversized: CC=7, fan-out=13, mutations=17.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/utility_commands.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/utility_commands.py:25:God\n Function: summary_command'\napplied:\n- 'Address code smell: Shotgun Surgery: path_lower'\n- 'Address code smell: Shotgun Surgery: tags'\n- 'Address code smell: God Function: _tag_change'\n- 'Address code smell: God Function: group_by_branch'\n- 'Address code smell: God Function: group_changes'\n- 'Address code smell: God Function: hooks_command'\n- 'Address code smell: God Function: inspect_command'\n- 'Address code smell: God Function: publish_command'\n- 'Address code smell: God Function: scan_repo'\n- 'Address code smell: God Function: send_command'\n- 'Address code smell: God Function: setup_logger'\n- 'Address code smell: God Function: summary_command'\nskipped: []\n", "is_subdir": false}, {"name": "project.toon.yaml", "rel_path": "project.toon.yaml", "path": "project.toon.yaml", "size": "2.5KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# tagi | 225 func | 51f | 5609L | python | 2026-09-19\n# generated in 0.00s\n\nHEALTH:\n CC̄=2.9 critical=3 (limit:10) dup=0 cycles=2\n\nALERTS[10]:\n !! high_fan_out scan_repo = 15 (limit:10)\n ! high_fan_out publish_command = 14 (limit:10)\n ! high_fan_out send_command = 13 (limit:10)\n ! high_fan_out summary_command = 13 (limit:10)\n ! high_fan_out setup_logger = 13 (limit:10)\n ! high_fan_out inspect_command = 11 (limit:10)\n ! high_fan_out hooks_command = 11 (limit:10)\n ! high_fan_out filter_command = 10 (limit:10)\n ! high_fan_out draft_command = 10 (limit:10)\n ! high_fan_out KoruProvider.analyze_deployment_priority = 10 (limit:10)\n\nMODULES[75] (top by size):\n M[goal.yaml] 539L C:0 F:0 CC↑0 D:0 (yaml)\n M[src/tagi/analyzer/dependency_graph.py] 276L C:1 F:16 CC↑7 D:0 (python)\n M[src/tagi/heuristics/metrics.py] 228L C:0 F:11 CC↑5 D:1 (python)\n M[src/tagi/ui/design_tokens.py] 221L C:7 F:3 CC↑2 D:0 (python)\n M[src/tagi/cli/utility_commands.py] 211L C:0 F:5 CC↑10 D:0 (python)\n M[src/tagi/providers/koru.py] 171L C:2 F:10 CC↑8 D:0 (python)\n M[src/tagi/cli/git_operations.py] 170L C:0 F:7 CC↑7 D:0 (python)\n M[src/tagi/analyzer/metrics.py] 153L C:1 F:6 CC↑10 D:0 (python)\n M[src/tagi/composer/formats.py] 141L C:0 F:9 CC↑5 D:0 (python)\n M[src/tagi/cli/publishing_commands.py] 139L C:0 F:3 CC↑11 D:0 (python)\n M[koru.yaml] 133L C:0 F:0 CC↑0 D:0 (yaml)\n M[src/tagi/hooks.py] 127L C:0 F:7 CC↑5 D:1 (python)\n M[src/tagi/config.py] 126L C:1 F:12 CC↑4 D:5 (python)\n M[src/tagi/cli/inspection_commands.py] 120L C:0 F:3 CC↑7 D:0 (python)\n M[src/tagi/utils/change_filter.py] 120L C:0 F:9 CC↑5 D:5 (python)\n LANGS: python:66/yaml:5/txt:2/shell:1/toml:1\n\nHOTSPOTS[10]:\n ★ scan_repo fan=15 // Scan repository for uncommitted changes using git status --porcelain.\n ★ publish_command fan=14 // Create a PR or MR for the changes.\n ★ send_command fan=13 // Stage, commit, and optionally push changes.\n ★ summary_command fan=13 // Generate a comprehensive summary report of all changes.\n ★ setup_logger fan=13 // Setup and configure logger for tagi.\n\nArgs:\n name: Logger name\n level: Log\n\nREFACTOR[4]:\n [1] H/H Split god module goal.yaml (539L, 0 classes)\n [2] M/L Break circular dependency: src.tagi.analyzer.dependency_graph._dfs_visit\n [3] M/L Break circular dependency: src.tagi.analyzer.dependency_graph._longest_path_length\n [4] M/M Reduce scan_repo fan-out (currently 15)\n\nEVOLUTION:\n 2026-09-19 CC̄=2.9 crit=3 5609L // Automated analysis\n", "is_subdir": false}, {"name": "intent.json", "rel_path": "ticket-004/intent.json", "path": "ticket-004 / intent.json", "size": "462B", "icon": "📋", "type": "json", "type_name": "JSON", "content": "{\n "ticket": "ticket-004",\n "summary": "Remove pfix auto-repair configuration and dependency declarations",\n "allowedPaths": [\n "pyproject.toml",\n "uv.lock",\n "project/ticket-004/**"\n ],\n "forbiddenPaths": [\n ".env",\n "src/**",\n "tests/**",\n ".github/workflows/**"\n ],\n "authorization": "SESSION_EXECUTION_AUTHORIZATION",\n "outcome": "pfix is no longer configured, installed or locked by this project; no runtime behavior change."\n}\n", "is_subdir": true}, {"name": "intent.json", "rel_path": "ticket-003/intent.json", "path": "ticket-003 / intent.json", "size": "499B", "icon": "📋", "type": "json", "type_name": "JSON", "content": "{\n "ticket": "ticket-003",\n "summary": "Adopt immutable local CI publication instructions",\n "allowedPaths": [\n "AGENTS.md",\n ".gitignore",\n "project/ticket-003/**"\n ],\n "forbiddenPaths": [\n ".env",\n "config/**",\n ".github/workflows/**"\n ],\n "authorization": "SESSION_EXECUTION_AUTHORIZATION",\n "standard_revision": "d5f77d83b3752477cfb95a535d0e1ce77f148576",\n "outcome": "Publication-policy-only adoption with protected review; no executor or required-check mutation."\n}\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-004/README.md", "path": "ticket-004 / README.md", "size": "853B", "icon": "📝", "type": "markdown", "type_name": "Markdown", "content": "# ticket-004: Remove pfix auto-repair from the project\n\n- **Status**: IN_PROGRESS\n- **Workflow state**: EDIT\n\nSESSION_EXECUTION_AUTHORIZATION: on 2026-09-13 the user requested that pfix be\nremoved from Semcod projects or deactivated, because its automatic repairs\noverwrite development changes.\n\nAC-01: No tracked `pyproject.toml` declares a `[tool.pfix]` table or a `pfix`\nrequirement (runtime, optional, group or tool environment).\nAC-02: The parsed TOML differs from the base only by the removed pfix entries.\nAC-03: A tracked `uv.lock` is regenerated so it no longer records a direct pfix\nrequirement of this project.\nAC-04: Source code, tests and generated documentation projections are unchanged.\n\nCanonical fleet evidence:\n`subactor/docs/architecture/analysis/semcod-library-quality.md`.\nThis ticket does not establish full new-project adoption.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-003/README.md", "path": "ticket-003 / README.md", "size": "548B", "icon": "📝", "type": "markdown", "type_name": "Markdown", "content": "# ticket-003: Local CI publication policy\n\n- **Status**: IN_PROGRESS\n- **Workflow state**: EDIT\n\nSESSION_EXECUTION_AUTHORIZATION: user requested implementation and publication across Semcod and Subactor.\n\nAC-01: Pin published policy while preserving custom requirements.\nAC-02: Validate bounded diff and publish through independent protected review.\n\nAllocation: https://github.com/semcod/tagi/issues/3. Canonical fleet evidence: `subactor/docs/architecture/analysis/local-ci-adoption.md`. This ticket does not establish full new-project adoption.\n", "is_subdir": true}]; + const files = [{"name": "calls.png", "rel_path": "calls.png", "path": "calls.png", "size": "65.0KB", "icon": "🖼️", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "compact_flow.png", "rel_path": "compact_flow.png", "path": "compact_flow.png", "size": "2.3KB", "icon": "🖼️", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "flow.png", "rel_path": "flow.png", "path": "flow.png", "size": "18.4KB", "icon": "🖼️", "type": "image", "type_name": "Image", "content": "[Binary file]", "is_subdir": false}, {"name": "README.md", "rel_path": "README.md", "path": "README.md", "size": "9.4KB", "icon": "📝", "type": "markdown", "type_name": "Markdown", "content": "# code2llm - Generated Analysis Files\n\n\nThis directory contains the complete analysis of your project generated by `code2llm`. Each file serves a specific purpose for understanding, refactoring, and documenting your codebase. # noqa: E501\n\n## 📁 Generated Files Overview\n\nWhen you run `code2llm ./ -f all`, the following files are created:\n\n### 🎯 Core Analysis Files\n\n| File | Format | Purpose | Key Insights |\n|------|--------|---------|--------------|\n| `evolution.toon.yaml` | **YAML** | **📋 Refactoring queue** - Prioritized improvements | 0 refactoring actions needed |\n| `map.toon.yaml` | **YAML** | **🗺️ Structural map + project header** - Modules, imports, exports, signatures, stats, alerts, hotspots, trend | Project architecture overview |\n\n### 🤖 LLM-Ready Documentation\n\n| File | Format | Purpose | Use Case |\n|------|--------|---------|----------|\n| `prompt.txt` | **Text** | **📝 Ready-to-send prompt** - Lists all files with instructions | Attach to LLM conversation as context guide |\n| `context.md` | **Markdown** | **📖 LLM narrative** - Architecture summary | Paste into ChatGPT/Claude for code analysis |\n\n### 📊 Visualizations\n\n| File | Format | Purpose | Description |\n|------|--------|---------|-------------|\n| `flow.mmd` | **Mermaid** | **🔄 Control flow diagram** | Function call paths with complexity styling |\n| `calls.mmd` | **Mermaid** | **📞 Call graph** | Function dependencies (edges only) |\n| `compact_flow.mmd` | **Mermaid** | **📦 Module overview** | Aggregated module-level view |\n\n## 🚀 Quick Start Commands\n\n### Basic Analysis\n```bash\n# Quick health check (TOON format only)\ncode2llm ./ -f toon\n\n# Generate all formats (what created these files)\ncode2llm ./ -f all\n\n# LLM-ready context only\ncode2llm ./ -f context\n```\n\n### Performance Options\n```bash\n# Fast analysis for large projects\ncode2llm ./ -f toon --strategy quick\n\n# Memory-limited analysis\ncode2llm ./ -f all --max-memory 500\n\n# Skip PNG generation (faster)\ncode2llm ./ -f all --no-png\n```\n\n### Refactoring Focus\n```bash\n# Get refactoring recommendations\ncode2llm ./ -f evolution\n\n# Focus on specific code smells\ncode2llm ./ -f toon --refactor --smell god_function\n\n# Data flow analysis\ncode2llm ./ -f flow --data-flow\n```\n\n## 📖 Understanding Each File\n\n### `analysis.toon` - Health Diagnostics\n**Purpose**: Quick overview of code health issues\n**Key sections**:\n- **HEALTH**: Critical issues (🔴) and warnings (🟡)\n- **REFACTOR**: Prioritized refactoring actions\n- **COUPLING**: Module dependencies and potential cycles\n- **LAYERS**: Package complexity metrics\n- **FUNCTIONS**: High-complexity functions (CC ≥ 10)\n- **CLASSES**: Complex classes needing attention\n\n**Example usage**:\n```bash\n# View health issues\ncat analysis.toon | head -30\n\n# Check refactoring priorities\ngrep \"REFACTOR\" analysis.toon\n```\n\n### `evolution.toon.yaml` - Refactoring Queue\n**Purpose**: Step-by-step refactoring plan\n**Key sections**:\n- **NEXT**: Immediate actions to take\n- **RISKS**: Potential breaking changes\n- **METRICS-TARGET**: Success criteria\n\n**Example usage**:\n```bash\n# Get refactoring plan\ncat evolution.toon.yaml\n\n# Track progress\ngrep \"NEXT\" evolution.toon.yaml\n```\n\n### `flow.toon` - Legacy Data Flow Analysis\n**Purpose**: Understand data movement through the system (legacy / explicit opt-in)\n**Key sections**:\n- **PIPELINES**: Data processing chains\n- **CONTRACTS**: Function input/output contracts\n- **SIDE_EFFECTS**: Functions with external impacts\n\n**Example usage**:\n```bash\n# Find data pipelines\ngrep \"PIPELINES\" flow.toon\n\n# Identify side effects\ngrep \"SIDE_EFFECTS\" flow.toon\n```\n\n### `map.toon.yaml` - Structural Map + Project Header\n**Purpose**: High-level architecture overview plus compact project header\n**Key sections**:\n- **MODULES**: All modules with basic stats\n- **IMPORTS**: Dependency relationships\n- **EXPORTS**: Public API surface and signatures\n- **HEADER**: Stats, alerts, hotspots, evolution trend\n\n**Example usage**:\n```bash\n# See project structure\ncat map.toon.yaml | head -50\n\n# Find public APIs\ngrep \"SIGNATURES\" map.toon.yaml\n```\n\n### `project.toon.yaml` - Compact Analysis View\n**Purpose**: Compact module view generated from project.yaml data\n**Status**: Legacy view generated on demand from unified project.yaml\n\n**Example usage**:\n```bash\n# View compact project structure\ncat project.toon.yaml | head -30\n\n# Find largest files\ngrep -E \"^ .*[0-9]{3,}$\" project.toon.yaml | sort -t',' -k2 -n -r | head -10\n```\n\n### `prompt.txt` - Ready-to-Send LLM Prompt\n**Purpose**: Pre-formatted prompt listing all generated files for LLM conversation\n**Generation**: Written when `code2llm` runs with a source path and requests `-f all` (including `--no-chunk`) or `code2logic` # noqa: E501\n**Contents**:\n- **Files section**: Lists all existing generated files with descriptions, including `project.toon.yaml` when generated by `-f all` # noqa: E501\n- **Source files section**: Highlights important source files such as `cli_exports/orchestrator.py`\n- **Missing section**: Shows which files weren't generated (if any)\n- **Task section**: Refactoring brief with concrete execution instructions, not just analysis\n- **Priority Order section**: State-dependent refactoring priorities, starting with blockers and then architecture cleanup # noqa: E501\n- **Requirements section**: Guidelines for suggested changes\n\n**Example usage**:\n```bash\n# View the prompt\ncat prompt.txt\n\n# Copy to clipboard and paste into ChatGPT/Claude\ncat prompt.txt | pbcopy # macOS\ncat prompt.txt | xclip -sel clip # Linux\n```\n\n### `context.md` - LLM Narrative\n**Purpose**: Ready-to-paste context for AI assistants\n**Key sections**:\n- **Overview**: Project statistics\n- **Architecture**: Module breakdown\n- **Entry Points**: Public interfaces\n- **Patterns**: Design patterns detected\n\n**Example usage**:\n```bash\n# Copy to clipboard for LLM\ncat context.md | pbcopy # macOS\ncat context.md | xclip -sel clip # Linux\n\n# Use with Claude/ChatGPT for code analysis\n```\n\n### Visualization Files (`*.mmd`, `*.png`)\n**Purpose**: Visual understanding of code structure\n**Files**:\n- `flow.mmd` - Detailed control flow with complexity colors\n- `calls.mmd` - Simple call graph\n- `compact_flow.mmd` - High-level module view\n- `*.png` - Pre-rendered images\n\n**Example usage**:\n```bash\n# View diagrams\nopen flow.png # macOS\nxdg-open flow.png # Linux\n\n# Edit in Mermaid Live Editor\n# Copy content of .mmd files to https://mermaid.live\n```\n\n## 🔍 Common Analysis Patterns\n\n### 1. Code Health Assessment\n```bash\n# Quick health check\ncode2llm ./ -f toon\ncat analysis.toon | grep -E \"(HEALTH|REFACTOR)\"\n```\n\n### 2. Refactoring Planning\n```bash\n# Get refactoring queue\ncode2llm ./ -f evolution\ncat evolution.toon.yaml\n\n# Focus on specific issues\ncode2llm ./ -f toon --refactor --smell god_function\n```\n\n### 3. LLM Assistance\n```bash\n# Generate context for AI\ncode2llm ./ -f context\ncat context.md\n\n# Use with Claude: \"Based on this context, help me refactor the god modules\"\n```\n\n### 4. Team Documentation\n```bash\n# Generate all docs for team\ncode2llm ./ -f all -o ./docs/\n\n# Create visual diagrams\nopen docs/flow.png\n```\n\n## 📊 Interpreting Metrics\n\n### Complexity Metrics (CC)\n- **🔴 Critical (≥5.0)**: Immediate refactoring needed\n- **🟠 High (3.0-4.9)**: Consider refactoring\n- **🟡 Medium (1.5-2.9)**: Monitor complexity\n- **🟢 Low (0.1-1.4)**: Acceptable\n- **⚪ Basic (0.0)**: Simple functions\n\n### Module Health\n- **GOD Module**: Too large (>500 lines, >20 methods)\n- **HUB**: High fan-out (calls many modules)\n- **FAN-IN**: High incoming dependencies\n- **CYCLES**: Circular dependencies\n\n### Data Flow Indicators\n- **PIPELINE**: Sequential data processing\n- **CONTRACT**: Clear input/output specification\n- **SIDE_EFFECT**: External state modification\n\n## 🛠️ Integration Examples\n\n### CI/CD Pipeline\n```bash\n#!/bin/bash\n# Analyze code quality in CI\ncode2llm ./ -f toon -o ./analysis\nif grep -q \"🔴 GOD\" ./analysis/analysis.toon; then\n echo \"❌ God modules detected\"\n exit 1\nfi\n```\n\n### Pre-commit Hook\n```bash\n#!/bin/sh\n# .git/hooks/pre-commit\ncode2llm ./ -f toon -o ./temp_analysis\nif grep -q \"🔴\" ./temp_analysis/analysis.toon; then\n echo \"⚠️ Critical issues found. Review before committing.\"\nfi\nrm -rf ./temp_analysis\n```\n\n### Documentation Generation\n```bash\n# Generate docs for README\ncode2llm ./ -f context -o ./docs/\necho \"## Architecture\" >> README.md\ncat docs/context.md >> README.md\n```\n\n## 📚 Next Steps\n\n1. **Review `analysis.toon`** - Identify critical issues\n2. **Check `evolution.toon.yaml`** - Plan refactoring priorities\n3. **Use `context.md`** - Get LLM assistance for complex changes\n4. **Reference visualizations** - Understand system architecture\n5. **Track progress** - Re-run analysis after changes\n\n## 🔧 Advanced Usage\n\n### Custom Analysis\n```bash\n# Deep analysis with all insights\ncode2llm ./ -m hybrid -f all --max-depth 15 -v\n\n# Performance-optimized\ncode2llm ./ -m static -f toon --strategy quick\n\n# Refactoring-focused\ncode2llm ./ -f toon,evolution --refactor\n```\n\n### Output Customization\n```bash\n# Separate output directories\ncode2llm ./ -f all -o ./analysis-$(date +%Y%m%d)\n\n# Split YAML into multiple files\ncode2llm ./ -f yaml --split-output\n\n# Separate orphaned functions\ncode2llm ./ -f yaml --separate-orphans\n```\n\n---\n\n**Generated by**: `code2llm ./ -f all --readme` \n**Analysis Date**: 2026-09-19 \n**Total Functions**: 229 \n**Total Classes**: 27 \n**Modules**: 77 \n\nFor more information about code2llm, visit: https://github.com/tom-sapletta/code2llm\n", "is_subdir": false}, {"name": "context.md", "rel_path": "context.md", "path": "context.md", "size": "21.1KB", "icon": "📝", "type": "markdown", "type_name": "Markdown", "content": "# System Architecture Analysis\n\n\n## Overview\n\n- **Project**: /home/tom/github/semcod/tagi\n- **Primary Language**: python\n- **Languages**: python: 68, yaml: 5, txt: 2, toml: 1, shell: 1\n- **Analysis Mode**: static\n- **Total Functions**: 229\n- **Total Classes**: 27\n- **Modules**: 77\n- **Entry Points**: 137\n\n## Architecture by Module\n\n### src.tagi.analyzer.dependency_graph\n- **Functions**: 16\n- **Classes**: 1\n- **File**: `dependency_graph.py`\n\n### src.tagi.config\n- **Functions**: 12\n- **Classes**: 1\n- **File**: `config.py`\n\n### src.tagi.heuristics.metrics\n- **Functions**: 11\n- **File**: `metrics.py`\n\n### src.tagi.providers.koru\n- **Functions**: 10\n- **Classes**: 2\n- **File**: `koru.py`\n\n### src.tagi.composer.formats\n- **Functions**: 9\n- **File**: `formats.py`\n\n### tagi.executor.git\n- **Functions**: 9\n- **Classes**: 1\n- **File**: `git.py`\n\n### src.tagi.utils.change_filter\n- **Functions**: 9\n- **File**: `change_filter.py`\n\n### tagi.providers.base\n- **Functions**: 8\n- **Classes**: 2\n- **File**: `base.py`\n\n### src.tagi.hooks\n- **Functions**: 7\n- **File**: `hooks.py`\n\n### src.tagi.cli.git_operations\n- **Functions**: 7\n- **File**: `git_operations.py`\n\n### src.tagi.analyzer.metrics\n- **Functions**: 6\n- **Classes**: 1\n- **File**: `metrics.py`\n\n### src.tagi.cli.main\n- **Functions**: 6\n- **File**: `main.py`\n\n### src.tagi.planner.selector\n- **Functions**: 5\n- **File**: `selector.py`\n\n### tagi.cli.provider_commands\n- **Functions**: 5\n- **File**: `provider_commands.py`\n\n### src.tagi.cli.core_commands\n- **Functions**: 5\n- **File**: `core_commands.py`\n\n### src.tagi.cli.utility_commands\n- **Functions**: 5\n- **File**: `utility_commands.py`\n\n### tagi.providers.gitlab\n- **Functions**: 5\n- **Classes**: 1\n- **File**: `gitlab.py`\n\n### tagi.providers.github\n- **Functions**: 5\n- **Classes**: 1\n- **File**: `github.py`\n\n### src.tagi.heuristics.tags\n- **Functions**: 5\n- **File**: `tags.py`\n\n### src.tagi.utils.summary_helpers\n- **Functions**: 5\n- **File**: `summary_helpers.py`\n\n## Key Entry Points\n\nMain execution flows into the system:\n\n### src.tagi.cli.publishing_commands.publish_command\n> Create a PR or MR for the changes.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, typer.Option, typer.Option, _cli._configure_command_logging, console.print, src.tagi.cli.scan_utils.scan_and_tag\n\n### src.tagi.cli.utility_commands.summary_command\n> Generate a comprehensive summary report of all changes.\n- **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, summary_lines.append, summary_lines.append, summary_lines.append, summary_lines.append\n\n### src.tagi.cli.utility_commands.hooks_command\n> Manage git hooks integration for tagi.\n- **Calls**: typer.Argument, typer.Option, typer.Option, typer.Option, None.resolve, src.tagi.hooks.check_hooks_installed, tagi_list_hooks, tagi_install_hooks\n\n### src.tagi.cli.publishing_commands.deploy_command\n> Deploy changes to target environment.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, typer.Option, typer.Option, _cli._configure_command_logging, console.print, src.tagi.cli.scan_utils.scan_and_tag\n\n### src.tagi.cli.inspection_commands.inspect_command\n> Inspect a specific change group.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, console.print, src.tagi.utils.change_filter.resolve_filtered_changes, None.get_tag_description, src.tagi.utils.change_stats.display_statistics_table, src.tagi.cli.display_utils._display_changes\n\n### src.tagi.cli.utility_commands.draft_command\n> Draft a commit message for a change group.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, src.tagi.cli.utility_commands._ensure_tag_prefix, src.tagi.utils.send_helpers.create_change_group, src.tagi.composer.commit_message.generate_commit_message\n\n### src.tagi.cli.inspection_commands.filter_command\n> Filter changes by tags.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, typer.Option, console.print, src.tagi.utils.change_filter.resolve_filtered_changes, src.tagi.utils.change_stats.display_statistics_table, src.tagi.cli.display_utils._display_changes\n\n### src.tagi.cli.core_commands.stats_command\n> Show statistics about changes.\n- **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, src.tagi.utils.change_stats.display_statistics_table, console.print, console.print, src.tagi.utils.change_stats.calculate_tag_statistics\n\n### tagi.scanner.status.scan_repo\n> Scan repository for uncommitted changes using git status --porcelain.\n- **Calls**: tagi.utils.commands.run_command, None.split, os.path.exists, ValueError, src.tagi.config.load_config, RuntimeError, line.split, None.strip\n\n### src.tagi.cli.inspection_commands.file_command\n> Show detailed information about a specific file.\n- **Calls**: typer.Argument, typer.Argument, typer.Option, console.print, console.print, console.print, console.print, console.print\n\n### src.tagi.ui.design_tokens.DesignTokens.get_css_variables\n> Get CSS variables for specified theme.\n- **Calls**: variables.update, variables.update, variables.update, variables.update, variables.update, variables.update, variables.update, str\n\n### src.tagi.cli.utility_commands.init_command\n> Initialize tagi configuration in the repository.\n- **Calls**: typer.Argument, typer.Option, None.resolve, console.print, config_path.exists, console.print, console.print, example_path.exists\n\n### src.tagi.planner.grouper.group_changes\n> Group changes by their primary tag.\n- **Calls**: defaultdict, grouped.items, sorted, ChangeGroup, groups.append, src.tagi.planner.grouper._get_primary_tag, None.append, None.append\n\n### tagi.planner.branch_grouper.group_by_branch\n> Group changes by the git branch they were modified on.\n\nArgs:\n changes: List of changes to group\n repo_path: Path to the git repository\n \nRet\n- **Calls**: GitExecutor, executor.get_current_branch, None.append, tagi.utils.commands.run_command, None.split, None.strip, contains.stdout.strip, b.strip\n\n### src.tagi.providers.koru.KoruProvider.analyze_deployment_priority\n> Analyze deployment priority using Koru API.\n- **Calls**: self.get_topology, self.get_planfile_tickets, self.get_context_brief, self.run_quality_gates, self._deployment_recommendations, KoruDeploymentPlan, deployment_groups.append, priority_order.append\n\n### src.tagi.providers.koru.KoruProvider._deployment_recommendations\n> Generate recommendations based on Koru context.\n- **Calls**: quality_gates.get, topology.get, recommendations.append, recommendations.append, recommendations.append, recommendations.append, recommendations.append, len\n\n### src.tagi.cli.git_operations.auto_command\n> Automatically scan, order, and send all changes.\n- **Calls**: typer.Argument, typer.Option, typer.Option, typer.Option, typer.Option, src.tagi.cli.main._configure_command_logging, console.print, src.tagi.cli.git_operations.send_command\n\n### tagi.cli.provider_commands.create_pr\n> Create a GitHub pull request.\n- **Calls**: tagi.utils.detect_provider.get_provider, isinstance, console.print, github_provider.create_pr, tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print\n\n### tagi.cli.provider_commands.create_mr\n> Create a GitLab merge request.\n- **Calls**: tagi.utils.detect_provider.get_provider, isinstance, console.print, gitlab_provider.create_pr, tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print\n\n### src.tagi.composer.summary.generate_summary\n> Generate a summary of changes.\n- **Calls**: sum, sum, sum, None.text, LineBuilder, len, src.tagi.utils.risk.total_lines_changed, src.tagi.utils.risk.average_risk\n\n### src.tagi.config.Config._load_config\n> Load configuration from tagi.toml if it exists.\n- **Calls**: self._apply_sections, Path, config_path.exists, print, open, tomli.load, print\n\n### src.tagi.hooks.list_hooks\n> List all git hooks in the repository.\n\nArgs:\n repo_path: Path to the git repository\n \nReturns:\n List of hook names\n- **Calls**: src.tagi.hooks._hooks_dir, hooks_dir.iterdir, sorted, hooks_dir.exists, hook_file.is_file, hooks.append, hook_file.stat\n\n### src.tagi.planner.sorter.group_by_complexity\n> Group changes into complexity tiers (simple, medium, complex).\n\nArgs:\n changes: List of changes to group\n num_groups: Number of complexity group\n- **Calls**: src.tagi.planner.sorter.sort_by_complexity, max, range, len, len, len, groups.append\n\n### src.tagi.cli.core_commands.scan_command\n> Scan repository for uncommitted changes.\n- **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, console.print, src.tagi.cli.display_utils._display_changes_grouped, src.tagi.cli.display_utils._display_changes\n\n### tagi.planner.branch_grouper.get_branch_info\n> Get information about all branches in the repository.\n\nArgs:\n repo_path: Path to the git repository\n \nReturns:\n Dictionary mapping branch nam\n- **Calls**: tagi.utils.commands.run_command, None.split, None.strip, branch_listing.stdout.strip, None.replace, line.strip\n\n### src.tagi.providers.koru.KoruProvider._make_api_request\n> Make request to Koru API.\n- **Calls**: str, httpx.Client, client.post, response.raise_for_status, response.json, logger.warning\n\n### src.tagi.composer.formats.generate_detailed_message\n> Generate a detailed commit message.\n- **Calls**: src.tagi.composer.formats._count_tags, None.text, LineBuilder, src.tagi.composer.formats._detailed_file_lines, len, tag_counts.most_common\n\n### src.tagi.composer.formats.generate_simple_message\n> Generate a simple commit message.\n- **Calls**: len, src.tagi.composer._tags.summary_tag, src.tagi.composer._tags.summary_tag, len, None.join, len\n\n### src.tagi.composer.summary.generate_file_list\n> Generate a formatted list of files.\n- **Calls**: None.text, len, file_lines.append, LineBuilder, None.join, len\n\n### src.tagi.ui.design_tokens.DesignTokens.__init__\n- **Calls**: ColorTokens, SpacingTokens, TypographyTokens, BorderRadiusTokens, ShadowTokens, LayoutTokens\n\n## Process Flows\n\nKey execution flows identified:\n\n### Flow 1: publish_command\n```\npublish_command [src.tagi.cli.publishing_commands]\n```\n\n### Flow 2: summary_command\n```\nsummary_command [src.tagi.cli.utility_commands]\n └─ →> scan_and_tag\n```\n\n### Flow 3: hooks_command\n```\nhooks_command [src.tagi.cli.utility_commands]\n```\n\n### Flow 4: deploy_command\n```\ndeploy_command [src.tagi.cli.publishing_commands]\n```\n\n### Flow 5: inspect_command\n```\ninspect_command [src.tagi.cli.inspection_commands]\n └─ →> resolve_filtered_changes\n └─> _resolve_tag_enums\n └─> _normalize_tag\n └─> _changes_matching_any\n```\n\n### Flow 6: draft_command\n```\ndraft_command [src.tagi.cli.utility_commands]\n └─ →> scan_and_tag\n```\n\n### Flow 7: filter_command\n```\nfilter_command [src.tagi.cli.inspection_commands]\n```\n\n### Flow 8: stats_command\n```\nstats_command [src.tagi.cli.core_commands]\n └─ →> scan_and_tag\n └─ →> display_statistics_table\n```\n\n### Flow 9: scan_repo\n```\nscan_repo [tagi.scanner.status]\n └─ →> run_command\n └─ →> load_config\n```\n\n### Flow 10: file_command\n```\nfile_command [src.tagi.cli.inspection_commands]\n```\n\n## Key Classes\n\n### src.tagi.config.Config\n> Configuration loaded from tagi.toml.\n- **Methods**: 11\n- **Key Methods**: src.tagi.config.Config.__init__, src.tagi.config.Config._load_config, src.tagi.config.Config._apply_sections, src.tagi.config.Config.get_tag_for_path, src.tagi.config.Config.get_custom_tags_for_pattern, src.tagi.config.Config.get_tag_color, src.tagi.config.Config.get_heuristics_for_path, src.tagi.config.Config.get_tags_for_path, src.tagi.config.Config.get_tag_description, src.tagi.config.Config.get_template\n\n### src.tagi.providers.koru.KoruProvider\n> Integration with Koru API for deployment analysis.\n- **Methods**: 10\n- **Key Methods**: src.tagi.providers.koru.KoruProvider.__init__, src.tagi.providers.koru.KoruProvider._make_api_request, src.tagi.providers.koru.KoruProvider.get_topology, src.tagi.providers.koru.KoruProvider.get_planfile_tickets, src.tagi.providers.koru.KoruProvider.run_quality_gates, src.tagi.providers.koru.KoruProvider.get_context_brief, src.tagi.providers.koru.KoruProvider._deployment_recommendations, src.tagi.providers.koru.KoruProvider.analyze_deployment_priority, src.tagi.providers.koru.KoruProvider.deploy_group, src.tagi.providers.koru.KoruProvider.is_available\n\n### tagi.executor.git.GitExecutor\n> Executor for git commands.\n- **Methods**: 9\n- **Key Methods**: tagi.executor.git.GitExecutor.__init__, tagi.executor.git.GitExecutor._run_command, tagi.executor.git.GitExecutor.add, tagi.executor.git.GitExecutor.commit, tagi.executor.git.GitExecutor.push, tagi.executor.git.GitExecutor.status, tagi.executor.git.GitExecutor.get_current_branch, tagi.executor.git.GitExecutor.get_remote_url, tagi.executor.git.GitExecutor.has_staged_changes\n\n### tagi.providers.base.BaseProvider\n> Base class for Git hosting providers.\n- **Methods**: 8\n- **Key Methods**: tagi.providers.base.BaseProvider.__init__, tagi.providers.base.BaseProvider.is_authenticated, tagi.providers.base.BaseProvider.get_auth_status, tagi.providers.base.BaseProvider.create_pr, tagi.providers.base.BaseProvider.detect_remote, tagi.providers.base.BaseProvider._run_command, tagi.providers.base.BaseProvider._get_git_remote_url, tagi.providers.base.BaseProvider._check_git_remote_for_provider\n- **Inherits**: ABC\n\n### tagi.providers.gitlab.GitLabProvider\n> GitLab provider using glab CLI.\n- **Methods**: 5\n- **Key Methods**: tagi.providers.gitlab.GitLabProvider.is_authenticated, tagi.providers.gitlab.GitLabProvider.get_auth_status, tagi.providers.gitlab.GitLabProvider.get_configured_host, tagi.providers.gitlab.GitLabProvider.create_pr, tagi.providers.gitlab.GitLabProvider.detect_remote\n- **Inherits**: BaseProvider\n\n### tagi.providers.github.GitHubProvider\n> GitHub provider using gh CLI.\n- **Methods**: 5\n- **Key Methods**: tagi.providers.github.GitHubProvider.is_authenticated, tagi.providers.github.GitHubProvider.get_auth_status, tagi.providers.github.GitHubProvider.get_token, tagi.providers.github.GitHubProvider.create_pr, tagi.providers.github.GitHubProvider.detect_remote\n- **Inherits**: BaseProvider\n\n### src.tagi.analyzer.metrics.MetricsCollector\n> Collect and analyze metrics about changes.\n- **Methods**: 4\n- **Key Methods**: src.tagi.analyzer.metrics.MetricsCollector.__init__, src.tagi.analyzer.metrics.MetricsCollector.collect, src.tagi.analyzer.metrics.MetricsCollector.to_json, src.tagi.analyzer.metrics.MetricsCollector.save\n\n### src.tagi.llm.llx_adapter.LlxAdapter\n> Adapter for LLX library for optional LLM integration.\n- **Methods**: 4\n- **Key Methods**: src.tagi.llm.llx_adapter.LlxAdapter.__init__, src.tagi.llm.llx_adapter.LlxAdapter.is_available, src.tagi.llm.llx_adapter.LlxAdapter.improve_message, src.tagi.llm.llx_adapter.LlxAdapter.improve_description\n\n### src.tagi.executor.publish.PublishExecutor\n> Executor for publishing changes.\n- **Methods**: 4\n- **Key Methods**: src.tagi.executor.publish.PublishExecutor.__init__, src.tagi.executor.publish.PublishExecutor.stage_and_commit, src.tagi.executor.publish.PublishExecutor.publish, src.tagi.executor.publish.PublishExecutor.dry_run\n\n### src.tagi.utils.line_builder.LineBuilder\n> Single place where report line lists are created and mutated.\n- **Methods**: 4\n- **Key Methods**: src.tagi.utils.line_builder.LineBuilder.__init__, src.tagi.utils.line_builder.LineBuilder.add, src.tagi.utils.line_builder.LineBuilder.as_list, src.tagi.utils.line_builder.LineBuilder.text\n\n### src.tagi.analyzer.dependency_graph._LevelOrder\n> Level-by-level topological order over a dependency graph (Kahn's algorithm).\n- **Methods**: 3\n- **Key Methods**: src.tagi.analyzer.dependency_graph._LevelOrder.__init__, src.tagi.analyzer.dependency_graph._LevelOrder.levels, src.tagi.analyzer.dependency_graph._LevelOrder._drain_level\n\n### src.tagi.ui.design_tokens.DesignTokens\n> Main design tokens container.\n- **Methods**: 3\n- **Key Methods**: src.tagi.ui.design_tokens.DesignTokens.__init__, src.tagi.ui.design_tokens.DesignTokens.get_css_variables, src.tagi.ui.design_tokens.DesignTokens.get_css_string\n\n### src.tagi.models.change.ChangeMetrics\n> Numerical metrics for change analysis.\n- **Methods**: 1\n- **Key Methods**: src.tagi.models.change.ChangeMetrics.to_vector\n\n### src.tagi.models.plan.PlanStep\n> A single step in an execution plan.\n- **Methods**: 0\n\n### src.tagi.models.plan.Plan\n> An execution plan for shipping changes.\n- **Methods**: 0\n\n### src.tagi.models.change.ChangeType\n> Type of git change.\n- **Methods**: 0\n- **Inherits**: str, Enum\n\n### src.tagi.models.change.Tag\n> Hashtag categories for changes.\n- **Methods**: 0\n- **Inherits**: str, Enum\n\n### src.tagi.models.change.Change\n> Represents a single file change.\n- **Methods**: 0\n\n### src.tagi.models.group.ChangeGroup\n> Group of related changes.\n- **Methods**: 0\n\n### tagi.providers.base.PrSpec\n> Pull/merge request parameters.\n- **Methods**: 0\n\n## Data Transformation Functions\n\nKey functions that process and transform data:\n\n### src.tagi.cli.display_utils._format_tags\n> Format tags for display with descriptions if available.\n- **Output to**: None.join, tag_strings.append, config.get_tag_description\n\n### tagi.scanner.status.parse_status\n> Parse git status code to ChangeType.\n\n## Behavioral Patterns\n\n### recursion__dfs_visit\n- **Type**: recursion\n- **Confidence**: 0.90\n- **Functions**: src.tagi.analyzer.dependency_graph._dfs_visit\n\n### recursion__longest_path_length\n- **Type**: recursion\n- **Confidence**: 0.90\n- **Functions**: src.tagi.analyzer.dependency_graph._longest_path_length\n\n## Public API Surface\n\nFunctions exposed as public API (no underscore prefix):\n\n- `src.tagi.cli.publishing_commands.publish_command` - 36 calls\n- `src.tagi.cli.utility_commands.summary_command` - 28 calls\n- `src.tagi.cli.git_operations.send_command` - 26 calls\n- `src.tagi.cli.utility_commands.hooks_command` - 26 calls\n- `src.tagi.cli.publishing_commands.deploy_command` - 22 calls\n- `src.tagi.cli.inspection_commands.inspect_command` - 17 calls\n- `src.tagi.cli.utility_commands.draft_command` - 17 calls\n- `src.tagi.cli.inspection_commands.filter_command` - 16 calls\n- `src.tagi.cli.core_commands.stats_command` - 15 calls\n- `tagi.scanner.status.scan_repo` - 15 calls\n- `src.tagi.utils.logger.setup_logger` - 15 calls\n- `src.tagi.cli.inspection_commands.file_command` - 14 calls\n- `src.tagi.ui.design_tokens.DesignTokens.get_css_variables` - 14 calls\n- `src.tagi.cli.utility_commands.init_command` - 13 calls\n- `src.tagi.utils.change_stats.display_statistics_table` - 12 calls\n- `src.tagi.planner.grouper.group_changes` - 10 calls\n- `tagi.planner.branch_grouper.group_by_branch` - 10 calls\n- `src.tagi.providers.koru.KoruProvider.analyze_deployment_priority` - 10 calls\n- `src.tagi.cli.git_operations.auto_command` - 8 calls\n- `tagi.cli.provider_commands.create_pr` - 8 calls\n- `tagi.cli.provider_commands.create_mr` - 8 calls\n- `src.tagi.composer.summary.generate_summary` - 8 calls\n- `src.tagi.composer.commit_message.generate_commit_message` - 8 calls\n- `src.tagi.hooks.list_hooks` - 7 calls\n- `src.tagi.planner.sorter.group_by_complexity` - 7 calls\n- `src.tagi.cli.core_commands.scan_command` - 7 calls\n- `tagi.scanner.files.count_lines_changed` - 7 calls\n- `src.tagi.utils.change_filter.resolve_filtered_changes` - 7 calls\n- `tagi.planner.branch_grouper.get_branch_info` - 6 calls\n- `src.tagi.cli.scan_utils.scan_and_tag` - 6 calls\n- `src.tagi.heuristics.metrics.calculate_metrics` - 6 calls\n- `src.tagi.composer.formats.generate_detailed_message` - 6 calls\n- `src.tagi.composer.formats.generate_simple_message` - 6 calls\n- `src.tagi.composer.summary.generate_file_list` - 6 calls\n- `src.tagi.hooks.install_hooks` - 5 calls\n- `src.tagi.hooks.run_hook` - 5 calls\n- `src.tagi.analyzer.metrics.MetricsCollector.collect` - 5 calls\n- `src.tagi.analyzer.metrics.generate_report` - 5 calls\n- `src.tagi.planner.preview.preview_plan` - 5 calls\n- `src.tagi.heuristics.metrics.calculate_vector_distance` - 5 calls\n\n## System Interactions\n\nHow components interact:\n\n```mermaid\ngraph TD\n publish_command --> Argument\n publish_command --> Option\n summary_command --> Argument\n summary_command --> Option\n summary_command --> print\n summary_command --> scan_and_tag\n summary_command --> append\n hooks_command --> Argument\n hooks_command --> Option\n hooks_command --> resolve\n deploy_command --> Argument\n deploy_command --> Option\n inspect_command --> Argument\n inspect_command --> Option\n inspect_command --> print\n inspect_command --> resolve_filtered_cha\n draft_command --> Argument\n draft_command --> Option\n draft_command --> print\n draft_command --> scan_and_tag\n filter_command --> Argument\n filter_command --> Option\n filter_command --> print\n stats_command --> Argument\n stats_command --> Option\n stats_command --> print\n stats_command --> scan_and_tag\n stats_command --> display_statistics_t\n scan_repo --> run_command\n scan_repo --> split\n```\n\n## Reverse Engineering Guidelines\n\n1. **Entry Points**: Start analysis from the entry points listed above\n2. **Core Logic**: Focus on classes with many methods\n3. **Data Flow**: Follow data transformation functions\n4. **Process Flows**: Use the flow diagrams for execution paths\n5. **API Surface**: Public API functions reveal the interface\n\n## Context for LLM\n\nMaintain the identified architectural patterns and public API surface when suggesting changes.", "is_subdir": false}, {"name": "calls.mmd", "rel_path": "calls.mmd", "path": "calls.mmd", "size": "27.9KB", "icon": "📈", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart LR\n%% generated in 0.01s\n subgraph src__tagi\n src__tagi__analyzer__dependency_graph___mark["_mark"]\n src__tagi__providers__utils__auth__get_auth_status_from_result["get_auth_status_from_result"]\n src__tagi__utils__summary_helpers__build_statistics_section["build_statistics_section"]\n src__tagi__cli__utility_commands__hooks_command["hooks_command"]\n src__tagi__cli__git_operations__send_command["send_command"]\n src__tagi__analyzer__metrics__MetricsCollector__collect["collect"]\n src__tagi__composer__formats___detailed_file_lines["_detailed_file_lines"]\n src__tagi__config__Config__get_heuristics_for_path["get_heuristics_for_path"]\n src__tagi__heuristics__tags___size_tags["_size_tags"]\n src__tagi__utils__change_filter___normalize_tag["_normalize_tag"]\n src__tagi__utils__change_filter__filter_changes_by_tag["filter_changes_by_tag"]\n src__tagi__composer__formats__generate_conventional_message["generate_conventional_message"]\n src__tagi__cli__publishing_commands__publish_command["publish_command"]\n src__tagi__composer__commit_message___improve_with_llm["_improve_with_llm"]\n src__tagi__composer___tags__infer_scope["infer_scope"]\n src__tagi__utils__send_helpers__create_change_group["create_change_group"]\n src__tagi__analyzer__dependency_graph___cycle_from["_cycle_from"]\n src__tagi__hooks___pre_commit_hook["_pre_commit_hook"]\n src__tagi__analyzer__dependency_graph___next_critical_node["_next_critical_node"]\n src__tagi__cli__utility_commands___ensure_tag_prefix["_ensure_tag_prefix"]\n src__tagi__cli__inspection_commands__inspect_command["inspect_command"]\n src__tagi__cli__utility_commands__summary_command["summary_command"]\n src__tagi__config__load_config["load_config"]\n src__tagi__heuristics__rules__get_custom_rules["get_custom_rules"]\n src__tagi__cli__publishing_commands__deploy_command["deploy_command"]\n src__tagi__composer___templates__render_template["render_template"]\n src__tagi__utils__publish_helpers__create_publish_group["create_publish_group"]\n src__tagi__utils__paths__path_key["path_key"]\n src__tagi__composer___tags__all_tags["all_tags"]\n src__tagi__hooks__install_hooks["install_hooks"]\n src__tagi__cli__inspection_commands__filter_command["filter_command"]\n src__tagi__hooks__check_hooks_installed["check_hooks_installed"]\n src__tagi__heuristics__metrics___calculate_complexity["_calculate_complexity"]\n src__tagi__cli__git_operations___resolve_send_target["_resolve_send_target"]\n src__tagi__cli__display_utils___display_changes_grouped["_display_changes_grouped"]\n src__tagi__cli__core_commands__scan_command["scan_command"]\n src__tagi__composer__formats__generate_simple_message["generate_simple_message"]\n src__tagi__heuristics__scoring___change_type_risk_weight["_change_type_risk_weight"]\n src__tagi__cli__display_utils___format_tags["_format_tags"]\n src__tagi__config__Config__get_tag_for_path["get_tag_for_path"]\n src__tagi__heuristics__metrics___calculate_test_impact["_calculate_test_impact"]\n src__tagi__heuristics__metrics___extension_complexity_weight["_extension_complexity_weight"]\n src__tagi__utils__change_filter___changes_matching_any["_changes_matching_any"]\n src__tagi__analyzer__dependency_graph__analyze_python_imports["analyze_python_imports"]\n src__tagi__cli__main__detect_provider["detect_provider"]\n src__tagi__planner__grouper__group_by_tag["group_by_tag"]\n src__tagi__cli__git_operations___execute_git_operations["_execute_git_operations"]\n src__tagi__cli__core_commands__list_command["list_command"]\n src__tagi__composer__formats___describe_changes["_describe_changes"]\n src__tagi__planner__selector__select_changes_by_tag["select_changes_by_tag"]\n src__tagi__utils__change_filter__filter_changes_by_tags_all["filter_changes_by_tags_all"]\n src__tagi__utils__change_filter__resolve_filtered_changes["resolve_filtered_changes"]\n src__tagi__utils__risk__average_risk["average_risk"]\n src__tagi__composer___tags__summary_tag["summary_tag"]\n src__tagi__cli__core_commands___do_list_groups["_do_list_groups"]\n src__tagi__analyzer__dependency_graph__get_critical_path["get_critical_path"]\n src__tagi__planner__grouper___get_primary_tag["_get_primary_tag"]\n src__tagi__hooks__uninstall_hooks["uninstall_hooks"]\n src__tagi__planner__sorter__group_by_complexity["group_by_complexity"]\n src__tagi__cli__git_operations___ensure_tag_prefix["_ensure_tag_prefix"]\n src__tagi__heuristics__rules__get_custom_heuristics["get_custom_heuristics"]\n src__tagi__analyzer__dependency_graph___longest_path_length["_longest_path_length"]\n src__tagi__utils__paths__path_endswith["path_endswith"]\n src__tagi__heuristics__tags___tag_change["_tag_change"]\n src__tagi__cli__main___configure_command_logging["_configure_command_logging"]\n src__tagi__planner__grouper__group_changes["group_changes"]\n src__tagi__composer__formats___commit_type["_commit_type"]\n src__tagi__utils__change_filter___resolve_tag_enums["_resolve_tag_enums"]\n src__tagi__heuristics__scoring___lines_risk_weight["_lines_risk_weight"]\n src__tagi__heuristics__tags__apply_path_tags["apply_path_tags"]\n src__tagi__utils__publish_helpers__detect_and_get_provider["detect_and_get_provider"]\n src__tagi__heuristics__metrics___extension_impact_weight["_extension_impact_weight"]\n src__tagi__cli__display_utils___display_groups["_display_groups"]\n src__tagi__composer__summary__generate_summary["generate_summary"]\n src__tagi__utils__change_filter___changes_matching_tag["_changes_matching_tag"]\n src__tagi__heuristics__scoring__calculate_risk_score["calculate_risk_score"]\n src__tagi__utils__paths__path_matches["path_matches"]\n src__tagi__analyzer__dependency_graph___find_longest_start["_find_longest_start"]\n src__tagi__utils__change_filter___changes_matching_all["_changes_matching_all"]\n src__tagi__composer__formats___count_tags["_count_tags"]\n src__tagi__cli__inspection_commands__file_command["file_command"]\n src__tagi__cli__main___is_known_tag["_is_known_tag"]\n src__tagi__utils__change_filter__filter_changes_by_tags_any["filter_changes_by_tags_any"]\n src__tagi__cli__main___ensure_tag_prefix["_ensure_tag_prefix"]\n src__tagi__cli__git_operations__auto_command["auto_command"]\n src__tagi__utils__change_stats__calculate_tag_statistics["calculate_tag_statistics"]\n src__tagi__heuristics__metrics___calculate_dependency_depth["_calculate_dependency_depth"]\n src__tagi__utils__change_stats__display_statistics_table["display_statistics_table"]\n src__tagi__composer__commit_message__generate_commit_message["generate_commit_message"]\n src__tagi__providers__utils__pr__build_pr_command["build_pr_command"]\n src__tagi__utils__risk__total_lines_changed["total_lines_changed"]\n src__tagi__heuristics__scoring___tag_risk_weight["_tag_risk_weight"]\n src__tagi__analyzer__dependency_graph___collect_import_names["_collect_import_names"]\n src__tagi__heuristics__tags__apply_tags["apply_tags"]\n src__tagi__composer__formats__generate_detailed_message["generate_detailed_message"]\n src__tagi__cli__core_commands__stats_command["stats_command"]\n src__tagi__analyzer__dependency_graph__detect_cycles["detect_cycles"]\n src__tagi__cli__display_utils___display_changes["_display_changes"]\n src__tagi__cli__git_operations___is_known_tag["_is_known_tag"]\n src__tagi__heuristics__metrics___calculate_impact["_calculate_impact"]\n src__tagi__hooks__run_hook["run_hook"]\n src__tagi__providers__utils__auth__is_authenticated_from_result["is_authenticated_from_result"]\n src__tagi__composer__formats__generate_oneline_message["generate_oneline_message"]\n src__tagi__heuristics__tags___custom_config_tags["_custom_config_tags"]\n src__tagi__composer___tags__all_tag_values["all_tag_values"]\n src__tagi__providers__utils__pr__execute_pr_command["execute_pr_command"]\n src__tagi__cli__main__setup_logging["setup_logging"]\n src__tagi__hooks__list_hooks["list_hooks"]\n src__tagi__config__Config__should_ignore["should_ignore"]\n src__tagi__cli__main___resolve_send_target["_resolve_send_target"]\n src__tagi__utils__logger__setup_logger["setup_logger"]\n src__tagi__cli__scan_utils__scan_and_tag["scan_and_tag"]\n src__tagi__heuristics__rules___get_config_attr["_get_config_attr"]\n src__tagi__heuristics__metrics___calculate_stability["_calculate_stability"]\n src__tagi__cli__utility_commands__draft_command["draft_command"]\n src__tagi__heuristics__metrics__calculate_metrics["calculate_metrics"]\n src__tagi__cli__core_commands__list_groups_command["list_groups_command"]\n src__tagi__cli__publishing_commands___ensure_tag_prefix["_ensure_tag_prefix"]\n src__tagi__analyzer__dependency_graph___dfs_visit["_dfs_visit"]\n src__tagi__analyzer__dependency_graph___reconstruct_critical_path["_reconstruct_critical_path"]\n src__tagi__cli__git_operations___filter_by_tag["_filter_by_tag"]\n src__tagi__hooks___hooks_dir["_hooks_dir"]\n src__tagi__analyzer__dependency_graph__build_dependency_graph["build_dependency_graph"]\n src__tagi__planner__sorter__sort_by_complexity["sort_by_complexity"]\n end\n subgraph tagi__cli\n tagi__cli__provider_commands__detect_provider_command["detect_provider_command"]\n tagi__cli__provider_commands__create_pr["create_pr"]\n tagi__cli__provider_commands__create_mr["create_mr"]\n tagi__cli__provider_commands___current_branch["_current_branch"]\n tagi__cli__provider_commands___pr_spec["_pr_spec"]\n end\n subgraph tagi__executor\n tagi__executor__git__GitExecutor___run_command["_run_command"]\n end\n subgraph tagi__planner\n tagi__planner__branch_grouper__group_by_branch["group_by_branch"]\n tagi__planner__branch_grouper__get_branch_info["get_branch_info"]\n end\n subgraph tagi__providers\n tagi__providers__gitlab__GitLabProvider__is_authenticated["is_authenticated"]\n tagi__providers__github__GitHubProvider__is_authenticated["is_authenticated"]\n tagi__providers__github__GitHubProvider__get_auth_status["get_auth_status"]\n tagi__providers__base__BaseProvider___run_command["_run_command"]\n tagi__providers__github__GitHubProvider__create_pr["create_pr"]\n tagi__providers__gitlab__GitLabProvider__get_auth_status["get_auth_status"]\n tagi__providers__gitlab__GitLabProvider__create_pr["create_pr"]\n end\n subgraph tagi__scanner\n tagi__scanner__status__scan_repo["scan_repo"]\n tagi__scanner__files__count_lines_changed["count_lines_changed"]\n tagi__scanner__diff__get_staged_diff["get_staged_diff"]\n tagi__scanner__diff__get_diff["get_diff"]\n tagi__scanner__status__parse_status["parse_status"]\n end\n subgraph tagi__utils\n tagi__utils__detect_provider__get_provider["get_provider"]\n tagi__utils__detect_provider__detect_git_provider["detect_git_provider"]\n tagi__utils__commands__run_command["run_command"]\n end\n src__tagi__config__Config__get_tag_for_path --> src__tagi__utils__paths__path_matches\n src__tagi__config__Config__get_heuristics_for_path --> src__tagi__utils__paths__path_matches\n src__tagi__config__Config__should_ignore --> src__tagi__utils__paths__path_matches\n src__tagi__hooks___pre_commit_hook --> src__tagi__hooks___hooks_dir\n src__tagi__hooks__install_hooks --> src__tagi__hooks___pre_commit_hook\n src__tagi__hooks__install_hooks --> src__tagi__hooks___hooks_dir\n src__tagi__hooks__uninstall_hooks --> src__tagi__hooks___pre_commit_hook\n src__tagi__hooks__check_hooks_installed --> src__tagi__hooks___pre_commit_hook\n src__tagi__hooks__list_hooks --> src__tagi__hooks___hooks_dir\n src__tagi__hooks__run_hook --> src__tagi__hooks___hooks_dir\n src__tagi__analyzer__dependency_graph__analyze_python_imports --> src__tagi__analyzer__dependency_graph___collect_import_names\n src__tagi__analyzer__dependency_graph__build_dependency_graph --> src__tagi__analyzer__dependency_graph__analyze_python_imports\n src__tagi__analyzer__dependency_graph___dfs_visit --> src__tagi__analyzer__dependency_graph___mark\n src__tagi__analyzer__dependency_graph___dfs_visit --> src__tagi__analyzer__dependency_graph___cycle_from\n src__tagi__analyzer__dependency_graph__detect_cycles --> src__tagi__analyzer__dependency_graph___dfs_visit\n src__tagi__analyzer__dependency_graph___find_longest_start --> src__tagi__analyzer__dependency_graph___longest_path_length\n src__tagi__analyzer__dependency_graph___reconstruct_critical_path --> src__tagi__analyzer__dependency_graph___next_critical_node\n src__tagi__analyzer__dependency_graph__get_critical_path --> src__tagi__analyzer__dependency_graph___find_longest_start\n src__tagi__analyzer__dependency_graph__get_critical_path --> src__tagi__analyzer__dependency_graph___reconstruct_critical_path\n src__tagi__analyzer__metrics__MetricsCollector__collect --> src__tagi__utils__risk__total_lines_changed\n src__tagi__analyzer__metrics__MetricsCollector__collect --> src__tagi__utils__risk__average_risk\n src__tagi__planner__sorter__group_by_complexity --> src__tagi__planner__sorter__sort_by_complexity\n src__tagi__planner__grouper__group_changes --> src__tagi__planner__grouper___get_primary_tag\n src__tagi__planner__grouper__group_changes --> src__tagi__utils__risk__total_lines_changed\n src__tagi__planner__grouper__group_changes --> src__tagi__utils__risk__average_risk\n src__tagi__planner__grouper__group_by_tag --> src__tagi__planner__selector__select_changes_by_tag\n tagi__planner__branch_grouper__group_by_branch --> tagi__utils__commands__run_command\n tagi__planner__branch_grouper__get_branch_info --> tagi__utils__commands__run_command\n src__tagi__cli__git_operations___is_known_tag --> src__tagi__cli__git_operations___ensure_tag_prefix\n src__tagi__cli__git_operations___resolve_send_target --> src__tagi__cli__git_operations___is_known_tag\n src__tagi__cli__git_operations___filter_by_tag --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__cli__git_operations___filter_by_tag --> src__tagi__cli__git_operations___ensure_tag_prefix\n src__tagi__cli__git_operations___execute_git_operations --> tagi__utils__detect_provider__get_provider\n src__tagi__cli__git_operations__send_command --> src__tagi__cli__git_operations___resolve_send_target\n src__tagi__cli__git_operations__auto_command --> src__tagi__cli__main___configure_command_logging\n src__tagi__cli__git_operations__auto_command --> src__tagi__cli__git_operations__send_command\n src__tagi__cli__inspection_commands__inspect_command --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__cli__inspection_commands__inspect_command --> src__tagi__utils__change_stats__display_statistics_table\n src__tagi__cli__inspection_commands__inspect_command --> src__tagi__cli__display_utils___display_changes\n src__tagi__cli__inspection_commands__inspect_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__inspection_commands__filter_command --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__cli__inspection_commands__filter_command --> src__tagi__utils__change_stats__display_statistics_table\n src__tagi__cli__inspection_commands__filter_command --> src__tagi__cli__display_utils___display_changes\n src__tagi__cli__inspection_commands__filter_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__inspection_commands__file_command --> tagi__scanner__diff__get_diff\n tagi__cli__provider_commands__detect_provider_command --> tagi__utils__detect_provider__get_provider\n tagi__cli__provider_commands___current_branch --> tagi__utils__commands__run_command\n tagi__cli__provider_commands___pr_spec --> tagi__cli__provider_commands___current_branch\n tagi__cli__provider_commands__create_pr --> tagi__utils__detect_provider__get_provider\n tagi__cli__provider_commands__create_pr --> tagi__cli__provider_commands___pr_spec\n tagi__cli__provider_commands__create_mr --> tagi__utils__detect_provider__get_provider\n tagi__cli__provider_commands__create_mr --> tagi__cli__provider_commands___pr_spec\n src__tagi__cli__core_commands__scan_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__core_commands__scan_command --> src__tagi__cli__display_utils___display_changes_grouped\n src__tagi__cli__core_commands__scan_command --> src__tagi__cli__display_utils___display_changes\n src__tagi__cli__core_commands__list_groups_command --> src__tagi__cli__core_commands___do_list_groups\n src__tagi__cli__core_commands__list_command --> src__tagi__cli__core_commands___do_list_groups\n src__tagi__cli__core_commands___do_list_groups --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__core_commands___do_list_groups --> src__tagi__utils__change_stats__calculate_tag_statistics\n src__tagi__cli__core_commands___do_list_groups --> src__tagi__utils__change_stats__display_statistics_table\n src__tagi__cli__core_commands__stats_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__core_commands__stats_command --> src__tagi__utils__change_stats__display_statistics_table\n src__tagi__cli__core_commands__stats_command --> src__tagi__utils__change_stats__calculate_tag_statistics\n src__tagi__cli__display_utils___display_changes --> src__tagi__cli__display_utils___format_tags\n src__tagi__cli__display_utils___display_groups --> src__tagi__cli__display_utils___format_tags\n src__tagi__cli__display_utils___display_changes_grouped --> src__tagi__cli__display_utils___display_groups\n src__tagi__cli__main__setup_logging --> src__tagi__utils__logger__setup_logger\n src__tagi__cli__main___configure_command_logging --> src__tagi__utils__logger__setup_logger\n src__tagi__cli__main___is_known_tag --> src__tagi__cli__main___ensure_tag_prefix\n src__tagi__cli__main___resolve_send_target --> src__tagi__cli__main___is_known_tag\n src__tagi__cli__main__detect_provider --> tagi__cli__provider_commands__detect_provider_command\n src__tagi__cli__publishing_commands__publish_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__publishing_commands__publish_command --> src__tagi__cli__publishing_commands___ensure_tag_prefix\n src__tagi__cli__publishing_commands__publish_command --> src__tagi__utils__publish_helpers__create_publish_group\n src__tagi__cli__publishing_commands__deploy_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__publishing_commands__deploy_command --> src__tagi__cli__publishing_commands___ensure_tag_prefix\n src__tagi__cli__utility_commands__summary_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__utility_commands__summary_command --> src__tagi__utils__change_stats__calculate_tag_statistics\n src__tagi__cli__utility_commands__hooks_command --> src__tagi__hooks__check_hooks_installed\n src__tagi__cli__utility_commands__draft_command --> src__tagi__cli__scan_utils__scan_and_tag\n src__tagi__cli__utility_commands__draft_command --> src__tagi__cli__utility_commands___ensure_tag_prefix\n src__tagi__cli__utility_commands__draft_command --> src__tagi__utils__send_helpers__create_change_group\n src__tagi__cli__utility_commands__draft_command --> src__tagi__composer__commit_message__generate_commit_message\n tagi__providers__base__BaseProvider___run_command --> tagi__utils__commands__run_command\n tagi__providers__gitlab__GitLabProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result\n tagi__providers__gitlab__GitLabProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result\n tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command\n tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command\n tagi__providers__github__GitHubProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result\n tagi__providers__github__GitHubProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result\n tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command\n tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command\n tagi__scanner__files__count_lines_changed --> tagi__utils__commands__run_command\n tagi__scanner__status__scan_repo --> tagi__utils__commands__run_command\n tagi__scanner__status__scan_repo --> src__tagi__config__load_config\n tagi__scanner__status__scan_repo --> src__tagi__config__Config__should_ignore\n tagi__scanner__status__scan_repo --> tagi__scanner__status__parse_status\n tagi__scanner__diff__get_diff --> tagi__utils__commands__run_command\n tagi__scanner__diff__get_staged_diff --> tagi__utils__commands__run_command\n src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___lines_risk_weight\n src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___tag_risk_weight\n src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___change_type_risk_weight\n src__tagi__heuristics__metrics___extension_complexity_weight --> src__tagi__utils__paths__path_endswith\n src__tagi__heuristics__metrics___extension_impact_weight --> src__tagi__utils__paths__path_endswith\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_complexity\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_impact\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_stability\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_test_impact\n src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_dependency_depth\n src__tagi__heuristics__metrics___calculate_complexity --> src__tagi__heuristics__metrics___extension_complexity_weight\n src__tagi__heuristics__metrics___calculate_impact --> src__tagi__heuristics__metrics___extension_impact_weight\n src__tagi__heuristics__metrics___calculate_test_impact --> src__tagi__utils__paths__path_endswith\n src__tagi__heuristics__metrics___calculate_test_impact --> src__tagi__utils__paths__path_matches\n src__tagi__heuristics__metrics___calculate_dependency_depth --> src__tagi__utils__paths__path_endswith\n src__tagi__heuristics__tags__apply_tags --> src__tagi__config__load_config\n src__tagi__heuristics__tags__apply_tags --> src__tagi__heuristics__tags___tag_change\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags___custom_config_tags\n src__tagi__heuristics__tags___tag_change --> tagi__scanner__files__count_lines_changed\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__metrics__calculate_metrics\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__scoring__calculate_risk_score\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags__apply_path_tags\n src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags___size_tags\n src__tagi__heuristics__tags__apply_path_tags --> src__tagi__utils__paths__path_matches\n src__tagi__heuristics__rules___get_config_attr --> src__tagi__config__load_config\n src__tagi__heuristics__rules__get_custom_rules --> src__tagi__heuristics__rules___get_config_attr\n src__tagi__heuristics__rules__get_custom_heuristics --> src__tagi__heuristics__rules___get_config_attr\n src__tagi__composer__formats__generate_conventional_message --> src__tagi__composer__formats___commit_type\n src__tagi__composer__formats__generate_conventional_message --> src__tagi__composer___tags__infer_scope\n src__tagi__composer__formats__generate_conventional_message --> src__tagi__composer__formats___describe_changes\n src__tagi__composer__formats__generate_conventional_message --> src__tagi__composer___tags__all_tags\n src__tagi__composer__formats__generate_detailed_message --> src__tagi__composer__formats___count_tags\n src__tagi__composer__formats__generate_detailed_message --> src__tagi__composer__formats___detailed_file_lines\n src__tagi__composer__formats__generate_simple_message --> src__tagi__composer___tags__summary_tag\n src__tagi__composer__formats__generate_oneline_message --> src__tagi__composer___tags__summary_tag\n src__tagi__composer__summary__generate_summary --> src__tagi__utils__risk__total_lines_changed\n src__tagi__composer__summary__generate_summary --> src__tagi__utils__risk__average_risk\n src__tagi__composer__commit_message__generate_commit_message --> src__tagi__composer___templates__render_template\n src__tagi__composer__commit_message__generate_commit_message --> src__tagi__composer__commit_message___improve_with_llm\n src__tagi__composer__commit_message__generate_commit_message --> src__tagi__composer___tags__summary_tag\n src__tagi__composer__commit_message__generate_commit_message --> src__tagi__config__load_config\n src__tagi__composer___tags__all_tag_values --> src__tagi__composer___tags__all_tags\n src__tagi__composer___tags__summary_tag --> src__tagi__composer___tags__all_tags\n tagi__executor__git__GitExecutor___run_command --> tagi__utils__commands__run_command\n src__tagi__utils__summary_helpers__build_statistics_section --> src__tagi__utils__risk__total_lines_changed\n src__tagi__utils__summary_helpers__build_statistics_section --> src__tagi__utils__risk__average_risk\n src__tagi__utils__publish_helpers__detect_and_get_provider --> tagi__utils__detect_provider__get_provider\n src__tagi__utils__publish_helpers__create_publish_group --> src__tagi__utils__risk__total_lines_changed\n src__tagi__utils__publish_helpers__create_publish_group --> src__tagi__utils__risk__average_risk\n tagi__utils__detect_provider__get_provider --> tagi__utils__detect_provider__detect_git_provider\n tagi__utils__detect_provider__detect_git_provider --> tagi__utils__commands__run_command\n src__tagi__utils__send_helpers__create_change_group --> src__tagi__utils__risk__total_lines_changed\n src__tagi__utils__send_helpers__create_change_group --> src__tagi__utils__risk__average_risk\n src__tagi__utils__change_stats__calculate_tag_statistics --> src__tagi__utils__risk__total_lines_changed\n src__tagi__utils__change_stats__calculate_tag_statistics --> src__tagi__utils__risk__average_risk\n src__tagi__utils__paths__path_matches --> src__tagi__utils__paths__path_key\n src__tagi__utils__paths__path_endswith --> src__tagi__utils__paths__path_key\n src__tagi__utils__change_filter___resolve_tag_enums --> src__tagi__utils__change_filter___normalize_tag\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___resolve_tag_enums\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___changes_matching_any\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___changes_matching_tag\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___changes_matching_all\n src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___normalize_tag\n src__tagi__utils__change_filter__filter_changes_by_tag --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__utils__change_filter__filter_changes_by_tags_any --> src__tagi__utils__change_filter__resolve_filtered_changes\n src__tagi__utils__change_filter__filter_changes_by_tags_all --> src__tagi__utils__change_filter__resolve_filtered_changes\n", "is_subdir": false}, {"name": "compact_flow.mmd", "rel_path": "compact_flow.mmd", "path": "compact_flow.mmd", "size": "701B", "icon": "📈", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart TD\n%% generated in 0.01s\n src__tagi["src.tagi<br/>187 funcs"]\n tagi__cli["tagi.cli<br/>5 funcs"]\n tagi__executor["tagi.executor<br/>9 funcs"]\n tagi__planner["tagi.planner<br/>2 funcs"]\n tagi__providers["tagi.providers<br/>18 funcs"]\n tagi__scanner["tagi.scanner<br/>5 funcs"]\n tagi__utils["tagi.utils<br/>3 funcs"]\n tagi__providers ==>|8| src__tagi\n src__tagi ==>|4| tagi__scanner\n tagi__cli ==>|4| tagi__utils\n tagi__scanner ==>|4| tagi__utils\n src__tagi -->|3| tagi__utils\n tagi__planner -->|2| tagi__utils\n tagi__scanner -->|2| src__tagi\n src__tagi -->|1| tagi__cli\n tagi__providers -->|1| tagi__utils\n tagi__executor -->|1| tagi__utils\n", "is_subdir": false}, {"name": "flow.mmd", "rel_path": "flow.mmd", "path": "flow.mmd", "size": "2.0KB", "icon": "📈", "type": "mermaid", "type_name": "Mermaid", "content": "flowchart TD\n%% generated in 0.01s\n\n %% Entry points (blue)\n classDef entry fill:#4dabf7,stroke:#1971c2,color:#fff\n\n subgraph CLI\n tagi__cli__provider_commands__detect_provider_command["detect_provider_command"]\n tagi__cli__provider_commands___current_branch["_current_branch"]\n tagi__cli__provider_commands___pr_spec["_pr_spec"]\n tagi__cli__provider_commands__create_pr["create_pr"]\n tagi__cli__provider_commands__create_mr["create_mr"]\n end\n\n subgraph Core\n src__tagi__config__Config___load_config["_load_config"]\n src__tagi__config__Config___apply_sections["_apply_sections"]\n src__tagi__config__Config__get_tag_for_path["get_tag_for_path"]\n src__tagi__config__Config__get_custom_tags_for_pattern["get_custom_tags_for_pattern"]\n src__tagi__config__Config__get_tag_color["get_tag_color"]\n src__tagi__config__Config__get_heuristics_for_path["get_heuristics_for_path"]\n src__tagi__config__Config__get_tags_for_path["get_tags_for_path"]\n src__tagi__config__Config__get_tag_description["get_tag_description"]\n src__tagi__config__Config__get_template["get_template"]\n src__tagi__hooks__install_hooks["install_hooks"]\n src__tagi__hooks__uninstall_hooks["uninstall_hooks"]\n src__tagi__hooks__list_hooks["list_hooks"]\n src__tagi__hooks__run_hook["run_hook"]\n src__tagi__analyzer__dependency_graph__build_dependency_graph["build_dependency_graph"]\n src__tagi__analyzer__dependency_graph___LevelOrder__levels["levels"]\n ...["+133 more"]\n end\n\n class src__tagi__config__Config___load_config,src__tagi__config__Config___apply_sections,src__tagi__config__Config__get_tag_for_path,src__tagi__config__Config__get_custom_tags_for_pattern,src__tagi__config__Config__get_tag_color,src__tagi__config__Config__get_heuristics_for_path,src__tagi__config__Config__get_tags_for_path,src__tagi__config__Config__get_tag_description,src__tagi__config__Config__get_template,src__tagi__hooks__install_hooks entry\n", "is_subdir": false}, {"name": "prompt.txt", "rel_path": "prompt.txt", "path": "prompt.txt", "size": "2.9KB", "icon": "📄", "type": "text", "type_name": "Text", "content": "You are an AI assistant helping me understand and improve a codebase.\n# generated in 0.00s\nUse the attached/generated files as the authoritative context.\nYour goal is to refactor the project based on these files, not just summarize it.\n\nwe are in project path: tagi\n\nFiles for analysis:\n\nNote: project/validation.toon.yaml and project/duplication.toon.yaml are generated by external tools (vallm and redup)\n- analysis.toon.yaml (Health diagnostics - complexity metrics, god modules, coupling issues, refactoring priorities) [10KB]\n- map.toon.yaml (Structural map - files, sizes, imports, exports, signatures, project header) [17KB]\n- evolution.toon.yaml (Refactoring queue - ranked actions by impact/effort, risks, metrics targets, history) [1KB]\n- project.toon.yaml (Compact project overview - generated from project.yaml data) [2KB]\n- context.md (LLM narrative - architecture summary and project context) [21KB]\n- README.md (Generated documentation - overview and usage guide) [9KB]\n\nTask:\n- Treat this prompt as a refactoring brief: identify the highest-priority changes and prepare concrete edits.\n- Use the file set to decide whether the first pass should focus on correctness, duplication, complexity reduction, or architecture cleanup.\n- If you can safely implement the refactor, do it; otherwise give an exact file-by-file change plan and test plan.\n- Use analysis.toon.yaml to locate high-CC functions and god modules that should be split first.\n- Keep module boundaries intact and update imports/exports according to map.toon.yaml.\n- Use evolution.toon.yaml as the execution backlog and work from the top-ranked items.\n- Keep project.toon.yaml aligned with the refactored architecture.\n\nPriority Order:\nP1 — Split or simplify the highest-CC / god modules identified in analysis.toon.yaml.\nP1 — Preserve module boundaries and update imports/exports according to map.toon.yaml.\nP2 — Keep the compact project overview in project.toon.yaml aligned with the refactor.\nP2 — Execute the highest-impact items from evolution.toon.yaml in order of benefit/risk.\n\nFocus Areas for Analysis:\n1. **Code Health Analysis** - Review complexity metrics, god modules, coupling issues from analysis.toon.yaml\n2. **Structural Map** - Use map.toon.yaml to inspect imports, exports, signatures, and the project header\n3. **Refactoring Priorities** - Examine ranked refactoring actions and risk assessment from evolution.toon.yaml\n4. **Project Overview** - Review the compact project overview from project.toon.yaml\n\nAnalysis Strategy:\n- Start with analysis.toon.yaml for health metrics, then map.toon.yaml for structure and signatures\n- Review evolution.toon.yaml for action priorities and next steps\n- Compare the compact project overview in project.toon.yaml with the main analysis files\n\nConstraints:\n- Prefer minimal, incremental changes.\n- Maintain full backward compatibility.\n- Base recommendations on concrete metrics from the provided files.\n- If uncertain, ask clarifying questions.\n", "is_subdir": false}, {"name": "logic.pl", "rel_path": "logic.pl", "path": "logic.pl", "size": "21.3KB", "icon": "📄", "type": "unknown", "type_name": "PL", "content": "[Binary file]", "is_subdir": false}, {"name": "mermaid.export", "rel_path": "mermaid.export", "path": "mermaid.export", "size": "26.3KB", "icon": "📄", "type": "unknown", "type_name": "EXPORT", "content": "[Binary file]", "is_subdir": false}, {"name": "analysis.toon.yaml", "rel_path": "analysis.toon.yaml", "path": "analysis.toon.yaml", "size": "10.9KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# code2llm | 77f 5590L | python:68,yaml:5,txt:2,toml:1,shell:1 | 2026-09-19\n# generated in 0.01s\n# CC̅=2.8 | critical:0/229 | dups:0 | cycles:2\n\nHEALTH[0]: ok\n\nREFACTOR[1]:\n 1. break 2 circular dependencies\n\nPIPELINES[122]:\n [1] Src [__init__]: __init__\n PURITY: 100% pure\n [2] Src [_load_config]: _load_config\n PURITY: 100% pure\n [3] Src [_apply_sections]: _apply_sections\n PURITY: 100% pure\n [4] Src [get_tag_for_path]: get_tag_for_path → path_matches → path_key\n PURITY: 100% pure\n [5] Src [get_custom_tags_for_pattern]: get_custom_tags_for_pattern\n PURITY: 100% pure\n [6] Src [get_tag_color]: get_tag_color\n PURITY: 100% pure\n [7] Src [get_heuristics_for_path]: get_heuristics_for_path → path_matches → path_key\n PURITY: 100% pure\n [8] Src [get_tags_for_path]: get_tags_for_path\n PURITY: 100% pure\n [9] Src [get_tag_description]: get_tag_description\n PURITY: 100% pure\n [10] Src [get_template]: get_template\n PURITY: 100% pure\n [11] Src [install_hooks]: install_hooks → _pre_commit_hook → _hooks_dir\n PURITY: 100% pure\n [12] Src [uninstall_hooks]: uninstall_hooks → _pre_commit_hook → _hooks_dir\n PURITY: 100% pure\n [13] Src [list_hooks]: list_hooks → _hooks_dir\n PURITY: 100% pure\n [14] Src [run_hook]: run_hook → _hooks_dir\n PURITY: 100% pure\n [15] Src [build_dependency_graph]: build_dependency_graph → analyze_python_imports → _collect_import_names\n PURITY: 100% pure\n [16] Src [__init__]: __init__\n PURITY: 100% pure\n [17] Src [levels]: levels\n PURITY: 100% pure\n [18] Src [_drain_level]: _drain_level\n PURITY: 100% pure\n [19] Src [find_dependency_order]: find_dependency_order\n PURITY: 100% pure\n [20] Src [detect_cycles]: detect_cycles → _dfs_visit → _mark\n PURITY: 100% pure\n [21] Src [get_critical_path]: get_critical_path → _find_longest_start → _longest_path_length\n PURITY: 100% pure\n [22] Src [collect]: collect → total_lines_changed\n PURITY: 100% pure\n [23] Src [to_json]: to_json\n PURITY: 100% pure\n [24] Src [save]: save\n PURITY: 100% pure\n [25] Src [generate_report]: generate_report\n PURITY: 100% pure\n [26] Src [sort_by_tag_priority]: sort_by_tag_priority\n PURITY: 100% pure\n [27] Src [group_by_complexity]: group_by_complexity → sort_by_complexity\n PURITY: 100% pure\n [28] Src [group_changes]: group_changes → _get_primary_tag\n PURITY: 100% pure\n [29] Src [group_by_tag]: group_by_tag → select_changes_by_tag\n PURITY: 100% pure\n [30] Src [preview_plan]: preview_plan\n PURITY: 100% pure\n [31] Src [preview_changes]: preview_changes\n PURITY: 100% pure\n [32] Src [group_by_branch]: group_by_branch → run_command\n PURITY: 100% pure\n [33] Src [get_branch_info]: get_branch_info → run_command\n PURITY: 100% pure\n [34] Src [select_by_tags]: select_by_tags\n PURITY: 100% pure\n [35] Src [select_safe_changes]: select_safe_changes\n PURITY: 100% pure\n [36] Src [auto_command]: auto_command → _configure_command_logging → setup_logger\n PURITY: 100% pure\n [37] Src [inspect_command]: inspect_command → resolve_filtered_changes → _resolve_tag_enums → _normalize_tag\n PURITY: 100% pure\n [38] Src [filter_command]: filter_command → resolve_filtered_changes → _resolve_tag_enums → _normalize_tag\n PURITY: 100% pure\n [39] Src [file_command]: file_command → get_diff → run_command\n PURITY: 100% pure\n [40] Src [create_pr]: create_pr → get_provider → detect_git_provider → run_command\n PURITY: 100% pure\n [41] Src [create_mr]: create_mr → get_provider → detect_git_provider → run_command\n PURITY: 100% pure\n [42] Src [scan_command]: scan_command → scan_and_tag\n PURITY: 100% pure\n [43] Src [list_groups_command]: list_groups_command → _do_list_groups → scan_and_tag\n PURITY: 100% pure\n [44] Src [list_command]: list_command → _do_list_groups → scan_and_tag\n PURITY: 100% pure\n [45] Src [stats_command]: stats_command → scan_and_tag\n PURITY: 100% pure\n [46] Src [setup_logging]: setup_logging → setup_logger\n PURITY: 100% pure\n [47] Src [_resolve_send_target]: _resolve_send_target → _is_known_tag → _ensure_tag_prefix\n PURITY: 100% pure\n [48] Src [detect_provider]: detect_provider → detect_provider_command → get_provider → detect_git_provider → ...(1 more)\n PURITY: 100% pure\n [49] Src [publish_command]: publish_command → scan_and_tag\n PURITY: 100% pure\n [50] Src [deploy_command]: deploy_command → scan_and_tag\n PURITY: 100% pure\n\nLAYERS:\n src/ CC̄=2.8 ←in:0 →out:0\n │ dependency_graph 276L 1C 16m CC=7 ←0\n │ metrics 223L 0C 11m CC=5 ←1\n │ design_tokens 221L 7C 3m CC=2 ←0\n │ utility_commands 211L 0C 5m CC=10 ←0\n │ koru 171L 2C 10m CC=8 ←0\n │ git_operations 170L 0C 7m CC=7 ←0\n │ metrics 153L 1C 6m CC=10 ←0\n │ formats 141L 0C 9m CC=5 ←0\n │ publishing_commands 139L 0C 3m CC=11 ←0\n │ hooks 127L 0C 7m CC=5 ←1\n │ inspection_commands 120L 0C 3m CC=7 ←0\n │ change_filter 120L 0C 9m CC=5 ←5\n │ config 118L 1C 12m CC=4 ←5\n │ main 113L 0C 6m CC=5 ←1\n │ summary_helpers 113L 0C 5m CC=5 ←0\n │ sorter 104L 0C 3m CC=5 ←1\n │ core_commands 94L 0C 5m CC=7 ←0\n │ tags 88L 0C 5m CC=4 ←0\n │ branch_grouper 81L 0C 2m CC=8 ←0\n │ display_utils 79L 0C 4m CC=5 ←3\n │ provider_commands 78L 0C 5m CC=4 ←1\n │ grouper 74L 0C 4m CC=5 ←0\n │ logger 71L 0C 2m CC=4 ←2\n │ git 67L 1C 9m CC=4 ←0\n │ base 66L 2C 8m CC=2 ←0\n │ commit_message 64L 0C 2m CC=5 ←1\n │ change 60L 4C 1m CC=1 ←0\n │ status 60L 0C 2m CC=7 ←0\n │ llx_adapter 55L 1C 4m CC=4 ←0\n │ _tags 52L 0C 4m CC=7 ←2\n │ detect_provider 52L 0C 2m CC=5 ←4\n │ __init__ 47L 0C 0m CC=0.0 ←0\n │ pr 46L 0C 2m CC=5 ←2\n │ gitlab 45L 1C 5m CC=4 ←0\n │ selector 44L 0C 5m CC=8 ←1\n │ preview 43L 0C 2m CC=7 ←0\n │ change_stats 42L 0C 2m CC=1 ←3\n │ scoring 41L 0C 4m CC=3 ←1\n │ publish_helpers 40L 0C 2m CC=1 ←1\n │ summary 39L 0C 2m CC=8 ←0\n │ publish 39L 1C 4m CC=3 ←0\n │ github 36L 1C 5m CC=2 ←0\n │ send_helpers 34L 0C 1m CC=2 ←2\n │ risk 33L 0C 2m CC=3 ←7\n │ auth 32L 0C 2m CC=2 ←2\n │ __init__ 32L 0C 0m CC=0.0 ←0\n │ scan_utils 25L 0C 1m CC=3 ←5\n │ files 25L 0C 1m CC=7 ←1\n │ inspect_helpers 25L 0C 0m CC=0.0 ←0\n │ paths 24L 0C 3m CC=1 ←3\n │ line_builder 23L 1C 4m CC=1 ←0\n │ plan 23L 2C 0m CC=0.0 ←0\n │ _templates 21L 0C 1m CC=2 ←1\n │ rules 20L 0C 3m CC=1 ←0\n │ commands 20L 0C 1m CC=1 ←8\n │ __init__ 18L 0C 0m CC=0.0 ←0\n │ group 16L 1C 0m CC=0.0 ←0\n │ detector 15L 0C 1m CC=3 ←0\n │ __init__ 14L 0C 0m CC=0.0 ←0\n │ diff 13L 0C 2m CC=1 ←1\n │ __init__ 13L 0C 0m CC=0.0 ←0\n │ __init__ 13L 0C 0m CC=0.0 ←0\n │ __init__ 12L 0C 0m CC=0.0 ←0\n │ __init__ 11L 0C 0m CC=0.0 ←0\n │ __init__ 9L 0C 0m CC=0.0 ←0\n │ __init__ 7L 0C 0m CC=0.0 ←0\n │ __main__ 6L 0C 0m CC=0.0 ←0\n │ __init__ 1L 0C 0m CC=0.0 ←0\n │\n ./ CC̄=0.0 ←in:0 →out:0\n │ !! goal.yaml 539L 0C 0m CC=0.0 ←0\n │ koru.yaml 133L 0C 0m CC=0.0 ←0\n │ wup.yaml 100L 0C 0m CC=0.0 ←0\n │ regix.yaml 93L 0C 0m CC=0.0 ←0\n │ tree.txt 89L 0C 0m CC=0.0 ←0\n │ pyproject.toml 49L 0C 0m CC=0.0 ←0\n │ project.sh 48L 0C 0m CC=0.0 ←0\n │ local.dev.txt 11L 0C 0m CC=0.0 ←0\n │\n testql-scenarios/ CC̄=0.0 ←in:0 →out:0\n │ generated-cli-tests.testql.toon.yaml 20L 0C 0m CC=0.0 ←0\n │\n\nCOUPLING:\n src.tagi tagi.utils tagi.scanner tagi.providers tagi.cli tagi.planner tagi.executor\n src.tagi ── 3 4 ←8 1 hub\n tagi.utils ←3 ── ←4 ←1 ←4 ←2 ←1 hub\n tagi.scanner 2 4 ── \n tagi.providers 8 1 ── !! fan-out\n tagi.cli ←1 4 ── \n tagi.planner 2 ── \n tagi.executor 1 ──\n CYCLES: 2\n HUB: tagi.utils/ (fan-in=15)\n HUB: src.tagi/ (fan-in=10)\n SMELL: src.tagi/ fan-out=8 → split needed\n SMELL: tagi.providers/ fan-out=9 → split needed\n\nEXTERNAL:\n validation: run `vallm batch .` → validation.toon\n duplication: run `redup scan .` → duplication.toon\n", "is_subdir": false}, {"name": "calls.toon.yaml", "rel_path": "calls.toon.yaml", "path": "calls.toon.yaml", "size": "12.7KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# code2llm call graph | /home/tom/github/semcod/tagi\n# generated in 0.07s\n# nodes: 147 | edges: 165 | modules: 45\n# CC̄=2.8\n\nHUBS[20]:\n src.tagi.cli.publishing_commands.publish_command\n CC=11 in:0 out:36 total:36\n src.tagi.cli.utility_commands.summary_command\n CC=7 in:0 out:28 total:28\n src.tagi.cli.git_operations.send_command\n CC=7 in:1 out:26 total:27\n src.tagi.cli.utility_commands.hooks_command\n CC=10 in:0 out:26 total:26\n src.tagi.cli.publishing_commands.deploy_command\n CC=5 in:0 out:22 total:22\n src.tagi.cli.inspection_commands.inspect_command\n CC=7 in:0 out:17 total:17\n src.tagi.utils.logger.setup_logger\n CC=4 in:2 out:15 total:17\n src.tagi.cli.scan_utils.scan_and_tag\n CC=3 in:11 out:6 total:17\n src.tagi.cli.utility_commands.draft_command\n CC=4 in:0 out:17 total:17\n src.tagi.cli.inspection_commands.filter_command\n CC=6 in:0 out:16 total:16\n src.tagi.utils.change_filter.resolve_filtered_changes\n CC=5 in:9 out:7 total:16\n src.tagi.utils.change_stats.display_statistics_table\n CC=1 in:4 out:12 total:16\n tagi.scanner.status.scan_repo\n CC=7 in:0 out:15 total:15\n src.tagi.cli.core_commands.stats_command\n CC=7 in:0 out:15 total:15\n src.tagi.cli.inspection_commands.file_command\n CC=7 in:0 out:14 total:14\n src.tagi.cli.git_operations._execute_git_operations\n CC=5 in:1 out:11 total:12\n src.tagi.heuristics.tags._tag_change\n CC=2 in:1 out:10 total:11\n src.tagi.cli.display_utils._display_changes\n CC=3 in:3 out:8 total:11\n tagi.utils.commands.run_command\n CC=1 in:10 out:1 total:11\n src.tagi.utils.risk.average_risk\n CC=3 in:8 out:2 total:10\n\nMODULES:\n src.tagi.analyzer.dependency_graph [12 funcs]\n _collect_import_names CC=7 out:5\n _cycle_from CC=1 out:1\n _dfs_visit CC=5 out:8\n _find_longest_start CC=1 out:2\n _longest_path_length CC=4 out:3\n _mark CC=1 out:0\n _next_critical_node CC=5 out:2\n _reconstruct_critical_path CC=3 out:4\n analyze_python_imports CC=2 out:4\n build_dependency_graph CC=3 out:4\n src.tagi.analyzer.metrics [1 funcs]\n collect CC=10 out:5\n src.tagi.cli.core_commands [5 funcs]\n _do_list_groups CC=4 out:7\n list_command CC=1 out:2\n list_groups_command CC=1 out:2\n scan_command CC=3 out:7\n stats_command CC=7 out:15\n src.tagi.cli.display_utils [4 funcs]\n _display_changes CC=3 out:8\n _display_changes_grouped CC=5 out:3\n _display_groups CC=4 out:6\n _format_tags CC=5 out:3\n src.tagi.cli.git_operations [7 funcs]\n _ensure_tag_prefix CC=2 out:1\n _execute_git_operations CC=5 out:11\n _filter_by_tag CC=3 out:4\n _is_known_tag CC=2 out:2\n _resolve_send_target CC=5 out:5\n auto_command CC=1 out:8\n send_command CC=7 out:26\n src.tagi.cli.inspection_commands [3 funcs]\n file_command CC=7 out:14\n filter_command CC=6 out:16\n inspect_command CC=7 out:17\n src.tagi.cli.main [6 funcs]\n _configure_command_logging CC=2 out:2\n _ensure_tag_prefix CC=2 out:1\n _is_known_tag CC=2 out:2\n _resolve_send_target CC=5 out:5\n detect_provider CC=1 out:1\n setup_logging CC=2 out:4\n src.tagi.cli.publishing_commands [3 funcs]\n _ensure_tag_prefix CC=2 out:1\n deploy_command CC=5 out:22\n publish_command CC=11 out:36\n src.tagi.cli.scan_utils [1 funcs]\n scan_and_tag CC=3 out:6\n src.tagi.cli.utility_commands [4 funcs]\n _ensure_tag_prefix CC=2 out:1\n draft_command CC=4 out:17\n hooks_command CC=10 out:26\n summary_command CC=7 out:28\n src.tagi.composer._tags [4 funcs]\n all_tag_values CC=2 out:1\n all_tags CC=3 out:2\n infer_scope CC=7 out:2\n summary_tag CC=3 out:2\n src.tagi.composer._templates [1 funcs]\n render_template CC=2 out:2\n src.tagi.composer.commit_message [2 funcs]\n _improve_with_llm CC=2 out:2\n generate_commit_message CC=5 out:8\n src.tagi.composer.formats [8 funcs]\n _commit_type CC=3 out:0\n _count_tags CC=3 out:1\n _describe_changes CC=2 out:2\n _detailed_file_lines CC=3 out:1\n generate_conventional_message CC=4 out:5\n generate_detailed_message CC=3 out:6\n generate_oneline_message CC=4 out:3\n generate_simple_message CC=5 out:6\n src.tagi.composer.summary [1 funcs]\n generate_summary CC=8 out:8\n src.tagi.config [4 funcs]\n get_heuristics_for_path CC=4 out:2\n get_tag_for_path CC=3 out:2\n should_ignore CC=2 out:2\n load_config CC=1 out:1\n src.tagi.heuristics.metrics [8 funcs]\n _calculate_complexity CC=1 out:6\n _calculate_dependency_depth CC=4 out:3\n _calculate_impact CC=1 out:3\n _calculate_stability CC=1 out:2\n _calculate_test_impact CC=4 out:3\n _extension_complexity_weight CC=3 out:1\n _extension_impact_weight CC=3 out:1\n calculate_metrics CC=1 out:6\n src.tagi.heuristics.rules [3 funcs]\n _get_config_attr CC=1 out:2\n get_custom_heuristics CC=1 out:1\n get_custom_rules CC=1 out:1\n src.tagi.heuristics.scoring [4 funcs]\n _change_type_risk_weight CC=1 out:1\n _lines_risk_weight CC=1 out:1\n _tag_risk_weight CC=3 out:2\n calculate_risk_score CC=1 out:4\n src.tagi.heuristics.tags [5 funcs]\n _custom_config_tags CC=3 out:3\n _size_tags CC=3 out:0\n _tag_change CC=2 out:10\n apply_path_tags CC=4 out:2\n apply_tags CC=2 out:2\n src.tagi.hooks [7 funcs]\n _hooks_dir CC=1 out:1\n _pre_commit_hook CC=1 out:1\n check_hooks_installed CC=2 out:3\n install_hooks CC=2 out:5\n list_hooks CC=5 out:7\n run_hook CC=2 out:5\n uninstall_hooks CC=3 out:3\n src.tagi.planner.grouper [3 funcs]\n _get_primary_tag CC=4 out:0\n group_by_tag CC=1 out:1\n group_changes CC=4 out:10\n src.tagi.planner.selector [1 funcs]\n select_changes_by_tag CC=3 out:0\n src.tagi.planner.sorter [2 funcs]\n group_by_complexity CC=5 out:7\n sort_by_complexity CC=1 out:4\n src.tagi.providers.utils.auth [2 funcs]\n get_auth_status_from_result CC=2 out:0\n is_authenticated_from_result CC=1 out:0\n src.tagi.providers.utils.pr [2 funcs]\n build_pr_command CC=5 out:2\n execute_pr_command CC=2 out:0\n src.tagi.utils.change_filter [9 funcs]\n _changes_matching_all CC=4 out:1\n _changes_matching_any CC=4 out:1\n _changes_matching_tag CC=3 out:0\n _normalize_tag CC=2 out:1\n _resolve_tag_enums CC=3 out:3\n filter_changes_by_tag CC=1 out:1\n filter_changes_by_tags_all CC=1 out:1\n filter_changes_by_tags_any CC=1 out:1\n resolve_filtered_changes CC=5 out:7\n src.tagi.utils.change_stats [2 funcs]\n calculate_tag_statistics CC=1 out:2\n display_statistics_table CC=1 out:12\n src.tagi.utils.logger [1 funcs]\n setup_logger CC=4 out:15\n src.tagi.utils.paths [3 funcs]\n path_endswith CC=1 out:2\n path_key CC=1 out:1\n path_matches CC=1 out:2\n src.tagi.utils.publish_helpers [2 funcs]\n create_publish_group CC=1 out:4\n detect_and_get_provider CC=1 out:1\n src.tagi.utils.risk [2 funcs]\n average_risk CC=3 out:2\n total_lines_changed CC=2 out:1\n src.tagi.utils.send_helpers [1 funcs]\n create_change_group CC=2 out:4\n src.tagi.utils.summary_helpers [1 funcs]\n build_statistics_section CC=1 out:4\n tagi.cli.provider_commands [5 funcs]\n _current_branch CC=2 out:2\n _pr_spec CC=1 out:2\n create_mr CC=4 out:8\n create_pr CC=4 out:8\n detect_provider_command CC=2 out:3\n tagi.executor.git [1 funcs]\n _run_command CC=1 out:1\n tagi.planner.branch_grouper [2 funcs]\n get_branch_info CC=5 out:6\n group_by_branch CC=8 out:10\n tagi.providers.base [1 funcs]\n _run_command CC=1 out:1\n tagi.providers.github [3 funcs]\n create_pr CC=1 out:3\n get_auth_status CC=1 out:2\n is_authenticated CC=1 out:2\n tagi.providers.gitlab [3 funcs]\n create_pr CC=1 out:3\n get_auth_status CC=1 out:2\n is_authenticated CC=1 out:2\n tagi.scanner.diff [2 funcs]\n get_diff CC=1 out:1\n get_staged_diff CC=1 out:1\n tagi.scanner.files [1 funcs]\n count_lines_changed CC=7 out:7\n tagi.scanner.status [2 funcs]\n parse_status CC=4 out:0\n scan_repo CC=7 out:15\n tagi.utils.commands [1 funcs]\n run_command CC=1 out:1\n tagi.utils.detect_provider [2 funcs]\n detect_git_provider CC=5 out:2\n get_provider CC=3 out:3\n\nEDGES:\n src.tagi.config.Config.get_tag_for_path → src.tagi.utils.paths.path_matches\n src.tagi.config.Config.get_heuristics_for_path → src.tagi.utils.paths.path_matches\n src.tagi.config.Config.should_ignore → src.tagi.utils.paths.path_matches\n src.tagi.hooks._pre_commit_hook → src.tagi.hooks._hooks_dir\n src.tagi.hooks.install_hooks → src.tagi.hooks._pre_commit_hook\n src.tagi.hooks.install_hooks → src.tagi.hooks._hooks_dir\n src.tagi.hooks.uninstall_hooks → src.tagi.hooks._pre_commit_hook\n src.tagi.hooks.check_hooks_installed → src.tagi.hooks._pre_commit_hook\n src.tagi.hooks.list_hooks → src.tagi.hooks._hooks_dir\n src.tagi.hooks.run_hook → src.tagi.hooks._hooks_dir\n src.tagi.analyzer.dependency_graph.analyze_python_imports → src.tagi.analyzer.dependency_graph._collect_import_names\n src.tagi.analyzer.dependency_graph.build_dependency_graph → src.tagi.analyzer.dependency_graph.analyze_python_imports\n src.tagi.analyzer.dependency_graph._dfs_visit → src.tagi.analyzer.dependency_graph._mark\n src.tagi.analyzer.dependency_graph._dfs_visit → src.tagi.analyzer.dependency_graph._cycle_from\n src.tagi.analyzer.dependency_graph.detect_cycles → src.tagi.analyzer.dependency_graph._dfs_visit\n src.tagi.analyzer.dependency_graph._find_longest_start → src.tagi.analyzer.dependency_graph._longest_path_length\n src.tagi.analyzer.dependency_graph._reconstruct_critical_path → src.tagi.analyzer.dependency_graph._next_critical_node\n src.tagi.analyzer.dependency_graph.get_critical_path → src.tagi.analyzer.dependency_graph._find_longest_start\n src.tagi.analyzer.dependency_graph.get_critical_path → src.tagi.analyzer.dependency_graph._reconstruct_critical_path\n src.tagi.analyzer.metrics.MetricsCollector.collect → src.tagi.utils.risk.total_lines_changed\n src.tagi.analyzer.metrics.MetricsCollector.collect → src.tagi.utils.risk.average_risk\n src.tagi.planner.sorter.group_by_complexity → src.tagi.planner.sorter.sort_by_complexity\n src.tagi.planner.grouper.group_changes → src.tagi.planner.grouper._get_primary_tag\n src.tagi.planner.grouper.group_changes → src.tagi.utils.risk.total_lines_changed\n src.tagi.planner.grouper.group_changes → src.tagi.utils.risk.average_risk\n src.tagi.planner.grouper.group_by_tag → src.tagi.planner.selector.select_changes_by_tag\n tagi.planner.branch_grouper.group_by_branch → tagi.utils.commands.run_command\n tagi.planner.branch_grouper.get_branch_info → tagi.utils.commands.run_command\n src.tagi.cli.git_operations._is_known_tag → src.tagi.cli.git_operations._ensure_tag_prefix\n src.tagi.cli.git_operations._resolve_send_target → src.tagi.cli.git_operations._is_known_tag\n src.tagi.cli.git_operations._filter_by_tag → src.tagi.utils.change_filter.resolve_filtered_changes\n src.tagi.cli.git_operations._filter_by_tag → src.tagi.cli.git_operations._ensure_tag_prefix\n src.tagi.cli.git_operations._execute_git_operations → tagi.utils.detect_provider.get_provider\n src.tagi.cli.git_operations.send_command → src.tagi.cli.git_operations._resolve_send_target\n src.tagi.cli.git_operations.auto_command → src.tagi.cli.main._configure_command_logging\n src.tagi.cli.git_operations.auto_command → src.tagi.cli.git_operations.send_command\n src.tagi.cli.inspection_commands.inspect_command → src.tagi.utils.change_filter.resolve_filtered_changes\n src.tagi.cli.inspection_commands.inspect_command → src.tagi.utils.change_stats.display_statistics_table\n src.tagi.cli.inspection_commands.inspect_command → src.tagi.cli.display_utils._display_changes\n src.tagi.cli.inspection_commands.inspect_command → src.tagi.cli.scan_utils.scan_and_tag\n src.tagi.cli.inspection_commands.filter_command → src.tagi.utils.change_filter.resolve_filtered_changes\n src.tagi.cli.inspection_commands.filter_command → src.tagi.utils.change_stats.display_statistics_table\n src.tagi.cli.inspection_commands.filter_command → src.tagi.cli.display_utils._display_changes\n src.tagi.cli.inspection_commands.filter_command → src.tagi.cli.scan_utils.scan_and_tag\n src.tagi.cli.inspection_commands.file_command → tagi.scanner.diff.get_diff\n tagi.cli.provider_commands.detect_provider_command → tagi.utils.detect_provider.get_provider\n tagi.cli.provider_commands._current_branch → tagi.utils.commands.run_command\n tagi.cli.provider_commands._pr_spec → tagi.cli.provider_commands._current_branch\n tagi.cli.provider_commands.create_pr → tagi.utils.detect_provider.get_provider\n tagi.cli.provider_commands.create_pr → tagi.cli.provider_commands._pr_spec\n", "is_subdir": false}, {"name": "calls.yaml", "rel_path": "calls.yaml", "path": "calls.yaml", "size": "62.7KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "project: /home/tom/github/semcod/tagi\ngenerated_from: code2llm call graph analysis\nstats:\n total_nodes: 147\n total_edges: 165\n modules_count: 45\nnodes:\n src.tagi.analyzer.dependency_graph._mark:\n name: _mark\n module: src.tagi.analyzer.dependency_graph\n line: 147\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 2\n src.tagi.providers.utils.auth.get_auth_status_from_result:\n name: get_auth_status_from_result\n module: src.tagi.providers.utils.auth\n line: 7\n cyclomatic_complexity: 2\n calls_out: 0\n calls_in: 2\n src.tagi.utils.summary_helpers.build_statistics_section:\n name: build_statistics_section\n module: src.tagi.utils.summary_helpers\n line: 31\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 0\n src.tagi.cli.utility_commands.hooks_command:\n name: hooks_command\n module: src.tagi.cli.utility_commands\n line: 131\n cyclomatic_complexity: 10\n calls_out: 26\n calls_in: 0\n src.tagi.cli.git_operations.send_command:\n name: send_command\n module: src.tagi.cli.git_operations\n line: 90\n cyclomatic_complexity: 7\n calls_out: 26\n calls_in: 1\n src.tagi.analyzer.metrics.MetricsCollector.collect:\n name: collect\n module: src.tagi.analyzer.metrics\n line: 25\n cyclomatic_complexity: 10\n calls_out: 5\n calls_in: 0\n src.tagi.composer.formats._detailed_file_lines:\n name: _detailed_file_lines\n module: src.tagi.composer.formats\n line: 75\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 1\n src.tagi.config.Config.get_heuristics_for_path:\n name: get_heuristics_for_path\n module: src.tagi.config\n line: 89\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 0\n src.tagi.heuristics.tags._size_tags:\n name: _size_tags\n module: src.tagi.heuristics.tags\n line: 60\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 1\n src.tagi.utils.change_filter._normalize_tag:\n name: _normalize_tag\n module: src.tagi.utils.change_filter\n line: 14\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 2\n src.tagi.utils.change_filter.filter_changes_by_tag:\n name: filter_changes_by_tag\n module: src.tagi.utils.change_filter\n line: 84\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.composer.formats.generate_conventional_message:\n name: generate_conventional_message\n module: src.tagi.composer.formats\n line: 42\n cyclomatic_complexity: 4\n calls_out: 5\n calls_in: 0\n src.tagi.cli.publishing_commands.publish_command:\n name: publish_command\n module: src.tagi.cli.publishing_commands\n line: 23\n cyclomatic_complexity: 11\n calls_out: 36\n calls_in: 0\n src.tagi.composer.commit_message._improve_with_llm:\n name: _improve_with_llm\n module: src.tagi.composer.commit_message\n line: 52\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.composer._tags.infer_scope:\n name: infer_scope\n module: src.tagi.composer._tags\n line: 41\n cyclomatic_complexity: 7\n calls_out: 2\n calls_in: 1\n src.tagi.utils.send_helpers.create_change_group:\n name: create_change_group\n module: src.tagi.utils.send_helpers\n line: 8\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 2\n src.tagi.analyzer.dependency_graph._cycle_from:\n name: _cycle_from\n module: src.tagi.analyzer.dependency_graph\n line: 152\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n tagi.utils.detect_provider.get_provider:\n name: get_provider\n module: tagi.utils.detect_provider\n line: 12\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 6\n src.tagi.hooks._pre_commit_hook:\n name: _pre_commit_hook\n module: src.tagi.hooks\n line: 13\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 3\n src.tagi.analyzer.dependency_graph._next_critical_node:\n name: _next_critical_node\n module: src.tagi.analyzer.dependency_graph\n line: 226\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 1\n src.tagi.cli.utility_commands._ensure_tag_prefix:\n name: _ensure_tag_prefix\n module: src.tagi.cli.utility_commands\n line: 18\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n src.tagi.cli.inspection_commands.inspect_command:\n name: inspect_command\n module: src.tagi.cli.inspection_commands\n line: 19\n cyclomatic_complexity: 7\n calls_out: 17\n calls_in: 0\n src.tagi.cli.utility_commands.summary_command:\n name: summary_command\n module: src.tagi.cli.utility_commands\n line: 25\n cyclomatic_complexity: 7\n calls_out: 28\n calls_in: 0\n src.tagi.config.load_config:\n name: load_config\n module: src.tagi.config\n line: 116\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 6\n src.tagi.heuristics.rules.get_custom_rules:\n name: get_custom_rules\n module: src.tagi.heuristics.rules\n line: 13\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.cli.publishing_commands.deploy_command:\n name: deploy_command\n module: src.tagi.cli.publishing_commands\n line: 96\n cyclomatic_complexity: 5\n calls_out: 22\n calls_in: 0\n src.tagi.composer._templates.render_template:\n name: render_template\n module: src.tagi.composer._templates\n line: 10\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.utils.publish_helpers.create_publish_group:\n name: create_publish_group\n module: src.tagi.utils.publish_helpers\n line: 22\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 1\n src.tagi.utils.paths.path_key:\n name: path_key\n module: src.tagi.utils.paths\n line: 12\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 2\n tagi.providers.gitlab.GitLabProvider.is_authenticated:\n name: is_authenticated\n module: tagi.providers.gitlab\n line: 16\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.composer._tags.all_tags:\n name: all_tags\n module: src.tagi.composer._tags\n line: 8\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 3\n src.tagi.hooks.install_hooks:\n name: install_hooks\n module: src.tagi.hooks\n line: 17\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.tagi.cli.inspection_commands.filter_command:\n name: filter_command\n module: src.tagi.cli.inspection_commands\n line: 56\n cyclomatic_complexity: 6\n calls_out: 16\n calls_in: 0\n src.tagi.hooks.check_hooks_installed:\n name: check_hooks_installed\n module: src.tagi.hooks\n line: 68\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 1\n src.tagi.heuristics.metrics._calculate_complexity:\n name: _calculate_complexity\n module: src.tagi.heuristics.metrics\n line: 88\n cyclomatic_complexity: 1\n calls_out: 6\n calls_in: 1\n src.tagi.cli.git_operations._resolve_send_target:\n name: _resolve_send_target\n module: src.tagi.cli.git_operations\n line: 37\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 1\n src.tagi.cli.display_utils._display_changes_grouped:\n name: _display_changes_grouped\n module: src.tagi.cli.display_utils\n line: 64\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 1\n src.tagi.cli.core_commands.scan_command:\n name: scan_command\n module: src.tagi.cli.core_commands\n line: 14\n cyclomatic_complexity: 3\n calls_out: 7\n calls_in: 0\n src.tagi.composer.formats.generate_simple_message:\n name: generate_simple_message\n module: src.tagi.composer.formats\n line: 102\n cyclomatic_complexity: 5\n calls_out: 6\n calls_in: 0\n src.tagi.heuristics.scoring._change_type_risk_weight:\n name: _change_type_risk_weight\n module: src.tagi.heuristics.scoring\n line: 39\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n tagi.providers.github.GitHubProvider.is_authenticated:\n name: is_authenticated\n module: tagi.providers.github\n line: 15\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.cli.display_utils._format_tags:\n name: _format_tags\n module: src.tagi.cli.display_utils\n line: 35\n cyclomatic_complexity: 5\n calls_out: 3\n calls_in: 4\n src.tagi.config.Config.get_tag_for_path:\n name: get_tag_for_path\n module: src.tagi.config\n line: 73\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 0\n src.tagi.heuristics.metrics._calculate_test_impact:\n name: _calculate_test_impact\n module: src.tagi.heuristics.metrics\n line: 134\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 1\n src.tagi.heuristics.metrics._extension_complexity_weight:\n name: _extension_complexity_weight\n module: src.tagi.heuristics.metrics\n line: 34\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 1\n src.tagi.utils.change_filter._changes_matching_any:\n name: _changes_matching_any\n module: src.tagi.utils.change_filter\n line: 35\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 1\n src.tagi.analyzer.dependency_graph.analyze_python_imports:\n name: analyze_python_imports\n module: src.tagi.analyzer.dependency_graph\n line: 33\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 1\n src.tagi.cli.main.detect_provider:\n name: detect_provider\n module: src.tagi.cli.main\n line: 111\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.planner.grouper.group_by_tag:\n name: group_by_tag\n module: src.tagi.planner.grouper\n line: 37\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.cli.git_operations._execute_git_operations:\n name: _execute_git_operations\n module: src.tagi.cli.git_operations\n line: 71\n cyclomatic_complexity: 5\n calls_out: 11\n calls_in: 1\n src.tagi.cli.core_commands.list_command:\n name: list_command\n module: src.tagi.cli.core_commands\n line: 40\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.composer.formats._describe_changes:\n name: _describe_changes\n module: src.tagi.composer.formats\n line: 35\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.planner.selector.select_changes_by_tag:\n name: select_changes_by_tag\n module: src.tagi.planner.selector\n line: 8\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 1\n src.tagi.utils.change_filter.filter_changes_by_tags_all:\n name: filter_changes_by_tags_all\n module: src.tagi.utils.change_filter\n line: 110\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.utils.change_filter.resolve_filtered_changes:\n name: resolve_filtered_changes\n module: src.tagi.utils.change_filter\n line: 45\n cyclomatic_complexity: 5\n calls_out: 7\n calls_in: 9\n src.tagi.utils.risk.average_risk:\n name: average_risk\n module: src.tagi.utils.risk\n line: 22\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 8\n src.tagi.composer._tags.summary_tag:\n name: summary_tag\n module: src.tagi.composer._tags\n line: 20\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 4\n src.tagi.cli.core_commands._do_list_groups:\n name: _do_list_groups\n module: src.tagi.cli.core_commands\n line: 47\n cyclomatic_complexity: 4\n calls_out: 7\n calls_in: 2\n src.tagi.analyzer.dependency_graph.get_critical_path:\n name: get_critical_path\n module: src.tagi.analyzer.dependency_graph\n line: 262\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n src.tagi.planner.grouper._get_primary_tag:\n name: _get_primary_tag\n module: src.tagi.planner.grouper\n line: 54\n cyclomatic_complexity: 4\n calls_out: 0\n calls_in: 1\n src.tagi.hooks.uninstall_hooks:\n name: uninstall_hooks\n module: src.tagi.hooks\n line: 49\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 0\n src.tagi.planner.sorter.group_by_complexity:\n name: group_by_complexity\n module: src.tagi.planner.sorter\n line: 80\n cyclomatic_complexity: 5\n calls_out: 7\n calls_in: 0\n src.tagi.cli.git_operations._ensure_tag_prefix:\n name: _ensure_tag_prefix\n module: src.tagi.cli.git_operations\n line: 21\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 2\n src.tagi.heuristics.rules.get_custom_heuristics:\n name: get_custom_heuristics\n module: src.tagi.heuristics.rules\n line: 18\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.analyzer.dependency_graph._longest_path_length:\n name: _longest_path_length\n module: src.tagi.analyzer.dependency_graph\n line: 203\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 2\n src.tagi.utils.paths.path_endswith:\n name: path_endswith\n module: src.tagi.utils.paths\n line: 22\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 6\n src.tagi.heuristics.tags._tag_change:\n name: _tag_change\n module: src.tagi.heuristics.tags\n line: 23\n cyclomatic_complexity: 2\n calls_out: 10\n calls_in: 1\n src.tagi.cli.main._configure_command_logging:\n name: _configure_command_logging\n module: src.tagi.cli.main\n line: 44\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n tagi.cli.provider_commands.detect_provider_command:\n name: detect_provider_command\n module: tagi.cli.provider_commands\n line: 17\n cyclomatic_complexity: 2\n calls_out: 3\n calls_in: 1\n src.tagi.planner.grouper.group_changes:\n name: group_changes\n module: src.tagi.planner.grouper\n line: 10\n cyclomatic_complexity: 4\n calls_out: 10\n calls_in: 0\n src.tagi.composer.formats._commit_type:\n name: _commit_type\n module: src.tagi.composer.formats\n line: 27\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 1\n tagi.providers.github.GitHubProvider.get_auth_status:\n name: get_auth_status\n module: tagi.providers.github\n line: 19\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n src.tagi.utils.change_filter._resolve_tag_enums:\n name: _resolve_tag_enums\n module: src.tagi.utils.change_filter\n line: 24\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 1\n src.tagi.heuristics.scoring._lines_risk_weight:\n name: _lines_risk_weight\n module: src.tagi.heuristics.scoring\n line: 29\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.tagi.heuristics.tags.apply_path_tags:\n name: apply_path_tags\n module: src.tagi.heuristics.tags\n line: 70\n cyclomatic_complexity: 4\n calls_out: 2\n calls_in: 1\n src.tagi.utils.publish_helpers.detect_and_get_provider:\n name: detect_and_get_provider\n module: src.tagi.utils.publish_helpers\n line: 10\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.heuristics.metrics._extension_impact_weight:\n name: _extension_impact_weight\n module: src.tagi.heuristics.metrics\n line: 42\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 1\n tagi.planner.branch_grouper.group_by_branch:\n name: group_by_branch\n module: tagi.planner.branch_grouper\n line: 7\n cyclomatic_complexity: 8\n calls_out: 10\n calls_in: 0\n tagi.planner.branch_grouper.get_branch_info:\n name: get_branch_info\n module: tagi.planner.branch_grouper\n line: 56\n cyclomatic_complexity: 5\n calls_out: 6\n calls_in: 0\n src.tagi.cli.display_utils._display_groups:\n name: _display_groups\n module: src.tagi.cli.display_utils\n line: 52\n cyclomatic_complexity: 4\n calls_out: 6\n calls_in: 1\n tagi.scanner.status.scan_repo:\n name: scan_repo\n module: tagi.scanner.status\n line: 11\n cyclomatic_complexity: 7\n calls_out: 15\n calls_in: 0\n src.tagi.composer.summary.generate_summary:\n name: generate_summary\n module: src.tagi.composer.summary\n line: 10\n cyclomatic_complexity: 8\n calls_out: 8\n calls_in: 0\n src.tagi.utils.change_filter._changes_matching_tag:\n name: _changes_matching_tag\n module: src.tagi.utils.change_filter\n line: 19\n cyclomatic_complexity: 3\n calls_out: 0\n calls_in: 1\n src.tagi.heuristics.scoring.calculate_risk_score:\n name: calculate_risk_score\n module: src.tagi.heuristics.scoring\n line: 20\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 1\n src.tagi.utils.paths.path_matches:\n name: path_matches\n module: src.tagi.utils.paths\n line: 17\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 6\n src.tagi.analyzer.dependency_graph._find_longest_start:\n name: _find_longest_start\n module: src.tagi.analyzer.dependency_graph\n line: 221\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 1\n src.tagi.utils.change_filter._changes_matching_all:\n name: _changes_matching_all\n module: src.tagi.utils.change_filter\n line: 40\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 1\n tagi.providers.base.BaseProvider._run_command:\n name: _run_command\n module: tagi.providers.base\n line: 50\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.composer.formats._count_tags:\n name: _count_tags\n module: src.tagi.composer.formats\n line: 66\n cyclomatic_complexity: 3\n calls_out: 1\n calls_in: 1\n src.tagi.cli.inspection_commands.file_command:\n name: file_command\n module: src.tagi.cli.inspection_commands\n line: 89\n cyclomatic_complexity: 7\n calls_out: 14\n calls_in: 0\n src.tagi.cli.main._is_known_tag:\n name: _is_known_tag\n module: src.tagi.cli.main\n line: 57\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.utils.change_filter.filter_changes_by_tags_any:\n name: filter_changes_by_tags_any\n module: src.tagi.utils.change_filter\n line: 97\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 1\n src.tagi.cli.main._ensure_tag_prefix:\n name: _ensure_tag_prefix\n module: src.tagi.cli.main\n line: 50\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 1\n tagi.cli.provider_commands.create_pr:\n name: create_pr\n module: tagi.cli.provider_commands\n line: 41\n cyclomatic_complexity: 4\n calls_out: 8\n calls_in: 0\n src.tagi.cli.git_operations.auto_command:\n name: auto_command\n module: src.tagi.cli.git_operations\n line: 148\n cyclomatic_complexity: 1\n calls_out: 8\n calls_in: 0\n src.tagi.utils.change_stats.calculate_tag_statistics:\n name: calculate_tag_statistics\n module: src.tagi.utils.change_stats\n line: 17\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 3\n src.tagi.heuristics.metrics._calculate_dependency_depth:\n name: _calculate_dependency_depth\n module: src.tagi.heuristics.metrics\n line: 148\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 1\n tagi.utils.detect_provider.detect_git_provider:\n name: detect_git_provider\n module: tagi.utils.detect_provider\n line: 29\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 1\n src.tagi.utils.change_stats.display_statistics_table:\n name: display_statistics_table\n module: src.tagi.utils.change_stats\n line: 29\n cyclomatic_complexity: 1\n calls_out: 12\n calls_in: 4\n src.tagi.composer.commit_message.generate_commit_message:\n name: generate_commit_message\n module: src.tagi.composer.commit_message\n line: 36\n cyclomatic_complexity: 5\n calls_out: 8\n calls_in: 1\n src.tagi.providers.utils.pr.build_pr_command:\n name: build_pr_command\n module: src.tagi.providers.utils.pr\n line: 10\n cyclomatic_complexity: 5\n calls_out: 2\n calls_in: 2\n src.tagi.utils.risk.total_lines_changed:\n name: total_lines_changed\n module: src.tagi.utils.risk\n line: 8\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 8\n src.tagi.heuristics.scoring._tag_risk_weight:\n name: _tag_risk_weight\n module: src.tagi.heuristics.scoring\n line: 34\n cyclomatic_complexity: 3\n calls_out: 2\n calls_in: 1\n src.tagi.analyzer.dependency_graph._collect_import_names:\n name: _collect_import_names\n module: src.tagi.analyzer.dependency_graph\n line: 10\n cyclomatic_complexity: 7\n calls_out: 5\n calls_in: 1\n src.tagi.heuristics.tags.apply_tags:\n name: apply_tags\n module: src.tagi.heuristics.tags\n line: 13\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 0\n tagi.scanner.files.count_lines_changed:\n name: count_lines_changed\n module: tagi.scanner.files\n line: 8\n cyclomatic_complexity: 7\n calls_out: 7\n calls_in: 1\n src.tagi.composer.formats.generate_detailed_message:\n name: generate_detailed_message\n module: src.tagi.composer.formats\n line: 84\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 0\n src.tagi.cli.core_commands.stats_command:\n name: stats_command\n module: src.tagi.cli.core_commands\n line: 65\n cyclomatic_complexity: 7\n calls_out: 15\n calls_in: 0\n tagi.scanner.diff.get_staged_diff:\n name: get_staged_diff\n module: tagi.scanner.diff\n line: 11\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n src.tagi.analyzer.dependency_graph.detect_cycles:\n name: detect_cycles\n module: src.tagi.analyzer.dependency_graph\n line: 184\n cyclomatic_complexity: 4\n calls_out: 1\n calls_in: 0\n src.tagi.cli.display_utils._display_changes:\n name: _display_changes\n module: src.tagi.cli.display_utils\n line: 14\n cyclomatic_complexity: 3\n calls_out: 8\n calls_in: 3\n src.tagi.cli.git_operations._is_known_tag:\n name: _is_known_tag\n module: src.tagi.cli.git_operations\n line: 28\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.heuristics.metrics._calculate_impact:\n name: _calculate_impact\n module: src.tagi.heuristics.metrics\n line: 106\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 1\n src.tagi.hooks.run_hook:\n name: run_hook\n module: src.tagi.hooks\n line: 107\n cyclomatic_complexity: 2\n calls_out: 5\n calls_in: 0\n src.tagi.providers.utils.auth.is_authenticated_from_result:\n name: is_authenticated_from_result\n module: src.tagi.providers.utils.auth\n line: 23\n cyclomatic_complexity: 1\n calls_out: 0\n calls_in: 2\n tagi.utils.commands.run_command:\n name: run_command\n module: tagi.utils.commands\n line: 12\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 10\n src.tagi.composer.formats.generate_oneline_message:\n name: generate_oneline_message\n module: src.tagi.composer.formats\n line: 115\n cyclomatic_complexity: 4\n calls_out: 3\n calls_in: 0\n src.tagi.heuristics.tags._custom_config_tags:\n name: _custom_config_tags\n module: src.tagi.heuristics.tags\n line: 49\n cyclomatic_complexity: 3\n calls_out: 3\n calls_in: 1\n src.tagi.composer._tags.all_tag_values:\n name: all_tag_values\n module: src.tagi.composer._tags\n line: 15\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 0\n tagi.cli.provider_commands.create_mr:\n name: create_mr\n module: tagi.cli.provider_commands\n line: 61\n cyclomatic_complexity: 4\n calls_out: 8\n calls_in: 0\n src.tagi.providers.utils.pr.execute_pr_command:\n name: execute_pr_command\n module: src.tagi.providers.utils.pr\n line: 35\n cyclomatic_complexity: 2\n calls_out: 0\n calls_in: 2\n tagi.cli.provider_commands._current_branch:\n name: _current_branch\n module: tagi.cli.provider_commands\n line: 27\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.cli.main.setup_logging:\n name: setup_logging\n module: src.tagi.cli.main\n line: 37\n cyclomatic_complexity: 2\n calls_out: 4\n calls_in: 0\n src.tagi.hooks.list_hooks:\n name: list_hooks\n module: src.tagi.hooks\n line: 86\n cyclomatic_complexity: 5\n calls_out: 7\n calls_in: 0\n tagi.cli.provider_commands._pr_spec:\n name: _pr_spec\n module: tagi.cli.provider_commands\n line: 36\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 2\n src.tagi.config.Config.should_ignore:\n name: should_ignore\n module: src.tagi.config\n line: 111\n cyclomatic_complexity: 2\n calls_out: 2\n calls_in: 1\n src.tagi.cli.main._resolve_send_target:\n name: _resolve_send_target\n module: src.tagi.cli.main\n line: 66\n cyclomatic_complexity: 5\n calls_out: 5\n calls_in: 0\n src.tagi.utils.logger.setup_logger:\n name: setup_logger\n module: src.tagi.utils.logger\n line: 9\n cyclomatic_complexity: 4\n calls_out: 15\n calls_in: 2\n src.tagi.cli.scan_utils.scan_and_tag:\n name: scan_and_tag\n module: src.tagi.cli.scan_utils\n line: 10\n cyclomatic_complexity: 3\n calls_out: 6\n calls_in: 11\n tagi.scanner.diff.get_diff:\n name: get_diff\n module: tagi.scanner.diff\n line: 6\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 3\n src.tagi.heuristics.rules._get_config_attr:\n name: _get_config_attr\n module: src.tagi.heuristics.rules\n line: 8\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 2\n src.tagi.heuristics.metrics._calculate_stability:\n name: _calculate_stability\n module: src.tagi.heuristics.metrics\n line: 117\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 1\n src.tagi.cli.utility_commands.draft_command:\n name: draft_command\n module: src.tagi.cli.utility_commands\n line: 180\n cyclomatic_complexity: 4\n calls_out: 17\n calls_in: 0\n tagi.providers.github.GitHubProvider.create_pr:\n name: create_pr\n module: tagi.providers.github\n line: 30\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.tagi.heuristics.metrics.calculate_metrics:\n name: calculate_metrics\n module: src.tagi.heuristics.metrics\n line: 50\n cyclomatic_complexity: 1\n calls_out: 6\n calls_in: 1\n src.tagi.cli.core_commands.list_groups_command:\n name: list_groups_command\n module: src.tagi.cli.core_commands\n line: 33\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n tagi.executor.git.GitExecutor._run_command:\n name: _run_command\n module: tagi.executor.git\n line: 15\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 0\n tagi.providers.gitlab.GitLabProvider.get_auth_status:\n name: get_auth_status\n module: tagi.providers.gitlab\n line: 20\n cyclomatic_complexity: 1\n calls_out: 2\n calls_in: 0\n tagi.providers.gitlab.GitLabProvider.create_pr:\n name: create_pr\n module: tagi.providers.gitlab\n line: 39\n cyclomatic_complexity: 1\n calls_out: 3\n calls_in: 0\n src.tagi.cli.publishing_commands._ensure_tag_prefix:\n name: _ensure_tag_prefix\n module: src.tagi.cli.publishing_commands\n line: 16\n cyclomatic_complexity: 2\n calls_out: 1\n calls_in: 2\n src.tagi.analyzer.dependency_graph._dfs_visit:\n name: _dfs_visit\n module: src.tagi.analyzer.dependency_graph\n line: 158\n cyclomatic_complexity: 5\n calls_out: 8\n calls_in: 2\n src.tagi.analyzer.dependency_graph._reconstruct_critical_path:\n name: _reconstruct_critical_path\n module: src.tagi.analyzer.dependency_graph\n line: 244\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 1\n tagi.scanner.status.parse_status:\n name: parse_status\n module: tagi.scanner.status\n line: 51\n cyclomatic_complexity: 4\n calls_out: 0\n calls_in: 1\n src.tagi.cli.git_operations._filter_by_tag:\n name: _filter_by_tag\n module: src.tagi.cli.git_operations\n line: 60\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 1\n src.tagi.hooks._hooks_dir:\n name: _hooks_dir\n module: src.tagi.hooks\n line: 9\n cyclomatic_complexity: 1\n calls_out: 1\n calls_in: 4\n src.tagi.analyzer.dependency_graph.build_dependency_graph:\n name: build_dependency_graph\n module: src.tagi.analyzer.dependency_graph\n line: 54\n cyclomatic_complexity: 3\n calls_out: 4\n calls_in: 0\n src.tagi.planner.sorter.sort_by_complexity:\n name: sort_by_complexity\n module: src.tagi.planner.sorter\n line: 7\n cyclomatic_complexity: 1\n calls_out: 4\n calls_in: 2\nedges:\n- caller: src.tagi.config.Config.get_tag_for_path\n callee: src.tagi.utils.paths.path_matches\n call_type: resolved\n- caller: src.tagi.config.Config.get_heuristics_for_path\n callee: src.tagi.utils.paths.path_matches\n call_type: resolved\n- caller: src.tagi.config.Config.should_ignore\n callee: src.tagi.utils.paths.path_matches\n call_type: resolved\n- caller: src.tagi.hooks._pre_commit_hook\n callee: src.tagi.hooks._hooks_dir\n call_type: resolved\n- caller: src.tagi.hooks.install_hooks\n callee: src.tagi.hooks._pre_commit_hook\n call_type: resolved\n- caller: src.tagi.hooks.install_hooks\n callee: src.tagi.hooks._hooks_dir\n call_type: resolved\n- caller: src.tagi.hooks.uninstall_hooks\n callee: src.tagi.hooks._pre_commit_hook\n call_type: resolved\n- caller: src.tagi.hooks.check_hooks_installed\n callee: src.tagi.hooks._pre_commit_hook\n call_type: resolved\n- caller: src.tagi.hooks.list_hooks\n callee: src.tagi.hooks._hooks_dir\n call_type: resolved\n- caller: src.tagi.hooks.run_hook\n callee: src.tagi.hooks._hooks_dir\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.analyze_python_imports\n callee: src.tagi.analyzer.dependency_graph._collect_import_names\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.build_dependency_graph\n callee: src.tagi.analyzer.dependency_graph.analyze_python_imports\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph._dfs_visit\n callee: src.tagi.analyzer.dependency_graph._mark\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph._dfs_visit\n callee: src.tagi.analyzer.dependency_graph._cycle_from\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.detect_cycles\n callee: src.tagi.analyzer.dependency_graph._dfs_visit\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph._find_longest_start\n callee: src.tagi.analyzer.dependency_graph._longest_path_length\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph._reconstruct_critical_path\n callee: src.tagi.analyzer.dependency_graph._next_critical_node\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.get_critical_path\n callee: src.tagi.analyzer.dependency_graph._find_longest_start\n call_type: resolved\n- caller: src.tagi.analyzer.dependency_graph.get_critical_path\n callee: src.tagi.analyzer.dependency_graph._reconstruct_critical_path\n call_type: resolved\n- caller: src.tagi.analyzer.metrics.MetricsCollector.collect\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.analyzer.metrics.MetricsCollector.collect\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.planner.sorter.group_by_complexity\n callee: src.tagi.planner.sorter.sort_by_complexity\n call_type: resolved\n- caller: src.tagi.planner.grouper.group_changes\n callee: src.tagi.planner.grouper._get_primary_tag\n call_type: resolved\n- caller: src.tagi.planner.grouper.group_changes\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.planner.grouper.group_changes\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.planner.grouper.group_by_tag\n callee: src.tagi.planner.selector.select_changes_by_tag\n call_type: resolved\n- caller: tagi.planner.branch_grouper.group_by_branch\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: tagi.planner.branch_grouper.get_branch_info\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: src.tagi.cli.git_operations._is_known_tag\n callee: src.tagi.cli.git_operations._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.git_operations._resolve_send_target\n callee: src.tagi.cli.git_operations._is_known_tag\n call_type: resolved\n- caller: src.tagi.cli.git_operations._filter_by_tag\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.cli.git_operations._filter_by_tag\n callee: src.tagi.cli.git_operations._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.git_operations._execute_git_operations\n callee: tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: src.tagi.cli.git_operations.send_command\n callee: src.tagi.cli.git_operations._resolve_send_target\n call_type: resolved\n- caller: src.tagi.cli.git_operations.auto_command\n callee: src.tagi.cli.main._configure_command_logging\n call_type: resolved\n- caller: src.tagi.cli.git_operations.auto_command\n callee: src.tagi.cli.git_operations.send_command\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.inspect_command\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.inspect_command\n callee: src.tagi.utils.change_stats.display_statistics_table\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.inspect_command\n callee: src.tagi.cli.display_utils._display_changes\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.inspect_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.filter_command\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.filter_command\n callee: src.tagi.utils.change_stats.display_statistics_table\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.filter_command\n callee: src.tagi.cli.display_utils._display_changes\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.filter_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.inspection_commands.file_command\n callee: tagi.scanner.diff.get_diff\n call_type: resolved\n- caller: tagi.cli.provider_commands.detect_provider_command\n callee: tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: tagi.cli.provider_commands._current_branch\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: tagi.cli.provider_commands._pr_spec\n callee: tagi.cli.provider_commands._current_branch\n call_type: resolved\n- caller: tagi.cli.provider_commands.create_pr\n callee: tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: tagi.cli.provider_commands.create_pr\n callee: tagi.cli.provider_commands._pr_spec\n call_type: resolved\n- caller: tagi.cli.provider_commands.create_mr\n callee: tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: tagi.cli.provider_commands.create_mr\n callee: tagi.cli.provider_commands._pr_spec\n call_type: resolved\n- caller: src.tagi.cli.core_commands.scan_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.core_commands.scan_command\n callee: src.tagi.cli.display_utils._display_changes_grouped\n call_type: resolved\n- caller: src.tagi.cli.core_commands.scan_command\n callee: src.tagi.cli.display_utils._display_changes\n call_type: resolved\n- caller: src.tagi.cli.core_commands.list_groups_command\n callee: src.tagi.cli.core_commands._do_list_groups\n call_type: resolved\n- caller: src.tagi.cli.core_commands.list_command\n callee: src.tagi.cli.core_commands._do_list_groups\n call_type: resolved\n- caller: src.tagi.cli.core_commands._do_list_groups\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.core_commands._do_list_groups\n callee: src.tagi.utils.change_stats.calculate_tag_statistics\n call_type: resolved\n- caller: src.tagi.cli.core_commands._do_list_groups\n callee: src.tagi.utils.change_stats.display_statistics_table\n call_type: resolved\n- caller: src.tagi.cli.core_commands.stats_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.core_commands.stats_command\n callee: src.tagi.utils.change_stats.display_statistics_table\n call_type: resolved\n- caller: src.tagi.cli.core_commands.stats_command\n callee: src.tagi.utils.change_stats.calculate_tag_statistics\n call_type: resolved\n- caller: src.tagi.cli.display_utils._display_changes\n callee: src.tagi.cli.display_utils._format_tags\n call_type: resolved\n- caller: src.tagi.cli.display_utils._display_groups\n callee: src.tagi.cli.display_utils._format_tags\n call_type: resolved\n- caller: src.tagi.cli.display_utils._display_changes_grouped\n callee: src.tagi.cli.display_utils._display_groups\n call_type: resolved\n- caller: src.tagi.cli.main.setup_logging\n callee: src.tagi.utils.logger.setup_logger\n call_type: resolved\n- caller: src.tagi.cli.main._configure_command_logging\n callee: src.tagi.utils.logger.setup_logger\n call_type: resolved\n- caller: src.tagi.cli.main._is_known_tag\n callee: src.tagi.cli.main._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.main._resolve_send_target\n callee: src.tagi.cli.main._is_known_tag\n call_type: resolved\n- caller: src.tagi.cli.main.detect_provider\n callee: tagi.cli.provider_commands.detect_provider_command\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.publish_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.publish_command\n callee: src.tagi.cli.publishing_commands._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.publish_command\n callee: src.tagi.utils.publish_helpers.create_publish_group\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.deploy_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.publishing_commands.deploy_command\n callee: src.tagi.cli.publishing_commands._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.summary_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.summary_command\n callee: src.tagi.utils.change_stats.calculate_tag_statistics\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.hooks_command\n callee: src.tagi.hooks.check_hooks_installed\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.draft_command\n callee: src.tagi.cli.scan_utils.scan_and_tag\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.draft_command\n callee: src.tagi.cli.utility_commands._ensure_tag_prefix\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.draft_command\n callee: src.tagi.utils.send_helpers.create_change_group\n call_type: resolved\n- caller: src.tagi.cli.utility_commands.draft_command\n callee: src.tagi.composer.commit_message.generate_commit_message\n call_type: resolved\n- caller: tagi.providers.base.BaseProvider._run_command\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: tagi.providers.gitlab.GitLabProvider.is_authenticated\n callee: src.tagi.providers.utils.auth.is_authenticated_from_result\n call_type: resolved\n- caller: tagi.providers.gitlab.GitLabProvider.get_auth_status\n callee: src.tagi.providers.utils.auth.get_auth_status_from_result\n call_type: resolved\n- caller: tagi.providers.gitlab.GitLabProvider.create_pr\n callee: src.tagi.providers.utils.pr.execute_pr_command\n call_type: resolved\n- caller: tagi.providers.gitlab.GitLabProvider.create_pr\n callee: src.tagi.providers.utils.pr.build_pr_command\n call_type: resolved\n- caller: tagi.providers.github.GitHubProvider.is_authenticated\n callee: src.tagi.providers.utils.auth.is_authenticated_from_result\n call_type: resolved\n- caller: tagi.providers.github.GitHubProvider.get_auth_status\n callee: src.tagi.providers.utils.auth.get_auth_status_from_result\n call_type: resolved\n- caller: tagi.providers.github.GitHubProvider.create_pr\n callee: src.tagi.providers.utils.pr.execute_pr_command\n call_type: resolved\n- caller: tagi.providers.github.GitHubProvider.create_pr\n callee: src.tagi.providers.utils.pr.build_pr_command\n call_type: resolved\n- caller: tagi.scanner.files.count_lines_changed\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: tagi.scanner.status.scan_repo\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: tagi.scanner.status.scan_repo\n callee: src.tagi.config.load_config\n call_type: resolved\n- caller: tagi.scanner.status.scan_repo\n callee: src.tagi.config.Config.should_ignore\n call_type: resolved\n- caller: tagi.scanner.status.scan_repo\n callee: tagi.scanner.status.parse_status\n call_type: resolved\n- caller: tagi.scanner.diff.get_diff\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: tagi.scanner.diff.get_staged_diff\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: src.tagi.heuristics.scoring.calculate_risk_score\n callee: src.tagi.heuristics.scoring._lines_risk_weight\n call_type: resolved\n- caller: src.tagi.heuristics.scoring.calculate_risk_score\n callee: src.tagi.heuristics.scoring._tag_risk_weight\n call_type: resolved\n- caller: src.tagi.heuristics.scoring.calculate_risk_score\n callee: src.tagi.heuristics.scoring._change_type_risk_weight\n call_type: resolved\n- caller: src.tagi.heuristics.metrics._extension_complexity_weight\n callee: src.tagi.utils.paths.path_endswith\n call_type: resolved\n- caller: src.tagi.heuristics.metrics._extension_impact_weight\n callee: src.tagi.utils.paths.path_endswith\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_complexity\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_impact\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_stability\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_test_impact\n call_type: resolved\n- caller: src.tagi.heuristics.metrics.calculate_metrics\n callee: src.tagi.heuristics.metrics._calculate_dependency_depth\n call_type: resolved\n- caller: src.tagi.heuristics.metrics._calculate_complexity\n callee: src.tagi.heuristics.metrics._extension_complexity_weight\n call_type: resolved\n- caller: src.tagi.heuristics.metrics._calculate_impact\n callee: src.tagi.heuristics.metrics._extension_impact_weight\n call_type: resolved\n- caller: src.tagi.heuristics.metrics._calculate_test_impact\n callee: src.tagi.utils.paths.path_endswith\n call_type: resolved\n- caller: src.tagi.heuristics.metrics._calculate_test_impact\n callee: src.tagi.utils.paths.path_matches\n call_type: resolved\n- caller: src.tagi.heuristics.metrics._calculate_dependency_depth\n callee: src.tagi.utils.paths.path_endswith\n call_type: resolved\n- caller: src.tagi.heuristics.tags.apply_tags\n callee: src.tagi.config.load_config\n call_type: resolved\n- caller: src.tagi.heuristics.tags.apply_tags\n callee: src.tagi.heuristics.tags._tag_change\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.tags._custom_config_tags\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: tagi.scanner.files.count_lines_changed\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.metrics.calculate_metrics\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.scoring.calculate_risk_score\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.tags.apply_path_tags\n call_type: resolved\n- caller: src.tagi.heuristics.tags._tag_change\n callee: src.tagi.heuristics.tags._size_tags\n call_type: resolved\n- caller: src.tagi.heuristics.tags.apply_path_tags\n callee: src.tagi.utils.paths.path_matches\n call_type: resolved\n- caller: src.tagi.heuristics.rules._get_config_attr\n callee: src.tagi.config.load_config\n call_type: resolved\n- caller: src.tagi.heuristics.rules.get_custom_rules\n callee: src.tagi.heuristics.rules._get_config_attr\n call_type: resolved\n- caller: src.tagi.heuristics.rules.get_custom_heuristics\n callee: src.tagi.heuristics.rules._get_config_attr\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_conventional_message\n callee: src.tagi.composer.formats._commit_type\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_conventional_message\n callee: src.tagi.composer._tags.infer_scope\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_conventional_message\n callee: src.tagi.composer.formats._describe_changes\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_conventional_message\n callee: src.tagi.composer._tags.all_tags\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_detailed_message\n callee: src.tagi.composer.formats._count_tags\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_detailed_message\n callee: src.tagi.composer.formats._detailed_file_lines\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_simple_message\n callee: src.tagi.composer._tags.summary_tag\n call_type: resolved\n- caller: src.tagi.composer.formats.generate_oneline_message\n callee: src.tagi.composer._tags.summary_tag\n call_type: resolved\n- caller: src.tagi.composer.summary.generate_summary\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.composer.summary.generate_summary\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.composer.commit_message.generate_commit_message\n callee: src.tagi.composer._templates.render_template\n call_type: resolved\n- caller: src.tagi.composer.commit_message.generate_commit_message\n callee: src.tagi.composer.commit_message._improve_with_llm\n call_type: resolved\n- caller: src.tagi.composer.commit_message.generate_commit_message\n callee: src.tagi.composer._tags.summary_tag\n call_type: resolved\n- caller: src.tagi.composer.commit_message.generate_commit_message\n callee: src.tagi.config.load_config\n call_type: resolved\n- caller: src.tagi.composer._tags.all_tag_values\n callee: src.tagi.composer._tags.all_tags\n call_type: resolved\n- caller: src.tagi.composer._tags.summary_tag\n callee: src.tagi.composer._tags.all_tags\n call_type: resolved\n- caller: tagi.executor.git.GitExecutor._run_command\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: src.tagi.utils.summary_helpers.build_statistics_section\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.utils.summary_helpers.build_statistics_section\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.utils.publish_helpers.detect_and_get_provider\n callee: tagi.utils.detect_provider.get_provider\n call_type: resolved\n- caller: src.tagi.utils.publish_helpers.create_publish_group\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.utils.publish_helpers.create_publish_group\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: tagi.utils.detect_provider.get_provider\n callee: tagi.utils.detect_provider.detect_git_provider\n call_type: resolved\n- caller: tagi.utils.detect_provider.detect_git_provider\n callee: tagi.utils.commands.run_command\n call_type: resolved\n- caller: src.tagi.utils.send_helpers.create_change_group\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.utils.send_helpers.create_change_group\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.utils.change_stats.calculate_tag_statistics\n callee: src.tagi.utils.risk.total_lines_changed\n call_type: resolved\n- caller: src.tagi.utils.change_stats.calculate_tag_statistics\n callee: src.tagi.utils.risk.average_risk\n call_type: resolved\n- caller: src.tagi.utils.paths.path_matches\n callee: src.tagi.utils.paths.path_key\n call_type: resolved\n- caller: src.tagi.utils.paths.path_endswith\n callee: src.tagi.utils.paths.path_key\n call_type: resolved\n- caller: src.tagi.utils.change_filter._resolve_tag_enums\n callee: src.tagi.utils.change_filter._normalize_tag\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._resolve_tag_enums\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._changes_matching_any\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._changes_matching_tag\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._changes_matching_all\n call_type: resolved\n- caller: src.tagi.utils.change_filter.resolve_filtered_changes\n callee: src.tagi.utils.change_filter._normalize_tag\n call_type: resolved\n- caller: src.tagi.utils.change_filter.filter_changes_by_tag\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.utils.change_filter.filter_changes_by_tags_any\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\n- caller: src.tagi.utils.change_filter.filter_changes_by_tags_all\n callee: src.tagi.utils.change_filter.resolve_filtered_changes\n call_type: resolved\nmodules:\n src.tagi.analyzer.dependency_graph:\n - src.tagi.analyzer.dependency_graph._collect_import_names\n - src.tagi.analyzer.dependency_graph._cycle_from\n - src.tagi.analyzer.dependency_graph._dfs_visit\n - src.tagi.analyzer.dependency_graph._find_longest_start\n - src.tagi.analyzer.dependency_graph._longest_path_length\n - src.tagi.analyzer.dependency_graph._mark\n - src.tagi.analyzer.dependency_graph._next_critical_node\n - src.tagi.analyzer.dependency_graph._reconstruct_critical_path\n - src.tagi.analyzer.dependency_graph.analyze_python_imports\n - src.tagi.analyzer.dependency_graph.build_dependency_graph\n - src.tagi.analyzer.dependency_graph.detect_cycles\n - src.tagi.analyzer.dependency_graph.get_critical_path\n src.tagi.analyzer.metrics:\n - src.tagi.analyzer.metrics.MetricsCollector.collect\n src.tagi.cli.core_commands:\n - src.tagi.cli.core_commands._do_list_groups\n - src.tagi.cli.core_commands.list_command\n - src.tagi.cli.core_commands.list_groups_command\n - src.tagi.cli.core_commands.scan_command\n - src.tagi.cli.core_commands.stats_command\n src.tagi.cli.display_utils:\n - src.tagi.cli.display_utils._display_changes\n - src.tagi.cli.display_utils._display_changes_grouped\n - src.tagi.cli.display_utils._display_groups\n - src.tagi.cli.display_utils._format_tags\n src.tagi.cli.git_operations:\n - src.tagi.cli.git_operations._ensure_tag_prefix\n - src.tagi.cli.git_operations._execute_git_operations\n - src.tagi.cli.git_operations._filter_by_tag\n - src.tagi.cli.git_operations._is_known_tag\n - src.tagi.cli.git_operations._resolve_send_target\n - src.tagi.cli.git_operations.auto_command\n - src.tagi.cli.git_operations.send_command\n src.tagi.cli.inspection_commands:\n - src.tagi.cli.inspection_commands.file_command\n - src.tagi.cli.inspection_commands.filter_command\n - src.tagi.cli.inspection_commands.inspect_command\n src.tagi.cli.main:\n - src.tagi.cli.main._configure_command_logging\n - src.tagi.cli.main._ensure_tag_prefix\n - src.tagi.cli.main._is_known_tag\n - src.tagi.cli.main._resolve_send_target\n - src.tagi.cli.main.detect_provider\n - src.tagi.cli.main.setup_logging\n src.tagi.cli.publishing_commands:\n - src.tagi.cli.publishing_commands._ensure_tag_prefix\n - src.tagi.cli.publishing_commands.deploy_command\n - src.tagi.cli.publishing_commands.publish_command\n src.tagi.cli.scan_utils:\n - src.tagi.cli.scan_utils.scan_and_tag\n src.tagi.cli.utility_commands:\n - src.tagi.cli.utility_commands._ensure_tag_prefix\n - src.tagi.cli.utility_commands.draft_command\n - src.tagi.cli.utility_commands.hooks_command\n - src.tagi.cli.utility_commands.summary_command\n src.tagi.composer._tags:\n - src.tagi.composer._tags.all_tag_values\n - src.tagi.composer._tags.all_tags\n - src.tagi.composer._tags.infer_scope\n - src.tagi.composer._tags.summary_tag\n src.tagi.composer._templates:\n - src.tagi.composer._templates.render_template\n src.tagi.composer.commit_message:\n - src.tagi.composer.commit_message._improve_with_llm\n - src.tagi.composer.commit_message.generate_commit_message\n src.tagi.composer.formats:\n - src.tagi.composer.formats._commit_type\n - src.tagi.composer.formats._count_tags\n - src.tagi.composer.formats._describe_changes\n - src.tagi.composer.formats._detailed_file_lines\n - src.tagi.composer.formats.generate_conventional_message\n - src.tagi.composer.formats.generate_detailed_message\n - src.tagi.composer.formats.generate_oneline_message\n - src.tagi.composer.formats.generate_simple_message\n src.tagi.composer.summary:\n - src.tagi.composer.summary.generate_summary\n src.tagi.config:\n - src.tagi.config.Config.get_heuristics_for_path\n - src.tagi.config.Config.get_tag_for_path\n - src.tagi.config.Config.should_ignore\n - src.tagi.config.load_config\n src.tagi.heuristics.metrics:\n - src.tagi.heuristics.metrics._calculate_complexity\n - src.tagi.heuristics.metrics._calculate_dependency_depth\n - src.tagi.heuristics.metrics._calculate_impact\n - src.tagi.heuristics.metrics._calculate_stability\n - src.tagi.heuristics.metrics._calculate_test_impact\n - src.tagi.heuristics.metrics._extension_complexity_weight\n - src.tagi.heuristics.metrics._extension_impact_weight\n - src.tagi.heuristics.metrics.calculate_metrics\n src.tagi.heuristics.rules:\n - src.tagi.heuristics.rules._get_config_attr\n - src.tagi.heuristics.rules.get_custom_heuristics\n - src.tagi.heuristics.rules.get_custom_rules\n src.tagi.heuristics.scoring:\n - src.tagi.heuristics.scoring._change_type_risk_weight\n - src.tagi.heuristics.scoring._lines_risk_weight\n - src.tagi.heuristics.scoring._tag_risk_weight\n - src.tagi.heuristics.scoring.calculate_risk_score\n src.tagi.heuristics.tags:\n - src.tagi.heuristics.tags._custom_config_tags\n - src.tagi.heuristics.tags._size_tags\n - src.tagi.heuristics.tags._tag_change\n - src.tagi.heuristics.tags.apply_path_tags\n - src.tagi.heuristics.tags.apply_tags\n src.tagi.hooks:\n - src.tagi.hooks._hooks_dir\n - src.tagi.hooks._pre_commit_hook\n - src.tagi.hooks.check_hooks_installed\n - src.tagi.hooks.install_hooks\n - src.tagi.hooks.list_hooks\n - src.tagi.hooks.run_hook\n - src.tagi.hooks.uninstall_hooks\n src.tagi.planner.grouper:\n - src.tagi.planner.grouper._get_primary_tag\n - src.tagi.planner.grouper.group_by_tag\n - src.tagi.planner.grouper.group_changes\n src.tagi.planner.selector:\n - src.tagi.planner.selector.select_changes_by_tag\n src.tagi.planner.sorter:\n - src.tagi.planner.sorter.group_by_complexity\n - src.tagi.planner.sorter.sort_by_complexity\n src.tagi.providers.utils.auth:\n - src.tagi.providers.utils.auth.get_auth_status_from_result\n - src.tagi.providers.utils.auth.is_authenticated_from_result\n src.tagi.providers.utils.pr:\n - src.tagi.providers.utils.pr.build_pr_command\n - src.tagi.providers.utils.pr.execute_pr_command\n src.tagi.utils.change_filter:\n - src.tagi.utils.change_filter._changes_matching_all\n - src.tagi.utils.change_filter._changes_matching_any\n - src.tagi.utils.change_filter._changes_matching_tag\n - src.tagi.utils.change_filter._normalize_tag\n - src.tagi.utils.change_filter._resolve_tag_enums\n - src.tagi.utils.change_filter.filter_changes_by_tag\n - src.tagi.utils.change_filter.filter_changes_by_tags_all\n - src.tagi.utils.change_filter.filter_changes_by_tags_any\n - src.tagi.utils.change_filter.resolve_filtered_changes\n src.tagi.utils.change_stats:\n - src.tagi.utils.change_stats.calculate_tag_statistics\n - src.tagi.utils.change_stats.display_statistics_table\n src.tagi.utils.logger:\n - src.tagi.utils.logger.setup_logger\n src.tagi.utils.paths:\n - src.tagi.utils.paths.path_endswith\n - src.tagi.utils.paths.path_key\n - src.tagi.utils.paths.path_matches\n src.tagi.utils.publish_helpers:\n - src.tagi.utils.publish_helpers.create_publish_group\n - src.tagi.utils.publish_helpers.detect_and_get_provider\n src.tagi.utils.risk:\n - src.tagi.utils.risk.average_risk\n - src.tagi.utils.risk.total_lines_changed\n src.tagi.utils.send_helpers:\n - src.tagi.utils.send_helpers.create_change_group\n src.tagi.utils.summary_helpers:\n - src.tagi.utils.summary_helpers.build_statistics_section\n tagi.cli.provider_commands:\n - tagi.cli.provider_commands._current_branch\n - tagi.cli.provider_commands._pr_spec\n - tagi.cli.provider_commands.create_mr\n - tagi.cli.provider_commands.create_pr\n - tagi.cli.provider_commands.detect_provider_command\n tagi.executor.git:\n - tagi.executor.git.GitExecutor._run_command\n tagi.planner.branch_grouper:\n - tagi.planner.branch_grouper.get_branch_info\n - tagi.planner.branch_grouper.group_by_branch\n tagi.providers.base:\n - tagi.providers.base.BaseProvider._run_command\n tagi.providers.github:\n - tagi.providers.github.GitHubProvider.create_pr\n - tagi.providers.github.GitHubProvider.get_auth_status\n - tagi.providers.github.GitHubProvider.is_authenticated\n tagi.providers.gitlab:\n - tagi.providers.gitlab.GitLabProvider.create_pr\n - tagi.providers.gitlab.GitLabProvider.get_auth_status\n - tagi.providers.gitlab.GitLabProvider.is_authenticated\n tagi.scanner.diff:\n - tagi.scanner.diff.get_diff\n - tagi.scanner.diff.get_staged_diff\n tagi.scanner.files:\n - tagi.scanner.files.count_lines_changed\n tagi.scanner.status:\n - tagi.scanner.status.parse_status\n - tagi.scanner.status.scan_repo\n tagi.utils.commands:\n - tagi.utils.commands.run_command\n tagi.utils.detect_provider:\n - tagi.utils.detect_provider.detect_git_provider\n - tagi.utils.detect_provider.get_provider\nentry_points:\n- src.tagi.analyzer.dependency_graph._LevelOrder.__init__\n- src.tagi.analyzer.dependency_graph._LevelOrder._drain_level\n- src.tagi.analyzer.dependency_graph._LevelOrder.levels\n- src.tagi.analyzer.dependency_graph.build_dependency_graph\n- src.tagi.analyzer.dependency_graph.detect_cycles\n- src.tagi.analyzer.dependency_graph.find_dependency_order\n- src.tagi.analyzer.dependency_graph.get_critical_path\n- src.tagi.analyzer.metrics.MetricsCollector.__init__\n- src.tagi.analyzer.metrics.MetricsCollector.collect\n- src.tagi.analyzer.metrics.MetricsCollector.save\n- src.tagi.analyzer.metrics.MetricsCollector.to_json\n- src.tagi.analyzer.metrics.compare_metrics\n- src.tagi.analyzer.metrics.generate_report\n- src.tagi.cli.core_commands.list_command\n- src.tagi.cli.core_commands.list_groups_command\n- src.tagi.cli.core_commands.scan_command\n- src.tagi.cli.core_commands.stats_command\n- src.tagi.cli.git_operations.auto_command\n- src.tagi.cli.inspection_commands.file_command\n- src.tagi.cli.inspection_commands.filter_command\n- src.tagi.cli.inspection_commands.inspect_command\n- src.tagi.cli.main._resolve_send_target\n- src.tagi.cli.main.detect_provider\n- src.tagi.cli.main.setup_logging\n- src.tagi.cli.publishing_commands.deploy_command\n- src.tagi.cli.publishing_commands.publish_command\n- src.tagi.cli.utility_commands.draft_command\n- src.tagi.cli.utility_commands.hooks_command\n- src.tagi.cli.utility_commands.init_command\n- src.tagi.cli.utility_commands.summary_command\n- src.tagi.composer._tags.all_tag_values\n- src.tagi.composer.formats.generate_conventional_message\n- src.tagi.composer.formats.generate_detailed_message\n- src.tagi.composer.formats.generate_files_message\n- src.tagi.composer.formats.generate_oneline_message\n- src.tagi.composer.formats.generate_simple_message\n- src.tagi.composer.summary.generate_file_list\n- src.tagi.composer.summary.generate_summary\n- src.tagi.config.Config.__init__\n- src.tagi.config.Config._apply_sections\n- src.tagi.config.Config._load_config\n- src.tagi.config.Config.get_custom_tags_for_pattern\n- src.tagi.config.Config.get_heuristics_for_path\n- src.tagi.config.Config.get_tag_color\n- src.tagi.config.Config.get_tag_description\n- src.tagi.config.Config.get_tag_for_path\n- src.tagi.config.Config.get_tags_for_path\n- src.tagi.config.Config.get_template\n- src.tagi.executor.publish.PublishExecutor.__init__\n- src.tagi.executor.publish.PublishExecutor.dry_run\n- src.tagi.executor.publish.PublishExecutor.publish\n- src.tagi.executor.publish.PublishExecutor.stage_and_commit\n- src.tagi.heuristics.metrics.calculate_vector_distance\n- src.tagi.heuristics.metrics.filter_by_metrics\n- src.tagi.heuristics.metrics.sort_by_metric\n- src.tagi.heuristics.rules.get_custom_heuristics\n- src.tagi.heuristics.rules.get_custom_rules\n- src.tagi.heuristics.tags.apply_tags\n- src.tagi.hooks.install_hooks\n- src.tagi.hooks.list_hooks\n- src.tagi.hooks.run_hook\n- src.tagi.hooks.uninstall_hooks\n- src.tagi.llm.llx_adapter.LlxAdapter.__init__\n- src.tagi.llm.llx_adapter.LlxAdapter.improve_description\n- src.tagi.llm.llx_adapter.LlxAdapter.improve_message\n- src.tagi.llm.llx_adapter.LlxAdapter.is_available\n- src.tagi.models.change.ChangeMetrics.to_vector\n- src.tagi.planner.grouper.group_by_risk\n- src.tagi.planner.grouper.group_by_tag\n- src.tagi.planner.grouper.group_changes\n- src.tagi.planner.preview.preview_changes\n- src.tagi.planner.preview.preview_plan\n- src.tagi.planner.selector.select_by_tags\n- src.tagi.planner.selector.select_low_risk_changes\n- src.tagi.planner.selector.select_safe_changes\n- src.tagi.planner.selector.select_small_changes\n- src.tagi.planner.sorter.group_by_complexity\n- src.tagi.planner.sorter.sort_by_tag_priority\n- src.tagi.providers.detector.detect_provider\n- src.tagi.providers.koru.KoruProvider.__init__\n- src.tagi.providers.koru.KoruProvider._deployment_recommendations\n- src.tagi.providers.koru.KoruProvider._make_api_request\n- src.tagi.providers.koru.KoruProvider.analyze_deployment_priority\n- src.tagi.providers.koru.KoruProvider.deploy_group\n- src.tagi.providers.koru.KoruProvider.get_context_brief\n- src.tagi.providers.koru.KoruProvider.get_planfile_tickets\n- src.tagi.providers.koru.KoruProvider.get_topology\n- src.tagi.providers.koru.KoruProvider.is_available\n- src.tagi.providers.koru.KoruProvider.run_quality_gates\n- src.tagi.ui.design_tokens.DesignTokens.__init__\n- src.tagi.ui.design_tokens.DesignTokens.get_css_string\n- src.tagi.ui.design_tokens.DesignTokens.get_css_variables\n- src.tagi.utils.change_filter.filter_changes_by_tag\n- src.tagi.utils.change_filter.filter_changes_by_tags_all\n- src.tagi.utils.line_builder.LineBuilder.__init__\n- src.tagi.utils.line_builder.LineBuilder.add\n- src.tagi.utils.line_builder.LineBuilder.as_list\n- src.tagi.utils.line_builder.LineBuilder.text\n- src.tagi.utils.publish_helpers.detect_and_get_provider\n- src.tagi.utils.summary_helpers.build_changes_by_type_section\n- src.tagi.utils.summary_helpers.build_file_list_section\n- src.tagi.utils.summary_helpers.build_report_header\n- src.tagi.utils.summary_helpers.build_statistics_section\n- src.tagi.utils.summary_helpers.build_tag_distribution_section\n- tagi.cli.provider_commands.create_mr\n- tagi.cli.provider_commands.create_pr\n- tagi.executor.git.GitExecutor.__init__\n- tagi.executor.git.GitExecutor._run_command\n- tagi.executor.git.GitExecutor.add\n- tagi.executor.git.GitExecutor.commit\n- tagi.executor.git.GitExecutor.get_current_branch\n- tagi.executor.git.GitExecutor.get_remote_url\n- tagi.executor.git.GitExecutor.has_staged_changes\n- tagi.executor.git.GitExecutor.push\n- tagi.executor.git.GitExecutor.status\n- tagi.planner.branch_grouper.get_branch_info\n- tagi.planner.branch_grouper.group_by_branch\n- tagi.providers.base.BaseProvider.__init__\n- tagi.providers.base.BaseProvider._check_git_remote_for_provider\n- tagi.providers.base.BaseProvider._get_git_remote_url\n- tagi.providers.base.BaseProvider._run_command\n- tagi.providers.base.BaseProvider.create_pr\n- tagi.providers.base.BaseProvider.detect_remote\n- tagi.providers.base.BaseProvider.get_auth_status\n- tagi.providers.base.BaseProvider.is_authenticated\n- tagi.providers.github.GitHubProvider.create_pr\n- tagi.providers.github.GitHubProvider.detect_remote\n- tagi.providers.github.GitHubProvider.get_auth_status\n- tagi.providers.github.GitHubProvider.get_token\n- tagi.providers.github.GitHubProvider.is_authenticated\n- tagi.providers.gitlab.GitLabProvider.create_pr\n- tagi.providers.gitlab.GitLabProvider.detect_remote\n- tagi.providers.gitlab.GitLabProvider.get_auth_status\n- tagi.providers.gitlab.GitLabProvider.get_configured_host\n- tagi.providers.gitlab.GitLabProvider.is_authenticated\n- tagi.scanner.diff.get_staged_diff\n- tagi.scanner.status.scan_repo\n", "is_subdir": false}, {"name": "duplication.toon.yaml", "rel_path": "duplication.toon.yaml", "path": "duplication.toon.yaml", "size": "5.9KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# redup/duplication | 10 groups | 47f 3609L | 2026-05-26\n\nSUMMARY:\n files_scanned: 47\n total_lines: 3609\n dup_groups: 10\n dup_fragments: 20\n saved_lines: 77\n scan_ms: 2213\n\nHOTSPOTS[7] (files with most duplication):\n src/tagi/utils/inspect_helpers.py dup=54L groups=2 frags=3 (1.5%)\n src/tagi/cli.py dup=39L groups=3 frags=5 (1.1%)\n src/tagi/providers/github.py dup=17L groups=4 frags=4 (0.5%)\n src/tagi/providers/gitlab.py dup=17L groups=4 frags=4 (0.5%)\n src/tagi/utils/publish_helpers.py dup=12L groups=1 frags=1 (0.3%)\n src/tagi/providers/detector.py dup=9L groups=1 frags=1 (0.2%)\n src/tagi/heuristics/rules.py dup=6L groups=1 frags=2 (0.2%)\n\nDUPLICATES[10] (ranked by impact):\n [69031414365d89a7] STRU filter_changes_by_tags_any L=21 N=2 saved=21 sim=1.00\n src/tagi/utils/inspect_helpers.py:23-43 (filter_changes_by_tags_any)\n src/tagi/utils/inspect_helpers.py:46-66 (filter_changes_by_tags_all)\n [34f34aac7a5602b7] STRU filter_changes_by_tag L=12 N=2 saved=12 sim=1.00\n src/tagi/utils/inspect_helpers.py:9-20 (filter_changes_by_tag)\n src/tagi/utils/publish_helpers.py:28-39 (filter_changes_by_tag)\n [59cf75b9ca253237] STRU create_pr L=10 N=2 saved=10 sim=1.00\n src/tagi/cli.py:772-781 (create_pr)\n src/tagi/cli.py:784-793 (create_mr)\n [0defbec6f6d556b3] EXAC detect_provider L=9 N=2 saved=9 sim=1.00\n src/tagi/cli.py:761-769 (detect_provider)\n src/tagi/providers/detector.py:7-15 (detect_provider)\n [2f1566a469905cc9] STRU create_pr L=6 N=2 saved=6 sim=1.00\n src/tagi/providers/github.py:30-35 (create_pr)\n src/tagi/providers/gitlab.py:36-41 (create_pr)\n [54c9428ffca26dbc] STRU list_groups L=5 N=2 saved=5 sim=1.00\n src/tagi/cli.py:117-121 (list_groups)\n src/tagi/cli.py:125-129 (list_cmd)\n [9aaebb2fb961d57d] STRU is_authenticated L=4 N=2 saved=4 sim=1.00\n src/tagi/providers/github.py:13-16 (is_authenticated)\n src/tagi/providers/gitlab.py:11-14 (is_authenticated)\n [180c7709efe6a452] STRU get_auth_status L=4 N=2 saved=4 sim=1.00\n src/tagi/providers/github.py:18-21 (get_auth_status)\n src/tagi/providers/gitlab.py:16-19 (get_auth_status)\n [9e51ade4e046160f] STRU get_custom_rules L=3 N=2 saved=3 sim=1.00\n src/tagi/heuristics/rules.py:14-16 (get_custom_rules)\n src/tagi/heuristics/rules.py:19-21 (get_custom_heuristics)\n [ead418deaec12c72] STRU detect_remote L=3 N=2 saved=3 sim=1.00\n src/tagi/providers/github.py:37-39 (detect_remote)\n src/tagi/providers/gitlab.py:43-45 (detect_remote)\n\nREFACTOR[10] (ranked by priority):\n [1] ○ extract_function → src/tagi/utils/utils/filter_changes_by_tags_any.py\n WHY: 2 occurrences of 21-line block across 1 files — saves 21 lines\n FILES: src/tagi/utils/inspect_helpers.py\n [2] ○ extract_function → src/tagi/utils/utils/filter_changes_by_tag.py\n WHY: 2 occurrences of 12-line block across 2 files — saves 12 lines\n FILES: src/tagi/utils/inspect_helpers.py, src/tagi/utils/publish_helpers.py\n [3] ○ extract_function → src/tagi/utils/create_pr.py\n WHY: 2 occurrences of 10-line block across 1 files — saves 10 lines\n FILES: src/tagi/cli.py\n [4] ○ extract_function → src/tagi/utils/detect_provider.py\n WHY: 2 occurrences of 9-line block across 2 files — saves 9 lines\n FILES: src/tagi/cli.py, src/tagi/providers/detector.py\n [5] ○ extract_function → src/tagi/providers/utils/create_pr.py\n WHY: 2 occurrences of 6-line block across 2 files — saves 6 lines\n FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py\n [6] ○ extract_function → src/tagi/utils/list_groups.py\n WHY: 2 occurrences of 5-line block across 1 files — saves 5 lines\n FILES: src/tagi/cli.py\n [7] ○ extract_function → src/tagi/providers/utils/is_authenticated.py\n WHY: 2 occurrences of 4-line block across 2 files — saves 4 lines\n FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py\n [8] ○ extract_function → src/tagi/providers/utils/get_auth_status.py\n WHY: 2 occurrences of 4-line block across 2 files — saves 4 lines\n FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py\n [9] ○ extract_function → src/tagi/heuristics/utils/get_custom_rules.py\n WHY: 2 occurrences of 3-line block across 1 files — saves 3 lines\n FILES: src/tagi/heuristics/rules.py\n [10] ○ extract_function → src/tagi/providers/utils/detect_remote.py\n WHY: 2 occurrences of 3-line block across 2 files — saves 3 lines\n FILES: src/tagi/providers/github.py, src/tagi/providers/gitlab.py\n\nQUICK_WINS[5] (low risk, high savings — do first):\n [1] extract_function saved=21L → src/tagi/utils/utils/filter_changes_by_tags_any.py\n FILES: inspect_helpers.py\n [2] extract_function saved=12L → src/tagi/utils/utils/filter_changes_by_tag.py\n FILES: inspect_helpers.py, publish_helpers.py\n [3] extract_function saved=10L → src/tagi/utils/create_pr.py\n FILES: cli.py\n [4] extract_function saved=9L → src/tagi/utils/detect_provider.py\n FILES: cli.py, detector.py\n [5] extract_function saved=6L → src/tagi/providers/utils/create_pr.py\n FILES: github.py, gitlab.py\n\nEFFORT_ESTIMATE (total ≈ 2.6h):\n medium filter_changes_by_tags_any saved=21L ~42min\n easy filter_changes_by_tag saved=12L ~24min\n easy create_pr saved=10L ~20min\n easy detect_provider saved=9L ~18min\n easy create_pr saved=6L ~12min\n easy list_groups saved=5L ~10min\n easy is_authenticated saved=4L ~8min\n easy get_auth_status saved=4L ~8min\n easy get_custom_rules saved=3L ~6min\n easy detect_remote saved=3L ~6min\n\nMETRICS-TARGET:\n dup_groups: 10 → 0\n saved_lines: 77 lines recoverable\n", "is_subdir": false}, {"name": "evolution.toon.yaml", "rel_path": "evolution.toon.yaml", "path": "evolution.toon.yaml", "size": "1.5KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# code2llm/evolution | 229 func | 53f | 2026-09-19\n# generated in 0.00s\n\nNEXT[1] (ranked by impact):\n [1] !! SPLIT goal.yaml\n WHY: 539L, 0 classes, max CC=0\n EFFORT: ~4h IMPACT: 0\n\n\nRISKS[1]:\n ⚠ Splitting goal.yaml may break 0 import paths\n\nMETRICS-TARGET:\n CC̄: 2.8 → ≤2.0\n max-CC: 11 → ≤5\n god-modules: 1 → 0\n high-CC(≥15): 0 → ≤0\n hub-types: 0 → ≤0\n\nPATTERNS (language parser shared logic):\n _extract_declarations() in base.py — unified extraction for:\n - TypeScript: interfaces, types, classes, functions, arrow funcs\n - PHP: namespaces, traits, classes, functions, includes\n - Ruby: modules, classes, methods, requires\n - C++: classes, structs, functions, #includes\n - C#: classes, interfaces, methods, usings\n - Java: classes, interfaces, methods, imports\n - Go: packages, functions, structs\n - Rust: modules, functions, traits, use statements\n\n Shared regex patterns per language:\n - import: language-specific import/require/using patterns\n - class: class/struct/trait declarations with inheritance\n - function: function/method signatures with visibility\n - brace_tracking: for C-family languages ({ })\n - end_keyword_tracking: for Ruby (module/class/def...end)\n\n Benefits:\n - Consistent extraction logic across all languages\n - Reduced code duplication (~70% reduction in parser LOC)\n - Easier maintenance: fix once, apply everywhere\n - Standardized FunctionInfo/ClassInfo models\n\nHISTORY:\n prev CC̄=2.8 → now CC̄=2.8\n", "is_subdir": false}, {"name": "map.toon.yaml", "rel_path": "map.toon.yaml", "path": "map.toon.yaml", "size": "17.2KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# tagi | 77f 5590L | yaml:5,txt:2,toml:1,shell:1,python:68 | 2026-09-19\n# generated in 0.01s\n# stats: 229 func | 0 cls | 77 mod | CC̄=2.8 | critical:0 | cycles:0\n# alerts[5]: fan-out scan_repo=15; fan-out publish_command=14; fan-out send_command=13; fan-out setup_logger=13; fan-out summary_command=13\n# hotspots[5]: scan_repo fan=15; publish_command fan=14; send_command fan=13; summary_command fan=13; setup_logger fan=13\n# evolution: CC̄ 2.8→2.8 (flat 0.0)\n# Keys: M=modules, D=details, i=imports, e=exports, c=classes, f=functions, m=methods\nM[77]:\n goal.yaml,539\n koru.yaml,133\n local.dev.txt,11\n project.sh,48\n pyproject.toml,49\n regix.yaml,93\n src/tagi/__init__.py,47\n src/tagi/__main__.py,6\n src/tagi/analyzer/dependency_graph.py,276\n src/tagi/analyzer/metrics.py,153\n src/tagi/cli/__init__.py,32\n src/tagi/cli/core_commands.py,94\n src/tagi/cli/display_utils.py,79\n src/tagi/cli/git_operations.py,170\n src/tagi/cli/inspection_commands.py,120\n src/tagi/cli/main.py,113\n src/tagi/cli/publishing_commands.py,139\n src/tagi/cli/scan_utils.py,25\n src/tagi/cli/utility_commands.py,211\n src/tagi/composer/__init__.py,12\n src/tagi/composer/_tags.py,52\n src/tagi/composer/_templates.py,21\n src/tagi/composer/commit_message.py,64\n src/tagi/composer/formats.py,141\n src/tagi/composer/summary.py,39\n src/tagi/config.py,118\n src/tagi/executor/__init__.py,9\n src/tagi/executor/publish.py,39\n src/tagi/heuristics/__init__.py,13\n src/tagi/heuristics/metrics.py,223\n src/tagi/heuristics/rules.py,20\n src/tagi/heuristics/scoring.py,41\n src/tagi/heuristics/tags.py,88\n src/tagi/hooks.py,127\n src/tagi/llm/__init__.py,7\n src/tagi/llm/llx_adapter.py,55\n src/tagi/models/__init__.py,14\n src/tagi/models/change.py,60\n src/tagi/models/group.py,16\n src/tagi/models/plan.py,23\n src/tagi/planner/__init__.py,18\n src/tagi/planner/grouper.py,74\n src/tagi/planner/preview.py,43\n src/tagi/planner/selector.py,44\n src/tagi/planner/sorter.py,104\n src/tagi/providers/__init__.py,11\n src/tagi/providers/detector.py,15\n src/tagi/providers/koru.py,171\n src/tagi/providers/utils/__init__.py,1\n src/tagi/providers/utils/auth.py,32\n src/tagi/providers/utils/pr.py,46\n src/tagi/scanner/__init__.py,13\n src/tagi/ui/design_tokens.py,221\n src/tagi/utils/change_filter.py,120\n src/tagi/utils/change_stats.py,42\n src/tagi/utils/inspect_helpers.py,25\n src/tagi/utils/line_builder.py,23\n src/tagi/utils/logger.py,71\n src/tagi/utils/paths.py,24\n src/tagi/utils/publish_helpers.py,40\n src/tagi/utils/risk.py,33\n src/tagi/utils/send_helpers.py,34\n src/tagi/utils/summary_helpers.py,113\n src/tagi/cli/provider_commands.py,78\n src/tagi/executor/git.py,67\n src/tagi/planner/branch_grouper.py,81\n src/tagi/providers/base.py,66\n src/tagi/providers/github.py,36\n src/tagi/providers/gitlab.py,45\n src/tagi/scanner/diff.py,13\n src/tagi/scanner/files.py,25\n src/tagi/scanner/status.py,60\n src/tagi/utils/commands.py,20\n src/tagi/utils/detect_provider.py,52\n testql-scenarios/generated-cli-tests.testql.toon.yaml,20\n tree.txt,89\n wup.yaml,100\nD:\n src/tagi/cli/publishing_commands.py:\n e: _ensure_tag_prefix,publish_command,deploy_command\n _ensure_tag_prefix(tag)\n publish_command(tag;repo_path;dry_run;template;verbose)\n deploy_command(tag;repo_path;environment;dry_run;verbose)\n src/tagi/analyzer/metrics.py:\n e: MetricsCollector,generate_report,compare_metrics\n MetricsCollector: __init__(0),collect(1),to_json(0),save(1) # Collect and analyze metrics about changes...\n generate_report(metrics)\n compare_metrics(metrics1;metrics2)\n src/tagi/cli/utility_commands.py:\n e: _ensure_tag_prefix,summary_command,init_command,hooks_command,draft_command\n _ensure_tag_prefix(tag)\n summary_command(repo_path;output)\n init_command(repo_path;force)\n hooks_command(repo_path;install;uninstall;list_hooks)\n draft_command(tag;repo_path;template)\n src/tagi/planner/branch_grouper.py:\n e: group_by_branch,get_branch_info\n group_by_branch(changes;repo_path)\n get_branch_info(repo_path)\n src/tagi/planner/selector.py:\n e: select_changes_by_tag,select_low_risk_changes,select_small_changes,select_by_tags,select_safe_changes\n select_changes_by_tag(changes;tag)\n select_low_risk_changes(changes;threshold)\n select_small_changes(changes;max_lines)\n select_by_tags(changes;tags;require_all)\n select_safe_changes(changes)\n src/tagi/providers/koru.py:\n e: KoruDeploymentPlan,KoruProvider\n KoruDeploymentPlan: # Deployment plan from Koru API...\n KoruProvider: __init__(3),_make_api_request(3),get_topology(0),get_planfile_tickets(0),run_quality_gates(0),get_context_brief(0),_deployment_recommendations(4),analyze_deployment_priority(1),deploy_group(3),is_available(0) # Integration with Koru API for deployment analysis...\n src/tagi/composer/summary.py:\n e: generate_summary,generate_file_list\n generate_summary(changes)\n generate_file_list(changes;max_files)\n src/tagi/analyzer/dependency_graph.py:\n e: _LevelOrder,_collect_import_names,analyze_python_imports,build_dependency_graph,find_dependency_order,_mark,_cycle_from,_dfs_visit,detect_cycles,_longest_path_length,_find_longest_start,_next_critical_node,_reconstruct_critical_path,get_critical_path\n _LevelOrder: __init__(1),levels(0),_drain_level(0) # Level-by-level topological order over a dependency graph (Ka...\n _collect_import_names(tree)\n analyze_python_imports(file_path;repo_path)\n build_dependency_graph(changes;repo_path)\n find_dependency_order(graph)\n _mark(node;color;value)\n _cycle_from(node;path)\n _dfs_visit(node;graph;color;path;cycles)\n detect_cycles(graph)\n _longest_path_length(node;graph;memo)\n _find_longest_start(graph;memo)\n _next_critical_node(node;graph;memo;visited)\n _reconstruct_critical_path(start_node;graph;memo)\n get_critical_path(graph)\n src/tagi/planner/preview.py:\n e: preview_plan,preview_changes\n preview_plan(changes;tag)\n preview_changes(group)\n src/tagi/cli/git_operations.py:\n e: _ensure_tag_prefix,_is_known_tag,_resolve_send_target,_filter_by_tag,_execute_git_operations,send_command,auto_command\n _ensure_tag_prefix(tag)\n _is_known_tag(value)\n _resolve_send_target(target;repo_path)\n _filter_by_tag(changes;tag)\n _execute_git_operations(changes;commit_message;push;repo_path)\n send_command(target;repo_path;auto_order;dry_run;push;template;verbose)\n auto_command(repo_path;dry_run;push;template;verbose)\n src/tagi/cli/inspection_commands.py:\n e: inspect_command,filter_command,file_command\n inspect_command(tag;repo_path;diff)\n filter_command(tags;repo_path;mode;diff)\n file_command(file_path;repo_path;diff)\n src/tagi/cli/core_commands.py:\n e: scan_command,list_groups_command,list_command,_do_list_groups,stats_command\n scan_command(repo_path;grouped)\n list_groups_command(repo_path)\n list_command(repo_path)\n _do_list_groups(repo_path)\n stats_command(repo_path;verbose)\n src/tagi/scanner/files.py:\n e: count_lines_changed\n count_lines_changed(file_path;repo_path)\n src/tagi/scanner/status.py:\n e: scan_repo,parse_status\n scan_repo(repo_path)\n parse_status(status)\n src/tagi/composer/_tags.py:\n e: all_tags,all_tag_values,summary_tag,infer_scope\n all_tags(changes)\n all_tag_values(changes)\n summary_tag(changes)\n infer_scope(changes)\n src/tagi/hooks.py:\n e: _hooks_dir,_pre_commit_hook,install_hooks,uninstall_hooks,check_hooks_installed,list_hooks,run_hook\n _hooks_dir(repo_path)\n _pre_commit_hook(repo_path)\n install_hooks(repo_path)\n uninstall_hooks(repo_path)\n check_hooks_installed(repo_path)\n list_hooks(repo_path)\n run_hook(hook_name;repo_path)\n src/tagi/planner/sorter.py:\n e: sort_by_complexity,sort_by_tag_priority,group_by_complexity\n sort_by_complexity(changes)\n sort_by_tag_priority(changes;tag_order)\n group_by_complexity(changes;num_groups)\n src/tagi/planner/grouper.py:\n e: group_changes,group_by_tag,group_by_risk,_get_primary_tag\n group_changes(changes)\n group_by_tag(changes;tag)\n group_by_risk(changes;threshold)\n _get_primary_tag(tags)\n src/tagi/cli/display_utils.py:\n e: _display_changes,_format_tags,_display_groups,_display_changes_grouped\n _display_changes(changes)\n _format_tags(tags;config)\n _display_groups(groups)\n _display_changes_grouped(changes)\n src/tagi/cli/main.py:\n e: setup_logging,_configure_command_logging,_ensure_tag_prefix,_is_known_tag,_resolve_send_target,detect_provider\n setup_logging(verbose)\n _configure_command_logging(verbose)\n _ensure_tag_prefix(tag)\n _is_known_tag(value)\n _resolve_send_target(target;repo_path)\n detect_provider(repo_path)\n src/tagi/providers/utils/pr.py:\n e: build_pr_command,execute_pr_command\n build_pr_command(tool;pr_type;spec)\n execute_pr_command(result)\n src/tagi/heuristics/metrics.py:\n e: _extension_complexity_weight,_extension_impact_weight,calculate_metrics,_calculate_complexity,_calculate_impact,_calculate_stability,_calculate_test_impact,_calculate_dependency_depth,filter_by_metrics,sort_by_metric,calculate_vector_distance\n _extension_complexity_weight(path)\n _extension_impact_weight(path)\n calculate_metrics(change;repo_path)\n _calculate_complexity(change)\n _calculate_impact(change)\n _calculate_stability(change)\n _calculate_test_impact(change)\n _calculate_dependency_depth(change)\n filter_by_metrics(changes;min_risk;max_risk;min_complexity;max_complexity;min_impact;max_impact)\n sort_by_metric(changes;metric;ascending)\n calculate_vector_distance(change1;change2)\n src/tagi/composer/formats.py:\n e: _commit_type,_describe_changes,generate_conventional_message,_count_tags,_detailed_file_lines,generate_detailed_message,generate_simple_message,generate_oneline_message,generate_files_message\n _commit_type(tags)\n _describe_changes(changes)\n generate_conventional_message(changes)\n _count_tags(changes)\n _detailed_file_lines(changes)\n generate_detailed_message(changes)\n generate_simple_message(changes)\n generate_oneline_message(changes)\n generate_files_message(changes)\n src/tagi/composer/commit_message.py:\n e: generate_commit_message,_improve_with_llm\n generate_commit_message(changes;template;repo_path;use_llm)\n _improve_with_llm(message;repo_path;files_str)\n src/tagi/utils/summary_helpers.py:\n e: build_report_header,build_statistics_section,build_changes_by_type_section,build_tag_distribution_section,build_file_list_section\n build_report_header(repo_path;changes)\n build_statistics_section(changes)\n build_changes_by_type_section(changes)\n build_tag_distribution_section(changes;config)\n build_file_list_section(changes)\n src/tagi/utils/detect_provider.py:\n e: get_provider,detect_git_provider\n get_provider(repo_path)\n detect_git_provider(repo_path)\n src/tagi/utils/change_filter.py:\n e: _normalize_tag,_changes_matching_tag,_resolve_tag_enums,_changes_matching_any,_changes_matching_all,resolve_filtered_changes,filter_changes_by_tag,filter_changes_by_tags_any,filter_changes_by_tags_all\n _normalize_tag(value)\n _changes_matching_tag(changes;tag_enum)\n _resolve_tag_enums(tags)\n _changes_matching_any(changes;tag_enums)\n _changes_matching_all(changes;tag_enums)\n resolve_filtered_changes(changes;tags;mode)\n filter_changes_by_tag(changes;tag)\n filter_changes_by_tags_any(changes;tags)\n filter_changes_by_tags_all(changes;tags)\n src/tagi/config.py:\n e: Config,load_config\n Config: __init__(1),_load_config(0),_apply_sections(1),get_tag_for_path(1),get_custom_tags_for_pattern(1),get_tag_color(1),get_heuristics_for_path(1),get_tags_for_path(1),get_tag_description(1),get_template(1),should_ignore(1) # Configuration loaded from tagi.toml...\n load_config(repo_path)\n src/tagi/cli/provider_commands.py:\n e: detect_provider_command,_current_branch,_pr_spec,create_pr,create_mr\n detect_provider_command(repo_path)\n _current_branch(repo_path)\n _pr_spec(spec;repo_path)\n create_pr(spec;repo_path)\n create_mr(spec;repo_path)\n src/tagi/providers/gitlab.py:\n e: GitLabProvider\n GitLabProvider(BaseProvider): is_authenticated(0),get_auth_status(0),get_configured_host(0),create_pr(1),detect_remote(0) # GitLab provider using glab CLI...\n src/tagi/heuristics/tags.py:\n e: apply_tags,_tag_change,_custom_config_tags,_size_tags,apply_path_tags\n apply_tags(changes;repo_path)\n _tag_change(change;repo_path;custom_tags_for)\n _custom_config_tags(custom_tags_for;path)\n _size_tags(lines_changed;has_other_tags)\n apply_path_tags(change;lines_changed)\n src/tagi/llm/llx_adapter.py:\n e: LlxAdapter\n LlxAdapter: __init__(2),is_available(0),improve_message(2),improve_description(2) # Adapter for LLX library for optional LLM integration...\n src/tagi/executor/git.py:\n e: GitExecutor\n GitExecutor: __init__(1),_run_command(1),add(1),commit(2),push(3),status(0),get_current_branch(0),get_remote_url(1),has_staged_changes(0) # Executor for git commands...\n src/tagi/utils/logger.py:\n e: setup_logger,get_logger\n setup_logger(name;level;log_file;verbose)\n get_logger(name)\n src/tagi/cli/scan_utils.py:\n e: scan_and_tag\n scan_and_tag(repo_path)\n src/tagi/providers/detector.py:\n e: detect_provider\n detect_provider(repo_path)\n src/tagi/heuristics/scoring.py:\n e: calculate_risk_score,_lines_risk_weight,_tag_risk_weight,_change_type_risk_weight\n calculate_risk_score(change;tags)\n _lines_risk_weight(lines_changed)\n _tag_risk_weight(tags)\n _change_type_risk_weight(change_type)\n src/tagi/executor/publish.py:\n e: PublishExecutor\n PublishExecutor: __init__(1),stage_and_commit(3),publish(6),dry_run(2) # Executor for publishing changes...\n src/tagi/utils/risk.py:\n e: total_lines_changed,average_risk\n total_lines_changed(changes)\n average_risk(changes)\n src/tagi/providers/base.py:\n e: PrSpec,BaseProvider\n PrSpec: # Pull/merge request parameters...\n BaseProvider(ABC): __init__(1),is_authenticated(0),get_auth_status(0),create_pr(1),detect_remote(0),_run_command(1),_get_git_remote_url(0),_check_git_remote_for_provider(1) # Base class for Git hosting providers...\n src/tagi/providers/github.py:\n e: GitHubProvider\n GitHubProvider(BaseProvider): is_authenticated(0),get_auth_status(0),get_token(0),create_pr(1),detect_remote(0) # GitHub provider using gh CLI...\n src/tagi/providers/utils/auth.py:\n e: get_auth_status_from_result,is_authenticated_from_result\n get_auth_status_from_result(result)\n is_authenticated_from_result(result)\n src/tagi/composer/_templates.py:\n e: render_template\n render_template(template)\n src/tagi/utils/send_helpers.py:\n e: create_change_group\n create_change_group(changes;tag)\n src/tagi/ui/design_tokens.py:\n e: ColorTokens,SpacingTokens,TypographyTokens,BorderRadiusTokens,ShadowTokens,LayoutTokens,DesignTokens\n ColorTokens: # Color design tokens...\n SpacingTokens: # Spacing design tokens...\n TypographyTokens: # Typography design tokens...\n BorderRadiusTokens: # Border radius design tokens...\n ShadowTokens: # Shadow design tokens...\n LayoutTokens: # Layout design tokens...\n DesignTokens: __init__(0),get_css_variables(1),get_css_string(1) # Main design tokens container...\n src/tagi/models/change.py:\n e: ChangeType,Tag,ChangeMetrics,Change\n ChangeType(str,Enum): # Type of git change...\n Tag(str,Enum): # Hashtag categories for changes...\n ChangeMetrics: to_vector(0) # Numerical metrics for change analysis...\n Change: # Represents a single file change...\n src/tagi/scanner/diff.py:\n e: get_diff,get_staged_diff\n get_diff(file_path;repo_path)\n get_staged_diff(file_path;repo_path)\n src/tagi/heuristics/rules.py:\n e: _get_config_attr,get_custom_rules,get_custom_heuristics\n _get_config_attr(repo_path;attr_name)\n get_custom_rules(repo_path)\n get_custom_heuristics(repo_path)\n src/tagi/utils/publish_helpers.py:\n e: detect_and_get_provider,create_publish_group\n detect_and_get_provider(repo_path)\n create_publish_group(changes;tag)\n src/tagi/utils/commands.py:\n e: run_command\n run_command(cmd;cwd)\n src/tagi/utils/change_stats.py:\n e: calculate_tag_statistics,display_statistics_table\n calculate_tag_statistics(changes)\n display_statistics_table(changes;console)\n src/tagi/utils/paths.py:\n e: path_key,path_matches,path_endswith\n path_key(path)\n path_matches(path;pattern)\n path_endswith(path;suffixes)\n src/tagi/utils/line_builder.py:\n e: LineBuilder\n LineBuilder: __init__(1),add(0),as_list(0),text(0) # Single place where report line lists are created and mutated...\n goal.yaml:\n regix.yaml:\n local.dev.txt:\n koru.yaml:\n wup.yaml:\n pyproject.toml:\n tree.txt:\n project.sh:\n src/tagi/__init__.py:\n src/tagi/__main__.py:\n src/tagi/planner/__init__.py:\n src/tagi/models/plan.py:\n e: PlanStep,Plan\n PlanStep: # A single step in an execution plan...\n Plan: # An execution plan for shipping changes...\n src/tagi/models/__init__.py:\n src/tagi/models/group.py:\n e: ChangeGroup\n ChangeGroup: # Group of related changes...\n src/tagi/cli/__init__.py:\n src/tagi/providers/__init__.py:\n src/tagi/providers/utils/__init__.py:\n src/tagi/scanner/__init__.py:\n src/tagi/heuristics/__init__.py:\n src/tagi/llm/__init__.py:\n src/tagi/composer/__init__.py:\n src/tagi/executor/__init__.py:\n src/tagi/utils/inspect_helpers.py:\n testql-scenarios/generated-cli-tests.testql.toon.yaml:\n", "is_subdir": false}, {"name": "planfile-tickets.yaml", "rel_path": "planfile-tickets.yaml", "path": "planfile-tickets.yaml", "size": "6.0KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "source: code2llm\n# generated in 0.01s\nschema: code2llm.planfile_tickets.v1\nproject_root: /home/tom/github/semcod/tagi\ntickets:\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: _tag_change'\n description: 'code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:23`.\n\n\n Function ''_tag_change'' is oversized: CC=2, fan-out=9, mutations=9.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/heuristics/tags.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/heuristics/tags.py:23:God Function:\n _tag_change'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: group_by_branch'\n description: 'code2llm reports `God Function: group_by_branch` in `src/tagi/planner/branch_grouper.py:7`.\n\n\n Function ''group_by_branch'' is oversized: CC=8, fan-out=9, mutations=12.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/planner/branch_grouper.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/planner/branch_grouper.py:7:God\n Function: group_by_branch'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: group_changes'\n description: 'code2llm reports `God Function: group_changes` in `src/tagi/planner/grouper.py:10`.\n\n\n Function ''group_changes'' is oversized: CC=4, fan-out=9, mutations=7.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/planner/grouper.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/planner/grouper.py:10:God Function:\n group_changes'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: hooks_command'\n description: 'code2llm reports `God Function: hooks_command` in `src/tagi/cli/utility_commands.py:131`.\n\n\n Function ''hooks_command'' is oversized: CC=10, fan-out=11, mutations=4.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/utility_commands.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/utility_commands.py:131:God\n Function: hooks_command'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: inspect_command'\n description: 'code2llm reports `God Function: inspect_command` in `src/tagi/cli/inspection_commands.py:19`.\n\n\n Function ''inspect_command'' is oversized: CC=7, fan-out=11, mutations=4.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/inspection_commands.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/inspection_commands.py:19:God\n Function: inspect_command'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: publish_command'\n description: 'code2llm reports `God Function: publish_command` in `src/tagi/cli/publishing_commands.py:23`.\n\n\n Function ''publish_command'' is oversized: CC=11, fan-out=14, mutations=8.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/publishing_commands.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/publishing_commands.py:23:God\n Function: publish_command'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: scan_repo'\n description: 'code2llm reports `God Function: scan_repo` in `src/tagi/scanner/status.py:11`.\n\n\n Function ''scan_repo'' is oversized: CC=7, fan-out=15, mutations=8.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/scanner/status.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/scanner/status.py:11:God Function:\n scan_repo'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: send_command'\n description: 'code2llm reports `God Function: send_command` in `src/tagi/cli/git_operations.py:90`.\n\n\n Function ''send_command'' is oversized: CC=7, fan-out=13, mutations=9.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/git_operations.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/git_operations.py:90:God Function:\n send_command'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: setup_logger'\n description: 'code2llm reports `God Function: setup_logger` in `src/tagi/utils/logger.py:9`.\n\n\n Function ''setup_logger'' is oversized: CC=4, fan-out=13, mutations=14.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/utils/logger.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/utils/logger.py:9:God Function:\n setup_logger'\n- signal: code2llm_smell_god_function\n title: 'Address code smell: God Function: summary_command'\n description: 'code2llm reports `God Function: summary_command` in `src/tagi/cli/utility_commands.py:25`.\n\n\n Function ''summary_command'' is oversized: CC=7, fan-out=13, mutations=17.\n\n\n Make the smallest refactor that removes the smell and run local tests.'\n priority: normal\n labels:\n - llm-ready\n - code2llm\n - code-smell\n - god-function\n files:\n - src/tagi/cli/utility_commands.py\n dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/utility_commands.py:25:God\n Function: summary_command'\napplied: []\nskipped: []\n", "is_subdir": false}, {"name": "project.toon.yaml", "rel_path": "project.toon.yaml", "path": "project.toon.yaml", "size": "2.5KB", "icon": "⚙️", "type": "yaml", "type_name": "YAML", "content": "# tagi | 229 func | 53f | 5590L | python | 2026-09-19\n# generated in 0.00s\n\nHEALTH:\n CC̄=2.8 critical=3 (limit:10) dup=0 cycles=2\n\nALERTS[10]:\n !! high_fan_out scan_repo = 15 (limit:10)\n ! high_fan_out publish_command = 14 (limit:10)\n ! high_fan_out send_command = 13 (limit:10)\n ! high_fan_out summary_command = 13 (limit:10)\n ! high_fan_out setup_logger = 13 (limit:10)\n ! high_fan_out inspect_command = 11 (limit:10)\n ! high_fan_out hooks_command = 11 (limit:10)\n ! high_fan_out filter_command = 10 (limit:10)\n ! high_fan_out draft_command = 10 (limit:10)\n ! high_fan_out KoruProvider.analyze_deployment_priority = 10 (limit:10)\n\nMODULES[77] (top by size):\n M[goal.yaml] 539L C:0 F:0 CC↑0 D:0 (yaml)\n M[src/tagi/analyzer/dependency_graph.py] 276L C:1 F:16 CC↑7 D:0 (python)\n M[src/tagi/heuristics/metrics.py] 223L C:0 F:11 CC↑5 D:1 (python)\n M[src/tagi/ui/design_tokens.py] 221L C:7 F:3 CC↑2 D:0 (python)\n M[src/tagi/cli/utility_commands.py] 211L C:0 F:5 CC↑10 D:0 (python)\n M[src/tagi/providers/koru.py] 171L C:2 F:10 CC↑8 D:0 (python)\n M[src/tagi/cli/git_operations.py] 170L C:0 F:7 CC↑7 D:0 (python)\n M[src/tagi/analyzer/metrics.py] 153L C:1 F:6 CC↑10 D:0 (python)\n M[src/tagi/composer/formats.py] 141L C:0 F:9 CC↑5 D:0 (python)\n M[src/tagi/cli/publishing_commands.py] 139L C:0 F:3 CC↑11 D:0 (python)\n M[koru.yaml] 133L C:0 F:0 CC↑0 D:0 (yaml)\n M[src/tagi/hooks.py] 127L C:0 F:7 CC↑5 D:1 (python)\n M[src/tagi/cli/inspection_commands.py] 120L C:0 F:3 CC↑7 D:0 (python)\n M[src/tagi/utils/change_filter.py] 120L C:0 F:9 CC↑5 D:5 (python)\n M[src/tagi/config.py] 118L C:1 F:12 CC↑4 D:5 (python)\n LANGS: python:68/yaml:5/txt:2/shell:1/toml:1\n\nHOTSPOTS[10]:\n ★ scan_repo fan=15 // Scan repository for uncommitted changes using git status --porcelain.\n ★ publish_command fan=14 // Create a PR or MR for the changes.\n ★ send_command fan=13 // Stage, commit, and optionally push changes.\n ★ summary_command fan=13 // Generate a comprehensive summary report of all changes.\n ★ setup_logger fan=13 // Setup and configure logger for tagi.\n\nArgs:\n name: Logger name\n level: Log\n\nREFACTOR[4]:\n [1] H/H Split god module goal.yaml (539L, 0 classes)\n [2] M/L Break circular dependency: src.tagi.analyzer.dependency_graph._dfs_visit\n [3] M/L Break circular dependency: src.tagi.analyzer.dependency_graph._longest_path_length\n [4] M/M Reduce scan_repo fan-out (currently 15)\n\nEVOLUTION:\n 2026-09-19 CC̄=2.8 crit=3 5590L // Automated analysis\n", "is_subdir": false}, {"name": "intent.json", "rel_path": "ticket-004/intent.json", "path": "ticket-004 / intent.json", "size": "462B", "icon": "📋", "type": "json", "type_name": "JSON", "content": "{\n "ticket": "ticket-004",\n "summary": "Remove pfix auto-repair configuration and dependency declarations",\n "allowedPaths": [\n "pyproject.toml",\n "uv.lock",\n "project/ticket-004/**"\n ],\n "forbiddenPaths": [\n ".env",\n "src/**",\n "tests/**",\n ".github/workflows/**"\n ],\n "authorization": "SESSION_EXECUTION_AUTHORIZATION",\n "outcome": "pfix is no longer configured, installed or locked by this project; no runtime behavior change."\n}\n", "is_subdir": true}, {"name": "intent.json", "rel_path": "ticket-003/intent.json", "path": "ticket-003 / intent.json", "size": "499B", "icon": "📋", "type": "json", "type_name": "JSON", "content": "{\n "ticket": "ticket-003",\n "summary": "Adopt immutable local CI publication instructions",\n "allowedPaths": [\n "AGENTS.md",\n ".gitignore",\n "project/ticket-003/**"\n ],\n "forbiddenPaths": [\n ".env",\n "config/**",\n ".github/workflows/**"\n ],\n "authorization": "SESSION_EXECUTION_AUTHORIZATION",\n "standard_revision": "d5f77d83b3752477cfb95a535d0e1ce77f148576",\n "outcome": "Publication-policy-only adoption with protected review; no executor or required-check mutation."\n}\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-004/README.md", "path": "ticket-004 / README.md", "size": "853B", "icon": "📝", "type": "markdown", "type_name": "Markdown", "content": "# ticket-004: Remove pfix auto-repair from the project\n\n- **Status**: IN_PROGRESS\n- **Workflow state**: EDIT\n\nSESSION_EXECUTION_AUTHORIZATION: on 2026-09-13 the user requested that pfix be\nremoved from Semcod projects or deactivated, because its automatic repairs\noverwrite development changes.\n\nAC-01: No tracked `pyproject.toml` declares a `[tool.pfix]` table or a `pfix`\nrequirement (runtime, optional, group or tool environment).\nAC-02: The parsed TOML differs from the base only by the removed pfix entries.\nAC-03: A tracked `uv.lock` is regenerated so it no longer records a direct pfix\nrequirement of this project.\nAC-04: Source code, tests and generated documentation projections are unchanged.\n\nCanonical fleet evidence:\n`subactor/docs/architecture/analysis/semcod-library-quality.md`.\nThis ticket does not establish full new-project adoption.\n", "is_subdir": true}, {"name": "README.md", "rel_path": "ticket-003/README.md", "path": "ticket-003 / README.md", "size": "548B", "icon": "📝", "type": "markdown", "type_name": "Markdown", "content": "# ticket-003: Local CI publication policy\n\n- **Status**: IN_PROGRESS\n- **Workflow state**: EDIT\n\nSESSION_EXECUTION_AUTHORIZATION: user requested implementation and publication across Semcod and Subactor.\n\nAC-01: Pin published policy while preserving custom requirements.\nAC-02: Validate bounded diff and publish through independent protected review.\n\nAllocation: https://github.com/semcod/tagi/issues/3. Canonical fleet evidence: `subactor/docs/architecture/analysis/local-ci-adoption.md`. This ticket does not establish full new-project adoption.\n", "is_subdir": true}]; let currentFile = null; function renderFileList(filter = '') { diff --git a/project/map.toon.yaml b/project/map.toon.yaml index 069be11..7b2b3a6 100644 --- a/project/map.toon.yaml +++ b/project/map.toon.yaml @@ -1,11 +1,11 @@ -# tagi | 75f 5609L | yaml:5,txt:2,toml:1,shell:1,python:66 | 2026-09-19 +# tagi | 77f 5590L | yaml:5,txt:2,toml:1,shell:1,python:68 | 2026-09-19 # generated in 0.01s -# stats: 225 func | 0 cls | 75 mod | CC̄=2.9 | critical:0 | cycles:0 +# stats: 229 func | 0 cls | 77 mod | CC̄=2.8 | critical:0 | cycles:0 # alerts[5]: fan-out scan_repo=15; fan-out publish_command=14; fan-out send_command=13; fan-out setup_logger=13; fan-out summary_command=13 # hotspots[5]: scan_repo fan=15; publish_command fan=14; send_command fan=13; summary_command fan=13; setup_logger fan=13 -# evolution: CC̄ 2.9→2.9 (flat 0.0) +# evolution: CC̄ 2.8→2.8 (flat 0.0) # Keys: M=modules, D=details, i=imports, e=exports, c=classes, f=functions, m=methods -M[75]: +M[77]: goal.yaml,539 koru.yaml,133 local.dev.txt,11 @@ -22,7 +22,6 @@ M[75]: src/tagi/cli/git_operations.py,170 src/tagi/cli/inspection_commands.py,120 src/tagi/cli/main.py,113 - src/tagi/cli/provider_commands.py,79 src/tagi/cli/publishing_commands.py,139 src/tagi/cli/scan_utils.py,25 src/tagi/cli/utility_commands.py,211 @@ -32,15 +31,14 @@ M[75]: src/tagi/composer/commit_message.py,64 src/tagi/composer/formats.py,141 src/tagi/composer/summary.py,39 - src/tagi/config.py,126 + src/tagi/config.py,118 src/tagi/executor/__init__.py,9 - src/tagi/executor/git.py,72 src/tagi/executor/publish.py,39 src/tagi/heuristics/__init__.py,13 - src/tagi/heuristics/metrics.py,228 + src/tagi/heuristics/metrics.py,223 src/tagi/heuristics/rules.py,20 src/tagi/heuristics/scoring.py,41 - src/tagi/heuristics/tags.py,89 + src/tagi/heuristics/tags.py,88 src/tagi/hooks.py,127 src/tagi/llm/__init__.py,7 src/tagi/llm/llx_adapter.py,55 @@ -49,35 +47,39 @@ M[75]: src/tagi/models/group.py,16 src/tagi/models/plan.py,23 src/tagi/planner/__init__.py,18 - src/tagi/planner/branch_grouper.py,88 src/tagi/planner/grouper.py,74 src/tagi/planner/preview.py,43 src/tagi/planner/selector.py,44 src/tagi/planner/sorter.py,104 src/tagi/providers/__init__.py,11 - src/tagi/providers/base.py,70 src/tagi/providers/detector.py,15 - src/tagi/providers/github.py,38 - src/tagi/providers/gitlab.py,47 src/tagi/providers/koru.py,171 src/tagi/providers/utils/__init__.py,1 src/tagi/providers/utils/auth.py,32 src/tagi/providers/utils/pr.py,46 src/tagi/scanner/__init__.py,13 - src/tagi/scanner/diff.py,29 - src/tagi/scanner/files.py,29 - src/tagi/scanner/status.py,66 src/tagi/ui/design_tokens.py,221 src/tagi/utils/change_filter.py,120 src/tagi/utils/change_stats.py,42 - src/tagi/utils/detect_provider.py,54 src/tagi/utils/inspect_helpers.py,25 src/tagi/utils/line_builder.py,23 src/tagi/utils/logger.py,71 + src/tagi/utils/paths.py,24 src/tagi/utils/publish_helpers.py,40 src/tagi/utils/risk.py,33 src/tagi/utils/send_helpers.py,34 src/tagi/utils/summary_helpers.py,113 + src/tagi/cli/provider_commands.py,78 + src/tagi/executor/git.py,67 + src/tagi/planner/branch_grouper.py,81 + src/tagi/providers/base.py,66 + src/tagi/providers/github.py,36 + src/tagi/providers/gitlab.py,45 + src/tagi/scanner/diff.py,13 + src/tagi/scanner/files.py,25 + src/tagi/scanner/status.py,60 + src/tagi/utils/commands.py,20 + src/tagi/utils/detect_provider.py,52 testql-scenarios/generated-cli-tests.testql.toon.yaml,20 tree.txt,89 wup.yaml,100 @@ -245,6 +247,10 @@ D: build_changes_by_type_section(changes) build_tag_distribution_section(changes;config) build_file_list_section(changes) + src/tagi/utils/detect_provider.py: + e: get_provider,detect_git_provider + get_provider(repo_path) + detect_git_provider(repo_path) src/tagi/utils/change_filter.py: e: _normalize_tag,_changes_matching_tag,_resolve_tag_enums,_changes_matching_any,_changes_matching_all,resolve_filtered_changes,filter_changes_by_tag,filter_changes_by_tags_any,filter_changes_by_tags_all _normalize_tag(value) @@ -283,10 +289,6 @@ D: src/tagi/executor/git.py: e: GitExecutor GitExecutor: __init__(1),_run_command(1),add(1),commit(2),push(3),status(0),get_current_branch(0),get_remote_url(1),has_staged_changes(0) # Executor for git commands... - src/tagi/utils/detect_provider.py: - e: get_provider,detect_git_provider - get_provider(repo_path) - detect_git_provider(repo_path) src/tagi/utils/logger.py: e: setup_logger,get_logger setup_logger(name;level;log_file;verbose) @@ -355,10 +357,18 @@ D: e: detect_and_get_provider,create_publish_group detect_and_get_provider(repo_path) create_publish_group(changes;tag) + src/tagi/utils/commands.py: + e: run_command + run_command(cmd;cwd) src/tagi/utils/change_stats.py: e: calculate_tag_statistics,display_statistics_table calculate_tag_statistics(changes) display_statistics_table(changes;console) + src/tagi/utils/paths.py: + e: path_key,path_matches,path_endswith + path_key(path) + path_matches(path;pattern) + path_endswith(path;suffixes) src/tagi/utils/line_builder.py: e: LineBuilder LineBuilder: __init__(1),add(0),as_list(0),text(0) # Single place where report line lists are created and mutated... diff --git a/project/mermaid.export b/project/mermaid.export index c293958..56dfd4a 100644 --- a/project/mermaid.export +++ b/project/mermaid.export @@ -51,8 +51,6 @@ flowchart TD src__tagi__planner__grouper___get_primary_tag["_get_primary_tag"] src__tagi__planner__preview__preview_plan["preview_plan"] src__tagi__planner__preview__preview_changes["preview_changes"] - src__tagi__planner__branch_grouper__group_by_branch("group_by_branch CC=8") - src__tagi__planner__branch_grouper__get_branch_info["get_branch_info"] src__tagi__planner__selector__select_changes_by_tag["select_changes_by_tag"] src__tagi__planner__selector__select_low_risk_changes["select_low_risk_changes"] src__tagi__planner__selector__select_small_changes["select_small_changes"] @@ -61,7 +59,66 @@ flowchart TD src__tagi__models__change__ChangeMetrics__to_vector["to_vector"] src__tagi__cli__git_operations___ensure_tag_prefix["_ensure_tag_prefix"] src__tagi__cli__git_operations___is_known_tag["_is_known_tag"] + src__tagi__cli__git_operations___resolve_send_target["_resolve_send_target"] + src__tagi__cli__git_operations___filter_by_tag["_filter_by_tag"] end + subgraph tagi__cli + tagi__cli__provider_commands__detect_provider_command["detect_provider_command"] + tagi__cli__provider_commands___current_branch["_current_branch"] + tagi__cli__provider_commands___pr_spec["_pr_spec"] + tagi__cli__provider_commands__create_pr["create_pr"] + tagi__cli__provider_commands__create_mr["create_mr"] + end + subgraph tagi__executor + tagi__executor__git__GitExecutor____init__["__init__"] + tagi__executor__git__GitExecutor___run_command["_run_command"] + tagi__executor__git__GitExecutor__add["add"] + tagi__executor__git__GitExecutor__commit["commit"] + tagi__executor__git__GitExecutor__push["push"] + tagi__executor__git__GitExecutor__status["status"] + tagi__executor__git__GitExecutor__get_current_branch["get_current_branch"] + tagi__executor__git__GitExecutor__get_remote_url["get_remote_url"] + tagi__executor__git__GitExecutor__has_staged_changes["has_staged_changes"] + end + subgraph tagi__planner + tagi__planner__branch_grouper__group_by_branch("group_by_branch CC=8") + tagi__planner__branch_grouper__get_branch_info["get_branch_info"] + end + subgraph tagi__providers + tagi__providers__base__BaseProvider____init__["__init__"] + tagi__providers__base__BaseProvider__is_authenticated["is_authenticated"] + tagi__providers__base__BaseProvider__get_auth_status["get_auth_status"] + tagi__providers__base__BaseProvider__create_pr["create_pr"] + tagi__providers__base__BaseProvider__detect_remote["detect_remote"] + tagi__providers__base__BaseProvider___run_command["_run_command"] + tagi__providers__base__BaseProvider___get_git_remote_url["_get_git_remote_url"] + tagi__providers__base__BaseProvider___check_git_remote_for_provider["_check_git_remote_for_provider"] + tagi__providers__gitlab__GitLabProvider__is_authenticated["is_authenticated"] + tagi__providers__gitlab__GitLabProvider__get_auth_status["get_auth_status"] + tagi__providers__gitlab__GitLabProvider__get_configured_host["get_configured_host"] + tagi__providers__gitlab__GitLabProvider__create_pr["create_pr"] + tagi__providers__gitlab__GitLabProvider__detect_remote["detect_remote"] + tagi__providers__github__GitHubProvider__is_authenticated["is_authenticated"] + tagi__providers__github__GitHubProvider__get_auth_status["get_auth_status"] + tagi__providers__github__GitHubProvider__get_token["get_token"] + tagi__providers__github__GitHubProvider__create_pr["create_pr"] + tagi__providers__github__GitHubProvider__detect_remote["detect_remote"] + end + subgraph tagi__scanner + tagi__scanner__files__count_lines_changed["count_lines_changed"] + tagi__scanner__status__scan_repo["scan_repo"] + tagi__scanner__status__parse_status["parse_status"] + tagi__scanner__diff__get_diff["get_diff"] + tagi__scanner__diff__get_staged_diff["get_staged_diff"] + end + subgraph tagi__utils + tagi__utils__commands__run_command["run_command"] + tagi__utils__detect_provider__get_provider["get_provider"] + tagi__utils__detect_provider__detect_git_provider["detect_git_provider"] + end + src__tagi__config__Config__get_tag_for_path --> src__tagi__utils__paths__path_matches + src__tagi__config__Config__get_heuristics_for_path --> src__tagi__utils__paths__path_matches + src__tagi__config__Config__should_ignore --> src__tagi__utils__paths__path_matches src__tagi__hooks___pre_commit_hook --> src__tagi__hooks___hooks_dir src__tagi__hooks__install_hooks --> src__tagi__hooks___pre_commit_hook src__tagi__hooks__install_hooks --> src__tagi__hooks___hooks_dir @@ -85,11 +142,13 @@ flowchart TD src__tagi__planner__grouper__group_changes --> src__tagi__utils__risk__total_lines_changed src__tagi__planner__grouper__group_changes --> src__tagi__utils__risk__average_risk src__tagi__planner__grouper__group_by_tag --> src__tagi__planner__selector__select_changes_by_tag + tagi__planner__branch_grouper__group_by_branch --> tagi__utils__commands__run_command + tagi__planner__branch_grouper__get_branch_info --> tagi__utils__commands__run_command src__tagi__cli__git_operations___is_known_tag --> src__tagi__cli__git_operations___ensure_tag_prefix src__tagi__cli__git_operations___resolve_send_target --> src__tagi__cli__git_operations___is_known_tag src__tagi__cli__git_operations___filter_by_tag --> src__tagi__utils__change_filter__resolve_filtered_changes src__tagi__cli__git_operations___filter_by_tag --> src__tagi__cli__git_operations___ensure_tag_prefix - src__tagi__cli__git_operations___execute_git_operations --> src__tagi__utils__detect_provider__get_provider + src__tagi__cli__git_operations___execute_git_operations --> tagi__utils__detect_provider__get_provider src__tagi__cli__git_operations__send_command --> src__tagi__cli__git_operations___resolve_send_target src__tagi__cli__git_operations__send_command --> src__tagi__cli__scan_utils__scan_and_tag src__tagi__cli__git_operations__send_command --> src__tagi__cli__git_operations___filter_by_tag @@ -101,21 +160,22 @@ flowchart TD src__tagi__cli__inspection_commands__inspect_command --> src__tagi__cli__display_utils___display_changes src__tagi__cli__inspection_commands__inspect_command --> src__tagi__cli__scan_utils__scan_and_tag src__tagi__cli__inspection_commands__inspect_command --> src__tagi__config__load_config - src__tagi__cli__inspection_commands__inspect_command --> src__tagi__scanner__diff__get_diff + src__tagi__cli__inspection_commands__inspect_command --> tagi__scanner__diff__get_diff src__tagi__cli__inspection_commands__filter_command --> src__tagi__utils__change_filter__resolve_filtered_changes src__tagi__cli__inspection_commands__filter_command --> src__tagi__utils__change_stats__display_statistics_table src__tagi__cli__inspection_commands__filter_command --> src__tagi__cli__display_utils___display_changes src__tagi__cli__inspection_commands__filter_command --> src__tagi__cli__scan_utils__scan_and_tag - src__tagi__cli__inspection_commands__filter_command --> src__tagi__scanner__diff__get_diff - src__tagi__cli__inspection_commands__file_command --> src__tagi__scanner__diff__get_diff + src__tagi__cli__inspection_commands__filter_command --> tagi__scanner__diff__get_diff + src__tagi__cli__inspection_commands__file_command --> tagi__scanner__diff__get_diff src__tagi__cli__inspection_commands__file_command --> src__tagi__cli__scan_utils__scan_and_tag src__tagi__cli__inspection_commands__file_command --> src__tagi__cli__display_utils___format_tags - src__tagi__cli__provider_commands__detect_provider_command --> src__tagi__utils__detect_provider__get_provider - src__tagi__cli__provider_commands___pr_spec --> src__tagi__cli__provider_commands___current_branch - src__tagi__cli__provider_commands__create_pr --> src__tagi__utils__detect_provider__get_provider - src__tagi__cli__provider_commands__create_pr --> src__tagi__cli__provider_commands___pr_spec - src__tagi__cli__provider_commands__create_mr --> src__tagi__utils__detect_provider__get_provider - src__tagi__cli__provider_commands__create_mr --> src__tagi__cli__provider_commands___pr_spec + tagi__cli__provider_commands__detect_provider_command --> tagi__utils__detect_provider__get_provider + tagi__cli__provider_commands___current_branch --> tagi__utils__commands__run_command + tagi__cli__provider_commands___pr_spec --> tagi__cli__provider_commands___current_branch + tagi__cli__provider_commands__create_pr --> tagi__utils__detect_provider__get_provider + tagi__cli__provider_commands__create_pr --> tagi__cli__provider_commands___pr_spec + tagi__cli__provider_commands__create_mr --> tagi__utils__detect_provider__get_provider + tagi__cli__provider_commands__create_mr --> tagi__cli__provider_commands___pr_spec src__tagi__cli__core_commands__scan_command --> src__tagi__cli__scan_utils__scan_and_tag src__tagi__cli__core_commands__scan_command --> src__tagi__cli__display_utils___display_changes_grouped src__tagi__cli__core_commands__scan_command --> src__tagi__cli__display_utils___display_changes @@ -135,11 +195,11 @@ flowchart TD src__tagi__cli__main___configure_command_logging --> src__tagi__utils__logger__setup_logger src__tagi__cli__main___is_known_tag --> src__tagi__cli__main___ensure_tag_prefix src__tagi__cli__main___resolve_send_target --> src__tagi__cli__main___is_known_tag - src__tagi__cli__main__detect_provider --> src__tagi__cli__provider_commands__detect_provider_command + src__tagi__cli__main__detect_provider --> tagi__cli__provider_commands__detect_provider_command src__tagi__cli__publishing_commands__publish_command --> src__tagi__cli__scan_utils__scan_and_tag src__tagi__cli__publishing_commands__publish_command --> src__tagi__cli__publishing_commands___ensure_tag_prefix src__tagi__cli__publishing_commands__publish_command --> src__tagi__utils__publish_helpers__create_publish_group - src__tagi__cli__publishing_commands__publish_command --> src__tagi__utils__detect_provider__get_provider + src__tagi__cli__publishing_commands__publish_command --> tagi__utils__detect_provider__get_provider src__tagi__cli__publishing_commands__publish_command --> src__tagi__utils__change_filter__resolve_filtered_changes src__tagi__cli__publishing_commands__deploy_command --> src__tagi__cli__scan_utils__scan_and_tag src__tagi__cli__publishing_commands__deploy_command --> src__tagi__cli__publishing_commands___ensure_tag_prefix @@ -152,20 +212,27 @@ flowchart TD src__tagi__cli__utility_commands__draft_command --> src__tagi__utils__send_helpers__create_change_group src__tagi__cli__utility_commands__draft_command --> src__tagi__composer__commit_message__generate_commit_message src__tagi__cli__utility_commands__draft_command --> src__tagi__utils__change_filter__resolve_filtered_changes - src__tagi__providers__gitlab__GitLabProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result - src__tagi__providers__gitlab__GitLabProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result - src__tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command - src__tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command - src__tagi__providers__github__GitHubProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result - src__tagi__providers__github__GitHubProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result - src__tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command - src__tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command - src__tagi__scanner__status__scan_repo --> src__tagi__config__load_config - src__tagi__scanner__status__scan_repo --> src__tagi__config__Config__should_ignore - src__tagi__scanner__status__scan_repo --> src__tagi__scanner__status__parse_status + tagi__providers__base__BaseProvider___run_command --> tagi__utils__commands__run_command + tagi__providers__gitlab__GitLabProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result + tagi__providers__gitlab__GitLabProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result + tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command + tagi__providers__gitlab__GitLabProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command + tagi__providers__github__GitHubProvider__is_authenticated --> src__tagi__providers__utils__auth__is_authenticated_from_result + tagi__providers__github__GitHubProvider__get_auth_status --> src__tagi__providers__utils__auth__get_auth_status_from_result + tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__execute_pr_command + tagi__providers__github__GitHubProvider__create_pr --> src__tagi__providers__utils__pr__build_pr_command + tagi__scanner__files__count_lines_changed --> tagi__utils__commands__run_command + tagi__scanner__status__scan_repo --> tagi__utils__commands__run_command + tagi__scanner__status__scan_repo --> src__tagi__config__load_config + tagi__scanner__status__scan_repo --> src__tagi__config__Config__should_ignore + tagi__scanner__status__scan_repo --> tagi__scanner__status__parse_status + tagi__scanner__diff__get_diff --> tagi__utils__commands__run_command + tagi__scanner__diff__get_staged_diff --> tagi__utils__commands__run_command src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___lines_risk_weight src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___tag_risk_weight src__tagi__heuristics__scoring__calculate_risk_score --> src__tagi__heuristics__scoring___change_type_risk_weight + src__tagi__heuristics__metrics___extension_complexity_weight --> src__tagi__utils__paths__path_endswith + src__tagi__heuristics__metrics___extension_impact_weight --> src__tagi__utils__paths__path_endswith src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_complexity src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_impact src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_stability @@ -173,14 +240,18 @@ flowchart TD src__tagi__heuristics__metrics__calculate_metrics --> src__tagi__heuristics__metrics___calculate_dependency_depth src__tagi__heuristics__metrics___calculate_complexity --> src__tagi__heuristics__metrics___extension_complexity_weight src__tagi__heuristics__metrics___calculate_impact --> src__tagi__heuristics__metrics___extension_impact_weight + src__tagi__heuristics__metrics___calculate_test_impact --> src__tagi__utils__paths__path_endswith + src__tagi__heuristics__metrics___calculate_test_impact --> src__tagi__utils__paths__path_matches + src__tagi__heuristics__metrics___calculate_dependency_depth --> src__tagi__utils__paths__path_endswith src__tagi__heuristics__tags__apply_tags --> src__tagi__config__load_config src__tagi__heuristics__tags__apply_tags --> src__tagi__heuristics__tags___tag_change src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags___custom_config_tags - src__tagi__heuristics__tags___tag_change --> src__tagi__scanner__files__count_lines_changed + src__tagi__heuristics__tags___tag_change --> tagi__scanner__files__count_lines_changed src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__metrics__calculate_metrics src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__scoring__calculate_risk_score src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags__apply_path_tags src__tagi__heuristics__tags___tag_change --> src__tagi__heuristics__tags___size_tags + src__tagi__heuristics__tags__apply_path_tags --> src__tagi__utils__paths__path_matches src__tagi__heuristics__rules___get_config_attr --> src__tagi__config__load_config src__tagi__heuristics__rules__get_custom_rules --> src__tagi__heuristics__rules___get_config_attr src__tagi__heuristics__rules__get_custom_heuristics --> src__tagi__heuristics__rules___get_config_attr @@ -200,18 +271,22 @@ flowchart TD src__tagi__composer__commit_message__generate_commit_message --> src__tagi__config__load_config src__tagi__composer___tags__all_tag_values --> src__tagi__composer___tags__all_tags src__tagi__composer___tags__summary_tag --> src__tagi__composer___tags__all_tags + tagi__executor__git__GitExecutor___run_command --> tagi__utils__commands__run_command src__tagi__utils__summary_helpers__build_statistics_section --> src__tagi__utils__risk__total_lines_changed src__tagi__utils__summary_helpers__build_statistics_section --> src__tagi__utils__risk__average_risk - src__tagi__utils__publish_helpers__detect_and_get_provider --> src__tagi__utils__detect_provider__get_provider + src__tagi__utils__publish_helpers__detect_and_get_provider --> tagi__utils__detect_provider__get_provider src__tagi__utils__publish_helpers__create_publish_group --> src__tagi__utils__risk__total_lines_changed src__tagi__utils__publish_helpers__create_publish_group --> src__tagi__utils__risk__average_risk - src__tagi__utils__detect_provider__get_provider --> src__tagi__utils__detect_provider__detect_git_provider + tagi__utils__detect_provider__get_provider --> tagi__utils__detect_provider__detect_git_provider + tagi__utils__detect_provider__detect_git_provider --> tagi__utils__commands__run_command src__tagi__utils__send_helpers__create_change_group --> src__tagi__utils__risk__total_lines_changed src__tagi__utils__send_helpers__create_change_group --> src__tagi__utils__risk__average_risk src__tagi__utils__change_stats__calculate_tag_statistics --> src__tagi__utils__risk__total_lines_changed src__tagi__utils__change_stats__calculate_tag_statistics --> src__tagi__utils__risk__average_risk src__tagi__utils__change_stats__display_statistics_table --> src__tagi__utils__risk__total_lines_changed src__tagi__utils__change_stats__display_statistics_table --> src__tagi__utils__risk__average_risk + src__tagi__utils__paths__path_matches --> src__tagi__utils__paths__path_key + src__tagi__utils__paths__path_endswith --> src__tagi__utils__paths__path_key src__tagi__utils__change_filter___resolve_tag_enums --> src__tagi__utils__change_filter___normalize_tag src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___resolve_tag_enums src__tagi__utils__change_filter__resolve_filtered_changes --> src__tagi__utils__change_filter___changes_matching_any @@ -224,4 +299,4 @@ flowchart TD classDef highCC fill:#ff6b6b,stroke:#c92a2a,color:#fff classDef medCC fill:#ffd43b,stroke:#f08c00,color:#000 - class src__tagi__analyzer__metrics__MetricsCollector__collect,src__tagi__planner__branch_grouper__group_by_branch,src__tagi__planner__selector__select_by_tags,src__tagi__planner__selector__select_safe_changes,src__tagi__cli__publishing_commands__publish_command,src__tagi__cli__utility_commands__hooks_command,src__tagi__providers__koru__KoruProvider__analyze_deployment_priority,src__tagi__composer__summary__generate_summary medCC + class src__tagi__analyzer__metrics__MetricsCollector__collect,tagi__planner__branch_grouper__group_by_branch,src__tagi__planner__selector__select_by_tags,src__tagi__planner__selector__select_safe_changes,src__tagi__cli__publishing_commands__publish_command,src__tagi__cli__utility_commands__hooks_command,src__tagi__providers__koru__KoruProvider__analyze_deployment_priority,src__tagi__composer__summary__generate_summary medCC diff --git a/project/planfile-tickets.yaml b/project/planfile-tickets.yaml index 98aa536..bee7516 100644 --- a/project/planfile-tickets.yaml +++ b/project/planfile-tickets.yaml @@ -1,51 +1,11 @@ -source: koru-scan -# generated in 9.95s +source: code2llm +# generated in 0.01s schema: code2llm.planfile_tickets.v1 project_root: /home/tom/github/semcod/tagi tickets: -- signal: code2llm_smell_shotgun_surgery - title: 'Address code smell: Shotgun Surgery: path_lower' - description: 'code2llm reports `Shotgun Surgery: path_lower` in `src/tagi/heuristics/metrics.py:33`. - - - Mutation of variable ''path_lower'' spans 8 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: high - labels: - - llm-ready - - code2llm - - code-smell - - shotgun-surgery - files: - - src/tagi/heuristics/metrics.py - dedupe_key: 'code2llm:smell:shotgun_surgery:src/tagi/heuristics/metrics.py:33:Shotgun - Surgery: path_lower' -- signal: code2llm_smell_shotgun_surgery - title: 'Address code smell: Shotgun Surgery: tags' - description: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/heuristics/tags.py:48`. - - - Mutation of variable ''tags'' spans 5 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - priority: high - labels: - - llm-ready - - code2llm - - code-smell - - shotgun-surgery - files: - - src/tagi/heuristics/tags.py - dedupe_key: 'code2llm:smell:shotgun_surgery:src/tagi/heuristics/tags.py:48:Shotgun - Surgery: tags' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: _tag_change' - description: 'code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:22`. + description: 'code2llm reports `God Function: _tag_change` in `src/tagi/heuristics/tags.py:23`. Function ''_tag_change'' is oversized: CC=2, fan-out=9, mutations=9. @@ -60,7 +20,7 @@ tickets: - god-function files: - src/tagi/heuristics/tags.py - dedupe_key: 'code2llm:smell:god_function:src/tagi/heuristics/tags.py:22:God Function: + dedupe_key: 'code2llm:smell:god_function:src/tagi/heuristics/tags.py:23:God Function: _tag_change' - signal: code2llm_smell_god_function title: 'Address code smell: God Function: group_by_branch' @@ -233,17 +193,5 @@ tickets: - src/tagi/cli/utility_commands.py dedupe_key: 'code2llm:smell:god_function:src/tagi/cli/utility_commands.py:25:God Function: summary_command' -applied: -- 'Address code smell: Shotgun Surgery: path_lower' -- 'Address code smell: Shotgun Surgery: tags' -- 'Address code smell: God Function: _tag_change' -- 'Address code smell: God Function: group_by_branch' -- 'Address code smell: God Function: group_changes' -- 'Address code smell: God Function: hooks_command' -- 'Address code smell: God Function: inspect_command' -- 'Address code smell: God Function: publish_command' -- 'Address code smell: God Function: scan_repo' -- 'Address code smell: God Function: send_command' -- 'Address code smell: God Function: setup_logger' -- 'Address code smell: God Function: summary_command' +applied: [] skipped: [] diff --git a/project/project.toon.yaml b/project/project.toon.yaml index f21d04c..24750f9 100644 --- a/project/project.toon.yaml +++ b/project/project.toon.yaml @@ -1,8 +1,8 @@ -# tagi | 225 func | 51f | 5609L | python | 2026-09-19 +# tagi | 229 func | 53f | 5590L | python | 2026-09-19 # generated in 0.00s HEALTH: - CC̄=2.9 critical=3 (limit:10) dup=0 cycles=2 + CC̄=2.8 critical=3 (limit:10) dup=0 cycles=2 ALERTS[10]: !! high_fan_out scan_repo = 15 (limit:10) @@ -16,10 +16,10 @@ ALERTS[10]: ! high_fan_out draft_command = 10 (limit:10) ! high_fan_out KoruProvider.analyze_deployment_priority = 10 (limit:10) -MODULES[75] (top by size): +MODULES[77] (top by size): M[goal.yaml] 539L C:0 F:0 CC↑0 D:0 (yaml) M[src/tagi/analyzer/dependency_graph.py] 276L C:1 F:16 CC↑7 D:0 (python) - M[src/tagi/heuristics/metrics.py] 228L C:0 F:11 CC↑5 D:1 (python) + M[src/tagi/heuristics/metrics.py] 223L C:0 F:11 CC↑5 D:1 (python) M[src/tagi/ui/design_tokens.py] 221L C:7 F:3 CC↑2 D:0 (python) M[src/tagi/cli/utility_commands.py] 211L C:0 F:5 CC↑10 D:0 (python) M[src/tagi/providers/koru.py] 171L C:2 F:10 CC↑8 D:0 (python) @@ -29,10 +29,10 @@ MODULES[75] (top by size): M[src/tagi/cli/publishing_commands.py] 139L C:0 F:3 CC↑11 D:0 (python) M[koru.yaml] 133L C:0 F:0 CC↑0 D:0 (yaml) M[src/tagi/hooks.py] 127L C:0 F:7 CC↑5 D:1 (python) - M[src/tagi/config.py] 126L C:1 F:12 CC↑4 D:5 (python) M[src/tagi/cli/inspection_commands.py] 120L C:0 F:3 CC↑7 D:0 (python) M[src/tagi/utils/change_filter.py] 120L C:0 F:9 CC↑5 D:5 (python) - LANGS: python:66/yaml:5/txt:2/shell:1/toml:1 + M[src/tagi/config.py] 118L C:1 F:12 CC↑4 D:5 (python) + LANGS: python:68/yaml:5/txt:2/shell:1/toml:1 HOTSPOTS[10]: ★ scan_repo fan=15 // Scan repository for uncommitted changes using git status --porcelain. @@ -52,4 +52,4 @@ REFACTOR[4]: [4] M/M Reduce scan_repo fan-out (currently 15) EVOLUTION: - 2026-09-19 CC̄=2.9 crit=3 5609L // Automated analysis + 2026-09-19 CC̄=2.8 crit=3 5590L // Automated analysis diff --git a/project/prompt.txt b/project/prompt.txt index 60e34f0..a35b906 100644 --- a/project/prompt.txt +++ b/project/prompt.txt @@ -8,8 +8,8 @@ we are in project path: tagi Files for analysis: Note: project/validation.toon.yaml and project/duplication.toon.yaml are generated by external tools (vallm and redup) -- analysis.toon.yaml (Health diagnostics - complexity metrics, god modules, coupling issues, refactoring priorities) [9KB] -- map.toon.yaml (Structural map - files, sizes, imports, exports, signatures, project header) [16KB] +- analysis.toon.yaml (Health diagnostics - complexity metrics, god modules, coupling issues, refactoring priorities) [10KB] +- map.toon.yaml (Structural map - files, sizes, imports, exports, signatures, project header) [17KB] - evolution.toon.yaml (Refactoring queue - ranked actions by impact/effort, risks, metrics targets, history) [1KB] - project.toon.yaml (Compact project overview - generated from project.yaml data) [2KB] - context.md (LLM narrative - architecture summary and project context) [21KB] From 9264449b8d3ce1c324e549a3c374d4ded531226b Mon Sep 17 00:00:00 2001 From: Tom Softreck Date: Sat, 19 Sep 2026 23:26:22 +0200 Subject: [PATCH 5/7] chore(PLF-176): record already-satisfied tags smell ticket completion in sprint state The code2llm 'Shotgun Surgery: tags' finding (src/tagi/composer/_tags.py:20, dedupe key code2llm:smell:shotgun_surgery:src/tagi/composer/_tags.py:20) was captured by the 18:29Z koru-scan against the pre-fix tree (evidence _tags.py sha 84f953c3...), before fc4e93d (PLF-147) landed at 20:24Z. HEAD's src/tagi/composer/_tags.py is byte-identical to the PLF-147 result (sha 37211f09...): it contains no mutated 'tags' binding, and the canonical 'tags' accumulation now lives only in the single _tag_change function in src/tagi/heuristics/tags.py (span 5 -> 1). No source change is required. Verified: fresh code2llm runs with the documented discovery flags (src/tagi -f all --no-chunk --exclude '*.md') and with --data-flow report zero shotgun-surgery findings (only pre-existing fan-out notes for unrelated modules); 127/127 pytest pass; ruff on composer/_tags.py and heuristics/tags.py reports only the pre-existing baseline (I001, UP035, UP006, UP045, BLE001, F401), identical at HEAD with src/ unmodified. Marked PLF-176 done via planfile and staged only its ticket-block removal, leaving unrelated queue churn uncommitted. Co-authored-by: Koru Agent --- .planfile/sprints/current.yaml | 111 --------------------------------- 1 file changed, 111 deletions(-) diff --git a/.planfile/sprints/current.yaml b/.planfile/sprints/current.yaml index 7176f15..4b338b3 100644 --- a/.planfile/sprints/current.yaml +++ b/.planfile/sprints/current.yaml @@ -4468,117 +4468,6 @@ sprint: key: semcod/tagi#190 url: https://github.com/semcod/tagi/issues/190 updated_at: '2026-09-19T18:25:22.064458+00:00' - PLF-176: - backend: github - blocked_by: [] - blocks: [] - created_at: '2026-09-19T19:49:31.353399+00:00' - description: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`. - - - Mutation of variable ''tags'' spans 5 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - execution: - attempt: 0 - max_attempts: 1 - queue: default - state: ready - executor: - kind: human - mode: interactive - external_id: '193' - files: - - src/tagi/composer/_tags.py - history: - - action: created - message: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`. - - - Mutation of variable ''tags'' spans 5 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - source: koru task - timestamp: '2026-09-19T19:49:31.353399+00:00' - id: PLF-176 - inputs: - api_headers: {} - api_method: GET - api_timeout_seconds: 30.0 - env_keys: [] - prompt: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`. - - - Mutation of variable ''tags'' spans 5 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - integration: - - github - labels: - - koru - - nl-task - - llm-ready - - code2llm - - code-smell - - shotgun-surgery - name: 'Address code smell: Shotgun Surgery: tags' - outputs: - artifacts: [] - notes: [] - priority: high - source: - context: - dedupe_key: 'code2llm:smell:shotgun_surgery:src/tagi/composer/_tags.py:20:Shotgun - Surgery: tags' - evidence: - artifact: - mtime_ns: 1789847360141767983 - path: project/analysis.toon.yaml - sha256: 661fceb25106c0f600fa86e3b2a2eb625295fb450e7315531abb66b52e13a02a - size_bytes: 12168 - files: - - mtime_ns: 1789820644380550921 - path: src/tagi/composer/_tags.py - sha256: 84f953c3818378853cdb9345e86066e66fa04ccc0177985fdf2665c7fe5ebdc6 - size_bytes: 1361 - kind: code2llm_discovery - planfile_tickets: - mtime_ns: 1789847360243915139 - path: project/planfile-tickets.yaml - sha256: c9219bc012e7516e3794f3e0b448f30861f9296138744f977d5f94044cbdfe2a - size_bytes: 6743 - regenerate_command: code2llm /home/tom/github/semcod/tagi -f all -o /home/tom/github/semcod/tagi/project - --no-chunk --exclude *.md --exclude plugins --planfile-apply --planfile-source - koru-project-discovery --planfile-sprint current --planfile-project - /home/tom/github/semcod/tagi --planfile-limit 20 - schema: koru.ticket_evidence.v1 - staleness_check: Regenerate artifacts and compare artifact.sha256 / files[].sha256 - before assuming this ticket is still current. - input: 'code2llm reports `Shotgun Surgery: tags` in `src/tagi/composer/_tags.py:20`. - - - Mutation of variable ''tags'' spans 5 functions. Changing this logic requires - work in many places. - - - Make the smallest refactor that removes the smell and run local tests.' - signal: code2llm_smell_shotgun_surgery - timestamp: '2026-09-19T19:49:31.353399+00:00' - tool: koru-project-discovery - sprint: current - status: open - sync: - github: - id: '193' - key: semcod/tagi#193 - url: https://github.com/semcod/tagi/issues/193 - updated_at: '2026-09-19T19:49:31.353399+00:00' PLF-177: acceptance_criteria: [] blocked_by: [] From 6d415afe9bd457bea09e35abdeb25fed43dd2455 Mon Sep 17 00:00:00 2001 From: Tom Softreck Date: Sat, 19 Sep 2026 23:30:03 +0200 Subject: [PATCH 6/7] refactor(cli): deduplicate tag helpers into shared tag_targets module (PLF-177) Extract _ensure_tag_prefix (4 copies), _is_known_tag and _resolve_send_target (2 copies each, with comment drift) from main.py, git_operations.py, publishing_commands.py and utility_commands.py into src/tagi/cli/tag_targets.py. The tagi.cli package namespace keeps re-exporting all three helpers for backward compatibility with the test suite. Behavior unchanged: redup dup groups 7 -> 4, no EXAC groups remain for these helpers; pytest 127 passed. Co-authored-by: Koru Agent --- src/tagi/cli/__init__.py | 4 ++- src/tagi/cli/git_operations.py | 45 +++-------------------------- src/tagi/cli/main.py | 38 ------------------------ src/tagi/cli/publishing_commands.py | 8 +---- src/tagi/cli/tag_targets.py | 45 +++++++++++++++++++++++++++++ src/tagi/cli/utility_commands.py | 8 +---- 6 files changed, 54 insertions(+), 94 deletions(-) create mode 100644 src/tagi/cli/tag_targets.py diff --git a/src/tagi/cli/__init__.py b/src/tagi/cli/__init__.py index 6976d00..7856805 100644 --- a/src/tagi/cli/__init__.py +++ b/src/tagi/cli/__init__.py @@ -3,10 +3,12 @@ from tagi.cli.main import ( app, detect_provider, + _configure_command_logging, +) +from tagi.cli.tag_targets import ( _ensure_tag_prefix, _is_known_tag, _resolve_send_target, - _configure_command_logging, ) from tagi.cli.provider_commands import create_pr, create_mr diff --git a/src/tagi/cli/git_operations.py b/src/tagi/cli/git_operations.py index 655d043..75cf9f4 100644 --- a/src/tagi/cli/git_operations.py +++ b/src/tagi/cli/git_operations.py @@ -1,62 +1,25 @@ """Git operations CLI commands: send, auto.""" -from pathlib import Path from typing import Optional import typer from rich.console import Console from tagi.executor.git import GitExecutor -from tagi.models.change import Tag from tagi.planner.sorter import sort_by_complexity from tagi.utils.inspect_helpers import resolve_filtered_changes from tagi.utils.logger import get_logger from tagi.utils.send_helpers import create_change_group from tagi.utils.detect_provider import get_provider from tagi.cli.scan_utils import scan_and_tag +from tagi.cli.tag_targets import ( + _ensure_tag_prefix, + _resolve_send_target, +) console = Console() -def _ensure_tag_prefix(tag: str) -> str: - """Ensure tag starts with #.""" - if not tag.startswith("#"): - return f"#{tag}" - return tag - - -def _is_known_tag(value: str) -> bool: - """Return True when the value matches a supported tag.""" - try: - Tag(_ensure_tag_prefix(value)) - return True - except ValueError: - return False - - -def _resolve_send_target(target: Optional[str], repo_path: str) -> tuple[str, Optional[str]]: - """Resolve send positional input as either a tag or a repository path.""" - if target is None: - return repo_path, None - - # An explicit --repo-path means the positional argument is always a tag. - if repo_path != ".": - return repo_path, target - - # Known tags are treated as tags. - if _is_known_tag(target): - return repo_path, target - - # An existing filesystem path is treated as the repository path. - candidate = Path(target).expanduser() - if candidate.exists(): - return str(candidate), None - - # Otherwise treat the value as a (possibly unknown) tag so the caller can - # report it cleanly instead of failing on a missing path. - return repo_path, target - - def _filter_by_tag(changes, tag: Optional[str]): """Filter changes to ``tag``; returns all changes when tag is None.""" if tag is None: diff --git a/src/tagi/cli/main.py b/src/tagi/cli/main.py index 251c1dd..67df2eb 100644 --- a/src/tagi/cli/main.py +++ b/src/tagi/cli/main.py @@ -1,12 +1,8 @@ """CLI interface for tagi.""" -from pathlib import Path -from typing import Optional - import typer from rich.console import Console -from tagi.models.change import Tag from tagi.utils.logger import setup_logger # Import command modules @@ -47,40 +43,6 @@ def _configure_command_logging(verbose: bool) -> None: setup_logger(verbose=True).debug("Verbose logging enabled") -def _ensure_tag_prefix(tag: str) -> str: - """Ensure tag has # prefix.""" - if not tag.startswith("#"): - return f"#{tag}" - return tag - - -def _is_known_tag(value: str) -> bool: - """Return True when the value matches a supported tag.""" - try: - Tag(_ensure_tag_prefix(value)) - return True - except ValueError: - return False - - -def _resolve_send_target(target: Optional[str], repo_path: str) -> tuple[str, Optional[str]]: - """Resolve send positional input as either a tag or a repository path.""" - if target is None: - return repo_path, None - - if repo_path != ".": - return repo_path, target - - if _is_known_tag(target): - return repo_path, target - - candidate = Path(target).expanduser() - if candidate.exists(): - return str(candidate), None - - return repo_path, target - - # Register core commands app.command(name="scan")(scan_command) app.command(name="list-groups")(list_groups_command) diff --git a/src/tagi/cli/publishing_commands.py b/src/tagi/cli/publishing_commands.py index cc0fa50..cd531da 100644 --- a/src/tagi/cli/publishing_commands.py +++ b/src/tagi/cli/publishing_commands.py @@ -8,18 +8,12 @@ from tagi.utils.publish_helpers import create_publish_group from tagi.utils.detect_provider import get_provider from tagi.cli.scan_utils import scan_and_tag +from tagi.cli.tag_targets import _ensure_tag_prefix console = Console() -def _ensure_tag_prefix(tag: str) -> str: - """Ensure tag starts with #.""" - if not tag.startswith("#"): - return f"#{tag}" - return tag - - def publish_command( tag: str = typer.Argument(..., help="Tag to publish (e.g., #small)"), repo_path: str = typer.Argument(".", help="Path to repository"), diff --git a/src/tagi/cli/tag_targets.py b/src/tagi/cli/tag_targets.py new file mode 100644 index 0000000..95ad9ec --- /dev/null +++ b/src/tagi/cli/tag_targets.py @@ -0,0 +1,45 @@ +"""Shared tag-target helpers for the cli command modules.""" + +from pathlib import Path +from typing import Optional + +from tagi.models.change import Tag + + +def _ensure_tag_prefix(tag: str) -> str: + """Ensure tag starts with #.""" + if not tag.startswith("#"): + return f"#{tag}" + return tag + + +def _is_known_tag(value: str) -> bool: + """Return True when the value matches a supported tag.""" + try: + Tag(_ensure_tag_prefix(value)) + return True + except ValueError: + return False + + +def _resolve_send_target(target: Optional[str], repo_path: str) -> tuple[str, Optional[str]]: + """Resolve send positional input as either a tag or a repository path.""" + if target is None: + return repo_path, None + + # An explicit --repo-path means the positional argument is always a tag. + if repo_path != ".": + return repo_path, target + + # Known tags are treated as tags. + if _is_known_tag(target): + return repo_path, target + + # An existing filesystem path is treated as the repository path. + candidate = Path(target).expanduser() + if candidate.exists(): + return str(candidate), None + + # Otherwise treat the value as a (possibly unknown) tag so the caller can + # report it cleanly instead of failing on a missing path. + return repo_path, target diff --git a/src/tagi/cli/utility_commands.py b/src/tagi/cli/utility_commands.py index 11e2580..d6c5cdc 100644 --- a/src/tagi/cli/utility_commands.py +++ b/src/tagi/cli/utility_commands.py @@ -10,18 +10,12 @@ from tagi.utils.inspect_helpers import resolve_filtered_changes from tagi.cli.display_utils import _format_tags from tagi.cli.scan_utils import scan_and_tag +from tagi.cli.tag_targets import _ensure_tag_prefix console = Console() -def _ensure_tag_prefix(tag: str) -> str: - """Ensure tag starts with #.""" - if not tag.startswith("#"): - return f"#{tag}" - return tag - - def summary_command( repo_path: str = typer.Argument(".", help="Path to repository"), output: Optional[str] = typer.Option(None, "--output", "-o", help="Output file for summary report"), From 6688ef7b743760325aa19a0c2af31b24290d3183 Mon Sep 17 00:00:00 2001 From: Tom Softreck Date: Sat, 19 Sep 2026 23:55:34 +0200 Subject: [PATCH 7/7] chore(docs): exclude generated context from managed document changes Co-authored-by: Koru Agent --- project/context.md | 73 +++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/project/context.md b/project/context.md index dd05785..31f765a 100644 --- a/project/context.md +++ b/project/context.md @@ -5,11 +5,11 @@ - **Project**: /home/tom/github/semcod/tagi - **Primary Language**: python -- **Languages**: python: 68, yaml: 5, txt: 2, toml: 1, shell: 1 +- **Languages**: python: 66, yaml: 5, txt: 2, toml: 1, shell: 1 - **Analysis Mode**: static -- **Total Functions**: 229 +- **Total Functions**: 225 - **Total Classes**: 27 -- **Modules**: 77 +- **Modules**: 75 - **Entry Points**: 137 ## Architecture by Module @@ -37,7 +37,7 @@ - **Functions**: 9 - **File**: `formats.py` -### tagi.executor.git +### src.tagi.executor.git - **Functions**: 9 - **Classes**: 1 - **File**: `git.py` @@ -46,7 +46,7 @@ - **Functions**: 9 - **File**: `change_filter.py` -### tagi.providers.base +### src.tagi.providers.base - **Functions**: 8 - **Classes**: 2 - **File**: `base.py` @@ -72,7 +72,7 @@ - **Functions**: 5 - **File**: `selector.py` -### tagi.cli.provider_commands +### src.tagi.cli.provider_commands - **Functions**: 5 - **File**: `provider_commands.py` @@ -84,12 +84,12 @@ - **Functions**: 5 - **File**: `utility_commands.py` -### tagi.providers.gitlab +### src.tagi.providers.gitlab - **Functions**: 5 - **Classes**: 1 - **File**: `gitlab.py` -### tagi.providers.github +### src.tagi.providers.github - **Functions**: 5 - **Classes**: 1 - **File**: `github.py` @@ -138,9 +138,9 @@ Main execution flows into the system: > Show statistics about changes. - **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, src.tagi.utils.change_stats.display_statistics_table, console.print, console.print, src.tagi.utils.change_stats.calculate_tag_statistics -### tagi.scanner.status.scan_repo +### src.tagi.scanner.status.scan_repo > Scan repository for uncommitted changes using git status --porcelain. -- **Calls**: tagi.utils.commands.run_command, None.split, os.path.exists, ValueError, src.tagi.config.load_config, RuntimeError, line.split, None.strip +- **Calls**: subprocess.run, None.split, os.path.exists, ValueError, src.tagi.config.load_config, RuntimeError, line.split, None.strip ### src.tagi.cli.inspection_commands.file_command > Show detailed information about a specific file. @@ -158,7 +158,7 @@ Main execution flows into the system: > Group changes by their primary tag. - **Calls**: defaultdict, grouped.items, sorted, ChangeGroup, groups.append, src.tagi.planner.grouper._get_primary_tag, None.append, None.append -### tagi.planner.branch_grouper.group_by_branch +### src.tagi.planner.branch_grouper.group_by_branch > Group changes by the git branch they were modified on. Args: @@ -166,7 +166,7 @@ Args: repo_path: Path to the git repository Ret -- **Calls**: GitExecutor, executor.get_current_branch, None.append, tagi.utils.commands.run_command, None.split, None.strip, contains.stdout.strip, b.strip +- **Calls**: GitExecutor, executor.get_current_branch, None.append, subprocess.run, None.split, None.strip, result.stdout.strip, b.strip ### src.tagi.providers.koru.KoruProvider.analyze_deployment_priority > Analyze deployment priority using Koru API. @@ -180,13 +180,13 @@ Ret > Automatically scan, order, and send all changes. - **Calls**: typer.Argument, typer.Option, typer.Option, typer.Option, typer.Option, src.tagi.cli.main._configure_command_logging, console.print, src.tagi.cli.git_operations.send_command -### tagi.cli.provider_commands.create_pr +### src.tagi.cli.provider_commands.create_pr > Create a GitHub pull request. -- **Calls**: tagi.utils.detect_provider.get_provider, isinstance, console.print, github_provider.create_pr, tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print +- **Calls**: src.tagi.utils.detect_provider.get_provider, isinstance, console.print, github_provider.create_pr, src.tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print -### tagi.cli.provider_commands.create_mr +### src.tagi.cli.provider_commands.create_mr > Create a GitLab merge request. -- **Calls**: tagi.utils.detect_provider.get_provider, isinstance, console.print, gitlab_provider.create_pr, tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print +- **Calls**: src.tagi.utils.detect_provider.get_provider, isinstance, console.print, gitlab_provider.create_pr, src.tagi.cli.provider_commands._pr_spec, console.print, console.print, console.print ### src.tagi.composer.summary.generate_summary > Generate a summary of changes. @@ -218,7 +218,7 @@ Args: > Scan repository for uncommitted changes. - **Calls**: typer.Argument, typer.Option, console.print, src.tagi.cli.scan_utils.scan_and_tag, console.print, src.tagi.cli.display_utils._display_changes_grouped, src.tagi.cli.display_utils._display_changes -### tagi.planner.branch_grouper.get_branch_info +### src.tagi.planner.branch_grouper.get_branch_info > Get information about all branches in the repository. Args: @@ -226,7 +226,7 @@ Args: Returns: Dictionary mapping branch nam -- **Calls**: tagi.utils.commands.run_command, None.split, None.strip, branch_listing.stdout.strip, None.replace, line.strip +- **Calls**: subprocess.run, None.split, None.strip, result.stdout.strip, None.replace, line.strip ### src.tagi.providers.koru.KoruProvider._make_api_request > Make request to Koru API. @@ -301,8 +301,7 @@ stats_command [src.tagi.cli.core_commands] ### Flow 9: scan_repo ``` -scan_repo [tagi.scanner.status] - └─ →> run_command +scan_repo [src.tagi.scanner.status] └─ →> load_config ``` @@ -323,27 +322,27 @@ file_command [src.tagi.cli.inspection_commands] - **Methods**: 10 - **Key Methods**: src.tagi.providers.koru.KoruProvider.__init__, src.tagi.providers.koru.KoruProvider._make_api_request, src.tagi.providers.koru.KoruProvider.get_topology, src.tagi.providers.koru.KoruProvider.get_planfile_tickets, src.tagi.providers.koru.KoruProvider.run_quality_gates, src.tagi.providers.koru.KoruProvider.get_context_brief, src.tagi.providers.koru.KoruProvider._deployment_recommendations, src.tagi.providers.koru.KoruProvider.analyze_deployment_priority, src.tagi.providers.koru.KoruProvider.deploy_group, src.tagi.providers.koru.KoruProvider.is_available -### tagi.executor.git.GitExecutor +### src.tagi.executor.git.GitExecutor > Executor for git commands. - **Methods**: 9 -- **Key Methods**: tagi.executor.git.GitExecutor.__init__, tagi.executor.git.GitExecutor._run_command, tagi.executor.git.GitExecutor.add, tagi.executor.git.GitExecutor.commit, tagi.executor.git.GitExecutor.push, tagi.executor.git.GitExecutor.status, tagi.executor.git.GitExecutor.get_current_branch, tagi.executor.git.GitExecutor.get_remote_url, tagi.executor.git.GitExecutor.has_staged_changes +- **Key Methods**: src.tagi.executor.git.GitExecutor.__init__, src.tagi.executor.git.GitExecutor._run_command, src.tagi.executor.git.GitExecutor.add, src.tagi.executor.git.GitExecutor.commit, src.tagi.executor.git.GitExecutor.push, src.tagi.executor.git.GitExecutor.status, src.tagi.executor.git.GitExecutor.get_current_branch, src.tagi.executor.git.GitExecutor.get_remote_url, src.tagi.executor.git.GitExecutor.has_staged_changes -### tagi.providers.base.BaseProvider +### src.tagi.providers.base.BaseProvider > Base class for Git hosting providers. - **Methods**: 8 -- **Key Methods**: tagi.providers.base.BaseProvider.__init__, tagi.providers.base.BaseProvider.is_authenticated, tagi.providers.base.BaseProvider.get_auth_status, tagi.providers.base.BaseProvider.create_pr, tagi.providers.base.BaseProvider.detect_remote, tagi.providers.base.BaseProvider._run_command, tagi.providers.base.BaseProvider._get_git_remote_url, tagi.providers.base.BaseProvider._check_git_remote_for_provider +- **Key Methods**: src.tagi.providers.base.BaseProvider.__init__, src.tagi.providers.base.BaseProvider.is_authenticated, src.tagi.providers.base.BaseProvider.get_auth_status, src.tagi.providers.base.BaseProvider.create_pr, src.tagi.providers.base.BaseProvider.detect_remote, src.tagi.providers.base.BaseProvider._run_command, src.tagi.providers.base.BaseProvider._get_git_remote_url, src.tagi.providers.base.BaseProvider._check_git_remote_for_provider - **Inherits**: ABC -### tagi.providers.gitlab.GitLabProvider +### src.tagi.providers.gitlab.GitLabProvider > GitLab provider using glab CLI. - **Methods**: 5 -- **Key Methods**: tagi.providers.gitlab.GitLabProvider.is_authenticated, tagi.providers.gitlab.GitLabProvider.get_auth_status, tagi.providers.gitlab.GitLabProvider.get_configured_host, tagi.providers.gitlab.GitLabProvider.create_pr, tagi.providers.gitlab.GitLabProvider.detect_remote +- **Key Methods**: src.tagi.providers.gitlab.GitLabProvider.is_authenticated, src.tagi.providers.gitlab.GitLabProvider.get_auth_status, src.tagi.providers.gitlab.GitLabProvider.get_configured_host, src.tagi.providers.gitlab.GitLabProvider.create_pr, src.tagi.providers.gitlab.GitLabProvider.detect_remote - **Inherits**: BaseProvider -### tagi.providers.github.GitHubProvider +### src.tagi.providers.github.GitHubProvider > GitHub provider using gh CLI. - **Methods**: 5 -- **Key Methods**: tagi.providers.github.GitHubProvider.is_authenticated, tagi.providers.github.GitHubProvider.get_auth_status, tagi.providers.github.GitHubProvider.get_token, tagi.providers.github.GitHubProvider.create_pr, tagi.providers.github.GitHubProvider.detect_remote +- **Key Methods**: src.tagi.providers.github.GitHubProvider.is_authenticated, src.tagi.providers.github.GitHubProvider.get_auth_status, src.tagi.providers.github.GitHubProvider.get_token, src.tagi.providers.github.GitHubProvider.create_pr, src.tagi.providers.github.GitHubProvider.detect_remote - **Inherits**: BaseProvider ### src.tagi.analyzer.metrics.MetricsCollector @@ -407,7 +406,7 @@ file_command [src.tagi.cli.inspection_commands] > Group of related changes. - **Methods**: 0 -### tagi.providers.base.PrSpec +### src.tagi.providers.base.PrSpec > Pull/merge request parameters. - **Methods**: 0 @@ -419,7 +418,7 @@ Key functions that process and transform data: > Format tags for display with descriptions if available. - **Output to**: None.join, tag_strings.append, config.get_tag_description -### tagi.scanner.status.parse_status +### src.tagi.scanner.status.parse_status > Parse git status code to ChangeType. ## Behavioral Patterns @@ -447,26 +446,26 @@ Functions exposed as public API (no underscore prefix): - `src.tagi.cli.utility_commands.draft_command` - 17 calls - `src.tagi.cli.inspection_commands.filter_command` - 16 calls - `src.tagi.cli.core_commands.stats_command` - 15 calls -- `tagi.scanner.status.scan_repo` - 15 calls +- `src.tagi.scanner.status.scan_repo` - 15 calls - `src.tagi.utils.logger.setup_logger` - 15 calls - `src.tagi.cli.inspection_commands.file_command` - 14 calls - `src.tagi.ui.design_tokens.DesignTokens.get_css_variables` - 14 calls - `src.tagi.cli.utility_commands.init_command` - 13 calls - `src.tagi.utils.change_stats.display_statistics_table` - 12 calls - `src.tagi.planner.grouper.group_changes` - 10 calls -- `tagi.planner.branch_grouper.group_by_branch` - 10 calls +- `src.tagi.planner.branch_grouper.group_by_branch` - 10 calls - `src.tagi.providers.koru.KoruProvider.analyze_deployment_priority` - 10 calls - `src.tagi.cli.git_operations.auto_command` - 8 calls -- `tagi.cli.provider_commands.create_pr` - 8 calls -- `tagi.cli.provider_commands.create_mr` - 8 calls +- `src.tagi.cli.provider_commands.create_pr` - 8 calls +- `src.tagi.cli.provider_commands.create_mr` - 8 calls - `src.tagi.composer.summary.generate_summary` - 8 calls - `src.tagi.composer.commit_message.generate_commit_message` - 8 calls - `src.tagi.hooks.list_hooks` - 7 calls - `src.tagi.planner.sorter.group_by_complexity` - 7 calls - `src.tagi.cli.core_commands.scan_command` - 7 calls -- `tagi.scanner.files.count_lines_changed` - 7 calls +- `src.tagi.scanner.files.count_lines_changed` - 7 calls - `src.tagi.utils.change_filter.resolve_filtered_changes` - 7 calls -- `tagi.planner.branch_grouper.get_branch_info` - 6 calls +- `src.tagi.planner.branch_grouper.get_branch_info` - 6 calls - `src.tagi.cli.scan_utils.scan_and_tag` - 6 calls - `src.tagi.heuristics.metrics.calculate_metrics` - 6 calls - `src.tagi.composer.formats.generate_detailed_message` - 6 calls @@ -513,7 +512,7 @@ graph TD stats_command --> print stats_command --> scan_and_tag stats_command --> display_statistics_t - scan_repo --> run_command + scan_repo --> run scan_repo --> split ```