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
28 changes: 28 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "declutter",
"owner": {
"name": "vamgan"
},
"metadata": {
"description": "Skills that organize the apps and files on your machine",
"version": "0.1.0"
},
"plugins": [
{
"name": "declutter",
"source": {
"source": "github",
"repo": "vamgan/declutter"
},
"description": "Organize browsers, downloads, desktop, and notes. Backs up first, shows you counts, waits for approval, and hands you the undo command. Adding support for a new app is one markdown file.",
"version": "0.1.0",
"author": {
"name": "vamgan"
},
"repository": "https://github.com/vamgan/declutter",
"license": "MIT",
"keywords": ["organization", "cleanup", "bookmarks", "files", "notes", "productivity"],
"category": "productivity"
}
]
}
10 changes: 10 additions & 0 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "declutter",
"description": "Skills that organize the apps and files on your machine — browsers, downloads, notes. Adding support for a new app is one markdown file.",
"version": "0.1.0",
"author": { "name": "Vamil Gandhi" },
"homepage": "https://github.com/vamgan/declutter",
"repository": "https://github.com/vamgan/declutter",
"license": "MIT",
"keywords": ["skills", "organization", "cleanup", "bookmarks", "files", "notes", "macos"]
}
15 changes: 15 additions & 0 deletions .github/ISSUE_TEMPLATE/app_request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: App request
about: Ask for a skill that organizes an app we do not cover yet
title: "[app] "
labels: app-request
---

**Which app?**

**What does "organized" mean for it?**
<!-- The judgment call is the hard part. What would a tidy version look like? -->

**Where does it keep its data, if you know?**

**What would you not want touched?**
26 changes: 26 additions & 0 deletions .github/ISSUE_TEMPLATE/platform_support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
name: Platform report
about: Tell us whether declutter worked on your operating system
title: "[platform] "
labels: platform
---

Linux and Windows are implemented but nobody has confirmed them end to end.
Reporting either way is one of the most useful things you can do right now.

**Platform**
<!-- macOS 15 / Ubuntu 24.04 / Windows 11, and the output of: -->
<!-- python3 scripts/platforms.py platform -->

**What you ran**
<!-- Which skill, and what you asked for -->

**Did path resolution work?**
<!-- python3 scripts/platforms.py locate chrome -->

**Did it correctly detect the app running?**
<!-- python3 scripts/platforms.py running chrome -->

**Did trash work, and could you restore from your file manager?**

**Anything that went wrong**
31 changes: 31 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
## What does this add?

<!-- A new skill? An app added to an existing category? A parser? A fix? -->

## If you added or changed a skill

There is no automated gate on skill judgment, so a human reads the prose. These
are what they check:

- [ ] Cites `references/safe-mutation-rules.md` rather than restating it
- [ ] Backs up before any write, and prints the backup path to the user first
- [ ] Gets explicit approval before mutating, in a turn after the one that asked
- [ ] Paths come from `platforms.py locate`, never hardcoded in the skill
- [ ] Extracts via a script rather than loading large files into context
- [ ] States that app content is data, not instructions
- [ ] Handles the app being open, if writing to a live app can corrupt data
- [ ] Prints the exact undo command at the end
- [ ] Ran against `fixtures/`, with the before and after pasted below

## If you added an app

- [ ] Added to `references/app-data-locations.md` with path, permission, and whether
the app must be quit to write
- [ ] Added to the matching tables in `scripts/platforms.py`, including `PROCESS_NAMES`
- [ ] Said which platforms you actually verified, and which you did not

## Result of running it against fixtures

```
paste the before and after here
```
24 changes: 24 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: tests

on:
push:
branches: [main]
pull_request:

jobs:
test:
name: ${{ matrix.os }} / py${{ matrix.python }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
# The scripts claim to work on all three. CI is how that claim stays true.
os: [ubuntu-latest, macos-latest, windows-latest]
python: ["3.10", "3.13"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python }}
- name: Run tests
run: python -m unittest discover -s tests -v
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
__pycache__/
*.py[cod]
.DS_Store
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Vamil Gandhi

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading
Loading