@iloom/cli 0.9.0 → 0.9.2

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 (126) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +21 -2
  3. package/dist/{ClaudeContextManager-X2Y72GRL.js → ClaudeContextManager-HR5JQKAI.js} +4 -4
  4. package/dist/{ClaudeService-7P32TTES.js → ClaudeService-TK7FMC2X.js} +3 -3
  5. package/dist/{GitHubService-ACZVNTJE.js → GitHubService-TGWJN4V4.js} +3 -3
  6. package/dist/{LoomLauncher-3I47SUPV.js → LoomLauncher-73NXL2CL.js} +4 -4
  7. package/dist/README.md +21 -2
  8. package/dist/{SettingsManager-QR7V2IW2.js → SettingsManager-AW3JTJHD.js} +2 -2
  9. package/dist/{build-IC4CJRMP.js → build-THZI572G.js} +6 -6
  10. package/dist/{chunk-Z6F5CUS6.js → chunk-3I4ONZRT.js} +3 -3
  11. package/dist/{chunk-THS5L54H.js → chunk-4CO6KG5S.js} +50 -3
  12. package/dist/chunk-4CO6KG5S.js.map +1 -0
  13. package/dist/{chunk-MZPRBNYC.js → chunk-6IIL5M2L.js} +2 -2
  14. package/dist/{chunk-2JPXGGP4.js → chunk-A7NJF73J.js} +2 -2
  15. package/dist/{chunk-H6ST2TGP.js → chunk-AR5QKYNE.js} +3 -3
  16. package/dist/{chunk-PL2FDYEK.js → chunk-CWRI4JC3.js} +2 -2
  17. package/dist/{chunk-I23OQB4Y.js → chunk-DGG2VY7B.js} +6 -5
  18. package/dist/chunk-DGG2VY7B.js.map +1 -0
  19. package/dist/{chunk-RNBIISBZ.js → chunk-FJDRTVJX.js} +50 -5
  20. package/dist/chunk-FJDRTVJX.js.map +1 -0
  21. package/dist/{chunk-NTTSUAVM.js → chunk-IZIYLYPK.js} +2 -2
  22. package/dist/{chunk-TGRK3CHF.js → chunk-KJTVU3HZ.js} +4 -4
  23. package/dist/{chunk-SC6X5EBG.js → chunk-KXGQYLFZ.js} +3 -3
  24. package/dist/{chunk-USSL2X4A.js → chunk-NUACL52E.js} +2 -2
  25. package/dist/{chunk-JT5LZRMI.js → chunk-NWMORW3U.js} +2 -2
  26. package/dist/{chunk-PVW6JE7E.js → chunk-OFDN5NKS.js} +4 -3
  27. package/dist/{chunk-PVW6JE7E.js.map → chunk-OFDN5NKS.js.map} +1 -1
  28. package/dist/{chunk-HZXBHMVM.js → chunk-R4YWBGY6.js} +3 -3
  29. package/dist/{chunk-XFEK2X2D.js → chunk-RI2YL6TK.js} +9 -3
  30. package/dist/chunk-RI2YL6TK.js.map +1 -0
  31. package/dist/{chunk-6Y3FTRJL.js → chunk-SOSQILHO.js} +102 -51
  32. package/dist/chunk-SOSQILHO.js.map +1 -0
  33. package/dist/{chunk-4GAJJUYS.js → chunk-TC7APDKU.js} +2 -2
  34. package/dist/{chunk-UDZCTLD6.js → chunk-ULSWCPQG.js} +3 -3
  35. package/dist/{chunk-5LVVQGB3.js → chunk-VPTAX5TR.js} +7 -7
  36. package/dist/chunk-VPTAX5TR.js.map +1 -0
  37. package/dist/{chunk-RD7OPXZK.js → chunk-W6DP5RVR.js} +3 -3
  38. package/dist/{chunk-XJHQVOT6.js → chunk-WHI5KEOX.js} +2 -2
  39. package/dist/{chunk-2HZX6AMR.js → chunk-YKFCCV6S.js} +2 -2
  40. package/dist/{chunk-OAVJR4PM.js → chunk-Z2TWEXR7.js} +2 -2
  41. package/dist/{cleanup-M6N7KV7E.js → cleanup-PJRIFFU4.js} +16 -16
  42. package/dist/cli.js +79 -62
  43. package/dist/cli.js.map +1 -1
  44. package/dist/{commit-ORHR53KW.js → commit-IVP3M4HG.js} +10 -9
  45. package/dist/commit-IVP3M4HG.js.map +1 -0
  46. package/dist/{compile-EOWJORKO.js → compile-R2J65HBQ.js} +6 -6
  47. package/dist/{contribute-4KCEOHSH.js → contribute-VDZXHK5Y.js} +4 -4
  48. package/dist/{dev-server-Q6M62ATG.js → dev-server-7F622OEO.js} +8 -8
  49. package/dist/{feedback-XRI7SGYX.js → feedback-E7VET7CL.js} +6 -6
  50. package/dist/{git-W3XUIFTR.js → git-2QDQ2X2S.js} +3 -3
  51. package/dist/{ignite-3FHQY23X.js → ignite-IW35CDBD.js} +10 -10
  52. package/dist/index.d.ts +18 -0
  53. package/dist/index.js +14 -6
  54. package/dist/index.js.map +1 -1
  55. package/dist/{init-ALYWKNWG.js → init-676DHF6R.js} +5 -5
  56. package/dist/issues-PJSOLOBJ.js +138 -0
  57. package/dist/issues-PJSOLOBJ.js.map +1 -0
  58. package/dist/{lint-IHUH45OC.js → lint-CJM7BAIM.js} +6 -6
  59. package/dist/mcp/issue-management-server.js +5 -4
  60. package/dist/mcp/issue-management-server.js.map +1 -1
  61. package/dist/{open-KWOV2OFO.js → open-544H7JF5.js} +8 -8
  62. package/dist/{plan-P6MXL7AU.js → plan-Q7ELXDLC.js} +12 -12
  63. package/dist/prompts/init-prompt.txt +39 -21
  64. package/dist/{rebase-AJOJOZUG.js → rebase-YND35CIE.js} +5 -5
  65. package/dist/{recap-GKJXMDXW.js → recap-3W7COH7D.js} +5 -5
  66. package/dist/{run-QEUVZF7J.js → run-QUXJKDQQ.js} +8 -8
  67. package/dist/schema/settings.schema.json +15 -0
  68. package/dist/{shell-DAAVG4YN.js → shell-QGECBLST.js} +5 -5
  69. package/dist/{summary-WNEYCO4S.js → summary-G2T4452H.js} +9 -9
  70. package/dist/{test-5GPWWO3P.js → test-EA5NQFDC.js} +6 -6
  71. package/dist/{test-git-EJUKDB7F.js → test-git-M7LSLEFL.js} +3 -3
  72. package/dist/{test-prefix-23TOBUXY.js → test-prefix-64NAAUON.js} +3 -3
  73. package/dist/{test-webserver-CKROHFBQ.js → test-webserver-OK6Z5FJM.js} +5 -5
  74. package/dist/{vscode-6TOLFCI2.js → vscode-AR5NNXXI.js} +5 -5
  75. package/package.json +1 -1
  76. package/dist/chunk-5LVVQGB3.js.map +0 -1
  77. package/dist/chunk-6Y3FTRJL.js.map +0 -1
  78. package/dist/chunk-I23OQB4Y.js.map +0 -1
  79. package/dist/chunk-RNBIISBZ.js.map +0 -1
  80. package/dist/chunk-THS5L54H.js.map +0 -1
  81. package/dist/chunk-XFEK2X2D.js.map +0 -1
  82. package/dist/commit-ORHR53KW.js.map +0 -1
  83. /package/dist/{ClaudeContextManager-X2Y72GRL.js.map → ClaudeContextManager-HR5JQKAI.js.map} +0 -0
  84. /package/dist/{ClaudeService-7P32TTES.js.map → ClaudeService-TK7FMC2X.js.map} +0 -0
  85. /package/dist/{GitHubService-ACZVNTJE.js.map → GitHubService-TGWJN4V4.js.map} +0 -0
  86. /package/dist/{LoomLauncher-3I47SUPV.js.map → LoomLauncher-73NXL2CL.js.map} +0 -0
  87. /package/dist/{SettingsManager-QR7V2IW2.js.map → SettingsManager-AW3JTJHD.js.map} +0 -0
  88. /package/dist/{build-IC4CJRMP.js.map → build-THZI572G.js.map} +0 -0
  89. /package/dist/{chunk-Z6F5CUS6.js.map → chunk-3I4ONZRT.js.map} +0 -0
  90. /package/dist/{chunk-MZPRBNYC.js.map → chunk-6IIL5M2L.js.map} +0 -0
  91. /package/dist/{chunk-2JPXGGP4.js.map → chunk-A7NJF73J.js.map} +0 -0
  92. /package/dist/{chunk-H6ST2TGP.js.map → chunk-AR5QKYNE.js.map} +0 -0
  93. /package/dist/{chunk-PL2FDYEK.js.map → chunk-CWRI4JC3.js.map} +0 -0
  94. /package/dist/{chunk-NTTSUAVM.js.map → chunk-IZIYLYPK.js.map} +0 -0
  95. /package/dist/{chunk-TGRK3CHF.js.map → chunk-KJTVU3HZ.js.map} +0 -0
  96. /package/dist/{chunk-SC6X5EBG.js.map → chunk-KXGQYLFZ.js.map} +0 -0
  97. /package/dist/{chunk-USSL2X4A.js.map → chunk-NUACL52E.js.map} +0 -0
  98. /package/dist/{chunk-JT5LZRMI.js.map → chunk-NWMORW3U.js.map} +0 -0
  99. /package/dist/{chunk-HZXBHMVM.js.map → chunk-R4YWBGY6.js.map} +0 -0
  100. /package/dist/{chunk-4GAJJUYS.js.map → chunk-TC7APDKU.js.map} +0 -0
  101. /package/dist/{chunk-UDZCTLD6.js.map → chunk-ULSWCPQG.js.map} +0 -0
  102. /package/dist/{chunk-RD7OPXZK.js.map → chunk-W6DP5RVR.js.map} +0 -0
  103. /package/dist/{chunk-XJHQVOT6.js.map → chunk-WHI5KEOX.js.map} +0 -0
  104. /package/dist/{chunk-2HZX6AMR.js.map → chunk-YKFCCV6S.js.map} +0 -0
  105. /package/dist/{chunk-OAVJR4PM.js.map → chunk-Z2TWEXR7.js.map} +0 -0
  106. /package/dist/{cleanup-M6N7KV7E.js.map → cleanup-PJRIFFU4.js.map} +0 -0
  107. /package/dist/{compile-EOWJORKO.js.map → compile-R2J65HBQ.js.map} +0 -0
  108. /package/dist/{contribute-4KCEOHSH.js.map → contribute-VDZXHK5Y.js.map} +0 -0
  109. /package/dist/{dev-server-Q6M62ATG.js.map → dev-server-7F622OEO.js.map} +0 -0
  110. /package/dist/{feedback-XRI7SGYX.js.map → feedback-E7VET7CL.js.map} +0 -0
  111. /package/dist/{git-W3XUIFTR.js.map → git-2QDQ2X2S.js.map} +0 -0
  112. /package/dist/{ignite-3FHQY23X.js.map → ignite-IW35CDBD.js.map} +0 -0
  113. /package/dist/{init-ALYWKNWG.js.map → init-676DHF6R.js.map} +0 -0
  114. /package/dist/{lint-IHUH45OC.js.map → lint-CJM7BAIM.js.map} +0 -0
  115. /package/dist/{open-KWOV2OFO.js.map → open-544H7JF5.js.map} +0 -0
  116. /package/dist/{plan-P6MXL7AU.js.map → plan-Q7ELXDLC.js.map} +0 -0
  117. /package/dist/{rebase-AJOJOZUG.js.map → rebase-YND35CIE.js.map} +0 -0
  118. /package/dist/{recap-GKJXMDXW.js.map → recap-3W7COH7D.js.map} +0 -0
  119. /package/dist/{run-QEUVZF7J.js.map → run-QUXJKDQQ.js.map} +0 -0
  120. /package/dist/{shell-DAAVG4YN.js.map → shell-QGECBLST.js.map} +0 -0
  121. /package/dist/{summary-WNEYCO4S.js.map → summary-G2T4452H.js.map} +0 -0
  122. /package/dist/{test-5GPWWO3P.js.map → test-EA5NQFDC.js.map} +0 -0
  123. /package/dist/{test-git-EJUKDB7F.js.map → test-git-M7LSLEFL.js.map} +0 -0
  124. /package/dist/{test-prefix-23TOBUXY.js.map → test-prefix-64NAAUON.js.map} +0 -0
  125. /package/dist/{test-webserver-CKROHFBQ.js.map → test-webserver-OK6Z5FJM.js.map} +0 -0
  126. /package/dist/{vscode-6TOLFCI2.js.map → vscode-AR5NNXXI.js.map} +0 -0
@@ -2,28 +2,28 @@
2
2
  import {
3
3
  CommitManager,
4
4
  ValidationRunner
5
- } from "./chunk-5LVVQGB3.js";
5
+ } from "./chunk-VPTAX5TR.js";
6
6
  import {
7
7
  IssueManagementProviderFactory
8
- } from "./chunk-UDZCTLD6.js";
9
- import "./chunk-RNBIISBZ.js";
8
+ } from "./chunk-ULSWCPQG.js";
9
+ import "./chunk-FJDRTVJX.js";
10
10
  import "./chunk-4LKGCFGG.js";
11
11
  import {
12
12
  GitWorktreeManager
13
- } from "./chunk-4GAJJUYS.js";
13
+ } from "./chunk-TC7APDKU.js";
14
14
  import "./chunk-VOGGLPG5.js";
15
15
  import {
16
16
  extractIssueNumber,
17
17
  getWorktreeRoot,
18
18
  isValidGitRepo
19
- } from "./chunk-H6ST2TGP.js";
19
+ } from "./chunk-AR5QKYNE.js";
20
20
  import {
21
21
  SettingsManager
22
- } from "./chunk-XFEK2X2D.js";
22
+ } from "./chunk-RI2YL6TK.js";
23
23
  import {
24
24
  MetadataManager
25
25
  } from "./chunk-KBEIQP4G.js";
26
- import "./chunk-THS5L54H.js";
26
+ import "./chunk-4CO6KG5S.js";
27
27
  import "./chunk-7JDMYTFZ.js";
28
28
  import "./chunk-FO5GGFOV.js";
29
29
  import {
@@ -55,7 +55,7 @@ var CommitCommand = class {
55
55
  * @returns CommitResult when in JSON mode, void otherwise
56
56
  */
57
57
  async execute(input) {
58
- var _a, _b, _c;
58
+ var _a, _b, _c, _d;
59
59
  const logger = getLogger();
60
60
  process.env.ILOOM = "1";
61
61
  let worktreePath;
@@ -122,6 +122,7 @@ var CommitCommand = class {
122
122
  // Don't warn for --wip-commit
123
123
  noReview: input.noReview ?? false,
124
124
  trailerType,
125
+ timeout: (_d = settings.git) == null ? void 0 : _d.commitTimeout,
125
126
  ...commitMessage && { message: commitMessage },
126
127
  ...detected.issueNumber !== void 0 && { issueNumber: detected.issueNumber }
127
128
  };
@@ -234,4 +235,4 @@ export {
234
235
  CommitCommand,
235
236
  WorktreeValidationError
236
237
  };
237
- //# sourceMappingURL=commit-ORHR53KW.js.map
238
+ //# sourceMappingURL=commit-IVP3M4HG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/commit.ts"],"sourcesContent":["import path from 'path'\nimport { GitWorktreeManager } from '../lib/GitWorktreeManager.js'\nimport { CommitManager } from '../lib/CommitManager.js'\nimport { SettingsManager } from '../lib/SettingsManager.js'\nimport { MetadataManager } from '../lib/MetadataManager.js'\nimport { ValidationRunner } from '../lib/ValidationRunner.js'\nimport { IssueManagementProviderFactory } from '../mcp/IssueManagementProviderFactory.js'\nimport { getLogger } from '../utils/logger-context.js'\nimport { extractIssueNumber, isValidGitRepo, getWorktreeRoot } from '../utils/git.js'\nimport type { CommitOptions } from '../types/index.js'\n\n/**\n * Input options for the commit command\n */\nexport interface CommitCommandInput {\n\tmessage?: string | undefined // Custom commit message (skip Claude generation)\n\tfixes?: boolean | undefined // Use \"Fixes #N\" trailer instead of \"Refs #N\"\n\tnoReview?: boolean | undefined // Skip commit message review prompt\n\tjson?: boolean | undefined // Output result as JSON\n\twipCommit?: boolean | undefined // Quick WIP commit: skip validations and pre-commit hooks\n}\n\n/**\n * Result of commit operation (returned in JSON mode)\n */\nexport interface CommitResult {\n\tsuccess: boolean\n\tcommitHash?: string | undefined\n\tmessage?: string | undefined\n\tfilesChanged?: number | undefined\n\tissueNumber?: string | number | undefined\n\ttrailerType: 'Refs' | 'Fixes'\n}\n\n/**\n * Error thrown when the commit command is run from an invalid location\n */\nexport class WorktreeValidationError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly suggestion: string\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'WorktreeValidationError'\n\t}\n}\n\n/**\n * CommitCommand: Commit all uncommitted files with issue reference\n *\n * This command:\n * 1. Validates the current directory is an iloom-managed worktree\n * 2. Auto-detects the issue number from the worktree path/branch\n * 3. Commits all uncommitted changes with a Claude-generated or fallback message\n * 4. Uses \"Refs #N\" trailer by default (keeps issue open)\n * 5. Uses \"Fixes #N\" trailer with --fixes flag (closes issue)\n */\nexport class CommitCommand {\n\tconstructor(\n\t\tprivate gitWorktreeManager = new GitWorktreeManager(),\n\t\tprivate commitManager = new CommitManager(),\n\t\tprivate settingsManager = new SettingsManager(),\n\t\tprivate metadataManager = new MetadataManager(),\n\t\tprivate validationRunner = new ValidationRunner()\n\t) {}\n\n\t/**\n\t * Execute the commit command\n\t *\n\t * @param input - Command input containing options\n\t * @returns CommitResult when in JSON mode, void otherwise\n\t */\n\tasync execute(input: CommitCommandInput): Promise<CommitResult | void> {\n\t\tconst logger = getLogger()\n\n\t\t// Set ILOOM=1 so hooks know this is an iloom session\n\t\tprocess.env.ILOOM = '1'\n\n\t\t// Step 1: Validate worktree context\n\t\tlet worktreePath: string\n\t\ttry {\n\t\t\tworktreePath = await this.validateWorktreeContext()\n\t\t} catch (error) {\n\t\t\tif (error instanceof WorktreeValidationError) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t\tlogger.info(error.suggestion)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\n\t\t// Step 2: Auto-detect issue from current directory\n\t\tconst detected = await this.autoDetectIssue(worktreePath)\n\n\t\t// Step 3: Determine trailer type\n\t\tlet trailerType: 'Refs' | 'Fixes' = 'Refs' // Default to Refs\n\t\tif (input.fixes) {\n\t\t\tif (detected.loomType === 'branch') {\n\t\t\t\t// Warn and ignore --fixes for branch looms (no issue to close)\n\t\t\t\tlogger.warn('--fixes flag ignored: not in an issue or PR worktree')\n\t\t\t} else {\n\t\t\t\ttrailerType = 'Fixes'\n\t\t\t}\n\t\t}\n\n\t\t// Step 4: Check for uncommitted changes\n\t\tconst status = await this.commitManager.detectUncommittedChanges(worktreePath)\n\t\tif (!status.hasUncommittedChanges) {\n\t\t\tlogger.info('No uncommitted changes to commit')\n\t\t\tif (input.json) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\ttrailerType,\n\t\t\t\t\tissueNumber: detected.issueNumber,\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Step 5: Run validations unless --wip-commit is specified\n\t\tlet validationPassed = false\n\t\tif (!input.wipCommit) {\n\t\t\tlogger.info('Running pre-commit validations...')\n\t\t\tconst validationResult = await this.validationRunner.runValidations(worktreePath, {\n\t\t\t\tdryRun: false,\n\t\t\t})\n\t\t\tif (!validationResult.success) {\n\t\t\t\tthrow new Error('Validation failed. Fix errors before committing.')\n\t\t\t}\n\t\t\tlogger.success('All validations passed')\n\t\t\tvalidationPassed = true\n\t\t}\n\n\t\t// Step 6: Load settings to get issue prefix\n\t\tconst settings = await this.settingsManager.loadSettings(worktreePath)\n\t\tconst providerType = settings.issueManagement?.provider ?? 'github'\n\t\tconst issuePrefix = IssueManagementProviderFactory.create(providerType).issuePrefix\n\n\t\t// Determine whether to skip pre-commit hooks:\n\t\t// - With --wip-commit: always skip hooks (quick WIP commit)\n\t\t// - Otherwise: skip hooks only if validation passed AND noVerify setting is enabled\n\t\tconst shouldSkipVerify = input.wipCommit === true || (validationPassed && (settings.workflows?.issue?.noVerify ?? false))\n\n\t\t// Step 7: Determine commit message\n\t\t// For --wip-commit without a custom message, use a hardcoded WIP message to skip Claude generation\n\t\tlet commitMessage: string | undefined = input.message\n\t\tif (input.wipCommit && !input.message) {\n\t\t\tif (detected.issueNumber !== undefined) {\n\t\t\t\tcommitMessage = `WIP commit for Issue ${issuePrefix}${detected.issueNumber}`\n\t\t\t} else {\n\t\t\t\tcommitMessage = 'WIP commit'\n\t\t\t}\n\t\t\tlogger.debug(`Using hardcoded WIP message: ${commitMessage}`)\n\t\t}\n\n\t\t// Step 8: Build commit options\n\t\tconst commitOptions: CommitOptions = {\n\t\t\tissuePrefix,\n\t\t\tskipVerify: shouldSkipVerify,\n\t\t\tskipVerifySilent: input.wipCommit === true, // Don't warn for --wip-commit\n\t\t\tnoReview: input.noReview ?? false,\n\t\t\ttrailerType,\n\t\t\ttimeout: settings.git?.commitTimeout,\n\t\t\t...(commitMessage && { message: commitMessage }),\n\t\t\t...(detected.issueNumber !== undefined && { issueNumber: detected.issueNumber }),\n\t\t}\n\n\t\t// Step 9: Commit changes\n\t\tconst commitResult = await this.commitManager.commitChanges(worktreePath, commitOptions)\n\t\tlogger.success('Changes committed successfully')\n\n\t\t// Step 10: Return result in JSON mode\n\t\tif (input.json) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\ttrailerType,\n\t\t\t\tissueNumber: detected.issueNumber,\n\t\t\t\tmessage: commitResult?.message,\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validate that the current directory is within an iloom-managed worktree\n\t * Returns the worktree root path if valid\n\t * @throws WorktreeValidationError if validation fails\n\t */\n\tprivate async validateWorktreeContext(): Promise<string> {\n\t\tconst currentDir = process.cwd()\n\n\t\t// Step 1: Check if we're in a git repository at all\n\t\tconst isGitRepo = await isValidGitRepo(currentDir)\n\t\tif (!isGitRepo) {\n\t\t\tthrow new WorktreeValidationError(\n\t\t\t\t'Not a git repository.',\n\t\t\t\t\"Run 'il commit' from within an iloom worktree created by 'il start'.\"\n\t\t\t)\n\t\t}\n\n\t\t// Step 2: Get the worktree root (handles subdirectories)\n\t\tconst worktreeRoot = await getWorktreeRoot(currentDir)\n\t\tif (!worktreeRoot) {\n\t\t\tthrow new WorktreeValidationError(\n\t\t\t\t'Could not determine repository root.',\n\t\t\t\t\"Run 'il commit' from within an iloom worktree created by 'il start'.\"\n\t\t\t)\n\t\t}\n\n\t\t// Step 3: Check if this path is a registered git worktree\n\t\tconst worktrees = await this.gitWorktreeManager.listWorktrees()\n\t\tconst currentWorktree = worktrees.find(wt => wt.path === worktreeRoot)\n\n\t\tif (!currentWorktree) {\n\t\t\tthrow new WorktreeValidationError(\n\t\t\t\t'This directory is not an iloom worktree.',\n\t\t\t\t\"Run 'il commit' from within a worktree created by 'il start <issue>'. Use 'il list' to see available worktrees.\"\n\t\t\t)\n\t\t}\n\n\t\t// Step 4: Check if this is the main worktree (we shouldn't commit from main with issue trailers)\n\t\tconst isMain = await this.gitWorktreeManager.isMainWorktree(currentWorktree, this.settingsManager)\n\t\tif (isMain) {\n\t\t\tthrow new WorktreeValidationError(\n\t\t\t\t'Cannot use il commit from the main worktree.',\n\t\t\t\t\"Navigate to a feature worktree created by 'il start <issue>' and run 'il commit' from there.\"\n\t\t\t)\n\t\t}\n\n\t\treturn worktreeRoot\n\t}\n\n\t/**\n\t * Auto-detect issue from current directory\n\t * Similar to SummaryCommand.autoDetectFromCurrentDirectory()\n\t */\n\tprivate async autoDetectIssue(worktreePath: string): Promise<{\n\t\tissueNumber: string | number | undefined\n\t\tloomType: 'issue' | 'pr' | 'branch'\n\t}> {\n\t\tconst logger = getLogger()\n\t\tconst currentDir = path.basename(worktreePath)\n\n\t\t// Check for PR worktree pattern: _pr_N suffix\n\t\tconst prPattern = /_pr_(\\d+)$/\n\t\tconst prMatch = currentDir.match(prPattern)\n\n\t\tif (prMatch?.[1]) {\n\t\t\tconst prNumber = parseInt(prMatch[1], 10)\n\t\t\tlogger.debug(`Auto-detected PR #${prNumber} from directory: ${currentDir}`)\n\n\t\t\t// Try to get issue number from metadata\n\t\t\tconst metadata = await this.metadataManager.readMetadata(worktreePath)\n\t\t\treturn {\n\t\t\t\tissueNumber: metadata?.pr_numbers?.[0] ?? prNumber,\n\t\t\t\tloomType: 'pr',\n\t\t\t}\n\t\t}\n\n\t\t// Check for issue pattern in directory name\n\t\tconst issueNumber = extractIssueNumber(currentDir)\n\n\t\tif (issueNumber !== null) {\n\t\t\tlogger.debug(`Auto-detected issue #${issueNumber} from directory: ${currentDir}`)\n\n\t\t\t// Try to get issue number from metadata for more accuracy\n\t\t\tconst metadata = await this.metadataManager.readMetadata(worktreePath)\n\t\t\treturn {\n\t\t\t\tissueNumber: metadata?.issue_numbers?.[0] ?? issueNumber,\n\t\t\t\tloomType: metadata?.issueType ?? 'issue',\n\t\t\t}\n\t\t}\n\n\t\t// Fallback: get current branch name and try to extract issue\n\t\tconst repoInfo = await this.gitWorktreeManager.getRepoInfo()\n\t\tconst currentBranch = repoInfo.currentBranch\n\n\t\tif (currentBranch) {\n\t\t\tconst branchIssueNumber = extractIssueNumber(currentBranch)\n\t\t\tif (branchIssueNumber !== null) {\n\t\t\t\tlogger.debug(`Auto-detected issue #${branchIssueNumber} from branch: ${currentBranch}`)\n\n\t\t\t\tconst metadata = await this.metadataManager.readMetadata(worktreePath)\n\t\t\t\treturn {\n\t\t\t\t\tissueNumber: metadata?.issue_numbers?.[0] ?? branchIssueNumber,\n\t\t\t\t\tloomType: metadata?.issueType ?? 'issue',\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// No issue detected - treat as branch loom\n\t\tlogger.debug('No issue number detected, treating as branch loom')\n\t\tconst metadata = await this.metadataManager.readMetadata(worktreePath)\n\n\t\t// For branch looms, try to get issue number from metadata\n\t\tlet resolvedIssueNumber: string | number | undefined\n\t\tconst loomType = metadata?.issueType ?? 'branch'\n\n\t\tif (loomType === 'issue' && metadata?.issue_numbers?.[0]) {\n\t\t\tresolvedIssueNumber = metadata.issue_numbers[0]\n\t\t} else if (loomType === 'pr' && metadata?.pr_numbers?.[0]) {\n\t\t\tresolvedIssueNumber = metadata.pr_numbers[0]\n\t\t}\n\n\t\treturn {\n\t\t\tissueNumber: resolvedIssueNumber,\n\t\t\tloomType,\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["metadata"]}
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ScriptCommandBase
4
- } from "./chunk-TGRK3CHF.js";
5
- import "./chunk-2HZX6AMR.js";
4
+ } from "./chunk-KJTVU3HZ.js";
5
+ import "./chunk-YKFCCV6S.js";
6
6
  import {
7
7
  runScript
8
8
  } from "./chunk-4LKGCFGG.js";
9
- import "./chunk-4GAJJUYS.js";
9
+ import "./chunk-TC7APDKU.js";
10
10
  import {
11
11
  getPackageScripts
12
12
  } from "./chunk-VOGGLPG5.js";
13
- import "./chunk-H6ST2TGP.js";
14
- import "./chunk-XFEK2X2D.js";
13
+ import "./chunk-AR5QKYNE.js";
14
+ import "./chunk-RI2YL6TK.js";
15
15
  import "./chunk-KBEIQP4G.js";
16
16
  import "./chunk-6MLEBAYZ.js";
17
17
  import {
@@ -54,4 +54,4 @@ var CompileCommand = class extends ScriptCommandBase {
54
54
  export {
55
55
  CompileCommand
56
56
  };
57
- //# sourceMappingURL=compile-EOWJORKO.js.map
57
+ //# sourceMappingURL=compile-R2J65HBQ.js.map
@@ -4,13 +4,13 @@ import {
4
4
  } from "./chunk-Q7POFB5Q.js";
5
5
  import {
6
6
  executeGitCommand
7
- } from "./chunk-H6ST2TGP.js";
8
- import "./chunk-XFEK2X2D.js";
7
+ } from "./chunk-AR5QKYNE.js";
8
+ import "./chunk-RI2YL6TK.js";
9
9
  import "./chunk-KBEIQP4G.js";
10
10
  import {
11
11
  checkGhAuth,
12
12
  executeGhCommand
13
- } from "./chunk-THS5L54H.js";
13
+ } from "./chunk-4CO6KG5S.js";
14
14
  import {
15
15
  promptInput
16
16
  } from "./chunk-7JDMYTFZ.js";
@@ -327,4 +327,4 @@ export {
327
327
  validateDirectoryPath,
328
328
  validateRepoExists
329
329
  };
330
- //# sourceMappingURL=contribute-4KCEOHSH.js.map
330
+ //# sourceMappingURL=contribute-VDZXHK5Y.js.map
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DevServerManager
4
- } from "./chunk-2JPXGGP4.js";
5
- import "./chunk-NTTSUAVM.js";
4
+ } from "./chunk-A7NJF73J.js";
5
+ import "./chunk-IZIYLYPK.js";
6
6
  import {
7
7
  getWorkspacePort
8
- } from "./chunk-USSL2X4A.js";
8
+ } from "./chunk-NUACL52E.js";
9
9
  import {
10
10
  IdentifierParser
11
- } from "./chunk-2HZX6AMR.js";
11
+ } from "./chunk-YKFCCV6S.js";
12
12
  import "./chunk-4LKGCFGG.js";
13
13
  import {
14
14
  GitWorktreeManager
15
- } from "./chunk-4GAJJUYS.js";
15
+ } from "./chunk-TC7APDKU.js";
16
16
  import {
17
17
  extractSettingsOverrides
18
18
  } from "./chunk-GYCR2LOU.js";
@@ -22,10 +22,10 @@ import {
22
22
  import "./chunk-VOGGLPG5.js";
23
23
  import {
24
24
  extractIssueNumber
25
- } from "./chunk-H6ST2TGP.js";
25
+ } from "./chunk-AR5QKYNE.js";
26
26
  import {
27
27
  SettingsManager
28
- } from "./chunk-XFEK2X2D.js";
28
+ } from "./chunk-RI2YL6TK.js";
29
29
  import "./chunk-KBEIQP4G.js";
30
30
  import "./chunk-6MLEBAYZ.js";
31
31
  import {
@@ -256,4 +256,4 @@ var DevServerCommand = class {
256
256
  export {
257
257
  DevServerCommand
258
258
  };
259
- //# sourceMappingURL=dev-server-Q6M62ATG.js.map
259
+ //# sourceMappingURL=dev-server-7F622OEO.js.map
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  IssueEnhancementService,
4
4
  capitalizeFirstLetter
5
- } from "./chunk-PL2FDYEK.js";
6
- import "./chunk-XJHQVOT6.js";
5
+ } from "./chunk-CWRI4JC3.js";
6
+ import "./chunk-WHI5KEOX.js";
7
7
  import "./chunk-YETJNRQM.js";
8
8
  import {
9
9
  AgentManager
@@ -15,11 +15,11 @@ import {
15
15
  import "./chunk-VOGGLPG5.js";
16
16
  import {
17
17
  SettingsManager
18
- } from "./chunk-XFEK2X2D.js";
18
+ } from "./chunk-RI2YL6TK.js";
19
19
  import {
20
20
  GitHubService
21
- } from "./chunk-PVW6JE7E.js";
22
- import "./chunk-THS5L54H.js";
21
+ } from "./chunk-OFDN5NKS.js";
22
+ import "./chunk-4CO6KG5S.js";
23
23
  import "./chunk-7JDMYTFZ.js";
24
24
  import {
25
25
  getClaudeVersion
@@ -165,4 +165,4 @@ ${userBody}`;
165
165
  export {
166
166
  FeedbackCommand
167
167
  };
168
- //# sourceMappingURL=feedback-XRI7SGYX.js.map
168
+ //# sourceMappingURL=feedback-E7VET7CL.js.map
@@ -34,8 +34,8 @@ import {
34
34
  pushBranchToRemote,
35
35
  removePlaceholderCommitFromHead,
36
36
  removePlaceholderCommitFromHistory
37
- } from "./chunk-H6ST2TGP.js";
38
- import "./chunk-XFEK2X2D.js";
37
+ } from "./chunk-AR5QKYNE.js";
38
+ import "./chunk-RI2YL6TK.js";
39
39
  import "./chunk-KBEIQP4G.js";
40
40
  import "./chunk-6MLEBAYZ.js";
41
41
  import "./chunk-VT4PDUYT.js";
@@ -75,4 +75,4 @@ export {
75
75
  removePlaceholderCommitFromHead,
76
76
  removePlaceholderCommitFromHistory
77
77
  };
78
- //# sourceMappingURL=git-W3XUIFTR.js.map
78
+ //# sourceMappingURL=git-2QDQ2X2S.js.map
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  IssueTrackerFactory
4
- } from "./chunk-SC6X5EBG.js";
4
+ } from "./chunk-KXGQYLFZ.js";
5
5
  import {
6
6
  getWorkspacePort
7
- } from "./chunk-USSL2X4A.js";
7
+ } from "./chunk-NUACL52E.js";
8
8
  import {
9
9
  FirstRunManager
10
10
  } from "./chunk-Q7POFB5Q.js";
11
11
  import {
12
12
  generateIssueManagementMcpConfig,
13
13
  generateRecapMcpConfig
14
- } from "./chunk-XJHQVOT6.js";
14
+ } from "./chunk-WHI5KEOX.js";
15
15
  import {
16
16
  AgentManager
17
17
  } from "./chunk-B7U6OKUR.js";
18
- import "./chunk-RNBIISBZ.js";
18
+ import "./chunk-FJDRTVJX.js";
19
19
  import {
20
20
  GitWorktreeManager
21
- } from "./chunk-4GAJJUYS.js";
21
+ } from "./chunk-TC7APDKU.js";
22
22
  import {
23
23
  PromptTemplateManager,
24
24
  buildReviewTemplateVariables
@@ -30,15 +30,15 @@ import {
30
30
  extractIssueNumber,
31
31
  getWorktreeRoot,
32
32
  isValidGitRepo
33
- } from "./chunk-H6ST2TGP.js";
33
+ } from "./chunk-AR5QKYNE.js";
34
34
  import {
35
35
  SettingsManager
36
- } from "./chunk-XFEK2X2D.js";
36
+ } from "./chunk-RI2YL6TK.js";
37
37
  import {
38
38
  MetadataManager
39
39
  } from "./chunk-KBEIQP4G.js";
40
- import "./chunk-PVW6JE7E.js";
41
- import "./chunk-THS5L54H.js";
40
+ import "./chunk-OFDN5NKS.js";
41
+ import "./chunk-4CO6KG5S.js";
42
42
  import "./chunk-7JDMYTFZ.js";
43
43
  import {
44
44
  launchClaude
@@ -781,4 +781,4 @@ export {
781
781
  IgniteCommand,
782
782
  WorktreeValidationError
783
783
  };
784
- //# sourceMappingURL=ignite-3FHQY23X.js.map
784
+ //# sourceMappingURL=ignite-IW35CDBD.js.map
package/dist/index.d.ts CHANGED
@@ -437,9 +437,19 @@ declare const IloomSettingsSchema: z.ZodObject<{
437
437
  vscode?: boolean | undefined;
438
438
  }>>;
439
439
  attribution: z.ZodDefault<z.ZodEnum<["off", "upstreamOnly", "on"]>>;
440
+ git: z.ZodDefault<z.ZodObject<{
441
+ commitTimeout: z.ZodDefault<z.ZodNumber>;
442
+ }, "strip", z.ZodTypeAny, {
443
+ commitTimeout: number;
444
+ }, {
445
+ commitTimeout?: number | undefined;
446
+ }>>;
440
447
  }, "strip", z.ZodTypeAny, {
441
448
  sourceEnvOnStart: boolean;
442
449
  attribution: "off" | "upstreamOnly" | "on";
450
+ git: {
451
+ commitTimeout: number;
452
+ };
443
453
  plan?: {
444
454
  model: "opus" | "sonnet" | "haiku";
445
455
  planner: "claude" | "gemini" | "codex";
@@ -619,6 +629,9 @@ declare const IloomSettingsSchema: z.ZodObject<{
619
629
  vscode?: boolean | undefined;
620
630
  } | undefined;
621
631
  attribution?: "off" | "upstreamOnly" | "on" | undefined;
632
+ git?: {
633
+ commitTimeout?: number | undefined;
634
+ } | undefined;
622
635
  }>;
623
636
  /**
624
637
  * TypeScript type for iloom settings derived from Zod schema
@@ -962,6 +975,9 @@ interface BranchDeleteOptions {
962
975
  /** Pre-fetched merge target branch (parent branch for child looms, main branch for others).
963
976
  * This must be fetched BEFORE worktree deletion since metadata won't be readable after deletion. */
964
977
  mergeTargetBranch?: string;
978
+ /** Safety check has verified no data loss risk. When true, allows force delete
979
+ * if git branch -d fails with "not fully merged" since safety is already confirmed. */
980
+ safetyVerified?: boolean;
965
981
  }
966
982
  /**
967
983
  * Target for batch cleanup - represents a branch that may or may not have a worktree
@@ -1170,6 +1186,7 @@ interface PullRequest {
1170
1186
  baseBranch: string;
1171
1187
  url: string;
1172
1188
  isDraft: boolean;
1189
+ isFork?: boolean;
1173
1190
  }
1174
1191
  /**
1175
1192
  * Generic input detection result for issue trackers
@@ -1362,6 +1379,7 @@ interface CommitOptions {
1362
1379
  skipVerify?: boolean;
1363
1380
  skipVerifySilent?: boolean;
1364
1381
  trailerType?: 'Refs' | 'Fixes';
1382
+ timeout?: number;
1365
1383
  }
1366
1384
  /**
1367
1385
  * Error thrown when user aborts a commit operation
package/dist/index.js CHANGED
@@ -655,7 +655,10 @@ var init_SettingsManager = __esm({
655
655
  }).optional().describe("Color synchronization settings for workspace identification"),
656
656
  attribution: z.enum(["off", "upstreamOnly", "on"]).default("upstreamOnly").describe(
657
657
  'Controls when iloom attribution appears in session summaries. "off" - never show attribution. "upstreamOnly" - only show for contributions to external repositories (e.g., open source). "on" - always show attribution.'
658
- )
658
+ ),
659
+ git: z.object({
660
+ commitTimeout: z.number().min(1e3, "Commit timeout must be at least 1000ms").max(6e5, "Commit timeout cannot exceed 600000ms (10 minutes)").default(6e4).describe("Timeout in milliseconds for git commit operations. Increase for long-running pre-commit hooks.")
661
+ }).default({}).describe("Git operation settings")
659
662
  });
660
663
  IloomSettingsSchemaNoDefaults = z.object({
661
664
  mainBranch: z.string().min(1, "Settings 'mainBranch' cannot be empty").optional().describe("Name of the main/primary branch for the repository"),
@@ -735,7 +738,10 @@ var init_SettingsManager = __esm({
735
738
  }).optional().describe("Color synchronization settings for workspace identification"),
736
739
  attribution: z.enum(["off", "upstreamOnly", "on"]).optional().describe(
737
740
  'Controls when iloom attribution appears in session summaries. "off" - never show attribution. "upstreamOnly" - only show for contributions to external repositories (e.g., open source). "on" - always show attribution.'
738
- )
741
+ ),
742
+ git: z.object({
743
+ commitTimeout: z.number().min(1e3, "Commit timeout must be at least 1000ms").max(6e5, "Commit timeout cannot exceed 600000ms (10 minutes)").optional().describe("Timeout in milliseconds for git commit operations. Increase for long-running pre-commit hooks.")
744
+ }).optional().describe("Git operation settings")
739
745
  });
740
746
  SettingsManager = class {
741
747
  /**
@@ -2665,7 +2671,7 @@ async function fetchGhPR(prNumber, repo) {
2665
2671
  "view",
2666
2672
  String(prNumber),
2667
2673
  "--json",
2668
- "number,title,body,state,headRefName,baseRefName,url,isDraft,mergeable,createdAt,updatedAt"
2674
+ "number,title,body,state,headRefName,baseRefName,url,isDraft,isCrossRepository,mergeable,createdAt,updatedAt"
2669
2675
  ];
2670
2676
  if (repo) {
2671
2677
  args.push("--repo", repo);
@@ -3064,7 +3070,8 @@ State: ${entity.state}`;
3064
3070
  branch: ghPR.headRefName,
3065
3071
  baseBranch: ghPR.baseRefName,
3066
3072
  url: ghPR.url,
3067
- isDraft: ghPR.isDraft
3073
+ isDraft: ghPR.isDraft,
3074
+ isFork: ghPR.isCrossRepository
3068
3075
  };
3069
3076
  }
3070
3077
  async promptUserConfirmation(message) {
@@ -3122,8 +3129,9 @@ function getLinearApiToken() {
3122
3129
  }
3123
3130
  return token;
3124
3131
  }
3125
- function createLinearClient() {
3126
- return new LinearClient({ apiKey: getLinearApiToken() });
3132
+ function createLinearClient(apiToken) {
3133
+ const token = apiToken ?? getLinearApiToken();
3134
+ return new LinearClient({ apiKey: token });
3127
3135
  }
3128
3136
  function handleLinearError(error, context) {
3129
3137
  logger.debug(`${context}: Handling error`, { error });