@nanobpm/nano-workforce 0.139.1 → 0.139.2
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/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [0.139.2](https://github.com/nanobpm/nano-workforce/compare/v0.139.1...v0.139.2) (2026-08-24)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* **delivery-graphs:** stop the in-flight grid headers wrapping to 0-width columns ([#538](https://github.com/nanobpm/nano-workforce/issues/538)) ([#539](https://github.com/nanobpm/nano-workforce/issues/539)) ([c52e85b](https://github.com/nanobpm/nano-workforce/commit/c52e85bf38edef680914df0336ff95c98a364059))
|
|
6
|
+
|
|
1
7
|
## [0.139.1](https://github.com/nanobpm/nano-workforce/compare/v0.139.0...v0.139.1) (2026-08-24)
|
|
2
8
|
|
|
3
9
|
### Bug Fixes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nanobpm/nano-workforce",
|
|
3
|
-
"version": "0.139.
|
|
3
|
+
"version": "0.139.2",
|
|
4
4
|
"description": "Nano Workforce — an Agent Graph Orchestration application for Agentic SDLC: durable BPMN processes that coordinate a graph of AI agents across the software delivery lifecycle.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "main.ts",
|
|
@@ -128,15 +128,15 @@
|
|
|
128
128
|
{ "label": "All", "filter": [] }
|
|
129
129
|
],
|
|
130
130
|
"columns": [
|
|
131
|
-
{ "field": "title", "template": "{{title}}", "header": "Graph", "subtitleField": "run_key", "truncate": true, "width": "
|
|
132
|
-
{ "field": "status", "header": "Status", "link": { "kind": "processExplorer", "keyField": "process_key" } },
|
|
133
|
-
{ "field": "process_key", "header": "Instance", "width": "
|
|
134
|
-
{ "field": "phase", "header": "Phase", "truncate": true, "width": "
|
|
135
|
-
{ "field": "node_count", "header": "Nodes" },
|
|
136
|
-
{ "field": "human_node_count", "header": "Human" },
|
|
137
|
-
{ "field": "side_effect_count", "header": "
|
|
138
|
-
{ "field": "created_at", "header": "Dispatched", "width": "
|
|
139
|
-
{ "field": "updated_at", "header": "Updated", "width": "
|
|
131
|
+
{ "field": "title", "template": "{{title}}", "header": "Graph", "subtitleField": "run_key", "truncate": true, "width": "20%", "link": { "kind": "page", "page": "delivery-graph-detail", "keyField": "run_key" } },
|
|
132
|
+
{ "field": "status", "header": "Status", "truncate": true, "width": "12%", "link": { "kind": "processExplorer", "keyField": "process_key" } },
|
|
133
|
+
{ "field": "process_key", "header": "Instance", "width": "9%", "truncate": true, "link": { "kind": "processExplorer", "keyField": "process_key" } },
|
|
134
|
+
{ "field": "phase", "header": "Phase", "truncate": true, "width": "15%" },
|
|
135
|
+
{ "field": "node_count", "header": "Nodes", "width": "5%" },
|
|
136
|
+
{ "field": "human_node_count", "header": "Human", "width": "5%" },
|
|
137
|
+
{ "field": "side_effect_count", "header": "Effects", "width": "7%" },
|
|
138
|
+
{ "field": "created_at", "header": "Dispatched", "width": "11%", "truncate": true, "format": "datetime" },
|
|
139
|
+
{ "field": "updated_at", "header": "Updated", "width": "11%", "truncate": true, "format": "datetime" }
|
|
140
140
|
],
|
|
141
141
|
"detail": {
|
|
142
142
|
"fields": [
|
|
@@ -115,6 +115,28 @@ test("#523: Save-to-library on the staged App-View posts save-from-digest", () =
|
|
|
115
115
|
assert(/post\(saveLibraryUrl,\s*\{\s*name:[^}]*digest:/.test(STAGED_JS), "Save-to-library must POST { name, digest } (save-from-digest) to the save door");
|
|
116
116
|
});
|
|
117
117
|
|
|
118
|
+
test("#538: the in-flight grid's column widths never over-allocate (no 0-width column, no header char-wrap)", () => {
|
|
119
|
+
// Regression guard: the grid is `table-layout:fixed` with `overflow-wrap:anywhere` headers, so a
|
|
120
|
+
// column squeezed to 0 width wraps its title one character per line (a ~250px-tall header row). That
|
|
121
|
+
// happens when the declared widths over-allocate. Pin the contract: every data column carries a
|
|
122
|
+
// percentage width, and their sum leaves headroom (>=5%) for the implicit row-action column — so no
|
|
123
|
+
// column can collapse to 0.
|
|
124
|
+
const page = JSON.parse(PAGE_JSON) as { nodes: Array<Record<string, any>> };
|
|
125
|
+
const grid = page.nodes.find((n) => n.id === "delivery-graphs-inflight");
|
|
126
|
+
assert(grid, "the page must carry the delivery-graphs-inflight grid");
|
|
127
|
+
const columns = (grid?.props?.columns ?? []) as Array<Record<string, any>>;
|
|
128
|
+
assert(columns.length > 0, "the grid must declare columns");
|
|
129
|
+
let sum = 0;
|
|
130
|
+
for (const col of columns) {
|
|
131
|
+
const w = col.width;
|
|
132
|
+
assert(typeof w === "string" && /^\d+(\.\d+)?%$/.test(w), `column "${col.header}" must declare a percentage width so it can't collapse to 0 (got ${JSON.stringify(w)})`);
|
|
133
|
+
const parsed = Number.parseFloat(w);
|
|
134
|
+
assert(parsed > 0, `column "${col.header}" must declare a positive width so it can't collapse to 0 (got ${JSON.stringify(w)})`);
|
|
135
|
+
sum += parsed;
|
|
136
|
+
}
|
|
137
|
+
assert(sum <= 95, `declared column widths sum to ${sum}% — they must leave >=5% for the row-action column so nothing squeezes to 0 (#538)`);
|
|
138
|
+
});
|
|
139
|
+
|
|
118
140
|
test("#523: Save-to-library is offered on a dispatched/history grid row (save-from-dispatched)", () => {
|
|
119
141
|
const page = JSON.parse(PAGE_JSON) as { nodes: Array<Record<string, any>> };
|
|
120
142
|
const grid = page.nodes.find((n) => n.id === "delivery-graphs-inflight");
|