safeword 0.8.0 → 0.8.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/package.json +14 -15
- package/templates/doc-templates/design-doc-template.md +2 -2
- package/templates/doc-templates/feature-spec-template.md +2 -2
- package/templates/doc-templates/task-spec-template.md +3 -3
- package/templates/doc-templates/test-definitions-feature.md +2 -2
- package/templates/guides/planning-guide.md +10 -10
- package/templates/guides/testing-guide.md +1 -1
- package/templates/guides/zombie-process-cleanup.md +2 -0
- package/templates/scripts/lint-md.sh +0 -0
- package/templates/skills/safeword-tdd-enforcer/SKILL.md +29 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "safeword",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"description": "CLI for setting up and managing safeword development environments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -19,18 +19,6 @@
|
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=18"
|
|
21
21
|
},
|
|
22
|
-
"scripts": {
|
|
23
|
-
"build": "tsup",
|
|
24
|
-
"dev": "tsup --watch",
|
|
25
|
-
"test": "vitest run",
|
|
26
|
-
"test:e2e": "vitest run tests/e2e/",
|
|
27
|
-
"test:watch": "vitest",
|
|
28
|
-
"test:coverage": "vitest run --coverage",
|
|
29
|
-
"typecheck": "tsc --noEmit",
|
|
30
|
-
"lint": "eslint src tests",
|
|
31
|
-
"clean": "rm -rf dist",
|
|
32
|
-
"prepublishOnly": "npm run build && npm test"
|
|
33
|
-
},
|
|
34
22
|
"dependencies": {
|
|
35
23
|
"commander": "^12.1.0"
|
|
36
24
|
},
|
|
@@ -48,5 +36,16 @@
|
|
|
48
36
|
"claude-code"
|
|
49
37
|
],
|
|
50
38
|
"author": "",
|
|
51
|
-
"license": "MIT"
|
|
52
|
-
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsup",
|
|
42
|
+
"dev": "tsup --watch",
|
|
43
|
+
"test": "vitest run",
|
|
44
|
+
"test:e2e": "vitest run tests/e2e/",
|
|
45
|
+
"test:watch": "vitest",
|
|
46
|
+
"test:coverage": "vitest run --coverage",
|
|
47
|
+
"typecheck": "tsc --noEmit",
|
|
48
|
+
"lint": "eslint src tests",
|
|
49
|
+
"clean": "rm -rf dist"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Design: [Feature Name]
|
|
2
2
|
|
|
3
|
-
**Guide**:
|
|
4
|
-
**Template**:
|
|
3
|
+
**Guide**: `.safeword/guides/design-doc-guide.md` - Principles, structure guidelines, and avoiding bloat
|
|
4
|
+
**Template**: `.safeword/templates/design-doc-template.md`
|
|
5
5
|
|
|
6
6
|
**Related**: Feature Spec: `[path]` | Test Definitions: `[path]`
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Feature Spec: [Feature Name] (Issue #[number])
|
|
2
2
|
|
|
3
|
-
**Guide**:
|
|
4
|
-
**Template**:
|
|
3
|
+
**Guide**: `.safeword/guides/planning-guide.md` - Best practices, INVEST criteria, and examples
|
|
4
|
+
**Template**: `.safeword/templates/feature-spec-template.md`
|
|
5
5
|
|
|
6
6
|
**Feature**: [Brief description of the feature]
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Task: [Name]
|
|
2
2
|
|
|
3
|
-
**Guide**:
|
|
4
|
-
**Template**:
|
|
3
|
+
**Guide**: `.safeword/guides/planning-guide.md`
|
|
4
|
+
**Template**: `.safeword/templates/task-spec-template.md`
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -148,4 +148,4 @@ The spec takes 30 seconds to write and prevents hours of scope creep.
|
|
|
148
148
|
| **Task Spec (L1)** | Bug, improvement, internal, refactor | Task spec with inline tests |
|
|
149
149
|
| **Task Spec (L0)** | Typo, config, trivial | Minimal task spec, existing tests |
|
|
150
150
|
|
|
151
|
-
For L2 features, use:
|
|
151
|
+
For L2 features, use: `.safeword/templates/feature-spec-template.md`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Test Definitions: [Feature Name] (Issue #[number])
|
|
2
2
|
|
|
3
|
-
**Guide**:
|
|
4
|
-
**Template**:
|
|
3
|
+
**Guide**: `.safeword/guides/testing-guide.md` - Structure, status tracking, and TDD workflow
|
|
4
|
+
**Template**: `.safeword/templates/test-definitions-feature.md`
|
|
5
5
|
|
|
6
6
|
**Feature**: [Brief description of the feature]
|
|
7
7
|
|
|
@@ -25,15 +25,15 @@ How to write specs, user stories, and test definitions before implementation.
|
|
|
25
25
|
|
|
26
26
|
## Templates
|
|
27
27
|
|
|
28
|
-
| Need | Template
|
|
29
|
-
| ------------------------------- |
|
|
30
|
-
| L2 Feature spec |
|
|
31
|
-
| L1/L0 Task spec |
|
|
32
|
-
| L2 Test definitions |
|
|
33
|
-
| Complex feature design |
|
|
34
|
-
| Architectural decision |
|
|
35
|
-
| Context anchor for complex work |
|
|
36
|
-
| Execution scratch pad |
|
|
28
|
+
| Need | Template |
|
|
29
|
+
| ------------------------------- | ------------------------------------------------- |
|
|
30
|
+
| L2 Feature spec | `.safeword/templates/feature-spec-template.md` |
|
|
31
|
+
| L1/L0 Task spec | `.safeword/templates/task-spec-template.md` |
|
|
32
|
+
| L2 Test definitions | `.safeword/templates/test-definitions-feature.md` |
|
|
33
|
+
| Complex feature design | `.safeword/templates/design-doc-template.md` |
|
|
34
|
+
| Architectural decision | `.safeword/templates/architecture-template.md` |
|
|
35
|
+
| Context anchor for complex work | `.safeword/templates/ticket-template.md` |
|
|
36
|
+
| Execution scratch pad | `.safeword/templates/work-log-template.md` |
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
@@ -240,7 +240,7 @@ Test: All existing tests pass, no new mutations
|
|
|
240
240
|
|
|
241
241
|
### How to Fill Out Test Definitions
|
|
242
242
|
|
|
243
|
-
1. Read
|
|
243
|
+
1. Read `.safeword/templates/test-definitions-feature.md`
|
|
244
244
|
2. Read user story's Technical Constraints section (if exists)
|
|
245
245
|
3. Fill in feature name, issue number, test file path
|
|
246
246
|
4. Organize tests into logical suites
|
|
@@ -272,7 +272,7 @@ export default defineConfig({
|
|
|
272
272
|
}
|
|
273
273
|
```
|
|
274
274
|
|
|
275
|
-
**Cleanup:** See
|
|
275
|
+
**Cleanup:** See `.safeword/guides/zombie-process-cleanup.md` for killing zombie servers.
|
|
276
276
|
|
|
277
277
|
---
|
|
278
278
|
|
|
@@ -202,6 +202,7 @@ ps aux | grep "/Users/alex/projects/my-project"
|
|
|
202
202
|
| Kill all for this project | `./scripts/cleanup.sh` |
|
|
203
203
|
| Check what's on port | `lsof -i:3000` |
|
|
204
204
|
| Find zombie processes | `ps aux \| grep -E "(node\|playwright\|chromium)"` |
|
|
205
|
+
| Preview what `pkill -f` would kill | `pgrep -f "pattern"` (verify before running pkill) |
|
|
205
206
|
| Kill by process ID | `kill -9 <PID>` |
|
|
206
207
|
|
|
207
208
|
---
|
|
@@ -210,6 +211,7 @@ ps aux | grep "/Users/alex/projects/my-project"
|
|
|
210
211
|
|
|
211
212
|
❌ **DON'T:** `killall node` (kills all projects)
|
|
212
213
|
❌ **DON'T:** `pkill -9 node` (kills all projects)
|
|
214
|
+
❌ **DON'T:** `pkill -f "pattern"` without `pgrep -f` first (matches full command line, can kill unintended processes)
|
|
213
215
|
❌ **DON'T:** Kill processes without checking working directory
|
|
214
216
|
❌ **DON'T:** Assume zombie browsers will clean themselves up (they won't)
|
|
215
217
|
|
|
File without changes
|
|
@@ -138,15 +138,37 @@ Before starting Phase 1, create or open a work log:
|
|
|
138
138
|
- [ ] No hardcoded/mock values
|
|
139
139
|
- [ ] Committed
|
|
140
140
|
|
|
141
|
+
### Verification Gate
|
|
142
|
+
|
|
143
|
+
**Before claiming GREEN:** Evidence before claims, always.
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
✅ CORRECT ❌ WRONG
|
|
147
|
+
───────────────────────────────── ─────────────────────────────────
|
|
148
|
+
Run: npm test "Tests should pass now"
|
|
149
|
+
Output: ✓ 34/34 tests pass "I'm confident this works"
|
|
150
|
+
Claim: "All tests pass" "Tests pass" (no output shown)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**The Rule:** If you haven't run the verification command in this response, you cannot claim it passes.
|
|
154
|
+
|
|
155
|
+
| Claim | Requires | Not Sufficient |
|
|
156
|
+
| ---------------- | ----------------------------- | --------------------------- |
|
|
157
|
+
| "Tests pass" | Fresh test output: 0 failures | "should pass", previous run |
|
|
158
|
+
| "Build succeeds" | Build command: exit 0 | "linter passed" |
|
|
159
|
+
| "Bug fixed" | Original symptom test passes | "code changed" |
|
|
160
|
+
|
|
141
161
|
**Red Flags → STOP:**
|
|
142
162
|
|
|
143
|
-
| Flag
|
|
144
|
-
|
|
|
145
|
-
| "
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
149
|
-
|
|
|
163
|
+
| Flag | Action |
|
|
164
|
+
| --------------------------- | -------------------------------------- |
|
|
165
|
+
| "should", "probably" claims | Run command, show output first |
|
|
166
|
+
| "Done!" before verification | Run command, show output first |
|
|
167
|
+
| "Just in case" code | Delete it |
|
|
168
|
+
| Multiple functions | Delete extras |
|
|
169
|
+
| Refactoring | Stop - that's Phase 3 |
|
|
170
|
+
| Test still fails | Debug (→ systematic-debugger if stuck) |
|
|
171
|
+
| Hardcoded value | Implement real logic (see below) |
|
|
150
172
|
|
|
151
173
|
### Anti-Pattern: Mock Implementations
|
|
152
174
|
|