@nanobpm/nano-workforce 0.78.0 → 0.80.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.
@@ -11,6 +11,7 @@
11
11
  "title": "Nano Workforce",
12
12
  "items": [
13
13
  { "label": "Overview", "page": "overview" },
14
+ { "label": "Lineage", "page": "lineage" },
14
15
  { "label": "Convergence", "page": "home" },
15
16
  { "label": "Epics", "page": "epic" },
16
17
  { "label": "Feature", "page": "feature" },
@@ -11,6 +11,7 @@
11
11
  "title": "Nano Workforce",
12
12
  "items": [
13
13
  { "label": "Overview", "page": "overview" },
14
+ { "label": "Lineage", "page": "lineage" },
14
15
  { "label": "Convergence", "page": "home" },
15
16
  { "label": "Epics", "page": "epic" },
16
17
  { "label": "Feature", "page": "feature" },
@@ -13,6 +13,10 @@
13
13
  "label": "Overview",
14
14
  "page": "overview"
15
15
  },
16
+ {
17
+ "label": "Lineage",
18
+ "page": "lineage"
19
+ },
16
20
  {
17
21
  "label": "Convergence",
18
22
  "page": "home"
@@ -0,0 +1,146 @@
1
+ {
2
+ "schemaVersion": "1.0",
3
+ "title": "Lineage",
4
+ "nodes": [
5
+ {
6
+ "type": "nav",
7
+ "id": "nav",
8
+ "props": {
9
+ "variant": "bar",
10
+ "title": "Nano Workforce",
11
+ "items": [
12
+ { "label": "Overview", "page": "overview" },
13
+ { "label": "Lineage", "page": "lineage" },
14
+ { "label": "Convergence", "page": "home" },
15
+ { "label": "Epics", "page": "epic" },
16
+ { "label": "Feature", "page": "feature" },
17
+ { "label": "Tasks", "page": "tasks" },
18
+ { "label": "Cockpit", "page": "cockpit" }
19
+ ],
20
+ "sticky": true
21
+ }
22
+ },
23
+ {
24
+ "type": "text",
25
+ "id": "title",
26
+ "props": { "text": "Lineage \u2014 intent \u2192 progress", "variant": "heading" }
27
+ },
28
+ {
29
+ "type": "text",
30
+ "id": "subtitle",
31
+ "props": {
32
+ "text": "One narrative per request, not a card-swap. Each row is a single arc of your intent \u2014 request \u2192 implementing \u2192 PR opened \u2192 converging (round n) \u2192 merged/converged/abandoned \u2014 stitched from the feature/epic that started it, the PR(s) it produced, and their convergence + merge outcome. The Stage column is the active frontier; drill into a row for its member PR(s) and rounds. Epics fan out to N PR sub-threads. A human/webhook PR with no originating request is shown as its own root.",
33
+ "variant": "sub"
34
+ }
35
+ },
36
+ {
37
+ "type": "dataGrid",
38
+ "id": "threads",
39
+ "props": {
40
+ "title": "Lineage threads",
41
+ "collapsible": true,
42
+ "defaultCollapsed": false,
43
+ "showCount": true,
44
+ "rowKey": "root_request_key",
45
+ "refreshMs": 5000,
46
+ "data": {
47
+ "kind": "datasource",
48
+ "source": "app",
49
+ "table": "lineage_threads",
50
+ "orderBy": { "field": "updated_at", "dir": "desc" },
51
+ "filter": [{ "field": "active", "in": [1] }]
52
+ },
53
+ "tabs": [
54
+ {
55
+ "label": "Active",
56
+ "filter": [{ "field": "active", "in": [1] }]
57
+ },
58
+ {
59
+ "label": "History",
60
+ "filter": [{ "field": "active", "in": [0] }]
61
+ }
62
+ ],
63
+ "columns": [
64
+ {
65
+ "field": "title",
66
+ "template": "{{title}}",
67
+ "header": "Intent",
68
+ "subtitleField": "root_request_key",
69
+ "truncate": true,
70
+ "width": "34%",
71
+ "linkField": "issue_url"
72
+ },
73
+ { "field": "kind", "header": "Kind", "width": "6rem" },
74
+ {
75
+ "field": "stage_label",
76
+ "header": "Stage",
77
+ "truncate": true,
78
+ "link": { "kind": "processExplorer", "keyField": "process_key" }
79
+ },
80
+ { "field": "pr_count", "header": "PRs", "width": "5rem" },
81
+ { "field": "updated_at", "header": "Updated", "width": "9rem" }
82
+ ],
83
+ "detail": {
84
+ "linkField": "issue_url",
85
+ "fields": [
86
+ { "field": "kind", "label": "Origin kind" },
87
+ { "field": "stage", "label": "Frontier stage" },
88
+ { "field": "stage_label", "label": "Frontier" },
89
+ { "field": "issue_url", "label": "Origin issue" },
90
+ { "field": "pr_count", "label": "PR count" }
91
+ ],
92
+ "children": [
93
+ {
94
+ "title": "Pull requests in this thread",
95
+ "source": "app",
96
+ "table": "pull_requests",
97
+ "parentField": "root_request_key",
98
+ "childField": "root_request_key",
99
+ "orderBy": { "field": "updated_at", "dir": "asc" },
100
+ "columns": [
101
+ { "field": "title", "template": "{{title}}", "header": "PR", "subtitleField": "pr_key", "truncate": true, "linkField": "url" },
102
+ { "field": "status", "header": "Status", "link": { "kind": "processExplorer", "keyField": "process_key" } },
103
+ { "field": "current_round", "header": "Round" },
104
+ { "field": "outcome", "header": "Outcome", "truncate": true },
105
+ { "field": "updated_at", "header": "Updated", "width": "9rem" }
106
+ ],
107
+ "detail": {
108
+ "linkField": "url",
109
+ "children": [
110
+ {
111
+ "title": "Rounds",
112
+ "source": "app",
113
+ "table": "rounds",
114
+ "parentField": "pr_key",
115
+ "childField": "pr_key",
116
+ "orderBy": { "field": "round_no", "dir": "asc" },
117
+ "columns": [
118
+ { "field": "round_no", "header": "#" },
119
+ { "field": "status", "header": "Result" },
120
+ { "field": "summary", "header": "Summary" }
121
+ ]
122
+ },
123
+ {
124
+ "title": "Escalations",
125
+ "source": "app",
126
+ "table": "escalations",
127
+ "parentField": "pr_key",
128
+ "childField": "pr_key",
129
+ "orderBy": { "field": "id", "dir": "asc" },
130
+ "columns": [
131
+ { "field": "round_no", "header": "#" },
132
+ { "field": "kind", "header": "Kind" },
133
+ { "field": "question", "header": "Question" },
134
+ { "field": "status", "header": "Status" },
135
+ { "field": "answer", "header": "Answer" }
136
+ ]
137
+ }
138
+ ]
139
+ }
140
+ }
141
+ ]
142
+ }
143
+ }
144
+ }
145
+ ]
146
+ }
@@ -11,6 +11,7 @@
11
11
  "title": "Nano Workforce",
12
12
  "items": [
13
13
  { "label": "Overview", "page": "overview" },
14
+ { "label": "Lineage", "page": "lineage" },
14
15
  { "label": "Convergence", "page": "home" },
15
16
  { "label": "Epics", "page": "epic" },
16
17
  { "label": "Feature", "page": "feature" },
@@ -13,6 +13,10 @@
13
13
  "label": "Overview",
14
14
  "page": "overview"
15
15
  },
16
+ {
17
+ "label": "Lineage",
18
+ "page": "lineage"
19
+ },
16
20
  {
17
21
  "label": "Convergence",
18
22
  "page": "home"
@@ -32,7 +32,7 @@ const handler: AppJobHandler<In, Record<string, never>> = async (job, app) => {
32
32
  }
33
33
  // `convergeOnly` is the inverse of auto-merge: converge-only stops at `converged`; auto-merge lets
34
34
  // the merge-loop drive the merge. `submitPr` is idempotent on the PR key.
35
- await submitPr(app.data, app.engine, parsed, [], MAX_ROUNDS, !autoMerge);
35
+ await submitPr(app.data, app.engine, parsed, [], MAX_ROUNDS, !autoMerge, featureKey);
36
36
  await featureRuns(app.data).update(featureKey, {
37
37
  status: "converging",
38
38
  pr_key: parsed.prKey,
@@ -25,7 +25,7 @@ import {
25
25
  planTaskDeps,
26
26
  planTasks,
27
27
  } from "../../app/plan.ts";
28
- import { parsePr, submitPr } from "../../app/service.ts";
28
+ import { MAX_ROUNDS, parsePr, submitPr } from "../../app/service.ts";
29
29
  import { parseTaskDelta, readTaskDeltas, recordTaskDelta } from "../../app/taskDelta.ts";
30
30
  import { shouldRunTrialMerge, type TrialMergeHead } from "../../app/trialMerge.ts";
31
31
  import type { WorkerInputs } from "../../nano-generated/worker-io.d.ts";
@@ -182,7 +182,7 @@ const handler: AppJobHandler<In, Out> = async (job, app) => {
182
182
  }
183
183
 
184
184
  try {
185
- await submitPr(app.data, app.engine, parsed, depPrKeys);
185
+ await submitPr(app.data, app.engine, parsed, depPrKeys, MAX_ROUNDS, false, planKey);
186
186
  } catch (err) {
187
187
  app.log.error(`record-wave: handoff failed for ${parsed.prKey}`, {
188
188
  err: String(err),