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.
Files changed (198) hide show
  1. carrel-0.1.1/.claude/agents/design-artist.md +15 -0
  2. carrel-0.1.1/.claude/agents/doc-smith.md +15 -0
  3. carrel-0.1.1/.claude/agents/integration-reviewer.md +13 -0
  4. carrel-0.1.1/.claude/agents/module-builder.md +17 -0
  5. carrel-0.1.1/.claude/agents/test-engineer.md +16 -0
  6. carrel-0.1.1/.claude-plugin/marketplace.json +57 -0
  7. carrel-0.1.1/.github/FUNDING.yml +2 -0
  8. carrel-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +53 -0
  9. carrel-0.1.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
  10. carrel-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
  11. carrel-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +18 -0
  12. carrel-0.1.1/.github/workflows/docs.yml +43 -0
  13. carrel-0.1.1/.github/workflows/publish.yml +24 -0
  14. carrel-0.1.1/.github/workflows/test.yml +50 -0
  15. carrel-0.1.1/.gitignore +13 -0
  16. carrel-0.1.1/CHANGELOG.md +14 -0
  17. carrel-0.1.1/CITATION.cff +18 -0
  18. carrel-0.1.1/CLAUDE.md +44 -0
  19. carrel-0.1.1/CODE_OF_CONDUCT.md +21 -0
  20. carrel-0.1.1/LICENSE +21 -0
  21. carrel-0.1.1/PKG-INFO +152 -0
  22. carrel-0.1.1/README.md +134 -0
  23. carrel-0.1.1/STATE.md +25 -0
  24. carrel-0.1.1/assets/banner.svg +63 -0
  25. carrel-0.1.1/assets/demo/desk-tour.gif +0 -0
  26. carrel-0.1.1/assets/demo/pack.gif +0 -0
  27. carrel-0.1.1/assets/demo/redact-proof.gif +0 -0
  28. carrel-0.1.1/assets/logo.svg +28 -0
  29. carrel-0.1.1/assets/palette.svg +48 -0
  30. carrel-0.1.1/assets/social-preview.svg +104 -0
  31. carrel-0.1.1/demo/README.md +16 -0
  32. carrel-0.1.1/demo/desk-tour.tape +62 -0
  33. carrel-0.1.1/demo/pack.tape +23 -0
  34. carrel-0.1.1/demo/redact-proof.tape +38 -0
  35. carrel-0.1.1/docs/AGENTS.md +113 -0
  36. carrel-0.1.1/docs/ARCHITECTURE.md +110 -0
  37. carrel-0.1.1/docs/BRAND.md +124 -0
  38. carrel-0.1.1/docs/BUILD_PLAN.md +48 -0
  39. carrel-0.1.1/docs/CONFIGURATION.md +102 -0
  40. carrel-0.1.1/docs/CONTRIBUTING.md +93 -0
  41. carrel-0.1.1/docs/DECISIONS.md +19 -0
  42. carrel-0.1.1/docs/ENVIRONMENT.md +62 -0
  43. carrel-0.1.1/docs/FEATURES.md +46 -0
  44. carrel-0.1.1/docs/HOW_THIS_WAS_BUILT.md +88 -0
  45. carrel-0.1.1/docs/INSTALL.md +192 -0
  46. carrel-0.1.1/docs/MARKETPLACE.md +128 -0
  47. carrel-0.1.1/docs/PLUGIN_AUTHORING.md +148 -0
  48. carrel-0.1.1/docs/QUICKSTART.md +220 -0
  49. carrel-0.1.1/docs/REFERENCE.md +918 -0
  50. carrel-0.1.1/docs/TEST_REPORT.md +76 -0
  51. carrel-0.1.1/docs/TROUBLESHOOTING.md +159 -0
  52. carrel-0.1.1/docs/VISION.md +43 -0
  53. carrel-0.1.1/docs/assets/logo.svg +28 -0
  54. carrel-0.1.1/docs/index.md +27 -0
  55. carrel-0.1.1/docs/stylesheets/carrel.css +73 -0
  56. carrel-0.1.1/examples/cookbook/01-scan-to-searchable-notes.sh +39 -0
  57. carrel-0.1.1/examples/cookbook/02-watch-auto-thumbs.sh +41 -0
  58. carrel-0.1.1/examples/cookbook/03-dedupe-sweep.sh +51 -0
  59. carrel-0.1.1/examples/cookbook/04-redact-pii.sh +55 -0
  60. carrel-0.1.1/examples/cookbook/05-conversion-relay.sh +49 -0
  61. carrel-0.1.1/examples/cookbook/06-form-roundtrip.sh +57 -0
  62. carrel-0.1.1/examples/cookbook/07-audiobook-from-markdown.sh +31 -0
  63. carrel-0.1.1/examples/cookbook/08-pack-repo-for-claude.sh +72 -0
  64. carrel-0.1.1/examples/cookbook/09-provenance-chain.sh +55 -0
  65. carrel-0.1.1/examples/cookbook/README.md +30 -0
  66. carrel-0.1.1/mkdocs.yml +69 -0
  67. carrel-0.1.1/plugins/carrel-agent/.claude-plugin/plugin.json +8 -0
  68. carrel-0.1.1/plugins/carrel-agent/.mcp.json +8 -0
  69. carrel-0.1.1/plugins/carrel-agent/agents/file-librarian.md +18 -0
  70. carrel-0.1.1/plugins/carrel-agent/hooks/hooks.json +15 -0
  71. carrel-0.1.1/plugins/carrel-agent/scripts/reindex.sh +49 -0
  72. carrel-0.1.1/plugins/carrel-agent/skills/agent-workflows/SKILL.md +44 -0
  73. carrel-0.1.1/plugins/carrel-convert/.claude-plugin/plugin.json +8 -0
  74. carrel-0.1.1/plugins/carrel-convert/agents/doc-converter.md +17 -0
  75. carrel-0.1.1/plugins/carrel-convert/commands/audiobook.md +25 -0
  76. carrel-0.1.1/plugins/carrel-convert/commands/convert.md +27 -0
  77. carrel-0.1.1/plugins/carrel-convert/commands/ocr.md +24 -0
  78. carrel-0.1.1/plugins/carrel-convert/commands/thumb.md +26 -0
  79. carrel-0.1.1/plugins/carrel-inspect/.claude-plugin/plugin.json +8 -0
  80. carrel-0.1.1/plugins/carrel-inspect/commands/diff.md +24 -0
  81. carrel-0.1.1/plugins/carrel-inspect/commands/inspect.md +21 -0
  82. carrel-0.1.1/plugins/carrel-inspect/commands/pack.md +29 -0
  83. carrel-0.1.1/plugins/carrel-inspect/commands/search.md +27 -0
  84. carrel-0.1.1/plugins/carrel-inspect/skills/context-packing/SKILL.md +50 -0
  85. carrel-0.1.1/plugins/carrel-organize/.claude-plugin/plugin.json +8 -0
  86. carrel-0.1.1/plugins/carrel-organize/commands/dedupe.md +24 -0
  87. carrel-0.1.1/plugins/carrel-organize/commands/note-file.md +24 -0
  88. carrel-0.1.1/plugins/carrel-organize/commands/organize.md +25 -0
  89. carrel-0.1.1/plugins/carrel-organize/commands/tag.md +24 -0
  90. carrel-0.1.1/plugins/carrel-watch/.claude-plugin/plugin.json +8 -0
  91. carrel-0.1.1/plugins/carrel-watch/commands/watch-folder.md +26 -0
  92. carrel-0.1.1/plugins/carrel-watch/skills/watch-automation/SKILL.md +48 -0
  93. carrel-0.1.1/product.json +13 -0
  94. carrel-0.1.1/pyproject.toml +36 -0
  95. carrel-0.1.1/scripts/finalize.sh +159 -0
  96. carrel-0.1.1/scripts/rename_product.py +105 -0
  97. carrel-0.1.1/scripts/sync_product.py +42 -0
  98. carrel-0.1.1/snippets/README.md +27 -0
  99. carrel-0.1.1/snippets/csv-to-report.sh +34 -0
  100. carrel-0.1.1/snippets/find-untagged.py +78 -0
  101. carrel-0.1.1/snippets/inbox-triage.sh +32 -0
  102. carrel-0.1.1/snippets/pack-repo-for-claude.sh +38 -0
  103. carrel-0.1.1/snippets/pdf-to-searchable.sh +36 -0
  104. carrel-0.1.1/snippets/redact-pii.sh +35 -0
  105. carrel-0.1.1/snippets/sign-and-verify.sh +42 -0
  106. carrel-0.1.1/snippets/watch-thumbs.sh +32 -0
  107. carrel-0.1.1/specs/00-core.md +19 -0
  108. carrel-0.1.1/specs/01-convert.md +23 -0
  109. carrel-0.1.1/specs/02-ocr.md +15 -0
  110. carrel-0.1.1/specs/03-inspect-diff.md +20 -0
  111. carrel-0.1.1/specs/04-edit.md +14 -0
  112. carrel-0.1.1/specs/05-pack.md +20 -0
  113. carrel-0.1.1/specs/06-index-search-tag-note.md +23 -0
  114. carrel-0.1.1/specs/07-thumb-images-proof-color.md +23 -0
  115. carrel-0.1.1/specs/08-watch-organize-dedupe.md +18 -0
  116. carrel-0.1.1/specs/09-audiobook.md +16 -0
  117. carrel-0.1.1/specs/10-redact-sign-form.md +23 -0
  118. carrel-0.1.1/specs/11-desk-tui.md +20 -0
  119. carrel-0.1.1/specs/12-marketplace-plugins.md +21 -0
  120. carrel-0.1.1/specs/13-mcp-doctor.md +18 -0
  121. carrel-0.1.1/specs/14-fixtures.md +21 -0
  122. carrel-0.1.1/src/carrel/__init__.py +6 -0
  123. carrel-0.1.1/src/carrel/_product.py +15 -0
  124. carrel-0.1.1/src/carrel/cli.py +110 -0
  125. carrel-0.1.1/src/carrel/commands/__init__.py +0 -0
  126. carrel-0.1.1/src/carrel/commands/audiobook.py +509 -0
  127. carrel-0.1.1/src/carrel/commands/color.py +210 -0
  128. carrel-0.1.1/src/carrel/commands/convert.py +564 -0
  129. carrel-0.1.1/src/carrel/commands/dedupe.py +212 -0
  130. carrel-0.1.1/src/carrel/commands/desk.py +36 -0
  131. carrel-0.1.1/src/carrel/commands/diff.py +410 -0
  132. carrel-0.1.1/src/carrel/commands/doctor.py +197 -0
  133. carrel-0.1.1/src/carrel/commands/edit.py +522 -0
  134. carrel-0.1.1/src/carrel/commands/extract_images.py +190 -0
  135. carrel-0.1.1/src/carrel/commands/form.py +314 -0
  136. carrel-0.1.1/src/carrel/commands/index.py +151 -0
  137. carrel-0.1.1/src/carrel/commands/inspect.py +365 -0
  138. carrel-0.1.1/src/carrel/commands/mcp.py +288 -0
  139. carrel-0.1.1/src/carrel/commands/note.py +201 -0
  140. carrel-0.1.1/src/carrel/commands/ocr.py +209 -0
  141. carrel-0.1.1/src/carrel/commands/organize.py +191 -0
  142. carrel-0.1.1/src/carrel/commands/pack.py +655 -0
  143. carrel-0.1.1/src/carrel/commands/proof.py +204 -0
  144. carrel-0.1.1/src/carrel/commands/redact.py +317 -0
  145. carrel-0.1.1/src/carrel/commands/search.py +118 -0
  146. carrel-0.1.1/src/carrel/commands/sign.py +313 -0
  147. carrel-0.1.1/src/carrel/commands/tag.py +136 -0
  148. carrel-0.1.1/src/carrel/commands/thumb.py +143 -0
  149. carrel-0.1.1/src/carrel/commands/watch.py +226 -0
  150. carrel-0.1.1/src/carrel/core/__init__.py +0 -0
  151. carrel-0.1.1/src/carrel/core/adapters.py +120 -0
  152. carrel-0.1.1/src/carrel/core/db.py +196 -0
  153. carrel-0.1.1/src/carrel/core/filetypes.py +84 -0
  154. carrel-0.1.1/src/carrel/core/output.py +55 -0
  155. carrel-0.1.1/src/carrel/core/textextract.py +121 -0
  156. carrel-0.1.1/src/carrel/desk/__init__.py +5 -0
  157. carrel-0.1.1/src/carrel/desk/app.py +546 -0
  158. carrel-0.1.1/src/carrel/desk/styles.tcss +132 -0
  159. carrel-0.1.1/tests/conftest.py +47 -0
  160. carrel-0.1.1/tests/fixtures/b.pdf +74 -0
  161. carrel-0.1.1/tests/fixtures/form.pdf +0 -0
  162. carrel-0.1.1/tests/fixtures/generate.py +388 -0
  163. carrel-0.1.1/tests/fixtures/records.json +58 -0
  164. carrel-0.1.1/tests/fixtures/sample-copy.jpg +0 -0
  165. carrel-0.1.1/tests/fixtures/sample-resized.jpg +0 -0
  166. carrel-0.1.1/tests/fixtures/sample.csv +21 -0
  167. carrel-0.1.1/tests/fixtures/sample.html +32 -0
  168. carrel-0.1.1/tests/fixtures/sample.ico +0 -0
  169. carrel-0.1.1/tests/fixtures/sample.jpg +0 -0
  170. carrel-0.1.1/tests/fixtures/sample.json +45 -0
  171. carrel-0.1.1/tests/fixtures/sample.md +30 -0
  172. carrel-0.1.1/tests/fixtures/sample.png +0 -0
  173. carrel-0.1.1/tests/fixtures/sample.txt +14 -0
  174. carrel-0.1.1/tests/fixtures/sample.xml +29 -0
  175. carrel-0.1.1/tests/fixtures/scanned.pdf +0 -0
  176. carrel-0.1.1/tests/fixtures/scanned.png +0 -0
  177. carrel-0.1.1/tests/fixtures/text+image.pdf +104 -0
  178. carrel-0.1.1/tests/test_audiobook.py +320 -0
  179. carrel-0.1.1/tests/test_convert.py +442 -0
  180. carrel-0.1.1/tests/test_core_adapters.py +113 -0
  181. carrel-0.1.1/tests/test_core_cli.py +75 -0
  182. carrel-0.1.1/tests/test_core_db.py +128 -0
  183. carrel-0.1.1/tests/test_core_filetypes.py +105 -0
  184. carrel-0.1.1/tests/test_core_textextract.py +113 -0
  185. carrel-0.1.1/tests/test_desk.py +154 -0
  186. carrel-0.1.1/tests/test_desk_db_cmds.py +346 -0
  187. carrel-0.1.1/tests/test_diff.py +281 -0
  188. carrel-0.1.1/tests/test_edit.py +411 -0
  189. carrel-0.1.1/tests/test_images_cmds.py +449 -0
  190. carrel-0.1.1/tests/test_inspect.py +208 -0
  191. carrel-0.1.1/tests/test_marketplace.py +275 -0
  192. carrel-0.1.1/tests/test_mcp_doctor.py +325 -0
  193. carrel-0.1.1/tests/test_ocr.py +238 -0
  194. carrel-0.1.1/tests/test_pack.py +291 -0
  195. carrel-0.1.1/tests/test_product_sync.py +28 -0
  196. carrel-0.1.1/tests/test_redact_sign_form.py +560 -0
  197. carrel-0.1.1/tests/test_watch_org_dedupe.py +406 -0
  198. 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,2 @@
1
+ # Renders the Sponsor button once the account is enrolled in GitHub Sponsors.
2
+ github: [coltonbearden]
@@ -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,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Discussions / Q&A
4
+ url: https://github.com/FirstCastSolutions423/carrel/discussions
5
+ about: Ask questions and discuss ideas here rather than filing an issue.
@@ -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
@@ -0,0 +1,13 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .venv/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ dist/
7
+ build/
8
+ *.egg-info/
9
+ .coverage
10
+ node_modules/
11
+ .carrel/
12
+ carrel-out/
13
+ site/
@@ -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.