bkper 4.12.1 → 4.12.3
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 +14 -11
- package/lib/agent/run-agent-mode.d.ts +1 -0
- package/lib/agent/run-agent-mode.d.ts.map +1 -1
- package/lib/agent/run-agent-mode.js +5 -3
- package/lib/agent/run-agent-mode.js.map +1 -1
- package/lib/agent/system-prompt.d.ts +2 -2
- package/lib/agent/system-prompt.d.ts.map +1 -1
- package/lib/agent/system-prompt.js +20 -11
- package/lib/agent/system-prompt.js.map +1 -1
- package/lib/commands/agent-command.js +2 -2
- package/lib/commands/agent-command.js.map +1 -1
- package/lib/commands/balances/list.d.ts.map +1 -1
- package/lib/commands/balances/list.js +2 -0
- package/lib/commands/balances/list.js.map +1 -1
- package/lib/commands/transactions/list.d.ts.map +1 -1
- package/lib/commands/transactions/list.js +2 -0
- package/lib/commands/transactions/list.js.map +1 -1
- package/lib/docs/cli-reference.md +14 -11
- package/lib/docs-compliance/rules.d.ts.map +1 -1
- package/lib/docs-compliance/rules.js +10 -1
- package/lib/docs-compliance/rules.js.map +1 -1
- package/lib/utils/query-warning.d.ts +17 -0
- package/lib/utils/query-warning.d.ts.map +1 -0
- package/lib/utils/query-warning.js +67 -0
- package/lib/utils/query-warning.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -115,7 +115,7 @@ bkper agent install <pi-package-source>
|
|
|
115
115
|
bkper agent --help
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
-
`bkper agent` keeps Bkper defaults (
|
|
118
|
+
`bkper agent` keeps Bkper defaults (appending Bkper domain context to Pi's default prompt) unless you explicitly pass `--system-prompt`.
|
|
119
119
|
Use `bkper help agent` for the Bkper CLI command help, and `bkper agent --help` for Pi help.
|
|
120
120
|
|
|
121
121
|
For all available passthrough flags and commands, see the Pi CLI reference:
|
|
@@ -289,13 +289,13 @@ bkper transaction create -b abc123 --date 2025-01-15 --amount 100.50 \
|
|
|
289
289
|
--from "Bank Account" --to "Office Supplies" --description "Printer paper"
|
|
290
290
|
|
|
291
291
|
# List transactions for a full year (on:YYYY)
|
|
292
|
-
bkper transaction list -b abc123 -q
|
|
292
|
+
bkper transaction list -b abc123 -q 'on:2025'
|
|
293
293
|
|
|
294
294
|
# List transactions for a month (on:YYYY-MM)
|
|
295
|
-
bkper transaction list -b abc123 -q
|
|
295
|
+
bkper transaction list -b abc123 -q 'on:2025-01'
|
|
296
296
|
|
|
297
297
|
# List with custom properties included
|
|
298
|
-
bkper transaction list -b abc123 -q
|
|
298
|
+
bkper transaction list -b abc123 -q 'account:Sales' -p
|
|
299
299
|
|
|
300
300
|
# Update a transaction
|
|
301
301
|
bkper transaction update tx_456 -b abc123 --amount 120.00 --description "Printer paper (corrected)"
|
|
@@ -349,7 +349,7 @@ Query account balances and group totals.
|
|
|
349
349
|
|
|
350
350
|
```bash
|
|
351
351
|
# List balances for a specific date (point-in-time)
|
|
352
|
-
bkper balance list -b abc123 -q
|
|
352
|
+
bkper balance list -b abc123 -q 'on:2025-12-31'
|
|
353
353
|
|
|
354
354
|
# Monthly balance evolution of one account during 2025
|
|
355
355
|
bkper balance list -b abc123 -q "account:'<accountName>' after:2025-01-01 before:2026-01-01 by:m" --expanded 2
|
|
@@ -373,6 +373,9 @@ Use the same query language across Bkper web app, CLI, and Google Sheets integra
|
|
|
373
373
|
- `on:2025-01-31` → specific day
|
|
374
374
|
- `after:` is **inclusive** and `before:` is **exclusive**.
|
|
375
375
|
- Full year 2025: `after:2025-01-01 before:2026-01-01`
|
|
376
|
+
- In shell commands, wrap queries with Bkper date variables (`$d`, `$m`, `$y`) in single quotes to avoid shell expansion.
|
|
377
|
+
- Example: `bkper transaction list -b abc123 -q 'after:$m-3 before:$m+1'`
|
|
378
|
+
- If the query already needs single quotes inside (for example, `account:'Brex Cash'`), keep double quotes and escape `$`: `-q "account:'Brex Cash' after:\$m-3 before:\$m+1"`
|
|
376
379
|
- For point-in-time statements (typically permanent accounts `ASSET`/`LIABILITY`), prefer `on:` or `before:`.
|
|
377
380
|
- For activity statements over a period (typically non-permanent accounts `INCOMING`/`OUTGOING`), prefer `after:` + `before:`.
|
|
378
381
|
- For statement-level analysis, prefer filtering by the report root group. Root names vary by book.
|
|
@@ -516,25 +519,25 @@ For resources that support stdin creation, JSON output can be piped directly int
|
|
|
516
519
|
bkper account list -b $BOOK_A --format json | bkper account create -b $BOOK_B
|
|
517
520
|
|
|
518
521
|
# Copy transactions matching a query
|
|
519
|
-
bkper transaction list -b $BOOK_A -q
|
|
522
|
+
bkper transaction list -b $BOOK_A -q 'after:2025-01-01' --format json | \
|
|
520
523
|
bkper transaction create -b $BOOK_B
|
|
521
524
|
|
|
522
525
|
# Clone accounts, then transactions
|
|
523
526
|
bkper account list -b $SOURCE --format json | bkper account create -b $DEST
|
|
524
|
-
bkper transaction list -b $SOURCE -q
|
|
527
|
+
bkper transaction list -b $SOURCE -q 'after:2025-01-01' --format json | \
|
|
525
528
|
bkper transaction create -b $DEST
|
|
526
529
|
|
|
527
530
|
# Batch update: list transactions, modify, and pipe back to update
|
|
528
|
-
bkper transaction list -b $BOOK -q
|
|
531
|
+
bkper transaction list -b $BOOK -q 'after:2025-01-01' --format json | \
|
|
529
532
|
jq '[.[] | .description = "Updated: " + .description]' | \
|
|
530
533
|
bkper transaction update -b $BOOK
|
|
531
534
|
|
|
532
535
|
# Batch update: add a property to all matching transactions
|
|
533
|
-
bkper transaction list -b $BOOK -q
|
|
536
|
+
bkper transaction list -b $BOOK -q 'account:Expenses' --format json | \
|
|
534
537
|
bkper transaction update -b $BOOK -p "reviewed=true"
|
|
535
538
|
|
|
536
539
|
# Batch update checked transactions
|
|
537
|
-
bkper transaction list -b $BOOK -q
|
|
540
|
+
bkper transaction list -b $BOOK -q 'is:checked after:2025-01-01' --format json | \
|
|
538
541
|
bkper transaction update -b $BOOK --update-checked -p "migrated=true"
|
|
539
542
|
```
|
|
540
543
|
|
|
@@ -868,7 +871,7 @@ deployment:
|
|
|
868
871
|
#### Agent
|
|
869
872
|
|
|
870
873
|
- `agent` - Start the interactive Bkper Agent
|
|
871
|
-
- `agent <pi-args...>` - Run Pi CLI with Bkper defaults (
|
|
874
|
+
- `agent <pi-args...>` - Run Pi CLI with Bkper defaults (domain context/resources)
|
|
872
875
|
|
|
873
876
|
#### App Lifecycle
|
|
874
877
|
|
|
@@ -24,6 +24,7 @@ export interface AgentModeDependencies {
|
|
|
24
24
|
run(): Promise<void>;
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
+
export declare function appendBkperAgentPrompt(base: string[]): string[];
|
|
27
28
|
export declare function registerBkperAgentStartupExtension(pi: StartupExtensionAPI, startupMaintenance?: typeof runStartupMaintenance): void;
|
|
28
29
|
export declare function runAgentMode(dependencies?: AgentModeDependencies): Promise<void>;
|
|
29
30
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-agent-mode.d.ts","sourceRoot":"","sources":["../../src/agent/run-agent-mode.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,KAAK,wBAAwB,GAAG;IAC5B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,KAAK,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,KAAK,mBAAmB,GAAG;IACvB,EAAE,EAAE;QACA,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;KAC9D,CAAC;CACL,CAAC;AAEF,KAAK,mBAAmB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3F,KAAK,mBAAmB,GAAG;IACvB,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,MAAM,WAAW,qBAAqB;IAClC,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;IACrD,aAAa,EAAE,CAAC,OAAO,EAAE;QACrB,cAAc,EAAE,wBAAwB,CAAC;KAC5C,KAAK,OAAO,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC,CAAC;IACH,qBAAqB,EAAE,CACnB,OAAO,EAAE,OAAO,EAChB,oBAAoB,CAAC,EAAE,MAAM,KAC5B;QACD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;KACxB,CAAC;CACL;AAED,wBAAgB,kCAAkC,CAC9C,EAAE,EAAE,mBAAmB,EACvB,kBAAkB,GAAE,OAAO,qBAA6C,GACzE,IAAI,CAeN;
|
|
1
|
+
{"version":3,"file":"run-agent-mode.d.ts","sourceRoot":"","sources":["../../src/agent/run-agent-mode.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,KAAK,wBAAwB,GAAG;IAC5B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,KAAK,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,KAAK,mBAAmB,GAAG;IACvB,EAAE,EAAE;QACA,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;KAC9D,CAAC;CACL,CAAC;AAEF,KAAK,mBAAmB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3F,KAAK,mBAAmB,GAAG;IACvB,EAAE,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,MAAM,WAAW,qBAAqB;IAClC,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;IACrD,aAAa,EAAE,CAAC,OAAO,EAAE;QACrB,cAAc,EAAE,wBAAwB,CAAC;KAC5C,KAAK,OAAO,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC,CAAC;IACH,qBAAqB,EAAE,CACnB,OAAO,EAAE,OAAO,EAChB,oBAAoB,CAAC,EAAE,MAAM,KAC5B;QACD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;KACxB,CAAC;CACL;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE/D;AAED,wBAAgB,kCAAkC,CAC9C,EAAE,EAAE,mBAAmB,EACvB,kBAAkB,GAAE,OAAO,qBAA6C,GACzE,IAAI,CAeN;AAyBD,wBAAsB,YAAY,CAC9B,YAAY,GAAE,qBAAmD,GAClE,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -9,7 +9,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { createAgentSession, DefaultResourceLoader, InteractiveMode, } from '@mariozechner/pi-coding-agent';
|
|
11
11
|
import { runStartupMaintenance } from './startup-maintenance.js';
|
|
12
|
-
import {
|
|
12
|
+
import { getBkperAgentAppendPrompt } from './system-prompt.js';
|
|
13
|
+
export function appendBkperAgentPrompt(base) {
|
|
14
|
+
return [...base, getBkperAgentAppendPrompt()];
|
|
15
|
+
}
|
|
13
16
|
export function registerBkperAgentStartupExtension(pi, startupMaintenance = runStartupMaintenance) {
|
|
14
17
|
let startupMaintenanceTriggered = false;
|
|
15
18
|
pi.on('session_start', (_event, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -26,8 +29,7 @@ export function registerBkperAgentStartupExtension(pi, startupMaintenance = runS
|
|
|
26
29
|
function createDefaultDependencies() {
|
|
27
30
|
return {
|
|
28
31
|
createResourceLoader: () => new DefaultResourceLoader({
|
|
29
|
-
|
|
30
|
-
appendSystemPromptOverride: () => [],
|
|
32
|
+
appendSystemPromptOverride: appendBkperAgentPrompt,
|
|
31
33
|
extensionFactories: [
|
|
32
34
|
(pi) => {
|
|
33
35
|
registerBkperAgentStartupExtension(pi);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-agent-mode.js","sourceRoot":"","sources":["../../src/agent/run-agent-mode.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EACH,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,GAGlB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAoC/D,MAAM,UAAU,kCAAkC,CAC9C,EAAuB,EACvB,qBAAmD,qBAAqB;IAExE,IAAI,2BAA2B,GAAG,KAAK,CAAC;IAExC,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAO,MAAM,EAAE,GAAG,EAAE,EAAE;QACzC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAE5C,IAAI,2BAA2B,EAAE,CAAC;YAC9B,OAAO;QACX,CAAC;QACD,2BAA2B,GAAG,IAAI,CAAC;QAEnC,KAAK,kBAAkB,CAAC;YACpB,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;SAC1D,CAAC,CAAC;IACP,CAAC,CAAA,CAAC,CAAC;AACP,CAAC;AAED,SAAS,yBAAyB;IAC9B,OAAO;QACH,oBAAoB,EAAE,GAAG,EAAE,CACvB,IAAI,qBAAqB,CAAC;YACtB,
|
|
1
|
+
{"version":3,"file":"run-agent-mode.js","sourceRoot":"","sources":["../../src/agent/run-agent-mode.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EACH,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,GAGlB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAoC/D,MAAM,UAAU,sBAAsB,CAAC,IAAc;IACjD,OAAO,CAAC,GAAG,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAC9C,EAAuB,EACvB,qBAAmD,qBAAqB;IAExE,IAAI,2BAA2B,GAAG,KAAK,CAAC;IAExC,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAO,MAAM,EAAE,GAAG,EAAE,EAAE;QACzC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QAE5C,IAAI,2BAA2B,EAAE,CAAC;YAC9B,OAAO;QACX,CAAC;QACD,2BAA2B,GAAG,IAAI,CAAC;QAEnC,KAAK,kBAAkB,CAAC;YACpB,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;SAC1D,CAAC,CAAC;IACP,CAAC,CAAA,CAAC,CAAC;AACP,CAAC;AAED,SAAS,yBAAyB;IAC9B,OAAO;QACH,oBAAoB,EAAE,GAAG,EAAE,CACvB,IAAI,qBAAqB,CAAC;YACtB,0BAA0B,EAAE,sBAAsB;YAClD,kBAAkB,EAAE;gBAChB,CAAC,EAAgB,EAAE,EAAE;oBACjB,kCAAkC,CAAC,EAAE,CAAC,CAAC;gBAC3C,CAAC;aACJ;SACJ,CAAC;QACN,aAAa,EAAE,KAA2B,EAAE,0CAAtB,EAAE,cAAc,EAAE;YACpC,OAAA,kBAAkB,CAAC;gBACf,cAAc,EACV,cAA0E;aACjF,CAAC,CAAA;UAAA;QACN,qBAAqB,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,CACrD,IAAI,eAAe,CAAC,OAA2D,EAAE;YAC7E,oBAAoB;SACvB,CAAC;KACT,CAAC;AACN,CAAC;AAED,MAAM,UAAgB,YAAY;yDAC9B,eAAsC,yBAAyB,EAAE;;;QAEjE,YAAA,OAAO,CAAC,GAAG,EAAC,qBAAqB,uCAArB,qBAAqB,GAAK,GAAG,EAAC;QAE1C,MAAM,cAAc,GAAG,YAAY,CAAC,oBAAoB,EAAE,CAAC;QAC3D,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;QAE9B,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/F,MAAM,IAAI,GAAG,YAAY,CAAC,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAE/E,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare function
|
|
2
|
-
export declare const
|
|
1
|
+
export declare function getBkperAgentAppendPrompt(): string;
|
|
2
|
+
export declare const BKPER_AGENT_APPEND_PROMPT = "# Bkper Context\n\nYou are a Bkper team member.\n\nFor normal Bkper work, prioritize Bkper domain context, local project instructions, and surrounding files over Pi customization topics. Pi documentation is relevant only when the task is specifically about Pi itself or its runtime or customization.\n\n## Operating Principles\n\n- Protect the zero-sum invariant above all else.\n- Preserve invariants and data integrity first, then user intent, then implementation convenience.\n- Think in resources, movements, and balances \u2014 not debits and credits.\n- Extend meaning with properties before adding structural complexity.\n- Model domain and flows before coding; represent business reality, not technical shortcuts.\n- Prefer simplicity over cleverness; choose small, boring, maintainable solutions.\n- Question the premise before adding complexity; prefer simplifying or removing over layering new structure.\n- Design for global readiness from day one: currencies, timezones, units, and formats.\n- Treat performance and security as foundational concerns.\n- For conceptual questions, answer directly and concisely before reaching for tools.\n";
|
|
3
3
|
//# sourceMappingURL=system-prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAaA,wBAAgB,yBAAyB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAaA,wBAAgB,yBAAyB,IAAI,MAAM,CAuBlD;AAED,eAAO,MAAM,yBAAyB,ooCAkBrC,CAAC"}
|
|
@@ -8,38 +8,47 @@ function resolveCoreConceptsPath() {
|
|
|
8
8
|
const thisDir = path.dirname(fileURLToPath(import.meta.url));
|
|
9
9
|
return path.resolve(thisDir, '..', 'docs', 'core-concepts.md');
|
|
10
10
|
}
|
|
11
|
-
export function
|
|
11
|
+
export function getBkperAgentAppendPrompt() {
|
|
12
12
|
const cliRefPath = resolveCliReferencePath();
|
|
13
13
|
const coreConceptsPath = resolveCoreConceptsPath();
|
|
14
|
-
return `${
|
|
15
|
-
## Reference
|
|
14
|
+
return `${BKPER_AGENT_APPEND_PROMPT}
|
|
15
|
+
## Reference Routing
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
- Read local \`AGENTS.md\`, nearby files, and existing tests first for project-specific work.
|
|
18
|
+
- If the task touches Bkper accounting semantics or data modeling — such as Accounts, Transactions, balances, account types, groups, books, or mapping real-world flows into Bkper — read:
|
|
18
19
|
|
|
19
20
|
\`\`\`
|
|
20
21
|
${coreConceptsPath}
|
|
21
22
|
\`\`\`
|
|
22
23
|
|
|
23
|
-
If the task involves using or executing \`bkper\` CLI commands, read:
|
|
24
|
+
- If the task involves using, generating, or executing \`bkper\` CLI commands, read:
|
|
24
25
|
|
|
25
26
|
\`\`\`
|
|
26
27
|
${cliRefPath}
|
|
27
28
|
\`\`\`
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
When
|
|
30
|
+
- Read Pi documentation only when the task is specifically about Pi itself: prompt behavior, extensions, skills, themes, TUI, SDK, custom tools, model/provider integration, or other Pi runtime customization.
|
|
31
|
+
- For generic engineering work, do not load Bkper or Pi reference docs unless directly relevant.
|
|
32
|
+
- When scope is unclear, inspect local files and project instructions first; load reference docs only after identifying a concrete need.
|
|
32
33
|
`;
|
|
33
34
|
}
|
|
34
|
-
export const
|
|
35
|
+
export const BKPER_AGENT_APPEND_PROMPT = `# Bkper Context
|
|
36
|
+
|
|
37
|
+
You are a Bkper team member.
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
For normal Bkper work, prioritize Bkper domain context, local project instructions, and surrounding files over Pi customization topics. Pi documentation is relevant only when the task is specifically about Pi itself or its runtime or customization.
|
|
37
40
|
|
|
38
41
|
## Operating Principles
|
|
39
42
|
|
|
43
|
+
- Protect the zero-sum invariant above all else.
|
|
40
44
|
- Preserve invariants and data integrity first, then user intent, then implementation convenience.
|
|
45
|
+
- Think in resources, movements, and balances — not debits and credits.
|
|
46
|
+
- Extend meaning with properties before adding structural complexity.
|
|
41
47
|
- Model domain and flows before coding; represent business reality, not technical shortcuts.
|
|
42
|
-
-
|
|
48
|
+
- Prefer simplicity over cleverness; choose small, boring, maintainable solutions.
|
|
49
|
+
- Question the premise before adding complexity; prefer simplifying or removing over layering new structure.
|
|
50
|
+
- Design for global readiness from day one: currencies, timezones, units, and formats.
|
|
51
|
+
- Treat performance and security as foundational concerns.
|
|
43
52
|
- For conceptual questions, answer directly and concisely before reaching for tools.
|
|
44
53
|
`;
|
|
45
54
|
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,SAAS,uBAAuB;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,uBAAuB;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,yBAAyB;IACrC,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC;IAC7C,MAAM,gBAAgB,GAAG,uBAAuB,EAAE,CAAC;IACnD,OAAO,GAAG,yBAAyB;;;;;;;EAOrC,gBAAgB;;;;;;EAMhB,UAAU;;;;;;CAMX,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;CAkBxC,CAAC"}
|
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { main as runPiMain } from '@mariozechner/pi-coding-agent';
|
|
11
11
|
import { runAgentMode } from '../agent/run-agent-mode.js';
|
|
12
|
-
import {
|
|
12
|
+
import { getBkperAgentAppendPrompt } from '../agent/system-prompt.js';
|
|
13
13
|
function createDefaultDependencies() {
|
|
14
14
|
return {
|
|
15
15
|
runPi: (args) => runPiMain(args),
|
|
@@ -23,7 +23,7 @@ function buildPiArgs(args) {
|
|
|
23
23
|
if (hasSystemPromptArg(args)) {
|
|
24
24
|
return args;
|
|
25
25
|
}
|
|
26
|
-
return ['--system-prompt',
|
|
26
|
+
return ['--append-system-prompt', getBkperAgentAppendPrompt(), ...args];
|
|
27
27
|
}
|
|
28
28
|
export function runAgentCommand(piArgs_1) {
|
|
29
29
|
return __awaiter(this, arguments, void 0, function* (piArgs, dependencies = createDefaultDependencies()) {
|
|
@@ -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,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,
|
|
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,wBAAwB,EAAE,yBAAyB,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;AAC5E,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/balances/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/balances/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAwBtB"}
|
|
@@ -9,6 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { BalanceType } from 'bkper-js';
|
|
11
11
|
import { getBkperInstance } from '../../bkper-factory.js';
|
|
12
|
+
import { warnIfSuspiciousDateVariableQuery } from '../../utils/query-warning.js';
|
|
12
13
|
/**
|
|
13
14
|
* Determines the appropriate BalanceType based on query operators.
|
|
14
15
|
* Uses after: presence as the heuristic: after: means PERIOD, otherwise CUMULATIVE.
|
|
@@ -25,6 +26,7 @@ export function resolveBalanceType(query) {
|
|
|
25
26
|
*/
|
|
26
27
|
export function listBalancesMatrix(bookId, options) {
|
|
27
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
+
warnIfSuspiciousDateVariableQuery(options.query);
|
|
28
30
|
const bkper = getBkperInstance();
|
|
29
31
|
const book = yield bkper.getBook(bookId);
|
|
30
32
|
const balanceType = resolveBalanceType(options.query);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/balances/list.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/balances/list.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AAWjF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC;AAClF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAgB,kBAAkB,CACpC,MAAc,EACd,OAA4B;;QAE5B,iCAAiC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE3D,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC3B,wDAAwD;YACxD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACJ,8CAA8C;YAC9C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/transactions/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAmB,MAAM,UAAU,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/transactions/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAmB,MAAM,UAAU,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGvE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,GACjC,OAAO,CAAC,sBAAsB,CAAC,CAiCjC;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC3C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,EAChC,MAAM,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,CAAC,CAoBrB"}
|
|
@@ -8,6 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { getBkperInstance } from '../../bkper-factory.js';
|
|
11
|
+
import { warnIfSuspiciousDateVariableQuery } from '../../utils/query-warning.js';
|
|
11
12
|
/**
|
|
12
13
|
* Queries transactions from a book, automatically paginating through all
|
|
13
14
|
* results until no more pages remain.
|
|
@@ -23,6 +24,7 @@ import { getBkperInstance } from '../../bkper-factory.js';
|
|
|
23
24
|
*/
|
|
24
25
|
export function listTransactions(bookId, options) {
|
|
25
26
|
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
warnIfSuspiciousDateVariableQuery(options.query);
|
|
26
28
|
const bkper = getBkperInstance();
|
|
27
29
|
const book = yield bkper.getBook(bookId, true);
|
|
28
30
|
const allItems = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/transactions/list.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/transactions/list.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AAmBjF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAgB,gBAAgB,CAClC,MAAc,EACd,OAAgC;;QAEhC,iCAAiC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,IAAI,OAA4B,CAAC;QACjC,IAAI,MAA0B,CAAC;QAE/B,GAAG,CAAC;YACA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAC5B,CAAC;YACD,uEAAuE;YACvE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;YACxC,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACtC,mEAAmE;YACnE,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBACvE,MAAM;YACV,CAAC;YACD,MAAM,GAAG,UAAU,CAAC;QACxB,CAAC,QAAQ,IAAI,EAAE;QAEf,OAAO;YACH,IAAI;YACJ,KAAK,EAAE,QAAQ;YACf,OAAO;SACV,CAAC;IACN,CAAC;CAAA;AAED;;;GAGG;AACH,MAAM,UAAgB,yBAAyB,CAC3C,MAAc,EACd,OAAgC,EAChC,MAAoB;;QAEpB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEvD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEhG,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACrB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;CAAA"}
|
|
@@ -115,7 +115,7 @@ bkper agent install <pi-package-source>
|
|
|
115
115
|
bkper agent --help
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
-
`bkper agent` keeps Bkper defaults (
|
|
118
|
+
`bkper agent` keeps Bkper defaults (appending Bkper domain context to Pi's default prompt) unless you explicitly pass `--system-prompt`.
|
|
119
119
|
Use `bkper help agent` for the Bkper CLI command help, and `bkper agent --help` for Pi help.
|
|
120
120
|
|
|
121
121
|
For all available passthrough flags and commands, see the Pi CLI reference:
|
|
@@ -289,13 +289,13 @@ bkper transaction create -b abc123 --date 2025-01-15 --amount 100.50 \
|
|
|
289
289
|
--from "Bank Account" --to "Office Supplies" --description "Printer paper"
|
|
290
290
|
|
|
291
291
|
# List transactions for a full year (on:YYYY)
|
|
292
|
-
bkper transaction list -b abc123 -q
|
|
292
|
+
bkper transaction list -b abc123 -q 'on:2025'
|
|
293
293
|
|
|
294
294
|
# List transactions for a month (on:YYYY-MM)
|
|
295
|
-
bkper transaction list -b abc123 -q
|
|
295
|
+
bkper transaction list -b abc123 -q 'on:2025-01'
|
|
296
296
|
|
|
297
297
|
# List with custom properties included
|
|
298
|
-
bkper transaction list -b abc123 -q
|
|
298
|
+
bkper transaction list -b abc123 -q 'account:Sales' -p
|
|
299
299
|
|
|
300
300
|
# Update a transaction
|
|
301
301
|
bkper transaction update tx_456 -b abc123 --amount 120.00 --description "Printer paper (corrected)"
|
|
@@ -349,7 +349,7 @@ Query account balances and group totals.
|
|
|
349
349
|
|
|
350
350
|
```bash
|
|
351
351
|
# List balances for a specific date (point-in-time)
|
|
352
|
-
bkper balance list -b abc123 -q
|
|
352
|
+
bkper balance list -b abc123 -q 'on:2025-12-31'
|
|
353
353
|
|
|
354
354
|
# Monthly balance evolution of one account during 2025
|
|
355
355
|
bkper balance list -b abc123 -q "account:'<accountName>' after:2025-01-01 before:2026-01-01 by:m" --expanded 2
|
|
@@ -373,6 +373,9 @@ Use the same query language across Bkper web app, CLI, and Google Sheets integra
|
|
|
373
373
|
- `on:2025-01-31` → specific day
|
|
374
374
|
- `after:` is **inclusive** and `before:` is **exclusive**.
|
|
375
375
|
- Full year 2025: `after:2025-01-01 before:2026-01-01`
|
|
376
|
+
- In shell commands, wrap queries with Bkper date variables (`$d`, `$m`, `$y`) in single quotes to avoid shell expansion.
|
|
377
|
+
- Example: `bkper transaction list -b abc123 -q 'after:$m-3 before:$m+1'`
|
|
378
|
+
- If the query already needs single quotes inside (for example, `account:'Brex Cash'`), keep double quotes and escape `$`: `-q "account:'Brex Cash' after:\$m-3 before:\$m+1"`
|
|
376
379
|
- For point-in-time statements (typically permanent accounts `ASSET`/`LIABILITY`), prefer `on:` or `before:`.
|
|
377
380
|
- For activity statements over a period (typically non-permanent accounts `INCOMING`/`OUTGOING`), prefer `after:` + `before:`.
|
|
378
381
|
- For statement-level analysis, prefer filtering by the report root group. Root names vary by book.
|
|
@@ -516,25 +519,25 @@ For resources that support stdin creation, JSON output can be piped directly int
|
|
|
516
519
|
bkper account list -b $BOOK_A --format json | bkper account create -b $BOOK_B
|
|
517
520
|
|
|
518
521
|
# Copy transactions matching a query
|
|
519
|
-
bkper transaction list -b $BOOK_A -q
|
|
522
|
+
bkper transaction list -b $BOOK_A -q 'after:2025-01-01' --format json | \
|
|
520
523
|
bkper transaction create -b $BOOK_B
|
|
521
524
|
|
|
522
525
|
# Clone accounts, then transactions
|
|
523
526
|
bkper account list -b $SOURCE --format json | bkper account create -b $DEST
|
|
524
|
-
bkper transaction list -b $SOURCE -q
|
|
527
|
+
bkper transaction list -b $SOURCE -q 'after:2025-01-01' --format json | \
|
|
525
528
|
bkper transaction create -b $DEST
|
|
526
529
|
|
|
527
530
|
# Batch update: list transactions, modify, and pipe back to update
|
|
528
|
-
bkper transaction list -b $BOOK -q
|
|
531
|
+
bkper transaction list -b $BOOK -q 'after:2025-01-01' --format json | \
|
|
529
532
|
jq '[.[] | .description = "Updated: " + .description]' | \
|
|
530
533
|
bkper transaction update -b $BOOK
|
|
531
534
|
|
|
532
535
|
# Batch update: add a property to all matching transactions
|
|
533
|
-
bkper transaction list -b $BOOK -q
|
|
536
|
+
bkper transaction list -b $BOOK -q 'account:Expenses' --format json | \
|
|
534
537
|
bkper transaction update -b $BOOK -p "reviewed=true"
|
|
535
538
|
|
|
536
539
|
# Batch update checked transactions
|
|
537
|
-
bkper transaction list -b $BOOK -q
|
|
540
|
+
bkper transaction list -b $BOOK -q 'is:checked after:2025-01-01' --format json | \
|
|
538
541
|
bkper transaction update -b $BOOK --update-checked -p "migrated=true"
|
|
539
542
|
```
|
|
540
543
|
|
|
@@ -868,7 +871,7 @@ deployment:
|
|
|
868
871
|
#### Agent
|
|
869
872
|
|
|
870
873
|
- `agent` - Start the interactive Bkper Agent
|
|
871
|
-
- `agent <pi-args...>` - Run Pi CLI with Bkper defaults (
|
|
874
|
+
- `agent <pi-args...>` - Run Pi CLI with Bkper defaults (domain context/resources)
|
|
872
875
|
|
|
873
876
|
#### App Lifecycle
|
|
874
877
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AA4BD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AA4BD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAgK1E"}
|
|
@@ -30,7 +30,7 @@ export function evaluateReadmeCompliance(content) {
|
|
|
30
30
|
line: getLineNumber(content, sameDayMatch.index),
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
|
-
const periodInQueryPattern =
|
|
33
|
+
const periodInQueryPattern = /(?:-q|--query)\s+['"][^'"\n]*period:/g;
|
|
34
34
|
let periodMatch;
|
|
35
35
|
while ((periodMatch = periodInQueryPattern.exec(content)) !== null) {
|
|
36
36
|
errors.push({
|
|
@@ -39,6 +39,15 @@ export function evaluateReadmeCompliance(content) {
|
|
|
39
39
|
line: getLineNumber(content, periodMatch.index),
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
|
+
const doubleQuotedDateVariablePattern = /(?:-q|--query)\s+"[^"\n]*(?<!\\)\$(?:d|m|y)(?:[+-]\d+)?[^"\n]*"/g;
|
|
43
|
+
let doubleQuotedDateVariableMatch;
|
|
44
|
+
while ((doubleQuotedDateVariableMatch = doubleQuotedDateVariablePattern.exec(content)) !== null) {
|
|
45
|
+
errors.push({
|
|
46
|
+
code: 'double-quoted-date-variable-query-example',
|
|
47
|
+
message: 'Found a double-quoted query example with an unescaped Bkper date variable. Prefer single quotes around queries using `$d`, `$m`, or `$y`, or escape `$` inside double quotes.',
|
|
48
|
+
line: getLineNumber(content, doubleQuotedDateVariableMatch.index),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
42
51
|
if (!content.includes('### Book setup guidance (important)')) {
|
|
43
52
|
errors.push({
|
|
44
53
|
code: 'missing-book-setup-guidance-title',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"AAUA,SAAS,aAAa,CAAC,OAAe,EAAE,KAAa;IACjD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACtD,CAAC;AAED,SAAS,sBAAsB,CAC3B,OAAe,EACf,cAAsB,EACtB,IAAY,EACZ,OAAe;IAEf,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI;gBACJ,OAAO;gBACP,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;aAC5C,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACpD,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,MAAM,CAAC,IAAI,CACP,GAAG,sBAAsB,CACrB,OAAO,EACP,uCAAuC,EACvC,gCAAgC,EAChC,8DAA8D,CACjE,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CACP,GAAG,sBAAsB,CACrB,OAAO,EACP,mCAAmC,EACnC,4BAA4B,EAC5B,0DAA0D,CAC7D,CACJ,CAAC;IAEF,MAAM,mBAAmB,GAAG,+BAA+B,CAAC;IAC5D,IAAI,YAAoC,CAAC;IACzC,OAAO,CAAC,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,mEAAmE;YAC5E,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC;SACnD,CAAC,CAAC;IACP,CAAC;IAED,MAAM,oBAAoB,GAAG,
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finds suspicious date query fragments that commonly appear when a shell expands
|
|
3
|
+
* Bkper date variables like `$d`, `$m`, or `$y` before the CLI receives the
|
|
4
|
+
* final query string.
|
|
5
|
+
*/
|
|
6
|
+
export declare function findSuspiciousDateQueryFragments(query: string): string[];
|
|
7
|
+
/**
|
|
8
|
+
* Builds a human-readable warning when the query looks like a shell-expanded
|
|
9
|
+
* Bkper date variable.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getSuspiciousDateVariableWarning(query: string): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Prints a warning to stderr when the query looks like a shell-expanded Bkper
|
|
14
|
+
* date variable.
|
|
15
|
+
*/
|
|
16
|
+
export declare function warnIfSuspiciousDateVariableQuery(query: string): void;
|
|
17
|
+
//# sourceMappingURL=query-warning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-warning.d.ts","sourceRoot":"","sources":["../../src/utils/query-warning.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBxE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgBlF;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKrE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const QUOTED_SEGMENT_PATTERN = /'[^']*'|"[^"]*"/g;
|
|
2
|
+
const EMPTY_DATE_OPERATOR_PATTERN = /(?:^|[\s(])(on|after|before):(?=$|[\s)])/g;
|
|
3
|
+
const BARE_SIGNED_OFFSET_PATTERN = /(?:^|[\s(])(on|after|before):([+-]\d{1,3})(?=$|[\s)])/g;
|
|
4
|
+
function sanitizeQueryForDateFragmentScan(query) {
|
|
5
|
+
return query.replace(QUOTED_SEGMENT_PATTERN, match => ' '.repeat(match.length));
|
|
6
|
+
}
|
|
7
|
+
function unique(items) {
|
|
8
|
+
const seen = new Set();
|
|
9
|
+
return items.filter(item => {
|
|
10
|
+
if (seen.has(item)) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
seen.add(item);
|
|
14
|
+
return true;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Finds suspicious date query fragments that commonly appear when a shell expands
|
|
19
|
+
* Bkper date variables like `$d`, `$m`, or `$y` before the CLI receives the
|
|
20
|
+
* final query string.
|
|
21
|
+
*/
|
|
22
|
+
export function findSuspiciousDateQueryFragments(query) {
|
|
23
|
+
const sanitizedQuery = sanitizeQueryForDateFragmentScan(query);
|
|
24
|
+
const fragments = [];
|
|
25
|
+
EMPTY_DATE_OPERATOR_PATTERN.lastIndex = 0;
|
|
26
|
+
let emptyOperatorMatch;
|
|
27
|
+
while ((emptyOperatorMatch = EMPTY_DATE_OPERATOR_PATTERN.exec(sanitizedQuery)) !== null) {
|
|
28
|
+
fragments.push(`${emptyOperatorMatch[1]}:`);
|
|
29
|
+
}
|
|
30
|
+
BARE_SIGNED_OFFSET_PATTERN.lastIndex = 0;
|
|
31
|
+
let bareSignedOffsetMatch;
|
|
32
|
+
while ((bareSignedOffsetMatch = BARE_SIGNED_OFFSET_PATTERN.exec(sanitizedQuery)) !== null) {
|
|
33
|
+
fragments.push(`${bareSignedOffsetMatch[1]}:${bareSignedOffsetMatch[2]}`);
|
|
34
|
+
}
|
|
35
|
+
return unique(fragments);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Builds a human-readable warning when the query looks like a shell-expanded
|
|
39
|
+
* Bkper date variable.
|
|
40
|
+
*/
|
|
41
|
+
export function getSuspiciousDateVariableWarning(query) {
|
|
42
|
+
const fragments = findSuspiciousDateQueryFragments(query);
|
|
43
|
+
if (fragments.length === 0) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return [
|
|
47
|
+
`Warning: query contains suspicious date fragment(s): ${fragments.join(', ')}`,
|
|
48
|
+
'This often happens when your shell expands Bkper date variables like $d, $m, or $y.',
|
|
49
|
+
'Use single quotes around the query, for example:',
|
|
50
|
+
" -q 'on:$m'",
|
|
51
|
+
" -q 'after:$m-3 before:$m+1'",
|
|
52
|
+
'Or escape $ inside double quotes:',
|
|
53
|
+
' -q "on:\\$m"',
|
|
54
|
+
' -q "after:\\$m-3 before:\\$m+1"',
|
|
55
|
+
].join('\n');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Prints a warning to stderr when the query looks like a shell-expanded Bkper
|
|
59
|
+
* date variable.
|
|
60
|
+
*/
|
|
61
|
+
export function warnIfSuspiciousDateVariableQuery(query) {
|
|
62
|
+
const warning = getSuspiciousDateVariableWarning(query);
|
|
63
|
+
if (warning) {
|
|
64
|
+
console.warn(warning);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=query-warning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-warning.js","sourceRoot":"","sources":["../../src/utils/query-warning.ts"],"names":[],"mappings":"AAAA,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAClD,MAAM,2BAA2B,GAAG,2CAA2C,CAAC;AAChF,MAAM,0BAA0B,GAAG,wDAAwD,CAAC;AAE5F,SAAS,gCAAgC,CAAC,KAAa;IACnD,OAAO,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,MAAM,CAAC,KAAe;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gCAAgC,CAAC,KAAa;IAC1D,MAAM,cAAc,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,2BAA2B,CAAC,SAAS,GAAG,CAAC,CAAC;IAC1C,IAAI,kBAA0C,CAAC;IAC/C,OAAO,CAAC,kBAAkB,GAAG,2BAA2B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtF,SAAS,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,0BAA0B,CAAC,SAAS,GAAG,CAAC,CAAC;IACzC,IAAI,qBAA6C,CAAC;IAClD,OAAO,CAAC,qBAAqB,GAAG,0BAA0B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxF,SAAS,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAAC,KAAa;IAC1D,MAAM,SAAS,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACH,wDAAwD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC9E,qFAAqF;QACrF,kDAAkD;QAClD,cAAc;QACd,+BAA+B;QAC/B,mCAAmC;QACnC,gBAAgB;QAChB,mCAAmC;KACtC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAAC,KAAa;IAC3D,MAAM,OAAO,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC"}
|