taskin 0.1.0-beta.0

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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/commands/commands.types.d.ts +13 -0
  4. package/dist/commands/commands.types.js +6 -0
  5. package/dist/commands/commands.types.js.map +1 -0
  6. package/dist/commands/define-command/define-command.d.ts +6 -0
  7. package/dist/commands/define-command/define-command.js +27 -0
  8. package/dist/commands/define-command/define-command.js.map +1 -0
  9. package/dist/commands/define-command/define-command.test.d.ts +4 -0
  10. package/dist/commands/define-command/define-command.test.js +125 -0
  11. package/dist/commands/define-command/define-command.test.js.map +1 -0
  12. package/dist/commands/define-command/define-command.types.d.ts +49 -0
  13. package/dist/commands/define-command/define-command.types.js +5 -0
  14. package/dist/commands/define-command/define-command.types.js.map +1 -0
  15. package/dist/commands/define-command/index.d.ts +5 -0
  16. package/dist/commands/define-command/index.js +6 -0
  17. package/dist/commands/define-command/index.js.map +1 -0
  18. package/dist/commands/finish.d.ts +4 -0
  19. package/dist/commands/finish.js +69 -0
  20. package/dist/commands/finish.js.map +1 -0
  21. package/dist/commands/index.d.ts +9 -0
  22. package/dist/commands/index.js +10 -0
  23. package/dist/commands/index.js.map +1 -0
  24. package/dist/commands/init.d.ts +4 -0
  25. package/dist/commands/init.js +192 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/lint.d.ts +4 -0
  28. package/dist/commands/lint.js +31 -0
  29. package/dist/commands/lint.js.map +1 -0
  30. package/dist/commands/list.d.ts +4 -0
  31. package/dist/commands/list.js +132 -0
  32. package/dist/commands/list.js.map +1 -0
  33. package/dist/commands/pause.d.ts +4 -0
  34. package/dist/commands/pause.js +69 -0
  35. package/dist/commands/pause.js.map +1 -0
  36. package/dist/commands/start.d.ts +4 -0
  37. package/dist/commands/start.js +70 -0
  38. package/dist/commands/start.js.map +1 -0
  39. package/dist/index.d.ts +8 -0
  40. package/dist/index.js +38 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/lib/colors.d.ts +26 -0
  43. package/dist/lib/colors.js +42 -0
  44. package/dist/lib/colors.js.map +1 -0
  45. package/dist/lib/file-system-task-linter/file-system-task-linter.d.ts +36 -0
  46. package/dist/lib/file-system-task-linter/file-system-task-linter.js +219 -0
  47. package/dist/lib/file-system-task-linter/file-system-task-linter.js.map +1 -0
  48. package/dist/lib/file-system-task-linter/file-system-task-linter.mock.d.ts +81 -0
  49. package/dist/lib/file-system-task-linter/file-system-task-linter.mock.js +152 -0
  50. package/dist/lib/file-system-task-linter/file-system-task-linter.mock.js.map +1 -0
  51. package/dist/lib/file-system-task-linter/file-system-task-linter.test.d.ts +4 -0
  52. package/dist/lib/file-system-task-linter/file-system-task-linter.test.js +146 -0
  53. package/dist/lib/file-system-task-linter/file-system-task-linter.test.js.map +1 -0
  54. package/dist/lib/file-system-task-linter/file-system-task-linter.types.d.ts +52 -0
  55. package/dist/lib/file-system-task-linter/file-system-task-linter.types.js +6 -0
  56. package/dist/lib/file-system-task-linter/file-system-task-linter.types.js.map +1 -0
  57. package/dist/lib/file-system-task-linter/index.d.ts +6 -0
  58. package/dist/lib/file-system-task-linter/index.js +7 -0
  59. package/dist/lib/file-system-task-linter/index.js.map +1 -0
  60. package/dist/lib/help.d.ts +4 -0
  61. package/dist/lib/help.js +104 -0
  62. package/dist/lib/help.js.map +1 -0
  63. package/dist/lib/index.d.ts +6 -0
  64. package/dist/lib/index.js +7 -0
  65. package/dist/lib/index.js.map +1 -0
  66. package/dist/lib/provider-installer/index.d.ts +5 -0
  67. package/dist/lib/provider-installer/index.js +6 -0
  68. package/dist/lib/provider-installer/index.js.map +1 -0
  69. package/dist/lib/provider-installer/provider-installer.d.ts +28 -0
  70. package/dist/lib/provider-installer/provider-installer.js +86 -0
  71. package/dist/lib/provider-installer/provider-installer.js.map +1 -0
  72. package/dist/lib/provider-installer/provider-installer.types.d.ts +4 -0
  73. package/dist/lib/provider-installer/provider-installer.types.js +5 -0
  74. package/dist/lib/provider-installer/provider-installer.types.js.map +1 -0
  75. package/dist/lib/provider-installer.d.ts +27 -0
  76. package/dist/lib/provider-installer.js +86 -0
  77. package/dist/lib/provider-installer.js.map +1 -0
  78. package/dist/lib/provider-registry/index.d.ts +5 -0
  79. package/dist/lib/provider-registry/index.js +6 -0
  80. package/dist/lib/provider-registry/index.js.map +1 -0
  81. package/dist/lib/provider-registry/provider-registry.d.ts +9 -0
  82. package/dist/lib/provider-registry/provider-registry.js +111 -0
  83. package/dist/lib/provider-registry/provider-registry.js.map +1 -0
  84. package/dist/lib/provider-registry/provider-registry.types.d.ts +5 -0
  85. package/dist/lib/provider-registry/provider-registry.types.js +6 -0
  86. package/dist/lib/provider-registry/provider-registry.types.js.map +1 -0
  87. package/dist/lib/provider-registry.d.ts +26 -0
  88. package/dist/lib/provider-registry.js +111 -0
  89. package/dist/lib/provider-registry.js.map +1 -0
  90. package/dist/lib/task-linter/index.d.ts +5 -0
  91. package/dist/lib/task-linter/index.js +6 -0
  92. package/dist/lib/task-linter/index.js.map +1 -0
  93. package/dist/lib/task-linter/task-linter.d.ts +36 -0
  94. package/dist/lib/task-linter/task-linter.js +219 -0
  95. package/dist/lib/task-linter/task-linter.js.map +1 -0
  96. package/dist/lib/task-linter/task-linter.types.d.ts +52 -0
  97. package/dist/lib/task-linter/task-linter.types.js +6 -0
  98. package/dist/lib/task-linter/task-linter.types.js.map +1 -0
  99. package/dist/lib/task-linter.d.ts +29 -0
  100. package/dist/lib/task-linter.js +215 -0
  101. package/dist/lib/task-linter.js.map +1 -0
  102. package/dist/lib/task-linter.types.d.ts +38 -0
  103. package/dist/lib/task-linter.types.js +5 -0
  104. package/dist/lib/task-linter.types.js.map +1 -0
  105. package/dist/main.d.ts +14 -0
  106. package/dist/main.js +29 -0
  107. package/dist/main.js.map +1 -0
  108. package/dist/taskin.d.ts +33 -0
  109. package/dist/taskin.js +101 -0
  110. package/dist/taskin.js.map +1 -0
  111. package/package.json +81 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Color utilities for CLI output
3
+ */
4
+ import chalk from 'chalk';
5
+ export const colors = {
6
+ info: chalk.cyan,
7
+ success: chalk.green,
8
+ warning: chalk.yellow,
9
+ error: chalk.red,
10
+ highlight: chalk.bold.white,
11
+ secondary: chalk.gray,
12
+ normal: chalk.white,
13
+ };
14
+ export const icons = {
15
+ rocket: '🚀',
16
+ list: '📊',
17
+ check: '✅',
18
+ pause: '⏸️',
19
+ info: '💡',
20
+ task: '📋',
21
+ gear: '⚙️',
22
+ };
23
+ export function printHeader(title, icon) {
24
+ console.log();
25
+ console.log(colors.highlight('═'.repeat(60)));
26
+ console.log(colors.highlight(`${icon} ${title}`));
27
+ console.log(colors.highlight('═'.repeat(60)));
28
+ console.log();
29
+ }
30
+ export function success(message) {
31
+ console.log(colors.success(`✓ ${message}`));
32
+ }
33
+ export function error(message) {
34
+ console.error(colors.error(`✗ ${message}`));
35
+ }
36
+ export function info(message) {
37
+ console.log(colors.info(`ℹ ${message}`));
38
+ }
39
+ export function warning(message) {
40
+ console.log(colors.warning(`⚠ ${message}`));
41
+ }
42
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/lib/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,OAAO,EAAE,KAAK,CAAC,KAAK;IACpB,OAAO,EAAE,KAAK,CAAC,MAAM;IACrB,KAAK,EAAE,KAAK,CAAC,GAAG;IAChB,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;IAC3B,SAAS,EAAE,KAAK,CAAC,IAAI;IACrB,MAAM,EAAE,KAAK,CAAC,KAAK;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;CACX,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,IAAY;IACrD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type {
2
+ FileLintResult,
3
+ FileValidationError,
4
+ IFileSystemTaskLinter,
5
+ TaskMetadata,
6
+ } from './file-system-task-linter.types.js';
7
+ /**
8
+ * FileSystem-specific task linter implementation
9
+ * Validates task markdown files in the local filesystem
10
+ */
11
+ export declare class FileSystemTaskLinter implements IFileSystemTaskLinter {
12
+ private errors;
13
+ private addError;
14
+ /**
15
+ * Validate task file name format (FileSystem-specific)
16
+ */
17
+ validateFileName(fileName: string): FileValidationError | null;
18
+ private extractMetadata;
19
+ /**
20
+ * Validate task metadata (FileSystem-specific)
21
+ */
22
+ validateMetadata(
23
+ metadata: TaskMetadata,
24
+ filePath: string,
25
+ ): FileValidationError[];
26
+ private validateContent;
27
+ /**
28
+ * Lint a single task file (FileSystem-specific)
29
+ */
30
+ lintFile(filePath: string): Promise<FileValidationError[]>;
31
+ /**
32
+ * Lint all task files in the specified directory (FileSystem-specific)
33
+ */
34
+ lintDirectory(tasksDir: string): Promise<FileLintResult>;
35
+ static printResults(result: FileLintResult): void;
36
+ }
@@ -0,0 +1,219 @@
1
+ import chalk from 'chalk';
2
+ import { readdir, readFile } from 'fs/promises';
3
+ import { join } from 'path';
4
+ const VALID_STATUSES = ['pending', 'in-progress', 'done', 'blocked'];
5
+ const VALID_TYPES = ['feat', 'fix', 'chore', 'docs', 'refactor', 'test'];
6
+ /**
7
+ * FileSystem-specific task linter implementation
8
+ * Validates task markdown files in the local filesystem
9
+ */
10
+ export class FileSystemTaskLinter {
11
+ errors = [];
12
+ addError(file, message, severity = 'error', line) {
13
+ this.errors.push({ file, message, severity, line });
14
+ }
15
+ /**
16
+ * Validate task file name format (FileSystem-specific)
17
+ */
18
+ validateFileName(fileName) {
19
+ const pattern = /^task-\d{2,3}-[a-z0-9-]+\.md$/;
20
+ if (!pattern.test(fileName)) {
21
+ return {
22
+ file: fileName,
23
+ message: 'Invalid filename. Expected: task-NNN-kebab-case-title.md',
24
+ severity: 'error',
25
+ };
26
+ }
27
+ return null;
28
+ }
29
+ extractMetadata(content) {
30
+ const headerSection = content.split(/^##/m)[0];
31
+ const statusMatch = headerSection.match(/^Status:\s*(.+)$/im);
32
+ const typeMatch = headerSection.match(/^Type:\s*(.+)$/im);
33
+ const assigneeMatch = headerSection.match(/^Assignee:\s*(.+)$/im);
34
+ return {
35
+ status: statusMatch?.[1]?.trim().toLowerCase(),
36
+ type: typeMatch?.[1]?.trim().toLowerCase(),
37
+ assignee: assigneeMatch?.[1]?.trim(),
38
+ };
39
+ }
40
+ /**
41
+ * Validate task metadata (FileSystem-specific)
42
+ */
43
+ validateMetadata(metadata, filePath) {
44
+ const errors = [];
45
+ if (!metadata.status) {
46
+ errors.push({
47
+ file: filePath,
48
+ message: 'Missing required metadata: Status',
49
+ severity: 'error',
50
+ });
51
+ } else if (!VALID_STATUSES.includes(metadata.status)) {
52
+ errors.push({
53
+ file: filePath,
54
+ message: `Invalid status "${metadata.status}". Valid: ${VALID_STATUSES.join(', ')}`,
55
+ severity: 'error',
56
+ });
57
+ }
58
+ if (!metadata.type) {
59
+ errors.push({
60
+ file: filePath,
61
+ message: 'Missing required metadata: Type',
62
+ severity: 'error',
63
+ });
64
+ } else if (!VALID_TYPES.includes(metadata.type)) {
65
+ errors.push({
66
+ file: filePath,
67
+ message: `Invalid type "${metadata.type}". Valid: ${VALID_TYPES.join(', ')}`,
68
+ severity: 'error',
69
+ });
70
+ }
71
+ if (!metadata.assignee) {
72
+ errors.push({
73
+ file: filePath,
74
+ message: 'Missing recommended metadata: Assignee',
75
+ severity: 'warning',
76
+ });
77
+ }
78
+ return errors;
79
+ }
80
+ validateContent(filename, content) {
81
+ const lines = content.split('\n');
82
+ // Check H1 heading
83
+ if (!lines[0]?.trim().startsWith('# ')) {
84
+ this.addError(
85
+ filename,
86
+ 'Task file must start with a level 1 heading (# Task NNN — Title)',
87
+ 'error',
88
+ 1,
89
+ );
90
+ }
91
+ const h1Pattern = /^#\s+(?:🧩\s+)?Task\s+\d{2,3}\s+[—-]\s+.+$/i;
92
+ if (lines[0] && !h1Pattern.test(lines[0])) {
93
+ this.addError(
94
+ filename,
95
+ 'H1 heading must follow format: "# Task NNN — Title"',
96
+ 'error',
97
+ 1,
98
+ );
99
+ }
100
+ const metadata = this.extractMetadata(content);
101
+ const metadataErrors = this.validateMetadata(metadata, filename);
102
+ metadataErrors.forEach((error) => {
103
+ this.addError(error.file, error.message, error.severity, error.line);
104
+ });
105
+ const h2Sections = content.match(/^##\s+.+$/gm);
106
+ if (!h2Sections || h2Sections.length === 0) {
107
+ this.addError(
108
+ filename,
109
+ 'Task should have at least one section (## heading)',
110
+ 'warning',
111
+ );
112
+ }
113
+ const firstH2Index = content.indexOf('\n##');
114
+ if (firstH2Index > -1) {
115
+ const afterH2 = content.substring(firstH2Index);
116
+ if (
117
+ afterH2.match(/^Status:/im) ||
118
+ afterH2.match(/^Type:/im) ||
119
+ afterH2.match(/^Assignee:/im)
120
+ ) {
121
+ this.addError(
122
+ filename,
123
+ 'Metadata must be placed BEFORE the first ## section',
124
+ 'error',
125
+ );
126
+ }
127
+ }
128
+ }
129
+ /**
130
+ * Lint a single task file (FileSystem-specific)
131
+ */
132
+ async lintFile(filePath) {
133
+ const errors = [];
134
+ // Validate filename
135
+ const fileName = filePath.split('/').pop() || filePath;
136
+ const fileNameError = this.validateFileName(fileName);
137
+ if (fileNameError) {
138
+ errors.push(fileNameError);
139
+ }
140
+ // Read and validate content
141
+ try {
142
+ const content = await readFile(filePath, 'utf-8');
143
+ this.errors = [];
144
+ this.validateContent(fileName, content);
145
+ errors.push(...this.errors);
146
+ } catch (error) {
147
+ errors.push({
148
+ file: fileName,
149
+ message: `Failed to read file: ${error}`,
150
+ severity: 'error',
151
+ });
152
+ }
153
+ return errors;
154
+ }
155
+ /**
156
+ * Lint all task files in the specified directory (FileSystem-specific)
157
+ */
158
+ async lintDirectory(tasksDir) {
159
+ this.errors = [];
160
+ try {
161
+ const files = await readdir(tasksDir);
162
+ const taskFiles = files.filter((f) => f.endsWith('.md'));
163
+ for (const file of taskFiles) {
164
+ const fileNameError = this.validateFileName(file);
165
+ if (fileNameError) {
166
+ this.addError(file, fileNameError.message, fileNameError.severity);
167
+ }
168
+ const content = await readFile(join(tasksDir, file), 'utf-8');
169
+ this.validateContent(file, content);
170
+ }
171
+ const errors = this.errors.filter((e) => e.severity === 'error');
172
+ const warnings = this.errors.filter((e) => e.severity === 'warning');
173
+ return {
174
+ errors,
175
+ warnings,
176
+ filesChecked: taskFiles.length,
177
+ valid: errors.length === 0,
178
+ };
179
+ } catch (error) {
180
+ throw new Error(`Failed to lint tasks: ${error}`);
181
+ }
182
+ }
183
+ static printResults(result) {
184
+ if (result.errors.length === 0 && result.warnings.length === 0) {
185
+ console.log(
186
+ chalk.green(`✅ All ${result.filesChecked} task files are valid!\n`),
187
+ );
188
+ return;
189
+ }
190
+ console.log(
191
+ chalk.bold(
192
+ `\n📊 Validation Results (${result.filesChecked} files checked):\n`,
193
+ ),
194
+ );
195
+ const errorsByFile = new Map();
196
+ [...result.errors, ...result.warnings].forEach((error) => {
197
+ if (!errorsByFile.has(error.file)) {
198
+ errorsByFile.set(error.file, []);
199
+ }
200
+ errorsByFile.get(error.file).push(error);
201
+ });
202
+ for (const [file, fileErrors] of errorsByFile) {
203
+ console.log(chalk.cyan(`\n📄 ${file}`));
204
+ for (const error of fileErrors) {
205
+ const icon =
206
+ error.severity === 'error' ? chalk.red('❌') : chalk.yellow('⚠️');
207
+ const location = error.line ? `:${error.line}` : '';
208
+ console.log(` ${icon} ${error.message}${location}`);
209
+ }
210
+ }
211
+ console.log('\n' + '─'.repeat(60));
212
+ console.log(
213
+ chalk.bold(
214
+ `\n📊 Summary: ${chalk.red(result.errors.length + ' error(s)')}, ${chalk.yellow(result.warnings.length + ' warning(s)')}\n`,
215
+ ),
216
+ );
217
+ }
218
+ }
219
+ //# sourceMappingURL=file-system-task-linter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system-task-linter.js","sourceRoot":"","sources":["../../../src/lib/file-system-task-linter/file-system-task-linter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * FileSystemTaskLinter mocks for testing
3
+ */
4
+ import type {
5
+ FileLintResult,
6
+ FileValidationError,
7
+ IFileSystemTaskLinter,
8
+ TaskMetadata,
9
+ } from './file-system-task-linter.types.js';
10
+ /**
11
+ * Create mock FileValidationError
12
+ */
13
+ export declare function createMockFileValidationError(
14
+ overrides?: Partial<FileValidationError>,
15
+ ): FileValidationError;
16
+ /**
17
+ * Create mock FileLintResult
18
+ */
19
+ export declare function createMockFileLintResult(
20
+ overrides?: Partial<FileLintResult>,
21
+ ): FileLintResult;
22
+ /**
23
+ * Create mock TaskMetadata
24
+ */
25
+ export declare function createMockTaskMetadata(
26
+ overrides?: Partial<TaskMetadata>,
27
+ ): TaskMetadata;
28
+ /**
29
+ * Mock implementation of IFileSystemTaskLinter
30
+ */
31
+ export declare class MockFileSystemTaskLinter implements IFileSystemTaskLinter {
32
+ private mockLintDirectoryResult;
33
+ private mockLintFileResult;
34
+ private mockValidateMetadataResult;
35
+ lintDirectory(_tasksDir: string): Promise<FileLintResult>;
36
+ lintFile(_filePath: string): Promise<FileValidationError[]>;
37
+ validateMetadata(
38
+ _metadata: Record<string, unknown>,
39
+ _fileName: string,
40
+ ): FileValidationError[];
41
+ /**
42
+ * Set mock result for lintDirectory
43
+ */
44
+ setLintDirectoryResult(result: FileLintResult): void;
45
+ /**
46
+ * Set mock result for lintFile
47
+ */
48
+ setLintFileResult(result: FileValidationError[]): void;
49
+ /**
50
+ * Set mock result for validateMetadata
51
+ */
52
+ setValidateMetadataResult(result: FileValidationError[]): void;
53
+ }
54
+ /**
55
+ * Create a mock FileSystemTaskLinter instance
56
+ */
57
+ export declare function createMockFileSystemTaskLinter(): MockFileSystemTaskLinter;
58
+ /**
59
+ * Mock valid lint result - no errors, all files valid
60
+ */
61
+ export declare const MOCK_VALID_LINT_RESULT: FileLintResult;
62
+ /**
63
+ * Mock invalid lint result - has errors
64
+ */
65
+ export declare const MOCK_INVALID_LINT_RESULT: FileLintResult;
66
+ /**
67
+ * Mock lint result with warnings only
68
+ */
69
+ export declare const MOCK_WARNINGS_LINT_RESULT: FileLintResult;
70
+ /**
71
+ * Mock sample validation errors
72
+ */
73
+ export declare const MOCK_VALIDATION_ERRORS: FileValidationError[];
74
+ /**
75
+ * Mock sample task metadata - valid
76
+ */
77
+ export declare const MOCK_VALID_METADATA: TaskMetadata;
78
+ /**
79
+ * Mock sample task metadata - invalid
80
+ */
81
+ export declare const MOCK_INVALID_METADATA: Record<string, unknown>;
@@ -0,0 +1,152 @@
1
+ /**
2
+ * FileSystemTaskLinter mocks for testing
3
+ */
4
+ /**
5
+ * Create mock FileValidationError
6
+ */
7
+ export function createMockFileValidationError(overrides) {
8
+ return {
9
+ file: 'task-001.md',
10
+ message: 'Mock validation error',
11
+ severity: 'error',
12
+ ...overrides,
13
+ };
14
+ }
15
+ /**
16
+ * Create mock FileLintResult
17
+ */
18
+ export function createMockFileLintResult(overrides) {
19
+ return {
20
+ errors: [],
21
+ filesChecked: 0,
22
+ valid: true,
23
+ warnings: [],
24
+ ...overrides,
25
+ };
26
+ }
27
+ /**
28
+ * Create mock TaskMetadata
29
+ */
30
+ export function createMockTaskMetadata(overrides) {
31
+ return {
32
+ assignee: 'john@example.com',
33
+ status: 'pending',
34
+ type: 'feat',
35
+ ...overrides,
36
+ };
37
+ }
38
+ /**
39
+ * Mock implementation of IFileSystemTaskLinter
40
+ */
41
+ export class MockFileSystemTaskLinter {
42
+ mockLintDirectoryResult = createMockFileLintResult();
43
+ mockLintFileResult = [];
44
+ mockValidateMetadataResult = [];
45
+ async lintDirectory(_tasksDir) {
46
+ return this.mockLintDirectoryResult;
47
+ }
48
+ async lintFile(_filePath) {
49
+ return this.mockLintFileResult;
50
+ }
51
+ validateMetadata(_metadata, _fileName) {
52
+ return this.mockValidateMetadataResult;
53
+ }
54
+ /**
55
+ * Set mock result for lintDirectory
56
+ */
57
+ setLintDirectoryResult(result) {
58
+ this.mockLintDirectoryResult = result;
59
+ }
60
+ /**
61
+ * Set mock result for lintFile
62
+ */
63
+ setLintFileResult(result) {
64
+ this.mockLintFileResult = result;
65
+ }
66
+ /**
67
+ * Set mock result for validateMetadata
68
+ */
69
+ setValidateMetadataResult(result) {
70
+ this.mockValidateMetadataResult = result;
71
+ }
72
+ }
73
+ /**
74
+ * Create a mock FileSystemTaskLinter instance
75
+ */
76
+ export function createMockFileSystemTaskLinter() {
77
+ return new MockFileSystemTaskLinter();
78
+ }
79
+ /**
80
+ * Mock valid lint result - no errors, all files valid
81
+ */
82
+ export const MOCK_VALID_LINT_RESULT = {
83
+ errors: [],
84
+ filesChecked: 5,
85
+ valid: true,
86
+ warnings: [],
87
+ };
88
+ /**
89
+ * Mock invalid lint result - has errors
90
+ */
91
+ export const MOCK_INVALID_LINT_RESULT = {
92
+ errors: [
93
+ createMockFileValidationError({
94
+ file: 'task-001.md',
95
+ message: 'Invalid status: "invalid"',
96
+ }),
97
+ createMockFileValidationError({
98
+ file: 'task-002.md',
99
+ message: 'Invalid type: "unknown"',
100
+ }),
101
+ ],
102
+ filesChecked: 2,
103
+ valid: false,
104
+ warnings: [],
105
+ };
106
+ /**
107
+ * Mock lint result with warnings only
108
+ */
109
+ export const MOCK_WARNINGS_LINT_RESULT = {
110
+ errors: [],
111
+ filesChecked: 3,
112
+ valid: true,
113
+ warnings: [
114
+ createMockFileValidationError({
115
+ file: 'task-003.md',
116
+ message: 'Consider adding assignee',
117
+ severity: 'warning',
118
+ }),
119
+ ],
120
+ };
121
+ /**
122
+ * Mock sample validation errors
123
+ */
124
+ export const MOCK_VALIDATION_ERRORS = [
125
+ createMockFileValidationError({
126
+ file: 'task-001.md',
127
+ message: 'Invalid status: must be one of [pending, in-progress, done, blocked]',
128
+ line: 5,
129
+ }),
130
+ createMockFileValidationError({
131
+ file: 'task-001.md',
132
+ message: 'Invalid type: must be one of [feat, fix, chore, docs, refactor, test]',
133
+ line: 6,
134
+ }),
135
+ ];
136
+ /**
137
+ * Mock sample task metadata - valid
138
+ */
139
+ export const MOCK_VALID_METADATA = {
140
+ assignee: 'john@example.com',
141
+ status: 'pending',
142
+ type: 'feat',
143
+ };
144
+ /**
145
+ * Mock sample task metadata - invalid
146
+ */
147
+ export const MOCK_INVALID_METADATA = {
148
+ assignee: 'john@example.com',
149
+ status: 'invalid-status',
150
+ type: 'invalid-type',
151
+ };
152
+ //# sourceMappingURL=file-system-task-linter.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system-task-linter.mock.js","sourceRoot":"","sources":["../../../src/lib/file-system-task-linter/file-system-task-linter.mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,SAAwC;IAExC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,OAAO;QACjB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAmC;IAEnC,OAAO;QACL,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,EAAE;QACZ,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAiC;IAEjC,OAAO;QACL,QAAQ,EAAE,kBAAkB;QAC5B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,MAAM;QACZ,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAC3B,uBAAuB,GAAmB,wBAAwB,EAAE,CAAC;IACrE,kBAAkB,GAA0B,EAAE,CAAC;IAC/C,0BAA0B,GAA0B,EAAE,CAAC;IAE/D,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,gBAAgB,CACd,SAAkC,EAClC,SAAiB;QAEjB,OAAO,IAAI,CAAC,0BAA0B,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,MAAsB;QAC3C,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAA6B;QAC7C,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,yBAAyB,CAAC,MAA6B;QACrD,IAAI,CAAC,0BAA0B,GAAG,MAAM,CAAC;IAC3C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B;IAC5C,OAAO,IAAI,wBAAwB,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,CAAC;IACf,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAmB;IACtD,MAAM,EAAE;QACN,6BAA6B,CAAC;YAC5B,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,2BAA2B;SACrC,CAAC;QACF,6BAA6B,CAAC;YAC5B,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,yBAAyB;SACnC,CAAC;KACH;IACD,YAAY,EAAE,CAAC;IACf,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAmB;IACvD,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,CAAC;IACf,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE;QACR,6BAA6B,CAAC;YAC5B,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,0BAA0B;YACnC,QAAQ,EAAE,SAAS;SACpB,CAAC;KACH;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAA0B;IAC3D,6BAA6B,CAAC;QAC5B,IAAI,EAAE,aAAa;QACnB,OAAO,EACL,sEAAsE;QACxE,IAAI,EAAE,CAAC;KACR,CAAC;IACF,6BAA6B,CAAC;QAC5B,IAAI,EAAE,aAAa;QACnB,OAAO,EACL,uEAAuE;QACzE,IAAI,EAAE,CAAC;KACR,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA4B;IAC5D,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,gBAAgB;IACxB,IAAI,EAAE,cAAc;CACrB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * FileSystemTaskLinter tests
3
+ */
4
+ export {};