YeonGyu-Kim
6fd5e7c9ec
fix(web): switch OG image from next/og to static PNG file convention
...
PR #4202 introduced dynamic OG via app/opengraph-image.tsx + app/twitter-image.tsx
using next/og ImageResponse. Build succeeds, but deploy to Cloudflare Workers
fails:
✘ [ERROR] Unable to extract npm package name from
.open-next/server-functions/default/node_modules/next/dist/compiled/
@vercel/og/yoga.wasm?module
[plugin wrangler-module-collector]
##[error]The process '/home/runner/.bun/bin/bunx' failed with exit code 1
Root cause: wrangler-module-collector can't resolve @vercel/og's bundled
yoga.wasm import from the OpenNext server-functions output. Known regression
in @opennextjs/cloudflare interop with @vercel/og (related to issue #1163 +
PRs #1169/#1176 in opennextjs/opennextjs-cloudflare, plus newer bundling
discussion in #1221 ).
Fix: switch to Next.js file convention static OG images. Place
app/opengraph-image.png + app/twitter-image.png (the same 1200x630
PNG that was being rendered dynamically). Next.js auto-emits og:image +
twitter:image metadata pointing at these routes, with correct
og:image:width/height/type tags. No @vercel/og, no WASM, no edge runtime.
The static PNGs were generated from PR #4202 's dynamic ImageResponse during
local QA - identical visual output: dark #0a0a0a background, cyan
#00d4ff brand wordmark, headline, install command pill, terminal cursor.
Build verified: /opengraph-image.png and /twitter-image.png now show as
static routes (0 B route handler size). First-load JS unchanged.
Future-revisit: re-enable dynamic OG when @opennextjs/cloudflare ships the
fixes from PRs #1169/#1176/#1221 stable for Next 15.x deploys.
2026-05-20 15:16:02 +09:00
YeonGyu-Kim
5154ab4c6f
Merge pull request #4202 from code-yeongyu/feature/web-portfolio-refinement-20260520
...
feat(web): designer-portfolio refinement + dynamic OG + perf -46%
2026-05-20 15:10:13 +09:00
YeonGyu-Kim
e9c44ddb1b
fix(web): drop nested <main> on manifesto (WCAG 1.3.1)
...
LocalizedPageShell at app/_components/localized-page-shell.tsx:34
already renders <main className='flex-1'>{children}</main> as the
page landmark. The manifesto/page.tsx shell was wrapping that with
its own <main>, producing nested main landmarks (axe-core:
landmark-no-duplicate-main + landmark-main-is-top-level).
Switch outer wrapper to <div>; keep styling (bg-background,
text-foreground, min-h-screen, overflow-x-hidden) intact. The
inner <main> from the shell remains the canonical landmark.
Pre-existing on origin/dev (the pre-decomposition manifesto/page.tsx
also had a top-level <main>), surfaced by PR #4202 hands-on QA
via axe-core run on /ko/manifesto.
2026-05-20 15:00:22 +09:00
YeonGyu-Kim
f5d5e9801b
fix(web): hero Get Started CTA -> /docs#installation ( closes #3848 )
...
Get Started button previously linked to /docs (root), landing users on
Overview. Issue #3848 reporter and concurrent PR #3948 asked for a
deeper link straight to Installation.
lib/docs-sections.ts declares 'installation' as a stable section id
rendered via <section id={section.id}> in app/[locale]/docs/page.tsx,
so /docs#installation is a valid deep link.
This also supersedes the in-flight PR #3948 (which targets the
pre-decomposition landing-page.tsx).
2026-05-20 14:40:24 +09:00
YeonGyu-Kim
64997d5e81
test(web): responsive matrix — 6 viewports x 4 locales x 2 pages
...
e2e/responsive.spec.ts (new):
- 6 viewports: iPhone SE (375x667), iPhone 14 Pro (390x844),
iPad mini (768x1024), iPad Pro (1024x1366), laptop (1280x800),
desktop (1920x1080)
- 4 locales: en, ko, ja, zh
- 2 pages: landing /, manifesto /manifesto
- Checks: no horizontal scroll, no overflow-x, primary CTA visible,
hero headline visible, nav button hit target (44x44 mobile / 32x32
desktop)
48 tests total. All pass against current build.
/docs has pre-existing horizontal overflow at 1024px viewport
(fixed-width sidebar interacting with code blocks). Intentionally
out of scope for this PR — commented in the spec, tracked as
follow-up.
2026-05-20 14:27:02 +09:00
YeonGyu-Kim
623af75962
feat(web): dynamic OG + Twitter card images via next/og
...
app/opengraph-image.tsx (new):
- next/og ImageResponse, 1200x630 PNG
- Dark #0a0a0a background + cyan #00d4ff brand wordmark + headline
+ install command pill + terminal cursor
- Google Fonts loadGoogleFont helper for Geist 400/700 +
Geist Mono 500 (runtime fetch, Cloudflare Workers compatible)
- Cache-Control: public, immutable, max-age=31536000
app/twitter-image.tsx (new):
- Same shape as OG with Twitter-card alt text
- Inherits twitter:card=summary_large_image from layout
app/layout.tsx:
- metadata.alternates.languages: explicit canonical URLs for en/ko/
ja/zh so search engines pick up hreflang
- metadata.openGraph.alternateLocale: ko_KR, ja_JP, zh_CN
- Drop manual openGraph.images / twitter.images: file-based metadata
convention now auto-emits og:image:width, og:image:height,
og:image:type, twitter:image:width, twitter:image:height
- metadata.robots: max-image-preview=large, max-snippet=-1
(richer SERP previews)
Verified: curl /opengraph-image returns 200, content-type image/png,
1200x630 PNG body. All 4 hreflang links present in <head>.
2026-05-20 14:27:02 +09:00
YeonGyu-Kim
022eb78440
refactor(web): decompose 358-LOC manifesto into 9 section components
...
app/[locale]/manifesto/page.tsx: 358 LOC -> 22-LOC composition shell.
components/manifesto/sections/:
- hero.tsx
- pain-points.tsx
- indistinguishable.tsx (the 'AI vs senior engineer' argument)
- token-cost.tsx
- cognitive-load.tsx
- principles.tsx
- core-loop.tsx
- future.tsx
- final-cta.tsx
Each section 26-68 LOC. Copy unchanged; section order unchanged.
Same i18n namespace ('manifesto'). Renders identically to baseline
in all 4 locales (en/ko/ja/zh).
2026-05-20 14:27:02 +09:00
YeonGyu-Kim
4d5f58f0c3
refactor(web): decompose 832-LOC landing into 10 section components
...
app/_components/landing-page.tsx: 832 LOC -> 33-LOC composition shell.
Each section becomes a focused, named component under
components/landing/sections/:
- hero.tsx: terminal headline + install command + primary CTA
- ultrawork.tsx: ultrawork mode pitch
- sisyphus.tsx: Sisyphus orchestrator showcase
- prometheus-atlas.tsx: planner + executor pair (was amber+indigo,
now violet — single secondary accent)
- hephaestus.tsx: code surgeon (was orange, now cyan)
- team-mode.tsx: parallel team coordination (was fuchsia/purple/cyan
gradient, now solid cyan headline + violet skills accent)
- sub-agents.tsx: explore/librarian/oracle/multimodal etc.
- architecture.tsx: 4-tier diagram
- reviews.tsx: testimonials (Star kept text-cyan-500 / fill-cyan-500,
on-brand)
- cta.tsx: final call-to-action
components/landing/constants.ts (new):
- SUB_AGENT_KEYS, AGENT_STYLES, PRINCIPLE_KEYS, PRINCIPLE_ICONS,
REVIEW_KEYS, CATEGORY_ROUTING, SKILL_INJECTIONS
- Single source of truth for agent/principle/review metadata used
across sections
components/icons/github-icon.tsx (new):
- Extracted inline SVG into a typed component with default
aria-hidden and overridable size/className
Color consolidation: 9-color rainbow per-section -> cyan (primary)
+ violet (secondary, agent identity) + neutral grays + status colors
only. 'Evolution not revolution': dark + cyan brand soul intact.
2026-05-20 14:27:02 +09:00
YeonGyu-Kim
78ca837e82
style(web): extract design system tokens + DESIGN.md
...
DESIGN.md: 7-section design system (palette, typography, spacing,
motion, components, sections, banned patterns). Documents existing
dark + cyan brand to enforce 'evolution not revolution'.
globals.css: add design tokens — --surface-{0..3}, --text-{primary,
secondary,tertiary}, --accent-primary{,-soft,-border}, --border-
{default,subtle}, status tokens (success/warning/danger/info).
Add .reveal-on-enter utility: opacity 0 → 1, translateY(8px) → 0
over 600ms cubic-bezier(0.16, 1, 0.3, 1). Triggered via
'data-revealed' attribute set by IntersectionObserver upstream.
Respects 'prefers-reduced-motion: reduce' — falls back to instant
opacity transition.
Add .ring-cyan focus utility consolidating focus-visible rings
across components (was ad-hoc per-component).
2026-05-20 14:26:09 +09:00
YeonGyu-Kim
7e0406f4ec
fix(web): UX/a11y polish + middleware metadata route fix
...
- footer.tsx: Discord link → canonical discord.gg/PUwSMR9XNk
(was outdated invite that 404'd).
- [locale]/layout.tsx: hooks count 40 → 54 (matches AGENTS.md).
- lib/stats.ts:88: drop '!' non-null assertion; use '??' fallback.
Removes the only '!' in packages/web (project rule).
- nav-header.tsx: hamburger Button size='icon' → explicit h-11 w-11;
mobile drawer links min-h-11 px-3 rounded-md. WCAG 2.5.5 tap
target 44x44 minimum.
- install-command.tsx: copy button h-8 w-8 → h-11 w-11 (was 32px,
below WCAG). Icon stays 16x16; padding fills to 44.
- middleware.ts: matcher excludes opengraph-image, twitter-image,
icon, apple-icon, manifest.webmanifest, robots.txt, sitemap.xml.
Previously next-intl redirected /opengraph-image → /en/opengraph-image
breaking OG previews for crawlers that hit the unlocalized path.
2026-05-20 14:26:09 +09:00
YeonGyu-Kim
68b80e0343
perf(web): optimize CI + build pipeline
...
- web-ci.yml: cache .next/cache via actions/cache; drop duplicate
next build (was running twice — typecheck + main); workflow now
short-circuits on cache hits.
- scripts/prepare-build.mjs: gate fetch-cache purge behind
PREPARE_BUILD_PURGE_CACHE env (default off). preview/deploy npm
scripts no longer invoke it.
- scripts/generate-docs-content.mjs: skip write when content
unchanged (idempotent); avoids "file mtime changed" cache busts.
- eslint.config.mjs: strip rules already enforced by Biome
(formatting, import order, unused vars) — removes redundant
passes, halves lint time on cold runs.
- playwright.config.ts: 2 workers in CI (was 1); webServer command
uses already-built artifacts via 'bun run build'.
Cold build: 16.2s → 8.7s (-46%). Recompile 1.45s.
2026-05-20 14:26:08 +09:00
YeonGyu-Kim
9799c54a92
chore(web): remove dead deps + safe version bumps
...
Removed motion v12.38 (zero imports) and @radix-ui/react-accordion
(unused) from runtime deps. Removed 4 dead components: code-block,
option-table, accordion, mdx-components — all had zero references.
Bumped safe caret deps via bun update:
- marked 18.0.3 → 18.0.4
- @opennextjs/cloudflare 1.19.10 → 1.19.11
- wrangler 4.92.0 → 4.93.0
- postcss override 8.5.14 → 8.5.15 (closes GHSA-qx2v-qp2m-jg93)
- @types/node 25.8.0 → 25.9.1
- @types/react 19.2.14 → 19.2.15
- typescript-eslint 8.59.3 → 8.59.4
Bundle shrinks by removing motion (≈ 60 KB) from node_modules even
though it had no runtime usage.
2026-05-20 14:22:58 +09:00
YeonGyu-Kim
faf2b02163
fix(lsp): update lsp-tools-mcp cleanup
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 14:19:05 +09:00
YeonGyu-Kim
18b5891489
docs(reference): cross-module rules injection comparison report
...
Captures the porting decisions made in this round (pi-rules fingerprinting + omo transcript-aware dedup) along with the pre/post functional and performance gap matrices for codex-rules, pi-rules, and the omo rules-injector.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 14:03:38 +09:00
YeonGyu-Kim
fbe423a2d4
feat(rules-injector): hydrate dedup cache from session transcript
...
Ports the codex-rules transcript-aware dedup strategy: when a session cache is fresh (process restart or compaction-cleared cache), the injector now scans prior tool outputs for the `[Rule: <relativePath>]` banner and pre-populates the cache so duplicate rule injections are suppressed even when the persistent JSON has been lost. Hydration runs at most once per session per process, fails open on transport errors, and is short-circuited when the same banner reappears.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:58:13 +09:00
YeonGyu-Kim
4de2782ba0
Merge pull request #4201 from code-yeongyu/fix/test-isolation-cross-test-state-leak
...
fix(test-isolation): isolate rules injector storage and fixture home
2026-05-20 13:38:41 +09:00
YeonGyu-Kim
f8d04d743b
fix(test-isolation): isolate rules injector storage and fixture home
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:37:18 +09:00
YeonGyu-Kim
c6dc266f2f
test(test-isolation): add diagnostic regression test for cross-suite leak
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:34:24 +09:00
YeonGyu-Kim
504a7779e7
Merge pull request #4200 from code-yeongyu/fix/rules-core-restore-sisyphus-with-deprecation-warning
...
fix(rules-core): restore .sisyphus/rules discovery with deprecation warning (planned removal v4.3.0)
2026-05-20 13:24:31 +09:00
YeonGyu-Kim
dd9dd42895
Merge pull request #4199 from code-yeongyu/fix/parent-wake-same-source-reservation-requeue
...
fix(background-agent): re-enqueue parent wake on same-source reservation instead of dropping
2026-05-20 13:24:28 +09:00
YeonGyu-Kim
12aaff28b5
test(rules-core): isolate sisyphus deprecation warning assertion
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:24:24 +09:00
YeonGyu-Kim
53ddc470e3
test(rules-injector): align duplicate-cache mock types
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:24:24 +09:00
YeonGyu-Kim
d92894a34b
docs(changelog): document .sisyphus/rules restoration and planned removal in v4.3.0
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:24:24 +09:00
YeonGyu-Kim
1bab6ec412
fix(rules-core): restore .sisyphus/rules discovery with deprecation warning (planned removal v4.3.0)
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:24:24 +09:00
YeonGyu-Kim
7ffe823fa9
test(rules-core): add red tests for restored .sisyphus/rules discovery + deprecation warning (BUG-G)
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:24:24 +09:00
YeonGyu-Kim
11d2cfb8a8
fix(background-agent): re-enqueue parent wake on same-source reservation instead of dropping
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:24:08 +09:00
YeonGyu-Kim
ee8b80a5e2
test(background-agent): add red test for parent-wake drop on same-source reservation hold (BUG-E)
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:24:08 +09:00
YeonGyu-Kim
1760ffb65a
Merge pull request #4196 from code-yeongyu/fix/rules-core-fallback-to-workspace-when-no-project-root
...
fix(rules-core): fall back to workspace directory when no project root marker is found
2026-05-20 13:21:45 +09:00
YeonGyu-Kim
1f9a581e70
fix(rules-core): fall back to workspace directory when no project root marker is found
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:20:47 +09:00
YeonGyu-Kim
2c62e7297b
test(rules-core): add red test for project rule discovery in markerless workspaces (BUG-F)
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:20:47 +09:00
YeonGyu-Kim
913cc08960
Merge pull request #4198 from code-yeongyu/fix/ast-grep-mcp-allow-absolute-paths-inside-workspace
...
fix(ast-grep-mcp): allow absolute paths whose realpath is inside the workspace
2026-05-20 13:19:49 +09:00
YeonGyu-Kim
4c7d7e8c2b
Merge pull request #4197 from code-yeongyu/fix/prompt-gate-event-shapes-and-finish-marker
...
fix(runtime-fallback,prompt-gate): recognize all OpenCode progress event shapes and boolean/completed finish markers
2026-05-20 13:19:46 +09:00
YeonGyu-Kim
bd2823e805
Merge pull request #4195 from code-yeongyu/fix/team-send-message-ambiguous-delivery-loss
...
fix(team-mode): release reservation on ambiguous failure, commit on success-path mark failure
2026-05-20 13:17:11 +09:00
YeonGyu-Kim
9cdcb4293e
revert(agents-md): restore ROADMAP warning banner unrelated to this PR
...
The previous commits in this branch inadvertently dropped the prominent
ROADMAP-refactor-in-progress warning from AGENTS.md. That change is
unrelated to fixing the team_send_message ambiguous delivery loss and
should not ride along with this PR.
This commit restores the banner verbatim from the dev branch tip.
2026-05-20 13:12:35 +09:00
YeonGyu-Kim
2ea2159d80
fix(ast-grep-mcp): allow absolute paths whose realpath is inside the workspace
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:12:34 +09:00
YeonGyu-Kim
b2e42e1b2c
test(ast-grep-mcp): add red test for absolute paths inside workspace
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:12:34 +09:00
YeonGyu-Kim
f8f4b572dc
fix(runtime-fallback,prompt-gate): recognize all OpenCode progress event shapes and boolean/completed finish markers
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:12:06 +09:00
YeonGyu-Kim
20efb79fbf
test(runtime-fallback,prompt-gate): add red tests for event-shape and finish-marker blind spots (BUG-C+D)
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:12:06 +09:00
YeonGyu-Kim
da5aa7f32e
test(team-mode): allow reclaimed reservations to stay readable
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:05:57 +09:00
YeonGyu-Kim
579b8c38da
docs(AGENTS.md): add aggressive refactoring-in-progress warning
2026-05-20 13:05:35 +09:00
YeonGyu-Kim
f79da77fe0
test(team-mode): decouple resume history fixture from session routing
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 13:00:48 +09:00
YeonGyu-Kim
af42f0ac70
test(team-mode): stabilize resume stale reservation history check
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 12:52:00 +09:00
YeonGyu-Kim
655dffbc2a
fix(team-mode): release reservation on ambiguous failure, commit on success-path mark failure
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 12:30:02 +09:00
YeonGyu-Kim
7adb833609
test(team-mode): add red tests for ambiguous delivery loss (BUG-A + BUG-B)
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-05-20 12:28:40 +09:00
YeonGyu-Kim
847a8db2dc
fix(runtime-fallback): preserve accepted pending retries
2026-05-20 11:42:46 +09:00
YeonGyu-Kim
6df148f0f6
fix(team-mode): close peer message delivery races
2026-05-20 11:42:38 +09:00
YeonGyu-Kim
d3e218f912
fix(prompt): treat post-dispatch failures as accepted
2026-05-20 11:42:32 +09:00
YeonGyu-Kim
f540249838
docs(readme): add OmO logo to hero section
...
Place transparent boulder mark above the existing hero banner across
all four locale READMEs (en/ko/ja/zh-cn).
2026-05-19 19:19:40 +09:00
YeonGyu-Kim
b2918fd4db
fix(team-mode): close peer message delivery races
2026-05-19 19:18:13 +09:00
YeonGyu-Kim
bcea4a9d28
fix(prompt-gate): harden sync and team prompt dispatch
2026-05-19 19:18:13 +09:00