尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Internal request center for AxisKey. A single page where staff go to submit operational process requests (IRA funding, title transfers, redemptions, etc.) instead of hunting through emails, SOPs, and scattered links.
This is not a client portal, investor portal, or CRM — it's an internal tool.
app/
page.tsx Landing page (single page app)
layout.tsx Root layout, fonts
api/requests/route.ts POST — creates a request, syncs to ClickUp
api/requests/[id]/retry-sync/route.ts POST — retries a failed/pending ClickUp sync
api/admin/stats/route.ts GET — KPIs for the Admin panel
components/
Logo.tsx Official AxisKey wordmark (public/axiskey-logo.png)
RequestCard.tsx One process card
RequestModal.tsx Request form (modal)
AdminPanel.tsx Admin KPI panel incl. ClickUp sync status
lib/
requestTypes.ts Source of truth for the 7 process types
payload.ts Builds the integration-ready payload
types.ts Shared TypeScript types
supabase/client.ts Browser Supabase client (anon key)
supabase/server.ts Server Supabase client (service role key)
services/requestSync.ts Business logic: orchestrates ClickUp + Supabase
integrations/clickup.ts ClickUp service — real API client (task create + attach)
integrations/n8n.ts n8n webhook trigger — stubbed, not wired up yet
supabase/
schema.sql Tables, indexes, RLS policies (fresh installs)
seed.sql Seeds request_types + creates storage bucket
migrations/001_clickup_sync_status.sql Run once on an already-live DB
Implemented from the AxisKey Brand Identity Guidelines (Jan 2026).
#201C1A (primary dark/text), Axis Signal #E3F464
(accent — emphasis/CTAs only, never dense text or full-page backgrounds),
Axis Base #CEC1A9 (warm neutral, secondary surfaces), Axis Light
#F2F2F2 (light neutral, page/table backgrounds), White #FFFFFF
(default background). Defined as Tailwind tokens (axis-core,
axis-signal, axis-base, axis-light) in tailwind.config.ts.next/font/google. Eurostile is a
licensed font not included in this repo — drop the files into
public/fonts and uncomment the @font-face block in
app/globals.css; headlines fall back to a geometric sans stack until
then. Left-aligned by default per the guidelines; centering is reserved
for short, isolated statements.public/axiskey-logo.png, monochrome,
transparent background) is wired up in components/Logo.tsx via
next/image, sized by height only so it never stretches or distorts.npm install
cp .env.example .env.local # fill in Supabase values, see below
npm run dev
supabase/schema.sql, then supabase/seed.sql.
supabase/migrations/001_clickup_sync_status.sql —
schema.sql uses create table if not exists, which won't add new
columns to a table that already exists.Project URL → NEXT_PUBLIC_SUPABASE_URLanon public key → NEXT_PUBLIC_SUPABASE_ANON_KEYservice_role key → SUPABASE_SERVICE_ROLE_KEY (server-only — never
expose this in client code or commit it)attachments storage bucket exists (created by seed.sql).Tables: request_types, requests, request_attachments, users,
activity_log. RLS is enabled with permissive insert/read policies since
there's no auth yet — tighten these once internal login ships.
.env.example in Project Settings →
Environment Variables: the three Supabase values, CLICKUP_API_TOKEN,
and CLICKUP_LIST_ID_MAP (leave N8N_REQUEST_WEBHOOK_URL blank until
that integration is turned on).RequestModal opens.attachments
storage bucket from the browser, then the form POSTs to
/api/requests.lib/payload.ts), inserts
into requests (+ request_attachments, activity_log), then calls
syncRequestAndPersist (lib/services/requestSync.ts), which:
lib/integrations/clickup.ts (real API
call, not a stub) — task name "<Type> | <Requestor> | <Deal or Investor>", description with every submitted field, attachments
best-effort re-uploaded to the task (URLs are always included as a
fallback);clickup_task_id, clickup_sync_status
(pending/synced/failed), clickup_sync_error, and
clickup_synced_at back onto the requests row;activity_log.failed (retryable) instead of synced.CLICKUP_LIST_ID_MAP is a JSON
object of request type slug -> ClickUp List ID (see .env.example).
Nothing is hardcoded; a request type missing from the map syncs as
failed with a descriptive error instead of guessing a list.synced, which calls POST /api/requests/[id]/retry-sync — it
re-reads the stored payload and re-attempts the ClickUp call.lib/integrations/clickup.ts only
knows how to talk to the ClickUp API; lib/services/requestSync.ts is the
business logic that decides what to persist in Supabase; the API routes
are thin glue; the UI never talks to ClickUp directly. Swapping ClickUp
for an n8n webhook later (lib/integrations/n8n.ts) means changing
requestSync.ts, not the routes or components.Top-right "Admin" button opens a panel with total requests, requests by
type, status breakdown (Submitted / In Review / Completed), ClickUp sync
breakdown (Successful / Failed / Pending), and a list of recent requests —
each showing its ClickUp Task ID, sync status, submission date, and a Retry
action when sync isn't synced. No authentication yet — add it before this
goes further than internal MVP use.
/admin/pdf-generator — unrelated to the request flow, it just reuses this
app, its admin login, and its Supabase project.
pdf-templates bucket; the
browser uploads it straight to Storage via a signed URL from
POST /api/admin/pdf-templates, so file size isn't capped by Vercel).{Company name} - Wire). Saved as JSON
in pdf_templates.mapping (see lib/pdfGenerator/types.ts; the older
bare-array format is still read and converted).lib/pdfGenerator/xlsx.ts reads floating drawings and "Place in Cell"
rich-value images); an image cell can instead hold a file name, matched
by that column's "Upload many". Downloads one PDF per row, zipped.Generation runs entirely in the browser (pdf-lib + pdfjs-dist for the
editor preview, fflate for the ZIP): images and generated PDFs are never
uploaded or stored. Setup: run supabase/migrations/007_pdf_templates.sql
once in the Supabase SQL editor (creates the table and the bucket).