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.
Files changed (167) hide show
  1. ww/__init__.py +18 -0
  2. ww/_bundled_extensions/ww/git/extension.py +1728 -0
  3. ww/action_execution.py +887 -0
  4. ww/actions/__init__.py +94 -0
  5. ww/actions/command.py +444 -0
  6. ww/actions/contracts.py +699 -0
  7. ww/actions/extension.py +197 -0
  8. ww/actions/mcp.py +84 -0
  9. ww/actions/prompt.py +74 -0
  10. ww/actions/skill.py +62 -0
  11. ww/actions/slash_command.py +63 -0
  12. ww/agents.py +151 -0
  13. ww/amendments.py +54 -0
  14. ww/artifacts.py +93 -0
  15. ww/assessments.py +181 -0
  16. ww/assets/__init__.py +2 -0
  17. ww/assets/agent_instructions.md +49 -0
  18. ww/assets/docs/examples.md +879 -0
  19. ww/assets/docs/features.md +4639 -0
  20. ww/assets/docs/specification.md +1876 -0
  21. ww/assets/noww_skill.md +11 -0
  22. ww/assets/workflows/catchall.yaml +26 -0
  23. ww/assets/workflows/onboarding.yaml +586 -0
  24. ww/assets/workflows/scriptize.yaml +130 -0
  25. ww/assets/ww-automate_skill.md +23 -0
  26. ww/assets/ww-deduce-feedback_skill.md +38 -0
  27. ww/assets/ww-feedback-rules_skill.md +48 -0
  28. ww/assets/ww-learn-project_skill.md +22 -0
  29. ww/assets/ww-refresh_skill.md +26 -0
  30. ww/assets/ww-rule_skill.md +83 -0
  31. ww/assets/ww-rules-from-artifacts_skill.md +22 -0
  32. ww/assets/ww-scriptize_skill.md +33 -0
  33. ww/assets/ww-setup_skill.md +94 -0
  34. ww/assets/ww-solve_skill.md +23 -0
  35. ww/assets/ww-suggest_skill.md +32 -0
  36. ww/assets/ww-wizard_skill.md +105 -0
  37. ww/assets/ww_skill.md +59 -0
  38. ww/assignments.py +283 -0
  39. ww/bootstrap.py +405 -0
  40. ww/builtin_workflows.py +215 -0
  41. ww/changes.py +225 -0
  42. ww/child_coordination.py +482 -0
  43. ww/children.py +106 -0
  44. ww/claude_permissions.py +115 -0
  45. ww/cli/__init__.py +7 -0
  46. ww/cli/__main__.py +6 -0
  47. ww/cli/audit.py +129 -0
  48. ww/cli/catalogs.py +131 -0
  49. ww/cli/discover.py +607 -0
  50. ww/cli/initialization.py +898 -0
  51. ww/cli/lookup.py +287 -0
  52. ww/cli/main.py +1768 -0
  53. ww/cli/parser.py +1200 -0
  54. ww/cli/prompts.py +217 -0
  55. ww/cli/updates.py +117 -0
  56. ww/completion_artifacts.py +156 -0
  57. ww/completion_inputs.py +39 -0
  58. ww/config/__init__.py +582 -0
  59. ww/config/actions.py +591 -0
  60. ww/config/composition.py +571 -0
  61. ww/config/rules.py +511 -0
  62. ww/config/steps.py +1220 -0
  63. ww/config/values.py +223 -0
  64. ww/config_files.py +191 -0
  65. ww/config_writes.py +264 -0
  66. ww/contracts.py +155 -0
  67. ww/control.py +41 -0
  68. ww/defaults.py +130 -0
  69. ww/design_docs.py +32 -0
  70. ww/discovery.py +104 -0
  71. ww/documents.py +217 -0
  72. ww/errors.py +18 -0
  73. ww/executable.py +43 -0
  74. ww/execution_models/__init__.py +64 -0
  75. ww/execution_models/construction.py +148 -0
  76. ww/execution_models/decoding.py +38 -0
  77. ww/execution_models/plan_codec.py +565 -0
  78. ww/execution_models/records.py +1206 -0
  79. ww/execution_models/runs.py +266 -0
  80. ww/extensions/__init__.py +40 -0
  81. ww/extensions/api.py +559 -0
  82. ww/extensions/registry.py +864 -0
  83. ww/extensions/store.py +78 -0
  84. ww/feedback.py +342 -0
  85. ww/handler_repairs.py +57 -0
  86. ww/hooks/__init__.py +40 -0
  87. ww/hooks/agents.py +380 -0
  88. ww/hooks/install.py +168 -0
  89. ww/hooks/notices.py +206 -0
  90. ww/hooks/records.py +209 -0
  91. ww/hooks/runtime.py +266 -0
  92. ww/hooks/transcripts.py +183 -0
  93. ww/inspect.py +896 -0
  94. ww/instructions/__init__.py +17 -0
  95. ww/instructions/builder.py +1682 -0
  96. ww/instructions/commands.py +335 -0
  97. ww/instructions/handoff.py +149 -0
  98. ww/instructions/models.py +686 -0
  99. ww/instructions/policy.py +219 -0
  100. ww/instructions/text.py +168 -0
  101. ww/interactions.py +187 -0
  102. ww/interpolation.py +37 -0
  103. ww/item_passes.py +167 -0
  104. ww/items.py +99 -0
  105. ww/locking.py +207 -0
  106. ww/metadata_publication.py +230 -0
  107. ww/onboarding.py +229 -0
  108. ww/open_work.py +236 -0
  109. ww/operations.py +193 -0
  110. ww/operator_ui/__init__.py +16 -0
  111. ww/operator_ui/page.html +351 -0
  112. ww/operator_ui/server.py +215 -0
  113. ww/operator_ui/session.py +389 -0
  114. ww/operator_ui/sheet.py +104 -0
  115. ww/operator_ui/view.py +109 -0
  116. ww/output.py +339 -0
  117. ww/output_adapters/__init__.py +12 -0
  118. ww/output_adapters/base.py +25 -0
  119. ww/output_adapters/json_adapter.py +37 -0
  120. ww/output_adapters/markdown.py +2293 -0
  121. ww/output_adapters/rule_pages.py +337 -0
  122. ww/output_adapters/terminal.py +21 -0
  123. ww/package_updates.py +167 -0
  124. ww/plan/__init__.py +38 -0
  125. ww/plan/actions.py +207 -0
  126. ww/plan/compiler.py +1492 -0
  127. ww/plan/constructs.py +456 -0
  128. ww/plan/models.py +665 -0
  129. ww/project_config.py +752 -0
  130. ww/recovery.py +401 -0
  131. ww/replanning.py +367 -0
  132. ww/results.py +77 -0
  133. ww/rule_checks.py +230 -0
  134. ww/rule_conversion.py +331 -0
  135. ww/rule_disputes.py +148 -0
  136. ww/rule_store.py +456 -0
  137. ww/rule_verification.py +714 -0
  138. ww/rule_views.py +447 -0
  139. ww/rule_writes.py +920 -0
  140. ww/run_coordination.py +158 -0
  141. ww/runtimes.py +105 -0
  142. ww/service.py +4405 -0
  143. ww/setup_apply.py +428 -0
  144. ww/step_values.py +20 -0
  145. ww/storage.py +447 -0
  146. ww/storage_adapters/__init__.py +36 -0
  147. ww/storage_adapters/base.py +540 -0
  148. ww/storage_adapters/filesystem.py +370 -0
  149. ww/storage_adapters/memory.py +195 -0
  150. ww/storage_adapters/project_metadata.py +69 -0
  151. ww/storage_adapters/task_document.py +484 -0
  152. ww/task_ids.py +114 -0
  153. ww/task_references.py +124 -0
  154. ww/transitions.py +1619 -0
  155. ww/updates.py +399 -0
  156. ww/upgrade.py +95 -0
  157. ww/validation.py +168 -0
  158. ww/variables.py +275 -0
  159. ww/workflow_config.py +854 -0
  160. ww/workflow_update.py +239 -0
  161. ww/workflow_validation.py +1260 -0
  162. ww/workspace.py +50 -0
  163. ww_agentic_workflows-1.0.0.dev3.dist-info/METADATA +690 -0
  164. ww_agentic_workflows-1.0.0.dev3.dist-info/RECORD +167 -0
  165. ww_agentic_workflows-1.0.0.dev3.dist-info/WHEEL +4 -0
  166. ww_agentic_workflows-1.0.0.dev3.dist-info/entry_points.txt +2 -0
  167. 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.