@imenam/mcp-documentor 1.0.84 → 1.0.86
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 +323 -329
- package/dist/shared/read-only.js +1 -0
- package/dist/src/cli/setup-mcp.js +2 -5
- package/dist/src/core/code-source.d.ts +33 -22
- package/dist/src/core/code-source.js +92 -69
- package/dist/src/core/github-code-api.d.ts +28 -0
- package/dist/src/core/github-code-api.js +92 -31
- package/dist/src/core/local-state.d.ts +49 -0
- package/dist/src/core/local-state.js +78 -0
- package/dist/src/core/migrate-code-sources.d.ts +17 -0
- package/dist/src/core/migrate-code-sources.js +157 -0
- package/dist/src/core/path-resolver.d.ts +29 -9
- package/dist/src/core/path-resolver.js +18 -42
- package/dist/src/core/project-settings.d.ts +21 -0
- package/dist/src/core/project-settings.js +63 -0
- package/dist/src/gui-worker.js +72 -3
- package/dist/src/index.js +160 -7
- package/dist/src/tools/check-freshness.d.ts +2 -1
- package/dist/src/tools/check-freshness.js +1 -2
- package/dist/src/tools/code-sources.d.ts +102 -0
- package/dist/src/tools/code-sources.js +260 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +16 -2
- package/gui/dist/assets/{arc-CdXRzMBT.js → arc-DBgCQU2O.js} +1 -1
- package/gui/dist/assets/{architectureDiagram-3BPJPVTR-CGUnwe_I.js → architectureDiagram-3BPJPVTR-BIPBAzZr.js} +1 -1
- package/gui/dist/assets/{blockDiagram-GPEHLZMM-BCI5_vQE.js → blockDiagram-GPEHLZMM-BE9WwuyF.js} +1 -1
- package/gui/dist/assets/{c4Diagram-AAUBKEIU-Bm9a6HGg.js → c4Diagram-AAUBKEIU-V1_4ktIt.js} +1 -1
- package/gui/dist/assets/channel-B_cci0fU.js +1 -0
- package/gui/dist/assets/{chunk-2J33WTMH-c7xNwExL.js → chunk-2J33WTMH-DskG-Kmf.js} +1 -1
- package/gui/dist/assets/{chunk-4BX2VUAB-CmcU4Q0o.js → chunk-4BX2VUAB-DaPhidEI.js} +1 -1
- package/gui/dist/assets/{chunk-55IACEB6-K8rRjNKN.js → chunk-55IACEB6-C9r6WDFM.js} +1 -1
- package/gui/dist/assets/{chunk-727SXJPM-DMPnL1bv.js → chunk-727SXJPM-BA-aC8US.js} +1 -1
- package/gui/dist/assets/{chunk-AQP2D5EJ-BeRIIft8.js → chunk-AQP2D5EJ-ByBp3whV.js} +1 -1
- package/gui/dist/assets/{chunk-FMBD7UC4-CN4It-fp.js → chunk-FMBD7UC4-CzqUByx7.js} +1 -1
- package/gui/dist/assets/{chunk-ND2GUHAM-Dy-ZqPua.js → chunk-ND2GUHAM-C0_B2ryQ.js} +1 -1
- package/gui/dist/assets/{chunk-QZHKN3VN-CaV4seJw.js → chunk-QZHKN3VN-B3eEwjDh.js} +1 -1
- package/gui/dist/assets/classDiagram-4FO5ZUOK-BqlcJ5BP.js +1 -0
- package/gui/dist/assets/classDiagram-v2-Q7XG4LA2-BqlcJ5BP.js +1 -0
- package/gui/dist/assets/{cose-bilkent-S5V4N54A-B1qt_j1Z.js → cose-bilkent-S5V4N54A-D_i0I2pU.js} +1 -1
- package/gui/dist/assets/{dagre-BM42HDAG-4x5JEBQG.js → dagre-BM42HDAG-DtEVPK_z.js} +1 -1
- package/gui/dist/assets/{diagram-2AECGRRQ-Q7TvjRjv.js → diagram-2AECGRRQ-BftnXa5w.js} +1 -1
- package/gui/dist/assets/{diagram-5GNKFQAL-Dguj26bf.js → diagram-5GNKFQAL-Dh9-kl_u.js} +1 -1
- package/gui/dist/assets/{diagram-KO2AKTUF-DBv6MoZF.js → diagram-KO2AKTUF-CvB0BWCa.js} +1 -1
- package/gui/dist/assets/{diagram-LMA3HP47-mfVXwL5q.js → diagram-LMA3HP47-CDy-J1uy.js} +1 -1
- package/gui/dist/assets/{diagram-OG6HWLK6-Bn3_yQWG.js → diagram-OG6HWLK6-iY9FwkIF.js} +1 -1
- package/gui/dist/assets/{erDiagram-TEJ5UH35-Bp4wnBw7.js → erDiagram-TEJ5UH35-BT2_IX8D.js} +1 -1
- package/gui/dist/assets/{flowDiagram-I6XJVG4X-CGk72E1Q.js → flowDiagram-I6XJVG4X-DaixWyMx.js} +1 -1
- package/gui/dist/assets/{ganttDiagram-6RSMTGT7-C1WQIgpu.js → ganttDiagram-6RSMTGT7-DSo3cQPH.js} +1 -1
- package/gui/dist/assets/{gitGraphDiagram-PVQCEYII-DSIs1ZqI.js → gitGraphDiagram-PVQCEYII-BfFT7Lds.js} +1 -1
- package/gui/dist/assets/index-CxCC1gxu.css +1 -0
- package/gui/dist/assets/{index-T7ZLHNgs.js → index-DPGmAc6z.js} +107 -105
- package/gui/dist/assets/{infoDiagram-5YYISTIA-DzHdfk5Y.js → infoDiagram-5YYISTIA-BxbxNxe2.js} +1 -1
- package/gui/dist/assets/{ishikawaDiagram-YF4QCWOH-DLxqTmDU.js → ishikawaDiagram-YF4QCWOH-DpopzqZr.js} +1 -1
- package/gui/dist/assets/{journeyDiagram-JHISSGLW-DYUPmZnf.js → journeyDiagram-JHISSGLW-DrOlFzIk.js} +1 -1
- package/gui/dist/assets/{kanban-definition-UN3LZRKU-f6km2MDT.js → kanban-definition-UN3LZRKU-vH81lYXy.js} +1 -1
- package/gui/dist/assets/{linear-DHhAaAXH.js → linear-BipFpFah.js} +1 -1
- package/gui/dist/assets/{mindmap-definition-RKZ34NQL-nergVxV3.js → mindmap-definition-RKZ34NQL-DsTxCLgj.js} +1 -1
- package/gui/dist/assets/{pieDiagram-4H26LBE5-D4IJAdGz.js → pieDiagram-4H26LBE5-Bbq2ZWQU.js} +1 -1
- package/gui/dist/assets/{quadrantDiagram-W4KKPZXB-B5yYdOsV.js → quadrantDiagram-W4KKPZXB-BdTSaEo4.js} +1 -1
- package/gui/dist/assets/{requirementDiagram-4Y6WPE33-BrhJp07G.js → requirementDiagram-4Y6WPE33-BndI8YZy.js} +1 -1
- package/gui/dist/assets/{sankeyDiagram-5OEKKPKP-CUBA4e7F.js → sankeyDiagram-5OEKKPKP-ofBkVITf.js} +1 -1
- package/gui/dist/assets/{sequenceDiagram-3UESZ5HK-DP0-rUie.js → sequenceDiagram-3UESZ5HK-Cjj2UrN9.js} +1 -1
- package/gui/dist/assets/{stateDiagram-AJRCARHV-_BnVcpam.js → stateDiagram-AJRCARHV-CzPrXUuz.js} +1 -1
- package/gui/dist/assets/stateDiagram-v2-BHNVJYJU-DAq4ObN9.js +1 -0
- package/gui/dist/assets/{timeline-definition-PNZ67QCA-crbYjsrq.js → timeline-definition-PNZ67QCA-Cz4X-IOO.js} +1 -1
- package/gui/dist/assets/{vennDiagram-CIIHVFJN-EOqENtE1.js → vennDiagram-CIIHVFJN-BwIgXJcZ.js} +1 -1
- package/gui/dist/assets/{wardley-L42UT6IY-B1FVq-_Y.js → wardley-L42UT6IY-keQS0aNZ.js} +1 -1
- package/gui/dist/assets/{wardleyDiagram-YWT4CUSO-D1DZwIH_.js → wardleyDiagram-YWT4CUSO-DhykSgbD.js} +1 -1
- package/gui/dist/assets/{xychartDiagram-2RQKCTM6-B6Wr8_OJ.js → xychartDiagram-2RQKCTM6-DFTqc4cj.js} +1 -1
- package/gui/dist/index.html +2 -2
- package/package.json +3 -4
- package/scripts/migrate-paths-to-relative.js +196 -192
- package/gui/dist/assets/channel-f0BgDIcS.js +0 -1
- package/gui/dist/assets/classDiagram-4FO5ZUOK-tGvt4n1B.js +0 -1
- package/gui/dist/assets/classDiagram-v2-Q7XG4LA2-tGvt4n1B.js +0 -1
- package/gui/dist/assets/index-QkCDSQ2A.css +0 -1
- package/gui/dist/assets/stateDiagram-v2-BHNVJYJU-B5Vwq56z.js +0 -1
- package/scripts/generate-version.js +0 -20
|
@@ -1,192 +1,196 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* migrate-paths-to-relative.js
|
|
4
|
-
*
|
|
5
|
-
* One-shot migration that rewrites the absolute paths stored in each doc's
|
|
6
|
-
* `tracked_files[].path` into the portable, code-root-relative form introduced
|
|
7
|
-
* alongside GitHub documentation sync. Portable paths let an agent running on a
|
|
8
|
-
* different machine (where the codebase lives at a different absolute location)
|
|
9
|
-
* resolve tracked files correctly.
|
|
10
|
-
*
|
|
11
|
-
* Resolution reuses the compiled path-resolver (dist/) so it behaves exactly
|
|
12
|
-
* like the running server — RUN `npm run build` FIRST.
|
|
13
|
-
*
|
|
14
|
-
* The conversion
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* A tracked file whose absolute path is NOT under the project's code root is
|
|
19
|
-
* left absolute and reported, so nothing is silently broken.
|
|
20
|
-
*
|
|
21
|
-
* The data dir is resolved like the server: --data-dir flag, else MCP_DATA_DIR,
|
|
22
|
-
* else <package>/data. The MCP_DATA_DIR fallback is what makes npx usable.
|
|
23
|
-
*
|
|
24
|
-
* Usage (from a clone):
|
|
25
|
-
* node scripts/migrate-paths-to-relative.js [--dry-run] [--data-dir <dir>]
|
|
26
|
-
*
|
|
27
|
-
* Usage (npx install — no clone):
|
|
28
|
-
*
|
|
29
|
-
* npx -p @imenam/mcp-documentor mcp-documentor-migrate-paths --dry-run
|
|
30
|
-
*
|
|
31
|
-
* This migration is a ONE-TIME operation: run it once on the machine where the
|
|
32
|
-
* stored absolute paths are valid, publish the result (sync_docs / push_docs),
|
|
33
|
-
* and every other machine just pulls and sets its own
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
import fs from "fs";
|
|
37
|
-
import path from "path";
|
|
38
|
-
import { fileURLToPath, pathToFileURL } from "url";
|
|
39
|
-
import matter from "gray-matter";
|
|
40
|
-
|
|
41
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
42
|
-
const rootDir = path.join(__dirname, "..");
|
|
43
|
-
|
|
44
|
-
const args = process.argv.slice(2);
|
|
45
|
-
const dryRun = args.includes("--dry-run");
|
|
46
|
-
|
|
47
|
-
// Data dir resolution mirrors the server (StorageEngine.getDataDir):
|
|
48
|
-
// --data-dir flag > MCP_DATA_DIR env > <package>/data fallback.
|
|
49
|
-
// The env fallback is what makes `npx` work: the data lives in the user's
|
|
50
|
-
// MCP_DATA_DIR, not inside the npx package cache.
|
|
51
|
-
const dataDirArgIdx = args.indexOf("--data-dir");
|
|
52
|
-
const dataDir =
|
|
53
|
-
dataDirArgIdx !== -1 && args[dataDirArgIdx + 1]
|
|
54
|
-
? args[dataDirArgIdx + 1]
|
|
55
|
-
: process.env.MCP_DATA_DIR && process.env.MCP_DATA_DIR.trim() !== ""
|
|
56
|
-
? process.env.MCP_DATA_DIR.trim()
|
|
57
|
-
: path.join(rootDir, "data");
|
|
58
|
-
|
|
59
|
-
// ---------------------------------------------------------------------------
|
|
60
|
-
// Reuse the compiled resolver so migration matches runtime behaviour exactly.
|
|
61
|
-
// ---------------------------------------------------------------------------
|
|
62
|
-
|
|
63
|
-
const resolverPath = path.join(rootDir, "dist", "src", "core", "path-resolver.js");
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
console.error(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (path
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
console.log("");
|
|
191
|
-
|
|
192
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* migrate-paths-to-relative.js
|
|
4
|
+
*
|
|
5
|
+
* One-shot migration that rewrites the absolute paths stored in each doc's
|
|
6
|
+
* `tracked_files[].path` into the portable, code-root-relative form introduced
|
|
7
|
+
* alongside GitHub documentation sync. Portable paths let an agent running on a
|
|
8
|
+
* different machine (where the codebase lives at a different absolute location)
|
|
9
|
+
* resolve tracked files correctly.
|
|
10
|
+
*
|
|
11
|
+
* Resolution reuses the compiled path-resolver (dist/) so it behaves exactly
|
|
12
|
+
* like the running server — RUN `npm run build` FIRST.
|
|
13
|
+
*
|
|
14
|
+
* The conversion uses the code roots of this machine, as the server does: the
|
|
15
|
+
* default root and the per-project roots stored in <data dir>/local-state.json,
|
|
16
|
+
* set from the GUI (project settings) or with the set_code_root tool.
|
|
17
|
+
*
|
|
18
|
+
* A tracked file whose absolute path is NOT under the project's code root is
|
|
19
|
+
* left absolute and reported, so nothing is silently broken.
|
|
20
|
+
*
|
|
21
|
+
* The data dir is resolved like the server: --data-dir flag, else MCP_DATA_DIR,
|
|
22
|
+
* else <package>/data. The MCP_DATA_DIR fallback is what makes npx usable.
|
|
23
|
+
*
|
|
24
|
+
* Usage (from a clone):
|
|
25
|
+
* node scripts/migrate-paths-to-relative.js [--dry-run] [--data-dir <dir>]
|
|
26
|
+
*
|
|
27
|
+
* Usage (npx install — no clone):
|
|
28
|
+
* MCP_DATA_DIR="<your data dir>" \
|
|
29
|
+
* npx -p @imenam/mcp-documentor mcp-documentor-migrate-paths --dry-run
|
|
30
|
+
*
|
|
31
|
+
* This migration is a ONE-TIME operation: run it once on the machine where the
|
|
32
|
+
* stored absolute paths are valid, publish the result (sync_docs / push_docs),
|
|
33
|
+
* and every other machine just pulls and sets its own code roots.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import fs from "fs";
|
|
37
|
+
import path from "path";
|
|
38
|
+
import { fileURLToPath, pathToFileURL } from "url";
|
|
39
|
+
import matter from "gray-matter";
|
|
40
|
+
|
|
41
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
42
|
+
const rootDir = path.join(__dirname, "..");
|
|
43
|
+
|
|
44
|
+
const args = process.argv.slice(2);
|
|
45
|
+
const dryRun = args.includes("--dry-run");
|
|
46
|
+
|
|
47
|
+
// Data dir resolution mirrors the server (StorageEngine.getDataDir):
|
|
48
|
+
// --data-dir flag > MCP_DATA_DIR env > <package>/data fallback.
|
|
49
|
+
// The env fallback is what makes `npx` work: the data lives in the user's
|
|
50
|
+
// MCP_DATA_DIR, not inside the npx package cache.
|
|
51
|
+
const dataDirArgIdx = args.indexOf("--data-dir");
|
|
52
|
+
const dataDir =
|
|
53
|
+
dataDirArgIdx !== -1 && args[dataDirArgIdx + 1]
|
|
54
|
+
? args[dataDirArgIdx + 1]
|
|
55
|
+
: process.env.MCP_DATA_DIR && process.env.MCP_DATA_DIR.trim() !== ""
|
|
56
|
+
? process.env.MCP_DATA_DIR.trim()
|
|
57
|
+
: path.join(rootDir, "data");
|
|
58
|
+
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Reuse the compiled resolver so migration matches runtime behaviour exactly.
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
const resolverPath = path.join(rootDir, "dist", "src", "core", "path-resolver.js");
|
|
64
|
+
const localStatePath = path.join(rootDir, "dist", "src", "core", "local-state.js");
|
|
65
|
+
if (!fs.existsSync(resolverPath) || !fs.existsSync(localStatePath)) {
|
|
66
|
+
console.error(`[ERROR] Compiled resolver not found at: ${resolverPath}`);
|
|
67
|
+
console.error(" Run `npm run build` before this migration.");
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
const { getCodeRoot, toStoredPath, setCodeRootProvider } = await import(pathToFileURL(resolverPath).href);
|
|
71
|
+
const { LocalState } = await import(pathToFileURL(localStatePath).href);
|
|
72
|
+
const localState = new LocalState(dataDir);
|
|
73
|
+
setCodeRootProvider((project) => localState.getCodeRoot(project));
|
|
74
|
+
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Helpers
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
|
|
79
|
+
function walkMdFiles(dir) {
|
|
80
|
+
if (!fs.existsSync(dir)) return [];
|
|
81
|
+
const results = [];
|
|
82
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
83
|
+
const fullPath = path.join(dir, entry.name);
|
|
84
|
+
if (entry.isDirectory()) {
|
|
85
|
+
results.push(...walkMdFiles(fullPath));
|
|
86
|
+
} else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
87
|
+
results.push(fullPath);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return results;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function filePathToDocId(filePath, projectDir) {
|
|
94
|
+
return path.relative(projectDir, filePath).replace(/\.md$/, "").split(path.sep).join("/");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Load config
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
|
|
101
|
+
const configPath = path.join(dataDir, "config.json");
|
|
102
|
+
if (!fs.existsSync(configPath)) {
|
|
103
|
+
console.error(`[ERROR] config.json not found at: ${configPath}`);
|
|
104
|
+
console.error(" Make sure --data-dir points to the right directory.");
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
109
|
+
const projects = config.projects ?? ["default"];
|
|
110
|
+
|
|
111
|
+
console.log(`${dryRun ? "[DRY RUN] " : ""}migrate-paths-to-relative`);
|
|
112
|
+
console.log(`Data dir : ${dataDir}`);
|
|
113
|
+
console.log(`Projects : ${projects.length}`);
|
|
114
|
+
console.log("");
|
|
115
|
+
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Migrate
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
|
|
120
|
+
let totalDocsChanged = 0;
|
|
121
|
+
let totalConverted = 0;
|
|
122
|
+
let totalLeftAbsolute = 0;
|
|
123
|
+
const projectsWithoutRoot = [];
|
|
124
|
+
|
|
125
|
+
for (const project of projects) {
|
|
126
|
+
const root = getCodeRoot(project);
|
|
127
|
+
if (!root) {
|
|
128
|
+
projectsWithoutRoot.push(project);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const projectDir = path.join(dataDir, "projects", project);
|
|
133
|
+
const files = walkMdFiles(projectDir);
|
|
134
|
+
if (files.length === 0) continue;
|
|
135
|
+
|
|
136
|
+
const docChanges = [];
|
|
137
|
+
|
|
138
|
+
for (const filePath of files) {
|
|
139
|
+
const fullId = filePathToDocId(filePath, projectDir);
|
|
140
|
+
const parsed = matter(fs.readFileSync(filePath, "utf-8"));
|
|
141
|
+
const tracked = parsed.data.tracked_files;
|
|
142
|
+
if (!Array.isArray(tracked) || tracked.length === 0) continue;
|
|
143
|
+
|
|
144
|
+
let docChanged = false;
|
|
145
|
+
for (const tf of tracked) {
|
|
146
|
+
if (!tf || typeof tf.path !== "string") continue;
|
|
147
|
+
if (!path.isAbsolute(tf.path)) continue; // already relative
|
|
148
|
+
|
|
149
|
+
const stored = toStoredPath(tf.path, project);
|
|
150
|
+
if (path.isAbsolute(stored)) {
|
|
151
|
+
// Outside the root (or different drive) — resolver kept it absolute.
|
|
152
|
+
totalLeftAbsolute++;
|
|
153
|
+
docChanges.push(` [${fullId}] KEPT ABSOLUTE (outside root): ${tf.path}`);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
docChanges.push(` [${fullId}] "${tf.path}" → "${stored}"`);
|
|
158
|
+
tf.path = stored;
|
|
159
|
+
docChanged = true;
|
|
160
|
+
totalConverted++;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (docChanged) {
|
|
164
|
+
totalDocsChanged++;
|
|
165
|
+
if (!dryRun) {
|
|
166
|
+
fs.writeFileSync(filePath, matter.stringify(parsed.content, parsed.data), "utf-8");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (docChanges.length > 0) {
|
|
172
|
+
console.log(`### Project: ${project} (root: ${root})`);
|
|
173
|
+
docChanges.forEach((c) => console.log(c));
|
|
174
|
+
console.log("");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Summary
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
|
|
182
|
+
console.log("─".repeat(60));
|
|
183
|
+
console.log(`Paths converted to relative : ${totalConverted}`);
|
|
184
|
+
console.log(`Paths kept absolute : ${totalLeftAbsolute} ← outside the code root`);
|
|
185
|
+
console.log(`Docs modified : ${totalDocsChanged}`);
|
|
186
|
+
if (projectsWithoutRoot.length > 0) {
|
|
187
|
+
console.log("");
|
|
188
|
+
console.log(`Projects skipped (no code root configured): ${projectsWithoutRoot.length}`);
|
|
189
|
+
console.log(` ${projectsWithoutRoot.join(", ")}`);
|
|
190
|
+
console.log(" → set their code root (project settings in the GUI, or set_code_root) to migrate them.");
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (dryRun) {
|
|
194
|
+
console.log("");
|
|
195
|
+
console.log("[DRY RUN] No files were modified. Run without --dry-run to apply.");
|
|
196
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ai as o,aj as n}from"./index-T7ZLHNgs.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-727SXJPM-DMPnL1bv.js";import{_ as i}from"./index-T7ZLHNgs.js";import"./chunk-FMBD7UC4-CN4It-fp.js";import"./chunk-ND2GUHAM-Dy-ZqPua.js";import"./chunk-55IACEB6-K8rRjNKN.js";import"./chunk-2J33WTMH-c7xNwExL.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-727SXJPM-DMPnL1bv.js";import{_ as i}from"./index-T7ZLHNgs.js";import"./chunk-FMBD7UC4-CN4It-fp.js";import"./chunk-ND2GUHAM-Dy-ZqPua.js";import"./chunk-55IACEB6-K8rRjNKN.js";import"./chunk-2J33WTMH-c7xNwExL.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#0f1117;color:#e1e4e8;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#root{width:100%;height:100vh}.export-bundles{border-top:1px solid #21262d;margin-top:8px}.export-bundles-header{display:flex;align-items:center;gap:6px;padding:10px 16px 8px;cursor:pointer;-webkit-user-select:none;user-select:none;color:#8b949e;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.export-bundles-header:hover{color:#e1e4e8}.export-bundles-title{flex:1}.export-bundles-count{background:#21262d;color:#8b949e;border-radius:10px;padding:0 6px;font-size:11px;font-weight:500}.export-bundles-list{padding:0 0 8px}.export-bundle-item{display:flex;align-items:center;gap:8px;padding:6px 16px;cursor:pointer;transition:background .1s}.export-bundle-item:hover{background:#161b22}.export-bundle-info{display:flex;flex-direction:column;flex:1;min-width:0;gap:2px}.export-bundle-name{font-size:13px;color:#e1e4e8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.export-bundle-desc{font-size:11px;color:#6e7681;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.export-bundle-meta{font-size:11px;color:#6e7681}.export-bundle-btn{flex-shrink:0;background:#21262d;color:#58a6ff;border:1px solid #30363d;border-radius:6px;padding:3px 10px;font-size:12px;font-weight:500;cursor:pointer;transition:background .1s,border-color .1s}.export-bundle-btn:hover{background:#1f3147;border-color:#58a6ff}.export-bundle-modal{width:680px}.export-bundle-modal-desc{color:#8b949e;font-size:13px;line-height:1.6;margin:0 0 16px}.export-bundle-modal-meta{margin-bottom:20px}.export-bundle-modal-filename{font-size:12px;color:#6e7681;background:#161b22;border:1px solid #30363d;border-radius:6px;padding:4px 10px;font-family:SFMono-Regular,Consolas,monospace}.export-bundle-modal-section{margin-bottom:20px}.export-bundle-modal-section-title{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#8b949e;margin-bottom:8px}.export-bundle-modal-docs{list-style:none;margin:0;padding:0;border:1px solid #30363d;border-radius:6px;overflow:hidden;max-height:280px;overflow-y:auto}.export-bundle-modal-doc-item{display:flex;align-items:center;padding:7px 12px;border-bottom:1px solid #21262d;gap:8px}.export-bundle-modal-doc-item:last-child{border-bottom:none}.export-bundle-modal-doc-ref{font-size:12px;font-family:SFMono-Regular,Consolas,monospace;color:#e1e4e8;white-space:nowrap}.export-bundle-modal-toggle-row{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;padding:10px 14px;background:#161b22;border:1px solid #30363d;border-radius:8px}.export-bundle-modal-toggle-label{font-size:13px;color:#e1e4e8}.toggle-switch{position:relative;width:42px;height:24px;border-radius:12px;border:none;padding:0;background:#30363d;cursor:pointer;transition:background .2s;flex-shrink:0;vertical-align:middle}.toggle-switch:after{content:"";position:absolute;top:50%;left:0;transform:translate(-25%,-50%);width:18px;height:18px;border-radius:50%;background:#8b949e;transition:transform .2s,background .2s}.toggle-switch--on{background:#238636}.toggle-switch--on:after{transform:translate(18px,-50%);background:#fff}.dashboard{display:flex;flex-direction:column;height:100vh;background:#0f1117;color:#e1e4e8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.dashboard-header{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;background:#161b22;border-bottom:1px solid #30363d;gap:16px}.header-left{display:flex;align-items:center;gap:12px;flex-shrink:0}.header-title{font-size:18px;font-weight:600;margin:0;color:#f0f6fc}.connection-badge{font-size:11px;padding:2px 8px;border-radius:10px;font-weight:500}.connection-badge.connected{background:#1a3a2a;color:#3fb950}.connection-badge.disconnected{background:#3a1a1a;color:#f85149}.header-center{flex:1;max-width:500px}.header-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.settings-btn{background:none;border:1px solid #30363d;color:#8b949e;font-size:18px;cursor:pointer;padding:4px 8px;border-radius:6px;transition:all .15s}.settings-btn:hover{background:#21262d;color:#f0f6fc}.stale-filter-btn{background:none;border:1px solid #30363d;color:#8b949e;font-size:12px;cursor:pointer;padding:4px 10px;border-radius:6px;transition:all .15s;white-space:nowrap}.stale-filter-btn:hover{background:#3d2a0066;border-color:#d29922;color:#d29922}.stale-filter-btn.active{background:#3d2a00;border-color:#d29922;color:#d29922;font-weight:600}.sync-button-wrapper{position:relative}.sync-btn:hover:not(:disabled){background:#0d2d4a;border-color:#388bfd;color:#58a6ff}.sync-btn:disabled{cursor:default;opacity:.7}.sync-btn.conflict{border-color:#f85149;color:#f85149}.sync-icon{display:inline-block}.sync-icon.spinning{animation:sync-spin .9s linear infinite}@keyframes sync-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sync-result{position:absolute;top:calc(100% + 6px);right:0;z-index:50;min-width:280px;max-width:460px;padding:10px 28px 10px 12px;background:#161b22;border:1px solid #30363d;border-radius:6px;box-shadow:0 8px 24px #00000080;color:#8b949e;font-size:12px;text-align:left}.sync-result.error{border-color:#f85149;color:#ffa198}.sync-result pre{margin:0;white-space:pre-wrap;word-break:break-word;font-family:inherit}.sync-result-close{position:absolute;top:4px;right:6px;background:none;border:none;color:#8b949e;cursor:pointer;font-size:12px;line-height:1;padding:2px}.sync-result-close:hover{color:#f0f6fc}.sidebar-toggle-btn{background:none;border:1px solid #30363d;color:#8b949e;font-size:12px;cursor:pointer;padding:4px 8px;border-radius:6px;transition:all .15s;line-height:1}.sidebar-toggle-btn:hover{background:#21262d;color:#f0f6fc}.dashboard-body{display:flex;flex:1;overflow:hidden;width:100%;max-width:1700px;margin:0 auto}.sidebar-wrapper{width:300px;flex-shrink:0;overflow:hidden;transition:width .25s ease}.sidebar-wrapper.collapsed{width:0}.sidebar{width:300px;height:100%;border-right:1px solid #30363d;background:#161b22;flex-shrink:0;display:flex;flex-direction:column;min-height:0}.sidebar-scroll{flex:1;min-height:0;overflow-y:auto;padding:8px 0}.sidebar-footer{flex-shrink:0;border-top:1px solid #30363d;max-height:40%;overflow-y:auto}.sidebar-chips{display:flex;align-items:center;gap:8px;padding:12px;border-bottom:1px solid #21262d;flex-shrink:0}.sidebar-chip{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 12px;border-radius:12px;border:1px solid #30363d;background:#161b22;color:#8b949e;font-size:11px;cursor:pointer;white-space:nowrap;transition:all .15s}.sidebar-chip:hover{border-color:#8b949e;color:#c9d1d9}.sidebar-chip.active{background:#1f2937;border-color:#58a6ff;color:#58a6ff;font-weight:600}.sidebar-chip-dot{width:6px;height:6px;border-radius:50%;background:#d29922}.sidebar-item{position:relative;display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;cursor:pointer;transition:background .15s}.sidebar-item:hover{background:#1c2129}.sidebar-item.active{background:#1f2937}.sidebar-item.active:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:#58a6ff}.sidebar-item-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.sidebar-item-dot.stale{background:#d29922}.sidebar-item-dot.fresh{background:#3fb950}.sidebar-item-title{font-size:12.5px;color:#c9d1d9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar-item.active .sidebar-item-title{color:#f0f6fc;font-weight:600}.sidebar-item-meta{font-size:10.5px;color:#6e7681;margin-left:auto;white-space:nowrap}.sidebar-item--result{height:auto;display:block;padding:10px 12px;border-bottom:1px solid #21262d}.sidebar-item--result .sidebar-item-title{white-space:normal;margin-bottom:4px}.sidebar-item--result .sidebar-item-meta{display:block;margin-left:0;white-space:normal}.sidebar-section-label{padding:10px 12px 6px;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#6e7681}.sidebar-tags{display:flex;gap:4px;flex-wrap:wrap;margin-top:4px}.tag-badge{font-size:10px;padding:1px 6px;border-radius:8px;background:#21262d;color:#8b949e}.stale-badge{font-size:10px;padding:1px 6px;border-radius:8px;font-weight:600}.stale-badge.stale{background:#3d2a00;color:#d29922}.stale-badge.fresh{background:#1a3a2a;color:#3fb950}.sidebar-empty{padding:24px 16px;text-align:center;color:#8b949e;font-size:13px}.sidebar-filter-header{display:flex;align-items:center;gap:8px;padding:10px 16px;border-bottom:1px solid #3d2a00;background:#1f1600;font-size:12px;font-weight:600;color:#d29922;text-transform:uppercase;letter-spacing:.05em;-webkit-user-select:none;user-select:none}.sidebar-filter-icon{font-size:13px}.sidebar-filter-count{margin-left:auto;background:#3d2a00;color:#d29922;font-size:11px;padding:1px 7px;border-radius:10px;font-weight:700}.sidebar-folder-header{height:34px;padding:0 12px;font-size:12.5px;font-weight:600;color:#e1e4e8;background:transparent;cursor:pointer;display:flex;align-items:center;gap:8px;-webkit-user-select:none;user-select:none}.sidebar-folder-header:hover{background:#1c2129}.sidebar-folder-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar-folder-count{margin-left:auto;font-size:11px;font-weight:400;color:#6e7681}.folder-icon{font-size:9px;transition:transform .15s;display:inline-block}.folder-icon.open{transform:rotate(90deg)}.doc-viewer{flex:1;min-width:0;min-height:0;display:flex;flex-direction:row;overflow:hidden}.doc-main{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow-y:auto;padding:20px 24px 48px}.doc-viewer-empty{display:flex;align-items:center;justify-content:center;height:100%;color:#484f58;font-size:16px}.doc-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;padding-bottom:12px;border-bottom:1px solid #21262d}.doc-header-left{display:flex;align-items:center;gap:12px;min-width:0}.nav-buttons{display:flex;gap:4px;flex-shrink:0}.nav-btn{background:none;border:1px solid #30363d;color:#8b949e;font-size:16px;cursor:pointer;padding:3px 9px;border-radius:6px;transition:all .15s;line-height:1.4}.nav-btn:hover:not(:disabled){background:#21262d;color:#f0f6fc;border-color:#8b949e}.nav-btn:disabled{opacity:.3;cursor:default}.doc-title{font-size:24px;font-weight:600;color:#f0f6fc;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.doc-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.freshness-btn{padding:6px 12px;border:1px solid #30363d;background:#21262d;color:#c9d1d9;border-radius:6px;cursor:pointer;font-size:12px;transition:all .15s}.freshness-btn:hover{background:#30363d;color:#f0f6fc}.download-btn{padding:6px 12px;border:1px solid #30363d;background:#21262d;color:#8b949e;border-radius:6px;cursor:pointer;font-size:12px;font-weight:600;transition:all .15s;white-space:nowrap}.download-btn:hover{background:#1f6feb22;border-color:#1f6feb;color:#58a6ff}.copy-btn{padding:6px 12px;border:1px solid #30363d;background:#21262d;color:#8b949e;border-radius:6px;cursor:pointer;font-size:12px;font-weight:600;transition:all .15s;white-space:nowrap}.copy-btn:hover{background:#1f6feb22;border-color:#1f6feb;color:#58a6ff}.copy-btn--copied,.copy-btn--copied:hover{background:#1a3a1f;border-color:#3fb950;color:#3fb950}.doc-related{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:10px 14px;margin-bottom:20px;background:#161b22;border:1px solid #30363d;border-radius:6px;font-size:12px}.doc-related-label{color:#8b949e;font-weight:500;flex-shrink:0}.doc-related-link{padding:2px 10px;border:1px solid #1f6feb55;background:#1f6feb18;color:#58a6ff;border-radius:12px;cursor:pointer;font-size:12px;transition:all .15s}.doc-related-link:hover{background:#1f6feb33;border-color:#1f6feb}.doc-related-broken{padding:2px 10px;border:1px solid #f8514933;background:#f8514918;color:#f85149;border-radius:12px;font-size:12px;font-style:italic}.doc-related-link--cross-project{border-color:#6e40c955;background:#6e40c918;color:#d2a8ff}.doc-related-link--cross-project:hover{background:#6e40c933;border-color:#6e40c9}.doc-inline-link{display:inline;padding:0;border:none;background:none;color:#58a6ff;cursor:pointer;font-size:inherit;font-family:inherit;text-decoration:underline;text-underline-offset:2px}.doc-inline-link:hover{color:#79c0ff}.doc-inline-link--broken{color:#f85149;cursor:not-allowed;text-decoration:underline wavy}.doc-inline-link--cross-project{color:#d2a8ff}.doc-inline-link--cross-project:hover{color:#e2c0ff}.doc-content h1{font-size:2em;margin:.67em 0;border-bottom:1px solid #21262d;padding-bottom:.3em}.doc-content h2{font-size:1.5em;margin:.83em 0;border-bottom:1px solid #21262d;padding-bottom:.3em}.doc-content h3{font-size:1.25em;margin:1em 0}.doc-content h4{font-size:1em;margin:1.33em 0}.doc-content p{margin:1em 0;line-height:1.6}.doc-content code{background:#161b22;padding:2px 6px;border-radius:4px;font-family:Fira Code,Cascadia Code,monospace;font-size:.9em;font-variant-ligatures:none}.doc-content pre{background:#161b22;padding:16px;border-radius:8px;overflow-x:auto;border:1px solid #30363d}.doc-content pre code{background:none;padding:0}.doc-content ul,.doc-content ol{padding-left:2em;margin:1em 0}.doc-content li{margin:.25em 0;line-height:1.6}.doc-content table{border-collapse:collapse;width:100%;margin:1em 0}.doc-content th,.doc-content td{border:1px solid #30363d;padding:8px 12px;text-align:left}.doc-content th{background:#161b22;font-weight:600}.doc-content a{color:#58a6ff;text-decoration:none}.doc-content a:hover{text-decoration:underline}.doc-content blockquote{border-left:3px solid #30363d;padding-left:16px;margin:1em 0;color:#8b949e}.search-bar{display:flex;align-items:center;gap:8px}.search-scope-toggle{display:flex;align-items:center;gap:6px;cursor:pointer;-webkit-user-select:none;user-select:none}.search-scope-label{font-size:11px;color:#8b949e;white-space:nowrap}.toggle-switch{position:relative;display:inline-block;width:32px;height:18px;flex-shrink:0}.toggle-switch input{opacity:0;width:0;height:0}.toggle-slider{position:absolute;cursor:pointer;inset:0;background:#30363d;border-radius:18px;transition:background .2s}.toggle-slider:before{content:"";position:absolute;width:14px;height:14px;left:2px;bottom:2px;background:#8b949e;border-radius:50%;transition:transform .2s,background .2s}.toggle-switch input:checked+.toggle-slider{background:#1f6feb}.toggle-switch input:checked+.toggle-slider:before{background:#fff;transform:translate(14px)}.search-input{flex:1;padding:6px 12px;border:1px solid #30363d;background:#0d1117;color:#c9d1d9;border-radius:6px;font-size:13px;outline:none;transition:border-color .15s}.search-input:focus{border-color:#1f6feb}.search-input::placeholder{color:#484f58}.search-btn,.clear-btn{padding:6px 12px;border:1px solid #30363d;background:#21262d;color:#c9d1d9;border-radius:6px;cursor:pointer;font-size:12px;white-space:nowrap}.search-btn:hover,.clear-btn:hover{background:#30363d}.search-results{position:absolute;top:100%;left:0;right:0;background:#161b22;border:1px solid #30363d;border-radius:0 0 6px 6px;max-height:300px;overflow-y:auto;z-index:100}.search-result-item{padding:10px 12px;cursor:pointer;border-bottom:1px solid #21262d}.search-result-item:hover{background:#1c2129}.search-result-title{font-size:13px;font-weight:500;color:#f0f6fc}.search-result-score{font-size:11px;color:#3fb950;margin-left:8px}.search-result-excerpt{font-size:11px;color:#8b949e;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-selector{display:flex;align-items:center;gap:4px}.project-select{padding:4px 8px;border:1px solid #30363d;background:#0d1117;color:#c9d1d9;border-radius:6px;font-size:12px;outline:none}.new-project-input{padding:4px 8px;border:1px solid #30363d;background:#0d1117;color:#c9d1d9;border-radius:6px;font-size:12px;width:100px;outline:none}.new-project-btn{padding:4px 8px;border:1px solid #30363d;background:#21262d;color:#c9d1d9;border-radius:6px;cursor:pointer;font-size:12px}.settings-overlay{position:fixed;inset:0;background:#00000080;z-index:200;display:flex;align-items:center;justify-content:center}.settings-popover{background:#161b22;border:1px solid #30363d;border-radius:12px;padding:24px;width:800px;max-width:90%}.settings-title{font-size:16px;font-weight:600;margin:0 0 16px;color:#f0f6fc}.settings-field{margin-bottom:12px}.settings-label{display:block;font-size:12px;color:#8b949e;margin-bottom:4px}.settings-input{width:100%;padding:6px 10px;border:1px solid #30363d;background:#0d1117;color:#c9d1d9;border-radius:6px;font-size:13px;outline:none;box-sizing:border-box}.settings-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}.settings-save-btn{padding:6px 16px;border:none;background:#1f6feb;color:#fff;border-radius:6px;cursor:pointer;font-size:13px}.settings-cancel-btn{padding:6px 16px;border:1px solid #30363d;background:#21262d;color:#c9d1d9;border-radius:6px;cursor:pointer;font-size:13px}.diff-toggle-btn{padding:3px 10px;border:1px solid #d29922;background:#3d2a0033;color:#d29922;border-radius:6px;cursor:pointer;font-size:12px;font-weight:600;transition:all .15s;white-space:nowrap;flex-shrink:0}.diff-toggle-btn:hover:not(:disabled){background:#3d2a0088}.diff-toggle-btn.active{background:#1a3a2a44;border-color:#3fb950;color:#3fb950}.diff-toggle-btn.active:hover{background:#1a3a2a88}.diff-toggle-btn:disabled{opacity:.5;cursor:default}.code-block-wrapper{border:1px solid #30363d;border-radius:6px;margin:12px 0;overflow:hidden}.code-block-header{display:flex;align-items:center;justify-content:space-between;padding:4px 12px;background:#21262d;border-bottom:1px solid #30363d}.code-block-lang-select{background:transparent;border:none;color:#8b949e;font-size:11px;font-family:Fira Code,Cascadia Code,Consolas,monospace;cursor:pointer;outline:none;padding:2px 0}.code-block-lang-select:hover{color:#c9d1d9}.code-block-lang-select option{background:#21262d;color:#c9d1d9}.code-block-copy-btn{background:none;border:1px solid #30363d;color:#8b949e;font-size:11px;cursor:pointer;padding:2px 8px;border-radius:4px;transition:all .15s}.code-block-copy-btn:hover{background:#30363d;color:#c9d1d9}.mermaid-block-wrapper{border:1px solid #30363d;border-radius:6px;margin:12px 0;overflow:hidden;background:#161b22}.mermaid-block-header{display:flex;align-items:center;justify-content:space-between;padding:4px 12px;background:#21262d;border-bottom:1px solid #30363d}.mermaid-block-title{color:#8b949e;font-family:Fira Code,Cascadia Code,Consolas,monospace;font-size:11px}.mermaid-block-actions{display:flex;align-items:center;gap:8px}.mermaid-zoom-controls{display:flex;align-items:center;gap:2px}.mermaid-zoom-btn{background:#30363d;border:1px solid #484f58;color:#c9d1d9;border-radius:4px;width:22px;height:22px;font-size:14px;line-height:1;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;transition:background .15s}.mermaid-zoom-btn:hover:not(:disabled){background:#484f58}.mermaid-zoom-btn:disabled{opacity:.35;cursor:not-allowed}.mermaid-zoom-reset{background:transparent;border:1px solid #484f58;color:#8b949e;border-radius:4px;height:22px;min-width:40px;font-size:11px;font-family:Fira Code,Cascadia Code,Consolas,monospace;cursor:pointer;padding:0 4px;transition:background .15s,color .15s}.mermaid-zoom-reset:hover{background:#30363d;color:#c9d1d9}.mermaid-block-content{padding:16px;overflow:auto}.mermaid-block-zoom-container{display:block;transform-origin:top center;transition:transform .15s ease}.mermaid-block-zoom-container svg{display:block;max-width:100%;height:auto;margin:0 auto}.mermaid-block-error{margin:0;color:#f85149;font-family:Fira Code,Cascadia Code,Consolas,monospace;font-size:13px;line-height:1.5;white-space:pre-wrap}.diff-viewer{flex:1;overflow:auto;background:#0d1117;border:1px solid #30363d;border-radius:8px;margin-top:4px}.diff-pre{margin:0;padding:0;font-family:Fira Code,Cascadia Code,Consolas,monospace;font-size:12.5px;line-height:1.55;white-space:pre;overflow:visible}.diff-line{display:block;padding:0 16px;min-height:1.55em}.diff-line--added{background:#1a3a1a;color:#7ee787}.diff-line--removed{background:#3a1a1a;color:#f47067}.diff-line--hunk{background:#0d1b2a;color:#79c0ff;font-weight:600}.diff-line--file-header{background:#161b22;color:#8b949e;font-style:italic}.diff-line--section-title{background:#1c1c2a;color:#c9d1d9;font-weight:700;padding-top:12px;padding-bottom:4px;border-top:1px solid #30363d;margin-top:4px}.diff-line--separator{background:#0f1117;color:#30363d;border-top:1px solid #21262d;border-bottom:1px solid #21262d}.diff-line--context{color:#c9d1d9}.file-status-table{width:100%;border-collapse:collapse;margin-top:12px}.file-status-table th,.file-status-table td{border:1px solid #30363d;padding:6px 10px;font-size:12px;text-align:left}.file-status-table th{background:#161b22;color:#8b949e}.status-ok{color:#3fb950}.status-modified{color:#d29922}.status-missing{color:#f85149}.history-viewer{display:flex;height:calc(100vh - 120px);gap:24px;overflow:hidden}.history-list{width:320px;flex-shrink:0;overflow-y:auto;padding-right:12px;border-right:1px solid #30363d}.history-entry{display:flex;flex-direction:column;width:100%;padding:12px;background:#161b22;border:1px solid #30363d;border-radius:6px;margin-bottom:8px;cursor:pointer;transition:all .15s;text-align:left;gap:6px}.history-entry:hover{border-color:#8b949e;background:#1c2129}.history-entry.history-entry--active{border-color:#1f6feb;background:#1f6feb11;box-shadow:0 0 0 1px #1f6feb}.history-entry-header{display:flex;align-items:center;justify-content:space-between;width:100%}.history-entry-version{font-size:13px;font-weight:600;color:#f0f6fc}.history-entry-type{font-size:10px;padding:2px 8px;border-radius:10px;font-weight:600;text-transform:uppercase;width:fit-content}.history-entry-type--create{background:#1a3a2a;color:#3fb950}.history-entry-type--update{background:#1c2a3a;color:#58a6ff}.history-entry-type--patch{background:#3d2a00;color:#d29922}.history-entry-type--delete{background:#3a1a1a;color:#f85149}.history-entry-type--snapshot{background:#1e1a3a;color:#a371f7}.history-group{display:flex;flex-direction:column}.history-entry--snapshot-card{padding:0}.history-entry-snapshot-main{display:flex;flex-direction:column;gap:4px;width:100%;padding:10px 12px;background:none;border:none;cursor:pointer;text-align:left;color:inherit}.history-entry-footer{display:flex;align-items:center;justify-content:space-between;gap:8px}.history-group-toggle{font-size:11px;color:#8b949e;cursor:pointer;white-space:nowrap;padding:2px 6px;border-radius:4px;transition:color .15s,background .15s;-webkit-user-select:none;user-select:none}.history-group-toggle:hover{color:#a371f7;background:#a371f715}.history-group-toggle--open{color:#a371f7}.history-group-entries{display:flex;flex-direction:column;margin-left:12px;border-left:2px solid #a371f730;padding-left:4px;margin-bottom:6px}.history-entry--sub{font-size:12px;padding:7px 10px}.history-entry--sub .history-entry-version{font-size:11px;color:#8b949e}.history-uncommitted{display:flex;flex-direction:column;margin-bottom:8px;border:1px dashed #30363d;border-radius:6px;overflow:hidden}.history-uncommitted-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#8b949e;padding:5px 10px;background:#161b22;border-bottom:1px dashed #30363d}.history-entry-date{font-size:11px;color:#8b949e}.history-content{flex:1;overflow-y:auto;padding-bottom:40px}.history-content-meta{display:flex;flex-direction:column;gap:12px;padding:16px;background:#161b22;border:1px solid #30363d;border-radius:8px;margin-bottom:24px}.history-content-meta-title{display:flex;align-items:center;justify-content:space-between;width:100%}.history-content-meta-info{display:flex;align-items:center;gap:12px}.history-content-meta strong{font-size:18px;color:#f0f6fc}.history-content-version{background:#21262d;color:#8b949e;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600}.history-content-date{font-size:13px;color:#8b949e}.history-diff-loading{font-size:12px;color:#8b949e;font-style:italic}.history-diff-base{font-size:11px;color:#8b949e;background:#21262d;border:1px solid #30363d;border-radius:4px;padding:2px 7px;font-family:monospace}.history-diff-recap-banner{font-size:12px;color:#8b949e;background:#161b22;border:1px solid #30363d;border-left:3px solid #388bfd;border-radius:4px;padding:7px 12px;margin-bottom:12px}.history-meta-diff{display:flex;flex-direction:column;gap:8px;margin-top:12px;padding:12px 14px;background:#0d1117;border:1px solid #30363d;border-radius:6px}.history-meta-diff-title{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#8b949e;margin-bottom:2px}.history-meta-diff-row{display:flex;align-items:center;flex-wrap:wrap;gap:6px}.history-meta-diff-field{font-size:12px;font-weight:600;color:#8b949e;min-width:90px}.history-meta-diff-arrow{font-size:12px;color:#8b949e}.history-meta-diff-chips{display:flex;flex-wrap:wrap;gap:4px}.history-meta-diff-chip--added{font-size:12px;padding:2px 8px;border-radius:4px;background:#3fb95026;color:#3fb950;border:1px solid rgba(63,185,80,.3)}.history-meta-diff-chip--removed{font-size:12px;padding:2px 8px;border-radius:4px;background:#f8514926;color:#f85149;border:1px solid rgba(248,81,73,.3);text-decoration:line-through}.history-inline-diff{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13.5px;line-height:1.8;white-space:pre-wrap;word-break:break-word;color:#e6edf3;padding:16px}.history-inline-diff--added{background:#3fb95040;color:#3fb950;border-radius:2px}.history-inline-diff--removed{background:#f8514940;color:#f85149;border-radius:2px;text-decoration:line-through}.doc-editor{display:flex;flex-direction:column;flex:1;min-height:0;gap:12px;margin-top:4px}.doc-editor-textarea{flex:1;min-height:400px;background:#161b22;color:#e1e4e8;border:1px solid #30363d;border-radius:6px;padding:16px;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px;line-height:1.6;resize:vertical;outline:none}.doc-editor-textarea:focus{border-color:#388bfd}.doc-editor-actions{display:flex;align-items:center;gap:12px;justify-content:flex-end}.doc-editor-error{color:#f85149;font-size:13px;margin-right:auto}.save-btn{background:#238636;color:#fff;border:none;border-radius:6px;padding:6px 16px;font-size:13px;cursor:pointer;transition:background .15s}.save-btn:hover:not(:disabled){background:#2ea043}.save-btn:disabled{opacity:.5;cursor:not-allowed}.edit-btn{background:none;border:1px solid #30363d;color:#8b949e;border-radius:6px;padding:4px 10px;font-size:12px;cursor:pointer;transition:all .15s}.edit-btn:hover,.edit-btn.active{background:#21262d;color:#f0f6fc;border-color:#8b949e}.delete-btn{background:none;border:1px solid #30363d;color:#8b949e;border-radius:6px;padding:4px 10px;font-size:12px;cursor:pointer;transition:all .15s;white-space:nowrap}.delete-btn:hover{background:#f8514922;border-color:#f85149;color:#f85149}.delete-btn--confirm{background:#f8514922;border-color:#f85149;color:#f85149;font-weight:600;padding:6px 12px}.delete-btn:disabled{opacity:.6;cursor:not-allowed}.modal-content.delete-modal{width:min(400px,90vw)}.delete-modal .modal-body{gap:14px}.delete-modal-text{font-size:13px;color:#c9d1d9;line-height:1.6}.delete-modal-text code{font-family:Fira Code,Consolas,monospace;font-size:12px;color:#8b949e;word-break:break-all}.delete-modal-actions{display:flex;justify-content:flex-end;gap:8px}@media print{.dashboard-header,.sidebar-wrapper,.doc-header,.doc-related,.file-status-view{display:none!important}.dashboard,.dashboard-body,.doc-viewer{display:block!important;background:#fff!important;color:#000!important;height:auto!important;overflow:visible!important}.doc-content{max-width:100%!important;padding:0!important;color:#000!important;background:#fff!important}pre,code{background:#f5f5f5!important;color:#333!important;border:1px solid #ddd!important}h1,h2,h3,h4,h5,h6{break-after:avoid;page-break-after:avoid}h2,h3,h4{break-before:auto;page-break-before:auto}pre,blockquote,table,figure,img{break-inside:avoid;page-break-inside:avoid}tr{break-inside:avoid;page-break-inside:avoid}p,li{orphans:3;widows:3}}.create-doc-popover{width:min(960px,95vw);max-width:95vw;max-height:90vh;display:flex;flex-direction:column}.create-doc-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 16px;margin-bottom:12px}.create-doc-content-field{display:flex;flex-direction:column;flex:1;min-height:0}.create-doc-textarea{flex:1;min-height:380px;width:100%;box-sizing:border-box;resize:vertical;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:13px;line-height:1.5}.create-doc-hint{margin-top:4px;font-size:11px;color:#6e7681}.folder-combobox{position:relative}.folder-combobox .settings-input{padding-right:28px}.folder-combobox-toggle{position:absolute;top:50%;right:6px;transform:translateY(-50%);background:transparent;border:none;color:#8b949e;cursor:pointer;font-size:12px;padding:2px 6px;border-radius:4px;line-height:1}.folder-combobox-toggle:hover{color:#c9d1d9;background:#21262d}.folder-combobox-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:10;background:#0d1117;border:1px solid #30363d;border-radius:6px;box-shadow:0 8px 24px #00000080;max-height:220px;overflow-y:auto;padding:4px 0}.folder-combobox-header{padding:6px 10px 4px;font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:#6e7681;border-bottom:1px solid #21262d;margin-bottom:4px}.folder-combobox-empty{padding:8px 10px;font-size:12px;color:#8b949e;font-style:italic}.folder-combobox-list{list-style:none;margin:0;padding:0}.folder-combobox-item{padding:6px 10px;font-size:13px;color:#c9d1d9;cursor:pointer;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}.folder-combobox-item.active,.folder-combobox-item:hover{background:#1f2a3a;color:#f0f6fc}@media(max-width:720px){.create-doc-grid{grid-template-columns:1fr}.create-doc-textarea{min-height:260px}}.file-row--clickable{cursor:pointer}.file-row--clickable:hover{background:#21262d}.file-row-code-hint{margin-left:6px;color:#8b949e;font-size:12px}.status-anchors-lost{color:#d29922;font-weight:500}.modal-overlay{position:fixed;inset:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content{background:#161b22;border:1px solid #30363d;border-radius:8px;width:min(900px,90vw);max-height:80vh;display:flex;flex-direction:column;overflow:hidden}.modal-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #30363d}.modal-title{font-size:13px;color:#8b949e;font-family:Fira Code,Consolas,monospace;word-break:break-all}.modal-close-btn{background:none;border:none;color:#8b949e;cursor:pointer;font-size:16px;padding:2px 6px;border-radius:4px}.modal-close-btn:hover{background:#21262d;color:#f0f6fc}.modal-body{overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:16px}.section-code-header{font-size:12px;color:#8b949e;margin-bottom:4px}.pdf-error-banner{margin-top:8px;padding:8px 14px;background:#3a1a1a;border:1px solid #f85149;border-radius:6px;color:#f85149;font-size:12px}.doc-content img.doc-image{max-width:100%;height:auto;border-radius:6px;margin:8px 0;display:block}.doc-editor-actions{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.doc-editor-actions-right{display:flex;align-items:center;gap:8px}.image-insert-trigger-btn{background:#21262d;border:1px solid #30363d;color:#c9d1d9;border-radius:6px;padding:6px 12px;font-size:13px;cursor:pointer}.image-insert-trigger-btn:hover{background:#30363d;color:#f0f6fc}.image-insert-popover{width:360px;background:#161b22;border:1px solid #30363d;border-radius:8px;padding:14px;z-index:9999;box-shadow:0 8px 24px #00000080}.image-insert-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.image-insert-title{font-size:13px;font-weight:600;color:#f0f6fc}.image-insert-close{background:none;border:none;color:#8b949e;cursor:pointer;font-size:14px;padding:2px 4px;border-radius:4px}.image-insert-close:hover{color:#f0f6fc;background:#21262d}.image-insert-tabs{display:flex;gap:4px;margin-bottom:12px;border-bottom:1px solid #21262d;padding-bottom:8px}.image-insert-tab{background:none;border:none;color:#8b949e;font-size:13px;padding:4px 10px;border-radius:4px;cursor:pointer}.image-insert-tab:hover{color:#f0f6fc;background:#21262d}.image-insert-tab.active{color:#58a6ff;background:#1f2937}.image-insert-alt-row{display:flex;align-items:center;gap:8px;margin-bottom:10px}.image-insert-label{font-size:12px;color:#8b949e;white-space:nowrap;flex-shrink:0}.image-insert-input{flex:1;background:#0d1117;border:1px solid #30363d;border-radius:6px;color:#c9d1d9;font-size:13px;padding:5px 10px;width:100%;box-sizing:border-box}.image-insert-input:focus{outline:none;border-color:#58a6ff}.image-insert-tab-content{display:flex;flex-direction:column;gap:8px}.image-upload-label{display:block;background:#21262d;border:1px dashed #30363d;border-radius:6px;color:#c9d1d9;font-size:13px;padding:10px;text-align:center;cursor:pointer}.image-upload-label:hover{background:#30363d;border-color:#58a6ff}.image-upload-label.uploading{opacity:.6;cursor:not-allowed}.image-insert-btn-insert{background:#238636;border:1px solid #2ea043;color:#fff;border-radius:6px;padding:6px 14px;font-size:13px;cursor:pointer;align-self:flex-end}.image-insert-btn-insert:hover:not(:disabled){background:#2ea043}.image-insert-btn-insert:disabled{opacity:.5;cursor:not-allowed}.image-insert-error{font-size:12px;color:#f85149;padding:4px 0}.image-paste-hint{font-size:11px;color:#666;text-align:center;margin-top:6px}.image-insert-gallery-section{margin-top:12px;border-top:1px solid #21262d;padding-top:10px}.image-insert-gallery-label{font-size:11px;color:#8b949e;margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em}.image-thumbs{display:flex;flex-wrap:wrap;gap:6px}.image-thumb{width:60px;height:60px;object-fit:cover;border-radius:4px;cursor:pointer;border:2px solid transparent}.image-thumb:hover{border-color:#58a6ff}.connection-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.connection-dot.connected{background:#3fb950}.connection-dot.disconnected{background:#f85149}.header-center{flex:1;max-width:560px;display:flex;justify-content:center}.header-primary-btn{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 14px;border:none;border-radius:6px;background:#1f6feb;color:#fff;font-size:11.5px;font-weight:600;cursor:pointer;white-space:nowrap;transition:background .15s}.header-primary-btn:hover{background:#388bfd}.settings-btn{height:28px;display:inline-flex;align-items:center;font-size:15px}.sidebar-toggle-btn{height:28px}.search-bar{position:relative;display:flex;align-items:center;gap:10px;width:100%}.search-field{position:relative;flex:1;display:flex;align-items:center}.search-field .search-input{width:100%;height:30px;padding:0 62px 0 32px;border-radius:6px;border:1px solid #30363d;background:#0d1117;color:#e1e4e8;font-size:12px}.search-field-icon{position:absolute;left:10px;color:#6e7681;font-size:12px;pointer-events:none}.search-kbd{position:absolute;right:8px;height:18px;padding:0 6px;display:inline-flex;align-items:center;border-radius:4px;background:#21262d;color:#8b949e;font-size:10px;pointer-events:none}.search-clear-btn{position:absolute;right:8px;height:18px;width:18px;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:4px;background:#21262d;color:#8b949e;font-size:10px;cursor:pointer}.search-clear-btn:hover{background:#30363d;color:#f0f6fc}.project-selector{position:relative;display:flex;align-items:center;gap:6px}.project-select{height:28px;padding:0 8px;border-radius:6px;border:1px solid #30363d;background:#0d1117;color:#e1e4e8;font-size:11px;max-width:170px;cursor:pointer}.new-project-btn{height:28px;width:26px;border-radius:6px;border:1px solid #30363d;background:#161b22;color:#8b949e;cursor:pointer}.new-project-btn:hover{color:#f0f6fc;border-color:#8b949e}.new-project-popover{position:absolute;top:calc(100% + 6px);right:0;z-index:60;display:flex;gap:6px;padding:8px;border:1px solid #30363d;border-radius:8px;background:#161b22;box-shadow:0 8px 24px #00000080}.new-project-popover .new-project-input{height:26px;width:160px;padding:0 8px;border-radius:6px;border:1px solid #30363d;background:#0d1117;color:#e1e4e8;font-size:11px}.sync-pill{display:inline-flex;align-items:center;gap:7px;height:28px;padding:0 14px;border-radius:14px;border:1px solid #1f6feb;background:#0d2036;color:#58a6ff;font-size:11px;cursor:pointer;white-space:nowrap;transition:all .15s}.sync-pill:hover:not(:disabled){background:#0d2d4a;border-color:#388bfd}.sync-pill:disabled{cursor:default;opacity:.7}.sync-pill.conflict{border-color:#f85149;background:#3a1a1a;color:#f85149}.doc-topbar{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:14px}.doc-topbar-left{min-width:0}.doc-breadcrumb{display:flex;align-items:center;gap:6px;font-size:11.5px;color:#6e7681;margin-bottom:6px;flex-wrap:wrap}.doc-breadcrumb .nav-btn{font-size:12px;padding:1px 6px;line-height:1.3}.doc-breadcrumb-segment{display:inline-flex;align-items:center;gap:6px}.doc-breadcrumb-sep{color:#30363d}.doc-main .doc-title{font-size:24px;font-weight:600;color:#f0f6fc;margin:0}.doc-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.btn-primary{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 16px;border:none;border-radius:6px;background:#1f6feb;color:#fff;font-size:12px;font-weight:600;cursor:pointer;white-space:nowrap;transition:background .15s}.btn-primary:hover{background:#388bfd}.btn-primary.active{background:#21262d;color:#c9d1d9;box-shadow:inset 0 0 0 1px #30363d}.btn-secondary,.btn-icon-secondary,.icon-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 14px;border:1px solid #30363d;border-radius:6px;background:#161b22;color:#c9d1d9;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .15s}.btn-icon-secondary,.icon-btn{padding:0 9px;color:#8b949e}.btn-secondary:hover,.btn-icon-secondary:hover,.icon-btn:hover{background:#21262d;color:#f0f6fc;border-color:#8b949e}.menu-anchor{position:relative}.menu-backdrop{position:fixed;inset:0;z-index:50}.menu-popover{position:absolute;top:calc(100% + 6px);left:0;z-index:60;min-width:190px;padding:4px;border:1px solid #30363d;border-radius:8px;background:#161b22;box-shadow:0 8px 24px #00000080;display:flex;flex-direction:column}.menu-popover--right{left:auto;right:0}.menu-item{text-align:left;padding:7px 10px;border:none;border-radius:6px;background:none;color:#c9d1d9;font-size:12px;cursor:pointer;white-space:nowrap}.menu-item:hover:not(:disabled){background:#21262d;color:#f0f6fc}.menu-item:disabled{opacity:.5;cursor:default}.menu-item--danger{color:#f85149}.menu-item--danger:hover{background:#3a1a1a;color:#ff7b72}.doc-tabs{display:flex;align-items:center;gap:24px;border-bottom:1px solid #21262d;margin-bottom:18px;flex-shrink:0}.doc-tab{position:relative;padding:8px 0 10px;border:none;background:none;color:#8b949e;font-size:12.5px;cursor:pointer;white-space:nowrap}.doc-tab:hover{color:#c9d1d9}.doc-tab.active{color:#f0f6fc;font-weight:600}.doc-tab.active:after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:#1f6feb;border-radius:2px}.doc-tab-loading{color:#8b949e;font-size:12.5px;padding:12px 0}.stale-banner{display:flex;gap:14px;padding:12px 16px;margin-bottom:20px;border:1px solid #3d2f10;border-left:3px solid #d29922;border-radius:6px;background:#1c1710;flex-shrink:0}.stale-banner-icon{color:#d29922;font-size:14px;line-height:1.4}.stale-banner-body{display:flex;flex-direction:column;gap:4px}.stale-banner-text{font-size:12.5px;color:#e1e4e8}.stale-banner-link{align-self:flex-start;border:none;background:none;padding:0;color:#58a6ff;font-size:12px;font-weight:600;cursor:pointer}.stale-banner-link:hover{text-decoration:underline}.context-rail{width:300px;flex-shrink:0;border-left:1px solid #21262d;background:#0d1117;overflow-y:auto;padding:14px 20px 32px}.rail-section{padding-bottom:16px;margin-bottom:16px;border-bottom:1px solid #21262d}.rail-section:last-child{border-bottom:none}.rail-section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.rail-label{display:block;font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#6e7681;margin-bottom:10px}.rail-collapse-btn{height:24px;padding:0 6px;border:1px solid #21262d;border-radius:6px;background:#0d1117;color:#8b949e;font-size:11px;cursor:pointer}.rail-collapse-btn:hover{background:#161b22;color:#f0f6fc}.rail-empty{font-size:11.5px;color:#6e7681}.rail-toc{display:flex;flex-direction:column}.rail-toc-item{position:relative;text-align:left;padding:4px 0 4px 14px;border:none;background:none;color:#8b949e;font-size:12px;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rail-toc-item:hover{color:#c9d1d9}.rail-toc-item.active{color:#58a6ff;font-weight:600}.rail-toc-item.active:before{content:"";position:absolute;left:0;top:4px;bottom:4px;width:2px;border-radius:2px;background:#1f6feb}.rail-toc-item--h3{padding-left:26px;font-size:11.5px}.rail-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:3px 0}.rail-key{font-size:12px;color:#8b949e}.rail-val{font-size:12px;color:#c9d1d9;text-align:right}.rail-chip{padding:2px 10px;border-radius:10px;font-size:11px;font-weight:600}.rail-chip--stale{background:#3d2a00;color:#d29922}.rail-chip--fresh{background:#1a3a2a;color:#3fb950}.rail-files{display:flex;flex-direction:column;gap:2px}.rail-file{display:flex;align-items:center;gap:10px;padding:4px 0;border:none;background:none;color:#c9d1d9;font-size:11.5px;text-align:left;cursor:default;overflow:hidden}.rail-file--clickable{cursor:pointer}.rail-file--clickable:hover .rail-file-path{color:#58a6ff;text-decoration:underline}.rail-file-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;background:#6e7681}.rail-file-dot--ok{background:#3fb950}.rail-file-dot--modified{background:#d29922}.rail-file-dot--missing{background:#f85149}.rail-file-dot--anchors_lost{background:#db6d28}.rail-file-path{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rail-legend{margin-top:8px;font-size:10px;color:#6e7681}.rail-tags{display:flex;flex-wrap:wrap;gap:6px}.rail-links{display:flex;flex-direction:column;gap:6px}.rail-link{display:block;text-align:left;border:none;background:none;padding:0;color:#58a6ff;font-size:12px;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rail-link:hover{text-decoration:underline}.rail-link--cross-project{color:#a371f7}.rail-link--broken{color:#6e7681;cursor:default;text-decoration:line-through}@media print{.doc-topbar,.doc-tabs,.stale-banner,.context-rail{display:none!important}.doc-main{display:block!important;overflow:visible!important;padding:0!important}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as t,b as r,a,S as s}from"./chunk-AQP2D5EJ-BeRIIft8.js";import{_ as i}from"./index-T7ZLHNgs.js";import"./chunk-55IACEB6-K8rRjNKN.js";import"./chunk-2J33WTMH-c7xNwExL.js";var l={parser:a,get db(){return new s(2)},renderer:r,styles:t,init:i(e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")};export{l as diagram};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
|
-
|
|
6
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const rootDir = path.join(__dirname, '..');
|
|
8
|
-
|
|
9
|
-
const packagePath = path.join(rootDir, 'package.json');
|
|
10
|
-
const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
|
11
|
-
|
|
12
|
-
const versionContent = `// Auto-generated version file - do not edit manually
|
|
13
|
-
export const APP_VERSION = '${pkg.version}';
|
|
14
|
-
`;
|
|
15
|
-
|
|
16
|
-
const outputPath = path.join(rootDir, 'src', 'version.ts');
|
|
17
|
-
fs.writeFileSync(outputPath, versionContent, 'utf8');
|
|
18
|
-
|
|
19
|
-
console.log(`Generated version file: ${outputPath}`);
|
|
20
|
-
console.log(` Version: ${pkg.version}`);
|