@sienklogic/plan-build-run 2.27.1 → 2.27.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 +7 -0
- package/dashboard/src/services/phase.service.js +6 -2
- package/dashboard/src/views/partials/breadcrumbs.ejs +1 -1
- package/dashboard/src/views/partials/config-content.ejs +1 -1
- package/dashboard/src/views/partials/phases-content.ejs +2 -2
- package/dashboard/src/views/partials/roadmap-content.ejs +4 -4
- package/package.json +1 -1
- package/plugins/copilot-pbr/plugin.json +1 -1
- package/plugins/cursor-pbr/.cursor-plugin/plugin.json +1 -1
- package/plugins/pbr/.claude-plugin/plugin.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,13 @@ All notable changes to Plan-Build-Run will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.27.2](https://github.com/SienkLogic/plan-build-run/compare/plan-build-run-v2.27.1...plan-build-run-v2.27.2) (2026-02-24)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **37-05:** fix breadcrumb icon, milestone spacing, summary lookup, and config mode dropdown ([fd6d929](https://github.com/SienkLogic/plan-build-run/commit/fd6d92947c708e0aaba4b3d0a18897228e1957ec))
|
|
14
|
+
|
|
8
15
|
## [2.27.1](https://github.com/SienkLogic/plan-build-run/compare/plan-build-run-v2.27.0...plan-build-run-v2.27.1) (2026-02-24)
|
|
9
16
|
|
|
10
17
|
|
|
@@ -159,7 +159,9 @@ export async function getPhaseDetail(projectDir, phaseId) {
|
|
|
159
159
|
const oldMatch = planFile.match(/^(\d{2}-\d{2})-PLAN\.md$/);
|
|
160
160
|
const newMatch = planFile.match(/^PLAN-(\d{2})\.md$/);
|
|
161
161
|
const planId = oldMatch ? oldMatch[1] : newMatch ? `${phaseId.padStart(2, '0')}-${newMatch[1]}` : `${phaseId.padStart(2, '0')}-${String(index + 1).padStart(2, '0')}`;
|
|
162
|
-
|
|
162
|
+
// Summary files use just the sequence number for PLAN-NN.md format (SUMMARY-NN.md)
|
|
163
|
+
const summaryName = newMatch ? `SUMMARY-${newMatch[1]}.md` : `SUMMARY-${planId}.md`;
|
|
164
|
+
return { planId, planFile, summaryPath: join(phaseFullPath, summaryName) };
|
|
163
165
|
});
|
|
164
166
|
|
|
165
167
|
const summaryResults = await Promise.allSettled(
|
|
@@ -257,7 +259,9 @@ export async function getPhaseDocument(projectDir, phaseId, planId, docType) {
|
|
|
257
259
|
} else if (docType === 'verification') {
|
|
258
260
|
fileNames = ['VERIFICATION.md'];
|
|
259
261
|
} else {
|
|
260
|
-
|
|
262
|
+
// Try both formats: SUMMARY-NN.md (sequence only) and SUMMARY-{planId}.md (full ID)
|
|
263
|
+
const seqMatch = planId.match(/^\d{2}-(\d{2})$/);
|
|
264
|
+
fileNames = seqMatch ? [`SUMMARY-${seqMatch[1]}.md`, `SUMMARY-${planId}.md`] : [`SUMMARY-${planId}.md`];
|
|
261
265
|
}
|
|
262
266
|
|
|
263
267
|
for (const fileName of fileNames) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<nav aria-label="Breadcrumb">
|
|
3
3
|
<ol class="breadcrumb">
|
|
4
4
|
<li class="breadcrumb-item">
|
|
5
|
-
<a href="/" hx-get="/" hx-target="#main-content" hx-push-url="true"
|
|
5
|
+
<a href="/" hx-get="/" hx-target="#main-content" hx-push-url="true"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:-2px"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg></a>
|
|
6
6
|
</li>
|
|
7
7
|
<% breadcrumbs.forEach(function(item, index) { %>
|
|
8
8
|
<% if (index < breadcrumbs.length - 1) { %>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<label for="cfg-mode" class="col-sm-3 col-form-label">Mode</label>
|
|
31
31
|
<div class="col-sm-9">
|
|
32
32
|
<select id="cfg-mode" name="mode" class="form-select">
|
|
33
|
-
<% ['normal', 'strict', 'relaxed'].forEach(opt => { %>
|
|
33
|
+
<% ['normal', 'autonomous', 'strict', 'relaxed'].forEach(opt => { %>
|
|
34
34
|
<option value="<%= opt %>" <%= config.mode === opt ? 'selected' : '' %>><%= opt %></option>
|
|
35
35
|
<% }); %>
|
|
36
36
|
</select>
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
<div class="card mb-3">
|
|
43
43
|
<div class="card-header">
|
|
44
44
|
<strong><%= group.name %></strong>
|
|
45
|
-
<small>(Phases <%= String(group.startPhase).padStart(2, '0') %>–<%= String(group.endPhase).padStart(2, '0') %>)</small>
|
|
46
|
-
—
|
|
45
|
+
<small class="ms-1">(Phases <%= String(group.startPhase).padStart(2, '0') %>–<%= String(group.endPhase).padStart(2, '0') %>)</small>
|
|
46
|
+
—
|
|
47
47
|
<%
|
|
48
48
|
const groupComplete = group.phases.filter(p => p.status === 'complete').length;
|
|
49
49
|
const groupTotal = group.phases.length;
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
<div class="card-header">
|
|
21
21
|
<strong><%= ms.name %></strong>
|
|
22
22
|
<% if (ms.startPhase && ms.endPhase) { %>
|
|
23
|
-
<small>(Phases <%= String(ms.startPhase).padStart(2, '0') %>–<%= String(ms.endPhase).padStart(2, '0') %>)</small>
|
|
23
|
+
<small class="ms-1">(Phases <%= String(ms.startPhase).padStart(2, '0') %>–<%= String(ms.endPhase).padStart(2, '0') %>)</small>
|
|
24
24
|
<% } %>
|
|
25
|
-
—
|
|
25
|
+
—
|
|
26
26
|
<span class="status-badge" data-status="complete">complete</span>
|
|
27
27
|
</div>
|
|
28
28
|
<div class="card-body">
|
|
@@ -75,9 +75,9 @@
|
|
|
75
75
|
<div class="card-header">
|
|
76
76
|
<strong><%= group.name %></strong>
|
|
77
77
|
<% if (group.startPhase && group.endPhase < 9999) { %>
|
|
78
|
-
<small>(Phases <%= String(group.startPhase).padStart(2, '0') %>–<%= String(group.endPhase).padStart(2, '0') %>)</small>
|
|
78
|
+
<small class="ms-1">(Phases <%= String(group.startPhase).padStart(2, '0') %>–<%= String(group.endPhase).padStart(2, '0') %>)</small>
|
|
79
79
|
<% } %>
|
|
80
|
-
—
|
|
80
|
+
—
|
|
81
81
|
<%
|
|
82
82
|
const gc = group.phases.filter(p => p.status === 'complete').length;
|
|
83
83
|
const gt = group.phases.length;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pbr",
|
|
3
3
|
"displayName": "Plan-Build-Run",
|
|
4
|
-
"version": "2.27.
|
|
4
|
+
"version": "2.27.2",
|
|
5
5
|
"description": "Plan-Build-Run — Structured development workflow for GitHub Copilot CLI. Solves context rot through disciplined agent delegation, structured planning, atomic execution, and goal-backward verification.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "SienkLogic",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pbr",
|
|
3
3
|
"displayName": "Plan-Build-Run",
|
|
4
|
-
"version": "2.27.
|
|
4
|
+
"version": "2.27.2",
|
|
5
5
|
"description": "Plan-Build-Run — Structured development workflow for Cursor. Solves context rot through disciplined subagent delegation, structured planning, atomic execution, and goal-backward verification.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "SienkLogic",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pbr",
|
|
3
|
-
"version": "2.27.
|
|
3
|
+
"version": "2.27.2",
|
|
4
4
|
"description": "Plan-Build-Run — Structured development workflow for Claude Code. Solves context rot through disciplined subagent delegation, structured planning, atomic execution, and goal-backward verification.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SienkLogic",
|