poe-code 3.0.28 → 3.0.30

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 CHANGED
@@ -1,60 +1,73 @@
1
- # poe-code
1
+ ![poe-code banner](docs/banners/claude-opus-4-6.jpg)
2
2
 
3
- > Configure coding agents to use the Poe API.
3
+ <div align="center">
4
+ <h1>Poe Code ⚡</h1>
4
5
 
5
- ## Try it in 1 minute
6
+ <a href="https://poe.com"><img src="https://img.shields.io/badge/Poe-Sign up-purple?logo=poe&logoColor=white&color=5D5CDE&style=for-the-badge" alt="Discord"></a>
7
+ <a href="https://www.npmjs.com/package/poe-code"><img alt="NPM version" src="https://img.shields.io/npm/v/next.svg?&style=for-the-badge&color=09B16B"></a>
8
+ <a href="https://discord.gg/joinpoe"><img src="https://img.shields.io/badge/Discord-Join-purple?logo=discord&logoColor=white&color=FF44D3&style=for-the-badge" alt="Discord"></a>
6
9
 
7
- ```bash
8
- # Install Poe wrapper binaries.
9
- npm install -g poe-code
10
+ </div>
10
11
 
11
- # Run your existing agent CLI through Poe (you’ll be prompted for api key on first run).
12
- poe-claude --help
13
- ```
12
+ Power your favorite coding agents (Claude Code, Codex, OpenCode, and more) with your Poe subscription—**no need to handle multiple providers/accounts.** Poe Code routes everything through the [Poe API](https://poe.com/api) .
14
13
 
15
- Also available: `poe-codex`, `poe-opencode`.
14
+ Use it of a single session (`poe-code wrap claude`) or configure it as your default and use your tools normally.
16
15
 
17
- ## Make it default
18
-
19
- This updates the provider’s config files so you can use the provider CLI directly.
20
16
 
17
+ ## Quickstart
18
+ Start a coding session routing all your `claude` calls to Poe
21
19
  ```bash
22
- # Claude Code
23
- npx poe-code@latest configure claude-code
20
+ npx poe-code wrap claude
21
+ # Also available: codex, opencode, kimi
22
+ ```
24
23
 
25
- # Codex
26
- npx poe-code@latest configure codex
24
+ or
27
25
 
28
- # OpenCode
29
- npx poe-code@latest configure opencode
26
+ ## Set it as your default (works with CLIs and desktop apps)
27
+ This updates the provider’s config files so you can use the provider CLI directly.
30
28
 
31
- # Kimi
32
- npx poe-code@latest configure kimi
29
+ ```bash
30
+ # Start the interactive setup
31
+ npx poe-code configure
32
+
33
+ # Setup a specific agent
34
+ npx poe-code@latest configure codex # (or claude, opencode, kimi)
33
35
  ```
34
36
 
37
+
35
38
  ### Unconfigure (remove overrides)
36
39
 
37
40
  ```bash
38
- npx poe-code@latest unconfigure claude-code
41
+ npx poe-code unconfigure claude
39
42
  ```
40
43
 
44
+
45
+ ## Quick links
46
+ - [Utilities](#utilities)
47
+ - [Usage and Billing](#usage--billing)
48
+ - [MCP Server](#poe-mcp-server)
49
+ - [SDK](#sdk)
50
+ - [Poe API](https://poe.com/api)
51
+
52
+
53
+
41
54
  ## Utilities
42
55
 
43
56
  Utilities are especially useful for scripting and CI/CD.
44
57
 
45
- ### Spawn a one-off prompt
58
+ #### Spawn a one-off prompt
46
59
 
47
60
  ```bash
48
61
  npx poe-code@latest spawn codex "Say hello"
49
62
  ```
50
63
 
51
- ### Spawn a prompt via stdin
64
+ #### Spawn a prompt via stdin
52
65
 
53
66
  ```bash
54
67
  echo "Say hello" | npx poe-code@latest spawn codex
55
68
  ```
56
69
 
57
- ### Test a configured service
70
+ #### Test a configured service
58
71
 
59
72
  ```bash
60
73
  npx poe-code@latest test codex
package/dist/index.js CHANGED
@@ -692,8 +692,8 @@ async function applyChmod(mutation, context, options) {
692
692
  };
693
693
  }
694
694
  try {
695
- const stat3 = await context.fs.stat(targetPath);
696
- const currentMode = typeof stat3.mode === "number" ? stat3.mode & 511 : null;
695
+ const stat4 = await context.fs.stat(targetPath);
696
+ const currentMode = typeof stat4.mode === "number" ? stat4.mode & 511 : null;
697
697
  if (currentMode === mutation.mode) {
698
698
  return {
699
699
  outcome: { changed: false, effect: "none", detail: "noop" },
@@ -33921,8 +33921,8 @@ function backoff(attempt, min, max) {
33921
33921
  }
33922
33922
  async function tryRemoveStale(lockPath, staleMs, fs3) {
33923
33923
  try {
33924
- const stat3 = await fs3.stat(lockPath);
33925
- if (Date.now() - stat3.mtimeMs > staleMs) {
33924
+ const stat4 = await fs3.stat(lockPath);
33925
+ if (Date.now() - stat4.mtimeMs > staleMs) {
33926
33926
  await fs3.rmdir(lockPath);
33927
33927
  return true;
33928
33928
  }
@@ -35107,13 +35107,22 @@ async function listPlanCandidates(fs3, cwd) {
35107
35107
  if (!stats.isFile()) {
35108
35108
  continue;
35109
35109
  }
35110
- candidates.push(path12.relative(cwd, absPath2));
35110
+ const relativePath = path12.relative(cwd, absPath2);
35111
+ const content = await fs3.readFile(absPath2, "utf8");
35112
+ const plan = parsePlan(content);
35113
+ const done = plan.stories.filter((s) => s.status === "done").length;
35114
+ const total = plan.stories.length;
35115
+ candidates.push({ path: relativePath, done, total });
35111
35116
  }
35112
- candidates.sort((a, b) => a.localeCompare(b));
35117
+ candidates.sort((a, b) => a.path.localeCompare(b.path));
35113
35118
  return candidates;
35114
35119
  }
35115
35120
  async function resolvePlanPath(options) {
35116
- const fs3 = options.fs ?? fsPromises6;
35121
+ const fs3 = options.fs ?? {
35122
+ readdir: fsPromises6.readdir,
35123
+ stat: fsPromises6.stat,
35124
+ readFile: fsPromises6.readFile
35125
+ };
35117
35126
  const cwd = options.cwd;
35118
35127
  const provided = options.plan?.trim();
35119
35128
  if (provided) {
@@ -35143,13 +35152,13 @@ async function resolvePlanPath(options) {
35143
35152
  return null;
35144
35153
  }
35145
35154
  if (candidates.length === 1) {
35146
- return candidates[0];
35155
+ return candidates[0].path;
35147
35156
  }
35148
35157
  const selection = await select2({
35149
35158
  message: "Select a plan file to use for this Ralph run",
35150
35159
  options: candidates.map((candidate) => ({
35151
- label: candidate,
35152
- value: candidate
35160
+ label: `${candidate.path} (${candidate.done}/${candidate.total})`,
35161
+ value: candidate.path
35153
35162
  }))
35154
35163
  });
35155
35164
  if (isCancel(selection)) {
@@ -36192,7 +36201,7 @@ function registerModelsCommand(program, container) {
36192
36201
  // package.json
36193
36202
  var package_default = {
36194
36203
  name: "poe-code",
36195
- version: "0.0.0-dev",
36204
+ version: "3.0.30",
36196
36205
  description: "CLI tool to configure Poe API for developer workflows.",
36197
36206
  type: "module",
36198
36207
  workspaces: [
@@ -36234,6 +36243,7 @@ var package_default = {
36234
36243
  "e2e:logs": "tsx packages/e2e-docker-test-runner/scripts/logs.ts",
36235
36244
  "e2e:logs:rotate": "tsx packages/e2e-docker-test-runner/scripts/logs.ts --rotate",
36236
36245
  "e2e:cache:clear": "rm -rf ~/.cache/poe-e2e",
36246
+ prepack: "npm run build",
36237
36247
  prepare: "husky"
36238
36248
  },
36239
36249
  bin: {
@@ -36241,7 +36251,8 @@ var package_default = {
36241
36251
  "poe-code-configure": "dist/bin.cjs",
36242
36252
  "poe-claude": "dist/bin/poe-claude.js",
36243
36253
  "poe-codex": "dist/bin/poe-codex.js",
36244
- "poe-opencode": "dist/bin/poe-opencode.js"
36254
+ "poe-opencode": "dist/bin/poe-opencode.js",
36255
+ "tiny-mcp-test-server": "packages/tiny-mcp-test-server/dist/index.js"
36245
36256
  },
36246
36257
  files: [
36247
36258
  "dist"
@@ -36270,6 +36281,7 @@ var package_default = {
36270
36281
  "@poe-code/e2e-docker-test-runner": "*",
36271
36282
  "@poe-code/freeze-cli": "*",
36272
36283
  "@poe-code/tiny-mcp-server": "*",
36284
+ "@poe-code/tiny-mcp-test-server": "*",
36273
36285
  "@types/mustache": "^4.2.6",
36274
36286
  "@types/node": "^20.12.7",
36275
36287
  "@types/semver": "^7.7.1",