Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A working UI for the design in CONTEXT.md: the five supply-chain stages of an Indian MSME
manufacturer as one product shell, with Sourcing Desk (the buyer's screen, SRC-01→04) and
Line Watch (the owner's floor view) as live dashboards over the §9 seed data.
Next.js App Router · TypeScript · Tailwind v4 · hand-built SVG charts. No database, no auth, no
API — every figure is computed client-side from the seed.
The two rules that shape the code檢視完整 README ↗A working UI for the design in CONTEXT.md: the five supply-chain stages of an Indian MSME
manufacturer as one product shell, with Sourcing Desk (the buyer's screen, SRC-01→04) and
Line Watch (the owner's floor view) as live dashboards over the §9 seed data.
npm install
npm run test # 89 assertions — the §9 figures as regression targets
npm run typecheck
npm run build
npm run dev # http://localhost:3000
Next.js App Router · TypeScript · Tailwind v4 · hand-built SVG charts. No database, no auth, no API — every figure is computed client-side from the seed.
1. Every number on screen is derived and inspectable. Nothing is stored as a display value.
Each calculation in lib/domain/calc.ts returns a Derived<T> carrying the §5 formula and its
substituted inputs, and components/ui/Num.tsx is the only component that renders a figure —
clicking any one opens the derivation. So "where does 620 come from" is answerable from the screen
for every number, with no per-number work.
2. The system suggests, holds and recommends. It never places an order. No action in the state machine can send anything. Approve drafts a PO. "Ask vendor to split MOQ" drafts a message. The guardrail holds a line and demands a written reason — override, never block — and every decision lands in an append-only audit log with an actor, a reason and a timestamp.
Valuation basis (§13-1). The prototypes valued stock at the cheapest current quote, which §13 itself calls wrong. The right basis is recoverable: non-usable quantity × the recommended vendor's base rate sums to exactly the ₹29,308 §9.1 states, where landed cost gives ₹30,871.40 and the cheapest quote ₹28,769.00. So the basis is last purchase price, ex-freight, applied everywhere stock is valued — the Sourcing Desk tile, the inventory stock-truth table and Line Watch all call the same function and cannot disagree.
Line Watch unit rates (§9.2). §9.2 quotes two totals but no unit rates. One consistent, realistic rate set reproduces both exactly — ₹36,516 unusable and ₹7.60 L cash needed. Those rates are in the seed and both totals are asserted.
Lead time. §5 calls it non-negotiable that lead time is the trailing average of the last six actual receipts, never the vendor's quoted figure. Storing it as a scalar would fail that on the document's most emphasised number, so 162 receipt records are seeded and every lead time on every screen is derived from them.
Two further §13 items are surfaced rather than hidden: CYCLE_DAYS = 15 and the flat 2.0-month
coverage ceiling are editable on the desk's Policy & ceilings tab, and moving them recomputes
the whole run. The differing supplier defaults between the two screens (§13-2) are a stated,
visible policy — the desk optimises on landed cost, Line Watch keeps the usual supplier.
Where §9.1's quoted rejection allowance disagrees with the §5 rule (8 of 27 quotes do), the landed-cost inspector and the SRC-03 rejection figure both show the quoted value and the rule's value and name the drift, instead of silently picking one.
The interface is light only. §10's dark block, the theme provider and the toggle were removed when
the app was restyled to the client's own brand — a flat orange on white, with a left rail — and a
second palette nobody had specified was two sets of contrast numbers to keep true instead of one.
Every colour is now defined once, on :root, and swept at real pixels against a 4.5:1 floor.
Still open, and stated on the desk's Policy tab: unit conversion (§13-6) is not modelled, every action is attributed to one demo buyer because there is no login, and safety stock is a per-item given rather than recomputed from variance.
test/reconcile.test.ts asserts the §9 figures against the same functions the UI renders: all nine
reorder points, quantities and statuses (MgO → at_risk_late, CM-TRB-2W held at 2.91 months with a
net need of 1,420), ₹4,55,100 across 3 POs, ₹29,308 non-usable, all 27 landed costs, 6 vendor flips
/ 3 confirms, and every Line Watch cover, job outcome and tile.
/reports runs the same checks live in the browser, so a broken formula goes red there before
anyone notices on a dashboard.
app/ routes — Overview, Reports, and the five stages
lib/domain/ calc.ts (§5 formulas, §6 status) · derive.ts · policy.ts · linewatch.ts
lib/seed/ §9.1 and §9.2 verbatim — raw facts only, no display values
state/ theme, audit log, derivation inspector
components/ shell · ui · charts · desk · linewatch · stage
The §10 palette lives once in app/globals.css as CSS custom properties with the three-way theme
rule, bridged to Tailwind with @theme inline — which keeps var() in the emitted utilities, so
switching theme is one attribute write and no React re-render. The categorical chart hues pass the
CVD validator in both modes; in light mode three fall below 3:1 against the surface, so every chart
ships direct labels and a value table.
All figures are illustrative sample data prepared for demonstration. None of it is any client's real trading data.