takt 0.1.7 → 0.2.1

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 (156) hide show
  1. package/README.md +179 -43
  2. package/dist/agents/runner.d.ts +3 -1
  3. package/dist/agents/runner.d.ts.map +1 -1
  4. package/dist/agents/runner.js +15 -0
  5. package/dist/agents/runner.js.map +1 -1
  6. package/dist/claude/client.d.ts +3 -1
  7. package/dist/claude/client.d.ts.map +1 -1
  8. package/dist/claude/client.js +17 -0
  9. package/dist/claude/client.js.map +1 -1
  10. package/dist/cli.d.ts +9 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +73 -18
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands/addTask.d.ts +15 -0
  15. package/dist/commands/addTask.d.ts.map +1 -0
  16. package/dist/commands/addTask.js +119 -0
  17. package/dist/commands/addTask.js.map +1 -0
  18. package/dist/commands/help.d.ts.map +1 -1
  19. package/dist/commands/help.js +18 -5
  20. package/dist/commands/help.js.map +1 -1
  21. package/dist/commands/index.d.ts +4 -0
  22. package/dist/commands/index.d.ts.map +1 -1
  23. package/dist/commands/index.js +4 -0
  24. package/dist/commands/index.js.map +1 -1
  25. package/dist/commands/refreshBuiltin.d.ts +11 -0
  26. package/dist/commands/refreshBuiltin.d.ts.map +1 -0
  27. package/dist/commands/refreshBuiltin.js +37 -0
  28. package/dist/commands/refreshBuiltin.js.map +1 -0
  29. package/dist/commands/reviewTasks.d.ts +32 -0
  30. package/dist/commands/reviewTasks.d.ts.map +1 -0
  31. package/dist/commands/reviewTasks.js +198 -0
  32. package/dist/commands/reviewTasks.js.map +1 -0
  33. package/dist/commands/taskExecution.d.ts +24 -1
  34. package/dist/commands/taskExecution.d.ts.map +1 -1
  35. package/dist/commands/taskExecution.js +100 -36
  36. package/dist/commands/taskExecution.js.map +1 -1
  37. package/dist/commands/watchTasks.d.ts +12 -0
  38. package/dist/commands/watchTasks.d.ts.map +1 -0
  39. package/dist/commands/watchTasks.js +68 -0
  40. package/dist/commands/watchTasks.js.map +1 -0
  41. package/dist/commands/workflowExecution.d.ts +5 -1
  42. package/dist/commands/workflowExecution.d.ts.map +1 -1
  43. package/dist/commands/workflowExecution.js +35 -12
  44. package/dist/commands/workflowExecution.js.map +1 -1
  45. package/dist/config/initialization.d.ts +2 -0
  46. package/dist/config/initialization.d.ts.map +1 -1
  47. package/dist/config/initialization.js +12 -2
  48. package/dist/config/initialization.js.map +1 -1
  49. package/dist/config/paths.d.ts +1 -1
  50. package/dist/config/paths.d.ts.map +1 -1
  51. package/dist/config/paths.js +1 -1
  52. package/dist/config/paths.js.map +1 -1
  53. package/dist/config/sessionStore.d.ts +5 -0
  54. package/dist/config/sessionStore.d.ts.map +1 -1
  55. package/dist/config/sessionStore.js +1 -1
  56. package/dist/config/sessionStore.js.map +1 -1
  57. package/dist/config/workflowLoader.d.ts.map +1 -1
  58. package/dist/config/workflowLoader.js +1 -0
  59. package/dist/config/workflowLoader.js.map +1 -1
  60. package/dist/models/schemas.d.ts +22 -0
  61. package/dist/models/schemas.d.ts.map +1 -1
  62. package/dist/models/schemas.js +8 -0
  63. package/dist/models/schemas.js.map +1 -1
  64. package/dist/models/types.d.ts +8 -2
  65. package/dist/models/types.d.ts.map +1 -1
  66. package/dist/prompt/index.d.ts +60 -11
  67. package/dist/prompt/index.d.ts.map +1 -1
  68. package/dist/prompt/index.js +246 -72
  69. package/dist/prompt/index.js.map +1 -1
  70. package/dist/providers/claude.d.ts.map +1 -1
  71. package/dist/providers/claude.js +2 -0
  72. package/dist/providers/claude.js.map +1 -1
  73. package/dist/providers/index.d.ts +3 -1
  74. package/dist/providers/index.d.ts.map +1 -1
  75. package/dist/providers/index.js.map +1 -1
  76. package/dist/resources/index.d.ts +5 -0
  77. package/dist/resources/index.d.ts.map +1 -1
  78. package/dist/resources/index.js +33 -9
  79. package/dist/resources/index.js.map +1 -1
  80. package/dist/task/autoCommit.d.ts +28 -0
  81. package/dist/task/autoCommit.d.ts.map +1 -0
  82. package/dist/task/autoCommit.js +68 -0
  83. package/dist/task/autoCommit.js.map +1 -0
  84. package/dist/task/display.d.ts.map +1 -1
  85. package/dist/task/display.js +19 -1
  86. package/dist/task/display.js.map +1 -1
  87. package/dist/task/index.d.ts +5 -0
  88. package/dist/task/index.d.ts.map +1 -1
  89. package/dist/task/index.js +5 -0
  90. package/dist/task/index.js.map +1 -1
  91. package/dist/task/parser.d.ts +33 -0
  92. package/dist/task/parser.d.ts.map +1 -0
  93. package/dist/task/parser.js +86 -0
  94. package/dist/task/parser.js.map +1 -0
  95. package/dist/task/runner.d.ts +6 -0
  96. package/dist/task/runner.d.ts.map +1 -1
  97. package/dist/task/runner.js +33 -42
  98. package/dist/task/runner.js.map +1 -1
  99. package/dist/task/schema.d.ts +32 -0
  100. package/dist/task/schema.d.ts.map +1 -0
  101. package/dist/task/schema.js +31 -0
  102. package/dist/task/schema.js.map +1 -0
  103. package/dist/task/watcher.d.ts +33 -0
  104. package/dist/task/watcher.d.ts.map +1 -0
  105. package/dist/task/watcher.js +69 -0
  106. package/dist/task/watcher.js.map +1 -0
  107. package/dist/task/worktree.d.ts +70 -0
  108. package/dist/task/worktree.d.ts.map +1 -0
  109. package/dist/task/worktree.js +221 -0
  110. package/dist/task/worktree.js.map +1 -0
  111. package/dist/utils/debug.d.ts +6 -1
  112. package/dist/utils/debug.d.ts.map +1 -1
  113. package/dist/utils/debug.js +30 -24
  114. package/dist/utils/debug.js.map +1 -1
  115. package/dist/utils/index.d.ts +1 -0
  116. package/dist/utils/index.d.ts.map +1 -1
  117. package/dist/utils/index.js +1 -0
  118. package/dist/utils/index.js.map +1 -1
  119. package/dist/utils/session.d.ts +20 -0
  120. package/dist/utils/session.d.ts.map +1 -1
  121. package/dist/utils/session.js +32 -3
  122. package/dist/utils/session.js.map +1 -1
  123. package/dist/utils/slug.d.ts +12 -0
  124. package/dist/utils/slug.d.ts.map +1 -0
  125. package/dist/utils/slug.js +18 -0
  126. package/dist/utils/slug.js.map +1 -0
  127. package/dist/utils/text.d.ts +22 -0
  128. package/dist/utils/text.d.ts.map +1 -0
  129. package/dist/utils/text.js +54 -0
  130. package/dist/utils/text.js.map +1 -0
  131. package/dist/workflow/engine.d.ts +5 -6
  132. package/dist/workflow/engine.d.ts.map +1 -1
  133. package/dist/workflow/engine.js +32 -12
  134. package/dist/workflow/engine.js.map +1 -1
  135. package/dist/workflow/index.d.ts +2 -2
  136. package/dist/workflow/index.d.ts.map +1 -1
  137. package/dist/workflow/index.js +2 -2
  138. package/dist/workflow/index.js.map +1 -1
  139. package/dist/workflow/instruction-builder.d.ts +31 -2
  140. package/dist/workflow/instruction-builder.d.ts.map +1 -1
  141. package/dist/workflow/instruction-builder.js +69 -1
  142. package/dist/workflow/instruction-builder.js.map +1 -1
  143. package/dist/workflow/transitions.d.ts.map +1 -1
  144. package/dist/workflow/transitions.js +1 -0
  145. package/dist/workflow/transitions.js.map +1 -1
  146. package/dist/workflow/types.d.ts +5 -1
  147. package/dist/workflow/types.d.ts.map +1 -1
  148. package/package.json +3 -2
  149. package/resources/global/en/workflows/default.yaml +22 -1
  150. package/resources/global/en/workflows/simple.yaml +18 -1
  151. package/resources/global/ja/agents/default/ai-reviewer.md +24 -1
  152. package/resources/global/ja/agents/default/architect.md +157 -4
  153. package/resources/global/ja/agents/default/coder.md +1 -0
  154. package/resources/global/ja/workflows/default.yaml +38 -1
  155. package/resources/global/ja/workflows/expert-review.yaml +169 -10
  156. package/resources/global/ja/workflows/simple.yaml +18 -1
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Review tasks command
3
+ *
4
+ * Interactive UI for reviewing worktree-based task results:
5
+ * try merge, merge & cleanup, or delete actions.
6
+ */
7
+ import { execFileSync } from 'node:child_process';
8
+ import chalk from 'chalk';
9
+ import { removeWorktree, detectDefaultBranch, listTaktWorktrees, buildReviewItems, } from '../task/worktree.js';
10
+ import { selectOption, confirm } from '../prompt/index.js';
11
+ import { info, success, error as logError, warn } from '../utils/ui.js';
12
+ import { createLogger } from '../utils/debug.js';
13
+ const log = createLogger('review-tasks');
14
+ /**
15
+ * Check if a branch has already been merged into HEAD.
16
+ */
17
+ export function isBranchMerged(projectDir, branch) {
18
+ try {
19
+ execFileSync('git', ['merge-base', '--is-ancestor', branch, 'HEAD'], {
20
+ cwd: projectDir,
21
+ encoding: 'utf-8',
22
+ stdio: 'pipe',
23
+ });
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ /**
31
+ * Show diff stat for a branch and prompt for an action.
32
+ */
33
+ async function showDiffAndPromptAction(cwd, defaultBranch, item) {
34
+ console.log();
35
+ console.log(chalk.bold.cyan(`=== ${item.info.branch} ===`));
36
+ console.log();
37
+ // Show diff stat
38
+ try {
39
+ const stat = execFileSync('git', ['diff', '--stat', `${defaultBranch}...${item.info.branch}`], { cwd, encoding: 'utf-8', stdio: 'pipe' });
40
+ console.log(stat);
41
+ }
42
+ catch {
43
+ warn('Could not generate diff stat');
44
+ }
45
+ // Prompt action
46
+ const action = await selectOption(`Action for ${item.info.branch}:`, [
47
+ { label: 'Try merge', value: 'try', description: 'Merge without cleanup (keep worktree & branch)' },
48
+ { label: 'Merge & cleanup', value: 'merge', description: 'Merge (if needed) and remove worktree & branch' },
49
+ { label: 'Delete', value: 'delete', description: 'Discard changes, remove worktree and branch' },
50
+ ]);
51
+ return action;
52
+ }
53
+ /**
54
+ * Try-merge: merge the branch without cleanup.
55
+ * Keeps the worktree and branch intact for further review.
56
+ */
57
+ export function tryMergeWorktreeBranch(projectDir, item) {
58
+ const { branch } = item.info;
59
+ try {
60
+ execFileSync('git', ['merge', branch], {
61
+ cwd: projectDir,
62
+ encoding: 'utf-8',
63
+ stdio: 'pipe',
64
+ });
65
+ success(`Merged ${branch} (worktree kept)`);
66
+ log.info('Try-merge completed', { branch });
67
+ return true;
68
+ }
69
+ catch (err) {
70
+ const msg = err instanceof Error ? err.message : String(err);
71
+ logError(`Merge failed: ${msg}`);
72
+ logError('You may need to resolve conflicts manually.');
73
+ log.error('Try-merge failed', { branch, error: msg });
74
+ return false;
75
+ }
76
+ }
77
+ /**
78
+ * Merge & cleanup: if already merged, skip merge and just cleanup.
79
+ * Otherwise merge first, then cleanup (remove worktree + delete branch).
80
+ */
81
+ export function mergeWorktreeBranch(projectDir, item) {
82
+ const { branch } = item.info;
83
+ const alreadyMerged = isBranchMerged(projectDir, branch);
84
+ try {
85
+ // 1. Remove worktree (must happen before merge to unlock branch)
86
+ removeWorktree(projectDir, item.info.path);
87
+ // 2. Merge only if not already merged
88
+ if (alreadyMerged) {
89
+ info(`${branch} is already merged, skipping merge.`);
90
+ log.info('Branch already merged, cleanup only', { branch });
91
+ }
92
+ else {
93
+ execFileSync('git', ['merge', branch], {
94
+ cwd: projectDir,
95
+ encoding: 'utf-8',
96
+ stdio: 'pipe',
97
+ });
98
+ }
99
+ // 3. Delete the branch
100
+ try {
101
+ execFileSync('git', ['branch', '-d', branch], {
102
+ cwd: projectDir,
103
+ encoding: 'utf-8',
104
+ stdio: 'pipe',
105
+ });
106
+ }
107
+ catch {
108
+ warn(`Could not delete branch ${branch}. You may delete it manually.`);
109
+ }
110
+ success(`Merged & cleaned up ${branch}`);
111
+ log.info('Worktree merged & cleaned up', { branch, alreadyMerged });
112
+ return true;
113
+ }
114
+ catch (err) {
115
+ const msg = err instanceof Error ? err.message : String(err);
116
+ logError(`Merge failed: ${msg}`);
117
+ logError('You may need to resolve conflicts manually.');
118
+ log.error('Merge & cleanup failed', { branch, error: msg });
119
+ return false;
120
+ }
121
+ }
122
+ /**
123
+ * Delete a worktree and its branch (discard changes).
124
+ */
125
+ export function deleteWorktreeBranch(projectDir, item) {
126
+ const { branch } = item.info;
127
+ try {
128
+ // 1. Remove worktree
129
+ removeWorktree(projectDir, item.info.path);
130
+ // 2. Force-delete the branch
131
+ execFileSync('git', ['branch', '-D', branch], {
132
+ cwd: projectDir,
133
+ encoding: 'utf-8',
134
+ stdio: 'pipe',
135
+ });
136
+ success(`Deleted ${branch}`);
137
+ log.info('Worktree deleted', { branch });
138
+ return true;
139
+ }
140
+ catch (err) {
141
+ const msg = err instanceof Error ? err.message : String(err);
142
+ logError(`Delete failed: ${msg}`);
143
+ log.error('Delete failed', { branch, error: msg });
144
+ return false;
145
+ }
146
+ }
147
+ /**
148
+ * Main entry point: review worktree tasks interactively.
149
+ */
150
+ export async function reviewTasks(cwd) {
151
+ log.info('Starting review-tasks');
152
+ const defaultBranch = detectDefaultBranch(cwd);
153
+ let worktrees = listTaktWorktrees(cwd);
154
+ if (worktrees.length === 0) {
155
+ info('No tasks to review.');
156
+ return;
157
+ }
158
+ // Interactive loop
159
+ while (worktrees.length > 0) {
160
+ const items = buildReviewItems(cwd, worktrees, defaultBranch);
161
+ // Build selection options
162
+ const options = items.map((item, idx) => ({
163
+ label: item.info.branch,
164
+ value: String(idx),
165
+ description: `${item.filesChanged} file${item.filesChanged !== 1 ? 's' : ''} changed`,
166
+ }));
167
+ const selected = await selectOption('Review Tasks (Worktrees)', options);
168
+ if (selected === null) {
169
+ return;
170
+ }
171
+ const selectedIdx = parseInt(selected, 10);
172
+ const item = items[selectedIdx];
173
+ if (!item)
174
+ continue;
175
+ const action = await showDiffAndPromptAction(cwd, defaultBranch, item);
176
+ if (action === null)
177
+ continue;
178
+ switch (action) {
179
+ case 'try':
180
+ tryMergeWorktreeBranch(cwd, item);
181
+ break;
182
+ case 'merge':
183
+ mergeWorktreeBranch(cwd, item);
184
+ break;
185
+ case 'delete': {
186
+ const confirmed = await confirm(`Delete ${item.info.branch}? This will discard all changes.`, false);
187
+ if (confirmed) {
188
+ deleteWorktreeBranch(cwd, item);
189
+ }
190
+ break;
191
+ }
192
+ }
193
+ // Refresh worktree list after action
194
+ worktrees = listTaktWorktrees(cwd);
195
+ }
196
+ info('All tasks reviewed.');
197
+ }
198
+ //# sourceMappingURL=reviewTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewTasks.js","sourceRoot":"","sources":["../../src/commands/reviewTasks.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,24 @@
1
1
  /**
2
2
  * Task execution logic
3
3
  */
4
+ import { TaskRunner, type TaskInfo } from '../task/index.js';
4
5
  /**
5
6
  * Execute a single task with workflow
7
+ * @param task - Task content
8
+ * @param cwd - Working directory (may be a worktree path)
9
+ * @param workflowName - Workflow to use
10
+ * @param projectCwd - Project root (where .takt/ lives). Defaults to cwd.
6
11
  */
7
- export declare function executeTask(task: string, cwd: string, workflowName?: string): Promise<boolean>;
12
+ export declare function executeTask(task: string, cwd: string, workflowName?: string, projectCwd?: string): Promise<boolean>;
13
+ /**
14
+ * Execute a task: resolve worktree → run workflow → auto-commit → record completion.
15
+ *
16
+ * Shared by runAllTasks() and watchTasks() to avoid duplicated
17
+ * resolve → execute → autoCommit → complete logic.
18
+ *
19
+ * @returns true if the task succeeded
20
+ */
21
+ export declare function executeAndCompleteTask(task: TaskInfo, taskRunner: TaskRunner, cwd: string, workflowName: string): Promise<boolean>;
8
22
  /**
9
23
  * Run all pending tasks from .takt/tasks/
10
24
  *
@@ -12,4 +26,13 @@ export declare function executeTask(task: string, cwd: string, workflowName?: st
12
26
  * 実行中にタスクファイルが追加・削除されても反映される。
13
27
  */
14
28
  export declare function runAllTasks(cwd: string, workflowName?: string): Promise<void>;
29
+ /**
30
+ * Resolve execution directory and workflow from task data.
31
+ * If the task has worktree settings, create a worktree and use it as cwd.
32
+ */
33
+ export declare function resolveTaskExecution(task: TaskInfo, defaultCwd: string, defaultWorkflow: string): {
34
+ execCwd: string;
35
+ execWorkflow: string;
36
+ isWorktree: boolean;
37
+ };
15
38
  //# sourceMappingURL=taskExecution.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskExecution.d.ts","sourceRoot":"","sources":["../../src/commands/taskExecution.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,IAAI,CAAC,CAyEf"}
1
+ {"version":3,"file":"taskExecution.d.ts","sourceRoot":"","sources":["../../src/commands/taskExecution.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAiB7D;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,MAA8B,EAC5C,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CAmDlB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CA2BhE"}
@@ -1,8 +1,10 @@
1
1
  /**
2
2
  * Task execution logic
3
3
  */
4
- import { loadWorkflow } from '../config/index.js';
4
+ import { loadWorkflow, loadGlobalConfig } from '../config/index.js';
5
5
  import { TaskRunner } from '../task/index.js';
6
+ import { createWorktree } from '../task/worktree.js';
7
+ import { autoCommitWorktree } from '../task/autoCommit.js';
6
8
  import { header, info, error, success, status, } from '../utils/ui.js';
7
9
  import { createLogger } from '../utils/debug.js';
8
10
  import { getErrorMessage } from '../utils/error.js';
@@ -11,8 +13,12 @@ import { DEFAULT_WORKFLOW_NAME } from '../constants.js';
11
13
  const log = createLogger('task');
12
14
  /**
13
15
  * Execute a single task with workflow
16
+ * @param task - Task content
17
+ * @param cwd - Working directory (may be a worktree path)
18
+ * @param workflowName - Workflow to use
19
+ * @param projectCwd - Project root (where .takt/ lives). Defaults to cwd.
14
20
  */
15
- export async function executeTask(task, cwd, workflowName = DEFAULT_WORKFLOW_NAME) {
21
+ export async function executeTask(task, cwd, workflowName = DEFAULT_WORKFLOW_NAME, projectCwd) {
16
22
  const workflowConfig = loadWorkflow(workflowName);
17
23
  if (!workflowConfig) {
18
24
  error(`Workflow "${workflowName}" not found.`);
@@ -24,9 +30,68 @@ export async function executeTask(task, cwd, workflowName = DEFAULT_WORKFLOW_NAM
24
30
  name: workflowConfig.name,
25
31
  steps: workflowConfig.steps.map(s => s.name),
26
32
  });
27
- const result = await executeWorkflow(workflowConfig, task, cwd);
33
+ const globalConfig = loadGlobalConfig();
34
+ const result = await executeWorkflow(workflowConfig, task, cwd, {
35
+ projectCwd,
36
+ language: globalConfig.language,
37
+ });
28
38
  return result.success;
29
39
  }
40
+ /**
41
+ * Execute a task: resolve worktree → run workflow → auto-commit → record completion.
42
+ *
43
+ * Shared by runAllTasks() and watchTasks() to avoid duplicated
44
+ * resolve → execute → autoCommit → complete logic.
45
+ *
46
+ * @returns true if the task succeeded
47
+ */
48
+ export async function executeAndCompleteTask(task, taskRunner, cwd, workflowName) {
49
+ const startedAt = new Date().toISOString();
50
+ const executionLog = [];
51
+ try {
52
+ const { execCwd, execWorkflow, isWorktree } = resolveTaskExecution(task, cwd, workflowName);
53
+ // cwd is always the project root; pass it as projectCwd so reports/sessions go there
54
+ const taskSuccess = await executeTask(task.content, execCwd, execWorkflow, cwd);
55
+ const completedAt = new Date().toISOString();
56
+ if (taskSuccess && isWorktree) {
57
+ const commitResult = autoCommitWorktree(execCwd, task.name);
58
+ if (commitResult.success && commitResult.commitHash) {
59
+ info(`Auto-committed: ${commitResult.commitHash}`);
60
+ }
61
+ else if (!commitResult.success) {
62
+ error(`Auto-commit failed: ${commitResult.message}`);
63
+ }
64
+ }
65
+ taskRunner.completeTask({
66
+ task,
67
+ success: taskSuccess,
68
+ response: taskSuccess ? 'Task completed successfully' : 'Task failed',
69
+ executionLog,
70
+ startedAt,
71
+ completedAt,
72
+ });
73
+ if (taskSuccess) {
74
+ success(`Task "${task.name}" completed`);
75
+ }
76
+ else {
77
+ error(`Task "${task.name}" failed`);
78
+ }
79
+ return taskSuccess;
80
+ }
81
+ catch (err) {
82
+ const completedAt = new Date().toISOString();
83
+ taskRunner.completeTask({
84
+ task,
85
+ success: false,
86
+ response: getErrorMessage(err),
87
+ executionLog,
88
+ startedAt,
89
+ completedAt,
90
+ });
91
+ error(`Task "${task.name}" error: ${getErrorMessage(err)}`);
92
+ return false;
93
+ }
94
+ }
30
95
  /**
31
96
  * Run all pending tasks from .takt/tasks/
32
97
  *
@@ -39,7 +104,7 @@ export async function runAllTasks(cwd, workflowName = DEFAULT_WORKFLOW_NAME) {
39
104
  let task = taskRunner.getNextTask();
40
105
  if (!task) {
41
106
  info('No pending tasks in .takt/tasks/');
42
- info('Create task files as .takt/tasks/*.md');
107
+ info('Create task files as .takt/tasks/*.yaml or use takt /add-task');
43
108
  return;
44
109
  }
45
110
  header('Running tasks');
@@ -49,40 +114,12 @@ export async function runAllTasks(cwd, workflowName = DEFAULT_WORKFLOW_NAME) {
49
114
  console.log();
50
115
  info(`=== Task: ${task.name} ===`);
51
116
  console.log();
52
- const startedAt = new Date().toISOString();
53
- const executionLog = [];
54
- try {
55
- const taskSuccess = await executeTask(task.content, cwd, workflowName);
56
- const completedAt = new Date().toISOString();
57
- taskRunner.completeTask({
58
- task,
59
- success: taskSuccess,
60
- response: taskSuccess ? 'Task completed successfully' : 'Task failed',
61
- executionLog,
62
- startedAt,
63
- completedAt,
64
- });
65
- if (taskSuccess) {
66
- successCount++;
67
- success(`Task "${task.name}" completed`);
68
- }
69
- else {
70
- failCount++;
71
- error(`Task "${task.name}" failed`);
72
- }
117
+ const taskSuccess = await executeAndCompleteTask(task, taskRunner, cwd, workflowName);
118
+ if (taskSuccess) {
119
+ successCount++;
73
120
  }
74
- catch (err) {
121
+ else {
75
122
  failCount++;
76
- const completedAt = new Date().toISOString();
77
- taskRunner.completeTask({
78
- task,
79
- success: false,
80
- response: getErrorMessage(err),
81
- executionLog,
82
- startedAt,
83
- completedAt,
84
- });
85
- error(`Task "${task.name}" error: ${getErrorMessage(err)}`);
86
123
  }
87
124
  // 次のタスクを動的に取得(新しく追加されたタスクも含む)
88
125
  task = taskRunner.getNextTask();
@@ -96,4 +133,31 @@ export async function runAllTasks(cwd, workflowName = DEFAULT_WORKFLOW_NAME) {
96
133
  status('Failed', String(failCount), 'red');
97
134
  }
98
135
  }
136
+ /**
137
+ * Resolve execution directory and workflow from task data.
138
+ * If the task has worktree settings, create a worktree and use it as cwd.
139
+ */
140
+ export function resolveTaskExecution(task, defaultCwd, defaultWorkflow) {
141
+ const data = task.data;
142
+ // No structured data: use defaults
143
+ if (!data) {
144
+ return { execCwd: defaultCwd, execWorkflow: defaultWorkflow, isWorktree: false };
145
+ }
146
+ let execCwd = defaultCwd;
147
+ let isWorktree = false;
148
+ // Handle worktree
149
+ if (data.worktree) {
150
+ const result = createWorktree(defaultCwd, {
151
+ worktree: data.worktree,
152
+ branch: data.branch,
153
+ taskSlug: task.name,
154
+ });
155
+ execCwd = result.path;
156
+ isWorktree = true;
157
+ info(`Worktree created: ${result.path} (branch: ${result.branch})`);
158
+ }
159
+ // Handle workflow override
160
+ const execWorkflow = data.workflow || defaultWorkflow;
161
+ return { execCwd, execWorkflow, isWorktree };
162
+ }
99
163
  //# sourceMappingURL=taskExecution.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskExecution.js","sourceRoot":"","sources":["../../src/commands/taskExecution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"taskExecution.js","sourceRoot":"","sources":["../../src/commands/taskExecution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * /watch command implementation
3
+ *
4
+ * Watches .takt/tasks/ for new task files and executes them automatically.
5
+ * Stays resident until Ctrl+C (SIGINT).
6
+ */
7
+ /**
8
+ * Watch for tasks and execute them as they appear.
9
+ * Runs until Ctrl+C.
10
+ */
11
+ export declare function watchTasks(cwd: string): Promise<void>;
12
+ //# sourceMappingURL=watchTasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchTasks.d.ts","sourceRoot":"","sources":["../../src/commands/watchTasks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD3D"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * /watch command implementation
3
+ *
4
+ * Watches .takt/tasks/ for new task files and executes them automatically.
5
+ * Stays resident until Ctrl+C (SIGINT).
6
+ */
7
+ import { TaskRunner } from '../task/index.js';
8
+ import { TaskWatcher } from '../task/watcher.js';
9
+ import { getCurrentWorkflow } from '../config/paths.js';
10
+ import { header, info, success, status, } from '../utils/ui.js';
11
+ import { executeAndCompleteTask } from './taskExecution.js';
12
+ import { DEFAULT_WORKFLOW_NAME } from '../constants.js';
13
+ /**
14
+ * Watch for tasks and execute them as they appear.
15
+ * Runs until Ctrl+C.
16
+ */
17
+ export async function watchTasks(cwd) {
18
+ const workflowName = getCurrentWorkflow(cwd) || DEFAULT_WORKFLOW_NAME;
19
+ const taskRunner = new TaskRunner(cwd);
20
+ const watcher = new TaskWatcher(cwd);
21
+ let taskCount = 0;
22
+ let successCount = 0;
23
+ let failCount = 0;
24
+ header('TAKT Watch Mode');
25
+ info(`Workflow: ${workflowName}`);
26
+ info(`Watching: ${taskRunner.getTasksDir()}`);
27
+ info('Waiting for tasks... (Ctrl+C to stop)');
28
+ console.log();
29
+ // Graceful shutdown on SIGINT
30
+ const onSigInt = () => {
31
+ console.log();
32
+ info('Stopping watch...');
33
+ watcher.stop();
34
+ };
35
+ process.on('SIGINT', onSigInt);
36
+ try {
37
+ await watcher.watch(async (task) => {
38
+ taskCount++;
39
+ console.log();
40
+ info(`=== Task ${taskCount}: ${task.name} ===`);
41
+ console.log();
42
+ const taskSuccess = await executeAndCompleteTask(task, taskRunner, cwd, workflowName);
43
+ if (taskSuccess) {
44
+ successCount++;
45
+ }
46
+ else {
47
+ failCount++;
48
+ }
49
+ console.log();
50
+ info('Waiting for tasks... (Ctrl+C to stop)');
51
+ });
52
+ }
53
+ finally {
54
+ process.removeListener('SIGINT', onSigInt);
55
+ }
56
+ // Summary on exit
57
+ if (taskCount > 0) {
58
+ console.log();
59
+ header('Watch Summary');
60
+ status('Total', String(taskCount));
61
+ status('Success', String(successCount), successCount === taskCount ? 'green' : undefined);
62
+ if (failCount > 0) {
63
+ status('Failed', String(failCount), 'red');
64
+ }
65
+ }
66
+ success('Watch stopped.');
67
+ }
68
+ //# sourceMappingURL=watchTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchTasks.js","sourceRoot":"","sources":["../../src/commands/watchTasks.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Workflow execution logic
3
3
  */
4
- import type { WorkflowConfig } from '../models/types.js';
4
+ import type { WorkflowConfig, Language } from '../models/types.js';
5
5
  /** Result of workflow execution */
6
6
  export interface WorkflowExecutionResult {
7
7
  success: boolean;
@@ -11,6 +11,10 @@ export interface WorkflowExecutionResult {
11
11
  export interface WorkflowExecutionOptions {
12
12
  /** Header prefix for display */
13
13
  headerPrefix?: string;
14
+ /** Project root directory (where .takt/ lives). Defaults to cwd. */
15
+ projectCwd?: string;
16
+ /** Language for instruction metadata */
17
+ language?: Language;
14
18
  }
15
19
  /**
16
20
  * Execute a workflow and handle all events
@@ -1 +1 @@
1
- {"version":3,"file":"workflowExecution.d.ts","sourceRoot":"","sources":["../../src/commands/workflowExecution.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA2CzD,mCAAmC;AACnC,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAwB;IACvC,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,cAAc,EAAE,cAAc,EAC9B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAyJlC"}
1
+ {"version":3,"file":"workflowExecution.d.ts","sourceRoot":"","sources":["../../src/commands/workflowExecution.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA4CnE,mCAAmC;AACnC,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAwB;IACvC,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,cAAc,EAAE,cAAc,EAC9B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAmLlC"}