pomaster 0.5.3 → 0.6.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.
- package/README.md +20 -6
- package/dist/bin.js +2354 -281
- package/legal/THIRD_PARTY_NOTICES.md +2 -2
- package/package.json +1 -1
- package/seeds/baseline/frontend/design-tokens.yaml +129 -0
- package/seeds/manifest.json +18 -3
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
## 0. 锚点与口径
|
|
9
9
|
|
|
10
10
|
<!-- notices-sync:begin:anchor -->
|
|
11
|
-
- **版本锚**:本清单以仓库内 `pnpm-lock.yaml`(lockfileVersion 9.0)为唯一锚点;该 lockfile 最后变更于 commit `
|
|
11
|
+
- **版本锚**:本清单以仓库内 `pnpm-lock.yaml`(lockfileVersion 9.0)为唯一锚点;该 lockfile 最后变更于 commit `65905df9637e8105fa8096d1f5464a78b869fab2`;lockfile 内容指纹 sha256 = `891105fb89ee91af21dfd9cbe42863e3b5b8de3acb415bac0daa67249be80967`。本清单不写墙钟生成日期、不写仓库 HEAD(HEAD 随无关提交漂移,不可作锚)——刷新口径 = 「以 pnpm-lock.yaml 对应 commit + 内容指纹为锚」。
|
|
12
12
|
<!-- notices-sync:end:anchor -->
|
|
13
13
|
<!-- notices-sync:begin:dep-face -->
|
|
14
14
|
- **依赖面**:lockfile `packages:` 节共 **617 个第三方包**(name@version 去重;peer 多变体同包只记一行),按用途拆两节:
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
<!-- notices-sync:begin:section-a -->
|
|
55
55
|
## §A 运行时依赖(8 包)
|
|
56
56
|
|
|
57
|
-
构成:workspace 各包 `dependencies`(非 dev)的非 workspace 传递闭包——packages/cli → commander;packages/gauntlet-lite →(无第三方运行时依赖);packages/kernel → ajv / js-yaml;packages/schemas →(无第三方运行时依赖);packages/studio →(无第三方运行时依赖);packages/studio-react →(无第三方运行时依赖)。
|
|
57
|
+
构成:workspace 各包 `dependencies`(非 dev)的非 workspace 传递闭包——packages/cli → ajv / commander / js-yaml;packages/gauntlet-lite →(无第三方运行时依赖);packages/kernel → ajv / js-yaml;packages/schemas →(无第三方运行时依赖);packages/studio →(无第三方运行时依赖);packages/studio-react →(无第三方运行时依赖)。
|
|
58
58
|
|
|
59
59
|
| 包名 | 版本 | license id | license 源文件路径(本仓库 node_modules 内) | 证据 |
|
|
60
60
|
|---|---|---|---|---|
|
package/package.json
CHANGED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# baseline/frontend/design-tokens.yaml —— 语义 Design Token 合同(F-M1 最小合同 + Default Design preset 值)
|
|
2
|
+
# 职责(PRD §16 树):语义 token 单一合同面——颜色/字体/间距/圆角/阴影/层级/密度/
|
|
3
|
+
# 布局/动效/断点九组语义 token;UI 只能从本合同的语义 token 与批准组件取得视觉
|
|
4
|
+
# 规则;Agent Context 消费语义 token 而非裸数值(原文 §17 设计原则)。
|
|
5
|
+
# 本文件由 pomaster init 播种(B6D 批增量——09-10 R3/F-M1;09-11 Default Design
|
|
6
|
+
# preset 值批回填);seed-once(缺席才写/在座零触碰);确认链第 25 文件
|
|
7
|
+
# (BASELINE_CONFIRM_TARGETS 单一清单——confirm digest 快照/closeout 校验/preset
|
|
8
|
+
# 快照声明三消费面同源;manifest 不自引用)。
|
|
9
|
+
#
|
|
10
|
+
# origin 机器位(词形闭包 preset|customized|owner——22-design-tokens.schema.json
|
|
11
|
+
# 本地闭包,零中央词表 PR):
|
|
12
|
+
# preset = 播种骨架/预设默认来源(advisory 性质——Owner 确认前不构成项目事实)
|
|
13
|
+
# customized = Owner 在 preset 基础上定制
|
|
14
|
+
# owner = Owner 全权自著(无预设来源)
|
|
15
|
+
# meta.customized = Owner 定制机器位(P-D1 customize/diff/confirm 全流程消费)。
|
|
16
|
+
#
|
|
17
|
+
# 值值有出处红线(09-11 preset 值批——自原「零发明内容」全 UNKNOWN 形态升级;纪律
|
|
18
|
+
# 精神不变:无出处的数值禁入播种面,执行形态升级为「具名出处」):
|
|
19
|
+
# 1. 非 UNKNOWN 值逐值可溯源到官方默认主题具名 token 词形——值行尾「<- 词形」
|
|
20
|
+
# 注记 + 下方逐组出处注记;全部数值当日经官方仓库源文件联网实抓核实,禁凭
|
|
21
|
+
# 记忆填数;
|
|
22
|
+
# 2. 无权威出处或映射非唯一的键保持 UNKNOWN(宁缺毋假——行尾注记登记原因,
|
|
23
|
+
# 回填决策留 Owner);
|
|
24
|
+
# 3. origin=preset 的数值是 advisory(Owner 经 baseline confirm 确认前不构成
|
|
25
|
+
# 项目事实——确认链通道不变)。
|
|
26
|
+
#
|
|
27
|
+
# 逐组出处注记(主源 = Ant Design v5 cssinjs 默认主题——本仓 css 选型的 cssinjs
|
|
28
|
+
# 主题栈对应官方默认主题;官方仓库 5.x-stable 分支源文件):
|
|
29
|
+
# color: components/theme/themes/seed.ts(colorPrimary/colorSuccess/colorWarning/colorError/colorInfo)
|
|
30
|
+
# + components/theme/themes/default/colors.ts(colorBgLayout/colorBgContainer/
|
|
31
|
+
# colorBgElevated/colorText 4 档/colorBorder/colorBorderSecondary)
|
|
32
|
+
# typography: seed.ts(fontFamily/fontFamilyCode/fontSize/fontSizeLG)
|
|
33
|
+
# + themes/shared/genFontSizes.ts(fontSizeHeading3/4、lineHeight 派生式)
|
|
34
|
+
# + components/theme/util/alias.ts(fontWeightStrong)
|
|
35
|
+
# spacing: components/theme/util/alias.ts(marginXXS/XS/SM、margin、marginLG/XL——与 padding 族同值)
|
|
36
|
+
# radius: seed.ts(borderRadius)+ themes/shared/genRadius.ts(borderRadiusXS/SM/LG)
|
|
37
|
+
# elevation: components/theme/util/alias.ts(boxShadow、boxShadowCard)
|
|
38
|
+
# density: seed.ts(controlHeight)+ themes/shared/genControlHeight.ts(controlHeightSM)
|
|
39
|
+
# layout: components/layout/style/index.ts(headerHeight = controlHeight*2)
|
|
40
|
+
# motion: seed.ts(motionUnit/motionEaseInOut)+ themes/shared/genCommonMapToken.ts(motionDurationFast/Mid/Slow)
|
|
41
|
+
# breakpoints: components/theme/util/alias.ts(screenSM/screenMD/screenLG/screenXL)
|
|
42
|
+
# 注:brand.primary/semantic.info/surface.page/text.primary/secondary/tertiary/radius
|
|
43
|
+
# 全组/spacing.xxl/typography.line_height.normal 为 Ant Design v4 与 v5 两代默认
|
|
44
|
+
# 分歧位——本 seed 取 v5 cssinjs 同源值(与本仓 css 选型一致);v4 旧默认值不同,
|
|
45
|
+
# Owner 追认后即为项目事实(advisory 纪律不变)。
|
|
46
|
+
#
|
|
47
|
+
# token 命名收敛定稿(原文 §16 layout.section_gap vs §17 spacing.section_gap 二选一):
|
|
48
|
+
# 定稿 = spacing.section_gap——间距语义归 spacing 组(§17 语义 token 先例逐字);
|
|
49
|
+
# layout 组不再承载 section_gap(layout 留给 page_padding 等页面结构键;断点语义
|
|
50
|
+
# 归 breakpoints 组)。原文 §16 的 layout.section_gap 词形废弃。
|
|
51
|
+
meta:
|
|
52
|
+
origin: preset
|
|
53
|
+
customized: false
|
|
54
|
+
color:
|
|
55
|
+
brand:
|
|
56
|
+
primary: "#1677ff" # <- Seed.colorPrimary
|
|
57
|
+
secondary: UNKNOWN # 无权威词形——默认主题无 secondary 档(宁缺毋假,Owner 决策)
|
|
58
|
+
surface:
|
|
59
|
+
page: "#f5f5f5" # <- colors.colorBgLayout(Layout bodyBg 默认取同值)
|
|
60
|
+
container: "#ffffff" # <- colors.colorBgContainer
|
|
61
|
+
elevated: "#ffffff" # <- colors.colorBgElevated
|
|
62
|
+
text:
|
|
63
|
+
primary: "rgba(0, 0, 0, 0.88)" # <- colors.colorText
|
|
64
|
+
secondary: "rgba(0, 0, 0, 0.65)" # <- colors.colorTextSecondary
|
|
65
|
+
tertiary: "rgba(0, 0, 0, 0.45)" # <- colors.colorTextTertiary
|
|
66
|
+
disabled: "rgba(0, 0, 0, 0.25)" # <- alias.colorTextDisabled(= colorTextQuaternary)
|
|
67
|
+
border:
|
|
68
|
+
default: "#d9d9d9" # <- colors.colorBorder
|
|
69
|
+
subtle: "#f0f0f0" # <- colors.colorBorderSecondary
|
|
70
|
+
strong: UNKNOWN # 无更强边框档词形(宁缺毋假)
|
|
71
|
+
semantic:
|
|
72
|
+
success: "#52c41a" # <- Seed.colorSuccess
|
|
73
|
+
warning: "#faad14" # <- Seed.colorWarning
|
|
74
|
+
error: "#ff4d4f" # <- Seed.colorError
|
|
75
|
+
info: "#1677ff" # <- Seed.colorInfo
|
|
76
|
+
typography:
|
|
77
|
+
family:
|
|
78
|
+
sans: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'" # <- Seed.fontFamily
|
|
79
|
+
mono: "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace" # <- Seed.fontFamilyCode
|
|
80
|
+
size:
|
|
81
|
+
caption: UNKNOWN # 无 caption 词形;候选 fontSizeSM=12 映射非唯一(Owner 拍板)
|
|
82
|
+
body: 14 # <- Seed.fontSize
|
|
83
|
+
body_large: 16 # <- Seed.fontSizeLG
|
|
84
|
+
title_small: UNKNOWN # 候选 fontSizeHeading5=16 与 body_large 同值,映射非唯一(Owner 拍板)
|
|
85
|
+
title_medium: 20 # <- genFontSizes.fontSizeHeading4
|
|
86
|
+
title_large: 24 # <- genFontSizes.fontSizeHeading3
|
|
87
|
+
weight:
|
|
88
|
+
regular: UNKNOWN # 无全局 regular 词形(候选 400 是 CSS 平台默认,非库 token——宁缺毋假)
|
|
89
|
+
medium: UNKNOWN # 无全局 medium 词形(候选 500 仅散点出现,非 token 契约——宁缺毋假)
|
|
90
|
+
semibold: 600 # <- alias.fontWeightStrong
|
|
91
|
+
line_height:
|
|
92
|
+
compact: UNKNOWN # 候选 lineHeightLG=1.5;compact/relaxed 与 SM/LG 映射歧义(Owner 拍板)
|
|
93
|
+
normal: 1.5714285714285714 # <- genFontSizes.lineHeight(官方派生式 (fontSize+8)/fontSize)
|
|
94
|
+
relaxed: UNKNOWN # 候选 lineHeightSM=1.6667;映射歧义同 compact(Owner 拍板)
|
|
95
|
+
spacing:
|
|
96
|
+
xs: 4 # <- alias.marginXXS/paddingXXS
|
|
97
|
+
sm: 8 # <- alias.marginXS/paddingXS
|
|
98
|
+
md: 12 # <- alias.marginSM/paddingSM
|
|
99
|
+
lg: 16 # <- alias.margin/padding
|
|
100
|
+
xl: 24 # <- alias.marginLG/paddingLG
|
|
101
|
+
xxl: 32 # <- alias.marginXL/paddingXL
|
|
102
|
+
section_gap: UNKNOWN # 无 section 词形;候选 marginLG=24 / marginXL=32 映射非唯一(Owner 拍板)
|
|
103
|
+
radius:
|
|
104
|
+
sm: 4 # <- genRadius.borderRadiusSM
|
|
105
|
+
md: 6 # <- Seed.borderRadius
|
|
106
|
+
lg: 8 # <- genRadius.borderRadiusLG
|
|
107
|
+
elevation:
|
|
108
|
+
card: "0 1px 2px -2px rgba(0,0,0,0.16), 0 3px 6px 0 rgba(0,0,0,0.12), 0 5px 12px 4px rgba(0,0,0,0.09)" # <- alias.boxShadowCard
|
|
109
|
+
popover: "0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05)" # <- alias.boxShadow
|
|
110
|
+
modal: "0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05)" # <- alias.boxShadow(默认主题 popover/modal 共用同档,如实注记)
|
|
111
|
+
density:
|
|
112
|
+
control_height: 32 # <- Seed.controlHeight
|
|
113
|
+
compact_control_height: 24 # <- genControlHeight.controlHeightSM
|
|
114
|
+
table_row_height: UNKNOWN # 行高非 token(派生自单元格 padding,无高度词形——Owner 决策)
|
|
115
|
+
compact_table_row_height: UNKNOWN # 同上(宁缺毋假)
|
|
116
|
+
layout:
|
|
117
|
+
page_padding: UNKNOWN # 无页面结构 padding token(Owner 决策)
|
|
118
|
+
content_max_width: UNKNOWN # 官方无 foundation 词形(Owner 决策)
|
|
119
|
+
sidebar_width: UNKNOWN # 组件 prop 非 design token(Owner 决策)
|
|
120
|
+
header_height: 64 # <- Layout.headerHeight(= controlHeight*2)
|
|
121
|
+
motion:
|
|
122
|
+
fast: "0.1s" # <- genCommonMapToken.motionDurationFast
|
|
123
|
+
normal: "0.2s" # <- genCommonMapToken.motionDurationMid
|
|
124
|
+
slow: "0.3s" # <- genCommonMapToken.motionDurationSlow
|
|
125
|
+
breakpoints:
|
|
126
|
+
sm: 576 # <- alias.screenSM
|
|
127
|
+
md: 768 # <- alias.screenMD
|
|
128
|
+
lg: 992 # <- alias.screenLG
|
|
129
|
+
xl: 1200 # <- alias.screenXL
|
package/seeds/manifest.json
CHANGED
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
".pomaster/baseline/frontend/api-and-error.md",
|
|
50
50
|
".pomaster/baseline/frontend/architecture.md",
|
|
51
51
|
".pomaster/baseline/frontend/design-system.md",
|
|
52
|
+
".pomaster/baseline/frontend/design-tokens.yaml",
|
|
52
53
|
".pomaster/baseline/frontend/directory-structure.md",
|
|
53
54
|
".pomaster/baseline/frontend/quality.md",
|
|
54
55
|
".pomaster/baseline/frontend/stack.yaml",
|
|
@@ -119,9 +120,9 @@
|
|
|
119
120
|
},
|
|
120
121
|
"generated_by": "catalog/tools/seed_b6e_evidence.py; B6F 增量=09-05-overlay-asset-batch(manifest 手工增量登记,sha256 pin 由 seed-manifest.spec 双锚对账); B6G 增量=css 体系 overlay(09-05-spec-thematic-reorg 裁决 D8,manifest 手工增量登记); B7-THEME 增量=scripts/seed_b7_theme.py(09-05-spec-thematic-reorg 第二阶段物化批:FE/BE 79 entry 退役删除(D3)+21 条主题/导航 entry 聚合 pin 形态(D6:source pin 指 seeds/aggregation-manifest.json,逐源 vendor sha256 在清单与主题 frontmatter x-aggregation 双面在册))",
|
|
121
122
|
"denominator": {
|
|
122
|
-
"batch_scope": "B7-THEME(09-05-spec-thematic-reorg 第二阶段,Owner 裁定 D1-D8):FE 45+index / BE 32+index 79 文件退役删除(D3 直接删除;已安装工作区并存窗口由 doctor/status legacy_specs_present 检出呈现),重组为 20 份主题文档 + 1 份导航文档(themes/ 单目录 21 文件——12 跨端 + 5 前端独占 + 2 后端独占;映射表 §2 逐文件唯一去向;内容行双向零差异机器自证);主题 frontmatter = 9 基键 + BE 6 扩展键聚合注记(D7)+ x-aggregation 逐源 sha256(D6,与卡 vendor_pin 同值)+ x-language-sections 语言节同步源(R-J 资产层唯一权威,注入面为逐字节副本;18 overlay 全挂点——B01 含 postgresql(OQ-8)、F01 含 css(D8));导航文档承接两 index 路由表/激活基线/冲突优先级(D2);B6c(stacks 28)/B6d/B6e/B6f/B6G 81 条在册——清单合并承载全量分母 102",
|
|
123
|
-
"planted":
|
|
124
|
-
"planted_total":
|
|
123
|
+
"batch_scope": "B7-THEME(09-05-spec-thematic-reorg 第二阶段,Owner 裁定 D1-D8):FE 45+index / BE 32+index 79 文件退役删除(D3 直接删除;已安装工作区并存窗口由 doctor/status legacy_specs_present 检出呈现),重组为 20 份主题文档 + 1 份导航文档(themes/ 单目录 21 文件——12 跨端 + 5 前端独占 + 2 后端独占;映射表 §2 逐文件唯一去向;内容行双向零差异机器自证);主题 frontmatter = 9 基键 + BE 6 扩展键聚合注记(D7)+ x-aggregation 逐源 sha256(D6,与卡 vendor_pin 同值)+ x-language-sections 语言节同步源(R-J 资产层唯一权威,注入面为逐字节副本;18 overlay 全挂点——B01 含 postgresql(OQ-8)、F01 含 css(D8));导航文档承接两 index 路由表/激活基线/冲突优先级(D2);B6c(stacks 28)/B6d/B6e/B6f/B6G 81 条在册——清单合并承载全量分母 102;R3/F-M1 增量=09-10-baseline-confirm-chain-governance R3(baseline/frontend/design-tokens.yaml 补位 B6D 批 25→26,手工增量登记,自指 pin;确认分母 24→25 同源——ADR-20),分母 102→103",
|
|
124
|
+
"planted": 103,
|
|
125
|
+
"planted_total": 103,
|
|
125
126
|
"batch_new": 21
|
|
126
127
|
},
|
|
127
128
|
"seed_semantics": "seed-once-missing-only(缺席才写 / 在座零触碰 / marker-free;seeds.ts 单一实现;frontmatter 为 PRD §8.2 字段位减 id——no-governed-id 默认,播种 spec 是项目可编辑自由文件;B6c 起 BE 件含 vendor frontmatter 保留字段、stacks 件落 <slug> 子目录——SEEDABLE_STORE_DIRS 显式 slug 登记;B6d 起 baseline 件为新著纯正文(无 frontmatter——yaml 直接可解析/Owner 填写面零噪音;entry authoring=new,pin=资产自身字节指纹,装载器自指校验;UNKNOWN 起步,「待填写」词形零移植);B6e 起 specs/evidence 件同 authoring=new 纯正文通路——十七段结构照 PRD §13.1,要求面非证据面(持要求不持判定,判卷四值词形闭包),gates 绑定=登记级注记);B6f/B6G 起 stacks 前端族(vue3/antdesign/geist/css)走移植件通路落地(源=旧线 frontend-hard-spec/assets/stacks/ 新著 vendor 件——统一 9 字段+vendor 保留字段 id→legacy_id/applies_to 并入+x-research-anchors 研究锚透传;installed=播种态全量在册,bound=选中态由 baseline/frontend/stack.yaml 显式选型派生,不作隐式基线——B6c 注记语义同源);B7-THEME 起 themes 面(specs/hard/themes 单目录)为聚合文档通路——seed-once 语义不变,frontmatter = 9 基键 + BE 6 扩展键聚合注记(D7 统一形态,info 性注记非执行语义)+ x-aggregation/x-language-sections 扩展键(D6 聚合 pin;R-J 语言节资产唯一权威、注入面副本)",
|
|
@@ -659,6 +660,20 @@
|
|
|
659
660
|
"B6d 形态注记:本件无 frontmatter(纯正文——yaml 直接可解析/md 零噪音,Owner 填写面);清单 pin=资产自身字节 sha256(authoring=new 自指指纹——新著无 vendor 源字节,防包内清单↔资产失同步,装载器按 authoring 分流校验)"
|
|
660
661
|
]
|
|
661
662
|
},
|
|
663
|
+
{
|
|
664
|
+
"target": ".pomaster/baseline/frontend/design-tokens.yaml",
|
|
665
|
+
"asset": "baseline/frontend/design-tokens.yaml",
|
|
666
|
+
"seed_version": "B6D",
|
|
667
|
+
"lane": "frontend",
|
|
668
|
+
"authoring": "new",
|
|
669
|
+
"source_path": "doc/POMaster-Project-Baseline-Framework-v2-PRD.md#s16-design-tokens-yaml-contract(Baseline PRD §16 token 合同骨架逐字承载+§17 命名收敛定稿;新著无 vendor 字节源——语义祖先=§16 九组骨架;09-11 preset 值批=官方默认主题具名词形回填)",
|
|
670
|
+
"source_sha256": "d2bc2733829e1d75ab9dd49f686a1192ac870cf357f80fd50db91a32ed7541b1",
|
|
671
|
+
"source_bytes": 8356,
|
|
672
|
+
"porting_notes": [
|
|
673
|
+
"R3/F-M1 增量新著件(B6D 批补位,09-10-baseline-confirm-chain-governance):语义 token 骨架九组(Baseline PRD §16 分组逐字;spacing.section_gap 命名收敛定稿——§16 layout.section_gap 废弃,理由住 seed 头注与 22 号 schema)。09-11 preset 值批(design-token-preset-values)值回填:44 键取 Default Design preset 值——值值有出处红线,逐值行尾注记官方具名词形(主源=Ant Design v5 cssinjs 默认主题,官方仓库 5.x-stable 源文件:seed.ts/colors.ts/alias.ts/genRadius.ts/genControlHeight.ts/genFontSizes.ts/genCommonMapToken.ts/layout style;全部数值当日联网实抓核实);无权威出处/映射非唯一 14 键保持 UNKNOWN(宁缺毋假,Owner 决策)——原文示例数值仍禁伪造成项目事实(PRD §7.1 NON-AUTHORITATIVE;origin=preset advisory 语义不变)",
|
|
674
|
+
"R3 形态注记:本件无 frontmatter(纯 yaml——直接可解析,Owner 填写面);清单 pin=资产自身字节 sha256(authoring=new 自指指纹;09-11 preset 值批内容变更,自指指纹同步重 pin——B6D 批分母 26 件不变仅本件内容变);确认链第 25 文件(BASELINE_CONFIRM_TARGETS ADR-20 扩位——digest 快照/closeout/preset 声明三消费面同源;形状契约=packages/schemas/assets/22-design-tokens.schema.json,baseline-tokens.ts 装载校验;已确认工作区遇本批变更走既有漂移→显式重确认通道)"
|
|
675
|
+
]
|
|
676
|
+
},
|
|
662
677
|
{
|
|
663
678
|
"target": ".pomaster/baseline/frontend/directory-structure.md",
|
|
664
679
|
"asset": "baseline/frontend/directory-structure.md",
|