@brainfile/cli 0.1.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.
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.lintCommand = lintCommand;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const core_1 = require("@brainfile/core");
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ const yaml = __importStar(require("js-yaml"));
45
+ function lintCommand(options) {
46
+ try {
47
+ // Resolve file path
48
+ const filePath = path.resolve(options.file);
49
+ // Check if file exists
50
+ if (!fs.existsSync(filePath)) {
51
+ console.error(chalk_1.default.red(`Error: File not found: ${filePath}`));
52
+ process.exit(1);
53
+ }
54
+ // Read file content
55
+ const content = fs.readFileSync(filePath, 'utf-8');
56
+ const issues = [];
57
+ let fixedContent = content;
58
+ console.log(chalk_1.default.blue(`\nšŸ” Linting: ${filePath}\n`));
59
+ // Step 1: Check for fixable YAML issues (unquoted strings with colons)
60
+ const quotableStrings = findUnquotedStringsWithColons(content);
61
+ if (quotableStrings.length > 0) {
62
+ quotableStrings.forEach(({ line, text }) => {
63
+ issues.push({
64
+ type: 'warning',
65
+ message: `Unquoted string with colon at line ${line}: "${text}"`,
66
+ line,
67
+ fixable: true
68
+ });
69
+ });
70
+ if (options.fix) {
71
+ fixedContent = fixUnquotedStrings(content, quotableStrings);
72
+ }
73
+ }
74
+ // Step 2: Check YAML syntax (use fixed content if fixes were applied)
75
+ const contentToValidate = options.fix && fixedContent !== content ? fixedContent : content;
76
+ const yamlIssues = checkYAMLSyntax(contentToValidate);
77
+ // Only report YAML issues if they persist after fixes
78
+ if (yamlIssues.length > 0) {
79
+ // If we applied fixes, check if the issues still exist
80
+ if (options.fix && fixedContent !== content) {
81
+ const remainingYamlIssues = checkYAMLSyntax(fixedContent);
82
+ issues.push(...remainingYamlIssues);
83
+ }
84
+ else {
85
+ issues.push(...yamlIssues);
86
+ }
87
+ }
88
+ // Step 3: Validate board structure (if YAML is valid after any fixes)
89
+ const finalYamlIssues = options.fix ? checkYAMLSyntax(fixedContent) : yamlIssues;
90
+ if (finalYamlIssues.length === 0) {
91
+ const result = core_1.Brainfile.parseWithErrors(contentToValidate);
92
+ if (result.board) {
93
+ // Check for duplicate column IDs
94
+ const duplicates = findDuplicateColumnIds(result.board);
95
+ if (duplicates.length > 0) {
96
+ duplicates.forEach(id => {
97
+ issues.push({
98
+ type: 'warning',
99
+ message: `Duplicate column ID found: "${id}"`,
100
+ fixable: false
101
+ });
102
+ });
103
+ }
104
+ // Run structural validation
105
+ const validation = core_1.BrainfileValidator.validate(result.board);
106
+ if (!validation.valid) {
107
+ validation.errors.forEach(err => {
108
+ issues.push({
109
+ type: 'error',
110
+ message: `${err.path}: ${err.message}`,
111
+ fixable: false
112
+ });
113
+ });
114
+ }
115
+ }
116
+ else if (result.error) {
117
+ issues.push({
118
+ type: 'error',
119
+ message: `Parse error: ${result.error}`,
120
+ fixable: false
121
+ });
122
+ }
123
+ }
124
+ // Report findings
125
+ if (issues.length === 0) {
126
+ console.log(chalk_1.default.green('āœ“ No issues found! Your brainfile.md is valid.\n'));
127
+ return; // Success - don't exit, just return
128
+ }
129
+ // Group issues by type
130
+ const errors = issues.filter(i => i.type === 'error');
131
+ const warnings = issues.filter(i => i.type === 'warning');
132
+ const fixableCount = issues.filter(i => i.fixable).length;
133
+ // Display errors
134
+ if (errors.length > 0) {
135
+ console.log(chalk_1.default.red.bold(`āœ— ${errors.length} Error${errors.length > 1 ? 's' : ''}:`));
136
+ errors.forEach(issue => {
137
+ const location = issue.line ? chalk_1.default.gray(` [line ${issue.line}]`) : '';
138
+ console.log(chalk_1.default.red(` • ${issue.message}${location}`));
139
+ });
140
+ console.log();
141
+ }
142
+ // Display warnings
143
+ if (warnings.length > 0) {
144
+ console.log(chalk_1.default.yellow.bold(`⚠ ${warnings.length} Warning${warnings.length > 1 ? 's' : ''}:`));
145
+ warnings.forEach(issue => {
146
+ const location = issue.line ? chalk_1.default.gray(` [line ${issue.line}]`) : '';
147
+ const fixable = issue.fixable ? chalk_1.default.gray(' [fixable]') : '';
148
+ console.log(chalk_1.default.yellow(` • ${issue.message}${location}${fixable}`));
149
+ });
150
+ console.log();
151
+ }
152
+ // Apply fixes if requested
153
+ let remainingErrors = errors;
154
+ let remainingWarnings = warnings;
155
+ if (options.fix && fixableCount > 0) {
156
+ fs.writeFileSync(filePath, fixedContent, 'utf-8');
157
+ console.log(chalk_1.default.green(`āœ“ Fixed ${fixableCount} issue${fixableCount > 1 ? 's' : ''}!\n`));
158
+ // Calculate remaining issues after fixes
159
+ const remainingIssues = issues.filter(i => !i.fixable);
160
+ remainingErrors = remainingIssues.filter(i => i.type === 'error');
161
+ remainingWarnings = remainingIssues.filter(i => i.type === 'warning');
162
+ if (remainingIssues.length > 0) {
163
+ console.log(chalk_1.default.yellow(`⚠ ${remainingIssues.length} issue${remainingIssues.length > 1 ? 's' : ''} remaining (not auto-fixable)\n`));
164
+ }
165
+ }
166
+ else if (fixableCount > 0 && !options.fix) {
167
+ console.log(chalk_1.default.gray(`šŸ’” Run with --fix to automatically fix ${fixableCount} issue${fixableCount > 1 ? 's' : ''}\n`));
168
+ }
169
+ // Summary
170
+ const displayIssues = options.fix ? (remainingErrors.length + remainingWarnings.length) : (errors.length + warnings.length);
171
+ console.log(chalk_1.default.gray('─'.repeat(60)));
172
+ console.log(chalk_1.default.gray(`Total: ${displayIssues} issue${displayIssues > 1 ? 's' : ''} ${options.fix && fixableCount > 0 ? 'remaining' : 'found'}`));
173
+ if (fixableCount > 0 && !options.fix) {
174
+ console.log(chalk_1.default.gray(` ${fixableCount} fixable with --fix`));
175
+ }
176
+ console.log();
177
+ // Exit with error code in check mode
178
+ if (options.check) {
179
+ const checkErrors = options.fix ? remainingErrors : errors;
180
+ const checkWarnings = options.fix ? remainingWarnings : warnings;
181
+ if (checkErrors.length > 0 || checkWarnings.length > 0) {
182
+ process.exit(1);
183
+ }
184
+ }
185
+ // Normal mode: only exit 1 on errors (not warnings)
186
+ const finalErrors = options.fix ? remainingErrors : errors;
187
+ if (finalErrors.length > 0) {
188
+ process.exit(1);
189
+ }
190
+ // Success - don't exit, just return
191
+ }
192
+ catch (error) {
193
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : String(error));
194
+ process.exit(1);
195
+ }
196
+ }
197
+ /**
198
+ * Check YAML syntax by attempting to parse
199
+ */
200
+ function checkYAMLSyntax(content) {
201
+ const issues = [];
202
+ try {
203
+ const lines = content.split('\n');
204
+ // Find frontmatter boundaries
205
+ if (!lines[0].trim().startsWith('---')) {
206
+ issues.push({
207
+ type: 'error',
208
+ message: 'Missing YAML frontmatter opening (---)',
209
+ line: 1,
210
+ fixable: false
211
+ });
212
+ return issues;
213
+ }
214
+ let endIndex = -1;
215
+ for (let i = 1; i < lines.length; i++) {
216
+ if (lines[i].trim() === '---') {
217
+ endIndex = i;
218
+ break;
219
+ }
220
+ }
221
+ if (endIndex === -1) {
222
+ issues.push({
223
+ type: 'error',
224
+ message: 'Missing YAML frontmatter closing (---)',
225
+ fixable: false
226
+ });
227
+ return issues;
228
+ }
229
+ // Extract and parse YAML
230
+ const yamlContent = lines.slice(1, endIndex).join('\n');
231
+ yaml.load(yamlContent);
232
+ }
233
+ catch (error) {
234
+ if (error.mark) {
235
+ issues.push({
236
+ type: 'error',
237
+ message: `YAML syntax error: ${error.message}`,
238
+ line: error.mark.line + 2, // Adjust for frontmatter offset
239
+ fixable: false
240
+ });
241
+ }
242
+ else {
243
+ issues.push({
244
+ type: 'error',
245
+ message: `YAML error: ${error.message}`,
246
+ fixable: false
247
+ });
248
+ }
249
+ }
250
+ return issues;
251
+ }
252
+ /**
253
+ * Find strings with colons that should be quoted
254
+ */
255
+ function findUnquotedStringsWithColons(content) {
256
+ const results = [];
257
+ const lines = content.split('\n');
258
+ // Look for title: or rule: fields with unquoted strings containing colons
259
+ const titlePattern = /^(\s+)(title|rule):\s+([^"'][^"\n]*:\s*[^"\n]+)$/;
260
+ lines.forEach((line, index) => {
261
+ const match = line.match(titlePattern);
262
+ if (match) {
263
+ const text = match[3].trim();
264
+ // Check if it contains a colon followed by space (YAML separator)
265
+ if (text.includes(': ')) {
266
+ results.push({
267
+ line: index + 1,
268
+ text,
269
+ fullLine: line
270
+ });
271
+ }
272
+ }
273
+ });
274
+ return results;
275
+ }
276
+ /**
277
+ * Fix unquoted strings by adding quotes
278
+ */
279
+ function fixUnquotedStrings(content, issues) {
280
+ const lines = content.split('\n');
281
+ issues.forEach(issue => {
282
+ const lineIndex = issue.line - 1;
283
+ const line = lines[lineIndex];
284
+ // Match the pattern and replace with quoted version
285
+ const match = line.match(/^(\s+)(title|rule):\s+(.+)$/);
286
+ if (match) {
287
+ const indent = match[1];
288
+ const key = match[2];
289
+ const value = match[3].trim();
290
+ // Only quote if not already quoted
291
+ if (!value.startsWith('"') && !value.startsWith("'")) {
292
+ lines[lineIndex] = `${indent}${key}: "${value}"`;
293
+ }
294
+ }
295
+ });
296
+ return lines.join('\n');
297
+ }
298
+ /**
299
+ * Find duplicate column IDs
300
+ */
301
+ function findDuplicateColumnIds(board) {
302
+ const columnIds = board.columns?.map((col) => col.id) || [];
303
+ const duplicates = columnIds.filter((id, index) => columnIds.indexOf(id) !== index);
304
+ return Array.from(new Set(duplicates)); // Return unique duplicates
305
+ }
306
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,kCAyKC;AA5LD,uCAAyB;AACzB,2CAA6B;AAC7B,0CAAgE;AAChE,kDAA0B;AAC1B,8CAAgC;AAehC,SAAgB,WAAW,CAAC,OAAoB;IAC9C,IAAI,CAAC;QACH,oBAAoB;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE5C,uBAAuB;QACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,oBAAoB;QACpB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,IAAI,YAAY,GAAG,OAAO,CAAC;QAE3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,IAAI,CAAC,CAAC,CAAC;QAEvD,uEAAuE;QACvE,MAAM,eAAe,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;gBACzC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,sCAAsC,IAAI,MAAM,IAAI,GAAG;oBAChE,IAAI;oBACJ,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,YAAY,GAAG,kBAAkB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,IAAI,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3F,MAAM,UAAU,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAEtD,sDAAsD;QACtD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,uDAAuD;YACvD,IAAI,OAAO,CAAC,GAAG,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;gBAC5C,MAAM,mBAAmB,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACjF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,gBAAS,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;YAE5D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,iCAAiC;gBACjC,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;wBACtB,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,+BAA+B,EAAE,GAAG;4BAC7C,OAAO,EAAE,KAAK;yBACf,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,4BAA4B;gBAC5B,MAAM,UAAU,GAAG,yBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBACtB,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;wBAC9B,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,OAAO;4BACb,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE;4BACtC,OAAO,EAAE,KAAK;yBACf,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,gBAAgB,MAAM,CAAC,KAAK,EAAE;oBACvC,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,oCAAoC;QAC9C,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAE1D,iBAAiB;QACjB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACxF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,mBAAmB;QACnB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,WAAW,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACjG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,2BAA2B;QAC3B,IAAI,eAAe,GAAG,MAAM,CAAC;QAC7B,IAAI,iBAAiB,GAAG,QAAQ,CAAC;QAEjC,IAAI,OAAO,CAAC,GAAG,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACpC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,WAAW,YAAY,SAAS,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAE3F,yCAAyC;YACzC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACvD,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YAClE,iBAAiB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAEtE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,KAAK,eAAe,CAAC,MAAM,SAAS,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAC,CAAC;YACxI,CAAC;QACH,CAAC;aAAM,IAAI,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,YAAY,SAAS,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1H,CAAC;QAED,UAAU;QACV,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5H,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,aAAa,SAAS,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,GAAG,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnJ,IAAI,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,YAAY,qBAAqB,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,qCAAqC;QACrC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC;YACjE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,oCAAoC;IAEtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,8BAA8B;QAC9B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,wCAAwC;gBACjD,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC9B,QAAQ,GAAG,CAAC,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,wCAAwC;gBACjD,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,yBAAyB;QACzB,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAEzB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,sBAAsB,KAAK,CAAC,OAAO,EAAE;gBAC9C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,gCAAgC;gBAC3D,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,eAAe,KAAK,CAAC,OAAO,EAAE;gBACvC,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,6BAA6B,CAAC,OAAe;IACpD,MAAM,OAAO,GAA4D,EAAE,CAAC;IAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,0EAA0E;IAC1E,MAAM,YAAY,GAAG,kDAAkD,CAAC;IAExE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,kEAAkE;YAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,KAAK,GAAG,CAAC;oBACf,IAAI;oBACJ,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe,EAAE,MAA+D;IAC1G,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACrB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE9B,oDAAoD;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACxD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE9B,mCAAmC;YACnC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrD,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,MAAM,KAAK,GAAG,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,KAAU;IACxC,MAAM,SAAS,GAAa,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3E,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAU,EAAE,KAAa,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC;IACpG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAS,UAAU,CAAC,CAAC,CAAC,CAAC,2BAA2B;AAC7E,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface ListOptions {
2
+ file: string;
3
+ column?: string;
4
+ tag?: string;
5
+ }
6
+ export declare function listCommand(options: ListOptions): void;
7
+ export {};
8
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,QAyE/C"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.listCommand = listCommand;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const core_1 = require("@brainfile/core");
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ function listCommand(options) {
45
+ try {
46
+ // Resolve file path
47
+ const filePath = path.resolve(options.file);
48
+ // Check if file exists
49
+ if (!fs.existsSync(filePath)) {
50
+ console.error(chalk_1.default.red(`Error: File not found: ${filePath}`));
51
+ process.exit(1);
52
+ }
53
+ // Read and parse the file
54
+ const content = fs.readFileSync(filePath, 'utf-8');
55
+ const result = core_1.Brainfile.parseWithErrors(content);
56
+ if (!result.board) {
57
+ console.error(chalk_1.default.red('Error: Failed to parse bangbang.md'));
58
+ if (result.error) {
59
+ console.error(chalk_1.default.red(result.error));
60
+ }
61
+ process.exit(1);
62
+ }
63
+ const board = result.board;
64
+ // Filter columns if specified
65
+ const columns = options.column
66
+ ? board.columns.filter(col => col.id === options.column || col.title === options.column)
67
+ : board.columns;
68
+ if (columns.length === 0) {
69
+ console.log(chalk_1.default.yellow(`No columns found matching: ${options.column}`));
70
+ return;
71
+ }
72
+ // Display board title
73
+ console.log(chalk_1.default.bold.white(`\n${board.title || 'Brainfile Board'}\n`));
74
+ // Display each column
75
+ for (const column of columns) {
76
+ // Filter tasks by tag if specified
77
+ const tasks = options.tag
78
+ ? column.tasks.filter(task => task.tags?.includes(options.tag))
79
+ : column.tasks;
80
+ if (tasks.length === 0 && options.tag) {
81
+ continue;
82
+ }
83
+ // Column header
84
+ console.log(chalk_1.default.bold.cyan(`${column.title} (${tasks.length})`));
85
+ console.log(chalk_1.default.gray('─'.repeat(50)));
86
+ if (tasks.length === 0) {
87
+ console.log(chalk_1.default.gray(' (no tasks)\n'));
88
+ continue;
89
+ }
90
+ // Display tasks
91
+ for (const task of tasks) {
92
+ displayTask(task);
93
+ }
94
+ console.log('');
95
+ }
96
+ // Display summary
97
+ const totalTasks = board.columns.reduce((sum, col) => sum + col.tasks.length, 0);
98
+ console.log(chalk_1.default.gray(`Total tasks: ${totalTasks}`));
99
+ }
100
+ catch (error) {
101
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : String(error));
102
+ process.exit(1);
103
+ }
104
+ }
105
+ function displayTask(task) {
106
+ // Task ID and title
107
+ const idStr = chalk_1.default.gray(`[${task.id}]`);
108
+ const titleStr = chalk_1.default.white(task.title);
109
+ console.log(` ${idStr} ${titleStr}`);
110
+ // Priority
111
+ if (task.priority) {
112
+ const priorityColor = task.priority === 'high' ? chalk_1.default.red :
113
+ task.priority === 'medium' ? chalk_1.default.yellow :
114
+ chalk_1.default.blue;
115
+ console.log(` ${chalk_1.default.gray('Priority:')} ${priorityColor(task.priority)}`);
116
+ }
117
+ // Tags
118
+ if (task.tags && task.tags.length > 0) {
119
+ const tagStr = task.tags.map(t => chalk_1.default.cyan(`#${t}`)).join(' ');
120
+ console.log(` ${chalk_1.default.gray('Tags:')} ${tagStr}`);
121
+ }
122
+ // Template
123
+ if (task.template) {
124
+ console.log(` ${chalk_1.default.gray('Template:')} ${chalk_1.default.magenta(task.template)}`);
125
+ }
126
+ // Subtasks summary
127
+ if (task.subtasks && task.subtasks.length > 0) {
128
+ const completed = task.subtasks.filter(st => st.completed).length;
129
+ const total = task.subtasks.length;
130
+ const progressStr = `${completed}/${total}`;
131
+ const progressColor = completed === total ? chalk_1.default.green : chalk_1.default.yellow;
132
+ console.log(` ${chalk_1.default.gray('Subtasks:')} ${progressColor(progressStr)}`);
133
+ }
134
+ console.log('');
135
+ }
136
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface MoveOptions {
2
+ file: string;
3
+ task: string;
4
+ column: string;
5
+ }
6
+ export declare function moveCommand(options: MoveOptions): void;
7
+ export {};
8
+ //# sourceMappingURL=move.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,QAyG/C"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.moveCommand = moveCommand;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const core_1 = require("@brainfile/core");
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ function moveCommand(options) {
45
+ try {
46
+ // Validate required options
47
+ if (!options.task) {
48
+ console.error(chalk_1.default.red('Error: --task is required'));
49
+ console.log(chalk_1.default.gray('Usage: bangbang move --task <task-id> --column <column-name>'));
50
+ process.exit(1);
51
+ }
52
+ if (!options.column) {
53
+ console.error(chalk_1.default.red('Error: --column is required'));
54
+ console.log(chalk_1.default.gray('Usage: bangbang move --task <task-id> --column <column-name>'));
55
+ process.exit(1);
56
+ }
57
+ // Resolve file path
58
+ const filePath = path.resolve(options.file);
59
+ // Check if file exists
60
+ if (!fs.existsSync(filePath)) {
61
+ console.error(chalk_1.default.red(`Error: File not found: ${filePath}`));
62
+ process.exit(1);
63
+ }
64
+ // Read and parse the file
65
+ const content = fs.readFileSync(filePath, 'utf-8');
66
+ const result = core_1.Brainfile.parseWithErrors(content);
67
+ if (!result.board) {
68
+ console.error(chalk_1.default.red('Error: Failed to parse bangbang.md'));
69
+ if (result.error) {
70
+ console.error(chalk_1.default.red(result.error));
71
+ }
72
+ process.exit(1);
73
+ }
74
+ const board = result.board;
75
+ // Find the task
76
+ let foundTask = null;
77
+ let sourceColumn = null;
78
+ let sourceColumnIndex = -1;
79
+ for (let i = 0; i < board.columns.length; i++) {
80
+ const column = board.columns[i];
81
+ const taskIndex = column.tasks.findIndex((t) => t.id === options.task);
82
+ if (taskIndex !== -1) {
83
+ foundTask = column.tasks[taskIndex];
84
+ sourceColumn = column;
85
+ sourceColumnIndex = i;
86
+ // Remove task from source column
87
+ board.columns[i].tasks = column.tasks.filter((t) => t.id !== options.task);
88
+ break;
89
+ }
90
+ }
91
+ if (!foundTask) {
92
+ console.error(chalk_1.default.red(`Error: Task not found: ${options.task}`));
93
+ console.log(chalk_1.default.gray('\nAvailable tasks:'));
94
+ board.columns.forEach((col) => {
95
+ col.tasks.forEach((task) => {
96
+ console.log(chalk_1.default.gray(` - ${task.id}: ${task.title}`));
97
+ });
98
+ });
99
+ process.exit(1);
100
+ }
101
+ // Find the target column
102
+ const targetColumn = board.columns.find((col) => col.id === options.column || col.title.toLowerCase() === options.column.toLowerCase());
103
+ if (!targetColumn) {
104
+ console.error(chalk_1.default.red(`Error: Column not found: ${options.column}`));
105
+ console.log(chalk_1.default.gray('Available columns:'));
106
+ board.columns.forEach((col) => {
107
+ console.log(chalk_1.default.gray(` - ${col.id} (${col.title})`));
108
+ });
109
+ process.exit(1);
110
+ }
111
+ // Check if already in target column
112
+ if (sourceColumn.id === targetColumn.id) {
113
+ console.log(chalk_1.default.yellow(`Task ${options.task} is already in column "${targetColumn.title}"`));
114
+ return;
115
+ }
116
+ // Add task to target column
117
+ targetColumn.tasks.push(foundTask);
118
+ // Serialize and write back
119
+ const updatedContent = core_1.Brainfile.serialize(board);
120
+ fs.writeFileSync(filePath, updatedContent, 'utf-8');
121
+ // Success message
122
+ console.log(chalk_1.default.green('āœ“ Task moved successfully!'));
123
+ console.log('');
124
+ console.log(chalk_1.default.gray(` Task: ${foundTask.id} - ${foundTask.title}`));
125
+ console.log(chalk_1.default.gray(` From: ${sourceColumn.title}`));
126
+ console.log(chalk_1.default.gray(` To: ${targetColumn.title}`));
127
+ }
128
+ catch (error) {
129
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : String(error));
130
+ process.exit(1);
131
+ }
132
+ }
133
+ //# sourceMappingURL=move.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.js","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ interface TemplateOptions {
2
+ file: string;
3
+ list?: boolean;
4
+ use?: string;
5
+ title?: string;
6
+ description?: string;
7
+ column: string;
8
+ }
9
+ export declare function templateCommand(options: TemplateOptions): void;
10
+ export {};
11
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/commands/template.ts"],"names":[],"mappings":"AAKA,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,QAsJvD"}