@telora/mcp-products 0.22.3 → 0.22.6
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/dist/handlers/connectorHandlers.js +22 -227
- package/dist/handlers/connectorHandlers.js.map +1 -1
- package/dist/handlers/daemonConfig.d.ts +81 -0
- package/dist/handlers/daemonConfig.js +303 -0
- package/dist/handlers/daemonConfig.js.map +1 -0
- package/dist/handlers/productHandlers.js +35 -1
- package/dist/handlers/productHandlers.js.map +1 -1
- package/package.json +1 -1
- package/dist/scanner/ast-extraction.d.ts +0 -10
- package/dist/scanner/ast-extraction.js +0 -156
- package/dist/scanner/ast-extraction.js.map +0 -1
- package/dist/scanner/file-discovery.d.ts +0 -9
- package/dist/scanner/file-discovery.js +0 -134
- package/dist/scanner/file-discovery.js.map +0 -1
- package/dist/scanner/index.d.ts +0 -19
- package/dist/scanner/index.js +0 -193
- package/dist/scanner/index.js.map +0 -1
- package/dist/scanner/relationship-extraction.d.ts +0 -11
- package/dist/scanner/relationship-extraction.js +0 -187
- package/dist/scanner/relationship-extraction.js.map +0 -1
- package/dist/scanner/types.d.ts +0 -45
- package/dist/scanner/types.js +0 -3
- package/dist/scanner/types.js.map +0 -1
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Shared daemon-config helpers used by telora_connector_start and
|
|
3
|
+
// telora_product create. Manages .telora/daemon.json read/merge/write,
|
|
4
|
+
// daemon PID tracking, stop/start, and product-entry registration.
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, openSync, } from "node:fs";
|
|
8
|
+
import { spawn, execFileSync } from "node:child_process";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
// Identity keys are always overwritten by a fresh config (auth/identity may rotate).
|
|
11
|
+
const IDENTITY_KEYS = ["teloraUrl", "trackerId", "organizationId"];
|
|
12
|
+
export function resolveDaemonPaths(repoPath) {
|
|
13
|
+
const globalDir = join(homedir(), ".telora");
|
|
14
|
+
const globalPath = join(globalDir, "daemon.json");
|
|
15
|
+
const localDir = join(repoPath, ".telora");
|
|
16
|
+
const localPath = join(localDir, "daemon.json");
|
|
17
|
+
const useGlobal = existsSync(globalPath);
|
|
18
|
+
return {
|
|
19
|
+
globalDir,
|
|
20
|
+
globalPath,
|
|
21
|
+
localDir,
|
|
22
|
+
localPath,
|
|
23
|
+
useGlobal,
|
|
24
|
+
configPath: useGlobal ? globalPath : localPath,
|
|
25
|
+
teloraDir: useGlobal ? globalDir : localDir,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Merge a fresh daemon config into an existing one.
|
|
30
|
+
*
|
|
31
|
+
* - Identity keys are always overwritten.
|
|
32
|
+
* - Products array: if the fresh product is already in the array, update its
|
|
33
|
+
* repoPath if different; if missing, append the new entry.
|
|
34
|
+
* - Legacy flat `productId` + `repoPath` are migrated into the products array.
|
|
35
|
+
* - Engine sections are only added if missing.
|
|
36
|
+
* - Everything else the user has customized is preserved.
|
|
37
|
+
*/
|
|
38
|
+
export function mergeConfig(existing, freshProduct, fresh) {
|
|
39
|
+
const merged = { ...existing };
|
|
40
|
+
for (const key of IDENTITY_KEYS) {
|
|
41
|
+
if (key in fresh) {
|
|
42
|
+
merged[key] = fresh[key];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
let products = Array.isArray(merged.products)
|
|
46
|
+
? merged.products
|
|
47
|
+
: [];
|
|
48
|
+
if (products.length === 0 && typeof merged.productId === "string" && merged.productId) {
|
|
49
|
+
const legacyRepoPath = typeof merged.repoPath === "string" ? merged.repoPath : process.cwd();
|
|
50
|
+
products = [{ id: merged.productId, repoPath: legacyRepoPath }];
|
|
51
|
+
}
|
|
52
|
+
delete merged.productId;
|
|
53
|
+
delete merged.repoPath;
|
|
54
|
+
let action;
|
|
55
|
+
const idx = products.findIndex((p) => p.id === freshProduct.id);
|
|
56
|
+
if (idx >= 0) {
|
|
57
|
+
if (products[idx].repoPath !== freshProduct.repoPath) {
|
|
58
|
+
products[idx] = { ...products[idx], repoPath: freshProduct.repoPath };
|
|
59
|
+
action = "updated";
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
action = "no_change";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
products.push(freshProduct);
|
|
67
|
+
action = "added";
|
|
68
|
+
}
|
|
69
|
+
merged.products = products;
|
|
70
|
+
const freshEngines = fresh.engines;
|
|
71
|
+
if (freshEngines) {
|
|
72
|
+
if (!merged.engines) {
|
|
73
|
+
merged.engines = freshEngines;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const existingEngines = merged.engines;
|
|
77
|
+
for (const engineKey of Object.keys(freshEngines)) {
|
|
78
|
+
if (!(engineKey in existingEngines)) {
|
|
79
|
+
existingEngines[engineKey] = freshEngines[engineKey];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { config: merged, action };
|
|
85
|
+
}
|
|
86
|
+
/** Read the daemon PID from .telora/daemon.pid. Returns null if missing or invalid. */
|
|
87
|
+
export function readPidFile(teloraDir) {
|
|
88
|
+
const pidPath = join(teloraDir, "daemon.pid");
|
|
89
|
+
try {
|
|
90
|
+
const raw = readFileSync(pidPath, "utf-8").trim();
|
|
91
|
+
const pid = parseInt(raw, 10);
|
|
92
|
+
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Check if a process is alive (signal 0 existence check). */
|
|
99
|
+
export function isProcessAlive(pid) {
|
|
100
|
+
try {
|
|
101
|
+
process.kill(pid, 0);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Stop the daemon gracefully: SIGTERM, poll for exit, SIGKILL fallback. */
|
|
109
|
+
export async function stopDaemon(teloraDir) {
|
|
110
|
+
const pid = readPidFile(teloraDir);
|
|
111
|
+
if (pid === null) {
|
|
112
|
+
return { stopped: false, message: "No PID file found" };
|
|
113
|
+
}
|
|
114
|
+
if (!isProcessAlive(pid)) {
|
|
115
|
+
return { stopped: false, pid, message: "Process not running" };
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
process.kill(pid, "SIGTERM");
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return { stopped: false, pid, message: "Failed to send SIGTERM" };
|
|
122
|
+
}
|
|
123
|
+
const deadline = Date.now() + 10_000;
|
|
124
|
+
while (Date.now() < deadline) {
|
|
125
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
126
|
+
if (!isProcessAlive(pid)) {
|
|
127
|
+
return { stopped: true, pid, message: "Stopped with SIGTERM" };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
process.kill(pid, "SIGKILL");
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
if (!isProcessAlive(pid)) {
|
|
135
|
+
return { stopped: true, pid, message: "Stopped with SIGTERM (late exit)" };
|
|
136
|
+
}
|
|
137
|
+
return { stopped: false, pid, message: "Failed to send SIGKILL" };
|
|
138
|
+
}
|
|
139
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
140
|
+
return { stopped: true, pid, message: "Stopped with SIGKILL" };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Spawn the telora-daemon as a detached background process.
|
|
144
|
+
* Resolution order: local dev build > project node_modules > npx.
|
|
145
|
+
*/
|
|
146
|
+
export async function startDaemon(paths, options = {}) {
|
|
147
|
+
mkdirSync(paths.teloraDir, { recursive: true });
|
|
148
|
+
const logPath = join(paths.teloraDir, "daemon.log");
|
|
149
|
+
const logFd = openSync(logPath, "a");
|
|
150
|
+
const configArgs = paths.useGlobal ? ["--config", paths.configPath] : [];
|
|
151
|
+
const localDevPath = join(process.cwd(), "packages/daemon/dist/index.js");
|
|
152
|
+
const nodeModulesPath = join(process.cwd(), "node_modules/.bin/telora-daemon");
|
|
153
|
+
let daemonCommand;
|
|
154
|
+
let daemonArgs;
|
|
155
|
+
let daemonSource;
|
|
156
|
+
if (existsSync(localDevPath)) {
|
|
157
|
+
daemonCommand = process.execPath;
|
|
158
|
+
daemonArgs = [localDevPath, "run", "--no-auto-update", ...configArgs];
|
|
159
|
+
daemonSource = "local";
|
|
160
|
+
}
|
|
161
|
+
else if (existsSync(nodeModulesPath)) {
|
|
162
|
+
daemonCommand = nodeModulesPath;
|
|
163
|
+
daemonArgs = ["run", "--no-auto-update", ...configArgs];
|
|
164
|
+
daemonSource = "node_modules";
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
let resolvedDaemonPath = null;
|
|
168
|
+
try {
|
|
169
|
+
resolvedDaemonPath = execFileSync("npx", ["-y", "-p", "@telora/daemon@latest", "which", "telora-daemon"], { encoding: "utf-8", timeout: 30_000 }).trim() || null;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// npx not available or package can't be resolved
|
|
173
|
+
}
|
|
174
|
+
if (!resolvedDaemonPath) {
|
|
175
|
+
return {
|
|
176
|
+
status: "binary_not_found",
|
|
177
|
+
logPath,
|
|
178
|
+
errorMessage: "Could not locate telora-daemon. Install it as a dev dependency:\n" +
|
|
179
|
+
" npm install --save-dev @telora/daemon\nThen try again.",
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
daemonCommand = resolvedDaemonPath;
|
|
183
|
+
daemonArgs = ["run", "--no-auto-update", ...configArgs];
|
|
184
|
+
daemonSource = "npx";
|
|
185
|
+
}
|
|
186
|
+
const daemonProcess = spawn(daemonCommand, daemonArgs, {
|
|
187
|
+
detached: true,
|
|
188
|
+
stdio: ["ignore", logFd, logFd],
|
|
189
|
+
env: { ...process.env, ...(options.extraEnv ?? {}) },
|
|
190
|
+
cwd: process.cwd(),
|
|
191
|
+
});
|
|
192
|
+
const pid = daemonProcess.pid;
|
|
193
|
+
daemonProcess.unref();
|
|
194
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
195
|
+
let alive = false;
|
|
196
|
+
try {
|
|
197
|
+
process.kill(pid, 0);
|
|
198
|
+
alive = true;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// ESRCH = no such process
|
|
202
|
+
}
|
|
203
|
+
if (!alive) {
|
|
204
|
+
let logTail = "";
|
|
205
|
+
try {
|
|
206
|
+
const logContent = readFileSync(logPath, "utf-8");
|
|
207
|
+
const lines = logContent.trim().split("\n");
|
|
208
|
+
logTail = lines.slice(-30).join("\n");
|
|
209
|
+
}
|
|
210
|
+
catch { /* ignore */ }
|
|
211
|
+
return { status: "exit_failed", pid, logPath, daemonSource, logTail };
|
|
212
|
+
}
|
|
213
|
+
return { status: "started", pid, logPath, daemonSource };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Register a newly created product in the daemon config and restart the daemon
|
|
217
|
+
* if it is running. Used by telora_product create.
|
|
218
|
+
*
|
|
219
|
+
* Behavior:
|
|
220
|
+
* - If no daemon config exists, skip (caller is expected to call telora_connector_start).
|
|
221
|
+
* - If repoPath is already used by another product entry, skip (one repo cannot
|
|
222
|
+
* back two products in the same daemon).
|
|
223
|
+
* - Otherwise upsert the product entry, write the config, and if the daemon is
|
|
224
|
+
* running, stop+start it so the new product is picked up immediately.
|
|
225
|
+
*/
|
|
226
|
+
export async function addProductToDaemonConfig(productId, repoPath) {
|
|
227
|
+
const paths = resolveDaemonPaths(repoPath);
|
|
228
|
+
if (!existsSync(paths.configPath)) {
|
|
229
|
+
return { written: false, restarted: false, skippedReason: "no_config" };
|
|
230
|
+
}
|
|
231
|
+
let existing;
|
|
232
|
+
try {
|
|
233
|
+
existing = JSON.parse(readFileSync(paths.configPath, "utf-8"));
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// Corrupt config: don't silently overwrite. Skip and let caller decide.
|
|
237
|
+
return { written: false, restarted: false, skippedReason: "no_config" };
|
|
238
|
+
}
|
|
239
|
+
// Detect repoPath collision with any existing product entry (excluding the
|
|
240
|
+
// product we are about to add, in case it was already registered).
|
|
241
|
+
const existingProducts = Array.isArray(existing.products)
|
|
242
|
+
? existing.products
|
|
243
|
+
: (typeof existing.productId === "string" && existing.productId)
|
|
244
|
+
? [{ id: existing.productId, repoPath: typeof existing.repoPath === "string" ? existing.repoPath : "" }]
|
|
245
|
+
: [];
|
|
246
|
+
const collision = existingProducts.find((p) => p.id !== productId && p.repoPath === repoPath);
|
|
247
|
+
if (collision) {
|
|
248
|
+
return {
|
|
249
|
+
written: false,
|
|
250
|
+
restarted: false,
|
|
251
|
+
skippedReason: "repo_path_in_use",
|
|
252
|
+
configPath: paths.configPath,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const freshProduct = { id: productId, repoPath };
|
|
256
|
+
const { config, action } = mergeConfig(existing, freshProduct, {});
|
|
257
|
+
writeFileSync(paths.configPath, JSON.stringify(config, null, 2) + "\n", { mode: 0o600 });
|
|
258
|
+
// Restart only if a daemon is currently alive.
|
|
259
|
+
const livePid = (() => {
|
|
260
|
+
const g = readPidFile(paths.globalDir);
|
|
261
|
+
if (g && isProcessAlive(g))
|
|
262
|
+
return g;
|
|
263
|
+
const l = readPidFile(paths.localDir);
|
|
264
|
+
if (l && isProcessAlive(l))
|
|
265
|
+
return l;
|
|
266
|
+
return null;
|
|
267
|
+
})();
|
|
268
|
+
if (livePid === null) {
|
|
269
|
+
return {
|
|
270
|
+
written: true,
|
|
271
|
+
configAction: action,
|
|
272
|
+
configPath: paths.configPath,
|
|
273
|
+
restarted: false,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
let stopResult = await stopDaemon(paths.globalDir);
|
|
277
|
+
if (!stopResult.stopped) {
|
|
278
|
+
stopResult = await stopDaemon(paths.localDir);
|
|
279
|
+
}
|
|
280
|
+
const previousPid = stopResult.stopped ? stopResult.pid : livePid;
|
|
281
|
+
const startResult = await startDaemon(paths);
|
|
282
|
+
if (startResult.status !== "started") {
|
|
283
|
+
return {
|
|
284
|
+
written: true,
|
|
285
|
+
configAction: action,
|
|
286
|
+
configPath: paths.configPath,
|
|
287
|
+
restarted: false,
|
|
288
|
+
previousPid,
|
|
289
|
+
startError: startResult.errorMessage
|
|
290
|
+
?? (startResult.logTail ? `Daemon exited immediately. Log tail:\n${startResult.logTail}` : "Daemon failed to start"),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
written: true,
|
|
295
|
+
configAction: action,
|
|
296
|
+
configPath: paths.configPath,
|
|
297
|
+
restarted: true,
|
|
298
|
+
newPid: startResult.pid,
|
|
299
|
+
previousPid,
|
|
300
|
+
daemonSource: startResult.daemonSource,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=daemonConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemonConfig.js","sourceRoot":"","sources":["../../src/handlers/daemonConfig.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,kEAAkE;AAClE,uEAAuE;AACvE,mEAAmE;AACnE,8EAA8E;AAE9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,qFAAqF;AACrF,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,CAAU,CAAC;AAe5E,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO;QACL,SAAS;QACT,UAAU;QACV,QAAQ;QACR,SAAS;QACT,SAAS;QACT,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC9C,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;KAC5C,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACzB,QAAiC,EACjC,YAA0B,EAC1B,KAA8B;IAE9B,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAE/B,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,GAAmB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3D,CAAC,CAAE,MAAM,CAAC,QAA2B;QACrC,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACtF,MAAM,cAAc,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC7F,QAAQ,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,SAAmB,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,MAAM,CAAC,SAAS,CAAC;IACxB,OAAO,MAAM,CAAC,QAAQ,CAAC;IAEvB,IAAI,MAAyC,CAAC;IAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;IAChE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ,EAAE,CAAC;YACrD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;YACtE,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,WAAW,CAAC;QACvB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAE3B,MAAM,YAAY,GAAG,KAAK,CAAC,OAA8C,CAAC;IAC1E,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,eAAe,GAAG,MAAM,CAAC,OAAkC,CAAC;YAClE,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,CAAC,SAAS,IAAI,eAAe,CAAC,EAAE,CAAC;oBACpC,eAAe,CAAC,SAAS,CAAC,GAAI,YAAwC,CAAC,SAAS,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAiB;IAChD,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IACrC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;AACjE,CAAC;AAWD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAkB,EAClB,UAAiD,EAAE;IAEnD,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAErC,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,+BAA+B,CAAC,CAAC;IAC1E,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAC;IAE/E,IAAI,aAAqB,CAAC;IAC1B,IAAI,UAAoB,CAAC;IACzB,IAAI,YAA8C,CAAC;IAEnD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,UAAU,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,UAAU,CAAC,CAAC;QACtE,YAAY,GAAG,OAAO,CAAC;IACzB,CAAC;SAAM,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACvC,aAAa,GAAG,eAAe,CAAC;QAChC,UAAU,GAAG,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,UAAU,CAAC,CAAC;QACxD,YAAY,GAAG,cAAc,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,IAAI,kBAAkB,GAAkB,IAAI,CAAC;QAC7C,IAAI,CAAC;YACH,kBAAkB,GAAG,YAAY,CAC/B,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,eAAe,CAAC,EACtE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CACvC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO;gBACL,MAAM,EAAE,kBAAkB;gBAC1B,OAAO;gBACP,YAAY,EAAE,mEAAmE;oBAC/E,0DAA0D;aAC7D,CAAC;QACJ,CAAC;QACD,aAAa,GAAG,kBAAkB,CAAC;QACnC,UAAU,GAAG,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,UAAU,CAAC,CAAC;QACxD,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,EAAE,UAAU,EAAE;QACrD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;QAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;QACpD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACnB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;IAC9B,aAAa,CAAC,KAAK,EAAE,CAAC;IAEtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAEhE,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAI,EAAE,CAAC,CAAC,CAAC;QACtB,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC3D,CAAC;AAgBD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,SAAiB,EACjB,QAAgB;IAEhB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;IAC1E,CAAC;IAED,IAAI,QAAiC,CAAC;IACtC,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAA4B,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;IAC1E,CAAC;IAED,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,gBAAgB,GAAmB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvE,CAAC,CAAE,QAAQ,CAAC,QAA2B;QACvC,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC;YAC9D,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,SAAmB,EAAE,QAAQ,EAAE,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAClH,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC9F,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,kBAAkB;YACjC,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAiB,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IACnE,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEzF,+CAA+C;IAC/C,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE;QACpB,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,UAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IAElE,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,KAAK;YAChB,WAAW;YACX,UAAU,EAAE,WAAW,CAAC,YAAY;mBAC/B,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,yCAAyC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC;SACvH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,WAAW,CAAC,GAAG;QACvB,WAAW;QACX,YAAY,EAAE,WAAW,CAAC,YAAY;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { callProductApi, successResult, validationError, buildFields, wrapHandler, compactEntity, } from "../shared.js";
|
|
7
|
+
import { addProductToDaemonConfig } from "./daemonConfig.js";
|
|
7
8
|
export function registerProductTools(server, getCreds, profile = 'full') {
|
|
8
9
|
server.tool("telora_product", "Product registry: manage the portfolio of software products. Each product scopes focuses, deliveries, issues, and context documents. " +
|
|
9
10
|
"Actions: list products, create a new product (name required), get product details (by name or id), " +
|
|
@@ -62,7 +63,40 @@ export function registerProductTools(server, getCreds, profile = 'full') {
|
|
|
62
63
|
action: "create",
|
|
63
64
|
fields,
|
|
64
65
|
});
|
|
65
|
-
|
|
66
|
+
// Register the new product in the local daemon config (cwd is the
|
|
67
|
+
// repoPath). Skipped if no daemon config exists or if cwd is already
|
|
68
|
+
// bound to another product. Restarts the daemon if it is running.
|
|
69
|
+
const productId = typeof result.product.id === "string" ? result.product.id : null;
|
|
70
|
+
let daemonRegistration;
|
|
71
|
+
if (productId) {
|
|
72
|
+
try {
|
|
73
|
+
const reg = await addProductToDaemonConfig(productId, process.cwd());
|
|
74
|
+
daemonRegistration = {
|
|
75
|
+
written: reg.written,
|
|
76
|
+
restarted: reg.restarted,
|
|
77
|
+
...(reg.configAction ? { configAction: reg.configAction } : {}),
|
|
78
|
+
...(reg.configPath ? { configPath: reg.configPath } : {}),
|
|
79
|
+
...(reg.skippedReason ? { skippedReason: reg.skippedReason } : {}),
|
|
80
|
+
...(reg.newPid ? { newPid: reg.newPid } : {}),
|
|
81
|
+
...(reg.previousPid ? { previousPid: reg.previousPid } : {}),
|
|
82
|
+
...(reg.daemonSource ? { daemonSource: reg.daemonSource } : {}),
|
|
83
|
+
...(reg.startError ? { startError: reg.startError } : {}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
// Don't fail the product creation if daemon registration errors.
|
|
88
|
+
daemonRegistration = {
|
|
89
|
+
written: false,
|
|
90
|
+
restarted: false,
|
|
91
|
+
error: e instanceof Error ? e.message : String(e),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const compact = compactEntity(result.product, Object.keys(fields), params.returnFull);
|
|
96
|
+
const response = { ...compact };
|
|
97
|
+
if (daemonRegistration)
|
|
98
|
+
response.daemon = daemonRegistration;
|
|
99
|
+
return successResult(response);
|
|
66
100
|
}
|
|
67
101
|
case "get": {
|
|
68
102
|
if (!params.name && !params.id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"productHandlers.js","sourceRoot":"","sources":["../../src/handlers/productHandlers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uCAAuC;AACvC,6DAA6D;AAC7D,8EAA8E;AAE9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,WAAW,EACX,WAAW,EACX,aAAa,GAGd,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"productHandlers.js","sourceRoot":"","sources":["../../src/handlers/productHandlers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { Project, type SourceFile } from 'ts-morph';
|
|
2
|
-
import type { ExtractedMember } from './types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Create a ts-morph Project configured for the given repo.
|
|
5
|
-
*/
|
|
6
|
-
export declare function createProject(repoRoot: string): Project;
|
|
7
|
-
/**
|
|
8
|
-
* Extract public API members from a source file.
|
|
9
|
-
*/
|
|
10
|
-
export declare function extractMembers(sourceFile: SourceFile): ExtractedMember[];
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
// AST-based extraction of component members using ts-morph.
|
|
2
|
-
import { Project, SyntaxKind, } from 'ts-morph';
|
|
3
|
-
/**
|
|
4
|
-
* Create a ts-morph Project configured for the given repo.
|
|
5
|
-
*/
|
|
6
|
-
export function createProject(repoRoot) {
|
|
7
|
-
const project = new Project({
|
|
8
|
-
tsConfigFilePath: `${repoRoot}/tsconfig.json`,
|
|
9
|
-
skipAddingFilesFromTsConfig: true,
|
|
10
|
-
skipFileDependencyResolution: true,
|
|
11
|
-
});
|
|
12
|
-
return project;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Extract public API members from a source file.
|
|
16
|
-
*/
|
|
17
|
-
export function extractMembers(sourceFile) {
|
|
18
|
-
const members = [];
|
|
19
|
-
// Extract exported functions
|
|
20
|
-
for (const fn of sourceFile.getFunctions()) {
|
|
21
|
-
if (!fn.isExported())
|
|
22
|
-
continue;
|
|
23
|
-
const name = fn.getName();
|
|
24
|
-
if (!name)
|
|
25
|
-
continue;
|
|
26
|
-
const memberType = detectFunctionMemberType(name, fn);
|
|
27
|
-
members.push({
|
|
28
|
-
memberType,
|
|
29
|
-
name,
|
|
30
|
-
signature: getSignatureText(fn),
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
// Extract exported variable declarations (arrow functions, consts)
|
|
34
|
-
for (const varStmt of sourceFile.getVariableStatements()) {
|
|
35
|
-
if (!varStmt.isExported())
|
|
36
|
-
continue;
|
|
37
|
-
for (const decl of varStmt.getDeclarations()) {
|
|
38
|
-
const name = decl.getName();
|
|
39
|
-
const initializer = decl.getInitializer();
|
|
40
|
-
if (initializer) {
|
|
41
|
-
const kind = initializer.getKind();
|
|
42
|
-
if (kind === SyntaxKind.ArrowFunction || kind === SyntaxKind.FunctionExpression) {
|
|
43
|
-
const memberType = detectFunctionMemberType(name, decl);
|
|
44
|
-
members.push({
|
|
45
|
-
memberType,
|
|
46
|
-
name,
|
|
47
|
-
signature: getVarSignature(decl),
|
|
48
|
-
});
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// Regular exported const
|
|
53
|
-
members.push({
|
|
54
|
-
memberType: 'export_const',
|
|
55
|
-
name,
|
|
56
|
-
signature: getVarSignature(decl),
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// Extract exported interfaces
|
|
61
|
-
for (const iface of sourceFile.getInterfaces()) {
|
|
62
|
-
if (!iface.isExported())
|
|
63
|
-
continue;
|
|
64
|
-
members.push({
|
|
65
|
-
memberType: 'export_type',
|
|
66
|
-
name: iface.getName(),
|
|
67
|
-
signature: `interface ${iface.getName()}`,
|
|
68
|
-
});
|
|
69
|
-
// If this looks like a Props interface, extract individual props
|
|
70
|
-
if (iface.getName().endsWith('Props') || iface.getName().endsWith('Properties')) {
|
|
71
|
-
extractPropsFromInterface(iface, members);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// Extract exported type aliases
|
|
75
|
-
for (const typeAlias of sourceFile.getTypeAliases()) {
|
|
76
|
-
if (!typeAlias.isExported())
|
|
77
|
-
continue;
|
|
78
|
-
members.push({
|
|
79
|
-
memberType: 'export_type',
|
|
80
|
-
name: typeAlias.getName(),
|
|
81
|
-
signature: getTypeAliasSignature(typeAlias),
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
// Extract exported enums
|
|
85
|
-
for (const enumDecl of sourceFile.getEnums()) {
|
|
86
|
-
if (!enumDecl.isExported())
|
|
87
|
-
continue;
|
|
88
|
-
members.push({
|
|
89
|
-
memberType: 'export_type',
|
|
90
|
-
name: enumDecl.getName(),
|
|
91
|
-
signature: `enum ${enumDecl.getName()}`,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
return members;
|
|
95
|
-
}
|
|
96
|
-
function detectFunctionMemberType(name, _node) {
|
|
97
|
-
// Hook detection
|
|
98
|
-
if (name.startsWith('use') && name.length > 3 && name[3] === name[3].toUpperCase()) {
|
|
99
|
-
return 'hook_return';
|
|
100
|
-
}
|
|
101
|
-
return 'export_function';
|
|
102
|
-
}
|
|
103
|
-
function getSignatureText(fn) {
|
|
104
|
-
const params = fn.getParameters().map(p => {
|
|
105
|
-
const name = p.getName();
|
|
106
|
-
const type = p.getTypeNode()?.getText() ?? 'unknown';
|
|
107
|
-
const optional = p.isOptional() ? '?' : '';
|
|
108
|
-
return `${name}${optional}: ${type}`;
|
|
109
|
-
});
|
|
110
|
-
const returnType = fn.getReturnTypeNode()?.getText() ?? 'unknown';
|
|
111
|
-
return `(${params.join(', ')}) => ${returnType}`;
|
|
112
|
-
}
|
|
113
|
-
function getVarSignature(decl) {
|
|
114
|
-
const typeNode = decl.getTypeNode();
|
|
115
|
-
if (typeNode)
|
|
116
|
-
return typeNode.getText();
|
|
117
|
-
// Try to infer from initializer
|
|
118
|
-
try {
|
|
119
|
-
const type = decl.getType();
|
|
120
|
-
const text = type.getText(decl);
|
|
121
|
-
// Truncate long types
|
|
122
|
-
if (text.length > 200)
|
|
123
|
-
return text.substring(0, 197) + '...';
|
|
124
|
-
return text;
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
return 'unknown';
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
function getTypeAliasSignature(typeAlias) {
|
|
131
|
-
const typeNode = typeAlias.getTypeNode();
|
|
132
|
-
if (!typeNode)
|
|
133
|
-
return `type ${typeAlias.getName()}`;
|
|
134
|
-
const text = typeNode.getText();
|
|
135
|
-
if (text.length > 200)
|
|
136
|
-
return `type ${typeAlias.getName()} = ${text.substring(0, 150)}...`;
|
|
137
|
-
return `type ${typeAlias.getName()} = ${text}`;
|
|
138
|
-
}
|
|
139
|
-
function extractPropsFromInterface(iface, members) {
|
|
140
|
-
for (const prop of iface.getProperties()) {
|
|
141
|
-
extractPropMember(prop, members);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
function extractPropMember(prop, members) {
|
|
145
|
-
const name = prop.getName();
|
|
146
|
-
const typeNode = prop.getTypeNode();
|
|
147
|
-
const signature = typeNode ? typeNode.getText() : 'unknown';
|
|
148
|
-
const required = !prop.hasQuestionToken();
|
|
149
|
-
members.push({
|
|
150
|
-
memberType: 'prop',
|
|
151
|
-
name,
|
|
152
|
-
signature,
|
|
153
|
-
required,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=ast-extraction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ast-extraction.js","sourceRoot":"","sources":["../../src/scanner/ast-extraction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { ComponentType, DiscoveredFile } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Classify a directory component type based on its path.
|
|
4
|
-
*/
|
|
5
|
-
export declare function classifyDirectory(relPath: string): ComponentType;
|
|
6
|
-
/**
|
|
7
|
-
* Walk the source tree and discover all TypeScript/JavaScript files.
|
|
8
|
-
*/
|
|
9
|
-
export declare function discoverFiles(repoRoot: string, sourceRoot: string): DiscoveredFile[];
|