I have just released an update to libess. What is libess? Its a C++ library that reads an ess file and stores all the information in a bunch of classes so you can do stuff with that information.
The download is here
http://www.cncmods.net/files/libess.zip
Its purpose is to provide a way to read, parse and save the oblivion ess, esm and esp files in exactly the same way the game code does. Its purpose is also to provide a better reference for the format of the ess, esm and esp files than the Wyre Bash source, CBash source, tes4edit source and wiki. (all 4 of which I have used as references for this work, along with exhaustive reverse engineering of the game and construction set code)
Changes since the last version:
Parsing of MODT chunks
Unfinished (and disabled for now) support for parsing REFR change records. Currently stuck trying to parse BaseProcess and its subclasses and TESPackage and its subclasses.
Parsing of RACE, GRAS, TREE and SKIL form data
Small fixes to the ess parser (mostly changes to correctly turn irefs into formids when loading and vice versa when saving)
It can now read, parse and write all parts of esp, esm and ess files except for the following: (all of which are read in and written as opaque blobs)
REFR, ACRE and ACHR change record data in the save file (still stuck trying to decode it)
Compiled script bytes (haven't yet written a parser but I have been informed that writing one would be more useful than I thought so I will probably do it)
NIFT chunks i n CREA records (no-one has decoded it yet)
XRGD chunks in REFR/ACHR/ACRE records (no-one has decoded it yet)
Facegen chunks in RACE and NPC_ records (no-one has decoded it yet)
PGAG chunks in PGRD forms (no-one has decoded it yet)
It does have full support for the special cases and obsolete/old chunks in oblivion.esm as well as all known OBME 1.x chunk data (since OBME 2.x was never released and now appears to be dead, I doubt any files actually exist that contain OBME 2.x chunks therefore supporting them is un-necessary)
Certain fields are still marked "unknown" or "unused" or "pad" or "reserved" (indicating that I haven't found any indication on what they are for at this point or that they are unused or extra data that the game doesn't actually read/use)
As to where next, I will probably continue to hack away at REFR/ACHR/ACRE change records and maybe write a compiled script parser. Doesn't seem to be much point trying to reverse engineer PGAG data, XRGD data, NIFT data or FaceGen data.