poe-code 2.0.3 → 2.0.4
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 +17 -30
- package/dist/cli/command-runner.d.ts +1 -1
- package/dist/cli/commands/configure.d.ts +0 -2
- package/dist/cli/commands/configure.js +99 -34
- package/dist/cli/commands/configure.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +4 -0
- package/dist/cli/commands/doctor.js +73 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +1 -0
- package/dist/cli/commands/remove.js +41 -28
- package/dist/cli/commands/remove.js.map +1 -1
- package/dist/cli/commands/shared.d.ts +9 -12
- package/dist/cli/commands/shared.js +26 -24
- package/dist/cli/commands/shared.js.map +1 -1
- package/dist/cli/commands/spawn.d.ts +1 -0
- package/dist/cli/commands/spawn.js +14 -5
- package/dist/cli/commands/spawn.js.map +1 -1
- package/dist/cli/commands/test.d.ts +4 -0
- package/dist/cli/commands/test.js +36 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/constants.d.ts +12 -9
- package/dist/cli/constants.js +15 -9
- package/dist/cli/constants.js.map +1 -1
- package/dist/cli/container.d.ts +3 -3
- package/dist/cli/context.d.ts +4 -13
- package/dist/cli/context.js +19 -149
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/error-logger.js +1 -1
- package/dist/cli/error-logger.js.map +1 -1
- package/dist/cli/errors.d.ts +0 -10
- package/dist/cli/errors.js +0 -12
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/logger.js +9 -11
- package/dist/cli/logger.js.map +1 -1
- package/dist/cli/options.d.ts +13 -4
- package/dist/cli/options.js +12 -11
- package/dist/cli/options.js.map +1 -1
- package/dist/cli/program.js +5 -2
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/prompts.d.ts +14 -4
- package/dist/cli/prompts.js +12 -24
- package/dist/cli/prompts.js.map +1 -1
- package/dist/cli/service-registry.d.ts +37 -15
- package/dist/cli/service-registry.js.map +1 -1
- package/dist/cli/telemetry.d.ts +1 -1
- package/dist/cli/ui/service-menu.d.ts +2 -2
- package/dist/cli/ui/theme.js +6 -6
- package/dist/cli/ui/theme.js.map +1 -1
- package/dist/providers/claude-code.d.ts +10 -46
- package/dist/providers/claude-code.js +94 -224
- package/dist/providers/claude-code.js.map +1 -1
- package/dist/providers/codex.d.ts +14 -40
- package/dist/providers/codex.js +74 -177
- package/dist/providers/codex.js.map +1 -1
- package/dist/providers/create-provider.d.ts +26 -0
- package/dist/providers/create-provider.js +120 -0
- package/dist/providers/create-provider.js.map +1 -0
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.js +4 -10
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/opencode.d.ts +3 -43
- package/dist/providers/opencode.js +112 -173
- package/dist/providers/opencode.js.map +1 -1
- package/dist/providers/provider-helpers.d.ts +10 -0
- package/dist/providers/provider-helpers.js +62 -0
- package/dist/providers/provider-helpers.js.map +1 -0
- package/dist/providers/versioned-provider.d.ts +3 -0
- package/dist/providers/versioned-provider.js +9 -0
- package/dist/providers/versioned-provider.js.map +1 -0
- package/dist/services/credentials.d.ts +14 -0
- package/dist/services/credentials.js +123 -22
- package/dist/services/credentials.js.map +1 -1
- package/dist/services/model-strategy.d.ts +1 -1
- package/dist/services/model-strategy.js +20 -15
- package/dist/services/model-strategy.js.map +1 -1
- package/dist/services/mutation-events.d.ts +4 -0
- package/dist/services/mutation-events.js +56 -0
- package/dist/services/mutation-events.js.map +1 -0
- package/dist/services/service-install.d.ts +3 -4
- package/dist/services/service-install.js +30 -12
- package/dist/services/service-install.js.map +1 -1
- package/dist/services/service-manifest.d.ts +49 -21
- package/dist/services/service-manifest.js +261 -64
- package/dist/services/service-manifest.js.map +1 -1
- package/dist/tools/label-generator.d.ts +2 -2
- package/dist/tools/label-generator.js +1 -1
- package/dist/tools/label-generator.js.map +1 -1
- package/dist/utils/binary-version.d.ts +6 -0
- package/dist/utils/binary-version.js +35 -0
- package/dist/utils/binary-version.js.map +1 -0
- package/dist/utils/command-checks.d.ts +39 -0
- package/dist/utils/command-checks.js +116 -0
- package/dist/utils/command-checks.js.map +1 -0
- package/package.json +6 -8
- package/dist/providers/roo-code.d.ts +0 -41
- package/dist/providers/roo-code.js +0 -201
- package/dist/providers/roo-code.js.map +0 -1
- package/dist/utils/prerequisites.d.ts +0 -41
- package/dist/utils/prerequisites.js +0 -92
- package/dist/utils/prerequisites.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,13 +5,7 @@
|
|
|
5
5
|
## Quick Start
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npx poe-code configure claude-code
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Installation
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
npm i -g poe-code
|
|
8
|
+
npx poe-code@latest configure claude-code
|
|
15
9
|
```
|
|
16
10
|
|
|
17
11
|
## Usage
|
|
@@ -19,41 +13,49 @@ npm i -g poe-code
|
|
|
19
13
|
### Authenticate Once
|
|
20
14
|
|
|
21
15
|
```bash
|
|
22
|
-
poe-code login
|
|
16
|
+
npx poe-code@latest login
|
|
23
17
|
```
|
|
24
18
|
|
|
25
19
|
### Install Coding CLIs
|
|
26
20
|
|
|
27
21
|
```bash
|
|
28
22
|
# Claude Code
|
|
29
|
-
poe-code install claude-code
|
|
23
|
+
npx poe-code@latest install claude-code
|
|
30
24
|
|
|
31
25
|
# Codex
|
|
32
|
-
poe-code install codex
|
|
26
|
+
npx poe-code@latest install codex
|
|
33
27
|
|
|
34
28
|
# OpenCode
|
|
35
|
-
poe-code install opencode
|
|
29
|
+
npx poe-code@latest install opencode
|
|
36
30
|
```
|
|
37
31
|
|
|
38
32
|
### Configure Coding CLIs
|
|
39
33
|
|
|
40
34
|
```bash
|
|
41
35
|
# Claude Code
|
|
42
|
-
poe-code configure claude-code
|
|
36
|
+
npx poe-code@latest configure claude-code
|
|
43
37
|
|
|
44
38
|
# Codex
|
|
45
|
-
poe-code configure codex
|
|
39
|
+
npx poe-code@latest configure codex
|
|
46
40
|
|
|
47
41
|
# OpenCode
|
|
48
|
-
poe-code configure opencode
|
|
42
|
+
npx poe-code@latest configure opencode
|
|
49
43
|
|
|
50
44
|
```
|
|
51
45
|
|
|
46
|
+
### Uninstall Configuration
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npx poe-code@latest remove codex
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Removes the Codex settings previously applied by `npx poe-code@latest configure codex`.
|
|
53
|
+
|
|
52
54
|
### Spawn a coding agent
|
|
53
55
|
|
|
54
56
|
```bash
|
|
55
57
|
# Claude Code
|
|
56
|
-
poe-code spawn claude-code "Explain this error message"
|
|
58
|
+
npx poe-code@latest spawn claude-code "Explain this error message"
|
|
57
59
|
```
|
|
58
60
|
|
|
59
61
|
### Optional Flags
|
|
@@ -61,18 +63,3 @@ poe-code spawn claude-code "Explain this error message"
|
|
|
61
63
|
- `--dry-run` – show every mutation without touching disk.
|
|
62
64
|
- `--verbose` – print shell commands as they run.
|
|
63
65
|
- `--yes` – accept defaults for prompts.
|
|
64
|
-
|
|
65
|
-
## Beta Workspace
|
|
66
|
-
|
|
67
|
-
Looking for the interactive agent or VSCode extension?
|
|
68
|
-
Those experimental features now live in [`beta/`](beta/README.md) under the `poe-code-beta` package.
|
|
69
|
-
|
|
70
|
-
## Automation Labels
|
|
71
|
-
|
|
72
|
-
Agent labels used by workflows are generated via:
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
npm run labels:generate
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
See the generated definitions in `docs/LABELS.md`. Assigned issues trigger the `Poe Code` GitHub workflow, which uses these labels to pick an agent automatically.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { CommandRunner } from "../utils/
|
|
1
|
+
import type { CommandRunner } from "../utils/command-checks.js";
|
|
2
2
|
export declare function createDefaultCommandRunner(): CommandRunner;
|
|
@@ -4,8 +4,6 @@ export interface ConfigureCommandOptions {
|
|
|
4
4
|
apiKey?: string;
|
|
5
5
|
model?: string;
|
|
6
6
|
reasoningEffort?: string;
|
|
7
|
-
configName?: string;
|
|
8
|
-
baseUrl?: string;
|
|
9
7
|
}
|
|
10
8
|
export declare function registerConfigureCommand(program: Command, container: CliContainer): Command;
|
|
11
9
|
export declare function executeConfigure(program: Command, container: CliContainer, service: string, options: ConfigureCommandOptions): Promise<void>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { buildProviderContext, createExecutionResources, resolveCommandFlags, resolveServiceAdapter } from "./shared.js";
|
|
2
|
-
import { DEFAULT_MODEL, DEFAULT_REASONING, DEFAULT_ROO_BASE_URL, DEFAULT_ROO_CONFIG_NAME, DEFAULT_ROO_MODEL, DEFAULT_CLAUDE_MODEL } from "../constants.js";
|
|
1
|
+
import { buildProviderContext, createExecutionResources, resolveCommandFlags, resolveServiceAdapter, resolveProviderHandler } from "./shared.js";
|
|
3
2
|
import { renderServiceMenu } from "../ui/service-menu.js";
|
|
4
3
|
import { createMenuTheme } from "../ui/theme.js";
|
|
4
|
+
import { saveConfiguredService } from "../../services/credentials.js";
|
|
5
|
+
import { combineMutationObservers, createMutationReporter } from "../../services/mutation-events.js";
|
|
5
6
|
export function registerConfigureCommand(program, container) {
|
|
6
7
|
const configureCommand = program
|
|
7
8
|
.command("configure")
|
|
@@ -10,8 +11,6 @@ export function registerConfigureCommand(program, container) {
|
|
|
10
11
|
.option("--api-key <key>", "Poe API key")
|
|
11
12
|
.option("--model <model>", "Model identifier")
|
|
12
13
|
.option("--reasoning-effort <level>", "Reasoning effort level")
|
|
13
|
-
.option("--config-name <name>", "Configuration profile name")
|
|
14
|
-
.option("--base-url <url>", "API base URL")
|
|
15
14
|
.action(async (service, options) => {
|
|
16
15
|
const resolved = await resolveServiceArgument(program, container, service);
|
|
17
16
|
await executeConfigure(program, container, resolved, options);
|
|
@@ -28,13 +27,38 @@ export async function executeConfigure(program, container, service, options) {
|
|
|
28
27
|
container,
|
|
29
28
|
flags,
|
|
30
29
|
options,
|
|
31
|
-
|
|
30
|
+
context: providerContext,
|
|
31
|
+
adapter
|
|
32
32
|
});
|
|
33
33
|
await container.registry.invoke(service, "configure", async (entry) => {
|
|
34
34
|
if (!entry.configure) {
|
|
35
35
|
throw new Error(`Service "${service}" does not support configure.`);
|
|
36
36
|
}
|
|
37
|
-
await entry
|
|
37
|
+
const resolution = await resolveProviderHandler(entry, providerContext);
|
|
38
|
+
const tracker = createMutationTracker();
|
|
39
|
+
const mutationLogger = createMutationReporter(resources.logger);
|
|
40
|
+
const observers = combineMutationObservers(tracker.observers, mutationLogger);
|
|
41
|
+
await resolution.adapter.configure({
|
|
42
|
+
fs: providerContext.command.fs,
|
|
43
|
+
env: providerContext.env,
|
|
44
|
+
command: providerContext.command,
|
|
45
|
+
options: payload
|
|
46
|
+
}, observers
|
|
47
|
+
? {
|
|
48
|
+
observers
|
|
49
|
+
}
|
|
50
|
+
: undefined);
|
|
51
|
+
if (!flags.dryRun) {
|
|
52
|
+
await saveConfiguredService({
|
|
53
|
+
fs: container.fs,
|
|
54
|
+
filePath: providerContext.env.credentialsPath,
|
|
55
|
+
service,
|
|
56
|
+
metadata: {
|
|
57
|
+
version: resolution.version,
|
|
58
|
+
files: tracker.files()
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
38
62
|
});
|
|
39
63
|
const dryMessage = service === "claude-code"
|
|
40
64
|
? `${adapter.label} (dry run)`
|
|
@@ -45,23 +69,25 @@ export async function executeConfigure(program, container, service, options) {
|
|
|
45
69
|
});
|
|
46
70
|
}
|
|
47
71
|
async function createConfigurePayload(init) {
|
|
48
|
-
const { service, container, flags, options,
|
|
49
|
-
const mutationHooks = resources.mutationHooks;
|
|
72
|
+
const { service, container, flags, options, context, adapter } = init;
|
|
50
73
|
switch (service) {
|
|
51
74
|
case "claude-code": {
|
|
52
75
|
const apiKey = await container.options.resolveApiKey({
|
|
53
76
|
value: options.apiKey,
|
|
54
77
|
dryRun: flags.dryRun
|
|
55
78
|
});
|
|
56
|
-
const
|
|
79
|
+
const modelPrompt = requireModelPrompt(adapter);
|
|
80
|
+
const defaultModel = await container.options.resolveModel({
|
|
57
81
|
value: options.model,
|
|
58
|
-
|
|
59
|
-
|
|
82
|
+
assumeDefault: flags.assumeYes,
|
|
83
|
+
defaultValue: modelPrompt.defaultValue,
|
|
84
|
+
choices: modelPrompt.choices,
|
|
85
|
+
label: modelPrompt.label
|
|
60
86
|
});
|
|
61
87
|
return {
|
|
88
|
+
env: context.env,
|
|
62
89
|
apiKey,
|
|
63
|
-
defaultModel
|
|
64
|
-
mutationHooks
|
|
90
|
+
defaultModel
|
|
65
91
|
};
|
|
66
92
|
}
|
|
67
93
|
case "codex": {
|
|
@@ -69,13 +95,25 @@ async function createConfigurePayload(init) {
|
|
|
69
95
|
value: options.apiKey,
|
|
70
96
|
dryRun: flags.dryRun
|
|
71
97
|
});
|
|
72
|
-
const
|
|
73
|
-
const
|
|
98
|
+
const modelPrompt = requireModelPrompt(adapter);
|
|
99
|
+
const model = await container.options.resolveModel({
|
|
100
|
+
value: options.model,
|
|
101
|
+
assumeDefault: flags.assumeYes,
|
|
102
|
+
defaultValue: modelPrompt.defaultValue,
|
|
103
|
+
choices: modelPrompt.choices,
|
|
104
|
+
label: modelPrompt.label
|
|
105
|
+
});
|
|
106
|
+
const reasoningPrompt = requireReasoningPrompt(adapter);
|
|
107
|
+
const reasoningEffort = await container.options.resolveReasoning({
|
|
108
|
+
value: options.reasoningEffort,
|
|
109
|
+
defaultValue: reasoningPrompt.defaultValue,
|
|
110
|
+
label: reasoningPrompt.label
|
|
111
|
+
});
|
|
74
112
|
return {
|
|
113
|
+
env: context.env,
|
|
75
114
|
apiKey,
|
|
76
115
|
model,
|
|
77
|
-
reasoningEffort
|
|
78
|
-
mutationHooks
|
|
116
|
+
reasoningEffort
|
|
79
117
|
};
|
|
80
118
|
}
|
|
81
119
|
case "opencode": {
|
|
@@ -83,31 +121,58 @@ async function createConfigurePayload(init) {
|
|
|
83
121
|
value: options.apiKey,
|
|
84
122
|
dryRun: flags.dryRun
|
|
85
123
|
});
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
value: options.apiKey,
|
|
94
|
-
dryRun: flags.dryRun
|
|
124
|
+
const modelPrompt = requireModelPrompt(adapter);
|
|
125
|
+
const model = await container.options.resolveModel({
|
|
126
|
+
value: options.model,
|
|
127
|
+
assumeDefault: flags.assumeYes,
|
|
128
|
+
defaultValue: modelPrompt.defaultValue,
|
|
129
|
+
choices: modelPrompt.choices,
|
|
130
|
+
label: modelPrompt.label
|
|
95
131
|
});
|
|
96
|
-
const model = await container.options.resolveModel(options.model, DEFAULT_ROO_MODEL);
|
|
97
|
-
const configName = await container.options.resolveConfigName(options.configName, DEFAULT_ROO_CONFIG_NAME);
|
|
98
|
-
const baseUrl = options.baseUrl ?? DEFAULT_ROO_BASE_URL;
|
|
99
132
|
return {
|
|
133
|
+
env: context.env,
|
|
100
134
|
apiKey,
|
|
101
|
-
model
|
|
102
|
-
baseUrl,
|
|
103
|
-
configName,
|
|
104
|
-
mutationHooks
|
|
135
|
+
model
|
|
105
136
|
};
|
|
106
137
|
}
|
|
107
138
|
default:
|
|
108
139
|
throw new Error(`Unknown service "${service}".`);
|
|
109
140
|
}
|
|
110
141
|
}
|
|
142
|
+
function createMutationTracker() {
|
|
143
|
+
const targets = new Set();
|
|
144
|
+
const observers = {
|
|
145
|
+
onComplete(details, outcome) {
|
|
146
|
+
if (!outcome.changed || !details.targetPath) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (outcome.effect !== "write" && outcome.effect !== "delete") {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
targets.add(details.targetPath);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
return {
|
|
156
|
+
observers,
|
|
157
|
+
files() {
|
|
158
|
+
return Array.from(targets).sort();
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function requireModelPrompt(adapter) {
|
|
163
|
+
const prompt = adapter.configurePrompts?.model;
|
|
164
|
+
if (!prompt) {
|
|
165
|
+
throw new Error(`${adapter.label} must define a model prompt.`);
|
|
166
|
+
}
|
|
167
|
+
return prompt;
|
|
168
|
+
}
|
|
169
|
+
function requireReasoningPrompt(adapter) {
|
|
170
|
+
const prompt = adapter.configurePrompts?.reasoningEffort;
|
|
171
|
+
if (!prompt) {
|
|
172
|
+
throw new Error(`${adapter.label} must define a reasoning prompt.`);
|
|
173
|
+
}
|
|
174
|
+
return prompt;
|
|
175
|
+
}
|
|
111
176
|
export async function resolveServiceArgument(program, container, provided) {
|
|
112
177
|
if (provided) {
|
|
113
178
|
return provided;
|
|
@@ -119,7 +184,7 @@ export async function resolveServiceArgument(program, container, provided) {
|
|
|
119
184
|
const flags = resolveCommandFlags(program);
|
|
120
185
|
const logger = container.loggerFactory.create({
|
|
121
186
|
dryRun: flags.dryRun,
|
|
122
|
-
verbose:
|
|
187
|
+
verbose: true,
|
|
123
188
|
scope: "configure"
|
|
124
189
|
});
|
|
125
190
|
const menuTheme = createMenuTheme(container.env);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/cli/commands/configure.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../src/cli/commands/configure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CliContainer } from "../container.js";
|
|
3
|
+
export declare function registerDoctorCommand(program: Command, container: CliContainer): Command;
|
|
4
|
+
export declare function executeDoctor(program: Command, container: CliContainer): Promise<void>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { buildProviderContext, createExecutionResources, resolveCommandFlags, resolveServiceAdapter, resolveProviderHandler } from "./shared.js";
|
|
2
|
+
import { loadConfiguredServices } from "../../services/credentials.js";
|
|
3
|
+
import { executeConfigure } from "./configure.js";
|
|
4
|
+
import { executeRemove } from "./remove.js";
|
|
5
|
+
export function registerDoctorCommand(program, container) {
|
|
6
|
+
return program
|
|
7
|
+
.command("doctor")
|
|
8
|
+
.description("Check installed agent versions and refresh outdated configurations.")
|
|
9
|
+
.action(async () => {
|
|
10
|
+
await executeDoctor(program, container);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export async function executeDoctor(program, container) {
|
|
14
|
+
const configured = await loadConfiguredServices({
|
|
15
|
+
fs: container.fs,
|
|
16
|
+
filePath: container.env.credentialsPath
|
|
17
|
+
});
|
|
18
|
+
const services = Object.entries(configured);
|
|
19
|
+
if (services.length === 0) {
|
|
20
|
+
const logger = container.loggerFactory.create({ scope: "doctor" });
|
|
21
|
+
logger.info("No configured services found to inspect.");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const flags = resolveCommandFlags(program);
|
|
25
|
+
for (const [service, metadata] of services) {
|
|
26
|
+
await reconcileService({
|
|
27
|
+
program,
|
|
28
|
+
container,
|
|
29
|
+
service,
|
|
30
|
+
metadata: metadata ?? { version: null, files: [] },
|
|
31
|
+
flags
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function reconcileService(context) {
|
|
36
|
+
const { program, container, service, metadata, flags } = context;
|
|
37
|
+
let adapter;
|
|
38
|
+
try {
|
|
39
|
+
adapter = resolveServiceAdapter(container, service);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const logger = container.loggerFactory.create({ scope: `doctor:${service}` });
|
|
43
|
+
logger.warn(`Skipping unknown service "${service}": ${error instanceof Error ? error.message : String(error)}`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const resources = createExecutionResources(container, flags, `doctor:${service}`);
|
|
47
|
+
const providerContext = buildProviderContext(container, adapter, resources);
|
|
48
|
+
const resolution = await resolveProviderHandler(adapter, providerContext);
|
|
49
|
+
const detectedVersion = resolution.version;
|
|
50
|
+
const storedVersion = metadata.version ?? null;
|
|
51
|
+
if (detectedVersion == null) {
|
|
52
|
+
resources.logger.warn(`${adapter.label}: unable to detect CLI version; skipping refresh.`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!needsRefresh(storedVersion, detectedVersion)) {
|
|
56
|
+
resources.logger.info(`${adapter.label} is up to date (version ${detectedVersion}).`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (flags.dryRun) {
|
|
60
|
+
resources.logger.dryRun(`Dry run: would refresh ${adapter.label} from ${storedVersion ?? "unknown"} to ${detectedVersion}.`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
resources.logger.info(`Refreshing ${adapter.label} from ${storedVersion ?? "unknown"} to ${detectedVersion}.`);
|
|
64
|
+
await executeRemove(program, container, service, {});
|
|
65
|
+
await executeConfigure(program, container, service, {});
|
|
66
|
+
}
|
|
67
|
+
function needsRefresh(stored, detected) {
|
|
68
|
+
if (stored == null && detected == null) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return stored !== detected;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,qBAAqB,CACnC,OAAgB,EAChB,SAAuB;IAEvB,OAAO,OAAO;SACX,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAgB,EAChB,SAAuB;IAEvB,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC;QAC9C,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,eAAe;KACxC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC3C,MAAM,gBAAgB,CAAC;YACrB,OAAO;YACP,SAAS;YACT,OAAO;YACP,QAAQ,EAAE,QAAQ,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YAClD,KAAK;SACN,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAUD,KAAK,UAAU,gBAAgB,CAAC,OAAsB;IACpD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACjE,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAI,CAAC,6BAA6B,OAAO,MAC9C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CAAC,CAAC;QACJ,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,wBAAwB,CACxC,SAAS,EACT,KAAK,EACL,UAAU,OAAO,EAAE,CACpB,CAAC;IACF,MAAM,eAAe,GAAG,oBAAoB,CAC1C,SAAS,EACT,OAAO,EACP,SAAS,CACV,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAC1E,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC;IAC3C,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC;IAE/C,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,SAAS,CAAC,MAAM,CAAC,IAAI,CACnB,GAAG,OAAO,CAAC,KAAK,mDAAmD,CACpE,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,eAAe,CAAC,EAAE,CAAC;QAClD,SAAS,CAAC,MAAM,CAAC,IAAI,CACnB,GAAG,OAAO,CAAC,KAAK,2BAA2B,eAAe,IAAI,CAC/D,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,SAAS,CAAC,MAAM,CAAC,MAAM,CACrB,0BAA0B,OAAO,CAAC,KAAK,SAAS,aAAa,IAAI,SAAS,OAAO,eAAe,GAAG,CACpG,CAAC;QACF,OAAO;IACT,CAAC;IAED,SAAS,CAAC,MAAM,CAAC,IAAI,CACnB,cAAc,OAAO,CAAC,KAAK,SAAS,aAAa,IAAI,SAAS,OAAO,eAAe,GAAG,CACxF,CAAC;IACF,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,YAAY,CAAC,MAAqB,EAAE,QAAuB;IAClE,IAAI,MAAM,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,KAAK,QAAQ,CAAC;AAC7B,CAAC"}
|
|
@@ -4,3 +4,4 @@ export interface RemoveCommandOptions {
|
|
|
4
4
|
configName?: string;
|
|
5
5
|
}
|
|
6
6
|
export declare function registerRemoveCommand(program: Command, container: CliContainer): Command;
|
|
7
|
+
export declare function executeRemove(program: Command, container: CliContainer, service: string, options: RemoveCommandOptions): Promise<void>;
|
|
@@ -1,42 +1,66 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { removeConfiguredService } from "../../services/credentials.js";
|
|
2
|
+
import { createMutationReporter } from "../../services/mutation-events.js";
|
|
3
|
+
import { buildProviderContext, createExecutionResources, resolveCommandFlags, resolveServiceAdapter, resolveProviderHandler } from "./shared.js";
|
|
3
4
|
export function registerRemoveCommand(program, container) {
|
|
4
5
|
return program
|
|
5
6
|
.command("remove")
|
|
6
7
|
.description("Remove existing Poe API tooling configuration.")
|
|
7
|
-
.argument("<service>", "Service to remove (claude-code | codex | opencode
|
|
8
|
-
.option("--config-name <name>", "Configuration profile name")
|
|
8
|
+
.argument("<service>", "Service to remove (claude-code | codex | opencode)")
|
|
9
9
|
.action(async (service, options) => {
|
|
10
10
|
await executeRemove(program, container, service, options);
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
|
-
async function executeRemove(program, container, service, options) {
|
|
13
|
+
export async function executeRemove(program, container, service, options) {
|
|
14
14
|
const adapter = resolveServiceAdapter(container, service);
|
|
15
15
|
const flags = resolveCommandFlags(program);
|
|
16
16
|
const resources = createExecutionResources(container, flags, `remove:${service}`);
|
|
17
17
|
const providerContext = buildProviderContext(container, adapter, resources);
|
|
18
|
-
const
|
|
18
|
+
const mutationLogger = createMutationReporter(resources.logger);
|
|
19
|
+
const payload = await createRemovePayload({
|
|
20
|
+
service,
|
|
21
|
+
container,
|
|
22
|
+
options,
|
|
23
|
+
context: providerContext
|
|
24
|
+
});
|
|
19
25
|
const removed = await container.registry.invoke(service, "remove", async (entry) => {
|
|
20
26
|
if (!entry.remove) {
|
|
21
27
|
throw new Error(`Service "${service}" does not support remove.`);
|
|
22
28
|
}
|
|
23
|
-
|
|
29
|
+
const resolution = await resolveProviderHandler(entry, providerContext);
|
|
30
|
+
if (!resolution.adapter.remove) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return await resolution.adapter.remove({
|
|
34
|
+
fs: providerContext.command.fs,
|
|
35
|
+
env: providerContext.env,
|
|
36
|
+
command: providerContext.command,
|
|
37
|
+
options: payload
|
|
38
|
+
}, { observers: mutationLogger });
|
|
24
39
|
});
|
|
40
|
+
if (!flags.dryRun) {
|
|
41
|
+
await removeConfiguredService({
|
|
42
|
+
fs: container.fs,
|
|
43
|
+
filePath: providerContext.env.credentialsPath,
|
|
44
|
+
service
|
|
45
|
+
});
|
|
46
|
+
}
|
|
25
47
|
const messages = formatRemovalMessages(service, adapter.label, removed, payload);
|
|
26
48
|
resources.context.complete(messages);
|
|
27
49
|
}
|
|
28
|
-
async function createRemovePayload(
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
50
|
+
async function createRemovePayload(init) {
|
|
51
|
+
const { service, context } = init;
|
|
52
|
+
switch (service) {
|
|
53
|
+
case "claude-code":
|
|
54
|
+
return { env: context.env };
|
|
55
|
+
case "codex":
|
|
56
|
+
return { env: context.env };
|
|
57
|
+
case "opencode":
|
|
58
|
+
return { env: context.env };
|
|
59
|
+
default:
|
|
60
|
+
return {};
|
|
36
61
|
}
|
|
37
|
-
return { mutationHooks };
|
|
38
62
|
}
|
|
39
|
-
function formatRemovalMessages(service, label, removed,
|
|
63
|
+
function formatRemovalMessages(service, label, removed, _payload) {
|
|
40
64
|
const didRemove = typeof removed === "boolean" ? removed : Boolean(removed);
|
|
41
65
|
switch (service) {
|
|
42
66
|
case "claude-code":
|
|
@@ -60,17 +84,6 @@ function formatRemovalMessages(service, label, removed, payload) {
|
|
|
60
84
|
: "No OpenCode CLI configuration found.",
|
|
61
85
|
dry: "Dry run: would remove OpenCode CLI configuration."
|
|
62
86
|
};
|
|
63
|
-
case "roo-code": {
|
|
64
|
-
const configName = typeof payload.configName === "string"
|
|
65
|
-
? payload.configName
|
|
66
|
-
: DEFAULT_ROO_CONFIG_NAME;
|
|
67
|
-
return {
|
|
68
|
-
success: didRemove
|
|
69
|
-
? `Removed Roo Code configuration "${configName}".`
|
|
70
|
-
: `No Roo Code configuration named "${configName}" found.`,
|
|
71
|
-
dry: "Dry run: would remove Roo Code configuration."
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
87
|
default:
|
|
75
88
|
return {
|
|
76
89
|
success: didRemove
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/cli/commands/remove.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/cli/commands/remove.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,22 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
2
|
import type { CliContainer } from "../container.js";
|
|
3
|
-
import type {
|
|
4
|
-
import {
|
|
3
|
+
import type { ProviderService, ProviderContext } from "../service-registry.js";
|
|
4
|
+
import { type CommandContext } from "../context.js";
|
|
5
5
|
import type { ScopedLogger } from "../logger.js";
|
|
6
|
-
import type { ServiceMutationHooks } from "../../services/service-manifest.js";
|
|
7
|
-
import type { PrerequisitePhase } from "../../utils/prerequisites.js";
|
|
8
6
|
export interface CommandFlags {
|
|
9
7
|
dryRun: boolean;
|
|
10
|
-
verbose: boolean;
|
|
11
8
|
assumeYes: boolean;
|
|
12
9
|
}
|
|
13
10
|
export interface ExecutionResources {
|
|
14
11
|
logger: ScopedLogger;
|
|
15
12
|
context: CommandContext;
|
|
16
|
-
mutationHooks?: ServiceMutationHooks;
|
|
17
|
-
recordMutation?: (entry: MutationLogEntry) => void;
|
|
18
13
|
}
|
|
19
14
|
export declare function resolveCommandFlags(program: Command): CommandFlags;
|
|
20
15
|
export declare function createExecutionResources(container: CliContainer, flags: CommandFlags, scope: string): ExecutionResources;
|
|
21
|
-
export declare function buildProviderContext(container: CliContainer, adapter:
|
|
22
|
-
export
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
export declare function buildProviderContext(container: CliContainer, adapter: ProviderService, resources: ExecutionResources): ProviderContext;
|
|
17
|
+
export interface ProviderResolution {
|
|
18
|
+
adapter: ProviderService;
|
|
19
|
+
version: string | null;
|
|
20
|
+
}
|
|
21
|
+
export declare function resolveProviderHandler(adapter: ProviderService, context: ProviderContext): Promise<ProviderResolution>;
|
|
22
|
+
export declare function resolveServiceAdapter(container: CliContainer, service: string): ProviderService;
|