@plot-pm/board 0.6.0-rc.94 → 0.6.0-rc.95

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/plot-plan-meta.sh +23 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plot-pm/board",
3
- "version": "0.6.0-rc.94",
3
+ "version": "0.6.0-rc.95",
4
4
  "description": "Local Kanban board for Plot — a glanceable view of plan phases from docs/plans, with sprint and story filters",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/plot-plan-meta.sh CHANGED
@@ -45,8 +45,14 @@
45
45
  # file the path given
46
46
  # format canonical | frontmatter | none
47
47
  # phase_raw primary phase value as written ("" if absent)
48
- # phase normalized: draft|approved|delivered|released|rejected|
49
- # superseded|UNKNOWN|NONE
48
+ # phase normalized: draft|design|approved|delivered|released|
49
+ # rejected|superseded|UNKNOWN|NONE
50
+ # `design` is a phase of its own, not a synonym for anything:
51
+ # a plan in Design cannot yet be handed to development because
52
+ # it needs a spec, a spike or a tracer bullet first. That is a
53
+ # different statement from "approved and nobody has started",
54
+ # which is a queue. (`ready-for-review`/`in-review` DO
55
+ # normalize onto `approved` — those are synonyms; this is not.)
50
56
  # phase_alt_raw secondary value when the file carries two (front matter
51
57
  # status: AND phase:), else ""
52
58
  # phase_alt normalized phase_alt_raw (NONE when absent)
@@ -101,6 +107,12 @@
101
107
  # `Released:` or front matter `released:` — date and version).
102
108
  # Empty until /plot-release records it; the tag stays the git
103
109
  # truth and this merely reflects it.
110
+ # design_raw the design transition record as written (`## Status`
111
+ # `Design:` or front matter `design:` — who/when, and what the
112
+ # design work is); "" if absent. Reported for any plan that
113
+ # carries the line, whatever its phase: a plan that WENT
114
+ # THROUGH design keeps the record after moving on, exactly as
115
+ # `approved_raw` outlives the Approved phase.
104
116
  # approved_raw the approval transition record as written (`## Status`
105
117
  # `Approved:` or front matter `approved:` — who/when/channel,
106
118
  # e.g. "2026-07-30, alice, in-session"); "" if absent
@@ -153,7 +165,7 @@ if [ ${#files[@]} -eq 0 ] && [ ${#missing[@]} -eq 0 ]; then
153
165
  fi
154
166
 
155
167
  for f in ${missing[@]+"${missing[@]}"}; do
156
- printf '{"file":"%s","format":"none","error":"file not found","phase_raw":"","phase":"NONE","phase_alt_raw":"","phase_alt":"NONE","type":"","title":"","sprint":"","story":"","assignee":"","branches":[],"prs":[],"issues":[],"changelog":[],"review_raw":"","review":"NONE","impl_raw":"","impl":"NONE","approved_raw":"","released_raw":"","delivered_raw":"","started_raw":[]}\n' \
168
+ printf '{"file":"%s","format":"none","error":"file not found","phase_raw":"","phase":"NONE","phase_alt_raw":"","phase_alt":"NONE","type":"","title":"","sprint":"","story":"","assignee":"","branches":[],"prs":[],"issues":[],"changelog":[],"review_raw":"","review":"NONE","impl_raw":"","impl":"NONE","design_raw":"","approved_raw":"","released_raw":"","delivered_raw":"","started_raw":[]}\n' \
157
169
  "$(printf '%s' "$f" | sed 's/\\/\\\\/g; s/"/\\"/g')"
158
170
  done
159
171
 
@@ -181,7 +193,7 @@ function norm_phase(raw, lower, toks, n, i, t) {
181
193
  for (i = 1; i <= n; i++) {
182
194
  t = toks[i]
183
195
  gsub(/^[^a-z]+/, "", t); gsub(/[^a-z-]+$/, "", t)
184
- if (t ~ /^(draft|approved|delivered|released|rejected|superseded)$/) return t
196
+ if (t ~ /^(draft|design|approved|delivered|released|rejected|superseded)$/) return t
185
197
  if (t == "ready-for-review" || t == "in-review") return "approved"
186
198
  }
187
199
  return "UNKNOWN"
@@ -226,11 +238,11 @@ function reset_state() {
226
238
  fm_status = ""; fm_phase = ""; fm_type = ""
227
239
  fm_title = ""; fm_sprint = ""; fm_story = ""; fm_assignee = ""
228
240
  fm_review = ""; fm_impl = ""; fm_approved = ""; fm_started = ""; fm_released = ""
229
- fm_delivered = ""
241
+ fm_delivered = ""; fm_design = ""
230
242
  canon_phase = ""; canon_type = ""
231
243
  canon_sprint = ""; canon_story = ""; canon_assignee = ""
232
244
  canon_review = ""; canon_impl = ""; canon_approved = ""; canon_released = ""
233
- canon_delivered = ""
245
+ canon_delivered = ""; canon_design = ""
234
246
  h1_title = ""
235
247
  # "" means the plan carries no readable round — NOT zero. Emitted by omitting
236
248
  # the field, so a consumer cannot mistake "never interrogated" for "asked
@@ -247,7 +259,7 @@ function reset_state() {
247
259
  fm_changelog = ""
248
260
  delete changelog; n_changelog = 0; changelog_seen = 0; cl_open = 0
249
261
  }
250
- function emit_record( fmt, praw, palt_raw, traw, title, sprint, story, assignee, review, impl, approved, delivered, issue, i, j, out, sorted_b, sorted_p, sorted_i, nb, np, ni) {
262
+ function emit_record( fmt, praw, palt_raw, traw, title, sprint, story, assignee, review, impl, design, approved, delivered, issue, i, j, out, sorted_b, sorted_p, sorted_i, nb, np, ni) {
251
263
  if (fm_status != "" || fm_phase != "") {
252
264
  fmt = "frontmatter"
253
265
  praw = (fm_status != "") ? fm_status : fm_phase
@@ -266,6 +278,7 @@ function emit_record( fmt, praw, palt_raw, traw, title, sprint, story, assigne
266
278
  assignee = strip_placeholder((fm_assignee != "") ? fm_assignee : canon_assignee)
267
279
  review = strip_placeholder((fm_review != "") ? fm_review : canon_review)
268
280
  impl = strip_placeholder((fm_impl != "") ? fm_impl : canon_impl)
281
+ design = strip_placeholder((fm_design != "") ? fm_design : canon_design)
269
282
  approved = strip_placeholder((fm_approved != "") ? fm_approved : canon_approved)
270
283
  released = strip_placeholder((fm_released != "") ? fm_released : canon_released)
271
284
  delivered = strip_placeholder((fm_delivered != "") ? fm_delivered : canon_delivered)
@@ -345,6 +358,7 @@ function emit_record( fmt, praw, palt_raw, traw, title, sprint, story, assigne
345
358
  out = out "]"
346
359
  out = out ",\"review_raw\":\"" jesc(review) "\",\"review\":\"" norm_review(review) "\""
347
360
  out = out ",\"impl_raw\":\"" jesc(impl) "\",\"impl\":\"" norm_impl(impl) "\""
361
+ out = out ",\"design_raw\":\"" jesc(design) "\""
348
362
  out = out ",\"approved_raw\":\"" jesc(approved) "\""
349
363
  out = out ",\"released_raw\":\"" jesc(released) "\""
350
364
  out = out ",\"delivered_raw\":\"" jesc(delivered) "\""
@@ -376,6 +390,7 @@ in_fm {
376
390
  else if (lower ~ /^assignee:/ && fm_assignee == "") fm_assignee = val_after_colon($0)
377
391
  else if (lower ~ /^review:/ && fm_review == "") fm_review = val_after_colon($0)
378
392
  else if (lower ~ /^impl:/ && fm_impl == "") fm_impl = val_after_colon($0)
393
+ else if (lower ~ /^design:/ && fm_design == "") fm_design = val_after_colon($0)
379
394
  else if (lower ~ /^approved:/ && fm_approved == "") fm_approved = val_after_colon($0)
380
395
  else if (lower ~ /^released:/ && fm_released == "") fm_released = val_after_colon($0)
381
396
  else if (lower ~ /^delivered:/ && fm_delivered == "") fm_delivered = val_after_colon($0)
@@ -437,6 +452,7 @@ section == "status" {
437
452
  else if (lower ~ /^[ \t]*[-*]?[ \t]*\**issue[:*]/ && canon_issue == "") canon_issue = val_after_colon($0)
438
453
  else if (lower ~ /^[ \t]*[-*]?[ \t]*\**review[:*]/ && canon_review == "") canon_review = val_after_colon($0)
439
454
  else if (lower ~ /^[ \t]*[-*]?[ \t]*\**impl[:*]/ && canon_impl == "") canon_impl = val_after_colon($0)
455
+ else if (lower ~ /^[ \t]*[-*]?[ \t]*\**design[:*]/ && canon_design == "") canon_design = val_after_colon($0)
440
456
  else if (lower ~ /^[ \t]*[-*]?[ \t]*\**approved[:*]/ && canon_approved == "") canon_approved = val_after_colon($0)
441
457
  else if (lower ~ /^[ \t]*[-*]?[ \t]*\**released[:*]/ && canon_released == "") canon_released = val_after_colon($0)
442
458
  else if (lower ~ /^[ \t]*[-*]?[ \t]*\**delivered[:*]/ && canon_delivered == "") canon_delivered = val_after_colon($0)