@iloom/cli 0.13.0 → 0.13.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 (148) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/CLAUDE.md +66 -0
  4. package/dist/{ClaudeContextManager-ZH6LEA5I.js → ClaudeContextManager-KJ4VEA2F.js} +5 -5
  5. package/dist/{ClaudeService-YR66WXZN.js → ClaudeService-WTJO4UW6.js} +4 -4
  6. package/dist/{IssueTrackerFactory-O2ZBA666.js → IssueTrackerFactory-UEJALI4X.js} +3 -3
  7. package/dist/{LoomLauncher-V54ENBEF.js → LoomLauncher-KG2VBNQA.js} +5 -5
  8. package/dist/{PromptTemplateManager-4RFELNYY.js → PromptTemplateManager-QIUVJP6S.js} +2 -2
  9. package/dist/README.md +1 -1
  10. package/dist/{SettingsManager-SLSYEYDZ.js → SettingsManager-PVHBSCMI.js} +2 -2
  11. package/dist/agents/CLAUDE.md +68 -0
  12. package/dist/agents/iloom-code-reviewer.md +1 -0
  13. package/dist/agents/iloom-wave-verifier.md +1 -36
  14. package/dist/{build-ZTGWDHWU.js → build-2FXDYEZQ.js} +6 -6
  15. package/dist/{chunk-LNY2Y32V.js → chunk-2WRD6Y5E.js} +2 -2
  16. package/dist/{chunk-WYDLOQYO.js → chunk-32D4CWWH.js} +2 -2
  17. package/dist/{chunk-KGOBNC5A.js → chunk-5W44AI63.js} +3 -3
  18. package/dist/{chunk-PPQ5LV7U.js → chunk-D6FU4DLN.js} +2 -2
  19. package/dist/{chunk-PS6K2AOV.js → chunk-DMNI225H.js} +4 -4
  20. package/dist/{chunk-55NTREIU.js → chunk-DYLOITSO.js} +55 -35
  21. package/dist/chunk-DYLOITSO.js.map +1 -0
  22. package/dist/{chunk-T4KFKKEB.js → chunk-H4TSDALC.js} +6 -6
  23. package/dist/{chunk-J5JOJPK3.js → chunk-L3P3YJCE.js} +2 -2
  24. package/dist/{chunk-MRPIDNZU.js → chunk-LDE6VNG5.js} +1 -1
  25. package/dist/chunk-LDE6VNG5.js.map +1 -0
  26. package/dist/{chunk-F5NKWLMQ.js → chunk-MNPKEWBQ.js} +9 -5
  27. package/dist/chunk-MNPKEWBQ.js.map +1 -0
  28. package/dist/{chunk-SM3BCHYB.js → chunk-MPHSR6GA.js} +8 -4
  29. package/dist/{chunk-SM3BCHYB.js.map → chunk-MPHSR6GA.js.map} +1 -1
  30. package/dist/{chunk-HWDQRW3O.js → chunk-OHX3PSAY.js} +2 -2
  31. package/dist/{chunk-C2BVNJW5.js → chunk-OIJNBFMP.js} +2 -2
  32. package/dist/{chunk-TJDKGKQV.js → chunk-OMV47LLA.js} +2 -2
  33. package/dist/{chunk-N6DY47YN.js → chunk-OVW26FHW.js} +47 -9
  34. package/dist/chunk-OVW26FHW.js.map +1 -0
  35. package/dist/{chunk-KCAWSZUO.js → chunk-R2EFSRKR.js} +10 -10
  36. package/dist/{chunk-QNRXRSKC.js → chunk-RP6MHV24.js} +9 -9
  37. package/dist/chunk-RP6MHV24.js.map +1 -0
  38. package/dist/{chunk-UXBVDD7U.js → chunk-U2OPXZ6E.js} +282 -44
  39. package/dist/chunk-U2OPXZ6E.js.map +1 -0
  40. package/dist/{chunk-T4NESGYB.js → chunk-UMAOVKQX.js} +3 -3
  41. package/dist/{chunk-E5OM25WK.js → chunk-UQWMPQ2Q.js} +2 -2
  42. package/dist/{chunk-ZEFTWM5Z.js → chunk-VUIPDX3T.js} +2 -2
  43. package/dist/{chunk-GQDVH6FA.js → chunk-XC5JKRSH.js} +2 -2
  44. package/dist/{chunk-G2DGDCDP.js → chunk-Y2JHYPMX.js} +15 -13
  45. package/dist/chunk-Y2JHYPMX.js.map +1 -0
  46. package/dist/{chunk-ERMEYFT6.js → chunk-YVNG35OW.js} +2 -2
  47. package/dist/{chunk-7TN5VW4I.js → chunk-Z32HPRZF.js} +2 -1
  48. package/dist/chunk-Z32HPRZF.js.map +1 -0
  49. package/dist/{chunk-GPBX2BY2.js → chunk-ZWXJ7G2C.js} +2 -2
  50. package/dist/{cleanup-BCVY7PEF.js → cleanup-I62RA5TZ.js} +16 -16
  51. package/dist/cli.js +111 -64
  52. package/dist/cli.js.map +1 -1
  53. package/dist/{commit-L5JNBU4U.js → commit-7RI2JFFW.js} +6 -6
  54. package/dist/{compile-GPJOHXH4.js → compile-NWTMKAGL.js} +6 -6
  55. package/dist/{contribute-QEGCI4PS.js → contribute-QWPOT4QR.js} +3 -3
  56. package/dist/{dev-server-67NPVWUN.js → dev-server-OZ6KKKTR.js} +60 -27
  57. package/dist/dev-server-OZ6KKKTR.js.map +1 -0
  58. package/dist/{feedback-2LWXKLQZ.js → feedback-G63MODT2.js} +4 -4
  59. package/dist/{git-IS7AV3ED.js → git-ZTMT6OAI.js} +3 -3
  60. package/dist/{ignite-VQDJQ37S.js → ignite-GUYKYC5G.js} +11 -11
  61. package/dist/index.d.ts +30 -3
  62. package/dist/index.js +8 -4
  63. package/dist/index.js.map +1 -1
  64. package/dist/{init-7SDJUAEZ.js → init-AMLCFVXG.js} +9 -7
  65. package/dist/init-AMLCFVXG.js.map +1 -0
  66. package/dist/{install-deps-NGSFDNUW.js → install-deps-XS2UUCUS.js} +6 -6
  67. package/dist/{issues-4HQKEUP7.js → issues-2IT7PSNZ.js} +4 -4
  68. package/dist/{lint-C5FOVRXY.js → lint-DKWJHET3.js} +6 -6
  69. package/dist/mcp/issue-management-server.js +8 -4
  70. package/dist/mcp/issue-management-server.js.map +1 -1
  71. package/dist/{open-WUTLRI6S.js → open-6PXNIPXS.js} +13 -12
  72. package/dist/open-6PXNIPXS.js.map +1 -0
  73. package/dist/{plan-GC3HF73T.js → plan-NJVQBBT3.js} +18 -18
  74. package/dist/prompts/epic-report-prompt.txt +145 -0
  75. package/dist/prompts/init-prompt.txt +32 -9
  76. package/dist/prompts/issue-prompt.txt +1 -1
  77. package/dist/prompts/swarm-orchestrator-prompt.txt +50 -6
  78. package/dist/{rebase-CSGQICAP.js → rebase-6AXN45AE.js} +5 -5
  79. package/dist/{recap-CKGKFDJL.js → recap-XDKI3MTA.js} +6 -6
  80. package/dist/{run-3YL2IXXI.js → run-RHE5NPDT.js} +16 -16
  81. package/dist/run-RHE5NPDT.js.map +1 -0
  82. package/dist/schema/settings.schema.json +14 -0
  83. package/dist/{shell-M2YYPNGV.js → shell-XOILFEZW.js} +5 -5
  84. package/dist/{summary-XR4CBJEG.js → summary-BVYOM63C.js} +10 -8
  85. package/dist/{summary-XR4CBJEG.js.map → summary-BVYOM63C.js.map} +1 -1
  86. package/dist/{test-ESDAHEVE.js → test-6T2UMQ7T.js} +6 -6
  87. package/dist/{test-git-KWPLHYSI.js → test-git-CQ65OL45.js} +3 -3
  88. package/dist/{test-jira-6NK7UHSV.js → test-jira-CQQHGZ3S.js} +3 -3
  89. package/dist/{test-prefix-VVODGHXP.js → test-prefix-HMTZSS67.js} +3 -3
  90. package/dist/{test-webserver-AHXKC6H4.js → test-webserver-ZN73CM2T.js} +5 -5
  91. package/dist/{vscode-OY7HOVRO.js → vscode-ABQ5ZSH7.js} +5 -5
  92. package/package.json +1 -1
  93. package/dist/chunk-55NTREIU.js.map +0 -1
  94. package/dist/chunk-7TN5VW4I.js.map +0 -1
  95. package/dist/chunk-F5NKWLMQ.js.map +0 -1
  96. package/dist/chunk-G2DGDCDP.js.map +0 -1
  97. package/dist/chunk-MRPIDNZU.js.map +0 -1
  98. package/dist/chunk-N6DY47YN.js.map +0 -1
  99. package/dist/chunk-QNRXRSKC.js.map +0 -1
  100. package/dist/chunk-UXBVDD7U.js.map +0 -1
  101. package/dist/dev-server-67NPVWUN.js.map +0 -1
  102. package/dist/init-7SDJUAEZ.js.map +0 -1
  103. package/dist/open-WUTLRI6S.js.map +0 -1
  104. package/dist/run-3YL2IXXI.js.map +0 -1
  105. /package/dist/{ClaudeContextManager-ZH6LEA5I.js.map → ClaudeContextManager-KJ4VEA2F.js.map} +0 -0
  106. /package/dist/{ClaudeService-YR66WXZN.js.map → ClaudeService-WTJO4UW6.js.map} +0 -0
  107. /package/dist/{IssueTrackerFactory-O2ZBA666.js.map → IssueTrackerFactory-UEJALI4X.js.map} +0 -0
  108. /package/dist/{LoomLauncher-V54ENBEF.js.map → LoomLauncher-KG2VBNQA.js.map} +0 -0
  109. /package/dist/{PromptTemplateManager-4RFELNYY.js.map → PromptTemplateManager-QIUVJP6S.js.map} +0 -0
  110. /package/dist/{SettingsManager-SLSYEYDZ.js.map → SettingsManager-PVHBSCMI.js.map} +0 -0
  111. /package/dist/{build-ZTGWDHWU.js.map → build-2FXDYEZQ.js.map} +0 -0
  112. /package/dist/{chunk-LNY2Y32V.js.map → chunk-2WRD6Y5E.js.map} +0 -0
  113. /package/dist/{chunk-WYDLOQYO.js.map → chunk-32D4CWWH.js.map} +0 -0
  114. /package/dist/{chunk-KGOBNC5A.js.map → chunk-5W44AI63.js.map} +0 -0
  115. /package/dist/{chunk-PPQ5LV7U.js.map → chunk-D6FU4DLN.js.map} +0 -0
  116. /package/dist/{chunk-PS6K2AOV.js.map → chunk-DMNI225H.js.map} +0 -0
  117. /package/dist/{chunk-T4KFKKEB.js.map → chunk-H4TSDALC.js.map} +0 -0
  118. /package/dist/{chunk-J5JOJPK3.js.map → chunk-L3P3YJCE.js.map} +0 -0
  119. /package/dist/{chunk-HWDQRW3O.js.map → chunk-OHX3PSAY.js.map} +0 -0
  120. /package/dist/{chunk-C2BVNJW5.js.map → chunk-OIJNBFMP.js.map} +0 -0
  121. /package/dist/{chunk-TJDKGKQV.js.map → chunk-OMV47LLA.js.map} +0 -0
  122. /package/dist/{chunk-KCAWSZUO.js.map → chunk-R2EFSRKR.js.map} +0 -0
  123. /package/dist/{chunk-T4NESGYB.js.map → chunk-UMAOVKQX.js.map} +0 -0
  124. /package/dist/{chunk-E5OM25WK.js.map → chunk-UQWMPQ2Q.js.map} +0 -0
  125. /package/dist/{chunk-ZEFTWM5Z.js.map → chunk-VUIPDX3T.js.map} +0 -0
  126. /package/dist/{chunk-GQDVH6FA.js.map → chunk-XC5JKRSH.js.map} +0 -0
  127. /package/dist/{chunk-ERMEYFT6.js.map → chunk-YVNG35OW.js.map} +0 -0
  128. /package/dist/{chunk-GPBX2BY2.js.map → chunk-ZWXJ7G2C.js.map} +0 -0
  129. /package/dist/{cleanup-BCVY7PEF.js.map → cleanup-I62RA5TZ.js.map} +0 -0
  130. /package/dist/{commit-L5JNBU4U.js.map → commit-7RI2JFFW.js.map} +0 -0
  131. /package/dist/{compile-GPJOHXH4.js.map → compile-NWTMKAGL.js.map} +0 -0
  132. /package/dist/{contribute-QEGCI4PS.js.map → contribute-QWPOT4QR.js.map} +0 -0
  133. /package/dist/{feedback-2LWXKLQZ.js.map → feedback-G63MODT2.js.map} +0 -0
  134. /package/dist/{git-IS7AV3ED.js.map → git-ZTMT6OAI.js.map} +0 -0
  135. /package/dist/{ignite-VQDJQ37S.js.map → ignite-GUYKYC5G.js.map} +0 -0
  136. /package/dist/{install-deps-NGSFDNUW.js.map → install-deps-XS2UUCUS.js.map} +0 -0
  137. /package/dist/{issues-4HQKEUP7.js.map → issues-2IT7PSNZ.js.map} +0 -0
  138. /package/dist/{lint-C5FOVRXY.js.map → lint-DKWJHET3.js.map} +0 -0
  139. /package/dist/{plan-GC3HF73T.js.map → plan-NJVQBBT3.js.map} +0 -0
  140. /package/dist/{rebase-CSGQICAP.js.map → rebase-6AXN45AE.js.map} +0 -0
  141. /package/dist/{recap-CKGKFDJL.js.map → recap-XDKI3MTA.js.map} +0 -0
  142. /package/dist/{shell-M2YYPNGV.js.map → shell-XOILFEZW.js.map} +0 -0
  143. /package/dist/{test-ESDAHEVE.js.map → test-6T2UMQ7T.js.map} +0 -0
  144. /package/dist/{test-git-KWPLHYSI.js.map → test-git-CQ65OL45.js.map} +0 -0
  145. /package/dist/{test-jira-6NK7UHSV.js.map → test-jira-CQQHGZ3S.js.map} +0 -0
  146. /package/dist/{test-prefix-VVODGHXP.js.map → test-prefix-HMTZSS67.js.map} +0 -0
  147. /package/dist/{test-webserver-AHXKC6H4.js.map → test-webserver-ZN73CM2T.js.map} +0 -0
  148. /package/dist/{vscode-OY7HOVRO.js.map → vscode-ABQ5ZSH7.js.map} +0 -0
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-AUYSAMXV.js";
5
5
  import {
6
6
  ShellCompletion
7
- } from "./chunk-TJDKGKQV.js";
7
+ } from "./chunk-OMV47LLA.js";
8
8
  import {
9
9
  TelemetryService
10
10
  } from "./chunk-MY2Q3FJ3.js";
@@ -13,11 +13,11 @@ import {
13
13
  } from "./chunk-EGNUOALL.js";
14
14
  import {
15
15
  AgentManager
16
- } from "./chunk-QNRXRSKC.js";
17
- import "./chunk-PPQ5LV7U.js";
16
+ } from "./chunk-RP6MHV24.js";
17
+ import "./chunk-D6FU4DLN.js";
18
18
  import {
19
19
  PromptTemplateManager
20
- } from "./chunk-MRPIDNZU.js";
20
+ } from "./chunk-LDE6VNG5.js";
21
21
  import "./chunk-NPVA65KS.js";
22
22
  import {
23
23
  parseGitRemotes
@@ -29,8 +29,8 @@ import {
29
29
  import {
30
30
  getRepoRoot,
31
31
  isFileGitignored
32
- } from "./chunk-KGOBNC5A.js";
33
- import "./chunk-F5NKWLMQ.js";
32
+ } from "./chunk-5W44AI63.js";
33
+ import "./chunk-MNPKEWBQ.js";
34
34
  import "./chunk-XIVLGWUX.js";
35
35
  import "./chunk-FTYWGQFM.js";
36
36
  import {
@@ -326,6 +326,7 @@ var InitCommand = class {
326
326
  const packageJsonPath = path.join(process.cwd(), "package.json");
327
327
  const hasPackageJson = existsSync(packageJsonPath);
328
328
  logger.debug("Package.json detection", { packageJsonPath, hasPackageJson });
329
+ const isVscodeMode = process.env.ILOOM_VSCODE === "1";
329
330
  const variables = {
330
331
  SETTINGS_SCHEMA: schemaContent,
331
332
  SETTINGS_GLOBAL_JSON: settingsGlobalJson,
@@ -342,6 +343,7 @@ var InitCommand = class {
342
343
  NO_REMOTES: noRemotes.toString(),
343
344
  README_CONTENT: readmeContent,
344
345
  VSCODE_SETTINGS_GITIGNORED: vscodeSettingsGitignored.toString(),
346
+ IS_VSCODE_MODE: isVscodeMode,
345
347
  // Multi-language support - mutually exclusive booleans
346
348
  HAS_PACKAGE_JSON: hasPackageJson,
347
349
  NO_PACKAGE_JSON: !hasPackageJson
@@ -461,4 +463,4 @@ var InitCommand = class {
461
463
  export {
462
464
  InitCommand
463
465
  };
464
- //# sourceMappingURL=init-7SDJUAEZ.js.map
466
+ //# sourceMappingURL=init-AMLCFVXG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { logger } from '../utils/logger.js'\nimport { ShellCompletion } from '../lib/ShellCompletion.js'\nimport chalk from 'chalk'\nimport { mkdir, readFile } from 'fs/promises'\nimport { existsSync } from 'fs'\nimport path from 'path'\nimport os from 'os'\nimport { detectClaudeCli, launchClaude } from '../utils/claude.js'\nimport { PromptTemplateManager } from '../lib/PromptTemplateManager.js'\nimport { AgentManager } from '../lib/AgentManager.js'\nimport { fileURLToPath } from 'url'\nimport { GitRemote, parseGitRemotes } from '../utils/remote.js'\nimport { SettingsMigrationManager } from '../lib/SettingsMigrationManager.js'\nimport { getRepoRoot, isFileGitignored } from '../utils/git.js'\nimport { FirstRunManager } from '../utils/FirstRunManager.js'\nimport { TelemetryService } from '../lib/TelemetryService.js'\n\n/**\n * Initialize iloom configuration\n * Implements the `il init` command requested in issue #94\n */\nexport class InitCommand {\n private readonly shellCompletion: ShellCompletion\n private readonly templateManager: PromptTemplateManager\n private readonly agentManager: AgentManager\n\n constructor(\n shellCompletion?: ShellCompletion,\n templateManager?: PromptTemplateManager,\n agentManager?: AgentManager\n ) {\n this.shellCompletion = shellCompletion ?? new ShellCompletion()\n this.templateManager = templateManager ?? new PromptTemplateManager()\n this.agentManager = agentManager ?? new AgentManager()\n }\n\n /**\n * Main entry point for the init command\n * @param customInitialMessage Optional custom initial message to send to Claude (defaults to \"Help me configure iloom settings.\")\n * @param acceptDefaults If true, skip interactive prompts and mark project as configured with defaults\n */\n public async execute(customInitialMessage?: string, acceptDefaults?: boolean): Promise<void> {\n try {\n logger.debug('InitCommand.execute() starting', {\n cwd: process.cwd(),\n nodeVersion: process.version,\n hasCustomInitialMessage: !!customInitialMessage,\n acceptDefaults: !!acceptDefaults\n })\n\n logger.info(chalk.bold('Welcome to iloom setup'))\n\n // Setup project configuration\n logger.info(chalk.bold('Verifying current setup...'))\n\n await this.setupProjectConfiguration()\n\n // Determine mode for telemetry\n const mode = acceptDefaults ? 'accept-defaults' as const : customInitialMessage ? 'guided-custom-prompt' as const : 'guided' as const\n\n try {\n TelemetryService.getInstance().track('init.started', { mode })\n } catch (e) {\n logger.debug('Telemetry tracking failed', { error: e })\n }\n\n // If accept-defaults mode, mark project as configured and return early\n if (acceptDefaults) {\n await this.markProjectConfigured()\n try {\n TelemetryService.getInstance().track('init.completed', { mode })\n } catch (e) {\n logger.debug('Telemetry tracking failed', { error: e })\n }\n logger.info(chalk.green('Setup complete! Enjoy using iloom CLI.'))\n return\n }\n\n // Launch guided Claude configuration if available\n const guidedInitSucceeded = await this.launchGuidedInit(customInitialMessage)\n\n // Only mark project as configured if guided init succeeded and not already marked\n // This enables VSCode extension detection and ensures project appears in `il projects` list\n if (guidedInitSucceeded) {\n const alreadyConfigured = await this.isProjectConfigured()\n if (!alreadyConfigured) {\n await this.markProjectConfigured()\n } else {\n logger.debug('Project already marked as configured, skipping')\n }\n } else {\n logger.debug('Skipping project marker - guided init did not complete successfully')\n }\n\n logger.info(chalk.green('Setup complete! Enjoy using iloom CLI.'))\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Initialization failed: ${message}`)\n throw error\n }\n }\n\n /**\n * Setup project configuration files\n * Ensures .iloom directory exists and runs legacy migrations\n */\n private async setupProjectConfiguration(): Promise<void> {\n logger.debug('setupProjectConfiguration() starting')\n\n // Migrate legacy .hatchbox settings to .iloom (BEFORE creating new files)\n try {\n logger.debug('Loading SettingsMigrationManager for legacy migration')\n const migrationManager = new SettingsMigrationManager()\n logger.debug('Running settings migration check')\n await migrationManager.migrateSettingsIfNeeded()\n logger.debug('Settings migration check completed')\n } catch (error) {\n // Log warning but don't fail\n logger.warn(`Settings migration failed: ${error instanceof Error ? error.message : 'Unknown'}`)\n logger.debug('Settings migration error details', { error })\n }\n\n // Ensure .iloom directory exists\n const iloomDir = path.join(process.cwd(), '.iloom')\n logger.debug('Creating .iloom directory', { iloomDir })\n await mkdir(iloomDir, { recursive: true })\n logger.debug('.iloom directory created/verified')\n logger.debug('setupProjectConfiguration() completed')\n }\n\n /**\n * Launch interactive Claude-guided configuration\n * @param customInitialMessage Optional custom initial message to send to Claude\n * @returns true if Claude session completed successfully, false otherwise\n */\n private async launchGuidedInit(customInitialMessage?: string): Promise<boolean> {\n logger.debug('launchGuidedInit() starting', { hasCustomInitialMessage: !!customInitialMessage })\n logger.info(chalk.bold('Starting interactive Claude-guided configuration...'))\n\n // Check if Claude CLI is available\n logger.debug('Checking Claude CLI availability')\n const claudeAvailable = await detectClaudeCli()\n logger.debug('Claude CLI availability check result', { claudeAvailable })\n\n if (!claudeAvailable) {\n logger.warn('Claude Code not detected. Skipping guided configuration.')\n logger.info('iloom won\\'t be able to help you much without Claude Code, so please install it: npm install -g @anthropic-ai/claude-code')\n logger.debug('Exiting launchGuidedInit() due to missing Claude CLI')\n return false\n }\n\n try {\n // Load schema from dist/schema/settings.schema.json\n // Use similar approach to PromptTemplateManager for path resolution\n const __filename = fileURLToPath(import.meta.url)\n const __dirname = path.dirname(__filename)\n\n // Walk up to find the schema directory (in case of chunked files)\n let schemaPath = path.join(__dirname, 'schema', 'settings.schema.json')\n\n logger.debug('Loading settings schema', {\n __filename,\n __dirname,\n schemaPath,\n schemaExists: existsSync(schemaPath)\n })\n\n let schemaContent = ''\n if (existsSync(schemaPath)) {\n logger.debug('Reading schema file')\n schemaContent = await readFile(schemaPath, 'utf-8')\n logger.debug('Schema file loaded', {\n contentLength: schemaContent.length,\n isValidJson: ((): boolean => {\n try {\n JSON.parse(schemaContent)\n return true\n } catch {\n return false\n }\n })()\n })\n } else {\n logger.warn('Schema file not found - Claude will work without schema validation')\n logger.debug('Schema file not found at expected path', { schemaPath })\n }\n\n // Check for existing settings - read ALL three files if they exist (global, project, local)\n const settingsGlobalPath = path.join(os.homedir(), '.config', 'iloom-ai', 'settings.json')\n const settingsLocalPath = path.join(process.cwd(), '.iloom', 'settings.local.json')\n const settingsCommittedPath = path.join(process.cwd(), '.iloom', 'settings.json')\n\n let settingsGlobalJson = ''\n let settingsJson = ''\n let settingsLocalJson = ''\n\n logger.debug('Checking for settings files', {\n settingsGlobalPath,\n settingsLocalPath,\n settingsCommittedPath,\n globalExists: existsSync(settingsGlobalPath),\n localExists: existsSync(settingsLocalPath),\n committedExists: existsSync(settingsCommittedPath)\n })\n\n // Read global settings.json if it exists\n if (existsSync(settingsGlobalPath)) {\n logger.debug('Reading global settings.json')\n const content = await readFile(settingsGlobalPath, 'utf-8')\n const trimmed = content.trim()\n if (trimmed !== '{}' && trimmed !== '') {\n settingsGlobalJson = content\n logger.debug('global settings.json loaded', {\n contentLength: content.length,\n isValidJson: ((): boolean => {\n try {\n JSON.parse(content)\n return true\n } catch {\n return false\n }\n })()\n })\n } else {\n logger.debug('global settings.json is empty, skipping')\n }\n } else {\n logger.debug('global settings.json does not exist')\n }\n\n // Read settings.json if it exists\n if (existsSync(settingsCommittedPath)) {\n logger.debug('Reading settings.json')\n const content = await readFile(settingsCommittedPath, 'utf-8')\n const trimmed = content.trim()\n if (trimmed !== '{}' && trimmed !== '') {\n settingsJson = content\n logger.debug('settings.json loaded', {\n contentLength: content.length,\n isValidJson: ((): boolean => {\n try {\n JSON.parse(content)\n return true\n } catch {\n return false\n }\n })()\n })\n } else {\n logger.debug('settings.json is empty, skipping')\n }\n } else {\n logger.debug('settings.json does not exist')\n }\n\n // Read settings.local.json if it exists\n if (existsSync(settingsLocalPath)) {\n logger.debug('Reading settings.local.json')\n const content = await readFile(settingsLocalPath, 'utf-8')\n const trimmed = content.trim()\n if (trimmed !== '{}' && trimmed !== '') {\n settingsLocalJson = content\n logger.debug('settings.local.json loaded', {\n contentLength: content.length,\n isValidJson: ((): boolean => {\n try {\n JSON.parse(content)\n return true\n } catch {\n return false\n }\n })()\n })\n } else {\n logger.debug('settings.local.json is empty, skipping')\n }\n } else {\n logger.debug('settings.local.json does not exist')\n }\n\n // Log summary\n logger.debug('Settings files summary', {\n hasSettingsGlobalJson: !!settingsGlobalJson,\n hasSettingsJson: !!settingsJson,\n hasSettingsLocalJson: !!settingsLocalJson,\n settingsGlobalJsonLength: settingsGlobalJson.length,\n settingsJsonLength: settingsJson.length,\n settingsLocalJsonLength: settingsLocalJson.length\n })\n\n // Detect shell and read config\n logger.debug('Detecting user shell')\n const shell = this.shellCompletion.detectShell()\n logger.debug('Shell detection result', { shell })\n\n let shellConfigPath = ''\n let shellConfigContent = ''\n\n if (shell !== 'unknown') {\n logger.debug('Grepping shell config for completion setup')\n const shellConfig = await this.shellCompletion.grepCompletionConfig(shell)\n if (shellConfig) {\n shellConfigPath = shellConfig.path\n shellConfigContent = shellConfig.content\n logger.debug('Shell config completion grep completed', {\n path: shellConfigPath,\n contentLength: shellConfigContent.length,\n configExists: existsSync(shellConfigPath),\n hasMatches: shellConfigContent.trim().length > 0\n })\n } else {\n logger.debug('Could not read shell config')\n }\n } else {\n logger.debug('Unknown shell detected, skipping config read')\n }\n\n let remotes: GitRemote[] = []\n try {\n // Detect git remotes for GitHub configuration\n logger.debug('Detecting git remotes for GitHub configuration')\n remotes = await parseGitRemotes()\n logger.debug('Git remotes detected', { count: remotes.length, remotes })\n } catch (error) {\n const message = error instanceof Error ? error.stack : 'Unknown error'\n logger.debug(\"Error occured while getting remote info: \", message)\n }\n\n // Detect if .vscode/settings.json is gitignored\n let vscodeSettingsGitignored = false\n try {\n vscodeSettingsGitignored = await isFileGitignored('.vscode/settings.json')\n logger.debug('VSCode settings gitignore status', { vscodeSettingsGitignored })\n } catch (error) {\n logger.debug('Could not detect gitignore status for .vscode/settings.json', { error })\n }\n\n let remotesInfo = ''\n let multipleRemotes = false\n let singleRemote = false\n let singleRemoteName = ''\n let singleRemoteUrl = ''\n let noRemotes = false\n\n if (remotes.length === 0) {\n noRemotes = true\n remotesInfo = 'No git remotes detected in this repository.'\n } else if (remotes.length === 1 && remotes[0]) {\n singleRemote = true\n singleRemoteName = remotes[0].name\n singleRemoteUrl = remotes[0].url\n remotesInfo = `Detected Remote:\\n- **${remotes[0].name}**: ${remotes[0].url} (${remotes[0].owner}/${remotes[0].repo})`\n } else {\n multipleRemotes = true\n remotesInfo = `Detected Remotes (${remotes.length}):\\n` +\n remotes.map(r => `- **${r.name}**: ${r.url} (${r.owner}/${r.repo})`).join('\\n')\n }\n\n // Load README content for comprehensive documentation\n logger.debug('README content loading...')\n const readmeContent = await this.loadReadmeContent()\n logger.debug('README content loaded', {\n readmeContentLength: readmeContent.length,\n })\n\n // Detect if project has package.json for multi-language support\n const packageJsonPath = path.join(process.cwd(), 'package.json')\n const hasPackageJson = existsSync(packageJsonPath)\n logger.debug('Package.json detection', { packageJsonPath, hasPackageJson })\n\n // Detect VS Code mode\n const isVscodeMode = process.env.ILOOM_VSCODE === '1'\n\n // Build template variables\n const variables = {\n SETTINGS_SCHEMA: schemaContent,\n SETTINGS_GLOBAL_JSON: settingsGlobalJson,\n SETTINGS_JSON: settingsJson,\n SETTINGS_LOCAL_JSON: settingsLocalJson,\n SHELL_TYPE: shell,\n SHELL_CONFIG_PATH: shellConfigPath,\n SHELL_CONFIG_CONTENT: shellConfigContent,\n REMOTES_INFO: remotesInfo,\n MULTIPLE_REMOTES: multipleRemotes.toString(),\n SINGLE_REMOTE: singleRemote.toString(),\n SINGLE_REMOTE_NAME: singleRemoteName,\n SINGLE_REMOTE_URL: singleRemoteUrl,\n NO_REMOTES: noRemotes.toString(),\n README_CONTENT: readmeContent,\n VSCODE_SETTINGS_GITIGNORED: vscodeSettingsGitignored.toString(),\n IS_VSCODE_MODE: isVscodeMode,\n // Multi-language support - mutually exclusive booleans\n HAS_PACKAGE_JSON: hasPackageJson,\n NO_PACKAGE_JSON: !hasPackageJson,\n }\n\n logger.debug('Building template variables', {\n variableKeys: Object.keys(variables),\n schemaContentLength: schemaContent.length,\n settingsGlobalJsonLength: settingsGlobalJson.length,\n settingsJsonLength: settingsJson.length,\n settingsLocalJsonLength: settingsLocalJson.length\n })\n\n // Get init prompt\n logger.debug('Loading init prompt template')\n const prompt = await this.templateManager.getPrompt('init', variables)\n\n logger.debug('Init prompt loaded', {\n promptLength: prompt.length,\n containsSchema: prompt.includes('SETTINGS_SCHEMA'),\n containsExistingSettings: prompt.includes('EXISTING_SETTINGS')\n })\n\n // Load framework-detector agent for non-Node.js project setup\n let agents: Record<string, unknown> | undefined\n try {\n const loadedAgents = await this.agentManager.loadAgents(\n undefined, // No settings overrides for init\n variables,\n ['iloom-framework-detector.md']\n )\n agents = this.agentManager.formatForCli(loadedAgents)\n logger.debug('Loaded framework-detector agent for init', {\n agentCount: Object.keys(agents).length,\n agentNames: Object.keys(agents),\n })\n } catch (error) {\n // Log warning but continue without agents\n logger.warn(`Failed to load agents: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n\n // Pre-approved tools for init workflow to reduce permission prompts\n const initAllowedTools = [\n 'Bash(git rev-parse:*)',\n 'Bash(git init:*)',\n 'Bash(git status:*)',\n 'Bash(git add:*)',\n 'Bash(git commit:*)',\n 'Read',\n 'Write',\n 'Edit',\n ]\n\n const claudeOptions = {\n model: 'sonnet',\n headless: false,\n appendSystemPrompt: prompt,\n addDir: process.cwd(),\n allowedTools: initAllowedTools,\n ...(agents && { agents }),\n }\n\n logger.debug('Launching Claude with options', {\n optionKeys: Object.keys(claudeOptions),\n headless: claudeOptions.headless,\n hasSystemPrompt: !!claudeOptions.appendSystemPrompt,\n addDir: claudeOptions.addDir,\n promptLength: prompt.length,\n hasCustomInitialMessage: !!customInitialMessage,\n hasAgents: !!agents,\n })\n\n // Launch Claude in interactive mode with custom initial message if provided\n const initialMessage = customInitialMessage ?? 'Help me configure iloom settings.'\n await launchClaude(initialMessage, claudeOptions)\n logger.debug('Claude session completed successfully')\n return true\n\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n logger.warn(`Guided configuration failed: ${message}`)\n logger.debug('launchGuidedInit() error details', error instanceof Error ? error.stack : {error})\n logger.info('You can manually edit .iloom/settings.json to configure iloom.')\n return false\n }\n }\n\n /**\n * Check if the project is already marked as configured.\n */\n private async isProjectConfigured(): Promise<boolean> {\n const projectRoot = await getRepoRoot() ?? process.cwd()\n const firstRunManager = new FirstRunManager()\n return firstRunManager.isProjectConfigured(projectRoot)\n }\n\n /**\n * Mark the project as configured.\n * Used by both accept-defaults mode and after guided init succeeds.\n */\n private async markProjectConfigured(): Promise<void> {\n const projectRoot = await getRepoRoot() ?? process.cwd()\n const firstRunManager = new FirstRunManager()\n await firstRunManager.markProjectAsConfigured(projectRoot)\n logger.debug('Project marked as configured', { projectRoot })\n }\n\n /**\n * Load README.md content for init prompt\n * Walks up from dist directory to find README.md in project root\n */\n private async loadReadmeContent(): Promise<string> {\n try {\n // Walk up from current file location to find README.md\n // Use same pattern as PromptTemplateManager for finding files\n let currentDir = path.dirname(fileURLToPath(import.meta.url))\n\n // Walk up to find README.md\n while (currentDir !== path.dirname(currentDir)) {\n const readmePath = path.join(currentDir, 'README.md')\n try {\n const content = await readFile(readmePath, 'utf-8')\n logger.debug('Loaded README.md for init prompt', { readmePath })\n return content\n } catch {\n currentDir = path.dirname(currentDir)\n }\n }\n\n logger.debug('README.md not found, returning empty string')\n return ''\n } catch (error) {\n // Graceful degradation - return empty string on error\n logger.debug(`Failed to load README.md: ${error}`)\n return ''\n }\n }\n\n}\n"],"mappings":"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","names":[]}
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ScriptCommandBase
4
- } from "./chunk-PS6K2AOV.js";
5
- import "./chunk-GQDVH6FA.js";
4
+ } from "./chunk-DMNI225H.js";
5
+ import "./chunk-XC5JKRSH.js";
6
6
  import {
7
7
  installDependencies
8
8
  } from "./chunk-OLJ54WGW.js";
9
- import "./chunk-PPQ5LV7U.js";
9
+ import "./chunk-D6FU4DLN.js";
10
10
  import "./chunk-K3QGG4O2.js";
11
- import "./chunk-KGOBNC5A.js";
12
- import "./chunk-F5NKWLMQ.js";
11
+ import "./chunk-5W44AI63.js";
12
+ import "./chunk-MNPKEWBQ.js";
13
13
  import "./chunk-XIVLGWUX.js";
14
14
  import "./chunk-FTYWGQFM.js";
15
15
  import {
@@ -40,4 +40,4 @@ var InstallDepsCommand = class extends ScriptCommandBase {
40
40
  export {
41
41
  InstallDepsCommand
42
42
  };
43
- //# sourceMappingURL=install-deps-NGSFDNUW.js.map
43
+ //# sourceMappingURL=install-deps-XS2UUCUS.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-4232AHNQ.js";
5
5
  import {
6
6
  IssueTrackerFactory
7
- } from "./chunk-GPBX2BY2.js";
7
+ } from "./chunk-ZWXJ7G2C.js";
8
8
  import {
9
9
  JiraIssueTracker,
10
10
  fetchLinearIssueList
@@ -17,10 +17,10 @@ import {
17
17
  import "./chunk-NPVA65KS.js";
18
18
  import {
19
19
  findMainWorktreePathWithSettings
20
- } from "./chunk-KGOBNC5A.js";
20
+ } from "./chunk-5W44AI63.js";
21
21
  import {
22
22
  SettingsManager
23
- } from "./chunk-F5NKWLMQ.js";
23
+ } from "./chunk-MNPKEWBQ.js";
24
24
  import "./chunk-XIVLGWUX.js";
25
25
  import {
26
26
  getLogger
@@ -189,4 +189,4 @@ var IssuesCommand = class {
189
189
  export {
190
190
  IssuesCommand
191
191
  };
192
- //# sourceMappingURL=issues-4HQKEUP7.js.map
192
+ //# sourceMappingURL=issues-2IT7PSNZ.js.map
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ScriptCommandBase
4
- } from "./chunk-PS6K2AOV.js";
5
- import "./chunk-GQDVH6FA.js";
4
+ } from "./chunk-DMNI225H.js";
5
+ import "./chunk-XC5JKRSH.js";
6
6
  import "./chunk-OLJ54WGW.js";
7
- import "./chunk-PPQ5LV7U.js";
7
+ import "./chunk-D6FU4DLN.js";
8
8
  import "./chunk-K3QGG4O2.js";
9
- import "./chunk-KGOBNC5A.js";
10
- import "./chunk-F5NKWLMQ.js";
9
+ import "./chunk-5W44AI63.js";
10
+ import "./chunk-MNPKEWBQ.js";
11
11
  import "./chunk-XIVLGWUX.js";
12
12
  import "./chunk-FTYWGQFM.js";
13
13
  import "./chunk-VRPPI6GU.js";
@@ -24,4 +24,4 @@ var LintCommand = class extends ScriptCommandBase {
24
24
  export {
25
25
  LintCommand
26
26
  };
27
- //# sourceMappingURL=lint-C5FOVRXY.js.map
27
+ //# sourceMappingURL=lint-DKWJHET3.js.map
@@ -2822,7 +2822,8 @@ var CapabilitiesSettingsSchema = z.object({
2822
2822
  containerPort: z.number().min(1, "Container port must be >= 1").max(65535, "Container port must be <= 65535").optional().describe("Port the app runs on inside the Docker container (auto-detected from EXPOSE directive if not set)"),
2823
2823
  dockerBuildArgs: z.record(z.string()).optional().describe('Build arguments to pass to docker build (e.g., {"NODE_ENV": "development"})'),
2824
2824
  dockerBuildSecrets: z.record(z.string()).optional().describe('Secret files to mount during docker build via --secret (e.g., {"npmrc": "~/.npmrc"}). Keys are secret IDs, values are source file paths.'),
2825
- dockerRunArgs: z.array(z.string()).optional().describe('Additional arguments for docker run (e.g., ["-v", "./src:/app/src"] for volume mounts)')
2825
+ dockerRunArgs: z.array(z.string()).optional().describe('Additional arguments for docker run (e.g., ["-v", "./src:/app/src"] for volume mounts)'),
2826
+ dockerRunEnv: z.record(z.string()).optional().describe('Environment variables to pass to docker run (e.g., {"NODE_ENV": "development", "DEBUG": "true"})')
2826
2827
  }).optional().describe('Web dev server settings. To declare a project as a web project, add "web" to the capabilities array in .iloom/package.iloom.json or .iloom/package.iloom.local.json.'),
2827
2828
  database: z.object({
2828
2829
  databaseUrlEnvVarName: z.string().min(1, "Database URL variable name cannot be empty").regex(/^[A-Z_][A-Z0-9_]*$/, "Must be valid env var name (uppercase, underscores)").optional().default("DATABASE_URL").describe("Name of environment variable for database connection URL")
@@ -2837,7 +2838,8 @@ var CapabilitiesSettingsSchemaNoDefaults = z.object({
2837
2838
  containerPort: z.number().min(1, "Container port must be >= 1").max(65535, "Container port must be <= 65535").optional().describe("Port the app runs on inside the Docker container (auto-detected from EXPOSE directive if not set)"),
2838
2839
  dockerBuildArgs: z.record(z.string()).optional().describe('Build arguments to pass to docker build (e.g., {"NODE_ENV": "development"})'),
2839
2840
  dockerBuildSecrets: z.record(z.string()).optional().describe('Secret files to mount during docker build via --secret (e.g., {"npmrc": "~/.npmrc"}). Keys are secret IDs, values are source file paths.'),
2840
- dockerRunArgs: z.array(z.string()).optional().describe('Additional arguments for docker run (e.g., ["-v", "./src:/app/src"] for volume mounts)')
2841
+ dockerRunArgs: z.array(z.string()).optional().describe('Additional arguments for docker run (e.g., ["-v", "./src:/app/src"] for volume mounts)'),
2842
+ dockerRunEnv: z.record(z.string()).optional().describe('Environment variables to pass to docker run (e.g., {"NODE_ENV": "development", "DEBUG": "true"})')
2841
2843
  }).optional().describe('Web dev server settings. To declare a project as a web project, add "web" to the capabilities array in .iloom/package.iloom.json or .iloom/package.iloom.local.json.'),
2842
2844
  database: z.object({
2843
2845
  databaseUrlEnvVarName: z.string().min(1, "Database URL variable name cannot be empty").regex(/^[A-Z_][A-Z0-9_]*$/, "Must be valid env var name (uppercase, underscores)").optional().describe("Name of environment variable for database connection URL")
@@ -2859,7 +2861,8 @@ var DevServerSettingsSchema = z.object({
2859
2861
  ).describe("Path to Dockerfile relative to worktree root"),
2860
2862
  containerPort: z.number().min(1, "Container port must be >= 1").max(65535, "Container port must be <= 65535").optional().describe("Port the app runs on inside the Docker container (auto-detected from EXPOSE directive if not set)"),
2861
2863
  buildArgs: z.record(z.string(), z.string()).optional().describe("Build arguments to pass to docker build"),
2862
- runArgs: z.array(z.string()).optional().describe("Additional arguments for docker run")
2864
+ runArgs: z.array(z.string()).optional().describe("Additional arguments for docker run"),
2865
+ runEnv: z.record(z.string(), z.string()).optional().describe("Environment variables to pass to docker run")
2863
2866
  }).optional()
2864
2867
  });
2865
2868
  var DevServerSettingsSchemaNoDefaults = z.object({
@@ -2879,7 +2882,8 @@ var DevServerSettingsSchemaNoDefaults = z.object({
2879
2882
  ).describe("Path to Dockerfile relative to worktree root"),
2880
2883
  containerPort: z.number().min(1, "Container port must be >= 1").max(65535, "Container port must be <= 65535").optional().describe("Port the app runs on inside the Docker container (auto-detected from EXPOSE directive if not set)"),
2881
2884
  buildArgs: z.record(z.string(), z.string()).optional().describe("Build arguments to pass to docker build"),
2882
- runArgs: z.array(z.string()).optional().describe("Additional arguments for docker run")
2885
+ runArgs: z.array(z.string()).optional().describe("Additional arguments for docker run"),
2886
+ runEnv: z.record(z.string(), z.string()).optional().describe("Environment variables to pass to docker run")
2883
2887
  }).optional()
2884
2888
  });
2885
2889
  var NeonSettingsSchema = z.object({