Release v1.9.0 — Bulk Operations Expansion #41

Merged
Mike Bros merged 7 commits from release/1.9.0 into main 2026-03-17 04:52:46 +00:00
Contributor

Release v1.9.0 — Bulk Operations Expansion

Changes

  • OP#2367: Add bulk_create_work_packages tool
  • OP#2368: Add bulk_create_relations tool
  • OP#2369: Add bulk_delete_work_packages tool
  • OP#2373: Unit tests for bulk operations expansion (13 new e2e tests)
  • OP#2375: Update README and tool reference documentation

Summary

Adds three new bulk operation tools to complement the existing bulk_update_work_packages and bulk_transition_work_packages. All follow the same pattern: independent item processing, per-item results, max batch size of 200. Total tool count: 67.

Checklist

  • All version tasks closed in Gravity PM
  • Tests passing (279/279)
  • Lint passing (biome clean)
  • Security audit clean (0 vulnerabilities)
  • Version file matches Gravity PM version (1.9.0)

References

Version: 1.9.0 (Gravity PM)
Epic: OP#2371 — Bulk Operations Expansion

## Release v1.9.0 — Bulk Operations Expansion ### Changes - OP#2367: Add bulk_create_work_packages tool - OP#2368: Add bulk_create_relations tool - OP#2369: Add bulk_delete_work_packages tool - OP#2373: Unit tests for bulk operations expansion (13 new e2e tests) - OP#2375: Update README and tool reference documentation ### Summary Adds three new bulk operation tools to complement the existing `bulk_update_work_packages` and `bulk_transition_work_packages`. All follow the same pattern: independent item processing, per-item results, max batch size of 200. Total tool count: 67. ### Checklist - [x] All version tasks closed in Gravity PM - [x] Tests passing (279/279) - [x] Lint passing (biome clean) - [x] Security audit clean (0 vulnerabilities) - [x] Version file matches Gravity PM version (1.9.0) ### References Version: 1.9.0 (Gravity PM) Epic: OP#2371 — Bulk Operations Expansion
Create multiple work packages in a single call, matching the pattern
of existing bulk tools. Processes items independently with per-item
success/failure results. Enforces max batch size of 200.

Closes OP#2367

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create multiple work package relations in a single call. Supports all
relation types (relates, blocks, follows, etc.). Processes items
independently with per-item results. Max batch size of 200.

Closes OP#2368

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Delete multiple work packages in a single call. Fetches each WP for
confirmation details before deletion. Processes items independently
with per-item results. Max batch size of 200.

Closes OP#2369

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add 13 e2e tests covering all three new bulk tools:
- bulk_create_work_packages: success, partial failure, oversized batch, empty
- bulk_create_relations: success, partial failure, oversized batch, empty
- bulk_delete_work_packages: success, partial failure, oversized, CSV/JSON input

Update mock OpenProject server with handlers for POST work packages,
POST relations, DELETE work packages, and GET types.

Closes OP#2373

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update tool count from 64 to 67. Add bulk_create_work_packages,
bulk_create_relations, and bulk_delete_work_packages to the feature
highlights, tools table, and wiki tool reference.

Closes OP#2375

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
chore(release): bump version to 1.9.0
All checks were successful
CI / lint (pull_request) Successful in 8s
CI / test (pull_request) Successful in 30s
CI / security (pull_request) Successful in 1m34s
52527968f3
Refs OP#2374

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Contributor

PR Review — Release v1.9.0: Bulk Operations Expansion

Reviewer: Gravity Bot (automated)
Scope: 5 files changed, +635 / −27 lines across 6 commits
Files: index.js, test.js, README.md, package.json, wiki-drafts/06-tool-reference.md


Verdict: Acceptable

No blocking findings. The three new bulk tools (bulk_create_work_packages, bulk_create_relations, bulk_delete_work_packages) follow existing patterns consistently and are well-tested.


Findings

🟡 IMPORTANT — Tool reference header not updated

File: wiki-drafts/06-tool-reference.md, line 3
Description: The header still reads "All 62 tools organized by category" but should be 67 to match the README and actual tool count.
Fix: Change 6267 on line 3.

🔵 MINOR — Inconsistent response object in bulk_create_relations

File: index.js, bulk_create_relations success handler
Code:

message: `#${c.fromId} ${data.type} #${c.toId} (relation ${c.id})`,

Description: Uses data.type (raw API response) mixed with c.* (cleaned HAL response) in the same template literal. All other bulk tools use the cleaned response exclusively. type is a top-level string so both work today, but using c.type would be consistent with the established pattern and resilient to future cleanHalResponse changes.
Fix: Change data.typec.type.

NITPICK — Bulk delete fetches before deleting

File: index.js, bulk_delete_work_packages handler
Description: Each item makes 2 API calls (GET for subject, then DELETE). This matches the singular delete_work_package behavior and provides readable confirmation, but at scale (e.g., 200 items) doubles the API load. Not a problem today — just noting the tradeoff is intentional.


Quality Assessment

Criterion Status
Pattern consistency All three tools follow the established bulk pattern (independent processing, per-item results, max 200 batch, success/failure aggregation)
Input validation Zod schemas with LLM-friendly coercion (zId, cleanStringParam, CSV/JSON string parsing for ID arrays)
Error handling Try-catch per item, partial failures reported clearly, batch not aborted
Test coverage 13 new e2e tests covering success, partial failure, oversized batch, empty array, and string coercion
Documentation ⚠️ README updated correctly (64→67), but tool reference header missed (62→67)
Security No injection vectors, all inputs validated via Zod, destructive op (delete) clearly documented as irreversible
MCP_FOOTER Correctly appended in bulk_create_work_packages descriptions

Test Results

  • 279/279 tests passing (including 13 new bulk operation tests)
  • Lint: biome not available locally (CI-only), no issues expected

HUMAN REVIEW

  • Bulk delete UX: The bulk_delete_work_packages tool permanently deletes work packages with no confirmation step beyond the tool description warning. Consider whether the tool's advisory text is sufficient for your use case, or whether an additional safeguard (e.g., dry-run mode) would be warranted for a destructive batch operation.

Reviewed by Gravity Bot — advisory only, does not approve or reject

## PR Review — Release v1.9.0: Bulk Operations Expansion **Reviewer:** Gravity Bot (automated) **Scope:** 5 files changed, +635 / −27 lines across 6 commits **Files:** `index.js`, `test.js`, `README.md`, `package.json`, `wiki-drafts/06-tool-reference.md` --- ### Verdict: **Acceptable** No blocking findings. The three new bulk tools (`bulk_create_work_packages`, `bulk_create_relations`, `bulk_delete_work_packages`) follow existing patterns consistently and are well-tested. --- ### Findings #### 🟡 IMPORTANT — Tool reference header not updated **File:** `wiki-drafts/06-tool-reference.md`, line 3 **Description:** The header still reads "All 62 tools organized by category" but should be **67** to match the README and actual tool count. **Fix:** Change `62` → `67` on line 3. #### 🔵 MINOR — Inconsistent response object in `bulk_create_relations` **File:** `index.js`, bulk_create_relations success handler **Code:** ```javascript message: `#${c.fromId} ${data.type} #${c.toId} (relation ${c.id})`, ``` **Description:** Uses `data.type` (raw API response) mixed with `c.*` (cleaned HAL response) in the same template literal. All other bulk tools use the cleaned response exclusively. `type` is a top-level string so both work today, but using `c.type` would be consistent with the established pattern and resilient to future `cleanHalResponse` changes. **Fix:** Change `data.type` → `c.type`. #### ⚪ NITPICK — Bulk delete fetches before deleting **File:** `index.js`, `bulk_delete_work_packages` handler **Description:** Each item makes 2 API calls (GET for subject, then DELETE). This matches the singular `delete_work_package` behavior and provides readable confirmation, but at scale (e.g., 200 items) doubles the API load. Not a problem today — just noting the tradeoff is intentional. --- ### Quality Assessment | Criterion | Status | |---|---| | **Pattern consistency** | ✅ All three tools follow the established bulk pattern (independent processing, per-item results, max 200 batch, success/failure aggregation) | | **Input validation** | ✅ Zod schemas with LLM-friendly coercion (`zId`, `cleanStringParam`, CSV/JSON string parsing for ID arrays) | | **Error handling** | ✅ Try-catch per item, partial failures reported clearly, batch not aborted | | **Test coverage** | ✅ 13 new e2e tests covering success, partial failure, oversized batch, empty array, and string coercion | | **Documentation** | ⚠️ README updated correctly (64→67), but tool reference header missed (62→67) | | **Security** | ✅ No injection vectors, all inputs validated via Zod, destructive op (delete) clearly documented as irreversible | | **MCP_FOOTER** | ✅ Correctly appended in bulk_create_work_packages descriptions | ### Test Results - **279/279 tests passing** (including 13 new bulk operation tests) - Lint: biome not available locally (CI-only), no issues expected ### HUMAN REVIEW - **Bulk delete UX:** The `bulk_delete_work_packages` tool permanently deletes work packages with no confirmation step beyond the tool description warning. Consider whether the tool's advisory text is sufficient for your use case, or whether an additional safeguard (e.g., dry-run mode) would be warranted for a destructive batch operation. --- *Reviewed by Gravity Bot — advisory only, does not approve or reject*
Owner

@ai wrote in #41 (comment):

HUMAN REVIEW

* **Bulk delete UX:** The `bulk_delete_work_packages` tool permanently deletes work packages with no confirmation step beyond the tool description warning. Consider whether the tool's advisory text is sufficient for your use case, or whether an additional safeguard (e.g., dry-run mode) would be warranted for a destructive batch operation.

I like the idea of just copying the deleted data so a /tmp/ file so that it's recoverable and doesn't require any blockers or additional steps to use somewhat safely.

@ai wrote in https://git.bros.ninja/mike/open-project-sidecar-mcp/pulls/41#issuecomment-1029: > ### HUMAN REVIEW > > * **Bulk delete UX:** The `bulk_delete_work_packages` tool permanently deletes work packages with no confirmation step beyond the tool description warning. Consider whether the tool's advisory text is sufficient for your use case, or whether an additional safeguard (e.g., dry-run mode) would be warranted for a destructive batch operation. I like the idea of just copying the deleted data so a /tmp/ file so that it's recoverable and doesn't require any blockers or additional steps to use somewhat safely.
fix: address PR review findings for bulk operations
All checks were successful
CI / security (pull_request) Successful in 13s
CI / lint (pull_request) Successful in 18s
CI / test (pull_request) Successful in 1m56s
efda1b7f55
- Fix tool reference header count (62 → 67) [OP#2382]
- Use c.type instead of data.type in bulk_create_relations [OP#2383]
- Add /tmp backup of deleted WP data in bulk_delete for recoverability [OP#2384]
- Add test assertion for backup path in bulk delete output

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Author
Contributor

PR Review Followup

Responding to review posted on 2026-03-16 (review comment) and Mike's feedback.

Triage Summary

Severity Count Action
Important 1 Fixed in this branch
Minor 1 Fixed in this branch
Nitpick 1 Informational — no action needed
Human Review 1 Resolved per Mike's direction

Fixes Applied

The following findings have been resolved on this branch:

  1. [IMPORTANT] Tool reference header reads "62 tools" instead of 67 — fixed in efda1b7
    • OP#2382: Fix tool reference header count (62 → 67)
  2. [MINOR] data.type should be c.type in bulk_create_relations for consistency — fixed in efda1b7
    • OP#2383: Use cleaned response consistently in bulk_create_relations
  3. [HUMAN REVIEW → FIXED] Bulk delete UX: per Mike's suggestion, bulk_delete_work_packages now saves a JSON backup of deleted WP data to /tmp/bulk_delete_backup_<timestamp>.json before deletion — fixed in efda1b7
    • OP#2384: Add backup of deleted work packages to /tmp in bulk_delete

Not Actioned

  • [NITPICK] Bulk delete fetches before deleting — acknowledged as intentional tradeoff (readable confirmation vs API load). No change.

Test Results

  • Tests: 279 passed, 0 failed, 0 skipped
  • All fixes verified: Yes

This PR should now be ready for re-review.


This followup was generated by the gr-pr-followup skill.

## PR Review Followup Responding to review posted on 2026-03-16 ([review comment](https://git.bros.ninja/mike/open-project-sidecar-mcp/pulls/41#issuecomment-1029)) and [Mike's feedback](https://git.bros.ninja/mike/open-project-sidecar-mcp/pulls/41#issuecomment-1036). ### Triage Summary | Severity | Count | Action | | -------- | ----- | ------ | | Important | 1 | Fixed in this branch | | Minor | 1 | Fixed in this branch | | Nitpick | 1 | Informational — no action needed | | Human Review | 1 | Resolved per Mike's direction | ### Fixes Applied The following findings have been resolved on this branch: 1. **[IMPORTANT]** Tool reference header reads "62 tools" instead of 67 — fixed in efda1b7 - OP#2382: Fix tool reference header count (62 → 67) 2. **[MINOR]** `data.type` should be `c.type` in bulk_create_relations for consistency — fixed in efda1b7 - OP#2383: Use cleaned response consistently in bulk_create_relations 3. **[HUMAN REVIEW → FIXED]** Bulk delete UX: per Mike's suggestion, bulk_delete_work_packages now saves a JSON backup of deleted WP data to `/tmp/bulk_delete_backup_<timestamp>.json` before deletion — fixed in efda1b7 - OP#2384: Add backup of deleted work packages to /tmp in bulk_delete ### Not Actioned - **[NITPICK]** Bulk delete fetches before deleting — acknowledged as intentional tradeoff (readable confirmation vs API load). No change. ### Test Results - **Tests:** 279 passed, 0 failed, 0 skipped - **All fixes verified:** Yes This PR should now be ready for re-review. --- _This followup was generated by the gr-pr-followup skill._
Mike Bros approved these changes 2026-03-17 04:52:38 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mike/open-project-sidecar-mcp!41
No description provided.