taskgraph-ai 0.52.23 → 0.54.12

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 (40) hide show
  1. package/README.md +38 -34
  2. package/dist/ai-services-unified-BPPVDTpt.js +3 -0
  3. package/dist/ai-services-unified-Dskm2lPO.js +1 -0
  4. package/dist/assets/AGENTS.md +12 -13
  5. package/dist/commands-DJc5m0Gi.js +126 -0
  6. package/dist/config-manager-CKwBfpAp.js +1 -0
  7. package/dist/config-manager-Db2R8Tgw.js +1 -0
  8. package/dist/git-utils-CRR3iPaC.js +1 -0
  9. package/dist/{git-utils--i2q96hv.js → git-utils-NnZtE3nY.js} +1 -1
  10. package/dist/init-CK_i6ZcN.js +24 -0
  11. package/dist/mcp-server.js +2 -2
  12. package/dist/research-BKsPc_oX.js +1 -0
  13. package/dist/research-C8rAJdp0.js +585 -0
  14. package/dist/{response-language-ip84ug-k.js → response-language-C8euRV2w.js} +1 -1
  15. package/dist/response-language-DiIdcmnK.js +1 -0
  16. package/dist/rolldown-runtime-BxhE39jg.js +1 -0
  17. package/dist/src-CK3olqVP.js +468 -0
  18. package/dist/src-DRpuDe-k.js +207 -0
  19. package/dist/tag-management-BL0w3Tk3.js +1 -0
  20. package/dist/task-manager-B_UFNQnE.js +1 -0
  21. package/dist/task-manager-BipYRXFW.js +167 -0
  22. package/dist/taskgraph.js +1 -1
  23. package/package.json +3 -8
  24. package/dist/ai-services-unified-CigO4oTy.js +0 -1
  25. package/dist/ai-services-unified-kmQRPU0g.js +0 -3
  26. package/dist/assets/claude/TM_COMMANDS_GUIDE.md +0 -147
  27. package/dist/assets/scripts_README.md +0 -443
  28. package/dist/commands-dFNugMWF.js +0 -116
  29. package/dist/config-manager-C5Ih13nA.js +0 -1
  30. package/dist/config-manager-DhVH8AQp.js +0 -1
  31. package/dist/dependency-manager-CCREovZA.js +0 -758
  32. package/dist/git-utils-BezpEZd4.js +0 -1
  33. package/dist/init-p_pWjmVE.js +0 -3139
  34. package/dist/research-blv_5JOT.js +0 -1
  35. package/dist/response-language-D9UxmXBp.js +0 -1
  36. package/dist/src-TZm8h0X-.js +0 -207
  37. package/dist/src-yE1DeXKG.js +0 -468
  38. package/dist/tag-management-Br2FX-YC.js +0 -1
  39. package/dist/task-manager-DWPIhAB7.js +0 -1
  40. package/index.js +0 -157
@@ -0,0 +1 @@
1
+ import{E as e,T as t,c as n,j as r,u as i}from"./src-DRpuDe-k.js";import{t as a}from"./git-utils-NnZtE3nY.js";import o from"chalk";import s from"path";import{z as c}from"zod";import l from"dotenv";import u from"fs";import{fileURLToPath as d}from"url";import{AsyncLocalStorage as f}from"async_hooks";const ee=[`add-task`,`analyze-complexity`,`expand-task`,`parse-prd`,`research`,`research-save`,`update-subtask`,`update-task`,`update-tasks`],te=`.taskgraph`,ne=`.taskgraph/tasks`,p=`.taskgraph/docs`,m=`.taskgraph/reports`,re=`.taskgraph/templates`,h=`.taskgraph/config.json`,ie=`.taskgraph/state.json`,g=`.taskgraph/reports/task-complexity-report.json`,ae=`.taskgraph/docs/prd.txt`,oe=`.taskgraph/templates/example_prd.txt`,_=`.taskgraph/tasks/tasks.json`,se=`.env.example`,ce=`.gitignore`,v={primary:`#0088CC`,accent:`#0096C7`,deep:`#0080C0`},le=[v.accent,v.primary,v.deep],ue=v.accent,de=[`dim`],fe={dimBorder:!0},pe={brand:o.cyan,heading:o.cyan.bold,accent:o.magenta,active:o.cyan.bold,muted:o.dim,text:o};let y=!1;const me={maxRetries:5,retryDelay:100,staleLockAge:1e4};function he(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 ge(e,t,n={}){let{createIfMissing:r=!1}=n,i=s.dirname(e);if(u.existsSync(i)||u.mkdirSync(i,{recursive:!0}),r)try{u.writeFileSync(e,`{}`,{flag:`wx`})}catch(e){if(e.code!==`EEXIST`)throw e}let a=`${e}.lock`,{maxRetries:o,retryDelay:c,staleLockAge:l}=me,d=!1;for(let e=0;e<o;e++)try{let e=JSON.stringify({pid:process.pid,timestamp:Date.now()});u.writeFileSync(a,e,{flag:`wx`}),d=!0;break}catch(t){if(t.code===`EEXIST`){try{let e=u.statSync(a);if(Date.now()-e.mtimeMs>l){let e=`${a}.stale.${process.pid}.${Date.now()}`;try{u.renameSync(a,e);try{u.rmSync(e,{recursive:!0,force:!0})}catch{}continue}catch{}}}catch(e){if(e.code===`ENOENT`)continue;throw e}e<o-1&&he(c*2**e)}else throw t}if(!d)throw Error(`Failed to acquire lock on ${e} after ${o} attempts`);try{return t()}finally{try{u.unlinkSync(a)}catch(t){T(`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=s.join(n,`.env`);if(u.existsSync(t))try{let n=u.readFileSync(t,`utf-8`),r=l.parse(n);if(r&&r[e])return r[e]}catch(e){T(`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=s.resolve(e),r=s.parse(n).root;for(;n!==r;){if(t.some(e=>{let t=s.join(n,e);return u.existsSync(t)}))return n;n=s.dirname(n)}return t.some(e=>{let t=s.join(r,e);return u.existsSync(t)})?r:null}const S={debug:0,info:1,warn:2,error:3,success:1},C=new f;function _e(e){return C.run({silent:w()},e)}function ve(){let e=C.getStore();e?e.silent=!0:y=!0}function ye(){let e=C.getStore();e?e.silent=!1:y=!1}function w(){let e=C.getStore();return e?e.silent:y}function T(e,...t){if(w())return;let n=`info`;try{n=nt()||`info`}catch{n=`info`}let r={debug:pe.muted(`[debug]`),info:``,warn:o.yellow(`⚠`),error:o.red(`✗`),success:o.green(`✓`)},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?`${e} ${n}`:n)}}function E(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 D(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 be(e,t){let n=s.relative(process.cwd(),e),r=n&&!n.startsWith(`..`)&&!s.isAbsolute(n)?n:e,i=/\(line (\d+) column (\d+)\)/.exec(t.message),a=i?` (line ${i[1]}, column ${i[2]})`:``,o=Error(`${r} isn't valid JSON${a}`,{cause:t});return o.code=`JSON_PARSE_ERROR`,o}function O(e,t=null,n=null){let r=!1;try{r=$()}catch{}if(r&&console.log(`readJSON called with: ${e}, projectRoot: ${t}, tag: ${n}`),!e)return null;let i;try{i=JSON.parse(u.readFileSync(e,`utf8`)),r&&console.log(`Successfully read JSON from ${e}`)}catch(t){if(r&&console.log(`Failed to read JSON from ${e}: ${t.message}`),t instanceof SyntaxError&&s.basename(e)===`tasks.json`)throw be(e,t);return null}if(!e.includes(`tasks.json`)||!i)return r&&console.log(`File is not tasks.json or data is null, returning as-is`),i;if(Array.isArray(i.tasks)&&!i._rawTaggedData&&!E(i)){r&&console.log(`File is in legacy format, performing migration...`),D(i.tasks);let n={master:{tasks:i.tasks,metadata:i.metadata||{created:(/* @__PURE__ */ new Date()).toISOString(),updated:(/* @__PURE__ */ new Date()).toISOString(),description:`Tasks for master context`}}};try{if(j(e,n),r&&console.log(`Successfully migrated legacy format to tagged format`),k(e),t)try{a(t,e)}catch{}Ce(e)}catch(e){r&&console.log(`Error writing migrated data: ${e.message}`)}i=n}if(typeof i==`object`&&!i.tasks){r&&console.log(`File is in tagged format, resolving tag...`);for(let e in i)if(i.hasOwnProperty(e)&&typeof i[e]==`object`&&i[e].tasks)try{I(i[e],{description:`Tasks for ${e} context`,skipUpdate:!0})}catch(t){r&&console.log(`Failed to ensure metadata for tag ${e}: ${t.message}`)}let o=JSON.parse(JSON.stringify(i));for(let e in o)o[e]&&Array.isArray(o[e].tasks)&&D(o[e].tasks);if(t)try{a(t,e)}catch{}try{let a=`master`;try{if(n)a=n;else if(t)a=F({projectRoot:t});else{let t=x(s.dirname(e));t&&(a=F({projectRoot:t}))}}catch(e){r&&console.log(`Tag resolution failed, using master: ${e.message}`)}r&&console.log(`Resolved tag: ${a}`);let c=i[a];if(c&&c.tasks){D(c.tasks);let e={...c,tag:a,_rawTaggedData:o};return r&&console.log(`Returning data for tag '${a}' with ${c.tasks.length} tasks`),e}{let e=i.master;return e&&e.tasks?(D(e.tasks),r&&console.log(`Tag '${a}' not found, falling back to master with ${e.tasks.length} tasks`),{...e,tag:`master`,_rawTaggedData:o}):(r&&console.log(`No valid tag data found, returning empty structure`),{tasks:[],tag:`master`,_rawTaggedData:o})}}catch(e){r&&console.log(`Error during tag resolution: ${e.message}`);let t=i.master;return t&&t.tasks?(D(t.tasks),{...t,_rawTaggedData:o}):{tasks:[],_rawTaggedData:o}}}return r&&console.log(`File format not recognized, returning as-is`),i}function k(e){try{let t=x(s.dirname(e))||s.dirname(e),n=s.join(t,`.taskgraph`,`config.json`);u.existsSync(n)&&xe(n);let r=s.join(t,`.taskgraph`,`state.json`);u.existsSync(r)||Se(r),$()&&T(`debug`,`Complete tag migration performed for project: ${t}`)}catch(e){$()&&T(`warn`,`Error during complete tag migration: ${e.message}`)}}function xe(e){try{let t=u.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&&(u.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 Se(e){try{let t={currentTag:`master`,lastSwitched:(/* @__PURE__ */ new Date()).toISOString(),branchTagMapping:{},migrationNoticeShown:!1};u.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 Ce(e){try{let t=s.join(s.dirname(s.dirname(e)),`state.json`);u.existsSync(t)||Se(t);try{let e=u.readFileSync(t,`utf8`),n=JSON.parse(e)||{};n.migrationNoticePending=!0,n.migrationNoticeShown=!1,u.writeFileSync(t,JSON.stringify(n,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}`)}}let A=null;function we(){return A||=new r,A}async function Te(e,t){await we().modifyJson(e,t)}function j(e,t,n=null,r=null){let i=process.env.TASKGRAPH_DEBUG===`true`;try{ge(e,()=>{let a=t;if(t&&!t._rawTaggedData&&n&&Array.isArray(t.tasks)&&!E(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(u.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(u.readFileSync(e,`utf8`))}catch(e){s=t._rawTaggedData,i&&console.log(`writeJSON: Using _rawTaggedData as fallback: ${e.message}`)}if(!s[o]&&t.tag!==o)throw Error(`Tag "${o}" not found`);let{_rawTaggedData:c,tag:l,...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{u.writeFileSync(s,JSON.stringify(o,null,2),`utf8`),u.renameSync(s,e)}catch(e){try{u.existsSync(s)&&u.unlinkSync(s)}catch{}throw e}i&&console.log(`writeJSON: Successfully wrote to ${e}`)},{createIfMissing:!0})}catch(t){throw T(`error`,`Error writing JSON file ${e}:`,t.message),i&&T(`error`,`Full error details:`,t),t}}function Ee(e=null){let t=!1;try{t=$()}catch{t=!1}try{let n;if(n=e||s.join(process.cwd(),g),!u.existsSync(n))return t&&T(`debug`,`Complexity report not found at ${n}`),null;let r=O(n);return t&&T(`debug`,`Successfully read complexity report from ${n}`),r}catch(e){return t&&T(`error`,`Error reading complexity report: ${e.message}`),null}}function M(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=M(t,n);r&&(e.complexityScore=r.complexityScore)}function De(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 Oe(e){return typeof e==`string`&&e.includes(`.`)?e:typeof e==`number`?e.toString():e}function ke(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 Ae(e,t){return!e||e.length<=t?e:`${e.slice(0,t-3)}...`}function je(e){return Array.isArray(e)?e.length===0:typeof e==`object`&&e?Object.keys(e).length===0:!1}function Me(e,t,n={}){let{maxDepth:r=50,includeSelf:i=!1,direction:a=`forward`,logger:o=null}=n,s=/* @__PURE__ */ new Set,c=/* @__PURE__ */ 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):T!==void 0&&T.warn?T.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):T!==void 0&&T.warn?T.warn(t):console.warn(t)}else 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 Ne(e,t){if(!e||e.length===0)return null;let n={timestamp:(/* @__PURE__ */ new Date()).toISOString(),userId:e[0].userId,commandName:t,modelUsed:`Multiple`,providerName:`Multiple`,inputTokens:0,outputTokens:0,cachedInputTokens:0,totalTokens:0,totalCost:0,currency:e[0].currency||`USD`},r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set,a=/* @__PURE__ */ new Set;return e.forEach(e=>{n.inputTokens+=e.inputTokens||0,n.outputTokens+=e.outputTokens||0,n.cachedInputTokens+=e.cachedInputTokens||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=s.join(e,`.taskgraph`,`state.json`);if(u.existsSync(t)){let e=u.readFileSync(t,`utf8`),n=JSON.parse(e);if(n&&n.currentTag)return n.currentTag}}catch{}try{let t=s.join(e,`.taskgraph`,`config.json`);if(u.existsSync(t)){let e=u.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 Pe(e,t){return!e||!t?[]:e[t]&&e[t].tasks&&Array.isArray(e[t].tasks)?e[t].tasks:[]}function Fe(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=(/* @__PURE__ */ 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 Ie(){return{info:(e,...t)=>T(`info`,e,...t),warn:(e,...t)=>T(`warn`,e,...t),error:(e,...t)=>T(`error`,e,...t),debug:(e,...t)=>T(`debug`,e,...t),success:(e,...t)=>T(`success`,e,...t)}}function L(e=null){return e||Ie()}function R(e){return i(e)}function z(e=process.cwd()){return n(e)}function Le(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=s.isAbsolute(e)?e:s.resolve(a,e);if(u.existsSync(t))return r.info?.(`Using explicit tasks path: ${t}`),t;r.warn?.(`Explicit tasks path not found: ${t}, trying fallbacks`)}let o=s.join(a,_);return u.existsSync(o)?(r.info?.(`Found tasks file at: ${o}`),o):(r.warn?.(`No tasks.json found in project: ${a}`),null)}function Re(e=null,t=null,n=null){let r=L(n);if(e){let t=process.env.TASKGRAPH_ORIGINAL_CWD||process.cwd(),n=s.isAbsolute(e)?e:s.resolve(t,e);if(u.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=s.join(a,p,e);if(u.existsSync(t))return r.info?.(`Found PRD document at: ${t}`),t}return r.warn?.(`No PRD document found in project: ${a}`),null}function ze(e=null,t=null,n=null){let r=L(n);if(e){let t=process.env.TASKGRAPH_ORIGINAL_CWD||process.cwd(),n=s.isAbsolute(e)?e:s.resolve(t,e);if(u.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),o=[`task-complexity-report`,`task-complexity`,`complexity-report`].map(e=>t?.tag&&t?.tag!==`master`?`${e}_${t.tag}.json`:`${e}.json`);for(let e of o){let t=s.join(a,m,e);if(u.existsSync(t))return r.info?.(`Found complexity report at: ${t}`),t}return r.warn?.(`No complexity report found in project: ${a}`),null}function Be(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=s.isAbsolute(e)?e:s.resolve(t,e);return r.info?.(`Using explicit complexity report output path: ${n}`),n}let a=R(t?.projectRoot||z()||process.cwd()),o=`task-complexity-report.json`;i&&i!==`master`&&(o=`task-complexity-report_${i}.json`);let c=s.join(a,`.taskgraph/reports`,o);r.info?.(`Using tag-aware complexity report output path: ${c}`);let l=s.dirname(c);return u.existsSync(l)||(r.info?.(`Creating reports directory: ${l}`),u.mkdirSync(l,{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=s.isAbsolute(e)?e:s.resolve(t,e);if(u.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),o=s.join(a,h);if(u.existsSync(o))return o;if(!G()){let e=`config_warning_${a}`;global._tmConfigWarningsThisRun||(global._tmConfigWarningsThisRun=/* @__PURE__ */ new Set),global._tmConfigWarningsThisRun.has(e)||(global._tmConfigWarningsThisRun.add(e),r.debug?.(`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 Ve=d(import.meta.url);s.dirname(Ve);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 He(e){global._tmSuppressConfigWarnings=e}function G(){return global._tmSuppressConfigWarnings===!0}var Ue=class extends Error{constructor(e){super(e),this.name=`ConfigurationError`}};function We(e=null){let t=H,n=e;e&&`${e}`,n||(n=x(),n||=process.cwd(),`${n}`);let r=null,i={...t};if(u.existsSync(s.join(n,`.taskgraph`))&&(r=B(null,{projectRoot:n})),r)try{let e=u.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}`,J(i.models.main.provider)||(console.warn(o.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}),J(i.models.research.provider)||(console.warn(o.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&&!J(i.models.fallback.provider)&&(console.warn(o.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&&!je(i.claudeCode)&&(i.claudeCode=Y(i.claudeCode))}catch(e){console.error(o.red(`Error reading or parsing ${r}: ${e.message}. Using default configuration.`)),i={...t},`${r}`}else(e||u.existsSync(s.join(n,`.taskgraph/tasks/tasks.json`)))&&!G()&&Ge(e||n),i={...t},`${n}`;return i}const K=/* @__PURE__ */ new Set;function Ge(e){K.has(e)||(K.add(e),console.warn(`${o.yellow(`⚠`)} No .taskgraph/config.json in ${e}; using default settings\n`+o.dim(` Run taskgraph init to recreate it`)))}function q(e=null,t=!1){if(!U||t||e&&e!==W){let n=We(e);return(t||e)&&(U=n,W=e),n}return U}function J(t){return!!e.includes(t)}function Ke(e){return V[e]?V[e].filter(e=>e.supported!==!1).map(e=>e.id):[]}function Y(e){let t=c.object({pathToClaudeCodeExecutable:c.string().optional(),maxTurns:c.number().int().positive().optional(),customSystemPrompt:c.string().optional(),appendSystemPrompt:c.string().optional(),permissionMode:c.enum([`default`,`acceptEdits`,`plan`,`bypassPermissions`]).optional(),allowedTools:c.array(c.string()).optional(),disallowedTools:c.array(c.string()).optional(),mcpServers:c.record(c.string(),c.object({type:c.enum([`stdio`,`sse`]).optional(),command:c.string(),args:c.array(c.string()).optional(),env:c.record(c.string(),c.string()).optional(),url:c.url().optional(),headers:c.record(c.string(),c.string()).optional()})).optional()}),n=c.record(c.string(),t).refine(e=>Object.keys(e||{}).every(e=>ee.includes(e)),{message:`Invalid command name in commandSpecific`}),r=t.extend({commandSpecific:n.optional()}),i={};try{i=r.parse(e)}catch(e){console.warn(o.yellow(`Warning: Invalid Claude Code settings in config: ${e.message}. Falling back to default.`)),i={}}return i}function X(e=null,t=!1){let n=q(e,t);return{...H.claudeCode,...n?.claudeCode||{}}}function qe(e,t=null,n=!1){let r=X(t,n),i=r?.commandSpecific||{};return{...r,...i[e]}}function Z(e,t=null){return q(t)?.models?.[e]||(T(`warn`,`No model configuration found for role: ${e}. Returning default.`),H.models[e]||{})}function Je(e=null){return Z(`main`,e).provider}function Ye(e=null){return Z(`main`,e).modelId}function Xe(e=null){return Z(`research`,e).provider}function Ze(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 Q(t).enableCodebaseAnalysis!==!1}function Qe(e=!1,n=null,r=null){return!Ze(r,n)||e?!1:(e?Xe(n):Je(n))===t.CLAUDE_CODE}function $e(e=null){return Z(`research`,e).modelId}function et(e=null){return Z(`fallback`,e).provider}function tt(e=null){return Z(`fallback`,e).modelId}function Q(e=null){let t=q(e);return{...H.global,...t?.global||{}}}function nt(e=null){return Q(e).logLevel.toLowerCase()}function $(e=null){return Q(e).debug===!0}function rt(e=null){let t=Q(e).defaultSubtasks,n=parseInt(t,10);return Number.isNaN(n)?H.global.defaultSubtasks:n}function it(e=null){let t=Q(e).defaultNumTasks,n=parseInt(t,10);return Number.isNaN(n)?H.global.defaultNumTasks:n}function at(e=null){return Q(e).defaultPriority}function ot(e=null){return Q(e).projectName}function st(e=null){return Q(e).responseLanguage}function ct(e=null){return Q(e).enableProxy===!0}function lt(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 ct(t)}function ut(e,t=null){let n=Z(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),T(`debug`,`Applying model-specific max_tokens (${e}) for ${a}. Effective limit: ${s}`)}else T(`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,T(`debug`,`Applying model-specific temperature (${t.temperature}) for ${a}`))}else T(`debug`,`No model definitions found for provider ${o} in MODEL_MAP. Using role default maxTokens: ${r}`)}catch(e){T(`warn`,`Error looking up model-specific parameters for ${a}: ${e.message}. Using role defaults.`),s=r,c=i}return{maxTokens:s,temperature:c}}function dt(){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 ft(e,t=null){let n=t;if(t==null){let e=x();if(!e)return console.error(o.red(`Error: Could not determine project root. Configuration not saved.`)),!1;n=e}let r=s.join(n,`.taskgraph`),i=s.join(r,`config.json`);try{return u.existsSync(r)||u.mkdirSync(r,{recursive:!0}),u.writeFileSync(i,JSON.stringify(e,null,2)),U=e,!0}catch(e){return console.error(o.red(`Error writing configuration to ${i}: ${e.message}`)),!1}}function pt(e=null){return B(null,{projectRoot:e})!==null}function mt(e=null){let t=q(e);return t.global||={},t.global.userId||(t.global.userId=`1234567890`,ft(t,e)||T(`warning`,`Failed to write updated configuration with new userId. Please let the developers know.`)),t.global.userId}export{T as $,J as A,re as At,N as B,Qe as C,h as Ct,lt as D,ie as Dt,G as E,m as Et,Re as F,x as G,ye as H,z as I,Fe as J,ke as K,Le as L,V as M,ze as N,He as O,ne as Ot,B as P,w as Q,R,mt as S,ae as St,pt as T,p as Tt,ve as U,Ne as V,I as W,P as X,Oe as Y,Pe as Z,ct as _,pe as _t,q as a,b as at,st as b,oe as bt,at as c,Me as ct,et as d,j as dt,Ce as et,nt as f,le as ft,ot as g,de as gt,ut as h,fe as ht,qe as i,O as it,ft as j,Y as k,_ as kt,rt as l,Ae as lt,Je as m,v as mt,dt as n,k as nt,$ as o,F as ot,Ye as p,ue as pt,M as q,X as r,Ee as rt,it as s,De as st,Ue as t,Te as tt,tt as u,_e as ut,$e as v,g as vt,Ze as w,te as wt,Ke as x,ce as xt,Xe as y,se as yt,Be as z};
@@ -0,0 +1 @@
1
+ import"./src-DRpuDe-k.js";export{S as getUserId}from"./config-manager-CKwBfpAp.js";
@@ -0,0 +1 @@
1
+ export{n as getCurrentBranch,i as isGitRepository,a as isValidBranchForTag,o as sanitizeBranchNameForTag}from"./git-utils-NnZtE3nY.js";
@@ -1 +1 @@
1
- import"path";import{exec as e,execSync as t}from"child_process";import{promisify as n}from"util";import"fs";const r=n(e);async function i(e){if(!e)throw Error(`projectRoot is required for isGitRepository`);try{return await r(`git rev-parse --git-dir`,{cwd:e}),!0}catch{return!1}}async function a(e){if(!e)throw Error(`projectRoot is required for getCurrentBranch`);try{let{stdout:t}=await r(`git rev-parse --abbrev-ref HEAD`,{cwd:e});return t.trim()}catch{return null}}function o(e){return!e||typeof e!=`string`?`unknown-branch`:e.replace(/[^a-zA-Z0-9_-]/g,`-`).replace(/^-+|-+$/g,``).replace(/-+/g,`-`).toLowerCase().substring(0,50)}function s(e){if(!e||typeof e!=`string`||[`main`,`master`,`develop`,`dev`,`HEAD`].includes(e.toLowerCase()))return!1;let t=o(e);return t.length>0&&t!==`unknown-branch`}function c(e,t){}function l(){try{return t(`git rev-parse --is-inside-work-tree`,{stdio:`ignore`,cwd:process.cwd()}),!0}catch{return!1}}export{s as a,i,a as n,o,l as r,c as t};
1
+ import"path";import{exec as e,execSync as t}from"child_process";import{promisify as n}from"util";import"fs";const r=n(e);async function i(e){if(!e)throw Error(`projectRoot is required for isGitRepository`);try{return await r(`git rev-parse --git-dir`,{cwd:e}),!0}catch{return!1}}async function a(e){if(!e)throw Error(`projectRoot is required for getCurrentBranch`);try{let{stdout:t}=await r(`git rev-parse --abbrev-ref HEAD`,{cwd:e});return t.trim()}catch{return null}}function o(e){return!e||typeof e!=`string`?`unknown-branch`:e.replace(/[^a-zA-Z0-9_-]/g,`-`).replace(/^-+|-+$/g,``).replace(/-+/g,`-`).toLowerCase().substring(0,50)}function s(e){if(!e||typeof e!=`string`||[`main`,`master`,`develop`,`dev`,`head`].includes(e.toLowerCase()))return!1;let t=o(e);return t.length>0&&t!==`unknown-branch`}function c(e,t){}function l(){try{return t(`git rev-parse --is-inside-work-tree`,{stdio:`ignore`,cwd:process.cwd()}),!0}catch{return!1}}export{s as a,i,a as n,o,l as r,c as t};
@@ -0,0 +1,24 @@
1
+ import{t as e}from"./rolldown-runtime-BxhE39jg.js";import{$ as t,At as n,Ct as r,Dt as i,Et as a,M as o,Ot as s,Q as c,Tt as l,_t as u,bt as ee,kt as d,wt as f,xt as p,yt as m}from"./config-manager-CKwBfpAp.js";import{r as h}from"./git-utils-NnZtE3nY.js";import{G as g,I as te}from"./src-CK3olqVP.js";import _ from"chalk";import{join as v}from"node:path";import{existsSync as y,readdirSync as b,rmSync as x,rmdirSync as S,statSync as ne}from"node:fs";import C from"path";import{execSync as w}from"child_process";import T from"fs";import{fileURLToPath as re}from"url";import E from"readline";import ie from"os";import{randomUUID as ae}from"crypto";const D=[`claude`];function oe(e){return e.filter(e=>!se(e))}function se(e){return D.includes(e)}const O=`tasks.json`,k=`tasks/`;function A(e){return e.trim().replace(/^#/,``).trim()}function j(e){let t=A(e);return t===`tasks.json`||t===`tasks/`}function ce(e,t){return e.map(e=>{if(j(e)){let n=A(e),r=e.match(/\s*$/)[0];return t?`# ${n}${r}`:`${n}${r}`}return e})}function le(e){let t=[],n=!1;for(let r of e)r.trim()===`# Task files`?n=!0:j(r)||(!n||r.trim())&&(n&&r.trim()&&!j(r)&&(n=!1),n||t.push(r));return t}function ue(e,t){return e.filter(e=>{let n=e.trim();return!n||j(e)||n===`# Task files`?!1:!t.has(n)})}function M(e){let t=[`# Task files`];return e?t.push(`# ${O}`,`# ${k} `):t.push(O,`${k} `),t}function de(e,t){if(e.some(j))return e;let n=[...e];for(;n.length>0&&!n[n.length-1].trim();)n.pop();return N(n),n.push(...M(t)),n}function N(e){if(e.some(e=>e.trim())){let t=e[e.length-1];t&&t.trim()&&e.push(``)}}function fe(e,t,n){if(!e||typeof e!=`string`)throw Error(`targetPath must be a non-empty string`);if(!e.endsWith(`.gitignore`))throw Error(`targetPath must end with .gitignore`);if(!t||typeof t!=`string`)throw Error(`content must be a non-empty string`);if(typeof n!=`boolean`)throw Error(`storeTasksInGit must be a boolean`)}function pe(e,t,n){try{T.writeFileSync(e,t.join(`
2
+ `)+`
3
+ `),typeof n==`function`&&n(`success`,`Created ${e} with full template`)}catch(t){throw typeof n==`function`&&n(`error`,`Failed to create ${e}: ${t.message}`),t}}function me(e,t,n,r){try{let i=le(T.readFileSync(e,`utf8`).split(`
4
+ `)),a=ue(t,new Set(i.map(e=>e.trim()).filter(e=>e))),o=[...i];a.length>0&&(N(o),o.push(...a)),N(o),o.push(...M(n)),T.writeFileSync(e,o.join(`
5
+ `)+`
6
+ `),typeof r==`function`&&r(`debug`,`Updated ${e} according to user preference${a.length>0?` and merged new content`:``}`)}catch(t){throw typeof r==`function`&&r(`error`,`Failed to merge content with ${e}: ${t.message}`),t}}function he(e){try{if(!T.existsSync(e))return;let t=T.readFileSync(e,`utf8`).split(`
7
+ `).find(e=>A(e)===O);return t===void 0?void 0:t.trim().startsWith(`#`)}catch{return}}function ge(e,t,n=!0,r=null){fe(e,t,n);let i=ce(t.split(`
8
+ `),n);T.existsSync(e)?me(e,i,n,r):pe(e,de(i,n),r)}const _e=re(import.meta.url),P=C.dirname(_e);function F(){let e=[C.join(P,`assets`),C.join(P,`..`,`assets`),C.join(P,`..`,`..`,`public`,`assets`),C.join(process.cwd(),`assets`),C.join(process.cwd(),`node_modules`,`taskgraph-ai`,`dist`,`assets`),C.join(process.cwd(),`node_modules`,`taskgraph-ai`,`assets`)];for(let t of e)if(T.existsSync(t)){let e=C.join(t,`AGENTS.md`);if(T.existsSync(e))return t}throw Error(`Assets directory not found. This is likely a packaging issue.`)}function I(e){let t=F();return C.join(t,e)}function ve(e){try{let t=I(e);return T.existsSync(t)}catch{return!1}}function L(e,t=`utf8`){let n=I(e);return T.readFileSync(n,t)}const R=`taskgraph-ai`;function ye(e){return Array.isArray(e?.args)&&e.args.some(e=>typeof e==`string`&&e.includes(`taskgraph-ai`))}function z(e){let t=JSON.stringify(e,null,` `);return t=t.replace(/(\[\n\t+)([^[\]]+?)(\n\t+\])/g,(e,t,n,r)=>!n.includes(`{`)&&!n.includes(`[`)?`[${n.replace(/\n\t+/g,` `).replace(/\s+/g,` `).trim()}]`:e),t}function be(e,n){if(!n){t(`debug`,`[MCP Config] No mcpConfigPath provided, skipping MCP configuration setup`);return}let r=C.join(e,n),i=C.dirname(r);t(`debug`,`Setting up MCP configuration at ${r}...`);let a={[R]:{command:`npx`,args:[`-y`,R],env:{TASKGRAPH_TOOLS:`core`}}};if(T.existsSync(i)||T.mkdirSync(i,{recursive:!0}),T.existsSync(r)){t(`debug`,`MCP configuration file already exists, checking for existing taskgraph-ai...`);try{let e=JSON.parse(T.readFileSync(r,`utf8`));if(e.mcpServers||={},Object.values(e.mcpServers).some(ye)){t(`debug`,`Found existing taskgraph-ai MCP configuration in mcp.json, leaving untouched`);return}e.mcpServers[`taskgraph-ai`]?t(`debug`,`taskgraph-ai server already configured in mcp.json`):(e.mcpServers[R]=a[R],t(`debug`,`Added taskgraph-ai server to existing MCP configuration`)),T.writeFileSync(r,z(e)+`
9
+ `),t(`debug`,`Updated MCP configuration file`)}catch(e){t(`error`,`Failed to update MCP configuration: ${e.message}`);let n=`${r}.backup-${Date.now()}`;T.existsSync(r)&&(T.copyFileSync(r,n),t(`warn`,`Saved the old file as ${n}`));let i={mcpServers:a};T.writeFileSync(r,z(i)+`
10
+ `),t(`warn`,`Created new MCP configuration file (backup of original file was created if it existed)`)}}else{let e={mcpServers:a};T.writeFileSync(r,z(e)+`
11
+ `),t(`debug`,`Created MCP configuration file at ${r}`)}t(`debug`,`MCP server will use the installed taskgraph-ai package`)}function xe(e){let{name:t,displayName:n=t,profileDir:r=`.${t.toLowerCase()}`,rulesDir:i=`${r}/rules`,mcpConfig:a=!0,mcpConfigName:o=a?`mcp.json`:null,fileMap:s={},onAdd:c,onPostConvert:l}=e;return{profileName:t,displayName:n,profileDir:r,rulesDir:i,mcpConfig:a,mcpConfigName:o,mcpConfigPath:o?C.join(r,o):null,fileMap:s,...c&&{onAddRulesProfile:c},...l&&{onPostConvertRulesProfile:l}}}function Se(){let e=ie.homedir(),t=process.env.SHELL||``;if(t.includes(`zsh`))return C.join(e,`.zshrc`);if(t.includes(`bash`)){let t=C.join(e,`.bash_profile`);return process.platform===`darwin`?t:C.join(e,`.bashrc`)}if(t.includes(`fish`))return C.join(e,`.config`,`fish`,`config.fish`);if(process.platform===`win32`){if(process.env.PSModulePath){let t=process.env.PROFILE||C.join(e,`Documents`,`WindowsPowerShell`,`Microsoft.PowerShell_profile.ps1`),n=C.join(e,`Documents`,`PowerShell`,`Microsoft.PowerShell_profile.ps1`);return T.existsSync(n)?n:T.existsSync(t)?t:n}let t=C.join(e,`.bashrc`);if(T.existsSync(t))return t}let n=C.join(e,`.zshrc`);if(T.existsSync(n))return n;let r=C.join(e,`.bashrc`);return T.existsSync(r)?r:null}function B(e){return e.endsWith(`.ps1`)}function V(e){return e.includes(`config.fish`)}function Ce(e,t,n){if(!/^[A-Z_][A-Z0-9_]*$/i.test(e))return{success:!1,message:`Invalid environment variable name: ${e}. Must start with a letter or underscore and contain only alphanumeric characters and underscores.`};if(typeof t!=`string`||t.includes(`
12
+ `)||t.includes(`\r`))return{success:!1,message:`Invalid value: must be a single-line string without newlines`};let r=Se();if(!r)return{success:!1,message:`Could not determine shell type (zsh, bash, fish, or PowerShell)`};try{let i=C.dirname(r);if(T.existsSync(i)||T.mkdirSync(i,{recursive:!0}),!T.existsSync(r)){let e=process.platform===`darwin`&&r.endsWith(`.bash_profile`);if(B(r)||e)T.writeFileSync(r,``);else return{success:!1,shellConfigFile:r,message:`Shell config file ${r} not found`}}let a=T.readFileSync(r,`utf8`),o;if(o=B(r)?RegExp(`^\\s*\\$env:${e}\\s*=`,`m`).test(a):V(r)?RegExp(`^\\s*set\\s+-[gux]*x[gux]*\\s+${e}\\s+`,`m`).test(a):RegExp(`^\\s*export\\s+${e}\\s*=`,`m`).test(a),o)return{success:!0,shellConfigFile:r,message:`${e} already configured`,alreadyExists:!0};let s,c;B(r)?(s=`$env:${e} = "${t.replace(/["`$]/g,"`$&")}"`,c=`#`):V(r)?(s=`set -gx ${e} '${t.replace(/'/g,`'\\''`)}'`,c=`#`):(s=`export ${e}='${t.replace(/'/g,`'\\''`)}'`,c=`#`);let l=`\n${n?`${c} ${n}\n`:``}${s}\n`;return T.appendFileSync(r,l),{success:!0,shellConfigFile:r,message:`Added ${e} to ${r}`}}catch(e){return{success:!1,shellConfigFile:r,message:`Failed to modify shell config: ${e.message}`}}}function we(){return Ce(`ENABLE_EXPERIMENTAL_MCP_CLI`,`true`,`Claude Code deferred MCP loading (added by TaskGraph)`)}const H=[`task`,`master`].join(``),Te=[`parse-prd`,`parse-prd-with-research`,`analyze-complexity`,`complexity-report`,`expand-task`,`expand-all-tasks`,`add-task`,`add-subtask`,`remove-task`,`remove-subtask`,`remove-subtasks`,`remove-all-subtasks`,`convert-task-to-subtask`,`add-dependency`,`remove-dependency`,`fix-dependencies`,`validate-dependencies`,`setup-models`,`view-models`,`install-taskgraph`,`quick-install-taskgraph`,`to-review`,`to-deferred`,`to-cancelled`,`init-project`,`init-project-quick`,`show-task`,`graph`,`list-tasks`,`list-tasks-with-subtasks`,`list-tasks-by-status`,`project-status`,`next-task`,`help`,`to-done`,`to-pending`,`to-in-progress`,`update-task`,`update-single-task`,`update-tasks-from-id`,`tm-main`,`smart-workflow`,`learn`,`command-pipeline`,`auto-implement-tasks`,`analyze-project`,`sync-readme`,`index`,`clear-subtasks`,`clear-all-subtasks`,`generate-tasks`,`install-${H}`,`quick-install-${H}`],Ee=new Set(Te.map(e=>`${e}.md`));function U(e,t,n){for(let r of b(e,{withFileTypes:!0})){let i=v(e,r.name),a=t?`${t}/${r.name}`:r.name;r.isDirectory()?(U(i,a,n),b(i).length===0&&S(i)):Ee.has(r.name)&&(x(i),n.push(a))}}function De(e){let t=v(e,`.claude`,`commands`,`tm`),n=[];return!y(t)||!ne(t).isDirectory()||(U(t,``,n),b(t).length===0&&S(t)),{removed:n}}function Oe(e,n){try{let{removed:n}=De(e);n.length>0&&t(`debug`,`[Claude] Removed ${n.length} old slash command files from .claude/commands/tm`)}catch(e){t(`error`,`[Claude] Failed to remove old slash command files: ${e.message}`)}let r=C.join(n,`AGENTS.md`),i=C.join(e,`CLAUDE.md`),a=C.join(e,`.taskgraph`,`CLAUDE.md`),o=`@./.taskgraph/CLAUDE.md`,s=`\n## TaskGraph Instructions\n**Import TaskGraph's development workflow commands and guidelines, treat as if import is in the main CLAUDE.md file.**\n${o}`;if(T.existsSync(r))try{let n=C.join(e,`.taskgraph`);if(T.existsSync(n)||T.mkdirSync(n,{recursive:!0}),T.copyFileSync(r,a),t(`debug`,`[Claude] Created TaskGraph instructions at ${a}`),T.existsSync(i)){let e=T.readFileSync(i,`utf8`);if(e.includes(o))t(`debug`,`[Claude] TaskGraph import already present in ${i}`);else{let n=e.trim()+`
13
+ `+s+`
14
+ `;T.writeFileSync(i,n),t(`debug`,`[Claude] Added TaskGraph import to existing ${i}`)}}else{let e=`# Claude Code Instructions\n${s}\n`;T.writeFileSync(i,e),t(`debug`,`[Claude] Created ${i} with TaskGraph import`)}}catch(e){t(`error`,`[Claude] Failed to set up Claude instructions: ${e.message}`)}let c=we();c.success?c.alreadyExists?t(`debug`,`[Claude] Deferred MCP loading already configured`):t(`debug`,`[Claude] Enabled deferred MCP loading in ${c.shellConfigFile}`):t(`debug`,`[Claude] Could not configure deferred loading: ${c.message}`)}function ke(e){let t={};if(e.mcpServers){t.mcpServers={};for(let[n,r]of Object.entries(e.mcpServers)){let e={};e.type=`stdio`,r.command&&(e.command=r.command),r.args&&(e.args=r.args),r.env&&(e.env=r.env),Object.keys(r).forEach(t=>{[`command`,`args`,`env`,`type`].includes(t)||(e[t]=r[t])}),t.mcpServers[n]=e}}return t}function Ae(e,n){let r=C.join(e,`.mcp.json`);if(T.existsSync(r))try{let e=ke(JSON.parse(T.readFileSync(r,`utf8`)));T.writeFileSync(r,JSON.stringify(e,null,` `)+`
15
+ `),t(`debug`,`[Claude] Transformed MCP configuration to Claude format at ${r}`)}catch(e){t(`error`,`[Claude] Failed to transform MCP configuration: ${e.message}`)}}const je=xe({name:`claude`,displayName:`Claude Code`,profileDir:`.`,rulesDir:`.`,mcpConfigName:`.mcp.json`,fileMap:{"AGENTS.md":`.taskgraph/CLAUDE.md`},onAdd:Oe,onPostConvert:Ae});var Me=/* @__PURE__ */ e({claudeProfile:()=>je});function Ne(e){return D.includes(e)}function Pe(e){if(!Ne(e))return null;let t=Me[`${e}Profile`];if(!t)throw Error(`Profile not found: static import missing for '${e}'. Valid profiles: ${D.join(`, `)}`);return t}function Fe(e,n){let r=C.join(e,n.rulesDir),i=0;if(typeof n.onAddRulesProfile==`function`)try{n.onAddRulesProfile(r,F()),t(`debug`,`[Rule Transformer] Called onAddRulesProfile for ${n.profileName}`)}catch(e){t(`error`,`[Rule Transformer] onAddRulesProfile failed for ${n.profileName}: ${e.message}`),i++}if(n.mcpConfig!==!1)try{be(e,n.mcpConfigPath),t(`debug`,`[Rule Transformer] Setup MCP configuration for ${n.profileName}`)}catch(e){t(`error`,`[Rule Transformer] MCP setup failed for ${n.profileName}: ${e.message}`)}if(typeof n.onPostConvertRulesProfile==`function`)try{n.onPostConvertRulesProfile(r,F()),t(`debug`,`[Rule Transformer] Called onPostConvertRulesProfile for ${n.profileName}`)}catch(e){t(`error`,`[Rule Transformer] onPostConvertRulesProfile failed for ${n.profileName}: ${e.message}`)}return{success:1,failed:i}}function Ie(e){try{let t=JSON.parse(T.readFileSync(e,`utf-8`));for(let e of[`main`,`research`,`fallback`])if(t.models&&t.models[e]){let n=t.models[e].provider,r=t.models[e].modelId;if(o[n]){let i=o[n].find(e=>e.id===r);i&&i.max_tokens&&(t.models[e].maxTokens=i.max_tokens)}}return T.writeFileSync(e,JSON.stringify(t,null,2)),!0}catch(e){return console.error(`Error updating config maxTokens:`,e.message),!1}}const W=`alias tm='taskgraph'`,G=`ENABLE_EXPERIMENTAL_MCP_CLI`,K={debug:0,info:1,warn:2,error:3,success:4},Le=process.env.TASKGRAPH_LOG_LEVEL?K[process.env.TASKGRAPH_LOG_LEVEL.toLowerCase()]:K.info;function Re(){c()||g()}function q(e,...t){let n={debug:u.muted(`•`),info:u.brand(`→`),warn:_.yellow(`!`),error:_.red(`✗`),success:_.green(`✓`)};if(K[e]>=Le){let r=n[e]||``;c()||(e===`error`?console.error(r,_.red(...t)):e===`warn`?console.warn(r,_.yellow(...t)):e===`success`?console.log(r,_.green(...t)):e===`info`?console.log(r,u.brand(...t)):console.log(r,...t))}if(process.env.DEBUG===`true`){let n=`[${e.toUpperCase()}] ${t.join(` `)}\n`;T.appendFileSync(`init-debug.log`,n)}}function ze(e,...t){q(e===`warn`||e===`error`?e:`debug`,...t)}function J(e){T.existsSync(e)||(T.mkdirSync(e,{recursive:!0}),q(`debug`,`Created directory: ${e}`))}function Y(){let e=process.env.HOME||process.env.USERPROFILE;return e?[`.zshrc`,`.bashrc`,`.bash_profile`,`.profile`].map(t=>C.join(e,t)):[]}function Be(e){return[C.join(e,f),C.join(e,r),C.join(e,d),C.join(e,`.git`),C.join(e,p),C.join(e,m),C.join(e,`CLAUDE.md`),C.join(e,`.mcp.json`),...Y()]}function X(e){let t=/* @__PURE__ */ new Map;for(let n of e){let e=null;try{T.existsSync(n)&&(e=T.statSync(n).isDirectory()?``:T.readFileSync(n,`utf8`))}catch{e=null}t.set(n,e)}return t}function Ve(e,t,n){let i=t=>C.join(e,t),a=e=>t.get(e)==null&&n.get(e)!=null,o=e=>t.get(e)!=null&&n.get(e)!=null&&t.get(e)!==n.get(e),s=t.get(i(`.taskgraph/config.json`))!=null||t.get(i(`.taskgraph/tasks/tasks.json`))!=null,c=[];!s&&n.get(i(`.taskgraph/config.json`))!=null?c.push({path:`${f}/`,note:`tasks, settings and PRD templates`}):s&&a(i(`.taskgraph/config.json`))&&c.push({path:r,note:`restored`}),a(i(`.git`))&&c.push({path:`.git/`,note:`new Git repository`});let l=[[p,`created`,`added TaskGraph entries`],[m,`optional settings`,`updated`],[`CLAUDE.md`,`loads TaskGraph's instructions in Claude Code`,`now imports TaskGraph's instructions`],[`.mcp.json`,`TaskGraph MCP server for Claude Code`,`added the TaskGraph MCP server`]];for(let[e,t,n]of l){let r=i(e);a(r)?c.push({path:e,note:t}):o(r)&&c.push({path:e,note:n})}let u=process.env.HOME||process.env.USERPROFILE;for(let e of Y()){let r=t.get(e)||``,i=n.get(e)||``;if(i===r)continue;let a=[];i.includes(W)&&!r.includes(W)&&a.push("the `tm` alias"),i.includes(G)&&!r.includes(G)&&a.push(`deferred MCP loading`),a.length!==0&&c.push({path:u?e.replace(u,`~`):e,note:`added ${a.join(` and `)}; open a new terminal`})}return{alreadySetUp:s,changes:c}}function He(){let e=process.env.HOME||process.env.USERPROFILE,t;if(process.env.SHELL?.includes(`zsh`))t=C.join(e,`.zshrc`);else if(process.env.SHELL?.includes(`bash`))t=C.join(e,`.bashrc`);else return q(`debug`,`Could not determine shell type. Aliases not added.`),!1;try{if(!T.existsSync(t))return q(`debug`,`Shell config file ${t} not found.`),!1;let e=T.readFileSync(t,`utf8`),n=[{name:`tm`,line:W}].filter(t=>!e.includes(t.line));if(n.length===0)return q(`debug`,`All TaskGraph aliases already exist.`),!0;let r=n.map(e=>e.line).join(`
16
+ `),i=`
17
+ # TaskGraph aliases added on ${(/* @__PURE__ */ new Date()).toLocaleDateString()}
18
+ ${r}
19
+ `;return T.appendFileSync(t,i),q(`debug`,`Added ${n.length} alias(es): ${n.map(e=>e.name).join(`, `)}`),!0}catch(e){return q(`debug`,`Failed to add aliases: ${e.message}`),!1}}function Ue(e){let t=C.join(e,i);if(T.existsSync(t)){q(`debug`,`State file already exists, preserving current configuration`);return}let n={currentTag:`master`,lastSwitched:(/* @__PURE__ */ new Date()).toISOString(),branchTagMapping:{},migrationNoticeShown:!0};try{T.writeFileSync(t,JSON.stringify(n,null,2)),q(`debug`,`Created initial state file: ${t}`)}catch(e){q(`error`,`Failed to create state file: ${e.message}`)}}function We(e){let t=C.join(e,d);if(T.existsSync(t))return;let n={master:{tasks:[],metadata:{created:(/* @__PURE__ */ new Date()).toISOString(),description:`Tasks for master context`}}};try{T.writeFileSync(t,`${JSON.stringify(n,null,2)}\n`),q(`debug`,`Created empty tasks file: ${t}`)}catch(e){q(`error`,`Failed to create tasks file: ${e.message}`)}}function Z(e,t,n={}){if(!ve(e)){q(`error`,`Source file not found: ${e}`);return}let r=L(e,`utf8`);if(Object.entries(n).forEach(([e,t])=>{let n=RegExp(`\\{\\{${e}\\}\\}`,`g`);r=r.replace(n,t)}),T.existsSync(t)){let e=C.basename(t);if(e===`.gitignore`){q(`debug`,`${t} already exists, merging content...`);let e=T.readFileSync(t,`utf8`),n=new Set(e.split(`
20
+ `).map(e=>e.trim())),i=r.split(`
21
+ `).filter(e=>!n.has(e.trim()));if(i.length>0){let n=`${e.trim()}\n\n# Added by TaskGraph\n${i.join(`
22
+ `)}`;T.writeFileSync(t,n),q(`debug`,`Updated ${t} with additional entries`)}else q(`debug`,`No new content to add to ${t}`);return}if(e===`README-taskgraph.md`){q(`debug`,`${t} already exists`);let e=C.join(C.dirname(t),`README-taskgraph.md`);T.writeFileSync(e,r),q(`debug`,`Created ${e} (preserved original README-taskgraph.md)`);return}q(`debug`,`${t} already exists, skipping.`)}else T.writeFileSync(t,r),q(`debug`,`Created file: ${t}`)}async function Ge(e={}){c()||Re(),e.git===!0?e.initGit=!0:e.git===!1&&(e.initGit=!1),e.gitTasks===!0?e.storeTasksInGit=!0:e.gitTasks===!1&&(e.storeTasksInGit=!1);let t=e.yes||e.name&&e.description,n;if(n=e.rulesExplicitlyProvided?e.rules:[],t){e.name,e.description,e.version,e.author;let t=e.dryRun||!1,r=e.initGit===void 0||e.initGit,i=e.storeTasksInGit??he(C.join(process.cwd(),`.gitignore`))??!0;if(t)return Je(r,i),{dryRun:!0};await $(e.aliases!==!1,r,i,t,{...e,preferredLanguage:`English`},n)}else{q(`debug`,`Required options not provided, proceeding with prompts.`);let t;try{q(`debug`,`Init started - taskgraph_id: ${Ke()}`),t=E.createInterface({input:process.stdin,output:process.stdout});let r=!0,i=!0;r=e.initGit===void 0?h()?!0:(await Q(t,_.cyan(`Initialize a Git repository in project root? (Y/n): `),e=>{let t=e.trim().toLowerCase()!==`n`,n=t?_.green(`✓`):_.dim(`–`);return _.cyan(`Initialize a Git repository in project root?`)+` `+n+` `+_.dim(t?`Yes`:`No`)})).trim().toLowerCase()!==`n`:e.initGit,i=e.storeTasksInGit===void 0?(await Q(t,_.cyan(`Store tasks in Git (tasks.json and tasks/ directory)? (Y/n): `),e=>{let t=e.trim().toLowerCase()!==`n`,n=t?_.green(`✓`):_.dim(`–`);return _.cyan(`Store tasks in Git (tasks.json and tasks/ directory)?`)+` `+n+` `+_.dim(t?`Yes`:`No`)})).trim().toLowerCase()!==`n`:e.storeTasksInGit;let a=!1;e.rulesExplicitlyProvided?q(`debug`,`Using rule profiles provided via command line: ${n.join(`, `)}`):a=(await Q(t,_.cyan(`Set up Claude Code integration (CLAUDE.md import)? (y/N): `),e=>{let t=e.trim().toLowerCase()===`y`,n=t?_.green(`✓`):_.dim(`–`);return _.cyan(`Set up Claude Code integration?`)+` `+n+` `+_.dim(t?`Yes`:`No`)})).trim().toLowerCase()===`y`;let o=(await Q(t,_.cyan(`Language for AI responses (English): `),e=>`${_.cyan(`Language for AI responses?`)} ${_.dim(e.trim()||`English`)}`)).trim()||`English`,s=e.dryRun||!1;if(s)return t.close(),Je(r,i),{dryRun:!0};await $(e.aliases!==!1,r,i,s,{...e,shouldSetupRules:a,preferredLanguage:o},a?D:n),t.close()}catch(e){t&&t.close(),q(`error`,`Error during initialization process: ${e.message}`),process.exit(1)}}}function Q(e,t,n){return new Promise(r=>{e.question(t,e=>{E.moveCursor(process.stdout,0,-1),E.cursorTo(process.stdout,0),E.clearLine(process.stdout,0),n&&process.stdout.write(n(e)+`
23
+ `),r(e)})})}function Ke(){return ae()}function qe(e){try{if(!T.existsSync(e)){q(`warn`,`Config file does not exist, skipping storage configuration`);return}let t=T.readFileSync(e,`utf8`),n=JSON.parse(t);n.storage||={},n.storage.type=`file`,n.storage.operatingMode=`solo`,q(`debug`,`Configured storage for local file storage`),T.writeFileSync(e,JSON.stringify(n,null,2)),q(`debug`,`Storage configuration updated in config.json`)}catch(e){q(`error`,`Failed to update storage configuration: ${e.message}`)}}async function $(e,t,i,o,u,d=D){let g=process.cwd();q(`debug`,`Initializing project in ${g}`);let _=c()?[]:Be(g),v=X(_);J(C.join(g,f)),J(C.join(g,s)),J(C.join(g,l)),J(C.join(g,a)),J(C.join(g,n)),Ue(g),We(g);let y={year:(/* @__PURE__ */ new Date()).getFullYear()};function b(e){let t=Pe(e);t?Fe(g,t):q(`warn`,`Unknown rule profile: ${e}`)}Z(`env.example`,C.join(g,m),y),Z(`config.json`,C.join(g,r),{...y});let x=C.join(g,r);Ie(x)?q(`debug`,`Updated config with correct maxTokens values`):q(`debug`,`Could not update maxTokens in config`),qe(x);try{let e=L(`gitignore`,`utf8`);ge(C.join(g,p),e,i,ze)}catch(e){q(`error`,`Failed to create .gitignore: ${e.message}`)}Z(`example_prd.txt`,C.join(g,ee)),Z(`example_prd_rpg.txt`,C.join(g,n,`example_prd_rpg.txt`));try{t===!1?q(`debug`,`Git initialization skipped due to --no-git flag.`):h()?q(`debug`,`Existing Git repository detected; skipping git init.`):(w(`git init`,{cwd:g,stdio:`ignore`}),q(`debug`,`Git repository initialized`))}catch{q(`warn`,`Git not available, skipping repository initialization`)}if(d.length>0){q(`debug`,`Setting up Claude Code integration...`);for(let e of d)b(e)}if(u.preferredLanguage&&!o)try{let e=(await import(`./response-language-DiIdcmnK.js`)).default;e(u.preferredLanguage,{projectRoot:g,silent:!0}),q(`debug`,`Response language set to: ${u.preferredLanguage}`)}catch(e){q(`warn`,`Failed to set response language: ${e.message}`)}if(!c()&&!o&&!u?.yes){console.log(``);try{w(`"${process.execPath}" "${process.argv[1]}" models --setup --no-banner`,{stdio:`inherit`,cwd:g}),console.log(``)}catch{q(`warn`,"Model setup did not finish; run `taskgraph models --setup` to retry")}}else c()&&!o&&q(`debug`,`Skipping interactive model setup in silent (MCP) mode.`);if(e&&!o&&He(),!c()){let{alreadySetUp:e,changes:t}=Ve(g,v,X(_));console.log(`${te({folder:C.basename(g),changes:t,alreadySetUp:e,claudeCode:d.includes(`claude`),defaultModels:!!u?.yes})}\n`)}}function Je(e,t){if(c())return;let n=[`Dry run; nothing was changed. Init would:`,` create ${f}/ with tasks, settings and PRD templates`,` create or update ${p} and ${m}`];e!==!1&&!h()&&n.push(` start a Git repository`),n.push(t?` keep tasks in Git`:` keep tasks out of Git`),console.log(n.join(`
24
+ `))}export{D as n,oe as r,Ge as t};