bkper 4.11.3 → 4.12.0

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
@@ -5,7 +5,7 @@
5
5
 
6
6
  A unified **interface for [Bkper](https://bkper.com)**. Use `bkper` in two complementary modes:
7
7
 
8
- - **Interactive mode** — run `bkper` with no arguments to open the agent TUI
8
+ - **Interactive mode** — run `bkper agent` to open the Bkper Agent TUI
9
9
  - **Command mode** — run `bkper <command>` for explicit CLI workflows, scripts, and automation
10
10
 
11
11
  With one tool, you can build and deploy Bkper apps, and manage financial data -- books, accounts, transactions, and balances.
@@ -45,10 +45,15 @@ bkper auth login
45
45
  ### Start using bkper
46
46
 
47
47
  ```bash
48
- # Interactive mode (agent TUI)
48
+ # Show CLI help
49
49
  bkper
50
50
  ```
51
51
 
52
+ ```bash
53
+ # Interactive mode (agent TUI)
54
+ bkper agent
55
+ ```
56
+
52
57
  ```bash
53
58
  # Command mode (explicit command)
54
59
  bkper book list
@@ -79,7 +84,7 @@ curl -s -H "Authorization: Bearer $TOKEN" \
79
84
 
80
85
  ## Interactive Mode (powered by Pi)
81
86
 
82
- When you run `bkper` with no arguments in an interactive terminal, bkper starts the embedded agent TUI.
87
+ Run `bkper agent` to start the embedded Bkper Agent TUI. Running `bkper` with no arguments shows CLI help.
83
88
 
84
89
  Bkper's agent mode is intentionally a **thin wrapper** around [Pi][Pi]:
85
90
 
@@ -95,25 +100,30 @@ On each agent startup, bkper performs a background CLI auto-update check (same b
95
100
  Use Pi CLI features directly through bkper:
96
101
 
97
102
  ```bash
98
- bkper agent -- <pi-args>
103
+ bkper agent <pi-args>
99
104
  ```
100
105
 
106
+ If no Pi arguments are provided, `bkper agent` starts the interactive Bkper Agent experience.
107
+ If Pi arguments are provided, everything after `bkper agent` is passed through to Pi.
108
+
101
109
  Examples:
102
110
 
103
111
  ```bash
104
- bkper agent -- -p "Summarize this repository"
105
- bkper agent -- --model openai/gpt-4o -c
106
- bkper agent -- install <pi-package-source>
112
+ bkper agent -p "Summarize this repository"
113
+ bkper agent --model openai/gpt-4o -c
114
+ bkper agent install <pi-package-source>
115
+ bkper agent --help
107
116
  ```
108
117
 
109
- `bkper agent` keeps Bkper defaults (including Bkper system prompt) unless you explicitly pass `--system-prompt`.
118
+ `bkper agent` keeps Bkper defaults (including the Bkper system prompt) unless you explicitly pass `--system-prompt`.
119
+ Use `bkper help agent` for the Bkper CLI command help, and `bkper agent --help` for Pi help.
110
120
 
111
121
  For all available passthrough flags and commands, see the Pi CLI reference:
112
122
  https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent#cli-reference
113
123
 
114
124
  Pi-specific extensions are loaded from Pi extension folders (for example `.pi/extensions` and `~/.pi/agent/extensions`).
115
125
 
116
- <!-- Suggested showcase media: add a short terminal GIF here (bkper -> "Bkper Agent ready." -> one prompt). -->
126
+ <!-- Suggested showcase media: add a short terminal GIF here (bkper agent -> "Bkper Agent ready." -> one prompt). -->
117
127
 
118
128
  ---
119
129
 
@@ -855,9 +865,10 @@ deployment:
855
865
  - `auth logout` - Remove stored credentials
856
866
  - `auth token` - Print the current OAuth access token to stdout
857
867
 
858
- #### Agent Bridge (Pi passthrough)
868
+ #### Agent
859
869
 
860
- - `agent -- <pi-args...>` - Run Pi CLI with Bkper defaults (system prompt/resources)
870
+ - `agent` - Start the interactive Bkper Agent
871
+ - `agent <pi-args...>` - Run Pi CLI with Bkper defaults (system prompt/resources)
861
872
 
862
873
  #### App Lifecycle
863
874
 
@@ -917,7 +928,8 @@ Bkper.setConfig({
917
928
 
918
929
  Releases are published by GitHub Actions (Trusted Publisher with OIDC), not from local machines.
919
930
 
920
- - Merge a PR into `main` with one release label: `release:patch`, `release:minor`, or `release:major`
921
- - On each `main` push, the delivery workflow checks the merged PR associated with that commit, computes the next version from the latest release tag, publishes to npm, and pushes the new tag
931
+ - Add one release label to a PR targeting `main`: `release:patch`, `release:minor`, or `release:major`
932
+ - Before merge, the PR version bump workflow updates `package.json` on the PR branch to the next version derived from the latest release tag
933
+ - On each `main` push, the delivery workflow checks the merged PR label, verifies `package.json` already contains the expected next version, publishes to npm, and pushes the new tag
922
934
  - Without a release label, publish is skipped
923
935
  - Dependabot Pi update PRs are automatically labeled `release:patch` and set to GitHub native auto-merge when repo auto-merge and required checks are enabled
@@ -1,6 +1,2 @@
1
- export interface CliDispatchEnvironment {
2
- stdinIsTTY: boolean;
3
- stdoutIsTTY: boolean;
4
- }
5
- export declare function shouldStartAgentMode(argv: string[], environment?: CliDispatchEnvironment): boolean;
1
+ export declare function shouldRunAgentCommand(argv: string[]): boolean;
6
2
  //# sourceMappingURL=cli-dispatch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-dispatch.d.ts","sourceRoot":"","sources":["../../src/agent/cli-dispatch.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,GAAE,sBAGZ,GACF,OAAO,CAET"}
1
+ {"version":3,"file":"cli-dispatch.d.ts","sourceRoot":"","sources":["../../src/agent/cli-dispatch.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAE7D"}
@@ -1,7 +1,4 @@
1
- export function shouldStartAgentMode(argv, environment = {
2
- stdinIsTTY: process.stdin.isTTY === true,
3
- stdoutIsTTY: process.stdout.isTTY === true,
4
- }) {
5
- return argv.length === 2 && environment.stdinIsTTY && environment.stdoutIsTTY;
1
+ export function shouldRunAgentCommand(argv) {
2
+ return argv[2] === 'agent';
6
3
  }
7
4
  //# sourceMappingURL=cli-dispatch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-dispatch.js","sourceRoot":"","sources":["../../src/agent/cli-dispatch.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,oBAAoB,CAChC,IAAc,EACd,cAAsC;IAClC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;IACxC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;CAC7C;IAED,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,WAAW,CAAC;AAClF,CAAC"}
1
+ {"version":3,"file":"cli-dispatch.js","sourceRoot":"","sources":["../../src/agent/cli-dispatch.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAChD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;AAC/B,CAAC"}
package/lib/cli.js CHANGED
@@ -19,15 +19,20 @@ import { registerTransactionCommands } from './commands/transactions/register.js
19
19
  import { registerBalanceCommands } from './commands/balances/register.js';
20
20
  import { registerCollectionCommands } from './commands/collections/register.js';
21
21
  import { registerUpgradeCommand } from './commands/upgrade.js';
22
- import { registerAgentCommands } from './commands/agent-command.js';
22
+ import { registerAgentCommands, runAgentCommand } from './commands/agent-command.js';
23
+ import { shouldRunAgentCommand } from './agent/cli-dispatch.js';
23
24
  import { VERSION, autoUpgrade } from './upgrade/index.js';
24
- import { shouldStartAgentMode } from './agent/cli-dispatch.js';
25
- import { runAgentMode } from './agent/run-agent-mode.js';
26
25
  function main() {
27
26
  return __awaiter(this, void 0, void 0, function* () {
28
- if (shouldStartAgentMode(process.argv)) {
29
- yield runAgentMode();
30
- return;
27
+ if (shouldRunAgentCommand(process.argv)) {
28
+ try {
29
+ yield runAgentCommand(process.argv.slice(3));
30
+ return;
31
+ }
32
+ catch (err) {
33
+ console.error('Error running agent command:', err);
34
+ process.exit(1);
35
+ }
31
36
  }
32
37
  // Version
33
38
  program.version(VERSION, '-v, --version');
package/lib/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;AAEA,OAAO,eAAe,CAAC,CAAC,sDAAsD;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,SAAe,IAAI;;QACf,IAAI,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACX,CAAC;QAED,UAAU;QACV,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAE1C,+BAA+B;QAC/B,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,EAAE,OAAO,CAAC,CAAC;QACnF,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;QAErE,gBAAgB;QAChB,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE9B,oBAAoB;QACpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACjC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC/B,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACrC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACjC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAEpC,uBAAuB;QACvB,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAE/B,kBAAkB;QAClB,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAEhC,4EAA4E;QAC5E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;YACxC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CAAA;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;AAEA,OAAO,eAAe,CAAC,CAAC,sDAAsD;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE1D,SAAe,IAAI;;QACf,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC;gBACD,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACX,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QAED,UAAU;QACV,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAE1C,+BAA+B;QAC/B,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,EAAE,OAAO,CAAC,CAAC;QACnF,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;QAErE,gBAAgB;QAChB,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE9B,oBAAoB;QACpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACjC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC/B,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACrC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACjC,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAEpC,uBAAuB;QACvB,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAE/B,kBAAkB;QAClB,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAEhC,4EAA4E;QAC5E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;YACxC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CAAA;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import type { Command } from 'commander';
2
2
  export interface AgentCommandDependencies {
3
3
  runPi: (args: string[]) => Promise<void>;
4
+ runInteractiveMode: () => Promise<void>;
4
5
  }
5
- export declare function registerAgentCommands(program: Command, dependencies?: AgentCommandDependencies): void;
6
+ export declare function runAgentCommand(piArgs: string[], dependencies?: AgentCommandDependencies): Promise<void>;
7
+ export declare function registerAgentCommands(program: Command): void;
6
8
  //# sourceMappingURL=agent-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-command.d.ts","sourceRoot":"","sources":["../../src/commands/agent-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,MAAM,WAAW,wBAAwB;IACrC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAoBD,wBAAgB,qBAAqB,CACjC,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE,wBAAsD,GACrE,IAAI,CAeN"}
1
+ {"version":3,"file":"agent-command.d.ts","sourceRoot":"","sources":["../../src/commands/agent-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,MAAM,WAAW,wBAAwB;IACrC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAqBD,wBAAsB,eAAe,CACjC,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,GAAE,wBAAsD,GACrE,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAM5D"}
@@ -8,10 +8,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { main as runPiMain } from '@mariozechner/pi-coding-agent';
11
+ import { runAgentMode } from '../agent/run-agent-mode.js';
11
12
  import { getBkperAgentSystemPrompt } from '../agent/system-prompt.js';
12
13
  function createDefaultDependencies() {
13
14
  return {
14
15
  runPi: (args) => runPiMain(args),
16
+ runInteractiveMode: () => runAgentMode(),
15
17
  };
16
18
  }
17
19
  function hasSystemPromptArg(args) {
@@ -23,21 +25,21 @@ function buildPiArgs(args) {
23
25
  }
24
26
  return ['--system-prompt', getBkperAgentSystemPrompt(), ...args];
25
27
  }
26
- export function registerAgentCommands(program, dependencies = createDefaultDependencies()) {
28
+ export function runAgentCommand(piArgs_1) {
29
+ return __awaiter(this, arguments, void 0, function* (piArgs, dependencies = createDefaultDependencies()) {
30
+ if (piArgs.length === 0) {
31
+ yield dependencies.runInteractiveMode();
32
+ return;
33
+ }
34
+ const args = buildPiArgs(piArgs);
35
+ yield dependencies.runPi(args);
36
+ });
37
+ }
38
+ export function registerAgentCommands(program) {
27
39
  program
28
40
  .command('agent [piArgs...]')
29
- .description('Run Pi CLI with Bkper defaults (passthrough)')
41
+ .description('Start Bkper Agent or run Pi CLI with Bkper defaults')
30
42
  .allowUnknownOption(true)
31
- .allowExcessArguments(true)
32
- .action((...args_1) => __awaiter(this, [...args_1], void 0, function* (piArgs = []) {
33
- try {
34
- const args = buildPiArgs(piArgs);
35
- yield dependencies.runPi(args);
36
- }
37
- catch (err) {
38
- console.error('Error running agent command:', err);
39
- process.exit(1);
40
- }
41
- }));
43
+ .allowExcessArguments(true);
42
44
  }
43
45
  //# sourceMappingURL=agent-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-command.js","sourceRoot":"","sources":["../../src/commands/agent-command.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAMtE,SAAS,yBAAyB;IAC9B,OAAO;QACH,KAAK,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;KAC7C,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAc;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,iBAAiB,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,WAAW,CAAC,IAAc;IAC/B,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,qBAAqB,CACjC,OAAgB,EAChB,eAAyC,yBAAyB,EAAE;IAEpE,OAAO;SACF,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,8CAA8C,CAAC;SAC3D,kBAAkB,CAAC,IAAI,CAAC;SACxB,oBAAoB,CAAC,IAAI,CAAC;SAC1B,MAAM,CAAC,YAA8B,EAAE,iDAAzB,SAAmB,EAAE;QAChC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC,CAAA,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"agent-command.js","sourceRoot":"","sources":["../../src/commands/agent-command.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAOtE,SAAS,yBAAyB;IAC9B,OAAO;QACH,KAAK,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1C,kBAAkB,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE;KAC3C,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAc;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,iBAAiB,IAAI,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,WAAW,CAAC,IAAc;IAC/B,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAgB,eAAe;yDACjC,MAAgB,EAChB,eAAyC,yBAAyB,EAAE;QAEpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,YAAY,CAAC,kBAAkB,EAAE,CAAC;YACxC,OAAO;QACX,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CAAA;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IAClD,OAAO;SACF,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,qDAAqD,CAAC;SAClE,kBAAkB,CAAC,IAAI,CAAC;SACxB,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
@@ -5,7 +5,7 @@
5
5
 
6
6
  A unified **interface for [Bkper](https://bkper.com)**. Use `bkper` in two complementary modes:
7
7
 
8
- - **Interactive mode** — run `bkper` with no arguments to open the agent TUI
8
+ - **Interactive mode** — run `bkper agent` to open the Bkper Agent TUI
9
9
  - **Command mode** — run `bkper <command>` for explicit CLI workflows, scripts, and automation
10
10
 
11
11
  With one tool, you can build and deploy Bkper apps, and manage financial data -- books, accounts, transactions, and balances.
@@ -45,10 +45,15 @@ bkper auth login
45
45
  ### Start using bkper
46
46
 
47
47
  ```bash
48
- # Interactive mode (agent TUI)
48
+ # Show CLI help
49
49
  bkper
50
50
  ```
51
51
 
52
+ ```bash
53
+ # Interactive mode (agent TUI)
54
+ bkper agent
55
+ ```
56
+
52
57
  ```bash
53
58
  # Command mode (explicit command)
54
59
  bkper book list
@@ -79,7 +84,7 @@ curl -s -H "Authorization: Bearer $TOKEN" \
79
84
 
80
85
  ## Interactive Mode (powered by Pi)
81
86
 
82
- When you run `bkper` with no arguments in an interactive terminal, bkper starts the embedded agent TUI.
87
+ Run `bkper agent` to start the embedded Bkper Agent TUI. Running `bkper` with no arguments shows CLI help.
83
88
 
84
89
  Bkper's agent mode is intentionally a **thin wrapper** around [Pi][Pi]:
85
90
 
@@ -95,25 +100,30 @@ On each agent startup, bkper performs a background CLI auto-update check (same b
95
100
  Use Pi CLI features directly through bkper:
96
101
 
97
102
  ```bash
98
- bkper agent -- <pi-args>
103
+ bkper agent <pi-args>
99
104
  ```
100
105
 
106
+ If no Pi arguments are provided, `bkper agent` starts the interactive Bkper Agent experience.
107
+ If Pi arguments are provided, everything after `bkper agent` is passed through to Pi.
108
+
101
109
  Examples:
102
110
 
103
111
  ```bash
104
- bkper agent -- -p "Summarize this repository"
105
- bkper agent -- --model openai/gpt-4o -c
106
- bkper agent -- install <pi-package-source>
112
+ bkper agent -p "Summarize this repository"
113
+ bkper agent --model openai/gpt-4o -c
114
+ bkper agent install <pi-package-source>
115
+ bkper agent --help
107
116
  ```
108
117
 
109
- `bkper agent` keeps Bkper defaults (including Bkper system prompt) unless you explicitly pass `--system-prompt`.
118
+ `bkper agent` keeps Bkper defaults (including the Bkper system prompt) unless you explicitly pass `--system-prompt`.
119
+ Use `bkper help agent` for the Bkper CLI command help, and `bkper agent --help` for Pi help.
110
120
 
111
121
  For all available passthrough flags and commands, see the Pi CLI reference:
112
122
  https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent#cli-reference
113
123
 
114
124
  Pi-specific extensions are loaded from Pi extension folders (for example `.pi/extensions` and `~/.pi/agent/extensions`).
115
125
 
116
- <!-- Suggested showcase media: add a short terminal GIF here (bkper -> "Bkper Agent ready." -> one prompt). -->
126
+ <!-- Suggested showcase media: add a short terminal GIF here (bkper agent -> "Bkper Agent ready." -> one prompt). -->
117
127
 
118
128
  ---
119
129
 
@@ -855,9 +865,10 @@ deployment:
855
865
  - `auth logout` - Remove stored credentials
856
866
  - `auth token` - Print the current OAuth access token to stdout
857
867
 
858
- #### Agent Bridge (Pi passthrough)
868
+ #### Agent
859
869
 
860
- - `agent -- <pi-args...>` - Run Pi CLI with Bkper defaults (system prompt/resources)
870
+ - `agent` - Start the interactive Bkper Agent
871
+ - `agent <pi-args...>` - Run Pi CLI with Bkper defaults (system prompt/resources)
861
872
 
862
873
  #### App Lifecycle
863
874
 
@@ -917,7 +928,8 @@ Bkper.setConfig({
917
928
 
918
929
  Releases are published by GitHub Actions (Trusted Publisher with OIDC), not from local machines.
919
930
 
920
- - Merge a PR into `main` with one release label: `release:patch`, `release:minor`, or `release:major`
921
- - On each `main` push, the delivery workflow checks the merged PR associated with that commit, computes the next version from the latest release tag, publishes to npm, and pushes the new tag
931
+ - Add one release label to a PR targeting `main`: `release:patch`, `release:minor`, or `release:major`
932
+ - Before merge, the PR version bump workflow updates `package.json` on the PR branch to the next version derived from the latest release tag
933
+ - On each `main` push, the delivery workflow checks the merged PR label, verifies `package.json` already contains the expected next version, publishes to npm, and pushes the new tag
922
934
  - Without a release label, publish is skipped
923
935
  - Dependabot Pi update PRs are automatically labeled `release:patch` and set to GitHub native auto-merge when repo auto-merge and required checks are enabled
@@ -0,0 +1,5 @@
1
+ export type ReleaseLevel = 'patch' | 'minor' | 'major';
2
+ export declare function normalizeTagVersion(versionOrTag: string): string;
3
+ export declare function bumpVersion(currentVersion: string, level: ReleaseLevel): string;
4
+ export declare function resolveNextVersion(latestTag: string | null, packageVersion: string, level: ReleaseLevel): string;
5
+ //# sourceMappingURL=versioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.d.ts","sourceRoot":"","sources":["../../src/release/versioning.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAIvD,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAQhE;AAED,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAqB/E;AAED,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,YAAY,GACpB,MAAM,CAGR"}
@@ -0,0 +1,32 @@
1
+ const SEMVER_PATTERN = /^(\d+)\.(\d+)\.(\d+)$/;
2
+ export function normalizeTagVersion(versionOrTag) {
3
+ const normalized = versionOrTag.startsWith('v') ? versionOrTag.slice(1) : versionOrTag;
4
+ if (!SEMVER_PATTERN.test(normalized)) {
5
+ throw new Error(`Invalid semver version: ${versionOrTag}`);
6
+ }
7
+ return normalized;
8
+ }
9
+ export function bumpVersion(currentVersion, level) {
10
+ const normalized = normalizeTagVersion(currentVersion);
11
+ const match = normalized.match(SEMVER_PATTERN);
12
+ if (!match) {
13
+ throw new Error(`Invalid semver version: ${currentVersion}`);
14
+ }
15
+ const [, majorText, minorText, patchText] = match;
16
+ const major = Number(majorText);
17
+ const minor = Number(minorText);
18
+ const patch = Number(patchText);
19
+ switch (level) {
20
+ case 'major':
21
+ return `${major + 1}.0.0`;
22
+ case 'minor':
23
+ return `${major}.${minor + 1}.0`;
24
+ case 'patch':
25
+ return `${major}.${minor}.${patch + 1}`;
26
+ }
27
+ }
28
+ export function resolveNextVersion(latestTag, packageVersion, level) {
29
+ const currentVersion = latestTag ? normalizeTagVersion(latestTag) : normalizeTagVersion(packageVersion);
30
+ return bumpVersion(currentVersion, level);
31
+ }
32
+ //# sourceMappingURL=versioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioning.js","sourceRoot":"","sources":["../../src/release/versioning.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAE/C,MAAM,UAAU,mBAAmB,CAAC,YAAoB;IACpD,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAEvF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,cAAsB,EAAE,KAAmB;IACnE,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAE/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,2BAA2B,cAAc,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAEhC,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,OAAO;YACR,OAAO,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC;QAC9B,KAAK,OAAO;YACR,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC;QACrC,KAAK,OAAO;YACR,OAAO,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;IAChD,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,SAAwB,EACxB,cAAsB,EACtB,KAAmB;IAEnB,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACxG,OAAO,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bkper",
3
- "version": "4.11.3",
3
+ "version": "4.12.0",
4
4
  "description": "Command line client for Bkper",
5
5
  "bin": {
6
6
  "bkper": "./lib/cli.js"