@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 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Output formatters for JSON/text CLI output
3
+ */
4
+ import type { TaskWithDeps, LearningWithScore, ContextResult } from "@jamesaphoenix/tx-types";
5
+ export declare function toJson(data: unknown): string;
6
+ export declare function formatTaskWithDeps(t: TaskWithDeps): string;
7
+ export declare function formatTaskLine(t: TaskWithDeps): string;
8
+ export declare function formatReadyTaskLine(t: TaskWithDeps): string;
9
+ export declare function formatContextMarkdown(result: ContextResult): string;
10
+ export declare function formatLearningSearchResult(r: LearningWithScore): string;
11
+ export declare function truncate(str: string, maxLen: number): string;
12
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAS7F,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE5C;AAID,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAiB1D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAGtD;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAG3D;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAsBnE;AAID,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAIvE;AAID,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D"}
package/dist/output.js ADDED
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Output formatters for JSON/text CLI output
3
+ */
4
+ // --- JSON serializer (handles Date objects) ---
5
+ function jsonReplacer(_key, value) {
6
+ if (value instanceof Date)
7
+ return value.toISOString();
8
+ return value;
9
+ }
10
+ export function toJson(data) {
11
+ return JSON.stringify(data, jsonReplacer, 2);
12
+ }
13
+ // --- Task formatters ---
14
+ export function formatTaskWithDeps(t) {
15
+ const lines = [
16
+ `Task: ${t.id}`,
17
+ ` Title: ${t.title}`,
18
+ ` Status: ${t.status}`,
19
+ ` Score: ${t.score}`,
20
+ ` Ready: ${t.isReady ? "yes" : "no"}`,
21
+ ];
22
+ if (t.description)
23
+ lines.push(` Description: ${t.description}`);
24
+ if (t.parentId)
25
+ lines.push(` Parent: ${t.parentId}`);
26
+ lines.push(` Blocked by: ${t.blockedBy.length > 0 ? t.blockedBy.join(", ") : "(none)"}`);
27
+ lines.push(` Blocks: ${t.blocks.length > 0 ? t.blocks.join(", ") : "(none)"}`);
28
+ lines.push(` Children: ${t.children.length > 0 ? t.children.join(", ") : "(none)"}`);
29
+ lines.push(` Created: ${t.createdAt.toISOString()}`);
30
+ lines.push(` Updated: ${t.updatedAt.toISOString()}`);
31
+ if (t.completedAt)
32
+ lines.push(` Completed: ${t.completedAt.toISOString()}`);
33
+ return lines.join("\n");
34
+ }
35
+ export function formatTaskLine(t) {
36
+ const readyMark = t.isReady ? "+" : " ";
37
+ return ` ${readyMark} ${t.id} [${t.status}] [${t.score}] ${t.title}`;
38
+ }
39
+ export function formatReadyTaskLine(t) {
40
+ const blocksInfo = t.blocks.length > 0 ? ` (unblocks ${t.blocks.length})` : "";
41
+ return ` ${t.id} [${t.score}] ${t.title}${blocksInfo}`;
42
+ }
43
+ // --- Context formatter ---
44
+ export function formatContextMarkdown(result) {
45
+ const lines = [
46
+ `## Contextual Learnings for ${result.taskId}`,
47
+ ``,
48
+ `Task: ${result.taskTitle}`,
49
+ ``,
50
+ `### Relevant Learnings`,
51
+ ``
52
+ ];
53
+ if (result.learnings.length === 0) {
54
+ lines.push("_No relevant learnings found._");
55
+ }
56
+ else {
57
+ for (const l of result.learnings) {
58
+ const score = (l.relevanceScore * 100).toFixed(0);
59
+ const category = l.category ? ` [${l.category}]` : "";
60
+ lines.push(`- **${score}%**${category} ${l.content}`);
61
+ }
62
+ }
63
+ lines.push("");
64
+ return lines.join("\n");
65
+ }
66
+ // --- Learning formatters ---
67
+ export function formatLearningSearchResult(r) {
68
+ const score = (r.relevanceScore * 100).toFixed(0);
69
+ const category = r.category ? ` [${r.category}]` : "";
70
+ return ` #${r.id} (${score}%)${category} ${r.content}`;
71
+ }
72
+ // --- Helpers ---
73
+ export function truncate(str, maxLen) {
74
+ return str.length > maxLen ? str.slice(0, maxLen) + "..." : str;
75
+ }
76
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
package/dist/tx ADDED
Binary file
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Shared CLI flag parsing utilities.
3
+ *
4
+ * Centralizes numeric flag validation to prevent parseInt/parseFloat NaN bugs.
5
+ */
6
+ import type { TaskId } from "@jamesaphoenix/tx-types";
7
+ export type Flags = Record<string, string | boolean>;
8
+ /**
9
+ * Get a string flag value from parsed flags, checking multiple names.
10
+ * Returns undefined if no matching flag is found or if the flag is boolean.
11
+ */
12
+ export declare function opt(flags: Flags, ...names: string[]): string | undefined;
13
+ /**
14
+ * Check if a boolean flag is set, checking multiple names.
15
+ */
16
+ export declare function flag(flags: Flags, ...names: string[]): boolean;
17
+ /**
18
+ * Parse an optional integer flag from CLI flags.
19
+ *
20
+ * Returns undefined if the flag is not present.
21
+ * Exits with an error if the value is not a valid integer.
22
+ *
23
+ * @example
24
+ * const limit = parseIntOpt(flags, "limit", "limit", "n") ?? 10
25
+ * const score = parseIntOpt(flags, "score", "score", "s")
26
+ */
27
+ export declare function parseIntOpt(flags: Flags, flagName: string, ...names: string[]): number | undefined;
28
+ /**
29
+ * Parse an optional float flag from CLI flags.
30
+ *
31
+ * Returns undefined if the flag is not present.
32
+ * Exits with an error if the value is not a valid number.
33
+ *
34
+ * @example
35
+ * const minScore = parseFloatOpt(flags, "min-score", "min-score") ?? 0.3
36
+ */
37
+ export declare function parseFloatOpt(flags: Flags, flagName: string, ...names: string[]): number | undefined;
38
+ /**
39
+ * Validate a task ID string matches the tx-[a-z0-9]{6,12} format.
40
+ *
41
+ * Exits with a clear error if the format is invalid, preventing confusing
42
+ * "Task not found" errors from reaching the database layer.
43
+ */
44
+ export declare function parseTaskId(id: string): TaskId;
45
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/utils/parse.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGrD,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAA;AAEpD;;;GAGG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAMxE;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAE9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,KAAK,EAAE,MAAM,EAAE,GACjB,MAAM,GAAG,SAAS,CASpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,KAAK,EAAE,MAAM,EAAE,GACjB,MAAM,GAAG,SAAS,CASpB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAM9C"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Shared CLI flag parsing utilities.
3
+ *
4
+ * Centralizes numeric flag validation to prevent parseInt/parseFloat NaN bugs.
5
+ */
6
+ import { isValidTaskId } from "@jamesaphoenix/tx-types";
7
+ /**
8
+ * Get a string flag value from parsed flags, checking multiple names.
9
+ * Returns undefined if no matching flag is found or if the flag is boolean.
10
+ */
11
+ export function opt(flags, ...names) {
12
+ for (const n of names) {
13
+ const v = flags[n];
14
+ if (typeof v === "string")
15
+ return v;
16
+ }
17
+ return undefined;
18
+ }
19
+ /**
20
+ * Check if a boolean flag is set, checking multiple names.
21
+ */
22
+ export function flag(flags, ...names) {
23
+ return names.some(n => flags[n] === true);
24
+ }
25
+ /**
26
+ * Parse an optional integer flag from CLI flags.
27
+ *
28
+ * Returns undefined if the flag is not present.
29
+ * Exits with an error if the value is not a valid integer.
30
+ *
31
+ * @example
32
+ * const limit = parseIntOpt(flags, "limit", "limit", "n") ?? 10
33
+ * const score = parseIntOpt(flags, "score", "score", "s")
34
+ */
35
+ export function parseIntOpt(flags, flagName, ...names) {
36
+ const val = opt(flags, ...names);
37
+ if (val === undefined)
38
+ return undefined;
39
+ const parsed = parseInt(val, 10);
40
+ if (!Number.isFinite(parsed)) {
41
+ console.error(`Invalid value for --${flagName}: "${val}" is not a valid finite number`);
42
+ process.exit(1);
43
+ }
44
+ return parsed;
45
+ }
46
+ /**
47
+ * Parse an optional float flag from CLI flags.
48
+ *
49
+ * Returns undefined if the flag is not present.
50
+ * Exits with an error if the value is not a valid number.
51
+ *
52
+ * @example
53
+ * const minScore = parseFloatOpt(flags, "min-score", "min-score") ?? 0.3
54
+ */
55
+ export function parseFloatOpt(flags, flagName, ...names) {
56
+ const val = opt(flags, ...names);
57
+ if (val === undefined)
58
+ return undefined;
59
+ const parsed = parseFloat(val);
60
+ if (!Number.isFinite(parsed)) {
61
+ console.error(`Invalid value for --${flagName}: "${val}" is not a valid finite number`);
62
+ process.exit(1);
63
+ }
64
+ return parsed;
65
+ }
66
+ /**
67
+ * Validate a task ID string matches the tx-[a-z0-9]{6,12} format.
68
+ *
69
+ * Exits with a clear error if the format is invalid, preventing confusing
70
+ * "Task not found" errors from reaching the database layer.
71
+ */
72
+ export function parseTaskId(id) {
73
+ if (!isValidTaskId(id)) {
74
+ console.error(`Invalid task ID: "${id}". Expected format: tx-[a-z0-9]{6,12}`);
75
+ process.exit(1);
76
+ }
77
+ return id;
78
+ }
79
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/utils/parse.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAIvD;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,KAAY,EAAE,GAAG,KAAe;IAClD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAClB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,KAAY,EAAE,GAAG,KAAe;IACnD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;AAC3C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACzB,KAAY,EACZ,QAAgB,EAChB,GAAG,KAAe;IAElB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAA;IAChC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,uBAAuB,QAAQ,MAAM,GAAG,gCAAgC,CAAC,CAAA;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAY,EACZ,QAAgB,EAChB,GAAG,KAAe;IAElB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAA;IAChC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,uBAAuB,QAAQ,MAAM,GAAG,gCAAgC,CAAC,CAAA;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,uCAAuC,CAAC,CAAA;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.d.ts","sourceRoot":"","sources":["../../src/utils/parse.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,140 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { opt, flag, parseIntOpt, parseFloatOpt } from "./parse.js";
3
+ describe("opt", () => {
4
+ it("returns string value for matching flag", () => {
5
+ const flags = { limit: "10", json: true };
6
+ expect(opt(flags, "limit")).toBe("10");
7
+ });
8
+ it("returns undefined for boolean flag", () => {
9
+ const flags = { json: true };
10
+ expect(opt(flags, "json")).toBeUndefined();
11
+ });
12
+ it("returns undefined for missing flag", () => {
13
+ const flags = {};
14
+ expect(opt(flags, "limit")).toBeUndefined();
15
+ });
16
+ it("returns first matching flag when multiple names given", () => {
17
+ const flags = { n: "5" };
18
+ expect(opt(flags, "limit", "n")).toBe("5");
19
+ });
20
+ it("prefers earlier name in list", () => {
21
+ const flags = { limit: "10", n: "5" };
22
+ expect(opt(flags, "limit", "n")).toBe("10");
23
+ });
24
+ });
25
+ describe("flag", () => {
26
+ it("returns true when flag is set", () => {
27
+ const flags = { json: true };
28
+ expect(flag(flags, "json")).toBe(true);
29
+ });
30
+ it("returns false when flag is not set", () => {
31
+ const flags = {};
32
+ expect(flag(flags, "json")).toBe(false);
33
+ });
34
+ it("returns false when flag is a string value", () => {
35
+ const flags = { json: "true" };
36
+ expect(flag(flags, "json")).toBe(false);
37
+ });
38
+ it("returns true if any name matches", () => {
39
+ const flags = { h: true };
40
+ expect(flag(flags, "help", "h")).toBe(true);
41
+ });
42
+ });
43
+ describe("parseIntOpt", () => {
44
+ let mockExit;
45
+ let mockError;
46
+ beforeEach(() => {
47
+ mockExit = vi.spyOn(process, "exit").mockImplementation(() => undefined);
48
+ mockError = vi.spyOn(console, "error").mockImplementation(() => { });
49
+ });
50
+ it("returns undefined when flag is not present", () => {
51
+ const flags = {};
52
+ expect(parseIntOpt(flags, "limit", "limit", "n")).toBeUndefined();
53
+ });
54
+ it("returns parsed integer for valid value", () => {
55
+ const flags = { limit: "42" };
56
+ expect(parseIntOpt(flags, "limit", "limit")).toBe(42);
57
+ });
58
+ it("returns parsed integer for short alias", () => {
59
+ const flags = { n: "5" };
60
+ expect(parseIntOpt(flags, "limit", "limit", "n")).toBe(5);
61
+ });
62
+ it("exits with error for non-numeric value", () => {
63
+ const flags = { limit: "abc" };
64
+ parseIntOpt(flags, "limit", "limit");
65
+ expect(mockError).toHaveBeenCalledWith('Invalid value for --limit: "abc" is not a valid finite number');
66
+ expect(mockExit).toHaveBeenCalledWith(1);
67
+ });
68
+ it("exits with error for empty string value", () => {
69
+ const flags = { limit: "" };
70
+ parseIntOpt(flags, "limit", "limit");
71
+ expect(mockExit).toHaveBeenCalledWith(1);
72
+ });
73
+ it("parses negative integers", () => {
74
+ const flags = { score: "-5" };
75
+ expect(parseIntOpt(flags, "score", "score")).toBe(-5);
76
+ });
77
+ it("parses zero", () => {
78
+ const flags = { limit: "0" };
79
+ expect(parseIntOpt(flags, "limit", "limit")).toBe(0);
80
+ });
81
+ it("truncates floats to integer", () => {
82
+ const flags = { limit: "3.7" };
83
+ expect(parseIntOpt(flags, "limit", "limit")).toBe(3);
84
+ });
85
+ it("ignores boolean flags", () => {
86
+ const flags = { limit: true };
87
+ expect(parseIntOpt(flags, "limit", "limit")).toBeUndefined();
88
+ });
89
+ });
90
+ describe("parseFloatOpt", () => {
91
+ let mockExit;
92
+ let mockError;
93
+ beforeEach(() => {
94
+ mockExit = vi.spyOn(process, "exit").mockImplementation(() => undefined);
95
+ mockError = vi.spyOn(console, "error").mockImplementation(() => { });
96
+ });
97
+ it("returns undefined when flag is not present", () => {
98
+ const flags = {};
99
+ expect(parseFloatOpt(flags, "score", "score")).toBeUndefined();
100
+ });
101
+ it("returns parsed float for valid value", () => {
102
+ const flags = { score: "0.75" };
103
+ expect(parseFloatOpt(flags, "score", "score")).toBe(0.75);
104
+ });
105
+ it("returns parsed float for integer value", () => {
106
+ const flags = { "min-score": "3" };
107
+ expect(parseFloatOpt(flags, "min-score", "min-score")).toBe(3);
108
+ });
109
+ it("exits with error for non-numeric value", () => {
110
+ const flags = { score: "high" };
111
+ parseFloatOpt(flags, "score", "score");
112
+ expect(mockError).toHaveBeenCalledWith('Invalid value for --score: "high" is not a valid finite number');
113
+ expect(mockExit).toHaveBeenCalledWith(1);
114
+ });
115
+ it("parses negative floats", () => {
116
+ const flags = { score: "-0.5" };
117
+ expect(parseFloatOpt(flags, "score", "score")).toBe(-0.5);
118
+ });
119
+ it("parses zero", () => {
120
+ const flags = { score: "0" };
121
+ expect(parseFloatOpt(flags, "score", "score")).toBe(0);
122
+ });
123
+ it("exits with error for Infinity", () => {
124
+ const flags = { score: "Infinity" };
125
+ parseFloatOpt(flags, "score", "score");
126
+ expect(mockError).toHaveBeenCalledWith('Invalid value for --score: "Infinity" is not a valid finite number');
127
+ expect(mockExit).toHaveBeenCalledWith(1);
128
+ });
129
+ it("exits with error for -Infinity", () => {
130
+ const flags = { score: "-Infinity" };
131
+ parseFloatOpt(flags, "score", "score");
132
+ expect(mockError).toHaveBeenCalledWith('Invalid value for --score: "-Infinity" is not a valid finite number');
133
+ expect(mockExit).toHaveBeenCalledWith(1);
134
+ });
135
+ it("ignores boolean flags", () => {
136
+ const flags = { score: true };
137
+ expect(parseFloatOpt(flags, "score", "score")).toBeUndefined();
138
+ });
139
+ });
140
+ //# sourceMappingURL=parse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.js","sourceRoot":"","sources":["../../src/utils/parse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const CLI_VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,WAAW,EAAE,MAA+B,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CLI version — read from package.json at runtime so there's a single source of truth.
3
+ */
4
+ import { readFileSync } from "node:fs";
5
+ import { resolve, dirname } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ const __dir = dirname(fileURLToPath(import.meta.url));
8
+ const pkg = JSON.parse(readFileSync(resolve(__dir, "../package.json"), "utf-8"));
9
+ export const CLI_VERSION = pkg.version ?? "0.0.0";
10
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAEhF,MAAM,CAAC,MAAM,WAAW,GAAW,GAAG,CAAC,OAAO,IAAI,OAAO,CAAA"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@jamesaphoenix/tx-cli",
3
+ "version": "0.4.3",
4
+ "description": "TX command line tool - task management for AI agents and humans",
5
+ "type": "module",
6
+ "main": "./dist/cli.js",
7
+ "types": "./dist/cli.d.ts",
8
+ "bin": {
9
+ "tx": "./dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/cli.d.ts",
14
+ "import": "./dist/cli.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -b",
22
+ "build:binary": "bun build ./src/cli.ts --compile --outfile dist/tx --minify --external @anthropic-ai/sdk --external openai --external node-llama-cpp --external @node-llama-cpp/*",
23
+ "build:darwin-arm64": "bun build ./src/cli.ts --compile --outfile dist/tx-darwin-arm64 --target bun-darwin-arm64 --minify --external @anthropic-ai/sdk --external openai --external node-llama-cpp --external @node-llama-cpp/*",
24
+ "build:darwin-x64": "bun build ./src/cli.ts --compile --outfile dist/tx-darwin-x64 --target bun-darwin-x64 --minify --external @anthropic-ai/sdk --external openai --external node-llama-cpp --external @node-llama-cpp/*",
25
+ "build:linux-x64": "bun build ./src/cli.ts --compile --outfile dist/tx-linux-x64 --target bun-linux-x64 --minify --external @anthropic-ai/sdk --external openai --external node-llama-cpp --external @node-llama-cpp/*",
26
+ "build:linux-arm64": "bun build ./src/cli.ts --compile --outfile dist/tx-linux-arm64 --target bun-linux-arm64 --minify --external @anthropic-ai/sdk --external openai --external node-llama-cpp --external @node-llama-cpp/*",
27
+ "build:all": "bun run build:darwin-arm64 && bun run build:darwin-x64 && bun run build:linux-x64 && bun run build:linux-arm64",
28
+ "typecheck": "tsc --noEmit",
29
+ "lint": "eslint src/",
30
+ "test": "bun vitest run --passWithNoTests"
31
+ },
32
+ "dependencies": {
33
+ "@jamesaphoenix/tx-core": "*",
34
+ "@jamesaphoenix/tx-test-utils": "*",
35
+ "@jamesaphoenix/tx-types": "*",
36
+ "effect": "^3.19.15"
37
+ },
38
+ "peerDependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.25.3"
40
+ },
41
+ "peerDependenciesMeta": {
42
+ "@modelcontextprotocol/sdk": {
43
+ "optional": true
44
+ }
45
+ },
46
+ "devDependencies": {
47
+ "@types/bun": "^1.2.0",
48
+ "@types/node": "^25.2.0",
49
+ "typescript": "^5.7.0",
50
+ "vitest": "^4.0.18"
51
+ },
52
+ "keywords": [
53
+ "tx",
54
+ "cli",
55
+ "task-management",
56
+ "effect-ts"
57
+ ]
58
+ }