@tekyzinc/gsd-t 2.20.7 → 2.22.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.
@@ -0,0 +1,67 @@
1
+ # Workflows — GSD-T Framework (@tekyzinc/gsd-t)
2
+
3
+ ## Last Updated: 2026-02-18
4
+
5
+ ## User Workflows
6
+
7
+ ### Install GSD-T
8
+ 1. Run `npx @tekyzinc/gsd-t install`
9
+ 2. CLI copies commands to `~/.claude/commands/`
10
+ 3. CLI sets up global CLAUDE.md if missing
11
+ 4. CLI installs heartbeat hooks
12
+ 5. User starts Claude Code in their project
13
+
14
+ **Entry point**: `npx @tekyzinc/gsd-t install`
15
+ **Success**: 41 commands available in Claude Code
16
+ **Failure**: CLI reports missing Node.js or permission errors
17
+
18
+ ### Initialize a Project
19
+ 1. User runs `/gsd-t-init` in Claude Code
20
+ 2. Init creates `.gsd-t/` directory structure
21
+ 3. Init creates or updates CLAUDE.md
22
+ 4. Init creates `docs/` living documents if missing
23
+ 5. Init scans existing codebase if code exists
24
+
25
+ **Entry point**: `/gsd-t-init` slash command
26
+ **Success**: Project ready for milestone definition
27
+ **Failure**: Reports what couldn't be created
28
+
29
+ ### Full Wave Cycle
30
+ 1. User defines milestone via `/gsd-t-milestone`
31
+ 2. Partition decomposes into domains + contracts
32
+ 3. Plan creates task lists per domain
33
+ 4. Execute implements tasks (solo or team)
34
+ 5. Test-sync aligns tests with code changes
35
+ 6. Integrate wires domains together
36
+ 7. Verify runs quality gates
37
+ 8. Complete-milestone archives and tags
38
+
39
+ **Entry point**: `/gsd-t-wave` or manual phase-by-phase
40
+ **Success**: Milestone completed, version bumped, git tagged
41
+ **Failure**: Wave pauses at failing phase, user can fix and resume
42
+
43
+ ## Technical Workflows
44
+
45
+ ### CLI Update Check
46
+ 1. CLI reads cached version from `~/.claude/.gsd-t-update-cache`
47
+ 2. If cache is older than 1 hour, query npm registry
48
+ 3. Compare installed vs. latest using semver
49
+ 4. Display update notice if newer version available
50
+
51
+ **Trigger**: Every CLI invocation and `/gsd-t-status`
52
+ **Frequency**: Cached, actual fetch at most once per hour
53
+
54
+ ### Heartbeat Event Logging
55
+ 1. Claude Code hook fires on tool call or notification
56
+ 2. `gsd-t-heartbeat.js` appends JSONL event to `.gsd-t/heartbeat-{session}.jsonl`
57
+ 3. Events include timestamp, type, and context
58
+
59
+ **Trigger**: Claude Code hooks (9 event types)
60
+ **Frequency**: On every hooked event during a session
61
+
62
+ ## Integration Workflows
63
+
64
+ ### npm Publish
65
+ - **Trigger**: Manual `npm publish` after milestone completion
66
+ - **Flow**: Version bumped → CHANGELOG updated → git tagged → npm publish
67
+ - **Verification**: `npx @tekyzinc/gsd-t status` on fresh install
@@ -1,15 +1,13 @@
1
- # Domain: auth — Example
2
-
3
- ## Responsibility
4
- Handles all authentication and authorization: user registration, login, JWT token generation and verification, password hashing, and auth middleware for protecting routes.
5
-
6
- ## Files Owned
7
- - `src/auth/` — all auth service code
8
- - `src/middleware/auth.py` — auth middleware
9
- - `tests/auth/` — auth tests
10
-
11
- ## Inputs (from other domains)
12
- - schema-contract.md: Users table structure for lookups
13
-
14
- ## Outputs (to other domains)
15
- - api-contract.md: POST /api/auth/login, POST /api/auth/register, GET /api/users/me
1
+ # Domain: auth — Example
2
+
3
+ ## Responsibility
4
+ Handles all authentication and authorization: user registration, login, JWT token generation and verification, password hashing, and auth middleware for protecting routes.
5
+
6
+ ## Owned Files/Directories
7
+ - `src/auth/` — all auth service code
8
+ - `src/middleware/auth.py` — auth middleware
9
+ - `tests/auth/` — auth tests
10
+
11
+ ## NOT Owned (do not modify)
12
+ - `src/db/` owned by data-layer domain
13
+ - `src/api/` — owned by api domain (except auth endpoints)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tekyzinc/gsd-t",
3
- "version": "2.20.7",
4
- "description": "GSD-T: Contract-Driven Development for Claude Code — 41 slash commands with backlog management, impact analysis, test sync, and milestone archival",
3
+ "version": "2.22.0",
4
+ "description": "GSD-T: Contract-Driven Development for Claude Code — 42 slash commands with backlog management, impact analysis, test sync, and milestone archival",
5
5
  "author": "Tekyz, Inc.",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -55,6 +55,8 @@ process.stdin.on("end", () => {
55
55
  const event = buildEvent(hook);
56
56
  if (event) {
57
57
  cleanupOldHeartbeats(gsdtDir);
58
+ // Symlink check — prevent redirection of event data to arbitrary files
59
+ try { if (fs.lstatSync(file).isSymbolicLink()) return; } catch { /* file doesn't exist yet — safe */ }
58
60
  fs.appendFileSync(file, JSON.stringify(event) + "\n");
59
61
  }
60
62
  } catch (e) {
@@ -69,7 +71,8 @@ function cleanupOldHeartbeats(gsdtDir) {
69
71
  for (const f of files) {
70
72
  if (!f.startsWith("heartbeat-") || !f.endsWith(".jsonl")) continue;
71
73
  const fp = path.join(gsdtDir, f);
72
- const stat = fs.statSync(fp);
74
+ const stat = fs.lstatSync(fp);
75
+ if (stat.isSymbolicLink()) continue; // Don't follow symlinks
73
76
  if (now - stat.mtimeMs > MAX_AGE_MS) {
74
77
  fs.unlinkSync(fp);
75
78
  }
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Background update check — spawned detached by the CLI to refresh the version cache.
5
+ * Usage: node npm-update-check.js <cache-file-path>
6
+ */
7
+
8
+ const https = require("https");
9
+ const fs = require("fs");
10
+
11
+ const cacheFile = process.argv[2];
12
+ if (!cacheFile) process.exit(1);
13
+
14
+ https.get("https://registry.npmjs.org/@tekyzinc/gsd-t/latest",
15
+ { timeout: 5000 }, (res) => {
16
+ let d = "";
17
+ res.on("data", (c) => d += c);
18
+ res.on("end", () => {
19
+ try {
20
+ const v = JSON.parse(d).version;
21
+ if (v && /^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?$/.test(v)) {
22
+ fs.writeFileSync(cacheFile,
23
+ JSON.stringify({ latest: v, timestamp: Date.now() }));
24
+ }
25
+ } catch { /* malformed response — skip */ }
26
+ });
27
+ }).on("error", () => {});