Archived
后端:`KeycloakDirectory` 端口(users / groups / roles 读写;写直接穿透 Keycloak —— 这里建的人立刻能登录、 删的人立刻消失,停用与收权之后 logout 踢掉会话)、`keycloak-directory.ts` + `keycloak-admin-http.ts` 适配器、 org-directory 契约与 /api/gov 路由、`sync-roster` CLI(ops 路由够不着时整册照过来), 容器按 provisioning 服务账号有无决定注不注入(没配就如实说不可用)。 `personName` 姓在前:汉字直拼「柴浩」、否则留一个空格「Admin Amy」,token 与名册同步两条路同一把尺; `staffKindOf` 按 Keycloak 固定前缀 service-account- 认服务账号,员工那一屏不摆它(`Staff.kind` 不落库,按账号名现判)。 前端:员工那一屏重做成成员 / 组织 / 权限三页签(member-page 下钻),页签栏右端一句话说清这一格管什么。 契约变更:contracts org.ts / api/http.ts / api/org-directory.ts;api-report 已刷新;org CONTRACT.md 与 ADR-012 同步。 2026-08-26 做的,一直留在工作树没入库。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0167qWjeyBwvfdGovd7FWbCu
42 lines
1.0 KiB
JSON
42 lines
1.0 KiB
JSON
{
|
|
"name": "@app/api",
|
|
"version": "0.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"exports": {
|
|
".": "./src/app/main.ts"
|
|
},
|
|
"scripts": {
|
|
"dev": "tsup --watch --onSuccess \"node dist/main.js\"",
|
|
"build": "tsup",
|
|
"start": "node dist/main.js",
|
|
"seed": "node dist/seed.js",
|
|
"migrate": "node dist/migrate.js",
|
|
"reset-runs": "node dist/reset-runs.js",
|
|
"install-activities": "node dist/install-activities.js",
|
|
"sync-roster": "node dist/sync-roster.js"
|
|
},
|
|
"dependencies": {
|
|
"@ai-sdk/openai-compatible": "^3.0.14",
|
|
"@hono/node-server": "^2.0.12",
|
|
"@mastra/core": "^1.53.0",
|
|
"@mastra/observability": "^1.16.2",
|
|
"ai": "^7.0.37",
|
|
"ajv": "^8.20.0",
|
|
"ajv-formats": "^3.0.1",
|
|
"drizzle-orm": "^0.45.2",
|
|
"hono": "^4.12.32",
|
|
"imapflow": "^1.7.6",
|
|
"jose": "^5.10.0",
|
|
"nodemailer": "^8.0.11",
|
|
"pg": "^8.22.0",
|
|
"pg-boss": "^12.26.3",
|
|
"postal-mime": "^3.0.0",
|
|
"zod": "^4.4.3"
|
|
},
|
|
"devDependencies": {
|
|
"@types/nodemailer": "^8.0.1",
|
|
"@types/pg": "^8.20.0"
|
|
}
|
|
}
|