@hhsw2015/task-master-ai 0.43.19 → 0.43.21
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-DMG5Q8bx.js +1 -0
- package/dist/{ai-services-unified-tvfkaOTr.js → ai-services-unified-J3Z8eo9y.js} +1 -1
- package/dist/{commands-BDy1-eeK.js → commands-9xhHELyf.js} +4 -4
- package/dist/{config-manager-B7h71nH_.js → config-manager-57pvK5mX.js} +1 -1
- package/dist/{config-manager-Cm3z1HZv.js → config-manager-D3ugsob_.js} +3 -3
- package/dist/{dependency-manager-CaRCB7TO.js → dependency-manager-Dwh3cC4X.js} +11 -8
- package/dist/mcp-server.js +2 -2
- package/dist/{profiles-DQcCVbeo.js → profiles-CpUmwSdZ.js} +2 -2
- package/dist/research-BtUi3AId.js +1 -0
- package/dist/response-language-BCbl5fh3.js +1 -0
- package/dist/{response-language-BnJvZzdq.js → response-language-Cp4oD4sy.js} +1 -1
- package/dist/{sentry-hPhwSfRH.js → sentry-DnvuCuW9.js} +1 -1
- package/dist/tag-management-ZSJf03XW.js +1 -0
- package/dist/{task-manager-SjuGBF9z.js → task-manager-DotikIcX.js} +1 -1
- package/dist/task-master.js +1 -1
- package/dist/update-subtask-by-id-oJfkukUc.js +1 -0
- package/dist/update-task-by-id-Cc8OTjRv.js +1 -0
- package/dist/{utils-ClsTocu1.js → utils-DdN5yigu.js} +1 -1
- package/package.json +1 -1
- package/dist/ai-services-unified-D56eIxmP.js +0 -1
- package/dist/research-C7BFO_sx.js +0 -1
- package/dist/response-language-BspVHfZg.js +0 -1
- package/dist/tag-management-D7V7ewib.js +0 -1
- package/dist/update-subtask-by-id-z0WhVh4e.js +0 -1
- package/dist/update-task-by-id-D6r8NE3N.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e,i as t,l as n,n as r,t as i}from"./ai-services-unified-
|
|
1
|
+
import{a as e,i as t,l as n,n as r,t as i}from"./ai-services-unified-J3Z8eo9y.js";import{$ as a,At as o,B as s,Bt as c,C as l,Ct as u,Dn as d,En as f,Jt as p,Kt as m,Lt as h,M as g,Mt as _,O as v,Ot as y,R as b,Rt as x,T as S,Tn as C,Tt as w,X as T,Xt as E,Y as D,Yt as O,Z as k,Zt as A,_ as j,_n as M,a as N,an as P,bt as ee,cn as te,ct as ne,dn as re,dt as ie,en as ae,et as F,fn as oe,ft as se,g as ce,gn as le,gt as ue,hn as de,ht as fe,i as pe,it as me,j as he,k as ge,kn as _e,kt as ve,ln as I,lt as ye,m as be,mn as xe,mt as Se,n as Ce,nn as we,o as Te,on as Ee,p as De,pn as Oe,pt as ke,q as Ae,rt as je,sn as Me,tt as Ne,un as Pe,ut as Fe,v as Ie,vn as Le,vt as L,w as Re,wn as ze,wt as Be,xn as R,y as Ve,yn as He,yt as z,z as Ue}from"./config-manager-D3ugsob_.js";import We,{resolve as Ge}from"node:path";import B from"chalk";import*as Ke from"fs";import V from"fs";import H from"path";import qe from"os";import Je from"node:fs";import{fileURLToPath as Ye}from"node:url";import Xe from"node:fs/promises";import Ze from"node:os";import{z as U}from"zod";import{spawn as Qe}from"child_process";import{fileURLToPath as $e}from"url";import{FastMCP as et}from"fastmcp";import{smoothStream as tt}from"ai";import W from"boxen";import nt from"readline";import{Command as G}from"commander";import rt from"figlet";import it from"gradient-string";import at from"terminal-link";import{marked as ot}from"marked";import{markedTerminal as st}from"marked-terminal";import ct from"turndown";import K from"cli-table3";import q from"inquirer";import J from"ora";import lt from"open";import ut,{Separator as dt}from"@inquirer/search";import ft from"process";import pt from"https";import mt from"cli-progress";import ht from"http";import gt from"fuse.js";import _t from"ajv";import vt from"ajv-formats";import yt from"gpt-tokens";import{LRUCache as bt}from"lru-cache";import"@streamparser/json";var xt=`@hhsw2015/task-master-ai`,St=`0.43.21`;function Ct(e,t,n){return(n?.color?B[n.color]:B.cyan)(at(e,t,{fallback:(e,t)=>`${e} (${t})`}))}function wt(e,t){return Ct(e,e,t)}const Tt=it([`#00b4d8`,`#0077b6`,`#03045e`]);function Et(){return process.env.TM_HIDE_BANNER===`true`}function Dt(){return process.stdout.columns||80}function Ot(e={}){if(Et())return;let{version:t}=e;try{let e=rt.textSync(`Task Master`,{font:`Standard`,horizontalLayout:`default`,verticalLayout:`default`});console.log(Tt(e))}catch{console.log(Tt(`=== Task Master ===`))}let n=Ct(`x.com/eyaltoledano`,`https://x.com/eyaltoledano`),r=B.dim(`by `)+B.cyan(n),i=t?t.replace(/^v/,``):``,a=`https://github.com/eyaltoledano/claude-task-master/releases/tag/task-master-ai%40${i}`,o=t?Ct(`v${i}`,a,{color:`gray`}):``;if(o){let e=i.length+1,t=Dt(),n=Math.max(2,t-22-e-2);console.log(r+` `.repeat(n)+o)}else console.log(r);let s=Ct(`tryhamster.com`,`https://tryhamster.com`);console.log(B.dim(`Taskmaster for teams: `)+B.magenta(s)),console.log(``)}function kt(){if(Et())return;try{let e=rt.textSync(`Task Master`,{font:`Standard`,horizontalLayout:`default`,verticalLayout:`default`});console.log(Tt(e))}catch{console.log(Tt(`=== Task Master ===`))}let e=Ct(`x.com/eyaltoledano`,`https://x.com/eyaltoledano`);console.log(B.dim(`by `)+B.cyan(e));let t=Ct(`tryhamster.com`,`https://tryhamster.com`);console.log(B.dim(`Taskmaster for teams: `)+B.magenta(t)),console.log(``)}function At(e){let{header:t,body:n,callToAction:r,footer:i,level:a=`warn`}=e,o=a===`info`?B.blue.bold:B.yellow.bold,s=a===`info`?`blue`:`yellow`,c=[o(t),...n.map(e=>B.white(e))];return r&&r.label&&r.action&&c.push(B.cyan(r.label)+`
|
|
2
2
|
`+B.blue.underline(r.action)),i&&c.push(B.gray(i)),W(c.join(`
|
|
3
3
|
|
|
4
4
|
`),{padding:1,borderColor:s,borderStyle:`round`,margin:{top:1,bottom:1}})}function jt(e,t=30,n){if(!n){let n=Math.round(e/100*t),r=t-n;return B.green(`█`).repeat(n)+B.gray(`░`).repeat(r)}let r=``,i=0;if(n.done&&n.done>0){let e=Math.round(n.done/100*t);e>0&&(r+=B.green(`█`).repeat(e),i+=e)}if(n.cancelled&&i<t){let e=Math.round(n.cancelled/100*t),a=Math.min(e,t-i);a>0&&(r+=B.gray(`█`).repeat(a),i+=a)}if(n.deferred&&i<t){let e=Math.round(n.deferred/100*t),a=Math.min(e,t-i);a>0&&(r+=B.gray(`█`).repeat(a),i+=a)}if(n[`in-progress`]&&i<t){let e=Math.round(n[`in-progress`]/100*t),a=Math.min(e,t-i);a>0&&(r+=B.blue(`█`).repeat(a),i+=a)}if(n.review&&i<t){let e=Math.round(n.review/100*t),a=Math.min(e,t-i);a>0&&(r+=B.magenta(`░`).repeat(a),i+=a)}if(n.pending&&i<t){let e=Math.round(n.pending/100*t),a=Math.min(e,t-i);a>0&&(r+=B.yellow(`░`).repeat(a),i+=a)}if(n.blocked&&i<t){let e=Math.round(n.blocked/100*t),a=Math.min(e,t-i);a>0&&(r+=B.red(`░`).repeat(a),i+=a)}return i<t&&(r+=B.yellow(`░`).repeat(t-i)),r}function Mt(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=>He(e.status)).length,t.completionPercentage=t.total>0?Math.round(t.completedCount/t.total*100):0,t}function Nt(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=>He(e.status)).length,t.completionPercentage=t.total>0?Math.round(t.completedCount/t.total*100):0,t}function Pt(e){let t=new Set(e.filter(e=>He(e.status)).map(e=>e.id)),n=e.filter(e=>!He(e.status)&&(!e.dependencies||e.dependencies.length===0)).length,r=e.filter(e=>!He(e.status)&&e.dependencies&&e.dependencies.length>0&&e.dependencies.every(e=>t.has(e))).length,i=e.filter(e=>!He(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 Ft(e){let t={critical:0,high:0,medium:0,low:0};return e.forEach(e=>{let n=e.priority||`medium`;t[n]++}),t}function It(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 Lt(e,t=!1){let n=[];t?n.push(`Completed: ${B.green(`${e.completedCount}/${e.total}`)}`):n.push(`Done: ${B.green(e.done)}`),n.push(`Cancelled: ${B.gray(e.cancelled)}`),n.push(`Deferred: ${B.gray(e.deferred)}`);let r=n.join(` `);n.length=0,n.push(`In Progress: ${B.blue(e.inProgress)}`),n.push(`Review: ${B.magenta(e.review||0)}`),n.push(`Pending: ${B.yellow(e.pending)}`),n.push(`Blocked: ${B.red(e.blocked)}`);let i=n.join(` `);return r+`
|
|
@@ -144,16 +144,19 @@ Tasks to Export
|
|
|
144
144
|
Team Invitations:`));for(let t of e)switch(t.status){case`sent`:console.log(B.green(` ${t.email}: Invitation sent`));break;case`already_member`:console.log(B.gray(` ${t.email}: Already a team member`));break;case`already_invited`:console.log(B.yellow(` ${t.email}: Already invited (pending)`));break;case`error`:case`failed`:console.log(B.red(` ${t.email}: ${t.error||`Failed to invite`}`));break}}}showInviteUrl(e){let t=e.match(/^(https?:\/\/[^/]+)\/home\/([^/]+)\/briefs\//);if(t){let[,e,n]=t,r=`${e}/home/${n}/members`;console.log(B.gray(` Invite teammates: `)+wt(r)+`
|
|
145
145
|
`)}}async setContextToBrief(e){try{if(!this.taskMasterCore)return;(await Zn(de.getInstance(),e,this.taskMasterCore)).success}catch{}}getStatusIcon(e){switch(e){case`done`:return B.green(`●`);case`in-progress`:case`in_progress`:return B.yellow(`◐`);case`blocked`:return B.red(`⊘`);default:return B.gray(`○`)}}getLastResult(){return this.lastResult}async cleanup(){}async getExportedTags(){let e=Z();if(!e)return{};let t=We.join(e,`.taskmaster`,`state.json`);try{let e=await Xe.readFile(t,`utf-8`);return JSON.parse(e).metadata?.exportedTags||{}}catch{return{}}}async sendInvitationsForBrief(e,t){if(!t.length||!this.taskMasterCore)return;let n=J(`Sending invitations...`).start();try{let e=(await this.taskMasterCore.auth.getContext())?.orgSlug;if(!e){n.fail(`Failed to send invitations: Organization context missing.`),console.error(B.red(`
|
|
146
146
|
Please ensure you have an organization selected (tm auth status).
|
|
147
|
-
`));return}let r=await this.taskMasterCore.integration.sendTeamInvitations(e,t,`member`);if(r.success&&r.invitations)n.succeed(`Invitations sent!`),this.displayInvitationResults(r.invitations);else{n.fail(`Failed to send invitations`);let e=r.error?.message||`Unknown error occurred`;console.error(B.red(`\n ${e}\n`))}}catch(e){n.fail(`Failed to send invitations`),console.error(B.red(`\n ${e.message}\n`))}}async trackExportedTag(e,t,n){let r=Z();if(!r)return;let i=We.join(r,`.taskmaster`,`state.json`);try{let r={};try{let e=await Xe.readFile(i,`utf-8`);r=JSON.parse(e)}catch{}r.metadata||={},r.metadata.exportedTags||(r.metadata.exportedTags={}),r.metadata.exportedTags[e]={briefId:t,briefUrl:n,exportedAt:new Date().toISOString()},r.lastUpdated=new Date().toISOString(),await Xe.writeFile(i,JSON.stringify(r,null,2),`utf-8`)}catch{}}static register(t,n){let r=new e(n);return t.addCommand(r),r}},hr=class e extends G{constructor(){super(`export-tag`),this.description(`Export a specific tag to Hamster (alias for: tm export --tag <tag>)`),this.argument(`<tag>`,`Name of the tag to export`),this.option(`--title <title>`,`Specify a title for the generated brief`),this.option(`--description <description>`,`Specify a description for the generated brief`),this.option(`--invite-emails <emails>`,`Invite collaborators with comma-separated emails (non-interactive)`),this.option(`-y, --yes`,`Skip interactive prompts and run non-interactively`),this.option(`--non-interactive`,`Force non-interactive mode (same as --yes)`),this.action(async(e,t)=>{await new mr().parseAsync([`node`,`export`,`--tag`,e,...t.title?[`--title`,t.title]:[],...t.description?[`--description`,t.description]:[],...t.inviteEmails?[`--invite-emails`,t.inviteEmails]:[],...t.yes?[`--yes`]:[],...t.nonInteractive?[`--non-interactive`]:[]])})}static register(t){let n=new e;return t.addCommand(n),n}},gr=class e extends G{taskMasterCore;lastResult;constructor(e){super(e||`sync`),this.description(`Sync local tasks to an existing Hamster brief`),this.addPushCommand(),this.action(async e=>{await this.executePush(e||{})})}addPushCommand(){this.command(`push`).description(`Push local tasks to an existing Hamster brief`).option(`--brief <briefOrUrl>`,`Target brief ID or Hamster brief URL (defaults to current context brief)`).option(`--tag <tag>`,`Local tag to sync (defaults to active tag)`).option(`-y, --yes`,`Skip interactive prompts and run non-interactively`).option(`--non-interactive`,`Force non-interactive mode (same as --yes)`).addHelpText(`after`,`
|
|
147
|
+
`));return}let r=await this.taskMasterCore.integration.sendTeamInvitations(e,t,`member`);if(r.success&&r.invitations)n.succeed(`Invitations sent!`),this.displayInvitationResults(r.invitations);else{n.fail(`Failed to send invitations`);let e=r.error?.message||`Unknown error occurred`;console.error(B.red(`\n ${e}\n`))}}catch(e){n.fail(`Failed to send invitations`),console.error(B.red(`\n ${e.message}\n`))}}async trackExportedTag(e,t,n){let r=Z();if(!r)return;let i=We.join(r,`.taskmaster`,`state.json`);try{let r={};try{let e=await Xe.readFile(i,`utf-8`);r=JSON.parse(e)}catch{}r.metadata||={},r.metadata.exportedTags||(r.metadata.exportedTags={}),r.metadata.exportedTags[e]={briefId:t,briefUrl:n,exportedAt:new Date().toISOString()},r.lastUpdated=new Date().toISOString(),await Xe.writeFile(i,JSON.stringify(r,null,2),`utf-8`)}catch{}}static register(t,n){let r=new e(n);return t.addCommand(r),r}},hr=class e extends G{constructor(){super(`export-tag`),this.description(`Export a specific tag to Hamster (alias for: tm export --tag <tag>)`),this.argument(`<tag>`,`Name of the tag to export`),this.option(`--title <title>`,`Specify a title for the generated brief`),this.option(`--description <description>`,`Specify a description for the generated brief`),this.option(`--invite-emails <emails>`,`Invite collaborators with comma-separated emails (non-interactive)`),this.option(`-y, --yes`,`Skip interactive prompts and run non-interactively`),this.option(`--non-interactive`,`Force non-interactive mode (same as --yes)`),this.action(async(e,t)=>{await new mr().parseAsync([`node`,`export`,`--tag`,e,...t.title?[`--title`,t.title]:[],...t.description?[`--description`,t.description]:[],...t.inviteEmails?[`--invite-emails`,t.inviteEmails]:[],...t.yes?[`--yes`]:[],...t.nonInteractive?[`--non-interactive`]:[]])})}static register(t){let n=new e;return t.addCommand(n),n}},gr=class e extends G{taskMasterCore;lastResult;constructor(e){super(e||`sync`),this.description(`Sync local tasks to an existing Hamster brief`),this.addPushCommand(),this.action(async e=>{await this.executePush(e||{})})}addPushCommand(){this.command(`push`).description(`Push local tasks to an existing Hamster brief`).option(`--brief <briefOrUrl>`,`Target brief ID or Hamster brief URL (defaults to current context brief)`).option(`--tag <tag>`,`Local tag to sync (defaults to active tag)`).option(`--mode <mode>`,`Sync mode: append (default) | replace`,`append`).option(`-y, --yes`,`Skip interactive prompts and run non-interactively`).option(`--non-interactive`,`Force non-interactive mode (same as --yes)`).addHelpText(`after`,`
|
|
148
148
|
Examples:
|
|
149
149
|
$ tm sync push --brief <brief-id-or-url>
|
|
150
150
|
$ tm sync push --brief <brief-id-or-url> --tag master_zh
|
|
151
|
+
$ tm sync push --mode replace --brief <brief-id-or-url>
|
|
151
152
|
$ tm sync push --yes --brief https://tryhamster.com/home/<org>/briefs/<id>
|
|
152
|
-
`).action(async e=>{await this.executePush(e)})}isNonInteractive(e){return!!(e?.yes||e?.nonInteractive)}async initializeServices(){this.taskMasterCore||=await I({projectPath:Z()})}async executePush(e){let t;try{let n=this.isNonInteractive(e),r=
|
|
153
|
+
`).action(async e=>{await this.executePush(e)})}isNonInteractive(e){return!!(e?.yes||e?.nonInteractive)}async initializeServices(){this.taskMasterCore||=await I({projectPath:Z()})}async executePush(e){let t;try{let n=this.isNonInteractive(e),r=this.resolveSyncMode(e.mode);if(!r){this.lastResult={success:!1,action:`cancelled`,message:`Invalid sync mode. Supported values: append, replace.`},console.error(B.red(`
|
|
154
|
+
Invalid sync mode. Supported values: append, replace.
|
|
155
|
+
`));return}let i=await pr({actionName:`sync local tasks to an existing Hamster brief`,skipConfirmation:n,nonInteractive:n});if(!i.authenticated){this.lastResult={success:!1,action:`cancelled`,message:i.error||(n?`Authentication required`:`User cancelled authentication`)},i.error&&console.error(B.red(`\n${i.error}\n`));return}await this.initializeServices();let a=await this.ensureTargetBrief(e,n);if(!a.success){this.lastResult={success:!1,action:`cancelled`,message:a.message||`No target brief selected`},a.message&&console.error(B.yellow(`\n${a.message}\n`));return}let o=this.taskMasterCore.auth.getContext();if(!o?.briefId||!o.orgId){this.lastResult={success:!1,action:`cancelled`,message:`Missing brief or organization context. Select a brief first with "tm context brief <url>".`},console.error(B.red(`
|
|
153
156
|
Missing brief or organization context. Select a brief first with "tm context brief <url>".
|
|
154
|
-
`));return}let
|
|
157
|
+
`));return}let s=e.tag||this.taskMasterCore.config.getActiveTag();if(!n){let{confirmed:e}=await q.prompt([{type:`confirm`,name:`confirmed`,message:r===`replace`?`Replace sync will delete existing tasks in brief "${o.briefName||o.briefId}" and import local tag "${s}". Continue?`:`Sync local tag "${s}" to brief "${o.briefName||o.briefId}"?`,default:!0}]);if(!e){this.lastResult={success:!1,action:`cancelled`,message:`Sync cancelled`},console.log(B.gray(`
|
|
155
158
|
Sync cancelled.
|
|
156
|
-
`));return}}t=J(`Syncing local tasks to Hamster brief...`).start();let
|
|
159
|
+
`));return}}t=J(`Syncing local tasks to Hamster brief...`).start();let c=await this.taskMasterCore.integration.exportTasks({briefId:o.briefId,orgId:o.orgId,tag:s,mode:r});if(c.success)t.succeed(`Synced ${c.taskCount} task(s)`),console.log(B.gray(` Brief: ${o.briefName||o.briefId}\n Tag: ${s}\n Mode: ${r}\n`)),this.lastResult={success:!0,action:`push`,briefId:o.briefId,tag:s,taskCount:c.taskCount,message:c.message};else{t.fail(`Sync failed`);let e=c.error?.message||`Unknown error occurred`;console.error(B.red(`\n${e}\n`)),this.lastResult={success:!1,action:`push`,briefId:o.briefId,tag:s,taskCount:0,message:e}}}catch(e){t?.isSpinning&&t.fail(`Sync failed`),X(e)}}resolveSyncMode(e){let t=(e||`append`).trim().toLowerCase();return t===`append`||t===`replace`?t:null}async ensureTargetBrief(e,t){if(!this.taskMasterCore)return{success:!1,message:`Task Master core is not initialized`};if(e.brief?.trim())return await Zn(de.getInstance(),e.brief.trim(),this.taskMasterCore),{success:!0};if(this.taskMasterCore.auth.getContext()?.briefId)return{success:!0};if(t)return{success:!1,message:`No brief selected. Provide --brief <brief-id-or-url> or run "tm context brief <brief-url>" first.`};let n=de.getInstance(),r=await Qn(n,{promptMessage:`Select an organization for sync:`,forceSelection:!1});if(!r.success||!r.orgId)return{success:!1,message:r.message||`Organization selection cancelled`};let i=await Xn(n,r.orgId);return!i.success||!i.briefId?{success:!1,message:i.message||`Brief selection cancelled`}:{success:!0}}getLastResult(){return this.lastResult}static register(t,n){let r=new e(n);return t.addCommand(r),r}};function _r(e){return[`add-dependency`,`remove-dependency`,`validate-dependencies`,`fix-dependencies`].includes(e)?{header:`Hamster Manages Dependencies`,getBody:e=>[`Hamster handles dependencies for the ${B.blue(`"${e}"`)} Brief.`,`To manage dependencies manually, log out with ${B.cyan(`tm auth logout`)} and work locally.`],footer:`Switch between local and remote workflows anytime by logging in/out.`}:e===`clear-subtasks`?{header:`Hamster Manages Subtasks`,getBody:e=>[`Hamster handles subtask management for the ${B.blue(`"${e}"`)} Brief.`,`To manage subtasks manually, log out with ${B.cyan(`tm auth logout`)} and work locally.`],footer:`Switch between local and remote workflows anytime by logging in/out.`}:e===`models`?{header:`Hamster Manages AI Models`,getBody:e=>[`Hamster configures AI models automatically for the ${B.blue(`"${e}"`)} Brief.`,`To configure models manually, log out with ${B.cyan(`tm auth logout`)} and work locally.`],footer:`Switch between local and remote workflows anytime by logging in/out.`}:{header:`Command Not Available in Hamster`,getBody:t=>[`The ${B.cyan(e)} command is managed by Hamster for the ${B.blue(`"${t}"`)} Brief.`,`To use this command, log out with ${B.cyan(`tm auth logout`)} and work locally.`],footer:`Switch between local and remote workflows anytime by logging in/out.`}}async function vr(e,t){let n=typeof t==`string`?await I({projectPath:t}):t,r=await n.auth.guardCommand(e,n.tasks.getStorageType());if(r.isBlocked){let t=_r(e),n=r.briefName||`remote brief`;return console.log(At({header:t.header,body:t.getBody(n),footer:t.footer,level:`info`})),!0}return!1}function yr(){let e=ft.env.TM_PUBLIC_VERSION;return e&&e!==`unknown`?e:(console.warn(`Could not read version from TM_PUBLIC_VERSION, using fallback`),`0.0.0`)}function br(e,t){let n=e=>{let[t,n=``]=e.split(`-`,2);return{nums:t.split(`.`).map(e=>Number.parseInt(e,10)||0),pre:n}},r=n(e),i=n(t),a=Math.max(r.nums.length,i.nums.length);for(let e=0;e<a;e++){let t=(r.nums[e]||0)-(i.nums[e]||0);if(t!==0)return t<0?-1:1}return r.pre&&!i.pre?-1:!r.pre&&i.pre?1:r.pre===i.pre?0:r.pre<i.pre?-1:1}async function xr(e){return new Promise(t=>{let n={hostname:`raw.githubusercontent.com`,path:`/eyaltoledano/claude-task-master/main/CHANGELOG.md`,method:`GET`,headers:{"User-Agent":`task-master-ai/${e}`}},r=pt.request(n,n=>{let r=``;n.on(`data`,e=>{r+=e}),n.on(`end`,()=>{try{if(n.statusCode!==200){t([]);return}t(Sr(r,e))}catch{t([])}})});r.on(`error`,()=>{t([])}),r.setTimeout(3e3,()=>{r.destroy(),t([])}),r.end()})}function Sr(e,t){try{if(!/^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/.test(t))return[];let n=RegExp(`## ${t.replace(/\./g,`\\.`)}\\s*\\n`,`i`),r=e.match(n);if(!r)return[];let i=r.index+r[0].length,a=e.indexOf(`
|
|
157
160
|
## `,i),o=(a>0?e.slice(i,a):e.slice(i)).match(/### Minor Changes\s*\n([\s\S]*?)(?=\n###|\n##|$)/i);if(!o)return[];let s=o[1],c=[],l=/^-\s+\[#\d+\][^\n]*?!\s+-\s+(.+?)$/gm,u;for(;(u=l.exec(s))!==null;){let e=u[1].trim();c.push(e)}return c}catch{return[]}}const Cr=()=>We.join(Ze.tmpdir(),`taskmaster-update-cache.json`);function wr(){try{let e=Cr();if(!Je.existsSync(e))return null;let t=JSON.parse(Je.readFileSync(e,`utf-8`));return Date.now()-t.timestamp>36e5?null:t}catch{return null}}function Tr(e,t){try{Je.writeFileSync(Cr(),JSON.stringify({timestamp:Date.now(),latestVersion:e,highlights:t},null,2))}catch{}}function Er(e){return new Promise(t=>{let n=pt.request({hostname:`registry.npmjs.org`,path:`/task-master-ai`,method:`GET`,headers:{Accept:`application/vnd.npm.install-v1+json`,"User-Agent":`task-master-ai/${e}`}},e=>{let n=``;e.on(`data`,e=>n+=e),e.on(`end`,()=>{try{if(e.statusCode!==200){t(null);return}t(JSON.parse(n)[`dist-tags`]?.latest||null)}catch{t(null)}})});n.on(`error`,()=>t(null)),n.setTimeout(3e3,()=>{n.destroy(),t(null)}),n.end()})}function Dr(e,t,n){return{currentVersion:e,latestVersion:t,needsUpdate:br(e,t)<0,highlights:n}}async function Or(e){let t=e||yr(),n=wr();if(n)return Dr(t,n.latestVersion,n.highlights);let r=await Er(t);if(!r)return Dr(t,t);let i=br(t,r)<0?await xr(r):void 0;return Tr(r,i),Dr(t,r,i)}function kr(e,t,n){let r=`${B.blue.bold(`Update Available!`)} ${B.dim(e)} → ${B.green(t)}`;if(n&&n.length>0){r+=`
|
|
158
161
|
|
|
159
162
|
`+B.bold(`What's New:`);for(let e of n)r+=`
|
|
@@ -950,7 +953,7 @@ ${B.cyan(`1.`)} Run ${B.yellow(`task-master next`)} to see what to work on next\
|
|
|
950
953
|
${B.cyan(`1.`)} Run ${B.yellow(`task-master list`)} to view all tasks\n${B.cyan(`2.`)} Run ${B.yellow(`task-master expand --id=<id>`)} to break down a task into subtasks\n${B.cyan(`3.`)} Run ${B.yellow(`task-master analyze-complexity`)} to analyze task complexity`;console.log(W(e,ns.nextSteps))}function hs(e){return Math.ceil(e.length/4)}function gs(e){let t=V.readFileSync(e,`utf8`);if(!t)throw Error(`Input file ${e} is empty or could not be read.`);return t}function _s(e,t){let n=[],r=1;if(!V.existsSync(e))return{existingTasks:n,nextId:r};try{let i=V.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 vs({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(B.red(n)),process.exit(1)}a.report(`Force flag enabled. Overwriting existing tasks in tag '${t}'.`,`debug`)}function ys(e,t,n,r){bs(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&&(ie(n,t)||o.some(e=>e.id===t)))}),o}function bs(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 xs(e,t,n,r){let i=H.dirname(e);V.existsSync(i)||V.mkdirSync(i,{recursive:!0});let a={};if(V.existsSync(e))try{let t=V.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`}},ne(a[n],{description:`Tasks for ${n} context`}),V.writeFileSync(e,JSON.stringify(a,null,2)),r.report(`Successfully saved ${t.length} tasks to ${e}`,`debug`)}async function Ss(e,t,n){let r=Pa(),i=ce(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({command:`parse-prd`,prdContent:t,numTasks:e.numTasks}),projectRoot:e.projectRoot||``})}async function Cs({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 ws({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`})();fs({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 qo.withSoftTimeout(o.mainResult.usage,1e3,void 0),kl(o.telemetryData,`cli`))}function Ts({processedTasks:e,research:t,finalTasks:n,tasksPath:r,aiServiceResponse:i}){console.log(W(B.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(W(B.white.bold(`Next Steps:`)+`
|
|
951
954
|
|
|
952
955
|
${B.cyan(`1.`)} Run ${B.yellow(`task-master list`)} to view all tasks\n${B.cyan(`2.`)} Run ${B.yellow(`task-master expand --id=<id>`)} to break down a task into subtasks`,{padding:1,borderColor:`cyan`,borderStyle:`round`,margin:{top:1}})),i?.telemetryData&&kl(i.telemetryData,`cli`)}async function Es(e,t){let n=new Qo(e.mcpLog,e.reportProgress),{systemPrompt:r,userPrompt:a}=t,o=hs(r+a),s=null;e.outputFormat===`text`&&!e.isMCP&&(s=J(`Parsing PRD and generating tasks...
|
|
953
|
-
`).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:Xo,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[Ds,Os,ks]=aa,As=new Map;var js=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.gray}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 Ms={cli:{filled:`●`,empty:`○`},statusBar:{high:`⋮`,medium:`:`,low:`.`},mcp:{high:`🔴`,medium:`🟠`,low:`🟢`}},Ns=new js(`priority`,[Ds,Os,ks],{[Ds]:B.hex(`#CC0000`),[Os]:B.hex(`#FF8800`),[ks]:B.yellow});function Ps(e,t){let n=Ms.cli.filled,r=Ms.cli.empty,i=``;for(let a=0;a<3;a++)a<e?i+=t(n):i+=B.white(r);return i}function Fs(e,t){return 3-t.indexOf(e)}function Is(e,t){if(As.has(e))return As.get(e);let n=t();return As.set(e,n),n}function Ls(){return Is(`mcp-priority-all`,()=>({[Ds]:Ms.mcp.high,[Os]:Ms.mcp.medium,[ks]:Ms.mcp.low}))}function Rs(){return Is(`cli-priority-all`,()=>{let e={};return Ns.levels.forEach(t=>{e[t]=Ps(Fs(t,Ns.levels),Ns.getColor(t))}),e})}function zs(){return Is(`statusbar-priority-all`,()=>{let e={};return Ns.levels.forEach((t,n)=>{let r=n===0?Ms.statusBar.high:n===1?Ms.statusBar.medium:Ms.statusBar.low;e[t]=Ns.getColor(t)(r)}),e})}function Bs(){return{[Ds]:Ns.colors[Ds],[Os]:Ns.colors[Os],[ks]:Ns.colors[ks]}}function Vs(e=!1){return e?Ls():Rs()}function Hs(e,t=!1){let n=Vs(t);return n[e]||n[Os]}new js(`complexity`,[`high`,`medium`,`low`],{high:B.hex(`#CC0000`),medium:B.hex(`#FF8800`),low:B.green},{high:e=>e>=7,medium:e=>e>=4&&e<=6,low:e=>e<=3});const Us={clearOnComplete:!1,stopOnComplete:!0,hideCursor:!0,barsize:40},Ws={shades_classic:mt.Presets.shades_classic,shades_grey:mt.Presets.shades_grey,rect:mt.Presets.rect,legacy:mt.Presets.legacy},Gs=new class{constructor(e={},t=Ws.shades_classic){this.defaultOptions={...Us,...e},this.defaultPreset=t}createSingleBar(e={},t=null){let n=this._mergeConfig(e),r=t||this.defaultPreset;return new mt.SingleBar(n,r)}createMultiBar(e={},t=null){let n=this._mergeConfig(e),r=t||this.defaultPreset;return new mt.MultiBar(n,r)}_mergeConfig(e){return{...this.defaultOptions,...e}}setDefaultOptions(e){this.defaultOptions={...this.defaultOptions,...e}}setDefaultPreset(e){this.defaultPreset=e}};function Ks(e={}){return Gs.createMultiBar(e)}var qs=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=Ks(),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(){}},Js=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 Ys(e,t,n){new Js(e).createHeader(t,n)}function Xs(e,t,n){new Js(e).createRow(t,n)}function Zs(e,t){new Js(e).createBorder(t)}Rs();const Qs=zs();Bs();const $s={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 ec=class{constructor(e=$s.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}},tc=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():$s.DEFAULT_PRIORITY;return $s.VALID_PRIORITIES.includes(t)?t:$s.DEFAULT_PRIORITY}getCounts(){return{...this.priorities}}},nc=class{static formatTitle(e,t){return e?e.length>$s.MAX_TITLE_LENGTH?e.substring(0,$s.TRUNCATED_LENGTH)+`...`:e:`Task ${t}`}static formatPriority(e){return Hs(e,!1).padEnd($s.PRIORITY_PAD_END,` `)}static formatTaskId(e){return e.toString().padStart($s.TASK_ID_PAD_START,` `).padEnd($s.TASK_ID_PAD_END,` `)}},rc=class extends qs{_initializeCustomProperties(e){this.append=e.append,this.priorityManager=new tc,this.debouncer=new ec,this.headerShown=!1}_getTimeTokensBarFormat(){return`{clock} {elapsed} | ${Qs.high} {high} ${Qs.medium} {medium} ${Qs.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,Ys(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=nc.formatTitle(t,e),i=nc.formatPriority(n),a=nc.formatTaskId(e);Xs(this.multibar,` ${a} | ${i} | {title}`,{title:r}),Zs(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 ic(e={}){return new rc(e)}async function ac(e,t,n){let r=oc(e,t,n);await cc(e,n,r.estimatedInputTokens);let i=await lc(e,t,e.streamingTimeout),{progressTracker:a,priorityMap:o}=await uc(e,n),s=await dc(i.mainResult,e,t,n,a,o,r.defaultPriority,r.estimatedInputTokens,r.logger);if(sc(s),s.usage&&e.projectRoot){let{logAiUsage:t}=await import(`./ai-services-unified-D56eIxmP.js`),{getUserId:n}=await import(`./config-manager-B7h71nH_.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 xc(s,i,r.estimatedInputTokens,a)}function oc(e,t,n){let{systemPrompt:r,userPrompt:i}=t;return{logger:new Qo(e.mcpLog,e.reportProgress),estimatedInputTokens:hs(r+i),defaultPriority:ce(e.projectRoot)||`medium`}}function sc(e){if(e.parsedTasks.length===0)throw Error(`No tasks were generated from the PRD`)}async function cc(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 lc(e,n,r){let{systemPrompt:i,userPrompt:a}=n;return await qo.withTimeout(t({role:e.research?`research`:`main`,session:e.session,projectRoot:e.projectRoot,schema:Xo,systemPrompt:i,prompt:a,commandName:`parse-prd`,outputType:e.isMCP?`mcp`:`cli`}),r,`Streaming operation`)}async function uc(e,t){let n=Vs(e.isMCP),r=null;if(e.outputFormat===`text`&&!e.isMCP){r=ic({numUnits:t,unitName:`task`,append:e.append});let n=e.research?he():l(),i=v(e.research?`research`:`main`);ss({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 dc(e,t,n,r,i,a,o,s,c){let{systemPrompt:l,userPrompt:u}=n,d={config:{...t,schema:Xo},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 fc(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 gc(t,d)}catch(e){return c.report(`StreamObject processing failed: ${e.message}. Falling back to generateObject.`,`debug`),await bc(d,c)}}async function fc(e,t,n){for await(let r of e)t.lastPartialObject=r,r&&(t.estimatedOutputTokens=hs(JSON.stringify(r))),await pc(r,t,n)}async function pc(e,t,n){if(!e?.tasks||!Array.isArray(e.tasks))return;let r=e.tasks.length;r>t.taskCount?(await mc(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 mc(e,t,n,r,i){for(let a=t;a<n;a++){let t=e[a]||{};t.title?await Cs({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 hc(a+1,r,i)}}async function hc(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 gc(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 _c(n.tasks,i,a?o:r,t,a?s:null),{parsedTasks:n.tasks,estimatedOutputTokens:o,actualInputTokens:s,usage:a,usedFallback:!1}}async function _c(e,t,n,r,i=null){let{progressTracker:a,defaultPriority:o,estimatedInputTokens:s}=r;t>0?vc(e,a,o):await yc(e,n,r),a.updateTokens(i||s,n,!1),a.stop()}function vc(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 yc(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];i?.title&&await Cs({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 bc(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||hs(JSON.stringify(r)),i=n.telemetryData?.inputTokens||e.estimatedInputTokens;e.progressTracker.updateTokens(i,t,!1)}return{parsedTasks:r.tasks,estimatedOutputTokens:n.telemetryData?.outputTokens||hs(JSON.stringify(r)),actualInputTokens:n.telemetryData?.inputTokens,telemetryData:n.telemetryData,usedFallback:!0}}throw Error(`Failed to generate tasks using generateObject fallback`)}function xc(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 Sc(e,t,n){let r=new Qo(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}=_s(e.tasksPath,e.targetTag);vs({existingTasks:i,targetTag:e.targetTag,append:e.append,force:e.force,isMCP:e.isMCP,logger:r});let o=await t(e,await Ss(e,gs(e.prdPath),a),e.numTasks),s=ce(e.projectRoot)||`medium`,c=ys(o.parsedTasks,a,i,s),l=e.append?[...i,...c]:c;return xs(e.tasksPath,l,e.targetTag,r),await Cc(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(B.red(`Error: ${t.message}`)),be(e.projectRoot)&&console.error(t)),t}}async function Cc(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 ws({processedTasks:n,nextId:i,summary:t.summary,prdPath:e.prdPath,tasksPath:e.tasksPath,usedFallback:t.usedFallback,aiServiceResponse:o}):a||Ts({processedTasks:n,research:e.research,finalTasks:r,tasksPath:e.tasksPath,aiServiceResponse:o}))}async function wc(e,t,n,r={}){return Sc(new Zo(e,t,n,r),ac,!0)}async function Tc(e,t,n,r={}){return Sc(new Zo(e,t,n,r),Es,!1)}async function Ec(e,t,n,r={}){let i=new Zo(e,t,n,r);if(i.useStreaming)try{return await wc(e,t,n,r)}catch(a){if(a instanceof Go||a.code===Ko.NOT_ASYNC_ITERABLE||a.code===Ko.STREAM_PROCESSING_FAILED||a.code===Ko.STREAM_NOT_ITERABLE||qo.isTimeoutError(a)){let o=new Qo(i.mcpLog,i.reportProgress);return i.outputFormat===`text`&&!i.isMCP?console.log(B.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 Tc(e,t,n,r)}else throw a}else return await Tc(e,t,n,r)}var Dc=Ec;async function Oc(e,t,n=!1,r=!1,i={}){let{projectRoot:a,tag:o}=i;try{z(`info`,`Removing subtask ${t}...`);let r=w(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){z(`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),z(`info`,`Created new task ${e} from subtask ${t}`)}else z(`info`,`Subtask ${t} deleted`);return _(e,r,a,o),p}catch(e){throw z(`error`,`Error removing subtask: ${e.message}`),e}}var kc=Oc;function Ac(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 jc=Ac;async function Mc(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=w(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(!jc(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,z(`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))})});_(e,n,r,i);for(let t of c){let n=H.join(H.dirname(e),`task_${t.toString().padStart(3,`0`)}.txt`);if(Ke.existsSync(n))try{Ke.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,z(`warn`,t)}}}else a.errors.length===0&&a.messages.push(`No tasks found matching the provided IDs.`);let l=a.messages.join(`
|
|
956
|
+
`).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:Xo,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[Ds,Os,ks]=aa,As=new Map;var js=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.gray}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 Ms={cli:{filled:`●`,empty:`○`},statusBar:{high:`⋮`,medium:`:`,low:`.`},mcp:{high:`🔴`,medium:`🟠`,low:`🟢`}},Ns=new js(`priority`,[Ds,Os,ks],{[Ds]:B.hex(`#CC0000`),[Os]:B.hex(`#FF8800`),[ks]:B.yellow});function Ps(e,t){let n=Ms.cli.filled,r=Ms.cli.empty,i=``;for(let a=0;a<3;a++)a<e?i+=t(n):i+=B.white(r);return i}function Fs(e,t){return 3-t.indexOf(e)}function Is(e,t){if(As.has(e))return As.get(e);let n=t();return As.set(e,n),n}function Ls(){return Is(`mcp-priority-all`,()=>({[Ds]:Ms.mcp.high,[Os]:Ms.mcp.medium,[ks]:Ms.mcp.low}))}function Rs(){return Is(`cli-priority-all`,()=>{let e={};return Ns.levels.forEach(t=>{e[t]=Ps(Fs(t,Ns.levels),Ns.getColor(t))}),e})}function zs(){return Is(`statusbar-priority-all`,()=>{let e={};return Ns.levels.forEach((t,n)=>{let r=n===0?Ms.statusBar.high:n===1?Ms.statusBar.medium:Ms.statusBar.low;e[t]=Ns.getColor(t)(r)}),e})}function Bs(){return{[Ds]:Ns.colors[Ds],[Os]:Ns.colors[Os],[ks]:Ns.colors[ks]}}function Vs(e=!1){return e?Ls():Rs()}function Hs(e,t=!1){let n=Vs(t);return n[e]||n[Os]}new js(`complexity`,[`high`,`medium`,`low`],{high:B.hex(`#CC0000`),medium:B.hex(`#FF8800`),low:B.green},{high:e=>e>=7,medium:e=>e>=4&&e<=6,low:e=>e<=3});const Us={clearOnComplete:!1,stopOnComplete:!0,hideCursor:!0,barsize:40},Ws={shades_classic:mt.Presets.shades_classic,shades_grey:mt.Presets.shades_grey,rect:mt.Presets.rect,legacy:mt.Presets.legacy},Gs=new class{constructor(e={},t=Ws.shades_classic){this.defaultOptions={...Us,...e},this.defaultPreset=t}createSingleBar(e={},t=null){let n=this._mergeConfig(e),r=t||this.defaultPreset;return new mt.SingleBar(n,r)}createMultiBar(e={},t=null){let n=this._mergeConfig(e),r=t||this.defaultPreset;return new mt.MultiBar(n,r)}_mergeConfig(e){return{...this.defaultOptions,...e}}setDefaultOptions(e){this.defaultOptions={...this.defaultOptions,...e}}setDefaultPreset(e){this.defaultPreset=e}};function Ks(e={}){return Gs.createMultiBar(e)}var qs=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=Ks(),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(){}},Js=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 Ys(e,t,n){new Js(e).createHeader(t,n)}function Xs(e,t,n){new Js(e).createRow(t,n)}function Zs(e,t){new Js(e).createBorder(t)}Rs();const Qs=zs();Bs();const $s={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 ec=class{constructor(e=$s.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}},tc=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():$s.DEFAULT_PRIORITY;return $s.VALID_PRIORITIES.includes(t)?t:$s.DEFAULT_PRIORITY}getCounts(){return{...this.priorities}}},nc=class{static formatTitle(e,t){return e?e.length>$s.MAX_TITLE_LENGTH?e.substring(0,$s.TRUNCATED_LENGTH)+`...`:e:`Task ${t}`}static formatPriority(e){return Hs(e,!1).padEnd($s.PRIORITY_PAD_END,` `)}static formatTaskId(e){return e.toString().padStart($s.TASK_ID_PAD_START,` `).padEnd($s.TASK_ID_PAD_END,` `)}},rc=class extends qs{_initializeCustomProperties(e){this.append=e.append,this.priorityManager=new tc,this.debouncer=new ec,this.headerShown=!1}_getTimeTokensBarFormat(){return`{clock} {elapsed} | ${Qs.high} {high} ${Qs.medium} {medium} ${Qs.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,Ys(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=nc.formatTitle(t,e),i=nc.formatPriority(n),a=nc.formatTaskId(e);Xs(this.multibar,` ${a} | ${i} | {title}`,{title:r}),Zs(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 ic(e={}){return new rc(e)}async function ac(e,t,n){let r=oc(e,t,n);await cc(e,n,r.estimatedInputTokens);let i=await lc(e,t,e.streamingTimeout),{progressTracker:a,priorityMap:o}=await uc(e,n),s=await dc(i.mainResult,e,t,n,a,o,r.defaultPriority,r.estimatedInputTokens,r.logger);if(sc(s),s.usage&&e.projectRoot){let{logAiUsage:t}=await import(`./ai-services-unified-DMG5Q8bx.js`),{getUserId:n}=await import(`./config-manager-57pvK5mX.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 xc(s,i,r.estimatedInputTokens,a)}function oc(e,t,n){let{systemPrompt:r,userPrompt:i}=t;return{logger:new Qo(e.mcpLog,e.reportProgress),estimatedInputTokens:hs(r+i),defaultPriority:ce(e.projectRoot)||`medium`}}function sc(e){if(e.parsedTasks.length===0)throw Error(`No tasks were generated from the PRD`)}async function cc(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 lc(e,n,r){let{systemPrompt:i,userPrompt:a}=n;return await qo.withTimeout(t({role:e.research?`research`:`main`,session:e.session,projectRoot:e.projectRoot,schema:Xo,systemPrompt:i,prompt:a,commandName:`parse-prd`,outputType:e.isMCP?`mcp`:`cli`}),r,`Streaming operation`)}async function uc(e,t){let n=Vs(e.isMCP),r=null;if(e.outputFormat===`text`&&!e.isMCP){r=ic({numUnits:t,unitName:`task`,append:e.append});let n=e.research?he():l(),i=v(e.research?`research`:`main`);ss({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 dc(e,t,n,r,i,a,o,s,c){let{systemPrompt:l,userPrompt:u}=n,d={config:{...t,schema:Xo},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 fc(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 gc(t,d)}catch(e){return c.report(`StreamObject processing failed: ${e.message}. Falling back to generateObject.`,`debug`),await bc(d,c)}}async function fc(e,t,n){for await(let r of e)t.lastPartialObject=r,r&&(t.estimatedOutputTokens=hs(JSON.stringify(r))),await pc(r,t,n)}async function pc(e,t,n){if(!e?.tasks||!Array.isArray(e.tasks))return;let r=e.tasks.length;r>t.taskCount?(await mc(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 mc(e,t,n,r,i){for(let a=t;a<n;a++){let t=e[a]||{};t.title?await Cs({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 hc(a+1,r,i)}}async function hc(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 gc(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 _c(n.tasks,i,a?o:r,t,a?s:null),{parsedTasks:n.tasks,estimatedOutputTokens:o,actualInputTokens:s,usage:a,usedFallback:!1}}async function _c(e,t,n,r,i=null){let{progressTracker:a,defaultPriority:o,estimatedInputTokens:s}=r;t>0?vc(e,a,o):await yc(e,n,r),a.updateTokens(i||s,n,!1),a.stop()}function vc(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 yc(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];i?.title&&await Cs({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 bc(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||hs(JSON.stringify(r)),i=n.telemetryData?.inputTokens||e.estimatedInputTokens;e.progressTracker.updateTokens(i,t,!1)}return{parsedTasks:r.tasks,estimatedOutputTokens:n.telemetryData?.outputTokens||hs(JSON.stringify(r)),actualInputTokens:n.telemetryData?.inputTokens,telemetryData:n.telemetryData,usedFallback:!0}}throw Error(`Failed to generate tasks using generateObject fallback`)}function xc(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 Sc(e,t,n){let r=new Qo(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}=_s(e.tasksPath,e.targetTag);vs({existingTasks:i,targetTag:e.targetTag,append:e.append,force:e.force,isMCP:e.isMCP,logger:r});let o=await t(e,await Ss(e,gs(e.prdPath),a),e.numTasks),s=ce(e.projectRoot)||`medium`,c=ys(o.parsedTasks,a,i,s),l=e.append?[...i,...c]:c;return xs(e.tasksPath,l,e.targetTag,r),await Cc(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(B.red(`Error: ${t.message}`)),be(e.projectRoot)&&console.error(t)),t}}async function Cc(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 ws({processedTasks:n,nextId:i,summary:t.summary,prdPath:e.prdPath,tasksPath:e.tasksPath,usedFallback:t.usedFallback,aiServiceResponse:o}):a||Ts({processedTasks:n,research:e.research,finalTasks:r,tasksPath:e.tasksPath,aiServiceResponse:o}))}async function wc(e,t,n,r={}){return Sc(new Zo(e,t,n,r),ac,!0)}async function Tc(e,t,n,r={}){return Sc(new Zo(e,t,n,r),Es,!1)}async function Ec(e,t,n,r={}){let i=new Zo(e,t,n,r);if(i.useStreaming)try{return await wc(e,t,n,r)}catch(a){if(a instanceof Go||a.code===Ko.NOT_ASYNC_ITERABLE||a.code===Ko.STREAM_PROCESSING_FAILED||a.code===Ko.STREAM_NOT_ITERABLE||qo.isTimeoutError(a)){let o=new Qo(i.mcpLog,i.reportProgress);return i.outputFormat===`text`&&!i.isMCP?console.log(B.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 Tc(e,t,n,r)}else throw a}else return await Tc(e,t,n,r)}var Dc=Ec;async function Oc(e,t,n=!1,r=!1,i={}){let{projectRoot:a,tag:o}=i;try{z(`info`,`Removing subtask ${t}...`);let r=w(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){z(`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),z(`info`,`Created new task ${e} from subtask ${t}`)}else z(`info`,`Subtask ${t} deleted`);return _(e,r,a,o),p}catch(e){throw z(`error`,`Error removing subtask: ${e.message}`),e}}var kc=Oc;function Ac(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 jc=Ac;async function Mc(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=w(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(!jc(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,z(`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))})});_(e,n,r,i);for(let t of c){let n=H.join(H.dirname(e),`task_${t.toString().padStart(3,`0`)}.txt`);if(Ke.existsSync(n))try{Ke.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,z(`warn`,t)}}}else a.errors.length===0&&a.messages.push(`No tasks found matching the provided IDs.`);let l=a.messages.join(`
|
|
954
957
|
`),u=a.errors.join(`
|
|
955
958
|
`);return{success:a.success,message:l||`No tasks were removed.`,error:u||null,removedTasks:a.removedTasks}}catch(e){return z(`error`,`Error removing tasks: ${e.message}`),{success:!1,message:``,error:`Operation failed: ${e.message}`,removedTasks:[]}}}var Nc=Mc;ot.use(st({code:e=>e.split(`
|
|
956
959
|
`).map(e=>` `+B.cyan(e)).join(`
|
|
@@ -968,9 +971,9 @@ ${B.cyan(`1.`)} Run ${B.yellow(`task-master list`)} to view all tasks\n${B.cyan(
|
|
|
968
971
|
`);if(r.push(B.cyan(`Prompts: `)+B.yellow(i.toLocaleString())+B.gray(` (generated)`)+`
|
|
969
972
|
`+a),r.length>0){let e=W(r.join(`
|
|
970
973
|
|
|
971
|
-
`),{title:B.blue.bold(`Context Analysis`),titleAlignment:`left`,padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderStyle:`single`,borderColor:`blue`});console.log(e)}}async function Ic(e,t,n,r,i,a,o){let s=!1;try{let{readJSON:c}=await import(`./utils-
|
|
974
|
+
`),{title:B.blue.bold(`Context Analysis`),titleAlignment:`left`,padding:{top:1,bottom:1,left:2,right:2},margin:{top:0,bottom:1},borderStyle:`single`,borderColor:`blue`});console.log(e)}}async function Ic(e,t,n,r,i,a,o){let s=!1;try{let{readJSON:c}=await import(`./utils-DdN5yigu.js`);(await import(`./update-task-by-id-Cc8OTjRv.js`)).default;let{updateSubtaskById:l}=await import(`./update-subtask-by-id-oJfkukUc.js`),u=[{question:a,answer:o,type:`initial`,timestamp:new Date().toISOString()}];for(;;){let{action:a}=await q.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 Rc(u,r,t,i);continue}if(a===`save`){await Lc(u,r,t,i)&&(s=!0);continue}if(a===`followup`){let{followUpQuery:r}=await q.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(`
|
|
972
975
|
`+B.gray(`─`.repeat(60))+`
|
|
973
|
-
`);let i=Vc(u),a={...e,taskIds:[],customContext:i+(e.customContext?`\n\n--- Original Context ---\n${e.customContext}`:``)},o=await Pc(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 Lc(e,t,n,r){try{let{readJSON:r}=await import(`./utils-
|
|
976
|
+
`);let i=Vc(u),a={...e,taskIds:[],customContext:i+(e.customContext?`\n\n--- Original Context ---\n${e.customContext}`:``)},o=await Pc(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 Lc(e,t,n,r){try{let{readJSON:r}=await import(`./utils-DdN5yigu.js`),i=(await import(`./update-task-by-id-Cc8OTjRv.js`)).default,{updateSubtaskById:a}=await import(`./update-subtask-by-id-oJfkukUc.js`),{taskId:o}=await q.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=Bc(e),l=s.includes(`.`),u=H.join(t,`.taskmaster`,`tasks`,`tasks.json`);if(!V.existsSync(u)){console.log(B.red(`❌ Tasks file not found. Please run task-master init first.`));return}let d=r(u,t,n.tag);if(!d||!d.tasks){console.log(B.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(B.red(`❌ Parent task ${e} not found.`));return}if(!r.subtasks||!r.subtasks.find(e=>e.id===t)){console.log(B.red(`❌ Subtask ${s} not found.`));return}console.log(B.blue(`💾 Saving research conversation to subtask...`)),await a(u,s,c,!1,n,`text`),console.log(B.green(`✅ Research conversation saved to subtask ${s}`))}else{let e=parseInt(s,10);if(!d.tasks.find(t=>t.id===e)){console.log(B.red(`❌ Task ${s} not found.`));return}console.log(B.blue(`💾 Saving research conversation to task...`)),await i(u,e,c,!1,n,`text`,!0),console.log(B.green(`✅ Research conversation saved to task ${s}`))}return!0}catch(e){return console.log(B.red(`❌ Error saving conversation: ${e.message}`)),r.error(`Error saving conversation: ${e.message}`),!1}}async function Rc(e,t,n,r){try{let n=H.join(t,`.taskmaster`,`docs`,`research`);V.existsSync(n)||V.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=zc(e,i);V.writeFileSync(o,s,`utf8`);let c=H.relative(t,o);return console.log(B.green(`✅ Research saved to: ${B.cyan(c)}`)),r.success(`Research conversation saved to ${c}`),o}catch(e){throw console.log(B.red(`❌ Error saving research file: ${e.message}`)),r.error(`Error saving research file: ${e.message}`),e}}function zc(e,t){let n=new Date().toISOString(),r=`---
|
|
974
977
|
title: Research Session
|
|
975
978
|
query: "${t}"
|
|
976
979
|
date: ${new Date().toLocaleDateString()}
|