@allbluecn/web-app 0.5.0 → 0.6.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 (170) hide show
  1. package/package.json +239 -30
  2. package/src/components/iteration/auto-schedule-dialog.tsx +150 -0
  3. package/src/components/iteration/burndown-chart.tsx +63 -0
  4. package/src/components/iteration/constants.ts +28 -0
  5. package/src/components/iteration/create-iteration-dialog.tsx +140 -0
  6. package/src/components/iteration/iteration-card.tsx +60 -0
  7. package/src/components/iteration/iteration-editor.tsx +116 -0
  8. package/src/components/iteration/iteration-progress-bar.tsx +44 -0
  9. package/src/components/iteration/iteration-status-badge.tsx +33 -0
  10. package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +21 -30
  11. package/src/components/knowledge/knowledge-toolbar.tsx +124 -1
  12. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +2 -2
  13. package/src/components/layout/sidebar-03/nav-workspace.tsx +2 -2
  14. package/src/components/project/create-project-dialog.tsx +44 -57
  15. package/src/components/shared/__tests__/lucide-curated-icons.test.ts +83 -0
  16. package/src/components/shared/__tests__/lucide-icon-data.test.ts +131 -0
  17. package/src/components/shared/__tests__/lucide-icon-picker.test.tsx +197 -0
  18. package/src/components/shared/lucide-icon-picker/curated-icons.ts +478 -0
  19. package/src/components/shared/lucide-icon-picker/icon-data.ts +109 -0
  20. package/src/components/shared/lucide-icon-picker/index.tsx +82 -0
  21. package/src/components/shared/lucide-icon-picker/lucide-icon-by-name.tsx +78 -0
  22. package/src/components/shared/lucide-icon-picker/panel.tsx +163 -0
  23. package/src/components/story/__tests__/constants.test.ts +255 -0
  24. package/src/components/story/ai/story-ai-panel.tsx +23 -15
  25. package/src/components/story/ai/story-ai-preview-list.tsx +19 -0
  26. package/src/components/story/constants.ts +43 -1
  27. package/src/components/story/create-story-dialog.tsx +42 -16
  28. package/src/components/story/detail/__tests__/associated-attachments-panel.test.tsx +114 -0
  29. package/src/components/story/detail/__tests__/categories.test.tsx +62 -0
  30. package/src/components/story/detail/__tests__/dependencies-button.test.tsx +49 -0
  31. package/src/components/story/detail/activity-timeline.tsx +26 -4
  32. package/src/components/story/detail/story-detail-body.tsx +90 -38
  33. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +857 -0
  34. package/src/components/story/detail/story-detail-toolbar/categories.tsx +23 -18
  35. package/src/components/story/detail/story-detail-toolbar/children.tsx +9 -4
  36. package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +95 -27
  37. package/src/components/story/detail/story-detail-toolbar.tsx +159 -8
  38. package/src/components/story/detail/story-properties.tsx +21 -4
  39. package/src/components/story/display/__tests__/group-fields.test.ts +107 -0
  40. package/src/components/story/display/group-resolver.tsx +2 -2
  41. package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +155 -0
  42. package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +155 -0
  43. package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +173 -0
  44. package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +174 -0
  45. package/src/components/story/inline-editors/dependency-type-select.tsx +180 -0
  46. package/src/components/story/inline-editors/index.ts +2 -1
  47. package/src/components/story/inline-editors/labels-editor.tsx +159 -3
  48. package/src/components/story/inline-editors/story-select-dialog.tsx +41 -63
  49. package/src/components/story/peek-panel.tsx +121 -21
  50. package/src/components/story/relations/__tests__/attachment-manage-dialog.test.tsx +171 -0
  51. package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +174 -0
  52. package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +93 -0
  53. package/src/components/story/relations/attachment-manage-dialog.tsx +490 -0
  54. package/src/components/story/relations/file-preview.tsx +173 -0
  55. package/src/components/story/relations/format.ts +120 -0
  56. package/src/components/story/relations/general-groups.ts +32 -0
  57. package/src/components/story/relations/knowledge-select-dialog.tsx +403 -0
  58. package/src/components/story/relations/link-manage-dialog.tsx +192 -0
  59. package/src/components/story/relations/story-ref-row.tsx +17 -27
  60. package/src/components/story/story-panel-header.tsx +25 -19
  61. package/src/components/story/story-toolbar.tsx +3 -3
  62. package/src/components/story/transfer-story-popover.tsx +2 -2
  63. package/src/components/story/types.ts +14 -0
  64. package/src/components/story/views/create-view-dialog.tsx +3 -3
  65. package/src/components/story/views/story-list/__tests__/group-header.test.tsx +219 -0
  66. package/src/components/story/views/story-list/group.tsx +1 -1
  67. package/src/components/story/views/story-list/inline-story-creator.tsx +2 -2
  68. package/src/components/story/views/story-list/row.tsx +1 -1
  69. package/src/components/workspace/create-workspace-dialog.tsx +41 -49
  70. package/src/lib/__tests__/project-display-id.test.ts +8 -5
  71. package/src/lib/changelog/sdk-versions.ts +20 -20
  72. package/src/lib/iteration/__tests__/status.test.ts +41 -0
  73. package/src/lib/iteration/status.ts +28 -0
  74. package/src/lib/project-display-id.ts +14 -5
  75. package/src/lib/project-module-meta.ts +77 -0
  76. package/src/lib/story/__tests__/video-embed.test.ts +77 -0
  77. package/src/lib/story/video-embed.ts +59 -0
  78. package/src/lib/utils.d.ts +1 -1
  79. package/src/plugins/.gen-manifest.json +13 -0
  80. package/src/plugins/modules.gen.ts +20 -0
  81. package/src/plugins/plugins.gen.ts +20 -0
  82. package/src/plugins/ui.gen.ts +8 -0
  83. package/src/providers/index.tsx +6 -0
  84. package/src/routeTree.gen.ts +96 -0
  85. package/src/routes/__root.tsx +0 -8
  86. package/src/routes/_nav/inspiration/route.tsx +8 -0
  87. package/src/routes/_nav/knowledge/index.lazy.tsx +2 -2
  88. package/src/routes/_nav/prd/$id/route.tsx +9 -0
  89. package/src/routes/_nav/prd/index.tsx +9 -0
  90. package/src/routes/_nav/prd/route.tsx +8 -0
  91. package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +52 -25
  92. package/src/routes/_nav/projects/$projectId/$storyId/route.tsx +6 -3
  93. package/src/routes/_nav/projects/$projectId/index.lazy.tsx +32 -15
  94. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +289 -0
  95. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.tsx +27 -0
  96. package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +111 -0
  97. package/src/routes/_nav/projects/$projectId/iterations/index.tsx +24 -0
  98. package/src/routes/_nav/projects/$projectId/route.tsx +4 -2
  99. package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +78 -7
  100. package/src/routes/_nav/projects/$projectId/settings/route.tsx +6 -2
  101. package/src/routes/_nav/stories/$storyId/route.lazy.tsx +5 -1
  102. package/src/routes/_nav/stories/$storyId/route.tsx +4 -0
  103. package/src/routes/_nav/tags/$id/route.tsx +8 -0
  104. package/src/routes/_nav/tags/index.tsx +8 -0
  105. package/src/routes/_nav/tags/route.tsx +8 -0
  106. package/src/routes/_nav/tags/settings/route.tsx +9 -0
  107. package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +3 -3
  108. package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +4 -4
  109. package/src/routes/_nav/workspaces/index.lazy.tsx +3 -3
  110. package/src/routes/api/attachments/$id/content.ts +60 -0
  111. package/src/routes/api/attachments/upload.ts +148 -0
  112. package/src/routes/share/prd/$prdId/route.tsx +10 -0
  113. package/src/server/serverFns/__tests__/project-kb.test.ts +147 -0
  114. package/src/server/serverFns/iteration/__tests__/auto-schedule-core.test.ts +62 -0
  115. package/src/server/serverFns/iteration/__tests__/burndown-core.test.ts +90 -0
  116. package/src/server/serverFns/iteration/__tests__/iteration-crud.test.ts +211 -0
  117. package/src/server/serverFns/iteration/__tests__/iteration-stories.test.ts +155 -0
  118. package/src/server/serverFns/iteration/__tests__/iteration-transfer.test.ts +136 -0
  119. package/src/server/serverFns/iteration/auto-schedule-core.ts +54 -0
  120. package/src/server/serverFns/iteration/auto-schedule-internal.ts +88 -0
  121. package/src/server/serverFns/iteration/burndown-core.ts +60 -0
  122. package/src/server/serverFns/iteration/index.ts +22 -0
  123. package/src/server/serverFns/iteration/iteration-auto-schedule.ts +66 -0
  124. package/src/server/serverFns/iteration/iteration-burndown.ts +70 -0
  125. package/src/server/serverFns/iteration/iteration-crud.ts +208 -0
  126. package/src/server/serverFns/iteration/iteration-stories.ts +111 -0
  127. package/src/server/serverFns/iteration/iteration-transfer.ts +42 -0
  128. package/src/server/serverFns/iteration/schemas.ts +58 -0
  129. package/src/server/serverFns/iteration/transfer-internal.ts +62 -0
  130. package/src/server/serverFns/knowledge.ts +50 -4
  131. package/src/server/serverFns/project/module-overview.ts +109 -0
  132. package/src/server/serverFns/project.ts +45 -2
  133. package/src/server/serverFns/story/__tests__/kb-scope.test.ts +56 -0
  134. package/src/server/serverFns/story/__tests__/label-suggest-fn.test.ts +100 -0
  135. package/src/server/serverFns/story/__tests__/labels.test.ts +67 -0
  136. package/src/server/serverFns/story/__tests__/story-assoc.test.ts +222 -0
  137. package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +132 -2
  138. package/src/server/serverFns/story/index.ts +9 -4
  139. package/src/server/serverFns/story/kb-general.ts +39 -0
  140. package/src/server/serverFns/story/kb-scope.ts +52 -0
  141. package/src/server/serverFns/story/link-preview.ts +115 -0
  142. package/src/server/serverFns/story/story-assoc.ts +372 -51
  143. package/src/server/serverFns/story/story-attachments.ts +32 -45
  144. package/src/{components/project/project-icon.tsx → server/serverFns/story/story-crud/label-palette.ts} +16 -19
  145. package/src/server/serverFns/story/story-crud/label-suggest-core.ts +88 -0
  146. package/src/server/serverFns/story/story-crud/label-suggest.ts +38 -0
  147. package/src/{components/knowledge/knowledge-icon.tsx → server/serverFns/story/story-crud/label-upsert.ts} +13 -19
  148. package/src/server/serverFns/story/story-crud/labels.ts +3 -5
  149. package/src/server/serverFns/story/story-crud.ts +53 -6
  150. package/src/server/serverFns/story/story-dependencies.ts +158 -5
  151. package/src/server/serverFns/story/story-links.ts +43 -7
  152. package/src/server/serverFns/story/story-transfer.ts +5 -4
  153. package/src/server/serverFns/story/story-tree.ts +28 -1
  154. package/src/server/serverFns/story/types.ts +38 -0
  155. package/src/styles/globals.css +25 -0
  156. package/src/types/project.ts +5 -5
  157. package/vite.shared.ts +2 -0
  158. package/src/components/project/project-animated-icon.tsx +0 -73
  159. package/src/components/shared/icon-packs/index.ts +0 -1
  160. package/src/components/shared/icon-packs/knowledge.ts +0 -1
  161. package/src/components/shared/icon-packs/prd.ts +0 -1
  162. package/src/components/shared/icon-packs/project.ts +0 -1
  163. package/src/components/shared/icon-picker.tsx +0 -1
  164. package/src/components/story/detail/story-detail-toolbar/attachments.tsx +0 -73
  165. package/src/components/story/detail/story-detail-toolbar/knowledge.tsx +0 -73
  166. package/src/components/story/detail/story-detail-toolbar/links.tsx +0 -73
  167. package/src/components/story/relations/attachments-panel.tsx +0 -179
  168. package/src/components/story/relations/knowledge-panel.tsx +0 -284
  169. package/src/components/story/relations/links-panel.tsx +0 -240
  170. package/src/lib/project-mock.ts +0 -156
@@ -15,16 +15,25 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
+ import { pinyin } from "pinyin-pro";
18
19
  import { BUILTIN_INDEPENDENT_DISPLAY_ID } from "./builtin-project";
19
20
 
20
21
  /**
21
- * 从项目名提取 displayId:提取字母数字,转大写,取前10位。
22
- * 中文/符号被忽略;纯中文项目名返回空字符串(需用户手动填)。
22
+ * 从项目名提取 displayId:字母数字原样保留,汉字转拼音首字母,
23
+ * 转大写,取前10位。示例:"产品需求PRD" → "CPXQPRD"。
23
24
  */
24
25
  export function extractDisplayId(name: string): string {
25
- const matches = name.match(/[A-Za-z0-9]/g)
26
- if (!matches || matches.length === 0) return ''
27
- return matches.join('').toUpperCase().slice(0, 10)
26
+ const chars: string[] = [];
27
+ for (const ch of name) {
28
+ if (/[A-Za-z0-9]/.test(ch)) {
29
+ chars.push(ch);
30
+ } else if (/[\u4e00-\u9fff]/.test(ch)) {
31
+ const initial = pinyin(ch, { pattern: "first", toneType: "none" });
32
+ if (initial && /^[a-z]$/i.test(initial)) chars.push(initial);
33
+ }
34
+ }
35
+ if (chars.length === 0) return "";
36
+ return chars.join("").toUpperCase().slice(0, 10);
28
37
  }
29
38
 
30
39
  /**
@@ -0,0 +1,77 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ // AllBlue - 理想之海
3
+ // Copyright (C) 2026 AllBlue Contributors
4
+ //
5
+ // This program is free software: you can redistribute it and/or modify
6
+ // it under the terms of the GNU Affero General Public License as published by
7
+ // the Free Software Foundation, either version 3 of the License, or
8
+ // (at your option) any later version.
9
+ //
10
+ // This program is distributed in the hope that it will be useful,
11
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ // GNU Affero General Public License for more details.
14
+ //
15
+ // You should have received a copy of the GNU Affero General Public License
16
+ // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+
18
+ import {
19
+ ClipboardList,
20
+ Package2,
21
+ Palette,
22
+ FlaskConical,
23
+ Bug,
24
+ CircleCheckBig,
25
+ } from "lucide-react";
26
+ import type {
27
+ ProjectModuleKey,
28
+ ProjectModuleOverview,
29
+ } from "@/types/project";
30
+
31
+ // 6 个板块元数据(key 与路由 $module 对应)
32
+ export const PROJECT_MODULE_META: Record<
33
+ ProjectModuleKey,
34
+ Omit<ProjectModuleOverview, "count" | "lastUpdatedAt" | "link">
35
+ > = {
36
+ requirement: {
37
+ key: "requirement",
38
+ title: "需求",
39
+ description: "收集与跟踪产品需求池",
40
+ icon: ClipboardList,
41
+ },
42
+ prd: {
43
+ key: "prd",
44
+ title: "PRD",
45
+ description: "产品需求文档与原型画板",
46
+ icon: Package2,
47
+ },
48
+ design: {
49
+ key: "design",
50
+ title: "设计",
51
+ description: "UI 设计稿与画板资源",
52
+ icon: Palette,
53
+ },
54
+ testcase: {
55
+ key: "testcase",
56
+ title: "测例",
57
+ description: "测试用例与执行计划",
58
+ icon: FlaskConical,
59
+ },
60
+ bug: {
61
+ key: "bug",
62
+ title: "BUG",
63
+ description: "缺陷跟踪与修复进度",
64
+ icon: Bug,
65
+ },
66
+ acceptance: {
67
+ key: "acceptance",
68
+ title: "验收",
69
+ description: "交付验收与上线检查",
70
+ icon: CircleCheckBig,
71
+ },
72
+ };
73
+
74
+ export const PROJECT_MODULE_KEYS = Object.keys(
75
+ PROJECT_MODULE_META,
76
+ ) as ProjectModuleKey[];
77
+
@@ -0,0 +1,77 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { resolveVideoEmbed } from "../video-embed";
3
+
4
+ describe("resolveVideoEmbed", () => {
5
+ it("非视频链接返回 null", () => {
6
+ expect(resolveVideoEmbed("https://example.com/page")).toBeNull();
7
+ expect(resolveVideoEmbed("https://lucide.dev/icons/layout-list")).toBeNull();
8
+ });
9
+
10
+ it("直链视频文件走 file 分支(忽略 query/hash)", () => {
11
+ expect(resolveVideoEmbed("https://cdn.example.com/a.mp4")).toEqual({
12
+ kind: "file",
13
+ src: "https://cdn.example.com/a.mp4",
14
+ });
15
+ expect(
16
+ resolveVideoEmbed("https://cdn.example.com/a.webm?token=x#t=1"),
17
+ ).toEqual({ kind: "file", src: "https://cdn.example.com/a.webm?token=x#t=1" });
18
+ expect(resolveVideoEmbed("https://cdn.example.com/a.MOV")).toEqual({
19
+ kind: "file",
20
+ src: "https://cdn.example.com/a.MOV",
21
+ });
22
+ // 扩展名仅匹配路径末段,不匹配 query 里的伪扩展名
23
+ expect(resolveVideoEmbed("https://example.com/watch?file=a.mp4")).toBeNull();
24
+ });
25
+
26
+ it("YouTube watch 页转换为 embed 播放器", () => {
27
+ expect(resolveVideoEmbed("https://www.youtube.com/watch?v=dQw4w9WgXcQ")).toEqual({
28
+ kind: "iframe",
29
+ src: "https://www.youtube.com/embed/dQw4w9WgXcQ",
30
+ });
31
+ expect(
32
+ resolveVideoEmbed("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=30s"),
33
+ ).toEqual({ kind: "iframe", src: "https://www.youtube.com/embed/dQw4w9WgXcQ" });
34
+ });
35
+
36
+ it("YouTube youtu.be 短链与 shorts 转换", () => {
37
+ expect(resolveVideoEmbed("https://youtu.be/dQw4w9WgXcQ")).toEqual({
38
+ kind: "iframe",
39
+ src: "https://www.youtube.com/embed/dQw4w9WgXcQ",
40
+ });
41
+ expect(resolveVideoEmbed("https://www.youtube.com/shorts/abc123")).toEqual({
42
+ kind: "iframe",
43
+ src: "https://www.youtube.com/embed/abc123",
44
+ });
45
+ // 已是 embed 链接原样返回
46
+ expect(resolveVideoEmbed("https://www.youtube.com/embed/dQw4w9WgXcQ")).toEqual({
47
+ kind: "iframe",
48
+ src: "https://www.youtube.com/embed/dQw4w9WgXcQ",
49
+ });
50
+ });
51
+
52
+ it("Bilibili 视频页转换为官方播放器(BV 号 + 分 P)", () => {
53
+ expect(
54
+ resolveVideoEmbed("https://www.bilibili.com/video/BV1GJ411x7h7/"),
55
+ ).toEqual({
56
+ kind: "iframe",
57
+ src: "https://player.bilibili.com/player.html?bvid=BV1GJ411x7h7&autoplay=0",
58
+ });
59
+ expect(
60
+ resolveVideoEmbed("https://www.bilibili.com/video/BV1GJ411x7h7?p=3"),
61
+ ).toEqual({
62
+ kind: "iframe",
63
+ src: "https://player.bilibili.com/player.html?bvid=BV1GJ411x7h7&autoplay=0&p=3",
64
+ });
65
+ });
66
+
67
+ it("Vimeo 转换为播放器", () => {
68
+ expect(resolveVideoEmbed("https://vimeo.com/76979871")).toEqual({
69
+ kind: "iframe",
70
+ src: "https://player.vimeo.com/video/76979871",
71
+ });
72
+ });
73
+
74
+ it("b23.tv 短链无法本地解析,返回 null 交给原有探测逻辑", () => {
75
+ expect(resolveVideoEmbed("https://b23.tv/BV1GJ411x7h7")).toBeNull();
76
+ });
77
+ });
@@ -0,0 +1,59 @@
1
+ // 视频链接识别与官方 embed 转换:供关联面板链接预览使用
2
+ // 返回 null 表示非视频链接(交由原有的可嵌入探测逻辑处理)
3
+
4
+ export type VideoEmbed =
5
+ | { kind: "file"; src: string }
6
+ | { kind: "iframe"; src: string };
7
+
8
+ const VIDEO_FILE_RE = /\.(mp4|webm|ogg|ogv|mov|m4v)$/i;
9
+
10
+ const YOUTUBE_ID_RE =
11
+ /^(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:watch\?(?:.*&)?v=|shorts\/|embed\/)|youtu\.be\/)([A-Za-z0-9_-]{6,})/i;
12
+
13
+ const BILIBILI_BV_RE =
14
+ /^(?:https?:\/\/)?(?:www\.)?bilibili\.com\/video\/(BV[0-9A-Za-z]+)\/?(?:\?.*)?$/i;
15
+
16
+ const VIMEO_ID_RE = /^(?:https?:\/\/)?(?:www\.)?vimeo\.com\/(\d+)(?:\?.*)?$/i;
17
+
18
+ /** 解析 B 站分 P 参数(仅接受纯数字,防止参数注入) */
19
+ function getBilibiliPart(rawUrl: string): string | null {
20
+ try {
21
+ const p = new URL(rawUrl).searchParams.get("p");
22
+ return p && /^\d+$/.test(p) ? p : null;
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+
28
+ export function resolveVideoEmbed(rawUrl: string): VideoEmbed | null {
29
+ if (!rawUrl) return null;
30
+
31
+ // 直链视频文件:扩展名只看 URL 路径末段,避免 query 中的伪扩展名误判
32
+ try {
33
+ const parsed = new URL(rawUrl);
34
+ if (VIDEO_FILE_RE.test(parsed.pathname)) {
35
+ return { kind: "file", src: rawUrl };
36
+ }
37
+ } catch {
38
+ return null;
39
+ }
40
+
41
+ const youtube = rawUrl.match(YOUTUBE_ID_RE);
42
+ if (youtube) {
43
+ return { kind: "iframe", src: `https://www.youtube.com/embed/${youtube[1]}` };
44
+ }
45
+
46
+ const bilibili = rawUrl.match(BILIBILI_BV_RE);
47
+ if (bilibili) {
48
+ const part = getBilibiliPart(rawUrl);
49
+ const src = `https://player.bilibili.com/player.html?bvid=${bilibili[1]}&autoplay=0${part ? `&p=${part}` : ""}`;
50
+ return { kind: "iframe", src };
51
+ }
52
+
53
+ const vimeo = rawUrl.match(VIMEO_ID_RE);
54
+ if (vimeo) {
55
+ return { kind: "iframe", src: `https://player.vimeo.com/video/${vimeo[1]}` };
56
+ }
57
+
58
+ return null;
59
+ }
@@ -1 +1 @@
1
- export { cn } from '@allbluecn/ui/utils';
1
+ export { cn } from '@/components/ui-shared/utils';
@@ -0,0 +1,13 @@
1
+ {
2
+ "routeFiles": [
3
+ "src/routes/_nav/tags/route.tsx",
4
+ "src/routes/_nav/tags/index.tsx",
5
+ "src/routes/_nav/tags/$id/route.tsx",
6
+ "src/routes/_nav/tags/settings/route.tsx",
7
+ "src/routes/_nav/inspiration/route.tsx",
8
+ "src/routes/_nav/prd/route.tsx",
9
+ "src/routes/_nav/prd/index.tsx",
10
+ "src/routes/_nav/prd/$id/route.tsx",
11
+ "src/routes/share/prd/$prdId/route.tsx"
12
+ ]
13
+ }
@@ -0,0 +1,20 @@
1
+ // AUTO-GENERATED by @allbluecn/kernel — DO NOT EDIT
2
+ import type { ProFeature } from '@allbluecn/kernel'
3
+
4
+ export const activePluginIds = ['@allbluecn/tags', '@allbluecn/inspiration', '@allbluecn/prd'] as const
5
+ export type ActivePluginId = (typeof activePluginIds)[number]
6
+
7
+ export const implementedModules: Record<ProFeature, boolean> = {
8
+ billing: false,
9
+ hostedAi: false,
10
+ sso: false,
11
+ audit: false,
12
+ permissions: false,
13
+ license: false,
14
+ versionHistory: false,
15
+ automation: false,
16
+ templates: false,
17
+ analytics: false,
18
+ globalSearch: false,
19
+ compliance: false,
20
+ }
@@ -0,0 +1,20 @@
1
+ // AUTO-GENERATED by @allbluecn/kernel — DO NOT EDIT
2
+ // profile: oss (validated: 3 plugins)
3
+ // 拓扑序:@allbluecn/tags -> @allbluecn/inspiration -> @allbluecn/prd
4
+ import tags from '@allbluecn/plugins-core/tags'
5
+ import inspiration from '@allbluecn/plugins-core/inspiration'
6
+ import prd from '@allbluecn/plugins-core/prd'
7
+ import { defineProfile, type ProfileDefinition } from '@allbluecn/kernel'
8
+
9
+ export const profile: ProfileDefinition = defineProfile({
10
+ id: 'oss',
11
+ plugins: [tags, inspiration, prd],
12
+ })
13
+
14
+ export const pluginIds: string[] = ['@allbluecn/tags', '@allbluecn/inspiration', '@allbluecn/prd']
15
+
16
+ export const pluginMiddleware: unknown[] = [
17
+ ...tags.contributes.serverMiddleware ?? [],
18
+ ...inspiration.contributes.serverMiddleware ?? [],
19
+ ...prd.contributes.serverMiddleware ?? [],
20
+ ]
@@ -0,0 +1,8 @@
1
+ // AUTO-GENERATED by @allbluecn/kernel — DO NOT EDIT
2
+ import { NavTag } from '@allbluecn/plugins-core/tags/ui'
3
+ import { type ComponentType } from 'react'
4
+ import type { SettingsTabContribution } from '@allbluecn/kernel'
5
+
6
+ export const navItems: ComponentType[] = [NavTag]
7
+ export const settingsTabs: SettingsTabContribution[] = []
8
+ export const dashboardWidgets: ComponentType[] = []
@@ -28,6 +28,12 @@ import type { Session } from "@/lib/auth/auth-client";
28
28
  import { exchangeRemoteTokenFn } from "@/server/serverFns/auth/session";
29
29
  import { toast } from "sonner";
30
30
  import { createServerI18n } from "@/lib/i18n/server";
31
+ import { registerIconPicker } from "@allbluecn/plugins-core/prd/icon-picker-bridge";
32
+ import { LucideIconPicker } from "@/components/shared/lucide-icon-picker";
33
+
34
+ // 宿主注入图标选择器实现,供 plugins-core 的 PRD 弹窗等使用(模块级单例)
35
+ registerIconPicker(LucideIconPicker);
36
+
31
37
 
32
38
  function DesktopDeepLinkListener() {
33
39
  useEffect(() => {
@@ -82,6 +82,7 @@ import { Route as NavTagsIdRouteRouteImport } from './routes/_nav/tags/$id/route
82
82
  import { Route as NavTagsSettingsRouteRouteImport } from './routes/_nav/tags/settings/route'
83
83
  import { Route as NavWorkspacesIndexRouteImport } from './routes/_nav/workspaces/index'
84
84
  import { Route as NavWorkspacesWorkspaceIdRouteRouteImport } from './routes/_nav/workspaces/$workspaceId/route'
85
+ import { Route as ApiAttachmentsUploadRouteImport } from './routes/api/attachments/upload'
85
86
  import { Route as ApiAuthSplatRouteImport } from './routes/api.auth.$'
86
87
  import { Route as ApiAuthDesktopCallbackRouteImport } from './routes/api/auth/desktop-callback'
87
88
  import { Route as ApiDesignUploadRouteImport } from './routes/api/design/upload'
@@ -100,8 +101,11 @@ import { Route as NavProjectsProjectIdStoryIdRouteRouteImport } from './routes/_
100
101
  import { Route as NavProjectsProjectIdSettingsRouteRouteImport } from './routes/_nav/projects/$projectId/settings/route'
101
102
  import { Route as NavSettingsAiProviderIdRouteRouteImport } from './routes/_nav/settings/ai/$providerId/route'
102
103
  import { Route as NavWorkspacesWorkspaceIdSettingsRouteRouteImport } from './routes/_nav/workspaces/$workspaceId/settings/route'
104
+ import { Route as ApiAttachmentsIdContentRouteImport } from './routes/api/attachments/$id/content'
103
105
  import { Route as DesignFilesProjectIdArtboardIdFilenameRouteImport } from './routes/design-files/$projectId/$artboardId/$filename'
104
106
  import { Route as NavKnowledgeKbIdDocDocIdRouteRouteImport } from './routes/_nav/knowledge/$kbId/doc/$docId/route'
107
+ import { Route as NavProjectsProjectIdIterationsIndexRouteImport } from './routes/_nav/projects/$projectId/iterations/index'
108
+ import { Route as NavProjectsProjectIdIterationsIterationIdRouteRouteImport } from './routes/_nav/projects/$projectId/iterations/$iterationId/route'
105
109
  import { Route as ApiSharePrdPrdIdEventsRouteImport } from './routes/api/share/prd/$prdId/events'
106
110
 
107
111
  const NavKnowledgeBookmarksIndexLazyRouteImport = createFileRoute(
@@ -575,6 +579,11 @@ const NavWorkspacesWorkspaceIdRouteRoute =
575
579
  (d) => d.Route,
576
580
  ),
577
581
  )
582
+ const ApiAttachmentsUploadRoute = ApiAttachmentsUploadRouteImport.update({
583
+ id: '/api/attachments/upload',
584
+ path: '/api/attachments/upload',
585
+ getParentRoute: () => rootRouteImport,
586
+ } as any)
578
587
  const ApiAuthSplatRoute = ApiAuthSplatRouteImport.update({
579
588
  id: '/api/auth/$',
580
589
  path: '/api/auth/$',
@@ -790,6 +799,11 @@ const NavWorkspacesWorkspaceIdSettingsRouteRoute =
790
799
  (d) => d.Route,
791
800
  ),
792
801
  )
802
+ const ApiAttachmentsIdContentRoute = ApiAttachmentsIdContentRouteImport.update({
803
+ id: '/api/attachments/$id/content',
804
+ path: '/api/attachments/$id/content',
805
+ getParentRoute: () => rootRouteImport,
806
+ } as any)
793
807
  const DesignFilesProjectIdArtboardIdFilenameRoute =
794
808
  DesignFilesProjectIdArtboardIdFilenameRouteImport.update({
795
809
  id: '/design-files/$projectId/$artboardId/$filename',
@@ -824,6 +838,26 @@ const NavKnowledgeLawsEditIdLazyRoute =
824
838
  } as any).lazy(() =>
825
839
  import('./routes/_nav/knowledge/laws/edit/$id.lazy').then((d) => d.Route),
826
840
  )
841
+ const NavProjectsProjectIdIterationsIndexRoute =
842
+ NavProjectsProjectIdIterationsIndexRouteImport.update({
843
+ id: '/iterations/',
844
+ path: '/iterations/',
845
+ getParentRoute: () => NavProjectsProjectIdRouteRoute,
846
+ } as any).lazy(() =>
847
+ import('./routes/_nav/projects/$projectId/iterations/index.lazy').then(
848
+ (d) => d.Route,
849
+ ),
850
+ )
851
+ const NavProjectsProjectIdIterationsIterationIdRouteRoute =
852
+ NavProjectsProjectIdIterationsIterationIdRouteRouteImport.update({
853
+ id: '/iterations/$iterationId',
854
+ path: '/iterations/$iterationId',
855
+ getParentRoute: () => NavProjectsProjectIdRouteRoute,
856
+ } as any).lazy(() =>
857
+ import('./routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy').then(
858
+ (d) => d.Route,
859
+ ),
860
+ )
827
861
  const ApiSharePrdPrdIdEventsRoute = ApiSharePrdPrdIdEventsRouteImport.update({
828
862
  id: '/api/share/prd/$prdId/events',
829
863
  path: '/api/share/prd/$prdId/events',
@@ -898,6 +932,7 @@ export interface FileRoutesByFullPath {
898
932
  '/share/law/$id': typeof ShareLawIdRouteRoute
899
933
  '/share/prd/$prdId': typeof SharePrdPrdIdRouteRoute
900
934
  '/chat/$threadId': typeof NavChatThreadIdRoute
935
+ '/api/attachments/upload': typeof ApiAttachmentsUploadRoute
901
936
  '/api/auth/$': typeof ApiAuthSplatRoute
902
937
  '/api/auth/desktop-callback': typeof ApiAuthDesktopCallbackRoute
903
938
  '/api/design/upload': typeof ApiDesignUploadRoute
@@ -916,6 +951,7 @@ export interface FileRoutesByFullPath {
916
951
  '/projects/$projectId/settings': typeof NavProjectsProjectIdSettingsRouteRoute
917
952
  '/settings/ai/$providerId': typeof NavSettingsAiProviderIdRouteRoute
918
953
  '/workspaces/$workspaceId/settings': typeof NavWorkspacesWorkspaceIdSettingsRouteRoute
954
+ '/api/attachments/$id/content': typeof ApiAttachmentsIdContentRoute
919
955
  '/design-files/$projectId/$artboardId/$filename': typeof DesignFilesProjectIdArtboardIdFilenameRoute
920
956
  '/settings/ai/': typeof NavSettingsAiIndexRouteLazyRoute
921
957
  '/knowledge/bookmarks/$id': typeof NavKnowledgeBookmarksIdLazyRoute
@@ -930,9 +966,11 @@ export interface FileRoutesByFullPath {
930
966
  '/knowledge/summary/': typeof NavKnowledgeSummaryIndexLazyRoute
931
967
  '/projects/$projectId/': typeof NavProjectsProjectIdIndexLazyRoute
932
968
  '/knowledge/$kbId/doc/$docId': typeof NavKnowledgeKbIdDocDocIdRouteRoute
969
+ '/projects/$projectId/iterations/$iterationId': typeof NavProjectsProjectIdIterationsIterationIdRouteRoute
933
970
  '/api/share/prd/$prdId/events': typeof ApiSharePrdPrdIdEventsRoute
934
971
  '/knowledge/compliance/edit/$id': typeof NavKnowledgeComplianceEditIdLazyRoute
935
972
  '/knowledge/laws/edit/$id': typeof NavKnowledgeLawsEditIdLazyRoute
973
+ '/projects/$projectId/iterations/': typeof NavProjectsProjectIdIterationsIndexRoute
936
974
  }
937
975
  export interface FileRoutesByTo {
938
976
  '/': typeof PublicIndexRouteRoute
@@ -988,6 +1026,7 @@ export interface FileRoutesByTo {
988
1026
  '/share/law/$id': typeof ShareLawIdRouteRoute
989
1027
  '/share/prd/$prdId': typeof SharePrdPrdIdRouteRoute
990
1028
  '/chat/$threadId': typeof NavChatThreadIdRoute
1029
+ '/api/attachments/upload': typeof ApiAttachmentsUploadRoute
991
1030
  '/api/auth/$': typeof ApiAuthSplatRoute
992
1031
  '/api/auth/desktop-callback': typeof ApiAuthDesktopCallbackRoute
993
1032
  '/api/design/upload': typeof ApiDesignUploadRoute
@@ -1006,6 +1045,7 @@ export interface FileRoutesByTo {
1006
1045
  '/projects/$projectId/settings': typeof NavProjectsProjectIdSettingsRouteRoute
1007
1046
  '/settings/ai/$providerId': typeof NavSettingsAiProviderIdRouteRoute
1008
1047
  '/workspaces/$workspaceId/settings': typeof NavWorkspacesWorkspaceIdSettingsRouteRoute
1048
+ '/api/attachments/$id/content': typeof ApiAttachmentsIdContentRoute
1009
1049
  '/design-files/$projectId/$artboardId/$filename': typeof DesignFilesProjectIdArtboardIdFilenameRoute
1010
1050
  '/settings/ai': typeof NavSettingsAiIndexRouteLazyRoute
1011
1051
  '/knowledge/bookmarks/$id': typeof NavKnowledgeBookmarksIdLazyRoute
@@ -1020,9 +1060,11 @@ export interface FileRoutesByTo {
1020
1060
  '/knowledge/summary': typeof NavKnowledgeSummaryIndexLazyRoute
1021
1061
  '/projects/$projectId': typeof NavProjectsProjectIdIndexLazyRoute
1022
1062
  '/knowledge/$kbId/doc/$docId': typeof NavKnowledgeKbIdDocDocIdRouteRoute
1063
+ '/projects/$projectId/iterations/$iterationId': typeof NavProjectsProjectIdIterationsIterationIdRouteRoute
1023
1064
  '/api/share/prd/$prdId/events': typeof ApiSharePrdPrdIdEventsRoute
1024
1065
  '/knowledge/compliance/edit/$id': typeof NavKnowledgeComplianceEditIdLazyRoute
1025
1066
  '/knowledge/laws/edit/$id': typeof NavKnowledgeLawsEditIdLazyRoute
1067
+ '/projects/$projectId/iterations': typeof NavProjectsProjectIdIterationsIndexRoute
1026
1068
  }
1027
1069
  export interface FileRoutesById {
1028
1070
  __root__: typeof rootRouteImport
@@ -1096,6 +1138,7 @@ export interface FileRoutesById {
1096
1138
  '/share/law/$id': typeof ShareLawIdRouteRoute
1097
1139
  '/share/prd/$prdId': typeof SharePrdPrdIdRouteRoute
1098
1140
  '/_nav/chat/$threadId': typeof NavChatThreadIdRoute
1141
+ '/api/attachments/upload': typeof ApiAttachmentsUploadRoute
1099
1142
  '/api/auth/$': typeof ApiAuthSplatRoute
1100
1143
  '/api/auth/desktop-callback': typeof ApiAuthDesktopCallbackRoute
1101
1144
  '/api/design/upload': typeof ApiDesignUploadRoute
@@ -1114,6 +1157,7 @@ export interface FileRoutesById {
1114
1157
  '/_nav/projects/$projectId/settings': typeof NavProjectsProjectIdSettingsRouteRoute
1115
1158
  '/_nav/settings/ai/$providerId': typeof NavSettingsAiProviderIdRouteRoute
1116
1159
  '/_nav/workspaces/$workspaceId/settings': typeof NavWorkspacesWorkspaceIdSettingsRouteRoute
1160
+ '/api/attachments/$id/content': typeof ApiAttachmentsIdContentRoute
1117
1161
  '/design-files/$projectId/$artboardId/$filename': typeof DesignFilesProjectIdArtboardIdFilenameRoute
1118
1162
  '/_nav/settings/ai/': typeof NavSettingsAiIndexRouteLazyRoute
1119
1163
  '/_nav/knowledge/bookmarks/$id': typeof NavKnowledgeBookmarksIdLazyRoute
@@ -1128,9 +1172,11 @@ export interface FileRoutesById {
1128
1172
  '/_nav/knowledge/summary/': typeof NavKnowledgeSummaryIndexLazyRoute
1129
1173
  '/_nav/projects/$projectId/': typeof NavProjectsProjectIdIndexLazyRoute
1130
1174
  '/_nav/knowledge/$kbId/doc/$docId': typeof NavKnowledgeKbIdDocDocIdRouteRoute
1175
+ '/_nav/projects/$projectId/iterations/$iterationId': typeof NavProjectsProjectIdIterationsIterationIdRouteRoute
1131
1176
  '/api/share/prd/$prdId/events': typeof ApiSharePrdPrdIdEventsRoute
1132
1177
  '/_nav/knowledge/compliance/edit/$id': typeof NavKnowledgeComplianceEditIdLazyRoute
1133
1178
  '/_nav/knowledge/laws/edit/$id': typeof NavKnowledgeLawsEditIdLazyRoute
1179
+ '/_nav/projects/$projectId/iterations/': typeof NavProjectsProjectIdIterationsIndexRoute
1134
1180
  }
1135
1181
  export interface FileRouteTypes {
1136
1182
  fileRoutesByFullPath: FileRoutesByFullPath
@@ -1202,6 +1248,7 @@ export interface FileRouteTypes {
1202
1248
  | '/share/law/$id'
1203
1249
  | '/share/prd/$prdId'
1204
1250
  | '/chat/$threadId'
1251
+ | '/api/attachments/upload'
1205
1252
  | '/api/auth/$'
1206
1253
  | '/api/auth/desktop-callback'
1207
1254
  | '/api/design/upload'
@@ -1220,6 +1267,7 @@ export interface FileRouteTypes {
1220
1267
  | '/projects/$projectId/settings'
1221
1268
  | '/settings/ai/$providerId'
1222
1269
  | '/workspaces/$workspaceId/settings'
1270
+ | '/api/attachments/$id/content'
1223
1271
  | '/design-files/$projectId/$artboardId/$filename'
1224
1272
  | '/settings/ai/'
1225
1273
  | '/knowledge/bookmarks/$id'
@@ -1234,9 +1282,11 @@ export interface FileRouteTypes {
1234
1282
  | '/knowledge/summary/'
1235
1283
  | '/projects/$projectId/'
1236
1284
  | '/knowledge/$kbId/doc/$docId'
1285
+ | '/projects/$projectId/iterations/$iterationId'
1237
1286
  | '/api/share/prd/$prdId/events'
1238
1287
  | '/knowledge/compliance/edit/$id'
1239
1288
  | '/knowledge/laws/edit/$id'
1289
+ | '/projects/$projectId/iterations/'
1240
1290
  fileRoutesByTo: FileRoutesByTo
1241
1291
  to:
1242
1292
  | '/'
@@ -1292,6 +1342,7 @@ export interface FileRouteTypes {
1292
1342
  | '/share/law/$id'
1293
1343
  | '/share/prd/$prdId'
1294
1344
  | '/chat/$threadId'
1345
+ | '/api/attachments/upload'
1295
1346
  | '/api/auth/$'
1296
1347
  | '/api/auth/desktop-callback'
1297
1348
  | '/api/design/upload'
@@ -1310,6 +1361,7 @@ export interface FileRouteTypes {
1310
1361
  | '/projects/$projectId/settings'
1311
1362
  | '/settings/ai/$providerId'
1312
1363
  | '/workspaces/$workspaceId/settings'
1364
+ | '/api/attachments/$id/content'
1313
1365
  | '/design-files/$projectId/$artboardId/$filename'
1314
1366
  | '/settings/ai'
1315
1367
  | '/knowledge/bookmarks/$id'
@@ -1324,9 +1376,11 @@ export interface FileRouteTypes {
1324
1376
  | '/knowledge/summary'
1325
1377
  | '/projects/$projectId'
1326
1378
  | '/knowledge/$kbId/doc/$docId'
1379
+ | '/projects/$projectId/iterations/$iterationId'
1327
1380
  | '/api/share/prd/$prdId/events'
1328
1381
  | '/knowledge/compliance/edit/$id'
1329
1382
  | '/knowledge/laws/edit/$id'
1383
+ | '/projects/$projectId/iterations'
1330
1384
  id:
1331
1385
  | '__root__'
1332
1386
  | '/_login'
@@ -1399,6 +1453,7 @@ export interface FileRouteTypes {
1399
1453
  | '/share/law/$id'
1400
1454
  | '/share/prd/$prdId'
1401
1455
  | '/_nav/chat/$threadId'
1456
+ | '/api/attachments/upload'
1402
1457
  | '/api/auth/$'
1403
1458
  | '/api/auth/desktop-callback'
1404
1459
  | '/api/design/upload'
@@ -1417,6 +1472,7 @@ export interface FileRouteTypes {
1417
1472
  | '/_nav/projects/$projectId/settings'
1418
1473
  | '/_nav/settings/ai/$providerId'
1419
1474
  | '/_nav/workspaces/$workspaceId/settings'
1475
+ | '/api/attachments/$id/content'
1420
1476
  | '/design-files/$projectId/$artboardId/$filename'
1421
1477
  | '/_nav/settings/ai/'
1422
1478
  | '/_nav/knowledge/bookmarks/$id'
@@ -1431,9 +1487,11 @@ export interface FileRouteTypes {
1431
1487
  | '/_nav/knowledge/summary/'
1432
1488
  | '/_nav/projects/$projectId/'
1433
1489
  | '/_nav/knowledge/$kbId/doc/$docId'
1490
+ | '/_nav/projects/$projectId/iterations/$iterationId'
1434
1491
  | '/api/share/prd/$prdId/events'
1435
1492
  | '/_nav/knowledge/compliance/edit/$id'
1436
1493
  | '/_nav/knowledge/laws/edit/$id'
1494
+ | '/_nav/projects/$projectId/iterations/'
1437
1495
  fileRoutesById: FileRoutesById
1438
1496
  }
1439
1497
  export interface RootRouteChildren {
@@ -1452,12 +1510,14 @@ export interface RootRouteChildren {
1452
1510
  ServerWsRoute: typeof ServerWsRoute
1453
1511
  ApiLicenseActivateRouteRoute: typeof ApiLicenseActivateRouteRoute
1454
1512
  ApiLicenseHeartbeatRouteRoute: typeof ApiLicenseHeartbeatRouteRoute
1513
+ ApiAttachmentsUploadRoute: typeof ApiAttachmentsUploadRoute
1455
1514
  ApiAuthSplatRoute: typeof ApiAuthSplatRoute
1456
1515
  ApiAuthDesktopCallbackRoute: typeof ApiAuthDesktopCallbackRoute
1457
1516
  ApiDesignUploadRoute: typeof ApiDesignUploadRoute
1458
1517
  ApiKnowledgeSyncGithubRoute: typeof ApiKnowledgeSyncGithubRoute
1459
1518
  ApiNotificationsStreamRoute: typeof ApiNotificationsStreamRoute
1460
1519
  ServerAnyhubProxySplatRoute: typeof ServerAnyhubProxySplatRoute
1520
+ ApiAttachmentsIdContentRoute: typeof ApiAttachmentsIdContentRoute
1461
1521
  DesignFilesProjectIdArtboardIdFilenameRoute: typeof DesignFilesProjectIdArtboardIdFilenameRoute
1462
1522
  ApiSharePrdPrdIdEventsRoute: typeof ApiSharePrdPrdIdEventsRoute
1463
1523
  }
@@ -1961,6 +2021,13 @@ declare module '@tanstack/react-router' {
1961
2021
  preLoaderRoute: typeof NavWorkspacesWorkspaceIdRouteRouteImport
1962
2022
  parentRoute: typeof NavWorkspacesRouteRoute
1963
2023
  }
2024
+ '/api/attachments/upload': {
2025
+ id: '/api/attachments/upload'
2026
+ path: '/api/attachments/upload'
2027
+ fullPath: '/api/attachments/upload'
2028
+ preLoaderRoute: typeof ApiAttachmentsUploadRouteImport
2029
+ parentRoute: typeof rootRouteImport
2030
+ }
1964
2031
  '/api/auth/$': {
1965
2032
  id: '/api/auth/$'
1966
2033
  path: '/api/auth/$'
@@ -2164,6 +2231,13 @@ declare module '@tanstack/react-router' {
2164
2231
  preLoaderRoute: typeof NavWorkspacesWorkspaceIdSettingsRouteRouteImport
2165
2232
  parentRoute: typeof NavWorkspacesWorkspaceIdRouteRoute
2166
2233
  }
2234
+ '/api/attachments/$id/content': {
2235
+ id: '/api/attachments/$id/content'
2236
+ path: '/api/attachments/$id/content'
2237
+ fullPath: '/api/attachments/$id/content'
2238
+ preLoaderRoute: typeof ApiAttachmentsIdContentRouteImport
2239
+ parentRoute: typeof rootRouteImport
2240
+ }
2167
2241
  '/design-files/$projectId/$artboardId/$filename': {
2168
2242
  id: '/design-files/$projectId/$artboardId/$filename'
2169
2243
  path: '/design-files/$projectId/$artboardId/$filename'
@@ -2192,6 +2266,20 @@ declare module '@tanstack/react-router' {
2192
2266
  preLoaderRoute: typeof NavKnowledgeLawsEditIdLazyRouteImport
2193
2267
  parentRoute: typeof NavKnowledgeLawsRouteRoute
2194
2268
  }
2269
+ '/_nav/projects/$projectId/iterations/': {
2270
+ id: '/_nav/projects/$projectId/iterations/'
2271
+ path: '/iterations'
2272
+ fullPath: '/projects/$projectId/iterations/'
2273
+ preLoaderRoute: typeof NavProjectsProjectIdIterationsIndexRouteImport
2274
+ parentRoute: typeof NavProjectsProjectIdRouteRoute
2275
+ }
2276
+ '/_nav/projects/$projectId/iterations/$iterationId': {
2277
+ id: '/_nav/projects/$projectId/iterations/$iterationId'
2278
+ path: '/iterations/$iterationId'
2279
+ fullPath: '/projects/$projectId/iterations/$iterationId'
2280
+ preLoaderRoute: typeof NavProjectsProjectIdIterationsIterationIdRouteRouteImport
2281
+ parentRoute: typeof NavProjectsProjectIdRouteRoute
2282
+ }
2195
2283
  '/api/share/prd/$prdId/events': {
2196
2284
  id: '/api/share/prd/$prdId/events'
2197
2285
  path: '/api/share/prd/$prdId/events'
@@ -2425,6 +2513,8 @@ interface NavProjectsProjectIdRouteRouteChildren {
2425
2513
  NavProjectsProjectIdStoryIdRouteRoute: typeof NavProjectsProjectIdStoryIdRouteRoute
2426
2514
  NavProjectsProjectIdSettingsRouteRoute: typeof NavProjectsProjectIdSettingsRouteRoute
2427
2515
  NavProjectsProjectIdIndexLazyRoute: typeof NavProjectsProjectIdIndexLazyRoute
2516
+ NavProjectsProjectIdIterationsIterationIdRouteRoute: typeof NavProjectsProjectIdIterationsIterationIdRouteRoute
2517
+ NavProjectsProjectIdIterationsIndexRoute: typeof NavProjectsProjectIdIterationsIndexRoute
2428
2518
  }
2429
2519
 
2430
2520
  const NavProjectsProjectIdRouteRouteChildren: NavProjectsProjectIdRouteRouteChildren =
@@ -2434,6 +2524,10 @@ const NavProjectsProjectIdRouteRouteChildren: NavProjectsProjectIdRouteRouteChil
2434
2524
  NavProjectsProjectIdSettingsRouteRoute:
2435
2525
  NavProjectsProjectIdSettingsRouteRoute,
2436
2526
  NavProjectsProjectIdIndexLazyRoute: NavProjectsProjectIdIndexLazyRoute,
2527
+ NavProjectsProjectIdIterationsIterationIdRouteRoute:
2528
+ NavProjectsProjectIdIterationsIterationIdRouteRoute,
2529
+ NavProjectsProjectIdIterationsIndexRoute:
2530
+ NavProjectsProjectIdIterationsIndexRoute,
2437
2531
  }
2438
2532
 
2439
2533
  const NavProjectsProjectIdRouteRouteWithChildren =
@@ -2651,12 +2745,14 @@ const rootRouteChildren: RootRouteChildren = {
2651
2745
  ServerWsRoute: ServerWsRoute,
2652
2746
  ApiLicenseActivateRouteRoute: ApiLicenseActivateRouteRoute,
2653
2747
  ApiLicenseHeartbeatRouteRoute: ApiLicenseHeartbeatRouteRoute,
2748
+ ApiAttachmentsUploadRoute: ApiAttachmentsUploadRoute,
2654
2749
  ApiAuthSplatRoute: ApiAuthSplatRoute,
2655
2750
  ApiAuthDesktopCallbackRoute: ApiAuthDesktopCallbackRoute,
2656
2751
  ApiDesignUploadRoute: ApiDesignUploadRoute,
2657
2752
  ApiKnowledgeSyncGithubRoute: ApiKnowledgeSyncGithubRoute,
2658
2753
  ApiNotificationsStreamRoute: ApiNotificationsStreamRoute,
2659
2754
  ServerAnyhubProxySplatRoute: ServerAnyhubProxySplatRoute,
2755
+ ApiAttachmentsIdContentRoute: ApiAttachmentsIdContentRoute,
2660
2756
  DesignFilesProjectIdArtboardIdFilenameRoute:
2661
2757
  DesignFilesProjectIdArtboardIdFilenameRoute,
2662
2758
  ApiSharePrdPrdIdEventsRoute: ApiSharePrdPrdIdEventsRoute,