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.
- package/README.md +179 -43
- package/dist/agents/runner.d.ts +3 -1
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +15 -0
- package/dist/agents/runner.js.map +1 -1
- package/dist/claude/client.d.ts +3 -1
- package/dist/claude/client.d.ts.map +1 -1
- package/dist/claude/client.js +17 -0
- package/dist/claude/client.js.map +1 -1
- package/dist/cli.d.ts +9 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +73 -18
- package/dist/cli.js.map +1 -1
- package/dist/commands/addTask.d.ts +15 -0
- package/dist/commands/addTask.d.ts.map +1 -0
- package/dist/commands/addTask.js +119 -0
- package/dist/commands/addTask.js.map +1 -0
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +18 -5
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +4 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +4 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/refreshBuiltin.d.ts +11 -0
- package/dist/commands/refreshBuiltin.d.ts.map +1 -0
- package/dist/commands/refreshBuiltin.js +37 -0
- package/dist/commands/refreshBuiltin.js.map +1 -0
- package/dist/commands/reviewTasks.d.ts +32 -0
- package/dist/commands/reviewTasks.d.ts.map +1 -0
- package/dist/commands/reviewTasks.js +198 -0
- package/dist/commands/reviewTasks.js.map +1 -0
- package/dist/commands/taskExecution.d.ts +24 -1
- package/dist/commands/taskExecution.d.ts.map +1 -1
- package/dist/commands/taskExecution.js +100 -36
- package/dist/commands/taskExecution.js.map +1 -1
- package/dist/commands/watchTasks.d.ts +12 -0
- package/dist/commands/watchTasks.d.ts.map +1 -0
- package/dist/commands/watchTasks.js +68 -0
- package/dist/commands/watchTasks.js.map +1 -0
- package/dist/commands/workflowExecution.d.ts +5 -1
- package/dist/commands/workflowExecution.d.ts.map +1 -1
- package/dist/commands/workflowExecution.js +35 -12
- package/dist/commands/workflowExecution.js.map +1 -1
- package/dist/config/initialization.d.ts +2 -0
- package/dist/config/initialization.d.ts.map +1 -1
- package/dist/config/initialization.js +12 -2
- package/dist/config/initialization.js.map +1 -1
- package/dist/config/paths.d.ts +1 -1
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +1 -1
- package/dist/config/paths.js.map +1 -1
- package/dist/config/sessionStore.d.ts +5 -0
- package/dist/config/sessionStore.d.ts.map +1 -1
- package/dist/config/sessionStore.js +1 -1
- package/dist/config/sessionStore.js.map +1 -1
- package/dist/config/workflowLoader.d.ts.map +1 -1
- package/dist/config/workflowLoader.js +1 -0
- package/dist/config/workflowLoader.js.map +1 -1
- package/dist/models/schemas.d.ts +22 -0
- package/dist/models/schemas.d.ts.map +1 -1
- package/dist/models/schemas.js +8 -0
- package/dist/models/schemas.js.map +1 -1
- package/dist/models/types.d.ts +8 -2
- package/dist/models/types.d.ts.map +1 -1
- package/dist/prompt/index.d.ts +60 -11
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +246 -72
- package/dist/prompt/index.js.map +1 -1
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +2 -0
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/index.d.ts +3 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/resources/index.d.ts +5 -0
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +33 -9
- package/dist/resources/index.js.map +1 -1
- package/dist/task/autoCommit.d.ts +28 -0
- package/dist/task/autoCommit.d.ts.map +1 -0
- package/dist/task/autoCommit.js +68 -0
- package/dist/task/autoCommit.js.map +1 -0
- package/dist/task/display.d.ts.map +1 -1
- package/dist/task/display.js +19 -1
- package/dist/task/display.js.map +1 -1
- package/dist/task/index.d.ts +5 -0
- package/dist/task/index.d.ts.map +1 -1
- package/dist/task/index.js +5 -0
- package/dist/task/index.js.map +1 -1
- package/dist/task/parser.d.ts +33 -0
- package/dist/task/parser.d.ts.map +1 -0
- package/dist/task/parser.js +86 -0
- package/dist/task/parser.js.map +1 -0
- package/dist/task/runner.d.ts +6 -0
- package/dist/task/runner.d.ts.map +1 -1
- package/dist/task/runner.js +33 -42
- package/dist/task/runner.js.map +1 -1
- package/dist/task/schema.d.ts +32 -0
- package/dist/task/schema.d.ts.map +1 -0
- package/dist/task/schema.js +31 -0
- package/dist/task/schema.js.map +1 -0
- package/dist/task/watcher.d.ts +33 -0
- package/dist/task/watcher.d.ts.map +1 -0
- package/dist/task/watcher.js +69 -0
- package/dist/task/watcher.js.map +1 -0
- package/dist/task/worktree.d.ts +70 -0
- package/dist/task/worktree.d.ts.map +1 -0
- package/dist/task/worktree.js +221 -0
- package/dist/task/worktree.js.map +1 -0
- package/dist/utils/debug.d.ts +6 -1
- package/dist/utils/debug.d.ts.map +1 -1
- package/dist/utils/debug.js +30 -24
- package/dist/utils/debug.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session.d.ts +20 -0
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +32 -3
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/slug.d.ts +12 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +18 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/text.d.ts +22 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +54 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/workflow/engine.d.ts +5 -6
- package/dist/workflow/engine.d.ts.map +1 -1
- package/dist/workflow/engine.js +32 -12
- package/dist/workflow/engine.js.map +1 -1
- package/dist/workflow/index.d.ts +2 -2
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -2
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/instruction-builder.d.ts +31 -2
- package/dist/workflow/instruction-builder.d.ts.map +1 -1
- package/dist/workflow/instruction-builder.js +69 -1
- package/dist/workflow/instruction-builder.js.map +1 -1
- package/dist/workflow/transitions.d.ts.map +1 -1
- package/dist/workflow/transitions.js +1 -0
- package/dist/workflow/transitions.js.map +1 -1
- package/dist/workflow/types.d.ts +5 -1
- package/dist/workflow/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/resources/global/en/workflows/default.yaml +22 -1
- package/resources/global/en/workflows/simple.yaml +18 -1
- package/resources/global/ja/agents/default/ai-reviewer.md +24 -1
- package/resources/global/ja/agents/default/architect.md +157 -4
- package/resources/global/ja/agents/default/coder.md +1 -0
- package/resources/global/ja/workflows/default.yaml +38 -1
- package/resources/global/ja/workflows/expert-review.yaml +169 -10
- 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;
|
|
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
|
|
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/*.
|
|
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
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
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;
|
|
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"}
|