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/README.md +3 -3
- package/dist/cli/jjhub.mjs +2795 -852
- package/package.json +2 -2
- package/skills/jjhub-cli/SKILL.md +75 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jjhub",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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
|
|