{"ok":true,"site":{"host":"jjhub.erisera.com","url":"https://jjhub.erisera.com/","type":"live","desc":"JJHub","tools":[{"name":"list_tool_groups","kind":"answer","impl":"imperative","description":"JJHub registers its WebMCP tools progressively: a small core set is always available and the rest are grouped by workflow. Lists every group with its description, tool names and whether it is currently loaded, plus the page limits (how many tools may be registered at once) and how many slots remain. Call load_tool_group to make a group's tools callable.","annotations":{"readOnlyHint":true,"consequentialHint":false},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"load_tool_group","kind":"act","impl":"imperative","description":"Registers one workflow group's tools on this page so they become callable. If that would exceed the page budget, the least recently used loaded group is evicted first (evict defaults to true) and the response names the evicted group and tools — their schemas leave your working set and must be re-loaded before use. With evict: false the load is refused instead, listing the groups you could unload. Loading an already-loaded group is a no-op. Group names come from list_tool_groups.","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"group":{"type":"string","enum":["core","changes","review","stacks","conflicts","landing","content","evidence","history","workspaces","bookmarks","repositories","projects","ai","admin"],"description":"Group name from list_tool_groups."},"evict":{"type":"boolean","description":"Evict the least recently used group if needed (default true); false refuses instead."}},"required":["group"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"search_tools","kind":"answer","impl":"imperative","description":"Keyword search over every JJHub WebMCP tool's name and description (loaded or not). Returns matching tool names with their group and whether each is currently loaded, so you can discover a tool and then load_tool_group its group.","annotations":{"readOnlyHint":true,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Words to look for, e.g. 'land stack' or 'conflict'."},"limit":{"type":"number","description":"Max matches (default 15)."}},"required":["query"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_repositories","kind":"answer","impl":"imperative","description":"List every repository JJHub manages, with GitHub connection and daemon status.","annotations":{"readOnlyHint":true,"consequentialHint":false},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["items"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_repository","kind":"answer","impl":"imperative","description":"Get one repository's details (GitHub connection, App coverage, daemon heartbeat).","annotations":{"readOnlyHint":true,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."}},"required":["repositoryId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_changes","kind":"answer","impl":"imperative","description":"List every jj-style change in a repository.","annotations":{"readOnlyHint":true,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."}},"required":["repositoryId"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["items"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_change","kind":"answer","impl":"imperative","description":"Get one change's full detail (status, commit history, restack flag, etc.).","annotations":{"readOnlyHint":true,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."}},"required":["repositoryId","changeId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_change_diff","kind":"answer","impl":"imperative","description":"Per-file unified diffs of a change's projected branch against its base; landed changes return the merged PR audit diff.","annotations":{"readOnlyHint":true,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."}},"required":["repositoryId","changeId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"create_change","kind":"act","impl":"imperative","description":"Create a change (projects a branch + draft PR on GitHub when connected); parentChangeId stacks it on an existing change.","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"title":{"type":"string","description":"Short title for the change."},"description":{"type":"string","description":"Longer description/body."},"parentChangeId":{"type":"string","description":"Parent change id, if stacking on another change."},"parentChangeIds":{"type":"array","items":{"type":"string"},"description":"Ordered parent change ids for a multi-parent jj graph change."},"base":{"type":"string","description":"Base ref, e.g. 'main', if not stacking on a change."},"stackId":{"type":"string","description":"Stack to add this change to, if any."},"projectionRoute":{"type":"object","properties":{"kind":{"type":"string","enum":["same_repo","user_fork","unprojected"]},"headRepoFullName":{"type":"string"},"baseRepoFullName":{"type":"string"},"baseBranch":{"type":"string"}},"required":["kind"],"additionalProperties":false},"idempotencyKey":{"type":"string","description":"Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."}},"required":["repositoryId","title"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"describe_change","kind":"act","impl":"imperative","description":"Edit a change's title and/or description (like 'jj describe').","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."},"title":{"type":"string","description":"New title, if changing it."},"description":{"type":"string","description":"New description, if changing it."},"idempotencyKey":{"type":"string","description":"Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."}},"required":["repositoryId","changeId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"amend_change","kind":"act","impl":"imperative","description":"Amend (rewrite) a change in place — descendants will need a restack.","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."},"idempotencyKey":{"type":"string","description":"Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."}},"required":["repositoryId","changeId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"split_change","kind":"act","impl":"imperative","description":"Split a change: a new change with the given title stacks on top of it.","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."},"title":{"type":"string","description":"Title for the newly split-off change."},"description":{"type":"string","description":"Description for the newly split-off change."},"idempotencyKey":{"type":"string","description":"Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."}},"required":["repositoryId","changeId","title"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"squash_change","kind":"act","impl":"imperative","description":"Squash a change into its parent.","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."},"idempotencyKey":{"type":"string","description":"Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."}},"required":["repositoryId","changeId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"abandon_change","kind":"act","impl":"imperative","description":"Abandon a change outright (closes its projected PR on GitHub).","annotations":{"readOnlyHint":false,"consequentialHint":true},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."},"idempotencyKey":{"type":"string","description":"Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."}},"required":["repositoryId","changeId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"restore_change","kind":"act","impl":"imperative","description":"Re-materialize an abandoned OR squashed-away change as a live draft with its original changeId, from the op log's pre-deletion snapshot. Former children stay reparented where abandon/squash left them (returned as formerChildren, not automatically reclaimed); a former parent that has since landed or vanished re-roots the restored change onto its base instead (reported as rerootedOnBase).","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."},"idempotencyKey":{"type":"string","description":"Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."}},"required":["repositoryId","changeId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"duplicate_change","kind":"act","impl":"imperative","description":"Create an independent copy of a change with the same title/description/content (like 'jj duplicate'). The source is never touched — it can be duplicated even if landed, queued, or abandoned.","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."},"destinationChangeId":{"type":"string","description":"New primary (first) parent for the duplicate — mirrors jj's 'duplicate -d/--onto'. Replaces ONLY the source's first parent; every other parent (a join's non-primary edges) carries over unchanged. Omit to keep every one of the source's parents exactly as-is."}},"required":["repositoryId","changeId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"reparent_change","kind":"act","impl":"imperative","description":"Repoint a change's parent edges directly (graph-level reparent, not a content rebase). Reuses create_change's cycle detection. Marks the change and its descendants needsRestack rather than performing the rebase itself — call restack_change afterward to materialize it.","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."},"parentChangeIds":{"type":"array","items":{"type":"string"},"description":"New ordered parent edges, replacing the change's current ones outright. The first element becomes the new primary parent (PR base once restacked); any additional elements are a join's non-primary parents, recorded but never projected to GitHub (Change.unprojectedParentIds). An empty array re-roots the change with no parent."}},"required":["repositoryId","changeId","parentChangeIds"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"restack_change","kind":"act","impl":"imperative","description":"Rebase a needs-restack change onto its rewritten ancestor and clear its needsRestack flag.","annotations":{"readOnlyHint":false,"consequentialHint":false},"inputSchema":{"type":"object","properties":{"repositoryId":{"type":"string","description":"JJHub repository id — see list_repositories for available ids."},"changeId":{"type":"string","description":"jj change id, e.g. 'CHG-1' — see list_changes."},"workspaceId":{"type":"string","description":"Issue #268: explicitly target this workspace for local-write routing. Never inferred — omitting it always yields localApply:'not_requested', even if the repository has a configured write route."},"expectedWorkspaceWorkingCopyChangeId":{"type":"string","description":"Only meaningful with workspaceId: the working-copy change id this call expects the target workspace to currently be on. A mismatch yields localApply:'skipped_diverged' instead of proceeding against a workspace that has moved."},"idempotencyKey":{"type":"string","description":"Optional: retry this exact call safely — the same key + the same arguments replays the original result instead of re-executing."}},"required":["repositoryId","changeId"],"additionalProperties":false},"outputSchema":{"type":"object","additionalProperties":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Developer Tools","favicon":"/favicons/jjhub.erisera.com.png","apiSurface":"spec","toolCount":18}}