Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions ARTWORK-PROVENANCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Better Todo Tree artwork provenance

## Primary artwork

Better Todo Tree's logo and primary icon system are original project artwork. The system was
constructed as flat vector geometry for Better Todo Tree and contains no traced paths, embedded
raster sources, gradients, shadows, filters, or font-rendered text.

| Element | Geometry |
| --- | --- |
| Tree | Broad canopy, circular foliage, split trunk, and roots |
| Upper badge | Circular ring containing a checkmark |
| Lower badge | Equal-size circular ring containing two plus signs |
| Marketplace icon | 128 x 128 RGBA PNG rendered from the vector master |
| Activity Bar icon | 24 x 24 monochrome SVG |
| Product icon | U+EA01 TrueType outline stored in WOFF |

In the 128 x 128 master, both badge circles have outer radius 18 and inner radius 14. The 24 x 24
companions preserve the equal-badge composition with outer radius 4.

## Source files

| File | Role |
| --- | --- |
| `resources/better-todo-tree.png` | Marketplace raster icon |
| `resources/better-todo-tree-logo.svg` | Full-color vector master |
| `resources/better-todo-tree-container.svg` | Activity Bar vector icon |
| `resources/product-icons/better-todo-tree.svg` | Product-icon vector source |
| `resources/product-icons/better-todo-tree.woff` | Packaged product-icon font |

## Unchanged third-party artwork

Toolbar, tree-view, tag, and reveal icons retain their existing attribution in `README.md` and
`resources/icons/license.txt`.
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# Better Todo Tree

**The actively maintained, extremely fast, drop-in replacement fork of Todo Tree.**
**An independent, actively maintained fork of Todo Tree for VS Code: the familiar workflow, major new features, active fixes, benchmarked speedups of 696+ folds, modern compatibility.**

Todo Tree is THE visual map I rely on to track every scattered issue across projects. When upstream stopped being maintained, new and existing bugs 🐛 took root and started choking the extension. Before it became firewood 🪵, I took over to modernize the core, clear the rot, and make it lightning fast ⚡.
> **Independent fork:** Better Todo Tree is independently maintained and published by **FanaticPythoner**. It is based on the open-source [Todo Tree](https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree) project and is **not affiliated with, endorsed by, or published by Gruntfuggly**.

Todo Tree was THE visual map I relied on to track every scattered issue across projects. When the upstream project stopped receiving updates, new and existing bugs took root and started choking the extension. Before it became firewood 🪵, I created Better Todo Tree as an independent fork to modernize the core, clear the rot, and make it lightning fast ⚡.

<!-- README_BENCHMARK_SUMMARY:START -->
**Made TODO rescans 51.4X faster (so you don't have time to feel guilty for not fixing them... 🥀)**
Expand All @@ -23,8 +25,8 @@ Todo Tree is THE visual map I rely on to track every scattered issue across proj

**Why this fork exists**

* **Drop-in Ready 🤝:** Zero friction. Same workflow. Same exact settings.
* **Bulletproof Fixes 🛡️:** Notebook behavior, scan parity, strict regex handling, and modern VS Code compatibility actually move forward.
* **Migration Ready 🤝:** Familiar workflow. Existing Todo Tree settings remain supported and are imported into Better Todo Tree's own settings namespace.
* **Major Features & Bulletproof Fixes 🛠️:** Complete notebook scanning, embedded Vue/Svelte/Astro support, scan parity, strict regex handling, major performance improvements, and modern VS Code compatibility.
* **Alive & Active 💖:** Keeping this project alive takes a lot of time and, predictably, more coffee than I'd like to admit (caffeine or rent? Who knows what it will be next week 💀 #tariffs). If you're in the same boat:
`// TODO: buy the Better Todo Tree guy a coffee` ☕ → [buymeacoffee.com/FanaticPythoner](https://buymeacoffee.com/FanaticPythoner)

Expand Down Expand Up @@ -651,7 +653,7 @@ Better Todo Tree keeps reading legacy `todo-tree.*` settings and imports them in

Uses a modified version of [ripgrep-js](https://www.npmjs.com/package/ripgrep-js).

Main icons originally made by [Freepik](http://www.freepik.com) from [www.flaticon.com](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/)
Better Todo Tree's logo and primary iconography are original project artwork. See [ARTWORK-PROVENANCE.md](ARTWORK-PROVENANCE.md).

Tree view icons made by [Vaadin](https://www.flaticon.com/authors/vaadin) from [www.flaticon.com](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/)

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "better-todo-tree",
"displayName": "Better Todo Tree",
"description": "The maintained successor to Todo Tree for VS Code: same workflow, active fixes, better compatibility, and ongoing improvements.",
"description": "An independent, actively maintained fork of Todo Tree for VS Code: the familiar workflow, major new features, active fixes, benchmarked speedups of 696+ folds, modern compatibility.",
"keywords": [
"todo",
"todos",
Expand Down
28 changes: 22 additions & 6 deletions resources/better-todo-tree-container.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
55 changes: 55 additions & 0 deletions resources/better-todo-tree-logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified resources/better-todo-tree.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions resources/product-icons/better-todo-tree.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified resources/product-icons/better-todo-tree.woff
Binary file not shown.
Binary file modified resources/screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
88 changes: 88 additions & 0 deletions test/package.manifest.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,38 @@ function readPackageNls( fileName )
return JSON.parse( fs.readFileSync( path.join( __dirname, '..', fileName ), 'utf8' ) );
}

function readRepositoryFile( fileName )
{
return fs.readFileSync( path.join( __dirname, '..', fileName ) );
}

function occurrenceCount( text, value )
{
return text.split( value ).length - 1;
}

function circleRadii( svg, centerX, centersY )
{
var radii = [];

centersY.forEach( function( centerY )
{
var marker = '<circle cx="' + centerX + '" cy="' + centerY + '" r="';
var markerStart = svg.indexOf( marker );

while( markerStart !== -1 )
{
var radiusStart = markerStart + marker.length;
var radiusEnd = svg.indexOf( '"', radiusStart );

radii.push( Number( svg.slice( radiusStart, radiusEnd ) ) );
markerStart = svg.indexOf( marker, radiusEnd );
}
} );

return radii;
}

function getConfigurationProperty( propertyName )
{
return languageMatrix.findConfigurationProperty( propertyName );
Expand All @@ -31,6 +63,41 @@ QUnit.test( 'stable hidden view ids are preserved while the public namespace is
assert.equal( treeView.when, '!better-todo-tree-is-empty' );
} );

QUnit.test( 'Marketplace presentation states independent fork identity consistently', function( assert )
{
var expectedDescription = 'An independent, actively maintained fork of Todo Tree for VS Code: the familiar workflow, major new features, active fixes, benchmarked speedups of 696+ folds, modern compatibility.';
var expectedScreenshot = '![screenshot](https://raw.githubusercontent.com/FanaticPythoner/better-todo-tree/master/resources/screenshot.png)';
var packageJson = readPackageJson();
var packageLock = JSON.parse( readRepositoryFile( 'package-lock.json' ).toString( 'utf8' ) );
var readme = readRepositoryFile( 'README.md' ).toString( 'utf8' );
var provenance = readRepositoryFile( 'ARTWORK-PROVENANCE.md' ).toString( 'utf8' );

assert.equal( packageJson.description, expectedDescription );
assert.equal( packageJson.name, 'better-todo-tree' );
assert.equal( packageJson.displayName, 'Better Todo Tree' );
assert.equal( packageJson.publisher, 'FanaticPythoner' );
assert.equal( packageJson.repository, 'https://github.com/FanaticPythoner/better-todo-tree' );
assert.equal( packageJson.bugs.url, 'https://github.com/FanaticPythoner/better-todo-tree/issues' );
assert.equal( packageJson.homepage, 'https://bettertodotree.com' );
assert.equal( packageLock.version, packageJson.version );
assert.equal( packageLock.packages[ '' ].version, packageJson.version );
assert.ok( readme.indexOf( '**' + expectedDescription + '**' ) !== -1 );
assert.ok( readme.indexOf( 'not affiliated with, endorsed by, or published by Gruntfuggly' ) !== -1 );
assert.ok( readme.indexOf( '**Migration Ready 🤝:** Familiar workflow.' ) !== -1 );
assert.ok( readme.indexOf( '**Major Features & Bulletproof Fixes 🛠️:** Complete notebook scanning, embedded Vue/Svelte/Astro support' ) !== -1 );
assert.ok( readme.indexOf( '**Alive & Active 💖:** Keeping this project alive' ) !== -1 );
assert.equal( readme.indexOf( 'I took over to modernize the core' ), -1 );
assert.equal( readme.indexOf( 'drop-in replacement fork of Todo Tree' ), -1 );
assert.equal( occurrenceCount( readme, expectedScreenshot ), 1 );
assert.ok( readme.indexOf( '| **Custom Highlight Configs** | 1,391.93 ms | 2.00 ms | **696.0X** 🚀 |' ) !== -1 );
assert.ok( readme.indexOf( '| **Custom Regex Workspace Refreshes** | 36.72 ms | 3.76 ms | **9.8X** 🚀 |' ) !== -1 );
assert.ok( readme.indexOf( '[ARTWORK-PROVENANCE.md](ARTWORK-PROVENANCE.md)' ) !== -1 );
assert.equal( readme.indexOf( 'Main icons originally made by [Freepik]' ), -1 );
assert.ok( readme.indexOf( 'Tree view icons made by [Vaadin]' ) !== -1 );
assert.ok( provenance.indexOf( 'original project artwork' ) !== -1 );
assert.ok( provenance.indexOf( '`resources/better-todo-tree-logo.svg` | Full-color vector master' ) !== -1 );
} );

QUnit.test( 'issue #106 sidebar tree view activates on direct view demand', function( assert )
{
var activationEvents = readPackageJson().activationEvents;
Expand All @@ -57,6 +124,27 @@ QUnit.test( 'scan progress contributes the Better Todo Tree product icon font',
assert.equal( typeof chinese[ 'better-todo-tree.productIcon.description' ], 'string' );
} );

QUnit.test( 'brand icons use two equal circular status badges', function( assert )
{
var marketplaceIcon = readRepositoryFile( 'resources/better-todo-tree.png' );
var marketplaceScreenshot = readRepositoryFile( 'resources/screenshot.png' );
var logoSource = readRepositoryFile( 'resources/better-todo-tree-logo.svg' ).toString( 'utf8' );
var containerIcon = readRepositoryFile( 'resources/better-todo-tree-container.svg' ).toString( 'utf8' );
var productIcon = readRepositoryFile( 'resources/product-icons/better-todo-tree.svg' ).toString( 'utf8' );

assert.equal( marketplaceIcon.readUInt32BE( 16 ), 128 );
assert.equal( marketplaceIcon.readUInt32BE( 20 ), 128 );
assert.equal( marketplaceScreenshot.readUInt32BE( 16 ), 2561 );
assert.equal( marketplaceScreenshot.readUInt32BE( 20 ), 1594 );
assert.deepEqual( circleRadii( logoSource, '98', [ '28', '67' ] ), [ 18, 14, 18, 14 ] );
assert.deepEqual( circleRadii( containerIcon, '19', [ '5.1', '14.35' ] ), [ 4, 4 ] );
assert.deepEqual( circleRadii( productIcon, '19', [ '5.1', '14.35' ] ), [ 4, 4 ] );
assert.ok( containerIcon.indexOf( 'm16.8 5.1 1.45 1.45 2.95-3.35' ) !== -1 );
assert.ok( containerIcon.indexOf( 'M16.2 14.35h2.2' ) !== -1 );
assert.ok( productIcon.indexOf( 'm16.8 5.1 1.45 1.45 2.95-3.35' ) !== -1 );
assert.ok( productIcon.indexOf( 'M16.2 14.35h2.2' ) !== -1 );
} );

QUnit.test( 'public commands use the better-todo-tree namespace', function( assert )
{
var packageJson = readPackageJson();
Expand Down
Loading