{"_id":"@blprnt/unfuk","_rev":"4-52d6bacef3dc367bf429fd73f2074dc7","name":"@blprnt/unfuk","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.1":{"name":"@blprnt/unfuk","version":"0.1.1","license":"MIT","_id":"@blprnt/unfuk@0.1.1","maintainers":[{"name":"blprntmax","email":"max@blprnt.ai"},{"name":"notvitaliy","email":"visikov@gmail.com"}],"bin":{"unfuk":"bin/unfuk.js"},"dist":{"shasum":"accf74eda1b782aec87a73c214f7f5226ec50dbf","tarball":"https://registry.npmjs.org/@blprnt/unfuk/-/unfuk-0.1.1.tgz","fileCount":4,"integrity":"sha512-GoRiqKML0qglpyV1GoCs5KB+tSrNlY3fTwUlvC4iv6MtLJ8RINi6hf/XF0NtyO4kmq9zxKHRV0JZ9SnUjCJ8CQ==","signatures":[{"sig":"MEUCIFJCDZFUBK97cr/gvGAopg+sDjbO8zSFYRT1f1dzrlmcAiEAvZ0R+Wk8zTXRVkdDBDd5/GOcBKXHTTiabj/SreFB8GI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7502},"gitHead":"def959b49466461e83a050cc57325fd2a1203e90","scripts":{"prepare":"node scripts/setup-git-hooks.js","publish:all":"npm run check:version-sync && npm publish ./npm/darwin-arm64 --access public && npm publish ./npm/linux-x64 --access public && npm publish ./npm/win32-x64 --access public && npm publish . --access public","check:version-sync":"node scripts/check-version-sync.js"},"_npmUser":{"name":"notvitaliy","email":"visikov@gmail.com"},"_npmVersion":"10.9.4","description":"Run the unfuk CLI via npm.","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@blprnt/unfuk-linux-x64":"0.1.1","@blprnt/unfuk-win32-x64":"0.1.1","@blprnt/unfuk-darwin-arm64":"0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/unfuk_0.1.1_1773356787168_0.3140590126402125","host":"s3://npm-registry-packages-npm-production"}},"0.1.2-alpha-1":{"name":"@blprnt/unfuk","version":"0.1.2-alpha-1","license":"MIT","_id":"@blprnt/unfuk@0.1.2-alpha-1","maintainers":[{"name":"blprntmax","email":"max@blprnt.ai"},{"name":"notvitaliy","email":"visikov@gmail.com"}],"bin":{"unfuk":"bin/unfuk.js"},"dist":{"shasum":"c3e4528b49d360fc5cb89666b9e1798b638228f5","tarball":"https://registry.npmjs.org/@blprnt/unfuk/-/unfuk-0.1.2-alpha-1.tgz","fileCount":4,"integrity":"sha512-A4P2C9hMNvQeix7RktnwX6ldHukmTkf/psmpWNk6Gv948L5vTupFSChC1pM4e7pyWSqWX1CMP9hu6ityaicN2Q==","signatures":[{"sig":"MEUCIQCzS8YOeQ/OSFCwhqWAYNhiXURoUOl/cDuh2pgfdxN3ZQIgMAWAl0tVHaSmFVeIrj8WV3wpdmaaYVU8PJM7HgvdWDY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7308},"gitHead":"def959b49466461e83a050cc57325fd2a1203e90","scripts":{"prepare":"node scripts/setup-git-hooks.js","check:version-sync":"node scripts/check-version-sync.js"},"_npmUser":{"name":"notvitaliy","email":"visikov@gmail.com"},"_npmVersion":"10.9.4","description":"Run the unfuk CLI via npm.","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@blprnt/unfuk-linux-x64":"0.1.2-alpha-1","@blprnt/unfuk-win32-x64":"0.1.2-alpha-1","@blprnt/unfuk-darwin-arm64":"0.1.2-alpha-1"},"_npmOperationalInternal":{"tmp":"tmp/unfuk_0.1.2-alpha-1_1773357938858_0.9796087415770554","host":"s3://npm-registry-packages-npm-production"}},"0.1.2-alpha-2":{"name":"@blprnt/unfuk","version":"0.1.2-alpha-2","license":"MIT","_id":"@blprnt/unfuk@0.1.2-alpha-2","maintainers":[{"name":"blprntmax","email":"max@blprnt.ai"},{"name":"notvitaliy","email":"visikov@gmail.com"}],"bin":{"unfuk":"bin/unfuk.js"},"dist":{"shasum":"c2f3033483df95ef07b299de1fbdbc4bd3818cf4","tarball":"https://registry.npmjs.org/@blprnt/unfuk/-/unfuk-0.1.2-alpha-2.tgz","fileCount":4,"integrity":"sha512-i/b29ZDb0//r9ey0+lxDe3VT4e9hGr40YFwZUf6WNtCNvGJ3M2u2/QN0ZHHMZflA3UQXJ50BcCu1GpfHY5Prww==","signatures":[{"sig":"MEQCIFFVeyRpemrwHivtsOFck8uqGFr2GgSQMu9NZpuk5nVIAiBZTl51RhAs/kdR6aisMRk22v3WBs3ToECAvUypwnFRsQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7470},"gitHead":"def959b49466461e83a050cc57325fd2a1203e90","scripts":{"prepare":"node scripts/setup-git-hooks.js","check:version-sync":"node scripts/check-version-sync.js"},"_npmUser":{"name":"notvitaliy","email":"visikov@gmail.com"},"_npmVersion":"10.9.4","description":"Run the unfuk CLI via npm.","directories":{},"_nodeVersion":"22.22.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"optionalDependencies":{"@blprnt/unfuk-linux-x64":"0.1.2-alpha-2","@blprnt/unfuk-win32-x64":"0.1.2-alpha-2","@blprnt/unfuk-darwin-arm64":"0.1.2-alpha-2"},"_npmOperationalInternal":{"tmp":"tmp/unfuk_0.1.2-alpha-2_1773358448696_0.9393255507212273","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@blprnt/unfuk","version":"0.1.2","description":"Run the unfuk CLI via npm.","license":"MIT","scripts":{"check:version-sync":"node scripts/check-version-sync.js","prepare":"node scripts/setup-git-hooks.js"},"bin":{"unfuk":"bin/unfuk.js"},"publishConfig":{"access":"public"},"optionalDependencies":{"@blprnt/unfuk-darwin-arm64":"0.1.2","@blprnt/unfuk-linux-x64":"0.1.2","@blprnt/unfuk-win32-x64":"0.1.2"},"dependencies":{"@blprnt/unfuk":"^0.1.2"},"_id":"@blprnt/unfuk@0.1.2","gitHead":"78bc8a624613f10956bdcffc555db11b26fe0b31","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-Qbo7iYve+SZV2tvlR3RLV+bchX6Y8HlLOs+dlNjDBa+jAtJxk1Hx7OnFih3lz5cgWxSccXp6XAOCldT9DPAowA==","shasum":"c73fa3b08d2ecb7905e1476e8c467644fc47c6bc","tarball":"https://registry.npmjs.org/@blprnt/unfuk/-/unfuk-0.1.2.tgz","fileCount":4,"unpackedSize":7493,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBffnBVpuDlmER+RYBNQS4RdjQeHnUOSH69x+7swOHXkAiBAtSmxSWbFqws2MM9BIY/+hb6EnJIcRgvITyab/NC2Pw=="}]},"_npmUser":{"name":"notvitaliy","email":"visikov@gmail.com"},"directories":{},"maintainers":[{"name":"blprntmax","email":"max@blprnt.ai"},{"name":"notvitaliy","email":"visikov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/unfuk_0.1.2_1773360328168_0.3647409395008736"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-12T23:06:27.028Z","modified":"2026-03-13T00:05:28.468Z","0.1.1":"2026-03-12T23:06:27.337Z","0.1.2-alpha-1":"2026-03-12T23:25:39.012Z","0.1.2-alpha-2":"2026-03-12T23:34:08.832Z","0.1.2":"2026-03-13T00:05:28.309Z"},"license":"MIT","description":"Run the unfuk CLI via npm.","maintainers":[{"name":"blprntmax","email":"max@blprnt.ai"},{"name":"notvitaliy","email":"visikov@gmail.com"}],"readme":"# Uncle Funkle (UN-FUK for short)\n\n![Uncle Funkle](assets//uncle-funkle.png)\n\n`uncle-funkle` is a Rust library and CLI for scanning a codebase for maintainability problems, storing them as persistent issues, scoring the project, and generating a prioritized cleanup plan.\n\nIt focuses on practical heuristics like leftover TODOs, debug artifacts, oversized files, long functions, deep nesting, branch-heavy code, long lines, and duplicate blocks.\n\n## Built For Agents\n\n`unfuk` is the CLI entrypoint, and `npx @blprnt/unfuk` is the npm entrypoint.\n\n`uncle-funkle` is built to be useful in agent-driven workflows.\n\n- the CLI gives an agent a simple way to scan a repo or inspect saved state\n- the persisted state file lets an agent track issues across repeated runs\n- stable issue IDs make it possible to resolve, defer, dismiss, or reopen work reliably\n- the plan output gives an agent a ranked next task instead of a pile of noise\n- JSON output makes it easy to plug into automated tooling and other systems\n\n## What It Does\n\n- scans source files across several common languages\n- records findings as stable issues with lifecycle state\n- persists project state to disk\n- recomputes quality scores after each scan or review import\n- generates a ranked plan for cleanup work\n- supports subjective assessment imports alongside mechanical findings\n\n## How It Works\n\nThe library follows a simple loop:\n\n1. scan the project\n2. merge findings into persisted state\n3. recompute scores and stats\n4. build a prioritized cleanup plan\n5. save the updated state\n\nState is stored under `.uncle_funkle/state.json` by default.\n\n## Current Shape\n\nThis repo is both a library crate and a small CLI application.\n\nThe public surface is built around:\n\n- creating an engine with config\n- loading and saving state\n- scanning a project\n- merging scan output\n- importing subjective assessments\n- generating the next cleanup plan item\n- resolving, deferring, dismissing, or reopening issues\n\nThe CLI supports a small workflow surface:\n\n- `scan [path]` — scans a target directory, updates persisted state, and prints a summary plus the current next item\n- `status [path] [issue_id]` — loads persisted state and prints the current next item, or the requested issue when an ID is provided\n- `list [path] [--all]` — lists open issues by default or every issue with `--all`\n- `next [path]` — resolves the current next issue and returns the new next item\n- `resolve <issue_id> [path]`\n- `defer <issue_id> [path]`\n- `dismiss <issue_id> [path]`\n- `reopen <issue_id> [path]`\n\n## Usage\n\nRun without installing:\n\n- `npx @blprnt/unfuk scan`\n\nSupported npm-distributed prebuilt targets: darwin-arm64, linux-x64, and win32-x64.\n\nOr download a prebuilt binary from the GitHub Releases page.\n\nIf you prefer building locally:\n\n- `cargo build --release`\n\nRun a scan:\n\n- `unfuk scan`\n- `unfuk scan path/to/project`\n- `npx @blprnt/unfuk scan`\n\nShow saved status without rescanning:\n\n- `unfuk status`\n- `unfuk status path/to/project`\n- `unfuk status path/to/project issue_123`\n\nList issues:\n\n- `unfuk list`\n- `unfuk list path/to/project --all`\n\nAdvance or update issue state:\n\n- `unfuk next`\n- `unfuk resolve issue_123`\n- `unfuk defer issue_123 path/to/project`\n- `unfuk dismiss issue_123`\n- `unfuk reopen issue_123`\n\nEach scan updates `.uncle_funkle/state.json` in the target project.\n\n## Defaults\n\nBy default the scanner:\n\n- includes common source file extensions like Rust, Python, JavaScript, TypeScript, Go, C#, Dart, Java, Kotlin, C, C++, Ruby, and Swift\n- skips generated or irrelevant directories like `.git`, `target`, `node_modules`, `build`, `dist`, `coverage`, virtualenvs, vendors, and its own state directory\n- skips oversized or binary files\n\nDefault thresholds include:\n\n- long line: 120 characters\n- large file: 400 lines\n- long function: 80 lines\n- deep nesting: 4 levels\n- branch density: 10 branch points\n- duplicate block window: 6 lines\n\n## Scores\n\nThe library maintains four scores:\n\n- `objective` — based on active mechanical findings\n- `strict` — harsher score with extra penalty for severe and reopened issues\n- `overall` — blends objective and subjective review when available\n- `verified` — the stricter final view when subjective review exists\n\n## Status\n\nWhat it is:\n\n- a compact library for heuristic code quality triage\n- persistent issue tracking across scans\n- a scoring and cleanup-planning engine\n\nWhat it is not:\n\n- not an AST-heavy static analyzer\n- not an auto-fixer\n- not a security scanner\n\n## License\n\nMIT","readmeFilename":"README.md"}