tasks-toolkit 0.1.3__py3-none-any.whl

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 (65) hide show
  1. scripts/__init__.py +0 -0
  2. scripts/agents_sync.py +61 -0
  3. scripts/apply-plan.sh +51 -0
  4. scripts/build.sh +7 -0
  5. scripts/codex-task.sh +198 -0
  6. scripts/install-hooks.sh +9 -0
  7. scripts/junie-status.sh +52 -0
  8. scripts/junie-task.sh +183 -0
  9. scripts/kilo-task.sh +226 -0
  10. scripts/needs-dotnet-checks.sh +24 -0
  11. scripts/plan-sprint.sh +92 -0
  12. scripts/run-task.sh +79 -0
  13. scripts/run.sh +7 -0
  14. scripts/run_stats.py +141 -0
  15. scripts/run_summary.py +94 -0
  16. scripts/spec-lint.sh +139 -0
  17. scripts/sprint-auto.sh +79 -0
  18. scripts/sprint_auto_execute.py +160 -0
  19. scripts/sprint_auto_preflight.py +309 -0
  20. scripts/sprint_auto_prepare.py +271 -0
  21. scripts/sprint_auto_resume.py +153 -0
  22. scripts/sprint_auto_state.py +191 -0
  23. scripts/sprint_plan.py +238 -0
  24. scripts/task-report.sh +45 -0
  25. scripts/tasks.py +1813 -0
  26. scripts/tasks_cli.py +14 -0
  27. scripts/tasks_commands.py +11 -0
  28. scripts/tasks_init.py +140 -0
  29. scripts/tasks_mcp.py +309 -0
  30. scripts/tasks_model.py +173 -0
  31. scripts/tasks_plan_import.py +269 -0
  32. scripts/tasks_render.py +148 -0
  33. scripts/tasks_storage.py +373 -0
  34. scripts/tasks_watch.py +159 -0
  35. scripts/test.sh +43 -0
  36. scripts/test_agent_config.py +97 -0
  37. scripts/test_plan_sprint.sh +172 -0
  38. scripts/test_python_fast.sh +26 -0
  39. scripts/test_python_lint.sh +22 -0
  40. scripts/test_python_slow.sh +14 -0
  41. scripts/test_run_stats.py +64 -0
  42. scripts/test_runners.sh +588 -0
  43. scripts/test_spec_lint.sh +438 -0
  44. scripts/test_sprint_auto.py +50 -0
  45. scripts/test_sprint_auto_execute.py +112 -0
  46. scripts/test_sprint_auto_preflight.py +143 -0
  47. scripts/test_sprint_auto_prepare.py +150 -0
  48. scripts/test_sprint_auto_resume.py +104 -0
  49. scripts/test_sprint_auto_state.py +157 -0
  50. scripts/test_tasks.py +1678 -0
  51. scripts/test_tasks_mcp.py +233 -0
  52. scripts/test_tasks_plan_import.py +129 -0
  53. scripts/test_tasks_storage.py +67 -0
  54. scripts/test_tasks_watch.py +239 -0
  55. scripts/test_worktree.sh +2112 -0
  56. scripts/worktree.sh +992 -0
  57. scripts/worktree_mr.py +133 -0
  58. scripts/worktree_path.py +70 -0
  59. scripts/worktree_sprint.py +70 -0
  60. tasks_toolkit-0.1.3.dist-info/METADATA +121 -0
  61. tasks_toolkit-0.1.3.dist-info/RECORD +65 -0
  62. tasks_toolkit-0.1.3.dist-info/WHEEL +5 -0
  63. tasks_toolkit-0.1.3.dist-info/entry_points.txt +4 -0
  64. tasks_toolkit-0.1.3.dist-info/licenses/LICENSE +21 -0
  65. tasks_toolkit-0.1.3.dist-info/top_level.txt +1 -0
scripts/worktree_mr.py ADDED
@@ -0,0 +1,133 @@
1
+ """Worktree MR, merge and accept — thin Python wrapper delegating to worktree.sh.
2
+
3
+ Provides a Python interface for new, commit, patch, mr, merge, accept, remove.
4
+ """
5
+ from __future__ import annotations
6
+
7
+ import subprocess
8
+ import sys
9
+ from pathlib import Path
10
+
11
+
12
+ def run_worktree(root: Path, *args: str) -> tuple[int, str, str]:
13
+ """Run a worktree.sh command; return (exit_code, stdout, stderr)."""
14
+ try:
15
+ r = subprocess.run(
16
+ ["bash", str(root / "scripts" / "worktree.sh"), *args],
17
+ capture_output=True, text=True, timeout=300, cwd=str(root),
18
+ )
19
+ return r.returncode, r.stdout, r.stderr
20
+ except (OSError, subprocess.TimeoutExpired) as exc:
21
+ return 1, "", str(exc)
22
+
23
+
24
+ def new_task(root: Path, name: str, task_id: str = "") -> tuple[int, str, str]:
25
+ args = ["new", name]
26
+ if task_id:
27
+ args += ["--task-id", task_id]
28
+ return run_worktree(root, *args)
29
+
30
+
31
+ def commit_task(root: Path, name: str, runner: str = "codex", model: str = "",
32
+ task_id: str = "", title: str = "") -> tuple[int, str, str]:
33
+ args = ["commit", name, "--runner", runner]
34
+ if model:
35
+ args += ["--model", model]
36
+ if task_id:
37
+ args += ["--task-id", task_id]
38
+ if title:
39
+ args += ["--title", title]
40
+ return run_worktree(root, *args)
41
+
42
+
43
+ def create_mr(root: Path, name: str, remote: bool = False) -> tuple[int, str, str]:
44
+ args = ["mr", name]
45
+ if remote:
46
+ args.append("--remote")
47
+ return run_worktree(root, *args)
48
+
49
+
50
+ def merge_task(root: Path, name: str, accept_flags: bool = False, auto: bool = False) -> tuple[int, str, str]:
51
+ args = ["merge", name]
52
+ if accept_flags:
53
+ args.append("--accept-flags")
54
+ if auto:
55
+ args.append("--auto")
56
+ return run_worktree(root, *args)
57
+
58
+
59
+ def accept_task(root: Path, name: str, links_only: bool = False, task_id: str = "") -> tuple[int, str, str]:
60
+ args = ["accept", name]
61
+ if links_only:
62
+ args.append("--links-only")
63
+ if task_id:
64
+ args += ["--task-id", task_id]
65
+ return run_worktree(root, *args)
66
+
67
+
68
+ def remove_task(root: Path, name: str) -> tuple[int, str, str]:
69
+ return run_worktree(root, "remove", name)
70
+
71
+
72
+ def abandon_task(root: Path, name: str) -> tuple[int, str, str]:
73
+ return run_worktree(root, "abandon", name)
74
+
75
+
76
+ def main() -> int:
77
+ import argparse
78
+ parser = argparse.ArgumentParser(description="Worktree MR, merge and accept")
79
+ sub = parser.add_subparsers(dest="command")
80
+ n = sub.add_parser("new")
81
+ n.add_argument("name")
82
+ n.add_argument("--task-id", default="")
83
+ c = sub.add_parser("commit")
84
+ c.add_argument("name")
85
+ c.add_argument("--runner", default="codex")
86
+ c.add_argument("--model", default="")
87
+ c.add_argument("--task-id", default="")
88
+ c.add_argument("--title", default="")
89
+ m = sub.add_parser("mr")
90
+ m.add_argument("name")
91
+ m.add_argument("--remote", action="store_true")
92
+ mg = sub.add_parser("merge")
93
+ mg.add_argument("name")
94
+ mg.add_argument("--accept-flags", action="store_true")
95
+ mg.add_argument("--auto", action="store_true")
96
+ a = sub.add_parser("accept")
97
+ a.add_argument("name")
98
+ a.add_argument("--links-only", action="store_true")
99
+ a.add_argument("--task-id", default="")
100
+ r = sub.add_parser("remove")
101
+ r.add_argument("name")
102
+ ab = sub.add_parser("abandon")
103
+ ab.add_argument("name")
104
+ args = parser.parse_args()
105
+
106
+ root = Path(".").resolve()
107
+ if args.command == "new":
108
+ rc, out, err = new_task(root, args.name, args.task_id)
109
+ elif args.command == "commit":
110
+ rc, out, err = commit_task(root, args.name, args.runner, args.model, args.task_id, args.title)
111
+ elif args.command == "mr":
112
+ rc, out, err = create_mr(root, args.name, args.remote)
113
+ elif args.command == "merge":
114
+ rc, out, err = merge_task(root, args.name, args.accept_flags, args.auto)
115
+ elif args.command == "accept":
116
+ rc, out, err = accept_task(root, args.name, args.links_only, args.task_id)
117
+ elif args.command == "remove":
118
+ rc, out, err = remove_task(root, args.name)
119
+ elif args.command == "abandon":
120
+ rc, out, err = abandon_task(root, args.name)
121
+ else:
122
+ parser.print_help()
123
+ return 1
124
+ if out:
125
+ print(out)
126
+ if err:
127
+ print(err, file=__import__("sys").stderr)
128
+ return rc
129
+
130
+
131
+ if __name__ == "__main__":
132
+ import sys
133
+ sys.exit(main())
@@ -0,0 +1,70 @@
1
+ """Path validation for worktree.sh (extracted to Python for testability).
2
+
3
+ Thin wrapper that delegates to worktree.sh's bash implementation.
4
+ """
5
+ from __future__ import annotations
6
+
7
+ import subprocess
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ GENERATED_PATHS = [
12
+ "tasks/tasks.snapshot.json",
13
+ "tasks/README.md",
14
+ "tasks/sprint-*.md",
15
+ "TASKS.md",
16
+ ]
17
+
18
+
19
+ def is_generated_path(p: str) -> bool:
20
+ """Check if a path matches a generated file pattern."""
21
+ import fnmatch
22
+ for gp in GENERATED_PATHS:
23
+ if fnmatch.fnmatch(p, gp):
24
+ return True
25
+ return False
26
+
27
+
28
+ def path_ok(p: str) -> tuple[bool, str]:
29
+ """Validate a repo-relative path. Returns (ok, reason)."""
30
+ if not p:
31
+ return False, "empty path"
32
+ import re
33
+ if re.search(r"[^A-Za-z0-9._/\-]", p):
34
+ return False, f"path '{p}' contains forbidden characters"
35
+ if p.startswith("/"):
36
+ return False, f"path '{p}' must not start with /"
37
+ segments = p.split("/")
38
+ for seg in segments:
39
+ if not seg:
40
+ return False, f"path '{p}' contains empty segment (//)"
41
+ if seg == "..":
42
+ return False, f"path '{p}' contains '..' segment"
43
+ if seg.startswith("-"):
44
+ return False, f"path '{p}' has segment starting with '-': {seg}"
45
+ for d in (".git", ".githooks", ".claude", ".junie", ".kilo", "tmp"):
46
+ if p == d or p.startswith(d + "/") or ("/" + d + "/") in ("/" + p + "/") or p.endswith("/" + d):
47
+ return False, f"path '{p}' is inside protected directory {d}/"
48
+ for f in ("kilo.json", ".mcp.json", "tasks/tasks.db", "tasks/.lock"):
49
+ if p == f:
50
+ return False, f"path '{p}' is a protected file"
51
+ if is_generated_path(p):
52
+ return False, f"path '{p}' is a generated file"
53
+ return True, "ok"
54
+
55
+
56
+ def main() -> int:
57
+ import argparse
58
+ parser = argparse.ArgumentParser(description="Path validation for worktree")
59
+ parser.add_argument("--check", required=True, help="Path to validate")
60
+ args = parser.parse_args()
61
+ ok, reason = path_ok(args.check)
62
+ if ok:
63
+ print("path-ok")
64
+ return 0
65
+ print(reason, file=sys.stderr)
66
+ return 1
67
+
68
+
69
+ if __name__ == "__main__":
70
+ sys.exit(main())
@@ -0,0 +1,70 @@
1
+ """Worktree sprint lifecycle — thin Python wrapper delegating to worktree.sh.
2
+
3
+ Provides a Python interface for sprint start/status/finish/run.
4
+ """
5
+ from __future__ import annotations
6
+
7
+ import subprocess
8
+ import sys
9
+ from pathlib import Path
10
+
11
+
12
+ def run_worktree(root: Path, *args: str) -> tuple[int, str, str]:
13
+ """Run a worktree.sh command; return (exit_code, stdout, stderr)."""
14
+ try:
15
+ r = subprocess.run(
16
+ ["bash", str(root / "scripts" / "worktree.sh"), *args],
17
+ capture_output=True, text=True, timeout=300, cwd=str(root),
18
+ )
19
+ return r.returncode, r.stdout, r.stderr
20
+ except (OSError, subprocess.TimeoutExpired) as exc:
21
+ return 1, "", str(exc)
22
+
23
+
24
+ def sprint_start(root: Path, n: int, slug: str, base: str = "main") -> tuple[int, str, str]:
25
+ return run_worktree(root, "sprint", "start", str(n), slug, "--from", base)
26
+
27
+
28
+ def sprint_status(root: Path) -> tuple[int, str, str]:
29
+ return run_worktree(root, "sprint", "status")
30
+
31
+
32
+ def sprint_finish(root: Path, merge: bool = False) -> tuple[int, str, str]:
33
+ args = ["sprint", "finish"]
34
+ if merge:
35
+ args.append("--merge")
36
+ return run_worktree(root, *args)
37
+
38
+
39
+ def main() -> int:
40
+ import argparse
41
+ parser = argparse.ArgumentParser(description="Worktree sprint lifecycle")
42
+ sub = parser.add_subparsers(dest="command")
43
+ s = sub.add_parser("start")
44
+ s.add_argument("n", type=int)
45
+ s.add_argument("slug")
46
+ s.add_argument("--from", dest="base", default="main")
47
+ st = sub.add_parser("status")
48
+ f = sub.add_parser("finish")
49
+ f.add_argument("--merge", action="store_true")
50
+ args = parser.parse_args()
51
+
52
+ root = Path(".").resolve()
53
+ if args.command == "start":
54
+ rc, out, err = sprint_start(root, args.n, args.slug, args.base)
55
+ elif args.command == "status":
56
+ rc, out, err = sprint_status(root)
57
+ elif args.command == "finish":
58
+ rc, out, err = sprint_finish(root, args.merge)
59
+ else:
60
+ parser.print_help()
61
+ return 1
62
+ if out:
63
+ print(out)
64
+ if err:
65
+ print(err, file=sys.stderr)
66
+ return rc
67
+
68
+
69
+ if __name__ == "__main__":
70
+ sys.exit(main())
@@ -0,0 +1,121 @@
1
+ Metadata-Version: 2.4
2
+ Name: tasks-toolkit
3
+ Version: 0.1.3
4
+ Summary: Task tracker toolkit: CLI + MCP server for sprint/task/subtask management, delegation helpers.
5
+ Author: prachwal
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 prachwal
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/prachwal/tasks-toolkit
29
+ Project-URL: Repository, https://github.com/prachwal/tasks-toolkit
30
+ Project-URL: Issues, https://github.com/prachwal/tasks-toolkit/issues
31
+ Keywords: mcp,task-tracker,cli,sprints
32
+ Classifier: Development Status :: 3 - Alpha
33
+ Classifier: Environment :: Console
34
+ Classifier: Intended Audience :: Developers
35
+ Classifier: License :: OSI Approved :: MIT License
36
+ Classifier: Programming Language :: Python :: 3
37
+ Classifier: Programming Language :: Python :: 3.10
38
+ Classifier: Programming Language :: Python :: 3.11
39
+ Classifier: Programming Language :: Python :: 3.12
40
+ Requires-Python: >=3.10
41
+ Description-Content-Type: text/markdown
42
+ License-File: LICENSE
43
+ Provides-Extra: dev
44
+ Requires-Dist: ruff>=0.5; extra == "dev"
45
+ Requires-Dist: mypy>=1.10; extra == "dev"
46
+ Requires-Dist: pytest>=8; extra == "dev"
47
+ Requires-Dist: pytest-xdist>=3; extra == "dev"
48
+ Dynamic: license-file
49
+
50
+ # tasks-toolkit
51
+
52
+ A small, self-contained task tracker (sprints → tasks → subtasks) with a CLI and an MCP server,
53
+ plus helpers used by the VibeEmulator project.
54
+
55
+ ## Contents
56
+
57
+ - `scripts/tasks.py` — CLI for the tracker (SQLite-backed).
58
+ - `scripts/tasks_mcp.py` — MCP (stdio) server exposing tracker operations as tools.
59
+ - `scripts/tasks_init.py` — create an empty database.
60
+ - `scripts/sprint_auto_*.py`, `scripts/sprint_plan.py`, `scripts/run_stats.py` — automation helpers.
61
+ - `scripts/worktree.sh`, `scripts/*-task.sh` — delegation runners.
62
+ - `pyproject.toml` — ruff/mypy/pytest configuration.
63
+ - `knowledge/`, `agents/` — design notes and tracker docs.
64
+
65
+ ## Installation
66
+
67
+ ### From PyPI (recommended)
68
+
69
+ ```bash
70
+ pipx install tasks-toolkit
71
+ # or: uv tool install tasks-toolkit
72
+ tasks-init
73
+ tasks overview
74
+ ```
75
+
76
+ ### From source
77
+
78
+ ```bash
79
+ git clone https://github.com/prachwal/tasks-toolkit.git
80
+ cd tasks-toolkit
81
+ python -m pip install -e .
82
+ tasks-init
83
+ tasks overview
84
+ ```
85
+
86
+ ### Docker
87
+
88
+ ```bash
89
+ docker build -t tasks-toolkit .
90
+ docker run --rm -i -v tasks-data:/data tasks-toolkit
91
+ ```
92
+
93
+ ## Quick start (from source)
94
+
95
+ ```bash
96
+ python3 scripts/tasks_init.py # create tasks/tasks.db
97
+ python3 scripts/tasks.py overview # show sprints
98
+ python3 scripts/tasks.py next # next ready task
99
+ ```
100
+
101
+ Override the data location with `VIBE_TASKS_ROOT`:
102
+
103
+ ```bash
104
+ export VIBE_TASKS_ROOT=/path/to/data
105
+ python3 scripts/tasks.py overview
106
+ ```
107
+
108
+ ## MCP (OpenCode)
109
+
110
+ ```jsonc
111
+ "tasks": {
112
+ "type": "local",
113
+ "command": ["python3", "{env:HOME}/src/tasks-toolkit/scripts/tasks_mcp.py"],
114
+ "cwd": "{env:HOME}/src/tasks-toolkit",
115
+ "environment": { "VIBE_TASKS_ROOT": "{env:HOME}/src/tasks-toolkit" }
116
+ }
117
+ ```
118
+
119
+ ## License
120
+
121
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,65 @@
1
+ scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ scripts/agents_sync.py,sha256=2ksyQKZO5rSdSmqElAHdFB5N35l1t9ZIRCZw-HjHOFg,2267
3
+ scripts/apply-plan.sh,sha256=wFdKlxYQvwXrylRllZYcKiFtefVenR1W0kYRIjlTAi0,1993
4
+ scripts/build.sh,sha256=yp244dXVAwj0PZJ9e19df-a9VNQEZlyaZCZnr3rJhTw,148
5
+ scripts/codex-task.sh,sha256=LvqbyHd0Tma4CpjiEyGqVrMHJIh3N5MdzcddafLFZBE,8201
6
+ scripts/install-hooks.sh,sha256=hNdAwxa8Ny02gV2vBZ_UIOyEejZGBN_uPiW4yE9xBs8,219
7
+ scripts/junie-status.sh,sha256=PHnjMSVJ3156QCCc7cx-cZPvXjJV34pVQFybWj8nCMQ,2356
8
+ scripts/junie-task.sh,sha256=8U278J4Eq557ZMD9jWYvUeYikO7EG2yYW0DLUVj2mrY,8003
9
+ scripts/kilo-task.sh,sha256=HgrJX-zjm7wepKRHYPWgbITiaNToOjtfJfAvELEwTOA,9241
10
+ scripts/needs-dotnet-checks.sh,sha256=fUhDdxB3NfSV8JdE1j15q__LLNZ3hVj805tFaN9MPWE,889
11
+ scripts/plan-sprint.sh,sha256=MDzJCzs8QtsU1kLBGxZ9eYQSYjIq_vNkx0OkEekaLQQ,3860
12
+ scripts/run-task.sh,sha256=v7S4_DkqNt-LnzbxBY9-JkvaVDYRTjdNDUUj8T0G5PQ,3468
13
+ scripts/run.sh,sha256=yImfms36cEKU4OxfqDkySqC5nTgdZucjX5DBZo7dusc,162
14
+ scripts/run_stats.py,sha256=nIQvgRE26ieImTqU5kPEvIGFbABBN2CS303F3FWaFw4,6352
15
+ scripts/run_summary.py,sha256=Lw03Eau9Cybl8BBvjbZAcQvlpuyKlH0klt0STa1YxsY,3832
16
+ scripts/spec-lint.sh,sha256=s_2CkMYgCDfHuXj1kjgVKF1o24oawyhK-X15M5QMniw,5137
17
+ scripts/sprint-auto.sh,sha256=nvYos6ErjHx84J3oE2AREGG1qtddA4LfLxCLYHnLjr8,2950
18
+ scripts/sprint_auto_execute.py,sha256=P5yghi0Dh-EkHqj51t3SDYwwfQCP99vUfYSP_16iIx4,5743
19
+ scripts/sprint_auto_preflight.py,sha256=09mIyLpCWXRFkamXHZbjoCv4Jo1CnFDcrEs8vuH44Z4,10741
20
+ scripts/sprint_auto_prepare.py,sha256=_i4wKcVgmJU7xQnza7gm57JLLe8rPE4gtG6fZG-NkYI,11545
21
+ scripts/sprint_auto_resume.py,sha256=hIoqJi8KlCZ1dDniTeVjTPdcCLv_koEpnRbpj0ZvOY4,5910
22
+ scripts/sprint_auto_state.py,sha256=yuS4O-gmGIUddvqsVeFdf27zH6IGQt-Nm4spEaIFJQc,6276
23
+ scripts/sprint_plan.py,sha256=pnvF8nH_J6awsrolVUNwKE-GdZP8v1AAAvBKKWMXCe8,10561
24
+ scripts/task-report.sh,sha256=Tgx9gpKGkw04-5_obxaxmrZILiq6LmHIhSbdzAhAVNs,1625
25
+ scripts/tasks.py,sha256=-xjHySfkOiR-4K8V5HjyPeG-xS_-gjJv99EM6wsK4NU,80009
26
+ scripts/tasks_cli.py,sha256=BaM_XFuFR1s_ENTAnHuA7_eQd8TRHKYnLVOILuH_WVQ,346
27
+ scripts/tasks_commands.py,sha256=FCJ4EayWtgjf8kolrBkWxRH3yIdyT70hPNU9lux5tFw,275
28
+ scripts/tasks_init.py,sha256=UkTgUlweHLJfHlL3Y43yEO8b8VpkfpgiMtx_v7E1xpc,5535
29
+ scripts/tasks_mcp.py,sha256=P3qQLnktL5ttxqf4z_hAzblMeIWV1ALgBZt1t-HWUo0,16228
30
+ scripts/tasks_model.py,sha256=dBIAAxWOXdoWzg6j8dmOV_q7FN4xSJsvdW9pVpHPgvc,6039
31
+ scripts/tasks_plan_import.py,sha256=Gm5mafmzdgWMQmeQaMbyPheCDxAWbprPUZaF_NQKO-A,9325
32
+ scripts/tasks_render.py,sha256=Kx4MFsMpRgwMRHxkGeQLrd2ADEmb4t7-xz0syCz3P9k,5816
33
+ scripts/tasks_storage.py,sha256=ImPc3n3nK8SNCvwt3-HZa3-M7WSFjcma_J7soPzDM6w,15884
34
+ scripts/tasks_watch.py,sha256=kzOxl7nuTAO9CoR5mHm5VJnTgSfW1kkOqxMSEiANyrY,4854
35
+ scripts/test.sh,sha256=S11GMvaYdEEeGEViur09bshdD5M2_zkPAbtXeW0VdAs,1920
36
+ scripts/test_agent_config.py,sha256=Ab7cm0fta7DRutW2S9mCYQweflIdlr8NrIJYw8TnwGQ,4134
37
+ scripts/test_plan_sprint.sh,sha256=cnv0a0ydKu5BxixpGt_aIEoTfvo8kpIFeJ1ckaCuZjk,6970
38
+ scripts/test_python_fast.sh,sha256=ckt19iy-vfvgQCIwhFEZJL9Z2UzECFaADfahqwJBRDo,627
39
+ scripts/test_python_lint.sh,sha256=fQ8ufku_P8yUsaVVdA6Rrtc3U81Kh6r57UTRl2vSEgw,515
40
+ scripts/test_python_slow.sh,sha256=riYhUocdsKKcFxY7o0I6UeYDWN1At4_eplXdr4k95a8,412
41
+ scripts/test_run_stats.py,sha256=hBYsMFucX3_0DzlaoHFH_wxwkAC5zdNKvYqGaYegius,2647
42
+ scripts/test_runners.sh,sha256=0voMC6pHem5dSc9R7XYzFyJp5j1dTuJZJ1pSLSg_K1A,25973
43
+ scripts/test_spec_lint.sh,sha256=uOhttoSE63vZMgczqbeLwlM1qJ_Vk8g8DxguHrf4kj0,10471
44
+ scripts/test_sprint_auto.py,sha256=HRcRdNNKVtuKvP89jruHtNJeG0em0FH4Tpr1r_tp9Ws,1605
45
+ scripts/test_sprint_auto_execute.py,sha256=uaN-PbCVdn2Xu9ytQrfhcrMFdeYr8M1nFi2daWYPE1g,4266
46
+ scripts/test_sprint_auto_preflight.py,sha256=tQPjYKtUue8leHUwVGAZZJgW6OTazzQ6qdggaWK1d7c,5702
47
+ scripts/test_sprint_auto_prepare.py,sha256=n61p0srmghXH_LDKOLS5UIL_Y-CVmm6OpV9MRB2zSZA,6654
48
+ scripts/test_sprint_auto_resume.py,sha256=JVh6qZbEdjjD9ZFYqK757pcU42_Z8xICCvYCeTMo3tw,4829
49
+ scripts/test_sprint_auto_state.py,sha256=h6uIbBsWMa-W1L9fJUDwbat6g5snF29ge1a7raRtdqw,5156
50
+ scripts/test_tasks.py,sha256=msQlOCNmCWM9kiKvqJVE3mz6Jo1EbouLvpky8o8r3tU,72309
51
+ scripts/test_tasks_mcp.py,sha256=4c7b2ljM9GqeC27d4-GeVSFJbm-mS8ZTAJniQ8YpG3Q,10569
52
+ scripts/test_tasks_plan_import.py,sha256=aXPE_OGIu1RsB6D5FfqU-YUnJ5mHAccki0ZROS06lcg,5257
53
+ scripts/test_tasks_storage.py,sha256=8Kj-BwKbv5Xs6XrJWwYomFSX-sqS6a2HxWzc7XAVeaM,2031
54
+ scripts/test_tasks_watch.py,sha256=IlPsnqHYb5LIMUr0FP_PZ6LnQbumrwbMxfuTmKvwFwE,9354
55
+ scripts/test_worktree.sh,sha256=qfGgvk7CnGGMQfBK4Qf8pBWyw5xx7RvbpM126ArzZkg,69669
56
+ scripts/worktree.sh,sha256=sHXhPEzVQQl-lx6Z8UJHhlCGE49m9DepxB95wvb1MGU,43017
57
+ scripts/worktree_mr.py,sha256=5MYpIkfpKhkRrgK8qw2i5_mLWBlVs6jLhnUmtGxLAz0,4395
58
+ scripts/worktree_path.py,sha256=7XYTGNoxx1rKt6Sl5nJnrLeBFXFyQNMnbLKTmLmPycI,2209
59
+ scripts/worktree_sprint.py,sha256=y2xweqYhRTWlyJmBjg1GJ0SpT8s5Zx1nqJoXCQ1zQJs,2144
60
+ tasks_toolkit-0.1.3.dist-info/licenses/LICENSE,sha256=jlaUGO2RF00wZygs00x6e-BvTrCA0ItRm6dbOiD7fhs,1065
61
+ tasks_toolkit-0.1.3.dist-info/METADATA,sha256=Oy8SIoi3GvrfDVfjC30_CHUd7DGzGhp7RPZVOMtiX3o,4075
62
+ tasks_toolkit-0.1.3.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
63
+ tasks_toolkit-0.1.3.dist-info/entry_points.txt,sha256=kySE5Ky4bDf7W1Y04rAskEVMsM9R0uCWqDQRBHEzaco,117
64
+ tasks_toolkit-0.1.3.dist-info/top_level.txt,sha256=rmzd5mewlrJy4sT608KPib7sM7edoY75AeqJeY3SPB4,8
65
+ tasks_toolkit-0.1.3.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ tasks = scripts.tasks:main
3
+ tasks-init = scripts.tasks_init:main
4
+ tasks-mcp = scripts.tasks_mcp:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 prachwal
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ scripts