ww-agentic-workflows 1.0.0.dev3__tar.gz → 1.0.0.dev5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ww_agentic_workflows-1.0.0.dev5/.claude/skills/noww/SKILL.md +12 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.claude/skills/ww/SKILL.md +23 -11
- ww_agentic_workflows-1.0.0.dev5/.codex/skills/noww/SKILL.md +12 -0
- ww_agentic_workflows-1.0.0.dev5/.codex/skills/ww/SKILL.md +71 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/CHANGELOG.md +54 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/PKG-INFO +10 -10
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/README.md +9 -9
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/WW_AGENT_INSTRUCTIONS.md +13 -3
- ww_agentic_workflows-1.0.0.dev5/documentation/agent-hooks.md +135 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/architecture.md +55 -60
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/features.md +164 -122
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/limitations.md +5 -10
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/specification.md +152 -33
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/todo.md +3 -5
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/ext/ww/git/extension.py +23 -2
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/pyproject.toml +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/agent_instructions.md +13 -3
- ww_agentic_workflows-1.0.0.dev5/src/ww/assets/noww_skill.md +12 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/workflows/onboarding.yaml +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-deduce-feedback_skill.md +6 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-wizard_skill.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww_skill.md +23 -11
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/builtin_workflows.py +0 -6
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/changes.py +44 -11
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/claude_permissions.py +1 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/catalogs.py +1 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/discover.py +53 -102
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/initialization.py +3 -5
- ww_agentic_workflows-1.0.0.dev5/src/ww/cli/lookup.py +266 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/main.py +89 -86
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/parser.py +53 -17
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/__init__.py +7 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/rules.py +26 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/defaults.py +0 -2
- ww_agentic_workflows-1.0.0.dev5/src/ww/direct_work.py +275 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/decoding.py +12 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/plan_codec.py +2 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/records.py +28 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/feedback.py +6 -2
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/hooks/__init__.py +2 -5
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/hooks/agents.py +7 -82
- ww_agentic_workflows-1.0.0.dev5/src/ww/hooks/notices.py +32 -0
- ww_agentic_workflows-1.0.0.dev5/src/ww/hooks/runtime.py +75 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/builder.py +12 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/commands.py +13 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/handoff.py +16 -4
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/models.py +13 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/interactions.py +4 -7
- ww_agentic_workflows-1.0.0.dev5/src/ww/open_work.py +42 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output.py +11 -4
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/markdown.py +56 -11
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/rule_pages.py +7 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/compiler.py +2 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/models.py +4 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/project_config.py +24 -18
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/results.py +18 -3
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_checks.py +2 -2
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_verification.py +9 -3
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_views.py +7 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_writes.py +36 -4
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/runtimes.py +12 -2
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/service.py +364 -38
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/base.py +21 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/filesystem.py +32 -5
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/memory.py +17 -2
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/transitions.py +50 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/workflow_config.py +4 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/conftest.py +6 -6
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/fix-required.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/interactive.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/item-stage.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/loop-body.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/loop-continue.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/manager-dispatch.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/step-auto-worker.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/step-rules.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/step-single.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/values-and-metadata.md +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/worker-handoff.md +2 -0
- ww_agentic_workflows-1.0.0.dev5/tests/integration/test_adjustments.py +227 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_builtin_workflows.py +7 -26
- ww_agentic_workflows-1.0.0.dev5/tests/integration/test_children_added_mid_run.py +227 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_cli.py +5 -7
- ww_agentic_workflows-1.0.0.dev5/tests/integration/test_direct_work.py +582 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_discover.py +57 -81
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_git_extension.py +38 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_handler_repairs.py +11 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_handoff_block.py +182 -0
- ww_agentic_workflows-1.0.0.dev5/tests/integration/test_hooks.py +536 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_interactive.py +2 -2
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_onboarding_workflows.py +2 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_page_gates.py +1 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_plan_execution.py +90 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rule_write_commands.py +61 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rules_and_checks.py +94 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_worker_handoff.py +70 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_workflow_service.py +3 -3
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_changes.py +52 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_config.py +3 -3
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_config_composition.py +2 -14
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_execution_hints.py +4 -3
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_hook_agents.py +12 -94
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_plan.py +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_project_config.py +29 -8
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rule_verification.py +30 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rules.py +16 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_task_storage_adapters.py +59 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_variables.py +1 -1
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_workflow_inheritance.py +24 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_workflow_validation.py +18 -11
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/ww.yaml +3 -1
- ww_agentic_workflows-1.0.0.dev3/.claude/skills/noww/SKILL.md +0 -11
- ww_agentic_workflows-1.0.0.dev3/.codex/skills/noww/SKILL.md +0 -11
- ww_agentic_workflows-1.0.0.dev3/.codex/skills/ww/SKILL.md +0 -34
- ww_agentic_workflows-1.0.0.dev3/documentation/agent-hooks.md +0 -270
- ww_agentic_workflows-1.0.0.dev3/src/ww/assets/noww_skill.md +0 -11
- ww_agentic_workflows-1.0.0.dev3/src/ww/assets/workflows/catchall.yaml +0 -26
- ww_agentic_workflows-1.0.0.dev3/src/ww/cli/lookup.py +0 -287
- ww_agentic_workflows-1.0.0.dev3/src/ww/hooks/notices.py +0 -206
- ww_agentic_workflows-1.0.0.dev3/src/ww/hooks/records.py +0 -209
- ww_agentic_workflows-1.0.0.dev3/src/ww/hooks/runtime.py +0 -266
- ww_agentic_workflows-1.0.0.dev3/src/ww/hooks/transcripts.py +0 -183
- ww_agentic_workflows-1.0.0.dev3/src/ww/open_work.py +0 -236
- ww_agentic_workflows-1.0.0.dev3/tests/integration/test_catchall.py +0 -212
- ww_agentic_workflows-1.0.0.dev3/tests/integration/test_hooks.py +0 -1324
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.claude/settings.json +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.claude/skills/update-architecture-documentation/SKILL.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.codex/hooks.json +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.codex/skills/update-architecture-documentation/SKILL.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.git-blame-ignore-revs +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.githooks/pre-commit +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/workflows/dev-publish.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.github/workflows/release-gates.yml +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.gitignore +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/AGENTS.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/CLAUDE.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/CODE_OF_CONDUCT.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/CONTRIBUTING.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/LICENSE +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/SECURITY.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/development-releases.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/examples.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/python-agent-rules.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/check_distribution.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/check_release_gates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/demo.sh +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/ensure_spdx_license.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/measure_pages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/run_workflow_dummy.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/set_dev_version.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/scripts/test +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/action_execution.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/command.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/contracts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/extension.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/mcp.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/prompt.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/skill.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/actions/slash_command.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/agents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/amendments.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/artifacts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assessments.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/workflows/scriptize.yaml +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-automate_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-feedback-rules_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-learn-project_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-refresh_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-rule_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-rules-from-artifacts_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-scriptize_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-setup_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-solve_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assets/ww-suggest_skill.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/assignments.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/bootstrap.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/child_coordination.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/children.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/__main__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/audit.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/prompts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/cli/updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/completion_artifacts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/completion_inputs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/actions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/composition.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/steps.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config/values.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config_files.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/config_writes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/contracts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/control.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/design_docs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/discovery.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/documents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/errors.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/executable.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/construction.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/execution_models/runs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/extensions/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/extensions/api.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/extensions/registry.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/extensions/store.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/handler_repairs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/hooks/install.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/inspect.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/policy.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/instructions/text.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/interpolation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/item_passes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/items.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/locking.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/metadata_publication.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/onboarding.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operations.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/page.html +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/server.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/session.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/sheet.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/operator_ui/view.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/base.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/json_adapter.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/output_adapters/terminal.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/package_updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/actions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/plan/constructs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/recovery.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/replanning.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_conversion.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_disputes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/rule_store.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/run_coordination.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/setup_apply.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/step_values.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/__init__.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/project_metadata.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/storage_adapters/task_document.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/task_ids.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/task_references.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/upgrade.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/validation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/variables.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/workflow_update.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/workflow_validation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/src/ww/workspace.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/action_contract_helpers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/config_helpers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/example_documents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/fixtures/packaged_extension/ww_test_packaged_extension.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/completion.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/operator-stop.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/verification.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/golden/pages/worker-bootstrap.md +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_artifact_from_containers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_assessment_outcomes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_assignment_tokens.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_auto_retries.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_automatic_handler_groups.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_automatic_modes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_awaiting_operator.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_bootstrap_task_id.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_identity.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_launch_settings.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_stages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_start_action.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_start_guards.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_child_tasks.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_command_metadata.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_complete_dispatch.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_concurrency.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_config_files.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_configuration_authority.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_documents.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_example_behaviour.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_executable.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_extension_execution.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_feedback_commands.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_git_variables.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_golden_pages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_init_force.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_init_permissions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_inspect.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_assignment.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_fields.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_pass_restarts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_pass_runs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_reply_reports.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_item_runtime_values.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_items.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_local_step_pages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_loops.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_memory_workflow_service.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_metadata_lists.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_onboarding.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_pack_scenarios.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_packaged_extension.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_projects.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_recommended_workflow.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_recovery_guards.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_replanning.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_requirements_pages.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_requirements_per_session.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_restart.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rule_commands.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rule_conversion.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_rule_verification_flow.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_scriptize_workflow.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_setup_apply.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_setup_update.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_setup_verification.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_shared_items.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_stale_task_records.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_state_unknown_fields.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_system_scenarios.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_update_notice.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_upgrade.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_workdir.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/integration/test_worker_bootstrap_text.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/page_catalog.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/plan_helpers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/test_dev_version.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_action_contracts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_action_example.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_action_phase_contexts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_artifacts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_assignments.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_beta_notice.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_builtin_actions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_checklist_prompt.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_child_stages_config.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_children_config.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_cli_prompts.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_completion_inputs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_completion_selection.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_config_writes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_delegation_requests.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_design_docs.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_discovery.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_examples_doc.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_extensions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_feedback.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_handler_failure_report.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_instruction_commands.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_interactions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_item_config.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_item_passes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_item_validation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_locking.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_markdown_output.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_modes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_operator_ui.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_package_updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_project_metadata_storage_adapters.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_records.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rule_disputes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rule_store.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_rule_writes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_runtimes.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_scripts_test_bootstrap.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_step_role.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_storage.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_task_document.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_task_ids.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_task_references.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_transitions.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_updates.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_validation.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/unit/test_workspace.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/tests/workflow_helpers.py +0 -0
- {ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/ww.json +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: noww
|
|
3
|
+
description: Work without ww. Use only when the user invokes /noww or asks not to use ww.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Work without ww
|
|
7
|
+
|
|
8
|
+
Do not use ww for the rest of this conversation, unless the user asks for it
|
|
9
|
+
again: do not run `./ww discover`, `./ww lookup` or `./ww record`, and do not
|
|
10
|
+
start, continue, or complete a ww task. Carry out requests directly, as in a
|
|
11
|
+
project without ww. A ww task already in progress stays as it is; do not reset
|
|
12
|
+
or fail it.
|
{ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/.claude/skills/ww/SKILL.md
RENAMED
|
@@ -17,17 +17,29 @@ change, start from step 1 then.
|
|
|
17
17
|
carry out the request without ww and do not ask.
|
|
18
18
|
2. To continue an existing task, run
|
|
19
19
|
`./ww instruction <task-id> --role manager` instead of starting a new one.
|
|
20
|
-
3. Otherwise
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
20
|
+
3. Otherwise decide how the request is carried out, in this order:
|
|
21
|
+
a. It names a ticket or clearly matches a configured workflow's
|
|
22
|
+
description, and is more than a small change: propose that workflow, and
|
|
23
|
+
offer the alternative in the same choice, "run `<workflow>`" / "just do
|
|
24
|
+
it, register afterwards". A workflow the user named is started without
|
|
25
|
+
asking. When one is chosen, keep its default
|
|
26
|
+
modes unless the user's wording matches another mode, and start the task
|
|
27
|
+
with the start command `discover` shows. Pass the user's requirements,
|
|
28
|
+
normalized, as `--requirements`. When the request names an external
|
|
29
|
+
ticket, such as a Jira key, use that key as the task ID; omit the ID
|
|
30
|
+
only when there is none or the workflow obtains its own.
|
|
31
|
+
b. Otherwise it is direct work: do it as you would in a plain conversation,
|
|
32
|
+
with no question asked, then run
|
|
33
|
+
`./ww record <task> --summary "..."`. `./ww lookup [<task>] --agent
|
|
34
|
+
<agent>` names the task and the command; pass the task the conversation
|
|
35
|
+
works on or the request names, as written. Read-only work needs no task.
|
|
36
|
+
c. Judge each prompt on its own. A series of small requests stays a series
|
|
37
|
+
of direct-work entries; never promote them into a workflow because they
|
|
38
|
+
add up.
|
|
39
|
+
d. Ask only when it is genuinely ambiguous, and never again on the same
|
|
40
|
+
task once the operator chose direct work.
|
|
41
|
+
e. If `record` fails or is forgotten, ww records the commits it had not
|
|
42
|
+
seen on the next run; say so, and do not retry it endlessly.
|
|
31
43
|
When the first page of `start` says rules have no check
|
|
32
44
|
yet, tell the user once and carry on: it never blocks the task, and the
|
|
33
45
|
`ww-scriptize` skill builds those checks when they want it.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: noww
|
|
3
|
+
description: Work without ww. Use only when the user invokes /noww or asks not to use ww.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Work without ww
|
|
7
|
+
|
|
8
|
+
Do not use ww for the rest of this conversation, unless the user asks for it
|
|
9
|
+
again: do not run `./ww discover`, `./ww lookup` or `./ww record`, and do not
|
|
10
|
+
start, continue, or complete a ww task. Carry out requests directly, as in a
|
|
11
|
+
project without ww. A ww task already in progress stays as it is; do not reset
|
|
12
|
+
or fail it.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ww
|
|
3
|
+
description: Carry out a development request through ww, this project's workflow tool. Use only when the request changes something (implement, fix, refactor, merge, edit documentation) or the user explicitly asks to work via ww, to start or continue a ww task, or to run a ww workflow; where `./ww discover` says ww is used by default, use it before changing files for any request, since every change then goes through ww. Never use it for reviews, questions, explanations, investigations, status checks or other read-only work, even when they concern ww or a ww task.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Work through ww
|
|
7
|
+
|
|
8
|
+
ww is for development: requests that change files. A review, question,
|
|
9
|
+
explanation, investigation, status check or other read-only request never
|
|
10
|
+
goes through ww; answer it directly, without these steps and without a task,
|
|
11
|
+
even where ww is used by default. When a read-only conversation turns into a
|
|
12
|
+
change, start from step 1 then.
|
|
13
|
+
|
|
14
|
+
1. Run `./ww discover` and read all of it. If it says ww is disabled, stop:
|
|
15
|
+
do not use ww, and tell the user. If it says ww is used only on request
|
|
16
|
+
and the user did not explicitly ask for ww (invoking this skill counts),
|
|
17
|
+
carry out the request without ww and do not ask.
|
|
18
|
+
2. To continue an existing task, run
|
|
19
|
+
`./ww instruction <task-id> --role manager` instead of starting a new one.
|
|
20
|
+
3. Otherwise decide how the request is carried out, in this order:
|
|
21
|
+
a. It names a ticket or clearly matches a configured workflow's
|
|
22
|
+
description, and is more than a small change: propose that workflow, and
|
|
23
|
+
offer the alternative in the same choice, "run `<workflow>`" / "just do
|
|
24
|
+
it, register afterwards". A workflow the user named is started without
|
|
25
|
+
asking. When one is chosen, keep its default
|
|
26
|
+
modes unless the user's wording matches another mode, and start the task
|
|
27
|
+
with the start command `discover` shows. Pass the user's requirements,
|
|
28
|
+
normalized, as `--requirements`. When the request names an external
|
|
29
|
+
ticket, such as a Jira key, use that key as the task ID; omit the ID
|
|
30
|
+
only when there is none or the workflow obtains its own.
|
|
31
|
+
b. Otherwise it is direct work: do it as you would in a plain conversation,
|
|
32
|
+
with no question asked, then run
|
|
33
|
+
`./ww record <task> --summary "..."`. `./ww lookup [<task>] --agent
|
|
34
|
+
<agent>` names the task and the command; pass the task the conversation
|
|
35
|
+
works on or the request names, as written. Read-only work needs no task.
|
|
36
|
+
c. Judge each prompt on its own. A series of small requests stays a series
|
|
37
|
+
of direct-work entries; never promote them into a workflow because they
|
|
38
|
+
add up.
|
|
39
|
+
d. Ask only when it is genuinely ambiguous, and never again on the same
|
|
40
|
+
task once the operator chose direct work.
|
|
41
|
+
e. If `record` fails or is forgotten, ww records the commits it had not
|
|
42
|
+
seen on the next run; say so, and do not retry it endlessly.
|
|
43
|
+
When the first page of `start` says rules have no check
|
|
44
|
+
yet, tell the user once and carry on: it never blocks the task, and the
|
|
45
|
+
`ww-scriptize` skill builds those checks when they want it.
|
|
46
|
+
4. Follow every ww response exactly: run each displayed command with all
|
|
47
|
+
placeholders replaced, and keep going until ww reports that the workflow
|
|
48
|
+
is complete or reports an error. On `interactive: true` steps, converse
|
|
49
|
+
naturally until intent to finish is clear, ask if ambiguous, and treat
|
|
50
|
+
"done for today" as a pause. Record and end the interaction before
|
|
51
|
+
completing it. Use the host choice tool when available; keep asynchronous
|
|
52
|
+
choices pending until an answer arrives, and do not treat timeouts or
|
|
53
|
+
preselection as answers. After completion, relay any optional
|
|
54
|
+
`ww-deduce-feedback` suggestion; do not insert learning into the plan.
|
|
55
|
+
Deduction uses ww commands and explicit existing point IDs; rule review
|
|
56
|
+
and pruning are separate, and rules require operator approval.
|
|
57
|
+
5. Never run a ww-owned handler yourself, edit ww state, or read
|
|
58
|
+
`ww.yaml` or ww's source to work out what to do next. For a handler repair
|
|
59
|
+
assignment, fix the cause and complete with an artifact; ww retries the
|
|
60
|
+
command. In `auto`, the manager dispatches the repair with `next`. When
|
|
61
|
+
ww reports `awaiting_operator` (a failed handler or work, an interrupted
|
|
62
|
+
command, a loop at its iteration limit, a changed workflow), stop and report the task, its
|
|
63
|
+
`operator_reason` and the exact error to the user (unless they gave a
|
|
64
|
+
standing authorization for routine repairs such as dependency installation,
|
|
65
|
+
formatting or retries: apply it to a stop of that kind without asking again,
|
|
66
|
+
and ask only for a material decision or an action outside it); when they
|
|
67
|
+
decide, run the recovery command ww showed, `./ww next <task-id> --retry` to run the
|
|
68
|
+
handler again, `--force --reason` to skip it or leave the loop, or
|
|
69
|
+
`--replan` / `--keep-plan` for a changed workflow. A `pass_incomplete`
|
|
70
|
+
stop is cleared by recording what it names with `./ww update-item`, then
|
|
71
|
+
`./ww next <task-id> --retry`; `--force` is refused there.
|
|
@@ -11,6 +11,60 @@ yet, is in [documentation/limitations.md](documentation/limitations.md).
|
|
|
11
11
|
|
|
12
12
|
## 2026-10-05
|
|
13
13
|
|
|
14
|
+
- Removed: the session-start task list, stop reminders, interruption records and transcript recovery, and the
|
|
15
|
+
`interrupted` command. Hooks, events and `agent_hooks` keys stay accepted. `5414a34`
|
|
16
|
+
- Added: `add-child` is accepted while a per-child stage of a roadmap-style parent is active, not only while the
|
|
17
|
+
collecting step is. The new child is appended after the last planned child with its own expanded lifecycle;
|
|
18
|
+
once the last child's stages have finished the command is refused. `00338d9`
|
|
19
|
+
- Added: `ww handoff <task> [--run ID] [--assignment TOKEN] [--json]` prints the handoff block of an ended assignment
|
|
20
|
+
again, for a worker whose output was cut short; the completion page and the `auto` runtime instruction name it.
|
|
21
|
+
The change set is reproduced only while the assignment is the latest one, otherwise the block says so. `aae3ed2`
|
|
22
|
+
- Fixed: when a child task's run has completed, its handoff block names the parent task's `next` command
|
|
23
|
+
("Manager: continue with the parent task: ...") instead of a command that fails because the child is completed;
|
|
24
|
+
a child partway through its run keeps its own. The handoff JSON carries `continuation_task_id`. `6b6669c`
|
|
25
|
+
- Fixed: a child task's `ww/git` worktree is named like its branch, the parent's rendered `worktree_name_format`
|
|
26
|
+
plus `-<child id>` (`ww-worktrees/TASK-51-A`), so it no longer lands inside the parent's checkout as untracked
|
|
27
|
+
content; any other rendered name holding a `/` has each one replaced with `-`. Worktrees already created inside
|
|
28
|
+
a parent's are not migrated. `6b6669c`
|
|
29
|
+
- Fixed: the continuation line of a requested-worker page names the flags (`--selected-agent`, `--model`,
|
|
30
|
+
`--reasoning`) whose values follow the request. `6b6669c`
|
|
31
|
+
- Changed: ww's own roadmap workflow's `fix` step tells the worker to prefix its commits with the child ID, as the
|
|
32
|
+
child's own commits are. `6b6669c`
|
|
33
|
+
|
|
34
|
+
- Added: direct work replaces the `catchall` workflow. A change no workflow fits is made as in a plain
|
|
35
|
+
conversation and registered afterwards with `record <task> --summary "<text>"`, which appends an entry to
|
|
36
|
+
the task's `direct-work.json` with the commits ww finds itself (the task's recorded branch since its base,
|
|
37
|
+
minus the commits ww already knows; without a recorded branch, the current branch's commits that name the task
|
|
38
|
+
ID). A task needs no run, and `lookup` no longer asks before a task ww has not seen. When the manager asks for
|
|
39
|
+
a task's page with `instruction --role manager`, ww records any commits it had not seen as a `reconciled` entry
|
|
40
|
+
and prints one line at the top of the page, so a forgotten or failed `record` is made up for. `status` lists the
|
|
41
|
+
entries and short SHAs. The agent instructions, the `ww` and `noww` skills and `discover` now say: propose a
|
|
42
|
+
matching workflow with "just do it, register afterwards" as the alternative, otherwise work directly and ask
|
|
43
|
+
nothing, judge each prompt on its own, and never ask again on a task once direct work was chosen. Existing
|
|
44
|
+
projects keep their installed skills; `init --force` or copying the bundled ones picks up the new wording.
|
|
45
|
+
- Removed: the `catchall` workflow, its `discover` section (`catchall` is gone from the JSON, `direct_work`
|
|
46
|
+
replaces it) and the `lookup` menu. A `catchall` entry under `workflows` in `ww.json` is ignored and `lint`
|
|
47
|
+
warns about it, instead of failing.
|
|
48
|
+
- The repair page for a failed automatic handler now says what to do when the cause is the environment rather than
|
|
49
|
+
the work (a sandbox or permission denial, a network or package-install error, a held lock): change no project
|
|
50
|
+
files, fix the environment or ask the operator, and say in the completion that the cause was environmental.
|
|
51
|
+
- A rule file can narrow a rule to files by content with `contains`, a list of plain, case-sensitive strings (no
|
|
52
|
+
regular expressions) in its frontmatter: a file must match a `paths` glob, if any, and contain one of the
|
|
53
|
+
strings. A check whose strings are in no changed file is not applicable, a converted check covering several
|
|
54
|
+
rules takes the union of their strings, and the step page prints the strings beside the globs. `rules add` and
|
|
55
|
+
`rules edit` take `--contains <text>...` and report how many project files hold each string. Rules written in a
|
|
56
|
+
step's own `rules` list still take no `paths` or `contains`.
|
|
57
|
+
- `complete` and `loop` take `--adjustments "<text>"` for the changes the operator asked for during a step. ww
|
|
58
|
+
stores it on the step record, shows it in `status`, beside the summary on the next step's page and on the
|
|
59
|
+
verifier's page, and hands it to feedback deduction as a labelled `adjustments` field; a repair completion
|
|
60
|
+
refuses it. Every worker step page now asks the worker to record such requests in the artifact and in the flag.
|
|
61
|
+
- A workflow can set `manual: true`: `discover` and `lookup` leave it out, `start` still accepts it, and `inherit`
|
|
62
|
+
does not copy the setting. A workflow named `manual` in the `- name: description` shorthand must now use the
|
|
63
|
+
`name:` key.
|
|
64
|
+
- A handoff now gives the new run the target workflow's declared `runtime`, and replaces the run-level `model` and
|
|
65
|
+
`reasoning` with the target's declared values, keeping the source run's values for what the target does not
|
|
66
|
+
declare.
|
|
67
|
+
- The specification and features now describe how a child gets its external ID.
|
|
14
68
|
- The `ww` skill and agent instructions now say ww is only for development: reviews, questions, investigations,
|
|
15
69
|
status checks and other read-only requests never invoke the skill or start a task. Existing projects keep their
|
|
16
70
|
installed skill; `init --force` or copying the bundled one picks up the new wording.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ww-agentic-workflows
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev5
|
|
4
4
|
Summary: A local-first, resumable workflow CLI for people and AI agents.
|
|
5
5
|
Project-URL: Homepage, https://agenticworkflows.dev
|
|
6
6
|
Project-URL: Documentation, https://github.com/from-developers-for-developers/agentic-workflows/tree/main/documentation
|
|
@@ -323,14 +323,14 @@ one:
|
|
|
323
323
|
- `--role manager` is the role driving the task; a worker performing a single
|
|
324
324
|
assignment uses `--role worker`.
|
|
325
325
|
|
|
326
|
-
A request no workflow fits
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
agent to leave ww out.
|
|
326
|
+
A request no workflow fits is direct work: the agent does it exactly as it
|
|
327
|
+
would without ww, then registers it with `./ww record <task> --summary "..."`,
|
|
328
|
+
and ww keeps the summary and the commits it finds for it. Questions and other
|
|
329
|
+
read-only work never start a task. The agent first runs `./ww lookup` with the
|
|
330
|
+
task you named, however you wrote it (`12345` finds `FOOBAR-12345`), and asks
|
|
331
|
+
you nothing unless the request clearly matches a workflow, in which case it
|
|
332
|
+
offers that workflow or "just do it, register afterwards". Say `/noww` when
|
|
333
|
+
you want the agent to leave ww out.
|
|
334
334
|
|
|
335
335
|
If you would rather open the task yourself — to pin an external ticket key, or
|
|
336
336
|
to hand a prepared task to an agent — the same command works typed in.
|
|
@@ -649,7 +649,7 @@ ww-agentic-workflows complete TASK-123 --role worker \
|
|
|
649
649
|
- [architecture.md](documentation/architecture.md) describes internals, boundaries, state, and
|
|
650
650
|
design decisions.
|
|
651
651
|
- [agent-hooks.md](documentation/agent-hooks.md) covers the agent's own hooks
|
|
652
|
-
(session-start
|
|
652
|
+
(the session-start line): what it does, per-agent support, and
|
|
653
653
|
install/uninstall/show.
|
|
654
654
|
- [examples.md](documentation/examples.md) is a set of complete, tested
|
|
655
655
|
`ww.yaml` examples, one per control or behaviour.
|
|
@@ -285,14 +285,14 @@ one:
|
|
|
285
285
|
- `--role manager` is the role driving the task; a worker performing a single
|
|
286
286
|
assignment uses `--role worker`.
|
|
287
287
|
|
|
288
|
-
A request no workflow fits
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
agent to leave ww out.
|
|
288
|
+
A request no workflow fits is direct work: the agent does it exactly as it
|
|
289
|
+
would without ww, then registers it with `./ww record <task> --summary "..."`,
|
|
290
|
+
and ww keeps the summary and the commits it finds for it. Questions and other
|
|
291
|
+
read-only work never start a task. The agent first runs `./ww lookup` with the
|
|
292
|
+
task you named, however you wrote it (`12345` finds `FOOBAR-12345`), and asks
|
|
293
|
+
you nothing unless the request clearly matches a workflow, in which case it
|
|
294
|
+
offers that workflow or "just do it, register afterwards". Say `/noww` when
|
|
295
|
+
you want the agent to leave ww out.
|
|
296
296
|
|
|
297
297
|
If you would rather open the task yourself — to pin an external ticket key, or
|
|
298
298
|
to hand a prepared task to an agent — the same command works typed in.
|
|
@@ -611,7 +611,7 @@ ww-agentic-workflows complete TASK-123 --role worker \
|
|
|
611
611
|
- [architecture.md](documentation/architecture.md) describes internals, boundaries, state, and
|
|
612
612
|
design decisions.
|
|
613
613
|
- [agent-hooks.md](documentation/agent-hooks.md) covers the agent's own hooks
|
|
614
|
-
(session-start
|
|
614
|
+
(the session-start line): what it does, per-agent support, and
|
|
615
615
|
install/uninstall/show.
|
|
616
616
|
- [examples.md](documentation/examples.md) is a set of complete, tested
|
|
617
617
|
`ww.yaml` examples, one per control or behaviour.
|
{ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/WW_AGENT_INSTRUCTIONS.md
RENAMED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
ww saves progress, runs handlers, and names the next role; it is only for
|
|
4
4
|
development. Where ww is used by default, every file change goes through ww
|
|
5
5
|
unless the user asks you not to. Reviews, questions, investigations and other
|
|
6
|
-
read-only work never use ww, its skill or a task.
|
|
7
|
-
`./ww lookup [<task>] --agent <agent>` and follow it; it never creates a task without operator confirmation.
|
|
6
|
+
read-only work never use ww, its skill or a task.
|
|
8
7
|
|
|
9
8
|
## Start here
|
|
10
9
|
|
|
@@ -14,7 +13,7 @@ Before starting new work, run:
|
|
|
14
13
|
./ww discover
|
|
15
14
|
```
|
|
16
15
|
|
|
17
|
-
It lists the project's workflows, modes, the start command,
|
|
16
|
+
It lists the project's workflows, modes, the start command, and
|
|
18
17
|
whether to use ww unasked. If disabled, stop; if used only on request, use it only when
|
|
19
18
|
the user asks for ww. Choose the matching workflow and keep its default modes
|
|
20
19
|
unless the request matches another mode; ask only when the choice would
|
|
@@ -23,6 +22,17 @@ materially change the work.
|
|
|
23
22
|
When a request names an external ticket, use that as the task ID. Omit the ID
|
|
24
23
|
only when none is named or the workflow obtains it in its first step.
|
|
25
24
|
|
|
25
|
+
A request that names a ticket or clearly matches a workflow's description, and
|
|
26
|
+
is more than a small change: propose that workflow, and offer the alternative in
|
|
27
|
+
the same choice, "run `<workflow>`" / "just do it, register afterwards". Any
|
|
28
|
+
other request is direct work: do it as in a plain conversation, ask nothing,
|
|
29
|
+
then run `./ww record <task> --summary "..."` (`./ww lookup [<task>] --agent
|
|
30
|
+
<agent>` names the task). Judge each prompt on its own; a series of small
|
|
31
|
+
requests stays direct work, never a workflow. Ask only when genuinely ambiguous,
|
|
32
|
+
and never again on a task once the operator chose direct work. If `record`
|
|
33
|
+
fails or is forgotten, ww records the commits on the next manager
|
|
34
|
+
page (`instruction --role manager`): do not retry.
|
|
35
|
+
|
|
26
36
|
To continue an existing task, run `./ww instruction <task-id> --role manager`;
|
|
27
37
|
a worker resuming its assignment uses `--role worker`. Check status with
|
|
28
38
|
`./ww status <task-id>`.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Agent hooks
|
|
2
|
+
|
|
3
|
+
ww's instructions to agents are static, so a session needs one pointer to
|
|
4
|
+
find ww at all. Agent hooks are the agent's own hooks, installed with `ww hook`
|
|
5
|
+
— not the workflow hooks of `ww.yaml` (see
|
|
6
|
+
[Workflow hooks, variables, and transitions](features.md#workflow-hooks-variables-and-transitions)
|
|
7
|
+
in the feature reference), which run as part of a plan and can run
|
|
8
|
+
handlers, gate completion, or trigger a check. Agent hooks are gentle by
|
|
9
|
+
design: they add one line of context, and nothing they do ever blocks the
|
|
10
|
+
agent.
|
|
11
|
+
|
|
12
|
+
ww registers one hook, `session-start`, which runs when a session starts,
|
|
13
|
+
resumes, or is compacted. It prints a reminder that ww coordinates work here
|
|
14
|
+
(under `"enabled": "on_request"`: that ww is used only when the user asks for
|
|
15
|
+
it) and how to list its workflows. It lists no task: `discover` lists the
|
|
16
|
+
project's workflows, and the operator names the task to continue.
|
|
17
|
+
|
|
18
|
+
There is no pre-spawn hook yet: ww does not intercept an agent's own
|
|
19
|
+
subagent calls. `subagents: false` is enforced only through the step's
|
|
20
|
+
page today; see [Agent limitations](limitations.md#agent-limitations).
|
|
21
|
+
|
|
22
|
+
## What `session-start` prints
|
|
23
|
+
|
|
24
|
+
What `session-start` prints stays in the agent's context for the whole
|
|
25
|
+
session, so it is one line:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
This project coordinates work through ww: `./ww discover` lists its workflows.
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
After a compaction it starts with a line before that one: "Context was
|
|
32
|
+
compacted; ww's task state is authoritative." Only the main session gets this
|
|
33
|
+
context: no hook is registered for a subagent's start, since a worker receives
|
|
34
|
+
its bootstrap command from the manager.
|
|
35
|
+
|
|
36
|
+
## `stop` and `interrupt` are retired
|
|
37
|
+
|
|
38
|
+
Earlier versions of ww also registered `stop` and `interrupt` hooks, which
|
|
39
|
+
listed unfinished tasks, reminded an agent to close a step, and recorded
|
|
40
|
+
interrupted sessions. They are gone: a reminder written for one session
|
|
41
|
+
confused another, and nothing in them was needed to continue a task.
|
|
42
|
+
|
|
43
|
+
The events stay accepted so a hooks file written by an older ww keeps
|
|
44
|
+
working. `ww hook stop` and `ww hook interrupt` exit 0 with no output and
|
|
45
|
+
record nothing; the audit log notes the call. The `agent_hooks` keys
|
|
46
|
+
`check_unfinished` and `recent_days` in `ww.json` are still validated and
|
|
47
|
+
still accepted, and have no effect. Running `hook install` again replaces an
|
|
48
|
+
older registration with the one `session-start` entry, and `hook uninstall`
|
|
49
|
+
removes every ww entry, whichever events it registered.
|
|
50
|
+
|
|
51
|
+
## Agents and their files
|
|
52
|
+
|
|
53
|
+
| Agent | Project file | Native event | Local file |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| Claude Code | `.claude/settings.json` | `SessionStart` | `.claude/settings.local.json` |
|
|
56
|
+
| Codex | `.codex/hooks.json` | `SessionStart` | none; user file `~/.codex/hooks.json` |
|
|
57
|
+
| Cursor | `.cursor/hooks.json` | `sessionStart` | none; user file `~/.cursor/hooks.json` |
|
|
58
|
+
| Antigravity | `.agents/hooks.json`, group `ww` | `PreInvocation` | none; user file `~/.gemini/config/hooks.json` |
|
|
59
|
+
|
|
60
|
+
Claude Code's `SessionStart` has no matcher, so it fires for every source,
|
|
61
|
+
compaction included. Antigravity has no session-start event, so ww answers
|
|
62
|
+
only its first pre-invocation of a conversation, as an ephemeral message that
|
|
63
|
+
never accumulates. Codex loads project hooks only once the project's `.codex/`
|
|
64
|
+
layer is trusted: review them with `/hooks` in Codex.
|
|
65
|
+
|
|
66
|
+
These per-agent gaps (no session-start event, a trust gate) are permanent
|
|
67
|
+
differences between agents, not bugs; see
|
|
68
|
+
[Agent limitations](limitations.md#agent-limitations) for the summary.
|
|
69
|
+
|
|
70
|
+
## Install, remove, and show
|
|
71
|
+
|
|
72
|
+
```console
|
|
73
|
+
ww-agentic-workflows hook install --agent claudecode
|
|
74
|
+
ww-agentic-workflows hook uninstall --agent codex
|
|
75
|
+
ww-agentic-workflows hook show --agent cursor
|
|
76
|
+
ww-agentic-workflows hook install --agent claudecode --local
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`install` merges ww's entry into whatever the file already holds and leaves
|
|
80
|
+
every other entry alone. ww recognises its own entries by their command, so a
|
|
81
|
+
second `install` changes nothing and `uninstall` removes exactly what ww added,
|
|
82
|
+
including the `stop` and `interrupt` entries an older ww registered. `show`
|
|
83
|
+
prints the file and the exact snippet, that is, what ww registers, for a
|
|
84
|
+
machine or an agent where `install` cannot run. A file that is not valid JSON,
|
|
85
|
+
or cannot be written, makes `install` fail with the path and the full snippet
|
|
86
|
+
to add by hand.
|
|
87
|
+
|
|
88
|
+
`--local` writes the agent's project file kept out of version control, so the
|
|
89
|
+
hooks stay one person's choice. Only Claude Code has one,
|
|
90
|
+
`.claude/settings.local.json`; for the other agents `--local` fails and names
|
|
91
|
+
their user-level file, which applies to every project on the machine. Without
|
|
92
|
+
`--local` the hooks go into the shared project file, which is usually committed,
|
|
93
|
+
so everyone who clones the project gets them. When ww's hooks sit in both of
|
|
94
|
+
Claude Code's files every hook would run twice, so `install` and `show` print a
|
|
95
|
+
notice with the command that removes one copy.
|
|
96
|
+
|
|
97
|
+
The registered command calls the project's tracked `./ww` launcher: through
|
|
98
|
+
`"$CLAUDE_PROJECT_DIR"` for Claude Code, from the project root for Cursor, and
|
|
99
|
+
from the repository's top level (`git rev-parse --show-toplevel`) for Codex and
|
|
100
|
+
Antigravity. The launcher resolves the durable root through the shared Git
|
|
101
|
+
directory, so a session in a task worktree reaches the same state; the launcher
|
|
102
|
+
must therefore be tracked for worktree sessions.
|
|
103
|
+
|
|
104
|
+
The runtime form, `ww hook session-start|stop|interrupt --agent <agent>`, is
|
|
105
|
+
what the agents call; it reads the agent's JSON payload on stdin.
|
|
106
|
+
|
|
107
|
+
## When a hook fails or runs too often
|
|
108
|
+
|
|
109
|
+
A hook never breaks the agent. On any error, a bad argument, or outside a ww
|
|
110
|
+
root, it exits 0 with no output: some agents read exit code 2 as "continue", and
|
|
111
|
+
an unexpected message would enter the agent's context. The worst outcome is a
|
|
112
|
+
lost hint. When the command cannot start at all, for example a missing
|
|
113
|
+
launcher or an untrusted Codex hook, the agent shows its own non-blocking hook
|
|
114
|
+
error. A hook that times out is killed by the agent, which carries on.
|
|
115
|
+
|
|
116
|
+
Running more often than needed is harmless. Antigravity calls its
|
|
117
|
+
pre-invocation hook before every model call; only the first one returns
|
|
118
|
+
context.
|
|
119
|
+
|
|
120
|
+
Every hook call is written to the audit log, `.ww/executions.jsonl`, with the
|
|
121
|
+
event, the agent, and ww's decision, so a session can be followed there:
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{"command": "hook", "hook_event": "session-start", "hook_agent": "claudecode", "hook_decision": "context", "outcome": "ok"}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
A failure is logged with `outcome: error` and the exception type. The agent's
|
|
128
|
+
payload is never logged.
|
|
129
|
+
|
|
130
|
+
## See also
|
|
131
|
+
|
|
132
|
+
- [Agent limitations](limitations.md#agent-limitations): per-agent hook
|
|
133
|
+
gaps, nested subagents, and why a worker cannot talk to the operator.
|
|
134
|
+
- [architecture.md](architecture.md#agent-hooks) for how the hook answers
|
|
135
|
+
are computed internally.
|
{ww_agentic_workflows-1.0.0.dev3 → ww_agentic_workflows-1.0.0.dev5}/documentation/architecture.md
RENAMED
|
@@ -29,7 +29,7 @@ produce those definitions directly through the same loader contract. Shared
|
|
|
29
29
|
cross-definition rules live in `../src/ww/workflow_validation.py`, so notation
|
|
30
30
|
parsers do not acquire different workflow semantics. Validation is also where
|
|
31
31
|
the built-in workflows join the configured ones: `../src/ww/builtin_workflows.py`
|
|
32
|
-
parses the YAML files shipped in `../src/ww/assets/workflows/` (`
|
|
32
|
+
parses the YAML files shipped in `../src/ww/assets/workflows/` (`scriptize.yaml` with `ww-scriptize-rules`, and
|
|
33
33
|
`onboarding.yaml` with ww's learning and setup workflows) with the same frontend, once per process, and adds each workflow the
|
|
34
34
|
configuration does not define itself and `../ww.json` does not
|
|
35
35
|
switch off, with the documents and modes its file declares, dropping a
|
|
@@ -43,11 +43,17 @@ it. The scriptizing workflow declares its own Git lifecycle hooks to isolate
|
|
|
43
43
|
tool installs and configuration changes from the operator's current branch.
|
|
44
44
|
`ww/git` always branches it from the required default base and follows its
|
|
45
45
|
worktree settings; built-in composition needs no project lane setting.
|
|
46
|
-
`lookup` (`../src/ww/cli/lookup.py`) is the
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
(`../src/ww/agents.py`)
|
|
46
|
+
`lookup` (`../src/ww/cli/lookup.py`) is the entry point of direct work:
|
|
47
|
+
`../src/ww/task_references.py` maps what the operator called a task onto the
|
|
48
|
+
task format and the IDs the storage port lists, and the command answers with
|
|
49
|
+
one next step, continuing an open run or naming the `record` command, and
|
|
50
|
+
asking the operator through the agent's choice menu (`../src/ww/agents.py`)
|
|
51
|
+
only when the reference matches several tasks. `../src/ww/direct_work.py` holds
|
|
52
|
+
the direct-work entries kept in each task's `direct-work.json` (a
|
|
53
|
+
`TaskDirectWorkStorage` port of the storage adapters) and finds the commits for
|
|
54
|
+
them from the ww/git records and `git log`; `WorkflowService.record_direct_work`
|
|
55
|
+
backs `record`, and `reconcile_direct_work` runs before a manager's
|
|
56
|
+
`instruction` page. `inherit` is resolved by
|
|
51
57
|
the YAML frontend itself, once every workflow is parsed: the heir becomes a
|
|
52
58
|
complete copy with its own settings on top, and global hooks filtered to a
|
|
53
59
|
workflow are extended to its heirs, so validation, the compiler, `plan`, and
|
|
@@ -954,7 +960,8 @@ builds from the saved state (`instructions/handoff.py`): the items performed
|
|
|
954
960
|
with their outcomes, artifacts, checks, fix rounds and change set, plus the
|
|
955
961
|
worker's capped `--summary`. The service takes the open
|
|
956
962
|
assignment's items before a worker command runs, so the block can still name
|
|
957
|
-
them after the command closed the assignment.
|
|
963
|
+
them after the command closed the assignment. `WorkflowService` builds the block in one method, used by both the completion
|
|
964
|
+
path and `ww handoff`, which reprints it for an ended assignment from the saved records. A worker's `complete` or `loop`
|
|
958
965
|
on a `role: manager` item is refused; the manager completes it with `--role
|
|
959
966
|
manager`.
|
|
960
967
|
A step's `role` says who performs it, and it is resolved along the same chain
|
|
@@ -1371,9 +1378,7 @@ waiting while the child it could not launch has no run.
|
|
|
1371
1378
|
`complete --role manager` is composed in the CLI: the policy (`manager_continues_itself`)
|
|
1372
1379
|
reads the page the completion returned and, when the next step is the manager's own,
|
|
1373
1380
|
the command calls `next` as the manager would; the service's `complete` never
|
|
1374
|
-
dispatches, so every other caller keeps its single-step contract.
|
|
1375
|
-
treats a task with an open child below it, or a delegated step in progress, as a
|
|
1376
|
-
manager that is waiting (`OpenTask.waiting_on_another`). `init`'s opt-in Claude Code
|
|
1381
|
+
dispatches, so every other caller keeps its single-step contract. `init`'s opt-in Claude Code
|
|
1377
1382
|
permission rules live in `ww.claude_permissions` (merge, never clobber, keep ignored).
|
|
1378
1383
|
|
|
1379
1384
|
Amendments to a task's requirements live behind their own storage port
|
|
@@ -1410,6 +1415,15 @@ extension namespace values, for agent pages, automatic handlers, and the
|
|
|
1410
1415
|
reuses the loop exit: `finish_loop_exit` skips the remaining per-child items
|
|
1411
1416
|
and the drain marks the children that never started `skipped`.
|
|
1412
1417
|
|
|
1418
|
+
`add-child` is also accepted while a per-child stage is the active item. The
|
|
1419
|
+
guard in `WorkflowService.add_child` refuses once the cursor has left the
|
|
1420
|
+
per-child items. Otherwise the new child is appended and
|
|
1421
|
+
`append_child_lifecycle` (in `../src/ww/transitions.py`) expands one more
|
|
1422
|
+
lifecycle from `snapshot.template_plan` through `_expand_templates`, with no
|
|
1423
|
+
replaced items and placed after the last planned child's last item. The child
|
|
1424
|
+
record and the grown plan are committed in the same task lock, so a child is
|
|
1425
|
+
never recorded without its stages.
|
|
1426
|
+
|
|
1413
1427
|
The scope is deliberately one level: a child workflow cannot itself declare
|
|
1414
1428
|
`children`. When the last child completes, ww completes
|
|
1415
1429
|
the parent coordinator and resumes the parent's ordinary completion lifecycle,
|
|
@@ -1604,13 +1618,9 @@ completion is refused until it was ended. How the operator is asked is the
|
|
|
1604
1618
|
agent's business; the choice mechanisms table in `agents.py` is core knowledge
|
|
1605
1619
|
of what each integration offers, not an extension point.
|
|
1606
1620
|
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
messages since the attempt started, and the hook appends them through
|
|
1611
|
-
`InteractionLog` under speakers marked `(recovered)`. It writes no task state
|
|
1612
|
-
and takes no task lock: the session that held the conversation is the one
|
|
1613
|
-
ending, and the step record's entry count stays the agent's.
|
|
1621
|
+
A session that ends mid-conversation loses what was not yet recorded; ww does
|
|
1622
|
+
not recover it from the agent's transcript, and the next session asks the
|
|
1623
|
+
operator where they were.
|
|
1614
1624
|
|
|
1615
1625
|
The operator page is an extra on top of that, not part of it. The core knows
|
|
1616
1626
|
it by one flag, `interactive: page` on a per-item stage (`ui` on the
|
|
@@ -1642,24 +1652,32 @@ the operator left, and only the operator's own words lift it.
|
|
|
1642
1652
|
## Agent hooks
|
|
1643
1653
|
|
|
1644
1654
|
See [documentation/agent-hooks.md](agent-hooks.md) for the user-facing
|
|
1645
|
-
behaviour (
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
`
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1655
|
+
behaviour (the session-start line, per-agent table, install/uninstall/show);
|
|
1656
|
+
this section is the internal design behind it.
|
|
1657
|
+
|
|
1658
|
+
The hooks stay small on purpose. ww once listed unfinished tasks at session
|
|
1659
|
+
start, reminded an agent to close a step when it stopped, recorded interrupted
|
|
1660
|
+
sessions, and recovered conversations from transcripts. The result confused
|
|
1661
|
+
sessions that had nothing to do with the task, so only the one line a session
|
|
1662
|
+
needs to find ww remains. `ww.hooks.runtime` answers it: `session-start`
|
|
1663
|
+
prints `session_context` from `ww.hooks.notices`, and every other event
|
|
1664
|
+
answers nothing. The adapters in `ww.hooks.agents` only translate: each reads
|
|
1665
|
+
its agent's payload into one neutral record and renders ww's answer in the
|
|
1666
|
+
agent's reply shape. A new agent is one more adapter. The three events, the
|
|
1667
|
+
payload fields (including the ones nothing reads now) and the `agent_hooks`
|
|
1668
|
+
keys stay accepted, so a hooks file or `ww.json` written by an older ww keeps
|
|
1669
|
+
working; `stop` and `interrupt` calls from an older installation exit 0 with no
|
|
1670
|
+
output and write no state. ww keeps no hook record per task: `reset` only
|
|
1671
|
+
removes the `interrupted.json` and `stop-reminders.json` an older version
|
|
1672
|
+
may have left, so they cannot keep the task directory alive.
|
|
1673
|
+
|
|
1674
|
+
`ww.open_work` is reduced to what the operator surface `discover` needs: it
|
|
1675
|
+
reads every task's record and returns, as `UnreadableTask`, the ones that
|
|
1676
|
+
raised `StateError` (both storage adapters wrap a bad record that way), so a
|
|
1677
|
+
broken task is named instead of hidden; only commands addressing such a task
|
|
1678
|
+
still fail. It is not used by the hooks, and no command lists unfinished tasks:
|
|
1679
|
+
the operator names the task, and `lookup`'s "continue" outcome and
|
|
1680
|
+
`instruction` find the open run.
|
|
1663
1681
|
|
|
1664
1682
|
The runtime form is intercepted before normal command parsing. It always
|
|
1665
1683
|
exits 0 without stderr, because exit code 2 means "continue" to some agents'
|
|
@@ -1667,32 +1685,9 @@ stop hooks and stray text would enter the agent's context, and it skips the
|
|
|
1667
1685
|
update notice. It still writes one audit record per call with ww's decision,
|
|
1668
1686
|
never the payload, so a session can be followed without the agent's text.
|
|
1669
1687
|
|
|
1670
|
-
The stop hook is a one-time reminder rather than a block. A reminder is
|
|
1671
|
-
recorded per task, run, item, and attempt in `stop-reminders.json` beside the
|
|
1672
|
-
interaction log, and the check and the record happen under a lock of their own:
|
|
1673
|
-
agents run matching hooks in parallel, and the task lock would stall behind a
|
|
1674
|
-
long-running command. An agent's own loop guard is honoured as well.
|
|
1675
|
-
|
|
1676
|
-
Stop and interrupt pick the tasks a session concerns in one function,
|
|
1677
|
-
`ww.open_work.tasks_for_session`. A workspace selects a task only when it is not
|
|
1678
|
-
the root: the root holds every task's state, and a worktree-less task works
|
|
1679
|
-
there, so matching it would tie every root session to every such task.
|
|
1680
|
-
Otherwise the run's recorded agent must be the hook's agent, because a session
|
|
1681
|
-
has no business closing another integration's step. The stop hook further
|
|
1682
|
-
separates a manager from its workers: `OpenTask.delegated` marks a step an
|
|
1683
|
-
`auto` run hands to a worker, and only a stop the adapter reports as a
|
|
1684
|
-
worker's (`HookPayload.from_worker`) reminds about it. Messages name work
|
|
1685
|
-
through `OpenTask.label`, which names a hook item by itself and its step,
|
|
1686
|
-
since a hook records the step it is attached to. The
|
|
1687
|
-
interruption record, `interrupted.json`, is cleared lazily in the one place
|
|
1688
|
-
that reads it, once that attempt completed, failed, or was superseded, never
|
|
1689
|
-
because a notice showed it, so compaction between reading and acting cannot
|
|
1690
|
-
lose it. Listing interruptions scans the markers instead of keeping an index
|
|
1691
|
-
that could drift. Both records belong to the task, and `reset` removes them
|
|
1692
|
-
before the storage adapter removes the task directory.
|
|
1693
|
-
|
|
1694
1688
|
Installation writes only the agent's project file, or with `--local` the one it
|
|
1695
|
-
keeps out of version control, merging ww's
|
|
1689
|
+
keeps out of version control, merging ww's one `session-start` entry and
|
|
1690
|
+
recognising ww's entries, including older `stop` and `interrupt` ones, by
|
|
1696
1691
|
their command. `init` offers it per agent and treats a failure as a manual
|
|
1697
1692
|
action, never as an init failure.
|
|
1698
1693
|
|