forked from farhoodlabs/paperclip
df425fde96
## Thinking Path > - Paperclip orchestrates AI agents for zero-human companies. > - Operators use issue detail pages and child issue lists to understand multi-step execution plans. > - Ordered sub-issues currently read like a flat table, so dependency chains and current next steps are harder to scan. > - The branch work adds a workflow-oriented presentation for child issues without changing the single-assignee task model. > - This pull request makes ordered sub-issues read more like a progress checklist while preserving normal issue list controls. > - The benefit is that operators can see completed steps, active work, blocked follow-ups, and dependency order at a glance. ## What Changed - Added workflow sorting utilities and tests for dependency-aware child issue ordering. - Added sub-issue progress summary, checklist numbering, current-step affordances, blocker context, and done-state de-emphasis in the issue list UI. - Wired issue detail sub-issue panels to use the workflow sort/progress checklist presentation. - Updated issue service behavior/tests for child issue ordering inputs used by the UI. - Added a Storybook visual review fixture and screenshot helper for the sub-issue workflow checklist surface. ## Verification - `pnpm run preflight:workspace-links && pnpm exec vitest run server/src/__tests__/issues-service.test.ts ui/src/components/IssueRow.test.tsx ui/src/components/IssuesList.test.tsx ui/src/pages/IssueDetail.test.tsx ui/src/lib/issue-detail-subissues.test.ts ui/src/lib/workflow-sort.test.ts` - Result: 6 test files passed, 55 tests passed, 34 embedded Postgres issue-service tests skipped because `@embedded-postgres/darwin-x64` is unavailable on this host. - Visual review: generated Storybook screenshots from the existing local Storybook server on port 6006 with `node scripts/screenshot-subissues.mjs /tmp/pap-2189-subissues-screens http://localhost:6006`. - Screenshot artifacts: - Desktop dark:  - Desktop light:  - Mobile dark:  - Mobile light:  - Local Storybook note: starting a second Storybook process selected port 6008 because 6006 was occupied, then Vite failed with an esbuild host/binary version mismatch (`0.25.12` host vs `0.27.3` binary). The already-running Storybook server on 6006 served the fixture successfully for screenshots. ## Risks - Medium UI risk: the issue list now has additional sub-issue-specific visual states, so dense lists should be checked for spacing and scanability. - Low ordering risk: workflow sorting is covered by focused unit tests, but unusual dependency topologies may still need reviewer attention. - No migration risk: this PR does not add database migrations or touch `pnpm-lock.yaml`. > For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`. ## Model Used - OpenAI Codex, GPT-5 coding agent, tool-enabled shell/git/GitHub workflow. Context window is runtime-provided and not exposed in this environment. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] If this change affects the UI, I have included before/after screenshots - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <noreply@paperclip.ing>
36 lines
1.3 KiB
JavaScript
36 lines
1.3 KiB
JavaScript
import { chromium } from "@playwright/test";
|
|
import { mkdir } from "node:fs/promises";
|
|
import { argv } from "node:process";
|
|
|
|
const outDir = argv[2] ?? "/tmp/paperclip/pap-2189-subissues-screens";
|
|
const baseUrl = argv[3] ?? "http://localhost:6006";
|
|
await mkdir(outDir, { recursive: true });
|
|
|
|
const id = "ux-labs-sub-issues-workflow-checklist--default";
|
|
const runs = [
|
|
{ name: "desktop-1440x900-dark", w: 1440, h: 900, theme: "dark" },
|
|
{ name: "desktop-1440x900-light", w: 1440, h: 900, theme: "light" },
|
|
{ name: "mobile-390x844-dark", w: 390, h: 844, theme: "dark" },
|
|
{ name: "mobile-390x844-light", w: 390, h: 844, theme: "light" },
|
|
];
|
|
|
|
const browser = await chromium.launch();
|
|
try {
|
|
for (const run of runs) {
|
|
const url = `${baseUrl}/iframe.html?id=${id}&viewMode=story&globals=theme:${run.theme}`;
|
|
const context = await browser.newContext({
|
|
viewport: { width: run.w, height: run.h },
|
|
deviceScaleFactor: 2,
|
|
});
|
|
const page = await context.newPage();
|
|
await page.goto(url, { waitUntil: "networkidle", timeout: 30_000 });
|
|
await page.waitForTimeout(1200);
|
|
const file = `${outDir}/${run.name}.png`;
|
|
await page.screenshot({ path: file, fullPage: true });
|
|
console.log("wrote", file);
|
|
await context.close();
|
|
}
|
|
} finally {
|
|
await browser.close();
|
|
}
|