@shepai/cli 1.36.0 → 1.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/packages/core/src/application/ports/output/services/ide-launcher-service.interface.d.ts +64 -0
  2. package/dist/packages/core/src/application/ports/output/services/ide-launcher-service.interface.d.ts.map +1 -0
  3. package/dist/packages/core/src/application/ports/output/services/ide-launcher-service.interface.js +7 -0
  4. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  5. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/ide/launch-ide.use-case.d.ts +20 -0
  7. package/dist/packages/core/src/application/use-cases/ide/launch-ide.use-case.d.ts.map +1 -0
  8. package/dist/packages/core/src/application/use-cases/ide/launch-ide.use-case.js +54 -0
  9. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/di/container.js +7 -0
  11. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.d.ts +23 -0
  12. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.d.ts.map +1 -0
  13. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.js +114 -0
  14. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +20 -4
  15. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.js +9 -1
  17. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/antigravity.json +5 -2
  18. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +8 -2
  19. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor-cli.json +8 -2
  20. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor.json +2 -2
  21. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/vscode.json +2 -2
  22. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/windsurf.json +2 -2
  23. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/zed.json +2 -2
  24. package/dist/src/presentation/cli/commands/ide-open.command.d.ts +3 -1
  25. package/dist/src/presentation/cli/commands/ide-open.command.d.ts.map +1 -1
  26. package/dist/src/presentation/cli/commands/ide-open.command.js +27 -28
  27. package/dist/src/presentation/cli/commands/install.command.js +3 -3
  28. package/dist/src/presentation/cli/commands/settings/ide.command.d.ts +1 -0
  29. package/dist/src/presentation/cli/commands/settings/ide.command.d.ts.map +1 -1
  30. package/dist/src/presentation/cli/commands/settings/ide.command.js +10 -13
  31. package/dist/src/presentation/tui/prompts/ide-select.prompt.d.ts +9 -25
  32. package/dist/src/presentation/tui/prompts/ide-select.prompt.d.ts.map +1 -1
  33. package/dist/src/presentation/tui/prompts/ide-select.prompt.js +9 -29
  34. package/dist/src/presentation/web/app/api/ide/open/route.d.ts.map +1 -1
  35. package/dist/src/presentation/web/app/api/ide/open/route.js +3 -2
  36. package/dist/tsconfig.build.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/web/.next/BUILD_ID +1 -1
  39. package/web/.next/build-manifest.json +2 -2
  40. package/web/.next/cache/.previewinfo +1 -1
  41. package/web/.next/cache/.rscinfo +1 -1
  42. package/web/.next/cache/.tsbuildinfo +1 -1
  43. package/web/.next/cache/config.json +3 -3
  44. package/web/.next/fallback-build-manifest.json +2 -2
  45. package/web/.next/prerender-manifest.json +3 -3
  46. package/web/.next/required-server-files.js +1 -1
  47. package/web/.next/required-server-files.json +1 -1
  48. package/web/.next/server/app/_global-error.html +2 -2
  49. package/web/.next/server/app/_global-error.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  51. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  54. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  55. package/web/.next/server/app/api/ide/open/route.js +1 -2
  56. package/web/.next/server/app/api/ide/open/route.js.nft.json +1 -1
  57. package/web/.next/server/app/api/shell/open/route.js +1 -1
  58. package/web/.next/server/app/api/shell/open/route.js.nft.json +1 -1
  59. package/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js +3 -0
  60. package/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js.map +1 -0
  61. package/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js +3 -0
  62. package/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js.map +1 -0
  63. package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  64. package/web/.next/server/pages/500.html +2 -2
  65. package/web/.next/server/server-reference-manifest.js +1 -1
  66. package/web/.next/server/server-reference-manifest.json +1 -1
  67. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  68. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  69. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  70. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  71. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  72. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  73. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  74. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  75. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  76. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  77. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  78. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js +1 -2
  79. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js.nft.json +1 -1
  80. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js +1 -1
  81. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js.nft.json +1 -1
  82. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js +3 -0
  83. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js +3 -0
  84. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  85. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  86. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  87. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +1 -1
  88. package/web/.next/standalone/src/presentation/web/app/api/ide/open/route.ts +4 -2
  89. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  90. package/web/.next/trace +1 -1
  91. package/web/.next/trace-build +1 -1
  92. package/dist/packages/core/src/infrastructure/services/ide-launchers/antigravity.launcher.d.ts +0 -10
  93. package/dist/packages/core/src/infrastructure/services/ide-launchers/antigravity.launcher.d.ts.map +0 -1
  94. package/dist/packages/core/src/infrastructure/services/ide-launchers/antigravity.launcher.js +0 -21
  95. package/dist/packages/core/src/infrastructure/services/ide-launchers/cursor.launcher.d.ts +0 -10
  96. package/dist/packages/core/src/infrastructure/services/ide-launchers/cursor.launcher.d.ts.map +0 -1
  97. package/dist/packages/core/src/infrastructure/services/ide-launchers/cursor.launcher.js +0 -21
  98. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.interface.d.ts +0 -31
  99. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.interface.d.ts.map +0 -1
  100. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.interface.js +0 -8
  101. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.registry.d.ts +0 -9
  102. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.registry.d.ts.map +0 -1
  103. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.registry.js +0 -24
  104. package/dist/packages/core/src/infrastructure/services/ide-launchers/launch-ide.d.ts +0 -30
  105. package/dist/packages/core/src/infrastructure/services/ide-launchers/launch-ide.d.ts.map +0 -1
  106. package/dist/packages/core/src/infrastructure/services/ide-launchers/launch-ide.js +0 -43
  107. package/dist/packages/core/src/infrastructure/services/ide-launchers/vscode.launcher.d.ts +0 -10
  108. package/dist/packages/core/src/infrastructure/services/ide-launchers/vscode.launcher.d.ts.map +0 -1
  109. package/dist/packages/core/src/infrastructure/services/ide-launchers/vscode.launcher.js +0 -21
  110. package/dist/packages/core/src/infrastructure/services/ide-launchers/windsurf.launcher.d.ts +0 -10
  111. package/dist/packages/core/src/infrastructure/services/ide-launchers/windsurf.launcher.d.ts.map +0 -1
  112. package/dist/packages/core/src/infrastructure/services/ide-launchers/windsurf.launcher.js +0 -21
  113. package/dist/packages/core/src/infrastructure/services/ide-launchers/zed.launcher.d.ts +0 -10
  114. package/dist/packages/core/src/infrastructure/services/ide-launchers/zed.launcher.d.ts.map +0 -1
  115. package/dist/packages/core/src/infrastructure/services/ide-launchers/zed.launcher.js +0 -21
  116. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js +0 -3
  117. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js.map +0 -1
  118. package/web/.next/server/chunks/[root-of-the-server]__0af905fe._.js +0 -3
  119. package/web/.next/server/chunks/[root-of-the-server]__0af905fe._.js.map +0 -1
  120. package/web/.next/server/chunks/[root-of-the-server]__72567d8d._.js +0 -3
  121. package/web/.next/server/chunks/[root-of-the-server]__72567d8d._.js.map +0 -1
  122. package/web/.next/standalone/src/presentation/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js +0 -3
  123. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__0af905fe._.js +0 -3
  124. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__72567d8d._.js +0 -3
  125. /package/web/.next/static/{TkrzrZBiArd9QW2xebsyW → zoaB52IxAh-lSl8Qreb0t}/_buildManifest.js +0 -0
  126. /package/web/.next/static/{TkrzrZBiArd9QW2xebsyW → zoaB52IxAh-lSl8Qreb0t}/_clientMiddlewareManifest.json +0 -0
  127. /package/web/.next/static/{TkrzrZBiArd9QW2xebsyW → zoaB52IxAh-lSl8Qreb0t}/_ssgManifest.js +0 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * IDE Launcher Service Interface
3
+ *
4
+ * Output port for launching IDE editors in a target directory.
5
+ * Implementations resolve editor commands from metadata and spawn detached processes.
6
+ */
7
+ /**
8
+ * Input for the LaunchIdeUseCase.
9
+ */
10
+ export interface LaunchIdeInput {
11
+ /** Which editor to launch (e.g., "vscode", "cursor"). */
12
+ editorId: string;
13
+ /** Absolute path to the repository root. */
14
+ repositoryPath: string;
15
+ /** Git branch name. When omitted, repositoryPath is used directly. */
16
+ branch?: string;
17
+ /** Whether to verify binary availability before launching. Default: false. */
18
+ checkAvailability?: boolean;
19
+ }
20
+ /**
21
+ * Successful IDE launch result.
22
+ */
23
+ export interface LaunchIdeSuccess {
24
+ ok: true;
25
+ /** Display name of the editor that was launched. */
26
+ editorName: string;
27
+ /** Absolute path that was opened in the editor. */
28
+ worktreePath: string;
29
+ }
30
+ /**
31
+ * Failed IDE launch result.
32
+ */
33
+ export interface LaunchIdeFailed {
34
+ ok: false;
35
+ /** Error classification for consumer error handling. */
36
+ code: 'unknown_editor' | 'editor_unavailable' | 'launch_failed';
37
+ /** Human-readable error description. */
38
+ message: string;
39
+ }
40
+ /**
41
+ * Discriminated union result for IDE launch operations.
42
+ */
43
+ export type LaunchIdeResult = LaunchIdeSuccess | LaunchIdeFailed;
44
+ /**
45
+ * Service interface for launching IDE editors.
46
+ */
47
+ export interface IIdeLauncherService {
48
+ /**
49
+ * Launch an IDE editor in the specified directory.
50
+ *
51
+ * @param editorId - Editor identifier (e.g., "vscode", "cursor")
52
+ * @param directoryPath - Absolute path to open in the editor
53
+ * @returns Launch result indicating success or failure with error details
54
+ */
55
+ launch(editorId: string, directoryPath: string): Promise<LaunchIdeResult>;
56
+ /**
57
+ * Check whether an editor's binary is available on the system PATH.
58
+ *
59
+ * @param editorId - Editor identifier (e.g., "vscode", "cursor")
60
+ * @returns True if the editor binary is found and executable
61
+ */
62
+ checkAvailability(editorId: string): Promise<boolean>;
63
+ }
64
+ //# sourceMappingURL=ide-launcher-service.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide-launcher-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/ide-launcher-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,IAAI,CAAC;IACT,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,KAAK,CAAC;IACV,wDAAwD;IACxD,IAAI,EAAE,gBAAgB,GAAG,oBAAoB,GAAG,eAAe,CAAC;IAChE,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE1E;;;;;OAKG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * IDE Launcher Service Interface
3
+ *
4
+ * Output port for launching IDE editors in a target directory.
5
+ * Implementations resolve editor commands from metadata and spawn detached processes.
6
+ */
7
+ export {};
@@ -14,4 +14,5 @@ export type { IToolInstallerService } from './tool-installer.service.js';
14
14
  export type { INotificationService } from './notification-service.interface.js';
15
15
  export type { IGitPrService, CiStatus, CiStatusResult, DiffSummary, MergeStrategy, PrCreateResult, } from './git-pr-service.interface.js';
16
16
  export { GitPrError, GitPrErrorCode } from './git-pr-service.interface.js';
17
+ export type { IIdeLauncherService, LaunchIdeInput, LaunchIdeResult, LaunchIdeSuccess, LaunchIdeFailed, } from './ide-launcher-service.interface.js';
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * LaunchIdeUseCase
3
+ *
4
+ * Orchestrates IDE launching: computes the target directory path (worktree when
5
+ * a branch is specified), optionally checks editor availability, and delegates
6
+ * to IIdeLauncherService for the actual spawn.
7
+ */
8
+ import type { IIdeLauncherService, LaunchIdeInput, LaunchIdeResult } from '../../ports/output/services/ide-launcher-service.interface.js';
9
+ export declare class LaunchIdeUseCase {
10
+ private readonly ideLauncherService;
11
+ constructor(ideLauncherService: IIdeLauncherService);
12
+ /**
13
+ * Launch an IDE editor for the given repository/branch.
14
+ *
15
+ * @param input - Editor ID, repository path, optional branch and availability check flag
16
+ * @returns Launch result indicating success or failure with error details
17
+ */
18
+ execute(input: LaunchIdeInput): Promise<LaunchIdeResult>;
19
+ }
20
+ //# sourceMappingURL=launch-ide.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-ide.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/ide/launch-ide.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EAChB,MAAM,+DAA+D,CAAC;AAGvE,qBACa,gBAAgB;IAGzB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAAlB,kBAAkB,EAAE,mBAAmB;IAG1D;;;;;OAKG;IACG,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;CAkB/D"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * LaunchIdeUseCase
3
+ *
4
+ * Orchestrates IDE launching: computes the target directory path (worktree when
5
+ * a branch is specified), optionally checks editor availability, and delegates
6
+ * to IIdeLauncherService for the actual spawn.
7
+ */
8
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
9
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
12
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
13
+ };
14
+ var __metadata = (this && this.__metadata) || function (k, v) {
15
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
16
+ };
17
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
18
+ return function (target, key) { decorator(target, key, paramIndex); }
19
+ };
20
+ import { injectable, inject } from 'tsyringe';
21
+ import { computeWorktreePath } from '../../../infrastructure/services/ide-launchers/compute-worktree-path.js';
22
+ let LaunchIdeUseCase = class LaunchIdeUseCase {
23
+ ideLauncherService;
24
+ constructor(ideLauncherService) {
25
+ this.ideLauncherService = ideLauncherService;
26
+ }
27
+ /**
28
+ * Launch an IDE editor for the given repository/branch.
29
+ *
30
+ * @param input - Editor ID, repository path, optional branch and availability check flag
31
+ * @returns Launch result indicating success or failure with error details
32
+ */
33
+ async execute(input) {
34
+ const { editorId, repositoryPath, branch, checkAvailability } = input;
35
+ const directoryPath = branch ? computeWorktreePath(repositoryPath, branch) : repositoryPath;
36
+ if (checkAvailability) {
37
+ const available = await this.ideLauncherService.checkAvailability(editorId);
38
+ if (!available) {
39
+ return {
40
+ ok: false,
41
+ code: 'editor_unavailable',
42
+ message: `Editor '${editorId}' is not available on the system PATH`,
43
+ };
44
+ }
45
+ }
46
+ return this.ideLauncherService.launch(editorId, directoryPath);
47
+ }
48
+ };
49
+ LaunchIdeUseCase = __decorate([
50
+ injectable(),
51
+ __param(0, inject('IIdeLauncherService')),
52
+ __metadata("design:paramtypes", [Object])
53
+ ], LaunchIdeUseCase);
54
+ export { LaunchIdeUseCase };
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAuFrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA+KrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA0FrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAuLrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -22,6 +22,7 @@ import { WebServerService } from '../services/web-server.service.js';
22
22
  import { WorktreeService } from '../services/git/worktree.service.js';
23
23
  import { ToolInstallerServiceImpl } from '../services/tool-installer/tool-installer.service.js';
24
24
  import { GitPrService } from '../services/git/git-pr.service.js';
25
+ import { JsonDrivenIdeLauncherService } from '../services/ide-launchers/json-driven-ide-launcher.service.js';
25
26
  import { AgentExecutorFactory } from '../services/agents/common/agent-executor-factory.service.js';
26
27
  import { AgentExecutorProvider } from '../services/agents/common/agent-executor-provider.service.js';
27
28
  import { StructuredAgentCallerService } from '../services/agents/common/structured-agent-caller.service.js';
@@ -59,6 +60,7 @@ import { DeleteFeatureUseCase } from '../../application/use-cases/features/delet
59
60
  import { ResumeFeatureUseCase } from '../../application/use-cases/features/resume-feature.use-case.js';
60
61
  import { ValidateToolAvailabilityUseCase } from '../../application/use-cases/tools/validate-tool-availability.use-case.js';
61
62
  import { InstallToolUseCase } from '../../application/use-cases/tools/install-tool.use-case.js';
63
+ import { LaunchIdeUseCase } from '../../application/use-cases/ide/launch-ide.use-case.js';
62
64
  // Database connection
63
65
  import { getSQLiteConnection } from '../persistence/sqlite/connection.js';
64
66
  import { runSQLiteMigrations } from '../persistence/sqlite/migrations.js';
@@ -105,6 +107,7 @@ export async function initializeContainer() {
105
107
  container.registerSingleton('IWorktreeService', WorktreeService);
106
108
  container.registerSingleton('IToolInstallerService', ToolInstallerServiceImpl);
107
109
  container.registerSingleton('IGitPrService', GitPrService);
110
+ container.registerSingleton('IIdeLauncherService', JsonDrivenIdeLauncherService);
108
111
  // Register agent infrastructure
109
112
  container.register('IAgentRunRepository', {
110
113
  useFactory: (c) => {
@@ -206,6 +209,7 @@ export async function initializeContainer() {
206
209
  container.registerSingleton(ResumeFeatureUseCase);
207
210
  container.registerSingleton(ValidateToolAvailabilityUseCase);
208
211
  container.registerSingleton(InstallToolUseCase);
212
+ container.registerSingleton(LaunchIdeUseCase);
209
213
  // String-token aliases for web routes (Turbopack can't resolve .js→.ts
210
214
  // imports inside @shepai/core, so routes use string tokens instead of class refs)
211
215
  container.register('CreateFeatureUseCase', {
@@ -217,6 +221,9 @@ export async function initializeContainer() {
217
221
  container.register('DeleteFeatureUseCase', {
218
222
  useFactory: (c) => c.resolve(DeleteFeatureUseCase),
219
223
  });
224
+ container.register('LaunchIdeUseCase', {
225
+ useFactory: (c) => c.resolve(LaunchIdeUseCase),
226
+ });
220
227
  _initialized = true;
221
228
  return container;
222
229
  }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * JSON-Driven IDE Launcher Service
3
+ *
4
+ * Replaces the 5 hard-coded IDE launcher classes with a single service that
5
+ * derives editor commands from the JSON tool metadata files. Reads from the
6
+ * already-loaded TOOL_METADATA record, filters by category "ide" and presence
7
+ * of openDirectory, and performs {dir} placeholder substitution at launch time.
8
+ */
9
+ import type { IIdeLauncherService, LaunchIdeResult } from '../../../application/ports/output/services/ide-launcher-service.interface.js';
10
+ /**
11
+ * Resolve a platform-specific value from a string or per-platform record.
12
+ * When the value is a plain string, returns it directly.
13
+ * When the value is a record, returns the entry for the current os.platform(),
14
+ * falling back to the first value if the current platform is not present.
15
+ */
16
+ export declare function resolvePlatformValue(value: string | Record<string, string>): string;
17
+ export declare class JsonDrivenIdeLauncherService implements IIdeLauncherService {
18
+ private readonly editors;
19
+ constructor();
20
+ launch(editorId: string, directoryPath: string): Promise<LaunchIdeResult>;
21
+ checkAvailability(editorId: string): Promise<boolean>;
22
+ }
23
+ //# sourceMappingURL=json-driven-ide-launcher.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-driven-ide-launcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EAChB,MAAM,8EAA8E,CAAC;AActF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAGnF;AAED,qBACa,4BAA6B,YAAW,mBAAmB;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;;IAgB1C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAoD/E,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAWtD"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * JSON-Driven IDE Launcher Service
3
+ *
4
+ * Replaces the 5 hard-coded IDE launcher classes with a single service that
5
+ * derives editor commands from the JSON tool metadata files. Reads from the
6
+ * already-loaded TOOL_METADATA record, filters by category "ide" and presence
7
+ * of openDirectory, and performs {dir} placeholder substitution at launch time.
8
+ */
9
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
10
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
11
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
12
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
13
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
14
+ };
15
+ var __metadata = (this && this.__metadata) || function (k, v) {
16
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
17
+ };
18
+ import { injectable } from 'tsyringe';
19
+ import { spawn, execFile } from 'node:child_process';
20
+ import { platform } from 'node:os';
21
+ import { TOOL_METADATA } from '../tool-installer/tool-metadata.js';
22
+ /**
23
+ * Resolve a platform-specific value from a string or per-platform record.
24
+ * When the value is a plain string, returns it directly.
25
+ * When the value is a record, returns the entry for the current os.platform(),
26
+ * falling back to the first value if the current platform is not present.
27
+ */
28
+ export function resolvePlatformValue(value) {
29
+ if (typeof value === 'string')
30
+ return value;
31
+ return value[platform()] ?? Object.values(value)[0];
32
+ }
33
+ let JsonDrivenIdeLauncherService = class JsonDrivenIdeLauncherService {
34
+ editors;
35
+ constructor() {
36
+ this.editors = new Map();
37
+ for (const [id, meta] of Object.entries(TOOL_METADATA)) {
38
+ if (meta.openDirectory != null) {
39
+ this.editors.set(id, {
40
+ name: meta.name,
41
+ binary: meta.binary,
42
+ openDirectory: meta.openDirectory,
43
+ spawnOptions: meta.spawnOptions,
44
+ });
45
+ }
46
+ }
47
+ }
48
+ async launch(editorId, directoryPath) {
49
+ const entry = this.editors.get(editorId);
50
+ if (!entry) {
51
+ const available = [...this.editors.keys()].join(', ');
52
+ return {
53
+ ok: false,
54
+ code: 'unknown_editor',
55
+ message: `No launcher found for editor: ${editorId}. Available: ${available}`,
56
+ };
57
+ }
58
+ const openCmd = resolvePlatformValue(entry.openDirectory);
59
+ if (!openCmd.includes('{dir}')) {
60
+ return {
61
+ ok: false,
62
+ code: 'launch_failed',
63
+ message: `openDirectory for "${editorId}" is missing {dir} placeholder: "${openCmd}"`,
64
+ };
65
+ }
66
+ const resolved = openCmd.replace('{dir}', directoryPath);
67
+ const useShell = entry.spawnOptions?.shell === true;
68
+ const opts = {
69
+ detached: entry.spawnOptions?.detached ?? !useShell,
70
+ stdio: (entry.spawnOptions?.stdio ?? 'ignore'),
71
+ shell: useShell,
72
+ };
73
+ try {
74
+ let child;
75
+ if (useShell) {
76
+ child = spawn(resolved, [], opts);
77
+ }
78
+ else {
79
+ const [command, ...args] = resolved.split(/\s+/);
80
+ child = spawn(command, args, opts);
81
+ }
82
+ if (opts.detached)
83
+ child.unref();
84
+ return {
85
+ ok: true,
86
+ editorName: entry.name,
87
+ worktreePath: directoryPath,
88
+ };
89
+ }
90
+ catch (error) {
91
+ return {
92
+ ok: false,
93
+ code: 'launch_failed',
94
+ message: error instanceof Error ? error.message : 'Failed to launch IDE',
95
+ };
96
+ }
97
+ }
98
+ checkAvailability(editorId) {
99
+ const entry = this.editors.get(editorId);
100
+ if (!entry)
101
+ return Promise.resolve(false);
102
+ const binary = resolvePlatformValue(entry.binary);
103
+ return new Promise((resolve) => {
104
+ execFile('which', [binary], (err) => {
105
+ resolve(!err);
106
+ });
107
+ });
108
+ }
109
+ };
110
+ JsonDrivenIdeLauncherService = __decorate([
111
+ injectable(),
112
+ __metadata("design:paramtypes", [])
113
+ ], JsonDrivenIdeLauncherService);
114
+ export { JsonDrivenIdeLauncherService };
@@ -14,8 +14,8 @@ export interface ToolMetadata {
14
14
  summary: string;
15
15
  /** Detailed description */
16
16
  description: string;
17
- /** Tool category for grouping in listings */
18
- category: 'ide' | 'cli-agent';
17
+ /** Tool tags for grouping in listings. A tool can belong to multiple categories. */
18
+ tags: ('ide' | 'cli-agent')[];
19
19
  /** Binary name to check with 'which' command (string or per-platform map) */
20
20
  binary: string | Record<string, string>;
21
21
  /** Package manager or installation method */
@@ -30,8 +30,24 @@ export interface ToolMetadata {
30
30
  verifyCommand: string;
31
31
  /** Whether the tool supports automated installation (default: true) */
32
32
  autoInstall?: boolean;
33
- /** Command to open a directory in this tool (e.g., "code .") */
34
- openDirectory?: string;
33
+ /** Command to open a directory in this tool.
34
+ * String format: "code {dir}" — single command for all platforms.
35
+ * Object format: { "linux": "antigravity {dir}", "darwin": "agy {dir}" } — per-platform commands. */
36
+ openDirectory?: string | Record<string, string>;
37
+ /** Override default spawn options for the launch process.
38
+ * Defaults: { detached: true, stdio: "ignore" } (GUI IDEs).
39
+ * CLI agents should use { shell: true, stdio: "inherit" } to run in the current terminal. */
40
+ spawnOptions?: {
41
+ shell?: boolean;
42
+ stdio?: 'ignore' | 'inherit' | 'pipe';
43
+ detached?: boolean;
44
+ };
35
45
  }
36
46
  export declare const TOOL_METADATA: Record<string, ToolMetadata>;
47
+ /**
48
+ * Returns entries from TOOL_METADATA that can open a directory as an IDE.
49
+ * A tool qualifies if it has an `openDirectory` field, regardless of category.
50
+ * Each entry is [toolId, metadata].
51
+ */
52
+ export declare function getIdeEntries(): [string, ToolMetadata][];
37
53
  //# sourceMappingURL=tool-metadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,6CAA6C;IAC7C,QAAQ,EAAE,KAAK,GAAG,WAAW,CAAC;IAE9B,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA8CD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAsB,CAAC"}
1
+ {"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,oFAAoF;IACpF,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC;IAE9B,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;yGAEqG;IACrG,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD;;iGAE6F;IAC7F,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AA8CD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAsB,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAExD"}
@@ -14,7 +14,7 @@ const REQUIRED_FIELDS = [
14
14
  'name',
15
15
  'summary',
16
16
  'description',
17
- 'category',
17
+ 'tags',
18
18
  'binary',
19
19
  'packageManager',
20
20
  'commands',
@@ -50,3 +50,11 @@ function loadToolMetadata() {
50
50
  return metadata;
51
51
  }
52
52
  export const TOOL_METADATA = loadToolMetadata();
53
+ /**
54
+ * Returns entries from TOOL_METADATA that can open a directory as an IDE.
55
+ * A tool qualifies if it has an `openDirectory` field, regardless of category.
56
+ * Each entry is [toolId, metadata].
57
+ */
58
+ export function getIdeEntries() {
59
+ return Object.entries(TOOL_METADATA).filter(([, meta]) => meta.openDirectory != null);
60
+ }
@@ -2,7 +2,7 @@
2
2
  "name": "Google Antigravity",
3
3
  "summary": "AI-powered agentic development platform",
4
4
  "description": "Google Antigravity is an AI-powered platform that enables agentic development workflows, helping developers build intelligent applications with autonomous agents.",
5
- "category": "ide",
5
+ "tags": ["ide"],
6
6
  "binary": {
7
7
  "linux": "antigravity",
8
8
  "darwin": "agy"
@@ -16,5 +16,8 @@
16
16
  "documentationUrl": "https://codelabs.developers.google.com/getting-started-google-antigravity",
17
17
  "verifyCommand": "agy --version",
18
18
  "autoInstall": false,
19
- "openDirectory": "agy ."
19
+ "openDirectory": {
20
+ "linux": "antigravity {dir}",
21
+ "darwin": "agy {dir}"
22
+ }
20
23
  }
@@ -2,7 +2,7 @@
2
2
  "name": "Claude Code",
3
3
  "summary": "AI-powered code assistant from Anthropic",
4
4
  "description": "Claude Code is an AI-powered code assistant from Anthropic that helps you write, understand, and debug code with advanced AI capabilities.",
5
- "category": "cli-agent",
5
+ "tags": ["ide", "cli-agent"],
6
6
  "binary": "claude",
7
7
  "packageManager": "curl",
8
8
  "commands": {
@@ -12,5 +12,11 @@
12
12
  "timeout": 300000,
13
13
  "documentationUrl": "https://code.claude.com/docs/en/overview",
14
14
  "verifyCommand": "claude --version",
15
- "autoInstall": true
15
+ "autoInstall": true,
16
+ "openDirectory": "cd {dir} && exec claude",
17
+ "spawnOptions": {
18
+ "shell": true,
19
+ "stdio": "inherit",
20
+ "detached": false
21
+ }
16
22
  }
@@ -2,7 +2,7 @@
2
2
  "name": "Cursor CLI",
3
3
  "summary": "AI-powered terminal coding agent",
4
4
  "description": "Cursor CLI is a terminal-based AI coding agent that brings conversational AI assistance directly to your command line for any IDE or terminal.",
5
- "category": "cli-agent",
5
+ "tags": ["ide", "cli-agent"],
6
6
  "binary": "cursor-agent",
7
7
  "packageManager": "curl",
8
8
  "commands": {
@@ -12,5 +12,11 @@
12
12
  "timeout": 300000,
13
13
  "documentationUrl": "https://www.codecademy.com/article/getting-started-with-cursor-cli",
14
14
  "verifyCommand": "cursor-agent --version",
15
- "autoInstall": true
15
+ "autoInstall": true,
16
+ "openDirectory": "cd {dir} && exec cursor-agent",
17
+ "spawnOptions": {
18
+ "shell": true,
19
+ "stdio": "inherit",
20
+ "detached": false
21
+ }
16
22
  }
@@ -2,7 +2,7 @@
2
2
  "name": "Cursor",
3
3
  "summary": "AI-powered code editor for efficient development",
4
4
  "description": "Cursor is an AI-powered code editor built on VS Code, designed to streamline development workflows with advanced AI-assisted coding capabilities.",
5
- "category": "ide",
5
+ "tags": ["ide"],
6
6
  "binary": "cursor",
7
7
  "packageManager": "manual",
8
8
  "commands": {
@@ -13,5 +13,5 @@
13
13
  "documentationUrl": "https://cursor.com/download",
14
14
  "verifyCommand": "cursor --version",
15
15
  "autoInstall": false,
16
- "openDirectory": "cursor ."
16
+ "openDirectory": "cursor {dir}"
17
17
  }
@@ -2,7 +2,7 @@
2
2
  "name": "Visual Studio Code",
3
3
  "summary": "Lightweight but powerful source code editor",
4
4
  "description": "Microsoft Visual Studio Code is a free, open-source code editor with built-in support for debugging, version control, and extensions for enhanced development workflows.",
5
- "category": "ide",
5
+ "tags": ["ide"],
6
6
  "binary": "code",
7
7
  "packageManager": "apt",
8
8
  "commands": {
@@ -13,5 +13,5 @@
13
13
  "documentationUrl": "https://code.visualstudio.com/docs/setup/linux",
14
14
  "verifyCommand": "code --version --no-sandbox --user-data-dir=/tmp/vscode-test",
15
15
  "autoInstall": true,
16
- "openDirectory": "code ."
16
+ "openDirectory": "code {dir}"
17
17
  }
@@ -2,7 +2,7 @@
2
2
  "name": "Windsurf",
3
3
  "summary": "AI-powered code editor by Codeium",
4
4
  "description": "Windsurf is an AI-powered code editor by Codeium that provides intelligent code assistance and automation features for modern development.",
5
- "category": "ide",
5
+ "tags": ["ide"],
6
6
  "binary": "windsurf",
7
7
  "packageManager": "apt",
8
8
  "commands": {
@@ -13,5 +13,5 @@
13
13
  "documentationUrl": "https://docs.windsurf.com/windsurf/getting-started",
14
14
  "verifyCommand": "windsurf --version --no-sandbox --user-data-dir=/tmp/windsurf-test",
15
15
  "autoInstall": true,
16
- "openDirectory": "windsurf ."
16
+ "openDirectory": "windsurf {dir}"
17
17
  }
@@ -2,7 +2,7 @@
2
2
  "name": "Zed",
3
3
  "summary": "High-performance code editor written in Rust",
4
4
  "description": "Zed is a high-performance code editor written in Rust, designed for speed and collaboration with modern developer workflows.",
5
- "category": "ide",
5
+ "tags": ["ide"],
6
6
  "binary": "zed",
7
7
  "packageManager": "curl",
8
8
  "commands": {
@@ -13,5 +13,5 @@
13
13
  "documentationUrl": "https://zed.dev/docs/installation",
14
14
  "verifyCommand": "zed --version",
15
15
  "autoInstall": true,
16
- "openDirectory": "zed ."
16
+ "openDirectory": "zed {dir}"
17
17
  }
@@ -2,8 +2,10 @@
2
2
  * IDE Open Command
3
3
  *
4
4
  * Opens a feature worktree in the configured IDE.
5
+ * IDE flags (e.g. --vscode, --cursor) are derived dynamically from
6
+ * the JSON tool metadata files in packages/core.
5
7
  *
6
- * Usage: shep ide <feat-id> [--vscode|--cursor|--windsurf|--zed|--antigravity]
8
+ * Usage: shep ide <feat-id> [--<ide-name>]
7
9
  */
8
10
  import { Command } from 'commander';
9
11
  export declare function createIdeOpenCommand(): Command;
@@ -1 +1 @@
1
- {"version":3,"file":"ide-open.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ide-open.command.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsCpC,wBAAgB,oBAAoB,IAAI,OAAO,CAkC9C"}
1
+ {"version":3,"file":"ide-open.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ide-open.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,oBAAoB,IAAI,OAAO,CAwC9C"}