Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
bf8d101
add markdown planning for submission port
lucaslyl Mar 2, 2026
1ff3fb7
Merge branch 'main' into CS-10291-create-submission-card-portal
lucaslyl Mar 2, 2026
8f87f1d
CS-10291: Create submission card portal
lucaslyl Mar 3, 2026
779a18d
Merge branch 'main' into CS-10291-create-submission-card-portal
lucaslyl Mar 3, 2026
157f1c9
add islive
lucaslyl Mar 3, 2026
5e9eb3d
implement isolated/embedded template
lucaslyl Mar 4, 2026
491e3c9
Merge branch 'main' into CS-10291-create-submission-card-portal
lucaslyl Mar 4, 2026
dbd5de5
feat: add realm filter tabs to SubmissionCardPortal
lucaslyl Mar 4, 2026
b49a562
Merge branch 'main' into CS-10291-create-submission-card-portal
lucaslyl Mar 5, 2026
5977b1e
set branchName value in create-submission command
lucaslyl Mar 5, 2026
364c919
clean the submission instances
lucaslyl Mar 5, 2026
951844e
Merge branch 'main' into CS-10291-create-submission-card-portal
lucaslyl Mar 5, 2026
a014c13
Merge branch 'main' into CS-10291-create-submission-card-portal
lucaslyl Mar 10, 2026
4e9ba01
query pr card in submission card
lucaslyl Mar 10, 2026
cefcf90
Merge branch 'main' into CS-10291-create-submission-card-portal
lucaslyl Mar 11, 2026
9e1354a
clean code
lucaslyl Mar 11, 2026
ca1ad86
query should have sorting
lucaslyl Mar 11, 2026
bca36d6
add a pending review display
lucaslyl Mar 11, 2026
4ce0212
fix lint
lucaslyl Mar 11, 2026
3b3554f
remove testing instances
lucaslyl Mar 11, 2026
73bbab8
update display message and loadingindicator pos
lucaslyl Mar 11, 2026
5a77d43
Merge branch 'main' into CS-10291-create-submission-card-portal
lucaslyl Mar 11, 2026
afa3185
revert linked to prcard code
lucaslyl Mar 11, 2026
e1bdadd
linked with pr card
lucaslyl Mar 12, 2026
5d9a9f4
rename submission portal field title to cardTitle
lucaslyl Mar 12, 2026
b31d8e6
Merge branch 'main' into CS-10291-create-submission-card-portal
lucaslyl Mar 12, 2026
b5a879a
remove hydration logic
lucaslyl Mar 12, 2026
8988c9e
add prSummary markdownfield to pr card
lucaslyl Mar 12, 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
71 changes: 69 additions & 2 deletions packages/bot-runner/lib/command-runner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,22 @@ import {
import { enqueueRunCommandJob } from '@cardstack/runtime-common/jobs/run-command';
import {
CreateListingPRHandler,
type CreatedListingPRResult,
type BotTriggerEventContent,
} from './create-listing-pr-handler';
import type { GitHubClient } from './github';

const log = logger('bot-runner');
const CREATE_PR_CARD_COMMAND =
'@cardstack/catalog/commands/create-pr-card/default';
const PATCH_CARD_INSTANCE_COMMAND =
'@cardstack/boxel-host/commands/patch-card-instance/default';

export class CommandRunner {
private createListingPRHandler: CreateListingPRHandler;

constructor(
private submissionBotUserId: string,
private dbAdapter: DBAdapter,
private queuePublisher: QueuePublisher,
githubClient: GitHubClient,
Expand Down Expand Up @@ -94,12 +100,20 @@ export class CommandRunner {
eventContent,
result,
);
await this.createListingPRHandler.openCreateListingPR(
let prResult = await this.createListingPRHandler.openCreateListingPR(
eventContent,
runAs,
result,
submissionCardUrl,
);
if (prResult && submissionCardUrl) {
await this.createAndLinkPrCard({
runAs,
realmURL,
submissionCardUrl,
prResult,
});
}
return result;
}

Expand Down Expand Up @@ -145,6 +159,53 @@ export class CommandRunner {
return await job.done;
}

private async createAndLinkPrCard({
runAs,
realmURL,
submissionCardUrl,
prResult,
}: {
runAs: string;
realmURL: string;
submissionCardUrl: string;
prResult: CreatedListingPRResult;
}): Promise<void> {
let submissionRealm = new URL('/submissions/', realmURL).href;
let prCardResult = await this.enqueueRunCommand({
runAs: this.submissionBotUserId,
realmURL: submissionRealm,
command: CREATE_PR_CARD_COMMAND,
commandInput: {
realm: submissionRealm,
prNumber: prResult.prNumber,
prUrl: prResult.prUrl,
prTitle: prResult.prTitle,
branchName: prResult.branchName,
prSummary: prResult.summary,
submittedBy: runAs,
},
});

let prCardUrl = getCardUrl(prCardResult.cardResultString);
await this.enqueueRunCommand({
runAs,
realmURL,
command: PATCH_CARD_INSTANCE_COMMAND,
commandInput: {
cardId: submissionCardUrl,
patch: {
relationships: {
prCard: {
links: {
self: prCardUrl,
},
},
},
},
},
});
}

private async getCommandsForRegistration(
registrationId: string,
): Promise<{ type: string; command: string }[]> {
Expand All @@ -168,7 +229,7 @@ export class CommandRunner {
}
}

function getSubmissionCardUrl(
function getCardUrl(
cardResultString?: string | null,
): string | null {
if (!cardResultString || !cardResultString.trim()) {
Expand All @@ -182,3 +243,9 @@ function getSubmissionCardUrl(
return null;
}
}

function getSubmissionCardUrl(
cardResultString?: string | null,
): string | null {
return getCardUrl(cardResultString);
}
38 changes: 31 additions & 7 deletions packages/bot-runner/lib/create-listing-pr-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
} from '@cardstack/runtime-common';
import type { BotTriggerContent } from 'https://cardstack.com/base/matrix-event';
import { createHash } from 'node:crypto';
import type { GitHubClient } from './github';
import type { GitHubClient, OpenPullRequestResult } from './github';

const log = logger('bot-runner:create-listing-pr');

Expand All @@ -24,6 +24,14 @@ interface CreateListingPRContext {
roomId: string;
}

export interface CreatedListingPRResult {
prNumber: number;
prUrl: string;
prTitle: string;
branchName: string;
summary: string | null;
}

function getCreateListingPRContext(
eventContent: BotTriggerEventContent,
): CreateListingPRContext | null {
Expand Down Expand Up @@ -126,15 +134,15 @@ export class CreateListingPRHandler {
runAs: string,
runCommandResult?: RunCommandResponse | null,
submissionCardUrl?: string | null,
): Promise<void> {
): Promise<CreatedListingPRResult | null> {
let context = getCreateListingPRContext(eventContent);
if (!context) {
return;
return null;
}
let { owner, repoName, repo, head, title, listingDisplayName } = context;

try {
let body = await this.getSubmissionSummary(
let summary = await this.getSubmissionSummary(
eventContent,
runAs,
runCommandResult,
Expand All @@ -146,7 +154,7 @@ export class CreateListingPRHandler {
title,
head,
base: DEFAULT_BASE_BRANCH,
body: body ?? undefined,
body: summary ?? undefined,
};
let result = await this.githubClient.openPullRequest(prParams);

Expand All @@ -155,6 +163,7 @@ export class CreateListingPRHandler {
repo,
prUrl: result.html_url,
});
return mapOpenPullRequestResult(result, title, head, summary);
} catch (error) {
let message = error instanceof Error ? error.message : String(error);
if (message.includes('No commits between')) {
Expand All @@ -165,7 +174,7 @@ export class CreateListingPRHandler {
listingDisplayName,
error: message,
});
return;
return null;
}

if (message.includes('A pull request already exists')) {
Expand All @@ -175,7 +184,7 @@ export class CreateListingPRHandler {
head,
error: message,
});
return;
return null;
}

log.error('failed to open PR from pr-listing-create trigger', {
Expand Down Expand Up @@ -226,6 +235,21 @@ export class CreateListingPRHandler {
}
}

function mapOpenPullRequestResult(
result: OpenPullRequestResult,
prTitle: string,
branchName: string,
summary: string | null,
): CreatedListingPRResult {
return {
prNumber: result.number,
prUrl: result.html_url,
prTitle,
branchName,
summary,
};
}

async function getContentsFromRealm(cardResultString?: string | null): Promise<{
files: { path: string; content: string }[];
hash: string;
Expand Down
7 changes: 6 additions & 1 deletion packages/bot-runner/lib/timeline-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,12 @@ export function onTimelineEvent({
githubClient,
startTime,
}: TimelineHandlerOptions) {
let commandRunner = new CommandRunner(dbAdapter, queuePublisher, githubClient);
let commandRunner = new CommandRunner(
authUserId,
dbAdapter,
queuePublisher,
githubClient,
);
return async function handleTimelineEvent(
event: MatrixEvent,
room: Room | undefined,
Expand Down
4 changes: 2 additions & 2 deletions packages/bot-runner/tests/bot-runner-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -311,8 +311,8 @@ module('timeline handler', () => {

assert.strictEqual(
publishedJobs.length,
1,
'enqueues run-command job for pr-listing-create',
3,
'enqueues submission, PR-card, and submission patch run-command jobs for pr-listing-create',
);
assert.strictEqual(
createdBranches.length,
Expand Down
Loading
Loading