M0: 工作区骨架 + 五道门禁 + 环境自举

- pnpm workspaces / tsconfig 双工程(node · web)/ 路径别名(§11.1)
- eslint flat(§11.3 + §12.5 可机检项)/ dependency-cruiser 基线八条 + JCAI 增补(§11.4)
- tools/module-tiers.json + gen-depcruise-tiers.ts 生成 tier-order 逐层规则
- tools/api-report.mjs 契约快照只留契约面(ADR-005)
- docker-compose(PG16)+ db/init 四 schema;种子数据五岗位五员工冻结为常量
- docs/debt.md · docs/adr/ADR-005

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
JCAI Main Agent
2026-07-27 00:18:58 +08:00
co-authored by Claude Opus 5
commit 7cd664af3a
50 changed files with 9052 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>JCAI · 任务操作系统</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/app/main.tsx"></script>
</body>
</html>
+21
View File
@@ -0,0 +1,21 @@
{
"name": "@app/web",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"react": "^19.2.0",
"react-dom": "^19.2.0"
},
"devDependencies": {
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.1",
"@vitejs/plugin-react": "^5.0.4",
"vite": "^7.1.12"
}
}
+10
View File
@@ -0,0 +1,10 @@
/**
* 应用壳 —— M0 骨架。工作台五要素 / 治理台九功能的 features 自 M6 起挂入。
*/
export function AppShell() {
return (
<div className="proto-root">
<main className="app-shell">JCAI · 任务操作系统 —— M0 骨架</main>
</div>
);
}
+16
View File
@@ -0,0 +1,16 @@
/**
* apps/web 唯一组装层(编码规范 §9):路由、Provider、鉴权壳、SSE 连接。
* M0:骨架 —— 两台原型的 1:1 平移自 M6 起(README《前端 UI · 原型 1:1 平移》)。
*/
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { AppShell } from './app-shell.tsx';
const container = document.getElementById('root');
if (!container) throw new Error('#root 缺失');
createRoot(container).render(
<StrictMode>
<AppShell />
</StrictMode>,
);
+1
View File
@@ -0,0 +1 @@
/// <reference types="vite/client" />
+26
View File
@@ -0,0 +1,26 @@
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { fileURLToPath } from 'node:url';
const root = fileURLToPath(new URL('../..', import.meta.url));
const p = (rel: string) => fileURLToPath(new URL(rel, import.meta.url));
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@contracts': `${root}packages/contracts/src/index.ts`,
'@sfeel': `${root}packages/sfeel/src/index.ts`,
'@ui': `${root}packages/ui-kit/src/index.ts`,
'@utils': `${root}packages/utils/src/index.ts`,
'@features': p('./src/features'),
'@web-shared': p('./src/shared'),
},
},
server: {
port: 5173,
proxy: {
'/api': { target: 'http://localhost:8787', changeOrigin: true },
},
},
});