Official

git

Built-in git UI (JavaScript UI plugin).

The app opens the listing; nothing installs until an agent in your Plugins workspace has read the files and you enable the plugin. In a terminal: cvg install convergence/git@0.2.0

Permissions in 0.2.0

  • Run git commands git.writeHighRuns any git command.Stage, commit, switch branches and sync with the remote
  • Read chats chats.readMediumReads your transcripts and chat lists.Refresh when an agent finishes a turn
  • Read git status and diffs git.readLowReads git status and diffs.Show the repository's status and diffs, and follow its changes
  • Show panels ui.slotsLowShows views in the listed parts of the window.Show the source control button and panelSlots: railright

Files

main.ts1.5 KB
// Register the source-control command and views synchronously, then follow event streams.
// Repository effects follow the view lifecycle; render modules remain pure.
import * as Effect from "effect/Effect";
import * as Stream from "effect/Stream";
import { Commands, Events, Views, runPlugin } from "convergence/effect";
import { Git } from "./controller.ts";
import { runFinished } from "./status.ts";
import { renderRail, renderPanel } from "./views/panel.ts";

const program = Effect.gen(function* () {
  const git = yield* Git;
  const commands = yield* Commands;
  yield* commands.register("git.toggle", git.toggle);
  const views = yield* Views;
  git.views.push(
    yield* views.slot(
      "rail",
      (ctx) => {
        ctx.run(git.show(ctx.app.workspaceId));
        return renderRail(ctx, git);
      },
      { on: ["app_state"], order: 20 },
    ),
  );
  git.views.push(
    yield* views.slot("right", (ctx) => renderPanel(ctx, git), {
      on: ["app_state"],
      order: 20,
      title: "Source Control",
    }),
  );
  const events = yield* Events;
  yield* events.all.pipe(
    Stream.runForEach((event) => {
      if (
        (event.event === "git_changed" && event.workspaceId === git.state.workspaceId) ||
        (event.event === "agent" && runFinished(event.kind)) ||
        event.event === "workspaces_changed"
      )
        return Effect.forkScoped(git.refresh(), { startImmediately: true });
      return Effect.void;
    }),
    Effect.forkScoped({ startImmediately: true }),
  );
});

export const activate = runPlugin(Git.layer, program);

Versions

VersionPublishedPlugin APISizePermissionsStatus
0.2.0latestOct 5, 2026>=2 <313.4 KB4 permissionsListed

Reviews and comments

0 threads · 0 reviews

No comments yet.