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) |