@changw98ic/cli 1.0.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.
- package/LICENSE +674 -0
- package/README.md +57 -0
- package/dist/commands/adapt.d.ts +8 -0
- package/dist/commands/adapt.d.ts.map +1 -0
- package/dist/commands/adapt.js +108 -0
- package/dist/commands/adapt.js.map +1 -0
- package/dist/commands/archive.d.ts +6 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +66 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/backup.d.ts +6 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +151 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/context.d.ts +9 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +203 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/dashboard.d.ts +6 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +27 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/entity.d.ts +6 -0
- package/dist/commands/entity.d.ts.map +1 -0
- package/dist/commands/entity.js +173 -0
- package/dist/commands/entity.js.map +1 -0
- package/dist/commands/extract-context.d.ts +9 -0
- package/dist/commands/extract-context.d.ts.map +1 -0
- package/dist/commands/extract-context.js +135 -0
- package/dist/commands/extract-context.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +69 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +37 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +6 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +67 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/plan.d.ts +6 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +35 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/preflight.d.ts +6 -0
- package/dist/commands/preflight.d.ts.map +1 -0
- package/dist/commands/preflight.js +80 -0
- package/dist/commands/preflight.js.map +1 -0
- package/dist/commands/query.d.ts +6 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +82 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/rag.d.ts +6 -0
- package/dist/commands/rag.d.ts.map +1 -0
- package/dist/commands/rag.js +113 -0
- package/dist/commands/rag.js.map +1 -0
- package/dist/commands/review.d.ts +6 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +38 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/state.d.ts +6 -0
- package/dist/commands/state.d.ts.map +1 -0
- package/dist/commands/state.js +64 -0
- package/dist/commands/state.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +49 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/style.d.ts +9 -0
- package/dist/commands/style.d.ts.map +1 -0
- package/dist/commands/style.js +120 -0
- package/dist/commands/style.js.map +1 -0
- package/dist/commands/update-state.d.ts +6 -0
- package/dist/commands/update-state.d.ts.map +1 -0
- package/dist/commands/update-state.js +92 -0
- package/dist/commands/update-state.js.map +1 -0
- package/dist/commands/use.d.ts +5 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +33 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/commands/where.d.ts +2 -0
- package/dist/commands/where.d.ts.map +1 -0
- package/dist/commands/where.js +13 -0
- package/dist/commands/where.js.map +1 -0
- package/dist/commands/workflow.d.ts +6 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +155 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/commands/write.d.ts +7 -0
- package/dist/commands/write.d.ts.map +1 -0
- package/dist/commands/write.js +33 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/api-client.d.ts +61 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +390 -0
- package/dist/utils/api-client.js.map +1 -0
- package/dist/utils/api-client.types.d.ts +42 -0
- package/dist/utils/api-client.types.d.ts.map +1 -0
- package/dist/utils/api-client.types.js +5 -0
- package/dist/utils/api-client.types.js.map +1 -0
- package/dist/utils/archive-manager.d.ts +72 -0
- package/dist/utils/archive-manager.d.ts.map +1 -0
- package/dist/utils/archive-manager.js +449 -0
- package/dist/utils/archive-manager.js.map +1 -0
- package/dist/utils/backup-manager.d.ts +65 -0
- package/dist/utils/backup-manager.d.ts.map +1 -0
- package/dist/utils/backup-manager.js +266 -0
- package/dist/utils/backup-manager.js.map +1 -0
- package/dist/utils/chapter-context.d.ts +77 -0
- package/dist/utils/chapter-context.d.ts.map +1 -0
- package/dist/utils/chapter-context.js +280 -0
- package/dist/utils/chapter-context.js.map +1 -0
- package/dist/utils/entity-linker.d.ts +74 -0
- package/dist/utils/entity-linker.d.ts.map +1 -0
- package/dist/utils/entity-linker.js +208 -0
- package/dist/utils/entity-linker.js.map +1 -0
- package/dist/utils/index.d.ts +19 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/observability.d.ts +145 -0
- package/dist/utils/observability.d.ts.map +1 -0
- package/dist/utils/observability.js +298 -0
- package/dist/utils/observability.js.map +1 -0
- package/dist/utils/output.d.ts +45 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +60 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/path-compat.d.ts +63 -0
- package/dist/utils/path-compat.d.ts.map +1 -0
- package/dist/utils/path-compat.js +128 -0
- package/dist/utils/path-compat.js.map +1 -0
- package/dist/utils/project-locator.d.ts +47 -0
- package/dist/utils/project-locator.d.ts.map +1 -0
- package/dist/utils/project-locator.js +372 -0
- package/dist/utils/project-locator.js.map +1 -0
- package/dist/utils/runtime-compat.d.ts +39 -0
- package/dist/utils/runtime-compat.d.ts.map +1 -0
- package/dist/utils/runtime-compat.js +113 -0
- package/dist/utils/runtime-compat.js.map +1 -0
- package/dist/utils/security.d.ts +74 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +291 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/status-reporter.d.ts +66 -0
- package/dist/utils/status-reporter.d.ts.map +1 -0
- package/dist/utils/status-reporter.js +309 -0
- package/dist/utils/status-reporter.js.map +1 -0
- package/dist/utils/style-sampler.d.ts +69 -0
- package/dist/utils/style-sampler.d.ts.map +1 -0
- package/dist/utils/style-sampler.js +206 -0
- package/dist/utils/style-sampler.js.map +1 -0
- package/dist/utils/workflow-manager.d.ts +104 -0
- package/dist/utils/workflow-manager.d.ts.map +1 -0
- package/dist/utils/workflow-manager.js +462 -0
- package/dist/utils/workflow-manager.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 可观测性工具
|
|
3
|
+
*
|
|
4
|
+
* 迁移自 Python observability.py
|
|
5
|
+
* 提供工具调用日志、 性能计时追踪功能
|
|
6
|
+
*/
|
|
7
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'fs';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// File-Based Tool Logger
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* 文件工具日志记录器
|
|
14
|
+
*
|
|
15
|
+
* 将工具调用日志写入 JSONL 文件, 用于后续分析
|
|
16
|
+
*/
|
|
17
|
+
export class FileToolLogger {
|
|
18
|
+
logPath;
|
|
19
|
+
constructor(projectRoot) {
|
|
20
|
+
const obsDir = join(projectRoot, '.webnovel', 'observability');
|
|
21
|
+
if (!existsSync(obsDir)) {
|
|
22
|
+
mkdirSync(obsDir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
this.logPath = join(obsDir, 'tool_calls.jsonl');
|
|
25
|
+
}
|
|
26
|
+
logToolCall(toolName, success, options) {
|
|
27
|
+
const entry = {
|
|
28
|
+
timestamp: new Date().toISOString(),
|
|
29
|
+
toolName,
|
|
30
|
+
success,
|
|
31
|
+
retryCount: options?.retryCount ?? 0,
|
|
32
|
+
errorCode: options?.errorCode,
|
|
33
|
+
errorMessage: options?.errorMessage,
|
|
34
|
+
chapter: options?.chapter,
|
|
35
|
+
};
|
|
36
|
+
try {
|
|
37
|
+
appendFileSync(this.logPath, JSON.stringify(entry, null, 2) + '\n', 'utf-8');
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Silently ignore logging errors
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Observability Manager
|
|
46
|
+
// ============================================================================
|
|
47
|
+
/**
|
|
48
|
+
* 可观测性管理器
|
|
49
|
+
*
|
|
50
|
+
* 提供统一的工具调用日志和 性能计时功能
|
|
51
|
+
*/
|
|
52
|
+
export class ObservabilityManager {
|
|
53
|
+
projectRoot;
|
|
54
|
+
toolLogger;
|
|
55
|
+
timingLogPath;
|
|
56
|
+
constructor(projectRoot, toolLogger) {
|
|
57
|
+
this.projectRoot = projectRoot;
|
|
58
|
+
this.toolLogger = toolLogger ?? new FileToolLogger(projectRoot);
|
|
59
|
+
const obsDir = join(projectRoot, '.webnovel', 'observability');
|
|
60
|
+
if (!existsSync(obsDir)) {
|
|
61
|
+
mkdirSync(obsDir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
this.timingLogPath = join(obsDir, 'data_agent_timing.jsonl');
|
|
64
|
+
}
|
|
65
|
+
// ==================== Tool Call Logging ====================
|
|
66
|
+
/**
|
|
67
|
+
* 安全记录工具调用
|
|
68
|
+
*/
|
|
69
|
+
safeLogToolCall(toolName, success, options) {
|
|
70
|
+
try {
|
|
71
|
+
this.toolLogger.logToolCall(toolName, success, options);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
// Silently ignore logging errors
|
|
75
|
+
console.warn(`工具调用日志记录失败: ${toolName} - ${e}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ==================== Performance Timing ====================
|
|
79
|
+
/**
|
|
80
|
+
* 记录性能计时
|
|
81
|
+
*/
|
|
82
|
+
appendPerfTiming(params) {
|
|
83
|
+
const entry = {
|
|
84
|
+
timestamp: new Date().toISOString(),
|
|
85
|
+
toolName: params.toolName,
|
|
86
|
+
success: params.success,
|
|
87
|
+
elapsedMs: params.elapsedMs,
|
|
88
|
+
chapter: params.chapter,
|
|
89
|
+
errorCode: params.errorCode,
|
|
90
|
+
errorMessage: params.errorMessage,
|
|
91
|
+
meta: params.meta,
|
|
92
|
+
};
|
|
93
|
+
try {
|
|
94
|
+
appendFileSync(this.timingLogPath, JSON.stringify(entry, null, 2) + '\n', 'utf-8');
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Silently ignore logging errors
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 测量异步操作执行时间
|
|
102
|
+
*/
|
|
103
|
+
async measureAsync(toolName, fn, options) {
|
|
104
|
+
const startTime = Date.now();
|
|
105
|
+
let success = false;
|
|
106
|
+
let errorCode;
|
|
107
|
+
let errorMessage;
|
|
108
|
+
try {
|
|
109
|
+
const result = await fn();
|
|
110
|
+
success = true;
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
errorCode = e instanceof Error ? e.name : 'UnknownError';
|
|
115
|
+
errorMessage = e instanceof Error ? e.message : String(e);
|
|
116
|
+
throw e;
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
const elapsedMs = Date.now() - startTime;
|
|
120
|
+
this.appendPerfTiming({
|
|
121
|
+
toolName,
|
|
122
|
+
success,
|
|
123
|
+
elapsedMs,
|
|
124
|
+
chapter: options?.chapter,
|
|
125
|
+
errorCode,
|
|
126
|
+
errorMessage,
|
|
127
|
+
meta: options?.meta,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 测量同步操作执行时间
|
|
133
|
+
*/
|
|
134
|
+
measureSync(toolName, fn, options) {
|
|
135
|
+
const startTime = Date.now();
|
|
136
|
+
let success = false;
|
|
137
|
+
let errorCode;
|
|
138
|
+
let errorMessage;
|
|
139
|
+
try {
|
|
140
|
+
const result = fn();
|
|
141
|
+
success = true;
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
errorCode = e instanceof Error ? e.name : 'UnknownError';
|
|
146
|
+
errorMessage = e instanceof Error ? e.message : String(e);
|
|
147
|
+
throw e;
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
const elapsedMs = Date.now() - startTime;
|
|
151
|
+
this.appendPerfTiming({
|
|
152
|
+
toolName,
|
|
153
|
+
success,
|
|
154
|
+
elapsedMs,
|
|
155
|
+
chapter: options?.chapter,
|
|
156
|
+
errorCode,
|
|
157
|
+
errorMessage,
|
|
158
|
+
meta: options?.meta,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// ==================== Statistics ====================
|
|
163
|
+
/**
|
|
164
|
+
* 获取性能统计
|
|
165
|
+
*/
|
|
166
|
+
getPerfStats(options) {
|
|
167
|
+
if (!existsSync(this.timingLogPath)) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
const content = readFileSync(this.timingLogPath, 'utf-8');
|
|
171
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
172
|
+
let logs = lines.map(line => {
|
|
173
|
+
try {
|
|
174
|
+
return JSON.parse(line);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}).filter((log) => log !== null);
|
|
180
|
+
// Filter by tool name
|
|
181
|
+
if (options?.toolName) {
|
|
182
|
+
logs = logs.filter(log => log.toolName === options.toolName);
|
|
183
|
+
}
|
|
184
|
+
// Filter by date
|
|
185
|
+
if (options?.since) {
|
|
186
|
+
const sinceTime = options.since.getTime();
|
|
187
|
+
logs = logs.filter(log => new Date(log.timestamp).getTime() >= sinceTime);
|
|
188
|
+
}
|
|
189
|
+
// Apply limit
|
|
190
|
+
if (options?.limit && options.limit > 0) {
|
|
191
|
+
logs = logs.slice(0, options.limit);
|
|
192
|
+
}
|
|
193
|
+
return logs;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 获取工具调用统计
|
|
197
|
+
*/
|
|
198
|
+
getToolCallStats(options) {
|
|
199
|
+
const toolCallsPath = join(this.projectRoot, '.webnovel', 'observability', 'tool_calls.jsonl');
|
|
200
|
+
if (!existsSync(toolCallsPath)) {
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
const content = readFileSync(toolCallsPath, 'utf-8');
|
|
204
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
205
|
+
let logs = lines.map(line => {
|
|
206
|
+
try {
|
|
207
|
+
return JSON.parse(line);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
}).filter((log) => log !== null);
|
|
213
|
+
// Filter by tool name
|
|
214
|
+
if (options?.toolName) {
|
|
215
|
+
logs = logs.filter(log => log.toolName === options.toolName);
|
|
216
|
+
}
|
|
217
|
+
// Filter by date
|
|
218
|
+
if (options?.since) {
|
|
219
|
+
const sinceTime = options.since.getTime();
|
|
220
|
+
logs = logs.filter(log => new Date(log.timestamp).getTime() >= sinceTime);
|
|
221
|
+
}
|
|
222
|
+
// Apply limit
|
|
223
|
+
if (options?.limit && options.limit > 0) {
|
|
224
|
+
logs = logs.slice(0, options.limit);
|
|
225
|
+
}
|
|
226
|
+
return logs;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* 生成可观测性摘要报告
|
|
230
|
+
*/
|
|
231
|
+
generateSummary() {
|
|
232
|
+
const toolCalls = this.getToolCallStats({ limit: 100 });
|
|
233
|
+
const perfLogs = this.getPerfStats({ limit: 100 });
|
|
234
|
+
// Calculate tool call stats
|
|
235
|
+
const successfulCalls = toolCalls.filter(log => log.success).length;
|
|
236
|
+
const failedCalls = toolCalls.length - successfulCalls;
|
|
237
|
+
// Calculate performance stats
|
|
238
|
+
const toolPerf = new Map();
|
|
239
|
+
for (const log of perfLogs) {
|
|
240
|
+
const existing = toolPerf.get(log.toolName) ?? { total: 0, count: 0, ms: 0 };
|
|
241
|
+
existing.total += 1;
|
|
242
|
+
existing.count++;
|
|
243
|
+
existing.ms += log.elapsedMs;
|
|
244
|
+
toolPerf.set(log.toolName, existing);
|
|
245
|
+
}
|
|
246
|
+
// Find slowest tools
|
|
247
|
+
const slowestTools = Array.from(toolPerf.entries())
|
|
248
|
+
.map(([toolName, data]) => ({
|
|
249
|
+
toolName,
|
|
250
|
+
avgMs: Math.round(data.ms / data.count),
|
|
251
|
+
count: data.count,
|
|
252
|
+
}))
|
|
253
|
+
.sort((a, b) => b.avgMs - a.avgMs)
|
|
254
|
+
.slice(0, 5);
|
|
255
|
+
// Find recent errors
|
|
256
|
+
const recentErrors = toolCalls
|
|
257
|
+
.filter(log => !log.success)
|
|
258
|
+
.slice(0, 5)
|
|
259
|
+
.map(log => ({
|
|
260
|
+
toolName: log.toolName,
|
|
261
|
+
errorMessage: log.errorMessage ?? 'Unknown error',
|
|
262
|
+
timestamp: log.timestamp,
|
|
263
|
+
}));
|
|
264
|
+
return {
|
|
265
|
+
totalToolCalls: toolCalls.length,
|
|
266
|
+
successfulCalls,
|
|
267
|
+
failedCalls,
|
|
268
|
+
avgElapsedMs: perfLogs.length > 0
|
|
269
|
+
? Math.round(perfLogs.reduce((sum, log) => sum + log.elapsedMs, 0) / perfLogs.length)
|
|
270
|
+
: null,
|
|
271
|
+
slowestTools,
|
|
272
|
+
recentErrors,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// ============================================================================
|
|
277
|
+
// Convenience Functions
|
|
278
|
+
// ============================================================================
|
|
279
|
+
/**
|
|
280
|
+
* 安全记录工具调用(独立函数)
|
|
281
|
+
*/
|
|
282
|
+
export function safeLogToolCall(projectRoot, toolName, success, options) {
|
|
283
|
+
const logger = new FileToolLogger(projectRoot);
|
|
284
|
+
try {
|
|
285
|
+
logger.logToolCall(toolName, success, options);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
// Silently ignore
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* 安全追加性能计时(独立函数)
|
|
293
|
+
*/
|
|
294
|
+
export function safeAppendPerfTiming(projectRoot, params) {
|
|
295
|
+
const manager = new ObservabilityManager(projectRoot);
|
|
296
|
+
manager.appendPerfTiming(params);
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../../src/utils/observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Output Protocol - 与 Python cli_output.py 兼容的 JSON 输出协议
|
|
3
|
+
*/
|
|
4
|
+
export interface SuccessPayload {
|
|
5
|
+
status: 'success';
|
|
6
|
+
message: string;
|
|
7
|
+
data?: unknown;
|
|
8
|
+
warnings?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface ErrorDetail {
|
|
11
|
+
code: string;
|
|
12
|
+
message: string;
|
|
13
|
+
suggestion?: string;
|
|
14
|
+
details?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
export interface ErrorPayload {
|
|
17
|
+
status: 'error';
|
|
18
|
+
error: ErrorDetail;
|
|
19
|
+
}
|
|
20
|
+
export type OutputPayload = SuccessPayload | ErrorPayload;
|
|
21
|
+
/**
|
|
22
|
+
* 构建成功响应
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildSuccess(data?: unknown, message?: string, warnings?: string[]): SuccessPayload;
|
|
25
|
+
/**
|
|
26
|
+
* 构建错误响应
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildError(code: string, message: string, suggestion?: string, details?: Record<string, unknown>): ErrorPayload;
|
|
29
|
+
/**
|
|
30
|
+
* 打印 JSON 到 stdout
|
|
31
|
+
*/
|
|
32
|
+
export declare function printJson(payload: OutputPayload): void;
|
|
33
|
+
/**
|
|
34
|
+
* 构建并打印成功响应
|
|
35
|
+
*/
|
|
36
|
+
export declare function printSuccess(data?: unknown, message?: string, warnings?: string[]): void;
|
|
37
|
+
/**
|
|
38
|
+
* 构建并打印错误响应
|
|
39
|
+
*/
|
|
40
|
+
export declare function printError(code: string, message: string, suggestion?: string, details?: Record<string, unknown>): void;
|
|
41
|
+
/**
|
|
42
|
+
* 格式化打印(带缩进,用于调试)
|
|
43
|
+
*/
|
|
44
|
+
export declare function printJsonPretty(payload: OutputPayload): void;
|
|
45
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,MAAa,EACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,cAAc,CAYhB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,YAAY,CAed;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAEtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,MAAa,EACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAE5D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 构建成功响应
|
|
3
|
+
*/
|
|
4
|
+
export function buildSuccess(data, message = 'ok', warnings) {
|
|
5
|
+
const payload = {
|
|
6
|
+
status: 'success',
|
|
7
|
+
message,
|
|
8
|
+
};
|
|
9
|
+
if (data !== undefined) {
|
|
10
|
+
payload.data = data;
|
|
11
|
+
}
|
|
12
|
+
if (warnings && warnings.length > 0) {
|
|
13
|
+
payload.warnings = warnings;
|
|
14
|
+
}
|
|
15
|
+
return payload;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 构建错误响应
|
|
19
|
+
*/
|
|
20
|
+
export function buildError(code, message, suggestion, details) {
|
|
21
|
+
const error = {
|
|
22
|
+
code,
|
|
23
|
+
message,
|
|
24
|
+
};
|
|
25
|
+
if (suggestion) {
|
|
26
|
+
error.suggestion = suggestion;
|
|
27
|
+
}
|
|
28
|
+
if (details) {
|
|
29
|
+
error.details = details;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
status: 'error',
|
|
33
|
+
error,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 打印 JSON 到 stdout
|
|
38
|
+
*/
|
|
39
|
+
export function printJson(payload) {
|
|
40
|
+
console.log(JSON.stringify(payload, null, 0));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 构建并打印成功响应
|
|
44
|
+
*/
|
|
45
|
+
export function printSuccess(data, message = 'ok', warnings) {
|
|
46
|
+
printJson(buildSuccess(data, message, warnings));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 构建并打印错误响应
|
|
50
|
+
*/
|
|
51
|
+
export function printError(code, message, suggestion, details) {
|
|
52
|
+
printJson(buildError(code, message, suggestion, details));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 格式化打印(带缩进,用于调试)
|
|
56
|
+
*/
|
|
57
|
+
export function printJsonPretty(payload) {
|
|
58
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAwBA;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAc,EACd,UAAkB,IAAI,EACtB,QAAmB;IAEnB,MAAM,OAAO,GAAmB;QAC9B,MAAM,EAAE,SAAS;QACjB,OAAO;KACR,CAAC;IACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,OAAe,EACf,UAAmB,EACnB,OAAiC;IAEjC,MAAM,KAAK,GAAgB;QACzB,IAAI;QACJ,OAAO;KACR,CAAC;IACF,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAC1B,CAAC;IACD,OAAO;QACL,MAAM,EAAE,OAAO;QACf,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAsB;IAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAc,EACd,UAAkB,IAAI,EACtB,QAAmB;IAEnB,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,OAAe,EACf,UAAmB,EACnB,OAAiC;IAEjC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAsB;IACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webnovel 数据目录名
|
|
3
|
+
*/
|
|
4
|
+
export declare const WEBNOVEL_DIR = ".webnovel";
|
|
5
|
+
/**
|
|
6
|
+
* 格式化章节编号(补零到 4 位)
|
|
7
|
+
* Python: f"{chapter:04d}"
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatChapter(chapter: number): string;
|
|
10
|
+
/**
|
|
11
|
+
* 生成 Chunk ID
|
|
12
|
+
* Python: f"ch{chapter_id}_summary" 或 f"ch{chapter_id}_s{scene_index}"
|
|
13
|
+
*/
|
|
14
|
+
export declare function makeChunkId(type: 'summary' | 'scene', chapter: number, sceneIndex?: number): string;
|
|
15
|
+
/**
|
|
16
|
+
* 解析 Chunk ID 中的章节号
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseChunkChapter(chunkId: string): number | null;
|
|
19
|
+
/**
|
|
20
|
+
* 获取 state.json 文件路径
|
|
21
|
+
*/
|
|
22
|
+
export declare function getStatePath(projectRoot: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* 获取 index.db 文件路径
|
|
25
|
+
*/
|
|
26
|
+
export declare function getIndexDbPath(projectRoot: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* 获取 vectors.db 文件路径
|
|
29
|
+
*/
|
|
30
|
+
export declare function getVectorsDbPath(projectRoot: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* 检查是否为有效的项目根目录
|
|
33
|
+
*/
|
|
34
|
+
export declare function isProjectRoot(projectRoot: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* 检查是否为显式项目根目录(包含 .webnovel 目录或 state.json)
|
|
37
|
+
*/
|
|
38
|
+
export declare function isExplicitProjectRoot(projectRoot: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 规范化路径(跨平台)
|
|
41
|
+
* Python: os.path.normcase + resolve
|
|
42
|
+
*/
|
|
43
|
+
export declare function normalizePath(path: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* 获取用户 Claude 根目录
|
|
46
|
+
* Python: _get_user_claude_root()
|
|
47
|
+
*/
|
|
48
|
+
export declare function getUserClaudeRoot(): string;
|
|
49
|
+
/**
|
|
50
|
+
* 获取全局 registry 路径
|
|
51
|
+
* Python: _global_registry_path()
|
|
52
|
+
*/
|
|
53
|
+
export declare function getGlobalRegistryPath(): string;
|
|
54
|
+
/**
|
|
55
|
+
* 生成稳定的路径 key(用于 registry 映射)
|
|
56
|
+
* Python: _normcase_path_key()
|
|
57
|
+
*/
|
|
58
|
+
export declare function makePathKey(path: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* 获取当前时间 ISO 格式
|
|
61
|
+
*/
|
|
62
|
+
export declare function nowIso(): string;
|
|
63
|
+
//# sourceMappingURL=path-compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-compat.d.ts","sourceRoot":"","sources":["../../src/utils/path-compat.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAMnG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIhE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAOlE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAE/B"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Compatibility - 与 Python 版本兼容的路径处理工具
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, statSync } from 'fs';
|
|
5
|
+
import { join, resolve, normalize } from 'path';
|
|
6
|
+
import { homedir, platform } from 'os';
|
|
7
|
+
/**
|
|
8
|
+
* Webnovel 数据目录名
|
|
9
|
+
*/
|
|
10
|
+
export const WEBNOVEL_DIR = '.webnovel';
|
|
11
|
+
/**
|
|
12
|
+
* 格式化章节编号(补零到 4 位)
|
|
13
|
+
* Python: f"{chapter:04d}"
|
|
14
|
+
*/
|
|
15
|
+
export function formatChapter(chapter) {
|
|
16
|
+
return String(chapter).padStart(4, '0');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 生成 Chunk ID
|
|
20
|
+
* Python: f"ch{chapter_id}_summary" 或 f"ch{chapter_id}_s{scene_index}"
|
|
21
|
+
*/
|
|
22
|
+
export function makeChunkId(type, chapter, sceneIndex) {
|
|
23
|
+
const chapterId = formatChapter(chapter);
|
|
24
|
+
if (type === 'summary') {
|
|
25
|
+
return `ch${chapterId}_summary`;
|
|
26
|
+
}
|
|
27
|
+
return `ch${chapterId}_s${sceneIndex ?? 0}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 解析 Chunk ID 中的章节号
|
|
31
|
+
*/
|
|
32
|
+
export function parseChunkChapter(chunkId) {
|
|
33
|
+
const match = chunkId.match(/^ch(\d+)_/);
|
|
34
|
+
if (!match)
|
|
35
|
+
return null;
|
|
36
|
+
return parseInt(match[1], 10);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 获取 state.json 文件路径
|
|
40
|
+
*/
|
|
41
|
+
export function getStatePath(projectRoot) {
|
|
42
|
+
return join(projectRoot, WEBNOVEL_DIR, 'state.json');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 获取 index.db 文件路径
|
|
46
|
+
*/
|
|
47
|
+
export function getIndexDbPath(projectRoot) {
|
|
48
|
+
return join(projectRoot, WEBNOVEL_DIR, 'index.db');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 获取 vectors.db 文件路径
|
|
52
|
+
*/
|
|
53
|
+
export function getVectorsDbPath(projectRoot) {
|
|
54
|
+
return join(projectRoot, WEBNOVEL_DIR, 'vectors.db');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 检查是否为有效的项目根目录
|
|
58
|
+
*/
|
|
59
|
+
export function isProjectRoot(projectRoot) {
|
|
60
|
+
const statePath = getStatePath(projectRoot);
|
|
61
|
+
try {
|
|
62
|
+
return existsSync(statePath) && statSync(statePath).isFile();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 检查是否为显式项目根目录(包含 .webnovel 目录或 state.json)
|
|
70
|
+
*/
|
|
71
|
+
export function isExplicitProjectRoot(projectRoot) {
|
|
72
|
+
const webnovelDir = join(projectRoot, WEBNOVEL_DIR);
|
|
73
|
+
try {
|
|
74
|
+
return isProjectRoot(projectRoot) || (existsSync(webnovelDir) && statSync(webnovelDir).isDirectory());
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 规范化路径(跨平台)
|
|
82
|
+
* Python: os.path.normcase + resolve
|
|
83
|
+
*/
|
|
84
|
+
export function normalizePath(path) {
|
|
85
|
+
let normalized = normalize(path);
|
|
86
|
+
// Windows 下统一使用反斜杠
|
|
87
|
+
if (platform() === 'win32') {
|
|
88
|
+
normalized = normalized.toLowerCase();
|
|
89
|
+
}
|
|
90
|
+
return normalized;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 获取用户 Claude 根目录
|
|
94
|
+
* Python: _get_user_claude_root()
|
|
95
|
+
*/
|
|
96
|
+
export function getUserClaudeRoot() {
|
|
97
|
+
const envHome = process.env.WEBNOVEL_CLAUDE_HOME || process.env.CLAUDE_HOME;
|
|
98
|
+
if (envHome) {
|
|
99
|
+
return resolve(normalizePath(envHome));
|
|
100
|
+
}
|
|
101
|
+
return join(homedir(), '.claude');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 获取全局 registry 路径
|
|
105
|
+
* Python: _global_registry_path()
|
|
106
|
+
*/
|
|
107
|
+
export function getGlobalRegistryPath() {
|
|
108
|
+
return join(getUserClaudeRoot(), 'webnovel-writer', 'workspaces.json');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 生成稳定的路径 key(用于 registry 映射)
|
|
112
|
+
* Python: _normcase_path_key()
|
|
113
|
+
*/
|
|
114
|
+
export function makePathKey(path) {
|
|
115
|
+
try {
|
|
116
|
+
return normalizePath(resolve(path));
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return normalizePath(path);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 获取当前时间 ISO 格式
|
|
124
|
+
*/
|
|
125
|
+
export function nowIso() {
|
|
126
|
+
return new Date().toISOString().slice(0, 19);
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=path-compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-compat.js","sourceRoot":"","sources":["../../src/utils/path-compat.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AAExC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAyB,EAAE,OAAe,EAAE,UAAmB;IACzF,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,KAAK,SAAS,UAAU,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,SAAS,KAAK,UAAU,IAAI,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,OAAO,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACxG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,mBAAmB;IACnB,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5E,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare const DEFAULT_PROJECT_DIR_NAMES: readonly ["webnovel-project"];
|
|
2
|
+
export declare const CURRENT_PROJECT_POINTER_REL: string;
|
|
3
|
+
export declare const GLOBAL_REGISTRY_REL: string;
|
|
4
|
+
export declare const ENV_CLAUDE_PROJECT_DIR = "CLAUDE_PROJECT_DIR";
|
|
5
|
+
export declare const ENV_CLAUDE_HOME = "CLAUDE_HOME";
|
|
6
|
+
export declare const ENV_WEBNOVEL_CLAUDE_HOME = "WEBNOVEL_CLAUDE_HOME";
|
|
7
|
+
export declare const ENV_WEBNOVEL_PROJECT_ROOT = "WEBNOVEL_PROJECT_ROOT";
|
|
8
|
+
/**
|
|
9
|
+
* 查找最近的 Git 根目录
|
|
10
|
+
*/
|
|
11
|
+
export declare function findGitRoot(cwd: string): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* 解析项目根目录
|
|
14
|
+
*
|
|
15
|
+
* 解析优先级:
|
|
16
|
+
* 1) 显式传入的 project_root
|
|
17
|
+
* 2) 环境变量 WEBNOVEL_PROJECT_ROOT
|
|
18
|
+
* 3) workspace 指针文件
|
|
19
|
+
* 4) 用户级 registry (前缀匹配)
|
|
20
|
+
* 5) 从 CWD 向上搜索 .webnovel/state.json
|
|
21
|
+
*
|
|
22
|
+
* @throws Error 如果无法找到有效的项目根目录
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveProjectRoot(explicitProjectRoot?: string, options?: {
|
|
25
|
+
cwd?: string;
|
|
26
|
+
}): string;
|
|
27
|
+
/**
|
|
28
|
+
* 更新用户级 registry:workspace -> current_project_root 映射
|
|
29
|
+
*/
|
|
30
|
+
export declare function updateGlobalRegistryCurrentProject(options: {
|
|
31
|
+
workspaceRoot?: string | null;
|
|
32
|
+
projectRoot: string;
|
|
33
|
+
}): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* 写入 workspace 级当前项目指针
|
|
36
|
+
*/
|
|
37
|
+
export declare function writeCurrentProjectPointer(projectRoot: string, options?: {
|
|
38
|
+
workspaceRoot?: string;
|
|
39
|
+
}): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* 解析 state.json 文件路径
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveStateFile(explicitStateFile?: string, options?: {
|
|
44
|
+
explicitProjectRoot?: string;
|
|
45
|
+
cwd?: string;
|
|
46
|
+
}): string;
|
|
47
|
+
//# sourceMappingURL=project-locator.d.ts.map
|