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,192 @@
1
+ /**
2
+ * Init command - Initialize Taskin in the current project
3
+ */
4
+ import { existsSync, mkdirSync, writeFileSync } from 'fs';
5
+ import inquirer from 'inquirer';
6
+ import { join } from 'path';
7
+ import { colors, error, info, printHeader, success } from '../lib/colors.js';
8
+ import {
9
+ ensureProviderInstalled,
10
+ isProviderInstalled,
11
+ } from '../lib/provider-installer/index.js';
12
+ import {
13
+ getAllProviders,
14
+ getProviderById,
15
+ } from '../lib/provider-registry/index.js';
16
+ import { defineCommand } from './define-command/index.js';
17
+ export const initCommand = defineCommand({
18
+ name: 'init',
19
+ description: '🎯 Initialize Taskin in your project',
20
+ options: [
21
+ {
22
+ flags: '-f, --force',
23
+ description: 'Force initialization (overwrite existing configuration)',
24
+ },
25
+ ],
26
+ handler: async (options) => {
27
+ await initializeTaskin(options);
28
+ },
29
+ });
30
+ async function initializeTaskin(options) {
31
+ printHeader('Initializing Taskin', '🎯');
32
+ const cwd = process.cwd();
33
+ const configFile = join(cwd, '.taskin.json');
34
+ // Check if already initialized
35
+ if (existsSync(configFile) && !options.force) {
36
+ error('Taskin is already initialized in this project');
37
+ info('Use --force to reinitialize');
38
+ process.exit(1);
39
+ }
40
+ // Get all providers from registry
41
+ const allProviders = getAllProviders();
42
+ // Create choices for inquirer
43
+ const choices = allProviders.map((p) => {
44
+ const installed = isProviderInstalled(p.packageName);
45
+ const status = p.status === 'coming-soon' ? ' (coming soon)' : '';
46
+ const installedMark = installed ? ' ✓' : '';
47
+ return {
48
+ name: `${p.name}${installedMark}${status} - ${p.description}`,
49
+ value: p.id,
50
+ disabled: p.status === 'coming-soon' ? 'Not yet implemented' : false,
51
+ };
52
+ });
53
+ // Ask user to select provider
54
+ const { providerId } = await inquirer.prompt([
55
+ {
56
+ type: 'list',
57
+ name: 'providerId',
58
+ message: 'Select a task provider:',
59
+ choices,
60
+ default: 'fs',
61
+ },
62
+ ]);
63
+ const selectedProvider = getProviderById(providerId);
64
+ if (!selectedProvider) {
65
+ error(`Provider "${providerId}" not found`);
66
+ process.exit(1);
67
+ }
68
+ console.log();
69
+ info(`Setting up task provider: ${colors.highlight(selectedProvider.name)}`);
70
+ console.log();
71
+ // Ensure provider is installed
72
+ await ensureProviderInstalled(selectedProvider);
73
+ // Setup provider configuration
74
+ const providerConfig = await setupProviderConfig(selectedProvider, cwd);
75
+ // Create .taskin.json configuration
76
+ const config = {
77
+ version: '0.1.0',
78
+ provider: {
79
+ type: selectedProvider.id,
80
+ config: providerConfig,
81
+ },
82
+ };
83
+ info('Creating configuration file...');
84
+ writeFileSync(configFile, JSON.stringify(config, null, 2), 'utf-8');
85
+ success(`✓ Created ${colors.highlight('.taskin.json')}`);
86
+ // Add .taskin.json to .gitignore if it exists
87
+ const gitignorePath = join(cwd, '.gitignore');
88
+ if (existsSync(gitignorePath)) {
89
+ const gitignoreContent = require('fs').readFileSync(gitignorePath, 'utf-8');
90
+ if (!gitignoreContent.includes('.taskin.json')) {
91
+ info('Adding .taskin.json to .gitignore...');
92
+ writeFileSync(
93
+ gitignorePath,
94
+ `${gitignoreContent}\n# Taskin configuration\n.taskin.json\n`,
95
+ 'utf-8',
96
+ );
97
+ success('✓ Updated .gitignore');
98
+ }
99
+ }
100
+ console.log();
101
+ success('🎉 Taskin initialized successfully!');
102
+ console.log();
103
+ info('Next steps:');
104
+ console.log(colors.secondary(' 1. Run: taskin list'));
105
+ console.log(
106
+ colors.secondary(
107
+ selectedProvider.id === 'fs'
108
+ ? ' 2. Edit or create tasks in TASKS/'
109
+ : ` 2. Tasks will be synced with ${selectedProvider.name}`,
110
+ ),
111
+ );
112
+ console.log(colors.secondary(' 3. Start working: taskin start <task-id>'));
113
+ console.log();
114
+ info('For more information, run: taskin --help');
115
+ console.log();
116
+ }
117
+ /**
118
+ * Setup provider configuration based on provider schema
119
+ */
120
+ async function setupProviderConfig(provider, cwd) {
121
+ // Special handling for File System provider
122
+ if (provider.id === 'fs') {
123
+ return setupFileSystemProvider(cwd);
124
+ }
125
+ // Generic configuration for other providers
126
+ info(`Configuring ${provider.name}...`);
127
+ console.log();
128
+ const questions = Object.entries(provider.configSchema.properties).map(
129
+ ([key, schema]) => ({
130
+ type: schema.secret ? 'password' : 'input',
131
+ name: key,
132
+ message: `${schema.description}:`,
133
+ validate: (input) => {
134
+ if (
135
+ provider.configSchema.required.includes(key) &&
136
+ input.length === 0
137
+ ) {
138
+ return `${schema.description} is required`;
139
+ }
140
+ return true;
141
+ },
142
+ }),
143
+ );
144
+ const answers = await inquirer.prompt(questions);
145
+ console.log();
146
+ success(`✓ ${provider.name} configuration saved`);
147
+ return answers;
148
+ }
149
+ async function setupFileSystemProvider(cwd) {
150
+ const tasksDir = join(cwd, 'TASKS');
151
+ // Create TASKS directory
152
+ if (!existsSync(tasksDir)) {
153
+ info(`Creating TASKS directory...`);
154
+ mkdirSync(tasksDir, { recursive: true });
155
+ success(`✓ Created ${colors.highlight('TASKS/')} directory`);
156
+ } else {
157
+ info(`${colors.highlight('TASKS/')} directory already exists`);
158
+ }
159
+ // Create a sample task
160
+ const sampleTaskFile = join(tasksDir, 'task-001-setup-project.md');
161
+ if (!existsSync(sampleTaskFile)) {
162
+ info('Creating sample task...');
163
+ const sampleTask = `# Task 001 — Setup Project
164
+
165
+ Status: pending
166
+ Type: chore
167
+ Assignee: developer
168
+
169
+ ## Description
170
+
171
+ This is a sample task created during Taskin initialization.
172
+
173
+ ## Tasks
174
+
175
+ - [ ] Review Taskin documentation
176
+ - [ ] Create your first task
177
+ - [ ] Start working on a task
178
+
179
+ ## Notes
180
+
181
+ You can edit or delete this file. Use \`taskin list\` to see all tasks.
182
+ `;
183
+ writeFileSync(sampleTaskFile, sampleTask, 'utf-8');
184
+ success(
185
+ `✓ Created sample task ${colors.highlight('task-001-setup-project.md')}`,
186
+ );
187
+ }
188
+ return {
189
+ tasksDir: 'TASKS',
190
+ };
191
+ }
192
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Lint command - Validate task markdown files
3
+ */
4
+ export declare const lintCommand: import('./define-command/define-command.types.js').CommandRegistration;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Lint command - Validate task markdown files
3
+ */
4
+ import { join } from 'path';
5
+ import { FileSystemTaskLinter } from '../lib/file-system-task-linter/index.js';
6
+ import { defineCommand } from './define-command/index.js';
7
+ export const lintCommand = defineCommand({
8
+ name: 'lint',
9
+ description: '🔍 Validate task markdown files',
10
+ options: [
11
+ {
12
+ flags: '-p, --path <directory>',
13
+ description: 'Path to TASKS directory',
14
+ defaultValue: 'TASKS',
15
+ },
16
+ ],
17
+ handler: async (options) => {
18
+ await executeLint(options);
19
+ },
20
+ });
21
+ async function executeLint(options) {
22
+ const tasksDir = options.path || join(process.cwd(), 'TASKS');
23
+ console.log(`📋 Linting task files in: ${tasksDir}\n`);
24
+ const linter = new FileSystemTaskLinter();
25
+ const result = await linter.lintDirectory(tasksDir);
26
+ FileSystemTaskLinter.printResults(result);
27
+ if (!result.valid) {
28
+ process.exit(1);
29
+ }
30
+ }
31
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,iCAAiC;IAC9C,OAAO,EAAE;QACP;YACE,KAAK,EAAE,wBAAwB;YAC/B,WAAW,EAAE,yBAAyB;YACtC,YAAY,EAAE,OAAO;SACtB;KACF;IACD,OAAO,EAAE,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC3C,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC,CAAC;AAEH,KAAK,UAAU,WAAW,CAAC,OAAyB;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAE9D,OAAO,CAAC,GAAG,CAAC,6BAA6B,QAAQ,IAAI,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACpD,oBAAoB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAE1C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * List command - Display all tasks
3
+ */
4
+ export declare const listCommand: import('./define-command/define-command.types.js').CommandRegistration;
@@ -0,0 +1,132 @@
1
+ /**
2
+ * List command - Display all tasks
3
+ */
4
+ import { FileSystemTaskProvider } from '@taskin/fs-task-provider';
5
+ import path from 'path';
6
+ import { colors, printHeader } from '../lib/colors.js';
7
+ import { defineCommand } from './define-command/index.js';
8
+ export const listCommand = defineCommand({
9
+ name: 'list [filter]',
10
+ description: '📊 List all tasks in the project',
11
+ alias: 'ls',
12
+ options: [
13
+ {
14
+ flags: '-s, --status <status>',
15
+ description: 'Filter by status (pending, in-progress, done, blocked)',
16
+ },
17
+ {
18
+ flags: '-t, --type <type>',
19
+ description: 'Filter by type (feat, fix, refactor, docs, test, chore)',
20
+ },
21
+ {
22
+ flags: '-u, --user <user>',
23
+ description: 'Filter by user',
24
+ },
25
+ ],
26
+ handler: async (filter, options) => {
27
+ await listTasks(filter, options);
28
+ },
29
+ });
30
+ async function listTasks(filter, options) {
31
+ printHeader('Task List', '📊');
32
+ // Find TASKS directory
33
+ const tasksDir = path.join(process.cwd(), 'TASKS');
34
+ // Initialize task provider
35
+ const taskProvider = new FileSystemTaskProvider(tasksDir);
36
+ // Get all tasks
37
+ const tasks = await taskProvider.getAllTasks();
38
+ if (tasks.length === 0) {
39
+ console.log(colors.warning('No tasks found in TASKS/ directory'));
40
+ return;
41
+ }
42
+ // Apply filters
43
+ let filteredTasks = tasks;
44
+ if (options.status) {
45
+ filteredTasks = filteredTasks.filter((t) => t.status === options.status);
46
+ }
47
+ if (options.type) {
48
+ filteredTasks = filteredTasks.filter((t) => t.type === options.type);
49
+ }
50
+ if (options.assignee) {
51
+ filteredTasks = filteredTasks.filter((t) =>
52
+ t.userId?.toLowerCase().includes(options.assignee.toLowerCase()),
53
+ );
54
+ }
55
+ if (filter) {
56
+ const lowerFilter = filter.toLowerCase();
57
+ filteredTasks = filteredTasks.filter(
58
+ (t) =>
59
+ t.id.includes(lowerFilter) ||
60
+ t.title.toLowerCase().includes(lowerFilter) ||
61
+ t.status.toLowerCase().includes(lowerFilter) ||
62
+ t.userId?.toLowerCase().includes(lowerFilter),
63
+ );
64
+ }
65
+ if (filteredTasks.length === 0) {
66
+ console.log(colors.warning('No tasks match the filters'));
67
+ return;
68
+ }
69
+ // Display tasks
70
+ console.log(
71
+ colors.highlight(
72
+ `${'ID'.padEnd(15)} ${'Status'.padEnd(15)} ${'Type'.padEnd(12)} ${'User'.padEnd(15)} ${'Title'}`,
73
+ ),
74
+ );
75
+ console.log(colors.secondary('─'.repeat(100)));
76
+ filteredTasks.forEach((task) => {
77
+ const statusColor = getStatusColor(task.status);
78
+ const typeColor = getTypeColor(task.type);
79
+ console.log(
80
+ `${colors.info(task.id.padEnd(15))} ${statusColor(task.status.padEnd(15))} ${typeColor(task.type.padEnd(12))} ${colors.secondary((task.userId || 'unknown').padEnd(15))} ${colors.normal(task.title)}`,
81
+ );
82
+ });
83
+ console.log();
84
+ console.log(colors.secondary('─'.repeat(100)));
85
+ // Summary
86
+ const statusCounts = {
87
+ pending: filteredTasks.filter((t) => t.status === 'pending').length,
88
+ 'in-progress': filteredTasks.filter((t) => t.status === 'in-progress')
89
+ .length,
90
+ done: filteredTasks.filter((t) => t.status === 'done').length,
91
+ blocked: filteredTasks.filter((t) => t.status === 'blocked').length,
92
+ };
93
+ console.log(
94
+ colors.info(
95
+ `📊 Total: ${filteredTasks.length} tasks | ⏳ Pending: ${statusCounts.pending} | 🚀 In Progress: ${statusCounts['in-progress']} | ✅ Done: ${statusCounts.done} | 🚫 Blocked: ${statusCounts.blocked}`,
96
+ ),
97
+ );
98
+ console.log();
99
+ }
100
+ function getStatusColor(status) {
101
+ switch (status) {
102
+ case 'pending':
103
+ return colors.secondary;
104
+ case 'in-progress':
105
+ return colors.info;
106
+ case 'done':
107
+ return colors.success;
108
+ case 'blocked':
109
+ return colors.error;
110
+ default:
111
+ return colors.normal;
112
+ }
113
+ }
114
+ function getTypeColor(type) {
115
+ switch (type) {
116
+ case 'feat':
117
+ return colors.success;
118
+ case 'fix':
119
+ return colors.error;
120
+ case 'refactor':
121
+ return colors.warning;
122
+ case 'docs':
123
+ return colors.info;
124
+ case 'test':
125
+ return colors.secondary;
126
+ case 'chore':
127
+ return colors.normal;
128
+ default:
129
+ return colors.normal;
130
+ }
131
+ }
132
+ //# 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,4 @@
1
+ /**
2
+ * Pause command - Pause work on a task
3
+ */
4
+ export declare const pauseCommand: import('./define-command/define-command.types.js').CommandRegistration;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Pause command - Pause work on a task
3
+ */
4
+ import { FileSystemTaskProvider } from '@taskin/fs-task-provider';
5
+ import path from 'path';
6
+ import { colors, error, info, printHeader, success } from '../lib/colors.js';
7
+ import { defineCommand } from './define-command/index.js';
8
+ export const pauseCommand = defineCommand({
9
+ name: 'pause <task-id>',
10
+ description: '⏸️ Pause work on a task',
11
+ alias: 'stop',
12
+ options: [
13
+ {
14
+ flags: '-m, --message <message>',
15
+ description: 'Custom commit message',
16
+ },
17
+ {
18
+ flags: '-s, --skip-commit',
19
+ description: 'Skip commit (just show what would be done)',
20
+ },
21
+ ],
22
+ handler: async (taskId, options) => {
23
+ await pauseTask(taskId, options);
24
+ },
25
+ });
26
+ async function pauseTask(taskId, options) {
27
+ printHeader(`Pausing Task ${taskId}`, '⏸️');
28
+ // Normalize task ID
29
+ const normalizedId = taskId.replace(/^task-/, '').padStart(3, '0');
30
+ // Find TASKS directory
31
+ const tasksDir = path.join(process.cwd(), 'TASKS');
32
+ // Initialize task provider
33
+ const taskProvider = new FileSystemTaskProvider(tasksDir);
34
+ // Find task
35
+ const task = await taskProvider.findTask(normalizedId);
36
+ if (!task) {
37
+ error(`Task ${normalizedId} not found in TASKS/ directory`);
38
+ process.exit(1);
39
+ }
40
+ info(`Found task: ${task.title}`);
41
+ info(`Current status: ${task.status}`);
42
+ // Check if task is in progress
43
+ if (task.status !== 'in-progress') {
44
+ error('Task is not in progress. Use "taskin start" first.');
45
+ process.exit(1);
46
+ }
47
+ const commitMessage =
48
+ options.message || `WIP: task-${normalizedId} - ${task.title}`;
49
+ if (options.skipCommit) {
50
+ info('Would create commit with message:');
51
+ console.log(colors.highlight(` "${commitMessage}"`));
52
+ console.log();
53
+ info('Use without --skip-commit to actually commit');
54
+ } else {
55
+ info('Creating commit...');
56
+ console.log(colors.secondary(` Message: "${commitMessage}"`));
57
+ console.log();
58
+ success('Task paused successfully!');
59
+ info('Commit created (not pushed)');
60
+ console.log();
61
+ info('Next steps:');
62
+ console.log(colors.secondary(' 1. Switch to another task'));
63
+ console.log(
64
+ colors.secondary(' 2. Or continue later with the same branch'),
65
+ );
66
+ }
67
+ console.log();
68
+ }
69
+ //# sourceMappingURL=pause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause.js","sourceRoot":"","sources":["../../src/commands/pause.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Start command - Begin working on a task
3
+ */
4
+ export declare const startCommand: import('./define-command/define-command.types.js').CommandRegistration;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Start command - Begin working on a task
3
+ */
4
+ import { FileSystemTaskProvider } from '@taskin/fs-task-provider';
5
+ import { TaskManager } from '@taskin/task-manager';
6
+ import path from 'path';
7
+ import { colors, error, info, printHeader, success } from '../lib/colors.js';
8
+ import { defineCommand } from './define-command/index.js';
9
+ export const startCommand = defineCommand({
10
+ name: 'start <task-id>',
11
+ description: '🚀 Start working on a task',
12
+ alias: 'begin',
13
+ options: [
14
+ {
15
+ flags: '-f, --force',
16
+ description: 'Force start even with uncommitted changes',
17
+ },
18
+ {
19
+ flags: '-b, --base <branch>',
20
+ description: 'Base branch to create from (default: current)',
21
+ },
22
+ ],
23
+ handler: async (taskId, options) => {
24
+ await startTask(taskId, options);
25
+ },
26
+ });
27
+ async function startTask(taskId, _options) {
28
+ printHeader(`Starting Task ${taskId}`, '🚀');
29
+ // Normalize task ID
30
+ const normalizedId = taskId.replace(/^task-/, '').padStart(3, '0');
31
+ // Find TASKS directory
32
+ const tasksDir = path.join(process.cwd(), 'TASKS');
33
+ // Initialize task manager
34
+ const taskProvider = new FileSystemTaskProvider(tasksDir);
35
+ const taskManager = new TaskManager(taskProvider);
36
+ // Find task
37
+ const task = await taskProvider.findTask(normalizedId);
38
+ if (!task) {
39
+ error(`Task ${normalizedId} not found in TASKS/ directory`);
40
+ process.exit(1);
41
+ }
42
+ info(`Found task: ${task.title}`);
43
+ info(`Current status: ${task.status}`);
44
+ // Check if task is already in progress
45
+ if (task.status === 'in-progress') {
46
+ error('Task is already in progress');
47
+ process.exit(1);
48
+ }
49
+ // Check if task is done
50
+ if (task.status === 'done') {
51
+ error('Task is already done');
52
+ process.exit(1);
53
+ }
54
+ // Start the task
55
+ info('Starting task...');
56
+ const updatedTask = await taskManager.startTask(task.id);
57
+ success(`Task ${updatedTask.id} started successfully!`);
58
+ success(`Status changed to: ${updatedTask.status}`);
59
+ console.log();
60
+ info('Next steps:');
61
+ console.log(
62
+ colors.secondary(
63
+ ' 1. Create a branch: git checkout -b feat/task-' + normalizedId,
64
+ ),
65
+ );
66
+ console.log(colors.secondary(' 2. Start coding! 💻'));
67
+ console.log(colors.secondary(' 3. Use "taskin pause" to save progress'));
68
+ console.log();
69
+ }
70
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Taskin CLI - Main entry point
4
+ * Command-line interface for managing tasks
5
+ */
6
+ export type { ITaskin } from '@taskin/types-ts';
7
+ export { createTaskin, getTaskin } from './main.js';
8
+ export { Taskin } from './taskin.js';
package/dist/index.js ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Taskin CLI - Main entry point
4
+ * Command-line interface for managing tasks
5
+ */
6
+ import { Command } from 'commander';
7
+ import { finishCommand } from './commands/finish.js';
8
+ import { initCommand } from './commands/init.js';
9
+ import { lintCommand } from './commands/lint.js';
10
+ import { listCommand } from './commands/list.js';
11
+ import { pauseCommand } from './commands/pause.js';
12
+ import { startCommand } from './commands/start.js';
13
+ import { showCustomHelp } from './lib/help.js';
14
+ const program = new Command();
15
+ program
16
+ .name('taskin')
17
+ .description('🚀 Task Management System')
18
+ .version('0.1.0')
19
+ .configureHelp({
20
+ formatHelp: () => showCustomHelp(),
21
+ });
22
+ // Register commands
23
+ initCommand(program);
24
+ listCommand(program);
25
+ startCommand(program);
26
+ pauseCommand(program);
27
+ finishCommand(program);
28
+ lintCommand(program);
29
+ // Show custom help if no command provided
30
+ if (process.argv.length <= 2) {
31
+ showCustomHelp();
32
+ process.exit(0);
33
+ }
34
+ // Parse arguments
35
+ program.parse();
36
+ export { createTaskin, getTaskin } from './main.js';
37
+ export { Taskin } from './taskin.js';
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,2BAA2B,CAAC;KACxC,OAAO,CAAC,OAAO,CAAC;KAChB,aAAa,CAAC;IACb,UAAU,EAAE,GAAG,EAAE,CAAC,cAAc,EAAE;CACnC,CAAC,CAAC;AAEL,oBAAoB;AACpB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,WAAW,CAAC,OAAO,CAAC,CAAC;AAErB,0CAA0C;AAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,cAAc,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC;AAIhB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Color utilities for CLI output
3
+ */
4
+ export declare const colors: {
5
+ info: import('chalk').ChalkInstance;
6
+ success: import('chalk').ChalkInstance;
7
+ warning: import('chalk').ChalkInstance;
8
+ error: import('chalk').ChalkInstance;
9
+ highlight: import('chalk').ChalkInstance;
10
+ secondary: import('chalk').ChalkInstance;
11
+ normal: import('chalk').ChalkInstance;
12
+ };
13
+ export declare const icons: {
14
+ rocket: string;
15
+ list: string;
16
+ check: string;
17
+ pause: string;
18
+ info: string;
19
+ task: string;
20
+ gear: string;
21
+ };
22
+ export declare function printHeader(title: string, icon: string): void;
23
+ export declare function success(message: string): void;
24
+ export declare function error(message: string): void;
25
+ export declare function info(message: string): void;
26
+ export declare function warning(message: string): void;