Skip to content

Commit 88f79c4

Browse files
authored
Merge branch 'main' into dependabot/uv/cryptography-46.0.6
2 parents aec6bfe + e1a3035 commit 88f79c4

119 files changed

Lines changed: 15550 additions & 16982 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
{
1212
"name": "deepwork",
1313
"description": "Framework for AI-powered multi-step workflows with quality gates",
14-
"version": "0.9.8",
14+
"version": "0.10.0",
1515
"source": "./plugins/claude",
1616
"author": {
1717
"name": "DeepWork"

.deepreview

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ prompt_best_practices:
1414
- "platform/**/*.md"
1515
- "src/deepwork/standard_jobs/**/*.md"
1616
- "library/jobs/**/*.md" # library job step instructions are prompt-heavy files
17+
- "library/jobs/*/job.yml" # inline step instructions in job.yml are prompt-heavy
18+
- "src/deepwork/standard_jobs/*/job.yml" # standard job inline instructions
1719
- "**/.deepreview" # .deepreview files contain inline agent instructions — prompt-heavy content
1820
review:
1921
strategy: individual
@@ -249,6 +251,7 @@ update_documents_relating_to_src_deepwork:
249251
- "CLAUDE.md"
250252
- "doc/architecture.md"
251253
- "doc/mcp_interface.md"
254+
- "doc/job_yml_guidance.md" # Describes job.yml runtime behavior — must stay in sync with parser/schema
252255
- "doc/doc-specs.md"
253256
- "doc/platforms/**"
254257
- "src/deepwork/hooks/README.md"
@@ -264,6 +267,7 @@ update_documents_relating_to_src_deepwork:
264267
- CLAUDE.md (project structure, tech stack, CLI commands, architecture)
265268
- doc/architecture.md (detailed architecture, module descriptions, data flow)
266269
- doc/mcp_interface.md (MCP tool parameters, return values, server config)
270+
- doc/job_yml_guidance.md (job.yml field descriptions, runtime behavior, review cascade)
267271
- doc/doc-specs.md (doc spec format, parser behavior, quality criteria)
268272
- doc/platforms/claude/ (Claude-specific hooks, CLI config, learnings)
269273
- doc/platforms/gemini/ (Gemini-specific hooks, CLI config, learnings)
@@ -430,44 +434,43 @@ deepreview_config_quality:
430434
and a specific recommendation.
431435

432436
job_schema_instruction_compatibility:
433-
description: "Verify deepwork_jobs instruction files, templates, and examples are compatible with the job schema."
437+
description: "Verify deepwork_jobs job.yml inline instructions are compatible with the job schema."
434438
match:
435439
include:
436440
- "src/deepwork/jobs/job.schema.json"
437-
- "src/deepwork/standard_jobs/deepwork_jobs/steps/*.md"
438-
- "src/deepwork/standard_jobs/deepwork_jobs/templates/*"
439441
- "src/deepwork/standard_jobs/deepwork_jobs/job.yml"
442+
- "src/deepwork/standard_jobs/deepwork_reviews/job.yml"
443+
- "src/deepwork/standard_jobs/deepwork_jobs/templates/job.yml.*" # Templates users copy — must match schema
444+
- "library/jobs/*/job.yml"
440445
review:
441446
strategy: matches_together
442447
additional_context:
443448
unchanged_matching_files: true
444449
instructions: |
445-
When the job schema or deepwork_jobs instruction files change, verify they
446-
are still compatible with each other.
450+
When the job schema, standard job definitions, or library job definitions
451+
change, verify they are still compatible with each other.
447452

448453
Read src/deepwork/jobs/job.schema.json to understand the current schema.
449-
Then read each instruction file, template, and example in
450-
src/deepwork/standard_jobs/deepwork_jobs/ and check:
454+
Then read each job.yml (standard and library) and check:
451455

452-
1. **Field references**: Every field name mentioned in prose instructions,
453-
templates, or examples must exist in the schema at the correct level.
454-
Pay special attention to root-level vs step-level fields — a field
455-
that exists on steps may not exist at the root, and vice versa.
456+
1. **Field references**: Every field name referenced in inline step
457+
instructions must exist in the schema at the correct level.
458+
Pay special attention to step_arguments vs workflow vs step fields.
456459

457460
2. **Required vs optional**: If instructions say a field is required,
458461
verify the schema agrees. If instructions say a field is optional,
459462
verify the schema doesn't require it.
460463

461-
3. **Schema structure**: Template files and examples that show YAML
462-
structure must match the schema's property names and nesting.
464+
3. **Schema structure**: Any YAML examples shown in inline instructions
465+
must match the schema's property names and nesting.
463466

464467
4. **Terminology consistency**: Instructions should use the same field
465468
names as the schema (e.g., if the schema uses
466469
"common_job_info_provided_to_all_steps_at_runtime", instructions
467470
should not call it "description" or "job_description").
468471

469472
Output Format:
470-
- PASS: All instruction files are compatible with the schema.
473+
- PASS: All job definitions are compatible with the schema.
471474
- FAIL: Incompatibilities found. List each with the file path, line
472475
reference, the incompatible content, and what the schema actually says.
473476

@@ -526,3 +529,35 @@ nix_claude_wrapper:
526529
Output Format:
527530
- PASS: The claude wrapper is correctly configured with both plugin dirs.
528531
- FAIL: Describe what is missing or broken.
532+
533+
mcp_interface_consumer_sync:
534+
description: "When MCP tool interfaces change, verify that skills, hooks, and platform content still reference correct parameter names, types, and behavior."
535+
match:
536+
include:
537+
- "src/deepwork/jobs/mcp/tools.py"
538+
- "src/deepwork/jobs/mcp/schemas.py"
539+
- "src/deepwork/jobs/mcp/server.py"
540+
review:
541+
strategy: matches_together
542+
additional_context:
543+
unchanged_matching_files: true
544+
instructions: |
545+
When the MCP tool interfaces (tools.py, schemas.py, server.py) change,
546+
verify that downstream consumers still accurately describe the MCP
547+
interface. Check each of these files for stale parameter names, removed
548+
fields, renamed concepts, or outdated behavior descriptions:
549+
550+
- platform/skill-body.md
551+
- plugins/claude/skills/deepwork/SKILL.md
552+
- plugins/gemini/skills/deepwork/SKILL.md
553+
- plugins/claude/hooks/post_compact.sh
554+
- doc/mcp_interface.md
555+
556+
For each file, compare any MCP parameter names, tool names, response
557+
fields, or workflow behavior descriptions against the actual schemas
558+
and tool implementations. Flag anything that no longer matches.
559+
560+
Output Format:
561+
- PASS: All consumer files are consistent with the current MCP interface.
562+
- FAIL: List each inconsistency with the file, the stale content, and
563+
what it should say based on the current implementation.

.github/workflows/README.md

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -102,18 +102,8 @@ All checks will pass in both PR and merge queue contexts (either by running or b
102102

103103
### prepare-release.yml
104104
- **Triggers**: `workflow_dispatch` with inputs: `version`, `release_type` (stable/alpha/beta/rc), `prerelease_number`, `ref`
105-
- **Stable releases**: Creates a `release/<version>` branch, bumps versions in pyproject.toml/plugin.json/marketplace.json, updates CHANGELOG.md, runs `uv sync`, and opens a PR with the `release` label
106-
- **Pre-releases**: Checks out the specified `ref` branch, bumps versions (PEP 440 for PyPI, semver for plugin.json), pins `.mcp.json` to the pre-release PyPI package, force-pushes to the `pre-release` branch, tags, and creates a GitHub Release directly (no PR)
107-
108-
### publish-release.yml
109-
- **Triggers**: `pull_request` (closed) — only when merged with the `release` label
110-
- **Jobs**: Extracts version from PR title, creates a git tag, extracts release notes from CHANGELOG.md, and creates a GitHub Release
111-
- Uses `RELEASE_TOKEN` (PAT) so the created release triggers `release.yml`
112-
113-
### prepare-release.yml
114-
- **Triggers**: `workflow_dispatch` with inputs: `version`, `release_type` (stable/alpha/beta/rc), `prerelease_number`, `ref`
115-
- **Stable releases**: Creates a `release/<version>` branch, bumps versions in pyproject.toml/plugin.json/marketplace.json, updates CHANGELOG.md, runs `uv sync`, and opens a PR with the `release` label
116-
- **Pre-releases**: Checks out the specified `ref` branch, bumps versions (PEP 440 for PyPI, semver for plugin.json), pins `.mcp.json` to the pre-release PyPI package, force-pushes to the `pre-release` branch, tags, and creates a GitHub Release directly (no PR)
105+
- **Stable releases**: Creates a `release/<version>` branch, bumps versions in pyproject.toml/__init__.py/plugin.json/marketplace.json, updates CHANGELOG.md, runs `uv sync`, and opens a PR with the `release` label
106+
- **Pre-releases**: Checks out the specified `ref` branch, bumps versions in pyproject.toml/__init__.py/plugin.json/marketplace.json (PEP 440 for PyPI, semver for plugin.json/marketplace.json), pins `.mcp.json` to the pre-release PyPI package, force-pushes to the `pre-release` branch, tags, and creates a GitHub Release directly (no PR)
117107

118108
### publish-release.yml
119109
- **Triggers**: `pull_request` (closed) — only when merged with the `release` label

.github/workflows/claude-code-test.yml

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -68,34 +68,36 @@ jobs:
6868
job = parse_job_definition(Path('tests/fixtures/jobs/fruits'))
6969
7070
assert job.name == 'fruits'
71-
assert job.version == '1.0.0'
72-
assert len(job.steps) == 2
73-
assert [s.id for s in job.steps] == ['identify', 'classify']
74-
75-
# Identify step: user input -> file output
76-
identify = job.steps[0]
77-
assert identify.inputs[0].is_user_input()
78-
assert identify.inputs[0].name == 'raw_items'
79-
assert identify.outputs[0].name == 'identified_fruits.md'
80-
assert identify.dependencies == []
81-
82-
# Classify step: file input from identify -> file output
83-
classify = job.steps[1]
84-
assert classify.inputs[0].is_file_input()
85-
assert classify.inputs[0].file == 'identified_fruits.md'
86-
assert classify.inputs[0].from_step == 'identify'
87-
assert classify.outputs[0].name == 'classified_fruits.md'
88-
assert classify.dependencies == ['identify']
71+
assert job.summary is not None
72+
73+
# Step arguments (shared input/output definitions)
74+
arg_names = [a.name for a in job.step_arguments]
75+
assert 'raw_items' in arg_names
76+
assert 'identified_fruits' in arg_names
77+
assert 'classified_fruits' in arg_names
8978
9079
# Workflow definition
91-
assert len(job.workflows) == 1
92-
assert job.workflows[0].name == 'full'
93-
assert job.workflows[0].steps == ['identify', 'classify']
94-
95-
# Validations pass
96-
job.validate_dependencies()
97-
job.validate_file_inputs()
98-
job.validate_workflows()
80+
assert 'full' in job.workflows
81+
wf = job.workflows['full']
82+
assert wf.step_names == ['identify', 'classify']
83+
84+
# Identify step: raw_items input -> identified_fruits output
85+
identify = wf.get_step('identify')
86+
assert identify is not None
87+
assert 'raw_items' in identify.inputs
88+
assert 'identified_fruits' in identify.outputs
89+
90+
# Classify step: identified_fruits input -> classified_fruits output
91+
classify = wf.get_step('classify')
92+
assert classify is not None
93+
assert 'identified_fruits' in classify.inputs
94+
assert 'classified_fruits' in classify.outputs
95+
96+
# Validations pass (parse_job_definition already runs these, but verify they don't raise)
97+
job.validate_unique_step_names()
98+
job.validate_argument_refs()
99+
job.validate_sub_workflows()
100+
job.validate_step_exclusivity()
99101
100102
print('All fruits fixture validations passed!')
101103
"

.github/workflows/prepare-release.yml

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,15 @@ jobs:
203203
# Verify the change
204204
grep "^version = " pyproject.toml
205205
206+
# --- Both: update __init__.py version ---
207+
- name: Update __init__.py version
208+
run: |
209+
VERSION="${{ steps.versions.outputs.pypi_version }}"
210+
sed -i "s/^__version__ = \".*\"/__version__ = \"$VERSION\"/" src/deepwork/__init__.py
211+
212+
# Verify the change
213+
grep "^__version__" src/deepwork/__init__.py
214+
206215
# --- Both: update plugin.json files ---
207216
- name: Update plugin versions
208217
run: |
@@ -264,6 +273,7 @@ jobs:
264273
run: |
265274
VERSION="${{ steps.versions.outputs.pypi_version }}"
266275
git add CHANGELOG.md pyproject.toml uv.lock .claude-plugin/marketplace.json \
276+
src/deepwork/__init__.py \
267277
$(find . -path '*/.claude-plugin/plugin.json')
268278
git commit -m "Release v${VERSION}"
269279
git push -u origin "release/${VERSION}"
@@ -305,7 +315,7 @@ jobs:
305315
306316
# Force-push to the `pre-release` branch.
307317
# This is the branch users subscribe to via:
308-
# /plugin marketplace add Unsupervisedcom/deepwork#pre-release
318+
# claude plugin marketplace add Unsupervisedcom/deepwork#pre-release
309319
git push origin HEAD:refs/heads/pre-release --force
310320
311321
# Tag for the GitHub Release
@@ -323,8 +333,8 @@ jobs:
323333
324334
**To use this pre-release**, subscribe to the pre-release plugin channel:
325335
```
326-
/plugin marketplace add Unsupervisedcom/deepwork#pre-release
327-
/plugin install deepwork@deepwork-plugins
336+
claude plugin marketplace add Unsupervisedcom/deepwork#pre-release
337+
claude plugin install deepwork@deepwork-plugins
328338
```
329339
draft: false
330340
prerelease: true

0 commit comments

Comments
 (0)