Commit Graph
124 Commits
Author SHA1 Message Date
Osinachi PatrickandGitHub 4e92da55f2 Merge pull request #1 from Wursor
Mirror to GitHub / mirror (push) Canceled after 0s
Frontend updates
2026-10-15 23:23:12 +01:00
SinachPatandClaude Sonnet 5.5 f69ce33dd0 feat(web): marketing theme toggle, site search palette, and phone dev access
- Theme toggle in the nav: follows the device until chosen, remembers the choice, sets data-theme before first paint (no flash).
- Site search: Cmd/Ctrl+K command palette on every marketing page, opened by the shortcut, a nav Search button, or the Docs search field. Searches pages, docs topics and articles that have a page.
- Docs topics move to content.ts so the page and the search index share one source.
- next.config: allowedDevOrigins for private network ranges so a phone on the same Wi-Fi hydrates the dev site. Dev only.
- Sun and moon icons added by hand (not Figma exports); noted in the icons README.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-13 22:27:34 +01:00
Claude 0cff3902b2 feat(web): Product, How it works, Trust, Pricing and Docs pages, with a marketing e2e check
Pricing shows no plans, prices or free trial until decided. Docs search and articles without pages are shown but not linked. Disables the agent file that next dev generates.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SdXCbrN5PtGExkpvMaMHx
2026-10-12 15:34:50 +00:00
Claude 6947113027 feat(web): marketing Home page and the product component library (ADR 0023)
Product UI components are built once at design size from the Figma file and reused by the marketing mockups and, later, the app. Text contrast tokens now meet WCAG AA in both themes, with a test. Pricing stays hidden until decided.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SdXCbrN5PtGExkpvMaMHx
2026-10-12 15:25:50 +00:00
Claude 913d7a8832 feat(web): marketing Button, Nav (with mobile menu) and Footer from Figma, test-first
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SdXCbrN5PtGExkpvMaMHx
2026-10-12 15:00:38 +00:00
Claude e314819629 feat(web): migrate to Next.js App Router and add design tokens (ADR 0018)
The Sprint 1 shell moves to /app with its own root layout so its dark theme does not leak. Figma tokens ported with light and dark parity.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SdXCbrN5PtGExkpvMaMHx
2026-10-12 14:55:59 +00:00
Claude b3fc7d2002 docs: spike plan for hosting on DigitalOcean
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SdXCbrN5PtGExkpvMaMHx
2026-10-12 14:40:45 +00:00
Claude ab485703f2 docs: ADR 0022 hosting on DigitalOcean (WeOwn Cloud)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SdXCbrN5PtGExkpvMaMHx
2026-10-12 14:36:49 +00:00
Claude 1634763180 docs: record decisions ADR 0018-0021 (Next.js, sign-in methods, WeOwn Cloud, no-diff rule) and align PRD, guide and AGENTS.md
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SdXCbrN5PtGExkpvMaMHx
2026-10-12 14:35:01 +00:00
Claude 9772724268 docs: replace PRD with Headless revision 4, add direction update to implementation guide, update changelog
Mirror to GitHub / mirror (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BDvcAvuLeGQbo78PAiYWnP
2026-10-12 15:14:49 +01:00
SinachPat e9de6ba62c fix: store session token on signup and send it to /chat
Mirror to GitHub / mirror (push) Canceled after 0s
- web: App stores sessionToken and passes to useChat; useChat sends Authorization header
- web: ChatPanel adds wursor-message-user/agent test hooks
- verified full UI flow (signup -> chat -> working -> reply -> approve -> preview)
2026-08-17 21:16:43 +01:00
SinachPat 060b181e71 feat: wire chat to the agent loop (POST /chat)
Mirror to GitHub / mirror (push) Canceled after 0s
- api: /chat route runs runAgent (session-required, 503 when unconfigured)
- api: index.ts builds OpenRouterLlmClient + WpRestExecutor from env; loads .env
- web: useChat calls /chat with mock fallback; proxy /chat+/sites+/health
- .env.example: DATABASE_URL empty by default (in-memory dev)
- 111 unit tests green; smoke-tested signup+chat
2026-08-17 17:19:33 +01:00
SinachPat 69287ebec0 feat: build the chat + preview + approve interface
Mirror to GitHub / mirror (push) Canceled after 0s
- web: two-pane app chrome (chat panel + browser-framed preview)
- ChatPanel, Preview, ApproveBar components + useChat (mock agent for now)
- Fluent/Figma design system (Inter, dark chrome, elevation, motion)
- 107 unit tests + Playwright e2e green; web typechecks + builds
2026-08-17 17:10:25 +01:00
SinachPat b61ff21710 feat: de-risk agent loop — semantic tool schema + agent loop + real-WP spike harness
Mirror to GitHub / mirror (push) Canceled after 0s
- api/agents: tool-schemas (semantic allowlist), agent-loop (multi-step + budget), circuit-breaker, llm-client/tool-executor interfaces
- api/agents: WpRestExecutor (real WP REST), OpenRouterLlmClient
- e2e/agent: multi-step prompts + run-agent-spike runner (scores rendered changes)
- ADR 0017; 101 unit tests green
2026-08-15 23:49:07 +01:00
SinachPat 69b2481299 feat: Sprint 2 — WordPress plugin (auth/api/site-info/admin) + web SiteConnector
Mirror to GitHub / mirror (push) Canceled after 0s
- plugin: Wursor_Auth (token hashing, HMAC, scoped tokens), Wursor_API (REST + auth), Wursor_Site_Info (builder/capabilities/preflight), Wursor_Admin
- plugin: test-auth.php (10 auth tests, run in a WP+PHP env)
- web: SiteConnector pairing UI (code + poll + states)
- api: PluginClient signs full REST route (matches WP get_route)
- 92 unit tests green
2026-08-15 23:17:16 +01:00
SinachPat 9801b9475b feat: Sprint 2 — Wursor-side pairing flow + signed plugin client
Mirror to GitHub / mirror (push) Canceled after 0s
- session store + requireSession middleware (signup persists session)
- PairingService (8-char code, 5-min TTL, 5-attempt lockout, single-use, https check)
- POST /sites/pair, /sites/redeem, /sites/:id/confirm, GET /sites/:id
- PluginClient signs HMAC (timestamp+method+path+body-hash), token in Authorization
- ADR 0016; 58 api tests green
2026-08-15 23:10:19 +01:00
SinachPat 02f55b4543 docs: DevOps/infrastructure handoff brief
Mirror to GitHub / mirror (push) Canceled after 0s
2026-08-15 20:31:56 +01:00
SinachPat df2315087d feat: Sprint 1 remainder — Postgres store, Docker client, warm pool, sessions route
Mirror to GitHub / mirror (push) Canceled after 0s
- PostgresUserStore (Queryable) + migration + env-gated wiring
- DockerodeClient behind injected DockerEngine
- ImageManager, WarmPool, Dockerfile.wordpress, docker-compose
- POST /sessions spins up sandbox (503 when unconfigured)
- ADRs 0014-0015; 68 unit tests green
2026-08-15 20:18:34 +01:00
SinachPat 97f31315bd docs: ADRs 0011-0013 for Sprint 1 stack, user store, and Docker boundary
Mirror to GitHub / mirror (push) Canceled after 0s
2026-08-15 20:07:44 +01:00
SinachPat a037b882e9 feat: Sprint 1 — Playwright e2e + sandbox orchestration (TDD)
Mirror to GitHub / mirror (push) Canceled after 0s
- e2e: Playwright chat-flow (sign up -> chat) with api/web webServer harness
- api: sandbox services subset/media-proxy/manifest/gc + DockerClient contract
- api: SandboxManager orchestrator (fake-Docker tested); /health route
- 53 unit tests green; Playwright e2e green
2026-08-15 20:01:58 +01:00
SinachPat 9733ba6e3c feat: Sprint 1 slice 1 — API signup + web signup/chat shell
Mirror to GitHub / mirror (push) Canceled after 0s
- api: Fastify POST /auth/signup (validation, scrypt hash, in-memory store)
- web: React+Vite SignUp form and chat shell with dev proxy
- 35 tests green (api 5, web 2, e2e 28)
2026-08-15 19:53:13 +01:00
SinachPat 2f53b1901b ci: reference GITEA secret by its actual name
Mirror to GitHub / mirror (push) Canceled after 0s
2026-08-15 18:57:40 +01:00
SinachPat 6eeac23719 chore: update repo references after transfer to Wursor org 2026-08-15 18:10:03 +01:00
SinachPat 9a7058c85b feat: auto-load .env in golden harness; scaffold CI workflow 2026-08-15 18:05:37 +01:00
SinachPat 0d6afab425 feat: add OpenRouter provider to golden harness, close Phase 0 gate
- provider-agnostic llm-client (grok + openrouter) with page-slug context
- live golden run scored and passing via x-ai/grok-4.6
- ADR 0010; spike docs flipped to done
2026-08-15 17:58:09 +01:00
SinachPat f42549c451 ci: grant contents write permission for mirror push 2026-08-15 14:59:51 +01:00
SinachPat ffe666f479 ci: point mirror at correct Gitea repo pat/wursor 2026-08-15 14:57:42 +01:00
SinachPat d34347b1d9 chore: expand gitignore to cover common secret files 2026-08-15 14:53:35 +01:00
SinachPat bb84ab5aef ci: bidirectional mirror between GitHub and Gitea 2026-08-15 14:08:45 +01:00
SinachPat 1f017cd9b0 docs: add decision records, changelog, and repo index links 2026-08-15 14:06:45 +01:00
SinachPat 6e59a8a36b feat: Phase 0 workspace, spikes, and golden harness
Stand up the monorepo skeleton and land the first Phase 0 artifacts:
pairing threat model, plugin catalog, builder detect, 20-prompt golden
harness, and synthetic 2GB mirror timing.
2026-08-15 09:44:43 +01:00
SinachPat 0dae13cfd3 feat: add pstack-style rigor skill family for Zed
- wursor-precheck: router skill, entry point for non-trivial tasks
- wursor-principles: 21 engineering principles adapted for Wursor
- wursor-tdd, wursor-bug-fix, wursor-feature, wursor-investigation,
  wursor-review, wursor-decision-log: playbook skills
- AGENTS.md: repo guide wiring the skill routing table
- Fix: double-quote YAML frontmatter descriptions (colon-space in
  plain scalars broke Zed's skill loader)
2026-08-14 14:23:06 +01:00
SinachPat dfb3c9372b docs: PRD v2.0, IMPLEMENTATION v2.0 — non-technical-first pivot
Complete rewrite of both documents from engineer-first to non-technical-first:

Architecture changed:
- Desktop app (Tauri + Monaco) → Web app (React + Node.js)
- Local Docker runtime → Cloud-hosted sandboxes (Wursor-hosted, VPS)
- Code editor + terminal + diff panels → Chat interface + live preview + approve/reject
- Tools for engineers (fs, git, wp-cli) → Playbooks for everyone (content, design, plugins)
- BYO API key → Wursor-hosted model (Grok)

Product changed:
- Primary user: WordPress engineer → WordPress site owner (non-technical)
- Interface: code editor with panels → single chat input + live preview
- Safety model: permission tiers + file diffs → cloud sandbox + approve/reject
- Deploy: Git-based → plugin-based with one-click rollback
- Competitive frame: dev tools → WP management layer

Key new sections:
- Cloud sandbox orchestration with warm pool, mirroring, lazy media sync
- WordPress plugin connector (REST API, deploy receiver, rollback)
- Deploy mechanism (diff engine, pusher, verifier, rollback)
- New playbook system (content, design, plugin, site build)
- Error states for the web app + plugin paradigm
- Non-technical personas, principles, and UX
2026-08-13 18:57:12 +01:00
SinachPat 4403c8c5e8 docs: PRD v1.3 — Tauri/Monaco shell, Grok model
- Shell decision changed from Electron + Code-OSS to Tauri (Rust) + Monaco Editor
  - Fast startup (~0.3-0.8s), low memory (100-200MB) via system webview
  - Rust backend for tool bus, knowledge graph parser, permission engine, runtime manager
  - Rationale documented vs Electron and Zed
- Model changed from Claude to Grok (xAI), BYO API key
- IMPLEMENTATION.md rewritten for Rust/Tauri stack: crates layout, Rust TDD tests, cargo-based CI
- Phase 1 roadmap, test strategy, decisions section updated to match
2026-08-13 13:12:04 +01:00
SinachPat 6b878dbb14 docs: PRD v1.2 — Wursor rename, key decisions locked, all gaps addressed
- Renamed product from Wordbench to Wursor across all touchpoints
- Locked key decisions: Electron + Code-OSS shell, Claude BYO key, wp-env only v1
- Added first-run experience (§7.1.8), error states (§8.5), agent substrate (§8.1.1)
- Expanded State Diff lifecycle (§6.4), Knowledge Graph strategy (§6.2)
- Strengthened verify-as-proof principle (§5, §7.1.6)
- Added metrics baselines + owners (§11), exit criteria for Phases 1-2 (§12)
- Added test strategy (§C.1), accessibility/i18n as non-goal (§C)
- Created IMPLEMENTATION.md — TDD-driven 8-sprint build guide
2026-08-13 12:49:23 +01:00
Osinachi Patrick 0f08ccea07 docs: PRD v1.1 — WordPress-native voice, drop editor-clone framing 2026-08-12 11:54:09 +01:00
Osinachi Patrick 702ce4e9c1 chore: pivot to Wordbench — remove Originmain codebase, add PRD
Clears the prior AI design-engineering product and replaces the repo with the Wordbench (agentic WordPress development environment) PRD.
2026-08-12 11:43:10 +01:00
SinachPat 65a9051bf5 updated stuff 2026-05-13 15:20:54 +01:00
SinachPat 7bf43fc481 updated stuff 2026-05-13 15:12:51 +01:00
SinachPat 8356e6278c updated stuff 2026-05-10 20:52:34 +01:00
SinachPat f51dfa5e4d updated stuff 2026-05-10 01:19:20 +01:00
SinachPat a2ab1c5dc6 updated stuff 2026-05-10 01:16:09 +01:00
SinachPat 4b7f14564a updated stuff 2026-05-10 00:45:55 +01:00
SinachPat c53db55209 updated stuff 2026-05-09 20:37:27 +01:00
SinachPat 3c5bbaea0b updated stuff 2026-05-09 20:23:34 +01:00
SinachPatandClaude Sonnet 4.6 1a5d84cb58 fix: make hook.inject robust against React Refresh timing race
Root cause: the React DevTools browser extension injects a hook stub at
document_start (before HTML parsing), so hook.inject can be undefined
when React Fast Refresh runs. React Refresh destructures inject as
undefined and later calls undefined.apply() -> TypeError. This prevents
React from ever setting injectedHook, so onCommitFiberRoot is never called.

Fix: unconditionally replace hook.inject with a wrapper that tries the
captured previous inject (with try/catch) then falls back to our own
renderer ID allocation. Works regardless of script execution order.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 17:11:01 +01:00
SinachPatandClaude Sonnet 4.6 b59a3dddd3 debug: add console diagnostics to fiber hook to trace React detection failure
Logs at: script activation, React inject() call, onCommitFiberRoot fire,
and captureExistingTree DOM scan result. Temporary — remove after diagnosis.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 10:29:06 +01:00
SinachPatandClaude Sonnet 4.6 14e4db6468 fix: externalize typescript in CLI esbuild bundle
indexer.ts imports typescript directly. Bundling it into an ESM output
causes 'Dynamic require of fs is not supported' because typescript uses
CJS require() for Node built-ins internally.

Marking typescript as external drops the CLI bundle from 9.9 MB to 417 KB
and fixes the startup crash on Node 22.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07 14:32:43 +01:00
SinachPatandClaude Sonnet 4.6 8af7dacacc fix: add inject() to legacy buildFiberHookScript hook as well
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07 14:10:23 +01:00
SinachPatandClaude Sonnet 4.6 d1d5e352c8 fix: add inject() to DevTools hook so React actually calls onCommitFiberRoot
React's injectInternals() calls hook.inject(renderer) before it will ever
invoke onCommitFiberRoot. When inject is missing, React's try/catch silently
bails and injectedHook stays null — our handler is never reached regardless
of how correctly onCommitFiberRoot is set up.

Fix: define inject() on the hook we create (returns a renderer ID and stores
the renderer in hook.renderers, matching the React DevTools spec). Also
patches inject onto any existing stub hook that lacks it, so third-party
minimal hooks don't silently block registration.

This is the root cause of the 'Static HTML page' false positive on apps
that don't have the React DevTools browser extension installed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07 14:04:29 +01:00