@iloom/cli 0.5.4 → 0.6.0

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 (114) hide show
  1. package/README.md +116 -4
  2. package/dist/{ClaudeContextManager-PQ46VILL.js → ClaudeContextManager-6J2EB4QU.js} +5 -5
  3. package/dist/{ClaudeService-6OMO552H.js → ClaudeService-O2PB22GX.js} +4 -4
  4. package/dist/{LoomLauncher-ZHDTPKED.js → LoomLauncher-5LFM4LXB.js} +5 -5
  5. package/dist/ProjectCapabilityDetector-S5FLNCFI.js +11 -0
  6. package/dist/{PromptTemplateManager-5GNF7FCP.js → PromptTemplateManager-C3DK6XZL.js} +2 -2
  7. package/dist/README.md +116 -4
  8. package/dist/{SettingsManager-CNYBGXDT.js → SettingsManager-35F5RUJH.js} +2 -2
  9. package/dist/agents/iloom-framework-detector.md +366 -0
  10. package/dist/agents/iloom-issue-analyze-and-plan.md +0 -10
  11. package/dist/agents/iloom-issue-implementer.md +1 -1
  12. package/dist/agents/iloom-issue-planner.md +0 -10
  13. package/dist/build-FJVYP7EV.js +27 -0
  14. package/dist/build-FJVYP7EV.js.map +1 -0
  15. package/dist/{chunk-SHVB3EFE.js → chunk-64O2UIWO.js} +44 -19
  16. package/dist/chunk-64O2UIWO.js.map +1 -0
  17. package/dist/{chunk-FXJKNVZW.js → chunk-6U6VI4SZ.js} +3 -3
  18. package/dist/{chunk-QPS6TZUW.js → chunk-7WANFUIK.js} +2 -2
  19. package/dist/{chunk-LVLRMP7V.js → chunk-AXX3QIKK.js} +58 -14
  20. package/dist/chunk-AXX3QIKK.js.map +1 -0
  21. package/dist/chunk-BXCPJJYM.js +133 -0
  22. package/dist/chunk-BXCPJJYM.js.map +1 -0
  23. package/dist/{chunk-ESP2FF52.js → chunk-EK3XCAAS.js} +2 -2
  24. package/dist/{chunk-IDUICCZY.js → chunk-F6WVM437.js} +3 -1
  25. package/dist/chunk-F6WVM437.js.map +1 -0
  26. package/dist/{chunk-TKL7RBEF.js → chunk-GEXP5IOF.js} +3 -3
  27. package/dist/{chunk-J7GHNTYK.js → chunk-K7SEEHKO.js} +3 -3
  28. package/dist/{chunk-NRDY6XO3.js → chunk-PMVWQBWS.js} +73 -17
  29. package/dist/chunk-PMVWQBWS.js.map +1 -0
  30. package/dist/{chunk-NKRQNER7.js → chunk-Q7POFB5Q.js} +1 -55
  31. package/dist/chunk-Q7POFB5Q.js.map +1 -0
  32. package/dist/{chunk-N4ZJVATC.js → chunk-SN3Z6EZO.js} +11 -7
  33. package/dist/chunk-SN3Z6EZO.js.map +1 -0
  34. package/dist/chunk-TRQ76ISK.js +159 -0
  35. package/dist/chunk-TRQ76ISK.js.map +1 -0
  36. package/dist/{chunk-ZXWTOJXA.js → chunk-UB4TFAXJ.js} +38 -9
  37. package/dist/chunk-UB4TFAXJ.js.map +1 -0
  38. package/dist/{chunk-YPOG7WY4.js → chunk-UQIXZ3BA.js} +2 -2
  39. package/dist/{chunk-K5G5SFWY.js → chunk-W6WVRHJ6.js} +13 -1
  40. package/dist/chunk-W6WVRHJ6.js.map +1 -0
  41. package/dist/{chunk-E4F7KASE.js → chunk-WIJWIKAN.js} +3 -3
  42. package/dist/{chunk-EBISESAP.js → chunk-ZPSTA5PR.js} +16 -6
  43. package/dist/chunk-ZPSTA5PR.js.map +1 -0
  44. package/dist/{cleanup-H5QUWBWE.js → cleanup-OU2HFOOG.js} +11 -11
  45. package/dist/cli.js +107 -69
  46. package/dist/cli.js.map +1 -1
  47. package/dist/compile-ULNO5F7Q.js +57 -0
  48. package/dist/compile-ULNO5F7Q.js.map +1 -0
  49. package/dist/{contribute-VP73TPAL.js → contribute-T7ENST5N.js} +3 -3
  50. package/dist/{dev-server-H5FFXIVX.js → dev-server-4RCDJ5MU.js} +9 -9
  51. package/dist/{feedback-567ZH2O7.js → feedback-O4Q55SVS.js} +8 -8
  52. package/dist/{git-UHUNQZBA.js → git-FVMGBHC2.js} +3 -3
  53. package/dist/{ignite-VPP4PMF4.js → ignite-VHV65WEZ.js} +12 -8
  54. package/dist/ignite-VHV65WEZ.js.map +1 -0
  55. package/dist/index.d.ts +5 -0
  56. package/dist/index.js +14 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/{init-4ZR2XXZA.js → init-HB34Q5FH.js} +8 -7
  59. package/dist/lint-5JMCWE4Y.js +27 -0
  60. package/dist/lint-5JMCWE4Y.js.map +1 -0
  61. package/dist/{open-6HBQHPUL.js → open-WHVUYGPY.js} +9 -9
  62. package/dist/prompts/init-prompt.txt +108 -0
  63. package/dist/prompts/issue-prompt.txt +12 -12
  64. package/dist/{rebase-SRBOVC4M.js → rebase-5EY3Q6XP.js} +5 -5
  65. package/dist/{recap-X7FTTKPP.js → recap-VOOUXOGP.js} +5 -5
  66. package/dist/{run-5FU76FFE.js → run-NCRK5NPR.js} +9 -9
  67. package/dist/schema/settings.schema.json +8 -0
  68. package/dist/{shell-UQJDI36V.js → shell-SBLXVOVJ.js} +5 -5
  69. package/dist/{summary-MOKN7RM2.js → summary-CVFAMDOJ.js} +6 -6
  70. package/dist/test-3KIVXI6J.js +27 -0
  71. package/dist/test-3KIVXI6J.js.map +1 -0
  72. package/dist/{test-git-GB3B6QNT.js → test-git-ZB6AGGRW.js} +3 -3
  73. package/dist/{test-prefix-YQNNTCY3.js → test-prefix-FBGXKMPA.js} +3 -3
  74. package/package.json +2 -1
  75. package/dist/ProjectCapabilityDetector-34LU7JJ4.js +0 -9
  76. package/dist/chunk-2ZPFJQ3B.js +0 -63
  77. package/dist/chunk-2ZPFJQ3B.js.map +0 -1
  78. package/dist/chunk-EBISESAP.js.map +0 -1
  79. package/dist/chunk-IDUICCZY.js.map +0 -1
  80. package/dist/chunk-K5G5SFWY.js.map +0 -1
  81. package/dist/chunk-LVLRMP7V.js.map +0 -1
  82. package/dist/chunk-N4ZJVATC.js.map +0 -1
  83. package/dist/chunk-NKRQNER7.js.map +0 -1
  84. package/dist/chunk-NRDY6XO3.js.map +0 -1
  85. package/dist/chunk-SHVB3EFE.js.map +0 -1
  86. package/dist/chunk-ZXWTOJXA.js.map +0 -1
  87. package/dist/ignite-VPP4PMF4.js.map +0 -1
  88. /package/dist/{ClaudeContextManager-PQ46VILL.js.map → ClaudeContextManager-6J2EB4QU.js.map} +0 -0
  89. /package/dist/{ClaudeService-6OMO552H.js.map → ClaudeService-O2PB22GX.js.map} +0 -0
  90. /package/dist/{LoomLauncher-ZHDTPKED.js.map → LoomLauncher-5LFM4LXB.js.map} +0 -0
  91. /package/dist/{ProjectCapabilityDetector-34LU7JJ4.js.map → ProjectCapabilityDetector-S5FLNCFI.js.map} +0 -0
  92. /package/dist/{PromptTemplateManager-5GNF7FCP.js.map → PromptTemplateManager-C3DK6XZL.js.map} +0 -0
  93. /package/dist/{SettingsManager-CNYBGXDT.js.map → SettingsManager-35F5RUJH.js.map} +0 -0
  94. /package/dist/{chunk-FXJKNVZW.js.map → chunk-6U6VI4SZ.js.map} +0 -0
  95. /package/dist/{chunk-QPS6TZUW.js.map → chunk-7WANFUIK.js.map} +0 -0
  96. /package/dist/{chunk-ESP2FF52.js.map → chunk-EK3XCAAS.js.map} +0 -0
  97. /package/dist/{chunk-TKL7RBEF.js.map → chunk-GEXP5IOF.js.map} +0 -0
  98. /package/dist/{chunk-J7GHNTYK.js.map → chunk-K7SEEHKO.js.map} +0 -0
  99. /package/dist/{chunk-YPOG7WY4.js.map → chunk-UQIXZ3BA.js.map} +0 -0
  100. /package/dist/{chunk-E4F7KASE.js.map → chunk-WIJWIKAN.js.map} +0 -0
  101. /package/dist/{cleanup-H5QUWBWE.js.map → cleanup-OU2HFOOG.js.map} +0 -0
  102. /package/dist/{contribute-VP73TPAL.js.map → contribute-T7ENST5N.js.map} +0 -0
  103. /package/dist/{dev-server-H5FFXIVX.js.map → dev-server-4RCDJ5MU.js.map} +0 -0
  104. /package/dist/{feedback-567ZH2O7.js.map → feedback-O4Q55SVS.js.map} +0 -0
  105. /package/dist/{git-UHUNQZBA.js.map → git-FVMGBHC2.js.map} +0 -0
  106. /package/dist/{init-4ZR2XXZA.js.map → init-HB34Q5FH.js.map} +0 -0
  107. /package/dist/{open-6HBQHPUL.js.map → open-WHVUYGPY.js.map} +0 -0
  108. /package/dist/{rebase-SRBOVC4M.js.map → rebase-5EY3Q6XP.js.map} +0 -0
  109. /package/dist/{recap-X7FTTKPP.js.map → recap-VOOUXOGP.js.map} +0 -0
  110. /package/dist/{run-5FU76FFE.js.map → run-NCRK5NPR.js.map} +0 -0
  111. /package/dist/{shell-UQJDI36V.js.map → shell-SBLXVOVJ.js.map} +0 -0
  112. /package/dist/{summary-MOKN7RM2.js.map → summary-CVFAMDOJ.js.map} +0 -0
  113. /package/dist/{test-git-GB3B6QNT.js.map → test-git-ZB6AGGRW.js.map} +0 -0
  114. /package/dist/{test-prefix-YQNNTCY3.js.map → test-prefix-FBGXKMPA.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/PromptTemplateManager.ts"],"sourcesContent":["import { readFile } from 'fs/promises'\nimport { accessSync } from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport { logger } from '../utils/logger.js'\n\nexport interface TemplateVariables {\n\tISSUE_NUMBER?: string | number\n\tPR_NUMBER?: number\n\tISSUE_TITLE?: string\n\tPR_TITLE?: string\n\tWORKSPACE_PATH?: string\n\tPORT?: number\n\tONE_SHOT_MODE?: boolean\n\tINTERACTIVE_MODE?: boolean\n\tSETTINGS_SCHEMA?: string\n\tSETTINGS_GLOBAL_JSON?: string\n\tSETTINGS_JSON?: string\n\tSETTINGS_LOCAL_JSON?: string\n\tSHELL_TYPE?: string\n\tSHELL_CONFIG_PATH?: string\n\tSHELL_CONFIG_CONTENT?: string\n\tREMOTES_INFO?: string\n\tMULTIPLE_REMOTES?: string\n\tSINGLE_REMOTE?: string\n\tSINGLE_REMOTE_NAME?: string\n\tSINGLE_REMOTE_URL?: string\n\tNO_REMOTES?: string\n\tREADME_CONTENT?: string\n\tSETTINGS_SCHEMA_CONTENT?: string\n\tFIRST_TIME_USER?: boolean\n\tVSCODE_SETTINGS_GITIGNORED?: string\n\t// Session summary template variables\n\tSESSION_CONTEXT?: string // Session ID for Claude to reference its conversation\n\tBRANCH_NAME?: string // Branch being finished\n\tLOOM_TYPE?: string // 'issue' or 'pr'\n\tCOMPACT_SUMMARIES?: string // Extracted compact summaries from session transcript\n\tRECAP_DATA?: string // Formatted recap data (goal, complexity, entries, artifacts)\n\t// Draft PR mode variables - mutually exclusive with standard issue mode\n\tDRAFT_PR_NUMBER?: number // PR number for draft PR workflow\n\tDRAFT_PR_MODE?: boolean // True when using github-draft-pr merge mode\n\tSTANDARD_ISSUE_MODE?: boolean // True when using standard issue commenting (not draft PR)\n\t// Multi-language support variables - mutually exclusive\n\tHAS_PACKAGE_JSON?: boolean // True when project has package.json\n\tNO_PACKAGE_JSON?: boolean // True when project does not have package.json (non-Node.js projects)\n}\n\nexport class PromptTemplateManager {\n\tprivate templateDir: string\n\n\tconstructor(templateDir?: string) {\n\t\tif (templateDir) {\n\t\t\tthis.templateDir = templateDir\n\t\t} else {\n\t\t\t// Find templates relative to the package installation\n\t\t\t// When running from dist/, templates are copied to dist/prompts/\n\t\t\tconst currentFileUrl = import.meta.url\n\t\t\tconst currentFilePath = fileURLToPath(currentFileUrl)\n\t\t\tconst distDir = path.dirname(currentFilePath) // dist directory (may be chunked file location)\n\n\t\t\t// Walk up to find the dist directory (in case of chunked files)\n\t\t\tlet templateDir = path.join(distDir, 'prompts')\n\t\t\tlet currentDir = distDir\n\n\t\t\t// Try to find the prompts directory by walking up\n\t\t\twhile (currentDir !== path.dirname(currentDir)) {\n\t\t\t\tconst candidatePath = path.join(currentDir, 'prompts')\n\t\t\t\ttry {\n\t\t\t\t\t// Check if this directory exists (sync check for constructor)\n\t\t\t\t\taccessSync(candidatePath)\n\t\t\t\t\ttemplateDir = candidatePath\n\t\t\t\t\tbreak\n\t\t\t\t} catch {\n\t\t\t\t\tcurrentDir = path.dirname(currentDir)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.templateDir = templateDir\n\t\t\tlogger.debug('PromptTemplateManager initialized', {\n\t\t\t\tcurrentFilePath,\n\t\t\t\tdistDir,\n\t\t\t\ttemplateDir: this.templateDir\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Load a template file by name\n\t */\n\tasync loadTemplate(templateName: 'issue' | 'pr' | 'regular' | 'init' | 'session-summary'): Promise<string> {\n\t\tconst templatePath = path.join(this.templateDir, `${templateName}-prompt.txt`)\n\n\t\tlogger.debug('Loading template', {\n\t\t\ttemplateName,\n\t\t\ttemplateDir: this.templateDir,\n\t\t\ttemplatePath\n\t\t})\n\n\t\ttry {\n\t\t\treturn await readFile(templatePath, 'utf-8')\n\t\t} catch (error) {\n\t\t\tlogger.error('Failed to load template', { templateName, templatePath, error })\n\t\t\tthrow new Error(`Template not found: ${templatePath}`)\n\t\t}\n\t}\n\n\t/**\n\t * Substitute variables in a template string\n\t */\n\tsubstituteVariables(template: string, variables: TemplateVariables): string {\n\t\tlet result = template\n\n\t\t// Process conditional sections first\n\t\tresult = this.processConditionalSections(result, variables)\n\n\t\t// Replace each variable if it exists\n\t\tif (variables.ISSUE_NUMBER !== undefined) {\n\t\t\tresult = result.replace(/ISSUE_NUMBER/g, String(variables.ISSUE_NUMBER))\n\t\t}\n\n\t\tif (variables.PR_NUMBER !== undefined) {\n\t\t\tresult = result.replace(/PR_NUMBER/g, String(variables.PR_NUMBER))\n\t\t}\n\n\t\tif (variables.ISSUE_TITLE !== undefined) {\n\t\t\tresult = result.replace(/ISSUE_TITLE/g, variables.ISSUE_TITLE)\n\t\t}\n\n\t\tif (variables.PR_TITLE !== undefined) {\n\t\t\tresult = result.replace(/PR_TITLE/g, variables.PR_TITLE)\n\t\t}\n\n\t\tif (variables.WORKSPACE_PATH !== undefined) {\n\t\t\tresult = result.replace(/WORKSPACE_PATH/g, variables.WORKSPACE_PATH)\n\t\t}\n\n\t\tif (variables.PORT !== undefined) {\n\t\t\tresult = result.replace(/PORT/g, String(variables.PORT))\n\t\t}\n\n\t\tif (variables.SETTINGS_SCHEMA !== undefined) {\n\t\t\tresult = result.replace(/SETTINGS_SCHEMA/g, variables.SETTINGS_SCHEMA)\n\t\t}\n\n\t\tif (variables.SETTINGS_GLOBAL_JSON !== undefined) {\n\t\t\tresult = result.replace(/SETTINGS_GLOBAL_JSON/g, variables.SETTINGS_GLOBAL_JSON)\n\t\t}\n\n\t\tif (variables.SETTINGS_JSON !== undefined) {\n\t\t\tresult = result.replace(/SETTINGS_JSON/g, variables.SETTINGS_JSON)\n\t\t}\n\n\t\tif (variables.SETTINGS_LOCAL_JSON !== undefined) {\n\t\t\tresult = result.replace(/SETTINGS_LOCAL_JSON/g, variables.SETTINGS_LOCAL_JSON)\n\t\t}\n\n\t\tif (variables.SHELL_TYPE !== undefined) {\n\t\t\tresult = result.replace(/SHELL_TYPE/g, variables.SHELL_TYPE)\n\t\t}\n\n\t\tif (variables.SHELL_CONFIG_PATH !== undefined) {\n\t\t\tresult = result.replace(/SHELL_CONFIG_PATH/g, variables.SHELL_CONFIG_PATH)\n\t\t}\n\n\t\tif (variables.SHELL_CONFIG_CONTENT !== undefined) {\n\t\t\tresult = result.replace(/SHELL_CONFIG_CONTENT/g, variables.SHELL_CONFIG_CONTENT)\n\t\t}\n\n\t\tif (variables.REMOTES_INFO !== undefined) {\n\t\t\tresult = result.replace(/REMOTES_INFO/g, variables.REMOTES_INFO)\n\t\t}\n\n\t\tif (variables.MULTIPLE_REMOTES !== undefined) {\n\t\t\tresult = result.replace(/MULTIPLE_REMOTES/g, variables.MULTIPLE_REMOTES)\n\t\t}\n\n\t\tif (variables.SINGLE_REMOTE !== undefined) {\n\t\t\tresult = result.replace(/SINGLE_REMOTE/g, variables.SINGLE_REMOTE)\n\t\t}\n\n\t\tif (variables.SINGLE_REMOTE_NAME !== undefined) {\n\t\t\tresult = result.replace(/SINGLE_REMOTE_NAME/g, variables.SINGLE_REMOTE_NAME)\n\t\t}\n\n\t\tif (variables.SINGLE_REMOTE_URL !== undefined) {\n\t\t\tresult = result.replace(/SINGLE_REMOTE_URL/g, variables.SINGLE_REMOTE_URL)\n\t\t}\n\n\t\tif (variables.NO_REMOTES !== undefined) {\n\t\t\tresult = result.replace(/NO_REMOTES/g, variables.NO_REMOTES)\n\t\t}\n\n\t\tif (variables.README_CONTENT !== undefined) {\n\t\t\tresult = result.replace(/README_CONTENT/g, variables.README_CONTENT)\n\t\t}\n\n\t\tif (variables.SETTINGS_SCHEMA_CONTENT !== undefined) {\n\t\t\tresult = result.replace(/SETTINGS_SCHEMA_CONTENT/g, variables.SETTINGS_SCHEMA_CONTENT)\n\t\t}\n\n\t\tif (variables.VSCODE_SETTINGS_GITIGNORED !== undefined) {\n\t\t\tresult = result.replace(/VSCODE_SETTINGS_GITIGNORED/g, variables.VSCODE_SETTINGS_GITIGNORED)\n\t\t}\n\n\t\t// Session summary template variables\n\t\tif (variables.SESSION_CONTEXT !== undefined) {\n\t\t\tresult = result.replace(/SESSION_CONTEXT/g, variables.SESSION_CONTEXT)\n\t\t}\n\n\t\tif (variables.BRANCH_NAME !== undefined) {\n\t\t\tresult = result.replace(/BRANCH_NAME/g, variables.BRANCH_NAME)\n\t\t}\n\n\t\tif (variables.LOOM_TYPE !== undefined) {\n\t\t\tresult = result.replace(/LOOM_TYPE/g, variables.LOOM_TYPE)\n\t\t}\n\n\t\tif (variables.COMPACT_SUMMARIES !== undefined) {\n\t\t\tresult = result.replace(/COMPACT_SUMMARIES/g, variables.COMPACT_SUMMARIES)\n\t\t}\n\n\t\t// Draft PR mode variable substitution\n\t\tif (variables.DRAFT_PR_NUMBER !== undefined) {\n\t\t\tresult = result.replace(/DRAFT_PR_NUMBER/g, String(variables.DRAFT_PR_NUMBER))\n\t\t}\n\n\t\treturn result\n\t}\n\n\t/**\n\t * Process conditional sections in template\n\t * Format: {{#IF ONE_SHOT_MODE}}content{{/IF ONE_SHOT_MODE}}\n\t *\n\t * Note: /s flag allows . to match newlines\n\t */\n\tprivate processConditionalSections(template: string, variables: TemplateVariables): string {\n\t\tlet result = template\n\n\t\t// Process ONE_SHOT_MODE conditionals\n\t\tconst oneShotRegex = /\\{\\{#IF ONE_SHOT_MODE\\}\\}(.*?)\\{\\{\\/IF ONE_SHOT_MODE\\}\\}/gs\n\n\t\tif (variables.ONE_SHOT_MODE === true) {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(oneShotRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(oneShotRegex, '')\n\t\t}\n\n\t\t// Process SETTINGS_JSON conditionals\n\t\tconst settingsJsonRegex = /\\{\\{#IF SETTINGS_JSON\\}\\}(.*?)\\{\\{\\/IF SETTINGS_JSON\\}\\}/gs\n\n\t\tif (variables.SETTINGS_JSON !== undefined && variables.SETTINGS_JSON !== '') {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(settingsJsonRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(settingsJsonRegex, '')\n\t\t}\n\n\t\t// Process SETTINGS_GLOBAL_JSON conditionals\n\t\tconst settingsGlobalJsonRegex = /\\{\\{#IF SETTINGS_GLOBAL_JSON\\}\\}(.*?)\\{\\{\\/IF SETTINGS_GLOBAL_JSON\\}\\}/gs\n\n\t\tif (variables.SETTINGS_GLOBAL_JSON !== undefined && variables.SETTINGS_GLOBAL_JSON !== '') {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(settingsGlobalJsonRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(settingsGlobalJsonRegex, '')\n\t\t}\n\n\t\t// Process SETTINGS_LOCAL_JSON conditionals\n\t\tconst settingsLocalJsonRegex = /\\{\\{#IF SETTINGS_LOCAL_JSON\\}\\}(.*?)\\{\\{\\/IF SETTINGS_LOCAL_JSON\\}\\}/gs\n\n\t\tif (variables.SETTINGS_LOCAL_JSON !== undefined && variables.SETTINGS_LOCAL_JSON !== '') {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(settingsLocalJsonRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(settingsLocalJsonRegex, '')\n\t\t}\n\n\t\t// Process MULTIPLE_REMOTES conditionals\n\t\tconst multipleRemotesRegex = /\\{\\{#IF MULTIPLE_REMOTES\\}\\}(.*?)\\{\\{\\/IF MULTIPLE_REMOTES\\}\\}/gs\n\n\t\tif (variables.MULTIPLE_REMOTES !== undefined && variables.MULTIPLE_REMOTES !== '') {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(multipleRemotesRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(multipleRemotesRegex, '')\n\t\t}\n\n\t\t// Process SINGLE_REMOTE conditionals\n\t\tconst singleRemoteRegex = /\\{\\{#IF SINGLE_REMOTE\\}\\}(.*?)\\{\\{\\/IF SINGLE_REMOTE\\}\\}/gs\n\n\t\tif (variables.SINGLE_REMOTE !== undefined && variables.SINGLE_REMOTE !== '') {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(singleRemoteRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(singleRemoteRegex, '')\n\t\t}\n\n\t\t// Process NO_REMOTES conditionals\n\t\tconst noRemotesRegex = /\\{\\{#IF NO_REMOTES\\}\\}(.*?)\\{\\{\\/IF NO_REMOTES\\}\\}/gs\n\n\t\tif (variables.NO_REMOTES !== undefined && variables.NO_REMOTES !== '') {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(noRemotesRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(noRemotesRegex, '')\n\t\t}\n\n\t\t// Process FIRST_TIME_USER conditionals\n\t\tconst firstTimeUserRegex = /\\{\\{#IF FIRST_TIME_USER\\}\\}(.*?)\\{\\{\\/IF FIRST_TIME_USER\\}\\}/gs\n\n\t\tif (variables.FIRST_TIME_USER === true) {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(firstTimeUserRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(firstTimeUserRegex, '')\n\t\t}\n\n\t\t// Process INTERACTIVE_MODE conditionals\n\t\tconst interactiveModeRegex = /\\{\\{#IF INTERACTIVE_MODE\\}\\}(.*?)\\{\\{\\/IF INTERACTIVE_MODE\\}\\}/gs\n\n\t\tif (variables.INTERACTIVE_MODE === true) {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(interactiveModeRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(interactiveModeRegex, '')\n\t\t}\n\n\t\t// Process COMPACT_SUMMARIES conditionals\n\t\tconst compactSummariesRegex = /\\{\\{#IF COMPACT_SUMMARIES\\}\\}(.*?)\\{\\{\\/IF COMPACT_SUMMARIES\\}\\}/gs\n\n\t\tif (variables.COMPACT_SUMMARIES !== undefined && variables.COMPACT_SUMMARIES !== '') {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(compactSummariesRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(compactSummariesRegex, '')\n\t\t}\n\n\t\t// Process DRAFT_PR_MODE conditionals\n\t\tconst draftPrModeRegex = /\\{\\{#IF DRAFT_PR_MODE\\}\\}(.*?)\\{\\{\\/IF DRAFT_PR_MODE\\}\\}/gs\n\n\t\tif (variables.DRAFT_PR_MODE === true) {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(draftPrModeRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(draftPrModeRegex, '')\n\t\t}\n\n\t\t// Process STANDARD_ISSUE_MODE conditionals\n\t\tconst standardIssueModeRegex = /\\{\\{#IF STANDARD_ISSUE_MODE\\}\\}(.*?)\\{\\{\\/IF STANDARD_ISSUE_MODE\\}\\}/gs\n\n\t\tif (variables.STANDARD_ISSUE_MODE === true) {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(standardIssueModeRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(standardIssueModeRegex, '')\n\t\t}\n\n\t\t// Process HAS_PACKAGE_JSON conditionals\n\t\tconst hasPackageJsonRegex = /\\{\\{#IF HAS_PACKAGE_JSON\\}\\}(.*?)\\{\\{\\/IF HAS_PACKAGE_JSON\\}\\}/gs\n\n\t\tif (variables.HAS_PACKAGE_JSON === true) {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(hasPackageJsonRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(hasPackageJsonRegex, '')\n\t\t}\n\n\t\t// Process NO_PACKAGE_JSON conditionals\n\t\tconst noPackageJsonRegex = /\\{\\{#IF NO_PACKAGE_JSON\\}\\}(.*?)\\{\\{\\/IF NO_PACKAGE_JSON\\}\\}/gs\n\n\t\tif (variables.NO_PACKAGE_JSON === true) {\n\t\t\t// Include the content, remove the conditional markers\n\t\t\tresult = result.replace(noPackageJsonRegex, '$1')\n\t\t} else {\n\t\t\t// Remove the entire conditional block\n\t\t\tresult = result.replace(noPackageJsonRegex, '')\n\t\t}\n\n\t\treturn result\n\t}\n\n\t/**\n\t * Get a fully processed prompt for a workflow type\n\t */\n\tasync getPrompt(\n\t\ttype: 'issue' | 'pr' | 'regular' | 'init' | 'session-summary',\n\t\tvariables: TemplateVariables\n\t): Promise<string> {\n\t\tconst template = await this.loadTemplate(type)\n\t\treturn this.substituteVariables(template, variables)\n\t}\n}\n"],"mappings":"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","names":["templateDir"]}
@@ -4,10 +4,10 @@ import {
4
4
  findMainWorktreePathWithSettings,
5
5
  findWorktreeForBranch,
6
6
  getMergeTargetBranch
7
- } from "./chunk-TKL7RBEF.js";
7
+ } from "./chunk-GEXP5IOF.js";
8
8
  import {
9
9
  SettingsManager
10
- } from "./chunk-IDUICCZY.js";
10
+ } from "./chunk-F6WVM437.js";
11
11
  import {
12
12
  MetadataManager
13
13
  } from "./chunk-CFUWQHCJ.js";
@@ -369,4 +369,4 @@ To recover:
369
369
  export {
370
370
  MergeManager
371
371
  };
372
- //# sourceMappingURL=chunk-E4F7KASE.js.map
372
+ //# sourceMappingURL=chunk-WIJWIKAN.js.map
@@ -1,20 +1,30 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ getExplicitCapabilities,
4
+ getPackageConfig,
3
5
  hasWebDependencies,
4
- parseBinField,
5
- readPackageJson
6
- } from "./chunk-2ZPFJQ3B.js";
6
+ parseBinField
7
+ } from "./chunk-BXCPJJYM.js";
7
8
 
8
9
  // src/lib/ProjectCapabilityDetector.ts
9
10
  var ProjectCapabilityDetector = class {
10
11
  /**
11
- * Detect project capabilities by analyzing package.json
12
+ * Detect project capabilities by analyzing package configuration
13
+ *
14
+ * Detection priority:
15
+ * 1. Explicit capabilities from package.iloom.json (for non-Node.js projects)
16
+ * 2. Inferred capabilities from package.json (bin field, web dependencies)
17
+ *
12
18
  * @param worktreePath Path to the worktree directory
13
19
  * @returns Project capabilities and bin entries
14
20
  */
15
21
  async detectCapabilities(worktreePath) {
16
22
  try {
17
- const pkgJson = await readPackageJson(worktreePath);
23
+ const pkgJson = await getPackageConfig(worktreePath);
24
+ const explicitCapabilities = getExplicitCapabilities(pkgJson);
25
+ if (explicitCapabilities.length > 0) {
26
+ return { capabilities: explicitCapabilities, binEntries: {} };
27
+ }
18
28
  const capabilities = [];
19
29
  if (pkgJson.bin) {
20
30
  capabilities.push("cli");
@@ -36,4 +46,4 @@ var ProjectCapabilityDetector = class {
36
46
  export {
37
47
  ProjectCapabilityDetector
38
48
  };
39
- //# sourceMappingURL=chunk-EBISESAP.js.map
49
+ //# sourceMappingURL=chunk-ZPSTA5PR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/ProjectCapabilityDetector.ts"],"sourcesContent":["import { getPackageConfig, parseBinField, hasWebDependencies, getExplicitCapabilities } from '../utils/package-json.js'\nimport type { ProjectCapability } from '../types/loom.js'\n\nexport interface ProjectCapabilities {\n capabilities: ProjectCapability[]\n binEntries: Record<string, string>\n}\n\nexport class ProjectCapabilityDetector {\n /**\n * Detect project capabilities by analyzing package configuration\n *\n * Detection priority:\n * 1. Explicit capabilities from package.iloom.json (for non-Node.js projects)\n * 2. Inferred capabilities from package.json (bin field, web dependencies)\n *\n * @param worktreePath Path to the worktree directory\n * @returns Project capabilities and bin entries\n */\n async detectCapabilities(worktreePath: string): Promise<ProjectCapabilities> {\n try {\n const pkgJson = await getPackageConfig(worktreePath)\n\n // Check for explicit capabilities first (from package.iloom.json)\n const explicitCapabilities = getExplicitCapabilities(pkgJson)\n if (explicitCapabilities.length > 0) {\n // For non-Node.js projects with explicit capabilities,\n // binEntries is empty (no bin field parsing needed)\n return { capabilities: explicitCapabilities, binEntries: {} }\n }\n\n // Fall back to inferring capabilities from package.json\n const capabilities: ProjectCapability[] = []\n\n // CLI detection: has bin field\n if (pkgJson.bin) {\n capabilities.push('cli')\n }\n\n // Web detection: has web framework dependencies\n if (hasWebDependencies(pkgJson)) {\n capabilities.push('web')\n }\n\n // Parse bin entries for CLI projects\n const binEntries = pkgJson.bin ? parseBinField(pkgJson.bin, pkgJson.name) : {}\n\n return { capabilities, binEntries }\n } catch (error) {\n // Handle missing package.json - return empty capabilities for non-Node.js projects\n if (error instanceof Error && error.message.includes('package.json not found')) {\n return { capabilities: [], binEntries: {} }\n }\n // Re-throw other errors (invalid JSON, etc.)\n throw error\n }\n }\n}\n"],"mappings":";;;;;;;;;AAQO,IAAM,4BAAN,MAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWrC,MAAM,mBAAmB,cAAoD;AAC3E,QAAI;AACF,YAAM,UAAU,MAAM,iBAAiB,YAAY;AAGnD,YAAM,uBAAuB,wBAAwB,OAAO;AAC5D,UAAI,qBAAqB,SAAS,GAAG;AAGnC,eAAO,EAAE,cAAc,sBAAsB,YAAY,CAAC,EAAE;AAAA,MAC9D;AAGA,YAAM,eAAoC,CAAC;AAG3C,UAAI,QAAQ,KAAK;AACf,qBAAa,KAAK,KAAK;AAAA,MACzB;AAGA,UAAI,mBAAmB,OAAO,GAAG;AAC/B,qBAAa,KAAK,KAAK;AAAA,MACzB;AAGA,YAAM,aAAa,QAAQ,MAAM,cAAc,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC;AAE7E,aAAO,EAAE,cAAc,WAAW;AAAA,IACpC,SAAS,OAAO;AAEd,UAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,wBAAwB,GAAG;AAC9E,eAAO,EAAE,cAAc,CAAC,GAAG,YAAY,CAAC,EAAE;AAAA,MAC5C;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
@@ -5,25 +5,25 @@ import {
5
5
  EnvironmentManager,
6
6
  LoomManager,
7
7
  ResourceCleanup
8
- } from "./chunk-NRDY6XO3.js";
9
- import "./chunk-LVLRMP7V.js";
8
+ } from "./chunk-PMVWQBWS.js";
10
9
  import {
11
10
  ProcessManager
12
11
  } from "./chunk-VU3QMIP2.js";
12
+ import "./chunk-AXX3QIKK.js";
13
13
  import {
14
14
  IdentifierParser
15
- } from "./chunk-YPOG7WY4.js";
15
+ } from "./chunk-UQIXZ3BA.js";
16
16
  import {
17
17
  createNeonProviderFromSettings
18
18
  } from "./chunk-7LSSNB7Y.js";
19
- import "./chunk-2ZPFJQ3B.js";
19
+ import "./chunk-BXCPJJYM.js";
20
20
  import {
21
21
  GitWorktreeManager
22
- } from "./chunk-ESP2FF52.js";
23
- import "./chunk-TKL7RBEF.js";
22
+ } from "./chunk-EK3XCAAS.js";
23
+ import "./chunk-GEXP5IOF.js";
24
24
  import {
25
25
  SettingsManager
26
- } from "./chunk-IDUICCZY.js";
26
+ } from "./chunk-F6WVM437.js";
27
27
  import "./chunk-CFUWQHCJ.js";
28
28
  import {
29
29
  promptConfirmation
@@ -76,8 +76,8 @@ var CleanupCommand = class {
76
76
  );
77
77
  if (!this.loomManager) {
78
78
  const { GitHubService } = await import("./GitHubService-S2OGUTDR.js");
79
- const { ClaudeContextManager } = await import("./ClaudeContextManager-PQ46VILL.js");
80
- const { ProjectCapabilityDetector } = await import("./ProjectCapabilityDetector-34LU7JJ4.js");
79
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-6J2EB4QU.js");
80
+ const { ProjectCapabilityDetector } = await import("./ProjectCapabilityDetector-S5FLNCFI.js");
81
81
  const { DefaultBranchNamingService } = await import("./BranchNamingService-B5PVRR7F.js");
82
82
  this.loomManager = new LoomManager(
83
83
  this.gitWorktreeManager,
@@ -278,7 +278,7 @@ var CleanupCommand = class {
278
278
  const { force, dryRun } = parsed.options;
279
279
  let parsedInput = await this.identifierParser.parseForPatternDetection(identifier);
280
280
  if (parsedInput.type === "branch" && parsedInput.branchName) {
281
- const { extractIssueNumber } = await import("./git-UHUNQZBA.js");
281
+ const { extractIssueNumber } = await import("./git-FVMGBHC2.js");
282
282
  const extractedNumber = extractIssueNumber(parsedInput.branchName);
283
283
  if (extractedNumber !== null) {
284
284
  parsedInput = {
@@ -477,4 +477,4 @@ var CleanupCommand = class {
477
477
  export {
478
478
  CleanupCommand
479
479
  };
480
- //# sourceMappingURL=cleanup-H5QUWBWE.js.map
480
+ //# sourceMappingURL=cleanup-OU2HFOOG.js.map
package/dist/cli.js CHANGED
@@ -1,62 +1,62 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SessionSummaryService
4
- } from "./chunk-J7GHNTYK.js";
4
+ } from "./chunk-K7SEEHKO.js";
5
5
  import "./chunk-NXMDEL3F.js";
6
- import {
7
- IssueTrackerFactory,
8
- generateIssueManagementMcpConfig
9
- } from "./chunk-6YSFTPKW.js";
10
- import "./chunk-7Q66W4OH.js";
11
6
  import {
12
7
  CLIIsolationManager,
13
8
  DatabaseManager,
14
9
  EnvironmentManager,
15
10
  LoomManager,
16
11
  ResourceCleanup
17
- } from "./chunk-NRDY6XO3.js";
12
+ } from "./chunk-PMVWQBWS.js";
18
13
  import {
19
- detectPackageManager,
20
- installDependencies,
21
- runScript
22
- } from "./chunk-LVLRMP7V.js";
14
+ IssueTrackerFactory,
15
+ generateIssueManagementMcpConfig
16
+ } from "./chunk-6YSFTPKW.js";
17
+ import "./chunk-7Q66W4OH.js";
23
18
  import {
24
19
  ProcessManager
25
20
  } from "./chunk-VU3QMIP2.js";
21
+ import {
22
+ detectPackageManager,
23
+ installDependencies,
24
+ runScript
25
+ } from "./chunk-AXX3QIKK.js";
26
26
  import {
27
27
  IdentifierParser
28
- } from "./chunk-YPOG7WY4.js";
28
+ } from "./chunk-UQIXZ3BA.js";
29
29
  import {
30
30
  createNeonProviderFromSettings
31
31
  } from "./chunk-7LSSNB7Y.js";
32
32
  import {
33
33
  InitCommand,
34
34
  ShellCompletion
35
- } from "./chunk-ZXWTOJXA.js";
35
+ } from "./chunk-UB4TFAXJ.js";
36
36
  import {
37
37
  FirstRunManager
38
- } from "./chunk-NKRQNER7.js";
38
+ } from "./chunk-Q7POFB5Q.js";
39
39
  import "./chunk-F2PWIRV4.js";
40
40
  import {
41
41
  IssueEnhancementService,
42
42
  capitalizeFirstLetter
43
43
  } from "./chunk-7HIRPCKU.js";
44
- import {
45
- AgentManager
46
- } from "./chunk-N4ZJVATC.js";
47
44
  import {
48
45
  ProjectCapabilityDetector
49
- } from "./chunk-EBISESAP.js";
46
+ } from "./chunk-ZPSTA5PR.js";
47
+ import {
48
+ getPackageConfig,
49
+ hasScript
50
+ } from "./chunk-BXCPJJYM.js";
50
51
  import {
51
- hasScript,
52
- readPackageJson
53
- } from "./chunk-2ZPFJQ3B.js";
52
+ AgentManager
53
+ } from "./chunk-SN3Z6EZO.js";
54
54
  import {
55
55
  MergeManager
56
- } from "./chunk-E4F7KASE.js";
56
+ } from "./chunk-WIJWIKAN.js";
57
57
  import {
58
58
  GitWorktreeManager
59
- } from "./chunk-ESP2FF52.js";
59
+ } from "./chunk-EK3XCAAS.js";
60
60
  import {
61
61
  PRManager
62
62
  } from "./chunk-5IWU3HXE.js";
@@ -74,9 +74,9 @@ import {
74
74
  } from "./chunk-O7VL5N6S.js";
75
75
  import {
76
76
  ClaudeContextManager
77
- } from "./chunk-QPS6TZUW.js";
78
- import "./chunk-FXJKNVZW.js";
79
- import "./chunk-K5G5SFWY.js";
77
+ } from "./chunk-7WANFUIK.js";
78
+ import "./chunk-6U6VI4SZ.js";
79
+ import "./chunk-W6WVRHJ6.js";
80
80
  import {
81
81
  extractSettingsOverrides
82
82
  } from "./chunk-GYCR2LOU.js";
@@ -94,10 +94,10 @@ import {
94
94
  pushBranchToRemote,
95
95
  removePlaceholderCommitFromHead,
96
96
  removePlaceholderCommitFromHistory
97
- } from "./chunk-TKL7RBEF.js";
97
+ } from "./chunk-GEXP5IOF.js";
98
98
  import {
99
99
  SettingsManager
100
- } from "./chunk-IDUICCZY.js";
100
+ } from "./chunk-F6WVM437.js";
101
101
  import {
102
102
  MetadataManager
103
103
  } from "./chunk-CFUWQHCJ.js";
@@ -148,7 +148,7 @@ async function getProjectRoot() {
148
148
  async function needsFirstRunSetup() {
149
149
  const projectRoot = await getProjectRoot();
150
150
  const firstRunManager = new FirstRunManager();
151
- const { isConfigured } = await firstRunManager.fixupLegacyProject(projectRoot);
151
+ const isConfigured = await firstRunManager.isProjectConfigured(projectRoot);
152
152
  if (isConfigured) {
153
153
  logger.debug("needsFirstRunSetup: Project is tracked as configured globally");
154
154
  return false;
@@ -867,7 +867,7 @@ var ValidationRunner = class {
867
867
  const stepStartTime = Date.now();
868
868
  let scriptToRun = null;
869
869
  try {
870
- const pkgJson = await readPackageJson(worktreePath);
870
+ const pkgJson = await getPackageConfig(worktreePath);
871
871
  const hasCompileScript = hasScript(pkgJson, "compile");
872
872
  const hasTypecheckScript = hasScript(pkgJson, "typecheck");
873
873
  if (hasCompileScript) {
@@ -947,7 +947,7 @@ Run '${runCommand}' to see detailed errors.`
947
947
  async runLint(worktreePath, dryRun) {
948
948
  const stepStartTime = Date.now();
949
949
  try {
950
- const pkgJson = await readPackageJson(worktreePath);
950
+ const pkgJson = await getPackageConfig(worktreePath);
951
951
  const hasLintScript = hasScript(pkgJson, "lint");
952
952
  if (!hasLintScript) {
953
953
  getLogger().debug("Skipping lint - no lint script found");
@@ -1020,7 +1020,7 @@ Run '${runCommand}' to see detailed errors.`
1020
1020
  async runTests(worktreePath, dryRun) {
1021
1021
  const stepStartTime = Date.now();
1022
1022
  try {
1023
- const pkgJson = await readPackageJson(worktreePath);
1023
+ const pkgJson = await getPackageConfig(worktreePath);
1024
1024
  const hasTestScript = hasScript(pkgJson, "test");
1025
1025
  if (!hasTestScript) {
1026
1026
  getLogger().debug("Skipping tests - no test script found");
@@ -1134,12 +1134,10 @@ Run '${runCommand}' to see detailed errors.`
1134
1134
  }
1135
1135
  /**
1136
1136
  * Get validation command string for prompts
1137
+ * Uses il commands for multi-language project support
1137
1138
  */
1138
- getValidationCommand(validationType, packageManager) {
1139
- if (packageManager === "npm") {
1140
- return `npm run ${validationType}`;
1141
- }
1142
- return `${packageManager} ${validationType}`;
1139
+ getValidationCommand(validationType, _packageManager) {
1140
+ return `il ${validationType}`;
1143
1141
  }
1144
1142
  /**
1145
1143
  * Get Claude prompt for specific validation type
@@ -1606,24 +1604,24 @@ var BuildRunner = class {
1606
1604
  async runBuild(buildPath, options = {}) {
1607
1605
  const startTime = Date.now();
1608
1606
  try {
1609
- const pkgJson = await readPackageJson(buildPath);
1607
+ const pkgJson = await getPackageConfig(buildPath);
1610
1608
  const hasBuildScript = hasScript(pkgJson, "build");
1611
1609
  if (!hasBuildScript) {
1612
1610
  getLogger().debug("Skipping build - no build script found");
1613
1611
  return {
1614
1612
  success: true,
1615
1613
  skipped: true,
1616
- reason: "No build script found in package.json",
1614
+ reason: "No build script found in package configuration",
1617
1615
  duration: Date.now() - startTime
1618
1616
  };
1619
1617
  }
1620
1618
  } catch (error) {
1621
1619
  if (error instanceof Error && error.message.includes("package.json not found")) {
1622
- getLogger().debug("Skipping build - no package.json found (non-Node.js project)");
1620
+ getLogger().debug("Skipping build - no package configuration found");
1623
1621
  return {
1624
1622
  success: true,
1625
1623
  skipped: true,
1626
- reason: "No package.json found in project",
1624
+ reason: "No package configuration found in project",
1627
1625
  duration: Date.now() - startTime
1628
1626
  };
1629
1627
  }
@@ -1769,7 +1767,7 @@ var FinishCommand = class {
1769
1767
  * Main entry point for finish command
1770
1768
  */
1771
1769
  async execute(input) {
1772
- var _a, _b;
1770
+ var _a, _b, _c, _d;
1773
1771
  const isJsonMode = input.options.json === true;
1774
1772
  const result = {
1775
1773
  success: false,
@@ -1780,13 +1778,13 @@ var FinishCommand = class {
1780
1778
  };
1781
1779
  if (isJsonMode) {
1782
1780
  const settings2 = await this.settingsManager.loadSettings();
1783
- if (((_a = settings2.mergeBehavior) == null ? void 0 : _a.mode) === "github-pr" && input.options.cleanup === void 0) {
1784
- throw new Error("JSON mode with github-pr workflow requires --cleanup or --no-cleanup flag. Use: il finish --json --cleanup <identifier>");
1781
+ if ((((_a = settings2.mergeBehavior) == null ? void 0 : _a.mode) === "github-pr" || ((_b = settings2.mergeBehavior) == null ? void 0 : _b.mode) === "github-draft-pr") && input.options.cleanup === void 0) {
1782
+ throw new Error('JSON mode with "github-pr"/"github-draft-pr" workflow requires --cleanup or --no-cleanup flag. Use: il finish --json --cleanup <identifier>');
1785
1783
  }
1786
1784
  }
1787
1785
  const settings = await this.settingsManager.loadSettings();
1788
1786
  let repo;
1789
- const needsRepo = ((_b = settings.mergeBehavior) == null ? void 0 : _b.mode) === "github-pr" || this.issueTracker.providerName === "github";
1787
+ const needsRepo = ((_c = settings.mergeBehavior) == null ? void 0 : _c.mode) === "github-pr" || ((_d = settings.mergeBehavior) == null ? void 0 : _d.mode) === "github-draft-pr" || this.issueTracker.providerName === "github";
1790
1788
  if (needsRepo && await hasMultipleRemotes()) {
1791
1789
  repo = await getConfiguredRepoFromSettings(settings);
1792
1790
  getLogger().info(`Using GitHub repository: ${repo}`);
@@ -2917,14 +2915,14 @@ async function validateGhCliForCommand(command) {
2917
2915
  const settings = await settingsManager.loadSettings();
2918
2916
  const provider = IssueTrackerFactory.getProviderName(settings);
2919
2917
  const mergeBehaviorMode = (_a = settings.mergeBehavior) == null ? void 0 : _a.mode;
2920
- needsGhCli = provider === "github" || mergeBehaviorMode === "github-pr";
2918
+ needsGhCli = provider === "github" || mergeBehaviorMode === "github-pr" || mergeBehaviorMode === "github-draft-pr";
2921
2919
  } catch {
2922
2920
  needsGhCli = true;
2923
2921
  }
2924
2922
  }
2925
2923
  if (!ghAvailable) {
2926
2924
  if (needsGhCli) {
2927
- const errorMessage = alwaysRequireGh.includes(commandName) ? `The "${commandName}" command requires GitHub CLI (gh) to be installed.` : `GitHub CLI (gh) is required when using GitHub as the issue tracker or "github-pr" merge mode.`;
2925
+ const errorMessage = alwaysRequireGh.includes(commandName) ? `The "${commandName}" command requires GitHub CLI (gh) to be installed.` : `GitHub CLI (gh) is required when using GitHub as the issue tracker or "github-pr"/"github-draft-pr" merge mode.`;
2928
2926
  logger.error(errorMessage);
2929
2927
  logger.info("");
2930
2928
  logger.info("To install GitHub CLI:");
@@ -2940,10 +2938,10 @@ async function validateGhCliForCommand(command) {
2940
2938
  const settings = await settingsManager.loadSettings();
2941
2939
  const provider = IssueTrackerFactory.getProviderName(settings);
2942
2940
  const mergeBehaviorMode = (_b = settings.mergeBehavior) == null ? void 0 : _b.mode;
2943
- if (provider === "github" || mergeBehaviorMode === "github-pr") {
2941
+ if (provider === "github" || mergeBehaviorMode === "github-pr" || mergeBehaviorMode === "github-draft-pr") {
2944
2942
  logger.warn("GitHub CLI (gh) is not installed.");
2945
2943
  logger.warn(
2946
- "Some features may not work correctly with your current configuration (GitHub provider or github-pr merge mode)."
2944
+ 'Some features may not work correctly with your current configuration (GitHub provider or "github-pr"/"github-draft-pr" merge mode).'
2947
2945
  );
2948
2946
  logger.info("To install: brew install gh (macOS) or see https://github.com/cli/cli#installation");
2949
2947
  logger.info("");
@@ -2999,14 +2997,14 @@ async function autoLaunchInitForMultipleRemotes() {
2999
2997
  await waitForKeypress2("Press any key to start configuration...");
3000
2998
  logger.info("");
3001
2999
  try {
3002
- const { InitCommand: InitCommand2 } = await import("./init-4ZR2XXZA.js");
3000
+ const { InitCommand: InitCommand2 } = await import("./init-HB34Q5FH.js");
3003
3001
  const initCommand = new InitCommand2();
3004
3002
  const customInitialMessage = "Help me configure which git remote iloom should use for GitHub operations. I have multiple remotes and need to select the correct one.";
3005
3003
  await initCommand.execute(customInitialMessage);
3006
3004
  logger.info("");
3007
3005
  logger.info("Configuration complete! Continuing with your original command...");
3008
3006
  logger.info("");
3009
- const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-CNYBGXDT.js");
3007
+ const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-35F5RUJH.js");
3010
3008
  const settingsManager = new SettingsManager2();
3011
3009
  const settings = await settingsManager.loadSettings();
3012
3010
  const { hasMultipleRemotes: hasMultipleRemotes2 } = await import("./remote-IJAMOEAP.js");
@@ -3100,7 +3098,7 @@ program.command("add-issue").alias("a").description("Create and enhance GitHub i
3100
3098
  });
3101
3099
  program.command("feedback").alias("f").description("Submit feedback/bug report to iloom-cli repository").argument("<description>", "Feedback title (>30 chars, >2 spaces; or any non-empty text when --body provided)").option("--body <text>", "Body text for feedback (added after diagnostics)").action(async (description, options) => {
3102
3100
  try {
3103
- const { FeedbackCommand } = await import("./feedback-567ZH2O7.js");
3101
+ const { FeedbackCommand } = await import("./feedback-O4Q55SVS.js");
3104
3102
  const command = new FeedbackCommand();
3105
3103
  const feedbackOptions = {};
3106
3104
  if (options.body !== void 0) {
@@ -3183,7 +3181,7 @@ program.command("finish").alias("dn").description("Merge work and cleanup worksp
3183
3181
  });
3184
3182
  program.command("rebase").description("Rebase current branch on main with Claude-assisted conflict resolution").option("-f, --force", "Skip confirmation prompts").option("-n, --dry-run", "Preview actions without executing").action(async (options) => {
3185
3183
  try {
3186
- const { RebaseCommand } = await import("./rebase-SRBOVC4M.js");
3184
+ const { RebaseCommand } = await import("./rebase-5EY3Q6XP.js");
3187
3185
  const command = new RebaseCommand();
3188
3186
  await command.execute(options);
3189
3187
  } catch (error) {
@@ -3195,7 +3193,7 @@ program.command("spin").alias("ignite").description("Launch Claude with auto-det
3195
3193
  new Option("--one-shot <mode>", "One-shot automation mode").choices(["default", "noReview", "bypassPermissions"]).default("default")
3196
3194
  ).action(async (options) => {
3197
3195
  try {
3198
- const { IgniteCommand } = await import("./ignite-VPP4PMF4.js");
3196
+ const { IgniteCommand } = await import("./ignite-VHV65WEZ.js");
3199
3197
  const command = new IgniteCommand();
3200
3198
  await command.execute(options.oneShot ?? "default");
3201
3199
  } catch (error) {
@@ -3206,7 +3204,7 @@ program.command("spin").alias("ignite").description("Launch Claude with auto-det
3206
3204
  program.command("open").description("Open workspace in browser or run CLI tool").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
3207
3205
  try {
3208
3206
  const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
3209
- const { OpenCommand } = await import("./open-6HBQHPUL.js");
3207
+ const { OpenCommand } = await import("./open-WHVUYGPY.js");
3210
3208
  const cmd = new OpenCommand();
3211
3209
  const input = identifier ? { identifier, args } : { args };
3212
3210
  await cmd.execute(input);
@@ -3218,7 +3216,7 @@ program.command("open").description("Open workspace in browser or run CLI tool")
3218
3216
  program.command("run").description("Run CLI tool or open workspace in browser").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
3219
3217
  try {
3220
3218
  const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
3221
- const { RunCommand } = await import("./run-5FU76FFE.js");
3219
+ const { RunCommand } = await import("./run-NCRK5NPR.js");
3222
3220
  const cmd = new RunCommand();
3223
3221
  const input = identifier ? { identifier, args } : { args };
3224
3222
  await cmd.execute(input);
@@ -3229,7 +3227,7 @@ program.command("run").description("Run CLI tool or open workspace in browser").
3229
3227
  });
3230
3228
  program.command("dev-server").alias("dev").description("Start dev server for workspace (foreground)").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("--json", "Output as JSON").action(async (identifier, options) => {
3231
3229
  try {
3232
- const { DevServerCommand } = await import("./dev-server-H5FFXIVX.js");
3230
+ const { DevServerCommand } = await import("./dev-server-4RCDJ5MU.js");
3233
3231
  const cmd = new DevServerCommand();
3234
3232
  await cmd.execute({ identifier, json: options == null ? void 0 : options.json });
3235
3233
  } catch (error) {
@@ -3239,7 +3237,7 @@ program.command("dev-server").alias("dev").description("Start dev server for wor
3239
3237
  });
3240
3238
  program.command("shell").alias("terminal").description("Open interactive shell with workspace environment").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
3241
3239
  try {
3242
- const { ShellCommand } = await import("./shell-UQJDI36V.js");
3240
+ const { ShellCommand } = await import("./shell-SBLXVOVJ.js");
3243
3241
  const cmd = new ShellCommand();
3244
3242
  await cmd.execute({ identifier });
3245
3243
  } catch (error) {
@@ -3247,10 +3245,50 @@ program.command("shell").alias("terminal").description("Open interactive shell w
3247
3245
  process.exit(1);
3248
3246
  }
3249
3247
  });
3248
+ program.command("build").description("Run the build script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
3249
+ try {
3250
+ const { BuildCommand } = await import("./build-FJVYP7EV.js");
3251
+ const cmd = new BuildCommand();
3252
+ await cmd.execute(identifier ? { identifier } : {});
3253
+ } catch (error) {
3254
+ logger.error(`Build failed: ${error instanceof Error ? error.message : "Unknown error"}`);
3255
+ process.exit(1);
3256
+ }
3257
+ });
3258
+ program.command("lint").description("Run the lint script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
3259
+ try {
3260
+ const { LintCommand } = await import("./lint-5JMCWE4Y.js");
3261
+ const cmd = new LintCommand();
3262
+ await cmd.execute(identifier ? { identifier } : {});
3263
+ } catch (error) {
3264
+ logger.error(`Lint failed: ${error instanceof Error ? error.message : "Unknown error"}`);
3265
+ process.exit(1);
3266
+ }
3267
+ });
3268
+ program.command("test").description("Run the test script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
3269
+ try {
3270
+ const { TestCommand } = await import("./test-3KIVXI6J.js");
3271
+ const cmd = new TestCommand();
3272
+ await cmd.execute(identifier ? { identifier } : {});
3273
+ } catch (error) {
3274
+ logger.error(`Test failed: ${error instanceof Error ? error.message : "Unknown error"}`);
3275
+ process.exit(1);
3276
+ }
3277
+ });
3278
+ program.command("compile").alias("typecheck").description("Run the compile or typecheck script (prefers compile if both exist)").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
3279
+ try {
3280
+ const { CompileCommand } = await import("./compile-ULNO5F7Q.js");
3281
+ const cmd = new CompileCommand();
3282
+ await cmd.execute(identifier ? { identifier } : {});
3283
+ } catch (error) {
3284
+ logger.error(`Compile failed: ${error instanceof Error ? error.message : "Unknown error"}`);
3285
+ process.exit(1);
3286
+ }
3287
+ });
3250
3288
  program.command("cleanup").alias("remove").alias("clean").description("Remove workspaces").argument("[identifier]", "Branch name or issue number to cleanup (auto-detected)").option("-l, --list", "List all worktrees").option("-a, --all", "Remove all worktrees (interactive confirmation)").option("-i, --issue <number>", "Cleanup by issue number", parseInt).option("-f, --force", "Skip confirmations and force removal").option("--dry-run", "Show what would be done without doing it").option("--json", "Output result as JSON").action(async (identifier, options) => {
3251
3289
  const executeAction = async () => {
3252
3290
  try {
3253
- const { CleanupCommand } = await import("./cleanup-H5QUWBWE.js");
3291
+ const { CleanupCommand } = await import("./cleanup-OU2HFOOG.js");
3254
3292
  const command = new CleanupCommand();
3255
3293
  const input = {
3256
3294
  options: options ?? {}
@@ -3339,7 +3377,7 @@ program.command("projects").description("List configured iloom projects").option
3339
3377
  });
3340
3378
  program.command("init").alias("config").description("Initialize iloom configuration").argument("[prompt]", 'Custom initial message to send to Claude (defaults to "Help me configure iloom settings.")').action(async (prompt) => {
3341
3379
  try {
3342
- const { InitCommand: InitCommand2 } = await import("./init-4ZR2XXZA.js");
3380
+ const { InitCommand: InitCommand2 } = await import("./init-HB34Q5FH.js");
3343
3381
  const command = new InitCommand2();
3344
3382
  const trimmedPrompt = prompt == null ? void 0 : prompt.trim();
3345
3383
  const customPrompt = trimmedPrompt && trimmedPrompt.length > 0 ? trimmedPrompt : void 0;
@@ -3351,7 +3389,7 @@ program.command("init").alias("config").description("Initialize iloom configurat
3351
3389
  });
3352
3390
  program.command("contribute").description("Set up local development environment for contributing to iloom").action(async () => {
3353
3391
  try {
3354
- const { ContributeCommand } = await import("./contribute-VP73TPAL.js");
3392
+ const { ContributeCommand } = await import("./contribute-T7ENST5N.js");
3355
3393
  const command = new ContributeCommand();
3356
3394
  await command.execute();
3357
3395
  } catch (error) {
@@ -3431,9 +3469,9 @@ program.command("test-github").description("Test GitHub integration (Issue #3)")
3431
3469
  program.command("test-claude").description("Test Claude integration (Issue #10)").option("--detect", "Test Claude CLI detection").option("--version", "Get Claude CLI version").option("--branch <title>", "Test branch name generation with given title").option("--issue <number>", "Issue number for branch generation", "123").option("--launch <prompt>", "Launch Claude with a prompt (headless)").option("--interactive", "Launch Claude interactively (requires --launch)").option("--template <name>", "Test template loading").action(async (options) => {
3432
3470
  try {
3433
3471
  const { detectClaudeCli: detectClaudeCli2, getClaudeVersion, generateBranchName, launchClaude: launchClaude2 } = await import("./claude-H33OQMXO.js");
3434
- const { PromptTemplateManager } = await import("./PromptTemplateManager-5GNF7FCP.js");
3435
- const { ClaudeService } = await import("./ClaudeService-6OMO552H.js");
3436
- const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-PQ46VILL.js");
3472
+ const { PromptTemplateManager } = await import("./PromptTemplateManager-C3DK6XZL.js");
3473
+ const { ClaudeService } = await import("./ClaudeService-O2PB22GX.js");
3474
+ const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-6J2EB4QU.js");
3437
3475
  logger.info("Testing Claude Integration\n");
3438
3476
  if (options.detect) {
3439
3477
  logger.info("Detecting Claude CLI...");
@@ -3581,7 +3619,7 @@ program.command("test-webserver").description("Test if a web server is running o
3581
3619
  });
3582
3620
  program.command("test-git").description("Test Git integration - findMainWorktreePath() function (reads .iloom/settings.json)").action(async () => {
3583
3621
  try {
3584
- const { TestGitCommand } = await import("./test-git-GB3B6QNT.js");
3622
+ const { TestGitCommand } = await import("./test-git-ZB6AGGRW.js");
3585
3623
  const command = new TestGitCommand();
3586
3624
  await command.execute();
3587
3625
  } catch (error) {
@@ -3607,7 +3645,7 @@ program.command("test-tabs").description("Test iTerm2 dual tab functionality - o
3607
3645
  });
3608
3646
  program.command("test-prefix").description("Test worktree prefix configuration - preview worktree paths (reads .iloom/settings.json)").action(async () => {
3609
3647
  try {
3610
- const { TestPrefixCommand } = await import("./test-prefix-YQNNTCY3.js");
3648
+ const { TestPrefixCommand } = await import("./test-prefix-FBGXKMPA.js");
3611
3649
  const command = new TestPrefixCommand();
3612
3650
  await command.execute();
3613
3651
  } catch (error) {
@@ -3621,7 +3659,7 @@ program.command("test-prefix").description("Test worktree prefix configuration -
3621
3659
  program.command("summary").description("Generate Claude session summary for a loom").argument("[identifier]", "Issue number, PR number (pr/123), or branch name (auto-detected if omitted)").option("--with-comment", "Post summary as a comment to the issue/PR").option("--json", "Output result as JSON").action(async (identifier, options) => {
3622
3660
  const executeAction = async () => {
3623
3661
  try {
3624
- const { SummaryCommand } = await import("./summary-MOKN7RM2.js");
3662
+ const { SummaryCommand } = await import("./summary-CVFAMDOJ.js");
3625
3663
  const command = new SummaryCommand();
3626
3664
  const result = await command.execute({ identifier, options });
3627
3665
  if (options.json && result) {
@@ -3650,7 +3688,7 @@ program.command("summary").description("Generate Claude session summary for a lo
3650
3688
  program.command("recap").description("Get recap for a loom (defaults to current directory)").argument("[identifier]", "Issue number, PR number (pr/123), or branch name (auto-detected if omitted)").option("--json", "Output as JSON with filePath for file watching").action(async (identifier, options) => {
3651
3689
  const executeAction = async () => {
3652
3690
  try {
3653
- const { RecapCommand } = await import("./recap-X7FTTKPP.js");
3691
+ const { RecapCommand } = await import("./recap-VOOUXOGP.js");
3654
3692
  const command = new RecapCommand();
3655
3693
  const result = await command.execute({ identifier, json: options.json });
3656
3694
  if (options.json && result) {
@@ -3679,7 +3717,7 @@ program.command("recap").description("Get recap for a loom (defaults to current
3679
3717
  program.command("test-neon").description("Test Neon integration and debug configuration").action(async () => {
3680
3718
  var _a;
3681
3719
  try {
3682
- const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-CNYBGXDT.js");
3720
+ const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-35F5RUJH.js");
3683
3721
  const { createNeonProviderFromSettings: createNeonProviderFromSettings2 } = await import("./neon-helpers-3KBC4A3Y.js");
3684
3722
  logger.info("Testing Neon Integration\n");
3685
3723
  logger.info("1. Settings Configuration:");