@tekyzinc/gsd-t 2.63.10 → 2.65.10
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 +19 -0
- package/package.json +1 -1
- package/templates/page-contract.md +63 -7
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GSD-T are documented here. Updated with each release.
|
|
4
4
|
|
|
5
|
+
## [2.65.10] - 2026-04-05
|
|
6
|
+
|
|
7
|
+
### Changed (page-contract template)
|
|
8
|
+
- **Boundary grep regex tightened** — line-anchored (`^\s*`) + requires opening `{` — avoids false positives on JS identifiers like `donutProps` or property access `obj.donut`. Only matches actual CSS rules. Closes gap P5 from page-tier run 2.
|
|
9
|
+
|
|
10
|
+
### Added (page-contract template)
|
|
11
|
+
- **Multi-state Page Fixture convention** — for pages whose state swaps widget data, declare one full fixture per state under `__states__` keys, referencing named widget sub-fixtures (`#/fixture-sessions`). Prefer full duplication over override deltas. Closes gap P6.
|
|
12
|
+
- **Inline-stub promotion guidance** — if a page-scope control is used in ≥2 pages, promote to its own widget contract; until then list in Composes Elements (direct) with `(promotion candidate)` tag. Closes gap P7.
|
|
13
|
+
|
|
14
|
+
## [2.64.10] - 2026-04-05
|
|
15
|
+
|
|
16
|
+
### Added (page-contract template)
|
|
17
|
+
- **Page Fixture (OPTIONAL)** section — formalizes the composition chain (element → widget → page) by referencing each widget's fixture via `$ref:{widget-name}#/fixture`. Closes gap P2 from page-tier convergence run 1.
|
|
18
|
+
- **Boundary Rules (MANDATORY)** section — explicit rules on what a page may vs may not do (pass data through widget props = OK; declare CSS for widget internal classes = VIOLATION). Adds a grep-based enforcement check. Closes gap P3.
|
|
19
|
+
- **Grid position format** clarification — use `grid[row=N, col=M]` OR named CSS grid areas, consistently within one page. Closes gap P4.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- **Widgets Used** table: renamed "Notes" column → "Layout Notes" with positioning-only guidance (spans/stacking/sticky — NOT widget configuration). Closes gap P1.
|
|
23
|
+
|
|
5
24
|
## [2.63.10] - 2026-04-05
|
|
6
25
|
|
|
7
26
|
### Added
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tekyzinc/gsd-t",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.65.10",
|
|
4
4
|
"description": "GSD-T: Contract-Driven Development for Claude Code — 51 slash commands with headless CI/CD mode, graph-powered code analysis, real-time agent dashboard, execution intelligence, task telemetry, doc-ripple enforcement, backlog management, impact analysis, test sync, milestone archival, and PRD generation",
|
|
5
5
|
"author": "Tekyz, Inc.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,14 +18,52 @@ Top-level assembly of widgets + global layout + routing + data loading. Pages PO
|
|
|
18
18
|
|
|
19
19
|
## Widgets Used
|
|
20
20
|
|
|
21
|
-
| Position in Grid | Widget Contract | Notes
|
|
21
|
+
| Position in Grid | Widget Contract | Layout Notes |
|
|
22
22
|
|----------------------------------|---------------------------------|------------------------------|
|
|
23
|
-
| header | page-header-widget |
|
|
24
|
-
| sidebar | nav-sidebar-widget |
|
|
25
|
-
| grid[row=1, cols=1-4] | stat-strip-widget |
|
|
26
|
-
| grid[row=2, col=1-2] | revenue-breakdown-widget |
|
|
27
|
-
| grid[row=2, col=3-4] | user-growth-widget |
|
|
28
|
-
| grid[row=3, col=1-4] | recent-activity-table-widget |
|
|
23
|
+
| header | page-header-widget | sticky |
|
|
24
|
+
| sidebar | nav-sidebar-widget | collapsible at <1024px |
|
|
25
|
+
| grid[row=1, cols=1-4] | stat-strip-widget | full-width row |
|
|
26
|
+
| grid[row=2, col=1-2] | revenue-breakdown-widget | spans 2 columns |
|
|
27
|
+
| grid[row=2, col=3-4] | user-growth-widget | spans 2 columns |
|
|
28
|
+
| grid[row=3, col=1-4] | recent-activity-table-widget | full width |
|
|
29
|
+
|
|
30
|
+
**Grid position format**: use EITHER `grid[row=N, col=M]` / `grid[row=N, cols=M-K]` OR named CSS grid areas (`grid-area: strip`). Be consistent within one page. The **Layout Notes** column documents positioning metadata only (spans, stacking, sticky/fixed) — NOT widget configuration (widget props live in the widget contract).
|
|
31
|
+
|
|
32
|
+
## Page Fixture (OPTIONAL)
|
|
33
|
+
|
|
34
|
+
If you want to formalize the composition chain (element → widget → page), declare a page-level fixture that references each widget's fixture by `$ref`:
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"__fixture_source__": "composed-from-widgets",
|
|
39
|
+
"strip": "$ref:stat-strip-widget#/fixture",
|
|
40
|
+
"donut": "$ref:revenue-breakdown-widget#/fixture",
|
|
41
|
+
"bar": "$ref:user-growth-widget#/fixture"
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Skip this section for pages that are pure assembly with no storybook / harness target. Include it when the page has a dedicated demo route or when multiple pages share widget fixtures and you want to document which instance each page references.
|
|
46
|
+
|
|
47
|
+
**Multi-state pages** (when page state swaps widget data): declare **one full fixture per state**, keyed by the state name. Prefer full duplication over override deltas — it's more verbose but makes each state independently runnable and avoids merge ambiguity.
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"__fixture_source__": "composed-from-widgets",
|
|
52
|
+
"__states__": ["Members", "Sessions"],
|
|
53
|
+
"Members": {
|
|
54
|
+
"donut": "$ref:donut-chart-card-widget#/fixture",
|
|
55
|
+
"bar": "$ref:bar-chart-card-widget#/fixture"
|
|
56
|
+
},
|
|
57
|
+
"Sessions": {
|
|
58
|
+
"donut": "$ref:donut-chart-card-widget#/fixture-sessions",
|
|
59
|
+
"bar": "$ref:bar-chart-card-widget#/fixture-sessions"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Widget contracts that have multiple fixture variants expose them as named sub-fixtures (`#/fixture-sessions`, `#/fixture-q4`, etc.) rather than a single `#/fixture`.
|
|
65
|
+
|
|
66
|
+
**Inline-stub promotion**: if a page-scope control or chrome element (segmented control, tab bar, breadcrumb) is used in ≥2 pages, promote it to its own widget contract. Until promoted, list the stub in **Composes Elements (direct)** with a `(promotion candidate)` tag and the page paths that use it.
|
|
29
67
|
|
|
30
68
|
## Layout
|
|
31
69
|
|
|
@@ -123,6 +161,24 @@ Top-level assembly of widgets + global layout + routing + data loading. Pages PO
|
|
|
123
161
|
- **Router integration**: {vue-router / react-router / next.js app dir}
|
|
124
162
|
- **Data fetching**: {composable / hook / server component}
|
|
125
163
|
|
|
164
|
+
## Boundary Rules (MANDATORY)
|
|
165
|
+
|
|
166
|
+
A page is allowed to:
|
|
167
|
+
- Pass DATA through a widget's documented `defineProps` / public API (titles, subtitles, fixture data — these are the widget's legitimate inputs)
|
|
168
|
+
- Declare page-level layout CSS (grid template, gaps, padding, max-width, background, landmark regions)
|
|
169
|
+
- Manage route-level state and data fetching
|
|
170
|
+
|
|
171
|
+
A page is **FORBIDDEN** from:
|
|
172
|
+
- Declaring CSS selectors that target a widget's internal classes (`.card-title`, `.donut-segment`, `.legend-dot`) — this is a boundary violation
|
|
173
|
+
- Overriding widget visual spec via `:deep()` selectors or `!important` on widget-owned properties
|
|
174
|
+
- Re-specifying element visual spec (colors, font sizes, radii, paddings owned by elements)
|
|
175
|
+
|
|
176
|
+
**Enforcement check** (line-anchored CSS-only grep, avoids false positives on JS identifiers):
|
|
177
|
+
```
|
|
178
|
+
grep -En '^\s*(\.card-title|\.donut|\.legend-dot|\.kpi-value|\.chart-wrapper|\.filter-select)[^\w-]*\{' {page-file}
|
|
179
|
+
```
|
|
180
|
+
The leading `^\s*` anchor + trailing `\{` requirement matches ONLY CSS rules at the start of a line, not JS property access (`obj.donut`) or variable names (`donutProps`). If any match is found, move the styling into the widget contract or create a widget variant.
|
|
181
|
+
|
|
126
182
|
## Verification Checklist
|
|
127
183
|
|
|
128
184
|
Page-level verification runs AFTER all widgets pass their own verification. Page verification only checks assembly — widget and element internals are out of scope.
|