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.
- package/README.md +64 -0
- package/dist/cli/api-client.d.ts +14 -0
- package/dist/cli/api-client.js +140 -0
- package/dist/cli/api-client.js.map +1 -0
- package/dist/cli/chat.d.ts +32 -0
- package/dist/cli/chat.js +2 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/command-runner.d.ts +2 -0
- package/dist/cli/command-runner.js +37 -0
- package/dist/cli/command-runner.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +18 -0
- package/dist/cli/commands/agent.js +84 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/configure-agents.d.ts +3 -0
- package/dist/cli/commands/configure-agents.js +72 -0
- package/dist/cli/commands/configure-agents.js.map +1 -0
- package/dist/cli/commands/configure.d.ts +11 -0
- package/dist/cli/commands/configure.js +150 -0
- package/dist/cli/commands/configure.js.map +1 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.js +45 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/interactive.d.ts +3 -0
- package/dist/cli/commands/interactive.js +17 -0
- package/dist/cli/commands/interactive.js.map +1 -0
- package/dist/cli/commands/login.d.ts +6 -0
- package/dist/cli/commands/login.js +51 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +3 -0
- package/dist/cli/commands/logout.js +31 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/prerequisites.d.ts +3 -0
- package/dist/cli/commands/prerequisites.js +23 -0
- package/dist/cli/commands/prerequisites.js.map +1 -0
- package/dist/cli/commands/query.d.ts +7 -0
- package/dist/cli/commands/query.js +46 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +6 -0
- package/dist/cli/commands/remove.js +80 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/root.d.ts +3 -0
- package/dist/cli/commands/root.js +7 -0
- package/dist/cli/commands/root.js.map +1 -0
- package/dist/cli/commands/shared.d.ts +24 -0
- package/dist/cli/commands/shared.js +61 -0
- package/dist/cli/commands/shared.js.map +1 -0
- package/dist/cli/commands/spawn-worktree.d.ts +6 -0
- package/dist/cli/commands/spawn-worktree.js +91 -0
- package/dist/cli/commands/spawn-worktree.js.map +1 -0
- package/dist/cli/commands/spawn.d.ts +7 -0
- package/dist/cli/commands/spawn.js +112 -0
- package/dist/cli/commands/spawn.js.map +1 -0
- package/dist/cli/commands/test.d.ts +6 -0
- package/dist/cli/commands/test.js +26 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/constants.d.ts +10 -0
- package/dist/cli/constants.js +11 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/container.d.ts +48 -0
- package/dist/cli/container.js +94 -0
- package/dist/cli/container.js.map +1 -0
- package/dist/cli/context.d.ts +37 -0
- package/dist/cli/context.js +198 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/environment.d.ts +19 -0
- package/dist/cli/environment.js +26 -0
- package/dist/cli/environment.js.map +1 -0
- package/dist/cli/error-logger.d.ts +46 -0
- package/dist/cli/error-logger.js +137 -0
- package/dist/cli/error-logger.js.map +1 -0
- package/dist/cli/errors.d.ts +91 -0
- package/dist/cli/errors.js +128 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/file-mentions.d.ts +13 -0
- package/dist/cli/file-mentions.js +87 -0
- package/dist/cli/file-mentions.js.map +1 -0
- package/dist/cli/file-picker-state.d.ts +14 -0
- package/dist/cli/file-picker-state.js +23 -0
- package/dist/cli/file-picker-state.js.map +1 -0
- package/dist/cli/http.d.ts +11 -0
- package/dist/cli/http.js +2 -0
- package/dist/cli/http.js.map +1 -0
- package/dist/cli/interactive-command-runner.d.ts +11 -0
- package/dist/cli/interactive-command-runner.js +142 -0
- package/dist/cli/interactive-command-runner.js.map +1 -0
- package/dist/cli/interactive-launcher.d.ts +2 -0
- package/dist/cli/interactive-launcher.js +404 -0
- package/dist/cli/interactive-launcher.js.map +1 -0
- package/dist/cli/interactive-tasks.d.ts +7 -0
- package/dist/cli/interactive-tasks.js +199 -0
- package/dist/cli/interactive-tasks.js.map +1 -0
- package/dist/cli/interactive.d.ts +19 -0
- package/dist/cli/interactive.js +479 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/logger.d.ts +26 -0
- package/dist/cli/logger.js +87 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/markdown-renderer.d.ts +27 -0
- package/dist/cli/markdown-renderer.js +178 -0
- package/dist/cli/markdown-renderer.js.map +1 -0
- package/dist/cli/markdown-renderer.test.d.ts +1 -0
- package/dist/cli/markdown-renderer.test.js +105 -0
- package/dist/cli/markdown-renderer.test.js.map +1 -0
- package/dist/cli/options.d.ts +30 -0
- package/dist/cli/options.js +84 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/program.d.ts +4 -0
- package/dist/cli/program.js +64 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/prompts.d.ts +23 -0
- package/dist/cli/prompts.js +58 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/service-registry.d.ts +33 -0
- package/dist/cli/service-registry.js +35 -0
- package/dist/cli/service-registry.js.map +1 -0
- package/dist/cli/telemetry.d.ts +15 -0
- package/dist/cli/telemetry.js +45 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/types.d.ts +2 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.js +43 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/publish-placeholder.d.ts +8 -0
- package/dist/commands/publish-placeholder.js +50 -0
- package/dist/commands/publish-placeholder.js.map +1 -0
- package/dist/commands/spawn-worktree.d.ts +25 -0
- package/dist/commands/spawn-worktree.js +139 -0
- package/dist/commands/spawn-worktree.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/claude-code-adapter.d.ts +20 -0
- package/dist/providers/claude-code-adapter.js +48 -0
- package/dist/providers/claude-code-adapter.js.map +1 -0
- package/dist/providers/codex-adapter.d.ts +19 -0
- package/dist/providers/codex-adapter.js +49 -0
- package/dist/providers/codex-adapter.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.js +13 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/opencode-adapter.d.ts +18 -0
- package/dist/providers/opencode-adapter.js +45 -0
- package/dist/providers/opencode-adapter.js.map +1 -0
- package/dist/providers/roo-code-adapter.d.ts +19 -0
- package/dist/providers/roo-code-adapter.js +70 -0
- package/dist/providers/roo-code-adapter.js.map +1 -0
- package/dist/services/agent-config-manager.d.ts +32 -0
- package/dist/services/agent-config-manager.js +130 -0
- package/dist/services/agent-config-manager.js.map +1 -0
- package/dist/services/agent-registry.d.ts +27 -0
- package/dist/services/agent-registry.js +89 -0
- package/dist/services/agent-registry.js.map +1 -0
- package/dist/services/agent-session.d.ts +24 -0
- package/dist/services/agent-session.js +107 -0
- package/dist/services/agent-session.js.map +1 -0
- package/dist/services/agent-task-registry.d.ts +131 -0
- package/dist/services/agent-task-registry.js +491 -0
- package/dist/services/agent-task-registry.js.map +1 -0
- package/dist/services/chat.d.ts +94 -0
- package/dist/services/chat.js +241 -0
- package/dist/services/chat.js.map +1 -0
- package/dist/services/claude-code.d.ts +28 -0
- package/dist/services/claude-code.js +155 -0
- package/dist/services/claude-code.js.map +1 -0
- package/dist/services/codex.d.ts +27 -0
- package/dist/services/codex.js +231 -0
- package/dist/services/codex.js.map +1 -0
- package/dist/services/credentials.d.ts +11 -0
- package/dist/services/credentials.js +44 -0
- package/dist/services/credentials.js.map +1 -0
- package/dist/services/mcp-client.d.ts +38 -0
- package/dist/services/mcp-client.js +170 -0
- package/dist/services/mcp-client.js.map +1 -0
- package/dist/services/mcp-manager.d.ts +28 -0
- package/dist/services/mcp-manager.js +157 -0
- package/dist/services/mcp-manager.js.map +1 -0
- package/dist/services/model-strategy.d.ts +99 -0
- package/dist/services/model-strategy.js +182 -0
- package/dist/services/model-strategy.js.map +1 -0
- package/dist/services/opencode.d.ts +25 -0
- package/dist/services/opencode.js +161 -0
- package/dist/services/opencode.js.map +1 -0
- package/dist/services/poe-code.d.ts +7 -0
- package/dist/services/poe-code.js +5 -0
- package/dist/services/poe-code.js.map +1 -0
- package/dist/services/roo-code.d.ts +22 -0
- package/dist/services/roo-code.js +134 -0
- package/dist/services/roo-code.js.map +1 -0
- package/dist/services/service-install.d.ts +21 -0
- package/dist/services/service-install.js +47 -0
- package/dist/services/service-install.js.map +1 -0
- package/dist/services/service-manifest.d.ts +122 -0
- package/dist/services/service-manifest.js +368 -0
- package/dist/services/service-manifest.js.map +1 -0
- package/dist/services/task-logger.d.ts +24 -0
- package/dist/services/task-logger.js +73 -0
- package/dist/services/task-logger.js.map +1 -0
- package/dist/services/task-runner.d.ts +19 -0
- package/dist/services/task-runner.js +157 -0
- package/dist/services/task-runner.js.map +1 -0
- package/dist/services/tools.d.ts +76 -0
- package/dist/services/tools.js +870 -0
- package/dist/services/tools.js.map +1 -0
- package/dist/templates/claude-code/anthropic_key.sh.hbs +2 -0
- package/dist/templates/codex/config.toml.hbs +9 -0
- package/dist/templates/python/env.hbs +3 -0
- package/dist/templates/python/main.py.hbs +17 -0
- package/dist/templates/python/requirements.txt.hbs +2 -0
- package/dist/utils/backup.d.ts +5 -0
- package/dist/utils/backup.js +61 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/command-line.d.ts +1 -0
- package/dist/utils/command-line.js +54 -0
- package/dist/utils/command-line.js.map +1 -0
- package/dist/utils/dry-run.d.ts +38 -0
- package/dist/utils/dry-run.js +211 -0
- package/dist/utils/dry-run.js.map +1 -0
- package/dist/utils/e2e-flags.d.ts +1 -0
- package/dist/utils/e2e-flags.js +9 -0
- package/dist/utils/e2e-flags.js.map +1 -0
- package/dist/utils/file-system.d.ts +21 -0
- package/dist/utils/file-system.js +2 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +42 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/prerequisites.d.ts +41 -0
- package/dist/utils/prerequisites.js +92 -0
- package/dist/utils/prerequisites.js.map +1 -0
- package/dist/utils/templates.d.ts +4 -0
- package/dist/utils/templates.js +22 -0
- package/dist/utils/templates.js.map +1 -0
- package/dist/utils/toml.d.ts +8 -0
- package/dist/utils/toml.js +30 -0
- package/dist/utils/toml.js.map +1 -0
- package/dist/utils/worktree.d.ts +40 -0
- package/dist/utils/worktree.js +179 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +84 -0
- package/shared/conversation-layout.cjs +11 -0
- package/shared/conversation-layout.d.ts +7 -0
- package/shared/conversation-layout.js +11 -0
- package/shared/package.json +13 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export function formatCommandRunnerResult(result) {
|
|
2
|
+
const stdout = result.stdout.length > 0 ? result.stdout : "<empty>";
|
|
3
|
+
const stderr = result.stderr.length > 0 ? result.stderr : "<empty>";
|
|
4
|
+
return `stdout:\n${stdout}\nstderr:\n${stderr}`;
|
|
5
|
+
}
|
|
6
|
+
export function createPrerequisiteManager(init) {
|
|
7
|
+
const store = {
|
|
8
|
+
before: [],
|
|
9
|
+
after: []
|
|
10
|
+
};
|
|
11
|
+
const register = (phase, prerequisite) => {
|
|
12
|
+
store[phase].push(prerequisite);
|
|
13
|
+
};
|
|
14
|
+
return {
|
|
15
|
+
registerBefore(prerequisite) {
|
|
16
|
+
register("before", prerequisite);
|
|
17
|
+
},
|
|
18
|
+
registerAfter(prerequisite) {
|
|
19
|
+
register("after", prerequisite);
|
|
20
|
+
},
|
|
21
|
+
async run(phase, hooks) {
|
|
22
|
+
const failures = [];
|
|
23
|
+
for (const prerequisite of store[phase]) {
|
|
24
|
+
hooks?.onStart?.(prerequisite);
|
|
25
|
+
try {
|
|
26
|
+
await prerequisite.run({
|
|
27
|
+
isDryRun: init.isDryRun,
|
|
28
|
+
runCommand: init.runCommand
|
|
29
|
+
});
|
|
30
|
+
hooks?.onSuccess?.(prerequisite);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
34
|
+
failures.push(`${prerequisite.description}: ${detail}`);
|
|
35
|
+
hooks?.onFailure?.(prerequisite, error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (failures.length > 0) {
|
|
39
|
+
const suffix = failures.length === 1 ? "" : "s";
|
|
40
|
+
const message = failures.map((line) => `- ${line}`).join("\n");
|
|
41
|
+
throw new Error(`Failed ${phase} prerequisite${suffix}:\n${message}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Creates a prerequisite check that detects if a binary exists using multiple fallback methods.
|
|
48
|
+
* This is useful in Docker/containerized environments where PATH may not be updated after npm install.
|
|
49
|
+
*
|
|
50
|
+
* @param binaryName - The name of the binary to check for (e.g., "claude", "codex")
|
|
51
|
+
* @param id - Unique identifier for the prerequisite
|
|
52
|
+
* @param description - Human-readable description of what's being checked
|
|
53
|
+
* @returns A PrerequisiteDefinition that checks for the binary using multiple detection methods
|
|
54
|
+
*/
|
|
55
|
+
export function createBinaryExistsCheck(binaryName, id, description) {
|
|
56
|
+
return {
|
|
57
|
+
id,
|
|
58
|
+
description,
|
|
59
|
+
async run({ runCommand }) {
|
|
60
|
+
const detectors = [
|
|
61
|
+
{
|
|
62
|
+
command: "which",
|
|
63
|
+
args: [binaryName],
|
|
64
|
+
validate: (result) => result.exitCode === 0
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
command: "where",
|
|
68
|
+
args: [binaryName],
|
|
69
|
+
validate: (result) => result.exitCode === 0 && result.stdout.trim().length > 0
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
command: "test",
|
|
73
|
+
args: ["-f", `/usr/local/bin/${binaryName}`],
|
|
74
|
+
validate: (result) => result.exitCode === 0
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
command: "ls",
|
|
78
|
+
args: [`/usr/local/bin/${binaryName}`],
|
|
79
|
+
validate: (result) => result.exitCode === 0
|
|
80
|
+
}
|
|
81
|
+
];
|
|
82
|
+
for (const detector of detectors) {
|
|
83
|
+
const result = await runCommand(detector.command, detector.args);
|
|
84
|
+
if (detector.validate(result)) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
throw new Error(`${binaryName} CLI binary not found on PATH.`);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=prerequisites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../src/utils/prerequisites.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
type TemplateLoader = (relativePath: string) => Promise<string>;
|
|
2
|
+
export declare function renderTemplate(relativePath: string, context: Record<string, unknown>): Promise<string>;
|
|
3
|
+
export declare function setTemplateLoader(loader: TemplateLoader | null): void;
|
|
4
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readFile } from "node:fs/promises";
|
|
4
|
+
import handlebars from "handlebars";
|
|
5
|
+
const templateRoot = fileURLToPath(new URL("../templates", import.meta.url));
|
|
6
|
+
let customLoader = null;
|
|
7
|
+
export async function renderTemplate(relativePath, context) {
|
|
8
|
+
const source = await loadTemplate(relativePath);
|
|
9
|
+
const template = handlebars.compile(source);
|
|
10
|
+
return template(context);
|
|
11
|
+
}
|
|
12
|
+
export function setTemplateLoader(loader) {
|
|
13
|
+
customLoader = loader;
|
|
14
|
+
}
|
|
15
|
+
async function loadTemplate(relativePath) {
|
|
16
|
+
if (customLoader) {
|
|
17
|
+
return customLoader(relativePath);
|
|
18
|
+
}
|
|
19
|
+
const templatePath = path.join(templateRoot, relativePath);
|
|
20
|
+
return readFile(templatePath, "utf8");
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAI7E,IAAI,YAAY,GAA0B,IAAI,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAAoB,EACpB,OAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA6B;IAC7D,YAAY,GAAG,MAAM,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,YAAoB;IAC9C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC3D,OAAO,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type TomlValue = boolean | number | string | Date | TomlValue[] | TomlTable;
|
|
2
|
+
export interface TomlTable {
|
|
3
|
+
[key: string]: TomlValue;
|
|
4
|
+
}
|
|
5
|
+
export declare function parseTomlDocument(content: string): TomlTable;
|
|
6
|
+
export declare function serializeTomlDocument(table: TomlTable): string;
|
|
7
|
+
export declare function isTomlTable(value: unknown): value is TomlTable;
|
|
8
|
+
export declare function mergeTomlTables(target: TomlTable, source: TomlTable): TomlTable;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { parse, stringify } from "@iarna/toml";
|
|
2
|
+
export function parseTomlDocument(content) {
|
|
3
|
+
const result = parse(content);
|
|
4
|
+
if (!isTomlTable(result)) {
|
|
5
|
+
throw new Error("Expected TOML document to be a table.");
|
|
6
|
+
}
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
export function serializeTomlDocument(table) {
|
|
10
|
+
const serialized = stringify(table);
|
|
11
|
+
return serialized.endsWith("\n") ? serialized : `${serialized}\n`;
|
|
12
|
+
}
|
|
13
|
+
export function isTomlTable(value) {
|
|
14
|
+
return (typeof value === "object" &&
|
|
15
|
+
value !== null &&
|
|
16
|
+
!Array.isArray(value));
|
|
17
|
+
}
|
|
18
|
+
export function mergeTomlTables(target, source) {
|
|
19
|
+
const result = { ...target };
|
|
20
|
+
for (const [key, value] of Object.entries(source)) {
|
|
21
|
+
const current = result[key];
|
|
22
|
+
if (isTomlTable(current) && isTomlTable(value)) {
|
|
23
|
+
result[key] = mergeTomlTables(current, value);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
result[key] = value;
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=toml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toml.js","sourceRoot":"","sources":["../../src/utils/toml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAc/C,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAgB;IACpD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAY,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAiB,EACjB,MAAiB;IAEjB,MAAM,MAAM,GAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as nodeFs from "node:fs/promises";
|
|
2
|
+
import { type SimpleGit, type StatusResult } from "simple-git";
|
|
3
|
+
interface WorktreeDependencies {
|
|
4
|
+
fs: typeof nodeFs;
|
|
5
|
+
os: {
|
|
6
|
+
tmpdir(): string;
|
|
7
|
+
};
|
|
8
|
+
crypto: {
|
|
9
|
+
randomBytes(size: number): Buffer;
|
|
10
|
+
};
|
|
11
|
+
clock: {
|
|
12
|
+
now(): number;
|
|
13
|
+
};
|
|
14
|
+
gitFactory: (cwd: string) => SimpleGit;
|
|
15
|
+
}
|
|
16
|
+
type WorktreeOverrides = Partial<Omit<WorktreeDependencies, "fs">> & {
|
|
17
|
+
fs?: Partial<typeof nodeFs> & Pick<typeof nodeFs, "readFile" | "writeFile" | "mkdir">;
|
|
18
|
+
};
|
|
19
|
+
export interface WorktreeContext {
|
|
20
|
+
path: string;
|
|
21
|
+
branchName: string;
|
|
22
|
+
cleanup: () => Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export interface WorktreeChangeSummary {
|
|
25
|
+
hasCommits: boolean;
|
|
26
|
+
files: string[];
|
|
27
|
+
status: StatusResult;
|
|
28
|
+
}
|
|
29
|
+
export type MergeOutcome = "no-changes" | "merged" | "conflict";
|
|
30
|
+
export interface MergeResult {
|
|
31
|
+
outcome: MergeOutcome;
|
|
32
|
+
files: string[];
|
|
33
|
+
hasCommits: boolean;
|
|
34
|
+
error?: Error;
|
|
35
|
+
}
|
|
36
|
+
export declare function isGitRepository(cwd: string, overrides?: WorktreeOverrides): Promise<boolean>;
|
|
37
|
+
export declare function createWorktree(basePath: string, overrides?: WorktreeOverrides): Promise<WorktreeContext>;
|
|
38
|
+
export declare function getChanges(worktreePath: string, overrides?: WorktreeOverrides): Promise<WorktreeChangeSummary>;
|
|
39
|
+
export declare function mergeChanges(worktreePath: string, targetBranch: string, overrides?: WorktreeOverrides): Promise<MergeResult>;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import * as nodeFs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import crypto from "node:crypto";
|
|
5
|
+
import { simpleGit as createSimpleGit } from "simple-git";
|
|
6
|
+
const registry = new Map();
|
|
7
|
+
const defaultDependencies = {
|
|
8
|
+
fs: nodeFs,
|
|
9
|
+
os,
|
|
10
|
+
crypto,
|
|
11
|
+
clock: { now: () => Date.now() },
|
|
12
|
+
gitFactory: (cwd) => createSimpleGit({ baseDir: cwd })
|
|
13
|
+
};
|
|
14
|
+
function resolveDependencies(overrides) {
|
|
15
|
+
if (!overrides) {
|
|
16
|
+
return defaultDependencies;
|
|
17
|
+
}
|
|
18
|
+
const fsImpl = overrides.fs
|
|
19
|
+
? {
|
|
20
|
+
...defaultDependencies.fs,
|
|
21
|
+
...overrides.fs
|
|
22
|
+
}
|
|
23
|
+
: defaultDependencies.fs;
|
|
24
|
+
return {
|
|
25
|
+
fs: fsImpl,
|
|
26
|
+
os: overrides.os ?? defaultDependencies.os,
|
|
27
|
+
crypto: overrides.crypto ?? defaultDependencies.crypto,
|
|
28
|
+
clock: overrides.clock ?? defaultDependencies.clock,
|
|
29
|
+
gitFactory: overrides.gitFactory ?? defaultDependencies.gitFactory
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function isGitRepository(cwd, overrides) {
|
|
33
|
+
const deps = resolveDependencies(overrides);
|
|
34
|
+
try {
|
|
35
|
+
const git = deps.gitFactory(cwd);
|
|
36
|
+
return await git.checkIsRepo();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function createWorktree(basePath, overrides) {
|
|
43
|
+
const deps = resolveDependencies(overrides);
|
|
44
|
+
const git = deps.gitFactory(basePath);
|
|
45
|
+
const [rootRaw, baseCommitRaw] = await Promise.all([
|
|
46
|
+
git.revparse(["--show-toplevel"]),
|
|
47
|
+
git.revparse(["HEAD"])
|
|
48
|
+
]);
|
|
49
|
+
const root = rootRaw.trim();
|
|
50
|
+
const baseCommit = baseCommitRaw.trim();
|
|
51
|
+
const timestamp = String(deps.clock.now());
|
|
52
|
+
const suffix = deps.crypto.randomBytes(4).toString("hex");
|
|
53
|
+
const branchName = `poe-worktree/${timestamp}-${suffix}`;
|
|
54
|
+
const worktreePath = path.join(deps.os.tmpdir(), `poe-worktree-${timestamp}-${suffix}`);
|
|
55
|
+
await git.raw(["worktree", "add", "-b", branchName, worktreePath]);
|
|
56
|
+
registry.set(worktreePath, { root, branchName, baseCommit });
|
|
57
|
+
return {
|
|
58
|
+
path: worktreePath,
|
|
59
|
+
branchName,
|
|
60
|
+
async cleanup() {
|
|
61
|
+
const metadata = registry.get(worktreePath);
|
|
62
|
+
registry.delete(worktreePath);
|
|
63
|
+
if (!metadata) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const rootGit = deps.gitFactory(metadata.root);
|
|
67
|
+
try {
|
|
68
|
+
await rootGit.raw([
|
|
69
|
+
"worktree",
|
|
70
|
+
"remove",
|
|
71
|
+
"--force",
|
|
72
|
+
worktreePath
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Preserve cleanup best effort.
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
await rootGit.raw(["branch", "-D", metadata.branchName]);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Branch removal may fail if already removed; ignore.
|
|
83
|
+
}
|
|
84
|
+
await removePath(deps.fs, worktreePath);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export async function getChanges(worktreePath, overrides) {
|
|
89
|
+
const deps = resolveDependencies(overrides);
|
|
90
|
+
const metadata = registry.get(worktreePath);
|
|
91
|
+
if (!metadata) {
|
|
92
|
+
throw new Error(`Unknown worktree at ${worktreePath}`);
|
|
93
|
+
}
|
|
94
|
+
const git = deps.gitFactory(worktreePath);
|
|
95
|
+
const status = await git.status();
|
|
96
|
+
const files = status.files.map((entry) => entry.path);
|
|
97
|
+
let hasCommits = false;
|
|
98
|
+
const revList = await git.raw([
|
|
99
|
+
"rev-list",
|
|
100
|
+
"--count",
|
|
101
|
+
`${metadata.baseCommit}..HEAD`
|
|
102
|
+
]);
|
|
103
|
+
const count = Number.parseInt(revList.trim(), 10);
|
|
104
|
+
if (!Number.isNaN(count) && count > 0) {
|
|
105
|
+
hasCommits = true;
|
|
106
|
+
}
|
|
107
|
+
return { hasCommits, files, status };
|
|
108
|
+
}
|
|
109
|
+
export async function mergeChanges(worktreePath, targetBranch, overrides) {
|
|
110
|
+
const deps = resolveDependencies(overrides);
|
|
111
|
+
const metadata = registry.get(worktreePath);
|
|
112
|
+
if (!metadata) {
|
|
113
|
+
throw new Error(`Unknown worktree at ${worktreePath}`);
|
|
114
|
+
}
|
|
115
|
+
const summary = await getChanges(worktreePath, overrides);
|
|
116
|
+
const { files, hasCommits } = summary;
|
|
117
|
+
if (!hasCommits && files.length === 0) {
|
|
118
|
+
return { outcome: "no-changes", files, hasCommits };
|
|
119
|
+
}
|
|
120
|
+
if (hasCommits) {
|
|
121
|
+
const git = deps.gitFactory(metadata.root);
|
|
122
|
+
try {
|
|
123
|
+
await git.checkout(targetBranch);
|
|
124
|
+
await git.merge(["--no-ff", metadata.branchName]);
|
|
125
|
+
return { outcome: "merged", files, hasCommits };
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return {
|
|
129
|
+
outcome: "conflict",
|
|
130
|
+
files,
|
|
131
|
+
hasCommits,
|
|
132
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
await applyWorktreeChanges({
|
|
137
|
+
fs: deps.fs,
|
|
138
|
+
root: metadata.root,
|
|
139
|
+
worktreePath,
|
|
140
|
+
status: summary.status
|
|
141
|
+
});
|
|
142
|
+
return { outcome: "merged", files, hasCommits };
|
|
143
|
+
}
|
|
144
|
+
async function applyWorktreeChanges(input) {
|
|
145
|
+
const { fs, root, worktreePath, status } = input;
|
|
146
|
+
const changed = new Set();
|
|
147
|
+
for (const file of status.modified ?? []) {
|
|
148
|
+
changed.add(file);
|
|
149
|
+
}
|
|
150
|
+
for (const file of status.created ?? []) {
|
|
151
|
+
changed.add(file);
|
|
152
|
+
}
|
|
153
|
+
for (const file of status.not_added ?? []) {
|
|
154
|
+
changed.add(file);
|
|
155
|
+
}
|
|
156
|
+
for (const entry of status.renamed ?? []) {
|
|
157
|
+
await removePath(fs, path.join(root, entry.from));
|
|
158
|
+
changed.add(entry.to);
|
|
159
|
+
}
|
|
160
|
+
for (const removed of status.deleted ?? []) {
|
|
161
|
+
await removePath(fs, path.join(root, removed));
|
|
162
|
+
changed.delete(removed);
|
|
163
|
+
}
|
|
164
|
+
for (const file of changed) {
|
|
165
|
+
const source = path.join(worktreePath, file);
|
|
166
|
+
const destination = path.join(root, file);
|
|
167
|
+
await fs.mkdir(path.dirname(destination), { recursive: true });
|
|
168
|
+
const content = await fs.readFile(source);
|
|
169
|
+
await fs.writeFile(destination, content);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async function removePath(fs, target) {
|
|
173
|
+
if (typeof fs.rm === "function") {
|
|
174
|
+
await fs.rm(target, { recursive: true, force: true }).catch(() => { });
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
await fs.unlink(target).catch(() => { });
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/utils/worktree.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "poe-code",
|
|
3
|
+
"version": "0.1.26",
|
|
4
|
+
"description": "CLI tool to configure Poe API for developer workflows.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "npm run build:webview && tsc -p tsconfig.build.json && node scripts/copy-templates.mjs",
|
|
8
|
+
"dev": "tsx src/index.ts",
|
|
9
|
+
"start": "node dist/index.js",
|
|
10
|
+
"test": "npm run test:root && npm run test --prefix vscode-extension",
|
|
11
|
+
"test:root": "vitest run",
|
|
12
|
+
"lint": "npm run lint:eslint && npm run lint:types && npm run lint:workflows",
|
|
13
|
+
"lint:workflows": "(command -v actionlint > /dev/null || bash scripts/setup-actionlint.sh) && (command -v actionlint > /dev/null && actionlint || ./actionlint)",
|
|
14
|
+
"lint:eslint": "eslint . --ext ts",
|
|
15
|
+
"lint:types": "tsc -p tsconfig.build.json --noEmit && npm run typecheck --prefix vscode-extension",
|
|
16
|
+
"format": "prettier --check .",
|
|
17
|
+
"format:write": "prettier --write .",
|
|
18
|
+
"watch": "tsx watch src/index.ts",
|
|
19
|
+
"extension:build": "npm run compile --prefix vscode-extension",
|
|
20
|
+
"extension:watch": "npm run watch --prefix vscode-extension",
|
|
21
|
+
"extension:preview": "npm run build && npm run extension:build && cd vscode-extension/preview && npm install && npm run dev",
|
|
22
|
+
"build:webview": "webpack --config webpack.webview.config.cjs",
|
|
23
|
+
"test:e2e": "playwright test"
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"poe-code": "dist/index.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"shared"
|
|
31
|
+
],
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@iarna/toml": "^3.0.0",
|
|
37
|
+
"@poe/shared-utils": "file:./shared",
|
|
38
|
+
"chalk": "^5.3.0",
|
|
39
|
+
"commander": "^11.1.0",
|
|
40
|
+
"diff": "^5.2.0",
|
|
41
|
+
"handlebars": "^4.7.8",
|
|
42
|
+
"ink": "^6.4.0",
|
|
43
|
+
"ink-select-input": "^6.2.0",
|
|
44
|
+
"ink-text-input": "^6.0.0",
|
|
45
|
+
"lit": "^3.3.1",
|
|
46
|
+
"prompts": "^2.4.2",
|
|
47
|
+
"react": "^19.2.0",
|
|
48
|
+
"simple-git": "^3.25.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@playwright/test": "^1.47.2",
|
|
52
|
+
"@types/diff": "^7.0.2",
|
|
53
|
+
"@types/node": "^20.12.7",
|
|
54
|
+
"@types/prompts": "^2.4.9",
|
|
55
|
+
"@types/react": "^19.2.2",
|
|
56
|
+
"@typescript-eslint/eslint-plugin": "^8.46.2",
|
|
57
|
+
"@typescript-eslint/parser": "^8.46.2",
|
|
58
|
+
"@vscode/test-electron": "^2.5.2",
|
|
59
|
+
"autoprefixer": "^10.4.20",
|
|
60
|
+
"css-loader": "^7.1.2",
|
|
61
|
+
"eslint": "^9.38.0",
|
|
62
|
+
"eslint-config-prettier": "^9.1.0",
|
|
63
|
+
"happy-dom": "^20.0.10",
|
|
64
|
+
"ink-testing-library": "^4.0.0",
|
|
65
|
+
"jsdom": "^27.0.1",
|
|
66
|
+
"memfs": "^4.7.3",
|
|
67
|
+
"mini-css-extract-plugin": "^2.9.1",
|
|
68
|
+
"postcss-loader": "^8.1.1",
|
|
69
|
+
"prettier": "^3.3.3",
|
|
70
|
+
"tailwindcss": "^3.4.18",
|
|
71
|
+
"ts-loader": "^9.5.1",
|
|
72
|
+
"tsx": "^4.7.1",
|
|
73
|
+
"typescript": "^5.4.5",
|
|
74
|
+
"typescript-eslint": "^8.46.2",
|
|
75
|
+
"vitest": "^1.6.1",
|
|
76
|
+
"webpack": "^5.96.1",
|
|
77
|
+
"webpack-cli": "^5.1.4",
|
|
78
|
+
"yaml": "^2.6.0"
|
|
79
|
+
},
|
|
80
|
+
"repository": {
|
|
81
|
+
"type": "git",
|
|
82
|
+
"url": "https://github.com/poe-platform/poe-code.git"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
function findLastUserIndex(entries) {
|
|
2
|
+
for (let index = entries.length - 1; index >= 0; index -= 1) {
|
|
3
|
+
const entry = entries[index];
|
|
4
|
+
if (entry && entry.role === "user") {
|
|
5
|
+
return index;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return -1;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module.exports = { findLastUserIndex };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@poe/shared-utils",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"import": "./conversation-layout.js",
|
|
9
|
+
"require": "./conversation-layout.cjs",
|
|
10
|
+
"types": "./conversation-layout.d.ts"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|