taskill 0.1.4__tar.gz → 0.1.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. {taskill-0.1.4 → taskill-0.1.6}/CHANGELOG.md +41 -0
  2. {taskill-0.1.4 → taskill-0.1.6}/PKG-INFO +6 -25
  3. {taskill-0.1.4 → taskill-0.1.6}/README.md +5 -24
  4. {taskill-0.1.4 → taskill-0.1.6}/SUMD.md +117 -74
  5. {taskill-0.1.4 → taskill-0.1.6}/SUMR.md +205 -165
  6. {taskill-0.1.4 → taskill-0.1.6}/TODO.md +1 -1
  7. taskill-0.1.6/VERSION +1 -0
  8. {taskill-0.1.4 → taskill-0.1.6}/app.doql.less +1 -1
  9. {taskill-0.1.4 → taskill-0.1.6}/project/README.md +1 -1
  10. {taskill-0.1.4 → taskill-0.1.6}/project/analysis.toon.yaml +29 -29
  11. {taskill-0.1.4 → taskill-0.1.6}/project/calls.mmd +80 -49
  12. taskill-0.1.6/project/calls.png +0 -0
  13. {taskill-0.1.4 → taskill-0.1.6}/project/calls.toon.yaml +79 -49
  14. {taskill-0.1.4 → taskill-0.1.6}/project/calls.yaml +418 -258
  15. taskill-0.1.6/project/compact_flow.mmd +4 -0
  16. taskill-0.1.6/project/compact_flow.png +0 -0
  17. {taskill-0.1.4 → taskill-0.1.6}/project/context.md +141 -133
  18. {taskill-0.1.4 → taskill-0.1.6}/project/duplication.toon.yaml +5 -5
  19. {taskill-0.1.4 → taskill-0.1.6}/project/evolution.toon.yaml +6 -26
  20. taskill-0.1.6/project/flow.mmd +25 -0
  21. taskill-0.1.6/project/flow.png +0 -0
  22. taskill-0.1.6/project/index.html +623 -0
  23. {taskill-0.1.4 → taskill-0.1.6}/project/map.toon.yaml +30 -17
  24. {taskill-0.1.4 → taskill-0.1.6}/project/mermaid.export +58 -43
  25. taskill-0.1.6/project/project.toon.yaml +53 -0
  26. {taskill-0.1.4 → taskill-0.1.6}/project/prompt.txt +2 -2
  27. {taskill-0.1.4 → taskill-0.1.6}/project.sh +1 -1
  28. {taskill-0.1.4 → taskill-0.1.6}/pyproject.toml +1 -1
  29. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/__init__.py +1 -1
  30. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/bulk.py +46 -34
  31. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/cli.py +63 -54
  32. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/providers/base.py +21 -0
  33. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/providers/openrouter.py +2 -21
  34. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/providers/windsurf_mcp.py +2 -3
  35. taskill-0.1.6/src/taskill/triggers.py +110 -0
  36. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/updaters/todo.py +39 -25
  37. taskill-0.1.4/VERSION +0 -1
  38. taskill-0.1.4/project/calls.png +0 -0
  39. taskill-0.1.4/project/compact_flow.mmd +0 -3
  40. taskill-0.1.4/project/compact_flow.png +0 -0
  41. taskill-0.1.4/project/flow.mmd +0 -25
  42. taskill-0.1.4/project/flow.png +0 -0
  43. taskill-0.1.4/project/index.html +0 -623
  44. taskill-0.1.4/project/project.toon.yaml +0 -56
  45. taskill-0.1.4/src/taskill/triggers.py +0 -94
  46. {taskill-0.1.4 → taskill-0.1.6}/.gitignore +0 -0
  47. {taskill-0.1.4 → taskill-0.1.6}/.windsurf/workflows/daily-docs-update.md +0 -0
  48. {taskill-0.1.4 → taskill-0.1.6}/LICENSE +0 -0
  49. {taskill-0.1.4 → taskill-0.1.6}/ROADMAP.md +0 -0
  50. {taskill-0.1.4 → taskill-0.1.6}/daily_update.sh +0 -0
  51. {taskill-0.1.4 → taskill-0.1.6}/examples/ansible-playbook.yml +0 -0
  52. {taskill-0.1.4 → taskill-0.1.6}/examples/github-action.yml +0 -0
  53. {taskill-0.1.4 → taskill-0.1.6}/examples/gitlab-ci.yml +0 -0
  54. {taskill-0.1.4 → taskill-0.1.6}/examples/systemd-timer/taskill.service +0 -0
  55. {taskill-0.1.4 → taskill-0.1.6}/examples/systemd-timer/taskill.timer +0 -0
  56. {taskill-0.1.4 → taskill-0.1.6}/goal.yaml +0 -0
  57. {taskill-0.1.4 → taskill-0.1.6}/planfile.yaml +0 -0
  58. {taskill-0.1.4 → taskill-0.1.6}/prefact.yaml +0 -0
  59. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/config.py +0 -0
  60. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/core.py +0 -0
  61. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/git_state.py +0 -0
  62. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/providers/__init__.py +0 -0
  63. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/providers/algorithmic.py +0 -0
  64. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/state.py +0 -0
  65. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/updaters/__init__.py +0 -0
  66. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/updaters/base.py +0 -0
  67. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/updaters/changelog.py +0 -0
  68. {taskill-0.1.4 → taskill-0.1.6}/src/taskill/updaters/readme.py +0 -0
  69. {taskill-0.1.4 → taskill-0.1.6}/taskill.yaml +0 -0
  70. {taskill-0.1.4 → taskill-0.1.6}/testql-scenarios/generated-cli-tests.testql.toon.yaml +0 -0
  71. {taskill-0.1.4 → taskill-0.1.6}/tests/__init__.py +0 -0
  72. {taskill-0.1.4 → taskill-0.1.6}/tests/test_algorithmic.py +0 -0
  73. {taskill-0.1.4 → taskill-0.1.6}/tests/test_bulk.py +0 -0
  74. {taskill-0.1.4 → taskill-0.1.6}/tests/test_config.py +0 -0
  75. {taskill-0.1.4 → taskill-0.1.6}/tests/test_providers.py +0 -0
  76. {taskill-0.1.4 → taskill-0.1.6}/tests/test_triggers.py +0 -0
  77. {taskill-0.1.4 → taskill-0.1.6}/tests/test_updaters.py +0 -0
  78. {taskill-0.1.4 → taskill-0.1.6}/tree.sh +0 -0
  79. {taskill-0.1.4 → taskill-0.1.6}/tree.txt +0 -0
@@ -81,6 +81,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
81
81
  - README: new "Bulk / fleet-wide runs" and "Extending taskill" sections
82
82
  - ROADMAP: marked v0.2.1, v0.2.3, and v0.5 baseline as shipped
83
83
 
84
+ ## [0.1.6] - 2026-04-25
85
+
86
+ ### Docs
87
+ - Update README.md
88
+ - Update SUMD.md
89
+ - Update SUMR.md
90
+ - Update project/README.md
91
+ - Update project/context.md
92
+
93
+ ### Other
94
+ - Update app.doql.less
95
+ - Update project.sh
96
+ - Update project/analysis.toon.yaml
97
+ - Update project/calls.mmd
98
+ - Update project/calls.png
99
+ - Update project/calls.toon.yaml
100
+ - Update project/calls.yaml
101
+ - Update project/compact_flow.mmd
102
+ - Update project/compact_flow.png
103
+ - Update project/duplication.toon.yaml
104
+ - ... and 8 more files
105
+
106
+ ## [0.1.5] - 2026-04-25
107
+
108
+ ### Docs
109
+ - Update README.md
110
+ - Update SUMD.md
111
+ - Update SUMR.md
112
+ - Update TODO.md
113
+
114
+ ### Other
115
+ - Update app.doql.less
116
+ - Update project/analysis.toon.yaml
117
+ - Update project/calls.mmd
118
+ - Update project/calls.png
119
+ - Update project/calls.toon.yaml
120
+ - Update project/calls.yaml
121
+ - Update project/duplication.toon.yaml
122
+ - Update project/index.html
123
+ - Update project/project.toon.yaml
124
+
84
125
  ## [0.1.4] - 2026-04-25
85
126
 
86
127
  ### Docs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskill
3
- Version: 0.1.4
3
+ Version: 0.1.6
4
4
  Summary: Daily project hygiene: keep README / CHANGELOG / TODO in sync with reality. LLM-first, algorithmic fallback.
5
5
  Project-URL: Homepage, https://github.com/oqlos/taskill
6
6
  Project-URL: Issues, https://github.com/oqlos/taskill/issues
@@ -37,11 +37,11 @@ Description-Content-Type: text/markdown
37
37
 
38
38
  ## AI Cost Tracking
39
39
 
40
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.4-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
41
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$0.45-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-3.3h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
40
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.6-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
41
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$0.75-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-4.4h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
42
42
 
43
- - 🤖 **LLM usage:** $0.4500 (3 commits)
44
- - 👤 **Human dev:** ~$333 (3.3h @ $100/h, 30min dedup)
43
+ - 🤖 **LLM usage:** $0.7500 (5 commits)
44
+ - 👤 **Human dev:** ~$439 (4.4h @ $100/h, 30min dedup)
45
45
 
46
46
  Generated on 2026-04-25 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
47
47
 
@@ -81,22 +81,7 @@ Every run produces three (idempotent) edits:
81
81
 
82
82
  1. **`CHANGELOG.md`** — appends new entries under `## [Unreleased]`, grouped by Conventional Commit type (`### Added`, `### Fixed`, `### Performance`, etc.). Uses [Keep a Changelog](https://keepachangelog.com/) layout. Existing entries are deduplicated.
83
83
  2. **`TODO.md`** — moves completed items to a `## Done (moved to CHANGELOG)` section, and appends `TODO:` / `FIXME:` markers found in new commit bodies under `## Discovered`.
84
- 3. **`README.md`** — refreshes only the block between `<!-- taskill:status:start -->
85
-
86
- ## Status
87
-
88
- _Last updated by [taskill](https://github.com/oqlos/taskill) at 2026-04-25 09:23 UTC_
89
-
90
- | Metric | Value |
91
- |---|---|
92
- | HEAD | `4618c29` |
93
- | Coverage | — |
94
- | Failing tests | — |
95
- | Commits in last cycle | 0 |
96
-
97
- > No changes were made to the project since the last taskill run.
98
-
99
- <!-- taskill:status:end -->` markers (HEAD, coverage, failing tests, summary). Never touches the rest of the file.
84
+ 3. **`README.md`** — refreshes only the block between `<!-- taskill:status:start -->` and `<!-- taskill:status:end -->` markers (HEAD, coverage, failing tests, summary). Never touches the rest of the file.
100
85
 
101
86
  ## Provider chain
102
87
 
@@ -342,10 +327,6 @@ SUMR (state) ───────┘
342
327
  Licensed under Apache-2.0.
343
328
  ## Status
344
329
 
345
- <!-- taskill:status:start -->
346
-
347
- ## Status
348
-
349
330
  _Last updated by [taskill](https://github.com/oqlos/taskill) at 2026-04-25 09:23 UTC_
350
331
 
351
332
  | Metric | Value |
@@ -3,11 +3,11 @@
3
3
 
4
4
  ## AI Cost Tracking
5
5
 
6
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.4-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
7
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$0.45-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-3.3h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
6
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.6-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
7
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$0.75-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-4.4h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fqwen%2Fqwen3--coder--next-lightgrey)
8
8
 
9
- - 🤖 **LLM usage:** $0.4500 (3 commits)
10
- - 👤 **Human dev:** ~$333 (3.3h @ $100/h, 30min dedup)
9
+ - 🤖 **LLM usage:** $0.7500 (5 commits)
10
+ - 👤 **Human dev:** ~$439 (4.4h @ $100/h, 30min dedup)
11
11
 
12
12
  Generated on 2026-04-25 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)
13
13
 
@@ -47,22 +47,7 @@ Every run produces three (idempotent) edits:
47
47
 
48
48
  1. **`CHANGELOG.md`** — appends new entries under `## [Unreleased]`, grouped by Conventional Commit type (`### Added`, `### Fixed`, `### Performance`, etc.). Uses [Keep a Changelog](https://keepachangelog.com/) layout. Existing entries are deduplicated.
49
49
  2. **`TODO.md`** — moves completed items to a `## Done (moved to CHANGELOG)` section, and appends `TODO:` / `FIXME:` markers found in new commit bodies under `## Discovered`.
50
- 3. **`README.md`** — refreshes only the block between `<!-- taskill:status:start -->
51
-
52
- ## Status
53
-
54
- _Last updated by [taskill](https://github.com/oqlos/taskill) at 2026-04-25 09:23 UTC_
55
-
56
- | Metric | Value |
57
- |---|---|
58
- | HEAD | `4618c29` |
59
- | Coverage | — |
60
- | Failing tests | — |
61
- | Commits in last cycle | 0 |
62
-
63
- > No changes were made to the project since the last taskill run.
64
-
65
- <!-- taskill:status:end -->` markers (HEAD, coverage, failing tests, summary). Never touches the rest of the file.
50
+ 3. **`README.md`** — refreshes only the block between `<!-- taskill:status:start -->` and `<!-- taskill:status:end -->` markers (HEAD, coverage, failing tests, summary). Never touches the rest of the file.
66
51
 
67
52
  ## Provider chain
68
53
 
@@ -308,10 +293,6 @@ SUMR (state) ───────┘
308
293
  Licensed under Apache-2.0.
309
294
  ## Status
310
295
 
311
- <!-- taskill:status:start -->
312
-
313
- ## Status
314
-
315
296
  _Last updated by [taskill](https://github.com/oqlos/taskill) at 2026-04-25 09:23 UTC_
316
297
 
317
298
  | Metric | Value |
@@ -20,7 +20,7 @@ Daily project hygiene: keep README / CHANGELOG / TODO in sync with reality. LLM-
20
20
  ## Metadata
21
21
 
22
22
  - **name**: `taskill`
23
- - **version**: `0.1.3`
23
+ - **version**: `0.1.5`
24
24
  - **python_requires**: `>=3.10`
25
25
  - **license**: Apache-2.0
26
26
  - **ai_model**: `openrouter/qwen/qwen3-coder-next`
@@ -40,7 +40,7 @@ SUMD (description) → DOQL/source (code) → taskfile (automation) → testql (
40
40
 
41
41
  app {
42
42
  name: taskill;
43
- version: 0.1.3;
43
+ version: 0.1.5;
44
44
  }
45
45
 
46
46
  dependencies {
@@ -100,7 +100,7 @@ LOG[3]{message}:
100
100
  ```yaml
101
101
  project:
102
102
  name: taskill
103
- version: 0.1.3
103
+ version: 0.1.5
104
104
  env: local
105
105
  ```
106
106
 
@@ -166,10 +166,10 @@ pip install -e .[dev]
166
166
  ### `project/map.toon.yaml`
167
167
 
168
168
  ```toon markpact:analysis path=project/map.toon.yaml
169
- # taskill | 29f 3286L | python:25,shell:3,less:1 | 2026-04-25
170
- # stats: 102 func | 22 cls | 29 mod | CC̄=3.9 | critical:5 | cycles:0
171
- # alerts[5]: CC evaluate=21; CC bulk_run=17; CC bulk_run_cmd=17; CC run=16; CC status=11
172
- # hotspots[5]: bulk_run fan=18; bulk_run_cmd fan=17; run fan=16; status fan=12; load_config fan=12
169
+ # taskill | 29f 3338L | python:25,shell:3,less:1 | 2026-04-25
170
+ # stats: 115 func | 22 cls | 29 mod | CC̄=3.6 | critical:4 | cycles:0
171
+ # alerts[5]: CC _print_bulk_table=13; CC _apply_filters=12; CC _print_run_result=12; CC status=11; CC _scan=9
172
+ # hotspots[5]: bulk_run fan=13; status fan=12; load_config fan=12; run fan=10; bulk_run_cmd fan=10
173
173
  # evolution: baseline
174
174
  # Keys: M=modules, D=details, i=imports, e=exports, c=classes, f=functions, m=methods
175
175
  M[29]:
@@ -177,23 +177,23 @@ M[29]:
177
177
  daily_update.sh,94
178
178
  project.sh,47
179
179
  src/taskill/__init__.py,31
180
- src/taskill/bulk.py,250
181
- src/taskill/cli.py,348
180
+ src/taskill/bulk.py,262
181
+ src/taskill/cli.py,357
182
182
  src/taskill/config.py,171
183
183
  src/taskill/core.py,212
184
184
  src/taskill/git_state.py,148
185
185
  src/taskill/providers/__init__.py,76
186
186
  src/taskill/providers/algorithmic.py,156
187
- src/taskill/providers/base.py,106
188
- src/taskill/providers/openrouter.py,115
189
- src/taskill/providers/windsurf_mcp.py,136
187
+ src/taskill/providers/base.py,127
188
+ src/taskill/providers/openrouter.py,96
189
+ src/taskill/providers/windsurf_mcp.py,135
190
190
  src/taskill/state.py,43
191
- src/taskill/triggers.py,95
191
+ src/taskill/triggers.py,111
192
192
  src/taskill/updaters/__init__.py,60
193
193
  src/taskill/updaters/base.py,45
194
194
  src/taskill/updaters/changelog.py,120
195
195
  src/taskill/updaters/readme.py,100
196
- src/taskill/updaters/todo.py,114
196
+ src/taskill/updaters/todo.py,128
197
197
  tests/__init__.py,1
198
198
  tests/test_algorithmic.py,94
199
199
  tests/test_bulk.py,280
@@ -205,21 +205,26 @@ M[29]:
205
205
  D:
206
206
  src/taskill/__init__.py:
207
207
  src/taskill/bulk.py:
208
- e: find_repos,_scan,resolve_repo_config,_rebase_config,bulk_run,BulkResult
208
+ e: find_repos,_scan,resolve_repo_config,_rebase_config,_load_shared_config,_apply_filters,_run_single_repo,bulk_run,BulkResult
209
209
  BulkResult: total_repos(0),ran_count(0),changed_count(0),as_dict(0),summary(0) # Aggregate result of running taskill across multiple repos.
210
210
  find_repos(root;max_depth)
211
211
  _scan(directory;repos;depth;max_depth)
212
212
  resolve_repo_config(repo;shared_config)
213
213
  _rebase_config(base;new_root)
214
+ _load_shared_config(shared_config)
215
+ _apply_filters(repos;repo_filter;max_projects)
216
+ _run_single_repo(repo;shared_cfg;force;dry_run)
214
217
  bulk_run(root;shared_config)
215
218
  src/taskill/cli.py:
216
- e: _setup_logging,main,run,status,init,release,bulk_run_cmd,clean_todo
219
+ e: _setup_logging,main,_print_run_result,run,status,init,release,_print_bulk_table,bulk_run_cmd,clean_todo
217
220
  _setup_logging(verbose)
218
221
  main(ctx;verbose;config)
222
+ _print_run_result(result)
219
223
  run(ctx;force;dry_run;as_json)
220
224
  status(ctx;as_json)
221
225
  init(force)
222
226
  release(version;changelog)
227
+ _print_bulk_table(result)
223
228
  bulk_run_cmd(root;shared_config;max_depth;max_projects;force;dry_run;as_json;repo_filter)
224
229
  clean_todo(todo)
225
230
  src/taskill/config.py:
@@ -253,14 +258,15 @@ D:
253
258
  e: AlgorithmicProvider
254
259
  AlgorithmicProvider: is_available(0),generate(1),_format_commit(1),_find_completed_todos(2),_extract_new_todos(1)
255
260
  src/taskill/providers/base.py:
256
- e: build_user_prompt,ProviderError,GeneratedDocs,Provider
261
+ e: build_user_prompt,parse_json_loosely,ProviderError,GeneratedDocs,Provider
257
262
  ProviderError: # Provider failed — chain falls through to next provider.
258
263
  GeneratedDocs: __post_init__(0) # What every provider returns.
259
264
  Provider: __init__(1),is_available(0),generate(1) # Abstract provider — produces docs from a project snapshot.
260
265
  build_user_prompt(context)
266
+ parse_json_loosely(text)
261
267
  src/taskill/providers/openrouter.py:
262
268
  e: _normalize_model,OpenRouterProvider
263
- OpenRouterProvider: is_available(0),generate(1),_parse_json_loosely(1)
269
+ OpenRouterProvider: is_available(0),generate(1)
264
270
  _normalize_model(model)
265
271
  src/taskill/providers/windsurf_mcp.py:
266
272
  e: _mcp_lib_present,_candidate_endpoints,WindsurfMcpProvider
@@ -273,8 +279,15 @@ D:
273
279
  load_state(path)
274
280
  save_state(path;state)
275
281
  src/taskill/triggers.py:
276
- e: evaluate,TriggerEvaluation
282
+ e: _check_time,_check_commits,_check_changed_files,_check_coverage,_check_failed_tests,_check_sumd,_check_watched_files,evaluate,TriggerEvaluation
277
283
  TriggerEvaluation: summary(0)
284
+ _check_time(state;triggers;reasons;skipped)
285
+ _check_commits(snapshot;triggers;reasons;skipped)
286
+ _check_changed_files(snapshot;triggers;reasons;skipped)
287
+ _check_coverage(snapshot;state;triggers;reasons;skipped)
288
+ _check_failed_tests(snapshot;state;triggers;reasons)
289
+ _check_sumd(snapshot;state;reasons)
290
+ _check_watched_files(triggers;state;project_root;reasons)
278
291
  evaluate(triggers;state;snapshot;project_root)
279
292
  src/taskill/updaters/__init__.py:
280
293
  e: discover_updaters
@@ -295,7 +308,7 @@ D:
295
308
  update_readme(path;snapshot;summary)
296
309
  src/taskill/updaters/todo.py:
297
310
  e: update_todo,empty_todo,TodoUpdater
298
- TodoUpdater: apply(3),_update_todo(3) # Updater for TODO.md files.
311
+ TodoUpdater: apply(3),_partition_lines(2),_dedup_new_items(2),_assemble_output(3),_update_todo(3) # Updater for TODO.md files.
299
312
  update_todo(path;completed_lines;new_items)
300
313
  empty_todo(path;header)
301
314
  tests/__init__.py:
@@ -379,82 +392,94 @@ D:
379
392
 
380
393
  ## Call Graph
381
394
 
382
- *43 nodes · 35 edges · 13 modules · CC̄=2.0*
395
+ *57 nodes · 50 edges · 14 modules · CC̄=1.9*
383
396
 
384
397
  ### Hubs (by degree)
385
398
 
386
399
  | Function | CC | in | out | total |
387
400
  |----------|----|----|-----|-------|
388
401
  | `load_config` *(in src.taskill.config)* | 8 | 6 | 35 | **41** |
389
- | `bulk_run_cmd` *(in src.taskill.cli)* | 17 ⚠ | 0 | 38 | **38** |
390
- | `run` *(in src.taskill.cli)* | 16 ⚠ | 0 | 32 | **32** |
391
402
  | `generate` *(in src.taskill.providers.windsurf_mcp.WindsurfMcpProvider)* | 7 | 0 | 32 | **32** |
392
403
  | `generate` *(in src.taskill.providers.openrouter.OpenRouterProvider)* | 6 | 0 | 27 | **27** |
393
- | `bulk_run` *(in src.taskill.bulk)* | 17 ⚠ | 1 | 26 | **27** |
394
- | `evaluate` *(in src.taskill.triggers)* | 21 ⚠ | 2 | 23 | **25** |
395
404
  | `status` *(in src.taskill.cli)* | 11 ⚠ | 0 | 25 | **25** |
405
+ | `_print_run_result` *(in src.taskill.cli)* | 12 ⚠ | 1 | 20 | **21** |
406
+ | `run` *(in src.taskill.core.Taskill)* | 11 ⚠ | 0 | 20 | **20** |
407
+ | `bulk_run_cmd` *(in src.taskill.cli)* | 5 | 0 | 20 | **20** |
408
+ | `collect_snapshot` *(in src.taskill.git_state)* | 3 | 1 | 13 | **14** |
396
409
 
397
410
  ```toon markpact:analysis path=project/calls.toon.yaml
398
411
  # code2llm call graph | /home/tom/github/semcod/taskill
399
- # nodes: 43 | edges: 35 | modules: 13
400
- # CC̄=2.0
412
+ # nodes: 57 | edges: 50 | modules: 14
413
+ # CC̄=1.9
401
414
 
402
415
  HUBS[20]:
403
416
  src.taskill.config.load_config
404
417
  CC=8 in:6 out:35 total:41
405
- src.taskill.cli.bulk_run_cmd
406
- CC=17 in:0 out:38 total:38
407
- src.taskill.cli.run
408
- CC=16 in:0 out:32 total:32
409
418
  src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.generate
410
419
  CC=7 in:0 out:32 total:32
411
420
  src.taskill.providers.openrouter.OpenRouterProvider.generate
412
421
  CC=6 in:0 out:27 total:27
413
- src.taskill.bulk.bulk_run
414
- CC=17 in:1 out:26 total:27
415
- src.taskill.triggers.evaluate
416
- CC=21 in:2 out:23 total:25
417
422
  src.taskill.cli.status
418
423
  CC=11 in:0 out:25 total:25
424
+ src.taskill.cli._print_run_result
425
+ CC=12 in:1 out:20 total:21
419
426
  src.taskill.core.Taskill.run
420
427
  CC=11 in:0 out:20 total:20
428
+ src.taskill.cli.bulk_run_cmd
429
+ CC=5 in:0 out:20 total:20
421
430
  src.taskill.git_state.collect_snapshot
422
431
  CC=3 in:1 out:13 total:14
432
+ src.taskill.bulk.bulk_run
433
+ CC=3 in:0 out:14 total:14
434
+ src.taskill.cli.run
435
+ CC=6 in:0 out:13 total:13
423
436
  src.taskill.core.Taskill._apply
424
437
  CC=4 in:0 out:12 total:12
425
438
  src.taskill.git_state.read_coverage
426
439
  CC=7 in:1 out:11 total:12
427
440
  src.taskill.updaters.readme.ReadmeUpdater._update_readme
428
441
  CC=6 in:0 out:11 total:11
429
- src.taskill.providers.windsurf_mcp._candidate_endpoints
430
- CC=5 in:2 out:7 total:9
442
+ src.taskill.triggers.evaluate
443
+ CC=3 in:0 out:10 total:10
444
+ src.taskill.git_state.read_failed_tests
445
+ CC=5 in:1 out:8 total:9
431
446
  src.taskill.bulk._scan
432
447
  CC=9 in:2 out:7 total:9
433
448
  src.taskill.git_state.commits_since
434
449
  CC=7 in:1 out:8 total:9
435
- src.taskill.git_state.read_failed_tests
436
- CC=5 in:1 out:8 total:9
450
+ src.taskill.bulk._apply_filters
451
+ CC=12 in:1 out:8 total:9
437
452
  src.taskill.cli.release
438
453
  CC=2 in:0 out:8 total:8
439
- src.taskill.providers.discover_providers
440
- CC=6 in:1 out:7 total:8
441
- src.taskill.state.load_state
442
- CC=3 in:1 out:6 total:7
454
+ src.taskill.providers.base.parse_json_loosely
455
+ CC=4 in:2 out:6 total:8
443
456
 
444
457
  MODULES:
445
- src.taskill.bulk [5 funcs]
458
+ project.map.toon [7 funcs]
459
+ _candidate_endpoints CC=0 out:0
460
+ _mcp_lib_present CC=0 out:0
461
+ _normalize_model CC=0 out:0
462
+ bulk_run CC=0 out:0
463
+ empty_todo CC=0 out:0
464
+ evaluate CC=0 out:0
465
+ update_todo CC=0 out:0
466
+ src.taskill.bulk [8 funcs]
467
+ _apply_filters CC=12 out:8
468
+ _load_shared_config CC=4 out:5
446
469
  _rebase_config CC=1 out:3
470
+ _run_single_repo CC=2 out:3
447
471
  _scan CC=9 out:7
448
- bulk_run CC=17 out:26
472
+ bulk_run CC=3 out:14
449
473
  find_repos CC=2 out:5
450
474
  resolve_repo_config CC=4 out:4
451
- src.taskill.cli [7 funcs]
475
+ src.taskill.cli [8 funcs]
476
+ _print_run_result CC=12 out:20
452
477
  _setup_logging CC=2 out:1
453
- bulk_run_cmd CC=17 out:38
478
+ bulk_run_cmd CC=5 out:20
454
479
  clean_todo CC=1 out:6
455
480
  main CC=1 out:6
456
481
  release CC=2 out:8
457
- run CC=16 out:32
482
+ run CC=6 out:13
458
483
  status CC=11 out:25
459
484
  src.taskill.config [1 funcs]
460
485
  load_config CC=8 out:35
@@ -476,18 +501,24 @@ MODULES:
476
501
  src.taskill.providers [2 funcs]
477
502
  build_chain CC=4 out:4
478
503
  discover_providers CC=6 out:7
479
- src.taskill.providers.openrouter [2 funcs]
504
+ src.taskill.providers.base [1 funcs]
505
+ parse_json_loosely CC=4 out:6
506
+ src.taskill.providers.openrouter [1 funcs]
480
507
  generate CC=6 out:27
481
- _normalize_model CC=2 out:2
482
- src.taskill.providers.windsurf_mcp [4 funcs]
508
+ src.taskill.providers.windsurf_mcp [2 funcs]
483
509
  generate CC=7 out:32
484
510
  is_available CC=2 out:3
485
- _candidate_endpoints CC=5 out:7
486
- _mcp_lib_present CC=2 out:0
487
511
  src.taskill.state [1 funcs]
488
512
  load_state CC=3 out:6
489
- src.taskill.triggers [1 funcs]
490
- evaluate CC=21 out:23
513
+ src.taskill.triggers [8 funcs]
514
+ _check_changed_files CC=2 out:3
515
+ _check_commits CC=2 out:3
516
+ _check_coverage CC=5 out:3
517
+ _check_failed_tests CC=5 out:1
518
+ _check_sumd CC=3 out:1
519
+ _check_time CC=3 out:5
520
+ _check_watched_files CC=5 out:4
521
+ evaluate CC=3 out:10
491
522
  src.taskill.updaters.changelog [2 funcs]
492
523
  release_unreleased CC=4 out:6
493
524
  update_changelog CC=1 out:2
@@ -495,17 +526,8 @@ MODULES:
495
526
  _update_readme CC=6 out:11
496
527
  render_status_block CC=6 out:5
497
528
  update_readme CC=1 out:2
498
- src.taskill.updaters.todo [2 funcs]
499
- empty_todo CC=1 out:1
500
- update_todo CC=1 out:2
501
529
 
502
530
  EDGES:
503
- src.taskill.cli.main → src.taskill.cli._setup_logging
504
- src.taskill.cli.run → src.taskill.config.load_config
505
- src.taskill.cli.status → src.taskill.config.load_config
506
- src.taskill.cli.release → src.taskill.updaters.changelog.release_unreleased
507
- src.taskill.cli.bulk_run_cmd → src.taskill.bulk.bulk_run
508
- src.taskill.cli.clean_todo → src.taskill.updaters.todo.empty_todo
509
531
  src.taskill.git_state.head_sha → src.taskill.git_state._run
510
532
  src.taskill.git_state.commits_since → src.taskill.git_state._run
511
533
  src.taskill.git_state.changed_files_since → src.taskill.git_state._run
@@ -517,24 +539,45 @@ EDGES:
517
539
  src.taskill.git_state.collect_snapshot → src.taskill.git_state.file_hash
518
540
  src.taskill.core.Taskill.__init__ → src.taskill.state.load_state
519
541
  src.taskill.core.Taskill.__init__ → src.taskill.config.load_config
520
- src.taskill.core.Taskill.run → src.taskill.triggers.evaluate
542
+ src.taskill.core.Taskill.run → project.map.toon.evaluate
521
543
  src.taskill.core.Taskill.run → src.taskill.providers.build_chain
522
- src.taskill.core.Taskill.status → src.taskill.triggers.evaluate
544
+ src.taskill.core.Taskill.status → project.map.toon.evaluate
523
545
  src.taskill.core.Taskill._snapshot → src.taskill.git_state.collect_snapshot
524
546
  src.taskill.core.Taskill._apply → src.taskill.updaters.changelog.update_changelog
525
- src.taskill.core.Taskill._apply → src.taskill.updaters.todo.update_todo
547
+ src.taskill.core.Taskill._apply → project.map.toon.update_todo
526
548
  src.taskill.core.Taskill._apply → src.taskill.updaters.readme.update_readme
549
+ src.taskill.updaters.readme.ReadmeUpdater._update_readme → src.taskill.updaters.readme.render_status_block
550
+ src.taskill.providers.build_chain → src.taskill.providers.discover_providers
551
+ src.taskill.providers.openrouter.OpenRouterProvider.generate → project.map.toon._normalize_model
552
+ src.taskill.providers.openrouter.OpenRouterProvider.generate → src.taskill.providers.base.parse_json_loosely
553
+ src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.is_available → project.map.toon._mcp_lib_present
554
+ src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.is_available → project.map.toon._candidate_endpoints
555
+ src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.generate → project.map.toon._candidate_endpoints
556
+ src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.generate → src.taskill.providers.base.parse_json_loosely
557
+ src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.generate → project.map.toon._mcp_lib_present
558
+ src.taskill.triggers.evaluate → src.taskill.triggers._check_time
559
+ src.taskill.triggers.evaluate → src.taskill.triggers._check_commits
560
+ src.taskill.triggers.evaluate → src.taskill.triggers._check_changed_files
561
+ src.taskill.triggers.evaluate → src.taskill.triggers._check_coverage
562
+ src.taskill.triggers.evaluate → src.taskill.triggers._check_failed_tests
563
+ src.taskill.triggers.evaluate → src.taskill.triggers._check_sumd
564
+ src.taskill.triggers.evaluate → src.taskill.triggers._check_watched_files
527
565
  src.taskill.bulk.find_repos → src.taskill.bulk._scan
528
566
  src.taskill.bulk.resolve_repo_config → src.taskill.config.load_config
529
567
  src.taskill.bulk.resolve_repo_config → src.taskill.bulk._rebase_config
568
+ src.taskill.bulk._load_shared_config → src.taskill.config.load_config
569
+ src.taskill.bulk._run_single_repo → src.taskill.bulk.resolve_repo_config
570
+ src.taskill.bulk.bulk_run → src.taskill.bulk._load_shared_config
530
571
  src.taskill.bulk.bulk_run → src.taskill.bulk.find_repos
531
- src.taskill.updaters.readme.ReadmeUpdater._update_readme → src.taskill.updaters.readme.render_status_block
532
- src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.is_available → src.taskill.providers.windsurf_mcp._mcp_lib_present
533
- src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.is_available → src.taskill.providers.windsurf_mcp._candidate_endpoints
534
- src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.generate → src.taskill.providers.windsurf_mcp._candidate_endpoints
535
- src.taskill.providers.windsurf_mcp.WindsurfMcpProvider.generate → src.taskill.providers.windsurf_mcp._mcp_lib_present
536
- src.taskill.providers.openrouter.OpenRouterProvider.generate → src.taskill.providers.openrouter._normalize_model
537
- src.taskill.providers.build_chain → src.taskill.providers.discover_providers
572
+ src.taskill.bulk.bulk_run → src.taskill.bulk._apply_filters
573
+ src.taskill.bulk.bulk_run → src.taskill.bulk._run_single_repo
574
+ src.taskill.cli.main → src.taskill.cli._setup_logging
575
+ src.taskill.cli.run → src.taskill.config.load_config
576
+ src.taskill.cli.run → src.taskill.cli._print_run_result
577
+ src.taskill.cli.status → src.taskill.config.load_config
578
+ src.taskill.cli.release → src.taskill.updaters.changelog.release_unreleased
579
+ src.taskill.cli.bulk_run_cmd → project.map.toon.bulk_run
580
+ src.taskill.cli.clean_todo → project.map.toon.empty_todo
538
581
  ```
539
582
 
540
583
  ## Test Contracts