jjhub 0.1.13 → 0.1.15

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jjhub",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "jjhub — GitHub CLI with Jujutsu-native superpowers: stable change IDs, stacks, platform-wide undo, and conflicts that wait, layered over plain GitHub repos by a JJHub server.",
5
5
  "bin": {
6
6
  "jjhub": "./dist/cli/jjhub.mjs"
@@ -10,7 +10,7 @@
10
10
  "node": ">=22.6.0"
11
11
  },
12
12
  "license": "UNLICENSED",
13
- "homepage": "https://jjhub.johnhenry.me",
13
+ "homepage": "https://jjhub.erisera.com",
14
14
  "keywords": [
15
15
  "jujutsu",
16
16
  "jj",
@@ -68,6 +68,15 @@ change land <changeId> [--force] waits for real CI triggered by its own re
68
68
  re-syncs a behind branch, then merges; --force bypasses
69
69
  change split <changeId> <newTitle>
70
70
  change checks <changeId> list GitHub check runs for a change
71
+ change actions <changeId> show bounded GitHub Actions workflow and job evidence
72
+ change actions rerun <changeId> <runId>
73
+ ask GitHub to re-run a workflow run shown by "change actions"
74
+ change deployments <changeId> show bounded GitHub deployment evidence
75
+ change security <changeId> show bounded GitHub code-scanning evidence
76
+ change issues <changeId> show linked GitHub issue context for a change
77
+ change reviewers <changeId> reviewer-routing audit trail: every request/remove that
78
+ actually succeeded against GitHub, who did it, and when
79
+ change projects <changeId> show bounded GitHub Projects v2 evidence for linked issues
71
80
 
72
81
  stack create <title> [--id x] [--changes CHG-1,CHG-2]
73
82
  stack list
@@ -75,11 +84,17 @@ stack land <stackId> [--force] same check-run gate as change land
75
84
  stack delete <stackId> disband — members become loose changes (undoable)
76
85
  stack reorder <stackId> <changeId,changeId,...>
77
86
  stack checks <stackId> every member's GitHub check runs, one batched round trip
87
+ stack issues <stackId> linked issue and external-blocker summary for a stack
78
88
 
79
89
  bookmark list
80
90
  bookmark delete <name> [--force] --force required for the default (trunk) bookmark
81
91
  bookmark set <name> <tracked|view> [--target CHG-x]
82
92
 
93
+ view save <name> <revsetExpression> save a named jj revset expression for later reuse (storage
94
+ only — evaluate it with "jjhub revset")
95
+ view list list saved views in this repo
96
+ view delete <name>
97
+
83
98
  op log "@" marks the current head operation
84
99
  undo [--force] refused when the head op is a "land" (real merge can't be unwound); --force reverts local state anyway
85
100
  redo
@@ -100,7 +115,7 @@ auth sessions list your live sessions; auth revoke <id>
100
115
  auth logout forget the saved connection/token
101
116
  auth status who the saved credential authenticates as
102
117
 
103
- mcp serve MCP server over stdio (59 tools) for agent clients
118
+ mcp serve MCP server over stdio (86 tools) for agent clients
104
119
  mcp serve --http <port> the same tools over Streamable HTTP (POST /)
105
120
  acp serve Agent Client Protocol agent over stdio (Zed's agent
106
121
  panel, ...) — every operation as a slash command
@@ -112,6 +127,24 @@ daemon <localRepoPath> [--once] [--interval 5] [--engine auto|subprocess|isomorp
112
127
  daemon start [alias|localRepoPath] [--interval 5] [--engine ...] [--two-way]
113
128
  spawn the same sync as a detached background process
114
129
  daemon stop [alias] | daemon status [alias]
130
+
131
+ topology <localRepoPath> [--engine subprocess]
132
+ inspect explicit local remote/bookmark topology; never selects or rewrites a push route
133
+
134
+ revset <localRepoPath> <expression> [--engine subprocess]
135
+ evaluate the installed jj binary's revset in exactly the named workspace;
136
+ this is local, read-only discovery rather than a server-side approximation
137
+
138
+ content preview <localRepoPath> <split|absorb|squash|duplicate|restore>
139
+ --source <jj-change-id> [--destination <jj-change-id>] [--path <relative-path>]...
140
+ content apply <localRepoPath> <split|absorb|squash|duplicate|restore>
141
+ same selection plus --expected-operation <jj-operation-id> returned by preview
142
+ local-only jj content curation; checked against jj's immutable policy and
143
+ never implemented as a browser patch transform; records a durable receipt
144
+ on the JJHub server (best-effort — see "content receipts" below)
145
+ content receipts [--repo owner/name|repoId]
146
+ list this repo's content-op receipt trail: every content apply invocation,
147
+ successful or rejected, with its kind, revisions, and outcome
115
148
  ```
116
149
 
117
150
  Anything else (`pr`, `issue`, ...) is passed through to `gh` — e.g. `jjhub pr view 7`. `jjhub auth`
@@ -126,12 +159,12 @@ vars needed. `jjhub auth status` confirms what's currently in effect.
126
159
 
127
160
  ### Identity & permissions (issue #43: GitHub-federated)
128
161
 
129
- A JJHub user IS a GitHub account. `jjhub auth login` runs an OAuth device flow against the
162
+ A JJHub user is a GitHub account. `jjhub auth login` runs an OAuth device flow against the
130
163
  JJHub server's own authorization server: open the printed URL, sign in with GitHub, confirm
131
164
  the code, and the CLI saves a JJHub-issued OAuth token. Every mutation is attributed to that
132
165
  identity (visible in `jjhub op log`).
133
166
 
134
- What you can do on a repo is asked of GitHub LIVE at request time (cached ~60s):
167
+ What you can do on a repo is asked of GitHub live at request time (cached ~60s):
135
168
  GitHub `admin` → owner, `maintain`/`write` → writer, `triage`/`read` → reader. There is no
136
169
  internal membership table and nothing to manage in JJHub — manage collaborators on GitHub.
137
170
 
@@ -195,11 +228,49 @@ npm run jjhub -- daemon . --once # one-shot sync; omit --once to loop every
195
228
  npm run jjhub -- op log # verify the sync landed as a new operation
196
229
  ```
197
230
 
231
+ ### Discover local jj changes with a revset
232
+
233
+ ```bash
234
+ npm run jjhub -- revset . 'mutable() & descendants(@-)'
235
+ npm run jjhub -- revset . 'bookmarks() | remote_bookmarks()' --json
236
+ ```
237
+
238
+ The expression is passed to the installed `jj` binary as one argument, never
239
+ through a shell. The workspace path is explicit because `@`, aliases, and
240
+ immutable boundaries are facts about that specific local workspace. This first
241
+ read-only form does not send local commits or filesystem paths to JJHub.
242
+
243
+ ### Curate local change content
244
+
245
+ ```bash
246
+ npm run jjhub -- content preview . split \
247
+ --source <jj-change-id> --title "Extract validation" --path src/checkout.ts
248
+ npm run jjhub -- content apply . split \
249
+ --source <jj-change-id> --title "Extract validation" --path src/checkout.ts \
250
+ --expected-operation <operation-id-from-preview>
251
+ ```
252
+
253
+ The non-interactive local surface delegates `split`, `absorb`, `squash`,
254
+ `duplicate`, and `restore` to the installed jj binary with structured argument
255
+ arrays. A preview's jj operation id is mandatory for apply, and immutable
256
+ targets are refused without `--ignore-immutable`. `--path` selects complete
257
+ relative paths; interactive hunk selection remains jj's configured diff editor.
258
+ Run `jjhub daemon . --once` afterwards to reconcile the local graph.
259
+
260
+ Each `content apply` invocation — successful or rejected (e.g. a stale
261
+ `--expected-operation`) — records a durable receipt on the JJHub server
262
+ (best-effort: a missing repo context or unreachable server only produces a
263
+ warning, never blocks the local jj mutation). Review the trail with:
264
+
265
+ ```bash
266
+ npm run jjhub -- content receipts
267
+ ```
268
+
198
269
  ### Resolve a conflict
199
270
 
200
271
  ```bash
201
272
  npm run jjhub -- conflict list # note the conflict id
202
- npm run jjhub -- conflict resolve CONFLICT-abc123 left # or: right | edited | preserve_unresolved
273
+ npm run jjhub -- conflict resolve <conflict-id> left # or: right | edited | preserve_unresolved
203
274
  npm run jjhub -- conflict list # confirm it now reads Resolved
204
275
  ```
205
276