@companion-ai/feynman 0.5.34 → 0.5.35

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/RELEASES.md CHANGED
@@ -6,6 +6,13 @@ GitHub release notes are generated from the matching `## vX.Y.Z` section in this
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## v0.5.35 - 2026-10-11
10
+
11
+ - **PubMed group authors keep their affiliations.** Consortium and study-group authors came back with no affiliations; they now keep them, as individual authors do. Thanks to @KennyMcSimpson (#335).
12
+ - **pi-subagents 0.77.0.** Subagent tools cost the lead agent far fewer tokens per request (the `subagent` tool's definition shrank from about 18,700 to 3,300 characters), and long subagent reports arrive as a preview plus the file path instead of the full text. Updating Feynman while a session is running no longer breaks every subagent launch in that session. A wrong agent or model name now comes back with suggestions.
13
+ - **pi-btw 0.8.0.** The `/btw` side-chat composer completes slash commands, and side threads no longer fail with Anthropic's "references unknown tool" error.
14
+ - `feynman -v` prints the version, and `--json`, `--work-dir` and `--path` now point to `--mode json` and `--cwd <dir>`.
15
+
9
16
  ## v0.5.34 - 2026-10-09
10
17
 
11
18
  - **OpenAlex lookups that miss now say why.** Looking up a name or title where OpenAlex expects an ID (for example `openalex_get_work:Attention is all you need` or `author: Geoffrey Hinton`), or an ID that does not exist, returned OpenAlex's raw HTML "404 Not Found" page. The error now says no such work, author or source exists and names the search command to use instead, so the agent recovers on its next call.
package/bin/feynman.js CHANGED
@@ -34,7 +34,7 @@ if (compareNodeVersions(parseNodeVersion(process.versions.node), parseNodeVersio
34
34
  const here = import.meta.dirname;
35
35
 
36
36
  // `--version` needs only package.json; answer it without loading the CLI.
37
- if (process.argv.length === 3 && process.argv[2] === "--version") {
37
+ if (process.argv.length === 3 && (process.argv[2] === "--version" || process.argv[2] === "-v")) {
38
38
  const { readFileSync } = await import("node:fs");
39
39
  console.log(JSON.parse(readFileSync(resolve(here, "..", "package.json"), "utf8")).version);
40
40
  process.exit(0);
package/dist/cli.js CHANGED
@@ -39,6 +39,9 @@ const UNKNOWN_OPTION_HINTS = {
39
39
  "--setup": "feynman setup",
40
40
  "--list-models": "feynman model list",
41
41
  "--new": "feynman --new-session",
42
+ "--json": "feynman --mode json",
43
+ "--work-dir": "feynman --cwd <dir>",
44
+ "--path": "feynman --cwd <dir>",
42
45
  };
43
46
  // Removed commands fail instead of falling through to a chat prompt.
44
47
  const REMOVED_COMMANDS = new Set(["jobs", "paper", "rank", "serve", "watch"]);
@@ -51,7 +54,7 @@ function printHelpLine(usage, description) {
51
54
  function printHelp(appRoot) {
52
55
  const workflowCommands = readPromptSpecs(appRoot).filter((command) => command.section === "Research Workflows" && command.topLevelCli);
53
56
  printAsciiHeader([
54
- "Research-first agent shell built on Pi.",
57
+ "The open source AI research agent.",
55
58
  "Use `feynman setup` first if this is a new machine.",
56
59
  ]);
57
60
  printSection("Getting Started");
@@ -465,7 +468,7 @@ async function runMain(input) {
465
468
  export: { type: "string" },
466
469
  fork: { type: "string" },
467
470
  help: { type: "boolean", short: "h" },
468
- version: { type: "boolean" },
471
+ version: { type: "boolean", short: "v" },
469
472
  "alpha-login": { type: "boolean" },
470
473
  "alpha-logout": { type: "boolean" },
471
474
  "alpha-status": { type: "boolean" },
@@ -133,11 +133,11 @@ function parseAuthors(value: unknown): Array<Record<string, unknown>> {
133
133
  return listValue(value).map((item) => {
134
134
  const author = recordValue(item);
135
135
  const collective = textValue(author.CollectiveName);
136
- if (collective) return { collectiveName: collective, affiliations: [] };
137
136
  const affiliations = listValue(author.AffiliationInfo)
138
137
  .flatMap((info) => listValue(recordValue(info).Affiliation))
139
138
  .map((affiliation) => textValue(affiliation))
140
139
  .filter((affiliation): affiliation is string => Boolean(affiliation));
140
+ if (collective) return { collectiveName: collective, affiliations };
141
141
  return prune({
142
142
  lastName: textValue(author.LastName),
143
143
  foreName: textValue(author.ForeName),
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@companion-ai/feynman",
3
- "version": "0.5.34",
4
- "description": "Research-first CLI agent built on Pi and alphaXiv",
3
+ "version": "0.5.35",
4
+ "description": "The open source AI research agent.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "engines": {
@@ -80,9 +80,9 @@
80
80
  "@clack/prompts": "^1.8.1",
81
81
  "@companion-ai/alpha-hub": "0.1.6",
82
82
  "fast-xml-parser": "5.11.1",
83
- "pi-btw": "0.7.1",
83
+ "pi-btw": "0.8.0",
84
84
  "pi-docparser": "4.0.0",
85
- "pi-subagents": "0.76.1",
85
+ "pi-subagents": "0.77.0",
86
86
  "pi-web-access": "0.38.0",
87
87
  "posthog-node": "^5.53.0"
88
88
  },