carrel 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- carrel-0.1.1/.claude/agents/design-artist.md +15 -0
- carrel-0.1.1/.claude/agents/doc-smith.md +15 -0
- carrel-0.1.1/.claude/agents/integration-reviewer.md +13 -0
- carrel-0.1.1/.claude/agents/module-builder.md +17 -0
- carrel-0.1.1/.claude/agents/test-engineer.md +16 -0
- carrel-0.1.1/.claude-plugin/marketplace.json +57 -0
- carrel-0.1.1/.github/FUNDING.yml +2 -0
- carrel-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +53 -0
- carrel-0.1.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
- carrel-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
- carrel-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +18 -0
- carrel-0.1.1/.github/workflows/docs.yml +43 -0
- carrel-0.1.1/.github/workflows/publish.yml +24 -0
- carrel-0.1.1/.github/workflows/test.yml +50 -0
- carrel-0.1.1/.gitignore +13 -0
- carrel-0.1.1/CHANGELOG.md +14 -0
- carrel-0.1.1/CITATION.cff +18 -0
- carrel-0.1.1/CLAUDE.md +44 -0
- carrel-0.1.1/CODE_OF_CONDUCT.md +21 -0
- carrel-0.1.1/LICENSE +21 -0
- carrel-0.1.1/PKG-INFO +152 -0
- carrel-0.1.1/README.md +134 -0
- carrel-0.1.1/STATE.md +25 -0
- carrel-0.1.1/assets/banner.svg +63 -0
- carrel-0.1.1/assets/demo/desk-tour.gif +0 -0
- carrel-0.1.1/assets/demo/pack.gif +0 -0
- carrel-0.1.1/assets/demo/redact-proof.gif +0 -0
- carrel-0.1.1/assets/logo.svg +28 -0
- carrel-0.1.1/assets/palette.svg +48 -0
- carrel-0.1.1/assets/social-preview.svg +104 -0
- carrel-0.1.1/demo/README.md +16 -0
- carrel-0.1.1/demo/desk-tour.tape +62 -0
- carrel-0.1.1/demo/pack.tape +23 -0
- carrel-0.1.1/demo/redact-proof.tape +38 -0
- carrel-0.1.1/docs/AGENTS.md +113 -0
- carrel-0.1.1/docs/ARCHITECTURE.md +110 -0
- carrel-0.1.1/docs/BRAND.md +124 -0
- carrel-0.1.1/docs/BUILD_PLAN.md +48 -0
- carrel-0.1.1/docs/CONFIGURATION.md +102 -0
- carrel-0.1.1/docs/CONTRIBUTING.md +93 -0
- carrel-0.1.1/docs/DECISIONS.md +19 -0
- carrel-0.1.1/docs/ENVIRONMENT.md +62 -0
- carrel-0.1.1/docs/FEATURES.md +46 -0
- carrel-0.1.1/docs/HOW_THIS_WAS_BUILT.md +88 -0
- carrel-0.1.1/docs/INSTALL.md +192 -0
- carrel-0.1.1/docs/MARKETPLACE.md +128 -0
- carrel-0.1.1/docs/PLUGIN_AUTHORING.md +148 -0
- carrel-0.1.1/docs/QUICKSTART.md +220 -0
- carrel-0.1.1/docs/REFERENCE.md +918 -0
- carrel-0.1.1/docs/TEST_REPORT.md +76 -0
- carrel-0.1.1/docs/TROUBLESHOOTING.md +159 -0
- carrel-0.1.1/docs/VISION.md +43 -0
- carrel-0.1.1/docs/assets/logo.svg +28 -0
- carrel-0.1.1/docs/index.md +27 -0
- carrel-0.1.1/docs/stylesheets/carrel.css +73 -0
- carrel-0.1.1/examples/cookbook/01-scan-to-searchable-notes.sh +39 -0
- carrel-0.1.1/examples/cookbook/02-watch-auto-thumbs.sh +41 -0
- carrel-0.1.1/examples/cookbook/03-dedupe-sweep.sh +51 -0
- carrel-0.1.1/examples/cookbook/04-redact-pii.sh +55 -0
- carrel-0.1.1/examples/cookbook/05-conversion-relay.sh +49 -0
- carrel-0.1.1/examples/cookbook/06-form-roundtrip.sh +57 -0
- carrel-0.1.1/examples/cookbook/07-audiobook-from-markdown.sh +31 -0
- carrel-0.1.1/examples/cookbook/08-pack-repo-for-claude.sh +72 -0
- carrel-0.1.1/examples/cookbook/09-provenance-chain.sh +55 -0
- carrel-0.1.1/examples/cookbook/README.md +30 -0
- carrel-0.1.1/mkdocs.yml +69 -0
- carrel-0.1.1/plugins/carrel-agent/.claude-plugin/plugin.json +8 -0
- carrel-0.1.1/plugins/carrel-agent/.mcp.json +8 -0
- carrel-0.1.1/plugins/carrel-agent/agents/file-librarian.md +18 -0
- carrel-0.1.1/plugins/carrel-agent/hooks/hooks.json +15 -0
- carrel-0.1.1/plugins/carrel-agent/scripts/reindex.sh +49 -0
- carrel-0.1.1/plugins/carrel-agent/skills/agent-workflows/SKILL.md +44 -0
- carrel-0.1.1/plugins/carrel-convert/.claude-plugin/plugin.json +8 -0
- carrel-0.1.1/plugins/carrel-convert/agents/doc-converter.md +17 -0
- carrel-0.1.1/plugins/carrel-convert/commands/audiobook.md +25 -0
- carrel-0.1.1/plugins/carrel-convert/commands/convert.md +27 -0
- carrel-0.1.1/plugins/carrel-convert/commands/ocr.md +24 -0
- carrel-0.1.1/plugins/carrel-convert/commands/thumb.md +26 -0
- carrel-0.1.1/plugins/carrel-inspect/.claude-plugin/plugin.json +8 -0
- carrel-0.1.1/plugins/carrel-inspect/commands/diff.md +24 -0
- carrel-0.1.1/plugins/carrel-inspect/commands/inspect.md +21 -0
- carrel-0.1.1/plugins/carrel-inspect/commands/pack.md +29 -0
- carrel-0.1.1/plugins/carrel-inspect/commands/search.md +27 -0
- carrel-0.1.1/plugins/carrel-inspect/skills/context-packing/SKILL.md +50 -0
- carrel-0.1.1/plugins/carrel-organize/.claude-plugin/plugin.json +8 -0
- carrel-0.1.1/plugins/carrel-organize/commands/dedupe.md +24 -0
- carrel-0.1.1/plugins/carrel-organize/commands/note-file.md +24 -0
- carrel-0.1.1/plugins/carrel-organize/commands/organize.md +25 -0
- carrel-0.1.1/plugins/carrel-organize/commands/tag.md +24 -0
- carrel-0.1.1/plugins/carrel-watch/.claude-plugin/plugin.json +8 -0
- carrel-0.1.1/plugins/carrel-watch/commands/watch-folder.md +26 -0
- carrel-0.1.1/plugins/carrel-watch/skills/watch-automation/SKILL.md +48 -0
- carrel-0.1.1/product.json +13 -0
- carrel-0.1.1/pyproject.toml +36 -0
- carrel-0.1.1/scripts/finalize.sh +159 -0
- carrel-0.1.1/scripts/rename_product.py +105 -0
- carrel-0.1.1/scripts/sync_product.py +42 -0
- carrel-0.1.1/snippets/README.md +27 -0
- carrel-0.1.1/snippets/csv-to-report.sh +34 -0
- carrel-0.1.1/snippets/find-untagged.py +78 -0
- carrel-0.1.1/snippets/inbox-triage.sh +32 -0
- carrel-0.1.1/snippets/pack-repo-for-claude.sh +38 -0
- carrel-0.1.1/snippets/pdf-to-searchable.sh +36 -0
- carrel-0.1.1/snippets/redact-pii.sh +35 -0
- carrel-0.1.1/snippets/sign-and-verify.sh +42 -0
- carrel-0.1.1/snippets/watch-thumbs.sh +32 -0
- carrel-0.1.1/specs/00-core.md +19 -0
- carrel-0.1.1/specs/01-convert.md +23 -0
- carrel-0.1.1/specs/02-ocr.md +15 -0
- carrel-0.1.1/specs/03-inspect-diff.md +20 -0
- carrel-0.1.1/specs/04-edit.md +14 -0
- carrel-0.1.1/specs/05-pack.md +20 -0
- carrel-0.1.1/specs/06-index-search-tag-note.md +23 -0
- carrel-0.1.1/specs/07-thumb-images-proof-color.md +23 -0
- carrel-0.1.1/specs/08-watch-organize-dedupe.md +18 -0
- carrel-0.1.1/specs/09-audiobook.md +16 -0
- carrel-0.1.1/specs/10-redact-sign-form.md +23 -0
- carrel-0.1.1/specs/11-desk-tui.md +20 -0
- carrel-0.1.1/specs/12-marketplace-plugins.md +21 -0
- carrel-0.1.1/specs/13-mcp-doctor.md +18 -0
- carrel-0.1.1/specs/14-fixtures.md +21 -0
- carrel-0.1.1/src/carrel/__init__.py +6 -0
- carrel-0.1.1/src/carrel/_product.py +15 -0
- carrel-0.1.1/src/carrel/cli.py +110 -0
- carrel-0.1.1/src/carrel/commands/__init__.py +0 -0
- carrel-0.1.1/src/carrel/commands/audiobook.py +509 -0
- carrel-0.1.1/src/carrel/commands/color.py +210 -0
- carrel-0.1.1/src/carrel/commands/convert.py +564 -0
- carrel-0.1.1/src/carrel/commands/dedupe.py +212 -0
- carrel-0.1.1/src/carrel/commands/desk.py +36 -0
- carrel-0.1.1/src/carrel/commands/diff.py +410 -0
- carrel-0.1.1/src/carrel/commands/doctor.py +197 -0
- carrel-0.1.1/src/carrel/commands/edit.py +522 -0
- carrel-0.1.1/src/carrel/commands/extract_images.py +190 -0
- carrel-0.1.1/src/carrel/commands/form.py +314 -0
- carrel-0.1.1/src/carrel/commands/index.py +151 -0
- carrel-0.1.1/src/carrel/commands/inspect.py +365 -0
- carrel-0.1.1/src/carrel/commands/mcp.py +288 -0
- carrel-0.1.1/src/carrel/commands/note.py +201 -0
- carrel-0.1.1/src/carrel/commands/ocr.py +209 -0
- carrel-0.1.1/src/carrel/commands/organize.py +191 -0
- carrel-0.1.1/src/carrel/commands/pack.py +655 -0
- carrel-0.1.1/src/carrel/commands/proof.py +204 -0
- carrel-0.1.1/src/carrel/commands/redact.py +317 -0
- carrel-0.1.1/src/carrel/commands/search.py +118 -0
- carrel-0.1.1/src/carrel/commands/sign.py +313 -0
- carrel-0.1.1/src/carrel/commands/tag.py +136 -0
- carrel-0.1.1/src/carrel/commands/thumb.py +143 -0
- carrel-0.1.1/src/carrel/commands/watch.py +226 -0
- carrel-0.1.1/src/carrel/core/__init__.py +0 -0
- carrel-0.1.1/src/carrel/core/adapters.py +120 -0
- carrel-0.1.1/src/carrel/core/db.py +196 -0
- carrel-0.1.1/src/carrel/core/filetypes.py +84 -0
- carrel-0.1.1/src/carrel/core/output.py +55 -0
- carrel-0.1.1/src/carrel/core/textextract.py +121 -0
- carrel-0.1.1/src/carrel/desk/__init__.py +5 -0
- carrel-0.1.1/src/carrel/desk/app.py +546 -0
- carrel-0.1.1/src/carrel/desk/styles.tcss +132 -0
- carrel-0.1.1/tests/conftest.py +47 -0
- carrel-0.1.1/tests/fixtures/b.pdf +74 -0
- carrel-0.1.1/tests/fixtures/form.pdf +0 -0
- carrel-0.1.1/tests/fixtures/generate.py +388 -0
- carrel-0.1.1/tests/fixtures/records.json +58 -0
- carrel-0.1.1/tests/fixtures/sample-copy.jpg +0 -0
- carrel-0.1.1/tests/fixtures/sample-resized.jpg +0 -0
- carrel-0.1.1/tests/fixtures/sample.csv +21 -0
- carrel-0.1.1/tests/fixtures/sample.html +32 -0
- carrel-0.1.1/tests/fixtures/sample.ico +0 -0
- carrel-0.1.1/tests/fixtures/sample.jpg +0 -0
- carrel-0.1.1/tests/fixtures/sample.json +45 -0
- carrel-0.1.1/tests/fixtures/sample.md +30 -0
- carrel-0.1.1/tests/fixtures/sample.png +0 -0
- carrel-0.1.1/tests/fixtures/sample.txt +14 -0
- carrel-0.1.1/tests/fixtures/sample.xml +29 -0
- carrel-0.1.1/tests/fixtures/scanned.pdf +0 -0
- carrel-0.1.1/tests/fixtures/scanned.png +0 -0
- carrel-0.1.1/tests/fixtures/text+image.pdf +104 -0
- carrel-0.1.1/tests/test_audiobook.py +320 -0
- carrel-0.1.1/tests/test_convert.py +442 -0
- carrel-0.1.1/tests/test_core_adapters.py +113 -0
- carrel-0.1.1/tests/test_core_cli.py +75 -0
- carrel-0.1.1/tests/test_core_db.py +128 -0
- carrel-0.1.1/tests/test_core_filetypes.py +105 -0
- carrel-0.1.1/tests/test_core_textextract.py +113 -0
- carrel-0.1.1/tests/test_desk.py +154 -0
- carrel-0.1.1/tests/test_desk_db_cmds.py +346 -0
- carrel-0.1.1/tests/test_diff.py +281 -0
- carrel-0.1.1/tests/test_edit.py +411 -0
- carrel-0.1.1/tests/test_images_cmds.py +449 -0
- carrel-0.1.1/tests/test_inspect.py +208 -0
- carrel-0.1.1/tests/test_marketplace.py +275 -0
- carrel-0.1.1/tests/test_mcp_doctor.py +325 -0
- carrel-0.1.1/tests/test_ocr.py +238 -0
- carrel-0.1.1/tests/test_pack.py +291 -0
- carrel-0.1.1/tests/test_product_sync.py +28 -0
- carrel-0.1.1/tests/test_redact_sign_form.py +560 -0
- carrel-0.1.1/tests/test_watch_org_dedupe.py +406 -0
- carrel-0.1.1/uv.lock +748 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-artist
|
|
3
|
+
description: Creates carrel's visual identity — hand-authored SVG logo, banner, social preview, palette — and applies it to README and the TUI theme.
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the design artist for the carrel project.
|
|
8
|
+
|
|
9
|
+
Rules:
|
|
10
|
+
1. Everything is original, hand-authored SVG — no copyrighted or trademarked imagery, no traced logos, no external fonts fetched at runtime (system font stacks or outlined shapes only).
|
|
11
|
+
2. Palette and typography are defined once in `docs/BRAND.md` and used everywhere (README badges/hero, SVG assets, TUI CSS). Derive, don't improvise per-file.
|
|
12
|
+
3. Validate every SVG: well-formed XML (`python -c "import xml.etree.ElementTree as ET; ET.parse(...)"`), renders at intended sizes (rasterize a check PNG via ImageMagick if available).
|
|
13
|
+
4. Keep SVGs lean: no editor cruft, viewBox set, dark/light considerations documented.
|
|
14
|
+
|
|
15
|
+
Completion report format: files created · validation commands + output · palette summary.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doc-smith
|
|
3
|
+
description: Writes carrel documentation — reference pages, cookbook recipes, guides — grounded in actual command output, never invented flags.
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the documentation writer for the carrel project.
|
|
8
|
+
|
|
9
|
+
Rules:
|
|
10
|
+
1. Ground every documented flag/behavior in reality: run `uv run carrel <cmd> --help` and real invocations; paste real output into docs (trim noise). Never document a flag you didn't see.
|
|
11
|
+
2. Follow the voice: practical, example-first, second person, no marketing fluff inside reference docs.
|
|
12
|
+
3. Cookbook recipes must be runnable as-is from repo root and state expected output; you must run each one before writing it down.
|
|
13
|
+
4. Cross-link docs (relative links). Product name comes from product.json — write "Carrel"/"carrel" in prose but never hardcode it in generated snippets where a variable exists.
|
|
14
|
+
|
|
15
|
+
Completion report format: files touched · every recipe/command you executed with output tail · gaps or doc debt you noticed.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: integration-reviewer
|
|
3
|
+
description: Adversarial reviewer that verifies cross-module consistency and hunts real bugs in carrel by executing commands, not by reading reports.
|
|
4
|
+
tools: Read, Bash, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the integration reviewer for the carrel project. You do not trust completion reports — you verify by execution.
|
|
8
|
+
|
|
9
|
+
Process:
|
|
10
|
+
1. Run the full suite: `uv run pytest -q`. Any failure is a finding.
|
|
11
|
+
2. Exercise the contracts: for each command under review run `--help`, a real fixture invocation, its `--json` mode (must be parseable: pipe to `python -m json.tool`), and a failure path (missing file → exit 4; you can fake a missing binary with PATH surgery → exit 3).
|
|
12
|
+
3. Check cross-module drift: exit codes match CLAUDE.md; JSON shapes match specs; no module bypasses the adapter layer (`grep -rn "subprocess" src/carrel/commands/` should only show adapter imports).
|
|
13
|
+
4. Report findings ranked by severity with exact reproduction commands and observed vs expected output. Do NOT fix anything — report only.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: module-builder
|
|
3
|
+
description: Implements one carrel module from its spec in specs/, including its tests. Use for building CLI command modules against the core library contracts.
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are a module builder for the carrel project. You implement exactly one spec per dispatch.
|
|
8
|
+
|
|
9
|
+
Rules:
|
|
10
|
+
1. Read your assigned spec in `specs/`, plus `docs/ARCHITECTURE.md` (Global contracts) and `CLAUDE.md` before writing code.
|
|
11
|
+
2. Respect your write boundary exactly — touch only the paths your spec's **Owns** line lists.
|
|
12
|
+
3. Use the core library: `carrel.core.adapters` (never subprocess directly), `carrel.core.output.emit/CarrelInputError/ExitCode`, `carrel.core.filetypes`, `carrel.core.textextract`, `carrel.core.db`. Command modules export a click command named `cmd`.
|
|
13
|
+
4. Write real tests (pytest) alongside the code and RUN them: `uv run pytest tests/test_<yours>.py -q`. Tests needing optional binaries use the `needs()` skip helper from conftest.
|
|
14
|
+
5. No stubs, no TODOs. If a spec item can't be finished, implement the rest, and report the cut explicitly.
|
|
15
|
+
6. Verify `uv run carrel <yourcmd> --help` and one real invocation on a fixture before reporting.
|
|
16
|
+
|
|
17
|
+
Completion report format (required): files touched · tests written + pass/fail output (paste the pytest tail) · deviations from spec · open issues.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-engineer
|
|
3
|
+
description: Builds fixtures, integration tests, and end-to-end cookbook validation for carrel. Use when tests span modules or need real file fixtures.
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the test engineer for the carrel project.
|
|
8
|
+
|
|
9
|
+
Rules:
|
|
10
|
+
1. Read `specs/14-fixtures.md`, `docs/ARCHITECTURE.md` §Testing, and `CLAUDE.md` first.
|
|
11
|
+
2. Fixtures are generated programmatically (`tests/fixtures/generate.py`) — idempotent, deterministic where possible, committed outputs. Never hand-craft binary files.
|
|
12
|
+
3. Integration tests drive the real CLI (`uv run carrel ...` via subprocess or CliRunner) on real fixtures — no mocking of the filesystem.
|
|
13
|
+
4. Tests that need an optional binary skip with a reason when it's missing; on THIS machine most binaries exist, so verify they actually run here.
|
|
14
|
+
5. Every claim in your report must come from executed pytest output. Paste the tail.
|
|
15
|
+
|
|
16
|
+
Completion report format: files touched · commands run + real output tails · coverage gaps you noticed · open issues.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "carrel",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "Colton Bearden"
|
|
5
|
+
},
|
|
6
|
+
"metadata": {
|
|
7
|
+
"description": "Carrel — a library desk for your files, and your agents. Local file toolkit plugins: convert, OCR, inspect, index/search, pack for LLM context, organize, watch, and agent workflows.",
|
|
8
|
+
"pluginRoot": "./plugins"
|
|
9
|
+
},
|
|
10
|
+
"plugins": [
|
|
11
|
+
{
|
|
12
|
+
"name": "carrel-convert",
|
|
13
|
+
"source": "./plugins/carrel-convert",
|
|
14
|
+
"description": "Convert, OCR, thumbnail, and narrate local files with the carrel CLI: /convert, /ocr, /thumb, /audiobook, plus a doc-converter batch agent.",
|
|
15
|
+
"version": "0.1.0",
|
|
16
|
+
"author": { "name": "Colton Bearden" },
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"keywords": ["files", "convert", "pdf", "ocr", "thumbnails", "audiobook", "tts"]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "carrel-inspect",
|
|
22
|
+
"source": "./plugins/carrel-inspect",
|
|
23
|
+
"description": "Inspect, diff, search, and pack local files for LLM context with the carrel CLI: /inspect, /diff, /search, /pack, plus a context-packing skill.",
|
|
24
|
+
"version": "0.1.0",
|
|
25
|
+
"author": { "name": "Colton Bearden" },
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"keywords": ["files", "inspect", "diff", "search", "fts5", "pack", "llm-context"]
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "carrel-organize",
|
|
31
|
+
"source": "./plugins/carrel-organize",
|
|
32
|
+
"description": "Organize, dedupe, tag, and annotate local files with the carrel CLI: /organize, /dedupe, /tag, /note-file.",
|
|
33
|
+
"version": "0.1.0",
|
|
34
|
+
"author": { "name": "Colton Bearden" },
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"keywords": ["files", "organize", "dedupe", "tags", "notes"]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "carrel-watch",
|
|
40
|
+
"source": "./plugins/carrel-watch",
|
|
41
|
+
"description": "Watch folders and run carrel actions on file events: /watch-folder plus a watch-automation recipe skill.",
|
|
42
|
+
"version": "0.1.0",
|
|
43
|
+
"author": { "name": "Colton Bearden" },
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"keywords": ["files", "watch", "automation", "watchdog", "folder-actions"]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "carrel-agent",
|
|
49
|
+
"source": "./plugins/carrel-agent",
|
|
50
|
+
"description": "Agentic file librarian for carrel desks: file-librarian agent, agent-workflows skill, carrel MCP server (search/pack/inspect), and a PostToolUse hook that re-indexes files Claude writes.",
|
|
51
|
+
"version": "0.1.0",
|
|
52
|
+
"author": { "name": "Colton Bearden" },
|
|
53
|
+
"license": "MIT",
|
|
54
|
+
"keywords": ["agent", "mcp", "index", "search", "hooks", "librarian"]
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: File a bug report to help us improve
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug", "triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for taking the time to report a bug! Please fill out the sections below.
|
|
10
|
+
- type: input
|
|
11
|
+
id: version
|
|
12
|
+
attributes:
|
|
13
|
+
label: Version
|
|
14
|
+
description: What version of carrel are you running?
|
|
15
|
+
placeholder: "v1.2.0"
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: what-happened
|
|
20
|
+
attributes:
|
|
21
|
+
label: What happened?
|
|
22
|
+
description: A clear description of the bug.
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: reproduce
|
|
27
|
+
attributes:
|
|
28
|
+
label: Steps to reproduce
|
|
29
|
+
placeholder: |
|
|
30
|
+
1. Run '...'
|
|
31
|
+
2. See error
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
34
|
+
- type: textarea
|
|
35
|
+
id: expected
|
|
36
|
+
attributes:
|
|
37
|
+
label: Expected behavior
|
|
38
|
+
validations:
|
|
39
|
+
required: false
|
|
40
|
+
- type: textarea
|
|
41
|
+
id: environment
|
|
42
|
+
attributes:
|
|
43
|
+
label: Environment
|
|
44
|
+
placeholder: "OS, Python/Node version, Docker version, etc."
|
|
45
|
+
validations:
|
|
46
|
+
required: true
|
|
47
|
+
- type: textarea
|
|
48
|
+
id: logs
|
|
49
|
+
attributes:
|
|
50
|
+
label: Relevant log output
|
|
51
|
+
render: shell
|
|
52
|
+
validations:
|
|
53
|
+
required: false
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new feature or enhancement
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: What problem does this solve?
|
|
10
|
+
description: Describe the pain point this feature would address.
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: proposal
|
|
15
|
+
attributes:
|
|
16
|
+
label: Proposed solution
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: alternatives
|
|
21
|
+
attributes:
|
|
22
|
+
label: Alternatives considered
|
|
23
|
+
validations:
|
|
24
|
+
required: false
|
|
25
|
+
- type: checkboxes
|
|
26
|
+
id: contribution
|
|
27
|
+
attributes:
|
|
28
|
+
label: Contribution
|
|
29
|
+
options:
|
|
30
|
+
- label: I'd be willing to submit a PR for this
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
{{What does this PR do, in 1-2 sentences?}}
|
|
3
|
+
|
|
4
|
+
## Related issue
|
|
5
|
+
Closes #{{issue_number}}
|
|
6
|
+
|
|
7
|
+
## Changes
|
|
8
|
+
- {{change 1}}
|
|
9
|
+
- {{change 2}}
|
|
10
|
+
|
|
11
|
+
## Testing
|
|
12
|
+
{{How was this tested? Include commands run.}}
|
|
13
|
+
|
|
14
|
+
## Checklist
|
|
15
|
+
- [ ] Tests added/updated
|
|
16
|
+
- [ ] Docs updated
|
|
17
|
+
- [ ] Changelog entry added
|
|
18
|
+
- [ ] No unrelated changes
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
pages: write
|
|
11
|
+
id-token: write
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: pages
|
|
15
|
+
cancel-in-progress: false
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v7
|
|
22
|
+
- uses: astral-sh/setup-uv@v8.3.2
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.12"
|
|
25
|
+
enable-cache: true
|
|
26
|
+
- name: Install docs dependencies
|
|
27
|
+
run: uv sync --group docs --no-dev
|
|
28
|
+
- name: Build site
|
|
29
|
+
run: uv run mkdocs build --strict
|
|
30
|
+
- uses: actions/configure-pages@v6
|
|
31
|
+
- uses: actions/upload-pages-artifact@v5
|
|
32
|
+
with:
|
|
33
|
+
path: site
|
|
34
|
+
|
|
35
|
+
deploy:
|
|
36
|
+
needs: build
|
|
37
|
+
runs-on: ubuntu-latest
|
|
38
|
+
environment:
|
|
39
|
+
name: github-pages
|
|
40
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
41
|
+
steps:
|
|
42
|
+
- id: deployment
|
|
43
|
+
uses: actions/deploy-pages@v5
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Publishes carrel to PyPI via Trusted Publishing (OIDC — no API token).
|
|
2
|
+
# Fires only when a GitHub Release is published (release timing is the
|
|
3
|
+
# operator's). Requires the pending-publisher entry on pypi.org:
|
|
4
|
+
# project: carrel · owner: FirstCastSolutions423 · repo: carrel
|
|
5
|
+
# workflow: publish.yml · environment: pypi
|
|
6
|
+
name: Publish to PyPI
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
release:
|
|
10
|
+
types: [published]
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
publish:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
environment: pypi
|
|
16
|
+
permissions:
|
|
17
|
+
id-token: write
|
|
18
|
+
contents: read
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
- name: Build sdist and wheel
|
|
22
|
+
run: pipx run build
|
|
23
|
+
- name: Publish to PyPI (Trusted Publishing)
|
|
24
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v7
|
|
13
|
+
|
|
14
|
+
- name: Install external tools (full-capability run)
|
|
15
|
+
run: |
|
|
16
|
+
sudo apt-get update -q
|
|
17
|
+
sudo apt-get install -y -q --no-install-recommends \
|
|
18
|
+
pandoc poppler-utils qpdf ghostscript weasyprint \
|
|
19
|
+
tesseract-ocr ocrmypdf imagemagick libimage-exiftool-perl \
|
|
20
|
+
ffmpeg pngquant icoutils jq miller ripgrep espeak-ng gnupg
|
|
21
|
+
|
|
22
|
+
- name: Install uv
|
|
23
|
+
uses: astral-sh/setup-uv@v8.3.2
|
|
24
|
+
|
|
25
|
+
- name: Sync dependencies
|
|
26
|
+
run: uv sync
|
|
27
|
+
|
|
28
|
+
- name: Regenerate fixtures (idempotence check)
|
|
29
|
+
run: uv run python tests/fixtures/generate.py
|
|
30
|
+
|
|
31
|
+
- name: Run test suite
|
|
32
|
+
run: uv run pytest -q
|
|
33
|
+
|
|
34
|
+
- name: CLI smoke
|
|
35
|
+
run: |
|
|
36
|
+
uv run carrel --version
|
|
37
|
+
uv run carrel doctor
|
|
38
|
+
uv run carrel --json pack src/carrel/core --tree-only > /dev/null
|
|
39
|
+
|
|
40
|
+
test-minimal:
|
|
41
|
+
# degradation guard: no optional binaries installed at all
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v7
|
|
45
|
+
- uses: astral-sh/setup-uv@v8.3.2
|
|
46
|
+
- run: uv sync
|
|
47
|
+
- name: Suite must pass via skips, never crashes
|
|
48
|
+
run: uv run pytest -q
|
|
49
|
+
- name: doctor reports missing tools without failing
|
|
50
|
+
run: uv run carrel doctor
|
carrel-0.1.1/.gitignore
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## v0.1.1 — 2026-08-12
|
|
4
|
+
|
|
5
|
+
First PyPI release: `pip install carrel`, published from CI via PyPI Trusted
|
|
6
|
+
Publishing (.github/workflows/publish.yml, OIDC — no token). Repo-side
|
|
7
|
+
discoverability round: CODE_OF_CONDUCT, issue forms + PR template,
|
|
8
|
+
CITATION.cff, FUNDING.yml, Related-projects README section, repo homepage +
|
|
9
|
+
Discussions + social preview. No CLI behavior changes.
|
|
10
|
+
|
|
11
|
+
## v0.1.0 — 2026-07-16
|
|
12
|
+
|
|
13
|
+
Initial release: carrel CLI (23 commands), desk TUI, Claude Code plugin
|
|
14
|
+
marketplace (5 plugins), MCP server, docs package. Built 2026-07-16.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use this software, please cite it as below."
|
|
3
|
+
type: software
|
|
4
|
+
title: "carrel"
|
|
5
|
+
version: "0.1.0"
|
|
6
|
+
date-released: "2026-07-16"
|
|
7
|
+
authors:
|
|
8
|
+
- family-names: "Bearden"
|
|
9
|
+
given-names: "Colton"
|
|
10
|
+
repository-code: "https://github.com/FirstCastSolutions423/carrel"
|
|
11
|
+
url: "https://github.com/FirstCastSolutions423/carrel"
|
|
12
|
+
license: "MIT"
|
|
13
|
+
keywords:
|
|
14
|
+
- "claude-code"
|
|
15
|
+
- "claude-code-plugins"
|
|
16
|
+
- "cli"
|
|
17
|
+
- "file-management"
|
|
18
|
+
- "mcp"
|
carrel-0.1.1/CLAUDE.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Project CLAUDE.md — Local File Toolkit + Plugin Marketplace
|
|
2
|
+
|
|
3
|
+
**Resume from disk:** read `STATE.md` first — it always says what's done, what's in flight, and what's next. Decisions live in `docs/DECISIONS.md`.
|
|
4
|
+
|
|
5
|
+
## Product name — single source of truth
|
|
6
|
+
|
|
7
|
+
The product name, tagline, and version live ONLY in `product.json` at the repo root. Never hardcode the name in code. Docs/manifests may use the name in prose, but anything generated (CLI banner, `--version`, asset text) must read `product.json`. `scripts/finalize.sh` performs renames by updating `product.json` and regenerating derived references.
|
|
8
|
+
|
|
9
|
+
## Stack & layout
|
|
10
|
+
|
|
11
|
+
- Python ≥3.12 (dev box: 3.14), managed by **uv** (`pyproject.toml`, `uv run`, `uv sync`).
|
|
12
|
+
- Core library in `src/<pkg>/`; umbrella CLI entry in `pyproject.toml [project.scripts]`.
|
|
13
|
+
- All external binaries are called through the single adapter layer `src/<pkg>/adapters.py` — never `subprocess` directly from command modules. Adapters do capability detection.
|
|
14
|
+
- Repo root doubles as a Claude Code plugin marketplace: `.claude-plugin/marketplace.json` + `plugins/<name>/`.
|
|
15
|
+
|
|
16
|
+
## Coding standards
|
|
17
|
+
|
|
18
|
+
- Python: type hints on public functions, `pathlib.Path` over strings, no global state, f-strings, stdlib `argparse`-free — we use the CLI framework chosen in Phase 2 (see docs/ARCHITECTURE.md).
|
|
19
|
+
- Every CLI command MUST have: working `--help`, `--json` flag when output is data, ≥1 test, graceful degradation when an optional binary is missing (actionable message + install hint, exit code 3 — never a traceback, never a silent no-op).
|
|
20
|
+
- No stubs/TODO/placeholder code in shipped commands. Cut and document in `docs/FEATURES.md` instead.
|
|
21
|
+
- Wrap, don't rewrite: prefer proven libraries/binaries via the adapter layer; attribute in docs/LICENSES section.
|
|
22
|
+
|
|
23
|
+
## Exit code convention
|
|
24
|
+
|
|
25
|
+
- `0` success
|
|
26
|
+
- `1` general/unexpected error (message to stderr, no traceback unless `--debug`)
|
|
27
|
+
- `2` bad usage/arguments (argparse-style)
|
|
28
|
+
- `3` missing optional dependency (message names the binary + install hint)
|
|
29
|
+
- `4` input file not found / unreadable / unsupported type
|
|
30
|
+
- `5` operation produced no result (e.g., search with no hits when `--fail-empty`)
|
|
31
|
+
|
|
32
|
+
## Testing
|
|
33
|
+
|
|
34
|
+
- `uv run pytest` from repo root runs everything. Fixtures in `tests/fixtures/` (generated by `tests/fixtures/generate.py`; never hand-edit binaries).
|
|
35
|
+
- Tests that need an optional binary must skip (with reason) when it's absent, not fail.
|
|
36
|
+
|
|
37
|
+
## Subagent rules
|
|
38
|
+
|
|
39
|
+
Subagents: read your spec in `specs/`, respect your write boundary exactly, and report: files touched, tests written+run (with real output), deviations from spec, open issues. Claims are verified by execution — write tests that actually run.
|
|
40
|
+
|
|
41
|
+
## Git
|
|
42
|
+
|
|
43
|
+
- Branch `main`. Commits at phase gates `phase(N): ...` and waves `wave(N): ...`.
|
|
44
|
+
- Never commit generated junk (see .gitignore); fixtures ARE committed once generated.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
We as members, contributors, and maintainers pledge to make participation in carrel a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity/expression, experience level, nationality, personal appearance, race, religion, or sexual identity/orientation.
|
|
5
|
+
|
|
6
|
+
## Our Standards
|
|
7
|
+
Examples of behavior that contributes to a positive environment:
|
|
8
|
+
- Using welcoming and inclusive language
|
|
9
|
+
- Respecting differing viewpoints and experiences
|
|
10
|
+
- Gracefully accepting constructive criticism
|
|
11
|
+
- Focusing on what is best for the community
|
|
12
|
+
|
|
13
|
+
Examples of unacceptable behavior:
|
|
14
|
+
- Harassment, insults, or derogatory comments
|
|
15
|
+
- Public or private harassment
|
|
16
|
+
- Publishing others' private information without consent
|
|
17
|
+
|
|
18
|
+
## Enforcement
|
|
19
|
+
Instances of abusive behavior may be reported to inbox@coltonbearden.com. All complaints will be reviewed and investigated promptly and fairly.
|
|
20
|
+
|
|
21
|
+
This Code of Conduct is adapted from the [Contributor Covenant, version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html).
|
carrel-0.1.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Colton Bearden
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|