@iloom/cli 0.9.2 → 0.10.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.
- package/LICENSE +1 -1
- package/README.md +159 -40
- package/dist/{BranchNamingService-K6XNWQ6C.js → BranchNamingService-ECJHBB67.js} +2 -2
- package/dist/ClaudeContextManager-QXX6ZFST.js +14 -0
- package/dist/ClaudeService-NJNK2SUH.js +13 -0
- package/dist/{GitHubService-TGWJN4V4.js → GitHubService-MEHKHUQP.js} +4 -4
- package/dist/IssueTrackerFactory-NG53YX5S.js +14 -0
- package/dist/{LoomLauncher-73NXL2CL.js → LoomLauncher-L64HHS3T.js} +9 -9
- package/dist/{MetadataManager-W3C54UYT.js → MetadataManager-5QZSTKNN.js} +2 -2
- package/dist/{ProjectCapabilityDetector-N5L7T4IY.js → ProjectCapabilityDetector-5KSYUTBJ.js} +3 -3
- package/dist/{PromptTemplateManager-36YLQRHP.js → PromptTemplateManager-DULSVRRE.js} +2 -2
- package/dist/README.md +159 -40
- package/dist/{SettingsManager-AW3JTJHD.js → SettingsManager-BQDQA3FK.js} +4 -2
- package/dist/agents/iloom-artifact-reviewer.md +11 -0
- package/dist/agents/iloom-code-reviewer.md +14 -0
- package/dist/agents/iloom-issue-analyze-and-plan.md +55 -12
- package/dist/agents/iloom-issue-analyzer.md +49 -6
- package/dist/agents/iloom-issue-complexity-evaluator.md +47 -6
- package/dist/agents/iloom-issue-enhancer.md +86 -7
- package/dist/agents/iloom-issue-implementer.md +48 -7
- package/dist/agents/iloom-issue-planner.md +115 -62
- package/dist/{build-THZI572G.js → build-5GO3XW26.js} +9 -9
- package/dist/{chunk-NUACL52E.js → chunk-3D7WQM7I.js} +2 -2
- package/dist/chunk-4232AHNQ.js +35 -0
- package/dist/chunk-4232AHNQ.js.map +1 -0
- package/dist/{chunk-QN47QVBX.js → chunk-4WJNIR5O.js} +1 -1
- package/dist/chunk-4WJNIR5O.js.map +1 -0
- package/dist/{chunk-A7NJF73J.js → chunk-5MWV33NN.js} +4 -4
- package/dist/{chunk-3I4ONZRT.js → chunk-6EU6TCF6.js} +10 -10
- package/dist/chunk-6EU6TCF6.js.map +1 -0
- package/dist/{chunk-CWRI4JC3.js → chunk-FB47TIJG.js} +29 -11
- package/dist/chunk-FB47TIJG.js.map +1 -0
- package/dist/chunk-HEXKPKCK.js +1396 -0
- package/dist/chunk-HEXKPKCK.js.map +1 -0
- package/dist/{chunk-KAYXR544.js → chunk-J5S7DFYC.js} +2 -2
- package/dist/{chunk-ULSWCPQG.js → chunk-JO2LZ6EQ.js} +476 -5
- package/dist/chunk-JO2LZ6EQ.js.map +1 -0
- package/dist/{chunk-KBEIQP4G.js → chunk-KB64WNBZ.js} +43 -3
- package/dist/chunk-KB64WNBZ.js.map +1 -0
- package/dist/{chunk-OFDN5NKS.js → chunk-KXDRI47U.js} +69 -12
- package/dist/chunk-KXDRI47U.js.map +1 -0
- package/dist/{chunk-R4YWBGY6.js → chunk-LXLMMXXY.js} +54 -14
- package/dist/chunk-LXLMMXXY.js.map +1 -0
- package/dist/{chunk-AR5QKYNE.js → chunk-MNHZB4Z2.js} +4 -4
- package/dist/{chunk-TL72BGP6.js → chunk-MORRVYPT.js} +2 -2
- package/dist/{chunk-KJTVU3HZ.js → chunk-NRSWLOAZ.js} +8 -8
- package/dist/chunk-NRSWLOAZ.js.map +1 -0
- package/dist/{chunk-FO5GGFOV.js → chunk-ONQYPICO.js} +13 -5
- package/dist/chunk-ONQYPICO.js.map +1 -0
- package/dist/{chunk-7ZEHSSUP.js → chunk-P4O6EH46.js} +4 -4
- package/dist/chunk-QZWEJVWV.js +207 -0
- package/dist/chunk-QZWEJVWV.js.map +1 -0
- package/dist/chunk-RSYT7MVI.js +202 -0
- package/dist/chunk-RSYT7MVI.js.map +1 -0
- package/dist/{chunk-Z2TWEXR7.js → chunk-RYWFS37M.js} +6 -6
- package/dist/chunk-RYWFS37M.js.map +1 -0
- package/dist/{chunk-B7U6OKUR.js → chunk-SF2P22EE.js} +11 -3
- package/dist/chunk-SF2P22EE.js.map +1 -0
- package/dist/{chunk-6IIL5M2L.js → chunk-SN3SQCFK.js} +10 -8
- package/dist/{chunk-6IIL5M2L.js.map → chunk-SN3SQCFK.js.map} +1 -1
- package/dist/{chunk-SOSQILHO.js → chunk-UD3WJDIV.js} +92 -82
- package/dist/chunk-UD3WJDIV.js.map +1 -0
- package/dist/{chunk-KXGQYLFZ.js → chunk-UKBAJ2QQ.js} +61 -7
- package/dist/chunk-UKBAJ2QQ.js.map +1 -0
- package/dist/{chunk-W6DP5RVR.js → chunk-UVD4CZKS.js} +3 -3
- package/dist/chunk-UWGVCXRF.js +207 -0
- package/dist/chunk-UWGVCXRF.js.map +1 -0
- package/dist/{chunk-NWMORW3U.js → chunk-VECNX6VX.js} +2 -2
- package/dist/{chunk-4CO6KG5S.js → chunk-VG45TUYK.js} +53 -7
- package/dist/{chunk-4CO6KG5S.js.map → chunk-VG45TUYK.js.map} +1 -1
- package/dist/{chunk-TC7APDKU.js → chunk-VGGST52X.js} +2 -2
- package/dist/{chunk-4LKGCFGG.js → chunk-WWKOVDWC.js} +2 -2
- package/dist/{chunk-YKFCCV6S.js → chunk-WY4QBK43.js} +7 -7
- package/dist/chunk-WY4QBK43.js.map +1 -0
- package/dist/chunk-Y4YZTHZE.js +73 -0
- package/dist/chunk-Y4YZTHZE.js.map +1 -0
- package/dist/{chunk-VOGGLPG5.js → chunk-YQ57ORTV.js} +14 -1
- package/dist/chunk-YQ57ORTV.js.map +1 -0
- package/dist/{chunk-RI2YL6TK.js → chunk-YYAKPQBT.js} +65 -18
- package/dist/chunk-YYAKPQBT.js.map +1 -0
- package/dist/{chunk-IZIYLYPK.js → chunk-ZEWU5PZK.js} +2 -2
- package/dist/{chunk-VPTAX5TR.js → chunk-ZHPNZC75.js} +12 -12
- package/dist/chunk-ZHPNZC75.js.map +1 -0
- package/dist/{chunk-DGG2VY7B.js → chunk-ZW2LKWWE.js} +9 -9
- package/dist/chunk-ZW2LKWWE.js.map +1 -0
- package/dist/{claude-TP2QO3BU.js → claude-P3NQR6IJ.js} +2 -2
- package/dist/{cleanup-PJRIFFU4.js → cleanup-6UCPVMFG.js} +81 -32
- package/dist/cleanup-6UCPVMFG.js.map +1 -0
- package/dist/cli.js +638 -349
- package/dist/cli.js.map +1 -1
- package/dist/{commit-IVP3M4HG.js → commit-L3EPY5QG.js} +21 -20
- package/dist/commit-L3EPY5QG.js.map +1 -0
- package/dist/{compile-R2J65HBQ.js → compile-ZS4HYRX5.js} +9 -9
- package/dist/{contribute-VDZXHK5Y.js → contribute-ORDDQGSL.js} +14 -6
- package/dist/contribute-ORDDQGSL.js.map +1 -0
- package/dist/{dev-server-7F622OEO.js → dev-server-FYZ2AQIH.js} +29 -15
- package/dist/dev-server-FYZ2AQIH.js.map +1 -0
- package/dist/{feedback-E7VET7CL.js → feedback-TMBXSCM5.js} +15 -15
- package/dist/{git-2QDQ2X2S.js → git-ET64COO3.js} +4 -4
- package/dist/hooks/iloom-hook.js +15 -0
- package/dist/ignite-CGOV3TD4.js +1393 -0
- package/dist/ignite-CGOV3TD4.js.map +1 -0
- package/dist/index.d.ts +382 -53
- package/dist/index.js +1167 -36
- package/dist/index.js.map +1 -1
- package/dist/{init-676DHF6R.js → init-GFQ5W7GK.js} +57 -21
- package/dist/init-GFQ5W7GK.js.map +1 -0
- package/dist/{issues-PJSOLOBJ.js → issues-T4ZZSPEG.js} +61 -20
- package/dist/issues-T4ZZSPEG.js.map +1 -0
- package/dist/{lint-CJM7BAIM.js → lint-6TQXDZ3T.js} +9 -9
- package/dist/mcp/issue-management-server.js +2471 -256
- package/dist/mcp/issue-management-server.js.map +1 -1
- package/dist/mcp/recap-server.js +144 -21
- package/dist/mcp/recap-server.js.map +1 -1
- package/dist/{neon-helpers-VVFFTLXE.js → neon-helpers-CQN2PB4S.js} +3 -3
- package/dist/neon-helpers-CQN2PB4S.js.map +1 -0
- package/dist/{open-544H7JF5.js → open-5QZGXQRF.js} +15 -15
- package/dist/open-5QZGXQRF.js.map +1 -0
- package/dist/{plan-Q7ELXDLC.js → plan-U7ZQWLFY.js} +41 -25
- package/dist/plan-U7ZQWLFY.js.map +1 -0
- package/dist/{projects-LH362JZQ.js → projects-2UOXFLNZ.js} +4 -4
- package/dist/prompts/CLAUDE.md +62 -0
- package/dist/prompts/init-prompt.txt +347 -26
- package/dist/prompts/issue-prompt.txt +427 -54
- package/dist/prompts/plan-prompt.txt +97 -16
- package/dist/prompts/pr-prompt.txt +44 -1
- package/dist/prompts/regular-prompt.txt +42 -1
- package/dist/prompts/session-summary-prompt.txt +14 -0
- package/dist/prompts/swarm-orchestrator-prompt.txt +437 -0
- package/dist/{rebase-YND35CIE.js → rebase-DWIB77KV.js} +10 -10
- package/dist/{recap-3W7COH7D.js → recap-MX63HAKV.js} +47 -19
- package/dist/recap-MX63HAKV.js.map +1 -0
- package/dist/{run-QUXJKDQQ.js → run-O3TFNQFC.js} +15 -15
- package/dist/run-O3TFNQFC.js.map +1 -0
- package/dist/schema/package-iloom.schema.json +58 -0
- package/dist/schema/settings.schema.json +115 -15
- package/dist/{shell-QGECBLST.js → shell-G6VC2CYR.js} +14 -7
- package/dist/shell-G6VC2CYR.js.map +1 -0
- package/dist/{summary-G2T4452H.js → summary-FWHAX55O.js} +27 -25
- package/dist/summary-FWHAX55O.js.map +1 -0
- package/dist/{test-EA5NQFDC.js → test-F7JNJZYP.js} +9 -9
- package/dist/{test-git-M7LSLEFL.js → test-git-BTAOIUE2.js} +4 -4
- package/dist/test-jira-CHYNV33F.js +96 -0
- package/dist/test-jira-CHYNV33F.js.map +1 -0
- package/dist/{test-prefix-64NAAUON.js → test-prefix-Q6TFSU6F.js} +4 -4
- package/dist/{test-webserver-OK6Z5FJM.js → test-webserver-EONCG7E7.js} +6 -6
- package/dist/{vscode-AR5NNXXI.js → vscode-VA5X4P25.js} +7 -7
- package/package.json +5 -1
- package/dist/ClaudeContextManager-HR5JQKAI.js +0 -14
- package/dist/ClaudeService-TK7FMC2X.js +0 -13
- package/dist/chunk-3I4ONZRT.js.map +0 -1
- package/dist/chunk-B7U6OKUR.js.map +0 -1
- package/dist/chunk-CWRI4JC3.js.map +0 -1
- package/dist/chunk-DGG2VY7B.js.map +0 -1
- package/dist/chunk-FJDRTVJX.js +0 -520
- package/dist/chunk-FJDRTVJX.js.map +0 -1
- package/dist/chunk-FO5GGFOV.js.map +0 -1
- package/dist/chunk-KBEIQP4G.js.map +0 -1
- package/dist/chunk-KJTVU3HZ.js.map +0 -1
- package/dist/chunk-KXGQYLFZ.js.map +0 -1
- package/dist/chunk-OFDN5NKS.js.map +0 -1
- package/dist/chunk-QN47QVBX.js.map +0 -1
- package/dist/chunk-R4YWBGY6.js.map +0 -1
- package/dist/chunk-RI2YL6TK.js.map +0 -1
- package/dist/chunk-SOSQILHO.js.map +0 -1
- package/dist/chunk-ULSWCPQG.js.map +0 -1
- package/dist/chunk-VOGGLPG5.js.map +0 -1
- package/dist/chunk-VPTAX5TR.js.map +0 -1
- package/dist/chunk-WHI5KEOX.js +0 -121
- package/dist/chunk-WHI5KEOX.js.map +0 -1
- package/dist/chunk-YKFCCV6S.js.map +0 -1
- package/dist/chunk-Z2TWEXR7.js.map +0 -1
- package/dist/cleanup-PJRIFFU4.js.map +0 -1
- package/dist/commit-IVP3M4HG.js.map +0 -1
- package/dist/contribute-VDZXHK5Y.js.map +0 -1
- package/dist/dev-server-7F622OEO.js.map +0 -1
- package/dist/ignite-IW35CDBD.js +0 -784
- package/dist/ignite-IW35CDBD.js.map +0 -1
- package/dist/init-676DHF6R.js.map +0 -1
- package/dist/issues-PJSOLOBJ.js.map +0 -1
- package/dist/open-544H7JF5.js.map +0 -1
- package/dist/plan-Q7ELXDLC.js.map +0 -1
- package/dist/recap-3W7COH7D.js.map +0 -1
- package/dist/run-QUXJKDQQ.js.map +0 -1
- package/dist/shell-QGECBLST.js.map +0 -1
- package/dist/summary-G2T4452H.js.map +0 -1
- /package/dist/{BranchNamingService-K6XNWQ6C.js.map → BranchNamingService-ECJHBB67.js.map} +0 -0
- /package/dist/{ClaudeContextManager-HR5JQKAI.js.map → ClaudeContextManager-QXX6ZFST.js.map} +0 -0
- /package/dist/{ClaudeService-TK7FMC2X.js.map → ClaudeService-NJNK2SUH.js.map} +0 -0
- /package/dist/{GitHubService-TGWJN4V4.js.map → GitHubService-MEHKHUQP.js.map} +0 -0
- /package/dist/{MetadataManager-W3C54UYT.js.map → IssueTrackerFactory-NG53YX5S.js.map} +0 -0
- /package/dist/{LoomLauncher-73NXL2CL.js.map → LoomLauncher-L64HHS3T.js.map} +0 -0
- /package/dist/{ProjectCapabilityDetector-N5L7T4IY.js.map → MetadataManager-5QZSTKNN.js.map} +0 -0
- /package/dist/{PromptTemplateManager-36YLQRHP.js.map → ProjectCapabilityDetector-5KSYUTBJ.js.map} +0 -0
- /package/dist/{SettingsManager-AW3JTJHD.js.map → PromptTemplateManager-DULSVRRE.js.map} +0 -0
- /package/dist/{claude-TP2QO3BU.js.map → SettingsManager-BQDQA3FK.js.map} +0 -0
- /package/dist/{build-THZI572G.js.map → build-5GO3XW26.js.map} +0 -0
- /package/dist/{chunk-NUACL52E.js.map → chunk-3D7WQM7I.js.map} +0 -0
- /package/dist/{chunk-A7NJF73J.js.map → chunk-5MWV33NN.js.map} +0 -0
- /package/dist/{chunk-KAYXR544.js.map → chunk-J5S7DFYC.js.map} +0 -0
- /package/dist/{chunk-AR5QKYNE.js.map → chunk-MNHZB4Z2.js.map} +0 -0
- /package/dist/{chunk-TL72BGP6.js.map → chunk-MORRVYPT.js.map} +0 -0
- /package/dist/{chunk-7ZEHSSUP.js.map → chunk-P4O6EH46.js.map} +0 -0
- /package/dist/{chunk-W6DP5RVR.js.map → chunk-UVD4CZKS.js.map} +0 -0
- /package/dist/{chunk-NWMORW3U.js.map → chunk-VECNX6VX.js.map} +0 -0
- /package/dist/{chunk-TC7APDKU.js.map → chunk-VGGST52X.js.map} +0 -0
- /package/dist/{chunk-4LKGCFGG.js.map → chunk-WWKOVDWC.js.map} +0 -0
- /package/dist/{chunk-IZIYLYPK.js.map → chunk-ZEWU5PZK.js.map} +0 -0
- /package/dist/{git-2QDQ2X2S.js.map → claude-P3NQR6IJ.js.map} +0 -0
- /package/dist/{compile-R2J65HBQ.js.map → compile-ZS4HYRX5.js.map} +0 -0
- /package/dist/{feedback-E7VET7CL.js.map → feedback-TMBXSCM5.js.map} +0 -0
- /package/dist/{neon-helpers-VVFFTLXE.js.map → git-ET64COO3.js.map} +0 -0
- /package/dist/{lint-CJM7BAIM.js.map → lint-6TQXDZ3T.js.map} +0 -0
- /package/dist/{projects-LH362JZQ.js.map → projects-2UOXFLNZ.js.map} +0 -0
- /package/dist/{rebase-YND35CIE.js.map → rebase-DWIB77KV.js.map} +0 -0
- /package/dist/{test-EA5NQFDC.js.map → test-F7JNJZYP.js.map} +0 -0
- /package/dist/{test-git-M7LSLEFL.js.map → test-git-BTAOIUE2.js.map} +0 -0
- /package/dist/{test-prefix-64NAAUON.js.map → test-prefix-Q6TFSU6F.js.map} +0 -0
- /package/dist/{test-webserver-OK6Z5FJM.js.map → test-webserver-EONCG7E7.js.map} +0 -0
- /package/dist/{vscode-AR5NNXXI.js.map → vscode-VA5X4P25.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/ClaudeService.ts"],"sourcesContent":["import { detectClaudeCli, launchClaude, launchClaudeInNewTerminalWindow, ClaudeCliOptions } from '../utils/claude.js'\nimport { PromptTemplateManager, TemplateVariables } from './PromptTemplateManager.js'\nimport { SettingsManager, IloomSettings } from './SettingsManager.js'\nimport { logger } from '../utils/logger.js'\n\nexport interface ClaudeWorkflowOptions {\n\ttype: 'issue' | 'pr' | 'regular'\n\tissueNumber?: string | number\n\tprNumber?: number\n\ttitle?: string\n\tworkspacePath: string\n\tport?: number\n\theadless?: boolean\n\tbranchName?: string\n\toneShot?: import('../types/index.js').OneShotMode\n\tsetArguments?: string[] // Raw --set arguments to forward\n\texecutablePath?: string // Executable path to use for spin command\n}\n\nexport class ClaudeService {\n\tprivate templateManager: PromptTemplateManager\n\tprivate settingsManager: SettingsManager\n\tprivate settings?: IloomSettings\n\n\tconstructor(templateManager?: PromptTemplateManager, settingsManager?: SettingsManager) {\n\t\tthis.templateManager = templateManager ?? new PromptTemplateManager()\n\t\tthis.settingsManager = settingsManager ?? new SettingsManager()\n\t}\n\n\t/**\n\t * Check if Claude CLI is available\n\t */\n\tasync isAvailable(): Promise<boolean> {\n\t\treturn detectClaudeCli()\n\t}\n\n\t/**\n\t * Get the appropriate permission mode for a workflow type\n\t */\n\tprivate getPermissionModeForWorkflow(\n\t\ttype: 'issue' | 'pr' | 'regular'\n\t): ClaudeCliOptions['permissionMode'] {\n\t\t// Check settings for configured permission mode\n\t\tif (this.settings?.workflows) {\n\t\t\tconst workflowConfig =\n\t\t\t\ttype === 'issue'\n\t\t\t\t\t? this.settings.workflows.issue\n\t\t\t\t\t: type === 'pr'\n\t\t\t\t\t\t? this.settings.workflows.pr\n\t\t\t\t\t\t: this.settings.workflows.regular\n\n\t\t\tif (workflowConfig?.permissionMode) {\n\t\t\t\treturn workflowConfig.permissionMode\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to acceptEdits for all workflow types\n\t\treturn 'acceptEdits'\n\t}\n\n\t/**\n\t * Launch Claude for a specific workflow\n\t */\n\tasync launchForWorkflow(options: ClaudeWorkflowOptions): Promise<string | void> {\n\t\tconst { type, issueNumber, prNumber, title, workspacePath, port, headless = false, branchName, oneShot = 'default', setArguments, executablePath } = options\n\n\t\ttry {\n\t\t\t// Load settings if not already cached\n\t\t\t// Settings are pre-validated at CLI startup, so no error handling needed here\n\t\t\tthis.settings ??= await this.settingsManager.loadSettings()\n\n\t\t\t// Build template variables\n\t\t\tconst variables: TemplateVariables = {\n\t\t\t\tWORKSPACE_PATH: workspacePath,\n\t\t\t}\n\n\t\t\tif (issueNumber !== undefined) {\n\t\t\t\tvariables.ISSUE_NUMBER = issueNumber\n\t\t\t}\n\n\t\t\tif (prNumber !== undefined) {\n\t\t\t\tvariables.PR_NUMBER = prNumber\n\t\t\t}\n\n\t\t\tif (title !== undefined) {\n\t\t\t\tif (type === 'issue') {\n\t\t\t\t\tvariables.ISSUE_TITLE = title\n\t\t\t\t} else if (type === 'pr') {\n\t\t\t\t\tvariables.PR_TITLE = title\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (port !== undefined) {\n\t\t\t\tvariables.PORT = port\n\t\t\t}\n\n\t\t\t// Get the prompt from template manager\n\t\t\tconst prompt = await this.templateManager.getPrompt(type, variables)\n\n\t\t\t// Determine permission mode (model uses Claude's default for start command)\n\t\t\tconst permissionMode = this.getPermissionModeForWorkflow(type)\n\n\t\t\t// Display warning if bypassPermissions mode is used\n\t\t\tif (permissionMode === 'bypassPermissions') {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'⚠️ WARNING: Using bypassPermissions mode - Claude will execute all tool calls without confirmation. ' +\n\t\t\t\t\t\t'This can be dangerous. Use with caution.'\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Build Claude CLI options\n\t\t\tconst claudeOptions: ClaudeCliOptions = {\n\t\t\t\taddDir: workspacePath,\n\t\t\t\theadless,\n\t\t\t}\n\n\t\t\t// Add permission mode if not default\n\t\t\tif (permissionMode !== undefined && permissionMode !== 'default') {\n\t\t\t\tclaudeOptions.permissionMode = permissionMode\n\t\t\t}\n\n\t\t\t// Add optional branch name for terminal coloring\n\t\t\tif (branchName !== undefined) {\n\t\t\t\tclaudeOptions.branchName = branchName\n\t\t\t}\n\n\t\t\t// Add optional port for terminal window export\n\t\t\tif (port !== undefined) {\n\t\t\t\tclaudeOptions.port = port\n\t\t\t}\n\n\t\t\t// Add optional setArguments for forwarding\n\t\t\tif (setArguments !== undefined) {\n\t\t\t\tclaudeOptions.setArguments = setArguments\n\t\t\t}\n\n\t\t\t// Add optional executablePath for spin command\n\t\t\tif (executablePath !== undefined) {\n\t\t\t\tclaudeOptions.executablePath = executablePath\n\t\t\t}\n\n\t\t\tlogger.debug('Launching Claude for workflow', {\n\t\t\t\ttype,\n\t\t\t\tpermissionMode,\n\t\t\t\theadless,\n\t\t\t\tworkspacePath,\n\t\t\t})\n\n\t\t\t// Launch Claude\n\t\t\tif (headless) {\n\t\t\t\t// Headless mode: use simple launchClaude\n\t\t\t\treturn await launchClaude(prompt, claudeOptions)\n\t\t\t} else {\n\t\t\t\t// Interactive workflow mode: use terminal window launcher\n\t\t\t\t// This is the \"end of il start\" behavior\n\t\t\t\tif (!claudeOptions.addDir) {\n\t\t\t\t\tthrow new Error('workspacePath required for interactive workflow launch')\n\t\t\t\t}\n\n\t\t\t\treturn await launchClaudeInNewTerminalWindow(prompt, {\n\t\t\t\t\t...claudeOptions,\n\t\t\t\t\tworkspacePath: claudeOptions.addDir,\n\t\t\t\t\toneShot,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error('Failed to launch Claude for workflow', { error, options })\n\t\t\tthrow error\n\t\t}\n\t}\n\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBO,IAAM,gBAAN,MAAoB;AAAA,EAK1B,YAAY,iBAAyC,iBAAmC;AACvF,SAAK,kBAAkB,mBAAmB,IAAI,sBAAsB;AACpE,SAAK,kBAAkB,mBAAmB,IAAI,gBAAgB;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAgC;AACrC,WAAO,gBAAgB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,6BACP,MACqC;AAzCvC;AA2CE,SAAI,UAAK,aAAL,mBAAe,WAAW;AAC7B,YAAM,iBACL,SAAS,UACN,KAAK,SAAS,UAAU,QACxB,SAAS,OACR,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,UAAU;AAE7B,UAAI,iDAAgB,gBAAgB;AACnC,eAAO,eAAe;AAAA,MACvB;AAAA,IACD;AAGA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAwD;AAC/E,UAAM,EAAE,MAAM,aAAa,UAAU,OAAO,eAAe,MAAM,WAAW,OAAO,YAAY,UAAU,WAAW,cAAc,eAAe,IAAI;AAErJ,QAAI;AAGH,WAAK,aAAa,MAAM,KAAK,gBAAgB,aAAa;AAG1D,YAAM,YAA+B;AAAA,QACpC,gBAAgB;AAAA,MACjB;AAEA,UAAI,gBAAgB,QAAW;AAC9B,kBAAU,eAAe;AAAA,MAC1B;AAEA,UAAI,aAAa,QAAW;AAC3B,kBAAU,YAAY;AAAA,MACvB;AAEA,UAAI,UAAU,QAAW;AACxB,YAAI,SAAS,SAAS;AACrB,oBAAU,cAAc;AAAA,QACzB,WAAW,SAAS,MAAM;AACzB,oBAAU,WAAW;AAAA,QACtB;AAAA,MACD;AAEA,UAAI,SAAS,QAAW;AACvB,kBAAU,OAAO;AAAA,MAClB;AAGA,YAAM,SAAS,MAAM,KAAK,gBAAgB,UAAU,MAAM,SAAS;AAGnE,YAAM,iBAAiB,KAAK,6BAA6B,IAAI;AAG7D,UAAI,mBAAmB,qBAAqB;AAC3C,eAAO;AAAA,UACN;AAAA,QAED;AAAA,MACD;AAGA,YAAM,gBAAkC;AAAA,QACvC,QAAQ;AAAA,QACR;AAAA,MACD;AAGA,UAAI,mBAAmB,UAAa,mBAAmB,WAAW;AACjE,sBAAc,iBAAiB;AAAA,MAChC;AAGA,UAAI,eAAe,QAAW;AAC7B,sBAAc,aAAa;AAAA,MAC5B;AAGA,UAAI,SAAS,QAAW;AACvB,sBAAc,OAAO;AAAA,MACtB;AAGA,UAAI,iBAAiB,QAAW;AAC/B,sBAAc,eAAe;AAAA,MAC9B;AAGA,UAAI,mBAAmB,QAAW;AACjC,sBAAc,iBAAiB;AAAA,MAChC;AAEA,aAAO,MAAM,iCAAiC;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAGD,UAAI,UAAU;AAEb,eAAO,MAAM,aAAa,QAAQ,aAAa;AAAA,MAChD,OAAO;AAGN,YAAI,CAAC,cAAc,QAAQ;AAC1B,gBAAM,IAAI,MAAM,wDAAwD;AAAA,QACzE;AAEA,eAAO,MAAM,gCAAgC,QAAQ;AAAA,UACpD,GAAG;AAAA,UACH,eAAe,cAAc;AAAA,UAC7B;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD,SAAS,OAAO;AACf,aAAO,MAAM,wCAAwC,EAAE,OAAO,QAAQ,CAAC;AACvE,YAAM;AAAA,IACP;AAAA,EACD;AAED;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/ClaudeService.ts"],"sourcesContent":["import { detectClaudeCli, launchClaude, launchClaudeInNewTerminalWindow, ClaudeCliOptions } from '../utils/claude.js'\nimport { PromptTemplateManager, TemplateVariables } from './PromptTemplateManager.js'\nimport { SettingsManager, IloomSettings } from './SettingsManager.js'\nimport { logger } from '../utils/logger.js'\n\nexport interface ClaudeWorkflowOptions {\n\ttype: 'issue' | 'pr' | 'regular'\n\tissueNumber?: string | number\n\tprNumber?: number\n\ttitle?: string\n\tworkspacePath: string\n\tport?: number\n\theadless?: boolean\n\tbranchName?: string\n\toneShot?: import('../types/index.js').OneShotMode\n\tsetArguments?: string[] // Raw --set arguments to forward\n\texecutablePath?: string // Executable path to use for spin command\n}\n\nexport class ClaudeService {\n\tprivate templateManager: PromptTemplateManager\n\tprivate settingsManager: SettingsManager\n\tprivate settings?: IloomSettings\n\n\tconstructor(templateManager?: PromptTemplateManager, settingsManager?: SettingsManager) {\n\t\tthis.templateManager = templateManager ?? new PromptTemplateManager()\n\t\tthis.settingsManager = settingsManager ?? new SettingsManager()\n\t}\n\n\t/**\n\t * Check if Claude CLI is available\n\t */\n\tasync isAvailable(): Promise<boolean> {\n\t\treturn detectClaudeCli()\n\t}\n\n\t/**\n\t * Get the appropriate permission mode for a workflow type\n\t */\n\tprivate getPermissionModeForWorkflow(\n\t\ttype: 'issue' | 'pr' | 'regular'\n\t): ClaudeCliOptions['permissionMode'] {\n\t\t// Check settings for configured permission mode\n\t\tif (this.settings?.workflows) {\n\t\t\tconst workflowConfig =\n\t\t\t\ttype === 'issue'\n\t\t\t\t\t? this.settings.workflows.issue\n\t\t\t\t\t: type === 'pr'\n\t\t\t\t\t\t? this.settings.workflows.pr\n\t\t\t\t\t\t: this.settings.workflows.regular\n\n\t\t\tif (workflowConfig?.permissionMode) {\n\t\t\t\treturn workflowConfig.permissionMode\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to acceptEdits for all workflow types\n\t\treturn 'acceptEdits'\n\t}\n\n\t/**\n\t * Launch Claude for a specific workflow\n\t */\n\tasync launchForWorkflow(options: ClaudeWorkflowOptions): Promise<string | void> {\n\t\tconst { type, issueNumber, prNumber, title, workspacePath, port, headless = false, branchName, oneShot = 'default', setArguments, executablePath } = options\n\n\t\ttry {\n\t\t\t// Load settings if not already cached\n\t\t\t// Settings are pre-validated at CLI startup, so no error handling needed here\n\t\t\tthis.settings ??= await this.settingsManager.loadSettings()\n\n\t\t\t// Build template variables\n\t\t\tconst variables: TemplateVariables = {\n\t\t\t\tWORKSPACE_PATH: workspacePath,\n\t\t\t}\n\n\t\t\tif (issueNumber !== undefined) {\n\t\t\t\tvariables.ISSUE_NUMBER = issueNumber\n\t\t\t}\n\n\t\t\tif (prNumber !== undefined) {\n\t\t\t\tvariables.PR_NUMBER = prNumber\n\t\t\t}\n\n\t\t\tif (title !== undefined) {\n\t\t\t\tif (type === 'issue') {\n\t\t\t\t\tvariables.ISSUE_TITLE = title\n\t\t\t\t} else if (type === 'pr') {\n\t\t\t\t\tvariables.PR_TITLE = title\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (port !== undefined) {\n\t\t\t\tvariables.PORT = port\n\t\t\t}\n\n\t\t\t// Detect VS Code mode\n\t\t\tconst isVscodeMode = process.env.ILOOM_VSCODE === '1'\n\t\t\tvariables.IS_VSCODE_MODE = isVscodeMode\n\n\t\t\t// Get the prompt from template manager\n\t\t\tconst prompt = await this.templateManager.getPrompt(type, variables)\n\n\t\t\t// Determine permission mode (model uses Claude's default for start command)\n\t\t\tconst permissionMode = this.getPermissionModeForWorkflow(type)\n\n\t\t\t// Display warning if bypassPermissions mode is used\n\t\t\tif (permissionMode === 'bypassPermissions') {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'⚠️ WARNING: Using bypassPermissions mode - Claude will execute all tool calls without confirmation. ' +\n\t\t\t\t\t\t'This can be dangerous. Use with caution.'\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Build Claude CLI options\n\t\t\tconst claudeOptions: ClaudeCliOptions = {\n\t\t\t\taddDir: workspacePath,\n\t\t\t\theadless,\n\t\t\t}\n\n\t\t\t// Add permission mode if not default\n\t\t\tif (permissionMode !== undefined && permissionMode !== 'default') {\n\t\t\t\tclaudeOptions.permissionMode = permissionMode\n\t\t\t}\n\n\t\t\t// Add optional branch name for terminal coloring\n\t\t\tif (branchName !== undefined) {\n\t\t\t\tclaudeOptions.branchName = branchName\n\t\t\t}\n\n\t\t\t// Add optional port for terminal window export\n\t\t\tif (port !== undefined) {\n\t\t\t\tclaudeOptions.port = port\n\t\t\t}\n\n\t\t\t// Add optional setArguments for forwarding\n\t\t\tif (setArguments !== undefined) {\n\t\t\t\tclaudeOptions.setArguments = setArguments\n\t\t\t}\n\n\t\t\t// Add optional executablePath for spin command\n\t\t\tif (executablePath !== undefined) {\n\t\t\t\tclaudeOptions.executablePath = executablePath\n\t\t\t}\n\n\t\t\tlogger.debug('Launching Claude for workflow', {\n\t\t\t\ttype,\n\t\t\t\tpermissionMode,\n\t\t\t\theadless,\n\t\t\t\tworkspacePath,\n\t\t\t})\n\n\t\t\t// Launch Claude\n\t\t\tif (headless) {\n\t\t\t\t// Headless mode: use simple launchClaude\n\t\t\t\treturn await launchClaude(prompt, claudeOptions)\n\t\t\t} else {\n\t\t\t\t// Interactive workflow mode: use terminal window launcher\n\t\t\t\t// This is the \"end of il start\" behavior\n\t\t\t\tif (!claudeOptions.addDir) {\n\t\t\t\t\tthrow new Error('workspacePath required for interactive workflow launch')\n\t\t\t\t}\n\n\t\t\t\treturn await launchClaudeInNewTerminalWindow(prompt, {\n\t\t\t\t\t...claudeOptions,\n\t\t\t\t\tworkspacePath: claudeOptions.addDir,\n\t\t\t\t\toneShot,\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error('Failed to launch Claude for workflow', { error, options })\n\t\t\tthrow error\n\t\t}\n\t}\n\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBO,IAAM,gBAAN,MAAoB;AAAA,EAK1B,YAAY,iBAAyC,iBAAmC;AACvF,SAAK,kBAAkB,mBAAmB,IAAI,sBAAsB;AACpE,SAAK,kBAAkB,mBAAmB,IAAI,gBAAgB;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAgC;AACrC,WAAO,gBAAgB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,6BACP,MACqC;AAzCvC;AA2CE,SAAI,UAAK,aAAL,mBAAe,WAAW;AAC7B,YAAM,iBACL,SAAS,UACN,KAAK,SAAS,UAAU,QACxB,SAAS,OACR,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,UAAU;AAE7B,UAAI,iDAAgB,gBAAgB;AACnC,eAAO,eAAe;AAAA,MACvB;AAAA,IACD;AAGA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAwD;AAC/E,UAAM,EAAE,MAAM,aAAa,UAAU,OAAO,eAAe,MAAM,WAAW,OAAO,YAAY,UAAU,WAAW,cAAc,eAAe,IAAI;AAErJ,QAAI;AAGH,WAAK,aAAa,MAAM,KAAK,gBAAgB,aAAa;AAG1D,YAAM,YAA+B;AAAA,QACpC,gBAAgB;AAAA,MACjB;AAEA,UAAI,gBAAgB,QAAW;AAC9B,kBAAU,eAAe;AAAA,MAC1B;AAEA,UAAI,aAAa,QAAW;AAC3B,kBAAU,YAAY;AAAA,MACvB;AAEA,UAAI,UAAU,QAAW;AACxB,YAAI,SAAS,SAAS;AACrB,oBAAU,cAAc;AAAA,QACzB,WAAW,SAAS,MAAM;AACzB,oBAAU,WAAW;AAAA,QACtB;AAAA,MACD;AAEA,UAAI,SAAS,QAAW;AACvB,kBAAU,OAAO;AAAA,MAClB;AAGA,YAAM,eAAe,QAAQ,IAAI,iBAAiB;AAClD,gBAAU,iBAAiB;AAG3B,YAAM,SAAS,MAAM,KAAK,gBAAgB,UAAU,MAAM,SAAS;AAGnE,YAAM,iBAAiB,KAAK,6BAA6B,IAAI;AAG7D,UAAI,mBAAmB,qBAAqB;AAC3C,eAAO;AAAA,UACN;AAAA,QAED;AAAA,MACD;AAGA,YAAM,gBAAkC;AAAA,QACvC,QAAQ;AAAA,QACR;AAAA,MACD;AAGA,UAAI,mBAAmB,UAAa,mBAAmB,WAAW;AACjE,sBAAc,iBAAiB;AAAA,MAChC;AAGA,UAAI,eAAe,QAAW;AAC7B,sBAAc,aAAa;AAAA,MAC5B;AAGA,UAAI,SAAS,QAAW;AACvB,sBAAc,OAAO;AAAA,MACtB;AAGA,UAAI,iBAAiB,QAAW;AAC/B,sBAAc,eAAe;AAAA,MAC9B;AAGA,UAAI,mBAAmB,QAAW;AACjC,sBAAc,iBAAiB;AAAA,MAChC;AAEA,aAAO,MAAM,iCAAiC;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAGD,UAAI,UAAU;AAEb,eAAO,MAAM,aAAa,QAAQ,aAAa;AAAA,MAChD,OAAO;AAGN,YAAI,CAAC,cAAc,QAAQ;AAC1B,gBAAM,IAAI,MAAM,wDAAwD;AAAA,QACzE;AAEA,eAAO,MAAM,gCAAgC,QAAQ;AAAA,UACpD,GAAG;AAAA,UACH,eAAe,cAAc;AAAA,UAC7B;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD,SAAS,OAAO;AACf,aAAO,MAAM,wCAAwC,EAAE,OAAO,QAAQ,CAAC;AACvE,YAAM;AAAA,IACP;AAAA,EACD;AAED;","names":[]}
|
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
PRManager
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZW2LKWWE.js";
|
|
5
|
+
import {
|
|
6
|
+
archiveRecap
|
|
7
|
+
} from "./chunk-Y4YZTHZE.js";
|
|
5
8
|
import {
|
|
6
9
|
calculatePortForBranch,
|
|
7
10
|
calculatePortFromIdentifier
|
|
8
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-3D7WQM7I.js";
|
|
9
12
|
import {
|
|
10
13
|
installDependencies,
|
|
11
14
|
runScript
|
|
12
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-WWKOVDWC.js";
|
|
13
16
|
import {
|
|
14
17
|
getPackageConfig,
|
|
15
18
|
hasScript
|
|
16
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-YQ57ORTV.js";
|
|
20
|
+
import {
|
|
21
|
+
generateRandomSessionId
|
|
22
|
+
} from "./chunk-ONQYPICO.js";
|
|
17
23
|
import {
|
|
18
24
|
GitCommandError,
|
|
19
25
|
PLACEHOLDER_COMMIT_PREFIX,
|
|
@@ -31,16 +37,19 @@ import {
|
|
|
31
37
|
isBranchMergedIntoMain,
|
|
32
38
|
isFileTrackedByGit,
|
|
33
39
|
pushBranchToRemote
|
|
34
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-MNHZB4Z2.js";
|
|
35
41
|
import {
|
|
36
42
|
SettingsManager
|
|
37
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-YYAKPQBT.js";
|
|
38
44
|
import {
|
|
39
45
|
MetadataManager
|
|
40
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-KB64WNBZ.js";
|
|
41
47
|
import {
|
|
42
48
|
GitHubService
|
|
43
|
-
} from "./chunk-
|
|
49
|
+
} from "./chunk-KXDRI47U.js";
|
|
50
|
+
import {
|
|
51
|
+
getLogger
|
|
52
|
+
} from "./chunk-6MLEBAYZ.js";
|
|
44
53
|
import {
|
|
45
54
|
calculateForegroundColor,
|
|
46
55
|
generateColorFromBranchName,
|
|
@@ -49,12 +58,6 @@ import {
|
|
|
49
58
|
rgbToHex,
|
|
50
59
|
selectDistinctColor
|
|
51
60
|
} from "./chunk-433MOLAU.js";
|
|
52
|
-
import {
|
|
53
|
-
generateRandomSessionId
|
|
54
|
-
} from "./chunk-FO5GGFOV.js";
|
|
55
|
-
import {
|
|
56
|
-
getLogger
|
|
57
|
-
} from "./chunk-6MLEBAYZ.js";
|
|
58
61
|
import {
|
|
59
62
|
detectDarkMode,
|
|
60
63
|
findEnvFileForDatabaseUrl,
|
|
@@ -244,10 +247,10 @@ var LoomManager = class {
|
|
|
244
247
|
* NEW: Checks for existing worktrees and reuses them if found
|
|
245
248
|
*/
|
|
246
249
|
async createIloom(input) {
|
|
247
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
|
|
250
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
|
|
248
251
|
getLogger().info("Fetching issue data...");
|
|
249
252
|
const issueData = await this.fetchIssueData(input);
|
|
250
|
-
if (input.type === "issue" || input.type === "pr" || input.type === "branch") {
|
|
253
|
+
if (input.type === "issue" || input.type === "epic" || input.type === "pr" || input.type === "branch") {
|
|
251
254
|
getLogger().info("Checking for existing worktree...");
|
|
252
255
|
const existing = await this.findExistingIloom(input, issueData);
|
|
253
256
|
if (existing) {
|
|
@@ -332,7 +335,7 @@ var LoomManager = class {
|
|
|
332
335
|
let draftPrNumber = void 0;
|
|
333
336
|
let draftPrUrl = void 0;
|
|
334
337
|
const mergeBehavior = settingsData.mergeBehavior ?? { mode: "local" };
|
|
335
|
-
if (mergeBehavior.mode === "github-draft-pr" && (input.type === "issue" || input.type === "branch")) {
|
|
338
|
+
if (mergeBehavior.mode === "github-draft-pr" && (input.type === "issue" || input.type === "epic" || input.type === "branch")) {
|
|
336
339
|
const prManager = new PRManager(settingsData);
|
|
337
340
|
getLogger().info("Fetching from origin...");
|
|
338
341
|
await executeGitCommand(["fetch", "origin"], { cwd: worktreePath });
|
|
@@ -367,6 +370,8 @@ var LoomManager = class {
|
|
|
367
370
|
getLogger().debug("Placeholder commit created");
|
|
368
371
|
getLogger().info("Pushing branch to remote for draft PR...");
|
|
369
372
|
await pushBranchToRemote(branchName, worktreePath, { dryRun: false });
|
|
373
|
+
await executeGitCommand(["reset", "--soft", "HEAD~1"], { cwd: worktreePath });
|
|
374
|
+
getLogger().debug("Placeholder commit removed from local branch (still on remote)");
|
|
370
375
|
}
|
|
371
376
|
const existingPR = await prManager.checkForExistingPR(branchName, worktreePath);
|
|
372
377
|
if (existingPR) {
|
|
@@ -376,7 +381,7 @@ var LoomManager = class {
|
|
|
376
381
|
} else {
|
|
377
382
|
const prTitle = (issueData == null ? void 0 : issueData.title) ?? `Work on ${branchName}`;
|
|
378
383
|
let prBody;
|
|
379
|
-
if (input.type === "issue") {
|
|
384
|
+
if (input.type === "issue" || input.type === "epic") {
|
|
380
385
|
const issueBody = (issueData == null ? void 0 : issueData.body) ? `
|
|
381
386
|
|
|
382
387
|
## ${issueData.title}
|
|
@@ -419,7 +424,7 @@ ${issueData.body}` : "";
|
|
|
419
424
|
error
|
|
420
425
|
);
|
|
421
426
|
}
|
|
422
|
-
if (input.type === "issue") {
|
|
427
|
+
if (input.type === "issue" || input.type === "epic") {
|
|
423
428
|
try {
|
|
424
429
|
getLogger().info("Moving issue to In Progress...");
|
|
425
430
|
if (this.issueTracker.moveIssueToInProgress) {
|
|
@@ -440,8 +445,8 @@ ${issueData.body}` : "";
|
|
|
440
445
|
const setArguments = (_k = input.options) == null ? void 0 : _k.setArguments;
|
|
441
446
|
const executablePath = (_l = input.options) == null ? void 0 : _l.executablePath;
|
|
442
447
|
if (enableClaude || enableCode || enableDevServer || enableTerminal) {
|
|
443
|
-
const { LoomLauncher } = await import("./LoomLauncher-
|
|
444
|
-
const { ClaudeContextManager } = await import("./ClaudeContextManager-
|
|
448
|
+
const { LoomLauncher } = await import("./LoomLauncher-L64HHS3T.js");
|
|
449
|
+
const { ClaudeContextManager } = await import("./ClaudeContextManager-QXX6ZFST.js");
|
|
445
450
|
const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
|
|
446
451
|
const launcher = new LoomLauncher(claudeContext, this.settings);
|
|
447
452
|
await launcher.launchLoom({
|
|
@@ -453,7 +458,7 @@ ${issueData.body}` : "";
|
|
|
453
458
|
branchName,
|
|
454
459
|
port,
|
|
455
460
|
capabilities,
|
|
456
|
-
workflowType: input.type === "branch" ? "regular" : input.type,
|
|
461
|
+
workflowType: input.type === "branch" ? "regular" : input.type === "epic" ? "issue" : input.type,
|
|
457
462
|
identifier: input.identifier,
|
|
458
463
|
...(issueData == null ? void 0 : issueData.title) && { title: issueData.title },
|
|
459
464
|
oneShot,
|
|
@@ -467,7 +472,7 @@ ${issueData.body}` : "";
|
|
|
467
472
|
const description = (issueData == null ? void 0 : issueData.title) ?? branchName;
|
|
468
473
|
let issue_numbers = [];
|
|
469
474
|
let extractedIssueNum = null;
|
|
470
|
-
if (input.type === "issue") {
|
|
475
|
+
if (input.type === "issue" || input.type === "epic") {
|
|
471
476
|
issue_numbers = [String(input.identifier)];
|
|
472
477
|
} else if (input.type === "pr") {
|
|
473
478
|
extractedIssueNum = extractIssueNumber(branchName);
|
|
@@ -481,7 +486,7 @@ ${issueData.body}` : "";
|
|
|
481
486
|
}
|
|
482
487
|
const sessionId = generateRandomSessionId();
|
|
483
488
|
let issueUrls = {};
|
|
484
|
-
if (input.type === "issue" && (issueData == null ? void 0 : issueData.url)) {
|
|
489
|
+
if ((input.type === "issue" || input.type === "epic") && (issueData == null ? void 0 : issueData.url)) {
|
|
485
490
|
issueUrls = { [String(input.identifier)]: issueData.url };
|
|
486
491
|
} else if (input.type === "pr" && extractedIssueNum && (issueData == null ? void 0 : issueData.url)) {
|
|
487
492
|
const issueUrl = issueData.url.replace(`/pull/${input.identifier}`, `/issues/${extractedIssueNum}`);
|
|
@@ -493,6 +498,7 @@ ${issueData.body}` : "";
|
|
|
493
498
|
branchName,
|
|
494
499
|
worktreePath,
|
|
495
500
|
issueType: input.type,
|
|
501
|
+
...(input.type === "issue" || input.type === "epic") && { issueKey: this.issueTracker.normalizeIdentifier(input.identifier) },
|
|
496
502
|
issue_numbers,
|
|
497
503
|
pr_numbers,
|
|
498
504
|
issueTracker: this.issueTracker.providerName,
|
|
@@ -504,6 +510,9 @@ ${issueData.body}` : "";
|
|
|
504
510
|
capabilities,
|
|
505
511
|
...draftPrNumber && { draftPrNumber },
|
|
506
512
|
...((_o = input.options) == null ? void 0 : _o.oneShot) && { oneShot: input.options.oneShot },
|
|
513
|
+
...((_p = input.options) == null ? void 0 : _p.childIssueNumbers) && input.options.childIssueNumbers.length > 0 && { childIssueNumbers: input.options.childIssueNumbers },
|
|
514
|
+
...((_q = input.options) == null ? void 0 : _q.childIssues) && input.options.childIssues.length > 0 && { childIssues: input.options.childIssues },
|
|
515
|
+
...((_r = input.options) == null ? void 0 : _r.dependencyMap) && Object.keys(input.options.dependencyMap).length > 0 && { dependencyMap: input.options.dependencyMap },
|
|
507
516
|
...input.parentLoom && { parentLoom: input.parentLoom }
|
|
508
517
|
};
|
|
509
518
|
await this.metadataManager.writeMetadata(worktreePath, metadataInput);
|
|
@@ -592,7 +601,7 @@ ${issueData.body}` : "";
|
|
|
592
601
|
async checkAndWarnChildLooms(branchName) {
|
|
593
602
|
let targetBranch = branchName;
|
|
594
603
|
if (!targetBranch) {
|
|
595
|
-
const { getCurrentBranch } = await import("./git-
|
|
604
|
+
const { getCurrentBranch } = await import("./git-ET64COO3.js");
|
|
596
605
|
targetBranch = await getCurrentBranch();
|
|
597
606
|
}
|
|
598
607
|
if (!targetBranch) {
|
|
@@ -621,7 +630,7 @@ ${issueData.body}` : "";
|
|
|
621
630
|
* Fetch issue/PR data based on input type
|
|
622
631
|
*/
|
|
623
632
|
async fetchIssueData(input) {
|
|
624
|
-
if (input.type === "issue") {
|
|
633
|
+
if (input.type === "issue" || input.type === "epic") {
|
|
625
634
|
return await this.issueTracker.fetchIssue(input.identifier);
|
|
626
635
|
} else if (input.type === "pr") {
|
|
627
636
|
if (this.issueTracker.supportsPullRequests && this.issueTracker.fetchPR) {
|
|
@@ -645,7 +654,7 @@ ${issueData.body}` : "";
|
|
|
645
654
|
if (input.type === "pr" && issueData && "branch" in issueData) {
|
|
646
655
|
return issueData.branch;
|
|
647
656
|
}
|
|
648
|
-
if (input.type === "issue" && issueData) {
|
|
657
|
+
if ((input.type === "issue" || input.type === "epic") && issueData) {
|
|
649
658
|
const branchName = await this.branchNaming.generateBranchName({
|
|
650
659
|
issueNumber: input.identifier,
|
|
651
660
|
title: issueData.title
|
|
@@ -918,7 +927,7 @@ ${issueData.body}` : "";
|
|
|
918
927
|
async setupPortForWeb(worktreePath, input, basePort) {
|
|
919
928
|
const envFilePath = path2.join(worktreePath, ".env.local");
|
|
920
929
|
const options = { basePort };
|
|
921
|
-
if (input.type === "issue") {
|
|
930
|
+
if (input.type === "issue" || input.type === "epic") {
|
|
922
931
|
options.issueNumber = input.identifier;
|
|
923
932
|
} else if (input.type === "pr") {
|
|
924
933
|
options.prNumber = input.identifier;
|
|
@@ -963,7 +972,7 @@ ${issueData.body}` : "";
|
|
|
963
972
|
var _a, _b;
|
|
964
973
|
const settingsData = await this.settings.loadSettings();
|
|
965
974
|
const basePort = ((_b = (_a = settingsData.capabilities) == null ? void 0 : _a.web) == null ? void 0 : _b.basePort) ?? 3e3;
|
|
966
|
-
if (input.type === "issue") {
|
|
975
|
+
if (input.type === "issue" || input.type === "epic") {
|
|
967
976
|
if (typeof input.identifier === "number") {
|
|
968
977
|
return this.environment.calculatePort({ basePort, issueNumber: input.identifier });
|
|
969
978
|
} else if (typeof input.identifier === "string") {
|
|
@@ -1017,8 +1026,8 @@ ${issueData.body}` : "";
|
|
|
1017
1026
|
let identifier = wt.branch;
|
|
1018
1027
|
if (loomMetadata == null ? void 0 : loomMetadata.issueType) {
|
|
1019
1028
|
type = loomMetadata.issueType;
|
|
1020
|
-
if (type === "issue" && ((_a = loomMetadata.issue_numbers) == null ? void 0 : _a[0])) {
|
|
1021
|
-
const issueId = loomMetadata.issue_numbers[0];
|
|
1029
|
+
if (type === "issue" && (loomMetadata.issueKey || ((_a = loomMetadata.issue_numbers) == null ? void 0 : _a[0]))) {
|
|
1030
|
+
const issueId = loomMetadata.issueKey ?? loomMetadata.issue_numbers[0] ?? "";
|
|
1022
1031
|
const numericId = parseInt(issueId, 10);
|
|
1023
1032
|
identifier = isNaN(numericId) ? issueId : numericId;
|
|
1024
1033
|
} else if (type === "pr" && ((_b = loomMetadata.pr_numbers) == null ? void 0 : _b[0])) {
|
|
@@ -1080,7 +1089,7 @@ ${issueData.body}` : "";
|
|
|
1080
1089
|
* Ports: handle_existing_worktree() from bash script lines 168-215
|
|
1081
1090
|
*/
|
|
1082
1091
|
async reuseIloom(worktree, input, issueData) {
|
|
1083
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
|
|
1092
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
|
|
1084
1093
|
const worktreePath = worktree.path;
|
|
1085
1094
|
const branchName = worktree.branch;
|
|
1086
1095
|
this.loadMainEnvFile();
|
|
@@ -1140,8 +1149,8 @@ ${issueData.body}` : "";
|
|
|
1140
1149
|
const executablePath = (_i = input.options) == null ? void 0 : _i.executablePath;
|
|
1141
1150
|
if (enableClaude || enableCode || enableDevServer || enableTerminal) {
|
|
1142
1151
|
getLogger().info("Launching workspace components...");
|
|
1143
|
-
const { LoomLauncher } = await import("./LoomLauncher-
|
|
1144
|
-
const { ClaudeContextManager } = await import("./ClaudeContextManager-
|
|
1152
|
+
const { LoomLauncher } = await import("./LoomLauncher-L64HHS3T.js");
|
|
1153
|
+
const { ClaudeContextManager } = await import("./ClaudeContextManager-QXX6ZFST.js");
|
|
1145
1154
|
const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
|
|
1146
1155
|
const launcher = new LoomLauncher(claudeContext, this.settings);
|
|
1147
1156
|
await launcher.launchLoom({
|
|
@@ -1153,7 +1162,7 @@ ${issueData.body}` : "";
|
|
|
1153
1162
|
branchName,
|
|
1154
1163
|
port,
|
|
1155
1164
|
capabilities,
|
|
1156
|
-
workflowType: input.type === "branch" ? "regular" : input.type,
|
|
1165
|
+
workflowType: input.type === "branch" ? "regular" : input.type === "epic" ? "issue" : input.type,
|
|
1157
1166
|
identifier: input.identifier,
|
|
1158
1167
|
...(issueData == null ? void 0 : issueData.title) && { title: issueData.title },
|
|
1159
1168
|
oneShot,
|
|
@@ -1191,6 +1200,7 @@ ${issueData.body}` : "";
|
|
|
1191
1200
|
branchName,
|
|
1192
1201
|
worktreePath,
|
|
1193
1202
|
issueType: input.type,
|
|
1203
|
+
...input.type === "issue" && { issueKey: this.issueTracker.normalizeIdentifier(input.identifier) },
|
|
1194
1204
|
issue_numbers,
|
|
1195
1205
|
pr_numbers,
|
|
1196
1206
|
issueTracker: this.issueTracker.providerName,
|
|
@@ -1201,6 +1211,7 @@ ${issueData.body}` : "";
|
|
|
1201
1211
|
prUrls,
|
|
1202
1212
|
capabilities,
|
|
1203
1213
|
...((_l = input.options) == null ? void 0 : _l.oneShot) && { oneShot: input.options.oneShot },
|
|
1214
|
+
...((_m = input.options) == null ? void 0 : _m.childIssueNumbers) && input.options.childIssueNumbers.length > 0 && { childIssueNumbers: input.options.childIssueNumbers },
|
|
1204
1215
|
...input.parentLoom && { parentLoom: input.parentLoom }
|
|
1205
1216
|
};
|
|
1206
1217
|
await this.metadataManager.writeMetadata(worktreePath, metadataInput);
|
|
@@ -1876,41 +1887,7 @@ var DatabaseManager = class {
|
|
|
1876
1887
|
};
|
|
1877
1888
|
|
|
1878
1889
|
// src/lib/ResourceCleanup.ts
|
|
1879
|
-
import path5 from "path";
|
|
1880
|
-
|
|
1881
|
-
// src/utils/recap-archiver.ts
|
|
1882
1890
|
import path4 from "path";
|
|
1883
|
-
import os2 from "os";
|
|
1884
|
-
import fs6 from "fs-extra";
|
|
1885
|
-
var RECAPS_DIR = path4.join(os2.homedir(), ".config", "iloom-ai", "recaps");
|
|
1886
|
-
var ARCHIVED_DIR = path4.join(RECAPS_DIR, "archived");
|
|
1887
|
-
function slugifyPath(loomPath) {
|
|
1888
|
-
let slug = loomPath.replace(/[/\\]+$/, "");
|
|
1889
|
-
slug = slug.replace(/[/\\]/g, "___");
|
|
1890
|
-
slug = slug.replace(/[^a-zA-Z0-9_-]/g, "-");
|
|
1891
|
-
return `${slug}.json`;
|
|
1892
|
-
}
|
|
1893
|
-
async function archiveRecap(worktreePath) {
|
|
1894
|
-
const filename = slugifyPath(worktreePath);
|
|
1895
|
-
const sourcePath = path4.join(RECAPS_DIR, filename);
|
|
1896
|
-
if (!await fs6.pathExists(sourcePath)) {
|
|
1897
|
-
getLogger().debug(`No recap file to archive for worktree: ${worktreePath}`);
|
|
1898
|
-
return;
|
|
1899
|
-
}
|
|
1900
|
-
const content = await fs6.readFile(sourcePath, "utf8");
|
|
1901
|
-
const data = JSON.parse(content);
|
|
1902
|
-
const archivedData = {
|
|
1903
|
-
...data,
|
|
1904
|
-
archivedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1905
|
-
};
|
|
1906
|
-
await fs6.ensureDir(ARCHIVED_DIR, { mode: 493 });
|
|
1907
|
-
const destPath = path4.join(ARCHIVED_DIR, filename);
|
|
1908
|
-
await fs6.writeFile(destPath, JSON.stringify(archivedData, null, 2), { mode: 420 });
|
|
1909
|
-
await fs6.unlink(sourcePath);
|
|
1910
|
-
getLogger().debug(`Recap archived for worktree: ${worktreePath}`);
|
|
1911
|
-
}
|
|
1912
|
-
|
|
1913
|
-
// src/lib/ResourceCleanup.ts
|
|
1914
1891
|
var ResourceCleanup = class {
|
|
1915
1892
|
constructor(gitWorktree, processManager, database, cliIsolation, settingsManager) {
|
|
1916
1893
|
this.gitWorktree = gitWorktree;
|
|
@@ -1966,16 +1943,28 @@ var ResourceCleanup = class {
|
|
|
1966
1943
|
}
|
|
1967
1944
|
let worktree = null;
|
|
1968
1945
|
try {
|
|
1969
|
-
if (
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1946
|
+
if (options.worktree) {
|
|
1947
|
+
worktree = {
|
|
1948
|
+
path: options.worktree.path,
|
|
1949
|
+
branch: options.worktree.branch,
|
|
1950
|
+
commit: "",
|
|
1951
|
+
bare: false,
|
|
1952
|
+
detached: false,
|
|
1953
|
+
locked: false
|
|
1954
|
+
};
|
|
1955
|
+
getLogger().debug(`Using pre-resolved worktree: path="${worktree.path}", branch="${worktree.branch}"`);
|
|
1956
|
+
} else {
|
|
1957
|
+
if (parsed.type === "pr" && parsed.number !== void 0) {
|
|
1958
|
+
const prNumber = typeof parsed.number === "number" ? parsed.number : Number(parsed.number);
|
|
1959
|
+
if (isNaN(prNumber) || !isFinite(prNumber)) {
|
|
1960
|
+
throw new Error(`Invalid PR number: ${parsed.number}. PR numbers must be numeric.`);
|
|
1961
|
+
}
|
|
1962
|
+
worktree = await this.gitWorktree.findWorktreeForPR(prNumber, "");
|
|
1963
|
+
} else if (parsed.type === "issue" && parsed.number !== void 0) {
|
|
1964
|
+
worktree = await this.gitWorktree.findWorktreeForIssue(parsed.number);
|
|
1965
|
+
} else if (parsed.type === "branch" && parsed.branchName) {
|
|
1966
|
+
worktree = await this.gitWorktree.findWorktreeForBranch(parsed.branchName);
|
|
1973
1967
|
}
|
|
1974
|
-
worktree = await this.gitWorktree.findWorktreeForPR(prNumber, "");
|
|
1975
|
-
} else if (parsed.type === "issue" && parsed.number !== void 0) {
|
|
1976
|
-
worktree = await this.gitWorktree.findWorktreeForIssue(parsed.number);
|
|
1977
|
-
} else if (parsed.type === "branch" && parsed.branchName) {
|
|
1978
|
-
worktree = await this.gitWorktree.findWorktreeForBranch(parsed.branchName);
|
|
1979
1968
|
}
|
|
1980
1969
|
if (!worktree) {
|
|
1981
1970
|
throw new Error(`No worktree found for identifier: ${displayIdentifier}`);
|
|
@@ -2012,7 +2001,7 @@ ${blockerMessage}`);
|
|
|
2012
2001
|
}
|
|
2013
2002
|
let databaseConfig = null;
|
|
2014
2003
|
if (!options.keepDatabase && worktree) {
|
|
2015
|
-
const envFilePath =
|
|
2004
|
+
const envFilePath = path4.join(worktree.path, ".env");
|
|
2016
2005
|
try {
|
|
2017
2006
|
const shouldCleanup = this.database ? await this.database.shouldUseDatabaseBranching(envFilePath) : false;
|
|
2018
2007
|
databaseConfig = { shouldCleanup, envFilePath };
|
|
@@ -2274,11 +2263,32 @@ ${blockerMessage}`);
|
|
|
2274
2263
|
}
|
|
2275
2264
|
if (worktree) {
|
|
2276
2265
|
if (options.dryRun) {
|
|
2266
|
+
const action = options.archive ? "archive" : "delete";
|
|
2277
2267
|
operations.push({
|
|
2278
2268
|
type: "metadata",
|
|
2279
2269
|
success: true,
|
|
2280
|
-
message: `[DRY RUN] Would
|
|
2270
|
+
message: `[DRY RUN] Would ${action} metadata for worktree: ${worktree.path}`
|
|
2281
2271
|
});
|
|
2272
|
+
} else if (options.archive) {
|
|
2273
|
+
try {
|
|
2274
|
+
await this.metadataManager.archiveMetadata(worktree.path);
|
|
2275
|
+
getLogger().info(`Metadata archived for worktree: ${worktree.path}`);
|
|
2276
|
+
operations.push({
|
|
2277
|
+
type: "metadata",
|
|
2278
|
+
success: true,
|
|
2279
|
+
message: "Metadata archived"
|
|
2280
|
+
});
|
|
2281
|
+
} catch (error) {
|
|
2282
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
2283
|
+
errors.push(err);
|
|
2284
|
+
getLogger().warn(`Metadata archival failed: ${err.message}`);
|
|
2285
|
+
operations.push({
|
|
2286
|
+
type: "metadata",
|
|
2287
|
+
success: false,
|
|
2288
|
+
message: "Metadata archival failed (non-fatal)",
|
|
2289
|
+
error: err.message
|
|
2290
|
+
});
|
|
2291
|
+
}
|
|
2282
2292
|
} else {
|
|
2283
2293
|
try {
|
|
2284
2294
|
await this.metadataManager.deleteMetadata(worktree.path);
|
|
@@ -2449,7 +2459,7 @@ ${blockerMessage}`);
|
|
|
2449
2459
|
return false;
|
|
2450
2460
|
}
|
|
2451
2461
|
try {
|
|
2452
|
-
const envFilePath =
|
|
2462
|
+
const envFilePath = path4.join(worktreePath, ".env");
|
|
2453
2463
|
const shouldCleanup = await this.database.shouldUseDatabaseBranching(envFilePath);
|
|
2454
2464
|
let cwd;
|
|
2455
2465
|
try {
|
|
@@ -2633,4 +2643,4 @@ export {
|
|
|
2633
2643
|
DatabaseManager,
|
|
2634
2644
|
ResourceCleanup
|
|
2635
2645
|
};
|
|
2636
|
-
//# sourceMappingURL=chunk-
|
|
2646
|
+
//# sourceMappingURL=chunk-UD3WJDIV.js.map
|