@tlog/cli 0.1.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 (40) hide show
  1. package/README.md +307 -0
  2. package/bin/.gitkeep +0 -0
  3. package/bin/tlog.js +4 -0
  4. package/dist/commands/delete.d.ts +8 -0
  5. package/dist/commands/delete.d.ts.map +1 -0
  6. package/dist/commands/delete.js +104 -0
  7. package/dist/commands/delete.js.map +1 -0
  8. package/dist/commands/init-template.d.ts +12 -0
  9. package/dist/commands/init-template.d.ts.map +1 -0
  10. package/dist/commands/init-template.js +168 -0
  11. package/dist/commands/init-template.js.map +1 -0
  12. package/dist/commands/related.d.ts +13 -0
  13. package/dist/commands/related.d.ts.map +1 -0
  14. package/dist/commands/related.js +193 -0
  15. package/dist/commands/related.js.map +1 -0
  16. package/dist/commands/stats.d.ts +8 -0
  17. package/dist/commands/stats.d.ts.map +1 -0
  18. package/dist/commands/stats.js +62 -0
  19. package/dist/commands/stats.js.map +1 -0
  20. package/dist/commands/suite-case.d.ts +20 -0
  21. package/dist/commands/suite-case.d.ts.map +1 -0
  22. package/dist/commands/suite-case.js +83 -0
  23. package/dist/commands/suite-case.js.map +1 -0
  24. package/dist/commands/update.d.ts +33 -0
  25. package/dist/commands/update.d.ts.map +1 -0
  26. package/dist/commands/update.js +159 -0
  27. package/dist/commands/update.js.map +1 -0
  28. package/dist/commands/validate-list.d.ts +36 -0
  29. package/dist/commands/validate-list.d.ts.map +1 -0
  30. package/dist/commands/validate-list.js +270 -0
  31. package/dist/commands/validate-list.js.map +1 -0
  32. package/dist/core.d.ts +30 -0
  33. package/dist/core.d.ts.map +1 -0
  34. package/dist/core.js +143 -0
  35. package/dist/core.js.map +1 -0
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +218 -0
  39. package/dist/index.js.map +1 -0
  40. package/package.json +39 -0
@@ -0,0 +1,36 @@
1
+ import { type GlobalOptions } from "../core.js";
2
+ export interface ValidateOptions {
3
+ dir: string;
4
+ failOnWarning: boolean;
5
+ format?: string;
6
+ watch?: boolean;
7
+ watchInterval?: string;
8
+ }
9
+ export interface ListTemplatesOptions {
10
+ dir: string;
11
+ format?: string;
12
+ output?: string;
13
+ }
14
+ export interface SuiteListOptions {
15
+ dir: string;
16
+ id?: string;
17
+ format?: string;
18
+ output?: string;
19
+ }
20
+ export interface CaseListOptions {
21
+ dir: string;
22
+ id?: string;
23
+ tag?: string;
24
+ owners?: string;
25
+ scopedOnly?: boolean;
26
+ issueHas?: string;
27
+ issueStatus?: string;
28
+ status?: string;
29
+ format?: string;
30
+ output?: string;
31
+ }
32
+ export declare function runValidate(cwd: string, options: ValidateOptions, globalOptions: GlobalOptions): void;
33
+ export declare function runListTemplates(cwd: string, options: ListTemplatesOptions, globalOptions: GlobalOptions): void;
34
+ export declare function runSuiteList(cwd: string, options: SuiteListOptions, globalOptions: GlobalOptions): void;
35
+ export declare function runCaseList(cwd: string, options: CaseListOptions, globalOptions: GlobalOptions): void;
36
+ //# sourceMappingURL=validate-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-list.d.ts","sourceRoot":"","sources":["../../src/commands/validate-list.ts"],"names":[],"mappings":"AAGA,OAAO,EASL,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAkBD,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAuDD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,CAiDrG;AAiED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,CA+B/G;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,CA8BvG;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,CAkGrG"}
@@ -0,0 +1,270 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { ISSUE_STATUSES, detectEntityType, normalizeTlogPath, parseYaml, validateCase, validateSuite } from "@tlog/shared";
4
+ import { CliError, emitSuccess, ensureDirectory, formatOf, outputPath, splitCsv, toStatus, walkYamlFiles } from "../core.js";
5
+ function csvCell(value) {
6
+ if (value.includes(",") || value.includes("\"") || value.includes("\n")) {
7
+ return `"${value.replaceAll("\"", "\"\"")}"`;
8
+ }
9
+ return value;
10
+ }
11
+ function toCsv(headers, rows) {
12
+ return [headers.join(","), ...rows.map((row) => row.map(csvCell).join(","))].join("\n");
13
+ }
14
+ function toAlignedTable(headers, rows) {
15
+ const widths = headers.map((header, index) => Math.max(header.length, ...rows.map((row) => (row[index] ?? "").length)));
16
+ const padRow = (row) => row.map((cell, index) => cell.padEnd(widths[index])).join(" ");
17
+ const lines = [padRow(headers)];
18
+ if (rows.length === 0) {
19
+ lines.push("(empty)");
20
+ return lines.join("\n");
21
+ }
22
+ lines.push(...rows.map((row) => padRow(row)));
23
+ return lines.join("\n");
24
+ }
25
+ function emitListResult(command, headers, rows, data, format, output) {
26
+ const content = format === "json"
27
+ ? JSON.stringify({ ok: true, command, data }, null, 2)
28
+ : format === "csv"
29
+ ? toCsv(headers, rows)
30
+ : toAlignedTable(headers, rows);
31
+ if (output) {
32
+ const outPath = resolve(process.cwd(), output);
33
+ mkdirSync(dirname(outPath), { recursive: true });
34
+ writeFileSync(outPath, `${content}\n`, "utf8");
35
+ process.stdout.write(`Wrote: ${normalizeTlogPath(outPath)}\n`);
36
+ return;
37
+ }
38
+ process.stdout.write(`${content}\n`);
39
+ }
40
+ export function runValidate(cwd, options, globalOptions) {
41
+ const format = formatOf(globalOptions, options.format);
42
+ const rootDir = resolve(cwd, options.dir);
43
+ ensureDirectory(rootDir, "Validation target does not exist");
44
+ const intervalMs = Number.parseInt(options.watchInterval ?? "1000", 10);
45
+ if (options.watch) {
46
+ if (process.env.CI) {
47
+ throw new CliError("Watch mode is disabled in CI environment.");
48
+ }
49
+ if (!Number.isFinite(intervalMs) || intervalMs < 200) {
50
+ throw new CliError(`Invalid watch interval: ${options.watchInterval ?? ""}. Expected integer >= 200.`);
51
+ }
52
+ let previous = null;
53
+ let previousSignature = "";
54
+ const runOnce = () => {
55
+ const signature = buildWatchSignature(rootDir);
56
+ if (signature === previousSignature) {
57
+ return;
58
+ }
59
+ previousSignature = signature;
60
+ const current = collectValidation(cwd, rootDir, options.failOnWarning);
61
+ if (previous) {
62
+ process.stdout.write(`Change detected: errors ${previous.errors.length} -> ${current.errors.length}, warnings ${previous.warnings.length} -> ${current.warnings.length}\n`);
63
+ }
64
+ emitValidationResult(current, format, options.failOnWarning);
65
+ previous = current;
66
+ };
67
+ runOnce();
68
+ process.stdout.write(`Watching: ${normalizeTlogPath(rootDir)} (interval=${intervalMs}ms)\n`);
69
+ const timer = setInterval(runOnce, intervalMs);
70
+ process.on("SIGINT", () => {
71
+ clearInterval(timer);
72
+ process.stdout.write("Stopped watch mode.\n");
73
+ process.exit(0);
74
+ });
75
+ return;
76
+ }
77
+ const summary = collectValidation(cwd, rootDir, options.failOnWarning);
78
+ emitValidationResult(summary, format, options.failOnWarning);
79
+ if (summary.hasFailure) {
80
+ process.exitCode = 1;
81
+ }
82
+ }
83
+ function collectValidation(cwd, rootDir, failOnWarning) {
84
+ const files = walkYamlFiles(rootDir);
85
+ const items = [];
86
+ for (const file of files) {
87
+ try {
88
+ const raw = parseYaml(readFileSync(file, "utf8"));
89
+ const type = detectEntityType(file);
90
+ const validation = type === "suite" ? validateSuite(raw) : validateCase(raw);
91
+ items.push({
92
+ path: outputPath(cwd, file),
93
+ type,
94
+ errors: validation.errors.map((error) => `${error.path}: ${error.message}`),
95
+ warnings: validation.warnings.map((warning) => `${warning.path}: ${warning.message}`)
96
+ });
97
+ }
98
+ catch (error) {
99
+ const message = error instanceof Error ? error.message : String(error);
100
+ items.push({
101
+ path: outputPath(cwd, file),
102
+ type: detectEntityType(file),
103
+ errors: [message],
104
+ warnings: []
105
+ });
106
+ }
107
+ }
108
+ const errors = items.flatMap((item) => item.errors.map((message) => `${item.path}: ${message}`));
109
+ const warnings = items.flatMap((item) => item.warnings.map((message) => `${item.path}: ${message}`));
110
+ const hasFailure = errors.length > 0 || (failOnWarning && warnings.length > 0);
111
+ return { rootDir, files, items, errors, warnings, hasFailure };
112
+ }
113
+ function emitValidationResult(summary, format, failOnWarning) {
114
+ emitSuccess("validate", {
115
+ dir: normalizeTlogPath(summary.rootDir),
116
+ totalFiles: summary.files.length,
117
+ errorCount: summary.errors.length,
118
+ warningCount: summary.warnings.length,
119
+ failOnWarning,
120
+ items: summary.items
121
+ }, format, [
122
+ `${summary.hasFailure ? "Validation failed" : "Validation passed"}: files=${summary.files.length}, errors=${summary.errors.length}, warnings=${summary.warnings.length}`,
123
+ ...summary.errors.map((entry) => `ERROR ${entry}`),
124
+ ...summary.warnings.map((entry) => `WARN ${entry}`)
125
+ ]);
126
+ }
127
+ function buildWatchSignature(rootDir) {
128
+ const files = walkYamlFiles(rootDir).sort();
129
+ return files
130
+ .map((file) => {
131
+ const stat = statSync(file);
132
+ return `${file}:${stat.mtimeMs}:${stat.size}`;
133
+ })
134
+ .join("|");
135
+ }
136
+ export function runListTemplates(cwd, options, globalOptions) {
137
+ const format = formatOf(globalOptions, options.format);
138
+ const rootDir = resolve(cwd, options.dir);
139
+ ensureDirectory(rootDir, "Template search directory does not exist");
140
+ const items = readdirSync(rootDir, { withFileTypes: true })
141
+ .filter((entry) => entry.isDirectory())
142
+ .map((entry) => {
143
+ const fullPath = join(rootDir, entry.name);
144
+ return {
145
+ name: entry.name,
146
+ path: normalizeTlogPath(fullPath),
147
+ valid: existsSync(join(fullPath, "index.yaml"))
148
+ };
149
+ })
150
+ .filter((entry) => entry.valid)
151
+ .sort((a, b) => a.name.localeCompare(b.name))
152
+ .map(({ valid: _, ...rest }) => rest);
153
+ emitListResult("list templates", ["name", "path"], items.map((item) => [item.name, item.path]), {
154
+ dir: normalizeTlogPath(rootDir),
155
+ count: items.length,
156
+ items
157
+ }, format, options.output);
158
+ }
159
+ export function runSuiteList(cwd, options, globalOptions) {
160
+ const format = formatOf(globalOptions, options.format);
161
+ const rootDir = resolve(cwd, options.dir);
162
+ ensureDirectory(rootDir, "Suite search directory does not exist");
163
+ const files = walkYamlFiles(rootDir).filter((path) => detectEntityType(path) === "suite");
164
+ const items = files
165
+ .map((file) => {
166
+ const raw = parseYaml(readFileSync(file, "utf8"));
167
+ return {
168
+ id: typeof raw.id === "string" ? raw.id : "",
169
+ path: outputPath(cwd, file)
170
+ };
171
+ })
172
+ .filter((item) => item.id.length > 0)
173
+ .filter((item) => (options.id ? item.id.includes(options.id) : true))
174
+ .sort((a, b) => a.id.localeCompare(b.id));
175
+ emitListResult("suite list", ["id", "path"], items.map((item) => [item.id, item.path]), {
176
+ dir: normalizeTlogPath(rootDir),
177
+ count: items.length,
178
+ items
179
+ }, format, options.output);
180
+ }
181
+ export function runCaseList(cwd, options, globalOptions) {
182
+ const format = formatOf(globalOptions, options.format);
183
+ const rootDir = resolve(cwd, options.dir);
184
+ ensureDirectory(rootDir, "Case search directory does not exist");
185
+ const hasStatusFilter = options.status !== undefined;
186
+ const statusFilter = hasStatusFilter ? toStatus(options.status) : undefined;
187
+ const tagFilter = options.tag?.trim();
188
+ const scopedOnly = options.scopedOnly === true;
189
+ const ownerFilters = splitCsv(options.owners);
190
+ const issueHasKeyword = options.issueHas?.trim().toLowerCase();
191
+ const issueStatusFilter = options.issueStatus?.trim();
192
+ const validIssueStatuses = ISSUE_STATUSES;
193
+ if (issueStatusFilter && !validIssueStatuses.includes(issueStatusFilter)) {
194
+ throw new CliError(`Invalid issue status: ${issueStatusFilter}. Expected open|doing|resolved|pending.`);
195
+ }
196
+ const suiteOwnersCache = new Map();
197
+ const files = walkYamlFiles(rootDir).filter((path) => detectEntityType(path) === "case");
198
+ const items = files
199
+ .map((file) => {
200
+ const raw = parseYaml(readFileSync(file, "utf8"));
201
+ const suiteDir = dirname(file);
202
+ const suitePath = join(suiteDir, "index.yaml");
203
+ if (!suiteOwnersCache.has(suitePath)) {
204
+ let owners = [];
205
+ if (existsSync(suitePath)) {
206
+ try {
207
+ const suiteRaw = parseYaml(readFileSync(suitePath, "utf8"));
208
+ owners = Array.isArray(suiteRaw.owners)
209
+ ? suiteRaw.owners.filter((owner) => typeof owner === "string")
210
+ : [];
211
+ }
212
+ catch {
213
+ owners = [];
214
+ }
215
+ }
216
+ suiteOwnersCache.set(suitePath, owners);
217
+ }
218
+ const issues = Array.isArray(raw.issues)
219
+ ? raw.issues.filter((issue) => issue !== null && typeof issue === "object")
220
+ : [];
221
+ const issueStatuses = issues
222
+ .map((issue) => issue.status)
223
+ .filter((status) => typeof status === "string");
224
+ const tags = Array.isArray(raw.tags) ? raw.tags.filter((tag) => typeof tag === "string") : [];
225
+ return {
226
+ id: typeof raw.id === "string" ? raw.id : "",
227
+ status: typeof raw.status === "string" || raw.status === null ? raw.status : null,
228
+ scoped: raw.scoped === true,
229
+ suiteOwners: suiteOwnersCache.get(suitePath) ?? [],
230
+ issueStatuses,
231
+ issues,
232
+ path: outputPath(cwd, file),
233
+ tags
234
+ };
235
+ })
236
+ .filter((item) => item.id.length > 0)
237
+ .filter((item) => (options.id ? item.id.includes(options.id) : true))
238
+ .filter((item) => (hasStatusFilter ? item.status === statusFilter : true))
239
+ .filter((item) => (tagFilter ? item.tags.includes(tagFilter) : true))
240
+ .filter((item) => (scopedOnly ? item.scoped : true))
241
+ .filter((item) => (ownerFilters.length > 0 ? ownerFilters.some((owner) => item.suiteOwners.includes(owner)) : true))
242
+ .filter((item) => (issueStatusFilter ? item.issueStatuses.includes(issueStatusFilter) : true))
243
+ .filter((item) => {
244
+ if (!issueHasKeyword) {
245
+ return true;
246
+ }
247
+ return item.issues.some((issue) => {
248
+ const parts = [
249
+ issue.incident,
250
+ issue.status,
251
+ ...(Array.isArray(issue.owners) ? issue.owners : []),
252
+ ...(Array.isArray(issue.causes) ? issue.causes : []),
253
+ ...(Array.isArray(issue.solutions) ? issue.solutions : []),
254
+ ...(Array.isArray(issue.related) ? issue.related : []),
255
+ ...(Array.isArray(issue.remarks) ? issue.remarks : [])
256
+ ]
257
+ .filter((value) => typeof value === "string")
258
+ .map((value) => value.toLowerCase());
259
+ return parts.some((value) => value.includes(issueHasKeyword));
260
+ });
261
+ })
262
+ .map((item) => ({ id: item.id, status: item.status, path: item.path }))
263
+ .sort((a, b) => a.id.localeCompare(b.id));
264
+ emitListResult("case list", ["id", "status", "path"], items.map((item) => [item.id, item.status ?? "null", item.path]), {
265
+ dir: normalizeTlogPath(rootDir),
266
+ count: items.length,
267
+ items
268
+ }, format, options.output);
269
+ }
270
+ //# sourceMappingURL=validate-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-list.js","sourceRoot":"","sources":["../../src/commands/validate-list.ts"],"names":[],"mappings":"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"}
package/dist/core.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import { Command } from "commander";
2
+ import { type TestCaseStatus } from "@tlog/shared";
3
+ export interface GlobalOptions {
4
+ dryRun: boolean;
5
+ json: boolean;
6
+ yes: boolean;
7
+ }
8
+ export type OutputFormat = "text" | "json" | "csv";
9
+ interface CliErrorOptions {
10
+ exitCode?: number;
11
+ details?: string[];
12
+ }
13
+ export declare class CliError extends Error {
14
+ readonly exitCode: number;
15
+ readonly details: string[];
16
+ constructor(message: string, options?: CliErrorOptions);
17
+ }
18
+ export declare function splitCsv(value?: string): string[];
19
+ export declare function ensureValidId(id: string, label?: string): void;
20
+ export declare function toStatus(value: string | undefined): TestCaseStatus | null;
21
+ export declare function ensureDirectory(path: string, messagePrefix: string): void;
22
+ export declare function walkYamlFiles(rootDir: string): string[];
23
+ export declare function findDuplicateId(rootDir: string, id: string): string | null;
24
+ export declare function formatOf(globalOptions: GlobalOptions, format?: string): OutputFormat;
25
+ export declare function emitSuccess(command: string, data: Record<string, unknown>, format: OutputFormat, textLines: string[]): void;
26
+ export declare function emitFailure(command: string, error: CliError | Error, format: OutputFormat): void;
27
+ export declare function outputPath(rootDir: string, targetPath: string): string;
28
+ export declare function getGlobals(command: Command): GlobalOptions;
29
+ export {};
30
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAmD,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEpG,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnD,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEtB,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;CAM3D;AAED,wBAAgB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CASjD;AAID,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,SAAO,GAAG,IAAI,CAI5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAWzE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAQzE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBvD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB1E;AAED,wBAAgB,QAAQ,CAAC,aAAa,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CASpF;AAUD,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CAiBN;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAyBhG;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAO1D"}
package/dist/core.js ADDED
@@ -0,0 +1,143 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { join, relative } from "node:path";
3
+ import { TESTCASE_STATUSES, normalizeTlogPath, parseYaml } from "@tlog/shared";
4
+ export class CliError extends Error {
5
+ exitCode;
6
+ details;
7
+ constructor(message, options = {}) {
8
+ super(message);
9
+ this.name = "CliError";
10
+ this.exitCode = options.exitCode ?? 1;
11
+ this.details = options.details ?? [];
12
+ }
13
+ }
14
+ export function splitCsv(value) {
15
+ if (!value) {
16
+ return [];
17
+ }
18
+ return value
19
+ .split(",")
20
+ .map((item) => item.trim())
21
+ .filter((item) => item.length > 0);
22
+ }
23
+ const ID_PATTERN = /^[A-Za-z0-9_-]+$/;
24
+ export function ensureValidId(id, label = "id") {
25
+ if (!ID_PATTERN.test(id)) {
26
+ throw new CliError(`Invalid ${label}: ${id}. Expected pattern ^[A-Za-z0-9_-]+$.`);
27
+ }
28
+ }
29
+ export function toStatus(value) {
30
+ if (value === undefined || value === "null") {
31
+ return null;
32
+ }
33
+ const valid = TESTCASE_STATUSES.filter((item) => item !== null);
34
+ if (valid.includes(value)) {
35
+ return value;
36
+ }
37
+ throw new CliError(`Invalid status: ${value}. Expected todo|doing|done|null.`);
38
+ }
39
+ export function ensureDirectory(path, messagePrefix) {
40
+ if (!existsSync(path)) {
41
+ throw new CliError(`${messagePrefix}: ${path}`);
42
+ }
43
+ if (!statSync(path).isDirectory()) {
44
+ throw new CliError(`Not a directory: ${path}`);
45
+ }
46
+ }
47
+ export function walkYamlFiles(rootDir) {
48
+ const queue = [rootDir];
49
+ const files = [];
50
+ while (queue.length > 0) {
51
+ const current = queue.shift();
52
+ if (!current) {
53
+ continue;
54
+ }
55
+ const entries = readdirSync(current, { withFileTypes: true });
56
+ for (const entry of entries) {
57
+ const fullPath = join(current, entry.name);
58
+ if (entry.isDirectory()) {
59
+ queue.push(fullPath);
60
+ continue;
61
+ }
62
+ if (entry.isFile() && entry.name.endsWith(".yaml")) {
63
+ files.push(fullPath);
64
+ }
65
+ }
66
+ }
67
+ return files;
68
+ }
69
+ export function findDuplicateId(rootDir, id) {
70
+ if (!existsSync(rootDir)) {
71
+ return null;
72
+ }
73
+ const files = walkYamlFiles(rootDir);
74
+ for (const file of files) {
75
+ try {
76
+ const raw = parseYaml(readFileSync(file, "utf8"));
77
+ if (raw.id === id) {
78
+ return file;
79
+ }
80
+ }
81
+ catch {
82
+ continue;
83
+ }
84
+ }
85
+ return null;
86
+ }
87
+ export function formatOf(globalOptions, format) {
88
+ if (globalOptions.json || format === "json") {
89
+ return "json";
90
+ }
91
+ if (format === "csv") {
92
+ return "csv";
93
+ }
94
+ return "text";
95
+ }
96
+ function writeText(text) {
97
+ process.stdout.write(`${text}\n`);
98
+ }
99
+ function writeErrorText(text) {
100
+ process.stderr.write(`${text}\n`);
101
+ }
102
+ export function emitSuccess(command, data, format, textLines) {
103
+ if (format === "json") {
104
+ writeText(JSON.stringify({
105
+ ok: true,
106
+ command,
107
+ data
108
+ }, null, 2));
109
+ return;
110
+ }
111
+ writeText(textLines.join("\n"));
112
+ }
113
+ export function emitFailure(command, error, format) {
114
+ const details = error instanceof CliError ? error.details : [];
115
+ if (format === "json") {
116
+ writeErrorText(JSON.stringify({
117
+ ok: false,
118
+ command,
119
+ error: {
120
+ message: error.message,
121
+ details
122
+ }
123
+ }, null, 2));
124
+ return;
125
+ }
126
+ writeErrorText(`Error: ${error.message}`);
127
+ for (const detail of details) {
128
+ writeErrorText(`- ${detail}`);
129
+ }
130
+ }
131
+ export function outputPath(rootDir, targetPath) {
132
+ const rel = normalizeTlogPath(relative(rootDir, targetPath));
133
+ return rel.length > 0 && rel !== "." ? rel : normalizeTlogPath(targetPath);
134
+ }
135
+ export function getGlobals(command) {
136
+ const values = command.optsWithGlobals();
137
+ return {
138
+ dryRun: values.dryRun === true,
139
+ json: values.json === true,
140
+ yes: values.yes === true
141
+ };
142
+ }
143
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const cliVersion = "0.1.0";
2
+ export declare function initializeWorkspace(cwd: string): void;
3
+ export declare function runCli(argv: string[]): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,UAAU,UAAU,CAAC;AAElC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMrD;AAuMD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8B3C"}