AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Get more out of every AI. An AI utilisation platform that turns vague intentions into a confirmed brief, sharper prompts, audited outputs and targeted fixes, and shows evidence of what improved between versions.
UPSHIFT is not a chatbot or a prompt rewriter. A project carries one set of requirements through the whole loop:檢視完整 README ↗Get more out of every AI. An intelligence layer for the AI tools you already use.
INTENT → PROMPT → UPSHIFT ANALYSIS → REFINED PROMPT → AI TOOL → OUTPUT → UPSHIFT AUDIT → TARGETED FIX ↺
extension/ holds a Manifest V3 extension: vanilla TypeScript bundled with esbuild, and UI in a closed Shadow DOM.
extension/src/
adapters/ PlatformAdapter per site (ChatGPT, Claude, Gemini, Grok) + generic fallback; all site selectors live here
content/ overlay (button + panel), styles; mounts only on the five supported hosts
background/ service worker: the only code that talks to the network, and only on Refine
popup/ connect to an UPSHIFT server, privacy switches, per-site on/off
services/ settings, message types, response validation
lib/ textContent-only DOM builder (no HTML injection)
src/lib/engines/prompt-lint.ts), platform detection and the intent check (src/lib/refine/*) are bundled into the extension. Analysis needs no network.POST /api/refine) through the provider layer. Grok is the default; Claude works too.XAI_FAST_MODEL, default grok-4-fast-non-reasoning, falling back to XAI_MODEL if the key can't use it) and a compact output schema with the refined prompt first. The prompt streams into the panel as it is written; the full result is validated before Replace is offered.{{placeholders}}.storage, plus scripting and host access for the same five sites the content script runs on (chatgpt.com, chat.openai.com, claude.ai, gemini.google.com, grok.com), used only to attach to AI tabs that were already open at install or update. No other site.storage.local on the device, and is revocable.npm run ext:build # production build → extension/dist (committed; this is the folder to Load unpacked)
npm run ext:build:dev # → extension/dist-dev: open shadow root, localhost host access, for tests
npm run ext:validate # MV3 shape, minimal permissions, no remote code / HTML injection
npm run ext:typecheck
npm run test:e2e:ext # real extension in Chromium, against stand-in pages and a fake model upstream
npm run build also builds the extension and publishes /upshift-extension.zip for the "Download for Chrome" button (Load unpacked; there's no Chrome Web Store listing yet).
The loop
Audit. Paste a URL, no account needed. You get:
Fix. Selected issues become a fix prompt shaped for your builder:
It names what to keep, so working parts aren't touched.
Re-audit. Add the next version, or call the deploy hook from CI. You see what improved and what regressed, a visual difference against the previous version or your reference images, and fix success: how many targeted issues were actually resolved.
Prove it. Share a read-only report link with a client.
Optional: add a brief (your goal, prompt and reference images) to check requirements too, not just quality.
| Status | Meaning | Who can produce it |
|---|---|---|
| Verified pass / fail | A deterministic check, a real browser run, or you | deterministic, browser, human |
| Likely met / likely issue | A model's judgement: a lead, not proof | model only |
| Recommendation | Matter of taste | any |
| Not tested / unable to verify | No method covered it, or a check could not complete | any |
enforceStatus() downgrades any model "verified" result to "likely". A model can never override a requirement already settled by a check (linkRequirements + modelFindings).npm install
npm run dev # http://localhost:3000
With no configuration, the app uses an embedded Postgres (PGlite under .data/) and runs with model features off. Copy .env.example to .env.local to configure:
| Variable | Effect |
|---|---|
XAI_API_KEY | Grok (xAI). Enables model-drafted briefs, prompt rewrite and refine, and model review of outputs (incl. screenshots). Server-side only. XAI_MODEL defaults to grok-4-fast. |
ANTHROPIC_API_KEY | Claude, as an alternative to Grok. UPSHIFT_MODEL defaults to claude-opus-5-5. If both keys are set Claude is used, unless UPSHIFT_PROVIDER=xai. |
XAI_PRICE_INPUT, XAI_PRICE_OUTPUT | Optional USD per million tokens, used only for Settings cost estimates. Without them Grok usage shows tokens and "—" for cost. |
DATABASE_URL | Use PostgreSQL (docker compose up -d gives you one). Required for any multi-instance deployment. |
UPSHIFT_CHROMIUM_PATH, UPSHIFT_CHROMIUM_NO_SANDBOX | Browser checks. Without a usable Chromium, audits record browser checks as not tested. |
UPSHIFT_STORAGE_DIR | Where uploads and screenshots are written. |
Migrations in ./drizzle are applied automatically on first request. After changing src/lib/db/schema.ts, run npm run db:generate.
DATABASE_URL. Tables are created on first request.BLOB_READ_WRITE_TOKEN is added for you. Uploads and screenshots are stored privately and served only through authenticated routes.XAI_API_KEY (and optionally XAI_MODEL)./api/health: it reports database, model and storage status.Browser checks use the bundled @sparticuz/chromium on Vercel; audit routes allow up to 300 s (maxDuration). Rate limits are stored in Postgres, so they hold across instances.
npm test # unit + persistence (PGlite) + stubbed provider tests
TEST_DATABASE_URL=postgres://… npm test # also runs the persistence suite on real PostgreSQL
UPSHIFT_CHROMIUM_PATH=… UPSHIFT_CHROMIUM_NO_SANDBOX=true npm run test:e2e # full journey in a real browser, desktop + mobile
npm run typecheck && npm run lint && npm run build
The e2e suite runs the whole loop through the UI with no AI provider: sign-up → project → brief → accept → structured prompt → URL audit of a deliberately flawed page (with a real browser) → correction prompt → v2 → compare (shows improvements) → human review → history → reopen. It also covers content-based upload validation and cross-account isolation.
src/
app/ Next.js App Router pages + route handlers (typed with Zod)
components/ UI (design system in ui.tsx, workspace/* for the project loop)
lib/
ai/provider.ts Provider boundary (Claude SDK or xAI Grok chat completions):
schema-constrained JSON, Zod re-validation, timeouts/retries,
refusal handling, token + cost recording
engines/ Pure logic, no I/O; unit tested
prompt-lint.ts rule-based prompt gaps
intent.ts brief schema + deterministic brief from the user's own words
prompt-builder.ts optimizer schemas + structured prompt assembly
audit/ html-checks, text-checks, browser (Playwright), requirement linking
improve.ts prioritisation + correction prompts
compare.ts version-to-version change classification
services/ Orchestration (brief, prompts, artifacts, audit, insights, export)
repo/ Data access; every query is scoped to the acting user
security/ SSRF guard, upload sniffing, rate limits
db/ Drizzle schema + driver selection (Postgres / PGlite)
Audits run after the response is sent (after()), record running → complete | failed on the evaluation row, and the client polls. A failed audit never loses the uploaded output.
requireProject(userId, id); child rows are only reached through an owned project. Files are served only if their key belongs to an owned project. Covered by e2e and persistence tests.nosniff and a sandbox CSP.<untrusted_input> with a system rule to treat it as data. Model output is schema-constrained, re-validated and stored as suggestions; it never triggers actions.| Area | State |
|---|---|
| Accounts, projects (create, reopen, rename, delete), isolation | Implemented, e2e tested |
| Brief + acceptance checklist (deterministic path) | Implemented, e2e tested |
| Brief (model path) | Implemented for Grok and Claude; both providers tested against stubbed HTTP, not yet run against the live APIs |
| Prompt gap checks, structured prompt, edit-as-new-version, copy/export | Implemented, tested |
| Prompt rewrite / refine with model, tool-specific notes | Implemented; stub-tested provider, not live-tested |
| URL audit: markup checks + headless browser (overflow, console, failed requests, screenshots) | Implemented, e2e tested |
| Image and text/code audits (deterministic) | Implemented, e2e tested (image); unit tested (text/code) |
| Model review of requirements (incl. screenshots and images) | Implemented; not live-tested |
| Human verdicts on findings | Implemented, e2e tested |
| Browser extension: detection, local analysis, Quick/Deep/Expert refine, before/after diff, replace/copy/edit/regenerate/undo, per-site off, history opt-in | Implemented; e2e tested with the real extension in Chromium against stand-in pages that mimic each composer, not the live sites |
| Web Prompt Lab + refinement history | Implemented, e2e tested |
| Extension on Firefox/Safari, Chrome Web Store listing | Planned |
| Free URL audit without sign-up (guest accounts, upgraded on sign-up, merged on sign-in, cleaned after 7 days) | Implemented, e2e tested |
| Crawl of linked pages, axe-core rules, mobile-menu interaction check | Implemented, e2e tested against a fixture site |
| Builder-specific fix prompts (batched for chat builders), fix-success tracking | Implemented, unit + e2e tested |
| Visual difference (versions and references) | Implemented, e2e tested |
Re-audit on deploy (POST /api/hooks/:token) | Implemented, e2e tested |
| Reference images (used in model brief + visual audit) | Upload/remove e2e tested; model use not live-tested |
| Correction prompts, version compare (+ inline delta vs previous), history, Markdown export |
DATABASE_URL for any deployment (it is required on Vercel).--no-sandbox (UPSHIFT_CHROMIUM_NO_SANDBOX=true). Isolate the audit worker accordingly. WebSocket connections opened by audited pages are not filtered by the request guard.The brand name lives in src/components/logo.tsx and the app metadata, so it is easy to change.
| Implemented, e2e tested |
| Read-only share links (hashed, rotatable, revocable, noindex) | Implemented, e2e + unit tested |
| Password change, account deletion | Implemented, e2e tested (change) |
| Playbooks, user-controlled memory, insights, usage and cost view | Implemented; manually exercised, light test coverage |
| Voice | Browser dictation (Web Speech API) where supported, hidden otherwise. Real-time voice provider: planned |
| PDF/document parsing, multi-page crawling, interaction testing (clicks/forms) | Planned |
| Strategy engine (model/tool recommendations), workflow builder | Planned. Not built rather than guessed, because it needs a maintained, sourced capability dataset |
| Connected coding agents / design tools, team workspaces, developer API | Planned (P2) |
| Vercel Blob storage, Postgres-backed rate limits, serverless Chromium | Implemented; Blob and serverless Chromium not yet exercised on a live Vercel deployment |
| Password reset by email, OAuth sign-in | Planned (needs an email/OAuth provider) |