lazycodex-ai 5.1.54 → 5.1.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/cli/index.js +29 -18
  2. package/dist/cli-node/index.js +29 -18
  3. package/package.json +2 -1
  4. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  5. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +2 -0
  6. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  7. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  8. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  9. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  10. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  11. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  12. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  15. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  16. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  18. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  20. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  21. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  22. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  23. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  24. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  25. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  28. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  29. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  30. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  31. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  32. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  33. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  34. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  35. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  50. package/packages/omo-codex/plugin/package-lock.json +12 -12
  51. package/packages/omo-codex/plugin/package.json +1 -1
  52. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  53. package/packages/omo-codex/plugin/skills/programming/SKILL.md +2 -0
  54. package/packages/omo-codex/plugin/skills/programming/references/testing/README.md +2 -2
  55. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-test-junk-rules.ts +140 -0
  56. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-test-junk.ts +148 -0
  57. package/packages/omo-codex/plugin/skills/programming/scripts/typescript/mutation-proof.ts +179 -0
  58. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +32 -20
  59. package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-commands.mjs +3 -1
  60. package/packages/omo-codex/scripts/install-dist/install-local.mjs +4 -2
  61. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  62. package/packages/shared-skills/skills/programming/SKILL.md +2 -0
  63. package/packages/shared-skills/skills/programming/references/testing/README.md +2 -2
  64. package/packages/shared-skills/skills/programming/scripts/typescript/check-test-junk-rules.ts +140 -0
  65. package/packages/shared-skills/skills/programming/scripts/typescript/check-test-junk.test.ts +125 -0
  66. package/packages/shared-skills/skills/programming/scripts/typescript/check-test-junk.ts +148 -0
  67. package/packages/shared-skills/skills/programming/scripts/typescript/mutation-proof.test.ts +43 -0
  68. package/packages/shared-skills/skills/programming/scripts/typescript/mutation-proof.ts +179 -0
  69. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +32 -20
  70. package/packages/shared-skills/skills/ulw-research/scripts/source-commands.mjs +3 -1
  71. package/packages/shared-skills/skills/ulw-research/scripts/source-integrity.test.ts +39 -2
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit --with-ultrawork",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.54) Checking Ulw-Loop Steering"
10
+ "statusMessage": "(OmO 5.1.55) Checking Ulw-Loop Steering"
11
11
  }
12
12
  ]
13
13
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use-spawn",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.1.54) Recording Spawn Admission"
23
+ "statusMessage": "(OmO 5.1.55) Recording Spawn Admission"
24
24
  }
25
25
  ]
26
26
  }
@@ -33,7 +33,7 @@
33
33
  "type": "command",
34
34
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
35
35
  "timeout": 5,
36
- "statusMessage": "(OmO 5.1.54) Enforcing Unlimited Ulw-Loop Budget"
36
+ "statusMessage": "(OmO 5.1.55) Enforcing Unlimited Ulw-Loop Budget"
37
37
  }
38
38
  ]
39
39
  },
@@ -44,7 +44,7 @@
44
44
  "type": "command",
45
45
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use-spawn",
46
46
  "timeout": 5,
47
- "statusMessage": "(OmO 5.1.54) Guarding Ulw-Loop Spawns"
47
+ "statusMessage": "(OmO 5.1.55) Guarding Ulw-Loop Spawns"
48
48
  }
49
49
  ]
50
50
  }
@@ -56,7 +56,7 @@
56
56
  "type": "command",
57
57
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook stop",
58
58
  "timeout": 10,
59
- "statusMessage": "(OmO 5.1.54) Checking Ulw-Loop Resume"
59
+ "statusMessage": "(OmO 5.1.55) Checking Ulw-Loop Resume"
60
60
  }
61
61
  ]
62
62
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-loop",
3
- "version": "5.1.54",
3
+ "version": "5.1.55",
4
4
  "description": "Codex plugin: durable repo-native multi-goal orchestration with embedded success criteria and observable evidence audit.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.54) Resetting Git Bash MCP Reminder",
10
+ "statusMessage": "(OmO 5.1.55) Resetting Git Bash MCP Reminder",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.54) Resetting LSP Diagnostics Cache",
10
+ "statusMessage": "(OmO 5.1.55) Resetting LSP Diagnostics Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-compact",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.54) Resetting Project Rule Cache",
10
+ "statusMessage": "(OmO 5.1.55) Resetting Project Rule Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/comment-checker/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 30,
10
- "statusMessage": "(OmO 5.1.54) Checking Comments",
10
+ "statusMessage": "(OmO 5.1.55) Checking Comments",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\comment-checker\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 60,
10
- "statusMessage": "(OmO 5.1.54) Checking LSP Diagnostics",
10
+ "statusMessage": "(OmO 5.1.55) Checking LSP Diagnostics",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/teammode/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.1.54) Checking Thread Title Hygiene",
11
+ "statusMessage": "(OmO 5.1.55) Checking Thread Title Hygiene",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\teammode\\dist\\cli.js\" hook post-tool-use"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.54) Matching Project Rules",
10
+ "statusMessage": "(OmO 5.1.55) Matching Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook post-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.1.54) Recording Spawn Admission",
11
+ "statusMessage": "(OmO 5.1.55) Recording Spawn Admission",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook post-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.54) Enforcing Unlimited Goal Budget",
10
+ "statusMessage": "(OmO 5.1.55) Enforcing Unlimited Goal Budget",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.1.54) Guarding Ulw-Loop Spawns",
11
+ "statusMessage": "(OmO 5.1.55) Guarding Ulw-Loop Spawns",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.54) Recommending Git Bash MCP",
10
+ "statusMessage": "(OmO 5.1.55) Recommending Git Bash MCP",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/scripts/auto-update.mjs\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.1.54) Checking Auto Update",
10
+ "statusMessage": "(OmO 5.1.55) Checking Auto Update",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\scripts\\auto-update.mjs\" hook session-start"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.1.54) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.1.55) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.54) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.1.55) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/telemetry/dist/cli.js\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.1.54) Recording Session Telemetry",
10
+ "statusMessage": "(OmO 5.1.55) Recording Session Telemetry",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\telemetry\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.54) Checking Ulw-Execute Continuation",
10
+ "statusMessage": "(OmO 5.1.55) Checking Ulw-Execute Continuation",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-execute-continuation\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.54) Checking Ulw-Loop Resume",
10
+ "statusMessage": "(OmO 5.1.55) Checking Ulw-Loop Resume",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.54) Verifying LazyCodex Executor Evidence",
10
+ "statusMessage": "(OmO 5.1.55) Verifying LazyCodex Executor Evidence",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lazycodex-executor-verify\\dist\\cli.js\" hook subagent-stop"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ultrawork/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.54) Checking Ultrawork Trigger",
10
+ "statusMessage": "(OmO 5.1.55) Checking Ultrawork Trigger",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ultrawork\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.54) Checking Ulw-Loop Steering",
10
+ "statusMessage": "(OmO 5.1.55) Checking Ulw-Loop Steering",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.54) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.1.55) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.1.54",
3
+ "version": "5.1.55",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sisyphuslabs/omo-codex-plugin",
9
- "version": "5.1.54",
9
+ "version": "5.1.55",
10
10
  "workspaces": [
11
11
  "components/comment-checker",
12
12
  "components/git-bash",
@@ -100,7 +100,7 @@
100
100
  },
101
101
  "components/comment-checker": {
102
102
  "name": "@code-yeongyu/codex-comment-checker",
103
- "version": "5.1.54",
103
+ "version": "5.1.55",
104
104
  "license": "MIT",
105
105
  "bin": {
106
106
  "omo-comment-checker": "dist/cli.js"
@@ -122,7 +122,7 @@
122
122
  },
123
123
  "components/git-bash": {
124
124
  "name": "@sisyphuslabs/codex-git-bash-hook",
125
- "version": "5.1.54",
125
+ "version": "5.1.55",
126
126
  "bin": {
127
127
  "omo-git-bash-hook": "dist/cli.js"
128
128
  },
@@ -136,7 +136,7 @@
136
136
  },
137
137
  "components/lazycodex-executor-verify": {
138
138
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
139
- "version": "5.1.54",
139
+ "version": "5.1.55",
140
140
  "license": "MIT",
141
141
  "bin": {
142
142
  "lazycodex-executor-verify": "dist/cli.js"
@@ -154,7 +154,7 @@
154
154
  },
155
155
  "components/lsp": {
156
156
  "name": "@code-yeongyu/codex-lsp",
157
- "version": "5.1.54",
157
+ "version": "5.1.55",
158
158
  "license": "MIT",
159
159
  "dependencies": {
160
160
  "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon",
@@ -176,7 +176,7 @@
176
176
  },
177
177
  "components/rules": {
178
178
  "name": "@code-yeongyu/codex-rules",
179
- "version": "5.1.54",
179
+ "version": "5.1.55",
180
180
  "license": "MIT",
181
181
  "dependencies": {
182
182
  "picomatch": "^4.0.7"
@@ -199,7 +199,7 @@
199
199
  },
200
200
  "components/teammode": {
201
201
  "name": "@sisyphuslabs/codex-teammode",
202
- "version": "5.1.54",
202
+ "version": "5.1.55",
203
203
  "devDependencies": {
204
204
  "@types/node": "^26.6.2",
205
205
  "@vitest/coverage-v8": "5.0.1",
@@ -213,7 +213,7 @@
213
213
  },
214
214
  "components/telemetry": {
215
215
  "name": "@code-yeongyu/codex-telemetry",
216
- "version": "5.1.54",
216
+ "version": "5.1.55",
217
217
  "license": "MIT",
218
218
  "bin": {
219
219
  "omo-telemetry": "dist/cli.js"
@@ -232,7 +232,7 @@
232
232
  },
233
233
  "components/ultrawork": {
234
234
  "name": "@code-yeongyu/codex-ultrawork",
235
- "version": "5.1.54",
235
+ "version": "5.1.55",
236
236
  "license": "MIT",
237
237
  "bin": {
238
238
  "omo-ultrawork": "dist/cli.js"
@@ -251,7 +251,7 @@
251
251
  },
252
252
  "components/ulw-execute-continuation": {
253
253
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
254
- "version": "5.1.54",
254
+ "version": "5.1.55",
255
255
  "license": "MIT",
256
256
  "bin": {
257
257
  "omo-ulw-execute-continuation": "dist/cli.js"
@@ -269,7 +269,7 @@
269
269
  },
270
270
  "components/ulw-loop": {
271
271
  "name": "@code-yeongyu/codex-ulw-loop",
272
- "version": "5.1.54",
272
+ "version": "5.1.55",
273
273
  "license": "MIT",
274
274
  "bin": {
275
275
  "omo-ulw-loop": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.1.54",
3
+ "version": "5.1.55",
4
4
  "description": "Aggregate Codex plugin root for OMO components.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -5,5 +5,5 @@
5
5
  "index.js": "8b14c1775f397e36967a0d094c67e2a31f8ae1e92add172925548723ca339046",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-10-31T15:59:33.751Z"
8
+ "stagedAtUtc": "2026-11-01T07:05:12.110Z"
9
9
  }
@@ -199,6 +199,8 @@ uv run scripts/python/check-no-excuse-rules.py <changed paths>
199
199
  bash scripts/rust/check-no-excuse-rules.sh <changed paths>
200
200
  # TypeScript
201
201
  bun run scripts/typescript/check-no-excuse-rules.ts <changed paths>
202
+ # Any language, test files you touched: the junk classes a regex can see (candidates for "test your test")
203
+ bun run scripts/typescript/check-test-junk.ts <changed test paths>
202
204
  ```
203
205
 
204
206
  ### Step 2 — interpret
@@ -56,12 +56,12 @@ When delegating test-writing, hand the child the behavior the test must distingu
56
56
 
57
57
  ## After writing: test your test
58
58
 
59
- A test earns its place by failing. Before the PR, for each new or reshaped test:
59
+ A test earns its place by failing. Before the PR, run `bun run scripts/typescript/check-test-junk.ts <test files>` for the classes a regex can see (source grep, prose pin, fixed sleep, `.only`/`.skip`, self-comparison, lower bound), then for each new or reshaped test:
60
60
 
61
61
  1. **Break the owner** (flip the condition, drop the branch, return a constant, skip the write) and run the test. Confirm the mutated bytes are actually in the file before reading the result; a no-op edit "passes" identically to the original.
62
62
  2. **Red for the intended reason?** Read the failure message: a loose pattern can match the base's generic error by coincidence (a false red), and a fake that simulates the failure by a different mechanism than the guard reads fails with the fix present.
63
63
  3. **Still green?** Then one of: the test is vacuous (fix the assertion); the mutant is equivalent (a `try/catch`, fallback, or normalization maps it back to the same outcome: retarget the mutation at the observable claim); a second rule already produces the same outcome (make the input exercise only the rule under test and assert the recorded reason); or the mutated code is dead (delete the code, not the test's teeth).
64
- 4. **Restore byte for byte.** Never commit a mutation.
64
+ 4. **Restore byte for byte.** Never commit a mutation. `bun run scripts/typescript/mutation-proof.ts --file <owner> --find <text> --replace <text> --test 'candidate=bun test <file>' --test 'keeper=bun test <file>'` does steps 1, 3 and 4 in one run and prints red/green per test.
65
65
 
66
66
  Assertion shapes that survive this step:
67
67
 
@@ -0,0 +1,140 @@
1
+ import { extname } from "node:path"
2
+
3
+ export type RuleId =
4
+ | "source-grep"
5
+ | "prose-pin"
6
+ | "fixed-sleep"
7
+ | "focused"
8
+ | "skipped"
9
+ | "self-compare"
10
+ | "lower-bound"
11
+
12
+ export type Language = "typescript" | "python" | "rust" | "go"
13
+
14
+ export type ReadKind = "prose" | "source"
15
+
16
+ export type LineRule = {
17
+ readonly rule: RuleId
18
+ readonly languages: readonly Language[]
19
+ readonly pattern: RegExp
20
+ readonly message: string
21
+ }
22
+
23
+ export const RULE_IDS: readonly RuleId[] = [
24
+ "source-grep",
25
+ "prose-pin",
26
+ "fixed-sleep",
27
+ "focused",
28
+ "skipped",
29
+ "self-compare",
30
+ "lower-bound",
31
+ ]
32
+
33
+ export function languageOf(file: string): Language | undefined {
34
+ switch (extname(file)) {
35
+ case ".ts":
36
+ case ".tsx":
37
+ case ".mts":
38
+ case ".cts":
39
+ case ".js":
40
+ case ".jsx":
41
+ case ".mjs":
42
+ case ".cjs":
43
+ return "typescript"
44
+ case ".py":
45
+ return "python"
46
+ case ".rs":
47
+ return "rust"
48
+ case ".go":
49
+ return "go"
50
+ default:
51
+ return undefined
52
+ }
53
+ }
54
+
55
+ const SLEEP_MESSAGE = "fixed sleep: wait on the event or state change, not on the clock"
56
+ const SKIP_MESSAGE = "skipped test: fix the test or delete it with its proof; never park it"
57
+ const LOWER_BOUND_MESSAGE = "lower bound on a cardinality: removing one item stays green; pin the exact set"
58
+
59
+ export const LINE_RULES: readonly LineRule[] = [
60
+ {
61
+ rule: "fixed-sleep",
62
+ languages: ["typescript"],
63
+ pattern: /\bsetTimeout\s*\(\s*(resolve|res|r|done|cb)\s*,\s*[1-9]|\bawait\s+(Bun\.)?sleep\s*\(\s*[1-9]|new Promise\s*\(\s*\(?\s*\w*\s*\)?\s*=>\s*setTimeout\s*\(\s*\w+\s*,\s*[1-9]/,
64
+ message: SLEEP_MESSAGE,
65
+ },
66
+ { rule: "fixed-sleep", languages: ["python"], pattern: /\btime\.sleep\s*\(|\bawait\s+(asyncio|anyio|trio)\.sleep\s*\(\s*[0-9]/, message: SLEEP_MESSAGE },
67
+ { rule: "fixed-sleep", languages: ["rust"], pattern: /\bthread::sleep\s*\(|\btokio::time::sleep\s*\(/, message: SLEEP_MESSAGE },
68
+ { rule: "fixed-sleep", languages: ["go"], pattern: /\btime\.Sleep\s*\(/, message: SLEEP_MESSAGE },
69
+ {
70
+ rule: "focused",
71
+ languages: ["typescript"],
72
+ pattern: /\b(test|it|describe)\.only\s*\(/,
73
+ message: "focused test: the rest of the suite is skipped silently",
74
+ },
75
+ { rule: "skipped", languages: ["typescript"], pattern: /\b(test|it|describe)\.skip\s*\(|\b(xit|xdescribe|xtest)\s*\(/, message: SKIP_MESSAGE },
76
+ { rule: "skipped", languages: ["python"], pattern: /@pytest\.mark\.skip\b|\bpytest\.skip\s*\(|\bunittest\.skip\b/, message: SKIP_MESSAGE },
77
+ { rule: "skipped", languages: ["rust"], pattern: /#\[ignore\b/, message: SKIP_MESSAGE },
78
+ { rule: "skipped", languages: ["go"], pattern: /\bt\.Skip(f|Now)?\s*\(/, message: SKIP_MESSAGE },
79
+ {
80
+ rule: "lower-bound",
81
+ languages: ["typescript"],
82
+ pattern: /\.(length|size|count)\s*\)\s*\.(toBeGreaterThan\s*\(\s*[1-9]|toBeGreaterThanOrEqual\s*\(\s*([2-9]|\d{2,}))/,
83
+ message: LOWER_BOUND_MESSAGE,
84
+ },
85
+ {
86
+ rule: "lower-bound",
87
+ languages: ["python"],
88
+ pattern: /\bassert\s+len\s*\(.+\)\s*(>\s*[1-9]|>=\s*([2-9]|\d{2,}))/,
89
+ message: LOWER_BOUND_MESSAGE,
90
+ },
91
+ ]
92
+
93
+ export const SELF_COMPARE: Readonly<Record<Language, RegExp>> = {
94
+ typescript: /\bexpect\s*\(\s*([^()]+?)\s*\)\s*\.(toBe|toEqual|toStrictEqual)\s*\(\s*\1\s*\)/,
95
+ python: /\bassert\s+([A-Za-z_][\w.]*)\s*==\s*\1\s*(#|$)/,
96
+ rust: /\bassert_eq!\s*\(\s*([^,()]+?)\s*,\s*\1\s*\)/,
97
+ go: /\b(Equal|Exactly)\s*\(\s*t\s*,\s*([^,()]+?)\s*,\s*\2\s*\)/,
98
+ }
99
+
100
+ const SOURCE_EXTENSIONS = /\.(ts|tsx|mts|cts|js|jsx|mjs|cjs|py|rs|go)$/
101
+ const PROSE_EXTENSIONS = /\.(md|mdc|txt|prompt)$/
102
+ const READ_ASSIGNMENT = /\b(?:const|let|var)\s+(\w+)\s*=\s*(?:await\s+)?(?:\w+\.)?(?:readFileSync|readFile|readTextSync|Bun\.file|open|read_text|read)\s*\(([^\n]*)$/
103
+ const PYTHON_READ_ASSIGNMENT = /^\s*(\w+)\s*=\s*(?:\w+\.)?(?:open|Path|read_text)\s*\(([^\n]*)$/
104
+ const STRING_LITERAL = /["'`]([^"'`]+)["'`]/g
105
+
106
+ function readKindOf(callArguments: string): ReadKind | undefined {
107
+ for (const literal of callArguments.matchAll(STRING_LITERAL)) {
108
+ const value = literal[1] ?? ""
109
+ if (PROSE_EXTENSIONS.test(value)) return "prose"
110
+ if (SOURCE_EXTENSIONS.test(value)) return "source"
111
+ }
112
+ return undefined
113
+ }
114
+
115
+ export function collectReadVariables(lines: readonly string[], language: Language): ReadonlyMap<string, ReadKind> {
116
+ const variables = new Map<string, ReadKind>()
117
+ const pattern = language === "python" ? PYTHON_READ_ASSIGNMENT : READ_ASSIGNMENT
118
+ for (const line of lines) {
119
+ const match = pattern.exec(line)
120
+ if (match === null) continue
121
+ const kind = readKindOf(match[2] ?? "")
122
+ if (kind !== undefined && match[1] !== undefined) variables.set(match[1], kind)
123
+ }
124
+ return variables
125
+ }
126
+
127
+ export function greppedVariable(line: string, language: Language): string | undefined {
128
+ if (language === "python") {
129
+ return /\bassert\s+(?:not\s+)?["'][^"']*["']\s+(?:not\s+)?in\s+(\w+)/.exec(line)?.[1]
130
+ }
131
+ return (
132
+ /\bexpect\s*\(\s*(\w+)\s*\)\s*(?:\.not)?\.(?:toContain|toMatch|toMatchSnapshot|toMatchInlineSnapshot|toInclude|toStartWith|toEndWith)\s*\(/.exec(line)?.[1] ??
133
+ /\bexpect\s*\(\s*(\w+)\.(?:includes|match|indexOf|search)\s*\(/.exec(line)?.[1]
134
+ )
135
+ }
136
+
137
+ export const READ_RULE_MESSAGES: Readonly<Record<ReadKind, { readonly rule: RuleId; readonly message: string }>> = {
138
+ prose: { rule: "prose-pin", message: "wording of a prompt/skill/doc is pinned; assert a machine-consumed value or write no test" },
139
+ source: { rule: "source-grep", message: "a source file is grepped as text; drive the module and assert behavior" },
140
+ }