@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,168 @@
1
+ /**
2
+ * Bulk commands: batch operations on multiple tasks
3
+ */
4
+ import { Effect } from "effect";
5
+ import { TaskService, ReadyService } from "@jamesaphoenix/tx-core";
6
+ import { flag, parseTaskId } from "../utils/parse.js";
7
+ import { toJson } from "../output.js";
8
+ /** Extract error message safely without unsafe 'as' casts. */
9
+ function extractErrorMessage(error) {
10
+ if (error instanceof Error)
11
+ return error.message;
12
+ if (error !== null && typeof error === "object" && "message" in error && typeof error.message === "string") {
13
+ return error.message;
14
+ }
15
+ return String(error);
16
+ }
17
+ function printBulkResult(operation, result) {
18
+ if (result.succeeded.length > 0) {
19
+ console.log(`${operation}: ${result.succeeded.join(", ")}`);
20
+ }
21
+ if (result.failed.length > 0) {
22
+ for (const f of result.failed) {
23
+ console.error(` Failed ${f.id}: ${f.error}`);
24
+ }
25
+ }
26
+ console.log(`Summary: ${result.succeeded.length} succeeded, ${result.failed.length} failed`);
27
+ }
28
+ export const bulk = (pos, flags) => Effect.gen(function* () {
29
+ const subcommand = pos[0];
30
+ if (!subcommand) {
31
+ console.error("Usage: tx bulk <done|score|reset|delete> <id...> [options]");
32
+ console.error("Run 'tx bulk --help' for more information");
33
+ process.exit(1);
34
+ }
35
+ switch (subcommand) {
36
+ case "done":
37
+ return yield* bulkDone(pos.slice(1), flags);
38
+ case "score":
39
+ return yield* bulkScore(pos.slice(1), flags);
40
+ case "reset":
41
+ return yield* bulkReset(pos.slice(1), flags);
42
+ case "delete":
43
+ return yield* bulkDelete(pos.slice(1), flags);
44
+ default:
45
+ console.error(`Unknown bulk subcommand: ${subcommand}`);
46
+ console.error("Valid subcommands: done, score, reset, delete");
47
+ process.exit(1);
48
+ }
49
+ });
50
+ const bulkDone = (pos, flags) => Effect.gen(function* () {
51
+ if (pos.length === 0) {
52
+ console.error("Usage: tx bulk done <id> [id...] [--json]");
53
+ process.exit(1);
54
+ }
55
+ const taskSvc = yield* TaskService;
56
+ const readySvc = yield* ReadyService;
57
+ const result = { succeeded: [], failed: [] };
58
+ const allUnblocked = [];
59
+ for (const raw of pos) {
60
+ const id = parseTaskId(raw);
61
+ const op = yield* Effect.either(Effect.gen(function* () {
62
+ // Get tasks blocked by this one BEFORE marking complete
63
+ const blocking = yield* readySvc.getBlocking(id);
64
+ yield* taskSvc.update(id, { status: "done" });
65
+ // Find newly unblocked tasks
66
+ const candidateIds = blocking
67
+ .filter(t => ["backlog", "ready", "planning"].includes(t.status))
68
+ .map(t => t.id);
69
+ const candidatesWithDeps = yield* taskSvc.getWithDepsBatch(candidateIds);
70
+ return candidatesWithDeps.filter(t => t.isReady).map(t => t.id);
71
+ }));
72
+ if (op._tag === "Right") {
73
+ result.succeeded.push(id);
74
+ allUnblocked.push(...op.right);
75
+ }
76
+ else {
77
+ result.failed.push({ id, error: extractErrorMessage(op.left) });
78
+ }
79
+ }
80
+ if (flag(flags, "json")) {
81
+ console.log(toJson({ ...result, nowReady: allUnblocked }));
82
+ }
83
+ else {
84
+ printBulkResult("Completed", result);
85
+ if (allUnblocked.length > 0) {
86
+ console.log(`Now unblocked: ${allUnblocked.join(", ")}`);
87
+ }
88
+ }
89
+ });
90
+ const bulkScore = (pos, flags) => Effect.gen(function* () {
91
+ if (pos.length < 2) {
92
+ console.error("Usage: tx bulk score <score> <id> [id...] [--json]");
93
+ process.exit(1);
94
+ }
95
+ const scoreVal = parseInt(pos[0], 10);
96
+ if (Number.isNaN(scoreVal)) {
97
+ console.error(`Invalid score: "${pos[0]}" is not a valid number`);
98
+ process.exit(1);
99
+ }
100
+ const ids = pos.slice(1);
101
+ const taskSvc = yield* TaskService;
102
+ const result = { succeeded: [], failed: [] };
103
+ for (const raw of ids) {
104
+ const id = parseTaskId(raw);
105
+ const op = yield* Effect.either(taskSvc.update(id, { score: scoreVal }));
106
+ if (op._tag === "Right") {
107
+ result.succeeded.push(id);
108
+ }
109
+ else {
110
+ result.failed.push({ id, error: extractErrorMessage(op.left) });
111
+ }
112
+ }
113
+ if (flag(flags, "json")) {
114
+ console.log(toJson({ ...result, score: scoreVal }));
115
+ }
116
+ else {
117
+ printBulkResult(`Set score ${scoreVal}`, result);
118
+ }
119
+ });
120
+ const bulkReset = (pos, flags) => Effect.gen(function* () {
121
+ if (pos.length === 0) {
122
+ console.error("Usage: tx bulk reset <id> [id...] [--json]");
123
+ process.exit(1);
124
+ }
125
+ const taskSvc = yield* TaskService;
126
+ const result = { succeeded: [], failed: [] };
127
+ for (const raw of pos) {
128
+ const id = parseTaskId(raw);
129
+ const op = yield* Effect.either(taskSvc.forceStatus(id, "ready"));
130
+ if (op._tag === "Right") {
131
+ result.succeeded.push(id);
132
+ }
133
+ else {
134
+ result.failed.push({ id, error: extractErrorMessage(op.left) });
135
+ }
136
+ }
137
+ if (flag(flags, "json")) {
138
+ console.log(toJson(result));
139
+ }
140
+ else {
141
+ printBulkResult("Reset", result);
142
+ }
143
+ });
144
+ const bulkDelete = (pos, flags) => Effect.gen(function* () {
145
+ if (pos.length === 0) {
146
+ console.error("Usage: tx bulk delete <id> [id...] [--json]");
147
+ process.exit(1);
148
+ }
149
+ const taskSvc = yield* TaskService;
150
+ const result = { succeeded: [], failed: [] };
151
+ for (const raw of pos) {
152
+ const id = parseTaskId(raw);
153
+ const op = yield* Effect.either(taskSvc.remove(id));
154
+ if (op._tag === "Right") {
155
+ result.succeeded.push(id);
156
+ }
157
+ else {
158
+ result.failed.push({ id, error: extractErrorMessage(op.left) });
159
+ }
160
+ }
161
+ if (flag(flags, "json")) {
162
+ console.log(toJson(result));
163
+ }
164
+ else {
165
+ printBulkResult("Deleted", result);
166
+ }
167
+ });
168
+ //# sourceMappingURL=bulk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../src/commands/bulk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Claim commands: claim, claim:release, claim:renew
3
+ *
4
+ * PRD-018: Worker Orchestration System
5
+ *
6
+ * Lease-based task claims for worker coordination.
7
+ */
8
+ import { Effect } from "effect";
9
+ import { ClaimService } from "@jamesaphoenix/tx-core";
10
+ import { type Flags } from "../utils/parse.js";
11
+ /**
12
+ * Claim a task for a worker with a lease.
13
+ *
14
+ * Usage: tx claim <task-id> <worker-id> [--lease <minutes>] [--json]
15
+ *
16
+ * Examples:
17
+ * tx claim tx-abc123 worker-def456
18
+ * tx claim tx-abc123 worker-def456 --lease 60
19
+ */
20
+ export declare const claim: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").TaskNotFoundError | import("@jamesaphoenix/tx-core").AlreadyClaimedError, ClaimService>;
21
+ /**
22
+ * Release a claim on a task.
23
+ *
24
+ * Usage: tx claim:release <task-id> <worker-id> [--json]
25
+ *
26
+ * Examples:
27
+ * tx claim:release tx-abc123 worker-def456
28
+ */
29
+ export declare const claimRelease: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").ClaimNotFoundError | import("@jamesaphoenix/tx-core").ClaimIdNotFoundError, ClaimService>;
30
+ /**
31
+ * Renew the lease on an existing claim.
32
+ *
33
+ * Usage: tx claim:renew <task-id> <worker-id> [--json]
34
+ *
35
+ * Examples:
36
+ * tx claim:renew tx-abc123 worker-def456
37
+ */
38
+ export declare const claimRenew: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").ClaimNotFoundError | import("@jamesaphoenix/tx-core").ClaimIdNotFoundError | import("@jamesaphoenix/tx-core").LeaseExpiredError | import("@jamesaphoenix/tx-core").MaxRenewalsExceededError, ClaimService>;
39
+ //# sourceMappingURL=claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAErD,OAAO,EAAE,KAAK,KAAK,EAAkC,MAAM,mBAAmB,CAAA;AAE9E;;;;;;;;GAQG;AACH,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,kMA0B7C,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,oMAmBpD,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,qTAqBlD,CAAA"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Claim commands: claim, claim:release, claim:renew
3
+ *
4
+ * PRD-018: Worker Orchestration System
5
+ *
6
+ * Lease-based task claims for worker coordination.
7
+ */
8
+ import { Effect } from "effect";
9
+ import { ClaimService } from "@jamesaphoenix/tx-core";
10
+ import { toJson } from "../output.js";
11
+ import { flag, parseIntOpt, parseTaskId } from "../utils/parse.js";
12
+ /**
13
+ * Claim a task for a worker with a lease.
14
+ *
15
+ * Usage: tx claim <task-id> <worker-id> [--lease <minutes>] [--json]
16
+ *
17
+ * Examples:
18
+ * tx claim tx-abc123 worker-def456
19
+ * tx claim tx-abc123 worker-def456 --lease 60
20
+ */
21
+ export const claim = (pos, flags) => Effect.gen(function* () {
22
+ const rawTaskId = pos[0];
23
+ const workerId = pos[1];
24
+ if (!rawTaskId || !workerId) {
25
+ console.error("Usage: tx claim <task-id> <worker-id> [--lease <minutes>] [--json]");
26
+ console.error("");
27
+ console.error("Options:");
28
+ console.error(" --lease <m> Lease duration in minutes (default: 30)");
29
+ console.error(" --json Output in JSON format");
30
+ process.exit(1);
31
+ }
32
+ const taskId = parseTaskId(rawTaskId);
33
+ const leaseMinutes = parseIntOpt(flags, "lease", "lease");
34
+ const svc = yield* ClaimService;
35
+ const claim = yield* svc.claim(taskId, workerId, leaseMinutes);
36
+ if (flag(flags, "json")) {
37
+ console.log(toJson(claim));
38
+ }
39
+ else {
40
+ console.log(`Task ${claim.taskId} claimed by ${claim.workerId}`);
41
+ console.log(` Lease expires: ${claim.leaseExpiresAt.toISOString()}`);
42
+ }
43
+ });
44
+ /**
45
+ * Release a claim on a task.
46
+ *
47
+ * Usage: tx claim:release <task-id> <worker-id> [--json]
48
+ *
49
+ * Examples:
50
+ * tx claim:release tx-abc123 worker-def456
51
+ */
52
+ export const claimRelease = (pos, flags) => Effect.gen(function* () {
53
+ const rawTaskId = pos[0];
54
+ const workerId = pos[1];
55
+ if (!rawTaskId || !workerId) {
56
+ console.error("Usage: tx claim:release <task-id> <worker-id> [--json]");
57
+ process.exit(1);
58
+ }
59
+ const taskId = parseTaskId(rawTaskId);
60
+ const svc = yield* ClaimService;
61
+ yield* svc.release(taskId, workerId);
62
+ if (flag(flags, "json")) {
63
+ console.log(toJson({ released: true, taskId, workerId }));
64
+ }
65
+ else {
66
+ console.log(`Claim on task ${taskId} released by ${workerId}`);
67
+ }
68
+ });
69
+ /**
70
+ * Renew the lease on an existing claim.
71
+ *
72
+ * Usage: tx claim:renew <task-id> <worker-id> [--json]
73
+ *
74
+ * Examples:
75
+ * tx claim:renew tx-abc123 worker-def456
76
+ */
77
+ export const claimRenew = (pos, flags) => Effect.gen(function* () {
78
+ const rawTaskId = pos[0];
79
+ const workerId = pos[1];
80
+ if (!rawTaskId || !workerId) {
81
+ console.error("Usage: tx claim:renew <task-id> <worker-id> [--json]");
82
+ process.exit(1);
83
+ }
84
+ const taskId = parseTaskId(rawTaskId);
85
+ const svc = yield* ClaimService;
86
+ const renewed = yield* svc.renew(taskId, workerId);
87
+ if (flag(flags, "json")) {
88
+ console.log(toJson(renewed));
89
+ }
90
+ else {
91
+ console.log(`Lease on task ${renewed.taskId} renewed`);
92
+ console.log(` New expiry: ${renewed.leaseExpiresAt.toISOString()}`);
93
+ console.log(` Renewals: ${renewed.renewedCount}/10`);
94
+ }
95
+ });
96
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Compaction commands: compact, history
3
+ *
4
+ * Implements PRD-006: Task Compaction & Learnings Export
5
+ */
6
+ import { Effect } from "effect";
7
+ import { CompactionService } from "@jamesaphoenix/tx-core";
8
+ import { type Flags } from "../utils/parse.js";
9
+ /**
10
+ * tx compact - Compact completed tasks and export learnings
11
+ */
12
+ export declare const compact: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").ValidationError | import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").ExtractionUnavailableError, CompactionService>;
13
+ /**
14
+ * tx history - View compaction history
15
+ */
16
+ export declare const history: (_pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError, CompactionService>;
17
+ //# sourceMappingURL=compact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.d.ts","sourceRoot":"","sources":["../../src/commands/compact.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,mBAAmB,CAAA;AAwBzD;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,4MA2G/C,CAAA;AAEJ;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,EAAE,EAAE,OAAO,KAAK,2FA2BhD,CAAA"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Compaction commands: compact, history
3
+ *
4
+ * Implements PRD-006: Task Compaction & Learnings Export
5
+ */
6
+ import { resolve, sep } from "node:path";
7
+ import { Effect } from "effect";
8
+ import { CompactionService } from "@jamesaphoenix/tx-core";
9
+ import { toJson } from "../output.js";
10
+ import { flag, opt } from "../utils/parse.js";
11
+ /**
12
+ * Parse a date string into a Date object.
13
+ * Supports ISO dates (YYYY-MM-DD) and relative days (e.g., "7d" for 7 days ago).
14
+ */
15
+ function parseDate(input) {
16
+ // Check for relative format like "7d" (7 days ago)
17
+ const relativeMatch = input.match(/^(\d+)d$/);
18
+ if (relativeMatch) {
19
+ const days = parseInt(relativeMatch[1], 10);
20
+ const date = new Date();
21
+ date.setDate(date.getDate() - days);
22
+ return date;
23
+ }
24
+ // Otherwise, parse as ISO date
25
+ const date = new Date(input);
26
+ if (isNaN(date.getTime())) {
27
+ throw new Error(`Invalid date format: ${input}. Use YYYY-MM-DD or Nd (e.g., 7d for 7 days ago).`);
28
+ }
29
+ return date;
30
+ }
31
+ /**
32
+ * tx compact - Compact completed tasks and export learnings
33
+ */
34
+ export const compact = (pos, flags) => Effect.gen(function* () {
35
+ const svc = yield* CompactionService;
36
+ // Check availability first
37
+ const available = yield* svc.isAvailable();
38
+ // Parse --before option (default: 7 days ago)
39
+ const beforeStr = opt(flags, "before");
40
+ let before;
41
+ try {
42
+ before = beforeStr ? parseDate(beforeStr) : (() => {
43
+ const d = new Date();
44
+ d.setDate(d.getDate() - 7);
45
+ return d;
46
+ })();
47
+ }
48
+ catch (e) {
49
+ console.error(String(e));
50
+ process.exit(1);
51
+ }
52
+ const outputFile = opt(flags, "output", "o") ?? "CLAUDE.md";
53
+ // Validate output path stays within project directory (prevent path traversal)
54
+ const projectRoot = process.cwd();
55
+ const resolvedOutput = resolve(projectRoot, outputFile);
56
+ if (!resolvedOutput.startsWith(projectRoot + sep)) {
57
+ console.error(`Error: output path '${outputFile}' resolves outside project directory.`);
58
+ process.exit(1);
59
+ }
60
+ const dryRun = flag(flags, "dry-run", "preview");
61
+ // If dry-run, we can proceed without API key
62
+ if (dryRun) {
63
+ const tasks = yield* svc.preview(before);
64
+ if (flag(flags, "json")) {
65
+ console.log(toJson({
66
+ dryRun: true,
67
+ before: before.toISOString(),
68
+ taskCount: tasks.length,
69
+ tasks: tasks.map(t => ({
70
+ id: t.id,
71
+ title: t.title,
72
+ status: t.status,
73
+ completedAt: t.completedAt?.toISOString()
74
+ }))
75
+ }));
76
+ }
77
+ else {
78
+ if (tasks.length === 0) {
79
+ console.log("No tasks eligible for compaction.");
80
+ console.log(` Before: ${before.toISOString().split("T")[0]}`);
81
+ }
82
+ else {
83
+ console.log(`Would compact ${tasks.length} task(s):`);
84
+ console.log(` Before: ${before.toISOString().split("T")[0]}`);
85
+ console.log(` Output: ${outputFile}`);
86
+ console.log("");
87
+ for (const t of tasks) {
88
+ console.log(` - ${t.id}: ${t.title} [${t.status}]`);
89
+ if (t.completedAt) {
90
+ console.log(` Completed: ${t.completedAt.toISOString().split("T")[0]}`);
91
+ }
92
+ }
93
+ console.log("");
94
+ console.log("Run without --dry-run to execute compaction.");
95
+ }
96
+ }
97
+ return;
98
+ }
99
+ // For actual compaction, check API key
100
+ if (!available) {
101
+ console.error("Task compaction requires ANTHROPIC_API_KEY.");
102
+ console.error("Set it as an environment variable to enable this feature:");
103
+ console.error(" export ANTHROPIC_API_KEY=sk-ant-...");
104
+ console.error("");
105
+ console.error("Use --dry-run to preview tasks without an API key.");
106
+ process.exit(1);
107
+ }
108
+ // Execute compaction
109
+ const result = yield* svc.compact({
110
+ before,
111
+ outputFile,
112
+ dryRun: false
113
+ });
114
+ if (flag(flags, "json")) {
115
+ console.log(toJson(result));
116
+ }
117
+ else {
118
+ if (result.compactedCount === 0) {
119
+ console.log("No tasks to compact.");
120
+ }
121
+ else {
122
+ console.log(`Compacted ${result.compactedCount} task(s)`);
123
+ console.log("");
124
+ console.log("Summary:");
125
+ console.log(result.summary);
126
+ console.log("");
127
+ console.log("Learnings exported to:", result.learningsExportedTo ?? "(not exported)");
128
+ if (result.learnings) {
129
+ console.log("");
130
+ console.log("Learnings:");
131
+ console.log(result.learnings);
132
+ }
133
+ }
134
+ }
135
+ });
136
+ /**
137
+ * tx history - View compaction history
138
+ */
139
+ export const history = (_pos, flags) => Effect.gen(function* () {
140
+ const svc = yield* CompactionService;
141
+ const summaries = yield* svc.getSummaries();
142
+ if (flag(flags, "json")) {
143
+ console.log(toJson(summaries));
144
+ }
145
+ else {
146
+ if (summaries.length === 0) {
147
+ console.log("No compaction history.");
148
+ }
149
+ else {
150
+ console.log("Compaction History:");
151
+ console.log("");
152
+ for (const s of summaries) {
153
+ const date = s.compactedAt.toISOString().split("T")[0];
154
+ const taskCount = s.taskCount;
155
+ // Get first line of summary for preview
156
+ const summaryPreview = s.summary.split("\n")[0]?.slice(0, 60) || "(no summary)";
157
+ console.log(`${date}: ${taskCount} task(s)`);
158
+ console.log(` ${summaryPreview}${s.summary.length > 60 ? "..." : ""}`);
159
+ if (s.learningsExportedTo) {
160
+ console.log(` Learnings exported to: ${s.learningsExportedTo}`);
161
+ }
162
+ console.log("");
163
+ }
164
+ }
165
+ }
166
+ });
167
+ //# sourceMappingURL=compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.js","sourceRoot":"","sources":["../../src/commands/compact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Coordinator commands: start, stop, status, reconcile
3
+ *
4
+ * CLI commands for managing the worker coordination system (PRD-018).
5
+ * Named "coordinator" to emphasize tx provides coordination primitives,
6
+ * not an orchestration framework - you own the orchestration loop.
7
+ */
8
+ import { Effect } from "effect";
9
+ import { OrchestratorService } from "@jamesaphoenix/tx-core";
10
+ import { type Flags } from "../utils/parse.js";
11
+ export declare const coordinator: (pos: string[], flags: Flags) => Effect.Effect<void, import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").TaskNotFoundError | import("@jamesaphoenix/tx-core").OrchestratorError, OrchestratorService>;
12
+ //# sourceMappingURL=coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/commands/coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,mBAAmB,EAA2B,MAAM,wBAAwB,CAAA;AAGrF,OAAO,EAAE,KAAK,KAAK,EAAqB,MAAM,mBAAmB,CAAA;AAEjE,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,uMAoHnD,CAAA"}