Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion apps/pi-extension/server/serverAnnotate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -462,11 +462,12 @@ export async function startAnnotateServer(options: {
handleShareHtml(res, url);
} else if (url.pathname === "/api/config" && req.method === "POST") {
try {
const body = (await parseBody(req)) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean };
const body = (await parseBody(req)) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; platformReviewAttribution?: boolean };
const toSave: Record<string, unknown> = {};
if (body.displayName !== undefined) toSave.displayName = body.displayName;
if (body.diffOptions !== undefined) toSave.diffOptions = body.diffOptions;
if (body.conventionalComments !== undefined) toSave.conventionalComments = body.conventionalComments;
if (body.platformReviewAttribution !== undefined) toSave.platformReviewAttribution = body.platformReviewAttribution;
if (Object.keys(toSave).length > 0) saveConfig(toSave as Parameters<typeof saveConfig>[0]);
json(res, { ok: true });
} catch {
Expand Down
3 changes: 2 additions & 1 deletion apps/pi-extension/server/serverPlan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,11 +251,12 @@ export async function startPlanReviewServer(options: {
});
} else if (url.pathname === "/api/config" && req.method === "POST") {
try {
const body = (await parseBody(req)) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; pfmReminder?: boolean };
const body = (await parseBody(req)) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; platformReviewAttribution?: boolean; pfmReminder?: boolean };
const toSave: Record<string, unknown> = {};
if (body.displayName !== undefined) toSave.displayName = body.displayName;
if (body.diffOptions !== undefined) toSave.diffOptions = body.diffOptions;
if (body.conventionalComments !== undefined) toSave.conventionalComments = body.conventionalComments;
if (body.platformReviewAttribution !== undefined) toSave.platformReviewAttribution = body.platformReviewAttribution;
if (body.pfmReminder !== undefined) toSave.pfmReminder = body.pfmReminder;
if (Object.keys(toSave).length > 0) saveConfig(toSave as Parameters<typeof saveConfig>[0]);
json(res, { ok: true });
Expand Down
3 changes: 2 additions & 1 deletion apps/pi-extension/server/serverReview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2153,11 +2153,12 @@ export async function startReviewServer(options: {
}
} else if (url.pathname === "/api/config" && req.method === "POST") {
try {
const body = (await parseBody(req)) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean };
const body = (await parseBody(req)) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; platformReviewAttribution?: boolean };
const toSave: Record<string, unknown> = {};
if (body.displayName !== undefined) toSave.displayName = body.displayName;
if (body.diffOptions !== undefined) toSave.diffOptions = body.diffOptions;
if (body.conventionalComments !== undefined) toSave.conventionalComments = body.conventionalComments;
if (body.platformReviewAttribution !== undefined) toSave.platformReviewAttribution = body.platformReviewAttribution;
if (Object.keys(toSave).length > 0) saveConfig(toSave as Parameters<typeof saveConfig>[0]);
json(res, { ok: true });
} catch {
Expand Down
5 changes: 3 additions & 2 deletions packages/review-editor/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ const ReviewApp: React.FC = () => {
const diffFontFamily = useConfigValue('diffFontFamily');
const diffFontSize = useConfigValue('diffFontSize');
const diffTabSize = useConfigValue('diffTabSize');
const platformReviewAttribution = useConfigValue('platformReviewAttribution');
// Global plan-look preference; surfaced here only by the shared 0.20.0
// look-and-feel announcement (the grid/clean chooser applies to plan review).
const gridEnabled = useConfigValue('gridEnabled');
Expand Down Expand Up @@ -2443,7 +2444,7 @@ const ReviewApp: React.FC = () => {
const bodyForTarget = (target: SubmissionTarget) => {
const parts: string[] = [];
if (generalComment) parts.push(generalComment);
parts.push('Review from Plannotator');
if (platformReviewAttribution) parts.push('Review from Plannotator');
if (target.fileScopedBody) parts.push(target.fileScopedBody);
return parts.join('\n\n');
};
Expand Down Expand Up @@ -2529,7 +2530,7 @@ const ReviewApp: React.FC = () => {
} finally {
setIsPlatformActioning(false);
}
}, [platformOpenPR, platformLabel, mrLabel, prMetadata]);
}, [platformOpenPR, platformLabel, mrLabel, prMetadata, platformReviewAttribution]);

const openPlatformDialog = useCallback((action: 'approve' | 'comment') => {
const diffPaths = new Set(files.map(f => f.path));
Expand Down
3 changes: 2 additions & 1 deletion packages/server/annotate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -472,11 +472,12 @@ export async function startAnnotateServer(
// API: Update user config (write-back to ~/.plannotator/config.json)
if (url.pathname === "/api/config" && req.method === "POST") {
try {
const body = (await req.json()) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; conventionalLabels?: unknown[] | null };
const body = (await req.json()) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; platformReviewAttribution?: boolean; conventionalLabels?: unknown[] | null };
const toSave: Record<string, unknown> = {};
if (body.displayName !== undefined) toSave.displayName = body.displayName;
if (body.diffOptions !== undefined) toSave.diffOptions = body.diffOptions;
if (body.conventionalComments !== undefined) toSave.conventionalComments = body.conventionalComments;
if (body.platformReviewAttribution !== undefined) toSave.platformReviewAttribution = body.platformReviewAttribution;
if (body.conventionalLabels !== undefined) toSave.conventionalLabels = body.conventionalLabels;
if (Object.keys(toSave).length > 0) saveConfig(toSave as Parameters<typeof saveConfig>[0]);
return Response.json({ ok: true });
Expand Down
4 changes: 4 additions & 0 deletions packages/server/goal-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ export async function startGoalSetupServer(
displayName?: string;
diffOptions?: Record<string, unknown>;
conventionalComments?: boolean;
platformReviewAttribution?: boolean;
conventionalLabels?: unknown[] | null;
};
const toSave: Record<string, unknown> = {};
Expand All @@ -152,6 +153,9 @@ export async function startGoalSetupServer(
if (body.conventionalComments !== undefined) {
toSave.conventionalComments = body.conventionalComments;
}
if (body.platformReviewAttribution !== undefined) {
toSave.platformReviewAttribution = body.platformReviewAttribution;
}
if (body.conventionalLabels !== undefined) {
toSave.conventionalLabels = body.conventionalLabels;
}
Expand Down
3 changes: 2 additions & 1 deletion packages/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -328,11 +328,12 @@ export async function startPlannotatorServer(
// API: Update user config (write-back to ~/.plannotator/config.json)
if (url.pathname === "/api/config" && req.method === "POST") {
try {
const body = (await req.json()) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; conventionalLabels?: unknown[] | null; pfmReminder?: boolean };
const body = (await req.json()) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; platformReviewAttribution?: boolean; conventionalLabels?: unknown[] | null; pfmReminder?: boolean };
const toSave: Record<string, unknown> = {};
if (body.displayName !== undefined) toSave.displayName = body.displayName;
if (body.diffOptions !== undefined) toSave.diffOptions = body.diffOptions;
if (body.conventionalComments !== undefined) toSave.conventionalComments = body.conventionalComments;
if (body.platformReviewAttribution !== undefined) toSave.platformReviewAttribution = body.platformReviewAttribution;
if (body.conventionalLabels !== undefined) toSave.conventionalLabels = body.conventionalLabels;
if (body.pfmReminder !== undefined) toSave.pfmReminder = body.pfmReminder;
if (Object.keys(toSave).length > 0) saveConfig(toSave as Parameters<typeof saveConfig>[0]);
Expand Down
3 changes: 2 additions & 1 deletion packages/server/review.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2216,11 +2216,12 @@ export async function startReviewServer(
// API: Update user config (write-back to ~/.plannotator/config.json)
if (url.pathname === "/api/config" && req.method === "POST") {
try {
const body = (await req.json()) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; conventionalLabels?: unknown[] | null };
const body = (await req.json()) as { displayName?: string; diffOptions?: Record<string, unknown>; conventionalComments?: boolean; platformReviewAttribution?: boolean; conventionalLabels?: unknown[] | null };
const toSave: Record<string, unknown> = {};
if (body.displayName !== undefined) toSave.displayName = body.displayName;
if (body.diffOptions !== undefined) toSave.diffOptions = body.diffOptions;
if (body.conventionalComments !== undefined) toSave.conventionalComments = body.conventionalComments;
if (body.platformReviewAttribution !== undefined) toSave.platformReviewAttribution = body.platformReviewAttribution;
if (body.conventionalLabels !== undefined) toSave.conventionalLabels = body.conventionalLabels;
if (Object.keys(toSave).length > 0) saveConfig(toSave as Parameters<typeof saveConfig>[0]);
return Response.json({ ok: true });
Expand Down
3 changes: 3 additions & 0 deletions packages/shared/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ export interface PlannotatorConfig {
diffOptions?: DiffOptions;
prompts?: PromptConfig;
conventionalComments?: boolean;
platformReviewAttribution?: boolean;
/** null = explicitly cleared (use defaults), undefined = not set */
conventionalLabels?: CCLabelConfig[] | null;
/**
Expand Down Expand Up @@ -201,6 +202,7 @@ export function getServerConfig(gitUser: string | null): {
diffOptions?: DiffOptions;
gitUser?: string;
conventionalComments?: boolean;
platformReviewAttribution?: boolean;
conventionalLabels?: CCLabelConfig[] | null;
} {
const cfg = loadConfig();
Expand All @@ -209,6 +211,7 @@ export function getServerConfig(gitUser: string | null): {
diffOptions: cfg.diffOptions,
gitUser: gitUser ?? undefined,
...(cfg.conventionalComments !== undefined && { conventionalComments: cfg.conventionalComments }),
...(cfg.platformReviewAttribution !== undefined && { platformReviewAttribution: cfg.platformReviewAttribution }),
...(cfg.conventionalLabels !== undefined && { conventionalLabels: cfg.conventionalLabels }),
};
}
Expand Down
10 changes: 10 additions & 0 deletions packages/ui/components/Settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,7 @@ function parseCCLabels(json: string | null): CCLabelConfig[] {

const CommentsTab: React.FC = () => {
const conventionalComments = useConfigValue('conventionalComments');
const platformReviewAttribution = useConfigValue('platformReviewAttribution');
const labelsJson = useConfigValue('conventionalLabels');
const [labels, setLabels] = useState(() => parseCCLabels(labelsJson));

Expand Down Expand Up @@ -522,6 +523,15 @@ const CommentsTab: React.FC = () => {

return (
<>
<ToggleSwitch
checked={platformReviewAttribution}
onChange={(v) => configStore.set('platformReviewAttribution', v)}
label="Plannotator Attribution"
description="Include “Review from Plannotator” in GitHub and GitLab review bodies"
/>

<div className="border-t border-border" />

<ToggleSwitch
checked={conventionalComments}
onChange={(v) => configStore.set('conventionalComments', v)}
Expand Down
14 changes: 14 additions & 0 deletions packages/ui/config/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,20 @@ export const SETTINGS = {
},
toServer: (v: boolean) => ({ conventionalComments: v }),
},
platformReviewAttribution: {
defaultValue: true as boolean,
fromCookie: () => {
const v = storage.getItem('plannotator-platform-review-attribution');
return v === 'true' ? true : v === 'false' ? false : undefined;
},
toCookie: (v: boolean) => storage.setItem('plannotator-platform-review-attribution', String(v)),
serverKey: 'platformReviewAttribution',
fromServer: (sc: Record<string, unknown>) => {
const v = sc.platformReviewAttribution;
return typeof v === 'boolean' ? v : undefined;
},
toServer: (v: boolean) => ({ platformReviewAttribution: v }),
},
/** JSON-serialized array of label configs, or null for defaults.
* Synced to ~/.plannotator/config.json as a parsed array (not a string). */
conventionalLabels: {
Expand Down