@proteus-vue/create-proteus 0.2.1-beta.2 → 0.3.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/templates/.agents/skills/proteus-cobuild/SKILL.md +129 -0
- package/templates/AGENTS.md +20 -0
- package/templates/docs//345/256/236/346/210/230/346/212/245/345/221/212_proteus/346/216/245/345/205/245.md +29 -0
- package/templates/docs//346/241/206/346/236/266/351/227/256/351/242/230/345/217/260/350/264/246.json +36 -0
- package/templates/package.json +7 -7
- package/templates/scripts/ledger_check.mjs +91 -0
- package/templates/src/router/RouterView.vue +17 -10
package/package.json
CHANGED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: proteus-cobuild
|
|
3
|
+
description: 参与 Proteus 框架共建——把"使用框架时撞到的问题"变成框架方可以复核并修掉的正式提交,并跟踪到发布与复测闭环。适用于:撞到框架缺陷(编译报错 / 静默失败 / 发布物缺件 / 文档与实际不符)要报给框架方时、准备写实战报告一节时、更新框架问题台账时、框架发新版后做复测回写时、判断"这是框架缺陷还是我方平台适配"时;或用户要求"报给 proteus""提交报告""复测新版""更新台账""共建"时。不适用:纯业务 bug(与框架无关)、平台限制导致的适配(记 consumer_notes 即可,不算框架缺陷)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 参与 Proteus 框架共建
|
|
7
|
+
|
|
8
|
+
> 你撞到框架问题时:**该不该报、报到哪、什么格式、什么时候算修好**——本文档全讲清。
|
|
9
|
+
> 机制自检:\`proteus cobuild check\`(文件齐备)/ \`node scripts/ledger_check.mjs --check\`(台账合格)。
|
|
10
|
+
|
|
11
|
+
## 0. 三件事
|
|
12
|
+
|
|
13
|
+
| 问题 | 答案 |
|
|
14
|
+
|---|---|
|
|
15
|
+
| **什么时候该报** | 框架**该做到却没做到**、或**静默失败**(不报错但行为错)时——判据见 §2 |
|
|
16
|
+
| **报到哪** | 本工程 \`docs/框架问题台账.json\`(加一条)+ \`docs/实战报告_proteus接入.md\`(追加一节) |
|
|
17
|
+
| **什么格式** | §3 两个模板,照着填;**最小复现是硬要求** |
|
|
18
|
+
|
|
19
|
+
## 1. 谁负责什么(避免两边改同一份)
|
|
20
|
+
|
|
21
|
+
| 字段 | 谁维护 |
|
|
22
|
+
|---|---|
|
|
23
|
+
| \`id\` \`title\` \`kind\` \`severity\` \`round\` \`reported_in\` \`evidence\` \`repro\` | **你(外部)**——问题的定义 |
|
|
24
|
+
| \`status\` \`fix_state\` \`fixed_in\` | 框架方——修复的状态 |
|
|
25
|
+
| \`verification\` \`verified_by\` | **你(外部)优先**——验证结论 |
|
|
26
|
+
|
|
27
|
+
> ★框架方自测只能标 \`verified_by=framework\`;**只有你在自己工程里用最小复现跑通,才能标 \`external\`**。
|
|
28
|
+
> 你的复测是唯一能把"框架自测通过"升级为"独立验证通过"的证据——这是你的核心价值。
|
|
29
|
+
|
|
30
|
+
## 2. 什么时候该报
|
|
31
|
+
|
|
32
|
+
**该报**:框架承诺的能力没做到(\`onMounted(async () => {…})\` 丢 \`async\` 标记 → 产物语法错)/ **静默失败**(正则 \`/\\s/g\` 被改坏,构建却通过)/ 报错**指向无关模块** / 发布物缺件(装了包用不了)/ 文档数字与实际不符。
|
|
33
|
+
|
|
34
|
+
**不该报**:平台限制(WXML 不支持 \`?.\`)→ 这是**你的适配**,记 \`consumer_notes\`;你自己的业务逻辑;**探针本身不可靠**导致的误报(先验证探针)。
|
|
35
|
+
|
|
36
|
+
| 情形 | 归属 |
|
|
37
|
+
|---|---|
|
|
38
|
+
| 框架标 \`aligned\` 但没对齐(**有对照实验证明本可做到**) | **框架缺陷** |
|
|
39
|
+
| 平台本身不支持 | 平台限制 → 你适配 |
|
|
40
|
+
| **静默失败**(不报错但错 / 报错指错方向) | **一律归框架** |
|
|
41
|
+
| 产出**语法合法但语义错**的产物 | **框架缺陷(最危险)** |
|
|
42
|
+
|
|
43
|
+
## 3. 格式
|
|
44
|
+
|
|
45
|
+
### ① 报告:追加一节
|
|
46
|
+
|
|
47
|
+
\`docs/实战报告_proteus接入.md\`——**标题格式是机器对齐的锚点,必须照写**:
|
|
48
|
+
|
|
49
|
+
\`\`\`markdown
|
|
50
|
+
## 第N轮复测:\`<被复测的版本号>\`(YYYY-MM-DD)—— 一句话结论
|
|
51
|
+
|
|
52
|
+
### 一、结论速览
|
|
53
|
+
| 项 | 结果 | 证据 |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| <问题> | ✅ 已修 / ❌ 未修 / ⚠️ 部分 | <怎么验的> |
|
|
56
|
+
|
|
57
|
+
### 二、已验证修复(逐项实测,非源码推断)
|
|
58
|
+
|
|
59
|
+
### 三、新发现的问题(每条一节)
|
|
60
|
+
<!-- 每条必须:现象 / 最小复现 / 影响面 / 根因(能定位就写)/ 修复建议 -->
|
|
61
|
+
|
|
62
|
+
### 四、我方适配(平台限制,非框架缺陷)
|
|
63
|
+
|
|
64
|
+
### 五、诚实澄清(可选,如测试脚本的误报)
|
|
65
|
+
\`\`\`
|
|
66
|
+
|
|
67
|
+
**硬要求**:① 标题带**版本号**;② 每条问题带**最小复现**;③ 区分「框架缺陷」与「我方适配」。
|
|
68
|
+
|
|
69
|
+
### ② 台账:加一条
|
|
70
|
+
|
|
71
|
+
\`docs/框架问题台账.json\` 的 \`entries\` 追加:
|
|
72
|
+
|
|
73
|
+
\`\`\`json
|
|
74
|
+
{
|
|
75
|
+
"id": "F-27",
|
|
76
|
+
"title": "一句话说清问题(能当 issue 标题)",
|
|
77
|
+
"kind": "compiler",
|
|
78
|
+
"severity": "blocker",
|
|
79
|
+
"round": 7,
|
|
80
|
+
"reported_in": "0.3.0-beta.10",
|
|
81
|
+
"found_by": "external",
|
|
82
|
+
"status": "open",
|
|
83
|
+
"verification": "unverified",
|
|
84
|
+
"evidence": "可复制的报错/现象关键片段",
|
|
85
|
+
"repro": "最小复现(命令或代码)"
|
|
86
|
+
}
|
|
87
|
+
\`\`\`
|
|
88
|
+
|
|
89
|
+
- \`id\` **延续编号,分配后永不变更**(跨仓库对账锚点);
|
|
90
|
+
- \`kind\`:packaging | cli | compiler | runtime | router | release | process | docs;
|
|
91
|
+
- \`severity\`:blocker(阻断使用/构建)| major(功能受损或静默错)| minor(体验/文档);
|
|
92
|
+
- 新报的 \`status=open\`、\`verification=unverified\`,**不要填** \`fix_state\`/\`fixed_in\`(框架方发布后填)。
|
|
93
|
+
|
|
94
|
+
## 4. 闭环
|
|
95
|
+
|
|
96
|
+
\`\`\`
|
|
97
|
+
你报 → 框架复现并修 → 发布新版 → 写回执(改了什么/怎么验/哪个版本)
|
|
98
|
+
↓
|
|
99
|
+
你 git pull 框架仓库,看台账里你那条的 fix_state=published + fixed_in
|
|
100
|
+
↓
|
|
101
|
+
升级到该版本 → 用你的最小复现复测 → 台账回写 verification=passed + verified_by=external
|
|
102
|
+
\`\`\`
|
|
103
|
+
|
|
104
|
+
## 5. 提交前自检
|
|
105
|
+
|
|
106
|
+
\`\`\`bash
|
|
107
|
+
proteus cobuild check # 共建文件齐备(skill/台账/报告/校验器/AGENTS.md 指针)
|
|
108
|
+
node scripts/ledger_check.mjs --check # 台账合格 + 无未收口项(未收口会列出)
|
|
109
|
+
\`\`\`
|
|
110
|
+
|
|
111
|
+
- [ ] 报告标题含 \`第N轮复测\` + **版本号**;
|
|
112
|
+
- [ ] 每条新问题都有**最小复现**;
|
|
113
|
+
- [ ] 台账加了条目,\`id\` 延续、枚举取值合法;
|
|
114
|
+
- [ ] 区分了「框架缺陷」与「我方适配」;
|
|
115
|
+
- [ ] 自己的误报/不确定处单列澄清(**诚实比数量值钱**)。
|
|
116
|
+
|
|
117
|
+
## 6. 反模式
|
|
118
|
+
|
|
119
|
+
| 反模式 | 教训 |
|
|
120
|
+
|---|---|
|
|
121
|
+
| 只报现象不给复现 | 框架方无法复核 → 只能猜;带复现通常一轮就修好 |
|
|
122
|
+
| 把平台限制当框架缺陷 | 用 §2 判定表先分类,省双方时间 |
|
|
123
|
+
| 复测时不分「全修」与「只修一条路径」 | 明确指出"修了一半"极有价值(真实案例:一个 bug 三处实现只修一处) |
|
|
124
|
+
| 自己误报不澄清 | 会让框架方基于错误信息改代码 |
|
|
125
|
+
| 台账不更新 | 收口率失真;\`fix_state=worktree\` 对 npm 用户等于没修 |
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
**一句话**:你负责"问题是真的"(带复现),框架负责"改动是真的"(带发布),**你的复测决定"修复是真的"**——三者缺一,共建就是空的。
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# AGENTS.md —— 本工程对 AI 会话的约定
|
|
2
|
+
|
|
3
|
+
> 由 create-proteus 生成;接入 Proteus 框架共建机制。
|
|
4
|
+
|
|
5
|
+
<!-- proteus-cobuild:start -->
|
|
6
|
+
## ★ 参与 Proteus 框架共建
|
|
7
|
+
|
|
8
|
+
本工程使用 **Proteus 框架**。撞到**框架**问题(编译报错 / 静默失败 / 发布物缺件 / 文档与实际不符)时,
|
|
9
|
+
**先挂载 \`Skill(proteus-cobuild)\`**(等价于读 \`.agents/skills/proteus-cobuild/SKILL.md\`)——它讲清:该不该报、报到哪、什么格式、什么时候算修好。
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
① 撞到框架问题 → docs/实战报告_proteus接入.md 追加一节(标题必带版本号 + 最小复现)
|
|
13
|
+
→ docs/框架问题台账.json 加一条(id 延续编号)
|
|
14
|
+
② 框架修复发布 → git pull 框架仓库,看台账里你那条的 fix_state/fixed_in
|
|
15
|
+
③ 复测新版 → 台账回写 verification=passed + verified_by=external
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
> **你的复测是唯一能把"框架自测通过"升级为"独立验证通过"的证据**——这是共建里你的核心价值。
|
|
19
|
+
> 自检:\`proteus cobuild check\` + \`node scripts/ledger_check.mjs --check\`
|
|
20
|
+
<!-- proteus-cobuild:end -->
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# {{name}} · Proteus 实战报告
|
|
2
|
+
|
|
3
|
+
> 目的:记录使用 Proteus 框架时撞到的问题,供框架方复核与修复。
|
|
4
|
+
> **每轮一节**,标题格式固定(框架侧靠它做跨工程对齐):\`## 第N轮复测:\`<版本号>\`(YYYY-MM-DD)—— 一句话结论\`
|
|
5
|
+
>
|
|
6
|
+
> 配套:\`docs/框架问题台账.json\`(对账单一事实源)+ \`scripts/ledger_check.mjs\`(校验器)。
|
|
7
|
+
> 规范详解见 \`.agents/skills/proteus-cobuild/SKILL.md\`。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 第一轮复测:\`<版本号>\`(YYYY-MM-DD)—— 首次接入
|
|
12
|
+
|
|
13
|
+
### 一、结论速览
|
|
14
|
+
|
|
15
|
+
| 项 | 结果 | 证据 |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| (待填) | | |
|
|
18
|
+
|
|
19
|
+
### 二、新发现的问题
|
|
20
|
+
|
|
21
|
+
<!-- 每条一节:现象 / 最小复现 / 影响面 / 根因(能定位就写)/ 修复建议 -->
|
|
22
|
+
|
|
23
|
+
### 三、我方适配(平台限制,非框架缺陷)
|
|
24
|
+
|
|
25
|
+
<!-- 如 WXML 不支持 ?. 之类的平台限制,你的适配记这里 -->
|
|
26
|
+
|
|
27
|
+
### 四、诚实澄清(可选)
|
|
28
|
+
|
|
29
|
+
<!-- 测试脚本的误报、可疑但未证实的猜测 -->
|
package/templates/docs//346/241/206/346/236/266/351/227/256/351/242/230/345/217/260/350/264/246.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"project": "{{name}}",
|
|
4
|
+
"report": "docs/实战报告_proteus接入.md(本工程)",
|
|
5
|
+
"last_verified_published": null,
|
|
6
|
+
"last_verified_at": null,
|
|
7
|
+
"schema": {
|
|
8
|
+
"说明": "外部实战报告 → 修复 → 验证 的逐条对账台账。目标是让「报 N 修 M」可机器核对,而不是靠散文。由 proteus cobuild init 生成。",
|
|
9
|
+
"字段": {
|
|
10
|
+
"id": "稳定编号,一旦分配不得更改(对账的锚点)",
|
|
11
|
+
"title": "一句话说清问题",
|
|
12
|
+
"kind": "packaging | cli | compiler | runtime | router | release | process | docs",
|
|
13
|
+
"severity": "blocker(阻断使用/构建) | major(功能受损或静默错误) | minor(体验/文档)",
|
|
14
|
+
"round": "第几轮复测",
|
|
15
|
+
"reported_in": "在哪个版本上发现",
|
|
16
|
+
"found_by": "external(你) | framework(框架自查)",
|
|
17
|
+
"status": "open | fixed | partial | by_design",
|
|
18
|
+
"fix_state": "published(已上 npm) | worktree(仅工作树)——status=fixed 时必填",
|
|
19
|
+
"fixed_in": "修复出现在哪个版本(fix_state=published 时必填)",
|
|
20
|
+
"verification": "passed(复测通过) | partial | unverified | failed | n_a",
|
|
21
|
+
"verified_by": "external(你在本工程复测) | framework(框架方自证)——verification=passed 时必填",
|
|
22
|
+
"verification_note": "验证方式的一句话(双方视角会合并保留)",
|
|
23
|
+
"evidence": "现象/报错(可复制片段)",
|
|
24
|
+
"repro": "最小复现(命令或代码)",
|
|
25
|
+
"related": "关联条目 id 数组(残留问题指向原条目)"
|
|
26
|
+
},
|
|
27
|
+
"对账规则": [
|
|
28
|
+
"只有 status=fixed 且 fix_state=published 且 verification=passed 才算「收口」",
|
|
29
|
+
"fix_state=worktree → 未发布:不得计入已修(npm 用户拿不到)",
|
|
30
|
+
"status=partial → 必须带 related 指向跟踪条目,防止「修一半当修完」",
|
|
31
|
+
"severity=blocker 的条目必须带 repro"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"consumer_notes": [],
|
|
35
|
+
"entries": []
|
|
36
|
+
}
|
package/templates/package.json
CHANGED
|
@@ -13,16 +13,16 @@
|
|
|
13
13
|
"proteus": "proteus"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@proteus-vue/router": "0.
|
|
17
|
-
"@proteus-vue/runtime": "0.
|
|
18
|
-
"@proteus-vue/shared": "0.
|
|
16
|
+
"@proteus-vue/router": "0.3.0-beta.11",
|
|
17
|
+
"@proteus-vue/runtime": "0.3.0-beta.11",
|
|
18
|
+
"@proteus-vue/shared": "0.3.0-beta.11",
|
|
19
19
|
"vue": "^3.4.0"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@proteus-vue/cli": "0.3.0-beta.
|
|
23
|
-
"@proteus-vue/compiler": "0.3.0-beta.
|
|
24
|
-
"@proteus-vue/devtools-runtime": "0.
|
|
25
|
-
"@proteus-vue/plugin-vite": "0.
|
|
22
|
+
"@proteus-vue/cli": "0.3.0-beta.11",
|
|
23
|
+
"@proteus-vue/compiler": "0.3.0-beta.11",
|
|
24
|
+
"@proteus-vue/devtools-runtime": "0.3.0-beta.11",
|
|
25
|
+
"@proteus-vue/plugin-vite": "0.3.0-beta.11",
|
|
26
26
|
"@types/node": "^20.0.0",
|
|
27
27
|
"@vitejs/plugin-vue": "^5.0.0",
|
|
28
28
|
"tsx": "^4.0.0",
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/ledger_check.mjs —— 框架问题台账 · 对账与校验(零依赖,Node >= 18)
|
|
3
|
+
// 由 \`proteus cobuild init\` 生成(规范源:@proteus-vue/cli 的 cobuild-assets)。
|
|
4
|
+
// 收口判据:status=fixed 且 fix_state=published 且 verification=passed——三者缺一不算收口。
|
|
5
|
+
// 用法:node scripts/ledger_check.mjs [--check] [--json] [--file <path>]
|
|
6
|
+
// 退出码:0 通过 / 1 存在未收口项(仅 --check)/ 2 台账本身不合格
|
|
7
|
+
import fs from 'node:fs'
|
|
8
|
+
import path from 'node:path'
|
|
9
|
+
import { fileURLToPath } from 'node:url'
|
|
10
|
+
|
|
11
|
+
const HERE = path.dirname(fileURLToPath(import.meta.url))
|
|
12
|
+
const DEFAULT_LEDGER = path.join(HERE, '..', 'docs', '框架问题台账.json')
|
|
13
|
+
const argv = process.argv.slice(2)
|
|
14
|
+
const CHECK = argv.includes('--check')
|
|
15
|
+
const JSON_OUT = argv.includes('--json')
|
|
16
|
+
const fi = argv.indexOf('--file')
|
|
17
|
+
const LEDGER = fi >= 0 && argv[fi + 1] ? path.resolve(argv[fi + 1]) : DEFAULT_LEDGER
|
|
18
|
+
|
|
19
|
+
const ALLOWED = {
|
|
20
|
+
kind: new Set(['packaging', 'cli', 'compiler', 'runtime', 'router', 'release', 'process', 'docs']),
|
|
21
|
+
severity: new Set(['blocker', 'major', 'minor']),
|
|
22
|
+
status: new Set(['open', 'fixed', 'partial', 'by_design']),
|
|
23
|
+
fix_state: new Set(['published', 'worktree']),
|
|
24
|
+
verification: new Set(['passed', 'partial', 'unverified', 'failed', 'n_a']),
|
|
25
|
+
found_by: new Set(['external', 'framework']),
|
|
26
|
+
}
|
|
27
|
+
const REQUIRED = ['id', 'title', 'kind', 'severity', 'round', 'reported_in', 'found_by', 'status', 'verification', 'evidence', 'repro']
|
|
28
|
+
|
|
29
|
+
if (!fs.existsSync(LEDGER)) {
|
|
30
|
+
console.error('✗ 找不到台账:' + LEDGER + '(先跑 proteus cobuild init)')
|
|
31
|
+
process.exit(2)
|
|
32
|
+
}
|
|
33
|
+
let data
|
|
34
|
+
try {
|
|
35
|
+
data = JSON.parse(fs.readFileSync(LEDGER, 'utf8'))
|
|
36
|
+
} catch (e) {
|
|
37
|
+
console.error('✗ 台账 JSON 解析失败:' + e.message)
|
|
38
|
+
process.exit(2)
|
|
39
|
+
}
|
|
40
|
+
const entries = data.entries ?? []
|
|
41
|
+
|
|
42
|
+
const errs = []
|
|
43
|
+
const seen = new Set()
|
|
44
|
+
for (const e of entries) {
|
|
45
|
+
const id = e.id ?? '(无 id)'
|
|
46
|
+
for (const k of REQUIRED) if (e[k] === undefined || e[k] === null || e[k] === '') errs.push(id + ': 缺必填字段 ' + k)
|
|
47
|
+
if (seen.has(id)) errs.push(id + ': id 重复(对账锚点必须唯一)')
|
|
48
|
+
seen.add(id)
|
|
49
|
+
for (const [k, allowed] of Object.entries(ALLOWED)) {
|
|
50
|
+
if (e[k] !== undefined && e[k] !== null && !allowed.has(e[k])) errs.push(id + ': ' + k + '=' + JSON.stringify(e[k]) + ' 不在允许集合')
|
|
51
|
+
}
|
|
52
|
+
if (e.severity === 'blocker' && !e.repro) errs.push(id + ': blocker 必须带最小复现')
|
|
53
|
+
if (e.status === 'fixed' && !['published', 'worktree'].includes(e.fix_state)) errs.push(id + ': status=fixed 必须给 fix_state')
|
|
54
|
+
if (e.status === 'partial' && !(e.related && e.related.length)) errs.push(id + ': status=partial 必须带 related 指向跟踪条目')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const b = { resolved: [], unreleased: [], unverified: [], partial: [], open: [] }
|
|
58
|
+
for (const e of entries) {
|
|
59
|
+
if (e.status === 'by_design') continue
|
|
60
|
+
else if (e.status === 'open') b.open.push(e)
|
|
61
|
+
else if (e.status === 'partial') b.partial.push(e)
|
|
62
|
+
else if (e.status === 'fixed' && e.fix_state === 'worktree') b.unreleased.push(e)
|
|
63
|
+
else if (e.status === 'fixed' && e.verification !== 'passed') b.unverified.push(e)
|
|
64
|
+
else b.resolved.push(e)
|
|
65
|
+
}
|
|
66
|
+
const total = entries.length
|
|
67
|
+
const nRes = b.resolved.length
|
|
68
|
+
|
|
69
|
+
if (JSON_OUT) {
|
|
70
|
+
console.log(JSON.stringify({ ledger: LEDGER, total, resolved: nRes, schema_errors: errs, unreleased: b.unreleased.map((e) => e.id), unverified: b.unverified.map((e) => e.id), partial: b.partial.map((e) => e.id), open: b.open.map((e) => e.id) }, null, 2))
|
|
71
|
+
} else {
|
|
72
|
+
console.log('框架问题台账对账 · ' + (data.project ?? ''))
|
|
73
|
+
console.log(' 报 ' + total + ' 条')
|
|
74
|
+
console.log(' ✅ 收口(fixed + published + 独立复测通过):' + nRes)
|
|
75
|
+
if (b.unreleased.length) console.log(' 🟡 已修未发布(仅工作树):' + b.unreleased.length + ' → ' + b.unreleased.map((e) => e.id).join(', '))
|
|
76
|
+
if (b.unverified.length) console.log(' 🟡 已修但验证不充分:' + b.unverified.length + ' → ' + b.unverified.map((e) => e.id).join(', '))
|
|
77
|
+
if (b.partial.length) console.log(' 🟠 部分修复:' + b.partial.length + ' → ' + b.partial.map((e) => e.id).join(', '))
|
|
78
|
+
if (b.open.length) console.log(' 🔴 未修:' + b.open.length + ' → ' + b.open.map((e) => e.id).join(', '))
|
|
79
|
+
console.log(' ★ 真实收口率:' + nRes + '/' + total + '(只算"用户拿得到且被独立验证过"的)')
|
|
80
|
+
if (errs.length) {
|
|
81
|
+
console.log('')
|
|
82
|
+
console.log('⚠️ 台账 schema 问题:')
|
|
83
|
+
for (const x of errs) console.log(' · ' + x)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (errs.length) process.exit(2)
|
|
87
|
+
if (CHECK && (b.open.length || b.unreleased.length || b.partial.length || b.unverified.length)) {
|
|
88
|
+
if (!JSON_OUT) console.log('\n--check:存在未收口项 → 退出 1')
|
|
89
|
+
process.exit(1)
|
|
90
|
+
}
|
|
91
|
+
process.exit(0)
|
|
@@ -54,10 +54,15 @@ adapter.onPageLoad?.((route, query, routeType, nav) => {
|
|
|
54
54
|
|
|
55
55
|
const currentRoute = computed(() => current.value || 'pages/index')
|
|
56
56
|
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
// ★★2026-09-20:**所有转场统一走层叠路径**(新旧同屏重叠 → 绝对定位 + default 模式),
|
|
58
|
+
// 不再使用 `<Transition mode="out-in">`。原因见外部实战报告第十一节第五条(阻断级):
|
|
59
|
+
// out-in 依赖 Vue 的 `afterLeave` 回调复位 BaseTransition 的 `state.isLeaving`;实测在特定页面
|
|
60
|
+
// (离开「工作台」后)该回调**永久不触发** → `state.isLeaving` 恒为 true → 此后**每一次**页面切换
|
|
61
|
+
// 都被短路成空注释(URL 变了 / 页面空白 / 控制台零报错 / 永久卡死,必须刷新)。
|
|
62
|
+
// 触发条件未定位到根因(外部项目已二分排除抽屉、内容区块、柔性布局、导航方式),
|
|
63
|
+
// 但**层叠路径不依赖任何完成回调**——统一走它可整类消除该失败模式(外部项目已实测通过)。
|
|
64
|
+
// 层叠语义同时更贴近小程序:旧页保留、新页覆盖,而不是先销毁后渲染。
|
|
65
|
+
const isLayered = true
|
|
61
66
|
|
|
62
67
|
// 遮罩对齐 MP barrierColor:halfScreen 0.4 / scaleDown 0.8(forward + back 都显示);slideUp opaque 无遮罩
|
|
63
68
|
// 遮罩常驻但被停留页(z:2)盖住:forward 时旧页(z:0)暴露在遮罩下淡入,back 时前页(z:0)暴露在遮罩下淡出
|
|
@@ -82,10 +87,12 @@ const view = computed<Component | null>(() => {
|
|
|
82
87
|
</script>
|
|
83
88
|
|
|
84
89
|
<template>
|
|
85
|
-
<!--
|
|
86
|
-
halfScreen/slideUp/scaleDown
|
|
90
|
+
<!-- 转场全部层叠(default 模式 + 绝对定位重叠 → 新旧同屏):
|
|
91
|
+
各 routeType 自带层叠语义(halfScreen/slideUp/scaleDown 的 enter/leave 规则),
|
|
92
|
+
fade 亦为交叉淡入;**不用 out-in**(其 afterLeave 不触发会让该 RouterView 永久卡死,
|
|
93
|
+
见 script 中 isLayered 处注释与外部实战报告第十一节第五条)
|
|
87
94
|
:key 按路由强制重挂载触发过渡 -->
|
|
88
|
-
<div class="router-view
|
|
95
|
+
<div class="router-view layered">
|
|
89
96
|
<!-- 遮罩层(对齐 MP barrierColor):旧页/前页(z:0)之上、停留页(z:2)之下;forward 淡入压暗,back 淡出抬起 -->
|
|
90
97
|
<div
|
|
91
98
|
v-if="showBarrier"
|
|
@@ -93,7 +100,7 @@ const view = computed<Component | null>(() => {
|
|
|
93
100
|
:class="{ 'barrier-out': isBack }"
|
|
94
101
|
:style="{ '--barrier-opacity': barrierOpacity }"
|
|
95
102
|
/>
|
|
96
|
-
<Transition :name="transitionName"
|
|
103
|
+
<Transition :name="transitionName">
|
|
97
104
|
<!-- ★v-bind="currentQuery":路由参数透传给页面(页面用 defineProps 声明即收到;
|
|
98
105
|
未声明的页面不受影响)。修 Web 端「参数两条路都拿不到」见 currentQuery 处注释 -->
|
|
99
106
|
<component :is="view" v-if="view" :key="currentRoute" v-bind="currentQuery" class="page" />
|
|
@@ -103,7 +110,7 @@ const view = computed<Component | null>(() => {
|
|
|
103
110
|
</template>
|
|
104
111
|
|
|
105
112
|
<style scoped>
|
|
106
|
-
/*
|
|
113
|
+
/* 层叠容器:所有转场均为新旧同屏绝对定位重叠(不再有 out-in 分支,见 script 注释) */
|
|
107
114
|
.router-view {
|
|
108
115
|
position: relative;
|
|
109
116
|
min-height: 100vh;
|
|
@@ -295,7 +302,7 @@ const view = computed<Component | null>(() => {
|
|
|
295
302
|
transform: translateY(100%);
|
|
296
303
|
}
|
|
297
304
|
|
|
298
|
-
/* replace(redirectTo
|
|
305
|
+
/* replace(redirectTo):替换当前页——旧页轻微缩小淡出、新页淡入(层叠交叉) */
|
|
299
306
|
.replace-enter-active,
|
|
300
307
|
.replace-leave-active {
|
|
301
308
|
transition:
|