workforge 2.4.1__tar.gz → 2.5.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 (46) hide show
  1. {workforge-2.4.1 → workforge-2.5.0}/CHANGELOG.md +10 -0
  2. {workforge-2.4.1 → workforge-2.5.0}/PKG-INFO +19 -6
  3. {workforge-2.4.1 → workforge-2.5.0}/README.md +18 -5
  4. {workforge-2.4.1 → workforge-2.5.0}/docs/distribution.md +50 -24
  5. {workforge-2.4.1 → workforge-2.5.0}/pyproject.toml +1 -1
  6. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/cli.py +49 -0
  7. {workforge-2.4.1 → workforge-2.5.0}/tests/test_init_workspace.py +7 -0
  8. {workforge-2.4.1 → workforge-2.5.0}/.github/workflows/ci.yml +0 -0
  9. {workforge-2.4.1 → workforge-2.5.0}/.github/workflows/release.yml +0 -0
  10. {workforge-2.4.1 → workforge-2.5.0}/.gitignore +0 -0
  11. {workforge-2.4.1 → workforge-2.5.0}/AGENTS.md +0 -0
  12. {workforge-2.4.1 → workforge-2.5.0}/LICENSE +0 -0
  13. {workforge-2.4.1 → workforge-2.5.0}/_config.yml +0 -0
  14. {workforge-2.4.1 → workforge-2.5.0}/docs/github-provider-design.md +0 -0
  15. {workforge-2.4.1 → workforge-2.5.0}/docs/jira-provider-design.md +0 -0
  16. {workforge-2.4.1 → workforge-2.5.0}/docs/trello-provider-design.md +0 -0
  17. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/__init__.py +0 -0
  18. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/config.py +0 -0
  19. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/core/__init__.py +0 -0
  20. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/core/parser.py +0 -0
  21. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/models.py +0 -0
  22. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/providers/__init__.py +0 -0
  23. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/providers/base.py +0 -0
  24. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/providers/github.py +0 -0
  25. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/providers/jira.py +0 -0
  26. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/providers/registry.py +0 -0
  27. {workforge-2.4.1 → workforge-2.5.0}/src/workforge/providers/trello.py +0 -0
  28. {workforge-2.4.1 → workforge-2.5.0}/tests/test_agent_context.py +0 -0
  29. {workforge-2.4.1 → workforge-2.5.0}/tests/test_cli_output.py +0 -0
  30. {workforge-2.4.1 → workforge-2.5.0}/tests/test_github_provider.py +0 -0
  31. {workforge-2.4.1 → workforge-2.5.0}/tests/test_jira_provider.py +0 -0
  32. {workforge-2.4.1 → workforge-2.5.0}/tests/test_parser.py +0 -0
  33. {workforge-2.4.1 → workforge-2.5.0}/tests/test_trello_provider.py +0 -0
  34. {workforge-2.4.1 → workforge-2.5.0}/tests/test_workspace_runtime.py +0 -0
  35. {workforge-2.4.1 → workforge-2.5.0}/workspaces/github-projects-example/.env.example +0 -0
  36. {workforge-2.4.1 → workforge-2.5.0}/workspaces/github-projects-example/inbox/sample-requirements.md +0 -0
  37. {workforge-2.4.1 → workforge-2.5.0}/workspaces/github-projects-example/output/.gitkeep +0 -0
  38. {workforge-2.4.1 → workforge-2.5.0}/workspaces/github-projects-example/workforge.yaml +0 -0
  39. {workforge-2.4.1 → workforge-2.5.0}/workspaces/jira-example/.env.example +0 -0
  40. {workforge-2.4.1 → workforge-2.5.0}/workspaces/jira-example/inbox/sample-requirements.md +0 -0
  41. {workforge-2.4.1 → workforge-2.5.0}/workspaces/jira-example/output/.gitkeep +0 -0
  42. {workforge-2.4.1 → workforge-2.5.0}/workspaces/jira-example/workforge.yaml +0 -0
  43. {workforge-2.4.1 → workforge-2.5.0}/workspaces/trello-example/.env.example +0 -0
  44. {workforge-2.4.1 → workforge-2.5.0}/workspaces/trello-example/inbox/sample-requirements.md +0 -0
  45. {workforge-2.4.1 → workforge-2.5.0}/workspaces/trello-example/output/.gitkeep +0 -0
  46. {workforge-2.4.1 → workforge-2.5.0}/workspaces/trello-example/workforge.yaml +0 -0
@@ -1,3 +1,12 @@
1
+ ## [2.5.0] - 2026-08-25
2
+
3
+ ### 🚀 Features
4
+
5
+ - *(workspace)* Add contributor instructions
6
+
7
+ ### 📚 Documentation
8
+
9
+ - Clarify WorkForge installation modes
1
10
  ## [2.4.1] - 2026-08-21
2
11
 
3
12
  ### 💼 Other
@@ -13,6 +22,7 @@
13
22
 
14
23
  - *(github pages)* Create theme configuration file
15
24
  - Updates documentation
25
+ - Release 2.4.1
16
26
  ## [2.4.0] - 2026-08-21
17
27
 
18
28
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: workforge
3
- Version: 2.4.1
3
+ Version: 2.5.0
4
4
  Summary: Turn work inputs into provider-neutral requirements and planning items.
5
5
  Project-URL: Homepage, https://github.com/Nanielito/workforge
6
6
  Project-URL: Repository, https://github.com/Nanielito/workforge.git
@@ -99,18 +99,27 @@ GitHub Actions runs on pull requests and pushes to `main`.
99
99
 
100
100
  ## Quick Start
101
101
 
102
- Install WorkForge as an isolated command-line tool:
102
+ `uvx` is included with `uv`. If it is not available yet, install `uv` using the
103
+ [official installation guide](https://docs.astral.sh/uv/getting-started/installation/),
104
+ which covers macOS, Linux, Windows, and common package managers.
105
+
106
+ Run WorkForge on demand without installing a permanent command:
103
107
 
104
108
  ```bash
105
- uv tool install workforge
109
+ uvx workforge --help
106
110
  ```
107
111
 
108
- Contributors should continue to use `pip install -e ".[dev]"`.
112
+ Prefix each WorkForge command with `uvx`; the examples below omit that prefix
113
+ for readability. Alternatively, install it persistently with
114
+ `uv tool install workforge`. See the
115
+ [distribution guide](https://github.com/Nanielito/workforge/blob/main/docs/distribution.md#choose-how-to-run-workforge)
116
+ for temporary, persistent, and version-pinned usage. Contributors should
117
+ continue to use `pip install -e ".[dev]"`.
109
118
 
110
119
  Create a project-local workspace:
111
120
 
112
121
  ```bash
113
- workforge init .workforge --name linkealo --provider trello --namespace linkealo/shopify
122
+ workforge init .workforge --name my-project --provider trello --namespace my-project/shopify
114
123
  ```
115
124
 
116
125
  Then add the printed entries to the host project's `.gitignore`:
@@ -255,10 +264,14 @@ workforge providers test --workspace workspaces/trello-example --provider trello
255
264
  <workspace>/
256
265
  workforge.yaml
257
266
  .env.example
267
+ README.md
258
268
  inbox/
259
269
  output/
260
270
  ```
261
271
 
272
+ `workforge init` creates the workspace README with a concise contributor
273
+ workflow for configuring access, previewing requirements, and tracking work.
274
+
262
275
  Workspace `.env` files are intentionally local-only. Commit `.env.example`, not
263
276
  `.env`.
264
277
 
@@ -376,7 +389,7 @@ workspaces/<name>/
376
389
  status.json
377
390
  agent-context.md
378
391
  items/
379
- fix-ui-operativa-post-instalacion.md
392
+ fix-ui-post-install.md
380
393
  ```
381
394
 
382
395
  `preview.json` contains the provider-neutral requirements parsed from the input.
@@ -67,18 +67,27 @@ GitHub Actions runs on pull requests and pushes to `main`.
67
67
 
68
68
  ## Quick Start
69
69
 
70
- Install WorkForge as an isolated command-line tool:
70
+ `uvx` is included with `uv`. If it is not available yet, install `uv` using the
71
+ [official installation guide](https://docs.astral.sh/uv/getting-started/installation/),
72
+ which covers macOS, Linux, Windows, and common package managers.
73
+
74
+ Run WorkForge on demand without installing a permanent command:
71
75
 
72
76
  ```bash
73
- uv tool install workforge
77
+ uvx workforge --help
74
78
  ```
75
79
 
76
- Contributors should continue to use `pip install -e ".[dev]"`.
80
+ Prefix each WorkForge command with `uvx`; the examples below omit that prefix
81
+ for readability. Alternatively, install it persistently with
82
+ `uv tool install workforge`. See the
83
+ [distribution guide](https://github.com/Nanielito/workforge/blob/main/docs/distribution.md#choose-how-to-run-workforge)
84
+ for temporary, persistent, and version-pinned usage. Contributors should
85
+ continue to use `pip install -e ".[dev]"`.
77
86
 
78
87
  Create a project-local workspace:
79
88
 
80
89
  ```bash
81
- workforge init .workforge --name linkealo --provider trello --namespace linkealo/shopify
90
+ workforge init .workforge --name my-project --provider trello --namespace my-project/shopify
82
91
  ```
83
92
 
84
93
  Then add the printed entries to the host project's `.gitignore`:
@@ -223,10 +232,14 @@ workforge providers test --workspace workspaces/trello-example --provider trello
223
232
  <workspace>/
224
233
  workforge.yaml
225
234
  .env.example
235
+ README.md
226
236
  inbox/
227
237
  output/
228
238
  ```
229
239
 
240
+ `workforge init` creates the workspace README with a concise contributor
241
+ workflow for configuring access, previewing requirements, and tracking work.
242
+
230
243
  Workspace `.env` files are intentionally local-only. Commit `.env.example`, not
231
244
  `.env`.
232
245
 
@@ -344,7 +357,7 @@ workspaces/<name>/
344
357
  status.json
345
358
  agent-context.md
346
359
  items/
347
- fix-ui-operativa-post-instalacion.md
360
+ fix-ui-post-install.md
348
361
  ```
349
362
 
350
363
  `preview.json` contains the provider-neutral requirements parsed from the input.
@@ -1,9 +1,8 @@
1
1
  # Distribution and Release Guide
2
2
 
3
- WorkForge is a public Python CLI. GitHub remains the source repository and
4
- release record; PyPI will be the package distribution channel. This gives users
5
- an isolated `workforge` command without requiring a repository clone or a
6
- development environment.
3
+ WorkForge is a public Python CLI distributed through PyPI. GitHub remains the
4
+ source repository and release record. Users can run WorkForge in an isolated
5
+ environment without cloning the repository or creating a development setup.
7
6
 
8
7
  ## Current state
9
8
 
@@ -12,23 +11,54 @@ changelog, creates a Git tag, and uploads the wheel and source distribution to
12
11
  both a GitHub Release and PyPI. The PyPI job uses Trusted Publishing and a
13
12
  separate GitHub environment so it never receives the repository write token.
14
13
 
15
- PyPI installation commands will work after the one-time publisher setup is
16
- completed and the first release using the publish job succeeds.
14
+ ## Choose how to run WorkForge
17
15
 
18
- ## User installation
16
+ `uvx` ships with `uv`; users who do not have it can follow the
17
+ [official uv installation guide](https://docs.astral.sh/uv/getting-started/installation/).
19
18
 
20
- The recommended installation uses `uv`, which puts the CLI and its dependencies
21
- in an isolated environment:
19
+ ### On demand in a project
20
+
21
+ Use `uvx` when WorkForge supports planning for a project but should not become a
22
+ permanent command or project dependency:
23
+
24
+ ```bash
25
+ cd my-project
26
+ uvx workforge init .workforge \
27
+ --name my-project \
28
+ --provider github \
29
+ --namespace organization/repository
30
+ uvx workforge preview .workforge/inbox/requirements.md --workspace .workforge
31
+ ```
32
+
33
+ Prefix every command with `uvx`. The WorkForge runtime remains isolated and uv
34
+ may cache it for faster later executions; the project-local `.workforge`
35
+ workspace persists normally. The same approach works with Trello, GitHub
36
+ Projects, and Jira.
37
+
38
+ To reproduce planning behavior with a known release, pin it in each invocation:
39
+
40
+ ```bash
41
+ uvx workforge@X.Y.Z preview .workforge/inbox/requirements.md --workspace .workforge
42
+ ```
43
+
44
+ There is nothing to uninstall after `uvx`. `uv cache clean` removes uv's shared
45
+ cache, not only WorkForge, and is normally unnecessary.
46
+
47
+ ### Persistent command
48
+
49
+ Install WorkForge persistently when it is used across many projects or by
50
+ scripts that expect a `workforge` command on `PATH`:
22
51
 
23
52
  ```bash
24
53
  uv tool install workforge
25
54
  workforge --help
26
55
  ```
27
56
 
28
- Users can run WorkForge without a permanent installation:
57
+ Upgrade or remove this installation with:
29
58
 
30
59
  ```bash
31
- uvx workforge --help
60
+ uv tool upgrade workforge
61
+ uv tool uninstall workforge
32
62
  ```
33
63
 
34
64
  `pipx` provides an equivalent isolated installation:
@@ -40,17 +70,10 @@ pipx install workforge
40
70
  Plain `pip install workforge` is supported but is not the recommended default
41
71
  because it can mix WorkForge dependencies with another Python environment.
42
72
 
43
- Install or keep a specific version when reproducibility matters:
44
-
45
- ```bash
46
- uv tool install workforge==2.4.1
47
- ```
48
-
49
- Upgrade or remove the CLI with:
73
+ Pin a persistent installation when reproducibility matters:
50
74
 
51
75
  ```bash
52
- uv tool upgrade workforge
53
- uv tool uninstall workforge
76
+ uv tool install workforge==X.Y.Z
54
77
  ```
55
78
 
56
79
  ## First use
@@ -58,12 +81,15 @@ uv tool uninstall workforge
58
81
  Create a workspace inside the project that WorkForge will manage:
59
82
 
60
83
  ```bash
61
- workforge init .workforge \
84
+ uvx workforge init .workforge \
62
85
  --name my-project \
63
86
  --provider github \
64
87
  --namespace organization/repository
65
88
  ```
66
89
 
90
+ The generated `.workforge/README.md` explains how to create provider items from
91
+ a Markdown requirement or discover and continue existing items using `uvx`.
92
+
67
93
  Keep credentials and generated output out of version control:
68
94
 
69
95
  ```gitignore
@@ -75,19 +101,19 @@ Copy `.workforge/.env.example` to `.workforge/.env`, add the selected provider's
75
101
  credentials, and validate them before performing writes:
76
102
 
77
103
  ```bash
78
- workforge providers test --workspace .workforge --provider github
104
+ uvx workforge providers test --workspace .workforge --provider github
79
105
  ```
80
106
 
81
107
  Place Markdown requirements in `.workforge/inbox/`. Preview them first:
82
108
 
83
109
  ```bash
84
- workforge preview .workforge/inbox/requirements.md --workspace .workforge
110
+ uvx workforge preview .workforge/inbox/requirements.md --workspace .workforge
85
111
  ```
86
112
 
87
113
  Create external planning items only after reviewing the preview:
88
114
 
89
115
  ```bash
90
- workforge create .workforge/inbox/requirements.md \
116
+ uvx workforge create .workforge/inbox/requirements.md \
91
117
  --workspace .workforge \
92
118
  --provider github \
93
119
  --execute \
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "workforge"
7
- version = "2.4.1"
7
+ version = "2.5.0"
8
8
  description = "Turn work inputs into provider-neutral requirements and planning items."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -631,6 +631,7 @@ def _init_workspace(
631
631
  files = {
632
632
  workspace_path / "workforge.yaml": _workspace_config_template(workspace_name, provider, default_namespace),
633
633
  workspace_path / ".env.example": _env_example_template(provider),
634
+ workspace_path / "README.md": _workspace_readme_template(),
634
635
  workspace_path / "output" / ".gitkeep": "",
635
636
  }
636
637
 
@@ -699,6 +700,54 @@ def _env_example_template(provider: str) -> str:
699
700
  return ""
700
701
 
701
702
 
703
+ def _workspace_readme_template() -> str:
704
+ return """# WorkForge workspace
705
+
706
+ This directory contains the planning workspace for this repository. Requirements
707
+ live in `inbox/`; generated provider state and agent context live in `output/`.
708
+
709
+ ## Contributor workflow
710
+
711
+ 1. Copy `.env.example` to `.env` and add your provider credentials.
712
+ 2. Validate access with `uvx workforge providers test --workspace .workforge`.
713
+
714
+ Run WorkForge through `uvx workforge` so contributors use an isolated CLI
715
+ without installing it into the project.
716
+
717
+ ### Start from a requirement
718
+
719
+ Create `inbox/<requirement>.md` with one `## Title` section per planning item,
720
+ optional metadata such as `Labels: docs`, a description, and `- Task` lines.
721
+ Then preview it before any external write:
722
+
723
+ `uvx workforge preview .workforge/inbox/<requirement>.md --workspace .workforge`
724
+
725
+ After approval, create and save the provider items:
726
+
727
+ `uvx workforge create .workforge/inbox/<requirement>.md --workspace .workforge --execute --save`
728
+
729
+ ### Continue existing items
730
+
731
+ Discover existing provider items into the default `discovered` output:
732
+
733
+ `uvx workforge discover --workspace .workforge --save`
734
+
735
+ Claim the selected item and move it into progress:
736
+
737
+ `uvx workforge claim-item discovered --workspace .workforge --item <id> --assignee @me`
738
+
739
+ `uvx workforge move-item discovered --workspace .workforge --item <id> --status doing`
740
+
741
+ Continue using `discovered` with `status` and `complete-task` to keep the issue
742
+ checklist synchronized.
743
+
744
+ Never commit `.env` or `output/`. See the repository's contributor and agent
745
+ guides for its development, validation, and pull request rules. See the
746
+ [WorkForge README](https://github.com/Nanielito/workforge#quick-start) for `uv`
747
+ installation, provider configuration, and the complete command reference.
748
+ """
749
+
750
+
702
751
  def _project_workspace_gitignore_block(workspace_path: Path) -> str:
703
752
  workspace_ref = workspace_path.name if workspace_path.is_absolute() else workspace_path.as_posix().rstrip("/")
704
753
  return f"{workspace_ref}/.env\n{workspace_ref}/output/\n"
@@ -6,6 +6,7 @@ from workforge.cli import (
6
6
  _env_example_template,
7
7
  _init_workspace,
8
8
  _project_workspace_gitignore_block,
9
+ _workspace_readme_template,
9
10
  _workspace_config_template,
10
11
  )
11
12
 
@@ -49,11 +50,17 @@ def test_init_workspace_creates_project_local_scaffold(tmp_path: Path) -> None:
49
50
  assert created == [
50
51
  workspace / "workforge.yaml",
51
52
  workspace / ".env.example",
53
+ workspace / "README.md",
52
54
  workspace / "output" / ".gitkeep",
53
55
  ]
54
56
  assert (workspace / "inbox").is_dir()
55
57
  assert (workspace / "output").is_dir()
56
58
  assert (workspace / ".env.example").read_text() == ""
59
+ assert (workspace / "README.md").read_text() == _workspace_readme_template()
60
+ assert "uvx workforge" in (workspace / "README.md").read_text()
61
+ assert "Start from a requirement" in (workspace / "README.md").read_text()
62
+ assert "Continue existing items" in (workspace / "README.md").read_text()
63
+ assert "https://github.com/Nanielito/workforge#quick-start" in (workspace / "README.md").read_text()
57
64
  assert "default_provider: test-provider" in (workspace / "workforge.yaml").read_text()
58
65
 
59
66
 
File without changes
File without changes
File without changes
File without changes