API 核心: - constants.py: 系統常量定義 - unit_of_work.py: Unit of Work 模式 - incident_approval_service.py: Incident-Approval 同步服務 文檔更新: - LOGBOOK.md: 進度更新 - AWOOOI_AGENTIC_WORKSPACE_ROADMAP.md: 路線圖 - 2026-03-26_llm_testing_evaluation.md: LLM 測試評估 - phase5_telemetry_architecture.md: 遙測架構 - SECRETS_REFERENCE.md: 密鑰參考 配置/腳本: - Skill 02 v1.x: leWOOOgo 後端更新 - .dependency-cruiser.cjs: 依賴規則 - demo-multisig-flow.sh: 演示腳本 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
179 lines
6.0 KiB
JavaScript
179 lines
6.0 KiB
JavaScript
/**
|
||
* Dependency Cruiser Configuration - Phase 14.2
|
||
* ==============================================
|
||
*
|
||
* ADR-014: 依賴治理規則
|
||
*
|
||
* Layer Model:
|
||
* - Layer 0: Pages (app/) - 可引用所有
|
||
* - Layer 1: Features (agent/approval/incident/dashboard) - 禁止互相引用
|
||
* - Layer 2: Shared (shared/layout) - 禁止下行引用 Layer 1
|
||
* - Layer 3: Primitives (ui/lib/stores/hooks) - 純工具層
|
||
*
|
||
* @see docs/adr/ADR-014-dependency-governance.md
|
||
*/
|
||
|
||
/** @type {import('dependency-cruiser').IConfiguration} */
|
||
module.exports = {
|
||
forbidden: [
|
||
// =========================================================================
|
||
// Layer 1: Feature Isolation (禁止跨 feature 互相引用)
|
||
// =========================================================================
|
||
{
|
||
name: "feature-isolation-agent",
|
||
comment: "agent 元件禁止引用其他 feature (approval/incident/dashboard)",
|
||
severity: "error",
|
||
from: { path: "apps/web/src/components/agent" },
|
||
to: { path: "apps/web/src/components/(approval|incident|dashboard)" }
|
||
},
|
||
{
|
||
name: "feature-isolation-approval",
|
||
comment: "approval 元件禁止引用其他 feature (agent/incident/dashboard)",
|
||
severity: "error",
|
||
from: { path: "apps/web/src/components/approval" },
|
||
to: { path: "apps/web/src/components/(agent|incident|dashboard)" }
|
||
},
|
||
{
|
||
name: "feature-isolation-incident",
|
||
comment: "incident 元件禁止引用其他 feature (agent/approval/dashboard)",
|
||
severity: "error",
|
||
from: { path: "apps/web/src/components/incident" },
|
||
to: { path: "apps/web/src/components/(agent|approval|dashboard)" }
|
||
},
|
||
{
|
||
name: "feature-isolation-dashboard",
|
||
comment: "dashboard 元件禁止引用其他 feature (agent/approval/incident)",
|
||
severity: "error",
|
||
from: { path: "apps/web/src/components/dashboard" },
|
||
to: { path: "apps/web/src/components/(agent|approval|incident)" }
|
||
},
|
||
|
||
// =========================================================================
|
||
// Layer 2: Shared Isolation (禁止 shared/ui 下行引用 feature)
|
||
// =========================================================================
|
||
{
|
||
name: "shared-no-feature-import",
|
||
comment: "shared 元件禁止引用 feature 層 (agent/approval/incident/dashboard)",
|
||
severity: "error",
|
||
from: { path: "apps/web/src/components/shared" },
|
||
to: { path: "apps/web/src/components/(agent|approval|incident|dashboard)" }
|
||
},
|
||
{
|
||
name: "ui-no-feature-import",
|
||
comment: "ui 元件禁止引用 feature 層",
|
||
severity: "error",
|
||
from: { path: "apps/web/src/components/ui" },
|
||
to: { path: "apps/web/src/components/(agent|approval|incident|dashboard|shared)" }
|
||
},
|
||
{
|
||
name: "layout-no-feature-import",
|
||
comment: "layout 元件禁止引用 feature 層",
|
||
severity: "error",
|
||
from: { path: "apps/web/src/components/layout" },
|
||
to: { path: "apps/web/src/components/(agent|approval|incident|dashboard)" }
|
||
},
|
||
|
||
// =========================================================================
|
||
// Components → App 禁止反向引用
|
||
// =========================================================================
|
||
{
|
||
name: "components-no-app-import",
|
||
comment: "components 禁止引用 app 路由層",
|
||
severity: "error",
|
||
from: { path: "apps/web/src/components" },
|
||
to: { path: "apps/web/src/app" }
|
||
},
|
||
|
||
// =========================================================================
|
||
// 禁止循環依賴
|
||
// =========================================================================
|
||
{
|
||
name: "no-circular",
|
||
comment: "禁止循環依賴",
|
||
severity: "error",
|
||
from: {},
|
||
to: {
|
||
circular: true
|
||
}
|
||
},
|
||
|
||
// =========================================================================
|
||
// Hooks/Stores/Lib 不應引用 Components (純工具層)
|
||
// =========================================================================
|
||
{
|
||
name: "hooks-no-component-import",
|
||
comment: "hooks 禁止引用 components (純工具層)",
|
||
severity: "warn",
|
||
from: { path: "apps/web/src/hooks" },
|
||
to: { path: "apps/web/src/components" }
|
||
},
|
||
{
|
||
name: "stores-no-component-import",
|
||
comment: "stores 禁止引用 components (純工具層)",
|
||
severity: "warn",
|
||
from: { path: "apps/web/src/stores" },
|
||
to: { path: "apps/web/src/components" }
|
||
},
|
||
{
|
||
name: "lib-no-component-import",
|
||
comment: "lib 禁止引用 components (純工具層)",
|
||
severity: "warn",
|
||
from: { path: "apps/web/src/lib" },
|
||
to: { path: "apps/web/src/components" }
|
||
},
|
||
|
||
// =========================================================================
|
||
// #94: Stores 禁止直接 import API Client
|
||
// 原因: 狀態管理層不應直接呼叫 API,應透過 hooks 或 components 層
|
||
// =========================================================================
|
||
{
|
||
name: "stores-no-api-import",
|
||
comment: "stores 禁止直接引用 api-client (應透過 hooks 層)",
|
||
severity: "error",
|
||
from: { path: "apps/web/src/stores" },
|
||
to: { path: "apps/web/src/lib/api-client" }
|
||
}
|
||
],
|
||
|
||
options: {
|
||
doNotFollow: {
|
||
path: "node_modules"
|
||
},
|
||
|
||
exclude: {
|
||
path: [
|
||
"node_modules",
|
||
"\\.next",
|
||
"\\.turbo",
|
||
"dist",
|
||
"coverage",
|
||
"__tests__",
|
||
"\\.test\\.",
|
||
"\\.spec\\."
|
||
]
|
||
},
|
||
|
||
includeOnly: {
|
||
path: "apps/web/src"
|
||
},
|
||
|
||
// 2026-03-26: 關閉 TS 前置編譯 (避免 monorepo tsconfig extends 問題)
|
||
tsPreCompilationDeps: false,
|
||
|
||
enhancedResolveOptions: {
|
||
exportsFields: ["exports"],
|
||
conditionNames: ["import", "require", "node", "default"],
|
||
mainFields: ["main", "types"]
|
||
},
|
||
|
||
reporterOptions: {
|
||
dot: {
|
||
collapsePattern: "node_modules/(@[^/]+/[^/]+|[^/]+)"
|
||
},
|
||
text: {
|
||
highlightFocused: true
|
||
}
|
||
}
|
||
}
|
||
};
|