prd-to-flutter 0.1.0

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 (85) hide show
  1. package/README.md +149 -0
  2. package/bin/p2f.mjs +18 -0
  3. package/dist/cli.js +203 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/clean.js +35 -0
  6. package/dist/commands/clean.js.map +1 -0
  7. package/dist/commands/doctor.js +148 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/generate.js +120 -0
  10. package/dist/commands/generate.js.map +1 -0
  11. package/dist/commands/init.js +46 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/paths.js +58 -0
  14. package/dist/commands/paths.js.map +1 -0
  15. package/dist/commands/remove.js +23 -0
  16. package/dist/commands/remove.js.map +1 -0
  17. package/dist/commands/screenshots-audit.js +39 -0
  18. package/dist/commands/screenshots-audit.js.map +1 -0
  19. package/dist/commands/skills-install.js +21 -0
  20. package/dist/commands/skills-install.js.map +1 -0
  21. package/dist/commands/sync.js +84 -0
  22. package/dist/commands/sync.js.map +1 -0
  23. package/dist/commands/update.js +93 -0
  24. package/dist/commands/update.js.map +1 -0
  25. package/dist/core/existing-page-detector.js +463 -0
  26. package/dist/core/existing-page-detector.js.map +1 -0
  27. package/dist/core/fail-fast.js +50 -0
  28. package/dist/core/fail-fast.js.map +1 -0
  29. package/dist/core/feature-coverage-builder.js +667 -0
  30. package/dist/core/feature-coverage-builder.js.map +1 -0
  31. package/dist/core/flutter-project-scanner.js +393 -0
  32. package/dist/core/flutter-project-scanner.js.map +1 -0
  33. package/dist/core/implementation-plan-writer.js +190 -0
  34. package/dist/core/implementation-plan-writer.js.map +1 -0
  35. package/dist/core/logger.js +39 -0
  36. package/dist/core/logger.js.map +1 -0
  37. package/dist/core/package-info.js +33 -0
  38. package/dist/core/package-info.js.map +1 -0
  39. package/dist/core/paths.js +37 -0
  40. package/dist/core/paths.js.map +1 -0
  41. package/dist/core/playwright-capture.js +539 -0
  42. package/dist/core/playwright-capture.js.map +1 -0
  43. package/dist/core/playwright-cli.js +26 -0
  44. package/dist/core/playwright-cli.js.map +1 -0
  45. package/dist/core/playwright-install.js +40 -0
  46. package/dist/core/playwright-install.js.map +1 -0
  47. package/dist/core/prd-clone.js +131 -0
  48. package/dist/core/prd-clone.js.map +1 -0
  49. package/dist/core/prd-install.js +108 -0
  50. package/dist/core/prd-install.js.map +1 -0
  51. package/dist/core/profile.js +149 -0
  52. package/dist/core/profile.js.map +1 -0
  53. package/dist/core/project-doc-reader.js +252 -0
  54. package/dist/core/project-doc-reader.js.map +1 -0
  55. package/dist/core/report-writer.js +90 -0
  56. package/dist/core/report-writer.js.map +1 -0
  57. package/dist/core/route-name.js +60 -0
  58. package/dist/core/route-name.js.map +1 -0
  59. package/dist/core/run-context.js +160 -0
  60. package/dist/core/run-context.js.map +1 -0
  61. package/dist/core/screenshot-auditor.js +405 -0
  62. package/dist/core/screenshot-auditor.js.map +1 -0
  63. package/dist/core/screenshot-exploration-plan-writer.js +200 -0
  64. package/dist/core/screenshot-exploration-plan-writer.js.map +1 -0
  65. package/dist/core/semantic-model-builder.js +922 -0
  66. package/dist/core/semantic-model-builder.js.map +1 -0
  67. package/dist/core/skill-install.js +78 -0
  68. package/dist/core/skill-install.js.map +1 -0
  69. package/dist/core/stage-stub.js +24 -0
  70. package/dist/core/stage-stub.js.map +1 -0
  71. package/dist/core/task-index-writer.js +149 -0
  72. package/dist/core/task-index-writer.js.map +1 -0
  73. package/dist/core/update-checker.js +155 -0
  74. package/dist/core/update-checker.js.map +1 -0
  75. package/dist/core/vue-page-locator.js +748 -0
  76. package/dist/core/vue-page-locator.js.map +1 -0
  77. package/dist/core/vue-project-reader.js +116 -0
  78. package/dist/core/vue-project-reader.js.map +1 -0
  79. package/docs/artifacts-and-agent.md +203 -0
  80. package/docs/development.md +118 -0
  81. package/docs/usage.md +246 -0
  82. package/package.json +50 -0
  83. package/skills/p2f/SKILL.md +303 -0
  84. package/skills/p2f/references/page-layout-patterns.md +120 -0
  85. package/skills/p2f/references/youfi-flutter-guidelines.md +71 -0
@@ -0,0 +1,190 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join, relative } from 'node:path';
3
+ import { markComplete } from './run-context.js';
4
+ import { logger } from './logger.js';
5
+ export function writeImplementationPlan(ctx, model, verdict, snapshot) {
6
+ const outDir = join(ctx.pageDir, 'analysis');
7
+ mkdirSync(outDir, { recursive: true });
8
+ const planPath = join(outDir, 'implementation-plan.md');
9
+ const highRisk = [];
10
+ if (verdict.status === 'missing')
11
+ highRisk.push('Flutter 目标页面未命中,需新增文件与路由。');
12
+ if (verdict.status === 'uncertain') {
13
+ highRisk.push(`existing-page 判定不确定(confidence=${verdict.confidence}),agent 必须先复核 \`flutter-mapping.md\`,确认后再修改或新增页面。`);
14
+ }
15
+ if (verdict.status === 'exists' && verdict.confidence < 0.85) {
16
+ highRisk.push(`existing-page 虽为 exists 但置信度未达 0.85(confidence=${verdict.confidence}),建议快速复核 \`flutter-mapping.md\`。`);
17
+ }
18
+ const unknowns = [];
19
+ if (model.blocked)
20
+ unknowns.push('语义模型标记 blocked=true,采集不完整,后续生成可能偏离原型。');
21
+ if (verdict.evidence.length === 0)
22
+ unknowns.push('页面存在性判断没有可用数据,默认按未初始化处理。');
23
+ if (verdict.agentReview.required)
24
+ unknowns.push(`页面存在性需要 agent 复核:${verdict.agentReview.reason}`);
25
+ if (model.outline.candidateInteractions.length === 0) {
26
+ unknowns.push('未识别到任何候选交互,Tab/弹窗等次要状态未覆盖。');
27
+ }
28
+ unknowns.push('CLI 不再自动截图;实现前必须由 agent 打开原型页面、主动探索并补齐 agent/screenshots/ 与 agent/runtime/agent-screenshot-exploration.json。');
29
+ const lines = [];
30
+ lines.push(`# 实现计划 — ${model.pageName}`);
31
+ lines.push('');
32
+ lines.push(`- 页面目录名:\`${model.pageKey}\``);
33
+ lines.push(`- 页面类型:\`${model.pageType}\``);
34
+ lines.push(`- 原型链接:${ctx.options.prototypeUrl}`);
35
+ lines.push(`- 原型提交:${ctx.prototypeCommit ?? '(未知)'}`);
36
+ lines.push(`- 原型来源:${ctx.prototypeSource ?? '(未知)'}`);
37
+ lines.push('');
38
+ lines.push('## 判定');
39
+ lines.push('');
40
+ lines.push(`- 页面存在性状态:**${verdict.status}**(置信度=${verdict.confidence})`);
41
+ lines.push(`- 页面是否已确认存在:**${verdict.pageExists}**`);
42
+ lines.push(`- 是否需要 agent 复核:**${verdict.agentReview.required}**`);
43
+ lines.push(`- 目标模块:\`${verdict.targetModule || '(无)'}\``);
44
+ if (verdict.status === 'exists') {
45
+ lines.push(`- 目标页面文件:\`${verdict.targetPageFile ?? '(无)'}\``);
46
+ lines.push(`- 目标 Widget 类:\`${verdict.targetWidgetClass ?? '(无)'}\``);
47
+ lines.push(`- 目标路由:\`AppRoutes.${verdict.targetRouteKey ?? '(?)'}\``);
48
+ }
49
+ else if (verdict.status === 'uncertain') {
50
+ lines.push(`- 候选文件:${verdict.agentReview.candidateFiles.map((f) => `\`${f}\``).join(', ') || '(无)'}`);
51
+ lines.push(`- 新建文件备选:\`${verdict.proposal.pageFile}\``);
52
+ lines.push(`- 新建类备选:\`${verdict.proposal.widgetClass}\``);
53
+ }
54
+ else {
55
+ lines.push(`- 新建文件提案:\`${verdict.proposal.pageFile}\``);
56
+ lines.push(`- 新建类提案:\`${verdict.proposal.widgetClass}\``);
57
+ lines.push(`- 新增路由提案:\`AppRoutes.${verdict.proposal.routeKey} = '${verdict.proposal.routePath}'\``);
58
+ }
59
+ lines.push('');
60
+ if (verdict.agentReview.required) {
61
+ lines.push('## agent 页面存在性复核');
62
+ lines.push('');
63
+ lines.push(`- 复核原因:${verdict.agentReview.reason}`);
64
+ lines.push('- 复核完成前,不要创建新页面,也不要修改候选页面。');
65
+ lines.push('');
66
+ lines.push('### 建议搜索命令');
67
+ lines.push('');
68
+ for (const cmd of verdict.agentReview.commands)
69
+ lines.push(`- \`${cmd}\``);
70
+ lines.push('');
71
+ lines.push('### 复核清单');
72
+ lines.push('');
73
+ for (const item of verdict.agentReview.checklist)
74
+ lines.push(`- ${item}`);
75
+ lines.push('');
76
+ }
77
+ lines.push('## agent 实现建议');
78
+ lines.push('');
79
+ if (verdict.status === 'exists') {
80
+ lines.push(`- 建议在既有页面 \`${verdict.targetPageFile ?? '(未知)'}\` 上扩展实现,保留现有业务结构。`);
81
+ }
82
+ else if (verdict.status === 'uncertain') {
83
+ lines.push('- 先完成上面的页面存在性复核。');
84
+ lines.push('- 若确认已有页面:在确认后的既有页面上扩展实现,保留现有业务结构。');
85
+ lines.push(`- 若确认不存在:使用新增备选 \`${verdict.proposal.pageFile}\` / \`${verdict.proposal.widgetClass}\`。`);
86
+ lines.push(`- 路由入口:\`${snapshot.structure.routeConstantsFile ?? '(未检测到)'}\` 和 \`${snapshot.structure.routePagesFile ?? '(未检测到)'}\`。`);
87
+ }
88
+ else {
89
+ lines.push(`- 建议新增页面文件:\`${verdict.proposal.pageFile}\``);
90
+ lines.push(`- 建议新增页面类:\`${verdict.proposal.widgetClass}\``);
91
+ lines.push(`- 建议新增路由:\`AppRoutes.${verdict.proposal.routeKey} = '${verdict.proposal.routePath}'\``);
92
+ lines.push(`- 路由入口:\`${snapshot.structure.routeConstantsFile ?? '(未检测到)'}\` 和 \`${snapshot.structure.routePagesFile ?? '(未检测到)'}\`。`);
93
+ lines.push('- 如果用户指定页面入口文件或模块,agent 实现时以用户指定为准,并在实现说明中记录。');
94
+ lines.push('- 按 YouFi 项目现有翻译规范补齐可见文本 key。');
95
+ }
96
+ lines.push('');
97
+ lines.push('> p2f CLI 不直接生成 Dart 页面代码;请由 agent 读取本任务目录数据后实现。');
98
+ lines.push('');
99
+ lines.push('## 资源处理');
100
+ lines.push('');
101
+ lines.push('- CLI 不直接复制 App 资源。请由 agent 按 YouFi 项目资源规范判断复用或新增。');
102
+ lines.push('');
103
+ lines.push('## 可复用资源');
104
+ lines.push('');
105
+ lines.push(`- 公共组件候选:${verdict.reuseCandidates.widgets.join(', ') || '(无)'}`);
106
+ lines.push(`- 主题 token 候选:${verdict.reuseCandidates.themeTokens.join(', ') || '(无)'}`);
107
+ lines.push('');
108
+ lines.push('## 主题约束');
109
+ lines.push('');
110
+ lines.push(`- 字体样式映射必须先读 \`${relative(ctx.taskDir, model.textStyleMapPath)}\`,按其中的 CSS → YouFi textStyle 映射实现。`);
111
+ lines.push('- 文字样式优先使用 `themeService.textStyles.*`。');
112
+ lines.push('- 颜色优先使用 `themeService.colors.*`。');
113
+ lines.push('- 不要为了贴合截图硬编码 `Color(0x...)`、十六进制颜色、字体大小或行高;没有对应 token 时在实现说明里标记差异。');
114
+ lines.push('- 如果实现代码选择了与 `text-style-map.md` 不同的 textStyle token,必须在实现说明里解释原因。');
115
+ lines.push('');
116
+ lines.push('## GetX 响应式约束');
117
+ lines.push('');
118
+ lines.push('- 页面优先使用 `BaseGetView<T>` + `GetxController`,但不要在 `buildView()` 外层套整页 `Obx`。');
119
+ lines.push('- `Obx` 只能包直接消费 Rx 的最小 UI 片段,禁止包住整页、整块静态布局或无关子树。');
120
+ lines.push('- 禁止在 `Obx` 中写 `controller.xxx.value;` 这种不参与渲染的空读来规避 GetX 检查。');
121
+ lines.push('- Rx 值必须直接参与当前 `Obx` builder 返回的 widget 渲染,例如文本、颜色、图标、选中态、显隐分支或列表内容。');
122
+ lines.push('- 如果子组件依赖 Rx,优先在子组件内部使用局部 `Obx`,或在父级 `Obx` 中读取 `.value` 后把普通值传给子组件。');
123
+ lines.push('- `dart analyze` 通过不代表 GetX 响应式范围正确;实现后必须运行页面,确认没有 `[Get] improper use of a GetX` 红屏。');
124
+ lines.push('');
125
+ lines.push('## Tab / 分段控件实现约束');
126
+ lines.push('');
127
+ lines.push('- 对 Tab、segmented control、筛选 chip、指标切换等高频点击控件,应尽量保留原型的轻量过渡感。');
128
+ lines.push('- 对胶囊型选中态,优先用一个单独的选中 pill / indicator 背景层在选项之间移动,例如 `Stack` + `AnimatedPositioned` / `AnimatedAlign`。不要让每个 Tab item 各自用 `AnimatedContainer` 绘制选中背景,避免旧背景退场和新背景入场叠加造成残影/闪烁。');
129
+ lines.push('- 文本颜色过渡使用 `AnimatedDefaultTextStyle`、`DefaultTextStyle` 配合父级动画,或项目已有组件;容器背景移动和文字颜色变化应使用接近的 `duration` / `curve`。');
130
+ lines.push('- 需要强调选中态时,优先只切换单一 pill 背景位置、边框和文字颜色,避免多个 item 背景同时动画与字体重栅格化叠加。');
131
+ lines.push('- Tab 组的 `Obx` 范围要收敛到实际消费 active state 的最小组件;不要把无关静态内容或整块面板包进同一个 `Obx`。');
132
+ lines.push('');
133
+ lines.push('## agent 截图前置任务');
134
+ lines.push('');
135
+ lines.push('- 先读 `cli/analysis/screenshot-exploration-plan.md`。');
136
+ lines.push('- Agent 必须打开 live prototype,主动探索页面、滚动、Tab、弹窗、下拉、输入聚焦、展开项和源码/文档提示的状态。');
137
+ lines.push('- 截图必须截 `.phone-screen` 元素,不能保存包含 TradeApp Workflow Hub 平台菜单的整页截图。');
138
+ lines.push('- 截图写入 `agent/screenshots/`,探索日志写入 `agent/runtime/agent-screenshot-exploration.json`。');
139
+ lines.push('- agent 创建截图、探索日志、说明文件或修改 Flutter 文件后,必须同步更新 `agent/manifest.json`。');
140
+ lines.push('- 截图完成后执行 `p2f screenshots-audit --url "<页面链接>"`,处理重复图和疑似平台壳层截图。');
141
+ lines.push('- 不要只依赖 `cli/runtime/interactions.candidate.json`;它只是线索,不是完整状态列表。');
142
+ lines.push('');
143
+ lines.push('## 读取策略');
144
+ lines.push('');
145
+ lines.push('- 先读 `main.md`、`cli/analysis/page-summary.md`、`cli/analysis/feature-coverage.md`、本计划和 agent 已生成的截图/探索日志。');
146
+ lines.push('- 大型 JSON 按需读取:需要查结构时读 `cli/runtime/dom.json` 的相关片段,需要查样式时读 `cli/runtime/computed-styles.json` 或 `cli/analysis/text-style-map.md`。');
147
+ lines.push('- 不要把全部 CLI 产物一次性塞入上下文;先用 Markdown 摘要和清单建立范围,再针对具体组件、文案、selector 读取 JSON。');
148
+ lines.push('');
149
+ lines.push('## 候选交互(尚未触发截图)');
150
+ lines.push('');
151
+ if (model.outline.candidateInteractions.length === 0) {
152
+ lines.push('- (空)');
153
+ }
154
+ else {
155
+ for (const c of model.outline.candidateInteractions.slice(0, 20)) {
156
+ lines.push(`- \`${c.selector}\` · ${c.kind}${c.label ? ` · ${c.label}` : ''}`);
157
+ }
158
+ if (model.outline.candidateInteractions.length > 20) {
159
+ lines.push(`- …共 ${model.outline.candidateInteractions.length} 项(仅展示前 20)`);
160
+ }
161
+ }
162
+ lines.push('');
163
+ lines.push('## 高风险点');
164
+ lines.push('');
165
+ if (highRisk.length === 0)
166
+ lines.push('- (无)');
167
+ for (const r of highRisk)
168
+ lines.push(`- ${r}`);
169
+ lines.push('');
170
+ lines.push('## 不确定项');
171
+ lines.push('');
172
+ if (unknowns.length === 0)
173
+ lines.push('- (无)');
174
+ for (const u of unknowns)
175
+ lines.push(`- ${u}`);
176
+ lines.push('');
177
+ lines.push('## 下一步');
178
+ lines.push('');
179
+ if (highRisk.length > 0 || unknowns.length > 0) {
180
+ lines.push('> 请先审阅上述高风险点与不确定项,再让 agent 基于数据实现 Flutter 页面。');
181
+ }
182
+ else {
183
+ lines.push('> 让 agent 先完成 live-page 截图探索,再按需读取 `main.md`、agent 截图/日志、CLI Markdown 摘要和必要 runtime JSON 实现 Flutter 页面。');
184
+ }
185
+ writeFileSync(planPath, lines.join('\n') + '\n', 'utf8');
186
+ logger.success(`Implementation plan → ${planPath}`);
187
+ markComplete(ctx, 'write-implementation-plan');
188
+ return { planPath, highRisk, unknowns };
189
+ }
190
+ //# sourceMappingURL=implementation-plan-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implementation-plan-writer.js","sourceRoot":"","sources":["../../src/core/implementation-plan-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import pc from 'picocolors';
2
+ const prefix = {
3
+ debug: pc.gray('·'),
4
+ info: pc.cyan('i'),
5
+ warn: pc.yellow('!'),
6
+ error: pc.red('✖'),
7
+ success: pc.green('✓'),
8
+ stage: pc.magenta('▶'),
9
+ };
10
+ function emit(level, message, ...rest) {
11
+ const line = `${prefix[level]} ${message}`;
12
+ if (level === 'error') {
13
+ console.error(line, ...rest);
14
+ return;
15
+ }
16
+ console.log(line, ...rest);
17
+ }
18
+ export const logger = {
19
+ debug(message, ...rest) {
20
+ if (process.env.P2F_DEBUG)
21
+ emit('debug', message, ...rest);
22
+ },
23
+ info(message, ...rest) {
24
+ emit('info', message, ...rest);
25
+ },
26
+ warn(message, ...rest) {
27
+ emit('warn', message, ...rest);
28
+ },
29
+ error(message, ...rest) {
30
+ emit('error', message, ...rest);
31
+ },
32
+ success(message, ...rest) {
33
+ emit('success', message, ...rest);
34
+ },
35
+ stage(message) {
36
+ emit('stage', pc.bold(message));
37
+ },
38
+ };
39
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,MAAM,MAAM,GAA0B;IACpC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;IACnB,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;IAClB,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;IACpB,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;IACtB,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;CACvB,CAAC;AAEF,SAAS,IAAI,CAAC,KAAY,EAAE,OAAe,EAAE,GAAG,IAAe;IAC7D,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;IAC3C,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS;YAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,CAAC,OAAe,EAAE,GAAG,IAAe;QACtC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,KAAK,CAAC,OAAe,EAAE,GAAG,IAAe;QACvC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,CAAC,OAAe,EAAE,GAAG,IAAe;QACzC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,CAAC;CACF,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ export function readPackageInfo() {
5
+ const pkgPath = join(resolvePackageRoot(), 'package.json');
6
+ const raw = JSON.parse(readFileSync(pkgPath, 'utf8'));
7
+ if (!isRecord(raw)) {
8
+ throw new Error(`package.json 格式无效:${pkgPath}`);
9
+ }
10
+ const name = typeof raw.name === 'string' ? raw.name : 'p2f';
11
+ const version = typeof raw.version === 'string' ? raw.version : '0.0.0';
12
+ const p2f = isRecord(raw.p2f) ? raw.p2f : undefined;
13
+ const updateRepo = typeof p2f?.updateRepo === 'string' ? p2f.updateRepo : undefined;
14
+ return { name, version, updateRepo };
15
+ }
16
+ function resolvePackageRoot() {
17
+ let cur = dirname(fileURLToPath(import.meta.url));
18
+ for (let i = 0; i < 8; i += 1) {
19
+ const pkgPath = join(cur, 'package.json');
20
+ if (existsSync(pkgPath)) {
21
+ return cur;
22
+ }
23
+ const parent = dirname(cur);
24
+ if (parent === cur)
25
+ break;
26
+ cur = parent;
27
+ }
28
+ return resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
29
+ }
30
+ function isRecord(value) {
31
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
32
+ }
33
+ //# sourceMappingURL=package-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-info.js","sourceRoot":"","sources":["../../src/core/package-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQzC,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,cAAc,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAY,CAAC;IACjE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACxE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,MAAM,UAAU,GAAG,OAAO,GAAG,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC1C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { dirname, resolve, join } from 'node:path';
2
+ import { existsSync, statSync } from 'node:fs';
3
+ export function resolveWorkspaceRoot(hint) {
4
+ if (hint)
5
+ return resolve(hint);
6
+ // Walk up from cwd until we find pubspec.yaml; that's the Flutter workspace root.
7
+ let cur = process.cwd();
8
+ for (let i = 0; i < 16; i += 1) {
9
+ const candidate = join(cur, 'pubspec.yaml');
10
+ if (existsSync(candidate) && statSync(candidate).isFile()) {
11
+ return cur;
12
+ }
13
+ const parent = dirname(cur);
14
+ if (parent === cur)
15
+ break;
16
+ cur = parent;
17
+ }
18
+ // Fallback to cwd; callers can still validate presence of pubspec.yaml.
19
+ return process.cwd();
20
+ }
21
+ export function buildWorkspacePaths(hint) {
22
+ const root = resolveWorkspaceRoot(hint);
23
+ const workspaceDir = join(root, '.p2f-workspace');
24
+ return {
25
+ root,
26
+ workspaceDir,
27
+ prdSourceDir: join(workspaceDir, 'prd-source'),
28
+ pagesDir: join(workspaceDir, 'pages'),
29
+ projectDir: join(workspaceDir, 'project'),
30
+ logsDir: join(workspaceDir, 'logs'),
31
+ };
32
+ }
33
+ /** Canonical remote for the prototype repo. */
34
+ export const PROTOTYPE_REMOTE = 'git@code.nexita.net:inno/youfi/web/TradeAppPrd.git';
35
+ /** Canonical branch name. */
36
+ export const PROTOTYPE_BRANCH = 'master';
37
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAqB/C,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,IAAI,IAAI;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,kFAAkF;IAClF,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC5C,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1D,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,wEAAwE;IACxE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAClD,OAAO;QACL,IAAI;QACJ,YAAY;QACZ,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC;QAC9C,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;QACrC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;QACzC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oDAAoD,CAAC;AAErF,6BAA6B;AAC7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC"}