@mutmutco/pi-plugin 4.2.4 → 4.2.5

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/pi-plugin",
3
- "version": "4.2.4",
3
+ "version": "4.2.5",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",
@@ -322,7 +322,12 @@ export function analyzeGhLadder(command) {
322
322
  replacement: hit.replacement,
323
323
  mapped,
324
324
  reason:
325
- `Command ladder (#2347): use \`${hit.replacement}\` instead of raw \`gh ${hit.object} ${hit.verb}\`. ` +
325
+ `Command ladder (#2347): use \`${hit.replacement}\` instead of raw \`gh ${hit.object} ${hit.verb}\` ` +
326
+ // #5858: the deny aborts the ENTIRE tool call, and the remedy line below invites retrying only
327
+ // the corrected verb — the one retry that cannot work when a heredoc wrote the body file in the
328
+ // same call. It fails with ENOENT, which reads as a path bug, not as a discarded write. Same
329
+ // sentence, same position, as the test-policy guard (#5726).
330
+ 'the ENTIRE command was aborted before execution; no segment ran, so any file write or other step batched into the same call was NOT applied — re-run those steps separately. ' +
326
331
  runLine +
327
332
  'mmi-cli is the required path for covered board/issue/PR writes in org repos. ' +
328
333
  'Genuine gaps stay allowed: gh api reads, gh project, gh issue/pr view|list|close|edit, gh pr checks, gh auth/repo/workflow/run. ' +
@@ -8,8 +8,10 @@
8
8
  //
9
9
  // One extractor, used by every edit-shaped hook, so a new host contract is taught in one place.
10
10
 
11
- /** Tool names that mean "this call writes files". */
12
- export const EDIT_TOOL_NAMES = new Set(['Edit', 'Write', 'apply_patch', 'ApplyPatch']);
11
+ /** Tool names that mean "this call writes files". `StrReplace` is Cursor's in-place edit tool: it
12
+ * carries its target in `tool_input.path` and was outside this set, so even once the adapter matched
13
+ * it the gate would have read a non-edit tool and allowed (#5852). */
14
+ export const EDIT_TOOL_NAMES = new Set(['Edit', 'Write', 'apply_patch', 'ApplyPatch', 'StrReplace']);
13
15
 
14
16
  export function isEditTool(toolName) {
15
17
  return typeof toolName === 'string' && EDIT_TOOL_NAMES.has(toolName);