528528</ li >
529529
530530 < li class ="md-nav__item ">
531- < a href ="#who-finecode-is-for " class ="md-nav__link ">
531+ < a href ="#why-developers-use-finecode " class ="md-nav__link ">
532532 < span class ="md-ellipsis ">
533533
534- Who FineCode is for
534+ Why developers use FineCode
535535
536536 </ span >
537537 </ a >
538538
539- < nav class ="md-nav " aria-label ="Who FineCode is for ">
539+ < nav class ="md-nav " aria-label ="Why developers use FineCode ">
540540 < ul class ="md-nav__list ">
541541
542542 < li class ="md-nav__item ">
543- < a href ="#for-solo-developers " class ="md-nav__link ">
543+ < a href ="#core-benefits- for-every-project " class ="md-nav__link ">
544544 < span class ="md-ellipsis ">
545545
546- For solo developers
546+ Core benefits for every project
547547
548548 </ span >
549549 </ a >
550550
551- < nav class ="md-nav " aria-label ="For solo developers ">
551+ < nav class ="md-nav " aria-label ="Core benefits for every project ">
552552 < ul class ="md-nav__list ">
553553
554554 < li class ="md-nav__item ">
11301130</ li >
11311131
11321132 < li class ="md-nav__item ">
1133- < a href ="#who-finecode-is-for " class ="md-nav__link ">
1133+ < a href ="#why-developers-use-finecode " class ="md-nav__link ">
11341134 < span class ="md-ellipsis ">
11351135
1136- Who FineCode is for
1136+ Why developers use FineCode
11371137
11381138 </ span >
11391139 </ a >
11401140
1141- < nav class ="md-nav " aria-label ="Who FineCode is for ">
1141+ < nav class ="md-nav " aria-label ="Why developers use FineCode ">
11421142 < ul class ="md-nav__list ">
11431143
11441144 < li class ="md-nav__item ">
1145- < a href ="#for-solo-developers " class ="md-nav__link ">
1145+ < a href ="#core-benefits- for-every-project " class ="md-nav__link ">
11461146 < span class ="md-ellipsis ">
11471147
1148- For solo developers
1148+ Core benefits for every project
11491149
11501150 </ span >
11511151 </ a >
11521152
1153- < nav class ="md-nav " aria-label ="For solo developers ">
1153+ < nav class ="md-nav " aria-label ="Core benefits for every project ">
11541154 < ul class ="md-nav__list ">
11551155
11561156 < li class ="md-nav__item ">
@@ -1294,23 +1294,37 @@ <h2 id="start-in-minutes">Start in minutes<a class="headerlink" href="#start-in-
12941294< a id ="__codelineno-1-8 " name ="__codelineno-1-8 " href ="#__codelineno-1-8 "> </ a > < span class ="c1 "> # e.g. lint the whole workspace:</ span >
12951295< a id ="__codelineno-1-9 " name ="__codelineno-1-9 " href ="#__codelineno-1-9 "> </ a > python< span class ="w "> </ span > -m< span class ="w "> </ span > finecode< span class ="w "> </ span > run< span class ="w "> </ span > lint
12961296</ code > </ pre > </ div >
1297+ < p > NOTE: < code > pip install --group</ code > requires pip 25.1+.</ p >
12971298< p > This gives you a working Python baseline with Ruff, Flake8, and isort through one shared config entry point.</ p >
12981299< h2 id ="from-one-project-to-reusable-standard "> From one project to reusable standard< a class ="headerlink " href ="#from-one-project-to-reusable-standard " title ="Permanent link "> ¶</ a > </ h2 >
12991300< p > Once this works in one project, turn it into a shared preset and use it across repositories:</ p >
1300- < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-2-1 " name ="__codelineno-2-1 " href ="#__codelineno-2-1 "> </ a > < span class ="k "> [tool.finecode]</ span >
1301- < a id ="__codelineno-2-2 " name ="__codelineno-2-2 " href ="#__codelineno-2-2 "> </ a > < span class ="n "> presets</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> [{</ span > < span class ="w "> </ span > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_team_standards"</ span > < span class ="w "> </ span > < span class ="p "> }]</ span >
1301+ < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-2-1 " name ="__codelineno-2-1 " href ="#__codelineno-2-1 "> </ a > < span class ="k "> [dependency-groups]</ span >
1302+ < a id ="__codelineno-2-2 " name ="__codelineno-2-2 " href ="#__codelineno-2-2 "> </ a > < span class ="n "> dev_workspace</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> [</ span > < span class ="s2 "> "finecode==0.3.*"</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="s2 "> "my_team_standards==0.1.*"</ span > < span class ="p "> ]</ span >
1303+ < a id ="__codelineno-2-3 " name ="__codelineno-2-3 " href ="#__codelineno-2-3 "> </ a >
1304+ < a id ="__codelineno-2-4 " name ="__codelineno-2-4 " href ="#__codelineno-2-4 "> </ a > < span class ="k "> [tool.finecode]</ span >
1305+ < a id ="__codelineno-2-5 " name ="__codelineno-2-5 " href ="#__codelineno-2-5 "> </ a > < span class ="n "> presets</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> [{</ span > < span class ="w "> </ span > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_team_standards"</ span > < span class ="w "> </ span > < span class ="p "> }]</ span >
1306+ </ code > </ pre > </ div >
1307+ < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-3-1 " name ="__codelineno-3-1 " href ="#__codelineno-3-1 "> </ a > python< span class ="w "> </ span > -m< span class ="w "> </ span > pip< span class ="w "> </ span > install< span class ="w "> </ span > --group< span class ="o "> =</ span > < span class ="s2 "> "dev_workspace"</ span >
1308+ < a id ="__codelineno-3-2 " name ="__codelineno-3-2 " href ="#__codelineno-3-2 "> </ a > python< span class ="w "> </ span > -m< span class ="w "> </ span > finecode< span class ="w "> </ span > prepare-envs
13021309</ code > </ pre > </ div >
13031310< p > Projects can then adopt updates through normal dependency updates.
13041311See < a href ="guides/creating-preset/ "> Creating a Preset</ a > for the packaging flow.</ p >
1312+ < p > You can also combine presets in one project (for example, a language preset and a team preset):</ p >
1313+ < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-4-1 " name ="__codelineno-4-1 " href ="#__codelineno-4-1 "> </ a > < span class ="k "> [tool.finecode]</ span >
1314+ < a id ="__codelineno-4-2 " name ="__codelineno-4-2 " href ="#__codelineno-4-2 "> </ a > < span class ="n "> presets</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> [</ span >
1315+ < a id ="__codelineno-4-3 " name ="__codelineno-4-3 " href ="#__codelineno-4-3 "> </ a > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "fine_python_recommended"</ span > < span class ="w "> </ span > < span class ="p "> },</ span >
1316+ < a id ="__codelineno-4-4 " name ="__codelineno-4-4 " href ="#__codelineno-4-4 "> </ a > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_team_standards"</ span > < span class ="w "> </ span > < span class ="p "> },</ span >
1317+ < a id ="__codelineno-4-5 " name ="__codelineno-4-5 " href ="#__codelineno-4-5 "> </ a > < span class ="p "> ]</ span >
1318+ </ code > </ pre > </ div >
13051319< p > Typical rollout:</ p >
13061320< ol >
13071321< li > Start with a preset in one repository.</ li >
13081322< li > Tune handlers and action config to fit your workflow.</ li >
13091323< li > Publish that setup as a preset package for your team.</ li >
13101324< li > Reuse it across repositories.</ li >
13111325</ ol >
1312- < h2 id ="who-finecode-is-for " > Who FineCode is for < a class ="headerlink " href ="#who-finecode-is-for " title ="Permanent link "> ¶</ a > </ h2 >
1313- < h3 id ="for-solo-developers " > For solo developers < a class ="headerlink " href ="#for-solo-developers " title ="Permanent link "> ¶</ a > </ h3 >
1326+ < h2 id ="why-developers-use-finecode " > Why developers use FineCode < a class ="headerlink " href ="#why-developers-use-finecode " title ="Permanent link "> ¶</ a > </ h2 >
1327+ < h3 id ="core-benefits- for-every-project " > Core benefits for every project < a class ="headerlink " href ="#core-benefits- for-every-project " title ="Permanent link "> ¶</ a > </ h3 >
13141328< ul >
13151329< li > Keep tooling config in one place instead of per-tool config sprawl</ li >
13161330< li > Use the same actions in terminal, IDE, and AI-assisted workflows</ li >
@@ -1331,39 +1345,39 @@ <h4 id="workspace-aware-by-design">Workspace-aware by design<a class="headerlink
13311345< p > Actions can target a single project or the entire workspace, so tasks like linting every subproject run from one command.</ p >
13321346< h4 id ="isolated-environments-by-purpose "> Isolated environments by purpose< a class ="headerlink " href ="#isolated-environments-by-purpose " title ="Permanent link "> ¶</ a > </ h4 >
13331347< p > FineCode keeps developer tooling separate from runtime dependencies:</ p >
1334- < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-3 -1 " name ="__codelineno-3 -1 " href ="#__codelineno-3 -1 "> </ a > .venvs/
1335- < a id ="__codelineno-3 -2 " name ="__codelineno-3 -2 " href ="#__codelineno-3 -2 "> </ a > dev_workspace/ <- FineCode and presets
1336- < a id ="__codelineno-3 -3 " name ="__codelineno-3 -3 " href ="#__codelineno-3 -3 "> </ a > dev_no_runtime/ <- lint/format/type-check handlers
1337- < a id ="__codelineno-3 -4 " name ="__codelineno-3 -4 " href ="#__codelineno-3 -4 "> </ a > dev/ <- tooling that imports project code during execution
1338- < a id ="__codelineno-3 -5 " name ="__codelineno-3 -5 " href ="#__codelineno-3 -5 "> </ a > runtime/ <- project runtime dependencies
1348+ < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-5 -1 " name ="__codelineno-5 -1 " href ="#__codelineno-5 -1 "> </ a > .venvs/
1349+ < a id ="__codelineno-5 -2 " name ="__codelineno-5 -2 " href ="#__codelineno-5 -2 "> </ a > dev_workspace/ <- FineCode and presets
1350+ < a id ="__codelineno-5 -3 " name ="__codelineno-5 -3 " href ="#__codelineno-5 -3 "> </ a > dev_no_runtime/ <- lint/format/type-check handlers
1351+ < a id ="__codelineno-5 -4 " name ="__codelineno-5 -4 " href ="#__codelineno-5 -4 "> </ a > dev/ <- tooling that imports project code during execution
1352+ < a id ="__codelineno-5 -5 " name ="__codelineno-5 -5 " href ="#__codelineno-5 -5 "> </ a > runtime/ <- project runtime dependencies
13391353</ code > </ pre > </ div >
13401354< p > This reduces dependency cross-talk and makes tool execution more predictable.</ p >
13411355< p > These environment roles are examples, not fixed requirements. You can shape the layout to match your workflow.</ p >
13421356< h3 id ="additional-benefits-for-teams "> Additional benefits for teams< a class ="headerlink " href ="#additional-benefits-for-teams " title ="Permanent link "> ¶</ a > </ h3 >
13431357< ul >
1344- < li > Reuse shared standards across repositories with preset packages </ li >
1358+ < li > Keep standards centralized in a shared preset package </ li >
13451359< li > Roll out toolchain changes through normal dependency updates</ li >
13461360< li > Keep rollout predictable by updating a shared preset package instead of editing each repository separately</ li >
13471361</ ul >
13481362< h2 id ="flexible-no-lock-in "> Flexible, no lock-in< a class ="headerlink " href ="#flexible-no-lock-in " title ="Permanent link "> ¶</ a > </ h2 >
13491363< p > Presets are a starting point, not a ceiling.</ p >
13501364< p > Disable or tune individual handlers:</ p >
1351- < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-4 -1 " name ="__codelineno-4 -1 " href ="#__codelineno-4 -1 "> </ a > < span class ="k "> [[tool.finecode.action_handler]]</ span >
1352- < a id ="__codelineno-4 -2 " name ="__codelineno-4 -2 " href ="#__codelineno-4 -2 "> </ a > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "fine_python_ruff.RuffLintFilesHandler"</ span >
1353- < a id ="__codelineno-4 -3 " name ="__codelineno-4 -3 " href ="#__codelineno-4 -3 "> </ a > < span class ="n "> config</ span > < span class ="p "> .</ span > < span class ="n "> line_length</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="mi "> 120</ span >
1354- < a id ="__codelineno-4 -4 " name ="__codelineno-4 -4 " href ="#__codelineno-4 -4 "> </ a >
1355- < a id ="__codelineno-4 -5 " name ="__codelineno-4 -5 " href ="#__codelineno-4 -5 "> </ a > < span class ="k "> [tool.finecode.action.lint]</ span >
1356- < a id ="__codelineno-4 -6 " name ="__codelineno-4 -6 " href ="#__codelineno-4 -6 "> </ a > < span class ="n "> handlers</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> [</ span >
1357- < a id ="__codelineno-4 -7 " name ="__codelineno-4 -7 " href ="#__codelineno-4 -7 "> </ a > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="n "> name</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "flake8"</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> disabled </ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="kc "> true </ span > < span class ="w "> </ span > < span class ="p "> },</ span >
1358- < a id ="__codelineno-4 -8 " name ="__codelineno-4 -8 " href ="#__codelineno-4 -8 "> </ a > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="n "> name</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_linter"</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_team.MyLinterHandler"</ span > < span class ="w "> </ span > < span class ="p "> },</ span >
1359- < a id ="__codelineno-4 -9 " name ="__codelineno-4 -9 " href ="#__codelineno-4 -9 "> </ a > < span class ="p "> ]</ span >
1365+ < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-6 -1 " name ="__codelineno-6 -1 " href ="#__codelineno-6 -1 "> </ a > < span class ="k "> [[tool.finecode.action_handler]]</ span >
1366+ < a id ="__codelineno-6 -2 " name ="__codelineno-6 -2 " href ="#__codelineno-6 -2 "> </ a > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "fine_python_ruff.RuffLintFilesHandler"</ span >
1367+ < a id ="__codelineno-6 -3 " name ="__codelineno-6 -3 " href ="#__codelineno-6 -3 "> </ a > < span class ="n "> config</ span > < span class ="p "> .</ span > < span class ="n "> line_length</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="mi "> 120</ span >
1368+ < a id ="__codelineno-6 -4 " name ="__codelineno-6 -4 " href ="#__codelineno-6 -4 "> </ a >
1369+ < a id ="__codelineno-6 -5 " name ="__codelineno-6 -5 " href ="#__codelineno-6 -5 "> </ a > < span class ="k "> [tool.finecode.action.lint]</ span >
1370+ < a id ="__codelineno-6 -6 " name ="__codelineno-6 -6 " href ="#__codelineno-6 -6 "> </ a > < span class ="n "> handlers</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> [</ span >
1371+ < a id ="__codelineno-6 -7 " name ="__codelineno-6 -7 " href ="#__codelineno-6 -7 "> </ a > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="n "> name</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "flake8"</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> enabled </ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="kc "> false </ span > < span class ="w "> </ span > < span class ="p "> },</ span >
1372+ < a id ="__codelineno-6 -8 " name ="__codelineno-6 -8 " href ="#__codelineno-6 -8 "> </ a > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="n "> name</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_linter"</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_team.MyLinterHandler"</ span > < span class ="w "> </ span > < span class ="p "> },</ span >
1373+ < a id ="__codelineno-6 -9 " name ="__codelineno-6 -9 " href ="#__codelineno-6 -9 "> </ a > < span class ="p "> ]</ span >
13601374</ code > </ pre > </ div >
13611375< p > Replace an action handler set completely:</ p >
1362- < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-5 -1 " name ="__codelineno-5 -1 " href ="#__codelineno-5 -1 "> </ a > < span class ="k "> [tool.finecode.action.lint]</ span >
1363- < a id ="__codelineno-5 -2 " name ="__codelineno-5 -2 " href ="#__codelineno-5 -2 "> </ a > < span class ="n "> handlers_mode</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "replace"</ span >
1364- < a id ="__codelineno-5 -3 " name ="__codelineno-5 -3 " href ="#__codelineno-5 -3 "> </ a > < span class ="n "> handlers</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> [</ span >
1365- < a id ="__codelineno-5 -4 " name ="__codelineno-5 -4 " href ="#__codelineno-5 -4 "> </ a > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="n "> name</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_linter"</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_team.MyLinterHandler"</ span > < span class ="w "> </ span > < span class ="p "> },</ span >
1366- < a id ="__codelineno-5 -5 " name ="__codelineno-5 -5 " href ="#__codelineno-5 -5 "> </ a > < span class ="p "> ]</ span >
1376+ < div class ="highlight "> < pre > < span > </ span > < code > < a id ="__codelineno-7 -1 " name ="__codelineno-7 -1 " href ="#__codelineno-7 -1 "> </ a > < span class ="k "> [tool.finecode.action.lint]</ span >
1377+ < a id ="__codelineno-7 -2 " name ="__codelineno-7 -2 " href ="#__codelineno-7 -2 "> </ a > < span class ="n "> handlers_mode</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "replace"</ span >
1378+ < a id ="__codelineno-7 -3 " name ="__codelineno-7 -3 " href ="#__codelineno-7 -3 "> </ a > < span class ="n "> handlers</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="p "> [</ span >
1379+ < a id ="__codelineno-7 -4 " name ="__codelineno-7 -4 " href ="#__codelineno-7 -4 "> </ a > < span class ="w "> </ span > < span class ="p "> {</ span > < span class ="w "> </ span > < span class ="n "> name</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_linter"</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> source</ span > < span class ="w "> </ span > < span class ="p "> =</ span > < span class ="w "> </ span > < span class ="s2 "> "my_team.MyLinterHandler"</ span > < span class ="w "> </ span > < span class ="p "> },</ span >
1380+ < a id ="__codelineno-7 -5 " name ="__codelineno-7 -5 " href ="#__codelineno-7 -5 "> </ a > < span class ="p "> ]</ span >
13671381</ code > </ pre > </ div >
13681382< p > You can also add custom actions and handlers for project-specific workflows.</ p >
13691383< h2 id ="proven-in-this-repository "> Proven in this repository< a class ="headerlink " href ="#proven-in-this-repository " title ="Permanent link "> ¶</ a > </ h2 >
0 commit comments