lcap-frontend-library 0.0.1

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.
Files changed (84) hide show
  1. package/README.md +271 -0
  2. package/bin/lcap-frontend-library.mjs +3 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +27 -0
  5. package/dist/init.d.ts +6 -0
  6. package/dist/init.js +79 -0
  7. package/dist/sync.d.ts +4 -0
  8. package/dist/sync.js +70 -0
  9. package/dist/utils.d.ts +19 -0
  10. package/dist/utils.js +101 -0
  11. package/package.json +34 -0
  12. package/packages/lcap-frontend-library/LEARNINGS.md +11 -0
  13. package/packages/lcap-frontend-library/SKILL.md +86 -0
  14. package/packages/lcap-frontend-library/commands/migrate.check.md +287 -0
  15. package/packages/lcap-frontend-library/commands/migrate.green.md +190 -0
  16. package/packages/lcap-frontend-library/commands/migrate.plan.md +169 -0
  17. package/packages/lcap-frontend-library/commands/migrate.red.md +160 -0
  18. package/packages/lcap-frontend-library/commands/migrate.scan.md +151 -0
  19. package/packages/lcap-frontend-library/commands/migrate.spec.md +144 -0
  20. package/packages/lcap-frontend-library/commands/migrate.tasks.md +179 -0
  21. package/packages/lcap-frontend-library/commands/speckit.create.md +201 -0
  22. package/packages/lcap-frontend-library/commands/speckit.implement.md +88 -0
  23. package/packages/lcap-frontend-library/commands/speckit.plan.md +79 -0
  24. package/packages/lcap-frontend-library/commands/speckit.self-check.md +177 -0
  25. package/packages/lcap-frontend-library/commands/speckit.specify.md +91 -0
  26. package/packages/lcap-frontend-library/commands/speckit.tasks.md +61 -0
  27. package/packages/lcap-frontend-library/references/frontend-design/LICENSE.txt +177 -0
  28. package/packages/lcap-frontend-library/references/frontend-design/SKILL.md +42 -0
  29. package/packages/lcap-frontend-library/references/lcap-extension-component/SKILL.md +360 -0
  30. package/packages/lcap-frontend-library/references/lcap-extension-component/api.md +331 -0
  31. package/packages/lcap-frontend-library/references/lcap-extension-component/block.md +160 -0
  32. package/packages/lcap-frontend-library/references/lcap-extension-component/i18n.md +95 -0
  33. package/packages/lcap-frontend-library/references/lcap-extension-component/icon.md +27 -0
  34. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/container.md +728 -0
  35. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/element.md +312 -0
  36. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/expression.md +154 -0
  37. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/index.md +113 -0
  38. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/modal.md +189 -0
  39. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/popover.md +171 -0
  40. package/packages/lcap-frontend-library/references/lcap-extension-component/ide.md +799 -0
  41. package/packages/lcap-frontend-library/references/lcap-extension-component/implementation-rules.md +242 -0
  42. package/packages/lcap-frontend-library/references/lcap-extension-component/index.md +27 -0
  43. package/packages/lcap-frontend-library/references/lcap-extension-component/nasl-view-component.md +895 -0
  44. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/accessibility.md +185 -0
  45. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/child.md +82 -0
  46. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/data-source.md +261 -0
  47. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/event.md +171 -0
  48. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/form.md +266 -0
  49. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/function.md +80 -0
  50. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/link.md +137 -0
  51. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/slot.md +128 -0
  52. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-ant-design.md +1470 -0
  53. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-cloud-ui.md +259 -0
  54. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-element-plus.md +580 -0
  55. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-element-ui.md +1007 -0
  56. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-mobile-ui.md +85 -0
  57. package/packages/lcap-frontend-library/references/lcap-extension-component/theme.md +234 -0
  58. package/packages/lcap-frontend-library/references/lcap-extension-component/workflow-guardrails.md +328 -0
  59. package/packages/lcap-frontend-library/references/nasl-logic-authoring/SKILL.md +201 -0
  60. package/packages/lcap-frontend-library/scripts/bash/create-component-files.sh +95 -0
  61. package/packages/lcap-frontend-library/scripts/bash/create-extension-project.sh +109 -0
  62. package/packages/lcap-frontend-library/scripts/bash/create-logic-files.sh +149 -0
  63. package/packages/lcap-frontend-library/scripts/bash/create-spec.sh +109 -0
  64. package/packages/lcap-frontend-library/scripts/bash/get-available-port.sh +35 -0
  65. package/packages/lcap-frontend-library/scripts/bash/list-specs.sh +19 -0
  66. package/packages/lcap-frontend-library/scripts/node/setup-extension-project.mjs +166 -0
  67. package/packages/lcap-frontend-library/templates/component-self-check.md +31 -0
  68. package/packages/lcap-frontend-library/templates/component-template.md +96 -0
  69. package/packages/lcap-frontend-library/templates/library-report-template.md +52 -0
  70. package/packages/lcap-frontend-library/templates/logic-template.md +44 -0
  71. package/packages/lcap-frontend-library/templates/migration-manifest-template.md +84 -0
  72. package/packages/lcap-frontend-library/templates/migration-plan-template.md +138 -0
  73. package/packages/lcap-frontend-library/templates/migration-report-template.md +227 -0
  74. package/packages/lcap-frontend-library/templates/migration-spec-template.md +135 -0
  75. package/packages/lcap-frontend-library/templates/migration-tasks-template.md +129 -0
  76. package/packages/lcap-frontend-library/templates/plan-template.md +299 -0
  77. package/packages/lcap-frontend-library/templates/self-check-report-template.md +148 -0
  78. package/packages/lcap-frontend-library/templates/tasks-template.md +81 -0
  79. package/packages/lcap-frontend-library/workflows/create/flow.md +199 -0
  80. package/packages/lcap-frontend-library/workflows/evolve/flow.md +249 -0
  81. package/packages/lcap-frontend-library/workflows/generate/flow.md +10 -0
  82. package/packages/lcap-frontend-library/workflows/harness/flow.md +82 -0
  83. package/packages/lcap-frontend-library/workflows/migrate/flow.md +302 -0
  84. package/packages/lcap-frontend-library/workflows/migrate/knowledge-base.md +564 -0
@@ -0,0 +1,169 @@
1
+ ---
2
+ description: 基于 spec.md 行为真值,按 knowledge-base §id 映射转换策略,规划文件路径,逐条核对陷阱,产出含路径锁定与风险评估的迁移方案。⛔需用户审批。
3
+ ---
4
+
5
+ ## 用户输入
6
+
7
+ ```text
8
+ $ARGUMENTS
9
+ ```
10
+
11
+ 用户输入为资产名称(如 `cw_audio_view`)。若为空,展示 `specs/manifest.md` 中所有 spec-done 状态的资产供选择。
12
+
13
+ ## 必要知识(必须在执行前 Read,不可跳过)
14
+
15
+ ### 共通(所有资产类型)
16
+ 1. **`workflows/migrate/knowledge-base.md`** — Vue2→Vue3 迁移先验知识(全文)
17
+ 2. **`LEARNINGS.md`** — 先验/约束/checklist(若存在)
18
+
19
+ ### 按 manifest.类型 附加(步骤 0 读取类型后加载)
20
+
21
+ **component** 额外 Read:
22
+ - `references/lcap-extension-component/SKILL.md`
23
+ - `references/lcap-extension-component/implementation-rules.md`
24
+
25
+ **logic** 额外 Read:
26
+ - `references/nasl-logic-authoring/SKILL.md`
27
+
28
+ **shared-composable**:无 extension-component / nasl-logic-authoring
29
+
30
+ > 转换与验收:component 以 KB + lcap-extension-component 为准;logic 以 KB §discipline + nasl-logic-authoring 为准。不得凭 AI 记忆。
31
+ > 全文 Read KB 后,按 KB §asset-applicability 与本文「资产类型分支」跳过不适用章节。
32
+
33
+ ## 核心纪律
34
+
35
+ > **每个转换决策必须引用 KB 章节或 references 文档。**
36
+ > 不允许凭 AI 知识做决策。不确定时以 knowledge-base 为准。
37
+
38
+ ## 禁止条款
39
+
40
+ - ❌ 凭 AI 知识做转换决策(必须引用 KB 章节或 references)
41
+ - ❌ 跳过 §pitfalls 核对(§pitfalls 叙事列表逐条确认是否命中)
42
+ - ❌ 使用 theme-variables 文档中不存在的 CSS 变量名
43
+ - ❌ 在 plan 中写 TDD 步骤编排(那属于 migrate.tasks)
44
+ - ❌ 在 plan 中重新提取 Vue2 行为(那属于 migrate.spec,已完成)
45
+
46
+ ---
47
+
48
+ ## 工作流程
49
+
50
+ ### 步骤 0:读取资产类型
51
+
52
+ 1. 从 `specs/manifest.md` 读取当前资产的「类型」列
53
+ 2. 打开本文「资产类型分支」,**仅**执行该分支步骤
54
+ 3. 禁止执行其他类型步骤(例:logic 禁止 E2E / ideusage / §alignment-checklist)
55
+
56
+ ### 1. 确认资产
57
+
58
+ - 从 `specs/manifest.md` 确认资产存在且状态为 `🔍 spec-done`
59
+ - 读取 `specs/<NN>-<资产名>/spec.md`(Vue2 行为真值)
60
+
61
+ ### 2. 映射转换策略
62
+
63
+ 逐项制定转换策略,**每项必须引用对应 knowledge-base 章节**:
64
+
65
+ #### 2.1 架构转换
66
+
67
+ 按 `migration-plan-template.md`「转换策略表」填写;每项必须引用 KB 章节(§mixin-composable、§vue3-children-clone、§pitfalls 等),不得凭 AI 记忆。
68
+
69
+ #### 2.2 Mixin → Composable(→ §mixin-composable)
70
+
71
+ 对照 spec.md 中的 Mixin 调用点分析:
72
+ 1. 列出所有方法 → spec.md 已标注是否有调用点
73
+ 2. 按业务边界拆 `composables/useXxx.ts`(非按生命周期)
74
+ 3. `defineExpose` 仅暴露原版已有 methods
75
+ 4. 副作用(定时器/监听器/SDK)→ `onUnmounted` 显式销毁
76
+ 5. 第三方 init → 放库的 `ready/onXxxReady` 回调
77
+
78
+ #### 2.3 样式转换(→ §css-vars + theme-variables-element-plus.md)
79
+
80
+ - 对照 §css-vars 映射表
81
+ - **交叉核对** `platform/theme-variables-element-plus.md` 确认变量名存在
82
+ - scoped style 强制
83
+
84
+ #### 2.4 风险与陷阱(→ §pitfalls 逐条核对)
85
+
86
+ 逐条对照 §pitfalls 叙事列表(源 SKILL 17 条),标记本资产命中项:
87
+
88
+ | # | 陷阱 | 是否命中 | 预防措施 |
89
+ |---|------|---------|---------|
90
+ | 1 | (从 KB §pitfalls 逐条填写) | ✓/✗ | … |
91
+ | … | … | | |
92
+
93
+ ### 2.0 确定资产类型分支
94
+
95
+ 从 manifest 读取「类型」列:
96
+
97
+ | 类型 | plan 输出 |
98
+ |------|-----------|
99
+ | component | 现有文件路径表(api/ide/stories/e2e) |
100
+ | logic | 使用 `migration-plan-template.md` logic 文件表;ideusage/stories/css-vars 节标 N/A |
101
+ | shared-composable | 使用 shared 文件表;api/ide/stories 节标 N/A |
102
+
103
+ 输出 plan.md 时必须含 `**资产类型**` 字段(与模板一致)。
104
+
105
+ ### 3. 规划文件结构(路径锁定)
106
+
107
+ **文件路径规划表**:
108
+
109
+ | 模块 | 职责 | 产出路径 | 测试层 | 操作 |
110
+ |------|------|----------|--------|------|
111
+ | api.ts | NASL 接口声明 | `src/components/<name>/api.ts` | — | 新增 |
112
+ | ideusage.json | IDE 设计器配置 | `src/components/<name>/ideusage.json` | — | 新增 |
113
+ | index.vue | UI 组装 | `src/components/<name>/index.vue` | Vitest(DOM) + E2E | 新增 |
114
+ | useXxx.ts | 业务逻辑 | `src/components/<name>/composables/useXxx.ts` | Vitest(返回值) | 新增 |
115
+ | index.ts | 桶文件导出 | `src/components/<name>/index.ts` | — | 新增 |
116
+ | block.stories | 画布拖拽 | `src/components/<name>/stories/block.stories.js` | — | 新增 |
117
+ | example.stories | 功能 demo | `src/components/<name>/stories/example.stories.js` | — | 新增 |
118
+ | 单测 | Vitest | `src/components/<name>/__tests__/index.spec.ts` | — | 新增 |
119
+ | E2E | Playwright | `e2e/<name>.spec.ts` | — | 新增 |
120
+
121
+ **测试层说明**(→ `references/lcap-extension-component/workflow-guardrails.md`):
122
+ - `Vitest(返回值)` — 纯逻辑,直接断言返回
123
+ - `Vitest(调用参数)` — 调用浏览器 API,仅 mock 验证调用参数
124
+ - `Vitest(DOM) + E2E` — DOM 操作,Vitest 验证结构,E2E 验证渲染
125
+
126
+ ### 4. 复杂度评估
127
+
128
+ 根据 spec.md 内容评估:
129
+ - **HIGH**:Mixin ≥ 3 或 Props ≥ 8 或第三方库 ≥ 2
130
+ - **MEDIUM**:1-2 Mixin 或有第三方库
131
+ - **LOW**:无 Mixin,Props ≤ 3,无第三方
132
+
133
+ ### 5. ⛔ 用户审批门禁
134
+
135
+ 展示方案摘要,等待用户确认后方可继续:
136
+ - 转换策略概要(关键决策点表格)
137
+ - 文件路径规划表
138
+ - 已识别风险(命中的 §pitfalls 陷阱)
139
+ - 复杂度评估 + 主要复杂点
140
+
141
+ **隐式审批判定**:
142
+ - 用户回复含 tasks/继续/开始/OK 等意图 → 视为审批通过
143
+ - 用户回复 `/migrate.tasks <资产名>` → 直接视为审批 + 进入 tasks
144
+ - 用户提出修改意见 → 按意见修改后重新展示
145
+
146
+ ### 6. 写入方案
147
+
148
+ 用户确认后:
149
+ - 将方案按 **`templates/migration-plan-template.md`** 格式写入 `specs/<NN>-<资产名>/plan.md`
150
+ - 更新 `specs/manifest.md`:状态 `🔍 spec-done` → `🔄 planned`
151
+
152
+ ### 7. 报告
153
+
154
+ 输出:
155
+ - 资产名称与类型
156
+ - 转换策略摘要(关键 3-5 项决策)
157
+ - 复杂度评估
158
+ - 下一步指引:`/migrate.tasks <资产名>` 编排 TDD 执行步骤
159
+
160
+ ## 关键规则
161
+
162
+ - Vue2 源码是行为的唯一真值——本命令基于 spec.md 做映射,不重新解读源码
163
+ - 每个转换决策必须引用 KB 章节或 references(不凭 AI 知识猜)
164
+ - 文件路径规划表必须给出完整相对路径(禁止模糊描述)
165
+ - 样式映射必须交叉验证 `platform/theme-variables-element-plus.md` 中变量确实存在
166
+ - §pitfalls 叙事列表逐条核对不可跳过
167
+ - 用户审批门禁不可跳过
168
+ - plan.md 不包含 TDD 步骤编排(那是 tasks 的职责)
169
+ - 必须使用中文进行编排与报告
@@ -0,0 +1,160 @@
1
+ ---
2
+ description: Phase RED——将 spec.md 中的 Vue2 行为精确编码为 Vitest 单测 + Playwright E2E 测试,确认测试全部 FAIL,证明测试有意义且目标已定义。
3
+ ---
4
+
5
+ ## 用户输入
6
+
7
+ ```text
8
+ $ARGUMENTS
9
+ ```
10
+
11
+ 用户输入为资产名称(如 `cw_audio_view`)。若为空,展示 `specs/manifest.md` 中所有 tasks-ready 状态的资产供选择。
12
+
13
+ ## 必要知识(子集 Read)
14
+
15
+ - **§process-e2e** — storyId、选择器、pageerror 规则(component E2E)
16
+ - **`references/lcap-extension-component/workflow-guardrails.md`** — 测试分层
17
+
18
+ 位于 `workflows/migrate/knowledge-base.md`(§process-e2e)。
19
+
20
+ ## 核心纪律
21
+
22
+ > **本阶段的唯一目标:将 Vue2 行为翻译为测试代码。**
23
+ > 测试 = 行为的形式化编码 = 迁移的完成标准定义。
24
+ > 测试 FAIL = 行为尚未实现(这是预期结果)。
25
+
26
+ ## 禁止条款
27
+
28
+ - ❌ 写任何生产代码(哪怕一行 api.ts、一行 index.vue)
29
+ - ❌ 跳过 spec.md 中记录的行为不写测试
30
+ - ❌ 写"容易通过"的弱断言(如 `expect(wrapper.exists()).toBe(true)`)
31
+ - ❌ 为了"好实现"而降低测试要求
32
+ - ❌ 在测试中写死实现细节(测试应验证行为,不锁定实现方式)
33
+ - ❌ 对 logic / shared-composable 资产编写 E2E 测试
34
+
35
+ ---
36
+
37
+ ## 工作流程
38
+
39
+ ### 步骤 0:读取资产类型
40
+
41
+ 1. 从 `specs/manifest.md` 读取当前资产的「类型」列
42
+ 2. 打开本文「资产类型分支」,**仅**执行该分支步骤
43
+ 3. 禁止执行其他类型步骤(例:logic 禁止 E2E / ideusage / §alignment-checklist)
44
+
45
+ ### 0. 前置确认
46
+
47
+ 1. 从 `specs/manifest.md` 确认资产状态为 `📋 tasks-ready`
48
+ 2. 读取 `specs/<NN>-<资产名>/spec.md`(Vue2 行为真值)
49
+ 3. 读取 `specs/<NN>-<资产名>/plan.md`(文件路径表 + 测试层标注)
50
+ 4. 读取 `specs/<NN>-<资产名>/tasks.md`(Phase RED 任务组 + 行为等价矩阵)
51
+ 5. 更新 `specs/manifest.md`:状态 → `🔴 red-in-progress`
52
+ 6. 从 manifest 读取资产「类型」,决定测试路径与是否编写 E2E
53
+
54
+ ### 测试路径(按资产类型)
55
+
56
+ | 类型 | Vitest 路径 | E2E |
57
+ |------|-------------|-----|
58
+ | component | `src/components/<name>/__tests__/index.spec.ts` + `e2e/<name>.spec.ts` | 必需 |
59
+ | logic | `src/logics/__tests__/<name>.spec.ts` | **禁止** |
60
+ | shared-composable | plan 指定的 `src/composables/__tests__/...` | **禁止** |
61
+
62
+ logic RED 优先级:P1 参数 nasl.* → P2 返回值边界 → P3 泛型/rest → P4 依赖 mock。
63
+
64
+ ### 1. 检查测试依赖
65
+
66
+ ```bash
67
+ npm list @vue/test-utils jsdom
68
+ ```
69
+ 若未安装:`npm install -D @vue/test-utils jsdom`
70
+
71
+ ### 2. 编写 Vitest 单元/交互测试
72
+
73
+ 按 tasks.md Phase RED 任务组的顺序编写。
74
+
75
+ **职责分层**(workflow-guardrails 第 8 条,严格遵守):
76
+
77
+ | Vitest 允许 | Vitest 禁止 |
78
+ |-------------|-------------|
79
+ | DOM 结构(节点存在/class/attribute/data-testid) | `getComputedStyle` 取值 |
80
+ | Props 响应式(含动态 `element.style.xxx` 验证) | Canvas/SVG 渲染输出断言 |
81
+ | 事件 emit(参数正确性、触发条件) | 元素尺寸/位置断言 |
82
+ | 纯逻辑(composable 返回值) | 任何需要真实浏览器渲染的断言 |
83
+ | Slot 渲染(作用域变量传递) | |
84
+ | $attrs 透传 | |
85
+
86
+ **测试编写规则**:
87
+ - 每个 describe/it 名称可追溯到 spec.md 中的具体条目
88
+ - 按 tasks.md 中矩阵行号注释溯源:`// 矩阵 #3: Events.onPlay`
89
+ - 断言必须严格到能区分"正确实现"与"错误实现"
90
+
91
+ **测试文件路径**:plan.md 中规划的 `src/components/<name>/__tests__/index.spec.ts`
92
+
93
+ ### 3. 编写 E2E 测试
94
+
95
+ **storyId 确认**(→ §process-e2e):
96
+ 1. stories 文件 `export default { title: '...' }` 使用纯 kebab-case
97
+ 2. storyId = `<title-kebab>--<export-name-kebab>`
98
+ 3. E2E 一律用 `/iframe.html?id=<storyId>&viewMode=story` 访问
99
+
100
+ **E2E 必须包含的监听**:
101
+ ```typescript
102
+ const errors: string[] = [];
103
+ page.on('pageerror', (err) => errors.push(err.message));
104
+ page.on('console', (msg) => {
105
+ if (msg.type() === 'error' && !msg.text().includes('404') && !msg.text().includes('net::ERR')) {
106
+ errors.push(msg.text());
107
+ }
108
+ });
109
+ // ... 访问 story 页面 + 功能验证 ...
110
+ expect(errors).toEqual([]);
111
+ ```
112
+
113
+ **E2E 编写规则**:
114
+ - 每个 test 必须有明确 `expect()` 断言
115
+ - 选择器策略按 §process-e2e 优先级
116
+ - E2E 测试文件:plan.md 中规划的 `e2e/<name>.spec.ts`
117
+
118
+ ### 4. 运行测试确认 RED 状态
119
+
120
+ ```bash
121
+ npm run test
122
+ ```
123
+
124
+ **预期结果**:测试失败(exit ≠ 0),因为生产代码还未写。
125
+
126
+ **异常处理**:
127
+ - 若测试意外全部通过 → 断言太宽泛,必须加强断言
128
+ - 若测试报"模块未找到" → 正常(组件文件不存在),记录为 RED 状态
129
+ - 若测试报语法错误 → 修复测试代码本身的语法问题
130
+
131
+ ### 5. 填充行为等价矩阵
132
+
133
+ 更新 `specs/<NN>-<资产名>/tasks.md` 中的行为等价矩阵:
134
+ - "RED 测试编码"列填充测试文件路径 + 行号
135
+ - 确认每行都有对应测试(无空行)
136
+
137
+ ### 6. 标记完成
138
+
139
+ - tasks.md Phase RED 任务组全部标记 [x]
140
+ - 更新 `specs/manifest.md`:状态 → `🔴 red-done`
141
+
142
+ ### 7. 报告
143
+
144
+ 输出:
145
+ - Vitest 测试用例数
146
+ - E2E 测试用例数
147
+ - 行为等价矩阵覆盖率(已编码/总数)
148
+ - `npm run test` 输出摘要(多少个测试 FAIL)
149
+ - 下一步指引:`/migrate.green <资产名>` 开始实现代码
150
+
151
+ ---
152
+
153
+ ## 关键规则
154
+
155
+ - **RED 阶段不写生产代码**:这是 TDD 的数学保证基础——测试先于代码存在
156
+ - **测试必须可追溯**:每个测试用例 → tasks.md 矩阵行 → spec.md 行为条目
157
+ - **测试 FAIL 是成功**:RED 的成功标准是"测试存在且 FAIL"
158
+ - **矩阵无空行**:spec.md 中每个有调用点的行为必须有对应测试
159
+ - **职责分层严格执行**:Vitest 禁止做 E2E 的事(样式/尺寸),E2E 禁止做 Vitest 的事(逻辑断言)
160
+ - 必须使用中文进行状态更新与报告
@@ -0,0 +1,151 @@
1
+ ---
2
+ description: 扫描 Vue2 源码库,识别所有待迁移资产(组件 + 逻辑),创建/检测 Vue3 目标工程,初始化迁移清单 manifest.md。
3
+ ---
4
+
5
+ ## 用户输入
6
+
7
+ ```text
8
+ $ARGUMENTS
9
+ ```
10
+
11
+ 执行前**必须**充分考虑用户输入。用户输入通常包含:
12
+
13
+ - Vue2 源码库路径(如 `/path/to/cw_audio_library`)
14
+ - 输出目录(可选,默认 cwd)
15
+ - 指定迁移范围(可选,如"只迁移 audio 相关组件")
16
+
17
+ **输入为空**时报错:「请提供 Vue2 依赖库源码路径」。
18
+
19
+ ## 必要知识(子集 Read,禁止 Read KB 全文)
20
+
21
+ - **§process-scaffold** — 工程创建与 scaffold 脚本
22
+ - **§process-asset-types** — 三资产类型与 depends_on
23
+ - **§stories-truth** — Block/Example 溯源(component 扫描)
24
+ - **§process-doc** — manifest 职责
25
+ - **§logics-boundary** — 扫 logics/ 时;必要时 Read `references/nasl-logic-authoring/SKILL.md` 识别 @NaslLogic
26
+
27
+ 以上章节均位于 `workflows/migrate/knowledge-base.md`。
28
+
29
+ > **scan 为库级命令**,无 per-asset 步骤 0;资产类型在扫描阶段写入 manifest,供后续资产级命令使用。
30
+
31
+ ## 工作流程
32
+
33
+ ### 1. 解析输入
34
+
35
+ | 要素 | 提取规则 | 示例 |
36
+ |------|----------|------|
37
+ | **sourceDir** | Vue2 依赖库源码根目录(必填) | `/path/to/cw_audio_library` |
38
+ | **outputDir** | 输出目录(默认 cwd) | `./output` |
39
+ | **scope** | 指定迁移范围(默认全部) | `[cw_audio_view, cw_audio_record]` |
40
+ | **库名** | 从 sourceDir 的 package.json 或目录名提取 | `cw_audio_library` |
41
+ | **中文标题** | 从 package.json title/description 或用户指定 | `音频组件库` |
42
+
43
+ **命名约束**:库名 `--name` 参数仅允许小写字母与下划线。
44
+
45
+ ### 2. 全景扫描(→ §stories-truth)
46
+
47
+ 扫描 `sourceDir`,识别:
48
+
49
+ **视图组件**(含 `api.ts`/`api.yaml` + `index.vue` 的目录):
50
+ - 组件目录路径
51
+ - Props / Events / Methods / Slots 数量(快速评估复杂度)
52
+ - Mixin 依赖列表
53
+ - 第三方库依赖
54
+
55
+ **逻辑函数**(`logics/` 下具有 `@NaslLogic` 导出的文件):
56
+ - 函数名、参数签名
57
+ - 依赖的工具函数
58
+
59
+ **共享依赖**:
60
+ - Mixin 全量方法清单 + 各方法被引用次数
61
+ - 第三方 dependencies 及版本
62
+ - 全局注册的组件/指令
63
+
64
+ **Stories 真值定位**(→ §stories-truth):
65
+ - 判定源项目类型(Vite 工程 / 旧工程)
66
+ - Vite 工程:`block.stories.js/.ts` + `example.stories.js/.ts`
67
+ - 旧工程:`docs/blocks.md` + `docs/examples.md`
68
+
69
+ **复杂度评估**(每资产):
70
+ - HIGH:Mixin ≥ 3 或 Props ≥ 8 或第三方库 ≥ 2
71
+ - MEDIUM:1-2 Mixin 或有第三方库
72
+ - LOW:无 Mixin,Props ≤ 3,无第三方
73
+
74
+ ### 2.5 识别 shared-composable(→ §process-asset-types)
75
+
76
+ 对每个 Mixin 文件统计被哪些组件 import:
77
+
78
+ - 引用数 ≥ 2 → manifest 新增一行:类型 `shared-composable`,资产名 = mixin 基名,`depends_on` 空
79
+ - 引用数 = 1 → 不新增资产;在该 component 的 Mixin 依赖列标注「内联 composable」
80
+
81
+ 对每个 component,若依赖 shared-composable 资产,填写 `depends_on` 列(逗号分隔资产名)。
82
+
83
+ ### 3. 环境预检
84
+
85
+ | 检查项 | 命令 | 失败处理 |
86
+ |---|---|---|
87
+ | outputDir 可写 | `mkdir -p <outputDir>` | 自动创建 |
88
+ | Node.js 版本 | `node --version`(≥18) | 报错提示 |
89
+
90
+ ### 4. 创建/检测目标 Vue3 工程(→ §process-scaffold)
91
+
92
+ 目标库 scaffold 与 create flow 的 library-only / library-and-asset 使用同一 `create-extension-project.sh` + `setup-extension-project.mjs`。
93
+
94
+ **若目标工程不存在**:
95
+
96
+ ```bash
97
+ bash <skill>/scripts/bash/create-extension-project.sh \
98
+ --name "<库名>" --title "<中文标题>" \
99
+ --target-dir "<outputDir>" \
100
+ --template vue3
101
+
102
+ # stdout: libraryDir=<outputDir>/<库名>
103
+ npm install --prefix "<outputDir>/<库名>"
104
+ ```
105
+
106
+ **若目标工程已存在**:
107
+
108
+ ```bash
109
+ node <skill>/scripts/node/setup-extension-project.mjs "<工程目录绝对路径>"
110
+ npm install --prefix "<工程目录绝对路径>"
111
+ ```
112
+
113
+ **验证**:`npm run dev` 可启动 Storybook。
114
+
115
+ **Playwright 浏览器适配**:工程创建/setup 后,**必须**立即检查系统可用浏览器并配置 `playwright.config.ts` 的 `channel`:
116
+ 1. 检查系统浏览器(如 `which google-chrome`、检查 `/Applications/Google Chrome.app`、`which microsoft-edge` 等)
117
+ 2. 在 `playwright.config.ts` 的 `projects[0].use` 中取消注释并设置 `channel: '<检测到的浏览器>'`(如 `'chrome'`、`'msedge'`)
118
+ 3. **禁止** `npx playwright install`——必须使用系统已安装的浏览器
119
+
120
+ ### 5. 初始化迁移清单
121
+
122
+ 在 `<工程目录>/specs/` 下创建 `manifest.md`,按 `templates/migration-manifest-template.md` 格式:
123
+
124
+ - 所有已识别资产填入表格(含 shared-composable 行)
125
+ - 列含:类型、推荐序号、depends_on、状态均为 `⏳ pending`
126
+ - 库级状态:`library_status: ⏳ in-progress`
127
+ - 计算推荐迁移顺序(shared → logic → component,拓扑排序;环则报错终止)
128
+ - 写入「推荐迁移顺序」节
129
+ - 复杂度评估已标注
130
+ - 当前阶段均为 `—`
131
+
132
+ ### 6. 报告
133
+
134
+ 输出:
135
+ - 检测到的库信息(名称、类型、组件数、逻辑函数数)
136
+ - 扫描发现的资产清单(表格:名称/类型/复杂度/Stories来源/Mixin依赖)
137
+ - 目标工程状态(新建 / 已存在已补全)
138
+ - 测试基础设施状态(vitest ✓ / playwright ✓ / storybook ✓)
139
+ - 迁移清单路径
140
+ - 推荐迁移顺序表 + **首个应迁移资产名**(推荐序号 1)
141
+ - 下一步指引:`/migrate.spec <资产名>` 对第一个资产提取行为真值
142
+
143
+ ## 关键规则
144
+
145
+ - 本阶段**只读不写代码**(仅创建工程骨架和迁移清单文件)
146
+ - 组件名命名约束:仅允许小写字母与下划线
147
+ - Stories 来源必须按 §stories-truth 规则确定,不可猜测
148
+ - 工程创建必须使用指定脚本(→ §process-scaffold),不可手动 `npm init`
149
+ - 若 scope 参数指定了范围,仅将范围内资产纳入清单
150
+ - 所有文档落入工程内部 `specs/` 目录
151
+ - 必须使用中文进行报告输出
@@ -0,0 +1,144 @@
1
+ ---
2
+ description: 从 Vue2 源码中完整提取单个资产的行为真值——Props/Events/Methods/Slots/响应式/生命周期/Mixin调用点/第三方集成/Stories,产出纯事实文档,禁止推断与转换建议。
3
+ ---
4
+
5
+ ## 用户输入
6
+
7
+ ```text
8
+ $ARGUMENTS
9
+ ```
10
+
11
+ 用户输入为资产名称(如 `cw_audio_view`)。若为空,展示 `specs/manifest.md` 中所有 pending 状态的资产供选择。
12
+
13
+ ## 必要知识(必须在执行前 Read,不可跳过)
14
+
15
+ 1. **`workflows/migrate/knowledge-base.md` 全文** — 仅用于提取 Vue2 行为真值与 stories 溯源
16
+ 2. **logic 资产额外**:`references/nasl-logic-authoring/SKILL.md` — 识别 @NaslLogic 元数据
17
+
18
+ ## 核心纪律
19
+
20
+ > **只记录、不判断。"它现在做什么" ≠ "它应该怎么转"。**
21
+
22
+ > 本命令的认知模式是"观察者"——完整、精确、客观地记录 Vue2 源码的行为事实。
23
+ > 任何转换方案、质量评价、优化建议都属于 migrate.plan 的职责。
24
+
25
+ ## 禁止条款
26
+
27
+ - ❌ 按 KB 编写 Vue3 转换方案、替换代码或 pitfalls 应对
28
+ - ❌ 评价 Vue2 代码质量
29
+ - ❌ 推断源码未写出的行为
30
+ - ❌ 判断某个行为"不重要可以不迁移"
31
+ - ❌ 遗漏 Mixin 方法(必须全量列出再标注是否有调用点)
32
+ - ❌ 跳过 stories 真值提取
33
+ - ✅ component:仅使用 KB 中 Instructions、Stories 溯源(§stories-truth)、Mixin 清单、第三方集成相关节
34
+ - ✅ logic:仅提取 @NaslLogic 元数据、参数/rest/泛型、返回值与边界行为(参照 nasl-logic-authoring)
35
+ - ✅ shared-composable:仅提取 Mixin 导出方法、副作用注册点、各组件调用契约
36
+
37
+ > 全文 Read KB 后,按 KB §asset-applicability 跳过不适用章节(logic 跳过 §stories-truth 等)。
38
+
39
+ ---
40
+
41
+ ## 工作流程
42
+
43
+ ### 步骤 0:读取资产类型
44
+
45
+ 1. 从 `specs/manifest.md` 读取当前资产的「类型」列
46
+ 2. 打开本文「资产类型分支」,**仅**执行该分支步骤
47
+ 3. 禁止执行其他类型步骤(例:logic 禁止 E2E / ideusage / §alignment-checklist)
48
+
49
+ ### 1. 确认资产
50
+
51
+ - 从 `specs/manifest.md` 确认资产存在且状态为 `⏳ pending`
52
+ - 读取 manifest 该资产 `depends_on` 列;若非空,逐项检查依赖资产状态:
53
+ - 全部为 `✅ verified` → 继续
54
+ - 存在 `🚫 blocked` → 使用 AskUserQuestion 确认是否跳过阻塞依赖
55
+ - 存在未 verified 且非 blocked → **报错终止**,提示先迁移依赖资产
56
+ - 读取 manifest「类型」列,后续 spec 结构按类型分支
57
+ - 若未指定资产名:列出所有 pending 资产,使用 **AskUserQuestion** 让用户选择
58
+ - 确定 Vue2 源码中该资产的完整路径
59
+
60
+ ### 2. 完整读取 Vue2 源码
61
+
62
+ 读取该资产在 Vue2 库中的**全部**源文件:
63
+
64
+ **组件资产**:
65
+ - `index.vue`(template + script + style 全部内容)
66
+ - `api.ts` / `api.yaml`(接口定义)
67
+ - `stories/block.stories.js`(或 .tsx/.jsx)
68
+ - `stories/example.stories.*`(若存在)
69
+ - 所有引用的 Mixin 文件(完整内容)
70
+ - 关联的 CSS/SCSS/Less 文件
71
+ - `index.ts`(桶文件导出)
72
+ - `install.ts` / `plugin.ts`(全局注册,若存在)
73
+
74
+ **逻辑资产**:
75
+ - 逻辑函数文件(含 JSDoc 元数据)
76
+ - 关联的类型定义文件
77
+ - 依赖的工具函数
78
+
79
+ ### 3. 系统性提取行为规格
80
+
81
+ 从源码中提取以下维度,写入 spec.md(**必须按 `templates/migration-spec-template.md` 格式输出**):
82
+
83
+ **组件规格**:
84
+
85
+ | 维度 | 提取内容 |
86
+ |------|----------|
87
+ | Props | 名称、类型(nasl.*)、默认值(以 api.yaml 为准)、是否双向绑定、验证规则 |
88
+ | Events | 事件名(on+PascalCase)、参数签名(单一 event 对象)、触发条件 |
89
+ | Methods | 方法名、参数、返回值、副作用描述 |
90
+ | Slots | 插槽名、作用域变量(Current<T> 模式)、用途 |
91
+ | 响应式状态 | data/computed 关键状态及其依赖关系链 |
92
+ | 生命周期 | mounted/destroyed/watch 中的初始化与清理逻辑 |
93
+ | Mixin 调用点 | 每个 Mixin 的每个方法在本组件中的实际调用位置 |
94
+ | 第三方集成 | 库名、版本、初始化方式、配置项、销毁方式 |
95
+ | 全局注册 | install 中注册的组件名与对应导出 |
96
+
97
+ **逻辑规格**(参照 nasl-logic-authoring):
98
+ - 函数名 / JSDoc 元数据(@NaslLogic @title @description)
99
+ - 参数列表(名称、类型 nasl.*、是否 rest)
100
+ - 返回值类型
101
+ - 泛型与 @typeParam
102
+ - 依赖的工具函数
103
+
104
+ **shared-composable 规格**:
105
+
106
+ | 维度 | 提取内容 |
107
+ |------|----------|
108
+ | Exported 方法 | 方法名、参数、返回值、副作用 |
109
+ | 调用点 | 哪些组件在何处调用(引用 manifest) |
110
+ | 副作用 | listener / observer / timer 注册与预期 teardown |
111
+ | 纯函数 | 无副作用的方法清单 |
112
+
113
+ ### 4. 记录 Stories 真值(→ §stories-truth)
114
+
115
+ **完整记录**(非摘要)block.stories 和 example.stories 的源码内容:
116
+ - 每个 export 的 name、render/template
117
+ - 使用的 Vue2 平台标签(u-button 等,原样记录,不做替换建议)
118
+ - 变量、事件绑定(原样记录)
119
+
120
+ ### 5. 输出 spec.md
121
+
122
+ 写入 `specs/<NN>-<资产名>/spec.md`(若目录不存在则创建)。
123
+
124
+ ### 6. 更新状态
125
+
126
+ 更新 `specs/manifest.md`:该资产状态 `⏳ pending` → `🔍 spec-done`
127
+
128
+ ### 7. 报告
129
+
130
+ 输出:
131
+ - 资产名称与类型
132
+ - spec.md 路径
133
+ - 行为维度统计(N props / M events / K methods / ...)
134
+ - 复杂度初判(高/中/低,基于 Mixin 数 + 第三方库 + Props 数量)
135
+ - 下一步指引:`/migrate.plan <资产名>` 制定转换策略
136
+
137
+ ## 关键规则
138
+
139
+ - Vue2 源码是行为的唯一真值——本命令只做"翻译"(代码→结构化文档),不做"创作"
140
+ - Mixin 全量方法必须列出,即使看起来"不会用到"——判断调用点是客观事实,不是主观猜测
141
+ - Prop 默认值以 api.yaml 为准(api.yaml 是 LCAP 平台的权威来源)
142
+ - Stories 原样记录,包括 Vue2 特有标签——替换决策属于 plan 阶段
143
+ - spec.md 中允许标注"注意事项"(如边界条件、已知 hack),但不允许写解决方案
144
+ - 必须使用中文输出