@bicorne/task-flow 0.1.0 → 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 (58) hide show
  1. package/README.md +337 -145
  2. package/SKILL.md +9 -5
  3. package/assets/.harnessrc +0 -1
  4. package/dist/commands/analyze.js +160 -318
  5. package/dist/commands/archive.js +44 -48
  6. package/dist/commands/design.js +225 -400
  7. package/dist/commands/extract.js +174 -303
  8. package/dist/commands/init.js +103 -148
  9. package/dist/commands/merge/index.js +184 -295
  10. package/dist/commands/merge/merger.js +112 -134
  11. package/dist/commands/merge/types.js +3 -5
  12. package/dist/commands/merge/validators.js +115 -132
  13. package/dist/commands/merge.js +46 -13
  14. package/dist/commands/start.js +155 -248
  15. package/dist/commands/status.js +68 -129
  16. package/dist/commands/sync.js +37 -53
  17. package/dist/commands/tasks-gen/doc-parser.js +148 -228
  18. package/dist/commands/tasks-gen/generators.js +104 -116
  19. package/dist/commands/tasks-gen/index.js +206 -314
  20. package/dist/commands/tasks-gen/parsers.js +131 -232
  21. package/dist/commands/tasks-gen/templates.js +9 -10
  22. package/dist/commands/tasks-gen/types.js +36 -14
  23. package/dist/commands/tasks-gen/validators.js +33 -49
  24. package/dist/commands/tasks.js +58 -20
  25. package/dist/commands/worktree.js +167 -249
  26. package/dist/hooks/check-prd-exists.js +45 -55
  27. package/dist/hooks/check-worktree-conflict.js +68 -101
  28. package/dist/hooks/hook-runner/executor.js +134 -126
  29. package/dist/hooks/hook-runner/index.js +181 -196
  30. package/dist/hooks/hook-runner/loader.js +74 -113
  31. package/dist/hooks/hook-runner/types.js +3 -5
  32. package/dist/hooks/hook-runner.js +94 -28
  33. package/dist/hooks/phase-complete-detector.js +125 -191
  34. package/dist/hooks/phase-gate-validator.js +315 -376
  35. package/dist/hooks/save-checkpoint.js +87 -130
  36. package/dist/hooks/start-mcp-servers.js +50 -65
  37. package/dist/hooks/stop-mcp-servers.js +40 -49
  38. package/dist/index.js +84 -153
  39. package/dist/lib/archive.js +126 -209
  40. package/dist/lib/config.d.ts +0 -2
  41. package/dist/lib/config.js +141 -230
  42. package/dist/lib/constants.js +155 -145
  43. package/dist/lib/interactive.js +98 -148
  44. package/dist/lib/mcp-client.js +197 -320
  45. package/dist/lib/state.js +142 -253
  46. package/dist/slash/executor.js +309 -233
  47. package/dist/slash/index.js +69 -43
  48. package/dist/slash/parser.js +84 -97
  49. package/dist/slash/registry.js +100 -88
  50. package/dist/spec/openspec-to-task/builders.js +96 -109
  51. package/dist/spec/openspec-to-task/index.js +112 -173
  52. package/dist/spec/openspec-to-task/parsers.js +148 -219
  53. package/dist/spec/openspec-to-task/types.js +3 -5
  54. package/dist/spec/sync-openspec-to-task.js +47 -19
  55. package/dist/spec/sync-task-to-openspec.js +241 -272
  56. package/dist/types/ai-context.js +3 -8
  57. package/package.json +9 -7
  58. package/references/CLI-TUTORIAL.md +4 -10
@@ -1,322 +1,211 @@
1
- "use strict";
2
- /**
3
- * commands/merge/index.ts
4
- * Merge completed worktree back to main
5
- */
6
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
- if (k2 === undefined) k2 = k;
8
- var desc = Object.getOwnPropertyDescriptor(m, k);
9
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
- desc = { enumerable: true, get: function() { return m[k]; } };
11
- }
12
- Object.defineProperty(o, k2, desc);
13
- }) : (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- o[k2] = m[k];
16
- }));
17
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
- Object.defineProperty(o, "default", { enumerable: true, value: v });
19
- }) : function(o, v) {
20
- o["default"] = v;
21
- });
22
- var __importStar = (this && this.__importStar) || (function () {
23
- var ownKeys = function(o) {
24
- ownKeys = Object.getOwnPropertyNames || function (o) {
25
- var ar = [];
26
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
- return ar;
28
- };
29
- return ownKeys(o);
30
- };
31
- return function (mod) {
32
- if (mod && mod.__esModule) return mod;
33
- var result = {};
34
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
- __setModuleDefault(result, mod);
36
- return result;
1
+ function e(r) {
2
+ return "function" != typeof WeakMap ? null : (e = function(e) {
3
+ return new WeakMap();
4
+ })(r);
5
+ }
6
+ function r(r, t) {
7
+ var s, o, n;
8
+ if (!t && r && r.__esModule) return r;
9
+ if (null === r || "object" != typeof r && "function" != typeof r) return {
10
+ default: r
37
11
  };
38
- })();
39
- Object.defineProperty(exports, "__esModule", { value: true });
40
- exports.mergeTask = mergeTask;
41
- exports.main = main;
42
- const child_process_1 = require("child_process");
43
- const fs = __importStar(require("fs"));
44
- const path = __importStar(require("path"));
45
- const readline = __importStar(require("readline"));
46
- const config_1 = require("../../lib/config");
47
- const state_1 = require("../../lib/state");
48
- const validators_1 = require("./validators");
49
- const merger_1 = require("./merger");
50
- /**
51
- * Parse CLI arguments
52
- */
53
- function parseArgs(argv) {
54
- const args = {};
55
- for (let i = 2; i < argv.length; i += 1) {
56
- const token = argv[i] || '';
57
- if (!token.startsWith('--')) {
58
- continue;
59
- }
60
- const key = token.slice(2);
61
- const next = argv[i + 1] || '';
62
- if (!next || next.startsWith('--')) {
63
- args[key] = true;
64
- continue;
65
- }
66
- args[key] = next;
67
- i += 1;
68
- }
69
- return args;
12
+ if ((s = e(t)) && s.has(r)) return s.get(r);
13
+ for(var c in o = {
14
+ __proto__: null
15
+ }, n = Object.defineProperty && Object.getOwnPropertyDescriptor, r)if ("default" !== c && Object.prototype.hasOwnProperty.call(r, c)) {
16
+ var l = n ? Object.getOwnPropertyDescriptor(r, c) : null;
17
+ l && (l.get || l.set) ? Object.defineProperty(o, c, l) : o[c] = r[c];
18
+ }
19
+ return o.default = r, s && s.set(r, o), o;
70
20
  }
71
- /**
72
- * Extract merge setting from task file
73
- */
74
- function extractTaskMergeSetting(file, key) {
21
+ function t(e, r) {
75
22
  try {
76
- const content = fs.readFileSync(file, 'utf8');
77
- const lines = content.split('\n');
78
- let inMergeStrategy = false;
79
- for (const line of lines) {
80
- if (/^mergeStrategy:/.test(line)) {
81
- inMergeStrategy = true;
23
+ let t = u.readFileSync(e, 'utf8').split('\n'), s = !1;
24
+ for (let e of t){
25
+ if (/^mergeStrategy:/.test(e)) {
26
+ s = !0;
82
27
  continue;
83
28
  }
84
- if (inMergeStrategy) {
85
- if (/^[^\s]/.test(line)) {
86
- break;
87
- }
88
- const match = line.match(new RegExp(`^\\s+${key}:\\s*(.+)$`));
89
- if (match) {
90
- return match?.[1]?.trim() || null;
91
- }
29
+ if (s) {
30
+ if (/^[^\s]/.test(e)) break;
31
+ let t = e.match(RegExp(`^\\s+${r}:\\s*(.+)$`));
32
+ if (t) return t?.[1]?.trim() || null;
92
33
  }
93
34
  }
94
- }
95
- catch {
96
- // ignore
97
- }
35
+ } catch {}
98
36
  return null;
99
37
  }
100
- /**
101
- * Get merge configuration from task file
102
- */
103
- function getMergeConfig(taskPath, options) {
104
- const mergeType = extractTaskMergeSetting(taskPath, 'type') || 'squash';
105
- let deleteBranch = extractTaskMergeSetting(taskPath, 'deleteBranch') !== 'false';
106
- let deleteWorktree = extractTaskMergeSetting(taskPath, 'deleteWorktree') !== 'false';
107
- if (options.deleteBranch === true) {
108
- deleteBranch = true;
109
- }
110
- if (options.deleteWorktree === true) {
111
- deleteWorktree = true;
112
- }
113
- return { mergeType, deleteBranch, deleteWorktree };
114
- }
115
- /**
116
- * Print merge summary
117
- */
118
- function printMergeSummary(params) {
119
- console.log('');
120
- console.log('╔════════════════════════════════════════════════════════╗');
121
- console.log('║ Task Flow Merge Summary ║');
122
- console.log('╚════════════════════════════════════════════════════════╝');
123
- console.log('');
124
- console.log(`Task ID: ${params.taskId}`);
125
- console.log(`Branch: ${params.branch}`);
126
- console.log(`Worktree: ${params.worktreeName}`);
127
- console.log(`Merge Type: ${params.mergeType}`);
128
- console.log(`Delete Branch: ${params.deleteBranch}`);
129
- console.log(`Delete Worktree: ${params.deleteWorktree}`);
130
- console.log(`Dry Run: ${params.dryRun || false}`);
131
- console.log('');
132
- }
133
- /**
134
- * Update task state after merge
135
- */
136
- function updateTaskStateAfterMerge(config, taskId) {
137
- (0, state_1.clearCurrentTask)(config);
138
- (0, state_1.addTaskToHistory)({
139
- taskId,
140
- status: 'completed',
141
- completedAt: new Date().toISOString(),
142
- }, config);
143
- const archiveScript = path.resolve(__dirname, '../../lib/archive.js');
144
- (0, child_process_1.spawnSync)(process.execPath, [
145
- archiveScript,
146
- '--cwd', config.projectRoot,
147
- '--task-id', taskId,
148
- '--event', 'task_merged',
149
- '--status', 'completed',
150
- '--phase', 'merge',
151
- '--phase-completed', 'review',
152
- '--review-conclusion', 'PASS',
153
- '--completed-at', new Date().toISOString(),
154
- ], { stdio: 'inherit' });
155
- const syncScript = path.resolve(__dirname, '../../spec/sync-task-to-openspec.js');
156
- (0, child_process_1.spawnSync)(process.execPath, [
157
- syncScript,
158
- '--cwd', config.projectRoot,
159
- '--task-id', taskId,
160
- ], { stdio: 'inherit' });
161
- }
162
- /**
163
- * Execute merge operation
164
- */
165
- async function executeMerge(config, taskId, branch, worktree, mergeType, deleteBranch, deleteWorktree, dryRun) {
38
+ async function s(e, r, t, s, o, n, c, l) {
39
+ let a, u;
166
40
  console.log('[MERGE] Pulling latest changes...');
167
41
  try {
168
- const pullResult = (0, child_process_1.spawnSync)('git', ['pull', 'origin', 'main'], { stdio: 'inherit' });
169
- if (pullResult.status !== 0) {
170
- console.warn('[MERGE] Pull failed, continuing anyway...');
171
- }
172
- }
173
- catch {
42
+ let e = (0, i.spawnSync)('git', [
43
+ 'pull',
44
+ 'origin',
45
+ 'main'
46
+ ], {
47
+ stdio: 'inherit'
48
+ });
49
+ 0 !== e.status && console.warn('[MERGE] Pull failed, continuing anyway...');
50
+ } catch {
174
51
  console.warn('[MERGE] Pull failed, continuing anyway...');
175
52
  }
176
- console.log(`[MERGE] Merging branch: ${branch}`);
177
- if (!(0, merger_1.performMerge)(branch, mergeType, dryRun)) {
178
- return {
179
- success: false,
180
- reason: 'merge-failed',
181
- message: 'Merge failed',
182
- };
183
- }
184
- (0, merger_1.cleanupWorktreeAndBranch)(config, worktree, branch, deleteWorktree, deleteBranch);
185
- updateTaskStateAfterMerge(config, taskId);
186
- return {
187
- success: true,
188
- taskId,
189
- branch,
190
- worktreeName: worktree.name,
53
+ return (console.log(`[MERGE] Merging branch: ${t}`), (0, y.performMerge)(t, o, l)) ? ((0, y.cleanupWorktreeAndBranch)(e, s, t, c, n), (0, f.clearCurrentTask)(e), (0, f.addTaskToHistory)({
54
+ taskId: r,
55
+ status: 'completed',
56
+ completedAt: new Date().toISOString()
57
+ }, e), a = d.resolve(__dirname, '../../lib/archive.js'), (0, i.spawnSync)(process.execPath, [
58
+ a,
59
+ '--cwd',
60
+ e.projectRoot,
61
+ '--task-id',
62
+ r,
63
+ '--event',
64
+ 'task_merged',
65
+ '--status',
66
+ 'completed',
67
+ '--phase',
68
+ 'merge',
69
+ '--phase-completed',
70
+ 'review',
71
+ '--review-conclusion',
72
+ 'PASS',
73
+ '--completed-at',
74
+ new Date().toISOString()
75
+ ], {
76
+ stdio: 'inherit'
77
+ }), u = d.resolve(__dirname, '../../spec/sync-task-to-openspec.js'), (0, i.spawnSync)(process.execPath, [
78
+ u,
79
+ '--cwd',
80
+ e.projectRoot,
81
+ '--task-id',
82
+ r
83
+ ], {
84
+ stdio: 'inherit'
85
+ }), {
86
+ success: !0,
87
+ taskId: r,
88
+ branch: t,
89
+ worktreeName: s.name
90
+ }) : {
91
+ success: !1,
92
+ reason: 'merge-failed',
93
+ message: 'Merge failed'
191
94
  };
192
95
  }
193
- /**
194
- * Merge task
195
- */
196
- function mergeTask(options = {}) {
197
- const config = (0, config_1.loadConfig)({ cwd: options.cwd });
198
- const state = (0, state_1.loadState)(config);
199
- const taskId = options.taskId || state.currentTask;
200
- if (!taskId) {
201
- return {
202
- success: false,
203
- reason: 'missing-task-id',
204
- message: 'No current task in state.json. Please specify task-id.',
205
- };
206
- }
207
- const taskPath = path.resolve(config.tasksDirAbs, `${taskId}.json`);
208
- if (!fs.existsSync(taskPath)) {
209
- return {
210
- success: false,
211
- reason: 'missing-task-file',
212
- message: `Task file not found: ${taskPath}`,
213
- };
214
- }
215
- const mergeConfig = getMergeConfig(taskPath, options);
216
- const reviewPath = path.resolve(config.reportsDirAbs, `${taskId}-review.md`);
217
- const reviewValidation = (0, validators_1.validateReview)(reviewPath, options.skipReviewCheck);
218
- if (!reviewValidation.valid) {
219
- return {
220
- success: false,
221
- reason: reviewValidation.reason,
222
- message: reviewValidation.message,
223
- };
224
- }
225
- const worktreeValidation = (0, validators_1.validateWorktreeAndBranch)(state, taskId);
226
- if (!worktreeValidation.valid) {
227
- return {
228
- success: false,
229
- reason: worktreeValidation.reason,
230
- message: worktreeValidation.message,
231
- };
232
- }
233
- const { worktree, branch } = worktreeValidation;
234
- printMergeSummary({
235
- taskId,
236
- branch: branch,
237
- worktreeName: worktree.name,
238
- mergeType: mergeConfig.mergeType,
239
- deleteBranch: mergeConfig.deleteBranch,
240
- deleteWorktree: mergeConfig.deleteWorktree,
241
- dryRun: options.dryRun,
242
- });
243
- if (!options.dryRun) {
244
- const rl = readline.createInterface({
96
+ function o(e = {}) {
97
+ var r;
98
+ let n, c, l, a = (0, p.loadConfig)({
99
+ cwd: e.cwd
100
+ }), i = (0, f.loadState)(a), y = e.taskId || i.currentTask;
101
+ if (!y) return {
102
+ success: !1,
103
+ reason: 'missing-task-id',
104
+ message: 'No current task in state.json. Please specify task-id.'
105
+ };
106
+ let k = d.resolve(a.tasksDirAbs, `${y}.json`);
107
+ if (!u.existsSync(k)) return {
108
+ success: !1,
109
+ reason: 'missing-task-file',
110
+ message: `Task file not found: ${k}`
111
+ };
112
+ let h = (n = t(k, 'type') || 'squash', c = 'false' !== t(k, 'deleteBranch'), l = 'false' !== t(k, 'deleteWorktree'), !0 === e.deleteBranch && (c = !0), !0 === e.deleteWorktree && (l = !0), {
113
+ mergeType: n,
114
+ deleteBranch: c,
115
+ deleteWorktree: l
116
+ }), w = d.resolve(a.reportsDirAbs, `${y}-review.md`), R = (0, m.validateReview)(w, e.skipReviewCheck);
117
+ if (!R.valid) return {
118
+ success: !1,
119
+ reason: R.reason,
120
+ message: R.message
121
+ };
122
+ let _ = (0, m.validateWorktreeAndBranch)(i, y);
123
+ if (!_.valid) return {
124
+ success: !1,
125
+ reason: _.reason,
126
+ message: _.message
127
+ };
128
+ let { worktree: v, branch: E } = _;
129
+ if (r = {
130
+ taskId: y,
131
+ branch: E,
132
+ worktreeName: v.name,
133
+ mergeType: h.mergeType,
134
+ deleteBranch: h.deleteBranch,
135
+ deleteWorktree: h.deleteWorktree,
136
+ dryRun: e.dryRun
137
+ }, console.log(''), console.log('╔════════════════════════════════════════════════════════╗'), console.log('║ Task Flow Merge Summary ║'), console.log('╚════════════════════════════════════════════════════════╝'), console.log(''), console.log(`Task ID: ${r.taskId}`), console.log(`Branch: ${r.branch}`), console.log(`Worktree: ${r.worktreeName}`), console.log(`Merge Type: ${r.mergeType}`), console.log(`Delete Branch: ${r.deleteBranch}`), console.log(`Delete Worktree: ${r.deleteWorktree}`), console.log(`Dry Run: ${r.dryRun || !1}`), console.log(''), !e.dryRun) {
138
+ let r = g.createInterface({
245
139
  input: process.stdin,
246
- output: process.stdout,
140
+ output: process.stdout
247
141
  });
248
- return new Promise((resolve) => {
249
- rl.question('Proceed with merge? (y/N) ', (answer) => {
250
- rl.close();
251
- if (!/^[Yy]$/.test(answer)) {
252
- resolve({
253
- success: false,
254
- reason: 'cancelled',
255
- message: 'Merge cancelled',
256
- });
257
- return;
258
- }
259
- executeMerge(config, taskId, branch, worktree, mergeConfig.mergeType, mergeConfig.deleteBranch, mergeConfig.deleteWorktree, options.dryRun).then(resolve);
142
+ return new Promise((t)=>{
143
+ r.question('Proceed with merge? (y/N) ', (o)=>{
144
+ (r.close(), /^[Yy]$/.test(o)) ? s(a, y, E, v, h.mergeType, h.deleteBranch, h.deleteWorktree, e.dryRun).then(t) : t({
145
+ success: !1,
146
+ reason: 'cancelled',
147
+ message: 'Merge cancelled'
148
+ });
260
149
  });
261
150
  });
262
151
  }
263
152
  return {
264
- success: true,
265
- taskId,
266
- branch,
267
- worktreeName: worktree.name,
268
- dryRun: true,
153
+ success: !0,
154
+ taskId: y,
155
+ branch: E,
156
+ worktreeName: v.name,
157
+ dryRun: !0
269
158
  };
270
159
  }
271
- /**
272
- * Main entry point
273
- */
274
- function main() {
275
- const args = parseArgs(process.argv);
276
- const positionalArgs = Array.isArray(args._) ? args._ : [];
277
- const result = mergeTask({
278
- cwd: args.cwd,
279
- taskId: positionalArgs[0] || args['task-id'],
280
- skipReviewCheck: args['skip-review-check'] === true,
281
- deleteBranch: args['no-delete-branch'] !== true,
282
- deleteWorktree: args['no-delete-worktree'] !== true,
283
- dryRun: args['dry-run'] === true,
284
- });
285
- if (result instanceof Promise) {
286
- result.then((res) => {
287
- if (!res.success) {
288
- console.error(`[MERGE] ${res.message}`);
289
- process.exit(1);
160
+ function n() {
161
+ let e = function(e) {
162
+ let r = {};
163
+ for(let t = 2; t < e.length; t += 1){
164
+ let s = e[t] || '';
165
+ if (!s.startsWith('--')) continue;
166
+ let o = s.slice(2), n = e[t + 1] || '';
167
+ if (!n || n.startsWith('--')) {
168
+ r[o] = !0;
169
+ continue;
290
170
  }
291
- console.log('');
292
- console.log('[MERGE] Merge completed successfully!');
293
- console.log(` Task: ${res.taskId}`);
294
- console.log(` Status: completed`);
295
- console.log('');
296
- process.exit(0);
297
- }).catch((error) => {
298
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
299
- console.error('[MERGE] Error:', errorMessage);
300
- process.exit(1);
301
- });
302
- }
303
- else {
304
- if (!result.success) {
305
- console.error(`[MERGE] ${result.message}`);
306
- process.exit(1);
307
- }
308
- if (result.dryRun) {
309
- console.log('[MERGE] Dry run completed. No changes made.');
310
- }
311
- else {
312
- console.log('[MERGE] Merge completed successfully!');
171
+ r[o] = n, t += 1;
313
172
  }
314
- process.exit(0);
315
- }
316
- }
317
- if (require.main === module) {
318
- main();
173
+ return r;
174
+ }(process.argv), r = Array.isArray(e._) ? e._ : [], t = o({
175
+ cwd: e.cwd,
176
+ taskId: r[0] || e['task-id'],
177
+ skipReviewCheck: !0 === e['skip-review-check'],
178
+ deleteBranch: !0 !== e['no-delete-branch'],
179
+ deleteWorktree: !0 !== e['no-delete-worktree'],
180
+ dryRun: !0 === e['dry-run']
181
+ });
182
+ t instanceof Promise ? t.then((e)=>{
183
+ e.success || (console.error(`[MERGE] ${e.message}`), process.exit(1)), console.log(''), console.log('[MERGE] Merge completed successfully!'), console.log(` Task: ${e.taskId}`), console.log(" Status: completed"), console.log(''), process.exit(0);
184
+ }).catch((e)=>{
185
+ console.error('[MERGE] Error:', e instanceof Error ? e.message : 'Unknown error'), process.exit(1);
186
+ }) : (t.success || (console.error(`[MERGE] ${t.message}`), process.exit(1)), t.dryRun ? console.log('[MERGE] Dry run completed. No changes made.') : console.log('[MERGE] Merge completed successfully!'), process.exit(0));
319
187
  }
320
- exports.default = {
321
- mergeTask,
188
+ "use strict";
189
+ Object.defineProperty(exports, "__esModule", {
190
+ value: !0
191
+ });
192
+ var c = exports, l = {
193
+ get default () {
194
+ return k;
195
+ },
196
+ get main () {
197
+ return n;
198
+ },
199
+ get mergeTask () {
200
+ return o;
201
+ }
202
+ };
203
+ for(var a in l)Object.defineProperty(c, a, {
204
+ enumerable: !0,
205
+ get: Object.getOwnPropertyDescriptor(l, a).get
206
+ });
207
+ let i = require("child_process"), u = /*#__PURE__*/ r(require("fs")), d = /*#__PURE__*/ r(require("path")), g = /*#__PURE__*/ r(require("readline")), p = require("../../lib/config"), f = require("../../lib/state"), m = require("./validators"), y = require("./merger");
208
+ require.main === module && n();
209
+ let k = {
210
+ mergeTask: o
322
211
  };