feat: add tenant-scoped rule and permission management

This commit is contained in:
wren
2026-05-21 22:03:08 +08:00
parent a2c2bf1969
commit 1f1bccf3b3
193 changed files with 64463 additions and 1771 deletions
@@ -0,0 +1,76 @@
# Rule DSL Extract Preservation Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Prevent the rule editor from deleting `extract` declarations when backend rule summaries are present.
**Architecture:** Parse the full YAML into the frontend pack first, then overlay backend rule summaries only for the rule list. Add a save-time guard so a lossy editor model cannot overwrite existing YAML sections with empty generated sections.
**Tech Stack:** Next.js frontend utilities, TypeScript, Node test runner, `yaml` package.
---
### Task 1: Preserve parsed YAML fields when summary rules are returned
**Files:**
- Modify: `legal-platform-frontend/lib/utils/rules-config-packs.server.ts`
- Test: `legal-platform-frontend/tests/govdoc-audit/rule-config-pack-summary-preserve.test.mts`
- [ ] **Step 1: Write failing test**
Create a test that calls `mapApiPackToRuleYamlPack` with both `yamlText` and `rules`, then asserts that `fields` still contains `委托方`.
- [ ] **Step 2: Run failing test**
Run: `cd legal-platform-frontend && node --import tsx --test tests/govdoc-audit/rule-config-pack-summary-preserve.test.mts`
Expected: FAIL because current summary branch returns `fields: []`.
- [ ] **Step 3: Implement minimal mapping fix**
Change `mapApiPackToRuleYamlPack` to always build `basePack = buildRuleYamlPack(...)`, then return `{ ...basePack, rules: normalizedRules, stats: { ...basePack.stats, ruleCount: normalizedRules.length } }`.
- [ ] **Step 4: Run passing test**
Run: `cd legal-platform-frontend && node --import tsx --test tests/govdoc-audit/rule-config-pack-summary-preserve.test.mts`
Expected: PASS.
### Task 2: Add save-time lossy section guard
**Files:**
- Modify: `legal-platform-frontend/lib/utils/rules-config-editor.ts`
- Test: `legal-platform-frontend/tests/govdoc-audit/rule-config-editor-preserve.test.mts`
- [ ] **Step 1: Write failing test**
Create a test that serializes a config with original `yamlSource.extract` but empty `fields`, and assert it throws a clear error instead of returning YAML with `extract: []`.
- [ ] **Step 2: Run failing test**
Run: `cd legal-platform-frontend && node --import tsx --test tests/govdoc-audit/rule-config-editor-preserve.test.mts`
Expected: FAIL because current serializer silently overwrites `extract`.
- [ ] **Step 3: Implement guard**
Before assigning `root.extract`, check whether the original YAML section exists and the editor model is empty. Throw `字段抽取配置未加载完成,已阻止保存,避免覆盖原 YAML extract。`.
- [ ] **Step 4: Run passing test**
Run: `cd legal-platform-frontend && node --import tsx --test tests/govdoc-audit/rule-config-editor-preserve.test.mts`
Expected: PASS.
### Task 3: Verify current JY rule remains valid after frontend serialization
**Files:**
- No production code changes expected.
- [ ] **Step 1: Run focused frontend tests**
Run both new tests plus existing rule YAML parser tests.
- [ ] **Step 2: Run backend validator smoke test**
Use `RuleValidator` on a representative YAML to confirm `extract` and rule field references are coherent.