@go-labs-sg/bb 2.15.0 → 2.16.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 +1 -1
- package/command-manifest.json +1 -1
- package/command-reference.md +1 -1
- package/dist/index.js +6 -5
- package/dist/registry/index.js +3 -0
- package/package.json +1 -1
- package/role-aware-agent-guide.md +1 -0
package/README.md
CHANGED
|
@@ -229,7 +229,7 @@ Project and budget query payloads keep the Asana identities explicit: `asanaTask
|
|
|
229
229
|
| **Budgets** | `list-budgets` (full payload by default; `--summary` or `--includeDetails false` for slim list), `get-budget`, `get-budget-items`, `get-budget-details`, `get-budget-categories`, `get-budget-versions`, `rename-budget-version`, `restore-budget-version`, `update-budget-status` (`ESTIMATE_ACCEPTED` requires win proof, auto-marks `PITCH` or `LOST` projects `WON`, and auto-creates an Asana Event Ops section from Prompt 5 tasks when enabled; Prompt 5 skips quantity-zero items, combines matching non-GO-internal suppliers, keeps each GO internal item separate, removes generated work that repeats another line item or group, and schedules applicable subtasks relative to the project start date; `--projectStatusOnCommercialRejection PITCH\|LOST` is required when rejecting the only accepted/closed budget on a commercial project), `mark-budget-won` (`<budgetId>` + proof file path; `PITCH` or `LOST` projects become `WON` automatically), `create-budget` / `update-budget` (`--payload`), `delete-budget`, `create-budget-approval` (also sends approval request emails), `create-estimate`, `send-estimate-to-contact-person` (same contact-person email workflow as web), `add-budget-items`, `update-budget-item`, `remove-budget-item`, `reorder-budget-items`, `update-budget-item-supplier`, `mark-budget-items-not-utilized`, `restore-budget-item`, `create-placeholder-bill` (admin recovery), `create-budget-category`, `update-budget-category`, `delete-budget-category`, `update-budget-commission`, `delete-budget-commission`, `update-budget-discount`, `delete-budget-discount` (`--payload` where noted), `upload-budget-attachment` (`<budgetId>` + local file path; uses `attachment.requestBudgetAttachmentUpload` + PUT + `attachment.confirmBudgetAttachment`) |
|
|
230
230
|
| **Bills / claims** | `list-bills` (`--isClaimable false` for bills, `--isClaimable true` for claims, omit for both), `list-claims` (claims only), `validate-bill-selection` (`--payload`; runs the same supplier, line-item, and quotation-coverage checks as the web flow; `alreadyPaid` never bypasses them), `stage-bill-attachment` (securely uploads invoice/payment-proof files before creation and returns attachment JSON; ownership and one-hour expiry are enforced by a server-side staged-upload record rather than encoded in the object key), `cleanup-staged-bill-attachments`, `create-bill` (`--payload`; set `isClaimable=false` for a bill, `isClaimable=true` for a claim; supplier bills require positive `extractedAmount` and `amount`, with `amount <= extractedAmount`; an already-paid supplier bill sets `alreadyPaid=true` and requires `paymentReference` plus a staged PDF in `paymentProofAttachments`; admin creation automatically queues QBO finalization while other roles remain pending approval; non-legacy supplier bills from 1 Jul 2026 00:00 SGT require approved quotation coverage even when already paid), `update-bill` (`--payload`), `update-bill-payment-evidence` (`--payload`; replaces the payment reference and payment-proof PDFs for an already-paid bill), `delete-bill`, `create-bill-approval` (also sends approval request emails), `update-bill-status` (`PAID` requires `--paymentReference`; pass `--paymentProof <receipt.pdf>` to stage and submit a PDF up to 20MB atomically, or omit it only when BB already has payment proof; moving to `PAID` runs the server's paid-bill notification workflow), `patch-bill-payment` (PAID bills: `--paymentTrackingUrl`, `--paymentReference`, `--quickbooksBillId`, `--paymentDate` ISO; clearing a paid bill's QuickBooks link is not allowed), `patch-bill-invoice-number`, `get-bill-attachments`, `upload-bill-attachment` (`<billId>` + local path), `get-bill-details` |
|
|
231
231
|
| **Quotations** | `list-quotations` (supports project, budget, supplier, status, requester, and text-search filters), `get-quotation`, `upload-quotation-attachment` (`<projectId>` + PDF/JPEG/PNG path up to 20MB; returns attachment JSON for payload use), `cleanup-staged-quotation-attachments`, `create-quotation` (`--payload` for `quotation.createDraft`; include `amountWithoutGst` and `gstAmount`), `update-quotation` (`--payload`; updates a `DRAFT` or `REJECTED` quotation), `delete-quotation`, `submit-quotation`, `approve-quotation`, `reject-quotation`, `download-quotation-pdf` (`original`, `staff`, or `final`) |
|
|
232
|
-
| **Customer invoices** | `check-customer-invoice-readiness`, `list-eligible-customer-invoice-budgets`, `list-customer-invoices` (global/project/budget filters plus summary metrics), `get-customer-invoice`, `get-customer-invoice-email-context`, `create-customer-invoice`, `discard-customer-invoice`, `delete-customer-invoice`, `void-customer-invoice`, `approve-customer-invoice` (admin), `reject-customer-invoice` (admin), `send-customer-invoice-to-contact-person`, `download-customer-invoice-pdf
|
|
232
|
+
| **Customer invoices** | `check-customer-invoice-readiness`, `list-eligible-customer-invoice-budgets`, `list-customer-invoices` (global/project/budget filters plus summary metrics), `get-customer-invoice`, `get-customer-invoice-email-context`, `create-customer-invoice`, `discard-customer-invoice`, `delete-customer-invoice`, `void-customer-invoice`, `approve-customer-invoice` (admin), `reject-customer-invoice` (admin), `send-customer-invoice-to-contact-person`, `download-customer-invoice-pdf` (non-admins cannot download while approval is pending), `sync-customer-invoice` |
|
|
233
233
|
| **Approvals** | `list-approvals` / `get-pending-approvals` (`--type budget\|supplier\|bill\|quotation\|customer_invoice\|all`), `approve-bill` / `reject-bill` (send reply email), `approve-budget` / `reject-budget` (send reply email), `approve-supplier` / `reject-supplier` (send reply email), `approve-quotation` / `reject-quotation`, `approve-customer-invoice` / `reject-customer-invoice` |
|
|
234
234
|
| **Companies & projects** | `list-companies`, `get-company`, `create-company`, `update-company` (`--payload`), `delete-company`, `list-projects`, `get-project` (its budget overview returns `totalRevenue`, calculated only from Estimate Accepted and Estimate Closed budgets), `get-project-hub-status`, `setup-project-hub`, `sync-project-hub-commercial-documents`, `create-project` (required: `--name`, `--companyId`, `--contactPersonId`, `--insideSalesId`, `--businessDevelopmentId`, `--venue`, `--startDate` as ISO datetime for project/window start; when `--asanaTaskId` is omitted, the CLI searches open Asana lead tasks in the Deals project, prompts for one of the top five matches, and resolves Slack channel fields from the selected deal card; optional `--asanaSearch`, `--pax`, `--endDate`, `--description`, `--projectManagerId`; always requests QBO project import like the web app), `update-project` (`--payload` with `dateRange.from` / `dateRange.to` for the project window; optional `projectManagerId` and `requestQboAccountantNotification` in JSON), `delete-project`, `check-project-reconciliation <id>` (runs the web app's live checks without changing status), `reconcile-project <id>` (reruns checks transactionally and marks an eligible project `RECONCILED`), `complete-project <id>` (reruns validation, marks a reconciled project `COMPLETED`, and queues QuickBooks placeholder cleanup), `import-qbo-project`, `update-project-status` (`<id>` `<status>`: `PITCH` \| `WON` \| `COMPLETED` \| `RECONCILED` \| `LOST`; close-out follows `WON` → `RECONCILED` → `COMPLETED`, and reconciliation requires every accepted/closed budget line to have an Approved/Paid bill or claim or be explicitly Not Utilized; marking `COMPLETED` queues deletion of every remaining project placeholder bill from QuickBooks; for `PITCH` → `WON` also pass a Budget Builder user `--projectManagerId` or `--projectManagerEmail`; when marking `WON` without an accepted/closed budget or proof, pass `--wonOverrideReason`) |
|
|
235
235
|
| **Contacts** | `list-contacts`, `create-contact-person` (`--payload`), `update-contact-person` (`--payload`) |
|
package/command-manifest.json
CHANGED
|
@@ -3452,7 +3452,7 @@
|
|
|
3452
3452
|
"download-customer-invoice-pdf",
|
|
3453
3453
|
"download_customer_invoice_pdf"
|
|
3454
3454
|
],
|
|
3455
|
-
"summary": "Download
|
|
3455
|
+
"summary": "Download a customer invoice PDF when permitted.",
|
|
3456
3456
|
"globalOptions": [
|
|
3457
3457
|
{
|
|
3458
3458
|
"name": "--help",
|
package/command-reference.md
CHANGED
|
@@ -610,7 +610,7 @@ Effects: state-change, email.
|
|
|
610
610
|
|
|
611
611
|
## `bb customer-invoice pdf download`
|
|
612
612
|
|
|
613
|
-
Download
|
|
613
|
+
Download a customer invoice PDF when permitted.
|
|
614
614
|
|
|
615
615
|
Legacy aliases: `download-customer-invoice-pdf`, `download_customer_invoice_pdf`.
|
|
616
616
|
|
package/dist/index.js
CHANGED
|
@@ -220,7 +220,8 @@ Bills
|
|
|
220
220
|
get-bill-details <billId>
|
|
221
221
|
|
|
222
222
|
Quotations
|
|
223
|
-
list-quotations [--projectId] [--budgetId] [--supplierId] [--status CSV] [--
|
|
223
|
+
list-quotations [--projectId] [--budgetId] [--supplierId] [--status CSV] [--createdBy CSV] [--search] [--page] [--perPage]
|
|
224
|
+
Legacy aliases --requesterIds and --pageSize remain supported.
|
|
224
225
|
get-quotation <quotationId>
|
|
225
226
|
upload-quotation-attachment <projectId> <filePath> Upload one PDF, JPEG, or PNG up to 20MB; returns attachment JSON for a quotation payload.
|
|
226
227
|
cleanup-staged-quotation-attachments <projectId> --keys <csv> Delete unattached staged quotation uploads.
|
|
@@ -1209,19 +1210,19 @@ export async function runCli(argv = process.argv, runtime = createProcessRuntime
|
|
|
1209
1210
|
}
|
|
1210
1211
|
case "list-quotations": {
|
|
1211
1212
|
const statusRaw = getFlag(flags, "status");
|
|
1213
|
+
const createdByRaw = getFlag(flags, "createdBy") ?? getFlag(flags, "requesterIds");
|
|
1214
|
+
const perPageRaw = getFlag(flags, "perPage") ?? getFlag(flags, "pageSize");
|
|
1212
1215
|
await listQuotations({
|
|
1213
1216
|
projectId: getFlag(flags, "projectId"),
|
|
1214
1217
|
budgetId: getFlag(flags, "budgetId"),
|
|
1215
1218
|
supplierId: getFlag(flags, "supplierId"),
|
|
1216
1219
|
status: parseCommaSeparatedQuotationStatuses(statusRaw),
|
|
1217
|
-
|
|
1220
|
+
createdBy: parseCommaSeparatedIds(createdByRaw),
|
|
1218
1221
|
search: getFlag(flags, "search"),
|
|
1219
1222
|
page: getFlag(flags, "page") !== undefined
|
|
1220
1223
|
? Number(getFlag(flags, "page"))
|
|
1221
1224
|
: undefined,
|
|
1222
|
-
|
|
1223
|
-
? Number(getFlag(flags, "pageSize"))
|
|
1224
|
-
: undefined,
|
|
1225
|
+
perPage: perPageRaw !== undefined ? Number(perPageRaw) : undefined,
|
|
1225
1226
|
});
|
|
1226
1227
|
break;
|
|
1227
1228
|
}
|
package/dist/registry/index.js
CHANGED
|
@@ -192,6 +192,9 @@ const titleCase = (value) => value
|
|
|
192
192
|
const summaryFor = (legacyTarget) => {
|
|
193
193
|
if (legacyTarget === "whoami")
|
|
194
194
|
return "Show the active API-key identity.";
|
|
195
|
+
if (legacyTarget === "download-customer-invoice-pdf") {
|
|
196
|
+
return "Download a customer invoice PDF when permitted.";
|
|
197
|
+
}
|
|
195
198
|
if (legacyTarget.startsWith("list-")) {
|
|
196
199
|
return `List ${legacyTarget.slice("list-".length).replaceAll("-", " ")}.`;
|
|
197
200
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@go-labs-sg/bb",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.16.0",
|
|
4
4
|
"description": "Budget Builder CLI for AI agents — manage budgets, bills, claims, quotations, and customer invoices with explicit workflow previews for sensitive changes.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -98,6 +98,7 @@ This table highlights the role-sensitive command groups an agent is most likely
|
|
|
98
98
|
| `bb bill status update ... APPROVED` or `... PAID` | `ADMIN`; state, integration, payment-reference, and payment-proof requirements still apply. |
|
|
99
99
|
| `bb bill payment patch`; `bb bill invoice-number patch` | `ACCOUNTING_TEAM` or `ADMIN`, with the procedure's bill-state constraints. |
|
|
100
100
|
| `bb customer-invoice approve` and `bb customer-invoice reject` | `ADMIN` batch operations selected by batch ID; the API resolves the internal pending Admin approval record. |
|
|
101
|
+
| `bb customer-invoice pdf download` | `ADMIN` for pending-approval batches; other roles may download after pending approval. QuickBooks sync errors cannot be previewed or downloaded. |
|
|
101
102
|
| Dashboard/performance, supplier analytics, errors, integration operations | `ADMIN`. |
|
|
102
103
|
| `bb item category create`, `bb item category update`, `bb item category delete`, `bb supplier delete`, `bb supplier reactivate`, and `bb budget item placeholder-bill create` | `ADMIN`. |
|
|
103
104
|
|