workforge 2.4.1__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.
@@ -0,0 +1,515 @@
1
+ Metadata-Version: 2.5
2
+ Name: workforge
3
+ Version: 2.4.1
4
+ Summary: Turn work inputs into provider-neutral requirements and planning items.
5
+ Project-URL: Homepage, https://github.com/Nanielito/workforge
6
+ Project-URL: Repository, https://github.com/Nanielito/workforge.git
7
+ Project-URL: Issues, https://github.com/Nanielito/workforge/issues
8
+ Project-URL: Changelog, https://github.com/Nanielito/workforge/blob/main/CHANGELOG.md
9
+ Author: Daniel Ramirez
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: cli,github-projects,jira,planning,trello
13
+ Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Software Development
22
+ Requires-Python: >=3.11
23
+ Requires-Dist: httpx>=0.27.0
24
+ Requires-Dist: pydantic>=2.8.0
25
+ Requires-Dist: python-dotenv>=1.0.1
26
+ Requires-Dist: pyyaml>=6.0.2
27
+ Requires-Dist: typer>=0.12.3
28
+ Provides-Extra: dev
29
+ Requires-Dist: build>=1.2.0; extra == 'dev'
30
+ Requires-Dist: pytest>=8.3.0; extra == 'dev'
31
+ Description-Content-Type: text/markdown
32
+
33
+ # WorkForge
34
+
35
+ WorkForge turns raw work inputs into structured planning items, then sends them
36
+ to planning providers such as Trello, GitHub Projects, and Jira Cloud.
37
+
38
+ The core model is provider-neutral so the same requirements can become Trello
39
+ cards, GitHub Issues attached to a Project v2, or Jira issues.
40
+
41
+ ## Goals
42
+
43
+ - Keep planning automation outside product repositories.
44
+ - Support multiple workspaces with their own configuration and environment.
45
+ - Preview generated requirements before creating external items.
46
+ - Add providers through a small adapter interface.
47
+
48
+ ## Versioning
49
+
50
+ WorkForge uses semantic versioning.
51
+
52
+ - Patch releases fix bugs without changing commands or output contracts.
53
+ - Minor releases add backward-compatible commands, providers, or output files.
54
+ - Major releases may change CLI behavior, provider contracts, or saved output
55
+ formats.
56
+
57
+ `v1.0.0` is the stable Trello workflow release. The provider-neutral item
58
+ terminology and GitHub Projects provider require a major release because they
59
+ change saved output and CLI command names.
60
+
61
+ Releases are created manually from the `Release` GitHub Actions workflow on
62
+ `main`. The workflow updates the version and changelog, runs the test suite,
63
+ builds and validates the wheel and source distribution, creates the Git tag,
64
+ and attaches both distributions to a GitHub Release.
65
+
66
+ See the [distribution and release guide](https://github.com/Nanielito/workforge/blob/main/docs/distribution.md)
67
+ for the release process, public PyPI workflow, and required one-time setup.
68
+
69
+ ### Migrating from v1 to v2
70
+
71
+ Version 2 uses provider-neutral item terminology. Existing generated output is
72
+ not migrated automatically; rename `cards.json` to `items.json` and the
73
+ `cards/` context directory to `items/`, or run `workforge discover --save` to
74
+ rebuild them from the provider.
75
+
76
+ The corresponding CLI names changed:
77
+
78
+ | v1 | v2 |
79
+ | --- | --- |
80
+ | `card-context --card/-c` | `item-context --item/-i` |
81
+ | `comment-card --card/-c` | `comment-item --item/-i` |
82
+ | `move-card --card/-c --list/-l` | `move-item --item/-i --status/-s` |
83
+
84
+ Scripts using the v1 names must be updated before upgrading; v2 does not keep
85
+ deprecated aliases.
86
+
87
+ ## CI
88
+
89
+ GitHub Actions runs on pull requests and pushes to `main`.
90
+
91
+ - Tests run on Python 3.11, 3.12, and 3.13.
92
+ - The package build is validated with `python -m build`.
93
+
94
+ ## Provider design documentation
95
+
96
+ - [Trello provider design](https://github.com/Nanielito/workforge/blob/main/docs/trello-provider-design.md)
97
+ - [GitHub Projects provider design](https://github.com/Nanielito/workforge/blob/main/docs/github-provider-design.md)
98
+ - [Jira Cloud provider design](https://github.com/Nanielito/workforge/blob/main/docs/jira-provider-design.md)
99
+
100
+ ## Quick Start
101
+
102
+ Install WorkForge as an isolated command-line tool:
103
+
104
+ ```bash
105
+ uv tool install workforge
106
+ ```
107
+
108
+ Contributors should continue to use `pip install -e ".[dev]"`.
109
+
110
+ Create a project-local workspace:
111
+
112
+ ```bash
113
+ workforge init .workforge --name linkealo --provider trello --namespace linkealo/shopify
114
+ ```
115
+
116
+ Then add the printed entries to the host project's `.gitignore`:
117
+
118
+ ```gitignore
119
+ .workforge/.env
120
+ .workforge/output/
121
+ ```
122
+
123
+ Preview requirements from a workspace inbox file:
124
+
125
+ ```bash
126
+ workforge preview workspaces/trello-example/inbox/sample-requirements.md --workspace workspaces/trello-example
127
+ ```
128
+
129
+ Save preview output next to the workspace:
130
+
131
+ ```bash
132
+ workforge preview workspaces/trello-example/inbox/sample-requirements.md --workspace workspaces/trello-example --save
133
+ ```
134
+
135
+ Create provider items:
136
+
137
+ ```bash
138
+ workforge create workspaces/trello-example/inbox/sample-requirements.md --workspace workspaces/trello-example --provider trello --execute
139
+ ```
140
+
141
+ Save created provider items:
142
+
143
+ ```bash
144
+ workforge create workspaces/trello-example/inbox/sample-requirements.md --workspace workspaces/trello-example --provider trello --execute --save
145
+ ```
146
+
147
+ Preview task-list updates for items matched by requirement title, then apply them:
148
+
149
+ ```bash
150
+ workforge update workspaces/trello-example/inbox/sample-requirements.md --workspace workspaces/trello-example
151
+ workforge update workspaces/trello-example/inbox/sample-requirements.md --workspace workspaces/trello-example --execute
152
+ ```
153
+
154
+ Tasks that keep the same title retain their completion state. Other provider fields are left unchanged.
155
+
156
+ Discover existing provider items by label and rebuild `items.json`:
157
+
158
+ ```bash
159
+ workforge discover workspaces/trello-example/inbox/sample-requirements.md --workspace workspaces/trello-example --provider trello --label shopify --save
160
+ ```
161
+
162
+ GitHub discovery can also filter by assignee and configured Project status:
163
+
164
+ ```bash
165
+ workforge discover --workspace workspaces/github-projects-example --provider github --assignee @me --status todo --save
166
+ ```
167
+
168
+ Trello uses the same options for board members and configured logical lists:
169
+
170
+ ```bash
171
+ workforge discover --workspace workspaces/trello-example --provider trello --assignee @me --status doing --save
172
+ ```
173
+
174
+ Jira uses JQL and accepts logical labels, account IDs or `@me`, and configured
175
+ workflow statuses:
176
+
177
+ ```bash
178
+ workforge discover --workspace workspaces/jira-example --provider jira --assignee @me --status doing --save
179
+ ```
180
+
181
+ After choosing an existing item, assign it to the authenticated provider user:
182
+
183
+ ```bash
184
+ workforge claim-item requirements.md --workspace workspaces/my-project --item "Fix login"
185
+ ```
186
+
187
+ Use `--assignee <provider-user>` to assign it to someone else. Assignment remains optional when items are created.
188
+
189
+ Check provider item status from saved `items.json`:
190
+
191
+ ```bash
192
+ workforge status workspaces/trello-example/inbox/sample-requirements.md --workspace workspaces/trello-example --save
193
+ ```
194
+
195
+ Generate implementation context for an agent:
196
+
197
+ ```bash
198
+ workforge agent-context workspaces/trello-example/inbox/sample-requirements.md --workspace workspaces/trello-example --save
199
+ ```
200
+
201
+ Generate implementation context for one item:
202
+
203
+ ```bash
204
+ workforge item-context workspaces/trello-example/inbox/sample-requirements.md \
205
+ --workspace workspaces/trello-example \
206
+ --item "Fix UI" \
207
+ --save
208
+ ```
209
+
210
+ Mark a provider checklist task as complete:
211
+
212
+ ```bash
213
+ workforge complete-task workspaces/trello-example/inbox/sample-requirements.md \
214
+ --workspace workspaces/trello-example \
215
+ --item "Fix UI" \
216
+ --task "Add explicit customer data disclosure"
217
+ ```
218
+
219
+ `--item` accepts an item ID, exact title, or unique title substring. `--task`
220
+ accepts a checklist item ID, exact title, or unique title substring. By default,
221
+ WorkForge refreshes `status.json` and `agent-context.md` after completing the
222
+ task.
223
+
224
+ Add an implementation comment to a provider item:
225
+
226
+ ```bash
227
+ workforge comment-item workspaces/trello-example/inbox/sample-requirements.md \
228
+ --workspace workspaces/trello-example \
229
+ --item "Fix UI" \
230
+ --text "Started implementation from WorkForge agent context."
231
+ ```
232
+
233
+ Move a provider item to another list or workflow column:
234
+
235
+ ```bash
236
+ workforge move-item workspaces/trello-example/inbox/sample-requirements.md \
237
+ --workspace workspaces/trello-example \
238
+ --item "Fix UI" \
239
+ --status doing
240
+ ```
241
+
242
+ For Trello, `--status` accepts a Trello list ID or a configured logical list name.
243
+ By default, WorkForge refreshes `status.json` and `agent-context.md` after
244
+ commenting or moving an item.
245
+
246
+ Check provider credentials and workspace configuration:
247
+
248
+ ```bash
249
+ workforge providers test --workspace workspaces/trello-example --provider trello
250
+ ```
251
+
252
+ ## Workspace Layout
253
+
254
+ ```txt
255
+ <workspace>/
256
+ workforge.yaml
257
+ .env.example
258
+ inbox/
259
+ output/
260
+ ```
261
+
262
+ Workspace `.env` files are intentionally local-only. Commit `.env.example`, not
263
+ `.env`.
264
+
265
+ Environment variables are scoped to the selected workspace at runtime. WorkForge
266
+ reads `workspaces/<name>/.env` into an in-memory runtime object and passes those
267
+ values to the selected provider. It does not load workspace credentials into the
268
+ global process environment, which keeps simultaneous workspace runs isolated.
269
+
270
+ ## Workspace Modes
271
+
272
+ WorkForge supports two workspace styles.
273
+
274
+ Shared example workspaces live inside this repository:
275
+
276
+ ```txt
277
+ workspaces/trello-example/
278
+ workspaces/github-projects-example/
279
+ workspaces/jira-example/
280
+ ```
281
+
282
+ Project-local workspaces live inside the repository that the agent will modify:
283
+
284
+ ```txt
285
+ some-project/
286
+ .workforge/
287
+ workforge.yaml
288
+ .env.example
289
+ inbox/
290
+ output/
291
+ ```
292
+
293
+ Project-local workspaces are recommended when generating agent context for an
294
+ implementation task because `agent-context.md`, `status.json`, and `items.json`
295
+ stay close to the code being changed.
296
+
297
+ ## Jira Cloud
298
+
299
+ Create an Atlassian API token and keep the credentials in the selected
300
+ workspace's `.env`:
301
+
302
+ ```dotenv
303
+ JIRA_EMAIL=you@example.com
304
+ JIRA_API_TOKEN=
305
+ ```
306
+
307
+ Configure one Jira Cloud project:
308
+
309
+ ```yaml
310
+ providers:
311
+ jira:
312
+ site_url: https://example.atlassian.net
313
+ project_key: WF
314
+ issue_type: Task
315
+ labels:
316
+ feature: enhancement
317
+ versions:
318
+ v1: "10000"
319
+ status:
320
+ values:
321
+ todo: To Do
322
+ doing: In Progress
323
+ review: In Review
324
+ done: Done
325
+ ```
326
+
327
+ `labels`, `versions`, and status names reference resources that already exist
328
+ in Jira. WorkForge does not create or administer Jira projects, boards,
329
+ workflows, versions, or labels.
330
+
331
+ Validate access before creating issues:
332
+
333
+ ```bash
334
+ workforge providers test --workspace workspaces/jira-example --provider jira
335
+ workforge preview workspaces/jira-example/inbox/sample-requirements.md --workspace workspaces/jira-example
336
+ ```
337
+
338
+ Use the same provider-neutral `create`, `status`, `complete-task`,
339
+ `comment-item`, `move-item`, and `discover` commands shown above. Jira stores
340
+ descriptions, comments, and managed tasks as Atlassian Document Format and
341
+ changes statuses through transitions available from the issue's current state.
342
+
343
+ ## Input Format
344
+
345
+ The initial parser accepts Markdown sections with optional tasks:
346
+
347
+ ```md
348
+ ## Clarify customer data collection
349
+
350
+ Source: shopify_review
351
+ Priority: high
352
+ Milestone: release-2
353
+ Labels: compliance, required
354
+
355
+ Shopify asked us to explain what customer data is collected and why.
356
+
357
+ - Review current privacy copy
358
+ - Add explicit customer data disclosure
359
+ - Validate wording against Shopify review requirements
360
+ ```
361
+
362
+ Each `##` section becomes one provider-neutral requirement.
363
+
364
+ ## Output Files
365
+
366
+ Saved output is grouped by input filename under the selected workspace:
367
+
368
+ ```txt
369
+ workspaces/<name>/
370
+ inbox/
371
+ shopify-feedback-app-review.md
372
+ output/
373
+ shopify-feedback-app-review/
374
+ preview.json
375
+ items.json
376
+ status.json
377
+ agent-context.md
378
+ items/
379
+ fix-ui-operativa-post-instalacion.md
380
+ ```
381
+
382
+ `preview.json` contains the provider-neutral requirements parsed from the input.
383
+ `items.json` contains the items created by the selected provider, including IDs
384
+ and URLs when the provider returns them.
385
+ `status.json` contains the live provider status for saved items and tasks.
386
+ `agent-context.md` turns that status into implementation-ready context with
387
+ pending and completed tasks.
388
+ `items/*.md` contains focused implementation context for a single provider item.
389
+
390
+ ## Discovering Existing Items
391
+
392
+ Project-local workspaces can stay ignored by Git. To rebuild local tracking
393
+ files after cloning a project, discover items from the planning provider:
394
+
395
+ ```bash
396
+ workforge discover .workforge/inbox/shopify-feedback-app-review.md \
397
+ --workspace .workforge \
398
+ --provider trello \
399
+ --label shopify \
400
+ --save
401
+ ```
402
+
403
+ This writes:
404
+
405
+ ```txt
406
+ .workforge/output/shopify-feedback-app-review/items.json
407
+ ```
408
+
409
+ Then refresh status and agent context:
410
+
411
+ ```bash
412
+ workforge status .workforge/inbox/shopify-feedback-app-review.md --workspace .workforge --save
413
+ workforge agent-context .workforge/inbox/shopify-feedback-app-review.md --workspace .workforge --save
414
+ workforge item-context .workforge/inbox/shopify-feedback-app-review.md --workspace .workforge --item "Fix UI" --save
415
+ ```
416
+
417
+ For Trello, `--label` accepts a configured logical label name, a Trello label
418
+ ID, or a Trello label name. Logical labels are read from `workforge.yaml`:
419
+
420
+ ```yaml
421
+ providers:
422
+ trello:
423
+ list_id: "trello-list-id"
424
+ lists:
425
+ todo: "trello-todo-list-id"
426
+ doing: "trello-doing-list-id"
427
+ done: "trello-done-list-id"
428
+ labels:
429
+ shopify: "trello-label-id"
430
+ ```
431
+
432
+ ## GitHub Projects
433
+
434
+ The GitHub provider supports Projects v2 owned by a personal account. It creates
435
+ repository Issues, renders requirement tasks as GitHub checkboxes, and adds each
436
+ Issue to the configured Project.
437
+
438
+ ```yaml
439
+ providers:
440
+ github:
441
+ owner: github-user
442
+ repository: repository-name
443
+ project_number: 1
444
+ labels:
445
+ feature: enhancement
446
+ milestones:
447
+ v2: 1
448
+ status:
449
+ field: Status
450
+ values:
451
+ todo: Todo
452
+ doing: In Progress
453
+ done: Done
454
+ ```
455
+
456
+ Store a token with Issues and Projects read/write access in the workspace `.env`:
457
+
458
+ ```dotenv
459
+ GITHUB_TOKEN=
460
+ ```
461
+
462
+ Verify access without modifying GitHub:
463
+
464
+ ```bash
465
+ workforge providers test --workspace .workforge --provider github
466
+ ```
467
+
468
+ GitHub labels, milestones, and Status options must already exist. Logical labels,
469
+ milestones, and status aliases map through `workforge.yaml`; unmapped requirement
470
+ labels are ignored, while an unmapped milestone is rejected. Project workflows
471
+ may independently close an Issue when its Status moves to `Done`.
472
+
473
+ ## Trello Labels
474
+
475
+ Labels in Markdown are logical names. To attach real Trello labels to cards,
476
+ map those logical names to Trello label IDs in the workspace config:
477
+
478
+ ```yaml
479
+ providers:
480
+ trello:
481
+ list_id: "trello-list-id"
482
+ labels:
483
+ shopify-review: "trello-label-id"
484
+ compliance: "trello-label-id"
485
+ ```
486
+
487
+ WorkForge sends mapped labels as `idLabels` when creating Trello cards. Unmapped
488
+ labels are ignored by the Trello provider.
489
+
490
+ WorkForge does not create Trello labels yet. Create or rename labels in Trello
491
+ first, then paste their IDs into `workforge.yaml`.
492
+
493
+ To create a label through the Trello API:
494
+
495
+ ```bash
496
+ curl --request POST \
497
+ --url "https://api.trello.com/1/labels?name=shopify-review&color=blue&idBoard=TRELLO_BOARD_ID&key=$TRELLO_API_KEY&token=$TRELLO_API_TOKEN"
498
+ ```
499
+
500
+ To rename an existing label:
501
+
502
+ ```bash
503
+ curl --request PUT \
504
+ --url "https://api.trello.com/1/labels/TRELLO_LABEL_ID?name=shopify-review&key=$TRELLO_API_KEY&token=$TRELLO_API_TOKEN"
505
+ ```
506
+
507
+ To list labels for a board:
508
+
509
+ ```bash
510
+ curl "https://api.trello.com/1/boards/TRELLO_BOARD_ID/labels?fields=id,name,color&key=$TRELLO_API_KEY&token=$TRELLO_API_TOKEN"
511
+ ```
512
+
513
+ ## License
514
+
515
+ WorkForge is available under the [MIT License](https://github.com/Nanielito/workforge/blob/main/LICENSE).
@@ -0,0 +1,17 @@
1
+ workforge/__init__.py,sha256=tGGaO9hyqtgHuzeTJjq8SaEXbfK7osEDvkTLm8Y80Ho,75
2
+ workforge/cli.py,sha256=Gww4v20B8G44j2aeOgkPfWz0J6dkbDBMr65WnCK9ngM,27337
3
+ workforge/config.py,sha256=NFTx38MFd4GsVI63byJnLDYBgQwIM9CeFzT_zQWEjIE,1363
4
+ workforge/models.py,sha256=x4CtwbvIncS_ziX1HYLadN-OhIR3t1PrgnBYaBPSIro,1073
5
+ workforge/core/__init__.py,sha256=z9gVNSsNJGLvqUErQDmDXLVPjMVMAMdod-NyEXPJtBc,31
6
+ workforge/core/parser.py,sha256=yJtGq_KXQw5eHnrvClyzGM-SPz5BNctUzE0PjTDUxcc,2856
7
+ workforge/providers/__init__.py,sha256=cxzR7JnFNBur4fYukhNRFRbIx7HnJLypk8I7ZGfkEMs,34
8
+ workforge/providers/base.py,sha256=ek-VLDlWsnPQIA11kroLk_VpQOlZp-pZ5jWgZqsSn4w,1482
9
+ workforge/providers/github.py,sha256=uG5QRkldKsuQKViUDm1R6UbepP7zka9dOz8bBHr5HIk,24252
10
+ workforge/providers/jira.py,sha256=Z-AtvNN1U16orn0nNnYxhHT_gHSLjRB8bWqCdKVkf6I,21580
11
+ workforge/providers/registry.py,sha256=E8cEcUNSKGvDNKV_VrR-GrfLSM2sUOxIQTGqL9lPXyQ,617
12
+ workforge/providers/trello.py,sha256=T8Jy3eukdB3IsQkGI4v9CnA2OITQKS-XDR91sw7ncrM,18047
13
+ workforge-2.4.1.dist-info/METADATA,sha256=ma4PsGZfJI-1-xWjxvqLzA7rvyZh7IcnxRCVWD8clFs,15752
14
+ workforge-2.4.1.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
15
+ workforge-2.4.1.dist-info/entry_points.txt,sha256=ZvVNYSG4Ho2jsYzxouUxsI5R_T-f-ZosxmnlwET1WXs,48
16
+ workforge-2.4.1.dist-info/licenses/LICENSE,sha256=0eBeIBG2hWATtWifYvMsg8JmmG9h5yLaDZkEtfXYnOk,1071
17
+ workforge-2.4.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ workforge = workforge.cli:app
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Daniel Ramirez
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.