Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
8e31d98
perf(boot): defer Linear quick view visibility check
arul28 May 14, 2026
a35ae3c
fix(tui): stream daemon chat events to ade code
arul28 May 14, 2026
0b67b15
perf(lanes): avoid snapshot refresh for local git state
arul28 May 14, 2026
8af850d
feat(agents): bundle ADE operating skills
arul28 May 14, 2026
b33388d
fix(remote): retry sync reads after reconnect
arul28 May 14, 2026
557e6d6
perf(prs): avoid snapshot refresh from header reload
arul28 May 14, 2026
228fadb
chore(release): gate packaging on ci-pass
arul28 May 14, 2026
60f6057
perf(boot): defer header runtime status reads
arul28 May 14, 2026
b94eec1
fix(tui): scope ade code persisted state by project
arul28 May 14, 2026
6dbcd72
fix(prs): preserve cached detail on rate limit
arul28 May 14, 2026
7e3ff70
fix(work): lock tool controls on lane mismatch
arul28 May 14, 2026
6091843
fix(tui): skip runtime event replay on attach
arul28 May 14, 2026
fa64138
fix(tui): ignore stale state refreshes
arul28 May 14, 2026
2016fad
fix(files): watch workspace before opening files
arul28 May 14, 2026
09792c8
fix(work): track lane mismatch memo dependency
arul28 May 14, 2026
c20fd32
perf(tui): avoid polling full chat history
arul28 May 14, 2026
e763274
perf(agents): tighten ADE skill guidance
arul28 May 14, 2026
32cf9c7
perf(prs): target detail refresh work
arul28 May 14, 2026
ade313c
fix(work): reveal group runs and narrow conflicts
arul28 May 14, 2026
405e094
fix(files): recover from stale workspaces
arul28 May 14, 2026
9face91
fix(prs): preflight github auth state
arul28 May 14, 2026
48c3b4d
fix(work): keep claude chats on sdk runtime
arul28 May 14, 2026
7bbba1d
fix(release): resolve final audit rebase findings
arul28 May 14, 2026
ab83310
fix(audit): address release gate review findings
arul28 May 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/prepare-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ on:
type: string

permissions:
actions: read
checks: read
contents: read

jobs:
Expand Down
32 changes: 32 additions & 0 deletions .github/workflows/release-core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ on:
type: boolean

permissions:
actions: read
checks: read
contents: write

jobs:
Expand All @@ -34,6 +36,36 @@ jobs:
git fetch origin main:refs/remotes/origin/main
git merge-base --is-ancestor HEAD refs/remotes/origin/main

- name: Ensure CI passed for release commit
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
TARGET_REF: ${{ inputs.target_ref }}
run: |
set -euo pipefail

ci_pass_json="$(
gh api "repos/$GH_REPO/commits/$TARGET_REF/check-runs" \
-f per_page=100 \
--paginate \
--jq '[.check_runs[] | select(.name == "ci-pass")] | sort_by(.completed_at // "") | last // empty'
)"

if [ -z "$ci_pass_json" ] || [ "$ci_pass_json" = "null" ]; then
echo "::error::No ci-pass check run was found for $TARGET_REF. Run CI before releasing."
exit 1
fi

status="$(printf '%s' "$ci_pass_json" | jq -r '.status // ""')"
conclusion="$(printf '%s' "$ci_pass_json" | jq -r '.conclusion // ""')"
url="$(printf '%s' "$ci_pass_json" | jq -r '.html_url // ""')"
if [ "$status" != "completed" ] || [ "$conclusion" != "success" ]; then
echo "::error::ci-pass for $TARGET_REF is $status/$conclusion. Release packaging requires green CI. $url"
exit 1
fi

echo "ci-pass succeeded for $TARGET_REF: $url"

build-mac-release:
needs:
- verify
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ on:
type: string

permissions:
actions: read
checks: read
contents: write

jobs:
Expand Down
1 change: 1 addition & 0 deletions apps/ade-cli/src/cli.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ describe("ADE CLI", () => {
if (plan.kind !== "help") return;
expect(plan.text).toContain("ade code --socket /tmp/ade.sock");
expect(plan.text).toContain("ade code --require-socket");
expect(plan.text).toContain("ade code --lane <id|name|branch>");
expect(plan.text).toContain("Command palette");
});

Expand Down
1 change: 1 addition & 0 deletions apps/ade-cli/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -855,6 +855,7 @@ const HELP_BY_COMMAND: Record<string, string> = {
$ ade code --embedded Force the embedded runtime fallback
$ ade code --require-socket Fail instead of embedding when no socket exists
$ ade code --socket /tmp/ade.sock Attach to a specific runtime socket
$ ade code --lane <id|name|branch> Launch focused on a specific lane
$ ade --project-root <path> code Launch against a specific ADE project

Keys:
Expand Down
69 changes: 69 additions & 0 deletions apps/ade-cli/src/multiProjectRpcServer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -426,4 +426,73 @@ describe("multi-project RPC server", () => {

handler.dispose();
});

it("can subscribe to project runtime events without replaying buffered history", async () => {
const { projectRoot, registry } = createRegistry();
const added = registry.add(projectRoot);
const eventBuffer = createEventBuffer();
eventBuffer.push({
timestamp: "2026-05-10T00:00:00.000Z",
category: "runtime",
payload: { type: "file_change", event: { path: "old.ts" } },
});
const scopeRegistry = {
get: vi.fn(async () => ({
registryProjectId: added.projectId,
record: added,
runtime: {
eventBuffer,
dispose: vi.fn(),
},
dispose: vi.fn(),
})),
ensureSyncHost: vi.fn(),
dispose: vi.fn(),
disposeAll: vi.fn(),
} as unknown as ProjectScopeRegistry;
const handler = createMultiProjectRpcRequestHandler({
serverVersion: "test",
projectRegistry: registry,
scopeRegistry,
});
const notify = vi.fn();
handler.setNotifier(notify);

await handler({
jsonrpc: "2.0",
id: 1,
method: "ade/initialize",
params: {},
});

const subscribed = await handler({
jsonrpc: "2.0",
id: 2,
method: "runtimeEvents.subscribe",
params: {
projectId: added.projectId,
category: "runtime",
replay: false,
},
}) as { subscriptionId: string; hasMore: boolean; nextCursor: number };

expect(subscribed.hasMore).toBe(false);
expect(notify).not.toHaveBeenCalled();

eventBuffer.push({
timestamp: "2026-05-10T00:00:01.000Z",
category: "runtime",
payload: { type: "file_change", event: { path: "new.ts" } },
});

expect(notify).toHaveBeenCalledTimes(1);
expect(notify).toHaveBeenCalledWith("runtime/event", expect.objectContaining({
subscriptionId: subscribed.subscriptionId,
event: expect.objectContaining({
payload: { type: "file_change", event: { path: "new.ts" } },
}),
}));

handler.dispose();
});
});
11 changes: 7 additions & 4 deletions apps/ade-cli/src/multiProjectRpcServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,7 @@ export function createMultiProjectRpcRequestHandler(
}
const cursor = readCursor(params.cursor);
const limit = readLimit(params.limit);
const replay = params.replay !== false;
const scope = await scopeRegistry.get(projectId);
const subscriptionId = `runtime-events-${nextSubscriptionId++}`;
const shouldForward = (event: BufferedEvent): boolean =>
Expand All @@ -337,15 +338,17 @@ export function createMultiProjectRpcRequestHandler(
unsubscribe,
});

const replay = scope.runtime.eventBuffer.drain(cursor, limit);
for (const event of replay.events) {
const replayResult = replay
? scope.runtime.eventBuffer.drain(cursor, limit)
: { events: [], nextCursor: cursor, hasMore: false };
for (const event of replayResult.events) {
if (shouldForward(event))
emitRuntimeEvent(subscriptionId, projectId, event);
}
return {
subscriptionId,
nextCursor: replay.nextCursor,
hasMore: replay.hasMore,
nextCursor: replayResult.nextCursor,
hasMore: replayResult.hasMore,
};
};

Expand Down
Loading
Loading