Changes from fix/bug-fixes-1rc

This commit is contained in:
gsxdsm
2026-03-01 21:59:02 -08:00
parent 57bcb2802d
commit 34161ccc08
4 changed files with 31 additions and 11 deletions

View File

@@ -179,11 +179,18 @@ export function AgentOutputModal({
enabled: open && !!resolvedProjectPath, enabled: open && !!resolvedProjectPath,
}); });
// Fetch feature data to access the server-side accumulated summary // Fetch feature data to access the server-side accumulated summary.
// Also used to show fresh description/status instead of potentially stale props
// (e.g. when opening via deep link from a notification click).
const { data: feature, refetch: refetchFeature } = useFeature(resolvedProjectPath, featureId, { const { data: feature, refetch: refetchFeature } = useFeature(resolvedProjectPath, featureId, {
enabled: open && !!resolvedProjectPath && !isBacklogPlan, enabled: open && !!resolvedProjectPath && !isBacklogPlan,
}); });
// Prefer fresh data from server over potentially stale props passed at open time.
const resolvedDescription = feature?.description ?? featureDescription;
const resolvedStatus = feature?.status ?? featureStatus;
const resolvedBranchName = feature?.branchName ?? branchName;
// Reset streamed content when modal opens or featureId changes // Reset streamed content when modal opens or featureId changes
useEffect(() => { useEffect(() => {
if (open) { if (open) {
@@ -519,7 +526,7 @@ export function AgentOutputModal({
<DialogHeader className="shrink-0"> <DialogHeader className="shrink-0">
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 pr-10"> <div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 pr-10">
<DialogTitle className="flex items-center gap-2"> <DialogTitle className="flex items-center gap-2">
{featureStatus !== 'verified' && featureStatus !== 'waiting_approval' && ( {resolvedStatus !== 'verified' && resolvedStatus !== 'waiting_approval' && (
<Spinner size="md" /> <Spinner size="md" />
)} )}
Agent Output Agent Output
@@ -581,7 +588,7 @@ export function AgentOutputModal({
className="mt-1 max-h-24 overflow-y-auto wrap-break-word" className="mt-1 max-h-24 overflow-y-auto wrap-break-word"
data-testid="agent-output-description" data-testid="agent-output-description"
> >
{featureDescription} {resolvedDescription}
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
@@ -601,7 +608,7 @@ export function AgentOutputModal({
{resolvedProjectPath ? ( {resolvedProjectPath ? (
<GitDiffPanel <GitDiffPanel
projectPath={resolvedProjectPath} projectPath={resolvedProjectPath}
featureId={branchName || featureId} featureId={resolvedBranchName || featureId}
compact={false} compact={false}
useWorktrees={useWorktrees} useWorktrees={useWorktrees}
className="border-0 rounded-lg" className="border-0 rounded-lg"

View File

@@ -595,8 +595,8 @@ function RootLayoutContent() {
'[FAST_HYDRATE] Background reconcile: cache updated (store untouched)' '[FAST_HYDRATE] Background reconcile: cache updated (store untouched)'
); );
// Selectively reconcile event hooks from server. // Selectively reconcile event hooks and ntfy endpoints from server.
// Unlike projects/theme, eventHooks aren't rendered on the main view, // Unlike projects/theme, these aren't rendered on the main view,
// so updating them won't cause a visible re-render flash. // so updating them won't cause a visible re-render flash.
const serverHooks = (finalSettings as GlobalSettings).eventHooks ?? []; const serverHooks = (finalSettings as GlobalSettings).eventHooks ?? [];
const currentHooks = useAppStore.getState().eventHooks; const currentHooks = useAppStore.getState().eventHooks;
@@ -609,6 +609,19 @@ function RootLayoutContent() {
); );
useAppStore.setState({ eventHooks: serverHooks }); useAppStore.setState({ eventHooks: serverHooks });
} }
// Reconcile ntfy endpoints from server (same rationale as eventHooks)
const serverEndpoints = (finalSettings as GlobalSettings).ntfyEndpoints ?? [];
const currentEndpoints = useAppStore.getState().ntfyEndpoints;
if (
JSON.stringify(serverEndpoints) !== JSON.stringify(currentEndpoints) &&
serverEndpoints.length > 0
) {
logger.info(
`[FAST_HYDRATE] Reconciling ntfyEndpoints from server (server=${serverEndpoints.length}, store=${currentEndpoints.length})`
);
useAppStore.setState({ ntfyEndpoints: serverEndpoints });
}
} catch (e) { } catch (e) {
logger.debug('[FAST_HYDRATE] Failed to update cache:', e); logger.debug('[FAST_HYDRATE] Failed to update cache:', e);
} }

View File

@@ -28,7 +28,7 @@ test.describe('Feature Deep Link', () => {
let projectPath: string; let projectPath: string;
let projectName: string; let projectName: string;
test.beforeEach(async ({}, testInfo) => { test.beforeEach(async (_fixtures, testInfo) => {
projectName = `test-project-${testInfo.workerIndex}-${Date.now()}`; projectName = `test-project-${testInfo.workerIndex}-${Date.now()}`;
projectPath = path.join(TEST_TEMP_DIR, projectName); projectPath = path.join(TEST_TEMP_DIR, projectName);
fs.mkdirSync(projectPath, { recursive: true }); fs.mkdirSync(projectPath, { recursive: true });

8
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "automaker", "name": "automaker",
"version": "0.15.0", "version": "1.0.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "automaker", "name": "automaker",
"version": "0.15.0", "version": "1.0.0",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"workspaces": [ "workspaces": [
@@ -33,7 +33,7 @@
}, },
"apps/server": { "apps/server": {
"name": "@automaker/server", "name": "@automaker/server",
"version": "0.15.0", "version": "1.0.0",
"license": "SEE LICENSE IN LICENSE", "license": "SEE LICENSE IN LICENSE",
"dependencies": { "dependencies": {
"@anthropic-ai/claude-agent-sdk": "0.2.32", "@anthropic-ai/claude-agent-sdk": "0.2.32",
@@ -99,7 +99,7 @@
}, },
"apps/ui": { "apps/ui": {
"name": "@automaker/ui", "name": "@automaker/ui",
"version": "0.15.0", "version": "1.0.0",
"hasInstallScript": true, "hasInstallScript": true,
"license": "SEE LICENSE IN LICENSE", "license": "SEE LICENSE IN LICENSE",
"dependencies": { "dependencies": {