poe-code 0.1.26

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 (245) hide show
  1. package/README.md +64 -0
  2. package/dist/cli/api-client.d.ts +14 -0
  3. package/dist/cli/api-client.js +140 -0
  4. package/dist/cli/api-client.js.map +1 -0
  5. package/dist/cli/chat.d.ts +32 -0
  6. package/dist/cli/chat.js +2 -0
  7. package/dist/cli/chat.js.map +1 -0
  8. package/dist/cli/command-runner.d.ts +2 -0
  9. package/dist/cli/command-runner.js +37 -0
  10. package/dist/cli/command-runner.js.map +1 -0
  11. package/dist/cli/commands/agent.d.ts +18 -0
  12. package/dist/cli/commands/agent.js +84 -0
  13. package/dist/cli/commands/agent.js.map +1 -0
  14. package/dist/cli/commands/configure-agents.d.ts +3 -0
  15. package/dist/cli/commands/configure-agents.js +72 -0
  16. package/dist/cli/commands/configure-agents.js.map +1 -0
  17. package/dist/cli/commands/configure.d.ts +11 -0
  18. package/dist/cli/commands/configure.js +150 -0
  19. package/dist/cli/commands/configure.js.map +1 -0
  20. package/dist/cli/commands/init.d.ts +8 -0
  21. package/dist/cli/commands/init.js +45 -0
  22. package/dist/cli/commands/init.js.map +1 -0
  23. package/dist/cli/commands/interactive.d.ts +3 -0
  24. package/dist/cli/commands/interactive.js +17 -0
  25. package/dist/cli/commands/interactive.js.map +1 -0
  26. package/dist/cli/commands/login.d.ts +6 -0
  27. package/dist/cli/commands/login.js +51 -0
  28. package/dist/cli/commands/login.js.map +1 -0
  29. package/dist/cli/commands/logout.d.ts +3 -0
  30. package/dist/cli/commands/logout.js +31 -0
  31. package/dist/cli/commands/logout.js.map +1 -0
  32. package/dist/cli/commands/prerequisites.d.ts +3 -0
  33. package/dist/cli/commands/prerequisites.js +23 -0
  34. package/dist/cli/commands/prerequisites.js.map +1 -0
  35. package/dist/cli/commands/query.d.ts +7 -0
  36. package/dist/cli/commands/query.js +46 -0
  37. package/dist/cli/commands/query.js.map +1 -0
  38. package/dist/cli/commands/remove.d.ts +6 -0
  39. package/dist/cli/commands/remove.js +80 -0
  40. package/dist/cli/commands/remove.js.map +1 -0
  41. package/dist/cli/commands/root.d.ts +3 -0
  42. package/dist/cli/commands/root.js +7 -0
  43. package/dist/cli/commands/root.js.map +1 -0
  44. package/dist/cli/commands/shared.d.ts +24 -0
  45. package/dist/cli/commands/shared.js +61 -0
  46. package/dist/cli/commands/shared.js.map +1 -0
  47. package/dist/cli/commands/spawn-worktree.d.ts +6 -0
  48. package/dist/cli/commands/spawn-worktree.js +91 -0
  49. package/dist/cli/commands/spawn-worktree.js.map +1 -0
  50. package/dist/cli/commands/spawn.d.ts +7 -0
  51. package/dist/cli/commands/spawn.js +112 -0
  52. package/dist/cli/commands/spawn.js.map +1 -0
  53. package/dist/cli/commands/test.d.ts +6 -0
  54. package/dist/cli/commands/test.js +26 -0
  55. package/dist/cli/commands/test.js.map +1 -0
  56. package/dist/cli/constants.d.ts +10 -0
  57. package/dist/cli/constants.js +11 -0
  58. package/dist/cli/constants.js.map +1 -0
  59. package/dist/cli/container.d.ts +48 -0
  60. package/dist/cli/container.js +94 -0
  61. package/dist/cli/container.js.map +1 -0
  62. package/dist/cli/context.d.ts +37 -0
  63. package/dist/cli/context.js +198 -0
  64. package/dist/cli/context.js.map +1 -0
  65. package/dist/cli/environment.d.ts +19 -0
  66. package/dist/cli/environment.js +26 -0
  67. package/dist/cli/environment.js.map +1 -0
  68. package/dist/cli/error-logger.d.ts +46 -0
  69. package/dist/cli/error-logger.js +137 -0
  70. package/dist/cli/error-logger.js.map +1 -0
  71. package/dist/cli/errors.d.ts +91 -0
  72. package/dist/cli/errors.js +128 -0
  73. package/dist/cli/errors.js.map +1 -0
  74. package/dist/cli/file-mentions.d.ts +13 -0
  75. package/dist/cli/file-mentions.js +87 -0
  76. package/dist/cli/file-mentions.js.map +1 -0
  77. package/dist/cli/file-picker-state.d.ts +14 -0
  78. package/dist/cli/file-picker-state.js +23 -0
  79. package/dist/cli/file-picker-state.js.map +1 -0
  80. package/dist/cli/http.d.ts +11 -0
  81. package/dist/cli/http.js +2 -0
  82. package/dist/cli/http.js.map +1 -0
  83. package/dist/cli/interactive-command-runner.d.ts +11 -0
  84. package/dist/cli/interactive-command-runner.js +142 -0
  85. package/dist/cli/interactive-command-runner.js.map +1 -0
  86. package/dist/cli/interactive-launcher.d.ts +2 -0
  87. package/dist/cli/interactive-launcher.js +404 -0
  88. package/dist/cli/interactive-launcher.js.map +1 -0
  89. package/dist/cli/interactive-tasks.d.ts +7 -0
  90. package/dist/cli/interactive-tasks.js +199 -0
  91. package/dist/cli/interactive-tasks.js.map +1 -0
  92. package/dist/cli/interactive.d.ts +19 -0
  93. package/dist/cli/interactive.js +479 -0
  94. package/dist/cli/interactive.js.map +1 -0
  95. package/dist/cli/logger.d.ts +26 -0
  96. package/dist/cli/logger.js +87 -0
  97. package/dist/cli/logger.js.map +1 -0
  98. package/dist/cli/markdown-renderer.d.ts +27 -0
  99. package/dist/cli/markdown-renderer.js +178 -0
  100. package/dist/cli/markdown-renderer.js.map +1 -0
  101. package/dist/cli/markdown-renderer.test.d.ts +1 -0
  102. package/dist/cli/markdown-renderer.test.js +105 -0
  103. package/dist/cli/markdown-renderer.test.js.map +1 -0
  104. package/dist/cli/options.d.ts +30 -0
  105. package/dist/cli/options.js +84 -0
  106. package/dist/cli/options.js.map +1 -0
  107. package/dist/cli/program.d.ts +4 -0
  108. package/dist/cli/program.js +64 -0
  109. package/dist/cli/program.js.map +1 -0
  110. package/dist/cli/prompts.d.ts +23 -0
  111. package/dist/cli/prompts.js +58 -0
  112. package/dist/cli/prompts.js.map +1 -0
  113. package/dist/cli/service-registry.d.ts +33 -0
  114. package/dist/cli/service-registry.js +35 -0
  115. package/dist/cli/service-registry.js.map +1 -0
  116. package/dist/cli/telemetry.d.ts +15 -0
  117. package/dist/cli/telemetry.js +45 -0
  118. package/dist/cli/telemetry.js.map +1 -0
  119. package/dist/cli/types.d.ts +2 -0
  120. package/dist/cli/types.js +2 -0
  121. package/dist/cli/types.js.map +1 -0
  122. package/dist/commands/init.d.ts +9 -0
  123. package/dist/commands/init.js +43 -0
  124. package/dist/commands/init.js.map +1 -0
  125. package/dist/commands/publish-placeholder.d.ts +8 -0
  126. package/dist/commands/publish-placeholder.js +50 -0
  127. package/dist/commands/publish-placeholder.js.map +1 -0
  128. package/dist/commands/spawn-worktree.d.ts +25 -0
  129. package/dist/commands/spawn-worktree.js +139 -0
  130. package/dist/commands/spawn-worktree.js.map +1 -0
  131. package/dist/index.d.ts +4 -0
  132. package/dist/index.js +81 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/providers/claude-code-adapter.d.ts +20 -0
  135. package/dist/providers/claude-code-adapter.js +48 -0
  136. package/dist/providers/claude-code-adapter.js.map +1 -0
  137. package/dist/providers/codex-adapter.d.ts +19 -0
  138. package/dist/providers/codex-adapter.js +49 -0
  139. package/dist/providers/codex-adapter.js.map +1 -0
  140. package/dist/providers/index.d.ts +2 -0
  141. package/dist/providers/index.js +13 -0
  142. package/dist/providers/index.js.map +1 -0
  143. package/dist/providers/opencode-adapter.d.ts +18 -0
  144. package/dist/providers/opencode-adapter.js +45 -0
  145. package/dist/providers/opencode-adapter.js.map +1 -0
  146. package/dist/providers/roo-code-adapter.d.ts +19 -0
  147. package/dist/providers/roo-code-adapter.js +70 -0
  148. package/dist/providers/roo-code-adapter.js.map +1 -0
  149. package/dist/services/agent-config-manager.d.ts +32 -0
  150. package/dist/services/agent-config-manager.js +130 -0
  151. package/dist/services/agent-config-manager.js.map +1 -0
  152. package/dist/services/agent-registry.d.ts +27 -0
  153. package/dist/services/agent-registry.js +89 -0
  154. package/dist/services/agent-registry.js.map +1 -0
  155. package/dist/services/agent-session.d.ts +24 -0
  156. package/dist/services/agent-session.js +107 -0
  157. package/dist/services/agent-session.js.map +1 -0
  158. package/dist/services/agent-task-registry.d.ts +131 -0
  159. package/dist/services/agent-task-registry.js +491 -0
  160. package/dist/services/agent-task-registry.js.map +1 -0
  161. package/dist/services/chat.d.ts +94 -0
  162. package/dist/services/chat.js +241 -0
  163. package/dist/services/chat.js.map +1 -0
  164. package/dist/services/claude-code.d.ts +28 -0
  165. package/dist/services/claude-code.js +155 -0
  166. package/dist/services/claude-code.js.map +1 -0
  167. package/dist/services/codex.d.ts +27 -0
  168. package/dist/services/codex.js +231 -0
  169. package/dist/services/codex.js.map +1 -0
  170. package/dist/services/credentials.d.ts +11 -0
  171. package/dist/services/credentials.js +44 -0
  172. package/dist/services/credentials.js.map +1 -0
  173. package/dist/services/mcp-client.d.ts +38 -0
  174. package/dist/services/mcp-client.js +170 -0
  175. package/dist/services/mcp-client.js.map +1 -0
  176. package/dist/services/mcp-manager.d.ts +28 -0
  177. package/dist/services/mcp-manager.js +157 -0
  178. package/dist/services/mcp-manager.js.map +1 -0
  179. package/dist/services/model-strategy.d.ts +99 -0
  180. package/dist/services/model-strategy.js +182 -0
  181. package/dist/services/model-strategy.js.map +1 -0
  182. package/dist/services/opencode.d.ts +25 -0
  183. package/dist/services/opencode.js +161 -0
  184. package/dist/services/opencode.js.map +1 -0
  185. package/dist/services/poe-code.d.ts +7 -0
  186. package/dist/services/poe-code.js +5 -0
  187. package/dist/services/poe-code.js.map +1 -0
  188. package/dist/services/roo-code.d.ts +22 -0
  189. package/dist/services/roo-code.js +134 -0
  190. package/dist/services/roo-code.js.map +1 -0
  191. package/dist/services/service-install.d.ts +21 -0
  192. package/dist/services/service-install.js +47 -0
  193. package/dist/services/service-install.js.map +1 -0
  194. package/dist/services/service-manifest.d.ts +122 -0
  195. package/dist/services/service-manifest.js +368 -0
  196. package/dist/services/service-manifest.js.map +1 -0
  197. package/dist/services/task-logger.d.ts +24 -0
  198. package/dist/services/task-logger.js +73 -0
  199. package/dist/services/task-logger.js.map +1 -0
  200. package/dist/services/task-runner.d.ts +19 -0
  201. package/dist/services/task-runner.js +157 -0
  202. package/dist/services/task-runner.js.map +1 -0
  203. package/dist/services/tools.d.ts +76 -0
  204. package/dist/services/tools.js +870 -0
  205. package/dist/services/tools.js.map +1 -0
  206. package/dist/templates/claude-code/anthropic_key.sh.hbs +2 -0
  207. package/dist/templates/codex/config.toml.hbs +9 -0
  208. package/dist/templates/python/env.hbs +3 -0
  209. package/dist/templates/python/main.py.hbs +17 -0
  210. package/dist/templates/python/requirements.txt.hbs +2 -0
  211. package/dist/utils/backup.d.ts +5 -0
  212. package/dist/utils/backup.js +61 -0
  213. package/dist/utils/backup.js.map +1 -0
  214. package/dist/utils/command-line.d.ts +1 -0
  215. package/dist/utils/command-line.js +54 -0
  216. package/dist/utils/command-line.js.map +1 -0
  217. package/dist/utils/dry-run.d.ts +38 -0
  218. package/dist/utils/dry-run.js +211 -0
  219. package/dist/utils/dry-run.js.map +1 -0
  220. package/dist/utils/e2e-flags.d.ts +1 -0
  221. package/dist/utils/e2e-flags.js +9 -0
  222. package/dist/utils/e2e-flags.js.map +1 -0
  223. package/dist/utils/file-system.d.ts +21 -0
  224. package/dist/utils/file-system.js +2 -0
  225. package/dist/utils/file-system.js.map +1 -0
  226. package/dist/utils/json.d.ts +12 -0
  227. package/dist/utils/json.js +42 -0
  228. package/dist/utils/json.js.map +1 -0
  229. package/dist/utils/prerequisites.d.ts +41 -0
  230. package/dist/utils/prerequisites.js +92 -0
  231. package/dist/utils/prerequisites.js.map +1 -0
  232. package/dist/utils/templates.d.ts +4 -0
  233. package/dist/utils/templates.js +22 -0
  234. package/dist/utils/templates.js.map +1 -0
  235. package/dist/utils/toml.d.ts +8 -0
  236. package/dist/utils/toml.js +30 -0
  237. package/dist/utils/toml.js.map +1 -0
  238. package/dist/utils/worktree.d.ts +40 -0
  239. package/dist/utils/worktree.js +179 -0
  240. package/dist/utils/worktree.js.map +1 -0
  241. package/package.json +84 -0
  242. package/shared/conversation-layout.cjs +11 -0
  243. package/shared/conversation-layout.d.ts +7 -0
  244. package/shared/conversation-layout.js +11 -0
  245. package/shared/package.json +13 -0
@@ -0,0 +1,33 @@
1
+ import type { CliEnvironment } from "./environment.js";
2
+ import type { CommandContext } from "./context.js";
3
+ import type { ScopedLogger } from "./logger.js";
4
+ import type { ProviderOperation, TelemetryClient } from "./telemetry.js";
5
+ export interface ProviderContext<TPaths = Record<string, string>> {
6
+ env: CliEnvironment;
7
+ paths: TPaths;
8
+ command: CommandContext;
9
+ logger: ScopedLogger;
10
+ }
11
+ export interface ProviderAdapter<TPaths = Record<string, string>, TConfigure = unknown, TRemove = unknown, TSpawn = unknown> {
12
+ name: string;
13
+ label: string;
14
+ supportsSpawn?: boolean;
15
+ resolvePaths(env: CliEnvironment): TPaths;
16
+ registerPrerequisites?: (manager: CommandContext["prerequisites"]) => void;
17
+ install?: (context: ProviderContext<TPaths>) => Promise<void> | void;
18
+ configure?: (context: ProviderContext<TPaths>, options: TConfigure) => Promise<void> | void;
19
+ remove?: (context: ProviderContext<TPaths>, options: TRemove) => Promise<boolean | void> | boolean | void;
20
+ spawn?: (context: ProviderContext<TPaths>, options: TSpawn) => Promise<unknown>;
21
+ }
22
+ export interface ServiceRegistry {
23
+ register(adapter: ProviderAdapter): void;
24
+ discover(adapters: ProviderAdapter[]): void;
25
+ get(name: string): ProviderAdapter | undefined;
26
+ require(name: string): ProviderAdapter;
27
+ list(): ProviderAdapter[];
28
+ invoke<T>(serviceName: string, operation: ProviderOperation, runner: (adapter: ProviderAdapter) => Promise<T>): Promise<T>;
29
+ }
30
+ export interface ServiceRegistryInit {
31
+ telemetry?: TelemetryClient;
32
+ }
33
+ export declare function createServiceRegistry(init?: ServiceRegistryInit): ServiceRegistry;
@@ -0,0 +1,35 @@
1
+ export function createServiceRegistry(init = {}) {
2
+ const adapters = new Map();
3
+ const register = (adapter) => {
4
+ if (adapters.has(adapter.name)) {
5
+ throw new Error(`Provider "${adapter.name}" is already registered.`);
6
+ }
7
+ adapters.set(adapter.name, adapter);
8
+ };
9
+ const discover = (candidates) => {
10
+ for (const candidate of candidates) {
11
+ if (adapters.has(candidate.name)) {
12
+ continue;
13
+ }
14
+ adapters.set(candidate.name, candidate);
15
+ }
16
+ };
17
+ const get = (name) => adapters.get(name);
18
+ const require = (name) => {
19
+ const adapter = adapters.get(name);
20
+ if (!adapter) {
21
+ throw new Error(`Unknown provider "${name}".`);
22
+ }
23
+ return adapter;
24
+ };
25
+ const list = () => Array.from(adapters.values());
26
+ const invoke = async (serviceName, operation, runner) => {
27
+ const adapter = require(serviceName);
28
+ if (init.telemetry) {
29
+ return await init.telemetry.wrap(serviceName, operation, () => runner(adapter));
30
+ }
31
+ return await runner(adapter);
32
+ };
33
+ return { register, discover, get, require, list, invoke };
34
+ }
35
+ //# sourceMappingURL=service-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-registry.js","sourceRoot":"","sources":["../../src/cli/service-registry.ts"],"names":[],"mappings":"AAyDA,MAAM,UAAU,qBAAqB,CACnC,OAA4B,EAAE;IAE9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEpD,MAAM,QAAQ,GAAG,CAAC,OAAwB,EAAQ,EAAE;QAClD,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,CAAC,IAAI,0BAA0B,CAAC,CAAC;QACvE,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,UAA6B,EAAQ,EAAE;QACvD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,IAAY,EAA+B,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAE9E,MAAM,OAAO,GAAG,CAAC,IAAY,EAAmB,EAAE;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAsB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,KAAK,EAClB,WAAmB,EACnB,SAA4B,EAC5B,MAAgD,EACpC,EAAE;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,EAAE,CAC5D,MAAM,CAAC,OAAO,CAAC,CAChB,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ScopedLogger } from "./logger.js";
2
+ export type ProviderOperation = "install" | "configure" | "remove" | "spawn" | "prerequisites";
3
+ export type TelemetryStatus = "success" | "failure";
4
+ export interface TelemetryEvent {
5
+ service: string;
6
+ operation: ProviderOperation;
7
+ status: TelemetryStatus;
8
+ durationMs: number;
9
+ error?: unknown;
10
+ }
11
+ export interface TelemetryClient {
12
+ record(event: TelemetryEvent): void;
13
+ wrap<T>(service: string, operation: ProviderOperation, task: () => Promise<T>): Promise<T>;
14
+ }
15
+ export declare function createTelemetryClient(logger: ScopedLogger): TelemetryClient;
@@ -0,0 +1,45 @@
1
+ export function createTelemetryClient(logger) {
2
+ const record = (event) => {
3
+ const prefix = `${event.operation}:${event.service}`;
4
+ const suffix = event.status === "success"
5
+ ? `completed in ${event.durationMs.toFixed(0)}ms`
6
+ : `failed in ${event.durationMs.toFixed(0)}ms`;
7
+ const message = `${prefix} ${suffix}`;
8
+ if (event.status === "success") {
9
+ logger.verbose(message);
10
+ }
11
+ else {
12
+ logger.error(message);
13
+ if (event.error) {
14
+ logger.error(event.error instanceof Error
15
+ ? event.error.message
16
+ : String(event.error));
17
+ }
18
+ }
19
+ };
20
+ const wrap = async (service, operation, task) => {
21
+ const start = Date.now();
22
+ try {
23
+ const result = await task();
24
+ record({
25
+ service,
26
+ operation,
27
+ status: "success",
28
+ durationMs: Date.now() - start
29
+ });
30
+ return result;
31
+ }
32
+ catch (error) {
33
+ record({
34
+ service,
35
+ operation,
36
+ status: "failure",
37
+ durationMs: Date.now() - start,
38
+ error
39
+ });
40
+ throw error;
41
+ }
42
+ };
43
+ return { record, wrap };
44
+ }
45
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/cli/telemetry.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,MAAM,MAAM,GAAG,CAAC,KAAqB,EAAQ,EAAE;QAC7C,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,SAAS;YACxB,CAAC,CAAC,gBAAgB,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACjD,CAAC,CAAC,aAAa,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,MAAM,OAAO,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CACV,KAAK,CAAC,KAAK,YAAY,KAAK;oBAC1B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO;oBACrB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CACxB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,EAChB,OAAe,EACf,SAA4B,EAC5B,IAAsB,EACV,EAAE;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;YAC5B,MAAM,CAAC;gBACL,OAAO;gBACP,SAAS;gBACT,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC;gBACL,OAAO;gBACP,SAAS;gBACT,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC9B,KAAK;aACN,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type PromptFn = (questions: unknown) => Promise<Record<string, unknown>>;
2
+ export type LoggerFn = (message: string) => void;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import type { FileSystem } from "../utils/file-system.js";
2
+ export interface InitOptions {
3
+ fs: FileSystem;
4
+ cwd: string;
5
+ projectName: string;
6
+ apiKey: string;
7
+ model: string;
8
+ }
9
+ export declare function initProject(options: InitOptions): Promise<void>;
@@ -0,0 +1,43 @@
1
+ import path from "node:path";
2
+ import { renderTemplate } from "../utils/templates.js";
3
+ export async function initProject(options) {
4
+ const { fs, cwd, projectName, apiKey, model } = options;
5
+ const projectDir = path.join(cwd, projectName);
6
+ if (await pathExists(fs, projectDir)) {
7
+ throw new Error(`Project directory "${projectName}" already exists`);
8
+ }
9
+ await fs.mkdir(projectDir, { recursive: true });
10
+ await Promise.all([
11
+ writeTemplate(fs, projectDir, ".env", "python/env.hbs", { apiKey, model }),
12
+ writeTemplate(fs, projectDir, "main.py", "python/main.py.hbs", {
13
+ apiKey,
14
+ model
15
+ }),
16
+ writeTemplate(fs, projectDir, "requirements.txt", "python/requirements.txt.hbs", {})
17
+ ]);
18
+ }
19
+ async function writeTemplate(fs, projectDir, filename, templatePath, context) {
20
+ const rendered = await renderTemplate(templatePath, context);
21
+ await fs.writeFile(path.join(projectDir, filename), rendered, {
22
+ encoding: "utf8"
23
+ });
24
+ }
25
+ async function pathExists(fs, target) {
26
+ try {
27
+ await fs.stat(target);
28
+ return true;
29
+ }
30
+ catch (error) {
31
+ if (isNotFound(error)) {
32
+ return false;
33
+ }
34
+ throw error;
35
+ }
36
+ }
37
+ function isNotFound(error) {
38
+ return (typeof error === "object" &&
39
+ error !== null &&
40
+ "code" in error &&
41
+ error.code === "ENOENT");
42
+ }
43
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAUvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAE/C,IAAI,MAAM,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,sBAAsB,WAAW,kBAAkB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC1E,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE;YAC7D,MAAM;YACN,KAAK;SACN,CAAC;QACF,aAAa,CACX,EAAE,EACF,UAAU,EACV,kBAAkB,EAClB,6BAA6B,EAC7B,EAAE,CACH;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,EAAc,EACd,UAAkB,EAClB,QAAgB,EAChB,YAAoB,EACpB,OAAgC;IAEhC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE;QAC5D,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,EAAc,EAAE,MAAc;IACtD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACd,KAA2B,CAAC,IAAI,KAAK,QAAQ,CAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { FileSystem } from "../utils/file-system.js";
2
+ export interface PreparePlaceholderPackageOptions {
3
+ fs: FileSystem;
4
+ targetDir: string;
5
+ packageName: string;
6
+ version?: string;
7
+ }
8
+ export declare function preparePlaceholderPackage(options: PreparePlaceholderPackageOptions): Promise<void>;
@@ -0,0 +1,50 @@
1
+ import path from "node:path";
2
+ const DEFAULT_VERSION = "0.0.0-placeholder";
3
+ export async function preparePlaceholderPackage(options) {
4
+ const { fs, targetDir, packageName, version = DEFAULT_VERSION } = options;
5
+ await fs.mkdir(targetDir, { recursive: true });
6
+ const manifestPath = path.join(targetDir, "package.json");
7
+ const manifest = JSON.stringify(createManifest(packageName, version), null, 2);
8
+ await fs.writeFile(manifestPath, `${manifest}\n`, { encoding: "utf8" });
9
+ const entryPath = path.join(targetDir, "index.js");
10
+ await fs.writeFile(entryPath, createEntryPoint(packageName), {
11
+ encoding: "utf8"
12
+ });
13
+ const readmePath = path.join(targetDir, "README.md");
14
+ await fs.writeFile(readmePath, createReadme(packageName), {
15
+ encoding: "utf8"
16
+ });
17
+ }
18
+ function createManifest(packageName, version) {
19
+ return {
20
+ name: packageName,
21
+ version,
22
+ description: `Placeholder release for ${packageName} to reserve the package name.`,
23
+ bin: {
24
+ [packageName]: "index.js"
25
+ },
26
+ files: ["index.js", "README.md"],
27
+ keywords: ["placeholder"],
28
+ license: "MIT"
29
+ };
30
+ }
31
+ function createEntryPoint(packageName) {
32
+ const message = `Placeholder release for ${packageName}. Full CLI coming soon.`;
33
+ return [
34
+ "#!/usr/bin/env node",
35
+ `'use strict';`,
36
+ "",
37
+ `console.log("${message}");`,
38
+ ""
39
+ ].join("\n");
40
+ }
41
+ function createReadme(packageName) {
42
+ return [
43
+ `# ${packageName}`,
44
+ "",
45
+ `This is a placeholder release published to reserve the \`${packageName}\` package name.`,
46
+ "",
47
+ "The full CLI will be published once it is ready. Stay tuned!"
48
+ ].join("\n");
49
+ }
50
+ //# sourceMappingURL=publish-placeholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-placeholder.js","sourceRoot":"","sources":["../../src/commands/publish-placeholder.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAyC;IAEzC,MAAM,EACJ,EAAE,EACF,SAAS,EACT,WAAW,EACX,OAAO,GAAG,eAAe,EAC1B,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAC7B,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,EACpC,IAAI,EACJ,CAAC,CACF,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAExE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE;QAC3D,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE;QACxD,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,WAAmB,EAAE,OAAe;IAC1D,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO;QACP,WAAW,EAAE,2BAA2B,WAAW,+BAA+B;QAClF,GAAG,EAAE;YACH,CAAC,WAAW,CAAC,EAAE,UAAU;SAC1B;QACD,KAAK,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;QAChC,QAAQ,EAAE,CAAC,aAAa,CAAC;QACzB,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,OAAO,GAAG,2BAA2B,WAAW,yBAAyB,CAAC;IAChF,OAAO;QACL,qBAAqB;QACrB,eAAe;QACf,EAAE;QACF,gBAAgB,OAAO,KAAK;QAC5B,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,WAAmB;IACvC,OAAO;QACL,KAAK,WAAW,EAAE;QAClB,EAAE;QACF,4DAA4D,WAAW,kBAAkB;QACzF,EAAE;QACF,8DAA8D;KAC/D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { CommandRunnerResult } from "../utils/prerequisites.js";
2
+ import { createWorktree as createWorktreeDefault, getChanges as getChangesDefault, isGitRepository as isGitRepositoryDefault, mergeChanges as mergeChangesDefault } from "../utils/worktree.js";
3
+ interface SpawnGitWorktreeDependencies {
4
+ isGitRepository: typeof isGitRepositoryDefault;
5
+ createWorktree: typeof createWorktreeDefault;
6
+ getChanges: typeof getChangesDefault;
7
+ mergeChanges: typeof mergeChangesDefault;
8
+ }
9
+ interface SpawnGitWorktreeOptions {
10
+ agent: string;
11
+ prompt: string;
12
+ agentArgs: string[];
13
+ basePath: string;
14
+ targetBranch: string;
15
+ runAgent: (input: {
16
+ agent: string;
17
+ prompt: string;
18
+ args: string[];
19
+ cwd: string;
20
+ }) => Promise<CommandRunnerResult>;
21
+ logger: (message: string) => void;
22
+ dependencies?: Partial<SpawnGitWorktreeDependencies>;
23
+ }
24
+ export declare function spawnGitWorktree(options: SpawnGitWorktreeOptions): Promise<void>;
25
+ export {};
@@ -0,0 +1,139 @@
1
+ import { createWorktree as createWorktreeDefault, getChanges as getChangesDefault, isGitRepository as isGitRepositoryDefault, mergeChanges as mergeChangesDefault } from "../utils/worktree.js";
2
+ const defaultDependencies = {
3
+ isGitRepository: isGitRepositoryDefault,
4
+ createWorktree: createWorktreeDefault,
5
+ getChanges: getChangesDefault,
6
+ mergeChanges: mergeChangesDefault
7
+ };
8
+ function resolveDependencies(overrides) {
9
+ if (!overrides) {
10
+ return defaultDependencies;
11
+ }
12
+ return {
13
+ isGitRepository: overrides.isGitRepository ?? defaultDependencies.isGitRepository,
14
+ createWorktree: overrides.createWorktree ?? defaultDependencies.createWorktree,
15
+ getChanges: overrides.getChanges ?? defaultDependencies.getChanges,
16
+ mergeChanges: overrides.mergeChanges ?? defaultDependencies.mergeChanges
17
+ };
18
+ }
19
+ export async function spawnGitWorktree(options) {
20
+ const deps = resolveDependencies(options.dependencies);
21
+ const isRepo = await deps.isGitRepository(options.basePath);
22
+ if (!isRepo) {
23
+ throw new Error(`"${options.basePath}" is not a git repository.`);
24
+ }
25
+ const context = await deps.createWorktree(options.basePath);
26
+ let shouldCleanup = false;
27
+ const preserveAndThrow = (message, cause) => {
28
+ options.logger(`Worktree preserved at ${context.path}`);
29
+ const base = cause instanceof Error
30
+ ? cause
31
+ : cause
32
+ ? new Error(String(cause))
33
+ : undefined;
34
+ const wrapped = new Error(message);
35
+ if (base) {
36
+ wrapped.cause = base;
37
+ }
38
+ wrapped.worktreeLogged = true;
39
+ throw wrapped;
40
+ };
41
+ try {
42
+ const initialResult = await runAgentWithContext({
43
+ ...options,
44
+ context
45
+ });
46
+ const trimmedStdout = initialResult.stdout.trim();
47
+ if (trimmedStdout.length > 0) {
48
+ options.logger(trimmedStdout);
49
+ }
50
+ const trimmedStderr = initialResult.stderr.trim();
51
+ if (trimmedStderr.length > 0) {
52
+ options.logger(trimmedStderr);
53
+ }
54
+ if (initialResult.exitCode !== 0) {
55
+ return preserveAndThrow("Agent execution failed", initialResult);
56
+ }
57
+ const mergeResult = await deps.mergeChanges(context.path, options.targetBranch);
58
+ if (mergeResult.outcome === "conflict") {
59
+ await handleConflicts({
60
+ options,
61
+ context,
62
+ mergeResult,
63
+ dependencies: deps
64
+ });
65
+ shouldCleanup = true;
66
+ return;
67
+ }
68
+ if (mergeResult.outcome === "no-changes") {
69
+ options.logger("No changes detected; nothing to merge.");
70
+ shouldCleanup = true;
71
+ return;
72
+ }
73
+ shouldCleanup = true;
74
+ options.logger("Worktree changes merged successfully.");
75
+ }
76
+ catch (error) {
77
+ if (error instanceof Error &&
78
+ error.worktreeLogged) {
79
+ throw error;
80
+ }
81
+ preserveAndThrow(error instanceof Error ? error.message : "Unexpected failure", error);
82
+ }
83
+ finally {
84
+ if (shouldCleanup) {
85
+ await context.cleanup();
86
+ }
87
+ }
88
+ }
89
+ async function runAgentWithContext(input) {
90
+ const { agent, prompt, agentArgs, runAgent, context } = input;
91
+ const previousCwd = process.cwd();
92
+ let changedDirectory = false;
93
+ try {
94
+ process.chdir(context.path);
95
+ changedDirectory = true;
96
+ }
97
+ catch (error) {
98
+ if (!(error instanceof Error) ||
99
+ error.code !== "ERR_WORKER_UNSUPPORTED_OPERATION") {
100
+ throw error;
101
+ }
102
+ }
103
+ try {
104
+ return await runAgent({
105
+ agent,
106
+ prompt,
107
+ args: agentArgs,
108
+ cwd: context.path
109
+ });
110
+ }
111
+ finally {
112
+ if (changedDirectory) {
113
+ process.chdir(previousCwd);
114
+ }
115
+ }
116
+ }
117
+ async function handleConflicts(input) {
118
+ const { options, context, mergeResult, dependencies } = input;
119
+ const files = mergeResult.files.join(", ");
120
+ options.logger(`Merge conflicts detected in: ${files}`);
121
+ options.logger("Attempting automated conflict resolution.");
122
+ const resolutionPrompt = `Merge conflicts in: ${files}. Resolve using git commands.`;
123
+ const resolutionResult = await runAgentWithContext({
124
+ agent: options.agent,
125
+ prompt: resolutionPrompt,
126
+ agentArgs: options.agentArgs,
127
+ runAgent: options.runAgent,
128
+ context
129
+ });
130
+ if (resolutionResult.exitCode !== 0) {
131
+ throw new Error("Agent execution failed during conflict resolution.");
132
+ }
133
+ const finalMerge = await dependencies.mergeChanges(context.path, options.targetBranch);
134
+ if (finalMerge.outcome !== "merged" && finalMerge.outcome !== "no-changes") {
135
+ throw new Error("Merge failed after conflict resolution.");
136
+ }
137
+ options.logger("Conflicts resolved and merged successfully.");
138
+ }
139
+ //# sourceMappingURL=spawn-worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-worktree.js","sourceRoot":"","sources":["../../src/commands/spawn-worktree.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,IAAI,qBAAqB,EACvC,UAAU,IAAI,iBAAiB,EAC/B,eAAe,IAAI,sBAAsB,EACzC,YAAY,IAAI,mBAAmB,EAGpC,MAAM,sBAAsB,CAAC;AAyB9B,MAAM,mBAAmB,GAAiC;IACxD,eAAe,EAAE,sBAAsB;IACvC,cAAc,EAAE,qBAAqB;IACrC,UAAU,EAAE,iBAAiB;IAC7B,YAAY,EAAE,mBAAmB;CAClC,CAAC;AAEF,SAAS,mBAAmB,CAC1B,SAAiD;IAEjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACD,OAAO;QACL,eAAe,EACb,SAAS,CAAC,eAAe,IAAI,mBAAmB,CAAC,eAAe;QAClE,cAAc,EAAE,SAAS,CAAC,cAAc,IAAI,mBAAmB,CAAC,cAAc;QAC9E,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,mBAAmB,CAAC,UAAU;QAClE,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,mBAAmB,CAAC,YAAY;KACzE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAgC;IAEhC,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,4BAA4B,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5D,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,KAAe,EAAE,EAAE;QAC5D,OAAO,CAAC,MAAM,CAAC,yBAAyB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,IAAI,GACR,KAAK,YAAY,KAAK;YACpB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1B,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,IAAI,EAAE,CAAC;YACR,OAA+B,CAAC,KAAK,GAAG,IAAI,CAAC;QAChD,CAAC;QACA,OAAwC,CAAC,cAAc,GAAG,IAAI,CAAC;QAChE,MAAM,OAAO,CAAC;IAChB,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC;YAC9C,GAAG,OAAO;YACV,OAAO;SACR,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,aAAa,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,gBAAgB,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,CACzC,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,YAAY,CACrB,CAAC;QACF,IAAI,WAAW,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,eAAe,CAAC;gBACpB,OAAO;gBACP,OAAO;gBACP,WAAW;gBACX,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACH,aAAa,GAAG,IAAI,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,WAAW,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;YACzC,OAAO,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC;YACzD,aAAa,GAAG,IAAI,CAAC;YACrB,OAAO;QACT,CAAC;QAED,aAAa,GAAG,IAAI,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACrB,KAAsC,CAAC,cAAc,EACtD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,gBAAgB,CACd,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,EAC7D,KAAK,CACN,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAMlC;IACC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,gBAAgB,GAAG,IAAI,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;YACxB,KAA+B,CAAC,IAAI,KAAK,kCAAkC,EAC5E,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC;YACpB,KAAK;YACL,MAAM;YACN,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,OAAO,CAAC,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,KAK9B;IACC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC;IAE5D,MAAM,gBAAgB,GAAG,uBAAuB,KAAK,+BAA+B,CAAC;IACrF,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC;QACjD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,gBAAgB;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO;KACR,CAAC,CAAC;IACH,IAAI,gBAAgB,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,YAAY,CAChD,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,YAAY,CACrB,CAAC;IACF,IAAI,UAAU,CAAC,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ declare function main(): Promise<void>;
3
+ declare function isCliInvocation(argv: string[], moduleUrl: string, realpath?: (path: string) => string): boolean;
4
+ export { main, isCliInvocation };
package/dist/index.js ADDED
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ import * as nodeFs from "node:fs/promises";
3
+ import * as nodeFsSync from "node:fs";
4
+ import { realpathSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { pathToFileURL } from "node:url";
7
+ import { join } from "node:path";
8
+ import prompts from "prompts";
9
+ import { createProgram } from "./cli/program.js";
10
+ import { ErrorLogger } from "./cli/error-logger.js";
11
+ import { CliError } from "./cli/errors.js";
12
+ const fsAdapter = nodeFs;
13
+ async function main() {
14
+ const homeDir = homedir();
15
+ const logDir = join(homeDir, ".poe-code", "logs");
16
+ // Create global error logger for bootstrapping errors
17
+ const errorLogger = new ErrorLogger({
18
+ fs: nodeFsSync,
19
+ logDir,
20
+ logToStderr: false // Only log to file at this level
21
+ });
22
+ const program = createProgram({
23
+ fs: fsAdapter,
24
+ prompts: (questions) => prompts(questions, {
25
+ onCancel: () => {
26
+ throw new Error("Operation cancelled.");
27
+ }
28
+ }),
29
+ env: {
30
+ cwd: process.cwd(),
31
+ homeDir,
32
+ platform: process.platform,
33
+ variables: process.env
34
+ },
35
+ logger: (message) => {
36
+ console.log(message);
37
+ },
38
+ exitOverride: false
39
+ });
40
+ try {
41
+ await program.parseAsync(process.argv);
42
+ }
43
+ catch (error) {
44
+ if (error instanceof Error) {
45
+ // Log error with full context
46
+ errorLogger.logErrorWithStackTrace(error, "CLI execution", {
47
+ component: "main",
48
+ argv: process.argv
49
+ });
50
+ // Display user-friendly message
51
+ if (error instanceof CliError && error.isUserError) {
52
+ console.error(error.message);
53
+ }
54
+ else {
55
+ console.error(`Error: ${error.message}`);
56
+ console.error(`See logs at ${join(logDir, "errors.log")} for more details.`);
57
+ }
58
+ process.exit(1);
59
+ }
60
+ throw error;
61
+ }
62
+ }
63
+ if (isCliInvocation(process.argv, import.meta.url)) {
64
+ void main();
65
+ }
66
+ function isCliInvocation(argv, moduleUrl, realpath = realpathSync) {
67
+ const entry = argv.at(1);
68
+ if (typeof entry !== "string") {
69
+ return false;
70
+ }
71
+ const candidates = [pathToFileURL(entry).href];
72
+ try {
73
+ candidates.push(pathToFileURL(realpath(entry)).href);
74
+ }
75
+ catch {
76
+ // Ignore resolution errors; fall back to direct comparison.
77
+ }
78
+ return candidates.includes(moduleUrl);
79
+ }
80
+ export { main, isCliInvocation };
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ProviderAdapter } from "../cli/service-registry.js";
2
+ import type { ServiceMutationHooks } from "../services/service-manifest.js";
3
+ export interface ClaudeCodePaths extends Record<string, string> {
4
+ settingsPath: string;
5
+ keyHelperPath: string;
6
+ credentialsPath: string;
7
+ }
8
+ export interface ClaudeCodeConfigureOptions {
9
+ apiKey: string;
10
+ defaultModel: string;
11
+ mutationHooks?: ServiceMutationHooks;
12
+ }
13
+ export interface ClaudeCodeRemoveOptions {
14
+ mutationHooks?: ServiceMutationHooks;
15
+ }
16
+ export interface ClaudeCodeSpawnOptions {
17
+ prompt: string;
18
+ args: string[];
19
+ }
20
+ export declare const claudeCodeAdapter: ProviderAdapter<ClaudeCodePaths, ClaudeCodeConfigureOptions, ClaudeCodeRemoveOptions, ClaudeCodeSpawnOptions>;
@@ -0,0 +1,48 @@
1
+ import { configureClaudeCode, installClaudeCode, registerClaudeCodePrerequisites, removeClaudeCode, spawnClaudeCode } from "../services/claude-code.js";
2
+ export const claudeCodeAdapter = {
3
+ name: "claude-code",
4
+ label: "Claude Code",
5
+ supportsSpawn: true,
6
+ resolvePaths(env) {
7
+ return {
8
+ settingsPath: env.resolveHomePath(".claude", "settings.json"),
9
+ keyHelperPath: env.resolveHomePath(".claude", "anthropic_key.sh"),
10
+ credentialsPath: env.credentialsPath
11
+ };
12
+ },
13
+ registerPrerequisites(manager) {
14
+ registerClaudeCodePrerequisites(manager);
15
+ },
16
+ async install(context) {
17
+ await installClaudeCode({
18
+ isDryRun: context.logger.context.dryRun,
19
+ runCommand: context.command.runCommand,
20
+ logger: (message) => context.logger.info(message)
21
+ });
22
+ },
23
+ async configure(context, options) {
24
+ await configureClaudeCode({
25
+ fs: context.command.fs,
26
+ apiKey: options.apiKey,
27
+ settingsPath: context.paths.settingsPath,
28
+ keyHelperPath: context.paths.keyHelperPath,
29
+ credentialsPath: context.paths.credentialsPath,
30
+ defaultModel: options.defaultModel
31
+ }, options.mutationHooks ? { hooks: options.mutationHooks } : undefined);
32
+ },
33
+ async remove(context, options) {
34
+ return await removeClaudeCode({
35
+ fs: context.command.fs,
36
+ settingsPath: context.paths.settingsPath,
37
+ keyHelperPath: context.paths.keyHelperPath
38
+ }, options.mutationHooks ? { hooks: options.mutationHooks } : undefined);
39
+ },
40
+ async spawn(context, options) {
41
+ return await spawnClaudeCode({
42
+ prompt: options.prompt,
43
+ args: options.args,
44
+ runCommand: context.command.runCommand
45
+ });
46
+ }
47
+ };
48
+ //# sourceMappingURL=claude-code-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-adapter.js","sourceRoot":"","sources":["../../src/providers/claude-code-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,+BAA+B,EAC/B,gBAAgB,EAChB,eAAe,EAChB,MAAM,4BAA4B,CAAC;AAyBpC,MAAM,CAAC,MAAM,iBAAiB,GAK1B;IACF,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,aAAa;IACpB,aAAa,EAAE,IAAI;IACnB,YAAY,CAAC,GAAG;QACd,OAAO;YACL,YAAY,EAAE,GAAG,CAAC,eAAe,CAAC,SAAS,EAAE,eAAe,CAAC;YAC7D,aAAa,EAAE,GAAG,CAAC,eAAe,CAAC,SAAS,EAAE,kBAAkB,CAAC;YACjE,eAAe,EAAE,GAAG,CAAC,eAAe;SACrC,CAAC;IACJ,CAAC;IACD,qBAAqB,CAAC,OAAO;QAC3B,+BAA+B,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,OAAO;QACnB,MAAM,iBAAiB,CAAC;YACtB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM;YACvC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU;YACtC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO;QAC9B,MAAM,mBAAmB,CACvB;YACE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY;YACxC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa;YAC1C,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe;YAC9C,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,EACD,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACrE,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO;QAC3B,OAAO,MAAM,gBAAgB,CAC3B;YACE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;YACtB,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,YAAY;YACxC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa;SAC3C,EACD,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACrE,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO;QAC1B,OAAO,MAAM,eAAe,CAAC;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU;SACvC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ProviderAdapter } from "../cli/service-registry.js";
2
+ import type { ServiceMutationHooks } from "../services/service-manifest.js";
3
+ export interface CodexPaths extends Record<string, string> {
4
+ configPath: string;
5
+ }
6
+ export interface CodexConfigureOptions {
7
+ apiKey: string;
8
+ model: string;
9
+ reasoningEffort: string;
10
+ mutationHooks?: ServiceMutationHooks;
11
+ }
12
+ export interface CodexSpawnOptions {
13
+ prompt: string;
14
+ args: string[];
15
+ }
16
+ export interface CodexRemoveOptions {
17
+ mutationHooks?: ServiceMutationHooks;
18
+ }
19
+ export declare const codexAdapter: ProviderAdapter<CodexPaths, CodexConfigureOptions, CodexRemoveOptions, CodexSpawnOptions>;