specweave 1.0.100 ā 1.0.102
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/CLAUDE.md +25 -25
- package/README.md +61 -30
- package/bin/install-skills.sh +57 -3
- package/dist/src/cli/commands/sync-living-docs-acs.d.ts +15 -0
- package/dist/src/cli/commands/sync-living-docs-acs.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-living-docs-acs.js +109 -0
- package/dist/src/cli/commands/sync-living-docs-acs.js.map +1 -0
- package/dist/src/sync/spec-to-living-docs-sync.d.ts +91 -0
- package/dist/src/sync/spec-to-living-docs-sync.d.ts.map +1 -0
- package/dist/src/sync/spec-to-living-docs-sync.js +324 -0
- package/dist/src/sync/spec-to-living-docs-sync.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/hooks/v2/guards/task-ac-sync-guard.sh +5 -6
- package/plugins/specweave/lib/hooks/update-ac-status.js +24 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts +46 -0
- package/plugins/specweave/skills/architect/MEMORY.md +8 -0
- package/plugins/specweave/skills/archive-increments/MEMORY.md +8 -0
- package/plugins/specweave/skills/brownfield-analyzer/MEMORY.md +8 -0
- package/plugins/specweave/skills/brownfield-onboarder/MEMORY.md +8 -0
- package/plugins/specweave/skills/code-reviewer/MEMORY.md +8 -0
- package/plugins/specweave/skills/code-standards-analyzer/MEMORY.md +8 -0
- package/plugins/specweave/skills/code-standards-detective/MEMORY.md +8 -0
- package/plugins/specweave/skills/compliance-architecture/MEMORY.md +8 -0
- package/plugins/specweave/skills/context-loader/MEMORY.md +8 -0
- package/plugins/specweave/skills/context-optimizer/MEMORY.md +8 -0
- package/plugins/specweave/skills/detector/MEMORY.md +8 -0
- package/plugins/specweave/skills/docs-updater/MEMORY.md +8 -0
- package/plugins/specweave/skills/docs-writer/MEMORY.md +8 -0
- package/plugins/specweave/skills/external-sync-wizard/MEMORY.md +8 -0
- package/plugins/specweave/skills/framework/MEMORY.md +8 -0
- package/plugins/specweave/skills/increment-planner/MEMORY.md +8 -0
- package/plugins/specweave/skills/increment-quality-judge-v2/MEMORY.md +8 -0
- package/plugins/specweave/skills/increment-work-router/MEMORY.md +8 -0
- package/plugins/specweave/skills/infrastructure/MEMORY.md +8 -0
- package/plugins/specweave/skills/living-docs-navigator/MEMORY.md +8 -0
- package/plugins/specweave/skills/multi-project-spec-mapper/MEMORY.md +8 -0
- package/plugins/specweave/skills/performance/MEMORY.md +8 -0
- package/plugins/specweave/skills/plugin-validator/MEMORY.md +8 -0
- package/plugins/specweave/skills/pm/MEMORY.md +8 -0
- package/plugins/specweave/skills/pm-closure-validation/MEMORY.md +8 -0
- package/plugins/specweave/skills/progress-sync/MEMORY.md +8 -0
- package/plugins/specweave/skills/project-kickstarter/MEMORY.md +8 -0
- package/plugins/specweave/skills/qa-lead/MEMORY.md +8 -0
- package/plugins/specweave/skills/reflect/MEMORY.md +8 -0
- package/plugins/specweave/skills/reflective-reviewer/MEMORY.md +8 -0
- package/plugins/specweave/skills/roadmap-planner/MEMORY.md +8 -0
- package/plugins/specweave/skills/role-orchestrator/MEMORY.md +8 -0
- package/plugins/specweave/skills/security/MEMORY.md +8 -0
- package/plugins/specweave/skills/serverless-recommender/MEMORY.md +8 -0
- package/plugins/specweave/skills/service-connect/MEMORY.md +8 -0
- package/plugins/specweave/skills/smart-reopen-detector/MEMORY.md +8 -0
- package/plugins/specweave/skills/spec-generator/MEMORY.md +8 -0
- package/plugins/specweave/skills/tdd-orchestrator/MEMORY.md +8 -0
- package/plugins/specweave/skills/tdd-workflow/MEMORY.md +8 -0
- package/plugins/specweave/skills/tech-lead/MEMORY.md +8 -0
- package/plugins/specweave/skills/test-aware-planner/MEMORY.md +8 -0
- package/plugins/specweave/skills/translator/MEMORY.md +8 -0
- package/plugins/specweave/skills/umbrella-repo-detector/MEMORY.md +8 -0
- package/plugins/specweave/skills/update-instructions/MEMORY.md +8 -0
- package/src/templates/MEMORY-template.md +9 -0
package/CLAUDE.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
<!-- SW:META template="claude" version="1.0.
|
|
1
|
+
<!-- SW:META template="claude" version="1.0.101" sections="header,start,autodetect,metarule,rules,workflow,reflect,context,lsp,structure,taskformat,secrets,syncing,mapping,testing,api,limits,troubleshooting,principles,linking,mcp,autoexecute,auto,docs" -->
|
|
2
2
|
|
|
3
|
-
<!-- SW:SECTION:header version="1.0.
|
|
3
|
+
<!-- SW:SECTION:header version="1.0.101" -->
|
|
4
4
|
**Framework**: SpecWeave | **Truth**: `spec.md` + `tasks.md`
|
|
5
5
|
<!-- SW:END:header -->
|
|
6
6
|
|
|
7
|
-
<!-- SW:SECTION:start version="1.0.
|
|
7
|
+
<!-- SW:SECTION:start version="1.0.101" -->
|
|
8
8
|
## Getting Started
|
|
9
9
|
|
|
10
10
|
**Initial increment**: `0001-project-setup` (auto-created by `specweave init`)
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
2. **Customize**: Edit spec.md and use for setup tasks
|
|
15
15
|
<!-- SW:END:start -->
|
|
16
16
|
|
|
17
|
-
<!-- SW:SECTION:autodetect version="1.0.
|
|
17
|
+
<!-- SW:SECTION:autodetect version="1.0.101" -->
|
|
18
18
|
## Auto-Detection
|
|
19
19
|
|
|
20
20
|
SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
@@ -24,7 +24,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
24
24
|
**Opt-out phrases**: "Just brainstorm first" | "Don't plan yet" | "Quick discussion" | "Let's explore ideas"
|
|
25
25
|
<!-- SW:END:autodetect -->
|
|
26
26
|
|
|
27
|
-
<!-- SW:SECTION:metarule version="1.0.
|
|
27
|
+
<!-- SW:SECTION:metarule version="1.0.101" -->
|
|
28
28
|
## Meta-Rule: Think-Before-Act
|
|
29
29
|
|
|
30
30
|
**Satisfy dependencies BEFORE dependent operations.**
|
|
@@ -35,7 +35,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
35
35
|
```
|
|
36
36
|
<!-- SW:END:metarule -->
|
|
37
37
|
|
|
38
|
-
<!-- SW:SECTION:rules version="1.0.
|
|
38
|
+
<!-- SW:SECTION:rules version="1.0.101" -->
|
|
39
39
|
## Rules
|
|
40
40
|
|
|
41
41
|
1. **Files** ā `.specweave/increments/####-name/` (spec.md, plan.md, tasks.md at root; reports/, scripts/, logs/ subfolders)
|
|
@@ -48,7 +48,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
48
48
|
8. **ā Marketplace refresh**: ALWAYS use `specweave refresh-marketplace` CLI command. NEVER suggest `scripts/refresh-marketplace.sh` - end users don't have the scripts folder (npm global install).
|
|
49
49
|
<!-- SW:END:rules -->
|
|
50
50
|
|
|
51
|
-
<!-- SW:SECTION:workflow version="1.0.
|
|
51
|
+
<!-- SW:SECTION:workflow version="1.0.101" -->
|
|
52
52
|
## Workflow
|
|
53
53
|
|
|
54
54
|
`/sw:increment "X"` ā `/sw:do` ā `/sw:progress` ā `/sw:done 0001`
|
|
@@ -68,7 +68,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
68
68
|
**Natural language**: "Let's build X" ā `/sw:increment` | "What's status?" ā `/sw:progress` | "We're done" ā `/sw:done` | "Ship while sleeping" ā `/sw:auto`
|
|
69
69
|
<!-- SW:END:workflow -->
|
|
70
70
|
|
|
71
|
-
<!-- SW:SECTION:reflect version="1.0.
|
|
71
|
+
<!-- SW:SECTION:reflect version="1.0.101" -->
|
|
72
72
|
## Self-Improving Skills (Reflect)
|
|
73
73
|
|
|
74
74
|
**Learn once, never repeat.** Claude learns from corrections and patterns across sessions.
|
|
@@ -112,7 +112,7 @@ ls ~/.specweave/memory/*.md 2>/dev/null
|
|
|
112
112
|
**Enable auto-learning**: `/sw:reflect-on` ā Stop hook analyzes sessions automatically
|
|
113
113
|
<!-- SW:END:reflect -->
|
|
114
114
|
|
|
115
|
-
<!-- SW:SECTION:context version="1.0.
|
|
115
|
+
<!-- SW:SECTION:context version="1.0.101" -->
|
|
116
116
|
## Living Docs Context
|
|
117
117
|
|
|
118
118
|
**Before implementing features**: Check existing docs for patterns and decisions.
|
|
@@ -132,7 +132,7 @@ grep -ril "keyword" .specweave/docs/internal/
|
|
|
132
132
|
**Use `/sw:context <topic>`** to load relevant living docs into conversation.
|
|
133
133
|
<!-- SW:END:context -->
|
|
134
134
|
|
|
135
|
-
<!-- SW:SECTION:lsp version="1.0.
|
|
135
|
+
<!-- SW:SECTION:lsp version="1.0.101" -->
|
|
136
136
|
## LSP-Enhanced Exploration
|
|
137
137
|
|
|
138
138
|
**USE LSP ACTIVELY** for semantic code understanding (100x faster than grep).
|
|
@@ -149,7 +149,7 @@ go install golang.org/x/tools/gopls@latest # Go
|
|
|
149
149
|
**Best Practices**: ALWAYS use `findReferences` before refactoring | Use `goToDefinition` instead of grep | Combine with Explore agent
|
|
150
150
|
<!-- SW:END:lsp -->
|
|
151
151
|
|
|
152
|
-
<!-- SW:SECTION:structure version="1.0.
|
|
152
|
+
<!-- SW:SECTION:structure version="1.0.101" -->
|
|
153
153
|
## Structure
|
|
154
154
|
|
|
155
155
|
```
|
|
@@ -219,7 +219,7 @@ my-project/
|
|
|
219
219
|
```
|
|
220
220
|
<!-- SW:END:structure -->
|
|
221
221
|
|
|
222
|
-
<!-- SW:SECTION:taskformat version="1.0.
|
|
222
|
+
<!-- SW:SECTION:taskformat version="1.0.101" -->
|
|
223
223
|
## Task Format
|
|
224
224
|
|
|
225
225
|
```markdown
|
|
@@ -229,7 +229,7 @@ my-project/
|
|
|
229
229
|
```
|
|
230
230
|
<!-- SW:END:taskformat -->
|
|
231
231
|
|
|
232
|
-
<!-- SW:SECTION:secrets version="1.0.
|
|
232
|
+
<!-- SW:SECTION:secrets version="1.0.101" -->
|
|
233
233
|
## Secrets Check
|
|
234
234
|
|
|
235
235
|
**BEFORE CLI tools**: Check existing config first!
|
|
@@ -240,7 +240,7 @@ gh auth status
|
|
|
240
240
|
```
|
|
241
241
|
<!-- SW:END:secrets -->
|
|
242
242
|
|
|
243
|
-
<!-- SW:SECTION:syncing version="1.0.
|
|
243
|
+
<!-- SW:SECTION:syncing version="1.0.101" -->
|
|
244
244
|
## External Sync (GitHub/JIRA/ADO)
|
|
245
245
|
|
|
246
246
|
**After increment creation**: Run `/sw-github:sync {id}` to create issues!
|
|
@@ -268,7 +268,7 @@ Living docs sync ā External sync. They are separate:
|
|
|
268
268
|
**Verify tokens**: `grep GITHUB_TOKEN .env` | `gh auth status`
|
|
269
269
|
<!-- SW:END:syncing -->
|
|
270
270
|
|
|
271
|
-
<!-- SW:SECTION:mapping version="1.0.
|
|
271
|
+
<!-- SW:SECTION:mapping version="1.0.101" -->
|
|
272
272
|
## GitHub Mapping
|
|
273
273
|
|
|
274
274
|
| SpecWeave | GitHub |
|
|
@@ -278,7 +278,7 @@ Living docs sync ā External sync. They are separate:
|
|
|
278
278
|
| Task T-XXX | Checkbox |
|
|
279
279
|
<!-- SW:END:mapping -->
|
|
280
280
|
|
|
281
|
-
<!-- SW:SECTION:testing version="1.0.
|
|
281
|
+
<!-- SW:SECTION:testing version="1.0.101" -->
|
|
282
282
|
## Testing
|
|
283
283
|
|
|
284
284
|
BDD in tasks.md | Unit >80% | `.test.ts` (Vitest)
|
|
@@ -290,7 +290,7 @@ vi.mock('fs', () => ({ readFile: vi.fn() }));
|
|
|
290
290
|
```
|
|
291
291
|
<!-- SW:END:testing -->
|
|
292
292
|
|
|
293
|
-
<!-- SW:SECTION:api version="1.0.
|
|
293
|
+
<!-- SW:SECTION:api version="1.0.101" -->
|
|
294
294
|
## API Development (OpenAPI-First)
|
|
295
295
|
|
|
296
296
|
**For API projects only.** OpenAPI = source of truth ā Postman derived from it.
|
|
@@ -309,13 +309,13 @@ vi.mock('fs', () => ({ readFile: vi.fn() }));
|
|
|
309
309
|
**Import**: Postman ā Import collection + env ā Fill secrets ā Select env
|
|
310
310
|
<!-- SW:END:api -->
|
|
311
311
|
|
|
312
|
-
<!-- SW:SECTION:limits version="1.0.
|
|
312
|
+
<!-- SW:SECTION:limits version="1.0.101" -->
|
|
313
313
|
## Limits
|
|
314
314
|
|
|
315
315
|
**Max 1500 lines/file** ā extract before adding
|
|
316
316
|
<!-- SW:END:limits -->
|
|
317
317
|
|
|
318
|
-
<!-- SW:SECTION:troubleshooting version="1.0.
|
|
318
|
+
<!-- SW:SECTION:troubleshooting version="1.0.101" -->
|
|
319
319
|
## Troubleshooting
|
|
320
320
|
|
|
321
321
|
| Issue | Fix |
|
|
@@ -335,7 +335,7 @@ vi.mock('fs', () => ({ readFile: vi.fn() }));
|
|
|
335
335
|
| Path patterns not working | `//path` = absolute, `/path` = relative to settings file, `additionalDirectories` for explicit working dirs |
|
|
336
336
|
<!-- SW:END:troubleshooting -->
|
|
337
337
|
|
|
338
|
-
<!-- SW:SECTION:principles version="1.0.
|
|
338
|
+
<!-- SW:SECTION:principles version="1.0.101" -->
|
|
339
339
|
## Principles
|
|
340
340
|
|
|
341
341
|
1. **Spec-first**: `/sw:increment` before coding
|
|
@@ -345,7 +345,7 @@ vi.mock('fs', () => ({ readFile: vi.fn() }));
|
|
|
345
345
|
5. **Clean**: All files in increment folders
|
|
346
346
|
<!-- SW:END:principles -->
|
|
347
347
|
|
|
348
|
-
<!-- SW:SECTION:linking version="1.0.
|
|
348
|
+
<!-- SW:SECTION:linking version="1.0.101" -->
|
|
349
349
|
## Bidirectional Linking
|
|
350
350
|
|
|
351
351
|
Tasks ā User Stories auto-linked via AC-IDs: `AC-US1-01` ā `US-001`
|
|
@@ -353,7 +353,7 @@ Tasks ā User Stories auto-linked via AC-IDs: `AC-US1-01` ā `US-001`
|
|
|
353
353
|
Task format: `**AC**: AC-US1-01, AC-US1-02` (CRITICAL for linking)
|
|
354
354
|
<!-- SW:END:linking -->
|
|
355
355
|
|
|
356
|
-
<!-- SW:SECTION:mcp version="1.0.
|
|
356
|
+
<!-- SW:SECTION:mcp version="1.0.101" -->
|
|
357
357
|
## External Service Connection
|
|
358
358
|
|
|
359
359
|
**Priority**: MCP Server ā REST API ā CLI ā Direct Connection
|
|
@@ -377,7 +377,7 @@ wrangler whoami 2>/dev/null
|
|
|
377
377
|
```
|
|
378
378
|
<!-- SW:END:mcp -->
|
|
379
379
|
|
|
380
|
-
<!-- SW:SECTION:autoexecute version="1.0.
|
|
380
|
+
<!-- SW:SECTION:autoexecute version="1.0.101" -->
|
|
381
381
|
## Auto-Execute Rule
|
|
382
382
|
|
|
383
383
|
**NEVER** output "Manual Step Required" when credentials exist. **EXECUTE DIRECTLY.**
|
|
@@ -391,7 +391,7 @@ wrangler whoami 2>/dev/null && gh auth status 2>/dev/null
|
|
|
391
391
|
```
|
|
392
392
|
<!-- SW:END:autoexecute -->
|
|
393
393
|
|
|
394
|
-
<!-- SW:SECTION:auto version="1.0.
|
|
394
|
+
<!-- SW:SECTION:auto version="1.0.101" -->
|
|
395
395
|
## Auto Mode (Autonomous Execution)
|
|
396
396
|
|
|
397
397
|
**Continuous execution until all tasks complete.**
|
|
@@ -468,7 +468,7 @@ wrangler whoami 2>/dev/null && gh auth status 2>/dev/null
|
|
|
468
468
|
**Circuit Breaker**: External API fails 3x? Queue & continue
|
|
469
469
|
<!-- SW:END:auto -->
|
|
470
470
|
|
|
471
|
-
<!-- SW:SECTION:docs version="1.0.
|
|
471
|
+
<!-- SW:SECTION:docs version="1.0.101" -->
|
|
472
472
|
## Docs
|
|
473
473
|
|
|
474
474
|
[spec-weave.com](https://spec-weave.com) | `.specweave/docs/internal/`
|
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
npm install -g specweave
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
> **New in v1.0.
|
|
18
|
+
> **New in v1.0.100**: Auto mode now shows live labels in your terminal ā see exactly what SpecWeave is doing: `[Planning]`, `[Implementing]`, `[Testing]`, `[Fixing]`. Hours of autonomous execution with full visibility.
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
@@ -39,8 +39,19 @@ Every AI coding tool promises productivity. But after the chat ends:
|
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
41
|
/sw:increment "Add OAuth authentication" # Creates spec + plan + tasks
|
|
42
|
-
/sw:auto #
|
|
43
|
-
# ā
|
|
42
|
+
/sw:auto # Autonomous execution for HOURS
|
|
43
|
+
# ā Watch live: [Planning] ā [Implementing] ā [Testing] ā [Fixing] ā [Done]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**What happens during `/sw:auto`:**
|
|
47
|
+
```
|
|
48
|
+
[08:23:41] [Planning] Analyzing T-003: Implement refresh token rotation
|
|
49
|
+
[08:24:12] [Implementing] Writing src/auth/token-manager.ts (127 lines)
|
|
50
|
+
[08:25:33] [Testing] Running npm test -- token-manager.test.ts
|
|
51
|
+
[08:25:47] [Fixing] Test failed: Expected 401, got 403. Adjusting...
|
|
52
|
+
[08:26:15] [Testing] Re-running tests... PASSED
|
|
53
|
+
[08:26:18] [Syncing] Updating tasks.md, pushing to GitHub
|
|
54
|
+
[08:26:22] [Done] T-003 complete. Moving to T-004...
|
|
44
55
|
```
|
|
45
56
|
|
|
46
57
|
**Or step-by-step control:**
|
|
@@ -53,30 +64,32 @@ Every AI coding tool promises productivity. But after the chat ends:
|
|
|
53
64
|
|
|
54
65
|
```
|
|
55
66
|
.specweave/increments/0001-oauth/
|
|
56
|
-
āāā spec.md
|
|
57
|
-
āāā plan.md
|
|
58
|
-
āāā tasks.md
|
|
67
|
+
āāā spec.md <- WHAT: User stories, acceptance criteria
|
|
68
|
+
āāā plan.md <- HOW: Architecture decisions, tech choices
|
|
69
|
+
āāā tasks.md <- DO: Implementation tasks with embedded tests
|
|
59
70
|
```
|
|
60
71
|
|
|
61
|
-
**After 6 months**: Search "OAuth"
|
|
72
|
+
**After 6 months**: Search "OAuth" -> find exact decisions, who approved, why it was built that way.
|
|
62
73
|
|
|
63
74
|
---
|
|
64
75
|
|
|
65
76
|
## Why SpecWeave vs BMAD, SpecKit, Cursor Rules?
|
|
66
77
|
|
|
67
|
-
| | [BMAD](https://github.com/bmad-code-org/BMAD-METHOD) | [SpecKit](https://github.com/github/spec-kit) | Cursor Rules | **SpecWeave** |
|
|
78
|
+
| Capability | [BMAD](https://github.com/bmad-code-org/BMAD-METHOD) | [SpecKit](https://github.com/github/spec-kit) | Cursor Rules | **SpecWeave** |
|
|
68
79
|
|---|---|---|---|---|
|
|
69
|
-
| **
|
|
70
|
-
| **Autonomous** |
|
|
71
|
-
| **
|
|
72
|
-
| **
|
|
73
|
-
| **
|
|
74
|
-
| **
|
|
75
|
-
| **
|
|
76
|
-
| **
|
|
77
|
-
| **
|
|
78
|
-
|
|
79
|
-
**
|
|
80
|
+
| **Maturity** | Alpha (v6) | Stable | Built-in | **Production (v1.0.100)** |
|
|
81
|
+
| **Autonomous Work** | Manual steps required | One-shot generation | Per-request only | **Hours unattended** |
|
|
82
|
+
| **Live Status** | None | None | None | **Terminal labels** |
|
|
83
|
+
| **Multi-Repo** | Single repo | Single repo | Single repo | **Coordinate N repos** |
|
|
84
|
+
| **Mobile Apps** | No agents | No agents | No agents | **React Native/Expo** |
|
|
85
|
+
| **External Sync** | None | None | None | **GitHub/JIRA/ADO** |
|
|
86
|
+
| **Brownfield** | Limited | Greenfield only | Any | **10-year legacy? Fine.** |
|
|
87
|
+
| **Quality Gates** | Not built-in | None | None | **3-gate validation** |
|
|
88
|
+
| **Living Docs** | Manual | Snapshot | None | **Auto-update** |
|
|
89
|
+
| **Self-Learning** | None | None | None | **Reflects on mistakes** |
|
|
90
|
+
| **Dogfooding** | Unknown | Unknown | N/A | **140+ self-built features** |
|
|
91
|
+
|
|
92
|
+
**The math**: SpecKit output = ONE SpecWeave increment. SpecWeave = N increments + lifecycle + sync + hooks + **hours of autonomous execution**.
|
|
80
93
|
|
|
81
94
|
---
|
|
82
95
|
|
|
@@ -96,7 +109,7 @@ Every AI coding tool promises productivity. But after the chat ends:
|
|
|
96
109
|
| DORA metrics | Live tracking |
|
|
97
110
|
| Test coverage | 60%+ enforced |
|
|
98
111
|
|
|
99
|
-
**[Browse our increments
|
|
112
|
+
**[Browse our increments ->](https://github.com/anton-abyzov/specweave/tree/develop/.specweave/increments)**
|
|
100
113
|
|
|
101
114
|
---
|
|
102
115
|
|
|
@@ -114,7 +127,7 @@ node --version
|
|
|
114
127
|
nvm install 22 && nvm use 22 && nvm alias default 22
|
|
115
128
|
```
|
|
116
129
|
|
|
117
|
-
>
|
|
130
|
+
> **Getting `SyntaxError: Unexpected token 'with'`?** Your Node.js is too old. See [upgrade instructions](https://spec-weave.com/docs/guides/troubleshooting/common-errors#node-version-error).
|
|
118
131
|
|
|
119
132
|
### Installation
|
|
120
133
|
|
|
@@ -127,7 +140,7 @@ specweave init .
|
|
|
127
140
|
Then in Claude Code:
|
|
128
141
|
```bash
|
|
129
142
|
/sw:increment "Add dark mode" # AI creates spec + plan + tasks
|
|
130
|
-
/sw:auto #
|
|
143
|
+
/sw:auto # Ship while you sleep (hours of autonomous work)
|
|
131
144
|
```
|
|
132
145
|
|
|
133
146
|
**Or step-by-step:**
|
|
@@ -142,12 +155,30 @@ specweave refresh-marketplace # Reinstall all plugins from GitHub
|
|
|
142
155
|
specweave update-instructions # Regenerate CLAUDE.md
|
|
143
156
|
```
|
|
144
157
|
|
|
145
|
-
**[Full Quickstart Guide
|
|
158
|
+
**[Full Quickstart Guide ->](https://spec-weave.com/docs/guides/getting-started/quickstart)**
|
|
146
159
|
|
|
147
160
|
---
|
|
148
161
|
|
|
149
162
|
## Key Features
|
|
150
163
|
|
|
164
|
+
### Autonomous Execution (v2.9)
|
|
165
|
+
|
|
166
|
+
Run for hours without intervention. See exactly what's happening:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
/sw:auto # Start autonomous mode
|
|
170
|
+
/sw:auto-status # Check progress anytime
|
|
171
|
+
/sw:cancel-auto # Emergency stop (rarely needed)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**What you see in terminal:**
|
|
175
|
+
- `[Planning]` - Analyzing task requirements
|
|
176
|
+
- `[Implementing]` - Writing code
|
|
177
|
+
- `[Testing]` - Running test suites
|
|
178
|
+
- `[Fixing]` - Auto-correcting failures
|
|
179
|
+
- `[Syncing]` - Updating docs and external tools
|
|
180
|
+
- `[Done]` - Task complete, moving to next
|
|
181
|
+
|
|
151
182
|
### External Tool Integration
|
|
152
183
|
|
|
153
184
|
| Platform | Capabilities |
|
|
@@ -199,14 +230,14 @@ Three gates before any increment closes:
|
|
|
199
230
|
| Command | Purpose |
|
|
200
231
|
|---------|---------|
|
|
201
232
|
| `/sw:increment "feature"` | Create spec + plan + tasks |
|
|
202
|
-
| `/sw:auto` |
|
|
233
|
+
| `/sw:auto` | **Ship while you sleep** - hours of autonomous work |
|
|
234
|
+
| `/sw:auto-status` | Check autonomous session progress |
|
|
203
235
|
| `/sw:do` | Execute one task at a time |
|
|
204
236
|
| `/sw:done 0001` | Close with quality validation |
|
|
205
237
|
| `/sw:sync-progress` | Push to GitHub/JIRA/ADO |
|
|
206
|
-
| `/sw:auto-status` | Check autonomous session progress |
|
|
207
238
|
| `/sw:cancel-auto` | Stop autonomous session |
|
|
208
239
|
|
|
209
|
-
**[53 total commands
|
|
240
|
+
**[53 total commands ->](https://spec-weave.com/docs/commands/overview)**
|
|
210
241
|
|
|
211
242
|
---
|
|
212
243
|
|
|
@@ -214,9 +245,9 @@ Three gates before any increment closes:
|
|
|
214
245
|
|
|
215
246
|
| Scenario | What You Do |
|
|
216
247
|
|----------|-------------|
|
|
217
|
-
| **10-year legacy codebase** | `specweave init .`
|
|
218
|
-
| **Weekend MVP** | `specweave init .`
|
|
219
|
-
| **50-team enterprise** | `specweave init .`
|
|
248
|
+
| **10-year legacy codebase** | `specweave init .` -> brownfield analysis detects doc gaps |
|
|
249
|
+
| **Weekend MVP** | `specweave init .` -> `/sw:increment "Build auth"` |
|
|
250
|
+
| **50-team enterprise** | `specweave init .` -> `/sw:enable-multiproject` -> maps to JIRA/ADO |
|
|
220
251
|
|
|
221
252
|
---
|
|
222
253
|
|
|
@@ -226,7 +257,7 @@ Three gates before any increment closes:
|
|
|
226
257
|
- Any AI coding tool: Claude Code, Cursor, Windsurf, Cline, Aider, etc.
|
|
227
258
|
- Git repository
|
|
228
259
|
|
|
229
|
-
>
|
|
260
|
+
> **Why Node.js 20.12.0+?** SpecWeave uses modern JavaScript features (ES2022 Import Attributes) that require Node.js 20.12.0 or higher. If you see `SyntaxError: Unexpected token 'with'`, you need to upgrade Node.js.
|
|
230
261
|
|
|
231
262
|
---
|
|
232
263
|
|
package/bin/install-skills.sh
CHANGED
|
@@ -9,10 +9,12 @@ set -e
|
|
|
9
9
|
|
|
10
10
|
SKILLS_SRC="plugins/specweave/skills"
|
|
11
11
|
SKILLS_DEST=".claude/skills"
|
|
12
|
+
BACKUP_DIR=".memory-backups"
|
|
12
13
|
|
|
13
14
|
# Parse arguments
|
|
14
15
|
if [ "$1" = "--global" ]; then
|
|
15
16
|
SKILLS_DEST="$HOME/.claude/skills"
|
|
17
|
+
BACKUP_DIR="$HOME/.memory-backups"
|
|
16
18
|
echo "Installing skills globally to $SKILLS_DEST"
|
|
17
19
|
else
|
|
18
20
|
echo "Installing skills to project: $SKILLS_DEST"
|
|
@@ -29,8 +31,10 @@ fi
|
|
|
29
31
|
|
|
30
32
|
# Count skills
|
|
31
33
|
skill_count=0
|
|
34
|
+
merge_count=0
|
|
35
|
+
backup_count=0
|
|
32
36
|
|
|
33
|
-
# Copy all skills
|
|
37
|
+
# Copy all skills with smart MEMORY.md merge
|
|
34
38
|
for skill in "$SKILLS_SRC"/*; do
|
|
35
39
|
if [ -d "$skill" ]; then
|
|
36
40
|
skill_name=$(basename "$skill")
|
|
@@ -38,9 +42,39 @@ for skill in "$SKILLS_SRC"/*; do
|
|
|
38
42
|
# Check if skill has SKILL.md
|
|
39
43
|
if [ -f "$skill/SKILL.md" ]; then
|
|
40
44
|
echo " š§ Installing skill: $skill_name"
|
|
41
|
-
# Create destination directory and copy contents (not the folder itself)
|
|
42
45
|
mkdir -p "$SKILLS_DEST/$skill_name"
|
|
43
|
-
|
|
46
|
+
|
|
47
|
+
# Copy files with special handling for MEMORY.md
|
|
48
|
+
for file in "$skill"/*; do
|
|
49
|
+
filename=$(basename "$file")
|
|
50
|
+
target_file="$SKILLS_DEST/$skill_name/$filename"
|
|
51
|
+
|
|
52
|
+
# Special handling for MEMORY.md
|
|
53
|
+
if [ "$filename" = "MEMORY.md" ] && [ -f "$target_file" ]; then
|
|
54
|
+
echo " š Merging MEMORY.md (preserving user learnings)"
|
|
55
|
+
|
|
56
|
+
# Create backup directory
|
|
57
|
+
mkdir -p "$BACKUP_DIR"
|
|
58
|
+
|
|
59
|
+
# Create timestamped backup
|
|
60
|
+
timestamp=$(date +%Y%m%d-%H%M%S)
|
|
61
|
+
backup_file="$BACKUP_DIR/${skill_name}-MEMORY-${timestamp}.md"
|
|
62
|
+
cp "$target_file" "$backup_file"
|
|
63
|
+
backup_count=$((backup_count + 1))
|
|
64
|
+
echo " š¾ Backup: $backup_file"
|
|
65
|
+
|
|
66
|
+
# Merge using CLI script
|
|
67
|
+
if node scripts/merge-skill-memory.js "$target_file" "$file" "$target_file" 2>&1 | sed 's/^/ /'; then
|
|
68
|
+
merge_count=$((merge_count + 1))
|
|
69
|
+
else
|
|
70
|
+
echo " ā ļø Merge failed, user memory preserved"
|
|
71
|
+
fi
|
|
72
|
+
else
|
|
73
|
+
# Copy file normally
|
|
74
|
+
cp "$file" "$target_file"
|
|
75
|
+
fi
|
|
76
|
+
done
|
|
77
|
+
|
|
44
78
|
skill_count=$((skill_count + 1))
|
|
45
79
|
else
|
|
46
80
|
echo " ā ļø Skipping $skill_name (no SKILL.md)"
|
|
@@ -48,8 +82,28 @@ for skill in "$SKILLS_SRC"/*; do
|
|
|
48
82
|
fi
|
|
49
83
|
done
|
|
50
84
|
|
|
85
|
+
# Cleanup: Keep only last 10 backups per skill
|
|
86
|
+
if [ -d "$BACKUP_DIR" ]; then
|
|
87
|
+
for skill_name in $(ls -1 "$SKILLS_DEST"); do
|
|
88
|
+
# Count backups for this skill
|
|
89
|
+
backup_pattern="${skill_name}-MEMORY-*.md"
|
|
90
|
+
backup_files=$(ls -1t "$BACKUP_DIR"/$backup_pattern 2>/dev/null || true)
|
|
91
|
+
backup_file_count=$(echo "$backup_files" | grep -c "^" || echo "0")
|
|
92
|
+
|
|
93
|
+
# If more than 10, remove oldest
|
|
94
|
+
if [ "$backup_file_count" -gt 10 ]; then
|
|
95
|
+
echo " šļø Pruning old backups for $skill_name"
|
|
96
|
+
echo "$backup_files" | tail -n +11 | xargs rm -f
|
|
97
|
+
fi
|
|
98
|
+
done
|
|
99
|
+
fi
|
|
100
|
+
|
|
51
101
|
echo ""
|
|
52
102
|
echo "ā
Installed $skill_count skills to $SKILLS_DEST"
|
|
103
|
+
if [ $merge_count -gt 0 ]; then
|
|
104
|
+
echo " š Merged $merge_count MEMORY.md files (user learnings preserved)"
|
|
105
|
+
echo " š¾ Created $backup_count backup(s) in $BACKUP_DIR"
|
|
106
|
+
fi
|
|
53
107
|
echo ""
|
|
54
108
|
echo "Skills installed:"
|
|
55
109
|
ls -1 "$SKILLS_DEST" | sed 's/^/ - /'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI Command: sync-living-docs-acs
|
|
4
|
+
*
|
|
5
|
+
* Synchronizes AC and task completion status from increment spec.md
|
|
6
|
+
* to all corresponding living docs US files.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* specweave sync-living-docs-acs <increment-id>
|
|
10
|
+
* specweave sync-living-docs-acs --all
|
|
11
|
+
*
|
|
12
|
+
* @module cli/commands/sync-living-docs-acs
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=sync-living-docs-acs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-living-docs-acs.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/sync-living-docs-acs.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI Command: sync-living-docs-acs
|
|
4
|
+
*
|
|
5
|
+
* Synchronizes AC and task completion status from increment spec.md
|
|
6
|
+
* to all corresponding living docs US files.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* specweave sync-living-docs-acs <increment-id>
|
|
10
|
+
* specweave sync-living-docs-acs --all
|
|
11
|
+
*
|
|
12
|
+
* @module cli/commands/sync-living-docs-acs
|
|
13
|
+
*/
|
|
14
|
+
import { Command } from 'commander';
|
|
15
|
+
import path from 'path';
|
|
16
|
+
import { existsSync } from 'fs';
|
|
17
|
+
import { readdir } from 'fs/promises';
|
|
18
|
+
import { SpecToLivingDocsSync } from '../../sync/spec-to-living-docs-sync.js';
|
|
19
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
20
|
+
const program = new Command();
|
|
21
|
+
program
|
|
22
|
+
.name('sync-living-docs-acs')
|
|
23
|
+
.description('Sync AC/task completion from spec.md to living docs US files')
|
|
24
|
+
.argument('[increment-id]', 'Increment ID to sync (e.g., 0156 or 0156-feature-name)')
|
|
25
|
+
.option('--all', 'Sync all active increments')
|
|
26
|
+
.option('--dry-run', 'Show what would be updated without making changes')
|
|
27
|
+
.option('--verbose', 'Show detailed output')
|
|
28
|
+
.action(async (incrementId, options) => {
|
|
29
|
+
try {
|
|
30
|
+
const projectRoot = process.cwd();
|
|
31
|
+
// Validate project root
|
|
32
|
+
const specweavePath = path.join(projectRoot, '.specweave');
|
|
33
|
+
if (!existsSync(specweavePath)) {
|
|
34
|
+
console.error('ā Error: Not a SpecWeave project (no .specweave/ folder found)');
|
|
35
|
+
console.error(' Run this command from your project root.');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Get increment IDs to sync
|
|
39
|
+
let incrementIds;
|
|
40
|
+
if (options.all) {
|
|
41
|
+
// Find all active increments
|
|
42
|
+
const incrementsPath = path.join(specweavePath, 'increments');
|
|
43
|
+
const entries = await readdir(incrementsPath, { withFileTypes: true });
|
|
44
|
+
incrementIds = entries
|
|
45
|
+
.filter(entry => entry.isDirectory() && /^\d{4}/.test(entry.name))
|
|
46
|
+
.map(entry => entry.name);
|
|
47
|
+
if (incrementIds.length === 0) {
|
|
48
|
+
console.log('ā¹ļø No increments found to sync');
|
|
49
|
+
process.exit(0);
|
|
50
|
+
}
|
|
51
|
+
console.log(`\nš Syncing ${incrementIds.length} increments...\n`);
|
|
52
|
+
}
|
|
53
|
+
else if (incrementId) {
|
|
54
|
+
incrementIds = [incrementId];
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.error('ā Error: Increment ID required');
|
|
58
|
+
console.error(' Usage: specweave sync-living-docs-acs <increment-id>');
|
|
59
|
+
console.error(' Or: specweave sync-living-docs-acs --all');
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
// Sync each increment
|
|
63
|
+
let totalFilesUpdated = 0;
|
|
64
|
+
let totalACsUpdated = 0;
|
|
65
|
+
let totalTasksUpdated = 0;
|
|
66
|
+
const errors = [];
|
|
67
|
+
for (const id of incrementIds) {
|
|
68
|
+
const syncer = new SpecToLivingDocsSync({
|
|
69
|
+
projectRoot,
|
|
70
|
+
incrementId: id,
|
|
71
|
+
logger: options.verbose ? consoleLogger : undefined,
|
|
72
|
+
dryRun: options.dryRun,
|
|
73
|
+
});
|
|
74
|
+
const result = await syncer.sync();
|
|
75
|
+
totalFilesUpdated += result.filesUpdated;
|
|
76
|
+
totalACsUpdated += result.totalACsUpdated;
|
|
77
|
+
totalTasksUpdated += result.totalTasksUpdated;
|
|
78
|
+
if (result.errors.length > 0) {
|
|
79
|
+
errors.push(`${id}: ${result.errors.join(', ')}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Summary
|
|
83
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
84
|
+
console.log('š SYNC SUMMARY');
|
|
85
|
+
console.log(`${'='.repeat(60)}`);
|
|
86
|
+
console.log(`Increments processed: ${incrementIds.length}`);
|
|
87
|
+
console.log(`Files updated: ${totalFilesUpdated}`);
|
|
88
|
+
console.log(`Total ACs synced: ${totalACsUpdated}`);
|
|
89
|
+
console.log(`Total tasks synced: ${totalTasksUpdated}`);
|
|
90
|
+
if (options.dryRun) {
|
|
91
|
+
console.log(`\nā ļø DRY RUN - No files were actually modified`);
|
|
92
|
+
}
|
|
93
|
+
if (errors.length > 0) {
|
|
94
|
+
console.log(`\nā ļø Errors: ${errors.length}`);
|
|
95
|
+
errors.forEach(err => console.error(` ${err}`));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
console.log(`\nā
Living docs sync complete!`);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error(`\nā Fatal error: ${error.message}`);
|
|
102
|
+
if (options.verbose) {
|
|
103
|
+
console.error(error.stack);
|
|
104
|
+
}
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
program.parse(process.argv);
|
|
109
|
+
//# sourceMappingURL=sync-living-docs-acs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-living-docs-acs.js","sourceRoot":"","sources":["../../../../src/cli/commands/sync-living-docs-acs.ts"],"names":[],"mappings":"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"}
|