@iloom/cli 0.8.1 → 0.8.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 (51) hide show
  1. package/README.md +3 -0
  2. package/dist/{PRManager-H4TUZTZL.js → PRManager-A63LT3NF.js} +3 -3
  3. package/dist/README.md +3 -0
  4. package/dist/{build-H4DK3DMQ.js → build-Z3WCIKPD.js} +3 -3
  5. package/dist/{chunk-A4UQY3M2.js → chunk-3FC3VNEX.js} +2 -2
  6. package/dist/{chunk-EQOFNPEY.js → chunk-44Y5IF7P.js} +4 -4
  7. package/dist/{chunk-ECP77QGE.js → chunk-A7XHHUEV.js} +4 -4
  8. package/dist/{chunk-RODL2HVY.js → chunk-FPNSFP6K.js} +6 -6
  9. package/dist/{chunk-NR64HNF7.js → chunk-GWONJE3X.js} +6 -6
  10. package/dist/{chunk-BCQDYAOJ.js → chunk-O6LECMT6.js} +4 -4
  11. package/dist/{cleanup-OGE7V7AD.js → cleanup-NWNKWPUY.js} +3 -3
  12. package/dist/cli.js +55 -37
  13. package/dist/cli.js.map +1 -1
  14. package/dist/{compile-ZOAODFN2.js → compile-UANHMNTS.js} +3 -3
  15. package/dist/{dev-server-TYYJM3XA.js → dev-server-TO7RLYJI.js} +5 -5
  16. package/dist/{feedback-HZVLOTQJ.js → feedback-7ZZI6RC5.js} +2 -2
  17. package/dist/{ignite-ZO7SGUKP.js → ignite-5SIGOW5V.js} +4 -4
  18. package/dist/{init-MZBIXQ7V.js → init-XXDIB2UJ.js} +4 -4
  19. package/dist/{lint-MDVUV3W2.js → lint-XPODLDVA.js} +3 -3
  20. package/dist/{open-2LPZ7XXW.js → open-M2SUR74Y.js} +5 -5
  21. package/dist/{plan-PIME6UNY.js → plan-FB4AOJ2Q.js} +6 -6
  22. package/dist/{rebase-7YS3N274.js → rebase-4FNRBW3H.js} +3 -3
  23. package/dist/{run-XPGCMFFO.js → run-GZNHRJB2.js} +5 -5
  24. package/dist/{summary-C5VVSJAJ.js → summary-Z4F7YFXE.js} +3 -3
  25. package/dist/{test-N2725YRI.js → test-LBSPYIJW.js} +3 -3
  26. package/dist/vscode-LH3VSQ2W.js +164 -0
  27. package/dist/vscode-LH3VSQ2W.js.map +1 -0
  28. package/dist/vscode-announcement-EQ2SKK3T.js +46 -0
  29. package/dist/vscode-announcement-EQ2SKK3T.js.map +1 -0
  30. package/package.json +2 -1
  31. /package/dist/{PRManager-H4TUZTZL.js.map → PRManager-A63LT3NF.js.map} +0 -0
  32. /package/dist/{build-H4DK3DMQ.js.map → build-Z3WCIKPD.js.map} +0 -0
  33. /package/dist/{chunk-A4UQY3M2.js.map → chunk-3FC3VNEX.js.map} +0 -0
  34. /package/dist/{chunk-EQOFNPEY.js.map → chunk-44Y5IF7P.js.map} +0 -0
  35. /package/dist/{chunk-ECP77QGE.js.map → chunk-A7XHHUEV.js.map} +0 -0
  36. /package/dist/{chunk-RODL2HVY.js.map → chunk-FPNSFP6K.js.map} +0 -0
  37. /package/dist/{chunk-NR64HNF7.js.map → chunk-GWONJE3X.js.map} +0 -0
  38. /package/dist/{chunk-BCQDYAOJ.js.map → chunk-O6LECMT6.js.map} +0 -0
  39. /package/dist/{cleanup-OGE7V7AD.js.map → cleanup-NWNKWPUY.js.map} +0 -0
  40. /package/dist/{compile-ZOAODFN2.js.map → compile-UANHMNTS.js.map} +0 -0
  41. /package/dist/{dev-server-TYYJM3XA.js.map → dev-server-TO7RLYJI.js.map} +0 -0
  42. /package/dist/{feedback-HZVLOTQJ.js.map → feedback-7ZZI6RC5.js.map} +0 -0
  43. /package/dist/{ignite-ZO7SGUKP.js.map → ignite-5SIGOW5V.js.map} +0 -0
  44. /package/dist/{init-MZBIXQ7V.js.map → init-XXDIB2UJ.js.map} +0 -0
  45. /package/dist/{lint-MDVUV3W2.js.map → lint-XPODLDVA.js.map} +0 -0
  46. /package/dist/{open-2LPZ7XXW.js.map → open-M2SUR74Y.js.map} +0 -0
  47. /package/dist/{plan-PIME6UNY.js.map → plan-FB4AOJ2Q.js.map} +0 -0
  48. /package/dist/{rebase-7YS3N274.js.map → rebase-4FNRBW3H.js.map} +0 -0
  49. /package/dist/{run-XPGCMFFO.js.map → run-GZNHRJB2.js.map} +0 -0
  50. /package/dist/{summary-C5VVSJAJ.js.map → summary-Z4F7YFXE.js.map} +0 -0
  51. /package/dist/{test-N2725YRI.js.map → test-LBSPYIJW.js.map} +0 -0
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ScriptCommandBase
4
- } from "./chunk-BCQDYAOJ.js";
5
- import "./chunk-TVH67KEO.js";
4
+ } from "./chunk-O6LECMT6.js";
6
5
  import {
7
6
  runScript
8
7
  } from "./chunk-RD7I2Q2F.js";
8
+ import "./chunk-TVH67KEO.js";
9
9
  import "./chunk-HSGZW3ID.js";
10
10
  import {
11
11
  getPackageScripts
@@ -54,4 +54,4 @@ var CompileCommand = class extends ScriptCommandBase {
54
54
  export {
55
55
  CompileCommand
56
56
  };
57
- //# sourceMappingURL=compile-ZOAODFN2.js.map
57
+ //# sourceMappingURL=compile-UANHMNTS.js.map
@@ -3,19 +3,19 @@ import {
3
3
  DevServerManager
4
4
  } from "./chunk-VZYSM7N7.js";
5
5
  import "./chunk-XHNACIHO.js";
6
+ import "./chunk-RD7I2Q2F.js";
6
7
  import {
7
8
  getWorkspacePort
8
9
  } from "./chunk-52MVUK5V.js";
9
10
  import {
10
11
  IdentifierParser
11
12
  } from "./chunk-TVH67KEO.js";
12
- import {
13
- ProjectCapabilityDetector
14
- } from "./chunk-7GLZVDPQ.js";
15
- import "./chunk-RD7I2Q2F.js";
16
13
  import {
17
14
  GitWorktreeManager
18
15
  } from "./chunk-HSGZW3ID.js";
16
+ import {
17
+ ProjectCapabilityDetector
18
+ } from "./chunk-7GLZVDPQ.js";
19
19
  import "./chunk-XPKN3QWY.js";
20
20
  import {
21
21
  extractSettingsOverrides
@@ -256,4 +256,4 @@ var DevServerCommand = class {
256
256
  export {
257
257
  DevServerCommand
258
258
  };
259
- //# sourceMappingURL=dev-server-TYYJM3XA.js.map
259
+ //# sourceMappingURL=dev-server-TO7RLYJI.js.map
@@ -7,10 +7,10 @@ import "./chunk-XJHQVOT6.js";
7
7
  import {
8
8
  ProjectCapabilityDetector
9
9
  } from "./chunk-7GLZVDPQ.js";
10
+ import "./chunk-XPKN3QWY.js";
10
11
  import {
11
12
  AgentManager
12
13
  } from "./chunk-4BSXZ5YZ.js";
13
- import "./chunk-XPKN3QWY.js";
14
14
  import "./chunk-YETJNRQM.js";
15
15
  import "./chunk-66QOCD5N.js";
16
16
  import {
@@ -165,4 +165,4 @@ ${userBody}`;
165
165
  export {
166
166
  FeedbackCommand
167
167
  };
168
- //# sourceMappingURL=feedback-HZVLOTQJ.js.map
168
+ //# sourceMappingURL=feedback-7ZZI6RC5.js.map
@@ -5,6 +5,9 @@ import {
5
5
  import {
6
6
  getWorkspacePort
7
7
  } from "./chunk-52MVUK5V.js";
8
+ import {
9
+ GitWorktreeManager
10
+ } from "./chunk-HSGZW3ID.js";
8
11
  import {
9
12
  FirstRunManager
10
13
  } from "./chunk-Q7POFB5Q.js";
@@ -15,9 +18,6 @@ import {
15
18
  import {
16
19
  AgentManager
17
20
  } from "./chunk-4BSXZ5YZ.js";
18
- import {
19
- GitWorktreeManager
20
- } from "./chunk-HSGZW3ID.js";
21
21
  import "./chunk-RNBIISBZ.js";
22
22
  import {
23
23
  PromptTemplateManager
@@ -717,4 +717,4 @@ export {
717
717
  IgniteCommand,
718
718
  WorktreeValidationError
719
719
  };
720
- //# sourceMappingURL=ignite-ZO7SGUKP.js.map
720
+ //# sourceMappingURL=ignite-5SIGOW5V.js.map
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  InitCommand
4
- } from "./chunk-RODL2HVY.js";
5
- import "./chunk-Q7POFB5Q.js";
4
+ } from "./chunk-FPNSFP6K.js";
5
+ import "./chunk-HSGZW3ID.js";
6
6
  import "./chunk-BYUMEDDD.js";
7
+ import "./chunk-Q7POFB5Q.js";
7
8
  import "./chunk-4BSXZ5YZ.js";
8
- import "./chunk-HSGZW3ID.js";
9
9
  import "./chunk-FXDYIV3K.js";
10
10
  import "./chunk-66QOCD5N.js";
11
11
  import "./chunk-GDS2HXSW.js";
@@ -18,4 +18,4 @@ import "./chunk-VT4PDUYT.js";
18
18
  export {
19
19
  InitCommand
20
20
  };
21
- //# sourceMappingURL=init-MZBIXQ7V.js.map
21
+ //# sourceMappingURL=init-XXDIB2UJ.js.map
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ScriptCommandBase
4
- } from "./chunk-BCQDYAOJ.js";
5
- import "./chunk-TVH67KEO.js";
4
+ } from "./chunk-O6LECMT6.js";
6
5
  import "./chunk-RD7I2Q2F.js";
6
+ import "./chunk-TVH67KEO.js";
7
7
  import "./chunk-HSGZW3ID.js";
8
8
  import "./chunk-XPKN3QWY.js";
9
9
  import "./chunk-GDS2HXSW.js";
@@ -24,4 +24,4 @@ var LintCommand = class extends ScriptCommandBase {
24
24
  export {
25
25
  LintCommand
26
26
  };
27
- //# sourceMappingURL=lint-MDVUV3W2.js.map
27
+ //# sourceMappingURL=lint-XPODLDVA.js.map
@@ -3,19 +3,19 @@ import {
3
3
  DevServerManager
4
4
  } from "./chunk-VZYSM7N7.js";
5
5
  import "./chunk-XHNACIHO.js";
6
+ import "./chunk-RD7I2Q2F.js";
6
7
  import {
7
8
  getWorkspacePort
8
9
  } from "./chunk-52MVUK5V.js";
9
10
  import {
10
11
  IdentifierParser
11
12
  } from "./chunk-TVH67KEO.js";
12
- import {
13
- ProjectCapabilityDetector
14
- } from "./chunk-7GLZVDPQ.js";
15
- import "./chunk-RD7I2Q2F.js";
16
13
  import {
17
14
  GitWorktreeManager
18
15
  } from "./chunk-HSGZW3ID.js";
16
+ import {
17
+ ProjectCapabilityDetector
18
+ } from "./chunk-7GLZVDPQ.js";
19
19
  import "./chunk-XPKN3QWY.js";
20
20
  import {
21
21
  openBrowser
@@ -238,4 +238,4 @@ Make sure the project is built (run 'il start' first)`
238
238
  export {
239
239
  OpenCommand
240
240
  };
241
- //# sourceMappingURL=open-2LPZ7XXW.js.map
241
+ //# sourceMappingURL=open-M2SUR74Y.js.map
@@ -2,21 +2,21 @@
2
2
  import {
3
3
  launchFirstRunSetup,
4
4
  needsFirstRunSetup
5
- } from "./chunk-A4UQY3M2.js";
5
+ } from "./chunk-3FC3VNEX.js";
6
6
  import {
7
7
  IssueTrackerFactory
8
8
  } from "./chunk-SC6X5EBG.js";
9
9
  import {
10
10
  matchIssueIdentifier
11
11
  } from "./chunk-TVH67KEO.js";
12
- import "./chunk-RODL2HVY.js";
13
- import "./chunk-Q7POFB5Q.js";
12
+ import "./chunk-FPNSFP6K.js";
13
+ import "./chunk-HSGZW3ID.js";
14
14
  import "./chunk-BYUMEDDD.js";
15
+ import "./chunk-Q7POFB5Q.js";
15
16
  import {
16
17
  generateIssueManagementMcpConfig
17
18
  } from "./chunk-XJHQVOT6.js";
18
19
  import "./chunk-4BSXZ5YZ.js";
19
- import "./chunk-HSGZW3ID.js";
20
20
  import {
21
21
  IssueManagementProviderFactory
22
22
  } from "./chunk-UDZCTLD6.js";
@@ -195,7 +195,7 @@ var PlanCommand = class {
195
195
  );
196
196
  if (shouldRunInit) {
197
197
  logger.info(chalk.bold("Launching iloom init..."));
198
- const { InitCommand } = await import("./init-MZBIXQ7V.js");
198
+ const { InitCommand } = await import("./init-XXDIB2UJ.js");
199
199
  const initCommand = new InitCommand();
200
200
  await initCommand.execute(
201
201
  "Help the user set up a GitHub repository or Linear project for this project so they can use issue management features. When complete tell the user they can exit to continue the planning session."
@@ -368,4 +368,4 @@ ${initialMessage}`;
368
368
  export {
369
369
  PlanCommand
370
370
  };
371
- //# sourceMappingURL=plan-PIME6UNY.js.map
371
+ //# sourceMappingURL=plan-FB4AOJ2Q.js.map
@@ -2,14 +2,14 @@
2
2
  import {
3
3
  BuildRunner,
4
4
  MergeManager
5
- } from "./chunk-ECP77QGE.js";
6
- import "./chunk-7GLZVDPQ.js";
5
+ } from "./chunk-A7XHHUEV.js";
7
6
  import {
8
7
  installDependencies
9
8
  } from "./chunk-RD7I2Q2F.js";
10
9
  import {
11
10
  GitWorktreeManager
12
11
  } from "./chunk-HSGZW3ID.js";
12
+ import "./chunk-7GLZVDPQ.js";
13
13
  import "./chunk-XPKN3QWY.js";
14
14
  import {
15
15
  getWorktreeRoot,
@@ -139,4 +139,4 @@ export {
139
139
  RebaseCommand,
140
140
  WorktreeValidationError
141
141
  };
142
- //# sourceMappingURL=rebase-7YS3N274.js.map
142
+ //# sourceMappingURL=rebase-4FNRBW3H.js.map
@@ -3,19 +3,19 @@ import {
3
3
  DevServerManager
4
4
  } from "./chunk-VZYSM7N7.js";
5
5
  import "./chunk-XHNACIHO.js";
6
+ import "./chunk-RD7I2Q2F.js";
6
7
  import {
7
8
  getWorkspacePort
8
9
  } from "./chunk-52MVUK5V.js";
9
10
  import {
10
11
  IdentifierParser
11
12
  } from "./chunk-TVH67KEO.js";
12
- import {
13
- ProjectCapabilityDetector
14
- } from "./chunk-7GLZVDPQ.js";
15
- import "./chunk-RD7I2Q2F.js";
16
13
  import {
17
14
  GitWorktreeManager
18
15
  } from "./chunk-HSGZW3ID.js";
16
+ import {
17
+ ProjectCapabilityDetector
18
+ } from "./chunk-7GLZVDPQ.js";
19
19
  import "./chunk-XPKN3QWY.js";
20
20
  import {
21
21
  openBrowser
@@ -238,4 +238,4 @@ Make sure the project is built (run 'il start' first)`
238
238
  export {
239
239
  RunCommand
240
240
  };
241
- //# sourceMappingURL=run-XPGCMFFO.js.map
241
+ //# sourceMappingURL=run-GZNHRJB2.js.map
@@ -8,10 +8,10 @@ import {
8
8
  } from "./chunk-HSGZW3ID.js";
9
9
  import {
10
10
  PRManager
11
- } from "./chunk-EQOFNPEY.js";
12
- import "./chunk-YETJNRQM.js";
11
+ } from "./chunk-44Y5IF7P.js";
13
12
  import "./chunk-UDZCTLD6.js";
14
13
  import "./chunk-RNBIISBZ.js";
14
+ import "./chunk-YETJNRQM.js";
15
15
  import "./chunk-FXDYIV3K.js";
16
16
  import "./chunk-66QOCD5N.js";
17
17
  import {
@@ -280,4 +280,4 @@ Please provide an issue number, PR number, or branch name.`
280
280
  export {
281
281
  SummaryCommand
282
282
  };
283
- //# sourceMappingURL=summary-C5VVSJAJ.js.map
283
+ //# sourceMappingURL=summary-Z4F7YFXE.js.map
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ScriptCommandBase
4
- } from "./chunk-BCQDYAOJ.js";
5
- import "./chunk-TVH67KEO.js";
4
+ } from "./chunk-O6LECMT6.js";
6
5
  import "./chunk-RD7I2Q2F.js";
6
+ import "./chunk-TVH67KEO.js";
7
7
  import "./chunk-HSGZW3ID.js";
8
8
  import "./chunk-XPKN3QWY.js";
9
9
  import "./chunk-GDS2HXSW.js";
@@ -24,4 +24,4 @@ var TestCommand = class extends ScriptCommandBase {
24
24
  export {
25
25
  TestCommand
26
26
  };
27
- //# sourceMappingURL=test-N2725YRI.js.map
27
+ //# sourceMappingURL=test-LBSPYIJW.js.map
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ IdentifierParser
4
+ } from "./chunk-TVH67KEO.js";
5
+ import {
6
+ GitWorktreeManager
7
+ } from "./chunk-HSGZW3ID.js";
8
+ import {
9
+ getInstallHint,
10
+ isIdeAvailable
11
+ } from "./chunk-O7VL5N6S.js";
12
+ import {
13
+ extractIssueNumber
14
+ } from "./chunk-GDS2HXSW.js";
15
+ import "./chunk-IWIIOFEB.js";
16
+ import "./chunk-KBEIQP4G.js";
17
+ import {
18
+ waitForKeypress
19
+ } from "./chunk-7JDMYTFZ.js";
20
+ import "./chunk-6MLEBAYZ.js";
21
+ import {
22
+ logger
23
+ } from "./chunk-VT4PDUYT.js";
24
+
25
+ // src/commands/vscode.ts
26
+ import path from "path";
27
+ import { execa } from "execa";
28
+ var EXTENSION_ID = "iloom-ai.iloom-vscode";
29
+ var VSCODE_COMMAND = "code";
30
+ var VSCodeCommand = class {
31
+ constructor(gitWorktreeManager, identifierParser) {
32
+ this.gitWorktreeManager = gitWorktreeManager ?? new GitWorktreeManager();
33
+ this.identifierParser = identifierParser ?? new IdentifierParser(this.gitWorktreeManager);
34
+ }
35
+ async execute(input) {
36
+ const available = await isIdeAvailable(VSCODE_COMMAND);
37
+ if (!available) {
38
+ throw new Error(
39
+ `VS Code CLI is not available. The "${VSCODE_COMMAND}" command was not found in PATH.
40
+ ` + getInstallHint("vscode")
41
+ );
42
+ }
43
+ const parsed = input.identifier ? await this.parseExplicitInput(input.identifier) : await this.autoDetectFromCurrentDirectory();
44
+ logger.debug(`Parsed input: ${JSON.stringify(parsed)}`);
45
+ const worktree = await this.findWorktreeForIdentifier(parsed);
46
+ logger.info(`Found worktree at: ${worktree.path}`);
47
+ const installedExtensions = await execa(VSCODE_COMMAND, ["--list-extensions"]);
48
+ const extensionList = installedExtensions.stdout.split("\n").map((ext) => ext.trim().toLowerCase());
49
+ const isExtensionInstalled = extensionList.includes(EXTENSION_ID.toLowerCase());
50
+ const lightbulb = "\u{1F4A1}";
51
+ if (isExtensionInstalled) {
52
+ logger.info("iloom VS Code extension is already installed");
53
+ } else {
54
+ logger.info("Installing iloom VS Code extension...");
55
+ await execa(VSCODE_COMMAND, ["--install-extension", EXTENSION_ID]);
56
+ logger.success("Extension installed!");
57
+ }
58
+ if (input.wait !== false) {
59
+ await waitForKeypress(`Press any key to open VS Code (look for the ${lightbulb} icon in the activity bar)...`);
60
+ }
61
+ await execa(VSCODE_COMMAND, [worktree.path]);
62
+ }
63
+ /**
64
+ * Parse explicit identifier input
65
+ */
66
+ async parseExplicitInput(identifier) {
67
+ const parsed = await this.identifierParser.parseForPatternDetection(identifier);
68
+ if (parsed.type === "description") {
69
+ throw new Error("Description input type is not supported in vscode command");
70
+ }
71
+ return { ...parsed, autoDetected: false };
72
+ }
73
+ /**
74
+ * Auto-detect identifier from current directory
75
+ */
76
+ async autoDetectFromCurrentDirectory() {
77
+ const currentDir = path.basename(process.cwd());
78
+ const prPattern = /_pr_(\d+)$/;
79
+ const prMatch = currentDir.match(prPattern);
80
+ if (prMatch == null ? void 0 : prMatch[1]) {
81
+ const prNumber = parseInt(prMatch[1], 10);
82
+ logger.debug(`Auto-detected PR #${prNumber} from directory: ${currentDir}`);
83
+ return {
84
+ type: "pr",
85
+ number: prNumber,
86
+ originalInput: currentDir,
87
+ autoDetected: true
88
+ };
89
+ }
90
+ const issueNumber = extractIssueNumber(currentDir);
91
+ if (issueNumber !== null) {
92
+ logger.debug(`Auto-detected issue #${issueNumber} from directory: ${currentDir}`);
93
+ return {
94
+ type: "issue",
95
+ number: issueNumber,
96
+ originalInput: currentDir,
97
+ autoDetected: true
98
+ };
99
+ }
100
+ const repoInfo = await this.gitWorktreeManager.getRepoInfo();
101
+ const currentBranch = repoInfo.currentBranch;
102
+ if (!currentBranch) {
103
+ throw new Error(
104
+ "Could not auto-detect identifier. Please provide an issue number, PR number, or branch name.\nExpected directory pattern: feat/issue-XX-description OR worktree with _pr_N suffix"
105
+ );
106
+ }
107
+ const branchIssueNumber = extractIssueNumber(currentBranch);
108
+ if (branchIssueNumber !== null) {
109
+ logger.debug(`Auto-detected issue #${branchIssueNumber} from branch: ${currentBranch}`);
110
+ return {
111
+ type: "issue",
112
+ number: branchIssueNumber,
113
+ originalInput: currentBranch,
114
+ autoDetected: true
115
+ };
116
+ }
117
+ return {
118
+ type: "branch",
119
+ branchName: currentBranch,
120
+ originalInput: currentBranch,
121
+ autoDetected: true
122
+ };
123
+ }
124
+ /**
125
+ * Find worktree for the given identifier
126
+ */
127
+ async findWorktreeForIdentifier(parsed) {
128
+ let worktree = null;
129
+ if (parsed.type === "issue" && parsed.number !== void 0) {
130
+ worktree = await this.gitWorktreeManager.findWorktreeForIssue(parsed.number);
131
+ } else if (parsed.type === "pr" && parsed.number !== void 0) {
132
+ const prNumber = typeof parsed.number === "number" ? parsed.number : Number(parsed.number);
133
+ if (isNaN(prNumber) || !isFinite(prNumber)) {
134
+ throw new Error(`Invalid PR number: ${parsed.number}. PR numbers must be numeric.`);
135
+ }
136
+ worktree = await this.gitWorktreeManager.findWorktreeForPR(prNumber, "");
137
+ } else if (parsed.type === "branch" && parsed.branchName) {
138
+ worktree = await this.gitWorktreeManager.findWorktreeForBranch(parsed.branchName);
139
+ }
140
+ if (!worktree) {
141
+ throw new Error(
142
+ `No worktree found for ${this.formatParsedInput(parsed)}. Run 'il start ${parsed.originalInput}' to create one.`
143
+ );
144
+ }
145
+ return worktree;
146
+ }
147
+ /**
148
+ * Format parsed input for display
149
+ */
150
+ formatParsedInput(parsed) {
151
+ const autoLabel = parsed.autoDetected ? " (auto-detected)" : "";
152
+ if (parsed.type === "issue") {
153
+ return `issue #${parsed.number}${autoLabel}`;
154
+ }
155
+ if (parsed.type === "pr") {
156
+ return `PR #${parsed.number}${autoLabel}`;
157
+ }
158
+ return `branch "${parsed.branchName}"${autoLabel}`;
159
+ }
160
+ };
161
+ export {
162
+ VSCodeCommand
163
+ };
164
+ //# sourceMappingURL=vscode-LH3VSQ2W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/vscode.ts"],"sourcesContent":["import path from 'path'\nimport { execa } from 'execa'\nimport { GitWorktreeManager } from '../lib/GitWorktreeManager.js'\nimport { IdentifierParser } from '../utils/IdentifierParser.js'\nimport { isIdeAvailable, getInstallHint } from '../utils/ide.js'\nimport { extractIssueNumber } from '../utils/git.js'\nimport { logger } from '../utils/logger.js'\nimport { waitForKeypress } from '../utils/prompt.js'\nimport type { GitWorktree } from '../types/worktree.js'\nimport type { ParsedInput } from './start.js'\n\nexport interface VSCodeCommandInput {\n\tidentifier?: string | undefined\n\twait?: boolean | undefined\n}\n\ninterface ParsedVSCodeInput extends ParsedInput {\n\tautoDetected: boolean\n}\n\nconst EXTENSION_ID = 'iloom-ai.iloom-vscode'\nconst VSCODE_COMMAND = 'code'\n\nexport class VSCodeCommand {\n\tprivate gitWorktreeManager: GitWorktreeManager\n\tprivate identifierParser: IdentifierParser\n\n\tconstructor(gitWorktreeManager?: GitWorktreeManager, identifierParser?: IdentifierParser) {\n\t\tthis.gitWorktreeManager = gitWorktreeManager ?? new GitWorktreeManager()\n\t\tthis.identifierParser = identifierParser ?? new IdentifierParser(this.gitWorktreeManager)\n\t}\n\n\tasync execute(input: VSCodeCommandInput): Promise<void> {\n\t\t// 1. Check VS Code CLI available\n\t\tconst available = await isIdeAvailable(VSCODE_COMMAND)\n\t\tif (!available) {\n\t\t\tthrow new Error(\n\t\t\t\t`VS Code CLI is not available. The \"${VSCODE_COMMAND}\" command was not found in PATH.\\n` +\n\t\t\t\t\tgetInstallHint('vscode')\n\t\t\t)\n\t\t}\n\n\t\t// 2. Parse or auto-detect identifier\n\t\tconst parsed = input.identifier\n\t\t\t? await this.parseExplicitInput(input.identifier)\n\t\t\t: await this.autoDetectFromCurrentDirectory()\n\n\t\tlogger.debug(`Parsed input: ${JSON.stringify(parsed)}`)\n\n\t\t// 3. Find worktree path based on identifier\n\t\tconst worktree = await this.findWorktreeForIdentifier(parsed)\n\n\t\tlogger.info(`Found worktree at: ${worktree.path}`)\n\n\t\t// 4. Check if extension is already installed\n\t\tconst installedExtensions = await execa(VSCODE_COMMAND, ['--list-extensions'])\n\t\tconst extensionList = installedExtensions.stdout.split('\\n').map(ext => ext.trim().toLowerCase())\n\t\tconst isExtensionInstalled = extensionList.includes(EXTENSION_ID.toLowerCase())\n\n\t\t// 5. Install extension if not already installed\n\t\tconst lightbulb = '\\u{1F4A1}'\n\t\tif (isExtensionInstalled) {\n\t\t\tlogger.info('iloom VS Code extension is already installed')\n\t\t} else {\n\t\t\tlogger.info('Installing iloom VS Code extension...')\n\t\t\tawait execa(VSCODE_COMMAND, ['--install-extension', EXTENSION_ID])\n\t\t\tlogger.success('Extension installed!')\n\t\t}\n\n\t\t// 6. Wait for keypress then open VS Code (skip if wait is false)\n\t\tif (input.wait !== false) {\n\t\t\tawait waitForKeypress(`Press any key to open VS Code (look for the ${lightbulb} icon in the activity bar)...`)\n\t\t}\n\t\tawait execa(VSCODE_COMMAND, [worktree.path])\n\t}\n\n\t/**\n\t * Parse explicit identifier input\n\t */\n\tprivate async parseExplicitInput(identifier: string): Promise<ParsedVSCodeInput> {\n\t\tconst parsed = await this.identifierParser.parseForPatternDetection(identifier)\n\n\t\t// Description type should never reach vscode command\n\t\tif (parsed.type === 'description') {\n\t\t\tthrow new Error('Description input type is not supported in vscode command')\n\t\t}\n\n\t\treturn { ...parsed, autoDetected: false }\n\t}\n\n\t/**\n\t * Auto-detect identifier from current directory\n\t */\n\tprivate async autoDetectFromCurrentDirectory(): Promise<ParsedVSCodeInput> {\n\t\tconst currentDir = path.basename(process.cwd())\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\t\t\treturn {\n\t\t\t\ttype: 'pr',\n\t\t\t\tnumber: prNumber,\n\t\t\t\toriginalInput: currentDir,\n\t\t\t\tautoDetected: true,\n\t\t\t}\n\t\t}\n\n\t\t// Check for issue pattern in directory\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\t\t\treturn {\n\t\t\t\ttype: 'issue',\n\t\t\t\tnumber: issueNumber,\n\t\t\t\toriginalInput: currentDir,\n\t\t\t\tautoDetected: true,\n\t\t\t}\n\t\t}\n\n\t\t// Fallback: get current branch name\n\t\tconst repoInfo = await this.gitWorktreeManager.getRepoInfo()\n\t\tconst currentBranch = repoInfo.currentBranch\n\n\t\tif (!currentBranch) {\n\t\t\tthrow new Error(\n\t\t\t\t'Could not auto-detect identifier. Please provide an issue number, PR number, or branch name.\\n' +\n\t\t\t\t\t'Expected directory pattern: feat/issue-XX-description OR worktree with _pr_N suffix'\n\t\t\t)\n\t\t}\n\n\t\t// Try to extract issue from branch name\n\t\tconst branchIssueNumber = extractIssueNumber(currentBranch)\n\t\tif (branchIssueNumber !== null) {\n\t\t\tlogger.debug(`Auto-detected issue #${branchIssueNumber} from branch: ${currentBranch}`)\n\t\t\treturn {\n\t\t\t\ttype: 'issue',\n\t\t\t\tnumber: branchIssueNumber,\n\t\t\t\toriginalInput: currentBranch,\n\t\t\t\tautoDetected: true,\n\t\t\t}\n\t\t}\n\n\t\t// Last resort: use branch name\n\t\treturn {\n\t\t\ttype: 'branch',\n\t\t\tbranchName: currentBranch,\n\t\t\toriginalInput: currentBranch,\n\t\t\tautoDetected: true,\n\t\t}\n\t}\n\n\t/**\n\t * Find worktree for the given identifier\n\t */\n\tprivate async findWorktreeForIdentifier(parsed: ParsedVSCodeInput): Promise<GitWorktree> {\n\t\tlet worktree: GitWorktree | null = null\n\n\t\tif (parsed.type === 'issue' && parsed.number !== undefined) {\n\t\t\tworktree = await this.gitWorktreeManager.findWorktreeForIssue(parsed.number)\n\t\t} else if (parsed.type === 'pr' && parsed.number !== undefined) {\n\t\t\tconst prNumber = typeof parsed.number === 'number' ? parsed.number : Number(parsed.number)\n\t\t\tif (isNaN(prNumber) || !isFinite(prNumber)) {\n\t\t\t\tthrow new Error(`Invalid PR number: ${parsed.number}. PR numbers must be numeric.`)\n\t\t\t}\n\t\t\tworktree = await this.gitWorktreeManager.findWorktreeForPR(prNumber, '')\n\t\t} else if (parsed.type === 'branch' && parsed.branchName) {\n\t\t\tworktree = await this.gitWorktreeManager.findWorktreeForBranch(parsed.branchName)\n\t\t}\n\n\t\tif (!worktree) {\n\t\t\tthrow new Error(\n\t\t\t\t`No worktree found for ${this.formatParsedInput(parsed)}. ` +\n\t\t\t\t\t`Run 'il start ${parsed.originalInput}' to create one.`\n\t\t\t)\n\t\t}\n\n\t\treturn worktree\n\t}\n\n\t/**\n\t * Format parsed input for display\n\t */\n\tprivate formatParsedInput(parsed: ParsedVSCodeInput): string {\n\t\tconst autoLabel = parsed.autoDetected ? ' (auto-detected)' : ''\n\n\t\tif (parsed.type === 'issue') {\n\t\t\treturn `issue #${parsed.number}${autoLabel}`\n\t\t}\n\t\tif (parsed.type === 'pr') {\n\t\t\treturn `PR #${parsed.number}${autoLabel}`\n\t\t}\n\t\treturn `branch \"${parsed.branchName}\"${autoLabel}`\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ FirstRunManager
4
+ } from "./chunk-Q7POFB5Q.js";
5
+ import "./chunk-VT4PDUYT.js";
6
+
7
+ // src/utils/vscode-announcement.ts
8
+ import chalk from "chalk";
9
+ import stringWidth from "string-width";
10
+ var FEATURE_NAME = "vscode-announcement";
11
+ async function showVSCodeAnnouncementIfNeeded(commandName) {
12
+ if (commandName === "vscode") return;
13
+ if (!process.stdout.isTTY) return;
14
+ const manager = new FirstRunManager(FEATURE_NAME);
15
+ const isFirstTime = await manager.isFirstRun();
16
+ if (!isFirstTime) return;
17
+ displayAnnouncementBox();
18
+ await manager.markAsRun();
19
+ }
20
+ function displayAnnouncementBox() {
21
+ const rocket = "\u{1F680}";
22
+ const pointRight = "\u{1F449}";
23
+ const lines = [
24
+ ` ${rocket} New: iloom for VS Code is here!`,
25
+ "",
26
+ " \u2022 Real-time Recap Panel: See AI decisions, insights, assumptions, and risks as they happen",
27
+ " \u2022 Loom Explorer: Manage projects/tasks visually",
28
+ "",
29
+ ` ${pointRight} Run 'il vscode' to install`
30
+ ];
31
+ const maxWidth = Math.max(...lines.map((l) => stringWidth(l)));
32
+ const boxWidth = maxWidth + 6;
33
+ console.log("");
34
+ console.log(chalk.cyan("\u256D" + "\u2500".repeat(boxWidth - 2) + "\u256E"));
35
+ for (const line of lines) {
36
+ const displayWidth = stringWidth(line);
37
+ const padding = " ".repeat(maxWidth - displayWidth);
38
+ console.log(chalk.cyan("\u2502") + " " + line + padding + " " + chalk.cyan("\u2502"));
39
+ }
40
+ console.log(chalk.cyan("\u2570" + "\u2500".repeat(boxWidth - 2) + "\u256F"));
41
+ console.log("");
42
+ }
43
+ export {
44
+ showVSCodeAnnouncementIfNeeded
45
+ };
46
+ //# sourceMappingURL=vscode-announcement-EQ2SKK3T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/vscode-announcement.ts"],"sourcesContent":["import chalk from 'chalk'\nimport stringWidth from 'string-width'\nimport { FirstRunManager } from './FirstRunManager.js'\n\nconst FEATURE_NAME = 'vscode-announcement'\n\n/**\n * Check if announcement should be shown and display if so\n * @param commandName - The name of the command that just completed\n */\nexport async function showVSCodeAnnouncementIfNeeded(commandName: string): Promise<void> {\n // Skip if command is 'vscode'\n if (commandName === 'vscode') return\n\n // Skip if not TTY\n if (!process.stdout.isTTY) return\n\n // Check if already shown\n const manager = new FirstRunManager(FEATURE_NAME)\n const isFirstTime = await manager.isFirstRun()\n if (!isFirstTime) return\n\n // Display announcement\n displayAnnouncementBox()\n\n // Mark as shown\n await manager.markAsRun()\n}\n\nfunction displayAnnouncementBox(): void {\n const rocket = '\\u{1F680}'\n const pointRight = '\\u{1F449}'\n\n const lines = [\n ` ${rocket} New: iloom for VS Code is here!`,\n '',\n ' \\u2022 Real-time Recap Panel: See AI decisions, insights, assumptions, and risks as they happen',\n ' \\u2022 Loom Explorer: Manage projects/tasks visually',\n '',\n ` ${pointRight} Run 'il vscode' to install`,\n ]\n\n const maxWidth = Math.max(...lines.map(l => stringWidth(l)))\n const boxWidth = maxWidth + 6 // 2 spaces padding on each side + 2 border chars\n\n // eslint-disable-next-line no-console\n console.log('')\n // eslint-disable-next-line no-console\n console.log(chalk.cyan('\\u256D' + '\\u2500'.repeat(boxWidth - 2) + '\\u256E'))\n for (const line of lines) {\n // Pad based on display width, not string length\n const displayWidth = stringWidth(line)\n const padding = ' '.repeat(maxWidth - displayWidth)\n // eslint-disable-next-line no-console\n console.log(chalk.cyan('\\u2502') + ' ' + line + padding + ' ' + chalk.cyan('\\u2502'))\n }\n // eslint-disable-next-line no-console\n console.log(chalk.cyan('\\u2570' + '\\u2500'.repeat(boxWidth - 2) + '\\u256F'))\n // eslint-disable-next-line no-console\n console.log('')\n}\n"],"mappings":";;;;;;;AAAA,OAAO,WAAW;AAClB,OAAO,iBAAiB;AAGxB,IAAM,eAAe;AAMrB,eAAsB,+BAA+B,aAAoC;AAEvF,MAAI,gBAAgB,SAAU;AAG9B,MAAI,CAAC,QAAQ,OAAO,MAAO;AAG3B,QAAM,UAAU,IAAI,gBAAgB,YAAY;AAChD,QAAM,cAAc,MAAM,QAAQ,WAAW;AAC7C,MAAI,CAAC,YAAa;AAGlB,yBAAuB;AAGvB,QAAM,QAAQ,UAAU;AAC1B;AAEA,SAAS,yBAA+B;AACtC,QAAM,SAAS;AACf,QAAM,aAAa;AAEnB,QAAM,QAAQ;AAAA,IACZ,KAAK,MAAM;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU;AAAA,EACjB;AAEA,QAAM,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,OAAK,YAAY,CAAC,CAAC,CAAC;AAC3D,QAAM,WAAW,WAAW;AAG5B,UAAQ,IAAI,EAAE;AAEd,UAAQ,IAAI,MAAM,KAAK,WAAW,SAAS,OAAO,WAAW,CAAC,IAAI,QAAQ,CAAC;AAC3E,aAAW,QAAQ,OAAO;AAExB,UAAM,eAAe,YAAY,IAAI;AACrC,UAAM,UAAU,IAAI,OAAO,WAAW,YAAY;AAElD,YAAQ,IAAI,MAAM,KAAK,QAAQ,IAAI,OAAO,OAAO,UAAU,OAAO,MAAM,KAAK,QAAQ,CAAC;AAAA,EACxF;AAED,UAAQ,IAAI,MAAM,KAAK,WAAW,SAAS,OAAO,WAAW,CAAC,IAAI,QAAQ,CAAC;AAE1E,UAAQ,IAAI,EAAE;AAChB;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iloom/cli",
3
- "version": "0.8.1",
3
+ "version": "0.8.2",
4
4
  "description": "Control plane for maintaining alignment between you and Claude Code as you work across multiple issues using isolated environments, visible context, and multi-agent workflows to scale understanding, not just output",
5
5
  "keywords": [
6
6
  "ai",
@@ -80,6 +80,7 @@
80
80
  "jsonc-parser": "^3.3.1",
81
81
  "omelette": "^0.4.17",
82
82
  "ora": "^7.0.1",
83
+ "string-width": "^8.1.1",
83
84
  "zod": "^3.23.8"
84
85
  },
85
86
  "devDependencies": {