@jamesaphoenix/tx-cli 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/cli-exit.d.ts +15 -0
  2. package/dist/cli-exit.d.ts.map +1 -0
  3. package/dist/cli-exit.js +18 -0
  4. package/dist/cli-exit.js.map +1 -0
  5. package/dist/cli.d.ts +8 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +349 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/attempt.d.ts +9 -0
  10. package/dist/commands/attempt.d.ts.map +1 -0
  11. package/dist/commands/attempt.js +93 -0
  12. package/dist/commands/attempt.js.map +1 -0
  13. package/dist/commands/bulk.d.ts +8 -0
  14. package/dist/commands/bulk.d.ts.map +1 -0
  15. package/dist/commands/bulk.js +168 -0
  16. package/dist/commands/bulk.js.map +1 -0
  17. package/dist/commands/claim.d.ts +39 -0
  18. package/dist/commands/claim.d.ts.map +1 -0
  19. package/dist/commands/claim.js +96 -0
  20. package/dist/commands/claim.js.map +1 -0
  21. package/dist/commands/compact.d.ts +17 -0
  22. package/dist/commands/compact.d.ts.map +1 -0
  23. package/dist/commands/compact.js +167 -0
  24. package/dist/commands/compact.js.map +1 -0
  25. package/dist/commands/coordinator.d.ts +12 -0
  26. package/dist/commands/coordinator.d.ts.map +1 -0
  27. package/dist/commands/coordinator.js +124 -0
  28. package/dist/commands/coordinator.js.map +1 -0
  29. package/dist/commands/cycle.d.ts +12 -0
  30. package/dist/commands/cycle.d.ts.map +1 -0
  31. package/dist/commands/cycle.js +109 -0
  32. package/dist/commands/cycle.js.map +1 -0
  33. package/dist/commands/daemon.d.ts +16 -0
  34. package/dist/commands/daemon.d.ts.map +1 -0
  35. package/dist/commands/daemon.js +635 -0
  36. package/dist/commands/daemon.js.map +1 -0
  37. package/dist/commands/dashboard.d.ts +12 -0
  38. package/dist/commands/dashboard.d.ts.map +1 -0
  39. package/dist/commands/dashboard.js +105 -0
  40. package/dist/commands/dashboard.js.map +1 -0
  41. package/dist/commands/dashboard.test.d.ts +2 -0
  42. package/dist/commands/dashboard.test.d.ts.map +1 -0
  43. package/dist/commands/dashboard.test.js +99 -0
  44. package/dist/commands/dashboard.test.js.map +1 -0
  45. package/dist/commands/dep.d.ts +9 -0
  46. package/dist/commands/dep.d.ts.map +1 -0
  47. package/dist/commands/dep.js +50 -0
  48. package/dist/commands/dep.js.map +1 -0
  49. package/dist/commands/doc.d.ts +10 -0
  50. package/dist/commands/doc.d.ts.map +1 -0
  51. package/dist/commands/doc.js +397 -0
  52. package/dist/commands/doc.js.map +1 -0
  53. package/dist/commands/doctor.d.ts +9 -0
  54. package/dist/commands/doctor.d.ts.map +1 -0
  55. package/dist/commands/doctor.js +168 -0
  56. package/dist/commands/doctor.js.map +1 -0
  57. package/dist/commands/graph.d.ts +58 -0
  58. package/dist/commands/graph.d.ts.map +1 -0
  59. package/dist/commands/graph.js +441 -0
  60. package/dist/commands/graph.js.map +1 -0
  61. package/dist/commands/hierarchy.d.ts +9 -0
  62. package/dist/commands/hierarchy.d.ts.map +1 -0
  63. package/dist/commands/hierarchy.js +68 -0
  64. package/dist/commands/hierarchy.js.map +1 -0
  65. package/dist/commands/hooks.d.ts +56 -0
  66. package/dist/commands/hooks.d.ts.map +1 -0
  67. package/dist/commands/hooks.js +365 -0
  68. package/dist/commands/hooks.js.map +1 -0
  69. package/dist/commands/invariant.d.ts +9 -0
  70. package/dist/commands/invariant.d.ts.map +1 -0
  71. package/dist/commands/invariant.js +126 -0
  72. package/dist/commands/invariant.js.map +1 -0
  73. package/dist/commands/learning.d.ts +16 -0
  74. package/dist/commands/learning.d.ts.map +1 -0
  75. package/dist/commands/learning.js +362 -0
  76. package/dist/commands/learning.js.map +1 -0
  77. package/dist/commands/migrate.d.ts +9 -0
  78. package/dist/commands/migrate.d.ts.map +1 -0
  79. package/dist/commands/migrate.js +56 -0
  80. package/dist/commands/migrate.js.map +1 -0
  81. package/dist/commands/orchestrator.d.ts +11 -0
  82. package/dist/commands/orchestrator.d.ts.map +1 -0
  83. package/dist/commands/orchestrator.js +129 -0
  84. package/dist/commands/orchestrator.js.map +1 -0
  85. package/dist/commands/stats.d.ts +8 -0
  86. package/dist/commands/stats.d.ts.map +1 -0
  87. package/dist/commands/stats.js +128 -0
  88. package/dist/commands/stats.js.map +1 -0
  89. package/dist/commands/sync-platform.d.ts +12 -0
  90. package/dist/commands/sync-platform.d.ts.map +1 -0
  91. package/dist/commands/sync-platform.js +74 -0
  92. package/dist/commands/sync-platform.js.map +1 -0
  93. package/dist/commands/sync.d.ts +8 -0
  94. package/dist/commands/sync.d.ts.map +1 -0
  95. package/dist/commands/sync.js +128 -0
  96. package/dist/commands/sync.js.map +1 -0
  97. package/dist/commands/task.d.ts +15 -0
  98. package/dist/commands/task.d.ts.map +1 -0
  99. package/dist/commands/task.js +233 -0
  100. package/dist/commands/task.js.map +1 -0
  101. package/dist/commands/test.d.ts +16 -0
  102. package/dist/commands/test.d.ts.map +1 -0
  103. package/dist/commands/test.js +112 -0
  104. package/dist/commands/test.js.map +1 -0
  105. package/dist/commands/trace.d.ts +39 -0
  106. package/dist/commands/trace.d.ts.map +1 -0
  107. package/dist/commands/trace.js +620 -0
  108. package/dist/commands/trace.js.map +1 -0
  109. package/dist/commands/validate.d.ts +9 -0
  110. package/dist/commands/validate.d.ts.map +1 -0
  111. package/dist/commands/validate.js +94 -0
  112. package/dist/commands/validate.js.map +1 -0
  113. package/dist/commands/worker.d.ts +10 -0
  114. package/dist/commands/worker.d.ts.map +1 -0
  115. package/dist/commands/worker.js +204 -0
  116. package/dist/commands/worker.js.map +1 -0
  117. package/dist/help.d.ts +3 -0
  118. package/dist/help.d.ts.map +1 -0
  119. package/dist/help.js +1366 -0
  120. package/dist/help.js.map +1 -0
  121. package/dist/output.d.ts +12 -0
  122. package/dist/output.d.ts.map +1 -0
  123. package/dist/output.js +76 -0
  124. package/dist/output.js.map +1 -0
  125. package/dist/tx +0 -0
  126. package/dist/utils/parse.d.ts +45 -0
  127. package/dist/utils/parse.d.ts.map +1 -0
  128. package/dist/utils/parse.js +79 -0
  129. package/dist/utils/parse.js.map +1 -0
  130. package/dist/utils/parse.test.d.ts +2 -0
  131. package/dist/utils/parse.test.d.ts.map +1 -0
  132. package/dist/utils/parse.test.js +140 -0
  133. package/dist/utils/parse.test.js.map +1 -0
  134. package/dist/version.d.ts +2 -0
  135. package/dist/version.d.ts.map +1 -0
  136. package/dist/version.js +10 -0
  137. package/dist/version.js.map +1 -0
  138. package/package.json +58 -0
@@ -0,0 +1,635 @@
1
+ /**
2
+ * Daemon commands: start, stop, status, process, review, promote, reject, track, untrack, list
3
+ */
4
+ import * as path from "node:path";
5
+ import * as fs from "node:fs";
6
+ import * as os from "node:os";
7
+ import { Effect } from "effect";
8
+ import { CandidateRepository, CandidateExtractorService, DaemonService, DeduplicationService, PromotionService, TrackedProjectRepository, matchesGlob } from "@jamesaphoenix/tx-core";
9
+ import { CANDIDATE_CONFIDENCES, SOURCE_TYPES } from "@jamesaphoenix/tx-types";
10
+ import { toJson } from "../output.js";
11
+ import { commandHelp } from "../help.js";
12
+ import { flag, opt, parseIntOpt } from "../utils/parse.js";
13
+ /**
14
+ * Format uptime in milliseconds to a human-readable string.
15
+ */
16
+ function formatUptime(ms) {
17
+ const seconds = Math.floor(ms / 1000);
18
+ const minutes = Math.floor(seconds / 60);
19
+ const hours = Math.floor(minutes / 60);
20
+ const days = Math.floor(hours / 24);
21
+ if (days > 0) {
22
+ return `${days}d ${hours % 24}h ${minutes % 60}m`;
23
+ }
24
+ else if (hours > 0) {
25
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
26
+ }
27
+ else if (minutes > 0) {
28
+ return `${minutes}m ${seconds % 60}s`;
29
+ }
30
+ else {
31
+ return `${seconds}s`;
32
+ }
33
+ }
34
+ /**
35
+ * Expand ~ to home directory in a path.
36
+ */
37
+ function expandTilde(filePath) {
38
+ if (filePath.startsWith("~")) {
39
+ return filePath.replace(/^~/, os.homedir());
40
+ }
41
+ return filePath;
42
+ }
43
+ /**
44
+ * Find all files matching a glob pattern.
45
+ */
46
+ function findFilesMatchingPattern(pattern) {
47
+ const expanded = expandTilde(pattern);
48
+ // Extract base directory (everything before first glob char)
49
+ const firstGlobIndex = expanded.search(/[*?[\]{}]/);
50
+ if (firstGlobIndex === -1) {
51
+ // No glob chars - treat as literal path
52
+ if (fs.existsSync(expanded) && fs.statSync(expanded).isFile()) {
53
+ return [expanded];
54
+ }
55
+ return [];
56
+ }
57
+ // Get base directory
58
+ const beforeGlob = expanded.slice(0, firstGlobIndex);
59
+ const lastSep = Math.max(beforeGlob.lastIndexOf("/"), beforeGlob.lastIndexOf(path.sep));
60
+ const baseDir = lastSep > 0 ? expanded.slice(0, lastSep) : ".";
61
+ if (!fs.existsSync(baseDir)) {
62
+ return [];
63
+ }
64
+ // Recursively find all files and filter by pattern
65
+ const allFiles = getAllFilesRecursive(baseDir);
66
+ return allFiles.filter(f => matchesGlob(f, expanded));
67
+ }
68
+ /**
69
+ * Recursively get all files in a directory.
70
+ */
71
+ function getAllFilesRecursive(dir) {
72
+ const results = [];
73
+ try {
74
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
75
+ for (const entry of entries) {
76
+ const fullPath = path.join(dir, entry.name);
77
+ if (entry.isDirectory()) {
78
+ // Skip hidden directories and node_modules
79
+ if (!entry.name.startsWith(".") && entry.name !== "node_modules") {
80
+ results.push(...getAllFilesRecursive(fullPath));
81
+ }
82
+ }
83
+ else if (entry.isFile()) {
84
+ results.push(fullPath);
85
+ }
86
+ }
87
+ }
88
+ catch {
89
+ // Ignore permission errors etc
90
+ }
91
+ return results;
92
+ }
93
+ /**
94
+ * Find all JSONL files in a directory (recursively).
95
+ */
96
+ function findJsonlFilesInDirectory(dir) {
97
+ const expanded = expandTilde(dir);
98
+ if (!fs.existsSync(expanded)) {
99
+ return [];
100
+ }
101
+ const allFiles = getAllFilesRecursive(expanded);
102
+ return allFiles.filter(f => f.endsWith(".jsonl"));
103
+ }
104
+ /**
105
+ * Read a JSONL file and return each line as a string.
106
+ * Skips empty lines.
107
+ */
108
+ function readJsonlFile(filePath) {
109
+ try {
110
+ const content = fs.readFileSync(filePath, "utf-8");
111
+ return content
112
+ .split("\n")
113
+ .map(line => line.trim())
114
+ .filter(line => line.length > 0);
115
+ }
116
+ catch {
117
+ return [];
118
+ }
119
+ }
120
+ export const daemon = (pos, flags) => Effect.gen(function* () {
121
+ const subcommand = pos[0];
122
+ if (!subcommand || subcommand === "help") {
123
+ console.log(commandHelp["daemon"]);
124
+ return;
125
+ }
126
+ // Check for --help on subcommand
127
+ if (flag(flags, "help", "h")) {
128
+ const helpKey = `daemon ${subcommand}`;
129
+ if (commandHelp[helpKey]) {
130
+ console.log(commandHelp[helpKey]);
131
+ return;
132
+ }
133
+ }
134
+ if (subcommand === "start") {
135
+ const daemonService = yield* DaemonService;
136
+ const result = yield* Effect.either(daemonService.start());
137
+ if (result._tag === "Left") {
138
+ const error = result.left;
139
+ if (error.code === "ALREADY_RUNNING") {
140
+ if (flag(flags, "json")) {
141
+ console.log(toJson({ error: "already_running", pid: error.pid }));
142
+ }
143
+ else {
144
+ console.error(`Daemon is already running with PID ${error.pid}`);
145
+ }
146
+ }
147
+ else {
148
+ if (flag(flags, "json")) {
149
+ console.log(toJson({ error: error.code, message: error.message }));
150
+ }
151
+ else {
152
+ console.error(`Failed to start daemon: ${error.message}`);
153
+ }
154
+ }
155
+ process.exit(1);
156
+ }
157
+ if (flag(flags, "json")) {
158
+ console.log(toJson({ started: true }));
159
+ }
160
+ else {
161
+ console.log("Daemon started");
162
+ }
163
+ }
164
+ else if (subcommand === "stop") {
165
+ const daemonService = yield* DaemonService;
166
+ const result = yield* Effect.either(daemonService.stop());
167
+ if (result._tag === "Left") {
168
+ const error = result.left;
169
+ if (flag(flags, "json")) {
170
+ console.log(toJson({ error: error.code, message: error.message }));
171
+ }
172
+ else {
173
+ console.error(`Failed to stop daemon: ${error.message}`);
174
+ }
175
+ process.exit(1);
176
+ }
177
+ if (flag(flags, "json")) {
178
+ console.log(toJson({ stopped: true }));
179
+ }
180
+ else {
181
+ console.log("Daemon stopped");
182
+ }
183
+ }
184
+ else if (subcommand === "status") {
185
+ const daemonService = yield* DaemonService;
186
+ const trackedProjectRepo = yield* TrackedProjectRepository;
187
+ const candidateRepo = yield* CandidateRepository;
188
+ const statusResult = yield* Effect.either(daemonService.status());
189
+ if (statusResult._tag === "Left") {
190
+ const error = statusResult.left;
191
+ if (flag(flags, "json")) {
192
+ console.log(toJson({ error: error.code, message: error.message }));
193
+ }
194
+ else {
195
+ console.error(`Failed to get daemon status: ${error.message}`);
196
+ }
197
+ process.exit(1);
198
+ }
199
+ const status = statusResult.right;
200
+ // Get tracked projects count
201
+ const projects = yield* trackedProjectRepo.findAll();
202
+ const trackedProjects = projects.length;
203
+ const enabledProjects = projects.filter(p => p.enabled).length;
204
+ // Get pending candidates count
205
+ const pendingCandidates = yield* candidateRepo.findByFilter({ status: "pending" });
206
+ const pendingCount = pendingCandidates.length;
207
+ if (flag(flags, "json")) {
208
+ console.log(toJson({
209
+ running: status.running,
210
+ pid: status.pid,
211
+ uptime: status.uptime,
212
+ startedAt: status.startedAt?.toISOString() ?? null,
213
+ trackedProjects,
214
+ enabledProjects,
215
+ pendingCandidates: pendingCount
216
+ }));
217
+ }
218
+ else {
219
+ if (status.running) {
220
+ console.log("Daemon: running");
221
+ console.log(` PID: ${status.pid}`);
222
+ if (status.uptime !== null) {
223
+ const uptimeStr = formatUptime(status.uptime);
224
+ console.log(` Uptime: ${uptimeStr}`);
225
+ }
226
+ }
227
+ else {
228
+ console.log("Daemon: stopped");
229
+ }
230
+ console.log(` Tracked projects: ${enabledProjects}/${trackedProjects}`);
231
+ console.log(` Pending candidates: ${pendingCount}`);
232
+ }
233
+ }
234
+ else if (subcommand === "process") {
235
+ // Process JSONL files to extract learning candidates
236
+ const candidateRepo = yield* CandidateRepository;
237
+ const extractorService = yield* CandidateExtractorService;
238
+ const dedupService = yield* DeduplicationService;
239
+ const trackedProjectRepo = yield* TrackedProjectRepository;
240
+ // Parse --path flag for glob pattern
241
+ const pathPattern = opt(flags, "path", "p");
242
+ // Find files to process
243
+ let filesToProcess = [];
244
+ if (pathPattern) {
245
+ // User specified a path pattern - expand it
246
+ filesToProcess = findFilesMatchingPattern(pathPattern);
247
+ }
248
+ else {
249
+ // Use tracked projects to find JSONL files
250
+ const projects = yield* trackedProjectRepo.findAll();
251
+ const enabledProjects = projects.filter(p => p.enabled);
252
+ if (enabledProjects.length === 0) {
253
+ if (flag(flags, "json")) {
254
+ console.log(toJson({ error: "no_tracked_projects", message: "No tracked projects found. Use 'tx daemon track <path>' to add one." }));
255
+ }
256
+ else {
257
+ console.error("No tracked projects found. Use 'tx daemon track <path>' to add one.");
258
+ console.error("Or specify a path pattern with --path <glob>");
259
+ }
260
+ process.exit(1);
261
+ }
262
+ // Find JSONL files in tracked projects
263
+ for (const project of enabledProjects) {
264
+ const projectFiles = findJsonlFilesInDirectory(project.projectPath);
265
+ filesToProcess.push(...projectFiles);
266
+ }
267
+ }
268
+ if (filesToProcess.length === 0) {
269
+ if (flag(flags, "json")) {
270
+ console.log(toJson({ filesProcessed: 0, candidatesExtracted: 0, message: "No JSONL files found" }));
271
+ }
272
+ else {
273
+ console.log("No JSONL files found to process");
274
+ }
275
+ return;
276
+ }
277
+ // Process each file
278
+ let totalFilesProcessed = 0;
279
+ let totalLinesProcessed = 0;
280
+ let totalNewLines = 0;
281
+ let totalCandidatesExtracted = 0;
282
+ const fileResults = [];
283
+ // Check if extractor is available
284
+ const extractorAvailable = yield* extractorService.isAvailable();
285
+ if (!extractorAvailable && !flag(flags, "json")) {
286
+ console.log("Note: LLM extraction not available (no API key configured)");
287
+ console.log("Processing will track files but not extract candidates");
288
+ }
289
+ for (const filePath of filesToProcess) {
290
+ // Read and parse the JSONL file
291
+ const lines = readJsonlFile(filePath);
292
+ if (lines.length === 0) {
293
+ continue;
294
+ }
295
+ // Prepare lines for deduplication
296
+ const lineInputs = lines.map((content, idx) => ({
297
+ content,
298
+ lineNumber: idx + 1
299
+ }));
300
+ // Process lines through deduplication
301
+ const dedupResult = yield* dedupService.processLines(lineInputs, filePath);
302
+ // Get the new lines that weren't already processed
303
+ const newLineContents = lineInputs
304
+ .filter(l => l.lineNumber > dedupResult.endLine - dedupResult.newLines)
305
+ .slice(-dedupResult.newLines)
306
+ .map(l => l.content);
307
+ let candidatesExtracted = 0;
308
+ // Extract candidates from new lines if extractor is available
309
+ if (extractorAvailable && newLineContents.length > 0) {
310
+ // Combine new lines into a transcript chunk for extraction
311
+ const combinedContent = newLineContents.join("\n");
312
+ const chunk = {
313
+ content: combinedContent,
314
+ sourceFile: filePath,
315
+ lineRange: {
316
+ start: dedupResult.startLine,
317
+ end: dedupResult.endLine
318
+ }
319
+ };
320
+ const extractionResult = yield* Effect.either(extractorService.extract(chunk));
321
+ if (extractionResult._tag === "Right" && extractionResult.right.wasExtracted) {
322
+ // Store extracted candidates
323
+ for (const candidate of extractionResult.right.candidates) {
324
+ yield* candidateRepo.insert({
325
+ content: candidate.content,
326
+ confidence: candidate.confidence,
327
+ category: candidate.category,
328
+ sourceFile: filePath
329
+ });
330
+ candidatesExtracted++;
331
+ }
332
+ }
333
+ }
334
+ totalFilesProcessed++;
335
+ totalLinesProcessed += lines.length;
336
+ totalNewLines += dedupResult.newLines;
337
+ totalCandidatesExtracted += candidatesExtracted;
338
+ fileResults.push({
339
+ file: filePath,
340
+ linesProcessed: lines.length,
341
+ newLines: dedupResult.newLines,
342
+ candidatesExtracted
343
+ });
344
+ }
345
+ // Output results
346
+ if (flag(flags, "json")) {
347
+ console.log(toJson({
348
+ filesProcessed: totalFilesProcessed,
349
+ linesProcessed: totalLinesProcessed,
350
+ newLines: totalNewLines,
351
+ candidatesExtracted: totalCandidatesExtracted,
352
+ files: fileResults
353
+ }));
354
+ }
355
+ else {
356
+ console.log(`Processed ${totalFilesProcessed} file(s)`);
357
+ console.log(` Lines processed: ${totalLinesProcessed}`);
358
+ console.log(` New lines: ${totalNewLines}`);
359
+ console.log(` Candidates extracted: ${totalCandidatesExtracted}`);
360
+ if (fileResults.length > 0 && fileResults.some(f => f.newLines > 0)) {
361
+ console.log("\nFiles with new content:");
362
+ for (const f of fileResults.filter(f => f.newLines > 0)) {
363
+ console.log(` ${f.file}: ${f.newLines} new lines, ${f.candidatesExtracted} candidates`);
364
+ }
365
+ }
366
+ }
367
+ }
368
+ else if (subcommand === "review") {
369
+ // List pending learning candidates awaiting promotion
370
+ const repo = yield* CandidateRepository;
371
+ // Parse --confidence flag (comma-separated list)
372
+ const confidenceOpt = opt(flags, "confidence", "c");
373
+ let confidences;
374
+ if (confidenceOpt) {
375
+ const parts = confidenceOpt.split(",").map(s => s.trim());
376
+ const invalid = parts.filter(p => !CANDIDATE_CONFIDENCES.includes(p));
377
+ if (invalid.length > 0) {
378
+ console.error(`Invalid confidence level(s): ${invalid.join(", ")}`);
379
+ console.error(`Valid levels: ${CANDIDATE_CONFIDENCES.join(", ")}`);
380
+ process.exit(1);
381
+ }
382
+ confidences = parts;
383
+ }
384
+ // Parse --limit flag
385
+ const limit = parseIntOpt(flags, "limit", "limit", "l");
386
+ if (limit !== undefined && limit <= 0) {
387
+ console.error(`Invalid limit: ${limit}`);
388
+ process.exit(1);
389
+ }
390
+ // Query pending candidates
391
+ const candidates = yield* repo.findByFilter({
392
+ status: "pending",
393
+ confidence: confidences,
394
+ limit
395
+ });
396
+ if (flag(flags, "json")) {
397
+ console.log(toJson(candidates.map(c => ({
398
+ id: c.id,
399
+ confidence: c.confidence,
400
+ category: c.category,
401
+ content: c.content,
402
+ sourceFile: c.sourceFile,
403
+ extractedAt: c.extractedAt.toISOString()
404
+ }))));
405
+ }
406
+ else {
407
+ if (candidates.length === 0) {
408
+ console.log("No pending candidates");
409
+ }
410
+ else {
411
+ console.log(`Pending candidates (${candidates.length}):`);
412
+ for (const c of candidates) {
413
+ // Truncate content for preview (first 60 chars)
414
+ const preview = c.content.length > 60
415
+ ? c.content.slice(0, 60) + "..."
416
+ : c.content;
417
+ console.log(` [${c.id}] ${c.confidence} - ${preview}`);
418
+ console.log(` Source: ${c.sourceFile}`);
419
+ }
420
+ }
421
+ }
422
+ }
423
+ else if (subcommand === "promote") {
424
+ const candidateIdStr = pos[1];
425
+ if (!candidateIdStr) {
426
+ console.error("Usage: tx daemon promote <candidate-id>");
427
+ process.exit(1);
428
+ }
429
+ const candidateId = parseInt(candidateIdStr, 10);
430
+ if (isNaN(candidateId)) {
431
+ console.error(`Invalid candidate ID: ${candidateIdStr}`);
432
+ process.exit(1);
433
+ }
434
+ const promotionService = yield* PromotionService;
435
+ const result = yield* Effect.either(promotionService.promote(candidateId));
436
+ if (result._tag === "Left") {
437
+ const error = result.left;
438
+ if (error._tag === "CandidateNotFoundError") {
439
+ if (flag(flags, "json")) {
440
+ console.log(toJson({ error: "not_found", candidateId }));
441
+ }
442
+ else {
443
+ console.error(`Candidate not found: ${candidateId}`);
444
+ }
445
+ }
446
+ else {
447
+ if (flag(flags, "json")) {
448
+ console.log(toJson({ error: "database_error", message: error.message }));
449
+ }
450
+ else {
451
+ console.error(`Database error: ${error.message}`);
452
+ }
453
+ }
454
+ process.exit(1);
455
+ }
456
+ const { candidate, learning } = result.right;
457
+ if (flag(flags, "json")) {
458
+ console.log(toJson({
459
+ promoted: true,
460
+ candidateId: candidate.id,
461
+ learningId: learning.id
462
+ }));
463
+ }
464
+ else {
465
+ console.log(`Promoted candidate ${candidate.id} to learning ${learning.id}`);
466
+ }
467
+ }
468
+ else if (subcommand === "reject") {
469
+ const candidateIdStr = pos[1];
470
+ if (!candidateIdStr) {
471
+ console.error("Usage: tx daemon reject <candidate-id> --reason <reason>");
472
+ process.exit(1);
473
+ }
474
+ const candidateId = parseInt(candidateIdStr, 10);
475
+ if (isNaN(candidateId)) {
476
+ console.error(`Invalid candidate ID: ${candidateIdStr}`);
477
+ process.exit(1);
478
+ }
479
+ const reason = opt(flags, "reason", "r");
480
+ if (!reason) {
481
+ console.error("Usage: tx daemon reject <candidate-id> --reason <reason>");
482
+ console.error("The --reason flag is required");
483
+ process.exit(1);
484
+ }
485
+ const promotionService = yield* PromotionService;
486
+ const result = yield* Effect.either(promotionService.reject(candidateId, reason));
487
+ if (result._tag === "Left") {
488
+ const error = result.left;
489
+ if (error._tag === "CandidateNotFoundError") {
490
+ if (flag(flags, "json")) {
491
+ console.log(toJson({ error: "not_found", candidateId }));
492
+ }
493
+ else {
494
+ console.error(`Candidate not found: ${candidateId}`);
495
+ }
496
+ }
497
+ else if (error._tag === "ValidationError") {
498
+ if (flag(flags, "json")) {
499
+ console.log(toJson({ error: "validation_error", message: error.reason }));
500
+ }
501
+ else {
502
+ console.error(`Validation error: ${error.reason}`);
503
+ }
504
+ }
505
+ else {
506
+ if (flag(flags, "json")) {
507
+ console.log(toJson({ error: "database_error", message: error.message }));
508
+ }
509
+ else {
510
+ console.error(`Database error: ${error.message}`);
511
+ }
512
+ }
513
+ process.exit(1);
514
+ }
515
+ const candidate = result.right;
516
+ if (flag(flags, "json")) {
517
+ console.log(toJson({
518
+ rejected: true,
519
+ candidateId: candidate.id,
520
+ reason: candidate.rejectionReason
521
+ }));
522
+ }
523
+ else {
524
+ console.log(`Rejected candidate ${candidate.id}`);
525
+ console.log(` Reason: ${candidate.rejectionReason}`);
526
+ }
527
+ }
528
+ else if (subcommand === "track") {
529
+ const projectPath = pos[1];
530
+ if (!projectPath) {
531
+ console.error("Usage: tx daemon track <project-path> [--source claude|cursor|windsurf|other]");
532
+ process.exit(1);
533
+ }
534
+ const repo = yield* TrackedProjectRepository;
535
+ const absolutePath = path.resolve(projectPath);
536
+ // Validate source type if provided
537
+ const sourceOpt = opt(flags, "source", "s");
538
+ let sourceType = "claude";
539
+ if (sourceOpt) {
540
+ if (!SOURCE_TYPES.includes(sourceOpt)) {
541
+ console.error(`Invalid source type: ${sourceOpt}`);
542
+ console.error(`Valid types: ${SOURCE_TYPES.join(", ")}`);
543
+ process.exit(1);
544
+ }
545
+ sourceType = sourceOpt;
546
+ }
547
+ // Check if already tracked
548
+ const existing = yield* repo.findByPath(absolutePath);
549
+ if (existing) {
550
+ if (flag(flags, "json")) {
551
+ console.log(toJson({ error: "already_tracked", path: absolutePath }));
552
+ }
553
+ else {
554
+ console.error(`Project already tracked: ${absolutePath}`);
555
+ }
556
+ process.exit(1);
557
+ }
558
+ const tracked = yield* repo.insert({
559
+ projectPath: absolutePath,
560
+ sourceType
561
+ });
562
+ if (flag(flags, "json")) {
563
+ console.log(toJson(tracked));
564
+ }
565
+ else {
566
+ console.log(`Tracking project: ${tracked.projectPath}`);
567
+ console.log(` Source: ${tracked.sourceType}`);
568
+ console.log(` Enabled: ${tracked.enabled ? "yes" : "no"}`);
569
+ }
570
+ }
571
+ else if (subcommand === "untrack") {
572
+ const projectPath = pos[1];
573
+ if (!projectPath) {
574
+ console.error("Usage: tx daemon untrack <project-path>");
575
+ process.exit(1);
576
+ }
577
+ const repo = yield* TrackedProjectRepository;
578
+ const absolutePath = path.resolve(projectPath);
579
+ // Find the tracked project
580
+ const existing = yield* repo.findByPath(absolutePath);
581
+ if (!existing) {
582
+ if (flag(flags, "json")) {
583
+ console.log(toJson({ error: "not_tracked", path: absolutePath }));
584
+ }
585
+ else {
586
+ console.error(`Project not tracked: ${absolutePath}`);
587
+ }
588
+ process.exit(1);
589
+ }
590
+ const deleted = yield* repo.delete(existing.id);
591
+ if (deleted) {
592
+ if (flag(flags, "json")) {
593
+ console.log(toJson({ untracked: absolutePath }));
594
+ }
595
+ else {
596
+ console.log(`Untracked project: ${absolutePath}`);
597
+ }
598
+ }
599
+ else {
600
+ if (flag(flags, "json")) {
601
+ console.log(toJson({ error: "delete_failed", path: absolutePath }));
602
+ }
603
+ else {
604
+ console.error(`Failed to untrack project: ${absolutePath}`);
605
+ }
606
+ process.exit(1);
607
+ }
608
+ }
609
+ else if (subcommand === "list") {
610
+ const repo = yield* TrackedProjectRepository;
611
+ const projects = yield* repo.findAll();
612
+ if (flag(flags, "json")) {
613
+ console.log(toJson(projects));
614
+ }
615
+ else {
616
+ if (projects.length === 0) {
617
+ console.log("No tracked projects");
618
+ }
619
+ else {
620
+ console.log("Tracked projects:");
621
+ for (const p of projects) {
622
+ const status = p.enabled ? "enabled" : "disabled";
623
+ console.log(` ${p.projectPath}`);
624
+ console.log(` Source: ${p.sourceType}, Status: ${status}`);
625
+ }
626
+ }
627
+ }
628
+ }
629
+ else {
630
+ console.error(`Unknown daemon subcommand: ${subcommand}`);
631
+ console.error(`Run 'tx daemon --help' for usage information`);
632
+ process.exit(1);
633
+ }
634
+ });
635
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"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"}