lazyplan-tui 0.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. lazyplan_tui-0.7.0/LICENSE +21 -0
  2. lazyplan_tui-0.7.0/PKG-INFO +172 -0
  3. lazyplan_tui-0.7.0/README.md +144 -0
  4. lazyplan_tui-0.7.0/pyproject.toml +53 -0
  5. lazyplan_tui-0.7.0/setup.cfg +4 -0
  6. lazyplan_tui-0.7.0/src/lazyplan/__init__.py +15 -0
  7. lazyplan_tui-0.7.0/src/lazyplan/__main__.py +4 -0
  8. lazyplan_tui-0.7.0/src/lazyplan/cli.py +530 -0
  9. lazyplan_tui-0.7.0/src/lazyplan/cli_parser.py +240 -0
  10. lazyplan_tui-0.7.0/src/lazyplan/design.py +162 -0
  11. lazyplan_tui-0.7.0/src/lazyplan/gantt.py +37 -0
  12. lazyplan_tui-0.7.0/src/lazyplan/models.py +203 -0
  13. lazyplan_tui-0.7.0/src/lazyplan/postgres_sync.py +121 -0
  14. lazyplan_tui-0.7.0/src/lazyplan/render.py +175 -0
  15. lazyplan_tui-0.7.0/src/lazyplan/repo.py +101 -0
  16. lazyplan_tui-0.7.0/src/lazyplan/screens.py +437 -0
  17. lazyplan_tui-0.7.0/src/lazyplan/seed.py +36 -0
  18. lazyplan_tui-0.7.0/src/lazyplan/skills.py +415 -0
  19. lazyplan_tui-0.7.0/src/lazyplan/store.py +1448 -0
  20. lazyplan_tui-0.7.0/src/lazyplan/tui.py +711 -0
  21. lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/PKG-INFO +172 -0
  22. lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/SOURCES.txt +29 -0
  23. lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/dependency_links.txt +1 -0
  24. lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/entry_points.txt +2 -0
  25. lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/requires.txt +11 -0
  26. lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/top_level.txt +1 -0
  27. lazyplan_tui-0.7.0/tests/test_design.py +76 -0
  28. lazyplan_tui-0.7.0/tests/test_repo.py +93 -0
  29. lazyplan_tui-0.7.0/tests/test_skills.py +323 -0
  30. lazyplan_tui-0.7.0/tests/test_store.py +535 -0
  31. lazyplan_tui-0.7.0/tests/test_version.py +32 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Brad Lindsay
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,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: lazyplan-tui
3
+ Version: 0.7.0
4
+ Summary: Terminal stream-of-consciousness console for issue tracking + roadmap planning alongside AI agents.
5
+ License-Expression: MIT
6
+ Project-URL: Homepage, https://github.com/fluxion-dev/lazyplan
7
+ Project-URL: Repository, https://github.com/fluxion-dev/lazyplan
8
+ Project-URL: Issues, https://github.com/fluxion-dev/lazyplan/issues
9
+ Project-URL: Changelog, https://github.com/fluxion-dev/lazyplan/releases
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Environment :: Console
14
+ Classifier: Topic :: Software Development :: Bug Tracking
15
+ Classifier: Topic :: Office/Business :: Scheduling
16
+ Requires-Python: >=3.11
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: textual>=3
20
+ Provides-Extra: postgres
21
+ Requires-Dist: psycopg[binary]>=3.1; extra == "postgres"
22
+ Provides-Extra: dev
23
+ Requires-Dist: ruff>=0.8; extra == "dev"
24
+ Requires-Dist: mypy>=1.13; extra == "dev"
25
+ Provides-Extra: test
26
+ Requires-Dist: pytest>=8; extra == "test"
27
+ Dynamic: license-file
28
+
29
+ # lazyplan (`lp`) — v0.7.0
30
+
31
+ Terminal stream-of-consciousness console for issue tracking + roadmap planning,
32
+ built to run in tmux next to `opencode` and `lazygit`. Design rules live in
33
+ [DESIGN_SYSTEM.md](DESIGN_SYSTEM.md), enforced by `src/lazyplan/design.py`.
34
+
35
+ ## Install
36
+
37
+ ```bash
38
+ pipx install lazyplan-tui # isolated global `lp` (once published to PyPI)
39
+ # or from source: pipx install ~/personal-repos/lazyplan
40
+ # or: python3 -m venv .venv && . .venv/bin/activate && pip install -e .
41
+ lp --help
42
+ # optional: shell completions
43
+ eval "$(lp completion --shell bash)" # or --shell zsh
44
+ ```
45
+ Note: this shadows the classic Unix print command `/usr/bin/lp`.
46
+ Use `command lp` or the full path if you ever need the printer.
47
+
48
+ DB resolution (first match wins): `--db PATH` → `$LAZYPLAN_DB` →
49
+ enclosing git repo's `.plan/lazyplan.db` → global
50
+ `~/.local/share/lazyplan/lazyplan.db`.
51
+
52
+ ## Repo-scoped workflow
53
+
54
+ Each git repo gets its own plan, stored with the code:
55
+
56
+ ```bash
57
+ cd ~/my-project
58
+ lp init # creates .plan/lazyplan.db + .plan/config.json, then offers
59
+ # the agent-skills wizard (universal `.agents/skills/lazyplan/`
60
+ # + `## lazyplan` pointer in AGENTS.md). Flags: --no-skills,
61
+ # --yes, --skills-scope project|global|both|none; --json stays
62
+ # machine-readable and never prompts.
63
+ lp info # resolved db path, repo root, counts, .plan files
64
+ lp add-project --name "my-project" --start 2026-10-18 --end 2026-12-31
65
+ lp ui # statusbar shows [my-project]; agents in any subdir share it
66
+ ```
67
+
68
+ Run `lp` from any subdirectory — it walks up to the repo root (via
69
+ `git rev-parse` with a `.git` fallback). Outside a repo it uses the global DB.
70
+ Commit `.plan/` to share the plan with the team, or ignore `*.db` to keep it
71
+ local — your call.
72
+
73
+ ## Release (semver)
74
+
75
+ Version lives in one place: `version` in `pyproject.toml`. The README header
76
+ mirrors it; `tests/test_version.py` fails the gates on drift.
77
+
78
+ ```bash
79
+ ./tools/bump.sh patch [--push] # or minor | major; --dry-run to preview
80
+ ```
81
+
82
+ `bump.sh` validates semver, updates `pyproject.toml` + README, commits, and
83
+ tags `vX.Y.Z` (refuses a dirty tree or an existing tag). Pushing the tag
84
+ (`--push`, or Actions → bump → patch/minor/major) triggers the release
85
+ workflow: tag-vs-pyproject check, sdist/wheel build, GitHub Release with
86
+ auto-generated notes. CI (`ci.yml`) runs `./tools/check.sh` on every push/PR.
87
+
88
+ ## tmux workflow
89
+
90
+ ```bash
91
+ ./tools/tmux-lazyplan.sh # plan | opencode | lazygit
92
+ ```
93
+
94
+ ## Dev / gates
95
+
96
+ ```bash
97
+ pip install -e ".[dev,postgres]" # ruff + mypy (+ psycopg for `lp sync`)
98
+ ./tools/check.sh # ruff check + format --check + mypy (strict)
99
+ # + unittest on system python AND venv python
100
+ ```
101
+
102
+ Standards live in [DESIGN_SYSTEM.md](DESIGN_SYSTEM.md) (§Python standards,
103
+ pyguide-based).
104
+
105
+ Agents never touch the TUI process — they call `lp --actor NAME ...` against
106
+ the same SQLite file (proposals/questions for anything needing human eyes);
107
+ the TUI polls a fingerprint (mtime + counts + max ids + last event) every
108
+ second and toasts + activity-lines new arrivals. `lp sync` snapshots the db
109
+ to Postgres for SQL-side readers (see `src/lazyplan/postgres_sync.py`).
110
+
111
+ ## TUI (`lp ui`)
112
+
113
+ Single panel, nano-style bottom bar (activity line, statusbar, command bar,
114
+ key footer). Mouse click/expand works.
115
+
116
+ | key | action |
117
+ |---|---|
118
+ | `1`/`2`/`3` | tree / gantt / feed views |
119
+ | `j`/`k`, arrows, click | navigate · `enter` edit detail in place |
120
+ | `n` | contextual new (task→story→project) |
121
+ | `P`/`S`/`T` | new project / story / task forms |
122
+ | `e` / `d` | edit · delete (with confirm) |
123
+ | `space` / `c` | cycle status · tick first open criterion |
124
+ | `+`/`-` | gantt zoom (width 20–100) |
125
+ | `f` / `o` / `O` | status / project / owner filter |
126
+ | `s` / `ctrl+p` | search · command palette (fuzzy, rows + views) |
127
+ | `4` then `a`/`x` | proposals view · approve / reject |
128
+ | `/` | focus command bar · `?` help · `r` refresh · `q` quit |
129
+
130
+ The command bar accepts the same verbs as `lp`
131
+ (`add-task --story 1 --title x`, `status --kind task --id 1 --to done`,
132
+ `tree`/`gantt`/`feed`, `help`).
133
+
134
+ ## CLI (agent ingress)
135
+
136
+ Flags work before or after the subcommand (`lp list --json` == `lp --json list`).
137
+
138
+ ```bash
139
+ lp seed
140
+ lp list [--status todo|doing|done] [--project ID] [--owner NAME] [--priority p0]
141
+ lp gantt [--tasks] [--width 40] [--status ..] [--project ID] [--owner NAME] [--priority p0]
142
+ # * = critical path, ! = blocked, ◆ = milestone
143
+ lp show --kind project|story|task --id N # full context: narrative + links + children
144
+ lp add-project --name "API v2" [--goal .. --metrics .. --scope-in .. --scope-out .. --assumptions ..]
145
+ lp add-story --project 1 --title "Auth refresh" [--owner a1 --priority p0 --labels x,y --estimate 2w --blocked-by 3]
146
+ lp add-task --story 1 --title "Rotate tokens" [--desc ctx --owner a1 --priority p1 --estimate 2d --blocked-by 4]
147
+ lp add-link --kind story --id 1 --url URL [--label spec]
148
+ lp add-criteria --kind task --id 1 --text "works offline"
149
+ lp check --id 1 / lp uncheck --id 1 # tick acceptance items (advisory)
150
+ lp add-risk --project 1 --title "slip" [--likelihood high --impact high --mitigation buf]
151
+ lp add-milestone --project 1 --title "Beta" --date 2026-11-15
152
+ lp propose --kind task --parent 1 --title "Refactor X" [--priority p1 --owner a1]
153
+ lp proposals [--status pending] | lp approve --id 1 / lp reject --id 1
154
+ lp ask --question "Which scope?" | lp questions | lp answer --id 1 --text "Minimal"
155
+ lp export [--format json|markdown] | lp import --file dump.json
156
+ lp sync --dsn postgresql://issues:issues@localhost:5433/issues # one-way replica
157
+ lp update --kind task --id 1 [--title --desc --owner --estimate --priority p0|none --labels a,b --blocked-by 1,2]
158
+ lp status --kind task --id 1 --to doing # closing with open criteria warns, never blocks
159
+ lp delete --kind task --id 1
160
+ lp feed [--limit 20] # recent human/agent activity
161
+ lp watch [--limit 20] # tail (agents: lp feed --json --follow &)
162
+ lp --actor agent-1 add-task --story 3 --title "Draft proposal"
163
+ ```
164
+
165
+ ## Roadmap (dogfooded)
166
+
167
+ The default DB holds project **P#1 “lazyplan roadmap”** (11 stories, 37 tasks).
168
+ Done: S#1 MVP, S#4 planning power, S#6 distribution, S#7 ownership,
169
+ S#8 acceptance criteria, S#9 risk register, S#10 goals/scope, S#11 materials.
170
+ Doing: S#2 TUI polish (palette/search/editable-detail left). Open: S#3 agent
171
+ ingress, S#5 postgres sync. All feature work goes here — `lp list`,
172
+ `lp gantt --tasks`, `lp show --kind story --id N`, `lp ui`.
@@ -0,0 +1,144 @@
1
+ # lazyplan (`lp`) — v0.7.0
2
+
3
+ Terminal stream-of-consciousness console for issue tracking + roadmap planning,
4
+ built to run in tmux next to `opencode` and `lazygit`. Design rules live in
5
+ [DESIGN_SYSTEM.md](DESIGN_SYSTEM.md), enforced by `src/lazyplan/design.py`.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pipx install lazyplan-tui # isolated global `lp` (once published to PyPI)
11
+ # or from source: pipx install ~/personal-repos/lazyplan
12
+ # or: python3 -m venv .venv && . .venv/bin/activate && pip install -e .
13
+ lp --help
14
+ # optional: shell completions
15
+ eval "$(lp completion --shell bash)" # or --shell zsh
16
+ ```
17
+ Note: this shadows the classic Unix print command `/usr/bin/lp`.
18
+ Use `command lp` or the full path if you ever need the printer.
19
+
20
+ DB resolution (first match wins): `--db PATH` → `$LAZYPLAN_DB` →
21
+ enclosing git repo's `.plan/lazyplan.db` → global
22
+ `~/.local/share/lazyplan/lazyplan.db`.
23
+
24
+ ## Repo-scoped workflow
25
+
26
+ Each git repo gets its own plan, stored with the code:
27
+
28
+ ```bash
29
+ cd ~/my-project
30
+ lp init # creates .plan/lazyplan.db + .plan/config.json, then offers
31
+ # the agent-skills wizard (universal `.agents/skills/lazyplan/`
32
+ # + `## lazyplan` pointer in AGENTS.md). Flags: --no-skills,
33
+ # --yes, --skills-scope project|global|both|none; --json stays
34
+ # machine-readable and never prompts.
35
+ lp info # resolved db path, repo root, counts, .plan files
36
+ lp add-project --name "my-project" --start 2026-10-18 --end 2026-12-31
37
+ lp ui # statusbar shows [my-project]; agents in any subdir share it
38
+ ```
39
+
40
+ Run `lp` from any subdirectory — it walks up to the repo root (via
41
+ `git rev-parse` with a `.git` fallback). Outside a repo it uses the global DB.
42
+ Commit `.plan/` to share the plan with the team, or ignore `*.db` to keep it
43
+ local — your call.
44
+
45
+ ## Release (semver)
46
+
47
+ Version lives in one place: `version` in `pyproject.toml`. The README header
48
+ mirrors it; `tests/test_version.py` fails the gates on drift.
49
+
50
+ ```bash
51
+ ./tools/bump.sh patch [--push] # or minor | major; --dry-run to preview
52
+ ```
53
+
54
+ `bump.sh` validates semver, updates `pyproject.toml` + README, commits, and
55
+ tags `vX.Y.Z` (refuses a dirty tree or an existing tag). Pushing the tag
56
+ (`--push`, or Actions → bump → patch/minor/major) triggers the release
57
+ workflow: tag-vs-pyproject check, sdist/wheel build, GitHub Release with
58
+ auto-generated notes. CI (`ci.yml`) runs `./tools/check.sh` on every push/PR.
59
+
60
+ ## tmux workflow
61
+
62
+ ```bash
63
+ ./tools/tmux-lazyplan.sh # plan | opencode | lazygit
64
+ ```
65
+
66
+ ## Dev / gates
67
+
68
+ ```bash
69
+ pip install -e ".[dev,postgres]" # ruff + mypy (+ psycopg for `lp sync`)
70
+ ./tools/check.sh # ruff check + format --check + mypy (strict)
71
+ # + unittest on system python AND venv python
72
+ ```
73
+
74
+ Standards live in [DESIGN_SYSTEM.md](DESIGN_SYSTEM.md) (§Python standards,
75
+ pyguide-based).
76
+
77
+ Agents never touch the TUI process — they call `lp --actor NAME ...` against
78
+ the same SQLite file (proposals/questions for anything needing human eyes);
79
+ the TUI polls a fingerprint (mtime + counts + max ids + last event) every
80
+ second and toasts + activity-lines new arrivals. `lp sync` snapshots the db
81
+ to Postgres for SQL-side readers (see `src/lazyplan/postgres_sync.py`).
82
+
83
+ ## TUI (`lp ui`)
84
+
85
+ Single panel, nano-style bottom bar (activity line, statusbar, command bar,
86
+ key footer). Mouse click/expand works.
87
+
88
+ | key | action |
89
+ |---|---|
90
+ | `1`/`2`/`3` | tree / gantt / feed views |
91
+ | `j`/`k`, arrows, click | navigate · `enter` edit detail in place |
92
+ | `n` | contextual new (task→story→project) |
93
+ | `P`/`S`/`T` | new project / story / task forms |
94
+ | `e` / `d` | edit · delete (with confirm) |
95
+ | `space` / `c` | cycle status · tick first open criterion |
96
+ | `+`/`-` | gantt zoom (width 20–100) |
97
+ | `f` / `o` / `O` | status / project / owner filter |
98
+ | `s` / `ctrl+p` | search · command palette (fuzzy, rows + views) |
99
+ | `4` then `a`/`x` | proposals view · approve / reject |
100
+ | `/` | focus command bar · `?` help · `r` refresh · `q` quit |
101
+
102
+ The command bar accepts the same verbs as `lp`
103
+ (`add-task --story 1 --title x`, `status --kind task --id 1 --to done`,
104
+ `tree`/`gantt`/`feed`, `help`).
105
+
106
+ ## CLI (agent ingress)
107
+
108
+ Flags work before or after the subcommand (`lp list --json` == `lp --json list`).
109
+
110
+ ```bash
111
+ lp seed
112
+ lp list [--status todo|doing|done] [--project ID] [--owner NAME] [--priority p0]
113
+ lp gantt [--tasks] [--width 40] [--status ..] [--project ID] [--owner NAME] [--priority p0]
114
+ # * = critical path, ! = blocked, ◆ = milestone
115
+ lp show --kind project|story|task --id N # full context: narrative + links + children
116
+ lp add-project --name "API v2" [--goal .. --metrics .. --scope-in .. --scope-out .. --assumptions ..]
117
+ lp add-story --project 1 --title "Auth refresh" [--owner a1 --priority p0 --labels x,y --estimate 2w --blocked-by 3]
118
+ lp add-task --story 1 --title "Rotate tokens" [--desc ctx --owner a1 --priority p1 --estimate 2d --blocked-by 4]
119
+ lp add-link --kind story --id 1 --url URL [--label spec]
120
+ lp add-criteria --kind task --id 1 --text "works offline"
121
+ lp check --id 1 / lp uncheck --id 1 # tick acceptance items (advisory)
122
+ lp add-risk --project 1 --title "slip" [--likelihood high --impact high --mitigation buf]
123
+ lp add-milestone --project 1 --title "Beta" --date 2026-11-15
124
+ lp propose --kind task --parent 1 --title "Refactor X" [--priority p1 --owner a1]
125
+ lp proposals [--status pending] | lp approve --id 1 / lp reject --id 1
126
+ lp ask --question "Which scope?" | lp questions | lp answer --id 1 --text "Minimal"
127
+ lp export [--format json|markdown] | lp import --file dump.json
128
+ lp sync --dsn postgresql://issues:issues@localhost:5433/issues # one-way replica
129
+ lp update --kind task --id 1 [--title --desc --owner --estimate --priority p0|none --labels a,b --blocked-by 1,2]
130
+ lp status --kind task --id 1 --to doing # closing with open criteria warns, never blocks
131
+ lp delete --kind task --id 1
132
+ lp feed [--limit 20] # recent human/agent activity
133
+ lp watch [--limit 20] # tail (agents: lp feed --json --follow &)
134
+ lp --actor agent-1 add-task --story 3 --title "Draft proposal"
135
+ ```
136
+
137
+ ## Roadmap (dogfooded)
138
+
139
+ The default DB holds project **P#1 “lazyplan roadmap”** (11 stories, 37 tasks).
140
+ Done: S#1 MVP, S#4 planning power, S#6 distribution, S#7 ownership,
141
+ S#8 acceptance criteria, S#9 risk register, S#10 goals/scope, S#11 materials.
142
+ Doing: S#2 TUI polish (palette/search/editable-detail left). Open: S#3 agent
143
+ ingress, S#5 postgres sync. All feature work goes here — `lp list`,
144
+ `lp gantt --tasks`, `lp show --kind story --id N`, `lp ui`.
@@ -0,0 +1,53 @@
1
+ [project]
2
+ name = "lazyplan-tui"
3
+ version = "0.7.0"
4
+ description = "Terminal stream-of-consciousness console for issue tracking + roadmap planning alongside AI agents."
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ requires-python = ">=3.11"
8
+ dependencies = ["textual>=3"]
9
+ classifiers = [
10
+ "Programming Language :: Python :: 3",
11
+ "Programming Language :: Python :: 3.11",
12
+ "Operating System :: OS Independent",
13
+ "Environment :: Console",
14
+ "Topic :: Software Development :: Bug Tracking",
15
+ "Topic :: Office/Business :: Scheduling",
16
+ ]
17
+ [project.urls]
18
+ Homepage = "https://github.com/fluxion-dev/lazyplan"
19
+ Repository = "https://github.com/fluxion-dev/lazyplan"
20
+ Issues = "https://github.com/fluxion-dev/lazyplan/issues"
21
+ Changelog = "https://github.com/fluxion-dev/lazyplan/releases"
22
+ [project.scripts]
23
+ lp = "lazyplan.cli:main"
24
+ [project.optional-dependencies]
25
+ postgres = ["psycopg[binary]>=3.1"]
26
+ dev = ["ruff>=0.8", "mypy>=1.13"]
27
+ test = ["pytest>=8"]
28
+ [build-system]
29
+ requires = ["setuptools>=61"]
30
+ build-backend = "setuptools.build_meta"
31
+ [tool.setuptools.packages.find]
32
+ where = ["src"]
33
+
34
+ [tool.ruff]
35
+ target-version = "py311"
36
+ line-length = 100
37
+
38
+ [tool.ruff.lint]
39
+ select = ["E", "F", "I", "UP", "B", "W"]
40
+ ignore = ["E501"]
41
+
42
+ [tool.ruff.lint.isort]
43
+ known-first-party = ["lazyplan"]
44
+
45
+ [tool.ruff.format]
46
+ quote-style = "double"
47
+
48
+ [tool.mypy]
49
+ python_version = "3.11"
50
+ warn_return_any = true
51
+ warn_unused_configs = true
52
+ show_error_codes = true
53
+ disallow_untyped_defs = true
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,15 @@
1
+ """lazyplan: Projects > UserStories > Tasks. TUI first, agent-injectable."""
2
+
3
+ from .models import Criterion, Link, Milestone, Project, Risk, RiskStatus, Status, Task, UserStory
4
+
5
+ __all__ = [
6
+ "Criterion",
7
+ "Link",
8
+ "Milestone",
9
+ "Project",
10
+ "Risk",
11
+ "RiskStatus",
12
+ "Status",
13
+ "Task",
14
+ "UserStory",
15
+ ]
@@ -0,0 +1,4 @@
1
+ from .cli import main
2
+
3
+ if __name__ == "__main__":
4
+ raise SystemExit(main())