@remixhq/claude-plugin 0.1.18 → 0.1.20

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "remix",
3
3
  "description": "Remix collaboration workflows for Claude Code",
4
- "version": "0.1.18",
4
+ "version": "0.1.20",
5
5
  "author": {
6
6
  "name": "Remix"
7
7
  },
package/README.md CHANGED
@@ -14,3 +14,38 @@ Claude Code plugin for Remix collaboration workflows.
14
14
  ```bash
15
15
  /reload-plugins
16
16
  ```
17
+
18
+ ### Subscription tier (plan) capture
19
+
20
+ When a Stop hook records a turn, the plugin attempts to resolve the user's
21
+ Claude Code subscription tier (e.g. `pro`, `max`, `team`, `enterprise`) and
22
+ attaches it to `agent.plan` on the recorded turn. The dashboard reads this
23
+ field to display "Charged on Max" alongside per-turn cost.
24
+
25
+ How it's resolved (no permission prompts):
26
+
27
+ - The plugin spawns `claude auth status --json` and parses
28
+ `subscriptionType` from the result. Because this command runs as the
29
+ `claude` binary itself, macOS treats it as the keychain entry's owner
30
+ and returns the data silently.
31
+ - The result is cached at
32
+ `${REMIX_COLLAB_STATE_ROOT:-~/.remix/collab-state}/claude-auth-cache.json`
33
+ for one hour (five minutes on failure), so most Stop hooks read the
34
+ cache file (~1 ms) rather than spawning `claude` (~150–500 ms).
35
+ - Failure modes (`claude` not on PATH, non-zero exit, malformed JSON,
36
+ API-key-only auth, logged-out account) all degrade to `agent.plan = null`
37
+ with no exception thrown.
38
+
39
+ Privacy posture:
40
+
41
+ - Only `subscriptionType` is captured. Email, organization, and account
42
+ IDs are intentionally NOT recorded, because `agent.plan` ships in the
43
+ per-turn `workspace_metadata` blob that's visible to every collaborator
44
+ who can view the project's timeline.
45
+
46
+ Configuration:
47
+
48
+ - `REMIX_CLAUDE_AUTH_TIMEOUT_MS` — override the spawn timeout (default
49
+ `5000`).
50
+ - `REMIX_COLLAB_STATE_ROOT` — override the cache directory (default
51
+ `~/.remix/collab-state`).
@@ -15,10 +15,14 @@ Branch model:
15
15
  - If the current branch is unbound, initialize or provision that branch lane before continuing. Do not assume another branch's binding is safe to reuse.
16
16
  - If status reports a branch mismatch or missing branch binding, stop and resolve the branch state before recording or syncing.
17
17
 
18
+ Source-blind recording rule:
19
+
20
+ Any local content change since the last recorded turn — whether you typed it, the user typed it, a `git commit`, `git pull`, `git merge`, `git rebase`, or `git reset` produced it, or an IDE saved it — is recorded by exactly one `remix_collab_finalize_turn`. Do not pick a different command (`re-anchor`, `sync`, `reconcile`) based on what produced the change. Those commands are only correct when `remix_collab_status.recommendedAction` explicitly names them. `re-anchor` in particular is reserved for the narrow case where no local Remix baseline exists yet for this lane (status reports `re_anchor`); it is not a recovery for "the local content changed."
21
+
18
22
  Operating rules:
19
23
 
20
24
  1. Start with `remix_collab_status` for repo-bound collaboration tasks whenever the current state is unclear.
21
- 2. In a Remix-bound repo, Remix MCP tools are the required workflow layer for collaboration state and historical reasoning. Raw git mutation commands must not be used for ordinary bound-repo collaboration work. Raw git reads are only acceptable for exact repository facts such as specific commits, blame, ancestry, or raw patch details.
25
+ 2. In a Remix-bound repo, Remix MCP tools are the required workflow layer for collaboration state and historical reasoning. Raw git mutations are allowed but never substitute for `remix_collab_finalize_turn`; after raw git mutations, run `remix_collab_status` and follow its `recommendedAction`. Raw git reads are only acceptable for exact repository facts such as specific commits, blame, ancestry, or raw patch details.
22
26
  3. Use preview tools before apply tools whenever both exist.
23
27
  4. Treat reconcile as a last-resort, high-risk path.
24
28
  5. Prefer bounded merge request diffs first, then expand only when necessary.
@@ -43,7 +47,7 @@ When appropriate:
43
47
  - use `remix_collab_init` to bind the current repo
44
48
  - use `remix_collab_remix` to start from an existing app lineage
45
49
  - use `remix_collab_checkout` to continue work on an existing app id without creating a fork
46
- - when the user asks for an app's dashboard URL and an `appId` is known, answer with `https://dashboard.remix.one/apps/<appId>` without requiring an additional tool call
50
+ - when the user asks for any URL, link, dashboard, or web address of a Remix-bound repo or app (e.g. "what's the URL of this repo on Remix", "the link to this app", "where can I see this on the dashboard"), use `remix_collab_status` and answer with `binding.dashboardUrl` (already in the canonical `https://dashboard.remix.one/apps/<appId>` form). Do NOT answer with `binding.remoteUrl` — that is the git remote, not the Remix dashboard. If `binding.dashboardUrl` is null but `binding.currentAppId` is set, fall back to `https://dashboard.remix.one/apps/<currentAppId>`. Do not require an additional tool call beyond `remix_collab_status`.
47
51
  - when helping the user choose an app, prefer scoped or membership-oriented discovery first: use `organizationId` / `projectId` when known, or use `ownership` with `accessScope="explicit_member"` when the user means “apps I can work on”
48
52
  - reserve `accessScope="all_readable"` for explicit public or broad readable discovery, not as the default work-oriented app picker
49
53
  - use memory summary/search/timeline tools before repo inspection when historical context or reasoning is needed
@@ -861,7 +861,7 @@ async function markPendingTurnConsultedMemory(sessionId) {
861
861
  // package.json
862
862
  var package_default = {
863
863
  name: "@remixhq/claude-plugin",
864
- version: "0.1.18",
864
+ version: "0.1.20",
865
865
  description: "Claude Code plugin for Remix collaboration workflows",
866
866
  homepage: "https://github.com/RemixDotOne/remix-claude-plugin",
867
867
  license: "MIT",
@@ -884,16 +884,23 @@ var package_default = {
884
884
  "hooks",
885
885
  "agents"
886
886
  ],
887
+ exports: {
888
+ ".": {
889
+ types: "./dist/index.d.ts",
890
+ import: "./dist/index.js"
891
+ }
892
+ },
887
893
  scripts: {
888
894
  build: "tsup",
889
895
  postbuild: `node -e "const fs=require('node:fs'); for (const p of ['dist/mcp-server.cjs','dist/hook-pre-git.cjs','dist/hook-user-prompt.cjs','dist/hook-post-collab.cjs','dist/hook-stop-collab.cjs']) fs.chmodSync(p, 0o755);"`,
890
896
  dev: "tsx src/mcp-server.ts",
891
897
  typecheck: "tsc -p tsconfig.json --noEmit",
898
+ test: "node --import tsx --test src/**/*.test.ts",
892
899
  prepack: "npm run build"
893
900
  },
894
901
  dependencies: {
895
- "@remixhq/core": "^0.1.13",
896
- "@remixhq/mcp": "^0.1.13"
902
+ "@remixhq/core": "^0.1.15",
903
+ "@remixhq/mcp": "^0.1.15"
897
904
  },
898
905
  devDependencies: {
899
906
  "@types/node": "^25.4.0",