@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,144 +1,101 @@
1
- "use strict";
2
- /**
3
- * hooks/save-checkpoint.ts
4
- * Save runtime snapshot/checkpoint
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
+ let e, t, r, s;
2
+ function n(e) {
3
+ return "function" != typeof WeakMap ? null : (n = function(e) {
4
+ return new WeakMap();
5
+ })(e);
6
+ }
7
+ function o(e, t) {
8
+ var r, s, o;
9
+ if (!t && e && e.__esModule) return e;
10
+ if (null === e || "object" != typeof e && "function" != typeof e) return {
11
+ default: e
37
12
  };
38
- })();
39
- Object.defineProperty(exports, "__esModule", { value: true });
40
- exports.saveCheckpoint = saveCheckpoint;
41
- const fs = __importStar(require("fs"));
42
- const path = __importStar(require("path"));
43
- const child_process_1 = require("child_process");
44
- const config_1 = require("../lib/config");
45
- const state_1 = require("../lib/state");
46
- /**
47
- * Validate config has required properties for checkpoint
48
- */
49
- function validateConfigForCheckpoint(config) {
50
- if (!config.projectRoot) {
51
- return {
52
- valid: false,
53
- reason: 'missing-project-root',
54
- message: 'Config missing projectRoot',
55
- };
13
+ if ((r = n(t)) && r.has(e)) return r.get(e);
14
+ for(var i in s = {
15
+ __proto__: null
16
+ }, o = Object.defineProperty && Object.getOwnPropertyDescriptor, e)if ("default" !== i && Object.prototype.hasOwnProperty.call(e, i)) {
17
+ var a = o ? Object.getOwnPropertyDescriptor(e, i) : null;
18
+ a && (a.get || a.set) ? Object.defineProperty(s, i, a) : s[i] = e[i];
56
19
  }
57
- if (!config.snapshotsDirAbs) {
58
- return {
59
- valid: false,
60
- reason: 'missing-snapshots-dir',
61
- message: 'Config missing snapshotsDirAbs',
62
- };
63
- }
64
- return { valid: true };
20
+ return s.default = e, r && r.set(e, s), s;
65
21
  }
66
- /**
67
- * Save runtime snapshot
68
- * @param options - Options
69
- * @returns Result
70
- */
71
- function saveCheckpoint(options) {
72
- const { input, config, state } = options;
73
- const taskId = process.env.HARNESS_TASK_ID || state.currentTask;
74
- const currentPhase = process.env.HARNESS_PHASE || state.currentPhase || 'unknown';
75
- if (!taskId) {
76
- return { saved: false, reason: 'missing-task-id' };
77
- }
78
- // Validate config before use
79
- const configValidation = validateConfigForCheckpoint(config);
80
- if (!configValidation.valid) {
81
- console.error(`[SNAPSHOT] ${configValidation.message}`);
82
- return { saved: false, reason: configValidation.reason || 'config-validation-failed' };
83
- }
84
- const projectRoot = config.projectRoot || process.cwd();
85
- const snapshotDir = config.snapshotsDirAbs || path.resolve(projectRoot, '.harness', 'snapshots');
86
- fs.mkdirSync(snapshotDir, { recursive: true });
87
- const timestamp = Date.now();
88
- const snapshotId = `${taskId}-${currentPhase}-${timestamp}`;
89
- const snapshotRelativePath = path.posix.join(path.relative(projectRoot, snapshotDir), 'runtime', `${snapshotId}.json`);
90
- const snapshot = {
91
- snapshotId,
22
+ function i(e) {
23
+ let { input: t, config: r, state: s } = e, n = process.env.HARNESS_TASK_ID || s.currentTask, o = process.env.HARNESS_PHASE || s.currentPhase || 'unknown';
24
+ if (!n) return {
25
+ saved: !1,
26
+ reason: 'missing-task-id'
27
+ };
28
+ let i = r.projectRoot ? r.snapshotsDirAbs ? {
29
+ valid: !0
30
+ } : {
31
+ valid: !1,
32
+ reason: 'missing-snapshots-dir',
33
+ message: 'Config missing snapshotsDirAbs'
34
+ } : {
35
+ valid: !1,
36
+ reason: 'missing-project-root',
37
+ message: 'Config missing projectRoot'
38
+ };
39
+ if (!i.valid) return console.error(`[SNAPSHOT] ${i.message}`), {
40
+ saved: !1,
41
+ reason: i.reason || 'config-validation-failed'
42
+ };
43
+ let a = r.projectRoot || process.cwd(), l = r.snapshotsDirAbs || p.resolve(a, '.harness', 'snapshots');
44
+ c.mkdirSync(l, {
45
+ recursive: !0
46
+ });
47
+ let u = Date.now(), d = `${n}-${o}-${u}`, v = p.posix.join(p.relative(a, l), 'runtime', `${d}.json`), S = {
48
+ snapshotId: d,
92
49
  snapshotType: 'runtime',
93
- taskId,
94
- phase: currentPhase,
50
+ taskId: n,
51
+ phase: o,
95
52
  timestamp: new Date().toISOString(),
96
53
  status: 'in_progress',
97
- source: input.hook_event_name || 'runtime',
54
+ source: t.hook_event_name || 'runtime',
98
55
  metrics: {},
99
56
  files: [],
100
- validationResults: [],
57
+ validationResults: []
101
58
  };
102
- // Try to collect changed files from git diff
103
59
  try {
104
- const diffOutput = (0, child_process_1.execSync)('git diff --name-only HEAD', { encoding: 'utf8' });
105
- snapshot.files = diffOutput.trim().split('\n').filter((f) => f);
106
- }
107
- catch {
108
- // Git not available or no changes
109
- }
110
- // Save snapshot
111
- const runtimeSnapshotDir = path.resolve(snapshotDir, 'runtime');
112
- fs.mkdirSync(runtimeSnapshotDir, { recursive: true });
113
- const snapshotPath = path.resolve(runtimeSnapshotDir, `${snapshotId}.json`);
114
- fs.writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf8');
115
- console.log(`[SNAPSHOT] Saved: ${snapshotId}`);
116
- // Update state with current snapshot reference
117
- (0, state_1.updateState)({
118
- currentSnapshot: snapshotRelativePath,
119
- }, config);
120
- return {
121
- saved: true,
122
- snapshotId,
123
- snapshotPath: snapshotRelativePath,
60
+ S.files = (0, f.execSync)('git diff --name-only HEAD', {
61
+ encoding: 'utf8'
62
+ }).trim().split('\n').filter((e)=>e);
63
+ } catch {}
64
+ let m = p.resolve(l, 'runtime');
65
+ c.mkdirSync(m, {
66
+ recursive: !0
67
+ });
68
+ let _ = p.resolve(m, `${d}.json`);
69
+ return c.writeFileSync(_, JSON.stringify(S, null, 2), 'utf8'), console.log(`[SNAPSHOT] Saved: ${d}`), (0, g.updateState)({
70
+ currentSnapshot: v
71
+ }, r), {
72
+ saved: !0,
73
+ snapshotId: d,
74
+ snapshotPath: v
124
75
  };
125
76
  }
126
- /**
127
- * Main entry point for hook usage
128
- */
129
- function main() {
130
- const input = JSON.parse(process.argv[2] || '{}');
131
- const config = (0, config_1.loadConfig)();
132
- const state = (0, state_1.loadState)(config);
133
- const result = saveCheckpoint({ input, config, state });
134
- if (!result.saved) {
135
- console.log(`[SNAPSHOT] skipped: ${result.reason}`);
77
+ "use strict";
78
+ Object.defineProperty(exports, "__esModule", {
79
+ value: !0
80
+ });
81
+ var a = exports, l = {
82
+ get default () {
83
+ return v;
84
+ },
85
+ get saveCheckpoint () {
86
+ return i;
136
87
  }
137
- process.exit(0);
138
- }
139
- if (require.main === module) {
140
- main();
141
- }
142
- exports.default = {
143
- saveCheckpoint,
88
+ };
89
+ for(var u in l)Object.defineProperty(a, u, {
90
+ enumerable: !0,
91
+ get: Object.getOwnPropertyDescriptor(l, u).get
92
+ });
93
+ let c = /*#__PURE__*/ o(require("fs")), p = /*#__PURE__*/ o(require("path")), f = require("child_process"), d = require("../lib/config"), g = require("../lib/state");
94
+ require.main === module && (e = JSON.parse(process.argv[2] || '{}'), t = (0, d.loadConfig)(), r = (0, g.loadState)(t), (s = i({
95
+ input: e,
96
+ config: t,
97
+ state: r
98
+ })).saved || console.log(`[SNAPSHOT] skipped: ${s.reason}`), process.exit(0));
99
+ let v = {
100
+ saveCheckpoint: i
144
101
  };
@@ -1,75 +1,60 @@
1
- "use strict";
2
- /**
3
- * hooks/start-mcp-servers.ts
4
- * Hook for starting MCP servers with autoStart enabled
5
- *
6
- * This hook:
7
- * 1. Gets MCP server configurations from context
8
- * 2. Starts servers with lifecycle.autoStart = true
9
- * 3. Returns connection information for downstream use
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.run = run;
13
- const mcp_client_1 = require("../lib/mcp-client");
14
- /**
15
- * Start MCP servers hook
16
- * @param context - Hook execution context
17
- * @returns Hook execution result
18
- */
19
- function run(context) {
20
- const { config, tools } = context;
21
- if (!config || !config.projectRoot) {
22
- return {
23
- check: 'mcp-started',
24
- success: false,
25
- error: 'missing-config',
26
- reason: 'Project root not found in context',
27
- };
28
- }
29
- // Get MCP servers from tools (passed by previous hook)
30
- const mcpServers = tools?.mcp || [];
31
- if (mcpServers.length === 0) {
32
- return {
33
- check: 'mcp-started',
34
- success: true,
35
- message: 'No MCP servers configured',
36
- started: [],
37
- connectionInfo: [],
38
- };
39
- }
1
+ function e(e) {
2
+ let { config: t, tools: r } = e;
3
+ if (!t || !t.projectRoot) return {
4
+ check: 'mcp-started',
5
+ success: !1,
6
+ error: 'missing-config',
7
+ reason: 'Project root not found in context'
8
+ };
9
+ let s = r?.mcp || [];
10
+ if (0 === s.length) return {
11
+ check: 'mcp-started',
12
+ success: !0,
13
+ message: 'No MCP servers configured',
14
+ started: [],
15
+ connectionInfo: []
16
+ };
40
17
  try {
41
18
  console.log('[START-MCP] Starting MCP servers...');
42
- // Start MCP servers with autoStart enabled
43
- const result = (0, mcp_client_1.startMcpServers)(mcpServers, config.projectRoot);
44
- // Get connection information
45
- const connectionInfo = (0, mcp_client_1.getMcpConnectionInfo)();
46
- const startedCount = result.results.filter(r => r.status === 'started').length;
47
- const skippedCount = result.results.filter(r => r.status === 'skipped').length;
48
- console.log(`[START-MCP] Started ${startedCount} servers, ${skippedCount} skipped (autoStart=false)`);
49
- return {
19
+ let e = (0, c.startMcpServers)(s, t.projectRoot), r = (0, c.getMcpConnectionInfo)(), o = e.results.filter((e)=>'started' === e.status).length, n = e.results.filter((e)=>'skipped' === e.status).length;
20
+ return console.log(`[START-MCP] Started ${o} servers, ${n} skipped (autoStart=false)`), {
50
21
  check: 'mcp-started',
51
- success: result.success,
52
- result,
53
- connectionInfo,
22
+ success: e.success,
23
+ result: e,
24
+ connectionInfo: r,
54
25
  summary: {
55
- totalCount: mcpServers.length,
56
- startedCount,
57
- skippedCount,
58
- failedCount: result.results.filter(r => r.status === 'error').length,
59
- },
26
+ totalCount: s.length,
27
+ startedCount: o,
28
+ skippedCount: n,
29
+ failedCount: e.results.filter((e)=>'error' === e.status).length
30
+ }
60
31
  };
61
- }
62
- catch (error) {
63
- console.error('[START-MCP] Failed to start MCP servers:', error.message);
64
- return {
32
+ } catch (e) {
33
+ return console.error('[START-MCP] Failed to start MCP servers:', e.message), {
65
34
  check: 'mcp-started',
66
- success: false,
67
- error: error.message,
68
- stack: error.stack,
35
+ success: !1,
36
+ error: e.message,
37
+ stack: e.stack
69
38
  };
70
39
  }
71
40
  }
72
- exports.default = {
73
- run,
74
- name: 'start-mcp-servers',
41
+ "use strict";
42
+ Object.defineProperty(exports, "__esModule", {
43
+ value: !0
44
+ });
45
+ var t = exports, r = {
46
+ get default () {
47
+ return o;
48
+ },
49
+ get run () {
50
+ return e;
51
+ }
52
+ };
53
+ for(var s in r)Object.defineProperty(t, s, {
54
+ enumerable: !0,
55
+ get: Object.getOwnPropertyDescriptor(r, s).get
56
+ });
57
+ let c = require("../lib/mcp-client"), o = {
58
+ run: e,
59
+ name: 'start-mcp-servers'
75
60
  };
@@ -1,58 +1,49 @@
1
- "use strict";
2
- /**
3
- * hooks/stop-mcp-servers.ts
4
- * Hook for stopping all MCP servers
5
- *
6
- * This hook:
7
- * 1. Stops all running MCP servers
8
- * 2. Should be called in post-merge or cleanup phase
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.run = run;
12
- const mcp_client_1 = require("../lib/mcp-client");
13
- /**
14
- * Stop MCP servers hook
15
- * @param _context - Hook execution context
16
- * @returns Hook execution result
17
- */
18
- function run(_context) {
19
- const runningCount = (0, mcp_client_1.getRunningCount)();
20
- if (runningCount === 0) {
21
- return {
22
- check: 'mcp-stopped',
23
- success: true,
24
- message: 'No MCP servers running',
25
- stopped: [],
26
- };
27
- }
1
+ function e(e) {
2
+ let r = (0, o.getRunningCount)();
3
+ if (0 === r) return {
4
+ check: 'mcp-stopped',
5
+ success: !0,
6
+ message: 'No MCP servers running',
7
+ stopped: []
8
+ };
28
9
  try {
29
- console.log(`[STOP-MCP] Stopping ${runningCount} MCP server(s)...`);
30
- // Stop all MCP servers
31
- const result = (0, mcp_client_1.stopAllMcpServers)();
32
- const stoppedCount = result.results.filter(r => r.status !== 'error').length;
33
- const errorCount = result.results.filter(r => r.status === 'error').length;
34
- console.log(`[STOP-MCP] Stopped ${stoppedCount} servers, ${errorCount} errors`);
35
- return {
10
+ console.log(`[STOP-MCP] Stopping ${r} MCP server(s)...`);
11
+ let e = (0, o.stopAllMcpServers)(), s = e.results.filter((e)=>'error' !== e.status).length, t = e.results.filter((e)=>'error' === e.status).length;
12
+ return console.log(`[STOP-MCP] Stopped ${s} servers, ${t} errors`), {
36
13
  check: 'mcp-stopped',
37
- success: result.success,
38
- result,
14
+ success: e.success,
15
+ result: e,
39
16
  summary: {
40
- stoppedCount,
41
- errorCount,
42
- },
17
+ stoppedCount: s,
18
+ errorCount: t
19
+ }
43
20
  };
44
- }
45
- catch (error) {
46
- console.error('[STOP-MCP] Failed to stop MCP servers:', error.message);
47
- return {
21
+ } catch (e) {
22
+ return console.error('[STOP-MCP] Failed to stop MCP servers:', e.message), {
48
23
  check: 'mcp-stopped',
49
- success: false,
50
- error: error.message,
51
- stack: error.stack,
24
+ success: !1,
25
+ error: e.message,
26
+ stack: e.stack
52
27
  };
53
28
  }
54
29
  }
55
- exports.default = {
56
- run,
57
- name: 'stop-mcp-servers',
30
+ "use strict";
31
+ Object.defineProperty(exports, "__esModule", {
32
+ value: !0
33
+ });
34
+ var r = exports, s = {
35
+ get default () {
36
+ return c;
37
+ },
38
+ get run () {
39
+ return e;
40
+ }
41
+ };
42
+ for(var t in s)Object.defineProperty(r, t, {
43
+ enumerable: !0,
44
+ get: Object.getOwnPropertyDescriptor(s, t).get
45
+ });
46
+ let o = require("../lib/mcp-client"), c = {
47
+ run: e,
48
+ name: 'stop-mcp-servers'
58
49
  };