Skip to content

Releases: TomD4vs/prumo

v0.9.5

Choose a tag to compare

@TomD4vs TomD4vs released this 07 Sep 18:26

At a terminal, the last line stops repeating the badges. No check changed, and nothing changes for a pipe, CI or an agent. The JSON schema is 9.

The count, once. With colour, the closing line used to read 4 to review · 1 case mismatch · 2 broken links · 1 missing path · --fix corrects 1, three numbers that the coloured labels above it already carry. It now reads 4 to review · --fix corrects 1, and the next block of 0.9.4 follows it. The plain text a pipe receives was never counted by kind and does not change: 4 to review, --fix corrects 1.

The demo. Recorded again on this version, and it now opens on a clean prompt instead of the three lines Windows prints when a Command Prompt starts.

Suite 171, simulation 133, both unchanged.

v0.9.4

Choose a tag to compare

@TomD4vs TomD4vs released this 07 Sep 18:09

At a terminal, the report ends by saying what to do next. No check changed, and nothing changes for a pipe, CI or an agent. The JSON schema is 9.

The next block. When a person is looking, that is when stdout is a terminal, and there is something to review, two lines follow the count: next prumo --fix corrects 1 in place: letter case, and the renames git recorded, and edit the other 3, or mark a line <!-- prumo-ignore --> when the note is right. The first line appears only when --fix has something to rewrite, the second only when something is left for the reader, and neither appears after a --fix run or on a clean result. The plain text that a pipe, a file, CI and an agent receive still ends at 4 to review, --fix corrects 1, so nothing that parses the report has to change, and the reference page says so.

Suite 171, simulation 133, both unchanged. The demo was recorded again on this version.

v0.9.3

Choose a tag to compare

@TomD4vs TomD4vs released this 07 Sep 17:53

A link to a line is not a link to a heading, and the report says what each finding means. One false positive removed; no check looks for anything new. The JSON schema is 9.

A line anchor in a markdown link. [a](docs/guide.md#L12) sent the fragment to the heading check, which turned it into an anchor and found no heading called l12, so the link was reported as broken with the file and the line both there. In prose, docs/guide.md:42 and docs/guide.md#L10-L20 already had their suffix dropped; the link branch did not. Now a fragment in the line form of GitHub, L12, L12-L20, L12C3-L14C7, and the L12-20 GitLab writes, points at a line, and only the page is checked. The line number itself is not verified, on purpose: a line moves with every edit, and reporting #L400 in a page that shrank to three hundred lines would be noise on every repository that cites code by line. A heading anchor is still checked, a link to a page that is not there is still reported, and a wrongly cased page with a line anchor is still a case mismatch.

The report reads without the reference page. Every title now carries one line saying what the finding is, where only CASE MISMATCH had one: wrong letter case: works on Windows and macOS, fails on Linux and CI, points at a page or heading that is not there, the note cites it, but git tracks no such file or folder, and in the folder, but MEMORY.md never mentions it. The header counts files tracked by git instead of files in the git index, and the last line says what --fix will take care of: 4 to review, --fix corrects 1, with the count of case mismatches and of renames git recorded, which are the two things --fix rewrites. The sentence that followed MISSING PATH, about paths cited to say they are gone, spoke of a filter rather than of the finding and is gone; the reference page keeps the filter. --format json, github and sarif are unchanged, and so is the exit code. The README, the LEIAME and the demo show the new text.

Measurement. The anchor shape was verified on a small reproduction, not found on a corpus, and the corpus agrees: on 87 public repositories already on disk, 23,172 findings under 0.9.2 and the same 23,172 under this version, none removed, none added. The rule fixes what a reader of a README can hit and costs nothing where it was not hit. The wording change moves no finding.

Suite 170 to 171, simulation 133.

v0.9.2

Choose a tag to compare

@TomD4vs TomD4vs released this 07 Sep 16:59

A fence opens on a CRLF line, so a Windows checkout, and a file committed with CRLF, read the same as on Linux. No check looks for anything new; one stops being blind. The JSON schema is 9.

A fenced block was invisible in a CRLF file. The check split a file on \n, so in a file with CRLF endings every line kept its \r; the regex that opens a fence ended in (.*)$, and JavaScript's . does not match \r, so no fence ever opened. Every filter that rests on a fence was off: the block read as a command, the block in a programming language left unread, the block that quotes markdown, and prumo-ignore-next-line over a block. The closing regex tolerated the \r, which is how it stayed unnoticed through thirty-one releases: the suite's fixtures are all LF, and the repositories measured were cloned with LF. It surfaced on a Windows clone of a repository of skills, where a skill that teaches how to write skills quotes example SKILL.md files in markdown blocks: six broken links reported, all quotations. drift counted every heading inside a fence as a section, 167 instead of 126 there. budget was already normalising and did not change.

The fix. Lines are split on \r?\n in the check, in the Makefile and configuration readers and in drift, and the fence opener accepts a trailing \r, so classifyLines reads raw CRLF lines too. --fix keeps a file's line endings, as it did. Two tests hold it: the same note in LF and in CRLF gives the same findings on the same lines and keeps CRLF after a fix, and the same sections in drift.

Measurement. Differential, LF against CRLF with the same content. 40,000 generated notes through the classifier line by line, 1.16 million lines, no difference. Two repositories of 2,000 notes each, every note named so no gate holds anything back: 5,185 and 5,160 findings on both sides, none on one side only, 3,432 and 3,435 sections identical. 87 public repositories, 49,649 context files and 111,118 markdown files rewritten to CRLF: 23,416 findings identical and 845,712 sections identical. Of those markdown files 2,299 were CRLF in git already, 800 in one repository, so the fault was live on Linux too. The repository that showed it comes back clean on a Windows clone.

Suite 168 to 170.

v0.9.1

Choose a tag to compare

@TomD4vs TomD4vs released this 05 Sep 22:00

The entry of the MCP server in the official MCP Registry, and the README the package carries. No check changed, nothing in the code changed.

The MCP Registry. package.json gains mcpName, io.github.TomD4vs/prumo, which is how the registry verifies that the npm package and the registry entry belong together, and the repository gains server.json, the entry itself: the package, its version, and how a client starts it, npx -y -p @tomd4vs/prumo prumo-mcp over stdio. The entry is published with mcp-publisher after this version is on npm.

The README on npm. The package page on npm shows the README of the version it holds, so it now opens with the recorded demo, the name and the two reports, as the repository does since 0.9.0.

Suite 168, simulation 133, unchanged.

v0.9.0

Choose a tag to compare

@TomD4vs TomD4vs released this 05 Sep 18:56

Two reports that measure instead of judging, prumo drift and prumo budget, the last two proposals of the audit. No check changed. The JSON schema is 9.

prumo drift: which sections describe code that changed since they were written. For every section of a context file that cites a file or a folder the repository has, the report reads from git blame when the section was last written, counts how many of the files it cites changed after that and how many distinct commits touched them, and lists the sections most moved first. Editing one line moves that section and no other; a line not committed yet makes its section as fresh as now. It is a reading order for a review, never a finding: a section whose files changed forty times may still be right, so the report says where to look and stops there. On a corpus of sixty public repositories with full history, forty-seven of them with context files, it ran in half a second to six seconds each.

prumo budget: what each context file costs, and what is written twice. Bytes, lines, words and tokens estimated at four characters each, largest first; how much each file grew since an earlier commit, the one thirty days ago, the first commit of a younger repository or the REF given with --since; and every paragraph of twelve words or more that appears in more than one place, with each place it is written. On the same corpus it found a skill shipped twice under two hosts' folders with four hundred words repeated, a CLAUDE.md and an AGENTS.md sharing their paragraphs, and one repository whose context grew by seventy-two thousand tokens in seven months.

Both exit 0 whatever they find, take --format json and --json FILE, refuse the options of the check with a message, and are tools of the MCP server as well, prumo_drift and prumo_budget, read only. The package now exports drift() and budget() beside analyze(), and analyze({ collect: true }) returns the citations that reached a file git knows, which is what drift is built from. Every result carries command, check, drift or budget, which is the schema change.

Why they are not checks. A check answers right or wrong for one citation, so a corpus can say how often it is right, and every rule shipped so far was measured that way. A report has no right answer to measure against, so neither of these has a precision number, and neither will; what they have to earn is that the top of the ranking is where a maintainer would have looked first, which shows only with people using them. The design page says the same.

Suite 158 to 168, simulation 126 to 133.

v0.8.3

Choose a tag to compare

@TomD4vs TomD4vs released this 05 Sep 17:33

The repository-level reading of ANOTHER PROJECT, measured on a fourteenth corpus, and three small rules built from that corpus. No check changed. The JSON schema is 8.

A repository that documents another project gets one line. The thirteenth corpus left fifty false findings in three repositories whose context files, file by file, cited too few paths for the file gate: a contributor plugin linking the files of the database shell it runs inside, and skills documenting a framework the repository depends on. Now the cited paths of every auto-detected context file are pooled: when at least twelve of them start in a folder the index does not have, and those are six in ten of all cited, the repository documents another project as a whole, the findings of the auto-detected files are replaced by one ANOTHER PROJECT line for the repository, and a file named on the command line is still checked in full. The two numbers were set on the pooled counts of five earlier corpora, where no repository with a real finding crosses both. Two refinements came from measuring it: a link's head is now the folder the link names as written from beside the note, except that a bare name keeps the note's own folder, so a skill missing one of its own files is a finding and never another project; and a folder-qualified wikilink counts like a path. stats gains cited and absent, the pooled counts, and elsewhere may carry "." as the file.

Three shapes are not reported any more. What follows a # on a command line is a comment, so the words after a make target are not read as more targets. The repository's own name, read from its origin, is a prefix a note may write before a root file, owner/repo/AGENTS.md, as one repository did in twenty-nine notes. And a sentence that makes a folder a condition, "if the repo has docs/product/, update it there", is conditional like "if it exists". All three are fitted to the fourteenth corpus, where they removed thirty-four findings, all false; on the twelfth and thirteenth, which shaped none of them, they removed nothing outside the catalogues, and seven citations inside, all conditional sentences that read as right.

Measurement. Sixty repositories from the same searches, none on an earlier list; eight hold no context file prumo detects, seven are catalogues, thirty-four came back clean. Outside the catalogues, 79 findings under 0.8.2, 21 real, 27%. The repository gate removed nothing there, and there was nothing for it to remove: no repository crosses both numbers, and the false findings sit in families neither gate covers, folders a pipeline writes at run time, a skill documenting another application copied into each exercise of a course, and instructions inside skills that build things. Inside the catalogues it cleared ninety-one citations in three, and on the twelfth corpus it took a marketplace of skills whole. The file: rule of 0.8.2 met no line outside the catalogues, and neither did the other two rules of 0.8.2. The fifth check read six repositories with a configuration JSON and reported nothing. After the three rules, 45 findings with the same 21 real, 47%. The design page has the table.

Suite 156 to 158, simulation unchanged at 126.

v0.8.2

Choose a tag to compare

@TomD4vs TomD4vs released this 05 Sep 16:03

Two rules for false families the twelfth corpus showed, a thirteenth corpus that measures them and the three rules of 0.8.1, and one link scheme. No check changed.

Two shapes are not reported any more. A file each machine writes for itself, CLAUDE.local.md, settings.local.json or any name with .local before its extension: a note that tells the agent to read it names a file that is absent on purpose. And a skill cited by the path a host installs it under, .claude/skills/deploy/scripts/x.sh, when the same file exists beside a SKILL.md somewhere in the repository: the skill lives in a plugin folder, a docs folder or another host's folder, and its script is there. A case mismatch is still reported wherever it sits. On the twelfth corpus the two removed twenty findings outside the catalogues, eighteen false and two of the mild kind where the file the note means exists under another name. A third rule, a heading that says the section shows examples, was tried and dropped: the sample skill that motivated it carries its own title, which ends the section, and on a catalogue the rule silenced citations that read as real.

A file: link is an address. The prose rule already said so for file:// paths; a markdown link with that scheme now gets the same reading.

Measurement. Sixty repositories from the same searches, none on an earlier list; three clones failed, twelve hold no context file prumo detects, four are catalogues, twenty-eight came back clean. Outside the catalogues, 83 findings under 0.8.0, 18 real, 22%; the five rules of 0.8.1 and 0.8.2 removed one, false, and four of them met no line at all, which says they are narrow rather than wrong. The fifth check reported one thing, an .mcp.json naming a server script that is not in the repository, real; with the twelfth corpus that is five reports on material that shaped none of its rules, all real. Fifty of the sixty-four false ones sit in three repositories that document another project file by file, each file citing too few paths for the file gate; a repository-level gate is the next rule, left unbuilt so that it can be measured on material it did not come from. The design page has the table.

Suite 154 to 156, simulation unchanged at 126.

v0.8.1

Choose a tag to compare

@TomD4vs TomD4vs released this 05 Sep 15:02

A twelfth corpus, the first honest number for the fifth check, and four small things found on the way. No check changed.

One citation, one finding. A link whose text is the same path in backticks, [docs/x.md](docs/x.md), was reported twice when the file was gone, once as a path and once as a link. It is one citation, reported once, as the link, which is the one that carries the history.

Three rules built from the twelfth corpus, and disclosed as fitted to it. pnpm version patch is pnpm itself and names no script. A sentence that says deleted, removed or retired in Chinese is a negation, like its English and Portuguese counterparts. An emphasis mark glued after a path, scripts/sync.mjs._, is not part of the path.

Measurement. Sixty repositories from the same searches, none on an earlier list; one clone failed, eight hold no context file prumo detects, six are catalogues, twenty-eight came back clean. Outside the catalogues, 97 findings under 0.8.0, 43 real; the three rules removed 9, eight false and one real that sat beside a Chinese negation; 88 findings under 0.8.1, 42 real, 48%. The fifth check reported four things on material that shaped none of its rules, all real: two hooks naming a script that lives in another folder, and two skills copied without their front matter. With the history restored, git spoke for twelve missing paths and links, three moves and nine deletions, all right, and corrected three findings the hand pass had taken for examples. The design page has the table.

Suite 152 to 154, simulation unchanged at 126.

v0.8.0

Choose a tag to compare

@TomD4vs TomD4vs released this 05 Sep 13:10

--fix now applies the renames git recorded. It is the first time the fix writes anything beyond letter case, and the reason it may is the same as for case: the new name is read from git rather than guessed. The checks did not change.

What is rewritten. A missing path, or a markdown link, whose file git recorded as renamed becomes the name that exists now, written the way the citation was: from the root, from beside the note, with / or mdc: in front, or with its spaces as %20. The FIXED section names the commit on each rename, config/database.php -> config/db.php renamed in a3f21c9. Nothing else is touched: a link suggested from a name, a missing path with no history and a deleted file are left alone, since none of those has a value git can vouch for. The MCP server's prumo_fix does the same.

Formats. history.from on a missing path or a link, the path git was asked about; why and commit on each change --fix reports; schemaVersion 7. applyFixes and renameFixes are exported for the API, and applyCaseFixes stays as the older name of the same function.

Measurement. The renames themselves were measured in 0.7.2, fifteen of fifteen right. Applying them was rehearsed on the one public repository of that pass that was reorganising its plugins: one pass rewrote nineteen citations in three files, skipped none, and the run that followed reported no rename; the diff was read line by line before the clone was restored.

Suite 149 to 152, simulation 123 to 126.