@tekyzinc/gsd-t 3.13.14 → 3.13.15
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 +23 -0
- package/bin/gsd-t.js +14 -9
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to GSD-T are documented here. Updated with each release.
|
|
4
4
|
|
|
5
|
+
## [3.13.15] - 2026-04-17
|
|
6
|
+
|
|
7
|
+
### Fixed — Self-protection guard now uses package-name identity + narrow `bin/*.cjs` gitignore rule
|
|
8
|
+
|
|
9
|
+
Two bugs in v3.13.14 surfaced when `gsd-t update-all` ran against GSD-T's own source repo from the globally-installed CLI:
|
|
10
|
+
|
|
11
|
+
**Bug 1 — Self-protection guard bypassed**: The v3.13.14 guard compared `realpathSync(projectBinDir)` against `realpathSync(PKG_ROOT/bin)`. When `update-all` runs from the globally-installed CLI (`/usr/local/lib/node_modules/@tekyzinc/gsd-t`), `PKG_ROOT` points there — NOT to the local GSD-T source at `/Users/…/projects/GSD-T`. The paths never match in the typical dogfood setup, so the guard returned `false` and the sweep ate the source `bin/gsd-t.js`.
|
|
12
|
+
|
|
13
|
+
**Fix**: identity is now by `package.json` name. The sweep reads `projectDir/package.json` and skips if `name === "@tekyzinc/gsd-t"`. Works regardless of whether `update-all` runs from the local source tree or the global install.
|
|
14
|
+
|
|
15
|
+
**Bug 2 — Gitignore rule overly broad**: `UNATTENDED_GITIGNORE_ENTRIES` included `bin/*.cjs`, which ignored every `.cjs` under `bin/` — contradicting the adjacent comment ("legitimate `.cjs` source files under `bin/` ARE tracked"). With the broad rule active, new source `.cjs` files (e.g., `bin/headless-exit-codes.cjs`) couldn't be committed without `--force`.
|
|
16
|
+
|
|
17
|
+
**Fix**: the gitignore entry narrows to exactly `bin/context-meter-state.cjs` — the single session-state artifact that was the original intent.
|
|
18
|
+
|
|
19
|
+
**Files**:
|
|
20
|
+
- `bin/gsd-t.js` — `isSourcePackage` now reads `package.json.name`; `UNATTENDED_GITIGNORE_ENTRIES` narrowed.
|
|
21
|
+
- `test/bin-gsd-t-resilience.test.js` — self-protection test reshaped: seeds a tmp `package.json` with `name: "@tekyzinc/gsd-t"` + a signature-matching stray, asserts the stray survives the sweep.
|
|
22
|
+
- `.gitignore` — deduped and restored to the narrow form.
|
|
23
|
+
|
|
24
|
+
**Tests**: 1240/1240 pass (unchanged count; existing self-protection test reshaped). E2E: N/A.
|
|
25
|
+
|
|
26
|
+
**Impact**: `gsd-t update-all` is now safe to run with GSD-T itself registered as a project, regardless of where the CLI is installed from. Legitimate `.cjs` source files in `bin/` are no longer blanket-ignored in downstream projects' `.gitignore`. bee-poc's supervisor, which started loading cleanly on v3.13.14, continues to load on v3.13.15 (this release is purely dogfood-protection + gitignore repair; no supervisor-behavior change).
|
|
27
|
+
|
|
5
28
|
## [3.13.14] - 2026-04-17
|
|
6
29
|
|
|
7
30
|
### Fixed — Supervisor no longer requires project-local `bin/gsd-t.js` + sweep self-protection
|
package/bin/gsd-t.js
CHANGED
|
@@ -2161,18 +2161,23 @@ function copyBinToolsToProject(projectDir, projectName) {
|
|
|
2161
2161
|
}
|
|
2162
2162
|
}
|
|
2163
2163
|
}
|
|
2164
|
-
// Self-protection: NEVER sweep
|
|
2164
|
+
// Self-protection: NEVER sweep GSD-T's own source repo. Without this guard,
|
|
2165
2165
|
// running `gsd-t update-all` with the GSD-T source repo itself registered
|
|
2166
2166
|
// as a project (legitimate during development) would signature-match
|
|
2167
2167
|
// bin/gsd-t.js — which IS the installer — and delete the source file.
|
|
2168
|
-
//
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2168
|
+
// Identity is by package.json name, NOT by path — when update-all runs from
|
|
2169
|
+
// the globally-installed package, PKG_ROOT points to the global install and
|
|
2170
|
+
// realpath comparison against the local source always fails.
|
|
2171
|
+
const isSourcePackage = (() => {
|
|
2172
|
+
try {
|
|
2173
|
+
const pkgPath = path.join(projectDir, "package.json");
|
|
2174
|
+
if (!fs.existsSync(pkgPath)) return false;
|
|
2175
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
2176
|
+
return pkg && pkg.name === "@tekyzinc/gsd-t";
|
|
2177
|
+
} catch {
|
|
2178
|
+
return false;
|
|
2179
|
+
}
|
|
2174
2180
|
})();
|
|
2175
|
-
const isSourcePackage = resolvedProjectBin === resolvedPkgBin;
|
|
2176
2181
|
let cleaned = 0;
|
|
2177
2182
|
if (!isSourcePackage) {
|
|
2178
2183
|
for (const stray of DEPRECATED_BIN_STRAYS) {
|
|
@@ -2324,7 +2329,7 @@ function ensureUnattendedConfig(projectDir, projectName) {
|
|
|
2324
2329
|
}
|
|
2325
2330
|
|
|
2326
2331
|
const UNATTENDED_GITIGNORE_ENTRIES = [
|
|
2327
|
-
"bin
|
|
2332
|
+
"bin/context-meter-state.cjs",
|
|
2328
2333
|
".gsd-t/.archive-migration-v1",
|
|
2329
2334
|
".gsd-t/.task-counter-retired-v1",
|
|
2330
2335
|
];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tekyzinc/gsd-t",
|
|
3
|
-
"version": "3.13.
|
|
3
|
+
"version": "3.13.15",
|
|
4
4
|
"description": "GSD-T: Contract-Driven Development for Claude Code — 54 slash commands with headless-by-default workflow spawning, unattended supervisor relay with event stream, graph-powered code analysis, real-time agent dashboard, 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",
|