@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,397 @@
1
+ /**
2
+ * Doc commands: doc add, doc edit, doc show, doc list, doc render, doc lock,
3
+ * doc version, doc link, doc attach, doc patch, doc validate, doc drift
4
+ */
5
+ import { Effect } from "effect";
6
+ import { readFileSync } from "node:fs";
7
+ import { execSync } from "node:child_process";
8
+ import { DocService } from "@jamesaphoenix/tx-core";
9
+ import { DOC_KINDS } from "@jamesaphoenix/tx-types";
10
+ import { toJson } from "../output.js";
11
+ import { flag, opt } from "../utils/parse.js";
12
+ const docKindStrings = DOC_KINDS;
13
+ /** Dispatch doc subcommands. */
14
+ export const doc = (pos, flags) => {
15
+ const sub = pos[0];
16
+ const rest = pos.slice(1);
17
+ switch (sub) {
18
+ case "add": return docAdd(rest, flags);
19
+ case "edit": return docEdit(rest, flags);
20
+ case "show": return docShow(rest, flags);
21
+ case "list": return docList(rest, flags);
22
+ case "render": return docRender(rest, flags);
23
+ case "lock": return docLock(rest, flags);
24
+ case "version": return docVersion(rest, flags);
25
+ case "link": return docLink(rest, flags);
26
+ case "attach": return docAttach(rest, flags);
27
+ case "patch": return docPatch(rest, flags);
28
+ case "validate": return docValidate(rest, flags);
29
+ case "drift": return docDrift(rest, flags);
30
+ default:
31
+ return Effect.sync(() => {
32
+ console.error(`Unknown doc subcommand: ${sub ?? "(none)"}`);
33
+ console.error("Run 'tx doc --help' for usage information");
34
+ process.exit(1);
35
+ });
36
+ }
37
+ };
38
+ const docAdd = (pos, flags) => Effect.gen(function* () {
39
+ const kind = pos[0];
40
+ const name = pos[1];
41
+ if (!kind || !name) {
42
+ console.error("Usage: tx doc add <kind> <name> [--title <title>]");
43
+ console.error(" Kinds: overview, prd, design");
44
+ process.exit(1);
45
+ }
46
+ if (!docKindStrings.includes(kind)) {
47
+ console.error(`Invalid kind: ${kind}. Must be one of: ${DOC_KINDS.join(", ")}`);
48
+ process.exit(1);
49
+ }
50
+ const title = opt(flags, "title", "t") ?? name;
51
+ // Generate template YAML
52
+ const yamlContent = generateTemplate(kind, name, title);
53
+ const svc = yield* DocService;
54
+ const doc = yield* svc.create({
55
+ kind: kind,
56
+ name,
57
+ title,
58
+ yamlContent,
59
+ });
60
+ if (flag(flags, "json")) {
61
+ console.log(toJson(doc));
62
+ }
63
+ else {
64
+ console.log(`Created doc: ${doc.name} (${doc.kind} v${doc.version})`);
65
+ console.log(` File: ${doc.filePath}`);
66
+ console.log(` Hash: ${doc.hash.slice(0, 12)}...`);
67
+ }
68
+ });
69
+ const docEdit = (pos, _flags) => Effect.gen(function* () {
70
+ const name = pos[0];
71
+ if (!name) {
72
+ console.error("Usage: tx doc edit <name>");
73
+ process.exit(1);
74
+ }
75
+ const svc = yield* DocService;
76
+ const doc = yield* svc.get(name);
77
+ const editor = process.env.EDITOR ?? "vi";
78
+ const docsPath = doc.filePath;
79
+ try {
80
+ execSync(`${editor} "${docsPath}"`, { stdio: "inherit" });
81
+ }
82
+ catch {
83
+ console.error(`Failed to open editor: ${editor}`);
84
+ process.exit(1);
85
+ }
86
+ });
87
+ const docShow = (pos, flags) => Effect.gen(function* () {
88
+ const name = pos[0];
89
+ if (!name) {
90
+ console.error("Usage: tx doc show <name> [--md] [--json]");
91
+ process.exit(1);
92
+ }
93
+ const svc = yield* DocService;
94
+ const doc = yield* svc.get(name);
95
+ if (flag(flags, "json")) {
96
+ console.log(toJson(doc));
97
+ }
98
+ else if (flag(flags, "md")) {
99
+ // Render and show MD
100
+ const rendered = yield* svc.render(name);
101
+ if (rendered.length > 0) {
102
+ console.log(readFileSync(rendered[0], "utf8"));
103
+ }
104
+ }
105
+ else {
106
+ console.log(`Doc: ${doc.name}`);
107
+ console.log(` Kind: ${doc.kind}`);
108
+ console.log(` Title: ${doc.title}`);
109
+ console.log(` Version: ${doc.version}`);
110
+ console.log(` Status: ${doc.status}`);
111
+ console.log(` Hash: ${doc.hash.slice(0, 12)}...`);
112
+ console.log(` File: ${doc.filePath}`);
113
+ console.log(` Created: ${doc.createdAt.toISOString()}`);
114
+ if (doc.lockedAt)
115
+ console.log(` Locked: ${doc.lockedAt.toISOString()}`);
116
+ if (doc.parentDocId)
117
+ console.log(` Parent doc ID: ${doc.parentDocId}`);
118
+ }
119
+ });
120
+ const docList = (_pos, flags) => Effect.gen(function* () {
121
+ const kind = opt(flags, "kind", "k");
122
+ const status = opt(flags, "status", "s");
123
+ const svc = yield* DocService;
124
+ const docs = yield* svc.list({ kind, status });
125
+ if (flag(flags, "json")) {
126
+ console.log(toJson(docs));
127
+ }
128
+ else {
129
+ if (docs.length === 0) {
130
+ console.log("No docs found");
131
+ }
132
+ else {
133
+ console.log(`${docs.length} doc(s):`);
134
+ for (const d of docs) {
135
+ const statusIcon = d.status === "locked" ? "🔒" : "📝";
136
+ console.log(` ${statusIcon} ${d.name} (${d.kind} v${d.version}) [${d.status}] ${d.title}`);
137
+ }
138
+ }
139
+ }
140
+ });
141
+ const docRender = (pos, flags) => Effect.gen(function* () {
142
+ const name = pos[0] || undefined;
143
+ const svc = yield* DocService;
144
+ const rendered = yield* svc.render(name);
145
+ if (flag(flags, "json")) {
146
+ console.log(toJson({ rendered }));
147
+ }
148
+ else {
149
+ if (rendered.length === 0) {
150
+ console.log("No docs rendered");
151
+ }
152
+ else {
153
+ console.log(`Rendered ${rendered.length} doc(s):`);
154
+ for (const path of rendered) {
155
+ console.log(` ${path}`);
156
+ }
157
+ console.log(" + index.yml, index.md");
158
+ }
159
+ }
160
+ });
161
+ const docLock = (pos, flags) => Effect.gen(function* () {
162
+ const name = pos[0];
163
+ if (!name) {
164
+ console.error("Usage: tx doc lock <name>");
165
+ process.exit(1);
166
+ }
167
+ const svc = yield* DocService;
168
+ const doc = yield* svc.lock(name);
169
+ // Render final MD
170
+ yield* svc.render(name);
171
+ if (flag(flags, "json")) {
172
+ console.log(toJson(doc));
173
+ }
174
+ else {
175
+ console.log(`Locked: ${doc.name} v${doc.version}`);
176
+ console.log(` Status: ${doc.status}`);
177
+ if (doc.lockedAt)
178
+ console.log(` Locked at: ${doc.lockedAt.toISOString()}`);
179
+ }
180
+ });
181
+ const docVersion = (pos, flags) => Effect.gen(function* () {
182
+ const name = pos[0];
183
+ if (!name) {
184
+ console.error("Usage: tx doc version <name>");
185
+ process.exit(1);
186
+ }
187
+ const svc = yield* DocService;
188
+ const doc = yield* svc.createVersion(name);
189
+ if (flag(flags, "json")) {
190
+ console.log(toJson(doc));
191
+ }
192
+ else {
193
+ console.log(`Created version: ${doc.name} v${doc.version}`);
194
+ console.log(` Copied from v${doc.version - 1}`);
195
+ console.log(` Status: ${doc.status}`);
196
+ }
197
+ });
198
+ const docLink = (pos, flags) => Effect.gen(function* () {
199
+ const from = pos[0];
200
+ const to = pos[1];
201
+ if (!from || !to) {
202
+ console.error("Usage: tx doc link <from-name> <to-name> [--type <link-type>]");
203
+ process.exit(1);
204
+ }
205
+ const linkType = opt(flags, "type");
206
+ const svc = yield* DocService;
207
+ const link = yield* svc.linkDocs(from, to, linkType);
208
+ if (flag(flags, "json")) {
209
+ console.log(toJson(link));
210
+ }
211
+ else {
212
+ console.log(`Linked: ${from} → ${to} (${link.linkType})`);
213
+ }
214
+ });
215
+ const docAttach = (pos, flags) => Effect.gen(function* () {
216
+ const taskId = pos[0];
217
+ const docName = pos[1];
218
+ if (!taskId || !docName) {
219
+ console.error("Usage: tx doc attach <task-id> <doc-name> [--type implements|references]");
220
+ process.exit(1);
221
+ }
222
+ const linkType = (opt(flags, "type") ?? "implements");
223
+ const svc = yield* DocService;
224
+ yield* svc.attachTask(taskId, docName, linkType);
225
+ if (flag(flags, "json")) {
226
+ console.log(toJson({ taskId, docName, linkType }));
227
+ }
228
+ else {
229
+ console.log(`Attached: task ${taskId} → doc ${docName} (${linkType})`);
230
+ }
231
+ });
232
+ const docPatch = (pos, flags) => Effect.gen(function* () {
233
+ const designName = pos[0];
234
+ const patchName = pos[1];
235
+ if (!designName || !patchName) {
236
+ console.error("Usage: tx doc patch <design-name> <patch-name> [--title <title>]");
237
+ process.exit(1);
238
+ }
239
+ const title = opt(flags, "title", "t") ?? patchName;
240
+ const svc = yield* DocService;
241
+ const doc = yield* svc.createPatch(designName, patchName, title);
242
+ if (flag(flags, "json")) {
243
+ console.log(toJson(doc));
244
+ }
245
+ else {
246
+ console.log(`Created patch: ${doc.name} → ${designName}`);
247
+ console.log(` Title: ${doc.title}`);
248
+ console.log(` File: ${doc.filePath}`);
249
+ }
250
+ });
251
+ const docValidate = (_pos, flags) => Effect.gen(function* () {
252
+ const svc = yield* DocService;
253
+ const warnings = yield* svc.validate();
254
+ if (flag(flags, "json")) {
255
+ console.log(toJson({ warnings }));
256
+ }
257
+ else {
258
+ if (warnings.length === 0) {
259
+ console.log("All tasks are linked to docs");
260
+ }
261
+ else {
262
+ console.log(`${warnings.length} warning(s):`);
263
+ for (const w of warnings) {
264
+ console.log(` ⚠ ${w}`);
265
+ }
266
+ }
267
+ }
268
+ });
269
+ const docDrift = (pos, flags) => Effect.gen(function* () {
270
+ const name = pos[0];
271
+ if (!name) {
272
+ console.error("Usage: tx doc drift <name>");
273
+ process.exit(1);
274
+ }
275
+ const svc = yield* DocService;
276
+ const warnings = yield* svc.detectDrift(name);
277
+ if (flag(flags, "json")) {
278
+ console.log(toJson({ name, warnings }));
279
+ }
280
+ else {
281
+ if (warnings.length === 0) {
282
+ console.log(`No drift detected for: ${name}`);
283
+ }
284
+ else {
285
+ console.log(`${warnings.length} drift warning(s) for ${name}:`);
286
+ for (const w of warnings) {
287
+ console.log(` ⚠ ${w}`);
288
+ }
289
+ }
290
+ }
291
+ });
292
+ /** Generate template YAML content for a doc kind. */
293
+ function generateTemplate(kind, name, title) {
294
+ switch (kind) {
295
+ case "overview":
296
+ return [
297
+ `kind: overview`,
298
+ `name: ${name}`,
299
+ `title: "${title}"`,
300
+ ``,
301
+ `problem_definition: |`,
302
+ ` Describe the problem this system solves.`,
303
+ ``,
304
+ `subsystems: |`,
305
+ ` ## Subsystem 1`,
306
+ ` - Boundary: packages/core/src/services/...`,
307
+ ``,
308
+ `object_model: |`,
309
+ ` ## Entity`,
310
+ ` - Table: ...`,
311
+ ` - Lifecycle: ...`,
312
+ ``,
313
+ `storage_schema: |`,
314
+ ` ## Table Name`,
315
+ ` | Column | Type | Constraints |`,
316
+ ` |--------|------|-------------|`,
317
+ ``,
318
+ `invariants: []`,
319
+ ``,
320
+ `failure_modes: []`,
321
+ ``,
322
+ `edge_cases: []`,
323
+ ``,
324
+ `constraints: []`,
325
+ ``,
326
+ `cross_cutting: |`,
327
+ ` - Error handling: ...`,
328
+ ``,
329
+ `data_retention: |`,
330
+ ` - Retained indefinitely`,
331
+ ``,
332
+ ].join("\n");
333
+ case "prd":
334
+ return [
335
+ `kind: prd`,
336
+ `name: ${name}`,
337
+ `title: "${title}"`,
338
+ `status: changing`,
339
+ ``,
340
+ `problem: |`,
341
+ ` Describe the problem.`,
342
+ ``,
343
+ `solution: |`,
344
+ ` Describe the solution approach.`,
345
+ ``,
346
+ `requirements:`,
347
+ ` - Requirement 1`,
348
+ ``,
349
+ `acceptance_criteria:`,
350
+ ` - Criterion 1`,
351
+ ``,
352
+ `out_of_scope:`,
353
+ ` - Item 1`,
354
+ ``,
355
+ ].join("\n");
356
+ case "design":
357
+ return [
358
+ `kind: design`,
359
+ `name: ${name}`,
360
+ `title: "${title}"`,
361
+ `status: changing`,
362
+ `version: 1`,
363
+ ``,
364
+ `problem_definition: |`,
365
+ ` Why this change is needed.`,
366
+ ``,
367
+ `goals:`,
368
+ ` - Goal 1`,
369
+ ``,
370
+ `architecture: |`,
371
+ ` ## Components`,
372
+ ` ...`,
373
+ ``,
374
+ `data_model: |`,
375
+ ` ## Table Name`,
376
+ ` | Column | Type | Constraints |`,
377
+ ` |--------|------|-------------|`,
378
+ ``,
379
+ `invariants: []`,
380
+ ``,
381
+ `failure_modes: []`,
382
+ ``,
383
+ `edge_cases: []`,
384
+ ``,
385
+ `work_breakdown:`,
386
+ ` - description: "Phase 1"`,
387
+ ``,
388
+ `retention: |`,
389
+ ` - docs: All versions retained`,
390
+ ``,
391
+ `testing_strategy: |`,
392
+ ` Shared test layer, integration tests.`,
393
+ ``,
394
+ ].join("\n");
395
+ }
396
+ }
397
+ //# sourceMappingURL=doc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc.js","sourceRoot":"","sources":["../../src/commands/doc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Doctor command: System health diagnostics for troubleshooting
3
+ */
4
+ import { Effect } from "effect";
5
+ import { SqliteClient, MigrationService } from "@jamesaphoenix/tx-core";
6
+ type Flags = Record<string, string | boolean>;
7
+ export declare const doctor: (_pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError, MigrationService | SqliteClient>;
8
+ export {};
9
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAIvE,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAA;AA8C7C,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,EAAE,EAAE,OAAO,KAAK,yGAsJ/C,CAAA"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Doctor command: System health diagnostics for troubleshooting
3
+ */
4
+ import { Effect } from "effect";
5
+ import { SqliteClient, MigrationService } from "@jamesaphoenix/tx-core";
6
+ import { toJson } from "../output.js";
7
+ import { statSync } from "node:fs";
8
+ function flag(flags, ...names) {
9
+ return names.some(n => flags[n] === true);
10
+ }
11
+ function statusIcon(status) {
12
+ switch (status) {
13
+ case "pass": return "\u2713";
14
+ case "warn": return "\u26a0";
15
+ case "fail": return "\u2717";
16
+ }
17
+ }
18
+ function formatDoctorResult(result, verbose) {
19
+ const lines = [];
20
+ for (const check of result.checks) {
21
+ lines.push(`${statusIcon(check.status)} ${check.message}`);
22
+ if (verbose && check.details) {
23
+ lines.push(` ${check.details}`);
24
+ }
25
+ }
26
+ lines.push("");
27
+ if (result.healthy) {
28
+ lines.push("All checks passed.");
29
+ }
30
+ else {
31
+ lines.push("Issues detected. Run with --verbose for details.");
32
+ }
33
+ return lines.join("\n");
34
+ }
35
+ export const doctor = (_pos, flags) => Effect.gen(function* () {
36
+ const db = yield* SqliteClient;
37
+ const migrationSvc = yield* MigrationService;
38
+ const verbose = flag(flags, "verbose", "v");
39
+ const checks = [];
40
+ // 1. Check database file exists and is readable
41
+ const dbPath = typeof flags.db === "string" ? flags.db : undefined;
42
+ if (dbPath) {
43
+ try {
44
+ const stats = statSync(dbPath);
45
+ const sizeMb = (stats.size / (1024 * 1024)).toFixed(1);
46
+ checks.push({
47
+ name: "database",
48
+ status: "pass",
49
+ message: `Database: ${dbPath} (${sizeMb}MB)`,
50
+ });
51
+ }
52
+ catch {
53
+ checks.push({
54
+ name: "database",
55
+ status: "fail",
56
+ message: `Database: ${dbPath} (not found or unreadable)`,
57
+ });
58
+ }
59
+ }
60
+ else {
61
+ // db path not available as flag — just confirm connection works
62
+ checks.push({
63
+ name: "database",
64
+ status: "pass",
65
+ message: "Database: connected",
66
+ });
67
+ }
68
+ // 2. Verify WAL mode enabled
69
+ const walRow = db.prepare("PRAGMA journal_mode").get();
70
+ const walMode = walRow?.journal_mode === "wal";
71
+ checks.push({
72
+ name: "wal_mode",
73
+ status: walMode ? "pass" : "warn",
74
+ message: walMode
75
+ ? "WAL mode: enabled"
76
+ : `WAL mode: disabled (journal_mode=${walRow?.journal_mode ?? "unknown"})`,
77
+ details: walMode ? undefined : "WAL mode improves concurrent read/write performance. Expected 'wal'.",
78
+ });
79
+ // 3. Check schema version matches expected
80
+ const migrationStatus = yield* migrationSvc.getStatus();
81
+ const schemaOk = migrationStatus.currentVersion === migrationStatus.latestVersion;
82
+ checks.push({
83
+ name: "schema",
84
+ status: schemaOk ? "pass" : migrationStatus.currentVersion < migrationStatus.latestVersion ? "warn" : "fail",
85
+ message: schemaOk
86
+ ? `Schema: v${migrationStatus.currentVersion} (current)`
87
+ : `Schema: v${migrationStatus.currentVersion} (latest: v${migrationStatus.latestVersion})`,
88
+ details: !schemaOk && migrationStatus.pendingCount > 0
89
+ ? `${migrationStatus.pendingCount} pending migration(s). Run tx migrate to apply.`
90
+ : undefined,
91
+ });
92
+ // 4. Verify Effect services are properly wired (we already have db + migrationSvc)
93
+ checks.push({
94
+ name: "services",
95
+ status: "pass",
96
+ message: "Effect services: wired correctly",
97
+ });
98
+ // 5. Check for stale claims/workers
99
+ const staleClaims = db.prepare(`SELECT COUNT(*) as count FROM task_claims
100
+ WHERE status = 'active'
101
+ AND datetime(lease_expires_at) < datetime('now')`).get();
102
+ const staleClaimCount = staleClaims?.count ?? 0;
103
+ const deadWorkers = db.prepare(`SELECT COUNT(*) as count FROM workers
104
+ WHERE status NOT IN ('dead', 'stopping')
105
+ AND datetime(last_heartbeat_at, '+5 minutes') < datetime('now')`).get();
106
+ const deadWorkerCount = deadWorkers?.count ?? 0;
107
+ if (staleClaimCount > 0 || deadWorkerCount > 0) {
108
+ const parts = [];
109
+ if (staleClaimCount > 0)
110
+ parts.push(`${staleClaimCount} expired claim(s)`);
111
+ if (deadWorkerCount > 0)
112
+ parts.push(`${deadWorkerCount} stale worker(s)`);
113
+ checks.push({
114
+ name: "stale_claims",
115
+ status: "warn",
116
+ message: `Stale claims/workers: ${parts.join(", ")}`,
117
+ details: "Stale claims will auto-expire. Dead workers can be cleaned up via the worker API.",
118
+ });
119
+ }
120
+ else {
121
+ checks.push({
122
+ name: "stale_claims",
123
+ status: "pass",
124
+ message: "Claims/workers: no stale entries",
125
+ });
126
+ }
127
+ // 6. Report database size and task counts
128
+ const taskCounts = db.prepare("SELECT status, COUNT(*) as count FROM tasks GROUP BY status").all();
129
+ const totalTasks = taskCounts.reduce((sum, r) => sum + r.count, 0);
130
+ const readyCount = taskCounts.find(r => r.status === "ready")?.count ?? 0;
131
+ const doneCount = taskCounts.find(r => r.status === "done")?.count ?? 0;
132
+ const learningCount = db.prepare("SELECT COUNT(*) as count FROM learnings").get();
133
+ checks.push({
134
+ name: "tasks",
135
+ status: "pass",
136
+ message: `Tasks: ${totalTasks} total (${readyCount} ready, ${doneCount} done)`,
137
+ details: verbose
138
+ ? taskCounts.map(r => `${r.status}: ${r.count}`).join(", ")
139
+ : undefined,
140
+ });
141
+ checks.push({
142
+ name: "learnings",
143
+ status: "pass",
144
+ message: `Learnings: ${learningCount?.count ?? 0} total`,
145
+ });
146
+ // 7. Verify ANTHROPIC_API_KEY for LLM features
147
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
148
+ checks.push({
149
+ name: "api_key",
150
+ status: hasApiKey ? "pass" : "warn",
151
+ message: hasApiKey
152
+ ? "ANTHROPIC_API_KEY: set"
153
+ : "ANTHROPIC_API_KEY: not set (LLM features unavailable)",
154
+ details: hasApiKey ? undefined : "Required for: tx compact, tx dedupe, tx reprioritize",
155
+ });
156
+ const healthy = checks.every(c => c.status !== "fail");
157
+ const result = { healthy, checks };
158
+ if (flag(flags, "json")) {
159
+ console.log(toJson(result));
160
+ }
161
+ else {
162
+ console.log(formatDoctorResult(result, verbose));
163
+ }
164
+ if (!healthy) {
165
+ process.exit(1);
166
+ }
167
+ });
168
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Graph commands: graph:verify, graph:invalidate, graph:restore, graph:prune, graph:status, graph:pin, graph:unpin,
3
+ * graph:link, graph:show, graph:neighbors
4
+ */
5
+ import { Effect } from "effect";
6
+ import { AnchorService, EdgeService } from "@jamesaphoenix/tx-core";
7
+ import { type Flags } from "../utils/parse.js";
8
+ /**
9
+ * tx graph:verify [--file <path>] [--all] [--json]
10
+ * Verify anchors for a specific file or all anchors
11
+ */
12
+ export declare const graphVerify: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError, AnchorService>;
13
+ /**
14
+ * tx graph:invalidate <anchor-id> --reason <reason> [--json]
15
+ * Manually invalidate an anchor
16
+ */
17
+ export declare const graphInvalidate: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").AnchorNotFoundError, AnchorService>;
18
+ /**
19
+ * tx graph:restore <anchor-id> [--json]
20
+ * Restore a soft-deleted (invalid) anchor
21
+ */
22
+ export declare const graphRestore: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").AnchorNotFoundError, AnchorService>;
23
+ /**
24
+ * tx graph:prune [--older-than <days>] [--json]
25
+ * Hard delete old invalid anchors
26
+ */
27
+ export declare const graphPrune: (_pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError, AnchorService>;
28
+ /**
29
+ * tx graph:status [--json]
30
+ * Show graph health metrics
31
+ */
32
+ export declare const graphStatus: (_pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError, AnchorService>;
33
+ /**
34
+ * tx graph:pin <anchor-id> [--json]
35
+ * Pin an anchor to prevent auto-invalidation
36
+ */
37
+ export declare const graphPin: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").AnchorNotFoundError, AnchorService>;
38
+ /**
39
+ * tx graph:unpin <anchor-id> [--json]
40
+ * Unpin an anchor to allow auto-invalidation
41
+ */
42
+ export declare const graphUnpin: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").AnchorNotFoundError, AnchorService>;
43
+ /**
44
+ * tx graph:link <learning-id> <file-path> [--type glob|hash|symbol] [--value <value>] [--json]
45
+ * Create an anchor linking a learning to a file
46
+ */
47
+ export declare const graphLink: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").ValidationError | import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").LearningNotFoundError, AnchorService>;
48
+ /**
49
+ * tx graph:show <learning-id> [--json]
50
+ * Show all edges for a learning
51
+ */
52
+ export declare const graphShow: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError, AnchorService | EdgeService>;
53
+ /**
54
+ * tx graph:neighbors <node-id> [--node-type learning|file|task|run] [--depth 2] [--edge-type IMPORTS,ANCHORED_TO] [--direction both|outgoing|incoming] [--json]
55
+ * Find neighbors of a node with optional multi-hop traversal
56
+ */
57
+ export declare const graphNeighbors: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError, EdgeService>;
58
+ //# sourceMappingURL=graph.d.ts.map