taskgraph-ai 0.49.1 → 0.50.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +14 -27
  2. package/dist/ai-services-unified-DbjBfAvG.js +3 -0
  3. package/dist/ai-services-unified-TeIK2DoX.js +1 -0
  4. package/dist/{commands-CceFmRJA.js → commands-2aOf3ERj.js} +86 -86
  5. package/dist/config-manager-C8-BTReQ.js +1 -0
  6. package/dist/config-manager-Da0wEujO.js +1 -0
  7. package/dist/dependency-manager-DIbDdrUV.js +964 -0
  8. package/dist/git-utils-BFUgMf2g.js +1 -0
  9. package/dist/{git-utils-DllbRE35.js → git-utils-CrYiSKu0.js} +1 -1
  10. package/dist/{init-wtXaFE45.js → init-CNSqtmPC.js} +19 -19
  11. package/dist/mcp-server.js +5 -5
  12. package/dist/research-CUiuqEKk.js +1 -0
  13. package/dist/response-language-CGnha79j.js +1 -0
  14. package/dist/{response-language-BHhde6n_.js → response-language-Cc70IGmg.js} +1 -1
  15. package/dist/src-lvp18X-h.js +203 -0
  16. package/dist/tag-management-B5XoFcUP.js +1 -0
  17. package/dist/task-manager-BKqm9QPb.js +1 -0
  18. package/dist/taskgraph.js +1 -1
  19. package/dist/update-subtask-by-id-Ct9TTTgG.js +1 -0
  20. package/dist/update-task-by-id-BvdEKXsG.js +1 -0
  21. package/dist/utils-D1-Eo-6k.js +1 -0
  22. package/package.json +2 -4
  23. package/dist/ai-services-unified--6CT6QUI.js +0 -1
  24. package/dist/ai-services-unified-D8PahWkz.js +0 -3
  25. package/dist/config-manager-CvDCaURh.js +0 -1
  26. package/dist/config-manager-DD5sEcpv.js +0 -270
  27. package/dist/dependency-manager-B7SaMC6u.js +0 -966
  28. package/dist/git-utils-PBP1PRVP.js +0 -1
  29. package/dist/research-BRpAIbWg.js +0 -1
  30. package/dist/response-language-Dz-rFnaJ.js +0 -1
  31. package/dist/sentry-DNoFrfjb.js +0 -1
  32. package/dist/tag-management-BEKnBGXA.js +0 -1
  33. package/dist/task-manager-BQkOlw_W.js +0 -1
  34. package/dist/update-subtask-by-id-BOFRADbR.js +0 -1
  35. package/dist/update-task-by-id-DTHqRii_.js +0 -1
  36. package/dist/utils-DYpucGVy.js +0 -1
@@ -0,0 +1 @@
1
+ import{b as e}from"./src-lvp18X-h.js";import{A as t,C as n,D as r,E as i,O as a,S as o,T as s,_ as c,a as l,b as u,c as d,d as f,f as p,g as m,h,i as g,j as _,k as v,l as y,m as b,n as x,o as S,p as C,r as w,s as T,t as E,u as D,v as O,w as k,x as A,y as j}from"./config-manager-Da0wEujO.js";import"./git-utils-CrYiSKu0.js";export{e as CUSTOM_PROVIDERS,E as ConfigurationError,_ as MODEL_MAP,x as getAvailableModels,w as getClaudeCodeSettings,g as getClaudeCodeSettingsForCommand,l as getConfig,S as getDebugFlag,T as getDefaultNumTasks,d as getDefaultPriority,y as getDefaultSubtasks,D as getFallbackModelId,f as getFallbackProvider,p as getLogLevel,C as getMainModelId,b as getMainProvider,h as getParametersForRole,m as getProjectName,c as getProxyEnabled,O as getResearchModelId,j as getResearchProvider,u as getResponseLanguage,A as getSupportedModelsForProvider,o as getUserId,n as hasCodebaseAnalysis,k as isCodebaseAnalysisEnabled,s as isConfigFilePresent,i as isConfigWarningSuppressed,r as isProxyEnabled,a as validateClaudeCodeSettings,v as validateProvider,t as writeConfig};
@@ -0,0 +1 @@
1
+ import{b as e,m as t,p as n,x as r}from"./src-lvp18X-h.js";import{t as i}from"./git-utils-CrYiSKu0.js";import a from"chalk";import o from"path";import{z as s}from"zod";import c from"dotenv";import l from"fs";import{fileURLToPath as u}from"url";const d=[`add-task`,`analyze-complexity`,`expand-task`,`parse-prd`,`research`,`research-save`,`update-subtask`,`update-task`,`update-tasks`],f=`.taskgraph`,ee=`.taskgraph/tasks`,p=`.taskgraph/docs`,m=`.taskgraph/reports`,te=`.taskgraph/templates`,h=`.taskgraph/config.json`,ne=`.taskgraph/state.json`,re=`.taskgraph/reports/task-complexity-report.json`,ie=`.taskgraph/docs/prd.txt`,ae=`.taskgraph/templates/example_prd.txt`,oe=`.taskgraph/tasks/tasks.json`,se=`.env.example`,ce=`.gitignore`,g={primary:`#0088CC`,accent:`#0096C7`,deep:`#0080C0`},le=[g.accent,g.primary,g.deep],ue=g.accent,de=[`dim`],fe={dimBorder:!0},_={brand:a.cyan,heading:a.cyan.bold,accent:a.magenta,active:a.cyan.bold,muted:a.dim,text:a};let v=!1;const pe={maxRetries:5,retryDelay:100,staleLockAge:1e4};function me(e){if(typeof SharedArrayBuffer<`u`&&typeof Atomics<`u`&&typeof Atomics.wait==`function`)try{let t=new SharedArrayBuffer(4),n=new Int32Array(t);Atomics.wait(n,0,0,e);return}catch{}let t=Date.now()+e;for(;Date.now()<t;);}function y(e,t,n={}){let{createIfMissing:r=!1}=n,i=o.dirname(e);if(l.existsSync(i)||l.mkdirSync(i,{recursive:!0}),r)try{l.writeFileSync(e,`{}`,{flag:`wx`})}catch(e){if(e.code!==`EEXIST`)throw e}let a=`${e}.lock`,{maxRetries:s,retryDelay:c,staleLockAge:u}=pe,d=!1;for(let e=0;e<s;e++)try{let e=JSON.stringify({pid:process.pid,timestamp:Date.now()});l.writeFileSync(a,e,{flag:`wx`}),d=!0;break}catch(t){if(t.code===`EEXIST`){try{let e=l.statSync(a);if(Date.now()-e.mtimeMs>u){let e=`${a}.stale.${process.pid}.${Date.now()}`;try{l.renameSync(a,e);try{l.unlinkSync(e)}catch{}continue}catch{}}}catch(e){if(e.code===`ENOENT`)continue;throw e}e<s-1&&me(c*2**e)}else throw t}if(!d)throw Error(`Failed to acquire lock on ${e} after ${s} attempts`);try{return t()}finally{try{l.unlinkSync(a)}catch(t){w(`warn`,`Failed to release lock for ${e}: ${t.message}`)}}}function b(e,t=null,n=null){if(t?.env?.[e])return t.env[e];if(n){let t=o.join(n,`.env`);if(l.existsSync(t))try{let n=l.readFileSync(t,`utf-8`),r=c.parse(n);if(r&&r[e])return r[e]}catch(e){w(`warn`,`Could not read or parse ${t}: ${e.message}`)}}if(process.env[e])return process.env[e]}function x(e=process.cwd(),t=[`package.json`,`pyproject.toml`,`.git`]){let n=o.resolve(e),r=o.parse(n).root;for(;n!==r;){if(t.some(e=>{let t=o.join(n,e);return l.existsSync(t)}))return n;n=o.dirname(n)}return t.some(e=>{let t=o.join(r,e);return l.existsSync(t)})?r:null}const S={debug:0,info:1,warn:2,error:3,success:1};function he(){v=!0}function ge(){v=!1}function C(){return v}function w(e,...t){if(C())return;let n=`info`;try{n=qe()||`info`}catch{n=`info`}let r={debug:_.muted(`[DEBUG]`),info:_.brand(`[INFO]`),warn:a.yellow(`[WARN]`),error:a.red(`[ERROR]`),success:a.green(`[SUCCESS]`)},i=S.hasOwnProperty(e)?e:`info`;if(S[i]>=(S[n]??S.info)){let e=r[i]||``,n=t.map(e=>typeof e==`object`?JSON.stringify(e):e).join(` `);console.log(`${e} ${n}`)}}function T(e){if(!e||typeof e!=`object`)return!1;for(let t in e)if(e.hasOwnProperty(t)&&typeof e[t]==`object`&&Array.isArray(e[t].tasks))return!0;return!1}function E(e){Array.isArray(e)&&e.forEach(e=>{if(e.id!==void 0){let t=parseInt(e.id,10);!isNaN(t)&&t>0&&(e.id=t)}Array.isArray(e.subtasks)&&e.subtasks.forEach(e=>{if(e.id!==void 0)if(typeof e.id==`string`&&e.id.includes(`.`)){let t=e.id.split(`.`);e.id=parseInt(t[t.length-1],10)}else{let t=parseInt(e.id,10);!isNaN(t)&&t>0&&(e.id=t)}})})}function D(e,t=null,n=null){let r=!1;try{r=Q()}catch{}if(r&&console.log(`readJSON called with: ${e}, projectRoot: ${t}, tag: ${n}`),!e)return null;let a;try{a=JSON.parse(l.readFileSync(e,`utf8`)),r&&console.log(`Successfully read JSON from ${e}`)}catch(t){return r&&console.log(`Failed to read JSON from ${e}: ${t.message}`),null}if(!e.includes(`tasks.json`)||!a)return r&&console.log(`File is not tasks.json or data is null, returning as-is`),a;if(Array.isArray(a.tasks)&&!a._rawTaggedData&&!T(a)){r&&console.log(`File is in legacy format, performing migration...`),E(a.tasks);let n={master:{tasks:a.tasks,metadata:a.metadata||{created:new Date().toISOString(),updated:new Date().toISOString(),description:`Tasks for master context`}}};try{if(M(e,n),r&&console.log(`Successfully migrated legacy format to tagged format`),O(e),t)try{i(t,e)}catch{}j(e)}catch(e){r&&console.log(`Error writing migrated data: ${e.message}`)}a=n}if(typeof a==`object`&&!a.tasks){for(let e in r&&console.log(`File is in tagged format, resolving tag...`),a)if(a.hasOwnProperty(e)&&typeof a[e]==`object`&&a[e].tasks)try{I(a[e],{description:`Tasks for ${e} context`,skipUpdate:!0})}catch(t){r&&console.log(`Failed to ensure metadata for tag ${e}: ${t.message}`)}let s=JSON.parse(JSON.stringify(a));for(let e in s)s[e]&&Array.isArray(s[e].tasks)&&E(s[e].tasks);if(t)try{i(t,e)}catch{}try{let i=`master`;try{if(n)i=n;else if(t)i=F({projectRoot:t});else{let t=x(o.dirname(e));t&&(i=F({projectRoot:t}))}}catch(e){r&&console.log(`Tag resolution failed, using master: ${e.message}`)}r&&console.log(`Resolved tag: ${i}`);let c=a[i];if(c&&c.tasks){E(c.tasks);let e={...c,tag:i,_rawTaggedData:s};return r&&console.log(`Returning data for tag '${i}' with ${c.tasks.length} tasks`),e}else{let e=a.master;return e&&e.tasks?(E(e.tasks),r&&console.log(`Tag '${i}' not found, falling back to master with ${e.tasks.length} tasks`),{...e,tag:`master`,_rawTaggedData:s}):(r&&console.log(`No valid tag data found, returning empty structure`),{tasks:[],tag:`master`,_rawTaggedData:s})}}catch(e){r&&console.log(`Error during tag resolution: ${e.message}`);let t=a.master;return t&&t.tasks?(E(t.tasks),{...t,_rawTaggedData:s}):{tasks:[],_rawTaggedData:s}}}return r&&console.log(`File format not recognized, returning as-is`),a}function O(e){try{let t=x(o.dirname(e))||o.dirname(e),n=o.join(t,`.taskgraph`,`config.json`);l.existsSync(n)&&k(n);let r=o.join(t,`.taskgraph`,`state.json`);l.existsSync(r)||A(r),Q()&&w(`debug`,`Complete tag migration performed for project: ${t}`)}catch(e){Q()&&w(`warn`,`Error during complete tag migration: ${e.message}`)}}function k(e){try{let t=l.readFileSync(e,`utf8`),n=JSON.parse(t);if(!n)return;let r=!1;n.global||={},n.global.defaultTag||(n.global.defaultTag=`master`,r=!0),r&&(l.writeFileSync(e,JSON.stringify(n,null,2),`utf8`),process.env.TASKGRAPH_DEBUG===`true`&&console.log(`[DEBUG] Updated config.json with tagged task system settings`))}catch(e){process.env.TASKGRAPH_DEBUG===`true`&&console.warn(`[WARN] Error migrating config.json: ${e.message}`)}}function A(e){try{let t={currentTag:`master`,lastSwitched:new Date().toISOString(),branchTagMapping:{},migrationNoticeShown:!1};l.writeFileSync(e,JSON.stringify(t,null,2),`utf8`),process.env.TASKGRAPH_DEBUG===`true`&&console.log(`[DEBUG] Created initial state.json for tagged task system`)}catch(e){process.env.TASKGRAPH_DEBUG===`true`&&console.warn(`[WARN] Error creating state.json: ${e.message}`)}}function j(e){try{let t=o.dirname(o.dirname(e)),n=o.join(t,`.taskgraph`,`state.json`);l.existsSync(n)||A(n);try{let e=l.readFileSync(n,`utf8`),t=JSON.parse(e)||{};t.migrationNoticeShown===void 0&&(t.migrationNoticeShown=!1,l.writeFileSync(n,JSON.stringify(t,null,2),`utf8`))}catch(e){process.env.TASKGRAPH_DEBUG===`true`&&console.warn(`[WARN] Error updating state for migration notice: ${e.message}`)}}catch(e){process.env.TASKGRAPH_DEBUG===`true`&&console.warn(`[WARN] Error marking migration for notice: ${e.message}`)}}function M(e,t,n=null,r=null){let i=process.env.TASKGRAPH_DEBUG===`true`;try{y(e,()=>{let a=t;if(t&&!t._rawTaggedData&&n&&Array.isArray(t.tasks)&&!T(t)){let o=r||P(n);i&&console.log(`writeJSON: Detected resolved tag data missing _rawTaggedData. Re-reading raw data to prevent data loss for tag '${o}'.`);let s={};try{s=JSON.parse(l.readFileSync(e,`utf8`))}catch(e){i&&console.log(`writeJSON: Could not read existing file, starting fresh: ${e.message}`)}a={...s,[o]:{metadata:{...s[o]?.metadata||{},...t.metadata||{}},tasks:t.tasks}}}else if(t&&t._rawTaggedData&&n){let o=r||P(n),s;try{s=JSON.parse(l.readFileSync(e,`utf8`))}catch(e){s=t._rawTaggedData,i&&console.log(`writeJSON: Using _rawTaggedData as fallback: ${e.message}`)}let{_rawTaggedData:c,tag:u,...d}=t;a={...s,[o]:d},i&&console.log(`writeJSON: Merging resolved data back into tag '${o}'`)}let o=a;if(o&&typeof o==`object`){let{_rawTaggedData:e,tag:t,...n}=o;if(o=n,typeof o==`object`&&!Array.isArray(o)){let e={};for(let[t,n]of Object.entries(o))if(n&&typeof n==`object`&&Array.isArray(n.tasks)){let{created:r,description:i,...a}=n;a.metadata||={},r&&!a.metadata.created&&(a.metadata.created=r),i&&!a.metadata.description&&(a.metadata.description=i),e[t]=a}else e[t]=n;o=e}}let s=`${e}.tmp.${process.pid}`;try{l.writeFileSync(s,JSON.stringify(o,null,2),`utf8`),l.renameSync(s,e)}catch(e){try{l.existsSync(s)&&l.unlinkSync(s)}catch{}throw e}i&&console.log(`writeJSON: Successfully wrote to ${e}`)},{createIfMissing:!0})}catch(t){throw w(`error`,`Error writing JSON file ${e}:`,t.message),i&&w(`error`,`Full error details:`,t),t}}function _e(e=null){let t=!1;try{t=Q()}catch{t=!1}try{let n;if(n=e||o.join(process.cwd(),re),!l.existsSync(n))return t&&w(`debug`,`Complexity report not found at ${n}`),null;let r=D(n);return t&&w(`debug`,`Successfully read complexity report from ${n}`),r}catch(e){return t&&w(`error`,`Error reading complexity report: ${e.message}`),null}}function ve(e,t){return!e||!e.complexityAnalysis||!Array.isArray(e.complexityAnalysis)?null:e.complexityAnalysis.find(e=>e.taskId===t)}function N(e,t){let n;n=e.isSubtask?e.parentTask.id:e.parentId?e.parentId:e.id;let r=ve(t,n);r&&(e.complexityScore=r.complexityScore)}function ye(e,t){if(!t||!e||!Array.isArray(e))return!1;if(typeof t==`string`&&t.includes(`.`)){let[n,r]=t.split(`.`).map(e=>parseInt(e,10)),i=e.find(e=>e.id===n);return!i||!i.subtasks?!1:i.subtasks.some(e=>e.id===r)}let n=parseInt(t,10);return e.some(e=>e.id===n)}function be(e){return typeof e==`string`&&e.includes(`.`)?e:typeof e==`number`?e.toString():e}function xe(e,t,n=null,r=null){if(!t||!e||!Array.isArray(e))return{task:null,originalSubtaskCount:null};if(typeof t==`string`&&t.includes(`.`)){let[r,i]=t.split(`.`).map(e=>parseInt(e,10)),a=e.find(e=>e.id===r);if(!a||!a.subtasks)return{task:null,originalSubtaskCount:null,originalSubtasks:null};let o=a.subtasks.find(e=>e.id===i);return o&&(o.parentTask={id:a.id,title:a.title,status:a.status},o.isSubtask=!0),o&&n&&N(o,n),{task:o||null,originalSubtaskCount:null,originalSubtasks:null}}let i=null,a=null,o=null,s=parseInt(t,10),c=e.find(e=>e.id===s)||null;if(!c)return{task:null,originalSubtaskCount:null,originalSubtasks:null};if(i=c,r&&c.subtasks&&Array.isArray(c.subtasks)){o=[...c.subtasks],a=c.subtasks.length;let e={...c};e.subtasks=c.subtasks.filter(e=>e.status&&e.status.toLowerCase()===r.toLowerCase()),i=e}return i&&n&&N(i,n),{task:i,originalSubtaskCount:a,originalSubtasks:o}}function Se(e,t){return!e||e.length<=t?e:`${e.slice(0,t-3)}...`}function Ce(e){return Array.isArray(e)?e.length===0:typeof e==`object`&&e?Object.keys(e).length===0:!1}function we(e,t,n=new Set,r=new Set,i=[]){n.add(e),r.add(e),i.push(e);let a=[],o=t.get(e)||[];for(let e of o)if(n.has(e)){if(r.has(e)){let t=i.indexOf(e);i.slice(t),a.push(e)}}else{let o=we(e,t,n,r,[...i]);a.push(...o)}return r.delete(e),a}function Te(e,t,n={}){let{maxDepth:r=50,includeSelf:i=!1,direction:a=`forward`,logger:o=null}=n,s=new Set,c=new Set;function l(e){if(typeof e==`string`){if(e.includes(`.`))return e;let t=parseInt(e,10);return isNaN(t)?e:t}return e}function u(e,n=0){if(n>=r){let t=`Maximum recursion depth (${r}) reached for task ${e}`;o&&typeof o.warn==`function`?o.warn(t):w!==void 0&&w.warn?w.warn(t):console.warn(t);return}if(c.has(e))return;c.add(e);let a=t.find(t=>t.id===e);!a||!Array.isArray(a.dependencies)||a.dependencies.forEach(t=>{let r=l(t);r==null||!i&&r===e||(s.add(r),u(r,n+1))})}function d(e,n=0){if(n>=r){let t=`Maximum recursion depth (${r}) reached for task ${e}`;o&&typeof o.warn==`function`?o.warn(t):w!==void 0&&w.warn?w.warn(t):console.warn(t);return}c.has(e)||(c.add(e),t.forEach(t=>{if(t.dependencies&&Array.isArray(t.dependencies)&&t.dependencies.some(t=>l(t)===e)){if(t.id==null||!i&&t.id===e)return;s.add(t.id),d(t.id,n+1)}}))}let f=a===`reverse`?d:u;return e.forEach(e=>{e&&e.id&&f(e.id)}),Array.from(s)}function Ee(e,t){if(!e||e.length===0)return null;let n={timestamp:new Date().toISOString(),userId:e[0].userId,commandName:t,modelUsed:`Multiple`,providerName:`Multiple`,inputTokens:0,outputTokens:0,totalTokens:0,totalCost:0,currency:e[0].currency||`USD`},r=new Set,i=new Set,a=new Set;return e.forEach(e=>{n.inputTokens+=e.inputTokens||0,n.outputTokens+=e.outputTokens||0,n.totalCost+=e.totalCost||0,r.add(e.modelUsed),i.add(e.providerName),a.add(e.currency||`USD`)}),n.totalTokens=n.inputTokens+n.outputTokens,n.totalCost=parseFloat(n.totalCost.toFixed(6)),r.size===1&&(n.modelUsed=[...r][0]),i.size===1&&(n.providerName=[...i][0]),a.size>1?n.currency=`Multiple`:a.size===1&&(n.currency=[...a][0]),n}function P(e){if(!e)throw Error(`projectRoot is required for getCurrentTag`);try{let t=o.join(e,`.taskgraph`,`state.json`);if(l.existsSync(t)){let e=l.readFileSync(t,`utf8`),n=JSON.parse(e);if(n&&n.currentTag)return n.currentTag}}catch{}try{let t=o.join(e,`.taskgraph`,`config.json`);if(l.existsSync(t)){let e=l.readFileSync(t,`utf8`),n=JSON.parse(e);if(n&&n.global&&n.global.defaultTag)return n.global.defaultTag}}catch{}return`master`}function F(e={}){let{projectRoot:t,tag:n}=e;if(!t)throw Error(`projectRoot is required for resolveTag`);return n||P(t)}function De(e,t){return!e||!t?[]:e[t]&&e[t].tasks&&Array.isArray(e[t].tasks)?e[t].tasks:[]}function Oe(e){let t=[];for(let n of e)if(t.push({...n,searchableId:n.id.toString(),isSubtask:!1}),n.subtasks&&n.subtasks.length>0)for(let e of n.subtasks)t.push({...e,searchableId:`${n.id}.${e.id}`,isSubtask:!0,parentId:n.id,parentTitle:n.title,title:`${e.title} (subtask of: ${n.title})`,description:`${e.description} [Parent: ${n.description}]`});return t}function I(e,t={}){if(!e||typeof e!=`object`)throw Error(`tagObj must be a valid object`);let n=new Date().toISOString();return e.metadata?(e.metadata.created||(e.metadata.created=n),t.skipUpdate||(e.metadata.updated=n),t.description&&!e.metadata.description&&(e.metadata.description=t.description)):e.metadata={created:n,updated:n,...t.description?{description:t.description}:{}},e}function ke(){return{info:(e,...t)=>w(`info`,e,...t),warn:(e,...t)=>w(`warn`,e,...t),error:(e,...t)=>w(`error`,e,...t),debug:(e,...t)=>w(`debug`,e,...t),success:(e,...t)=>w(`success`,e,...t)}}function L(e=null){return e||ke()}function R(e){return t(e)}function z(e=process.cwd()){return n(e)}function Ae(e=null,t=null,n=null){let r=L(n),i=t?.projectRoot||z();if(!i)return r.warn?.(`Could not determine project root directory`),null;let a=R(i);if(e){let t=o.isAbsolute(e)?e:o.resolve(a,e);if(l.existsSync(t))return r.info?.(`Using explicit tasks path: ${t}`),t;r.warn?.(`Explicit tasks path not found: ${t}, trying fallbacks`)}let s=o.join(a,oe);return l.existsSync(s)?(r.info?.(`Found tasks file at: ${s}`),s):(r.warn?.(`No tasks.json found in project: ${a}`),null)}function je(e=null,t=null,n=null){let r=L(n);if(e){let t=process.env.TASKGRAPH_ORIGINAL_CWD||process.cwd(),n=o.isAbsolute(e)?e:o.resolve(t,e);if(l.existsSync(n))return r.info?.(`Using explicit PRD path: ${n}`),n;r.warn?.(`Explicit PRD path not found: ${n}, trying fallbacks`)}let i=t?.projectRoot||z();if(!i)return r.warn?.(`Could not determine project root directory`),null;let a=R(i);for(let e of[`PRD.md`,`prd.md`,`PRD.txt`,`prd.txt`]){let t=o.join(a,p,e);if(l.existsSync(t))return r.info?.(`Found PRD document at: ${t}`),t}return r.warn?.(`No PRD document found in project: ${a}`),null}function Me(e=null,t=null,n=null){let r=L(n);if(e){let t=process.env.TASKGRAPH_ORIGINAL_CWD||process.cwd(),n=o.isAbsolute(e)?e:o.resolve(t,e);if(l.existsSync(n))return r.info?.(`Using explicit complexity report path: ${n}`),n;r.warn?.(`Explicit complexity report path not found: ${n}, trying fallbacks`)}let i=t?.projectRoot||z();if(!i)return r.warn?.(`Could not determine project root directory`),null;let a=R(i),s=[`task-complexity-report`,`task-complexity`,`complexity-report`].map(e=>t?.tag&&t?.tag!==`master`?`${e}_${t.tag}.json`:`${e}.json`);for(let e of s){let t=o.join(a,m,e);if(l.existsSync(t))return r.info?.(`Found complexity report at: ${t}`),t}return r.warn?.(`No complexity report found in project: ${a}`),null}function Ne(e=null,t=null,n=null){let r=L(n),i=t?.tag;if(e){let t=process.env.TASKGRAPH_ORIGINAL_CWD||process.cwd(),n=o.isAbsolute(e)?e:o.resolve(t,e);return r.info?.(`Using explicit complexity report output path: ${n}`),n}let a=R(t?.projectRoot||z()||process.cwd()),s=`task-complexity-report.json`;i&&i!==`master`&&(s=`task-complexity-report_${i}.json`);let c=o.join(a,`.taskgraph/reports`,s);r.info?.(`Using tag-aware complexity report output path: ${c}`);let u=o.dirname(c);return l.existsSync(u)||(r.info?.(`Creating reports directory: ${u}`),l.mkdirSync(u,{recursive:!0})),c}function B(e=null,t=null,n=null){let r=L(n);if(e){let t=process.env.TASKGRAPH_ORIGINAL_CWD||process.cwd(),n=o.isAbsolute(e)?e:o.resolve(t,e);if(l.existsSync(n))return r.info?.(`Using explicit config path: ${n}`),n;r.warn?.(`Explicit config path not found: ${n}, trying fallbacks`)}let i=t?.projectRoot||z();if(!i)return r.warn?.(`Could not determine project root directory`),null;let a=R(i),s=o.join(a,h);if(l.existsSync(s))return s;if(!G()){let e=`config_warning_${a}`;global._tmConfigWarningsThisRun||(global._tmConfigWarningsThisRun=new Set),global._tmConfigWarningsThisRun.has(e)||(global._tmConfigWarningsThisRun.add(e),r.warn?.(`No configuration file found in project: ${a}`))}return null}var V={"claude-code":[{id:`opus`,swe_score:.725,cost_per_1m_tokens:{input:0,output:0},allowed_roles:[`main`,`fallback`,`research`],max_tokens:32e3,supported:!0},{id:`sonnet`,swe_score:.727,cost_per_1m_tokens:{input:0,output:0},allowed_roles:[`main`,`fallback`,`research`],max_tokens:64e3,supported:!0},{id:`haiku`,swe_score:.45,cost_per_1m_tokens:{input:0,output:0},allowed_roles:[`main`,`fallback`,`research`],max_tokens:2e5,supported:!0}]};const Pe=u(import.meta.url);o.dirname(Pe);const H={models:{main:{provider:`claude-code`,modelId:`sonnet`,maxTokens:64e3,temperature:.2},research:{provider:`claude-code`,modelId:`sonnet`,maxTokens:8700,temperature:.1},fallback:{provider:`claude-code`,modelId:`sonnet`,maxTokens:64e3,temperature:.2}},global:{logLevel:`info`,debug:!1,defaultNumTasks:10,defaultSubtasks:5,defaultPriority:`medium`,projectName:`TaskGraph`,responseLanguage:`English`,enableCodebaseAnalysis:!0,enableProxy:!1},claudeCode:{}};let U=null,W=null;function G(){return global._tmSuppressConfigWarnings===!0}var Fe=class extends Error{constructor(e){super(e),this.name=`ConfigurationError`}};function Ie(e=null){let t=H,n=e;e&&`${e}`,n||(n=x(),n||=process.cwd(),`${n}`);let r=null,i={...t};if(l.existsSync(o.join(n,f))&&(r=B(null,{projectRoot:n})),r)try{let e=l.readFileSync(r,`utf-8`),n=JSON.parse(e);i={models:{main:{...t.models.main,...n?.models?.main},research:{...t.models.research,...n?.models?.research},fallback:n?.models?.fallback?.provider&&n?.models?.fallback?.modelId?{...t.models.fallback,...n.models.fallback}:{...t.models.fallback}},global:{...t.global,...n?.global},claudeCode:{...t.claudeCode,...n?.claudeCode}},`${r}`,q(i.models.main.provider)||(console.warn(a.yellow(`Warning: Invalid main provider "${i.models.main.provider}" in ${r}. Falling back to default. Run 'taskgraph models --setup' to choose a Claude Code model.`)),i.models.main={...t.models.main}),q(i.models.research.provider)||(console.warn(a.yellow(`Warning: Invalid research provider "${i.models.research.provider}" in ${r}. Falling back to default. Run 'taskgraph models --setup' to choose a Claude Code model.`)),i.models.research={...t.models.research}),i.models.fallback?.provider&&!q(i.models.fallback.provider)&&(console.warn(a.yellow(`Warning: Invalid fallback provider "${i.models.fallback.provider}" in ${r}. Fallback model configuration will be ignored. Run 'taskgraph models --setup' to choose a Claude Code model.`)),i.models.fallback.provider=void 0,i.models.fallback.modelId=void 0),i.claudeCode&&!Ce(i.claudeCode)&&(i.claudeCode=J(i.claudeCode))}catch(e){console.error(a.red(`Error reading or parsing ${r}: ${e.message}. Using default configuration.`)),i={...t},`${r}`}else G()||(e?console.warn(a.yellow(`Warning: Configuration file not found at provided project root (${e}). Using default configuration. Run 'taskgraph models --setup' to configure.`)):l.existsSync(o.join(n,f))&&console.warn(a.yellow(`Warning: Configuration file not found at derived root (${n}). Using defaults.`))),i={...t},`${n}`;return i}function K(e=null,t=!1){if(!U||t||e&&e!==W){let n=Ie(e);return(t||e)&&(U=n,W=e),n}return U}function q(e){return!!r.includes(e)}function Le(e){return V[e]?V[e].filter(e=>e.supported!==!1).map(e=>e.id):[]}function J(e){let t=s.object({pathToClaudeCodeExecutable:s.string().optional(),maxTurns:s.number().int().positive().optional(),customSystemPrompt:s.string().optional(),appendSystemPrompt:s.string().optional(),permissionMode:s.enum([`default`,`acceptEdits`,`plan`,`bypassPermissions`]).optional(),allowedTools:s.array(s.string()).optional(),disallowedTools:s.array(s.string()).optional(),mcpServers:s.record(s.string(),s.object({type:s.enum([`stdio`,`sse`]).optional(),command:s.string(),args:s.array(s.string()).optional(),env:s.record(s.string(),s.string()).optional(),url:s.url().optional(),headers:s.record(s.string(),s.string()).optional()})).optional()}),n=s.record(s.string(),t).refine(e=>Object.keys(e||{}).every(e=>d.includes(e)),{message:`Invalid command name in commandSpecific`}),r=t.extend({commandSpecific:n.optional()}),i={};try{i=r.parse(e)}catch(e){console.warn(a.yellow(`Warning: Invalid Claude Code settings in config: ${e.message}. Falling back to default.`)),i={}}return i}function Y(e=null,t=!1){let n=K(e,t);return{...H.claudeCode,...n?.claudeCode||{}}}function Re(e,t=null,n=!1){let r=Y(t,n),i=r?.commandSpecific||{};return{...r,...i[e]}}function X(e,t=null){return K(t)?.models?.[e]||(w(`warn`,`No model configuration found for role: ${e}. Returning default.`),H.models[e]||{})}function ze(e=null){return X(`main`,e).provider}function Be(e=null){return X(`main`,e).modelId}function Ve(e=null){return X(`research`,e).provider}function He(e=null,t=null){let n=b(`TASKGRAPH_ENABLE_CODEBASE_ANALYSIS`,e,t);if(n!=null&&n!==``)return n.toLowerCase()===`true`||n===`1`;if(e?.env?.TASKGRAPH_ENABLE_CODEBASE_ANALYSIS){let t=e.env.TASKGRAPH_ENABLE_CODEBASE_ANALYSIS;return t.toLowerCase()===`true`||t===`1`}return Z(t).enableCodebaseAnalysis!==!1}function Ue(t=!1,n=null,r=null){return!He(r,n)||t?!1:(t?Ve(n):ze(n))===e.CLAUDE_CODE}function We(e=null){return X(`research`,e).modelId}function Ge(e=null){return X(`fallback`,e).provider}function Ke(e=null){return X(`fallback`,e).modelId}function Z(e=null){let t=K(e);return{...H.global,...t?.global||{}}}function qe(e=null){return Z(e).logLevel.toLowerCase()}function Q(e=null){return Z(e).debug===!0}function Je(e=null){let t=Z(e).defaultSubtasks,n=parseInt(t,10);return Number.isNaN(n)?H.global.defaultSubtasks:n}function Ye(e=null){let t=Z(e).defaultNumTasks,n=parseInt(t,10);return Number.isNaN(n)?H.global.defaultNumTasks:n}function Xe(e=null){return Z(e).defaultPriority}function Ze(e=null){return Z(e).projectName}function Qe(e=null){return Z(e).responseLanguage}function $e(e=null){return Z(e).enableProxy===!0}function et(e=null,t=null){let n=b(`TASKGRAPH_ENABLE_PROXY`,e,t);if(n!=null&&n!==``)return n.toLowerCase()===`true`||n===`1`;if(e?.env?.TASKGRAPH_ENABLE_PROXY){let t=e.env.TASKGRAPH_ENABLE_PROXY;return t.toLowerCase()===`true`||t===`1`}return $e(t)}function tt(e,t=null){let n=X(e,t),r=n.maxTokens,i=n.temperature,a=n.modelId,o=n.provider,s=r,c=i;try{let e=V[o];if(e&&Array.isArray(e)){let t=e.find(e=>e.id===a);if(t&&typeof t.max_tokens==`number`&&t.max_tokens>0){let e=t.max_tokens;s=Math.min(r,e),w(`debug`,`Applying model-specific max_tokens (${e}) for ${a}. Effective limit: ${s}`)}else w(`debug`,`No valid model-specific max_tokens override found for ${a}. Using role default: ${r}`);t&&typeof t.temperature==`number`&&t.temperature>=0&&t.temperature<=1&&(c=t.temperature,w(`debug`,`Applying model-specific temperature (${t.temperature}) for ${a}`))}else w(`debug`,`No model definitions found for provider ${o} in MODEL_MAP. Using role default maxTokens: ${r}`)}catch(e){w(`warn`,`Error looking up model-specific parameters for ${a}: ${e.message}. Using role defaults.`),s=r,c=i}return{maxTokens:s,temperature:c}}function nt(){let e=[];for(let[t,n]of Object.entries(V))n.length>0&&n.filter(e=>!!e.supported).forEach(n=>{let r=n.id,i=n.swe_score,a=n.cost_per_1m_tokens,o=n.allowed_roles||[`main`,`fallback`],s=n.name;s||=r.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),e.push({id:r,name:s,provider:t,swe_score:i,cost_per_1m_tokens:a,allowed_roles:o,max_tokens:n.max_tokens})});return e}function $(e,t=null){let n=t;if(t==null){let e=x();if(!e)return console.error(a.red(`Error: Could not determine project root. Configuration not saved.`)),!1;n=e}let r=o.join(n,`.taskgraph`),i=o.join(r,`config.json`);try{return l.existsSync(r)||l.mkdirSync(r,{recursive:!0}),l.writeFileSync(i,JSON.stringify(e,null,2)),U=e,!0}catch(e){return console.error(a.red(`Error writing configuration to ${i}: ${e.message}`)),!1}}function rt(e=null){return B(null,{projectRoot:e})!==null}function it(e=null){let t=K(e);return t.global||={},t.global.userId||(t.global.userId=`1234567890`,$(t,e)||w(`warning`,`Failed to write updated configuration with new userId. Please let the developers know.`)),t.global.userId}export{De as $,$ as A,m as At,N as B,Ue as C,se as Ct,et as D,h as Dt,G as E,ie as Et,z as F,I as G,A as H,Ae as I,xe as J,we as K,R as L,Me as M,ee as Mt,B as N,oe as Nt,J as O,f as Ot,je as P,te as Pt,P as Q,Ne as R,it as S,re as St,rt as T,ce as Tt,ge as U,Ee as V,he as W,Oe as X,ve as Y,be as Z,$e as _,ue as _t,K as a,E as at,Qe as b,de as bt,Xe as c,D as ct,Ge as d,ye as dt,Ce as et,qe as f,Te as ft,Ze as g,le as gt,tt as h,M as ht,Re as i,k as it,V as j,ne as jt,q as k,p as kt,Je as l,b as lt,ze as m,y as mt,nt as n,w as nt,Q as o,O as ot,Be as p,Se as pt,x as q,Y as r,j as rt,Ye as s,_e as st,Fe as t,C as tt,Ke as u,F as ut,We as v,g as vt,He as w,ae as wt,Le as x,_ as xt,Ve as y,fe as yt,S as z};