@macintacos/caret 0.8.2 → 0.10.0

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 (101) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +59 -47
  3. package/commands/discovery.md +4 -4
  4. package/dist/cli.js +341 -114
  5. package/opencode/caret.plugin.ts +91 -30
  6. package/opencode/commands/discovery.md +4 -4
  7. package/package.json +3 -2
  8. package/ui/dist/assets/{angular-html-BpJgIORc.js → angular-html-166Zp_qr.js} +1 -1
  9. package/ui/dist/assets/{angular-ts-Dw7jt6H3.js → angular-ts-DJf9y5RJ.js} +1 -1
  10. package/ui/dist/assets/{apl-DscWKpqG.js → apl-BRtDRKgK.js} +1 -1
  11. package/ui/dist/assets/{astro-M2TfAY-4.js → astro-B9_p1ZlX.js} +1 -1
  12. package/ui/dist/assets/{blade-BKZbiCTN.js → blade-DUQgH5UI.js} +1 -1
  13. package/ui/dist/assets/{c-vSGY_oaW.js → c-DkmnqVR5.js} +1 -1
  14. package/ui/dist/assets/{cobol-D_b85OID.js → cobol-D_DeO3_Y.js} +1 -1
  15. package/ui/dist/assets/{coffee-yR0vOcDv.js → coffee-BlbmSk0s.js} +1 -1
  16. package/ui/dist/assets/{cpp-B9n-PBog.js → cpp-C-2HRkcc.js} +1 -1
  17. package/ui/dist/assets/{crystal-DlMW4K68.js → crystal-CpLflAjJ.js} +1 -1
  18. package/ui/dist/assets/{css-eR_OGyvz.js → css-BVuUbqzr.js} +1 -1
  19. package/ui/dist/assets/{dist-Dw6gzrLi.js → dist-B9dAYtn2.js} +1 -1
  20. package/ui/dist/assets/{dist-BOlD4h0w.js → dist-BtZ4f0sy.js} +1 -1
  21. package/ui/dist/assets/{dist-BDTKIP5U.js → dist-BxKUx0iz.js} +1 -1
  22. package/ui/dist/assets/{dist-C-9GQ1Zp.js → dist-CmhY3KNJ.js} +1 -1
  23. package/ui/dist/assets/{dist-BVU_DRtk.js → dist-D-vK_12F.js} +1 -1
  24. package/ui/dist/assets/{dist-z5ayJUeC.js → dist-D1hccSXB.js} +1 -1
  25. package/ui/dist/assets/{dist-fegIt7sh.js → dist-DWjpoB5Q.js} +1 -1
  26. package/ui/dist/assets/{dist-Cu14OUmD.js → dist-Dd0x4Lgi.js} +1 -1
  27. package/ui/dist/assets/{dist-Bq4ybaGS.js → dist-Deoj7mVd.js} +1 -1
  28. package/ui/dist/assets/{dist-CA0N05NE.js → dist-DtJjv6C-.js} +1 -1
  29. package/ui/dist/assets/{dist-9nsJ_jfT.js → dist-DyJyAkU7.js} +1 -1
  30. package/ui/dist/assets/{dist-YE2Uj3eD.js → dist-DzbZtok6.js} +1 -1
  31. package/ui/dist/assets/{dist-CLxm4mmq.js → dist-Jn2c79bF.js} +1 -1
  32. package/ui/dist/assets/{dist--nCimyFJ.js → dist-WBctQMJH.js} +1 -1
  33. package/ui/dist/assets/{dist-DpjGqY_j.js → dist-nPPt0-3f.js} +1 -1
  34. package/ui/dist/assets/{dist-ZIUMZKKQ.js → dist-qtw8Ijdq.js} +1 -1
  35. package/ui/dist/assets/{dist-EFvLx_Vg.js → dist-vj9fsPbi.js} +1 -1
  36. package/ui/dist/assets/{edge-CIm6BqT_.js → edge-Bvaq3vgu.js} +1 -1
  37. package/ui/dist/assets/{elixir-CGFSlFw_.js → elixir-AtYS8b3T.js} +1 -1
  38. package/ui/dist/assets/{elm-BSew7n5O.js → elm-DiPfkLEI.js} +1 -1
  39. package/ui/dist/assets/{erb-BkgqIZze.js → erb-DFPsOHl7.js} +1 -1
  40. package/ui/dist/assets/{git-rebase-BUYBBmxS.js → git-rebase-DOQhjkkB.js} +1 -1
  41. package/ui/dist/assets/{glimmer-js-BGag6-lb.js → glimmer-js-DnsoKoXj.js} +1 -1
  42. package/ui/dist/assets/{glimmer-ts-DDMkKLl0.js → glimmer-ts-efCSUcGf.js} +1 -1
  43. package/ui/dist/assets/{glsl-DORy1f5o.js → glsl-8mp3VUjq.js} +1 -1
  44. package/ui/dist/assets/{graphql-CQdH4wHz.js → graphql-NvuaWD7i.js} +1 -1
  45. package/ui/dist/assets/{hack-DEMoudQX.js → hack-BJ5H84Wq.js} +1 -1
  46. package/ui/dist/assets/{haml-5F6bZL9O.js → haml-Dzosfq8Y.js} +1 -1
  47. package/ui/dist/assets/{handlebars-CJrxVb1S.js → handlebars-tKuTe0db.js} +1 -1
  48. package/ui/dist/assets/{html-DnBxHgUN.js → html-JqbgrVrs.js} +1 -1
  49. package/ui/dist/assets/{html-derivative-oO1_x7AL.js → html-derivative-0a3abtuv.js} +1 -1
  50. package/ui/dist/assets/{http-x7FjaFyJ.js → http-DMJqqRWL.js} +1 -1
  51. package/ui/dist/assets/{hurl-C3DS1OMk.js → hurl-N2MzWbSO.js} +1 -1
  52. package/ui/dist/assets/index-BMSMV2hN.css +1 -0
  53. package/ui/dist/assets/index-C_IKB4Ku.js +2501 -0
  54. package/ui/dist/assets/{java-C2C6Komk.js → java-B3EVVFFi.js} +1 -1
  55. package/ui/dist/assets/{javascript-DEpYVqmG.js → javascript-Y0fZ_N_R.js} +1 -1
  56. package/ui/dist/assets/{jinja-BNfhmgIR.js → jinja-BD-QmqJ0.js} +1 -1
  57. package/ui/dist/assets/{jison-ooxyiW2g.js → jison-BK-X5L2R.js} +1 -1
  58. package/ui/dist/assets/{json-Dx2gR8Lp.js → json-DlHOOSIb.js} +1 -1
  59. package/ui/dist/assets/{jsx-BZCBHgZQ.js → jsx-XohAHRMn.js} +1 -1
  60. package/ui/dist/assets/{julia-kkZGM_a9.js → julia-BBLrPT8A.js} +1 -1
  61. package/ui/dist/assets/{just-Cjde5dAJ.js → just-DEry_8sa.js} +1 -1
  62. package/ui/dist/assets/{latex-D3gXuVSc.js → latex-BuCB4qwR.js} +1 -1
  63. package/ui/dist/assets/{liquid-DmlvH9NM.js → liquid-ZtUmbkDf.js} +1 -1
  64. package/ui/dist/assets/{lua-pCB9FV-x.js → lua-BmOQjHgA.js} +1 -1
  65. package/ui/dist/assets/{marko-DwItdpjh.js → marko-BXMGyPGo.js} +1 -1
  66. package/ui/dist/assets/{mdc-SSlXAY7R.js → mdc-Byn32K04.js} +1 -1
  67. package/ui/dist/assets/{nginx-DwgR7vzY.js → nginx-BrQiZd4C.js} +1 -1
  68. package/ui/dist/assets/{nim-BB87Orsk.js → nim-Ceo1IkbE.js} +1 -1
  69. package/ui/dist/assets/{perl-BEwuOnSP.js → perl-Bum057xI.js} +1 -1
  70. package/ui/dist/assets/{php-B7dC7_E_.js → php-DcJ8ynWT.js} +1 -1
  71. package/ui/dist/assets/{pug-cCzod0Ou.js → pug-CA9Zezth.js} +1 -1
  72. package/ui/dist/assets/{qml-DlvhYl5u.js → qml-BHS1pXn9.js} +1 -1
  73. package/ui/dist/assets/{r-gkifu9rO.js → r-B4aRkCWL.js} +1 -1
  74. package/ui/dist/assets/{razor-CQ3nK7LT.js → razor-BXH-K44T.js} +1 -1
  75. package/ui/dist/assets/{regexp-BfKjRa3b.js → regexp-DUs7aoKy.js} +1 -1
  76. package/ui/dist/assets/{rst-CaTCPdHP.js → rst-DCrs7vP-.js} +1 -1
  77. package/ui/dist/assets/{ruby-Qi28elVh.js → ruby-0-lN-lO6.js} +1 -1
  78. package/ui/dist/assets/{sas-C0-zyShz.js → sas-B-GmRmDQ.js} +1 -1
  79. package/ui/dist/assets/{scss-B3v_ewrQ.js → scss-oB6C5dt1.js} +1 -1
  80. package/ui/dist/assets/{shellscript-CAX3EBQC.js → shellscript-BDueQ3Pr.js} +1 -1
  81. package/ui/dist/assets/{shellsession-BbCaojs-.js → shellsession-snwU-yjZ.js} +1 -1
  82. package/ui/dist/assets/{soy-C_L1i27o.js → soy-1UzSzCS_.js} +1 -1
  83. package/ui/dist/assets/{sql-DfQzhZMD.js → sql-_8rHrLe0.js} +1 -1
  84. package/ui/dist/assets/{stata-wKRkbYfj.js → stata-BFBQv4-R.js} +1 -1
  85. package/ui/dist/assets/{surrealql-r1cCvWUu.js → surrealql-C-hPyRoi.js} +1 -1
  86. package/ui/dist/assets/{svelte-QE15YUDB.js → svelte-COzcYWbs.js} +1 -1
  87. package/ui/dist/assets/{templ-DPDxNWwC.js → templ-CIF5RvVU.js} +1 -1
  88. package/ui/dist/assets/{tex-BFuhjY1V.js → tex-DiIjyX_E.js} +1 -1
  89. package/ui/dist/assets/{ts-tags-BUMMUMV3.js → ts-tags-Bb-cll5a.js} +1 -1
  90. package/ui/dist/assets/{tsx-BL1rdCtn.js → tsx-B_TJQczU.js} +1 -1
  91. package/ui/dist/assets/{twig-CFLDJ71e.js → twig-B2bev-dI.js} +1 -1
  92. package/ui/dist/assets/{typescript-Duv2diAv.js → typescript-Ii543U_f.js} +1 -1
  93. package/ui/dist/assets/{vue-DkO776Yn.js → vue-CGYOL_ei.js} +1 -1
  94. package/ui/dist/assets/{vue-html-9RYUFMtL.js → vue-html-DJiTs0pH.js} +1 -1
  95. package/ui/dist/assets/{vue-vine-C3meWGQa.js → vue-vine-BWgBzdhj.js} +1 -1
  96. package/ui/dist/assets/{xml-ClHTQj3q.js → xml-wwBhpto-.js} +1 -1
  97. package/ui/dist/assets/{xsl-D1Lt0UF-.js → xsl-ia_QpSvH.js} +1 -1
  98. package/ui/dist/assets/{yaml-BhUwnbwF.js → yaml-DPR0vpXc.js} +1 -1
  99. package/ui/dist/index.html +2 -2
  100. package/ui/dist/assets/index-CDxgCCFg.js +0 -1164
  101. package/ui/dist/assets/index-FuUBXrz0.css +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "caret",
3
- "version": "0.8.2",
3
+ "version": "0.10.0",
4
4
  "description": "Review, annotate, and approve Claude Code plans in a local web UI.",
5
5
  "author": { "name": "macintacos" },
6
6
  "homepage": "https://github.com/macintacos/caret",
package/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # 🥕 caret
2
2
 
3
- > ⚠️ **Prototype.** caret is an early prototype and may change substantially over the next
4
- > little while — interfaces, hooks, storage, and the install flow are all still settling.
5
- > Expect rough edges and breaking changes.
3
+ > [!WARNING]
4
+ > caret is an early prototype and may change substantially over the next little while —
5
+ > interfaces, hooks, storage, and the install flow are all still settling. Expect rough
6
+ > edges and breaking changes.
6
7
 
7
8
  caret is a Claude Code (and OpenCode) plugin that replaces the terminal plan-approval
8
9
  prompt with a local web UI. When your agent presents a plan, caret opens it in your
@@ -21,44 +22,53 @@ Want to develop caret rather than use it? Start with [CONTRIBUTING.md](CONTRIBUT
21
22
 
22
23
  caret needs [`bun`](https://bun.sh) on your `PATH` — it runs from a `bun` bundle.
23
24
 
25
+ > [!NOTE]
26
+ > caret is **macOS-first**; Linux and Windows are best-effort. See
27
+ > [`doc/CONFIGURING.md`](doc/CONFIGURING.md#platform-support) for what differs on each
28
+ > platform and what to fall back on.
29
+
24
30
  ```sh
25
31
  bunx --no-cache @macintacos/caret@latest install
26
32
  ```
27
33
 
28
- That one command is the whole install. It detects which agents you have —
29
- [Claude Code](https://claude.com/claude-code), [OpenCode](https://opencode.ai), or both —
30
- asks which of them to install into, and registers the _published_ caret with each:
31
- prebuilt artifacts, the `/caret:*` slash commands, and the rumdl plan formatter, with no
32
- `git clone` and no compile step. Where it can't ask — off a terminal — it installs into
33
- every agent it detected. `--target claude` or `--target claude,opencode` pins the agents
34
- non-interactively, and `--dry-run` previews the run without changing anything.
35
-
36
- Restart the agent afterward — OpenCode installs the plugin package on its next start —
37
- then try `/caret:demo`, which presents a short fake plan to exercise the flow.
34
+ That is the whole install — no `git clone`, no compile step. It detects which agents you
35
+ have — [Claude Code](https://claude.com/claude-code), [OpenCode](https://opencode.ai), or
36
+ both — asks which of them to install into, and registers the _published_ caret with each:
37
+ prebuilt artifacts, the `/caret:*` slash commands, and the [rumdl](https://rumdl.dev/)
38
+ plan formatter. Where it can't ask — off a terminal — it installs into every agent it
39
+ detected.
38
40
 
39
- ### Updating and uninstalling
41
+ Two steps finish the job:
40
42
 
41
- **Update.** One command for every agent:
43
+ 1. **Restart the agent.** OpenCode installs the plugin package on its next start.
44
+ 2. **Run `/caret:demo`.** It presents a short fake plan, so you can exercise the whole
45
+ flow before a real one arrives.
42
46
 
43
- ```sh
44
- bunx --no-cache @macintacos/caret@latest install --refresh
45
- ```
47
+ | Flag | What it does |
48
+ | ------------------- | ----------------------------------------------------------------- |
49
+ | `--target <agents>` | Skip the chooser: `claude`, `opencode`, or both, comma-separated. |
50
+ | `--dry-run` | Preview the run without changing anything. |
51
+ | `--refresh` | Update an existing install. |
52
+ | `--uninstall` | Remove caret, offering the same agent chooser. |
46
53
 
47
- `--target` pins the agents the same way it does on install, and restarting each one
48
- applies the update. In OpenCode, caret toasts you at startup when a newer release is out;
49
- a plain `install` at a terminal runs its own check against npm and asks before taking it.
50
- See [`doc/ADVANCED.md`](doc/ADVANCED.md#how-it-works) for the by-hand equivalents and for
51
- pinning a version in OpenCode's config.
54
+ ### Updating and uninstalling
52
55
 
53
- **Uninstall.** The same command, one flag:
56
+ Both are the install command with one flag:
54
57
 
55
58
  ```sh
56
- bunx --no-cache @macintacos/caret@latest install --uninstall
59
+ bunx --no-cache @macintacos/caret@latest install --refresh # update
60
+ bunx --no-cache @macintacos/caret@latest install --uninstall # remove
57
61
  ```
58
62
 
59
- It offers the same chooser in reverse, and `--target` pins it the same way. See
60
- [`doc/ADVANCED.md`](doc/ADVANCED.md#how-it-works) for what each agent's install touches
61
- and how the integrations work.
63
+ `--target` pins the agents on both, exactly as it does on a fresh install. Restarting each
64
+ agent applies an update. In OpenCode, caret toasts you at startup when a newer release is
65
+ out; a plain `install` at a terminal runs its own check against npm and asks before taking
66
+ it.
67
+
68
+ See [the OpenCode adapter](doc/ARCHITECTURE.md#the-opencode-adapter) for the by-hand
69
+ equivalents, for pinning a version in OpenCode's `plugin` array, and for what each agent's
70
+ install touches; [the Claude Code adapter](doc/ARCHITECTURE.md#the-claude-code-adapter)
71
+ covers the hooks caret registers there.
62
72
 
63
73
  ## Using caret
64
74
 
@@ -72,39 +82,41 @@ prompt. There you:
72
82
  auto mode) or **Request changes**, which sends your comments back to the agent to revise
73
83
  and re-present.
74
84
 
75
- A single local daemon serves every session, so concurrent plans queue up in one tab behind
76
- a switcher.
85
+ > [!TIP]
86
+ > **In OpenCode**, you don't have to wait to be intercepted: caret registers a
87
+ > `caret_review_plan` tool your agent can call directly, so a skill of your own can route
88
+ > its approval step through the same review UI. Claude Code has no equivalent — see
89
+ > [`doc/ARCHITECTURE.md`](doc/ARCHITECTURE.md#calling-the-review-tool-from-your-own-skill).
77
90
 
78
91
  ## Configuration
79
92
 
80
- caret runs with sensible defaults and needs no configuration. To tune it, it reads an
81
- optional `config.toml` and `CARET_*` environment variables (for example the daemon port or
82
- the review timeout); logs are written raw by default. The full list of keys, their
83
- defaults, and the environment variables is in
84
- [`doc/ADVANCED.md`](doc/ADVANCED.md#configuration).
93
+ caret runs with sensible defaults and needs no configuration. To tune it — the daemon
94
+ port, the review timeout, the log level — it reads an optional `config.toml` and `CARET_*`
95
+ environment variables. Every key, every variable, and their defaults are in
96
+ [`doc/CONFIGURING.md`](doc/CONFIGURING.md).
85
97
 
86
- ## Reporting bugs
98
+ ## Diagnostics
87
99
 
88
100
  - `/caret:discovery` prints a one-shot, read-only diagnostics snapshot of your install —
89
- ready to paste into a bug report.
101
+ always redacted, and it never contains plan, prompt, or feedback bodies, nor any log
102
+ contents.
90
103
  - `/caret:debug` reviews the current session's plans and recent errors.
91
104
 
92
- Details, plus how to scrub logs with `caret redact`, are in
93
- [`doc/ADVANCED.md`](doc/ADVANCED.md#logging--debugging).
105
+ Logs are written raw by default. `caret redact` writes scrubbed `*.redacted.log` copies
106
+ alongside them — paste one of those into a chat, a gist, or an AI assistant, never the
107
+ original. [`doc/RUNNING.md`](doc/RUNNING.md#logging--debugging) says where they live.
94
108
 
95
- ## Platform support
109
+ ## Documentation
96
110
 
97
- caret is **macOS-first**; Linux and Windows are best-effort. See
98
- [`doc/ADVANCED.md`](doc/ADVANCED.md#platform-support) for the details.
111
+ [`doc/README.md`](doc/README.md) maps the `doc/` directory — start there and it routes you
112
+ to the reference page that answers your question.
99
113
 
100
- ## Documentation
114
+ Two more live at the repo root:
101
115
 
102
- - [`doc/ADVANCED.md`](doc/ADVANCED.md) — the deep reference: build-from-source,
103
- architecture, the agent adapters, the full configuration surface, and the development
104
- workflow.
105
116
  - [CONTRIBUTING.md](CONTRIBUTING.md) — develop caret locally: setup, the `mise` workflow,
106
117
  and where tests live.
107
- - [`doc/`](doc/) — contributor rules-of-the-road, routed from [CLAUDE.md](CLAUDE.md).
118
+ - [CLAUDE.md](CLAUDE.md) — for coding agents: routes a change to the rules-of-the-road
119
+ that govern it.
108
120
 
109
121
  ## License
110
122
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Gather a redacted diagnostics snapshot of this caret install and present it ready to paste into a bug report
2
+ description: Gather a redacted diagnostics snapshot of this caret install and present it ready to share
3
3
  ---
4
4
 
5
5
  caret's `discovery` subcommand prints a one-shot, read-only snapshot of the local install
@@ -12,7 +12,7 @@ or feedback bodies, nor any log contents — it exists to be shared.
12
12
 
13
13
  First ask the user (via `AskUserQuestion`) which format they want:
14
14
 
15
- - **JSON** — for pasting into a bug report or feeding to tooling.
15
+ - **JSON** — for feeding to tooling.
16
16
  - **Human-readable** — for scanning in the conversation.
17
17
 
18
18
  Then run the matching invocation:
@@ -24,8 +24,8 @@ Then run the matching invocation:
24
24
 
25
25
  End your output with the command's stdout **verbatim** in a fenced code block —
26
26
  ` ```json ` for the JSON format, plain ` ``` ` for the human-readable one — so the user
27
- can copy it straight into a bug report. Add nothing inside the block and do not summarize
28
- away sections; the report is already redacted and complete. A degraded section (e.g.
27
+ can copy it out in one piece. Add nothing inside the block and do not summarize away
28
+ sections; the report is already redacted and complete. A degraded section (e.g.
29
29
  `daemon error: …` or `"error": "…"`) is normal when the daemon is down — present it as-is
30
30
  rather than treating it as a failure of this command.
31
31