taskgraph-ai 0.52.0 → 0.52.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/dist/ai-services-unified-BwD4wh2J.js +1 -0
- package/dist/{ai-services-unified-D8KwE3rg.js → ai-services-unified-DhuS3c0f.js} +1 -1
- package/dist/{commands-Btm2oO97.js → commands-KQaF4NPd.js} +5 -5
- package/dist/{config-manager-7Sv3SsVJ.js → config-manager-BVc3Xro9.js} +1 -1
- package/dist/{config-manager-BUm0w7j9.js → config-manager-D2TQihpP.js} +1 -1
- package/dist/{dependency-manager-LVhwG4fY.js → dependency-manager-CcdzLwUF.js} +21 -20
- package/dist/{init-CNN_m_0Q.js → init-BDt87WNV.js} +2 -2
- package/dist/mcp-server.js +2 -2
- package/dist/research-DWXE4qXm.js +1 -0
- package/dist/response-language-BnI8A8LS.js +1 -0
- package/dist/{response-language-lNB7-WgQ.js → response-language-DLdWd2HL.js} +1 -1
- package/dist/{src-D5YOCTZ3.js → src-LblhyFcU.js} +1 -1
- package/dist/tag-management-BF50RQpO.js +1 -0
- package/dist/{task-manager-BxvXZ76I.js → task-manager-Bl2ZeLB0.js} +1 -1
- package/dist/taskgraph.js +1 -1
- package/dist/update-subtask-by-id-DuDsh3KN.js +1 -0
- package/dist/update-task-by-id-BE5BXLFS.js +1 -0
- package/dist/{utils-B_xIeo5k.js → utils-TcaEe7J5.js} +1 -1
- package/package.json +1 -1
- package/dist/ai-services-unified-DdXQf9-K.js +0 -1
- package/dist/research-BLLmzb-Q.js +0 -1
- package/dist/response-language-bOP2mgFX.js +0 -1
- package/dist/tag-management-BVkpBGE5.js +0 -1
- package/dist/update-subtask-by-id-BKkRQB4a.js +0 -1
- package/dist/update-task-by-id-Du00pZ3R.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e,i as t,n,o as r,t as i}from"./ai-services-unified-
|
|
1
|
+
import{a as e,i as t,n,o as r,t as i}from"./ai-services-unified-DhuS3c0f.js";import{C as a,S as o,_ as s,a as c,b as l,c as u,f as d,g as f,h as p,i as m,l as h,m as g,n as _,p as v,r as y,t as b,u as x,x as S}from"./src-LblhyFcU.js";import{$ as C,A as w,B as T,C as ee,Dt as E,G as D,J as O,K as k,M as A,N as te,Nt as j,Q as M,R as ne,T as re,V as ie,X as ae,Y as oe,Z as se,_t as N,a as ce,bt as le,c as ue,ct as P,d as de,dt as fe,ft as pe,g as me,gt as he,h as ge,ht as F,l as _e,m as ve,n as ye,nt as I,o as L,ot as be,p as xe,pt as R,q as Se,rt as Ce,st as we,tt as z,u as Te,v as Ee,vt as De,xt as B,y as Oe,yt as ke}from"./config-manager-D2TQihpP.js";import V from"chalk";import Ae,{resolve as je}from"node:path";import H from"path";import Me from"node:fs";import{spawn as Ne}from"child_process";import Pe from"node:os";import{z as U}from"zod";import*as Fe from"fs";import W from"fs";import G from"boxen";import Ie from"readline";import{Command as K}from"commander";import Le from"figlet";import Re from"gradient-string";import ze from"terminal-link";import{marked as Be}from"marked";import{markedTerminal as Ve}from"marked-terminal";import He from"turndown";import q from"cli-table3";import Ue from"ora";import We from"process";import Ge from"https";import Ke from"os";import qe from"cli-progress";import Je from"inquirer";import Ye,{Separator as Xe}from"@inquirer/search";import Ze from"fuse.js";import{smoothStream as Qe}from"ai";import $e from"ajv";import et from"ajv-formats";import tt from"gpt-tokens";import"@streamparser/json";function nt(e,t,n){return(n?.color?V[n.color]:V.cyan)(ze(e,t,{fallback:(e,t)=>n?.textOnlyFallback?e:`${e} (${t})`}))}function rt(e,t){return nt(e,e,t)}function it(e,t){return nt(e,t,{color:`cyan`})}function at(){return ze.isSupported}const ot=Re(he);function st(){return process.env.TM_HIDE_BANNER===`true`}function ct(){return process.stdout.columns||80}function lt(e={}){if(st())return;let{version:t}=e;try{let e=Le.textSync(`TaskGraph`,{font:`Standard`,horizontalLayout:`default`,verticalLayout:`default`});console.log(ot(e))}catch{console.log(ot(`=== TaskGraph ===`))}let n=`x.com/stephennmiller_`,r=nt(n,`https://x.com/stephennmiller_`,{textOnlyFallback:!0}),i=V.dim(`by `)+V.cyan(r),a=t?t.replace(/^v/,``):``,o=`https://github.com/stephennmiller/taskgraph-ai/releases/tag/taskgraph-ai%40${a}`,s=t?nt(`v${a}`,o,{color:`dim`,textOnlyFallback:!0}):``;if(s){let e=`by ${n}`.length,t=a.length+1,r=ct()-e-t-1;r>=2?console.log(i+` `.repeat(r)+s):(console.log(i),console.log(s))}else console.log(i);console.log(``)}function ut(){if(st())return;try{let e=Le.textSync(`TaskGraph`,{font:`Standard`,horizontalLayout:`default`,verticalLayout:`default`});console.log(ot(e))}catch{console.log(ot(`=== TaskGraph ===`))}let e=nt(`x.com/stephennmiller_`,`https://x.com/stephennmiller_`,{textOnlyFallback:!0});console.log(V.dim(`by `)+V.cyan(e)),console.log(``)}function dt(e){let{header:t,body:n,callToAction:r,footer:i,level:a=`warn`}=e,o=a===`info`?B.heading:V.yellow.bold,s=a===`info`?N:`yellow`,c=[o(t),...n.map(e=>B.text(e))];return r&&r.label&&r.action&&c.push(V.cyan(r.label)+`
|
|
2
2
|
`+B.brand.underline(r.action)),i&&c.push(B.muted(i)),G(c.join(`
|
|
3
3
|
|
|
4
4
|
`),{padding:1,borderColor:s,borderStyle:`round`,margin:{top:1,bottom:1}})}const J={done:V.green(`█`),cancelled:B.muted(`─`),deferred:B.muted(`─`),inProgress:B.active(`▓`),review:V.magenta(`▒`),pending:V.yellow(`░`),blocked:V.red(`!`)};function ft(e,t=30,n){if(!n){let n=Math.round(e/100*t),r=t-n;return J.done.repeat(n)+B.muted(`░`).repeat(r)}let r=``,i=0,a=[[n.done,J.done],[n.cancelled,J.cancelled],[n.deferred,J.deferred],[n[`in-progress`],J.inProgress],[n.review,J.review],[n.pending,J.pending],[n.blocked,J.blocked]];for(let[e,n]of a){if(!e||i>=t)continue;let a=Math.min(Math.round(e/100*t),t-i);a>0&&(r+=n.repeat(a),i+=a)}return i<t&&(r+=J.pending.repeat(t-i)),r}function pt(e){let t={total:e.length,done:0,inProgress:0,pending:0,blocked:0,deferred:0,cancelled:0,review:0,completionPercentage:0,completedCount:0};return e.forEach(e=>{switch(e.status){case`done`:t.done++;break;case`in-progress`:t.inProgress++;break;case`pending`:t.pending++;break;case`blocked`:t.blocked++;break;case`deferred`:t.deferred++;break;case`cancelled`:t.cancelled++;break;case`review`:t.review=(t.review||0)+1;break}}),t.completedCount=e.filter(e=>f(e.status)).length,t.completionPercentage=t.total>0?Math.round(t.completedCount/t.total*100):0,t}function mt(e){let t={total:0,done:0,inProgress:0,pending:0,blocked:0,deferred:0,cancelled:0,review:0,completionPercentage:0,completedCount:0},n=[];return e.forEach(e=>{e.subtasks&&e.subtasks.length>0&&e.subtasks.forEach(e=>{switch(t.total++,n.push(e),e.status){case`done`:t.done++;break;case`in-progress`:t.inProgress++;break;case`pending`:t.pending++;break;case`blocked`:t.blocked++;break;case`deferred`:t.deferred++;break;case`cancelled`:t.cancelled++;break;case`review`:t.review=(t.review||0)+1;break}})}),t.completedCount=n.filter(e=>f(e.status)).length,t.completionPercentage=t.total>0?Math.round(t.completedCount/t.total*100):0,t}function ht(e){let t=new Set(e.filter(e=>f(e.status)).map(e=>e.id)),n=e.filter(e=>!f(e.status)&&(!e.dependencies||e.dependencies.length===0)).length,r=e.filter(e=>!f(e.status)&&e.dependencies&&e.dependencies.length>0&&e.dependencies.every(e=>t.has(e))).length,i=e.filter(e=>!f(e.status)&&e.dependencies&&e.dependencies.length>0&&!e.dependencies.every(e=>t.has(e))).length,a={};e.forEach(e=>{e.dependencies&&e.dependencies.length>0&&e.dependencies.forEach(e=>{let t=String(e);a[t]=(a[t]||0)+1})});let o,s=0;for(let[e,t]of Object.entries(a))t>s&&(s=t,o=parseInt(e));let c=e.reduce((e,t)=>e+(t.dependencies?t.dependencies.length:0),0),l=e.length>0?c/e.length:0;return{tasksWithNoDeps:n,tasksReadyToWork:n+r,tasksBlockedByDeps:i,mostDependedOnTaskId:o,mostDependedOnCount:s,avgDependenciesPerTask:l}}function gt(e){let t={critical:0,high:0,medium:0,low:0};return e.forEach(e=>{let n=e.priority||`medium`;t[n]++}),t}function _t(e){return e.total===0?{}:{done:e.done/e.total*100,"in-progress":e.inProgress/e.total*100,pending:e.pending/e.total*100,blocked:e.blocked/e.total*100,deferred:e.deferred/e.total*100,cancelled:e.cancelled/e.total*100,review:(e.review||0)/e.total*100}}function vt(e,t=!1,n=!1){let r=[];t?r.push(`${J.done} Completed: ${V.green(`${e.completedCount}/${e.total}`)}`):r.push(`${J.done} Done: ${V.green(e.done)}`),r.push(`${J.cancelled} Cancelled: ${B.muted(e.cancelled)}`),r.push(`${J.deferred} Deferred: ${B.muted(e.deferred)}`);let i=e=>n?e.slice(0,2).join(` `)+(e.length>2?`
|
|
@@ -18,42 +18,42 @@ ID: ${t?V.cyan(String(t.id)):B.muted(`N/A`)} - ${t?V.bold(t.title):V.yellow(`No
|
|
|
18
18
|
`))}else{let e=G(l,{padding:1,borderColor:N,borderStyle:`round`,margin:{top:0,bottom:1}}),t=G(u,{padding:1,borderColor:N,borderStyle:`round`,margin:{top:0,bottom:1}});console.log(e),console.log(t)}}function St(e={}){let{filePath:t,tag:n}=e;if(n&&(console.log(`tag: ${V.cyan(n)}`),t)){let e=t.startsWith(`/`)?t:`${process.cwd()}/${t}`;console.log(`Listing tasks from: ${V.dim(e)}`)}}const Ct=new He({headingStyle:`atx`,codeBlockStyle:`fenced`,bulletListMarker:`-`});Be.use(Ve({code:e=>e.split(`
|
|
19
19
|
`).map(e=>` `+V.cyan(e)).join(`
|
|
20
20
|
`),blockquote:B.muted.italic,html:B.muted,heading:B.text.bold,hr:B.muted,listitem:B.text,paragraph:B.text,strong:B.text.bold,em:B.text.italic,codespan:V.cyan,del:V.dim.strikethrough,link:B.brand,href:B.brand.underline,showSectionPrefix:!1,unescape:!0,emoji:!1,tab:4,width:120})),Be.setOptions({breaks:!0,gfm:!0});function wt(e){if(!e)return``;let t=e.replace(/\\\\/g,`\\`).replace(/\\n/g,`
|
|
21
|
-
`).replace(/\\t/g,` `).replace(/\\"/g,`"`);/<[^>]+>/.test(t)&&(t=Ct.turndown(t));let n=Be(t);return typeof n==`string`?n.trim():t}function Tt(e=.9,t=40){let n=process.stdout.columns||80;return Math.max(Math.floor(n*e),t)}function Et(){let e=process.stdout.columns;return e?Math.floor(e*.95):100}function Dt(e,t,n=20){let r=e=>e.reduce((e,t)=>e+(t.width===`flex`?n:t.width),0)+e.length+1,i=[...t],a=[],o=t.filter(e=>e.dropOrder!==void 0).sort((e,t)=>(e.dropOrder??0)-(t.dropOrder??0));for(let t of o){if(r(i)<=e)break;i=i.filter(e=>e!==t),a.push(t.key)}let s=i.reduce((e,t)=>e+(t.width===`flex`?0:t.width),0),c=Math.max(n,e-s-i.length-1);return{keys:i.map(e=>e.key),widths:i.map(e=>e.width===`flex`?c:e.width),hidden:a}}function Ot(e,t){return e.length<=t?e:e.substring(0,t-3)+`...`}function kt(e,t,n=30){if(t===0)return B.muted(`No tasks`);let r=Math.round(e/t*100),i=Math.round(e/t*n),a=n-i;return`${V.green(`█`).repeat(i)+B.muted(`░`).repeat(a)} ${V.cyan(`${r}%`)} (${e}/${t})`}function At(e){switch(e){case`create`:return V.green(`✚ CREATE`);case`modify`:return V.yellow(`✎ MODIFY`);case`reference`:return B.brand(`◇ REFER `);default:return B.muted(` FILE `)}}function
|
|
21
|
+
`).replace(/\\t/g,` `).replace(/\\"/g,`"`);/<[^>]+>/.test(t)&&(t=Ct.turndown(t));let n=Be(t);return typeof n==`string`?n.trim():t}function Tt(e=.9,t=40){let n=process.stdout.columns||80;return Math.max(Math.floor(n*e),t)}function Et(){let e=process.stdout.columns;return e?Math.floor(e*.95):100}function Dt(e,t,n=20){let r=e=>e.reduce((e,t)=>e+(t.width===`flex`?n:t.width),0)+e.length+1,i=[...t],a=[],o=t.filter(e=>e.dropOrder!==void 0).sort((e,t)=>(e.dropOrder??0)-(t.dropOrder??0));for(let t of o){if(r(i)<=e)break;i=i.filter(e=>e!==t),a.push(t.key)}let s=i.reduce((e,t)=>e+(t.width===`flex`?0:t.width),0),c=Math.max(n,e-s-i.length-1);return{keys:i.map(e=>e.key),widths:i.map(e=>e.width===`flex`?c:e.width),hidden:a}}function Ot(e,t){return e.length<=t?e:e.substring(0,t-3)+`...`}function kt(e,t,n=30){if(t===0)return B.muted(`No tasks`);let r=Math.round(e/t*100),i=Math.round(e/t*n),a=n-i;return`${V.green(`█`).repeat(i)+B.muted(`░`).repeat(a)} ${V.cyan(`${r}%`)} (${e}/${t})`}function At(e,t,n){let r=String(e),i=r.includes(`.`),a=i?{command:`taskgraph update-subtask --id=${r} --prompt="..."`,description:`to log progress notes`}:{command:`taskgraph update-task --id=${r} --prompt="..."`,description:`to update details`},o=!i&&!n?[{command:`taskgraph expand --id=${r}`,description:`to break down into subtasks`}]:[];switch(t){case`in-progress`:return[a,{command:`taskgraph set-status --id=${r} --status=done`,description:`when it is finished`},...o];case`review`:return[{command:`taskgraph set-status --id=${r} --status=done`,description:`once the review passes`},{command:`taskgraph set-status --id=${r} --status=in-progress`,description:`if it needs more work`}];case`done`:case`completed`:case`cancelled`:return[{command:`taskgraph next`,description:`to find the next task to work on`}];case`blocked`:case`deferred`:return[{command:`taskgraph set-status --id=${r} --status=pending`,description:`when it is ready to pick up again`},a];default:return[{command:`taskgraph set-status --id=${r} --status=in-progress`,description:`to start working`},...o,a]}}function jt(e){switch(e){case`create`:return V.green(`✚ CREATE`);case`modify`:return V.yellow(`✎ MODIFY`);case`reference`:return B.brand(`◇ REFER `);default:return B.muted(` FILE `)}}function Mt(e){return e}function Nt(e,t){console.log(G(V.bold(`Task: #${e} - ${t}`),{padding:{top:0,bottom:0,left:1,right:1},borderColor:N,borderStyle:`round`}))}function Pt(e,t){let n=Et(),r=new q({head:[],style:{head:[],border:le},colWidths:Dt(n,[{key:`label`,width:16},{key:`value`,width:`flex`}]).widths,wordWrap:!0}),i=e.dependencies&&e.dependencies.length>0?e.dependencies.map(e=>String(e)).join(`, `):`None`,a=t||String(e.id),o=wt(e.description||``),s=e.category?`${Mt(e.category)}`:B.muted(`N/A`),c=e.skills&&e.skills.length>0?e.skills.map(e=>B.accent(`[${e}]`)).join(` `):B.muted(`N/A`),l=[V.cyan(`ID:`),V.cyan(`Title:`),V.cyan(`Status:`),V.cyan(`Priority:`),V.cyan(`Dependencies:`),V.cyan(`Complexity:`),V.cyan(`Category:`),V.cyan(`Skills:`),V.cyan(`Description:`)].join(`
|
|
22
22
|
`),u=[a,e.title,nn(e.status),an(e.priority),i,typeof e.complexity==`number`?sn(e.complexity):B.muted(`N/A`),s,c,o].join(`
|
|
23
|
-
`);r.push([l,u]),console.log(r.toString())}function
|
|
23
|
+
`);r.push([l,u]),console.log(r.toString())}function Ft(e){let t=Et(),n=wt(e);console.log(G(V.bold(`Implementation Details:`)+`
|
|
24
24
|
|
|
25
|
-
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function
|
|
25
|
+
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function It(e){let t=Et(),n=wt(e);console.log(G(V.bold(`Test Strategy:`)+`
|
|
26
26
|
|
|
27
|
-
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function
|
|
27
|
+
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function Lt(e,t){let n=Et();console.log(G(B.heading(`Subtasks`),{padding:{top:0,bottom:0,left:1,right:1},borderColor:N,borderStyle:`round`,margin:{top:1,bottom:0}}));let r=new q({head:[B.heading(`ID`),B.heading(`Status`),B.heading(`Title`),B.heading(`Deps`)],style:{head:[],border:le},colWidths:Dt(n,[{key:`id`,width:10},{key:`status`,width:15},{key:`title`,width:`flex`},{key:`deps`,width:8}]).widths,wordWrap:!0});e.forEach(e=>{let n=t?`${t}.${e.id}`:String(e.id),i=e.dependencies&&e.dependencies.length>0?e.dependencies.join(`, `):`None`;r.push([n,nn(e.status),e.title,i])}),console.log(r.toString())}function Rt(e){let t=Et(),n=e.map(e=>`${jt(e.action)} ${B.text(e.path)}\n ${B.muted(e.description)}`).join(`
|
|
28
28
|
|
|
29
29
|
`);console.log(G(V.bold(`Files to Touch:`)+`
|
|
30
30
|
|
|
31
|
-
`+n,{padding:1,borderStyle:`round`,borderColor:`yellow`,width:t}))}function
|
|
31
|
+
`+n,{padding:1,borderStyle:`round`,borderColor:`yellow`,width:t}))}function zt(e){let t=Et(),n=e.map(e=>`${V.cyan.bold(e.name)} → ${B.muted(e.location)}\n ↳ ${B.text(e.usage)}`).join(`
|
|
32
32
|
|
|
33
33
|
`);console.log(G(V.bold(`Leverage Existing Code:`)+`
|
|
34
34
|
|
|
35
|
-
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function
|
|
35
|
+
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function Bt(e){let t=Et(),n=``;e.included&&(n+=V.green.bold(`✓ In Scope:
|
|
36
36
|
`),n+=B.text(` `+e.included)),e.excluded&&(n&&(n+=`
|
|
37
37
|
|
|
38
38
|
`),n+=V.red.bold(`✗ Out of Scope:
|
|
39
39
|
`),n+=B.muted(` `+e.excluded)),console.log(G(V.bold(`Scope Boundaries:`)+`
|
|
40
40
|
|
|
41
|
-
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function
|
|
41
|
+
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function Vt(e){let t=Et(),n=e.map(e=>B.text(`☐ ${e}`)).join(`
|
|
42
42
|
`);console.log(G(V.bold(`Acceptance Criteria:`)+`
|
|
43
43
|
|
|
44
|
-
`+n,{padding:1,borderStyle:`round`,borderColor:`green`,width:t}))}function
|
|
44
|
+
`+n,{padding:1,borderStyle:`round`,borderColor:`green`,width:t}))}function Ht(e){let t=Et(),n=e.map(e=>V.yellow(`▸ ${e}`)).join(`
|
|
45
45
|
`);console.log(G(V.bold(`Technical Constraints:`)+`
|
|
46
46
|
|
|
47
|
-
`+n,{padding:1,borderStyle:`round`,borderColor:`red`,width:t}))}function
|
|
47
|
+
`+n,{padding:1,borderStyle:`round`,borderColor:`red`,width:t}))}function Ut(e){let t=Et(),n=wt(e);console.log(G(V.bold(`Implementation Approach:`)+`
|
|
48
48
|
|
|
49
|
-
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function
|
|
49
|
+
`+n,{padding:1,borderStyle:`round`,borderColor:N,width:t}))}function Wt(e){let t=Et(),n=e.map(e=>B.text(`• ${e}`)).join(`
|
|
50
50
|
`);console.log(G(V.bold(`Codebase Patterns:`)+`
|
|
51
51
|
|
|
52
|
-
`+n,{padding:1,borderStyle:`round`,...ke,width:t}))}function
|
|
53
|
-
`+n)}function
|
|
52
|
+
`+n,{padding:1,borderStyle:`round`,...ke,width:t}))}function Gt(e,t){let n=``;e&&(n+=B.muted(`Category: `)+V.cyan(`[${Mt(e)}]`)),t&&t.length>0&&(n&&(n+=` `),n+=B.muted(`Skills: `)+t.map(e=>B.accent(`[${e}]`)).join(` `)),n&&console.log(`
|
|
53
|
+
`+n)}function Kt(e){(e.relevantFiles||e.existingInfrastructure||e.scopeBoundaries||e.acceptanceCriteria||e.technicalConstraints||e.implementationApproach||e.codebasePatterns)&&(e.implementationApproach&&(console.log(),Ut(e.implementationApproach)),e.relevantFiles&&e.relevantFiles.length>0&&(console.log(),Rt(e.relevantFiles)),e.existingInfrastructure&&e.existingInfrastructure.length>0&&(console.log(),zt(e.existingInfrastructure)),e.codebasePatterns&&e.codebasePatterns.length>0&&(console.log(),Wt(e.codebasePatterns)),e.scopeBoundaries&&(console.log(),Bt(e.scopeBoundaries)),e.technicalConstraints&&e.technicalConstraints.length>0&&(console.log(),Ht(e.technicalConstraints)),e.acceptanceCriteria&&e.acceptanceCriteria.length>0&&(console.log(),Vt(e.acceptanceCriteria)))}function qt(e,t,n=!1){let r=At(e,t,n).map((e,t)=>`${V.cyan(`${t+1}.`)} Run ${V.yellow(e.command)} ${e.description}`);console.log(G(V.bold(`Suggested Actions:`)+`
|
|
54
54
|
|
|
55
55
|
`+r.join(`
|
|
56
|
-
`),{padding:1,margin:{top:1},borderStyle:`round`,borderColor:`green`,width:Et()}))}function Jt(e,t){let{statusFilter:n,showSuggestedActions:r=!1,customHeader:i,headerColor:a=N,originalTaskId:o}=t||{};if(i?console.log(G(V.bold(i),{padding:{top:0,bottom:0,left:1,right:1},borderColor:a,borderStyle:`round`,margin:{top:1}})):
|
|
56
|
+
`),{padding:1,margin:{top:1},borderStyle:`round`,borderColor:`green`,width:Et()}))}function Jt(e,t){let{statusFilter:n,showSuggestedActions:r=!1,customHeader:i,headerColor:a=N,originalTaskId:o}=t||{};if(i?console.log(G(V.bold(i),{padding:{top:0,bottom:0,left:1,right:1},borderColor:a,borderStyle:`round`,margin:{top:1}})):Nt(o||e.id,e.title),Pt(e,o),e.details&&(console.log(),Ft(e.details)),`testStrategy`in e&&e.testStrategy&&(console.log(),It(e.testStrategy)),Kt(e),e.subtasks&&e.subtasks.length>0){let t=n?e.subtasks.filter(e=>e.status===n):e.subtasks;t.length===0&&n?(console.log(),console.log(B.muted(` No subtasks with status '${n}'`))):t.length>0&&(console.log(),Lt(t,e.id))}r&&(console.log(),qt(o||e.id,e.status,!!(e.subtasks&&e.subtasks.length>0)))}function Yt(e,t){if(!e){t?console.log(V.yellow(`✓ All tasks are either completed, blocked by dependencies, or in progress.`)):console.log(G(V.yellow(`No tasks found in this project.`),{padding:1,borderStyle:`round`,borderColor:`yellow`,title:`No tasks available`,titleAlignment:`center`}));return}let n=[];n.push(`${B.heading(`Next task:`)} ${V.yellow(`#${e.id}`)}${B.heading(` - ${e.title}`)}`),n.push(``);let r=[];if(e.priority){let t=e.priority===`high`?V.red:e.priority===`medium`?V.yellow:B.muted;r.push(`Priority: ${t.bold(e.priority)}`)}if(e.status){let t=e.status===`pending`?V.yellow(`○ pending`):e.status===`in-progress`?B.brand(`▶ in-progress`):B.muted(e.status);r.push(`Status: ${t}`)}n.push(r.join(` `));let i=!e.dependencies||e.dependencies.length===0?B.muted(`None`):V.cyan(e.dependencies.join(`, `));n.push(`Dependencies: ${i}`),typeof e.complexity==`number`&&n.push(`Complexity: ${sn(e.complexity)}`),e.description&&(n.push(``),n.push(`Description: ${B.text(wt(e.description))}`)),n.push(``);for(let t of At(e.id,e.status,!0).slice(0,2))n.push(`${V.cyan(`Next step:`)} ${V.yellow(t.command)} ${B.muted(t.description)}`);n.push(`${V.cyan(`View details:`)} ${V.yellow(`taskgraph show ${e.id}`)}`),console.log(G(n.join(`
|
|
57
57
|
`),{padding:1,margin:{top:1,bottom:1},borderStyle:`round`,borderColor:N,title:B.heading(`Next task`),titleAlignment:`center`,width:Tt(.97),fullscreen:!1}))}function Xt(e){if(`description`in e&&e.description)return e.description;if(`details`in e&&e.details)return e.details.split(`
|
|
58
58
|
`)[0].split(`.`)[0]}function Zt(){let e=[`${V.cyan(`1.`)} Run ${V.yellow(`taskgraph next`)} to see what to work on next`,`${V.cyan(`2.`)} Run ${V.yellow(`taskgraph expand --id=<id>`)} to break down a task into subtasks`,`${V.cyan(`3.`)} Run ${V.yellow(`taskgraph set-status --id=<id> --status=done`)} to mark a task as complete`];console.log(G(V.bold(`Suggested Next Steps:`)+`
|
|
59
59
|
|
|
@@ -61,7 +61,7 @@ ID: ${t?V.cyan(String(t.id)):B.muted(`N/A`)} - ${t?V.bold(t.title):V.yellow(`No
|
|
|
61
61
|
`),{padding:1,margin:{top:0,bottom:1},borderStyle:`round`,...ke,width:Tt(.97)}))}const Qt=`tasks.json`;function $t(e){let t=u(e);console.log(V.dim(`\nWatching ${Qt} for changes...`)),console.log(B.muted(`Last synced: ${t}`)),console.log(V.dim(`Press Ctrl+C to exit`))}function en(e){let t=u(e);console.log(B.brand(`\nℹ ${Qt} updated at ${t}`))}const tn={done:{color:V.green,icon:`✓`,tableIcon:`✓`},pending:{color:V.yellow,icon:`○`,tableIcon:`○`},"in-progress":{color:B.active,icon:`▶`,tableIcon:`▶`},deferred:{color:B.muted,icon:`–`,tableIcon:`–`},review:{color:V.magenta,icon:`?`,tableIcon:`?`},cancelled:{color:B.muted,icon:`x`,tableIcon:`x`},blocked:{color:V.red,icon:`!`,tableIcon:`!`},completed:{color:V.green,icon:`✓`,tableIcon:`✓`}};function nn(e,t=!1){let n=tn[e]||{color:V.red,icon:`X`,tableIcon:`X`},r=t?n.tableIcon:n.icon;return n.color(`${r} ${e}`)}const rn={critical:V.red.bold,high:V.red,medium:V.yellow,low:B.muted};function an(e){return(rn[e]||B.text)(e)}function on(e){return e>=7?{color:V.red,label:`High`}:e>=4?{color:V.yellow,label:`Medium`}:{color:V.green,label:`Low`}}function sn(e){let t=typeof e==`string`?Number(e.trim()):e;if(isNaN(t))return B.muted(`N/A`);let{color:n}=on(t);return n(`● ${t}`)}function cn(e){if(typeof e!=`number`)return B.muted(`N/A`);let{color:t,label:n}=on(e);return t(`${e}/10 (${n})`)}function ln(e,t){if(!e||e.length===0)return B.muted(`none`);let n=new Map(t.map(e=>[e.id.toString(),e]));return e.map(e=>{let t=n.get(e.toString());return t?`${e}${t.status===`done`?`✓`:t.status===`in-progress`?`►`:`○`}`:V.red(`${e} (not found)`)}).join(`, `)}function un(e=`TaskGraph`){console.log(G(V.bold(e),{padding:1,margin:{top:1,bottom:1},borderStyle:`round`,borderColor:N,textAlignment:`center`}))}function dn(e,t){let n=Tt();console.error(G(V.red.bold(`X Error: `)+B.text(e)+(t?`
|
|
62
62
|
|
|
63
63
|
`+B.muted(t):``),{padding:1,borderStyle:`round`,borderColor:`red`,width:n}))}const fn=dn;function pn(e){let t=Tt();console.log(G(V.green.bold(`√ `)+B.text(e),{padding:1,borderStyle:`round`,borderColor:`green`,width:t}))}function mn(e){let t=Tt();console.log(G(V.yellow.bold(`⚠ `)+B.text(e),{padding:1,borderStyle:`round`,borderColor:`yellow`,width:t}))}function hn(e){let t=Tt();console.log(G(B.brand.bold(`i `)+B.text(e),{padding:1,borderStyle:`round`,borderColor:N,width:t}))}const gn=[{key:`tag`,header:`Tag`,width:12},{key:`id`,header:`ID`,width:10},{key:`title`,header:`Title`,width:`flex`},{key:`status`,header:`Status`,width:15},{key:`priority`,header:`Priority`,width:10},{key:`dependencies`,header:`Dependencies`,width:14,dropOrder:3},{key:`blocks`,header:`Blocks`,width:10,dropOrder:0},{key:`complexity`,header:`Complexity`,width:12,dropOrder:1}];function _n(e,t){let{showSubtasks:n=!1,showComplexity:r=!1,showDependencies:i=!0,showBlocks:a=!1,showTag:o=!1}=t||{},s={tag:o,dependencies:i,blocks:a,complexity:r},c=gn.filter(e=>s[e.key]??!0),l=Dt(Et(),c),u=e=>l.widths[l.keys.indexOf(e)],d=new q({head:l.keys.map(e=>B.brand.bold(gn.find(t=>t.key===e)?.header??e)),style:{head:[],border:[]},colWidths:l.widths,wordWrap:!0}),p=e=>l.keys.map(t=>e[t]??``);e.forEach(e=>{let t=e.blocks?.join(`, `)??``;d.push(p({tag:B.accent(e.tagName||`-`),id:V.cyan(e.id.toString()),title:Ot(e.title,u(`title`)-3),status:nn(e.status,!0),priority:an(e.priority),dependencies:!e.dependencies||e.dependencies.length===0?B.muted(`-`):V.cyan(e.dependencies.map(e=>String(e)).join(`, `)),blocks:t?f(e.status)?B.muted(t):V.yellow(t):B.muted(`-`),complexity:typeof e.complexity==`number`?sn(e.complexity):B.muted(`N/A`)})),n&&e.subtasks&&e.subtasks.length>0&&e.subtasks.forEach(e=>{d.push(p({tag:B.muted(`-`),id:B.muted(` └─ ${e.id}`),title:B.muted(Ot(e.title,u(`title`)-6)),status:B.muted(nn(e.status,!0)),priority:B.muted(e.priority||`medium`),dependencies:B.muted(e.dependencies&&e.dependencies.length>0?e.dependencies.map(e=>String(e)).join(`, `):`-`),blocks:B.muted(`-`),complexity:B.muted(typeof e.complexity==`number`?sn(e.complexity):`--`)}))})});let m=l.hidden.length>0?`
|
|
64
|
-
`+B.muted(`Hidden to fit width: ${l.hidden.map(e=>gn.find(t=>t.key===e)?.header).join(`, `)}`):``;return d.toString()+m}var vn=r({BANNER_GRADIENT:()=>he,BORDER_COLOR:()=>N,BRAND_COLORS:()=>De,MUTED_BOX_BORDER:()=>ke,TABLE_BORDER:()=>le,calculateDependencyStatistics:()=>ht,calculateSubtaskStatistics:()=>mt,calculateTaskStatistics:()=>pt,createLink:()=>nt,createProgressBar:()=>kt,createTaskLink:()=>it,createTaskTable:()=>_n,createUrlLink:()=>rt,displayAcceptanceCriteria:()=>
|
|
64
|
+
`+B.muted(`Hidden to fit width: ${l.hidden.map(e=>gn.find(t=>t.key===e)?.header).join(`, `)}`):``;return d.toString()+m}var vn=r({BANNER_GRADIENT:()=>he,BORDER_COLOR:()=>N,BRAND_COLORS:()=>De,MUTED_BOX_BORDER:()=>ke,TABLE_BORDER:()=>le,calculateDependencyStatistics:()=>ht,calculateSubtaskStatistics:()=>mt,calculateTaskStatistics:()=>pt,createLink:()=>nt,createProgressBar:()=>kt,createTaskLink:()=>it,createTaskTable:()=>_n,createUrlLink:()=>rt,displayAcceptanceCriteria:()=>Vt,displayAsciiBanner:()=>lt,displayBanner:()=>un,displayCardBox:()=>dt,displayCodebasePatterns:()=>Wt,displayDashboards:()=>xt,displayDependencyDashboard:()=>bt,displayError:()=>fn,displayErrorBox:()=>dn,displayExistingInfrastructure:()=>zt,displayHeader:()=>St,displayImplementationApproach:()=>Ut,displayImplementationDetails:()=>Ft,displayImplementationMetadata:()=>Kt,displayInfo:()=>hn,displayInitBanner:()=>ut,displayProjectDashboard:()=>yt,displayRecommendedNextTask:()=>Yt,displayRelevantFiles:()=>Rt,displayScopeBoundaries:()=>Bt,displaySkillsAndCategory:()=>Gt,displaySubtasks:()=>Lt,displaySuccess:()=>pn,displaySuggestedActions:()=>qt,displaySuggestedNextSteps:()=>Zt,displaySyncMessage:()=>en,displayTaskDetails:()=>Jt,displayTaskHeader:()=>Nt,displayTaskProperties:()=>Pt,displayTechnicalConstraints:()=>Ht,displayTestStrategy:()=>It,displayWarning:()=>mn,displayWatchFooter:()=>$t,formatDependenciesWithStatus:()=>ln,formatStatusLine:()=>vt,getBoxWidth:()=>Tt,getComplexityWithColor:()=>sn,getComplexityWithScore:()=>cn,getPriorityBreakdown:()=>gt,getPriorityWithColor:()=>an,getStatusWithColor:()=>nn,getSuggestedActions:()=>At,getTaskDescription:()=>Xt,supportsLinks:()=>at,theme:()=>B,truncate:()=>Ot});const yn=Ae.join(`.taskgraph`,`tasks`,`tasks.json`);function bn(e){St({tag:e.tag||`master`,filePath:yn})}function xn(){return process.env.DEBUG===`true`||process.env.DEBUG===`1`}function Sn(e,t={}){if(e?.getSanitizedDetails){let n=e.getSanitizedDetails();console.error(V.red(`\n${n.message}`)),(xn()||t.forceStack)&&e.stack&&(console.error(B.muted(`
|
|
65
65
|
Stack trace:`)),console.error(B.muted(e.stack)))}else{let n=e?.message??String(e);console.error(V.red(`\nError: ${n}`)),(xn()||t.forceStack)&&e?.stack&&(console.error(B.muted(`
|
|
66
66
|
Stack trace:`)),console.error(B.muted(e.stack)))}t.skipExit||process.exit(1)}function Cn(e){return e?je(e):x()}var wn=class e extends K{tmCore;lastResult;constructor(e){super(e||`list`),this.description(`List tasks with optional filtering`).alias(`ls`).argument(`[status]`,`Filter by status (e.g., pending, done, in-progress) or "all" to show with subtasks`).option(`-s, --status <status>`,`Filter by status (fallback if not using positional)`).option(`-t, --tag <tag>`,`Filter by tag`).option(`--with-subtasks`,`Include subtasks in the output`).option(`-f, --format <format>`,`Output format (text, json, compact)`,`text`).option(`--json`,`Output in JSON format (shorthand for --format json)`).option(`-c, --compact`,`Output in compact format (shorthand for --format compact)`).option(`--no-header`,`Hide the command header`).option(`--silent`,`Suppress output (useful for programmatic usage)`).option(`-p, --project <path>`,`Project root directory (auto-detected if not provided)`).option(`-w, --watch`,`Watch for changes and update list automatically`).option(`--ready`,`Show only tasks ready to work on (dependencies satisfied)`).option(`--blocking`,`Show only tasks that block other tasks`).option(`--all-tags`,`Show tasks from all tags (combine with --ready for actionable tasks)`).action(async(e,t)=>{let n=e||t?.status,r=t?.withSubtasks||!1;e===`all`&&(n=void 0,r=!0);let i={...t,status:n,withSubtasks:r};await this.executeCommand(i)})}async executeCommand(e){try{if(this.validateOptions(e)||process.exit(1),await this.initializeCore(Cn(e.project)),e.watch)await this.watchTasks(e);else{let t=e.allTags?await this.getTasksFromAllTags(e):await this.getTasks(e);this.setLastResult(t),e.silent||this.displayResults(t,e)}}catch(e){Sn(e)}}async watchTasks(e){if(!this.tmCore)throw Error(`TmCore not initialized`);let t=await this.getTasks(e),n=new Date;console.clear(),this.displayResults(t,e),$t(n);let r;try{r=await this.tmCore.tasks.watch(async r=>{if(r.type===`change`)try{t=await this.getTasks(e),n=new Date,console.clear(),this.displayResults(t,e),en(n),$t(n)}catch(e){let t=e instanceof Error?e.message:String(e);console.error(V.yellow(`\nWarning: Failed to refresh tasks: ${t}`))}else r.type===`error`&&r.error&&console.error(V.red(`\n⚠ Watch error: ${r.error.message}`))},{tag:e.tag});let i=()=>{r?.unsubscribe(),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i),await new Promise(()=>{})}catch(e){throw console.error(V.red(`Watch mode error: ${e.message}`)),e}}validateOptions(e){if(e.format&&!v.includes(e.format))return console.error(V.red(`Invalid format: ${e.format}`)),console.error(B.muted(`Valid formats: ${v.join(`, `)}`)),!1;if(e.status){let t=e.status.split(`,`).map(e=>e.trim());for(let e of t)if(e!==`all`&&!p.includes(e))return console.error(V.red(`Invalid status: ${e}`)),console.error(B.muted(`Valid statuses: ${p.join(`, `)}`)),!1}return e.allTags&&e.watch?(console.error(V.red(`--all-tags cannot be used with --watch mode`)),console.error(B.muted(`Use --all-tags without --watch, or --watch without --all-tags`)),!1):!0}async initializeCore(e){this.tmCore||=await d({projectPath:e})}async getTasks(e){if(!this.tmCore)throw Error(`TmCore not initialized`);let t=e.status&&e.status!==`all`?e.status.split(`,`).map(e=>e.trim()):void 0,n=e.ready||e.blocking,r=t&&!n?{status:t}:void 0,i=await this.tmCore.tasks.list({tag:e.tag,filter:r,includeSubtasks:e.withSubtasks}),{blocksMap:a,invalidDependencies:o}=b(i.tasks);this.displayInvalidDependencyWarnings(o);let s=i.tasks.map(e=>({...e,blocks:a.get(String(e.id))||[]}));return e.ready&&(s=y(s)),e.blocking&&(s=_(s)),t&&n&&(s=s.filter(e=>t.includes(e.status))),{...i,tasks:s,filtered:s.length}}async getTasksFromAllTags(e){if(!this.tmCore)throw Error(`TmCore not initialized`);let t=await this.tmCore.tasks.getTagsWithStats(),n=[],r=0,i=[];for(let a of t.tags){let t=a.name;try{let i=await this.tmCore.tasks.list({tag:t,includeSubtasks:e.withSubtasks});r+=i.tasks.length;let{blocksMap:a,invalidDependencies:o}=b(i.tasks);this.displayInvalidDependencyWarnings(o,t);let s=i.tasks.map(e=>({...e,blocks:a.get(String(e.id))||[],tagName:t})),c=e.ready?y(s):s;n.push(...c)}catch(e){let n=e instanceof Error?e.message:String(e);i.push({name:t,error:n});continue}}if(i.length>0&&(console.warn(V.yellow(`\nWarning: Could not fetch tasks from ${i.length} tag(s):`)),i.forEach(({name:e,error:t})=>{console.warn(B.muted(` ${e}: ${t}`))})),i.length===t.tags.length&&t.tags.length>0)throw Error(`Failed to fetch tasks from any tag. First error: ${i[0].error}`);let a=n;if(e.blocking&&(a=a.filter(e=>e.blocks.length>0)),e.status&&e.status!==`all`){let t=e.status.split(`,`).map(e=>e.trim());a=a.filter(e=>t.includes(e.status))}return{tasks:a,total:r,filtered:a.length,allTags:!0}}displayInvalidDependencyWarnings(e,t){if(e.length===0)return;let n=t?` (tag: ${t})`:``;console.warn(V.yellow(`\nWarning: ${e.length} invalid dependency reference(s) found${n}:`)),e.slice(0,5).forEach(({taskId:e,depId:t})=>{console.warn(B.muted(` Task ${e} depends on non-existent task ${t}`))}),e.length>5&&console.warn(B.muted(` ...and ${e.length-5} more`))}displayResults(e,t){let n=t.format||`text`;switch(t.json?n=`json`:t.compact&&(n=`compact`),n){case`json`:this.displayJson(e);break;case`compact`:this.displayCompact(e,t);break;case`text`:default:this.displayText(e,t);break}}displayJson(e){console.log(JSON.stringify({tasks:e.tasks,metadata:{total:e.total,filtered:e.filtered,tag:e.allTags?`all`:e.tag,allTags:e.allTags||!1}},null,2))}displayCompact(e,t){let{tasks:n,tag:r,allTags:i}=e;t.noHeader!==!0&&bn({tag:i?`all tags`:r||`master`});for(let e of n){let n=g[e.status],r=i&&`tagName`in e?B.accent(`[${e.tagName}] `):``;if(console.log(`${r}${V.cyan(e.id)} ${n} ${e.title}`),t.withSubtasks&&e.subtasks?.length)for(let t of e.subtasks){let e=g[t.status];console.log(` ${B.muted(String(t.id))} ${e} ${B.muted(t.title)}`)}}}displayText(e,t){let{tasks:n,tag:r,allTags:i}=e;if(t.noHeader!==!0&&bn({tag:i?`all tags`:r||`master`}),n.length===0){mn(`No tasks found matching the criteria.`);return}let a=pt(n),o=mt(n),s=ht(n),c=gt(n),l=this.findNextTask(n),u=l?n.find(e=>String(e.id)===String(l.id)):void 0,d=t.ready||t.blocking||i;if(d||xt(a,o,c,s,u),console.log(_n(n,{showSubtasks:t.withSubtasks,showDependencies:!0,showBlocks:!0,showComplexity:!0,showTag:i})),!d){if(u){let e=Xt(u);Yt({id:u.id,title:u.title,priority:u.priority,status:u.status,dependencies:u.dependencies,description:e,complexity:u.complexity})}Zt()}}setLastResult(e){this.lastResult=e}findNextTask(e){let t={critical:4,high:3,medium:2,low:1},n=new Set;e.forEach(e=>{f(e.status)&&n.add(String(e.id)),e.subtasks&&e.subtasks.forEach(t=>{f(t.status)&&n.add(`${e.id}.${t.id}`)})});let r=[];if(e.filter(e=>e.status===`in-progress`&&e.subtasks&&e.subtasks.length>0).forEach(e=>{e.subtasks.forEach(t=>{let i=(t.status||`pending`).toLowerCase();if(i!==`pending`&&i!==`in-progress`)return;let a=t.dependencies?.map(t=>typeof t==`string`&&t.includes(`.`)?t:`${e.id}.${t}`)??[];(a.length===0||a.every(e=>n.has(String(e))))&&r.push({id:`${e.id}.${t.id}`,title:t.title||`Subtask ${t.id}`,priority:t.priority||e.priority||`medium`,dependencies:a.map(e=>String(e))})})}),r.length>0)return r.sort((e,n)=>{let r=t[e.priority||`medium`]??2,i=t[n.priority||`medium`]??2;if(i!==r)return i-r;let a=e.dependencies?.length||0,o=n.dependencies?.length||0;return a===o?String(e.id).localeCompare(String(n.id)):a-o}),r[0];let i=e.filter(e=>{let t=(e.status||`pending`).toLowerCase();if(t!==`pending`&&t!==`in-progress`)return!1;let r=e.dependencies||[];return r.length===0||r.every(e=>n.has(String(e)))});if(i.length===0)return;i.sort((e,n)=>{let r=t[e.priority||`medium`]??2,i=t[n.priority||`medium`]??2;if(i!==r)return i-r;let a=e.dependencies?.length||0,o=n.dependencies?.length||0;return a===o?Number(e.id)-Number(n.id):a-o});let a=i[0];return{id:a.id,title:a.title,priority:a.priority,dependencies:a.dependencies?.map(e=>String(e))}}getLastResult(){return this.lastResult}async cleanup(){this.tmCore&&=void 0}static register(t,n){let r=new e(n);return t.addCommand(r),r}},Tn=class e extends K{tmCore;lastResult;constructor(e){super(e||`show`),this.description(`Display detailed information about one or more tasks`).argument(`[id]`,`Task ID(s) to show (comma-separated for multiple)`).option(`-i, --id <id>`,`Task ID(s) to show (comma-separated for multiple)`).option(`-s, --status <status>`,`Filter subtasks by status`).option(`-f, --format <format>`,`Output format (text, json)`,`text`).option(`--json`,`Output in JSON format (shorthand for --format json)`).option(`--silent`,`Suppress output (useful for programmatic usage)`).option(`-p, --project <path>`,`Project root directory (auto-detected if not provided)`).action(async(e,t)=>{await this.executeCommand(e,t)})}async executeCommand(e,t){try{this.validateOptions(t)||process.exit(1),await this.initializeCore(Cn(t.project));let n=e||t.id;n||(console.error(V.red(`Error: Please provide a task ID`)),process.exit(1));let r=n.split(`,`).map(e=>e.trim()).filter(e=>e.length>0),i=[];for(let e of r){let t=c.safeParse(e);t.success||(console.error(V.red(`Invalid task ID: ${e}`),B.muted(`- ${t.error.issues[0]?.message}`)),process.exit(1)),i.push(t.data)}let a=i.length>1?await this.getMultipleTasks(i,t):await this.getSingleTask(i[0],t);this.setLastResult(a),t.silent||this.displayResults(a,t)}catch(e){Sn(e)}}validateOptions(e){return e.format&&![`text`,`json`].includes(e.format)?(console.error(V.red(`Invalid format: ${e.format}`)),console.error(B.muted(`Valid formats: text, json`)),!1):!0}async initializeCore(e){this.tmCore||=await d({projectPath:e})}async getSingleTask(e,t){if(!this.tmCore)throw Error(`TmCore not initialized`);let n=await this.tmCore.tasks.get(e);return{task:n.task,found:n.task!==null,originalTaskId:n.isSubtask?e:void 0}}async getMultipleTasks(e,t){if(!this.tmCore)throw Error(`TmCore not initialized`);let n=[],r=[];for(let t of e){let e=await this.tmCore.tasks.get(t);e.task?n.push(e.task):r.push(t)}return{tasks:n,notFound:r}}displayResults(e,t){switch(t.json?`json`:t.format||`text`){case`json`:this.displayJson(e);break;case`text`:default:`task`in e?this.displaySingleTask(e,t):this.displayMultipleTasks(e,t);break}}displayJson(e){console.log(JSON.stringify(e,null,2))}displaySingleTask(e,t){if(!e.found||!e.task){console.log(G(V.yellow(`Task not found!`),{padding:{top:0,bottom:0,left:1,right:1},borderColor:`yellow`,borderStyle:`round`,margin:{top:1}}));return}bn({tag:this.tmCore?.config.getActiveTag()||`master`}),console.log(),Jt(e.task,{statusFilter:t.status,showSuggestedActions:!0,originalTaskId:e.originalTaskId})}displayMultipleTasks(e,t){if(bn({tag:this.tmCore?.config.getActiveTag()||`master`}),e.notFound.length>0&&console.log(V.yellow(`\n⚠ Not found: ${e.notFound.join(`, `)}`)),e.tasks.length===0){mn(`No tasks found matching the criteria.`);return}console.log(B.brand.bold(`
|
|
67
67
|
Tasks:
|
|
@@ -718,11 +718,12 @@ Complexity: ${N&&N.complexityScore?Js(N.complexityScore):Q.muted(`N/A`)}`;if(fe>
|
|
|
718
718
|
`),s=Math.max(a.length,o.length),c=[];for(let e=0;e<s;e++){let n=e<a.length?a[e]:``,r=e<o.length?o[e]:``,i=n.trimEnd().padEnd(t,` `);c.push(i+r)}console.log(c.join(`
|
|
719
719
|
`))}else{let e=G(pe,{padding:1,borderColor:Fs,borderStyle:`round`,margin:{top:0,bottom:1}}),t=G(me,{padding:1,borderColor:`magenta`,borderStyle:`round`,margin:{top:0,bottom:1}});console.log(e),console.log(t)}if(l.length===0){console.log(G(t?V.yellow(`No tasks with status '${t}' found`):V.yellow(`No tasks found`),{padding:1,borderColor:`yellow`,borderStyle:`round`}));return}let he=r?10:7,ge=100-he-15-12-20-10,F=fe-10,_e=Math.floor(F*(he/100)),ve=Math.floor(F*(15/100)),ye=Math.floor(F*(12/100)),L=Math.floor(F*(20/100)),be=Math.floor(F*(10/100)),xe=Math.floor(F*(ge/100)),Se=new q({head:[V.cyan.bold(`ID`),V.cyan.bold(`Title`),V.cyan.bold(`Status`),V.cyan.bold(`Priority`),V.cyan.bold(`Dependencies`),V.cyan.bold(`Complexity`)],colWidths:[_e,xe,ve,ye,L,be],style:{head:[],border:[],compact:!1},wordWrap:!0,wrapOnWordBoundary:!0});l.forEach(e=>{let t=`None`;t=e.dependencies&&e.dependencies.length>0?Ks(e.dependencies,a.tasks,!0,c):Q.muted(`None`);let n=e.title.replace(/\n/g,` `),i={high:V.red,medium:V.yellow,low:Q.muted}[e.priority||`medium`]||V.reset,o=Gs(e.status,!0);Se.push([e.id.toString(),R(n,xe-3),o,i(R(e.priority||`medium`,ye-2)),t,e.complexityScore?Js(e.complexityScore):Q.muted(`N/A`)]),r&&e.subtasks&&e.subtasks.length>0&&e.subtasks.forEach(t=>{let n=`None`;t.dependencies&&t.dependencies.length>0&&(n=t.dependencies.map(t=>{if(typeof t==`number`&&t<100){let n=e.subtasks.find(e=>e.id===t);if(n){let r=n.status===`done`||n.status===`completed`,i=n.status===`in-progress`;return r?V.green.bold(`${e.id}.${t}`):i?Q.active.bold(`${e.id}.${t}`):V.red.bold(`${e.id}.${t}`)}}let n=a.tasks.find(e=>e.id===t);if(n){T(n,c);let e=n.status===`done`||n.status===`completed`,r=n.status===`in-progress`;return e?V.green.bold(`${t}`):r?Q.active.bold(`${t}`):V.red.bold(`${t}`)}return V.cyan(t.toString())}).join(`, `)||Q.muted(`None`)),Se.push([`${e.id}.${t.id}`,V.dim(`└─ ${R(t.title,xe-5)}`),Gs(t.status,!0),V.dim(`-`),n,t.complexityScore?Q.muted(`${t.complexityScore}`):Q.muted(`N/A`)])})});try{console.log(Se.toString())}catch(e){I(`error`,`Error rendering table: ${e.message}`),console.log(V.yellow(`
|
|
720
720
|
Falling back to simple task list due to terminal width constraints:`)),l.forEach(e=>{console.log(`${V.cyan(e.id)}: ${V.reset(e.title)} - ${Gs(e.status)}`)})}t&&(console.log(V.yellow(`\nFiltered by status: ${t}`)),console.log(V.yellow(`Showing ${l.length} of ${u} tasks`)));let Ce={high:V.red.bold,medium:V.yellow,low:Q.muted};if(N){let e=``,t=a.tasks.find(e=>String(e.id)===String(N.id));t&&t.subtasks&&t.subtasks.length>0&&(e=`\n\n${V.bold(`Subtasks:`)}\n`,e+=t.subtasks.map(e=>{T(e,c);let n=e.status||`pending`,r={done:V.green,completed:V.green,pending:V.yellow,"in-progress":V.cyan,deferred:Q.muted,blocked:V.red,cancelled:Q.muted}[n.toLowerCase()]||V.reset;return`${V.cyan(`${t.id}.${e.id}`)} [${r(n)}] ${e.title}`}).join(`
|
|
721
|
-
`)),
|
|
721
|
+
`));let n=At(N.id,N.status,!!t?.subtasks?.length).slice(0,2).map(e=>`${V.cyan(`Next step:`)} ${V.yellow(e.command)} ${Q.muted(e.description)}`).join(`
|
|
722
|
+
`);console.log(G(Q.heading(`Next task: #${N.id} - ${N.title}`)+`
|
|
722
723
|
|
|
723
724
|
${V.reset(`Priority:`)} ${Ce[N.priority||`medium`](N.priority||`medium`)} ${V.reset(`Status:`)} ${Gs(N.status,!0)}\n${V.reset(`Dependencies:`)} ${N.dependencies&&N.dependencies.length>0?Ks(N.dependencies,a.tasks,!0,c):Q.muted(`None`)}\n\n${V.reset(`Description:`)} ${Wi(N,a.tasks)}`+e+`
|
|
724
725
|
|
|
725
|
-
${
|
|
726
|
+
${n}\n${V.cyan(`View details:`)} ${V.yellow(`taskgraph show ${N.id}`)}`,{padding:{left:2,right:2,top:1,bottom:1},borderColor:Fs,borderStyle:`round`,margin:{top:1,bottom:1},title:`Next task`,titleAlignment:`center`,width:fe-4,fullscreen:!1}))}else console.log(G(Q.heading(`No eligible next task found`)+`
|
|
726
727
|
|
|
727
728
|
All pending tasks have dependencies that are not yet completed, or all tasks are done.`,{padding:1,borderColor:Fs,borderStyle:`round`,margin:{top:1,bottom:1},title:`Next task`,titleAlignment:`center`,width:fe-4}));console.log(G(V.bold(`Suggested Next Steps:`)+`
|
|
728
729
|
|
|
@@ -753,7 +754,7 @@ ${V.cyan(`1.`)} Run ${V.yellow(`taskgraph next`)} to see what to work on next\n$
|
|
|
753
754
|
${V.cyan(`1.`)} Run ${V.yellow(`taskgraph list`)} to view all tasks\n${V.cyan(`2.`)} Run ${V.yellow(`taskgraph expand --id=<id>`)} to break down a task into subtasks\n${V.cyan(`3.`)} Run ${V.yellow(`taskgraph analyze-complexity`)} to analyze task complexity`;console.log(G(e,Ea.nextSteps))}function za(e){return Math.ceil(e.length/4)}function Ba(e){let t=W.readFileSync(e,`utf8`);if(!t)throw Error(`Input file ${e} is empty or could not be read.`);return t}function Va(e,t){let n=[],r=1;if(!W.existsSync(e))return{existingTasks:n,nextId:r};try{let i=W.readFileSync(e,`utf8`),a=JSON.parse(i);a[t]?.tasks&&Array.isArray(a[t].tasks)&&(n=a[t].tasks,n.length>0&&(r=Math.max(...n.map(e=>e.id||0))+1))}catch{return{existingTasks:[],nextId:1}}return{existingTasks:n,nextId:r}}function Ha({existingTasks:e,targetTag:t,append:n,force:r,isMCP:i,logger:a}){if(!(e.length>0)){a.report(`Tag '${t}' is empty or doesn't exist. Creating/updating tag with new tasks.`,`info`);return}if(n){a.report(`Append mode enabled. Found ${e.length} existing tasks in tag '${t}'.`,`info`);return}if(!r){let n=`Tag '${t}' already contains ${e.length} tasks. Use --force to overwrite or --append to add to existing tasks.`;if(a.report(n,`error`),i)throw Error(n);console.error(V.red(n)),process.exit(1)}a.report(`Force flag enabled. Overwriting existing tasks in tag '${t}'.`,`debug`)}function Ua(e,t,n,r){Wa(e,t);let i=t,a=new Map,o=e.map(e=>{let t=i++;return a.set(e.id,t),{...e,id:t,status:e.status||`pending`,priority:e.priority||r,dependencies:Array.isArray(e.dependencies)?e.dependencies:[],subtasks:e.subtasks||[],title:e.title||``,description:e.description||``,details:e.details||``,testStrategy:e.testStrategy||``}});return o.forEach(e=>{e.dependencies=e.dependencies.map(e=>a.get(e)).filter(t=>t!=null&&t<e.id&&(O(n,t)||o.some(e=>e.id===t)))}),o}function Wa(e,t=1){if(!Array.isArray(e)||e.length===0)return;let n=e.map(e=>e.id);if(n.some(e=>!Number.isInteger(e)||e<1))throw Error(`PRD tasks must use sequential positive integer IDs starting at 1.`);let r=new Set(n);if(r.size!==n.length)throw Error(`PRD task IDs must be unique and sequential starting at 1.`);let i=[...r].sort((e,t)=>e-t),a=i[0];if(a!==1&&a!==t)throw Error(`PRD task IDs must start at 1 or ${t} and be sequential.`);for(let e=0;e<i.length;e+=1)if(i[e]!==a+e)throw Error(`PRD task IDs must be a contiguous sequence starting at ${a}.`)}function Ga(e,t,n,r){let i=H.dirname(e);W.existsSync(i)||W.mkdirSync(i,{recursive:!0});let a={};if(W.existsSync(e))try{let t=W.readFileSync(e,`utf8`);a=JSON.parse(t)}catch{a={}}a[n]={tasks:t,metadata:{created:a[n]?.metadata?.created||new Date().toISOString(),updated:new Date().toISOString(),description:`Tasks for ${n} context`}},D(a[n],{description:`Tasks for ${n} context`}),W.writeFileSync(e,JSON.stringify(a,null,2)),r.report(`Successfully saved ${t.length} tasks to ${e}`,`debug`)}async function Ka(e,t,n){let r=xi(),i=ue(e.projectRoot)||`medium`;return r.loadPrompt(`parse-prd`,{research:e.research,numTasks:e.numTasks,nextId:n,prdContent:t,prdPath:e.prdPath,defaultTaskPriority:i,hasCodebaseAnalysis:e.hasCodebaseAnalysis(),projectRoot:e.projectRoot||``})}async function qa({task:e,currentCount:t,totalTasks:n,estimatedTokens:r,progressTracker:i,reportProgress:a,priorityMap:o,defaultPriority:s,estimatedInputTokens:c}){let l=e.priority||s,u=o[l]||o.medium;if(i&&(i.addTaskLine(t,e.title,l),r&&i.updateTokens(c,r)),a)try{let i=r?Math.floor(r/n):0;await a({progress:t,total:n,message:`${u} Task ${t}/${n} - ${e.title} | ~Output: ${i} tokens`})}catch{}}async function Ja({processedTasks:e,nextId:t,summary:n,prdPath:r,tasksPath:i,usedFallback:a,aiServiceResponse:o}){let s=(()=>{if(!Array.isArray(e)||e.length===0)return`task_${String(t).padStart(3,`0`)}.txt`;let n=e[0].id,r=e[e.length-1].id;return e.length===1?`task_${String(n).padStart(3,`0`)}.txt`:`task_${String(n).padStart(3,`0`)}.txt -> task_${String(r).padStart(3,`0`)}.txt`})();Ia({totalTasks:e.length,taskPriorities:n.taskPriorities,prdFilePath:r,outputPath:i,elapsedTime:n.elapsedTime,usedFallback:a,taskFilesGenerated:s,actionVerb:n.actionVerb}),o?.telemetryData&&(o.mainResult?.usage&&await _a.withSoftTimeout(o.mainResult.usage,1e3,void 0),tc(o.telemetryData,`cli`))}function Ya({processedTasks:e,research:t,finalTasks:n,tasksPath:r,aiServiceResponse:i}){console.log(G(V.green(`Successfully generated ${e.length} new tasks${t?` with research-backed analysis`:``}. Total tasks in ${r}: ${n.length}`),{padding:1,borderColor:`green`,borderStyle:`round`})),console.log(G(B.text.bold(`Next Steps:`)+`
|
|
754
755
|
|
|
755
756
|
${V.cyan(`1.`)} Run ${V.yellow(`taskgraph list`)} to view all tasks\n${V.cyan(`2.`)} Run ${V.yellow(`taskgraph expand --id=<id>`)} to break down a task into subtasks`,{padding:1,borderColor:`cyan`,borderStyle:`round`,margin:{top:1}})),i?.telemetryData&&tc(i.telemetryData,`cli`)}async function Xa(e,t){let n=new Sa(e.mcpLog,e.reportProgress),{systemPrompt:r,userPrompt:a}=t,o=za(r+a),s=null;e.outputFormat===`text`&&!e.isMCP&&(s=Ue(`Parsing PRD and generating tasks...
|
|
756
|
-
`).start());try{n.report(`Calling AI service to generate tasks from PRD${e.research?` with research-backed analysis`:``}...`,`info`);let t=await i({role:e.research?`research`:`main`,session:e.session,projectRoot:e.projectRoot,schema:ba,objectName:`tasks_data`,systemPrompt:r,prompt:a,commandName:`parse-prd`,outputType:e.isMCP?`mcp`:`cli`}),c=null;if(t?.mainResult&&(typeof t.mainResult==`object`&&t.mainResult!==null&&`tasks`in t.mainResult?c=t.mainResult:typeof t.mainResult.object==`object`&&t.mainResult.object!==null&&`tasks`in t.mainResult.object&&(c=t.mainResult.object)),!c||!Array.isArray(c.tasks))throw Error(`AI service returned unexpected data structure after validation.`);return s&&s.succeed(`Tasks generated successfully!`),{parsedTasks:c.tasks,aiServiceResponse:t,estimatedInputTokens:o}}catch(e){throw s&&s.fail(`Error parsing PRD: ${e.message}`),e}}const[Za,Qa,$a]=Kr,eo=new Map;var to=class{constructor(e,t,n,r=null){this.name=e,this.levels=t,this.colors=n,this.thresholds=r}getColor(e){return this.colors[e]||B.muted}getLevelFromScore(e){if(!this.thresholds)throw Error(`${this.name} does not support score-based levels`);return e>=7?this.levels[0]:e<=3?this.levels[2]:this.levels[1]}};const no={cli:{filled:`●`,empty:`○`},statusBar:{high:`⋮`,medium:`:`,low:`.`},mcp:{high:`🔴`,medium:`🟠`,low:`🟢`}},ro=new to(`priority`,[Za,Qa,$a],{[Za]:V.red,[Qa]:V.yellow,[$a]:B.muted});function io(e,t){let n=no.cli.filled,r=no.cli.empty,i=``;for(let a=0;a<3;a++)a<e?i+=t(n):i+=B.text(r);return i}function ao(e,t){return 3-t.indexOf(e)}function oo(e,t){if(eo.has(e))return eo.get(e);let n=t();return eo.set(e,n),n}function so(){return oo(`mcp-priority-all`,()=>({[Za]:no.mcp.high,[Qa]:no.mcp.medium,[$a]:no.mcp.low}))}function co(){return oo(`cli-priority-all`,()=>{let e={};return ro.levels.forEach(t=>{e[t]=io(ao(t,ro.levels),ro.getColor(t))}),e})}function lo(){return oo(`statusbar-priority-all`,()=>{let e={};return ro.levels.forEach((t,n)=>{let r=n===0?no.statusBar.high:n===1?no.statusBar.medium:no.statusBar.low;e[t]=ro.getColor(t)(r)}),e})}function uo(){return{[Za]:ro.colors[Za],[Qa]:ro.colors[Qa],[$a]:ro.colors[$a]}}function fo(e=!1){return e?so():co()}function po(e,t=!1){let n=fo(t);return n[e]||n[Qa]}new to(`complexity`,[`high`,`medium`,`low`],{high:V.red,medium:V.yellow,low:V.green},{high:e=>e>=7,medium:e=>e>=4&&e<=6,low:e=>e<=3});const mo={clearOnComplete:!1,stopOnComplete:!0,hideCursor:!0,barsize:40},ho={shades_classic:qe.Presets.shades_classic,shades_grey:qe.Presets.shades_grey,rect:qe.Presets.rect,legacy:qe.Presets.legacy},go=new class{constructor(e={},t=ho.shades_classic){this.defaultOptions={...mo,...e},this.defaultPreset=t}createSingleBar(e={},t=null){let n=this._mergeConfig(e),r=t||this.defaultPreset;return new qe.SingleBar(n,r)}createMultiBar(e={},t=null){let n=this._mergeConfig(e),r=t||this.defaultPreset;return new qe.MultiBar(n,r)}_mergeConfig(e){return{...this.defaultOptions,...e}}setDefaultOptions(e){this.defaultOptions={...this.defaultOptions,...e}}setDefaultPreset(e){this.defaultPreset=e}};function _o(e={}){return go.createMultiBar(e)}var vo=class{constructor(e={}){this.numUnits=e.numUnits||1,this.unitName=e.unitName||`unit`,this.startTime=null,this.completedUnits=0,this.tokensIn=0,this.tokensOut=0,this.isEstimate=!0,this.bestAvgTimePerUnit=null,this.lastEstimateTime=null,this.lastEstimateSeconds=0,this.multibar=null,this.timeTokensBar=null,this.progressBar=null,this._timerInterval=null,this.isStarted=!1,this.isFinished=!1,this._initializeCustomProperties(e)}_initializeCustomProperties(e){}get unitNamePlural(){return`${this.unitName}s`}start(){this.isStarted||this.isFinished||(this.isStarted=!0,this.startTime=Date.now(),this.multibar=_o(),this.timeTokensBar=this.multibar.create(1,0,{},{format:this._getTimeTokensBarFormat(),barsize:1,hideCursor:!0,clearOnComplete:!1}),this.progressBar=this.multibar.create(this.numUnits,0,{},{format:this._getProgressBarFormat(),barCompleteChar:`█`,barIncompleteChar:`░`}),this._updateTimeTokensBar(),this.progressBar.update(0,{[this.unitNamePlural]:`0/${this.numUnits}`}),this._timerInterval=setInterval(()=>this._updateTimeTokensBar(),1e3),this._setupCustomUI())}_setupCustomUI(){}_getTimeTokensBarFormat(){return`{clock} {elapsed} | Tokens (I/O): {in}/{out} | Est: {remaining}`}_getProgressBarFormat(){return`${this.unitName.charAt(0).toUpperCase()+this.unitName.slice(1)}s {${this.unitNamePlural}} |{bar}| {percentage}%`}updateTokens(e,t,n=!1){this.tokensIn=e||0,this.tokensOut=t||0,this.isEstimate=n,this._updateTimeTokensBar()}_updateTimeTokensBar(){if(!this.timeTokensBar||this.isFinished)return;let e=this._formatElapsedTime(),t=this._estimateRemainingTime(),n=this.isEstimate?`~ Tokens (I/O)`:`Tokens (I/O)`;this.timeTokensBar.update(1,{clock:`⏱️`,elapsed:e,in:this.tokensIn,out:this.tokensOut,remaining:t,tokensLabel:n,...this._getCustomTimeTokensPayload()})}_getCustomTimeTokensPayload(){return{}}_formatElapsedTime(){if(!this.startTime)return`0m 00s`;let e=Math.floor((Date.now()-this.startTime)/1e3);return`${Math.floor(e/60)}m ${(e%60).toString().padStart(2,`0`)}s`}_estimateRemainingTime(){let e=this._getProgressFraction();if(e>=1)return`~0s`;let t=Date.now(),n=(t-this.startTime)/1e3;if(e===0)return`~calculating...`;let r=n/e;(this.bestAvgTimePerUnit===null||r<this.bestAvgTimePerUnit)&&(this.bestAvgTimePerUnit=r);let i=this.numUnits*(1-e),a=Math.ceil(i*this.bestAvgTimePerUnit);if(this.lastEstimateTime){let e=Math.floor((t-this.lastEstimateTime)/1e3),n=Math.max(0,this.lastEstimateSeconds-e);if(n===0)return`~0s`;a=Math.min(a,n)}return this.lastEstimateTime=t,this.lastEstimateSeconds=a,`~${this._formatDuration(a)}`}_getProgressFraction(){return this.completedUnits/this.numUnits}_formatDuration(e){if(e<60)return`${e}s`;let t=Math.floor(e/60),n=e%60;return t<60?n>0?`${t}m ${n}s`:`${t}m`:`${Math.floor(t/60)}h ${t%60}m`}getElapsedTime(){return this.startTime?Date.now()-this.startTime:0}stop(){this.isFinished||(this.isFinished=!0,this._timerInterval&&=(clearInterval(this._timerInterval),null),this.multibar&&(this._updateTimeTokensBar(),this.multibar.stop()),this.cleanup())}getSummary(){return{completedUnits:this.completedUnits,elapsedTime:this.getElapsedTime()}}cleanup(){if(this._timerInterval&&=(clearInterval(this._timerInterval),null),this.multibar){try{this.multibar.stop()}catch{}this.multibar=null}this.timeTokensBar=null,this.progressBar=null,this.isStarted=!1,this.isFinished=!0,this._performCustomCleanup()}_performCustomCleanup(){}},yo=class{constructor(e){if(!e)throw Error(`Multibar instance is required`);this.multibar=e}createBar(e,t={}){if(typeof e!=`string`)throw Error(`Format must be a string`);let n=this.multibar.create(1,1,{},{format:e,barsize:1,hideCursor:!0,clearOnComplete:!1});return n.update(1,t),n}createHeader(e,t){this.createBar(t),this.createBar(e),this.createBar(t)}createRow(e,t){if(!t||typeof t!=`object`)throw Error(`Payload must be an object`);return this.createBar(e,t)}createBorder(e){return this.createBar(e)}};function bo(e,t,n){new yo(e).createHeader(t,n)}function xo(e,t,n){new yo(e).createRow(t,n)}function So(e,t){new yo(e).createBorder(t)}co();const Co=lo();uo();const wo={DEBOUNCE_DELAY:100,MAX_TITLE_LENGTH:57,TRUNCATED_LENGTH:54,TASK_ID_PAD_START:3,TASK_ID_PAD_END:4,PRIORITY_PAD_END:3,VALID_PRIORITIES:[`high`,`medium`,`low`],DEFAULT_PRIORITY:`medium`};var To=class{constructor(e=wo.DEBOUNCE_DELAY){this.delay=e,this.pendingTimeout=null}debounce(e){this.clear(),this.pendingTimeout=setTimeout(()=>{e(),this.pendingTimeout=null},this.delay)}clear(){this.pendingTimeout&&=(clearTimeout(this.pendingTimeout),null)}hasPending(){return this.pendingTimeout!==null}},Eo=class{constructor(){this.priorities={high:0,medium:0,low:0}}increment(e){let t=this.normalize(e);return this.priorities[t]++,t}normalize(e){let t=e?e.toLowerCase():wo.DEFAULT_PRIORITY;return wo.VALID_PRIORITIES.includes(t)?t:wo.DEFAULT_PRIORITY}getCounts(){return{...this.priorities}}},Do=class{static formatTitle(e,t){return e?e.length>wo.MAX_TITLE_LENGTH?e.substring(0,wo.TRUNCATED_LENGTH)+`...`:e:`Task ${t}`}static formatPriority(e){return po(e,!1).padEnd(wo.PRIORITY_PAD_END,` `)}static formatTaskId(e){return e.toString().padStart(wo.TASK_ID_PAD_START,` `).padEnd(wo.TASK_ID_PAD_END,` `)}},Oo=class extends vo{_initializeCustomProperties(e){this.append=e.append,this.priorityManager=new Eo,this.debouncer=new To,this.headerShown=!1}_getTimeTokensBarFormat(){return`{clock} {elapsed} | ${Co.high} {high} ${Co.medium} {medium} ${Co.low} {low} | Tokens (I/O): {in}/{out} | Est: {remaining}`}_getProgressBarFormat(){return`Tasks {tasks} |{bar}| {percentage}%`}_getCustomTimeTokensPayload(){return this.priorityManager.getCounts()}addTaskLine(e,t,n=`medium`){if(!this.multibar||this.isFinished)return;this._ensureHeaderShown();let r=this._updateTaskCounters(e,n);this._updateTimeTokensBar(),this.debouncer.debounce(()=>{this._updateProgressDisplay(e,t,r)})}_ensureHeaderShown(){this.headerShown||(this.headerShown=!0,bo(this.multibar,` TASK | PRI | TITLE`,`------+-----+----------------------------------------------------------------`))}_updateTaskCounters(e,t){let n=this.priorityManager.increment(t);return this.completedUnits=e,n}_updateProgressDisplay(e,t,n){this.progressBar.update(this.completedUnits,{tasks:`${this.completedUnits}/${this.numUnits}`});let r=Do.formatTitle(t,e),i=Do.formatPriority(n),a=Do.formatTaskId(e);xo(this.multibar,` ${a} | ${i} | {title}`,{title:r}),So(this.multibar,`------+-----+----------------------------------------------------------------`),this._updateTimeTokensBar()}finish(){this.debouncer.hasPending()&&(this.debouncer.clear(),this._updateTimeTokensBar()),this.cleanup(),super.finish()}_performCustomCleanup(){this.debouncer.clear()}getSummary(){return{...super.getSummary(),taskPriorities:this.priorityManager.getCounts(),actionVerb:this.append?`appended`:`generated`}}};function ko(e={}){return new Oo(e)}async function Ao(e,t,n){let r=jo(e,t,n);await No(e,n,r.estimatedInputTokens);let i=await Po(e,t,e.streamingTimeout),{progressTracker:a,priorityMap:o}=await Fo(e,n),s=await Io(i.mainResult,e,t,n,a,o,r.defaultPriority,r.estimatedInputTokens,r.logger);if(Mo(s),s.usage&&e.projectRoot){let{logAiUsage:t}=await import(`./ai-services-unified-DdXQf9-K.js`),{getUserId:n}=await import(`./config-manager-7Sv3SsVJ.js`),a=n(e.projectRoot);if(a&&i.providerName&&i.modelId)try{let n=await t({userId:a,commandName:`parse-prd`,providerName:i.providerName,modelId:i.modelId,inputTokens:s.usage.promptTokens||0,outputTokens:s.usage.completionTokens||0,outputType:e.isMCP?`mcp`:`cli`});n&&(i.telemetryData=n)}catch(e){r.logger.report(`Failed to log telemetry: ${e.message}`,`debug`)}}return Ko(s,i,r.estimatedInputTokens,a)}function jo(e,t,n){let{systemPrompt:r,userPrompt:i}=t;return{logger:new Sa(e.mcpLog,e.reportProgress),estimatedInputTokens:za(r+i),defaultPriority:ue(e.projectRoot)||`medium`}}function Mo(e){if(e.parsedTasks.length===0)throw Error(`No tasks were generated from the PRD`)}async function No(e,t,n){e.reportProgress&&await e.reportProgress({progress:0,total:t,message:`Starting PRD analysis (Input: ${n} tokens)${e.research?` with research`:``}...`})}async function Po(e,n,r){let{systemPrompt:i,userPrompt:a}=n;return await _a.withTimeout(t({role:e.research?`research`:`main`,session:e.session,projectRoot:e.projectRoot,schema:ba,systemPrompt:i,prompt:a,commandName:`parse-prd`,outputType:e.isMCP?`mcp`:`cli`}),r,`Streaming operation`)}async function Fo(e,t){let n=fo(e.isMCP),r=null;if(e.outputFormat===`text`&&!e.isMCP){r=ko({numUnits:t,unitName:`task`,append:e.append});let n=e.research?Ee():xe(),i=ge(e.research?`research`:`main`);ja({prdFilePath:e.prdPath,outputPath:e.tasksPath,numTasks:t,append:e.append,research:e.research,force:e.force,existingTasks:[],nextId:1,model:n||`Default`,temperature:i?.temperature||.7}),r.start()}return{progressTracker:r,priorityMap:n}}async function Io(e,t,n,r,i,a,o,s,c){let{systemPrompt:l,userPrompt:u}=n,d={config:{...t,schema:ba},numTasks:r,progressTracker:i,priorityMap:a,defaultPriority:o,estimatedInputTokens:s,prompt:u,systemPrompt:l};try{let t={lastPartialObject:null,taskCount:0,estimatedOutputTokens:0,usage:null};if(await Lo(e.partialObjectStream,t,d),e.usage)try{t.usage=await e.usage}catch(e){c.report(`Failed to get usage data: ${e.message}`,`debug`)}return Vo(t,d)}catch(e){return c.report(`StreamObject processing failed: ${e.message}. Falling back to generateObject.`,`debug`),await Go(d,c)}}async function Lo(e,t,n){for await(let r of e)t.lastPartialObject=r,r&&(t.estimatedOutputTokens=za(JSON.stringify(r))),await Ro(r,t,n)}async function Ro(e,t,n){if(!e?.tasks||!Array.isArray(e.tasks))return;let r=e.tasks.length;r>t.taskCount?(await zo(e.tasks,t.taskCount,r,t.estimatedOutputTokens,n),t.taskCount=r):n.progressTracker&&t.estimatedOutputTokens>0&&n.progressTracker.updateTokens(n.estimatedInputTokens,t.estimatedOutputTokens,!0)}async function zo(e,t,n,r,i){for(let a=t;a<n;a++){let t=e[a]||{};t.title?await qa({task:t,currentCount:a+1,totalTasks:i.numTasks,estimatedTokens:r,progressTracker:i.progressTracker,reportProgress:i.config.reportProgress,priorityMap:i.priorityMap,defaultPriority:i.defaultPriority,estimatedInputTokens:i.estimatedInputTokens}):await Bo(a+1,r,i)}}async function Bo(e,t,n){let{progressTracker:r,config:i,numTasks:a,defaultPriority:o,estimatedInputTokens:s}=n;r&&(r.addTaskLine(e,`Generating task ${e}...`,o),r.updateTokens(s,t,!0)),i.reportProgress&&!r&&await i.reportProgress({progress:e,total:a,message:`Generating task ${e}/${a}...`})}async function Vo(e,t){let{lastPartialObject:n,estimatedOutputTokens:r,taskCount:i,usage:a}=e;if(!n?.tasks||!Array.isArray(n.tasks))throw Error(`No tasks generated from streamObject`);let o=a?.completionTokens||r,s=a?.promptTokens||t.estimatedInputTokens;return t.progressTracker&&await Ho(n.tasks,i,a?o:r,t,a?s:null),{parsedTasks:n.tasks,estimatedOutputTokens:o,actualInputTokens:s,usage:a,usedFallback:!1}}async function Ho(e,t,n,r,i=null){let{progressTracker:a,defaultPriority:o,estimatedInputTokens:s}=r;t>0?Uo(e,a,o):await Wo(e,n,r),a.updateTokens(i||s,n,!1),a.stop()}function Uo(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];i?.title&&t.addTaskLine(r+1,i.title,i.priority||n)}}async function Wo(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];i?.title&&await qa({task:i,currentCount:r+1,totalTasks:n.numTasks,estimatedTokens:t,progressTracker:n.progressTracker,reportProgress:n.config.reportProgress,priorityMap:n.priorityMap,defaultPriority:n.defaultPriority,estimatedInputTokens:n.estimatedInputTokens})}}async function Go(e,t){if(t.report(`Using generateObject fallback for PRD parsing`,`info`),e.progressTracker)for(let t=0;t<e.numTasks;t++)e.progressTracker.addTaskLine(t+1,`Generating task ${t+1}...`,e.defaultPriority),e.progressTracker.updateTokens(e.estimatedInputTokens,0,!0);let n=await i({role:e.config.research?`research`:`main`,commandName:`parse-prd`,prompt:e.prompt,systemPrompt:e.systemPrompt,schema:e.config.schema,outputFormat:e.config.outputFormat||`text`,projectRoot:e.config.projectRoot,session:e.config.session}),r=n?.mainResult||n;if(r&&Array.isArray(r.tasks)&&(r.tasks=r.tasks.map(e=>({...e,dependencies:e.dependencies??[],priority:e.priority??null,details:e.details??null,testStrategy:e.testStrategy??null}))),r&&Array.isArray(r.tasks)){if(e.progressTracker){for(let t=0;t<r.tasks.length;t++){let n=r.tasks[t];n&&n.title&&e.progressTracker.addTaskLine(t+1,n.title,n.priority||e.defaultPriority)}let t=n.telemetryData?.outputTokens||za(JSON.stringify(r)),i=n.telemetryData?.inputTokens||e.estimatedInputTokens;e.progressTracker.updateTokens(i,t,!1)}return{parsedTasks:r.tasks,estimatedOutputTokens:n.telemetryData?.outputTokens||za(JSON.stringify(r)),actualInputTokens:n.telemetryData?.inputTokens,telemetryData:n.telemetryData,usedFallback:!0}}throw Error(`Failed to generate tasks using generateObject fallback`)}function Ko(e,t,n,r){let i=null;if(r&&(i=r.getSummary(),r.cleanup()),e.usage&&t){let n=e.usage;t.usage||={promptTokens:n.promptTokens||0,completionTokens:n.completionTokens||0,totalTokens:n.totalTokens||0}}return{parsedTasks:e.parsedTasks,aiServiceResponse:t,estimatedInputTokens:e.actualInputTokens||n,estimatedOutputTokens:e.estimatedOutputTokens,usedFallback:e.usedFallback,progressTracker:r,summary:i}}async function qo(e,t,n){let r=new Sa(e.mcpLog,e.reportProgress);r.report(`Parsing PRD file: ${e.prdPath}, Force: ${e.force}, Append: ${e.append}, Research: ${e.research}`,`debug`);try{let{existingTasks:i,nextId:a}=Va(e.tasksPath,e.targetTag);Ha({existingTasks:i,targetTag:e.targetTag,append:e.append,force:e.force,isMCP:e.isMCP,logger:r});let o=await t(e,await Ka(e,Ba(e.prdPath),a),e.numTasks),s=ue(e.projectRoot)||`medium`,c=Ua(o.parsedTasks,a,i,s),l=e.append?[...i,...c]:c;return Ga(e.tasksPath,l,e.targetTag,r),await Jo(e,o,c,l,a,n),{success:!0,tasksPath:e.tasksPath,telemetryData:o.aiServiceResponse?.telemetryData,tagInfo:o.aiServiceResponse?.tagInfo}}catch(t){throw r.report(`Error parsing PRD: ${t.message}`,`error`),e.isMCP||(console.error(V.red(`Error: ${t.message}`)),L(e.projectRoot)&&console.error(t)),t}}async function Jo(e,t,n,r,i,a){let{aiServiceResponse:o,estimatedInputTokens:s,estimatedOutputTokens:c}=t;if(e.reportProgress){let t=o?.telemetryData&&(o.telemetryData.inputTokens>0||o.telemetryData.outputTokens>0),n;if(t){let e=o.telemetryData.totalCost||0,t=o.telemetryData.currency||`USD`;n=`✅ Task Generation Completed | Tokens (I/O): ${o.telemetryData.inputTokens}/${o.telemetryData.outputTokens} | Cost: ${t===`USD`?`$`:t}${e.toFixed(4)}`}else n=`✅ Task Generation Completed | ~Tokens (I/O): ${s}/${a?c:`unknown`} | Cost: ~$0.00`;await e.reportProgress({progress:e.numTasks,total:e.numTasks,message:n})}e.outputFormat===`text`&&!e.isMCP&&(a&&t.summary?await Ja({processedTasks:n,nextId:i,summary:t.summary,prdPath:e.prdPath,tasksPath:e.tasksPath,usedFallback:t.usedFallback,aiServiceResponse:o}):a||Ya({processedTasks:n,research:e.research,finalTasks:r,tasksPath:e.tasksPath,aiServiceResponse:o}))}async function Yo(e,t,n,r={}){return qo(new xa(e,t,n,r),Ao,!0)}async function Xo(e,t,n,r={}){return qo(new xa(e,t,n,r),Xa,!1)}async function Zo(e,t,n,r={}){let i=new xa(e,t,n,r);if(i.useStreaming)try{return await Yo(e,t,n,r)}catch(a){if(a instanceof ha||a.code===ga.NOT_ASYNC_ITERABLE||a.code===ga.STREAM_PROCESSING_FAILED||a.code===ga.STREAM_NOT_ITERABLE||_a.isTimeoutError(a)){let o=new Sa(i.mcpLog,i.reportProgress);return i.outputFormat===`text`&&!i.isMCP?console.log(V.yellow(`⚠️ Streaming operation ${a.message.includes(`timed out`)?`timed out`:`failed`}. Falling back to non-streaming mode...`)):o.report(`Streaming failed (${a.message}), falling back to non-streaming mode...`,`warn`),await Xo(e,t,n,r)}else throw a}else return await Xo(e,t,n,r)}var Qo=Zo;async function $o(e,t,n=!1,r=!1,i={}){let{projectRoot:a,tag:o}=i;try{I(`info`,`Removing subtask ${t}...`);let r=P(e,a,o);if(!r||!r.tasks)throw Error(`Invalid or missing tasks file at ${e}`);if(!t.includes(`.`))throw Error(`Invalid subtask ID format: ${t}. Expected format: "parentId.subtaskId"`);let[i,s]=t.split(`.`),c=parseInt(i,10),l=parseInt(s,10),u=r.tasks.find(e=>e.id===c);if(!u)throw Error(`Parent task with ID ${c} not found`);if(!u.subtasks||u.subtasks.length===0)throw Error(`Parent task ${c} has no subtasks`);let d=u.subtasks.findIndex(e=>e.id===l);if(d===-1)throw Error(`Subtask ${t} not found`);let f={...u.subtasks[d]};u.subtasks.splice(d,1),u.subtasks.length===0&&(u.subtasks=void 0);let p=null;if(n){I(`info`,`Converting subtask ${t} to a standalone task...`);let e=Math.max(...r.tasks.map(e=>e.id))+1;p={id:e,title:f.title,description:f.description||``,details:f.details||``,status:f.status||`pending`,dependencies:f.dependencies||[],priority:u.priority||`medium`},p.dependencies.includes(c)||p.dependencies.push(c),r.tasks.push(p),I(`info`,`Created new task ${e} from subtask ${t}`)}else I(`info`,`Subtask ${t} deleted`);return F(e,r,a,o),p}catch(e){throw I(`error`,`Error removing subtask: ${e.message}`),e}}var es=$o;function ts(e,t){if(typeof t==`string`&&t.includes(`.`)){let n=t.split(`.`);if(n.length!==2||!n[0]||!n[1]){let n=parseInt(t,10);return e.some(e=>e.id===n)}let[r,i]=n,a=parseInt(r,10),o=parseInt(i,10),s=e.find(e=>e.id===a);return s&&s.subtasks&&s.subtasks.some(e=>e.id===o)}let n=parseInt(t,10);return e.some(e=>e.id===n)}var ns=ts;async function rs(e,t,n={}){let{projectRoot:r,tag:i}=n,a={success:!0,messages:[],errors:[],removedTasks:[]},o=t.split(`,`).map(e=>e.trim()).filter(Boolean);if(o.length===0)return a.success=!1,a.errors.push(`No valid task IDs provided.`),a;try{let t=P(e,r,i);if(!t)throw Error(`Could not read tasks file at ${e}`);let n=t._rawTaggedData||t;if(!n[i]||!n[i].tasks)throw Error(`Tag '${i}' not found or has no tasks.`);let s=n[i].tasks,c=[];for(let e of o){if(!ns(s,e)){let t=`Task with ID ${e} in tag '${i}' not found or already removed.`;a.errors.push(t),a.success=!1;continue}try{if(typeof e==`string`&&e.includes(`.`)){let[t,n]=e.split(`.`).map(e=>parseInt(e,10)),r=s.find(e=>e.id===t);if(!r||!r.subtasks)throw Error(`Parent task ${t} or its subtasks not found for subtask ${e}`);let o=r.subtasks.findIndex(e=>e.id===n);if(o===-1)throw Error(`Subtask ${n} not found in parent task ${t}`);let c={...r.subtasks[o],parentTaskId:t};a.removedTasks.push(c),r.subtasks.splice(o,1),a.messages.push(`Successfully removed subtask ${e} from tag '${i}'`)}else{let t=parseInt(e,10),n=s.findIndex(e=>e.id===t);if(n===-1)throw Error(`Task with ID ${e} not found in tag '${i}'`);let r=s[n];a.removedTasks.push(r),c.push(t),s.splice(n,1),a.messages.push(`Successfully removed task ${e} from tag '${i}'`)}}catch(t){let n=`Error processing ID ${e}: ${t.message}`;a.errors.push(n),a.success=!1,I(`warn`,n)}}if(a.removedTasks.length>0){let t=new Set(o.map(e=>typeof e==`string`&&e.includes(`.`)?e:parseInt(e,10)));for(let e in n[i].tasks=s,n)Object.prototype.hasOwnProperty.call(n,e)&&n[e]&&n[e].tasks&&n[e].tasks.forEach(e=>{e.dependencies&&=e.dependencies.filter(e=>!t.has(e)),e.subtasks&&e.subtasks.forEach(n=>{n.dependencies&&=n.dependencies.filter(n=>!t.has(`${e.id}.${n}`)&&!t.has(n))})});F(e,n,r,i);for(let t of c){let n=H.join(H.dirname(e),`task_${t.toString().padStart(3,`0`)}.txt`);if(Fe.existsSync(n))try{Fe.unlinkSync(n),a.messages.push(`Deleted task file: ${n}`)}catch(e){let t=`Failed to delete task file ${n}: ${e.message}`;a.errors.push(t),a.success=!1,I(`warn`,t)}}}else a.errors.length===0&&a.messages.push(`No tasks found matching the provided IDs.`);let l=a.messages.join(`
|
|
757
|
+
`).start());try{n.report(`Calling AI service to generate tasks from PRD${e.research?` with research-backed analysis`:``}...`,`info`);let t=await i({role:e.research?`research`:`main`,session:e.session,projectRoot:e.projectRoot,schema:ba,objectName:`tasks_data`,systemPrompt:r,prompt:a,commandName:`parse-prd`,outputType:e.isMCP?`mcp`:`cli`}),c=null;if(t?.mainResult&&(typeof t.mainResult==`object`&&t.mainResult!==null&&`tasks`in t.mainResult?c=t.mainResult:typeof t.mainResult.object==`object`&&t.mainResult.object!==null&&`tasks`in t.mainResult.object&&(c=t.mainResult.object)),!c||!Array.isArray(c.tasks))throw Error(`AI service returned unexpected data structure after validation.`);return s&&s.succeed(`Tasks generated successfully!`),{parsedTasks:c.tasks,aiServiceResponse:t,estimatedInputTokens:o}}catch(e){throw s&&s.fail(`Error parsing PRD: ${e.message}`),e}}const[Za,Qa,$a]=Kr,eo=new Map;var to=class{constructor(e,t,n,r=null){this.name=e,this.levels=t,this.colors=n,this.thresholds=r}getColor(e){return this.colors[e]||B.muted}getLevelFromScore(e){if(!this.thresholds)throw Error(`${this.name} does not support score-based levels`);return e>=7?this.levels[0]:e<=3?this.levels[2]:this.levels[1]}};const no={cli:{filled:`●`,empty:`○`},statusBar:{high:`⋮`,medium:`:`,low:`.`},mcp:{high:`🔴`,medium:`🟠`,low:`🟢`}},ro=new to(`priority`,[Za,Qa,$a],{[Za]:V.red,[Qa]:V.yellow,[$a]:B.muted});function io(e,t){let n=no.cli.filled,r=no.cli.empty,i=``;for(let a=0;a<3;a++)a<e?i+=t(n):i+=B.text(r);return i}function ao(e,t){return 3-t.indexOf(e)}function oo(e,t){if(eo.has(e))return eo.get(e);let n=t();return eo.set(e,n),n}function so(){return oo(`mcp-priority-all`,()=>({[Za]:no.mcp.high,[Qa]:no.mcp.medium,[$a]:no.mcp.low}))}function co(){return oo(`cli-priority-all`,()=>{let e={};return ro.levels.forEach(t=>{e[t]=io(ao(t,ro.levels),ro.getColor(t))}),e})}function lo(){return oo(`statusbar-priority-all`,()=>{let e={};return ro.levels.forEach((t,n)=>{let r=n===0?no.statusBar.high:n===1?no.statusBar.medium:no.statusBar.low;e[t]=ro.getColor(t)(r)}),e})}function uo(){return{[Za]:ro.colors[Za],[Qa]:ro.colors[Qa],[$a]:ro.colors[$a]}}function fo(e=!1){return e?so():co()}function po(e,t=!1){let n=fo(t);return n[e]||n[Qa]}new to(`complexity`,[`high`,`medium`,`low`],{high:V.red,medium:V.yellow,low:V.green},{high:e=>e>=7,medium:e=>e>=4&&e<=6,low:e=>e<=3});const mo={clearOnComplete:!1,stopOnComplete:!0,hideCursor:!0,barsize:40},ho={shades_classic:qe.Presets.shades_classic,shades_grey:qe.Presets.shades_grey,rect:qe.Presets.rect,legacy:qe.Presets.legacy},go=new class{constructor(e={},t=ho.shades_classic){this.defaultOptions={...mo,...e},this.defaultPreset=t}createSingleBar(e={},t=null){let n=this._mergeConfig(e),r=t||this.defaultPreset;return new qe.SingleBar(n,r)}createMultiBar(e={},t=null){let n=this._mergeConfig(e),r=t||this.defaultPreset;return new qe.MultiBar(n,r)}_mergeConfig(e){return{...this.defaultOptions,...e}}setDefaultOptions(e){this.defaultOptions={...this.defaultOptions,...e}}setDefaultPreset(e){this.defaultPreset=e}};function _o(e={}){return go.createMultiBar(e)}var vo=class{constructor(e={}){this.numUnits=e.numUnits||1,this.unitName=e.unitName||`unit`,this.startTime=null,this.completedUnits=0,this.tokensIn=0,this.tokensOut=0,this.isEstimate=!0,this.bestAvgTimePerUnit=null,this.lastEstimateTime=null,this.lastEstimateSeconds=0,this.multibar=null,this.timeTokensBar=null,this.progressBar=null,this._timerInterval=null,this.isStarted=!1,this.isFinished=!1,this._initializeCustomProperties(e)}_initializeCustomProperties(e){}get unitNamePlural(){return`${this.unitName}s`}start(){this.isStarted||this.isFinished||(this.isStarted=!0,this.startTime=Date.now(),this.multibar=_o(),this.timeTokensBar=this.multibar.create(1,0,{},{format:this._getTimeTokensBarFormat(),barsize:1,hideCursor:!0,clearOnComplete:!1}),this.progressBar=this.multibar.create(this.numUnits,0,{},{format:this._getProgressBarFormat(),barCompleteChar:`█`,barIncompleteChar:`░`}),this._updateTimeTokensBar(),this.progressBar.update(0,{[this.unitNamePlural]:`0/${this.numUnits}`}),this._timerInterval=setInterval(()=>this._updateTimeTokensBar(),1e3),this._setupCustomUI())}_setupCustomUI(){}_getTimeTokensBarFormat(){return`{clock} {elapsed} | Tokens (I/O): {in}/{out} | Est: {remaining}`}_getProgressBarFormat(){return`${this.unitName.charAt(0).toUpperCase()+this.unitName.slice(1)}s {${this.unitNamePlural}} |{bar}| {percentage}%`}updateTokens(e,t,n=!1){this.tokensIn=e||0,this.tokensOut=t||0,this.isEstimate=n,this._updateTimeTokensBar()}_updateTimeTokensBar(){if(!this.timeTokensBar||this.isFinished)return;let e=this._formatElapsedTime(),t=this._estimateRemainingTime(),n=this.isEstimate?`~ Tokens (I/O)`:`Tokens (I/O)`;this.timeTokensBar.update(1,{clock:`⏱️`,elapsed:e,in:this.tokensIn,out:this.tokensOut,remaining:t,tokensLabel:n,...this._getCustomTimeTokensPayload()})}_getCustomTimeTokensPayload(){return{}}_formatElapsedTime(){if(!this.startTime)return`0m 00s`;let e=Math.floor((Date.now()-this.startTime)/1e3);return`${Math.floor(e/60)}m ${(e%60).toString().padStart(2,`0`)}s`}_estimateRemainingTime(){let e=this._getProgressFraction();if(e>=1)return`~0s`;let t=Date.now(),n=(t-this.startTime)/1e3;if(e===0)return`~calculating...`;let r=n/e;(this.bestAvgTimePerUnit===null||r<this.bestAvgTimePerUnit)&&(this.bestAvgTimePerUnit=r);let i=this.numUnits*(1-e),a=Math.ceil(i*this.bestAvgTimePerUnit);if(this.lastEstimateTime){let e=Math.floor((t-this.lastEstimateTime)/1e3),n=Math.max(0,this.lastEstimateSeconds-e);if(n===0)return`~0s`;a=Math.min(a,n)}return this.lastEstimateTime=t,this.lastEstimateSeconds=a,`~${this._formatDuration(a)}`}_getProgressFraction(){return this.completedUnits/this.numUnits}_formatDuration(e){if(e<60)return`${e}s`;let t=Math.floor(e/60),n=e%60;return t<60?n>0?`${t}m ${n}s`:`${t}m`:`${Math.floor(t/60)}h ${t%60}m`}getElapsedTime(){return this.startTime?Date.now()-this.startTime:0}stop(){this.isFinished||(this.isFinished=!0,this._timerInterval&&=(clearInterval(this._timerInterval),null),this.multibar&&(this._updateTimeTokensBar(),this.multibar.stop()),this.cleanup())}getSummary(){return{completedUnits:this.completedUnits,elapsedTime:this.getElapsedTime()}}cleanup(){if(this._timerInterval&&=(clearInterval(this._timerInterval),null),this.multibar){try{this.multibar.stop()}catch{}this.multibar=null}this.timeTokensBar=null,this.progressBar=null,this.isStarted=!1,this.isFinished=!0,this._performCustomCleanup()}_performCustomCleanup(){}},yo=class{constructor(e){if(!e)throw Error(`Multibar instance is required`);this.multibar=e}createBar(e,t={}){if(typeof e!=`string`)throw Error(`Format must be a string`);let n=this.multibar.create(1,1,{},{format:e,barsize:1,hideCursor:!0,clearOnComplete:!1});return n.update(1,t),n}createHeader(e,t){this.createBar(t),this.createBar(e),this.createBar(t)}createRow(e,t){if(!t||typeof t!=`object`)throw Error(`Payload must be an object`);return this.createBar(e,t)}createBorder(e){return this.createBar(e)}};function bo(e,t,n){new yo(e).createHeader(t,n)}function xo(e,t,n){new yo(e).createRow(t,n)}function So(e,t){new yo(e).createBorder(t)}co();const Co=lo();uo();const wo={DEBOUNCE_DELAY:100,MAX_TITLE_LENGTH:57,TRUNCATED_LENGTH:54,TASK_ID_PAD_START:3,TASK_ID_PAD_END:4,PRIORITY_PAD_END:3,VALID_PRIORITIES:[`high`,`medium`,`low`],DEFAULT_PRIORITY:`medium`};var To=class{constructor(e=wo.DEBOUNCE_DELAY){this.delay=e,this.pendingTimeout=null}debounce(e){this.clear(),this.pendingTimeout=setTimeout(()=>{e(),this.pendingTimeout=null},this.delay)}clear(){this.pendingTimeout&&=(clearTimeout(this.pendingTimeout),null)}hasPending(){return this.pendingTimeout!==null}},Eo=class{constructor(){this.priorities={high:0,medium:0,low:0}}increment(e){let t=this.normalize(e);return this.priorities[t]++,t}normalize(e){let t=e?e.toLowerCase():wo.DEFAULT_PRIORITY;return wo.VALID_PRIORITIES.includes(t)?t:wo.DEFAULT_PRIORITY}getCounts(){return{...this.priorities}}},Do=class{static formatTitle(e,t){return e?e.length>wo.MAX_TITLE_LENGTH?e.substring(0,wo.TRUNCATED_LENGTH)+`...`:e:`Task ${t}`}static formatPriority(e){return po(e,!1).padEnd(wo.PRIORITY_PAD_END,` `)}static formatTaskId(e){return e.toString().padStart(wo.TASK_ID_PAD_START,` `).padEnd(wo.TASK_ID_PAD_END,` `)}},Oo=class extends vo{_initializeCustomProperties(e){this.append=e.append,this.priorityManager=new Eo,this.debouncer=new To,this.headerShown=!1}_getTimeTokensBarFormat(){return`{clock} {elapsed} | ${Co.high} {high} ${Co.medium} {medium} ${Co.low} {low} | Tokens (I/O): {in}/{out} | Est: {remaining}`}_getProgressBarFormat(){return`Tasks {tasks} |{bar}| {percentage}%`}_getCustomTimeTokensPayload(){return this.priorityManager.getCounts()}addTaskLine(e,t,n=`medium`){if(!this.multibar||this.isFinished)return;this._ensureHeaderShown();let r=this._updateTaskCounters(e,n);this._updateTimeTokensBar(),this.debouncer.debounce(()=>{this._updateProgressDisplay(e,t,r)})}_ensureHeaderShown(){this.headerShown||(this.headerShown=!0,bo(this.multibar,` TASK | PRI | TITLE`,`------+-----+----------------------------------------------------------------`))}_updateTaskCounters(e,t){let n=this.priorityManager.increment(t);return this.completedUnits=e,n}_updateProgressDisplay(e,t,n){this.progressBar.update(this.completedUnits,{tasks:`${this.completedUnits}/${this.numUnits}`});let r=Do.formatTitle(t,e),i=Do.formatPriority(n),a=Do.formatTaskId(e);xo(this.multibar,` ${a} | ${i} | {title}`,{title:r}),So(this.multibar,`------+-----+----------------------------------------------------------------`),this._updateTimeTokensBar()}finish(){this.debouncer.hasPending()&&(this.debouncer.clear(),this._updateTimeTokensBar()),this.cleanup(),super.finish()}_performCustomCleanup(){this.debouncer.clear()}getSummary(){return{...super.getSummary(),taskPriorities:this.priorityManager.getCounts(),actionVerb:this.append?`appended`:`generated`}}};function ko(e={}){return new Oo(e)}async function Ao(e,t,n){let r=jo(e,t,n);await No(e,n,r.estimatedInputTokens);let i=await Po(e,t,e.streamingTimeout),{progressTracker:a,priorityMap:o}=await Fo(e,n),s=await Io(i.mainResult,e,t,n,a,o,r.defaultPriority,r.estimatedInputTokens,r.logger);if(Mo(s),s.usage&&e.projectRoot){let{logAiUsage:t}=await import(`./ai-services-unified-BwD4wh2J.js`),{getUserId:n}=await import(`./config-manager-BVc3Xro9.js`),a=n(e.projectRoot);if(a&&i.providerName&&i.modelId)try{let n=await t({userId:a,commandName:`parse-prd`,providerName:i.providerName,modelId:i.modelId,inputTokens:s.usage.promptTokens||0,outputTokens:s.usage.completionTokens||0,outputType:e.isMCP?`mcp`:`cli`});n&&(i.telemetryData=n)}catch(e){r.logger.report(`Failed to log telemetry: ${e.message}`,`debug`)}}return Ko(s,i,r.estimatedInputTokens,a)}function jo(e,t,n){let{systemPrompt:r,userPrompt:i}=t;return{logger:new Sa(e.mcpLog,e.reportProgress),estimatedInputTokens:za(r+i),defaultPriority:ue(e.projectRoot)||`medium`}}function Mo(e){if(e.parsedTasks.length===0)throw Error(`No tasks were generated from the PRD`)}async function No(e,t,n){e.reportProgress&&await e.reportProgress({progress:0,total:t,message:`Starting PRD analysis (Input: ${n} tokens)${e.research?` with research`:``}...`})}async function Po(e,n,r){let{systemPrompt:i,userPrompt:a}=n;return await _a.withTimeout(t({role:e.research?`research`:`main`,session:e.session,projectRoot:e.projectRoot,schema:ba,systemPrompt:i,prompt:a,commandName:`parse-prd`,outputType:e.isMCP?`mcp`:`cli`}),r,`Streaming operation`)}async function Fo(e,t){let n=fo(e.isMCP),r=null;if(e.outputFormat===`text`&&!e.isMCP){r=ko({numUnits:t,unitName:`task`,append:e.append});let n=e.research?Ee():xe(),i=ge(e.research?`research`:`main`);ja({prdFilePath:e.prdPath,outputPath:e.tasksPath,numTasks:t,append:e.append,research:e.research,force:e.force,existingTasks:[],nextId:1,model:n||`Default`,temperature:i?.temperature||.7}),r.start()}return{progressTracker:r,priorityMap:n}}async function Io(e,t,n,r,i,a,o,s,c){let{systemPrompt:l,userPrompt:u}=n,d={config:{...t,schema:ba},numTasks:r,progressTracker:i,priorityMap:a,defaultPriority:o,estimatedInputTokens:s,prompt:u,systemPrompt:l};try{let t={lastPartialObject:null,taskCount:0,estimatedOutputTokens:0,usage:null};if(await Lo(e.partialObjectStream,t,d),e.usage)try{t.usage=await e.usage}catch(e){c.report(`Failed to get usage data: ${e.message}`,`debug`)}return Vo(t,d)}catch(e){return c.report(`StreamObject processing failed: ${e.message}. Falling back to generateObject.`,`debug`),await Go(d,c)}}async function Lo(e,t,n){for await(let r of e)t.lastPartialObject=r,r&&(t.estimatedOutputTokens=za(JSON.stringify(r))),await Ro(r,t,n)}async function Ro(e,t,n){if(!e?.tasks||!Array.isArray(e.tasks))return;let r=e.tasks.length;r>t.taskCount?(await zo(e.tasks,t.taskCount,r,t.estimatedOutputTokens,n),t.taskCount=r):n.progressTracker&&t.estimatedOutputTokens>0&&n.progressTracker.updateTokens(n.estimatedInputTokens,t.estimatedOutputTokens,!0)}async function zo(e,t,n,r,i){for(let a=t;a<n;a++){let t=e[a]||{};t.title?await qa({task:t,currentCount:a+1,totalTasks:i.numTasks,estimatedTokens:r,progressTracker:i.progressTracker,reportProgress:i.config.reportProgress,priorityMap:i.priorityMap,defaultPriority:i.defaultPriority,estimatedInputTokens:i.estimatedInputTokens}):await Bo(a+1,r,i)}}async function Bo(e,t,n){let{progressTracker:r,config:i,numTasks:a,defaultPriority:o,estimatedInputTokens:s}=n;r&&(r.addTaskLine(e,`Generating task ${e}...`,o),r.updateTokens(s,t,!0)),i.reportProgress&&!r&&await i.reportProgress({progress:e,total:a,message:`Generating task ${e}/${a}...`})}async function Vo(e,t){let{lastPartialObject:n,estimatedOutputTokens:r,taskCount:i,usage:a}=e;if(!n?.tasks||!Array.isArray(n.tasks))throw Error(`No tasks generated from streamObject`);let o=a?.completionTokens||r,s=a?.promptTokens||t.estimatedInputTokens;return t.progressTracker&&await Ho(n.tasks,i,a?o:r,t,a?s:null),{parsedTasks:n.tasks,estimatedOutputTokens:o,actualInputTokens:s,usage:a,usedFallback:!1}}async function Ho(e,t,n,r,i=null){let{progressTracker:a,defaultPriority:o,estimatedInputTokens:s}=r;t>0?Uo(e,a,o):await Wo(e,n,r),a.updateTokens(i||s,n,!1),a.stop()}function Uo(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];i?.title&&t.addTaskLine(r+1,i.title,i.priority||n)}}async function Wo(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];i?.title&&await qa({task:i,currentCount:r+1,totalTasks:n.numTasks,estimatedTokens:t,progressTracker:n.progressTracker,reportProgress:n.config.reportProgress,priorityMap:n.priorityMap,defaultPriority:n.defaultPriority,estimatedInputTokens:n.estimatedInputTokens})}}async function Go(e,t){if(t.report(`Using generateObject fallback for PRD parsing`,`info`),e.progressTracker)for(let t=0;t<e.numTasks;t++)e.progressTracker.addTaskLine(t+1,`Generating task ${t+1}...`,e.defaultPriority),e.progressTracker.updateTokens(e.estimatedInputTokens,0,!0);let n=await i({role:e.config.research?`research`:`main`,commandName:`parse-prd`,prompt:e.prompt,systemPrompt:e.systemPrompt,schema:e.config.schema,outputFormat:e.config.outputFormat||`text`,projectRoot:e.config.projectRoot,session:e.config.session}),r=n?.mainResult||n;if(r&&Array.isArray(r.tasks)&&(r.tasks=r.tasks.map(e=>({...e,dependencies:e.dependencies??[],priority:e.priority??null,details:e.details??null,testStrategy:e.testStrategy??null}))),r&&Array.isArray(r.tasks)){if(e.progressTracker){for(let t=0;t<r.tasks.length;t++){let n=r.tasks[t];n&&n.title&&e.progressTracker.addTaskLine(t+1,n.title,n.priority||e.defaultPriority)}let t=n.telemetryData?.outputTokens||za(JSON.stringify(r)),i=n.telemetryData?.inputTokens||e.estimatedInputTokens;e.progressTracker.updateTokens(i,t,!1)}return{parsedTasks:r.tasks,estimatedOutputTokens:n.telemetryData?.outputTokens||za(JSON.stringify(r)),actualInputTokens:n.telemetryData?.inputTokens,telemetryData:n.telemetryData,usedFallback:!0}}throw Error(`Failed to generate tasks using generateObject fallback`)}function Ko(e,t,n,r){let i=null;if(r&&(i=r.getSummary(),r.cleanup()),e.usage&&t){let n=e.usage;t.usage||={promptTokens:n.promptTokens||0,completionTokens:n.completionTokens||0,totalTokens:n.totalTokens||0}}return{parsedTasks:e.parsedTasks,aiServiceResponse:t,estimatedInputTokens:e.actualInputTokens||n,estimatedOutputTokens:e.estimatedOutputTokens,usedFallback:e.usedFallback,progressTracker:r,summary:i}}async function qo(e,t,n){let r=new Sa(e.mcpLog,e.reportProgress);r.report(`Parsing PRD file: ${e.prdPath}, Force: ${e.force}, Append: ${e.append}, Research: ${e.research}`,`debug`);try{let{existingTasks:i,nextId:a}=Va(e.tasksPath,e.targetTag);Ha({existingTasks:i,targetTag:e.targetTag,append:e.append,force:e.force,isMCP:e.isMCP,logger:r});let o=await t(e,await Ka(e,Ba(e.prdPath),a),e.numTasks),s=ue(e.projectRoot)||`medium`,c=Ua(o.parsedTasks,a,i,s),l=e.append?[...i,...c]:c;return Ga(e.tasksPath,l,e.targetTag,r),await Jo(e,o,c,l,a,n),{success:!0,tasksPath:e.tasksPath,telemetryData:o.aiServiceResponse?.telemetryData,tagInfo:o.aiServiceResponse?.tagInfo}}catch(t){throw r.report(`Error parsing PRD: ${t.message}`,`error`),e.isMCP||(console.error(V.red(`Error: ${t.message}`)),L(e.projectRoot)&&console.error(t)),t}}async function Jo(e,t,n,r,i,a){let{aiServiceResponse:o,estimatedInputTokens:s,estimatedOutputTokens:c}=t;if(e.reportProgress){let t=o?.telemetryData&&(o.telemetryData.inputTokens>0||o.telemetryData.outputTokens>0),n;if(t){let e=o.telemetryData.totalCost||0,t=o.telemetryData.currency||`USD`;n=`✅ Task Generation Completed | Tokens (I/O): ${o.telemetryData.inputTokens}/${o.telemetryData.outputTokens} | Cost: ${t===`USD`?`$`:t}${e.toFixed(4)}`}else n=`✅ Task Generation Completed | ~Tokens (I/O): ${s}/${a?c:`unknown`} | Cost: ~$0.00`;await e.reportProgress({progress:e.numTasks,total:e.numTasks,message:n})}e.outputFormat===`text`&&!e.isMCP&&(a&&t.summary?await Ja({processedTasks:n,nextId:i,summary:t.summary,prdPath:e.prdPath,tasksPath:e.tasksPath,usedFallback:t.usedFallback,aiServiceResponse:o}):a||Ya({processedTasks:n,research:e.research,finalTasks:r,tasksPath:e.tasksPath,aiServiceResponse:o}))}async function Yo(e,t,n,r={}){return qo(new xa(e,t,n,r),Ao,!0)}async function Xo(e,t,n,r={}){return qo(new xa(e,t,n,r),Xa,!1)}async function Zo(e,t,n,r={}){let i=new xa(e,t,n,r);if(i.useStreaming)try{return await Yo(e,t,n,r)}catch(a){if(a instanceof ha||a.code===ga.NOT_ASYNC_ITERABLE||a.code===ga.STREAM_PROCESSING_FAILED||a.code===ga.STREAM_NOT_ITERABLE||_a.isTimeoutError(a)){let o=new Sa(i.mcpLog,i.reportProgress);return i.outputFormat===`text`&&!i.isMCP?console.log(V.yellow(`⚠️ Streaming operation ${a.message.includes(`timed out`)?`timed out`:`failed`}. Falling back to non-streaming mode...`)):o.report(`Streaming failed (${a.message}), falling back to non-streaming mode...`,`warn`),await Xo(e,t,n,r)}else throw a}else return await Xo(e,t,n,r)}var Qo=Zo;async function $o(e,t,n=!1,r=!1,i={}){let{projectRoot:a,tag:o}=i;try{I(`info`,`Removing subtask ${t}...`);let r=P(e,a,o);if(!r||!r.tasks)throw Error(`Invalid or missing tasks file at ${e}`);if(!t.includes(`.`))throw Error(`Invalid subtask ID format: ${t}. Expected format: "parentId.subtaskId"`);let[i,s]=t.split(`.`),c=parseInt(i,10),l=parseInt(s,10),u=r.tasks.find(e=>e.id===c);if(!u)throw Error(`Parent task with ID ${c} not found`);if(!u.subtasks||u.subtasks.length===0)throw Error(`Parent task ${c} has no subtasks`);let d=u.subtasks.findIndex(e=>e.id===l);if(d===-1)throw Error(`Subtask ${t} not found`);let f={...u.subtasks[d]};u.subtasks.splice(d,1),u.subtasks.length===0&&(u.subtasks=void 0);let p=null;if(n){I(`info`,`Converting subtask ${t} to a standalone task...`);let e=Math.max(...r.tasks.map(e=>e.id))+1;p={id:e,title:f.title,description:f.description||``,details:f.details||``,status:f.status||`pending`,dependencies:f.dependencies||[],priority:u.priority||`medium`},p.dependencies.includes(c)||p.dependencies.push(c),r.tasks.push(p),I(`info`,`Created new task ${e} from subtask ${t}`)}else I(`info`,`Subtask ${t} deleted`);return F(e,r,a,o),p}catch(e){throw I(`error`,`Error removing subtask: ${e.message}`),e}}var es=$o;function ts(e,t){if(typeof t==`string`&&t.includes(`.`)){let n=t.split(`.`);if(n.length!==2||!n[0]||!n[1]){let n=parseInt(t,10);return e.some(e=>e.id===n)}let[r,i]=n,a=parseInt(r,10),o=parseInt(i,10),s=e.find(e=>e.id===a);return s&&s.subtasks&&s.subtasks.some(e=>e.id===o)}let n=parseInt(t,10);return e.some(e=>e.id===n)}var ns=ts;async function rs(e,t,n={}){let{projectRoot:r,tag:i}=n,a={success:!0,messages:[],errors:[],removedTasks:[]},o=t.split(`,`).map(e=>e.trim()).filter(Boolean);if(o.length===0)return a.success=!1,a.errors.push(`No valid task IDs provided.`),a;try{let t=P(e,r,i);if(!t)throw Error(`Could not read tasks file at ${e}`);let n=t._rawTaggedData||t;if(!n[i]||!n[i].tasks)throw Error(`Tag '${i}' not found or has no tasks.`);let s=n[i].tasks,c=[];for(let e of o){if(!ns(s,e)){let t=`Task with ID ${e} in tag '${i}' not found or already removed.`;a.errors.push(t),a.success=!1;continue}try{if(typeof e==`string`&&e.includes(`.`)){let[t,n]=e.split(`.`).map(e=>parseInt(e,10)),r=s.find(e=>e.id===t);if(!r||!r.subtasks)throw Error(`Parent task ${t} or its subtasks not found for subtask ${e}`);let o=r.subtasks.findIndex(e=>e.id===n);if(o===-1)throw Error(`Subtask ${n} not found in parent task ${t}`);let c={...r.subtasks[o],parentTaskId:t};a.removedTasks.push(c),r.subtasks.splice(o,1),a.messages.push(`Successfully removed subtask ${e} from tag '${i}'`)}else{let t=parseInt(e,10),n=s.findIndex(e=>e.id===t);if(n===-1)throw Error(`Task with ID ${e} not found in tag '${i}'`);let r=s[n];a.removedTasks.push(r),c.push(t),s.splice(n,1),a.messages.push(`Successfully removed task ${e} from tag '${i}'`)}}catch(t){let n=`Error processing ID ${e}: ${t.message}`;a.errors.push(n),a.success=!1,I(`warn`,n)}}if(a.removedTasks.length>0){let t=new Set(o.map(e=>typeof e==`string`&&e.includes(`.`)?e:parseInt(e,10)));for(let e in n[i].tasks=s,n)Object.prototype.hasOwnProperty.call(n,e)&&n[e]&&n[e].tasks&&n[e].tasks.forEach(e=>{e.dependencies&&=e.dependencies.filter(e=>!t.has(e)),e.subtasks&&e.subtasks.forEach(n=>{n.dependencies&&=n.dependencies.filter(n=>!t.has(`${e.id}.${n}`)&&!t.has(n))})});F(e,n,r,i);for(let t of c){let n=H.join(H.dirname(e),`task_${t.toString().padStart(3,`0`)}.txt`);if(Fe.existsSync(n))try{Fe.unlinkSync(n),a.messages.push(`Deleted task file: ${n}`)}catch(e){let t=`Failed to delete task file ${n}: ${e.message}`;a.errors.push(t),a.success=!1,I(`warn`,t)}}}else a.errors.length===0&&a.messages.push(`No tasks found matching the provided IDs.`);let l=a.messages.join(`
|
|
757
758
|
`),u=a.errors.join(`
|
|
758
759
|
`);return{success:a.success,message:l||`No tasks were removed.`,error:u||null,removedTasks:a.removedTasks}}catch(e){return I(`error`,`Error removing tasks: ${e.message}`),{success:!1,message:``,error:`Operation failed: ${e.message}`,removedTasks:[]}}}var is=rs;Be.use(Ve({code:e=>e.split(`
|
|
759
760
|
`).map(e=>` `+V.cyan(e)).join(`
|
|
@@ -771,9 +772,9 @@ ${V.cyan(`1.`)} Run ${V.yellow(`taskgraph list`)} to view all tasks\n${V.cyan(`2
|
|
|
771
772
|
`);if(r.push(V.cyan(`Prompts: `)+V.yellow(i.toLocaleString())+B.muted(` (generated)`)+`
|
|
772
773
|
`+a),r.length>0){let e=G(r.join(`
|
|
773
774
|
|
|
774
|
-
`),{title:B.brand.bold(`Context Analysis`),titleAlignment:`left`,padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderStyle:`single`,borderColor:N});console.log(e)}}async function ss(e,t,n,r,i,a,o){let s=!1;try{let{readJSON:c}=await import(`./utils-
|
|
775
|
+
`),{title:B.brand.bold(`Context Analysis`),titleAlignment:`left`,padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderStyle:`single`,borderColor:N});console.log(e)}}async function ss(e,t,n,r,i,a,o){let s=!1;try{let{readJSON:c}=await import(`./utils-TcaEe7J5.js`);(await import(`./update-task-by-id-BE5BXLFS.js`)).default;let{updateSubtaskById:l}=await import(`./update-subtask-by-id-DuDsh3KN.js`),u=[{question:a,answer:o,type:`initial`,timestamp:new Date().toISOString()}];for(;;){let{action:a}=await Je.prompt([{type:`list`,name:`action`,message:`What would you like to do next?`,choices:[{name:`Ask a follow-up question`,value:`followup`},{name:`Save to file`,value:`savefile`},{name:`Save to task/subtask`,value:`save`},{name:`Quit`,value:`quit`}],pageSize:4}]);if(a===`quit`)break;if(a===`savefile`){await ls(u,r,t,i);continue}if(a===`save`){await cs(u,r,t,i)&&(s=!0);continue}if(a===`followup`){let{followUpQuery:r}=await Je.prompt([{type:`input`,name:`followUpQuery`,message:`Enter your follow-up question:`,validate:e=>!e||e.trim().length===0?`Please enter a valid question.`:!0}]);if(!r||r.trim().length===0)continue;console.log(`
|
|
775
776
|
`+B.muted(`─`.repeat(60))+`
|
|
776
|
-
`);let i=fs(u),a={...e,taskIds:[],customContext:i+(e.customContext?`\n\n--- Original Context ---\n${e.customContext}`:``)},o=await as(r.trim(),a,t,n,!1);u.push({question:r.trim(),answer:o.result,type:`followup`,timestamp:new Date().toISOString()})}}}catch(e){i.debug(`Follow-up questions not available: ${e.message}`)}return{interactiveSaveOccurred:s}}async function cs(e,t,n,r){try{let{readJSON:r}=await import(`./utils-
|
|
777
|
+
`);let i=fs(u),a={...e,taskIds:[],customContext:i+(e.customContext?`\n\n--- Original Context ---\n${e.customContext}`:``)},o=await as(r.trim(),a,t,n,!1);u.push({question:r.trim(),answer:o.result,type:`followup`,timestamp:new Date().toISOString()})}}}catch(e){i.debug(`Follow-up questions not available: ${e.message}`)}return{interactiveSaveOccurred:s}}async function cs(e,t,n,r){try{let{readJSON:r}=await import(`./utils-TcaEe7J5.js`),i=(await import(`./update-task-by-id-BE5BXLFS.js`)).default,{updateSubtaskById:a}=await import(`./update-subtask-by-id-DuDsh3KN.js`),{taskId:o}=await Je.prompt([{type:`input`,name:`taskId`,message:`Enter task ID (e.g., "15" for task or "15.2" for subtask):`,validate:e=>{if(!e||e.trim().length===0)return`Please enter a task ID.`;let t=e.trim();return/^\d+(\.\d+)?$/.test(t)?!0:`Invalid format. Use "15" for task or "15.2" for subtask.`}}]),s=o.trim(),c=ds(e),l=s.includes(`.`),u=H.join(t,`.taskgraph`,`tasks`,`tasks.json`);if(!W.existsSync(u)){console.log(V.red(`❌ Tasks file not found. Please run taskgraph init first.`));return}let d=r(u,t,n.tag);if(!d||!d.tasks){console.log(V.red(`❌ No valid tasks found.`));return}if(l){let[e,t]=s.split(`.`).map(e=>parseInt(e,10)),r=d.tasks.find(t=>t.id===e);if(!r){console.log(V.red(`❌ Parent task ${e} not found.`));return}if(!r.subtasks||!r.subtasks.find(e=>e.id===t)){console.log(V.red(`❌ Subtask ${s} not found.`));return}console.log(B.brand(`💾 Saving research conversation to subtask...`)),await a(u,s,c,!1,n,`text`),console.log(V.green(`✅ Research conversation saved to subtask ${s}`))}else{let e=parseInt(s,10);if(!d.tasks.find(t=>t.id===e)){console.log(V.red(`❌ Task ${s} not found.`));return}console.log(B.brand(`💾 Saving research conversation to task...`)),await i(u,e,c,!1,n,`text`,!0),console.log(V.green(`✅ Research conversation saved to task ${s}`))}return!0}catch(e){return console.log(V.red(`❌ Error saving conversation: ${e.message}`)),r.error(`Error saving conversation: ${e.message}`),!1}}async function ls(e,t,n,r){try{let n=H.join(t,`.taskgraph`,`docs`,`research`);W.existsSync(n)||W.mkdirSync(n,{recursive:!0});let i=e[0]?.question||`research-query`,a=`${new Date().toISOString().split(`T`)[0]}_${i.toLowerCase().replace(/[^a-z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).substring(0,50).replace(/^-+|-+$/g,``)}.md`,o=H.join(n,a),s=us(e,i);W.writeFileSync(o,s,`utf8`);let c=H.relative(t,o);return console.log(V.green(`✅ Research saved to: ${V.cyan(c)}`)),r.success(`Research conversation saved to ${c}`),o}catch(e){throw console.log(V.red(`❌ Error saving research file: ${e.message}`)),r.error(`Error saving research file: ${e.message}`),e}}function us(e,t){let n=new Date().toISOString(),r=`---
|
|
777
778
|
title: Research Session
|
|
778
779
|
query: "${t}"
|
|
779
780
|
date: ${new Date().toLocaleDateString()}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{o as e}from"./ai-services-unified-
|
|
1
|
+
import{o as e}from"./ai-services-unified-DhuS3c0f.js";import{At as t,Ct as n,Dt as r,Mt as i,Ot as a,Pt as o,Tt as s,j as c,jt as l,kt as u,nt as d,tt as f,wt as ee,xt as p}from"./config-manager-D2TQihpP.js";import{r as m}from"./git-utils-CrYiSKu0.js";import{a as h,dt as g}from"./dependency-manager-CcdzLwUF.js";import _ from"chalk";import*as v from"node:path";import y from"path";import*as b from"node:fs";import{execSync as x}from"child_process";import S from"fs";import{fileURLToPath as C}from"url";import w from"boxen";import T from"readline";import te from"figlet";import ne from"gradient-string";import re from"ora";import ie from"os";import{randomUUID as ae}from"crypto";const E=[`claude`];function D(e){return e.filter(e=>!O(e))}function O(e){return E.includes(e)}const k=`# Task files`,A=`tasks.json`,j=`tasks/`;function M(e){return e.trim().replace(/^#/,``).trim()}function N(e){let t=M(e);return t===A||t===j}function oe(e,t){return e.map(e=>{if(N(e)){let n=M(e),r=e.match(/\s*$/)[0];return t?`# ${n}${r}`:`${n}${r}`}return e})}function se(e){let t=[],n=!1;for(let r of e){if(r.trim()===k){n=!0;continue}N(r)||n&&!r.trim()||(n&&r.trim()&&!N(r)&&(n=!1),n||t.push(r))}return t}function ce(e,t){return e.filter(e=>{let n=e.trim();return!n||N(e)||n===k?!1:!t.has(n)})}function le(e){let t=[k];return e?t.push(`# ${A}`,`# ${j} `):t.push(A,`${j} `),t}function P(e){if(e.some(e=>e.trim())){let t=e[e.length-1];t&&t.trim()&&e.push(``)}}function ue(e,t,n){if(!e||typeof e!=`string`)throw Error(`targetPath must be a non-empty string`);if(!e.endsWith(`.gitignore`))throw Error(`targetPath must end with .gitignore`);if(!t||typeof t!=`string`)throw Error(`content must be a non-empty string`);if(typeof n!=`boolean`)throw Error(`storeTasksInGit must be a boolean`)}function de(e,t,n){try{S.writeFileSync(e,t.join(`
|
|
2
2
|
`)+`
|
|
3
3
|
`),typeof n==`function`&&n(`success`,`Created ${e} with full template`)}catch(t){throw typeof n==`function`&&n(`error`,`Failed to create ${e}: ${t.message}`),t}}function fe(e,t,n,r){try{let i=se(S.readFileSync(e,`utf8`).split(`
|
|
4
4
|
`)),a=ce(t,new Set(i.map(e=>e.trim()).filter(e=>e))),o=[...i];a.length>0&&(P(o),o.push(...a)),P(o),o.push(...le(n)),S.writeFileSync(e,o.join(`
|
|
@@ -3131,6 +3131,6 @@ ${r}
|
|
|
3131
3131
|
`)}`;S.writeFileSync(t,n),J(`success`,`Updated ${t} with additional entries`)}else J(`info`,`No new content to add to ${t}`);return}if(e===`README-taskgraph.md`){J(`info`,`${t} already exists`);let e=y.join(y.dirname(t),`README-taskgraph.md`);S.writeFileSync(e,r),J(`success`,`Created ${e} (preserved original README-taskgraph.md)`);return}J(`debug`,`${t} already exists, skipping.`);return}S.writeFileSync(t,r),J(`info`,`Created file: ${t}`)}async function lt(e={}){f()||q(),e.git===!0?e.initGit=!0:e.git===!1&&(e.initGit=!1),e.gitTasks===!0?e.storeTasksInGit=!0:e.gitTasks===!1&&(e.storeTasksInGit=!1);let t=e.yes||e.name&&e.description,n;if(n=e.rulesExplicitlyProvided?e.rules:[],t){f()||console.log(`SKIPPING PROMPTS - Using defaults or provided values`),e.name,e.description,e.version,e.author;let t=e.dryRun||!1,r=e.initGit===void 0?!0:e.initGit,i=e.storeTasksInGit===void 0?!0:e.storeTasksInGit;if(t)return J(`info`,`DRY RUN MODE: No files will be modified`),J(`info`,`Would initialize TaskGraph project`),J(`info`,`Would create/update necessary project files`),J(`info`,`${r?`Would initialize Git repository`:`Would skip Git initialization`}`),J(`info`,`${i?`Would store tasks in Git`:`Would exclude tasks from Git`}`),{dryRun:!0};await $(!0,r,i,t,{...e,preferredLanguage:`English`},n)}else{J(`debug`,`Required options not provided, proceeding with prompts.`);let t;try{J(`debug`,`Init started - taskgraph_id: ${ut()}`),t=T.createInterface({input:process.stdin,output:process.stdout});let r=!0,i=!0;r=e.initGit===void 0?(await Q(t,_.cyan(`Initialize a Git repository in project root? (Y/n): `),e=>{let t=e.trim().toLowerCase()!==`n`,n=t?_.green(`✓`):_.red(`✗`);return _.cyan(`Initialize a Git repository in project root?`)+` `+n+` `+_.dim(t?`Yes`:`No`)})).trim().toLowerCase()!==`n`:e.initGit,i=e.storeTasksInGit===void 0?(await Q(t,_.cyan(`Store tasks in Git (tasks.json and tasks/ directory)? (Y/n): `),e=>{let t=e.trim().toLowerCase()!==`n`,n=t?_.green(`✓`):_.red(`✗`);return _.cyan(`Store tasks in Git (tasks.json and tasks/ directory)?`)+` `+n+` `+_.dim(t?`Yes`:`No`)})).trim().toLowerCase()!==`n`:e.storeTasksInGit;let a=!1;e.rulesExplicitlyProvided?J(`info`,`Using rule profiles provided via command line: ${n.join(`, `)}`):a=(await Q(t,_.cyan(`Set up Claude Code integration (CLAUDE.md import)? (y/N): `),e=>{let t=e.trim().toLowerCase()===`y`,n=t?_.green(`✓`):_.red(`✗`);return _.cyan(`Set up Claude Code integration?`)+` `+n+` `+_.dim(t?`Yes`:`No`)})).trim().toLowerCase()===`y`;let o=(await Q(t,_.cyan(`Preferred response language (English): `))).trim()||`English`;console.log(`
|
|
3132
3132
|
`+_.bold(`TaskGraph Project Settings:`)),console.log(_.dim(`─`.repeat(50)));let s=a?_.green(`✓`):_.dim(`✗`);console.log(` `+_.dim(`Claude Code integration:`.padEnd(32)),s+` `+_.dim(a?`Yes`:`No`)),console.log(` `+_.dim(`Response language:`.padEnd(32)),p.text(o));let c=r?_.green(`✓`):_.dim(`✗`);console.log(` `+_.dim(`Initialize Git repository:`.padEnd(32)),c+` `+_.dim(r?`Yes`:`No`));let l=i?_.green(`✓`):_.dim(`✗`);if(console.log(` `+_.dim(`Store tasks in Git:`.padEnd(32)),l+` `+_.dim(i?`Yes`:`No`)),console.log(_.dim(`─`.repeat(50))),(await Q(t,_.yellow(`
|
|
3133
3133
|
Do you want to continue with these settings? (Y/n): `))).trim().toLowerCase()===`n`){t.close(),J(`info`,`Project initialization cancelled by user`),process.exit(0);return}let u=e.dryRun||!1;if(u)return J(`info`,`DRY RUN MODE: No files will be modified`),J(`info`,`Would initialize TaskGraph project`),J(`info`,`Would create/update necessary project files`),J(`info`,`${r?`Would initialize Git repository`:`Would skip Git initialization`}`),J(`info`,`${i?`Would store tasks in Git`:`Would exclude tasks from Git`}`),{dryRun:!0};await $(!0,r,i,u,{...e,shouldSetupRules:a,preferredLanguage:o},a?E:n),t.close()}catch(e){t&&t.close(),J(`error`,`Error during initialization process: ${e.message}`),process.exit(1)}}}function Q(e,t,n){return new Promise(r=>{e.question(t,e=>{T.moveCursor(process.stdout,0,-1),T.cursorTo(process.stdout,0),T.clearLine(process.stdout,0),n&&process.stdout.write(n(e)+`
|
|
3134
|
-
`),r(e)})})}function ut(){return ae()}function dt(e){try{if(!S.existsSync(e)){J(`warn`,`Config file does not exist, skipping storage configuration`);return}let t=S.readFileSync(e,`utf8`),n=JSON.parse(t);n.storage||={},n.storage.type=`file`,n.storage.operatingMode=`solo`,J(`debug`,`Configured storage for local file storage`),S.writeFileSync(e,JSON.stringify(n,null,2)),J(`debug`,`Storage configuration updated in config.json`)}catch(e){J(`error`,`Failed to update storage configuration: ${e.message}`)}}async function $(e,c,l,d,p,g=E){let v=process.cwd();J(`debug`,`Initializing project in ${v}`),Y(y.join(v,a)),Y(y.join(v,i)),Y(y.join(v,u)),Y(y.join(v,t)),Y(y.join(v,o)),ct(v);let b={year:new Date().getFullYear()};function S(e){let t=rt(e);t?it(v,t):J(`warn`,`Unknown rule profile: ${e}`)}Z(`env.example`,y.join(v,n),b),Z(`config.json`,y.join(v,r),{...b});let C=y.join(v,r);ot(C)?J(`debug`,`Updated config with correct maxTokens values`):J(`debug`,`Could not update maxTokens in config`),dt(C);try{let e=z(`gitignore`,`utf8`);pe(y.join(v,s),e,l,J)}catch(e){J(`error`,`Failed to create .gitignore: ${e.message}`)}Z(`example_prd.txt`,y.join(v,ee)),Z(`example_prd_rpg.txt`,y.join(v,o,`example_prd_rpg.txt`));try{c===!1?J(`info`,`Git initialization skipped due to --no-git flag.`):c===!0?m()?J(`debug`,`Existing Git repository detected – skipping git init despite --git flag.`):(J(`info`,`Initializing Git repository due to --git flag...`),x(`git init`,{cwd:v,stdio:`ignore`}),J(`success`,`Git repository initialized`)):m()?J(`debug`,`Existing Git repository detected – skipping git init.`):(J(`info`,`No Git repository detected. Initializing one in project root...`),x(`git init`,{cwd:v,stdio:`ignore`}),J(`success`,`Git repository initialized`))}catch{J(`warn`,`Git not available, skipping repository initialization`)}if(g.length>0){J(`info`,`Setting up Claude Code integration...`);for(let e of g)S(e)}e&&X();let T={cwd:v,stdio:`inherit`};if(f()&&(T.stdio=`ignore`,J(`info`,`Running npm install silently...`)),p.preferredLanguage&&!d)try{let e=(await import(`./response-language-
|
|
3134
|
+
`),r(e)})})}function ut(){return ae()}function dt(e){try{if(!S.existsSync(e)){J(`warn`,`Config file does not exist, skipping storage configuration`);return}let t=S.readFileSync(e,`utf8`),n=JSON.parse(t);n.storage||={},n.storage.type=`file`,n.storage.operatingMode=`solo`,J(`debug`,`Configured storage for local file storage`),S.writeFileSync(e,JSON.stringify(n,null,2)),J(`debug`,`Storage configuration updated in config.json`)}catch(e){J(`error`,`Failed to update storage configuration: ${e.message}`)}}async function $(e,c,l,d,p,g=E){let v=process.cwd();J(`debug`,`Initializing project in ${v}`),Y(y.join(v,a)),Y(y.join(v,i)),Y(y.join(v,u)),Y(y.join(v,t)),Y(y.join(v,o)),ct(v);let b={year:new Date().getFullYear()};function S(e){let t=rt(e);t?it(v,t):J(`warn`,`Unknown rule profile: ${e}`)}Z(`env.example`,y.join(v,n),b),Z(`config.json`,y.join(v,r),{...b});let C=y.join(v,r);ot(C)?J(`debug`,`Updated config with correct maxTokens values`):J(`debug`,`Could not update maxTokens in config`),dt(C);try{let e=z(`gitignore`,`utf8`);pe(y.join(v,s),e,l,J)}catch(e){J(`error`,`Failed to create .gitignore: ${e.message}`)}Z(`example_prd.txt`,y.join(v,ee)),Z(`example_prd_rpg.txt`,y.join(v,o,`example_prd_rpg.txt`));try{c===!1?J(`info`,`Git initialization skipped due to --no-git flag.`):c===!0?m()?J(`debug`,`Existing Git repository detected – skipping git init despite --git flag.`):(J(`info`,`Initializing Git repository due to --git flag...`),x(`git init`,{cwd:v,stdio:`ignore`}),J(`success`,`Git repository initialized`)):m()?J(`debug`,`Existing Git repository detected – skipping git init.`):(J(`info`,`No Git repository detected. Initializing one in project root...`),x(`git init`,{cwd:v,stdio:`ignore`}),J(`success`,`Git repository initialized`))}catch{J(`warn`,`Git not available, skipping repository initialization`)}if(g.length>0){J(`info`,`Setting up Claude Code integration...`);for(let e of g)S(e)}e&&X();let T={cwd:v,stdio:`inherit`};if(f()&&(T.stdio=`ignore`,J(`info`,`Running npm install silently...`)),p.preferredLanguage&&!d)try{let e=(await import(`./response-language-BnI8A8LS.js`)).default;e(p.preferredLanguage,{projectRoot:v,silent:!0}),J(`debug`,`Response language set to: ${p.preferredLanguage}`)}catch(e){J(`warn`,`Failed to set response language: ${e.message}`)}else f()&&!d?J(`debug`,`Skipping response language setup in silent (MCP) mode.`):d&&J(`debug`,`DRY RUN: Skipping response language setup.`);if(!f()&&!d&&!p?.yes){console.log(w(_.cyan(`Configuring AI Models...`),{padding:.5,margin:{top:1,bottom:.5},borderStyle:`round`,borderColor:`cyan`,width:60})),J(`info`,`Running interactive model setup. Please select your preferred AI models.`);try{x(`npx taskgraph models --setup`,{stdio:`inherit`,cwd:v}),J(`success`,`AI Models configured.`)}catch(e){J(`error`,`Failed to configure AI models:`,e.message),J(`warn`,`You may need to run "taskgraph models --setup" manually.`)}}else f()&&!d?(J(`info`,`Skipping interactive model setup in silent (MCP) mode.`),J(`warn`,`Please configure AI models using "taskgraph models --set-..." or the "models" MCP tool.`)):d?J(`info`,`DRY RUN: Skipping interactive model setup.`):p?.yes&&(J(`info`,`Skipping interactive model setup due to --yes flag.`),J(`info`,`Default AI models will be used. You can configure different models later using "taskgraph models --setup" or "taskgraph models --set-..." commands.`));if(e&&!d?(J(`debug`,`Adding shell aliases...`),X()&&J(`debug`,`Shell aliases added successfully`)):e&&d&&J(`debug`,`DRY RUN: Would add shell aliases (tm, taskgraph)`),f()||console.log(w(`${h.multiline(te.textSync(`Success!`,{font:`Standard`}))}\n${_.green(`Project initialized successfully!`)}`,{padding:1,margin:1,borderStyle:`double`,borderColor:`green`,width:60})),!f()){let e=at();console.log(w(_.yellow.bold(`Workflow
|
|
3135
3135
|
`)+`
|
|
3136
3136
|
`+e,{padding:1,margin:{top:0,bottom:1,left:0,right:0},borderStyle:`round`,borderColor:`yellow`,width:60}))}}export{E as n,D as r,lt as t};
|