ww-agentic-workflows 1.0.0.dev3__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.
- ww/__init__.py +18 -0
- ww/_bundled_extensions/ww/git/extension.py +1728 -0
- ww/action_execution.py +887 -0
- ww/actions/__init__.py +94 -0
- ww/actions/command.py +444 -0
- ww/actions/contracts.py +699 -0
- ww/actions/extension.py +197 -0
- ww/actions/mcp.py +84 -0
- ww/actions/prompt.py +74 -0
- ww/actions/skill.py +62 -0
- ww/actions/slash_command.py +63 -0
- ww/agents.py +151 -0
- ww/amendments.py +54 -0
- ww/artifacts.py +93 -0
- ww/assessments.py +181 -0
- ww/assets/__init__.py +2 -0
- ww/assets/agent_instructions.md +49 -0
- ww/assets/docs/examples.md +879 -0
- ww/assets/docs/features.md +4639 -0
- ww/assets/docs/specification.md +1876 -0
- ww/assets/noww_skill.md +11 -0
- ww/assets/workflows/catchall.yaml +26 -0
- ww/assets/workflows/onboarding.yaml +586 -0
- ww/assets/workflows/scriptize.yaml +130 -0
- ww/assets/ww-automate_skill.md +23 -0
- ww/assets/ww-deduce-feedback_skill.md +38 -0
- ww/assets/ww-feedback-rules_skill.md +48 -0
- ww/assets/ww-learn-project_skill.md +22 -0
- ww/assets/ww-refresh_skill.md +26 -0
- ww/assets/ww-rule_skill.md +83 -0
- ww/assets/ww-rules-from-artifacts_skill.md +22 -0
- ww/assets/ww-scriptize_skill.md +33 -0
- ww/assets/ww-setup_skill.md +94 -0
- ww/assets/ww-solve_skill.md +23 -0
- ww/assets/ww-suggest_skill.md +32 -0
- ww/assets/ww-wizard_skill.md +105 -0
- ww/assets/ww_skill.md +59 -0
- ww/assignments.py +283 -0
- ww/bootstrap.py +405 -0
- ww/builtin_workflows.py +215 -0
- ww/changes.py +225 -0
- ww/child_coordination.py +482 -0
- ww/children.py +106 -0
- ww/claude_permissions.py +115 -0
- ww/cli/__init__.py +7 -0
- ww/cli/__main__.py +6 -0
- ww/cli/audit.py +129 -0
- ww/cli/catalogs.py +131 -0
- ww/cli/discover.py +607 -0
- ww/cli/initialization.py +898 -0
- ww/cli/lookup.py +287 -0
- ww/cli/main.py +1768 -0
- ww/cli/parser.py +1200 -0
- ww/cli/prompts.py +217 -0
- ww/cli/updates.py +117 -0
- ww/completion_artifacts.py +156 -0
- ww/completion_inputs.py +39 -0
- ww/config/__init__.py +582 -0
- ww/config/actions.py +591 -0
- ww/config/composition.py +571 -0
- ww/config/rules.py +511 -0
- ww/config/steps.py +1220 -0
- ww/config/values.py +223 -0
- ww/config_files.py +191 -0
- ww/config_writes.py +264 -0
- ww/contracts.py +155 -0
- ww/control.py +41 -0
- ww/defaults.py +130 -0
- ww/design_docs.py +32 -0
- ww/discovery.py +104 -0
- ww/documents.py +217 -0
- ww/errors.py +18 -0
- ww/executable.py +43 -0
- ww/execution_models/__init__.py +64 -0
- ww/execution_models/construction.py +148 -0
- ww/execution_models/decoding.py +38 -0
- ww/execution_models/plan_codec.py +565 -0
- ww/execution_models/records.py +1206 -0
- ww/execution_models/runs.py +266 -0
- ww/extensions/__init__.py +40 -0
- ww/extensions/api.py +559 -0
- ww/extensions/registry.py +864 -0
- ww/extensions/store.py +78 -0
- ww/feedback.py +342 -0
- ww/handler_repairs.py +57 -0
- ww/hooks/__init__.py +40 -0
- ww/hooks/agents.py +380 -0
- ww/hooks/install.py +168 -0
- ww/hooks/notices.py +206 -0
- ww/hooks/records.py +209 -0
- ww/hooks/runtime.py +266 -0
- ww/hooks/transcripts.py +183 -0
- ww/inspect.py +896 -0
- ww/instructions/__init__.py +17 -0
- ww/instructions/builder.py +1682 -0
- ww/instructions/commands.py +335 -0
- ww/instructions/handoff.py +149 -0
- ww/instructions/models.py +686 -0
- ww/instructions/policy.py +219 -0
- ww/instructions/text.py +168 -0
- ww/interactions.py +187 -0
- ww/interpolation.py +37 -0
- ww/item_passes.py +167 -0
- ww/items.py +99 -0
- ww/locking.py +207 -0
- ww/metadata_publication.py +230 -0
- ww/onboarding.py +229 -0
- ww/open_work.py +236 -0
- ww/operations.py +193 -0
- ww/operator_ui/__init__.py +16 -0
- ww/operator_ui/page.html +351 -0
- ww/operator_ui/server.py +215 -0
- ww/operator_ui/session.py +389 -0
- ww/operator_ui/sheet.py +104 -0
- ww/operator_ui/view.py +109 -0
- ww/output.py +339 -0
- ww/output_adapters/__init__.py +12 -0
- ww/output_adapters/base.py +25 -0
- ww/output_adapters/json_adapter.py +37 -0
- ww/output_adapters/markdown.py +2293 -0
- ww/output_adapters/rule_pages.py +337 -0
- ww/output_adapters/terminal.py +21 -0
- ww/package_updates.py +167 -0
- ww/plan/__init__.py +38 -0
- ww/plan/actions.py +207 -0
- ww/plan/compiler.py +1492 -0
- ww/plan/constructs.py +456 -0
- ww/plan/models.py +665 -0
- ww/project_config.py +752 -0
- ww/recovery.py +401 -0
- ww/replanning.py +367 -0
- ww/results.py +77 -0
- ww/rule_checks.py +230 -0
- ww/rule_conversion.py +331 -0
- ww/rule_disputes.py +148 -0
- ww/rule_store.py +456 -0
- ww/rule_verification.py +714 -0
- ww/rule_views.py +447 -0
- ww/rule_writes.py +920 -0
- ww/run_coordination.py +158 -0
- ww/runtimes.py +105 -0
- ww/service.py +4405 -0
- ww/setup_apply.py +428 -0
- ww/step_values.py +20 -0
- ww/storage.py +447 -0
- ww/storage_adapters/__init__.py +36 -0
- ww/storage_adapters/base.py +540 -0
- ww/storage_adapters/filesystem.py +370 -0
- ww/storage_adapters/memory.py +195 -0
- ww/storage_adapters/project_metadata.py +69 -0
- ww/storage_adapters/task_document.py +484 -0
- ww/task_ids.py +114 -0
- ww/task_references.py +124 -0
- ww/transitions.py +1619 -0
- ww/updates.py +399 -0
- ww/upgrade.py +95 -0
- ww/validation.py +168 -0
- ww/variables.py +275 -0
- ww/workflow_config.py +854 -0
- ww/workflow_update.py +239 -0
- ww/workflow_validation.py +1260 -0
- ww/workspace.py +50 -0
- ww_agentic_workflows-1.0.0.dev3.dist-info/METADATA +690 -0
- ww_agentic_workflows-1.0.0.dev3.dist-info/RECORD +167 -0
- ww_agentic_workflows-1.0.0.dev3.dist-info/WHEEL +4 -0
- ww_agentic_workflows-1.0.0.dev3.dist-info/entry_points.txt +2 -0
- ww_agentic_workflows-1.0.0.dev3.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,690 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: ww-agentic-workflows
|
|
3
|
+
Version: 1.0.0.dev3
|
|
4
|
+
Summary: A local-first, resumable workflow CLI for people and AI agents.
|
|
5
|
+
Project-URL: Homepage, https://agenticworkflows.dev
|
|
6
|
+
Project-URL: Documentation, https://github.com/from-developers-for-developers/agentic-workflows/tree/main/documentation
|
|
7
|
+
Project-URL: Repository, https://github.com/from-developers-for-developers/agentic-workflows
|
|
8
|
+
Project-URL: Issues, https://github.com/from-developers-for-developers/agentic-workflows/issues
|
|
9
|
+
Project-URL: Security, https://github.com/from-developers-for-developers/agentic-workflows/security/advisories/new
|
|
10
|
+
Project-URL: Changelog, https://github.com/from-developers-for-developers/agentic-workflows/blob/main/CHANGELOG.md
|
|
11
|
+
Author: ww contributors
|
|
12
|
+
License: GPL-3.0-or-later
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Keywords: agents,automation,cli,coding-agents,mcp,workflow
|
|
15
|
+
Classifier: Development Status :: 4 - Beta
|
|
16
|
+
Classifier: Environment :: Console
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
19
|
+
Classifier: Operating System :: MacOS
|
|
20
|
+
Classifier: Operating System :: POSIX
|
|
21
|
+
Classifier: Programming Language :: Python :: 3
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
26
|
+
Classifier: Topic :: Software Development
|
|
27
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
28
|
+
Requires-Python: >=3.10
|
|
29
|
+
Requires-Dist: packaging>=24.0
|
|
30
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
33
|
+
Requires-Dist: mypy>=1.11; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest>=8.3; extra == 'dev'
|
|
36
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
37
|
+
Description-Content-Type: text/markdown
|
|
38
|
+
|
|
39
|
+
# ww - agentic workflows
|
|
40
|
+
|
|
41
|
+
`ww-agentic-workflows` is a local-first CLI for defining and running repeatable
|
|
42
|
+
workflows with coding agents. It compiles `ww.yaml` into an explicit plan,
|
|
43
|
+
separates work performed by the agent from automation performed by `ww`, and
|
|
44
|
+
saves task state so work can be inspected and resumed.
|
|
45
|
+
|
|
46
|
+
Use it when a development process needs more structure than a prompt: workflow
|
|
47
|
+
hooks, reusable handlers, worker-stoppable review/fix loops, MCP-backed
|
|
48
|
+
actions, saved artifacts, and a durable record of what ran.
|
|
49
|
+
|
|
50
|
+
Website: <https://agenticworkflows.dev>
|
|
51
|
+
|
|
52
|
+
> **ww is in beta.** `ww.yaml` syntax, task state, and commands may
|
|
53
|
+
> still change; [documentation/limitations.md](documentation/limitations.md)
|
|
54
|
+
> says what is not promised yet. `ww-agentic-workflows --version` and `init`
|
|
55
|
+
> say so too.
|
|
56
|
+
|
|
57
|
+
## See it run
|
|
58
|
+
|
|
59
|
+
`scripts/demo.sh` builds a throwaway project in a temporary directory,
|
|
60
|
+
initializes ww in it, writes a two-step workflow with a test handler, and runs
|
|
61
|
+
one task from start to completion. Nothing outside that directory is touched:
|
|
62
|
+
|
|
63
|
+
```console
|
|
64
|
+
scripts/demo.sh
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Abridged, it looks like this. The agent runs these commands; ww answers each
|
|
68
|
+
one with the next:
|
|
69
|
+
|
|
70
|
+
```console
|
|
71
|
+
$ ./ww start TASK-1 --workflow task --agent claudecode \
|
|
72
|
+
--requirements "Add retry handling to the upload client." --role manager
|
|
73
|
+
|
|
74
|
+
# TASK-1 · task
|
|
75
|
+
## Manager and worker: dispatch the `develop` assignment
|
|
76
|
+
### Manager command
|
|
77
|
+
To continue the workflow, run:
|
|
78
|
+
./ww next TASK-1 --role manager
|
|
79
|
+
|
|
80
|
+
$ ./ww next TASK-1 --role manager
|
|
81
|
+
|
|
82
|
+
# TASK-1 · task
|
|
83
|
+
## Manager and worker: perform `develop`
|
|
84
|
+
### Task requirements
|
|
85
|
+
Add retry handling to the upload client.
|
|
86
|
+
### Work instruction
|
|
87
|
+
Implement the requested change.
|
|
88
|
+
### Next steps
|
|
89
|
+
- document
|
|
90
|
+
### Worker completion command
|
|
91
|
+
./ww complete TASK-1 --role worker --artifact="<whole result in Markdown>" \
|
|
92
|
+
--summary="<one or two sentences for the next step>"
|
|
93
|
+
|
|
94
|
+
$ ./ww complete TASK-1 --role worker \
|
|
95
|
+
--artifact "Added exponential backoff to UploadClient.send." \
|
|
96
|
+
--summary "Retries land in UploadClient.send; document the backoff settings."
|
|
97
|
+
|
|
98
|
+
# TASK-1 · task
|
|
99
|
+
> Completion recorded successfully by `ww`.
|
|
100
|
+
## Manager and worker: perform `document`
|
|
101
|
+
### Previous step result
|
|
102
|
+
The `develop` step left this summary for you:
|
|
103
|
+
> Retries land in UploadClient.send; document the backoff settings.
|
|
104
|
+
...
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
The test handler in that workflow ran inside the `complete` — ww executed it
|
|
108
|
+
itself, and the agent never saw it as work of its own.
|
|
109
|
+
|
|
110
|
+
## Beta
|
|
111
|
+
|
|
112
|
+
ww is in beta and under active development. Expect rough edges, and expect to
|
|
113
|
+
hit them: unclear instructions to your agent, a handler that fails in a way ww
|
|
114
|
+
does not yet explain well, a workflow shape that does not compile.
|
|
115
|
+
|
|
116
|
+
Please report them at
|
|
117
|
+
[GitHub Issues](https://github.com/from-developers-for-developers/agentic-workflows/issues).
|
|
118
|
+
A report is most useful with all four of these:
|
|
119
|
+
|
|
120
|
+
1. **The workflow.** The relevant part of your `ww.yaml`, reduced to
|
|
121
|
+
what still reproduces the problem.
|
|
122
|
+
2. **The command you ran**, its exit code, and the exact message ww printed.
|
|
123
|
+
3. **What you expected instead.**
|
|
124
|
+
4. **Your agent's own account of what went wrong.** If you hit this while
|
|
125
|
+
working through an agent, ask it to summarise what it ran, what ww told it,
|
|
126
|
+
and where it got stuck, and paste that. It is often the fastest route to the
|
|
127
|
+
real cause.
|
|
128
|
+
|
|
129
|
+
Sanitise before pasting: `.ww/` and command output may contain credentials or
|
|
130
|
+
other private values. See [Sensitive runtime data](#sensitive-runtime-data) below.
|
|
131
|
+
|
|
132
|
+
Two things worth reading before you rely on it:
|
|
133
|
+
[Stability and compatibility](#stability-and-compatibility), for what is
|
|
134
|
+
settled and what is not, and
|
|
135
|
+
[documentation/limitations.md](documentation/limitations.md), which lists what
|
|
136
|
+
ww deliberately does not do yet so you can tell a limitation from a bug.
|
|
137
|
+
|
|
138
|
+
## Getting started
|
|
139
|
+
|
|
140
|
+
### 1. Install
|
|
141
|
+
|
|
142
|
+
Python 3.10 or newer and [pipx](https://pipx.pypa.io/) are required. Install
|
|
143
|
+
ww from PyPI:
|
|
144
|
+
|
|
145
|
+
```console
|
|
146
|
+
pipx install --pip-args=--pre ww-agentic-workflows
|
|
147
|
+
ww-agentic-workflows --version
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
The package is `ww-agentic-workflows`. Until a stable release exists, PyPI
|
|
151
|
+
holds development snapshots, `1.0.0.devN`, which `--pre` selects. Each one is
|
|
152
|
+
built from `dev` after the automated checks pass; see
|
|
153
|
+
[Releases and branches](#releases-and-branches). To move to the newest
|
|
154
|
+
snapshot later:
|
|
155
|
+
|
|
156
|
+
```console
|
|
157
|
+
ww-agentic-workflows upgrade
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
To keep a second install beside the first, give it its own global name with
|
|
161
|
+
pipx's `--suffix`, for example
|
|
162
|
+
`pipx install --suffix=-dev --pip-args=--pre ww-agentic-workflows`, and set
|
|
163
|
+
`"executable": "ww-agentic-workflows-dev"` in the `ww.json` of each project
|
|
164
|
+
that should use it. ww then prints that binary in every command, and the
|
|
165
|
+
project's `./ww` runs it. [Development releases](documentation/development-releases.md#a-development-channel-beside-a-stable-one)
|
|
166
|
+
covers this setup.
|
|
167
|
+
|
|
168
|
+
#### From a source checkout
|
|
169
|
+
|
|
170
|
+
To run `main` directly, or to work on ww itself, install a clone in editable
|
|
171
|
+
mode instead. The package name is the same, so remove a PyPI install first
|
|
172
|
+
with `pipx uninstall ww-agentic-workflows`, or give the checkout a suffix:
|
|
173
|
+
|
|
174
|
+
```console
|
|
175
|
+
mkdir -p ~/tools
|
|
176
|
+
git clone https://github.com/from-developers-for-developers/agentic-workflows.git \
|
|
177
|
+
~/tools/agentic-workflows
|
|
178
|
+
pipx install --editable ~/tools/agentic-workflows
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Editable installation keeps the command connected to that checkout; after a
|
|
182
|
+
`git pull` in `~/tools/agentic-workflows`, the new code is live with no
|
|
183
|
+
reinstall, and `ww-agentic-workflows upgrade` performs that pull for you.
|
|
184
|
+
[CONTRIBUTING.md](CONTRIBUTING.md) describes the development environment for
|
|
185
|
+
changing ww.
|
|
186
|
+
|
|
187
|
+
### 2. Initialize your project
|
|
188
|
+
|
|
189
|
+
Run `init` from the root of the project you want to run workflows in:
|
|
190
|
+
|
|
191
|
+
```console
|
|
192
|
+
cd /path/to/your-project
|
|
193
|
+
ww-agentic-workflows init
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
The wizard asks a few questions and then sets the project up:
|
|
197
|
+
|
|
198
|
+
- **`ww.yaml`** — an empty, structured file for you to fill in.
|
|
199
|
+
- **`./ww`** — a small launcher, so every later command is `./ww <command>`
|
|
200
|
+
from the project root regardless of where you are installed.
|
|
201
|
+
- **`WW_AGENT_INSTRUCTIONS.md`** — the instructions your agents read.
|
|
202
|
+
- **`ww.json`** — project configuration: task ID format,
|
|
203
|
+
enabled extensions, base branches, optional multi-repository `projects`.
|
|
204
|
+
- **Git setup**, in a Git repository: it enables the bundled `ww/git`
|
|
205
|
+
extension and asks about worktrees and branch formats, and offers to keep
|
|
206
|
+
`.ww/` out of Git (`.ww/*` in `.gitignore`), except the files where ww
|
|
207
|
+
records what it learned about the project (`.ww/project.md`), which is
|
|
208
|
+
meant to be committed. It also keeps local configuration files
|
|
209
|
+
(`*ww.local.yaml`, `*ww.local.json`,
|
|
210
|
+
`ww-setup.local.yaml`) out of Git.
|
|
211
|
+
- **Agent skills** — for each agent directory it finds (`.claude/`, `.codex/`
|
|
212
|
+
and so on), it offers to install a `ww` skill, so you can ask the agent to
|
|
213
|
+
work through ww by name, a `noww` skill, so you can tell it to leave ww
|
|
214
|
+
out, a `ww-rule` skill, which turns your own words into rules for ww's
|
|
215
|
+
steps, and the `ww-setup` skill with the skills it guides through
|
|
216
|
+
(`ww-learn-project`, `ww-suggest`, `ww-refresh`, `ww-solve`,
|
|
217
|
+
`ww-rules-from-artifacts`, `ww-automate`, `ww-scriptize`), a `ww-wizard`
|
|
218
|
+
skill that helps you create or change a workflow, improve rules or pick an
|
|
219
|
+
approach (changes to an existing workflow go through `ww setup update`), and
|
|
220
|
+
`ww-deduce-feedback` and `ww-feedback-rules` for learning from completed
|
|
221
|
+
artifacts and proposing rules.
|
|
222
|
+
- **Your user configuration directory**, `~/.config/ww/`,
|
|
223
|
+
where settings of your own for every project live.
|
|
224
|
+
|
|
225
|
+
For Claude Code it can also write, if you opt in, Bash allow rules for ww's role
|
|
226
|
+
commands (through the project wrapper's absolute path) into
|
|
227
|
+
`.claude/settings.local.json`, keeping that file out of Git; `init --permissions`
|
|
228
|
+
answers the question yes, as described in [features](documentation/features.md).
|
|
229
|
+
|
|
230
|
+
It finishes by printing any manual additions you still need in `AGENTS.md` or
|
|
231
|
+
`CLAUDE.md`, the exact permission entries that let your agents run ww without
|
|
232
|
+
asking each time (for Claude Code, the lines to add to
|
|
233
|
+
`.claude/settings.json`), a reminder to define a workflow, and the next step:
|
|
234
|
+
run the `ww-setup` skill to set ww up for this project.
|
|
235
|
+
That skill learns the repository (what it is for, its stack, commands, CI,
|
|
236
|
+
review and release process, conventions and recurring pitfalls), asks a few
|
|
237
|
+
questions about your process (express setup skips them and derives defaults
|
|
238
|
+
from the project), and proposes a minimal setup shaped by the project's own
|
|
239
|
+
branches, commands and history, each piece with the evidence for it, which
|
|
240
|
+
you try alone first and share with the team if you like. It never interviews
|
|
241
|
+
you about who you are, your role, your team or your company. Each part is optional and shows you every change before ww places it; see [Setting ww up](documentation/features.md#setting-ww-up-learning-and-suggestions).
|
|
242
|
+
|
|
243
|
+
`init` takes flags for every prompt if you would rather not answer them
|
|
244
|
+
interactively — `--no-input` accepts all defaults, and
|
|
245
|
+
`ww-agentic-workflows init --help` lists the rest.
|
|
246
|
+
|
|
247
|
+
Running `init` again is safe. It restores missing ww-owned files and
|
|
248
|
+
directories and leaves your own content alone. `init --force` asks every
|
|
249
|
+
question again, ignoring your saved answers, so you can add agents, skills or
|
|
250
|
+
hooks later; it only ever adds.
|
|
251
|
+
|
|
252
|
+
### 3. Define a workflow
|
|
253
|
+
|
|
254
|
+
Open `ww.yaml` and describe the process as a list of steps. The
|
|
255
|
+
smallest useful workflow is all agent work:
|
|
256
|
+
|
|
257
|
+
```yaml
|
|
258
|
+
workflows:
|
|
259
|
+
- name: task
|
|
260
|
+
description: Implement a small change end to end.
|
|
261
|
+
steps:
|
|
262
|
+
- develop: Implement the requested change.
|
|
263
|
+
- test: Run the tests and fix what fails.
|
|
264
|
+
- document: Update the documentation the change affects.
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Every workflow also gets an implicit first `init` step, which records the
|
|
268
|
+
requirements for the whole task.
|
|
269
|
+
|
|
270
|
+
As the configuration grows, `ww.yaml` can split its definitions across
|
|
271
|
+
other YAML files it lists under `imports`; see
|
|
272
|
+
[the features guide](documentation/features.md#split-wwyaml-into-several-files).
|
|
273
|
+
Both files can also be extended for you alone, across all your projects, in
|
|
274
|
+
`~/.config/ww/ww.yaml` and `.json` (a
|
|
275
|
+
directory `init` creates), and per checkout, in `ww.local.yaml`
|
|
276
|
+
and `.json` next to the repo files; see [user, repo, and local
|
|
277
|
+
configuration](documentation/features.md#user-repo-and-local-configuration).
|
|
278
|
+
|
|
279
|
+
Check it before you run anything:
|
|
280
|
+
|
|
281
|
+
```console
|
|
282
|
+
./ww lint
|
|
283
|
+
./ww plan --workflow task --agent claudecode
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
`lint` validates the file on its own. `plan` compiles one workflow into the
|
|
287
|
+
exact, ordered plan that would run — every step, hook, and handler — without
|
|
288
|
+
creating any task state.
|
|
289
|
+
|
|
290
|
+
[documentation/examples.md](documentation/examples.md) has twenty-one complete,
|
|
291
|
+
tested `ww.yaml` examples, from this one up to loops, per-item work,
|
|
292
|
+
child tasks, and Git integration.
|
|
293
|
+
|
|
294
|
+
### 4. Ask your agent to do the work
|
|
295
|
+
|
|
296
|
+
You do not drive ww by hand. You ask your coding agent for the work in the
|
|
297
|
+
usual way, and it runs ww for you:
|
|
298
|
+
|
|
299
|
+
> Implement retry handling in the upload client. Use ww.
|
|
300
|
+
|
|
301
|
+
`init` has already given the agent everything it needs to act on that:
|
|
302
|
+
`WW_AGENT_INSTRUCTIONS.md` tells it to route project work through ww, and the
|
|
303
|
+
installed `ww` skill lets you name the tool explicitly. From there the agent
|
|
304
|
+
starts at `./ww discover`, which tells it whether to use ww in this project
|
|
305
|
+
by default, only when you ask for it, or not at all, and lists the project's workflows,
|
|
306
|
+
modes, and the exact commands to start and resume work. It picks the workflow matching your request and opens the
|
|
307
|
+
task:
|
|
308
|
+
|
|
309
|
+
```console
|
|
310
|
+
./ww start TASK-123 --workflow task --agent claudecode \
|
|
311
|
+
--requirements "Add retry handling to the upload client." --role manager
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
That command is the agent's, not yours — but it is worth being able to read
|
|
315
|
+
one:
|
|
316
|
+
|
|
317
|
+
- `TASK-123` is the task ID. When your request names a ticket, the agent uses
|
|
318
|
+
that key, so ww's task matches the issue. Otherwise ww assigns one in the
|
|
319
|
+
format chosen during `init`.
|
|
320
|
+
- `--agent` is the agent integration in use: `codex`, `claudecode`, `gemini`,
|
|
321
|
+
`antigravity`, `deepseek`, `kimi`, `cursor`, `grok`, or `custom:<name>`.
|
|
322
|
+
- `--requirements` is your request, normalized into the task's requirements.
|
|
323
|
+
- `--role manager` is the role driving the task; a worker performing a single
|
|
324
|
+
assignment uses `--role worker`.
|
|
325
|
+
|
|
326
|
+
A request no workflow fits still goes through ww once it changes files. The
|
|
327
|
+
agent records it with `catchall`, a one-step workflow ww provides to every
|
|
328
|
+
project, and otherwise works exactly as it would without ww. Questions and
|
|
329
|
+
other read-only work never start a task. The agent first runs `./ww lookup`
|
|
330
|
+
with the task you named, however you wrote it (`12345` finds `FOOBAR-12345`),
|
|
331
|
+
and a task ww has never seen is only created after you confirm it in the
|
|
332
|
+
agent's choice menu. Say `/noww` when you want the
|
|
333
|
+
agent to leave ww out.
|
|
334
|
+
|
|
335
|
+
If you would rather open the task yourself — to pin an external ticket key, or
|
|
336
|
+
to hand a prepared task to an agent — the same command works typed in.
|
|
337
|
+
|
|
338
|
+
### 5. Let it run, and watch what it does
|
|
339
|
+
|
|
340
|
+
From there the agent works the task to its end. Every ww response finishes by
|
|
341
|
+
printing the exact next command, so the agent always knows what follows: `next`
|
|
342
|
+
opens a step and prints its instructions, the agent does that step, and
|
|
343
|
+
`complete` records the result and moves on.
|
|
344
|
+
|
|
345
|
+
```console
|
|
346
|
+
./ww next TASK-123 --role manager
|
|
347
|
+
./ww complete TASK-123 --role worker --artifact "What this step produced." \
|
|
348
|
+
--summary "The short handover the next step needs."
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
One completion rarely finishes a task; the agent keeps going until ww reports
|
|
352
|
+
the workflow complete. Automatic handlers — your tests, linters, commits — run
|
|
353
|
+
inside `next` and `complete`, executed by ww itself, and the agent never runs
|
|
354
|
+
them or works around them.
|
|
355
|
+
|
|
356
|
+
Your part is to answer when asked and to look in when you want to. These are
|
|
357
|
+
the commands worth knowing:
|
|
358
|
+
|
|
359
|
+
```console
|
|
360
|
+
./ww status TASK-123 # compact: workflow, current step and state, runtime, agent
|
|
361
|
+
./ww artifacts TASK-123 # what each step produced
|
|
362
|
+
./ww instruction TASK-123 --role manager # the full current instructions
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
`instruction` is also how work resumes: a new session, or a different agent,
|
|
366
|
+
picks up a task it did not start by reading it.
|
|
367
|
+
|
|
368
|
+
Two things will interrupt the agent and come back to you. An **interactive
|
|
369
|
+
step** is a question ww requires a human to answer — the agent asks it in your
|
|
370
|
+
own chat, or opens a local operator page for a per-item answer sheet, and the
|
|
371
|
+
task waits. An **automatic handler failing** — a test suite that will not pass,
|
|
372
|
+
a commit that is rejected — stops the task and reports the error, because
|
|
373
|
+
recovery is your decision, not the agent's: retry the handler, or force past it
|
|
374
|
+
with a recorded reason. A stop for an incomplete item pass (`pass_incomplete`)
|
|
375
|
+
is cleared by recording the missing values with `update-item` and then
|
|
376
|
+
`next --retry`; forcing is refused there.
|
|
377
|
+
|
|
378
|
+
If the agent's own work genuinely cannot be finished, it records that rather
|
|
379
|
+
than leaving the task open:
|
|
380
|
+
|
|
381
|
+
```console
|
|
382
|
+
./ww fail TASK-123 --role worker --error "<reason>"
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## How it works
|
|
386
|
+
|
|
387
|
+
`ww` runs CLI handlers itself. The agent performs prompts, skills, slash
|
|
388
|
+
commands, and MCP actions, then reports their results with the exact `complete`
|
|
389
|
+
command shown by the CLI. One manager `next` dispatches a step lifecycle; the
|
|
390
|
+
worker completes its main action and its agent-owned workflow hooks until ww explicitly
|
|
391
|
+
hands control back. Each started workflow uses a saved plan, so later
|
|
392
|
+
configuration edits cannot alter work already in progress.
|
|
393
|
+
|
|
394
|
+
After a workflow finishes, ww suggests feedback deduction from artifacts of
|
|
395
|
+
steps marked `learnable: true`. The `ww-deduce-feedback` skill records
|
|
396
|
+
candidates with evidence, counters and encounter times. This is enabled by
|
|
397
|
+
default; set `"feedback_learning": false` in `ww.json` to disable it. Invoke
|
|
398
|
+
`/ww-feedback-rules` separately to review candidates, approve rules and prune
|
|
399
|
+
stale points. See [feedback learning](documentation/features.md#learning-from-operator-feedback)
|
|
400
|
+
for commands and examples.
|
|
401
|
+
|
|
402
|
+
### Runtimes: who actually performs a step
|
|
403
|
+
|
|
404
|
+
Every task runs manager and worker responsibilities — the manager dispatches
|
|
405
|
+
assignments and handles recovery, the worker performs one assignment and
|
|
406
|
+
reports it. A **runtime** decides where those two live. The plan and the
|
|
407
|
+
commands are identical either way; only the division of labour differs.
|
|
408
|
+
|
|
409
|
+
| Runtime | Who does the work |
|
|
410
|
+
| --- | --- |
|
|
411
|
+
| `single` (the default) | One session is both manager and worker and performs every assignment itself. No subagents. |
|
|
412
|
+
| `auto` | The manager delegates each assignment to a worker agent it selects, and records which one it used. |
|
|
413
|
+
|
|
414
|
+
Choose one with `--runtime` / `-r` on `start`. Omitted, ww takes the workflow's
|
|
415
|
+
own `runtime` if it declares one, then `"runtime"` in
|
|
416
|
+
`ww.json`, and falls back to `single`. The flag always wins.
|
|
417
|
+
|
|
418
|
+
This is what makes the next part meaningful. Workflows, steps, and handlers may
|
|
419
|
+
request an `agent`, `model`, and `reasoning` — always advisory, never binding.
|
|
420
|
+
In `auto` the manager reads them when picking a worker, and records the worker
|
|
421
|
+
it actually chose. In `single` there is nobody to delegate to, so ww keeps the
|
|
422
|
+
requests on the saved plan for inspection and otherwise ignores them: your own
|
|
423
|
+
session's settings are the ones in force.
|
|
424
|
+
|
|
425
|
+
An optional `projects` list in `ww.json` lets one ww instance
|
|
426
|
+
coordinate tasks and child tasks across several repositories, each working in
|
|
427
|
+
its own directory. Set `"enabled": false` in `ww.json` to tell
|
|
428
|
+
agents not to use ww in a project at all.
|
|
429
|
+
|
|
430
|
+
## Releases and branches
|
|
431
|
+
|
|
432
|
+
Every push to `dev` publishes a development snapshot to PyPI as
|
|
433
|
+
`ww-agentic-workflows` `1.0.0.devN`, after the automated checks pass. Snapshots
|
|
434
|
+
are for using and testing unreleased changes; install them as shown in
|
|
435
|
+
[Install](#1-install). A source installation, `pipx install --editable` from a
|
|
436
|
+
clone, follows whichever branch the checkout tracks.
|
|
437
|
+
|
|
438
|
+
See [development releases](documentation/development-releases.md) for
|
|
439
|
+
publishing setup and versioning. Beta and stable package publishing are not
|
|
440
|
+
configured yet. The branches serve these purposes:
|
|
441
|
+
|
|
442
|
+
| Branch | Use it for |
|
|
443
|
+
| --- | --- |
|
|
444
|
+
| `main` | What contributions branch from, and what a source checkout should track. It receives updates frequently. |
|
|
445
|
+
| `dev` | The maintainers' in-flight work, from which the PyPI development snapshots are built. Do not target it in a contribution pull request. |
|
|
446
|
+
|
|
447
|
+
To update either a source checkout or a package installation:
|
|
448
|
+
|
|
449
|
+
```console
|
|
450
|
+
ww-agentic-workflows upgrade
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
Source checkouts update their tracking branch with a fast-forward pull; local
|
|
454
|
+
changes are preserved by refusing to upgrade a dirty checkout. Package installs
|
|
455
|
+
upgrade through pip or pipx. Stable installs follow stable releases; development,
|
|
456
|
+
beta and RC installs also allow prereleases. `upgrade --pre` opts a stable
|
|
457
|
+
installation into prereleases.
|
|
458
|
+
|
|
459
|
+
WW checks for updates at most once a day and shows a short notice above normal
|
|
460
|
+
command output. Source installations compare Git commits; package installations
|
|
461
|
+
compare PyPI versions. Checks remain silent when offline. `upgrade` does not
|
|
462
|
+
wait for open tasks; skim [CHANGELOG.md](CHANGELOG.md) first, because a release
|
|
463
|
+
that changes the task state format can leave tasks in progress unreadable.
|
|
464
|
+
|
|
465
|
+
```console
|
|
466
|
+
ww-agentic-workflows updates # show the cached notice
|
|
467
|
+
ww-agentic-workflows updates --now # check now
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
Set `"update_check": false` in `ww.json` to switch notices off for a project,
|
|
471
|
+
or `WW_UPDATE_CHECK=0` to switch them off everywhere. See
|
|
472
|
+
[update notices and upgrading](documentation/features.md#update-notices-and-upgrading-ww)
|
|
473
|
+
for the installer behavior and task checks.
|
|
474
|
+
|
|
475
|
+
## Stability and compatibility
|
|
476
|
+
|
|
477
|
+
The shape of ww has largely settled. `ww.yaml` and the command surface
|
|
478
|
+
have been stable in practice for a while, and most work on `main` now is
|
|
479
|
+
internal refactoring, new capabilities, and fixes rather than changes to what
|
|
480
|
+
you have already written. Frequent updates do not mean frequent breakage.
|
|
481
|
+
|
|
482
|
+
Development snapshots can be pinned, but there is not yet a formal deprecation
|
|
483
|
+
cycle or a promise that an incompatible change could not land.
|
|
484
|
+
When one does, it is deliberate and rare, and
|
|
485
|
+
[CHANGELOG.md](CHANGELOG.md) marks it "Breaking:". A changed name is then an
|
|
486
|
+
unknown key that `lint` reports, and saved task state in another schema
|
|
487
|
+
version is refused rather than guessed at: finish or reset in-flight tasks
|
|
488
|
+
first.
|
|
489
|
+
|
|
490
|
+
| Surface | Where it stands |
|
|
491
|
+
| --- | --- |
|
|
492
|
+
| `ww.yaml` | Settled. Keys are added far more often than they change, and `lint` tells you immediately if something no longer parses. |
|
|
493
|
+
| The CLI | Settled for interactive use. Commands, flags, and printed text are still not a machine interface — use `--json` if a script depends on output. |
|
|
494
|
+
| Task state under `.ww/` | The volatile one. The on-disk format is versioned and the reader rejects any other version, so an unfinished task may not load after an upgrade. |
|
|
495
|
+
| The extension API | Documented and the most deliberate of these; changes are announced. |
|
|
496
|
+
|
|
497
|
+
Two habits cover almost everything:
|
|
498
|
+
|
|
499
|
+
- **Finish or `reset` in-flight tasks before you upgrade.** This is the one that
|
|
500
|
+
actually bites people — a task started last week refusing to load this week.
|
|
501
|
+
Completed tasks are unaffected.
|
|
502
|
+
- **Skim [CHANGELOG.md](CHANGELOG.md) when you update.** ww tells you when a
|
|
503
|
+
newer version is available; for a source checkout it also shows the entries
|
|
504
|
+
you would be pulling in.
|
|
505
|
+
|
|
506
|
+
If you want a fixed target anyway, pin a snapshot and move deliberately:
|
|
507
|
+
`pipx install --force ww-agentic-workflows==1.0.0.dev42`, or
|
|
508
|
+
`git -C ~/tools/agentic-workflows checkout <sha>` for a source checkout. Once
|
|
509
|
+
ww reaches a stable release, the package will carry the usual guarantees.
|
|
510
|
+
[documentation/limitations.md](documentation/limitations.md) has the detail,
|
|
511
|
+
alongside the execution model and the workflow shapes ww does not support.
|
|
512
|
+
|
|
513
|
+
## Supported platforms
|
|
514
|
+
|
|
515
|
+
ww supports Python 3.10 and newer on POSIX systems, including current Linux
|
|
516
|
+
and macOS releases. Its filesystem locking uses POSIX `fcntl`; native Windows
|
|
517
|
+
is not supported. Windows users can run ww in a POSIX-compatible environment
|
|
518
|
+
such as WSL.
|
|
519
|
+
|
|
520
|
+
Task state and saved plans are private runtime data, not a general-purpose
|
|
521
|
+
interchange format; do not edit them by hand. Extension authors should use
|
|
522
|
+
only the documented public extension API.
|
|
523
|
+
|
|
524
|
+
## Sensitive runtime data
|
|
525
|
+
|
|
526
|
+
Treat `.ww/` as private runtime data, apart from the shared learning file
|
|
527
|
+
`project.md`, which is meant for the repository. It can contain task errors, worker
|
|
528
|
+
artifacts, command stdout/stderr, metadata, and configured extension settings;
|
|
529
|
+
any of those may include credentials or other sensitive values supplied to a
|
|
530
|
+
workflow. The audit file `.ww/executions.jsonl` is owner-readable only and
|
|
531
|
+
records redacted invocations plus a stable error code, not arbitrary error
|
|
532
|
+
text. It is an audit aid, not a general secret-scrubbing system.
|
|
533
|
+
|
|
534
|
+
Do not send `.ww/`, task-state JSON, command-output files, or settings
|
|
535
|
+
snapshots in a support request by default. Start with the ww version, the
|
|
536
|
+
workflow name, a manually sanitized error summary, and the output of commands
|
|
537
|
+
that you have reviewed for sensitive values. If protected runtime detail is
|
|
538
|
+
needed, remove secrets first and share only the smallest relevant copy through
|
|
539
|
+
your approved channel. Prefer environment variables or a secret manager over
|
|
540
|
+
placing credentials in workflow configuration, metadata, or command arguments.
|
|
541
|
+
|
|
542
|
+
[SECURITY.md](SECURITY.md) describes what ww can do on your machine — where
|
|
543
|
+
the trust boundary sits, what runs your configuration, and what reaches the
|
|
544
|
+
network — and how to report a vulnerability privately rather than in a public
|
|
545
|
+
issue.
|
|
546
|
+
|
|
547
|
+
## Git branches and worktrees
|
|
548
|
+
|
|
549
|
+
The bundled Git extension accepts a project-wide base branch and
|
|
550
|
+
workflow-specific overrides in `ww.json`. A base can be a
|
|
551
|
+
literal branch name or an `argv` command whose single non-empty stdout line
|
|
552
|
+
names the branch:
|
|
553
|
+
|
|
554
|
+
```json
|
|
555
|
+
{
|
|
556
|
+
"extensions": {
|
|
557
|
+
"ww/git": {
|
|
558
|
+
"base_branches": {
|
|
559
|
+
"default": "main",
|
|
560
|
+
"bugfix": "develop",
|
|
561
|
+
"task": {"argv": ["./scripts/base-branch", "{{ww.task.workflow}}"]}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
An entry named after the workflow wins over `default`. Commands run directly,
|
|
569
|
+
without a shell, from the project root and may interpolate `{{ww.task.id}}`,
|
|
570
|
+
`{{ww.task.workflow}}`, and `{{ww.task.run}}`. Child tasks still branch from their recorded
|
|
571
|
+
parent branch.
|
|
572
|
+
|
|
573
|
+
## A larger workflow
|
|
574
|
+
|
|
575
|
+
This example combines reusable handlers, workflow hooks, a Jira MCP step,
|
|
576
|
+
agent instructions, structured CLI automation, and values passed between steps:
|
|
577
|
+
|
|
578
|
+
```yaml
|
|
579
|
+
handlers:
|
|
580
|
+
- name: tests
|
|
581
|
+
argv: [python, -m, pytest, -q]
|
|
582
|
+
|
|
583
|
+
- name: stage
|
|
584
|
+
argv: [git, add, .]
|
|
585
|
+
|
|
586
|
+
- name: commit
|
|
587
|
+
variables:
|
|
588
|
+
- name: commit_message
|
|
589
|
+
description: A concise commit message.
|
|
590
|
+
argv: [git, commit, -m, "{{ww.task.id}}: {{commit_message}}"]
|
|
591
|
+
|
|
592
|
+
hooks:
|
|
593
|
+
before_complete:
|
|
594
|
+
- workflows: [jira-task]
|
|
595
|
+
steps: [develop]
|
|
596
|
+
handlers:
|
|
597
|
+
- name: tests
|
|
598
|
+
- name: stage
|
|
599
|
+
- name: commit
|
|
600
|
+
|
|
601
|
+
workflows:
|
|
602
|
+
- name: jira-task
|
|
603
|
+
steps:
|
|
604
|
+
- name: create-jira-issue
|
|
605
|
+
mcp: jira
|
|
606
|
+
description: Create a Jira issue for the requested work and return its key.
|
|
607
|
+
variables:
|
|
608
|
+
- name: jira_key
|
|
609
|
+
description: The created Jira issue key.
|
|
610
|
+
|
|
611
|
+
- name: develop
|
|
612
|
+
description: Implement {{jira_key}} and verify the result.
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
`init` is a reserved first step that `ww` adds to every workflow, so it is not
|
|
616
|
+
listed under `steps`. The manager supplies it through `start --requirements`,
|
|
617
|
+
using corrected grammar and consistent styling without analysis or a work plan.
|
|
618
|
+
ww retains it durably while init preparation hooks run, then records it as the
|
|
619
|
+
normal artifact-producing init step. It can be targeted by hooks without
|
|
620
|
+
allowing later user-step inputs to be consumed during `start`.
|
|
621
|
+
|
|
622
|
+
Running it end to end looks like this:
|
|
623
|
+
|
|
624
|
+
```console
|
|
625
|
+
ww-agentic-workflows lint
|
|
626
|
+
ww-agentic-workflows plan --workflow jira-task --agent codex
|
|
627
|
+
ww-agentic-workflows start TASK-123 --workflow jira-task --agent codex \
|
|
628
|
+
--requirements="Implement and verify the requested Jira-backed change." --role manager
|
|
629
|
+
ww-agentic-workflows next TASK-123 --role manager
|
|
630
|
+
ww-agentic-workflows complete TASK-123 --role worker --variable jira_key=PROJ-456 \
|
|
631
|
+
--artifact="Created Jira issue PROJ-456."
|
|
632
|
+
ww-agentic-workflows next TASK-123 --role manager
|
|
633
|
+
ww-agentic-workflows complete TASK-123 \
|
|
634
|
+
--role worker \
|
|
635
|
+
--variable commit_message="Implement PROJ-456" \
|
|
636
|
+
--artifact="Implemented and verified PROJ-456."
|
|
637
|
+
ww-agentic-workflows complete TASK-123 --role worker \
|
|
638
|
+
--variable summary="Created and implemented PROJ-456."
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
## Documentation
|
|
642
|
+
|
|
643
|
+
- [specification.md](documentation/specification.md) is the exact `ww.yaml`
|
|
644
|
+
specification: keys, value types, defaults, scopes and failure semantics.
|
|
645
|
+
- [features.md](documentation/features.md) is the design guide and feature
|
|
646
|
+
reference: when to use what, with configuration and command examples.
|
|
647
|
+
- Both, with the examples below, are the authorities for designing workflows.
|
|
648
|
+
An installed ww prints its own copies: `ww docs specification|features|examples`.
|
|
649
|
+
- [architecture.md](documentation/architecture.md) describes internals, boundaries, state, and
|
|
650
|
+
design decisions.
|
|
651
|
+
- [agent-hooks.md](documentation/agent-hooks.md) covers the agent's own hooks
|
|
652
|
+
(session-start, stop, interrupt): what they do, per-agent support, and
|
|
653
|
+
install/uninstall/show.
|
|
654
|
+
- [examples.md](documentation/examples.md) is a set of complete, tested
|
|
655
|
+
`ww.yaml` examples, one per control or behaviour.
|
|
656
|
+
- [limitations.md](documentation/limitations.md) lists what ww does not do yet, and
|
|
657
|
+
the compatibility and platform boundaries to expect before 1.0.
|
|
658
|
+
|
|
659
|
+
## Development
|
|
660
|
+
|
|
661
|
+
For fresh-clone setup and the complete check list, see
|
|
662
|
+
[CONTRIBUTING.md](CONTRIBUTING.md). The release artifact check builds an sdist
|
|
663
|
+
and wheel, inspects their bundled resources and license, and installs the wheel
|
|
664
|
+
in an isolated virtual environment.
|
|
665
|
+
|
|
666
|
+
```console
|
|
667
|
+
scripts/test
|
|
668
|
+
.venv/bin/python scripts/check_release_gates.py
|
|
669
|
+
.venv/bin/python scripts/check_distribution.py
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
`scripts/test` creates or reuses `.venv` with a Python version supported by
|
|
673
|
+
`pyproject.toml`, repairs a partial development install, then runs ruff, mypy
|
|
674
|
+
and the test suite. Set `WW_PYTHON` to choose the interpreter for a new
|
|
675
|
+
environment. It preserves existing environments when setup fails.
|
|
676
|
+
|
|
677
|
+
Pushes to `dev` also publish CI-checked development snapshots to PyPI once
|
|
678
|
+
Trusted Publishing is configured. See
|
|
679
|
+
[development releases](documentation/development-releases.md) for versioning,
|
|
680
|
+
installation and the one-time setup.
|
|
681
|
+
|
|
682
|
+
## License
|
|
683
|
+
|
|
684
|
+
ww-agentic-workflows is free software licensed under the GNU General Public License v3.0 or later (GPL-3.0-or-later).
|
|
685
|
+
|
|
686
|
+
See [LICENSE](LICENSE) for the full license text.
|
|
687
|
+
|
|
688
|
+
### Use with other projects
|
|
689
|
+
|
|
690
|
+
Using ww-agentic-workflows to develop, build, test, review, or otherwise operate on another project does not by itself impose the GPL license on that project, its source code, its workflow configuration, or artifacts produced from the user's own content.
|