specweave 0.17.13 → 0.17.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/CLAUDE.md +456 -0
- package/README.md +38 -1
- package/dist/src/cli/commands/cicd-monitor.d.ts +11 -0
- package/dist/src/cli/commands/cicd-monitor.d.ts.map +1 -0
- package/dist/src/cli/commands/cicd-monitor.js +154 -0
- package/dist/src/cli/commands/cicd-monitor.js.map +1 -0
- package/dist/src/cli/commands/validate-parent-repo.d.ts +8 -0
- package/dist/src/cli/commands/validate-parent-repo.d.ts.map +1 -0
- package/dist/src/cli/commands/validate-parent-repo.js +15 -0
- package/dist/src/cli/commands/validate-parent-repo.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/types.d.ts +5 -0
- package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
- package/dist/src/core/cicd/config-loader.d.ts +21 -0
- package/dist/src/core/cicd/config-loader.d.ts.map +1 -0
- package/dist/src/core/cicd/config-loader.js +190 -0
- package/dist/src/core/cicd/config-loader.js.map +1 -0
- package/dist/src/core/cicd/index.d.ts +12 -0
- package/dist/src/core/cicd/index.d.ts.map +1 -0
- package/dist/src/core/cicd/index.js +18 -0
- package/dist/src/core/cicd/index.js.map +1 -0
- package/dist/src/core/cicd/monitor-service.d.ts +92 -0
- package/dist/src/core/cicd/monitor-service.d.ts.map +1 -0
- package/dist/src/core/cicd/monitor-service.js +132 -0
- package/dist/src/core/cicd/monitor-service.js.map +1 -0
- package/dist/src/core/cicd/notifier.d.ts +102 -0
- package/dist/src/core/cicd/notifier.d.ts.map +1 -0
- package/dist/src/core/cicd/notifier.js +184 -0
- package/dist/src/core/cicd/notifier.js.map +1 -0
- package/dist/src/core/cicd/parent-repo-validator.d.ts +42 -0
- package/dist/src/core/cicd/parent-repo-validator.d.ts.map +1 -0
- package/dist/src/core/cicd/parent-repo-validator.js +201 -0
- package/dist/src/core/cicd/parent-repo-validator.js.map +1 -0
- package/dist/src/core/cicd/state-manager.d.ts +79 -0
- package/dist/src/core/cicd/state-manager.d.ts.map +1 -0
- package/dist/src/core/cicd/state-manager.js +197 -0
- package/dist/src/core/cicd/state-manager.js.map +1 -0
- package/dist/src/core/cicd/types.d.ts +119 -0
- package/dist/src/core/cicd/types.d.ts.map +1 -0
- package/dist/src/core/cicd/types.js +18 -0
- package/dist/src/core/cicd/types.js.map +1 -0
- package/dist/src/core/cicd/workflow-monitor.d.ts +98 -0
- package/dist/src/core/cicd/workflow-monitor.d.ts.map +1 -0
- package/dist/src/core/cicd/workflow-monitor.js +215 -0
- package/dist/src/core/cicd/workflow-monitor.js.map +1 -0
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/spec-content-sync.js +14 -6
- package/dist/src/core/spec-content-sync.js.map +1 -1
- package/package.json +2 -2
- package/plugins/specweave/agents/pm/AGENT.md +170 -2
- package/plugins/specweave/hooks/post-increment-planning.sh +89 -26
- package/plugins/specweave/hooks/user-prompt-submit.sh +4 -4
- package/plugins/specweave/skills/increment-planner/SKILL.md +15 -10
- package/plugins/specweave-ado/lib/ado-project-detector.js +32 -5
- package/plugins/specweave-ado/lib/ado-project-detector.ts +44 -5
- package/src/templates/AGENTS.md.template +55 -1
- package/src/templates/CLAUDE.md.template +51 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-content-sync.d.ts","sourceRoot":"","sources":["../../../src/core/spec-content-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,UAAU,EAAE,cAAc,CAAC;IAE3B,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;IAEX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,QAAQ,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"spec-content-sync.d.ts","sourceRoot":"","sources":["../../../src/core/spec-content-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,UAAU,EAAE,cAAc,CAAC;IAE3B,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;IAEX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,QAAQ,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,uBAAuB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqHpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,WAAW,EACtB,eAAe,EAAE;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB,GACA;IACD,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAuBA;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAgClE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAClC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBxB;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,EACnC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7E;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,IAAI,GAClB,OAAO,CAAC,OAAO,CAAC,CAOlB"}
|
|
@@ -41,10 +41,20 @@ export async function parseSpecContent(specPath) {
|
|
|
41
41
|
};
|
|
42
42
|
const identifier = detectSpecIdentifier(specContentInput);
|
|
43
43
|
// Extract description (text between title and first ## heading)
|
|
44
|
-
|
|
44
|
+
// Match content between the main heading and the first ## heading or ** pattern
|
|
45
|
+
const descMatch = content.match(/^#[^\n]+\n\n(.+?)(?=\n##|\n\*\*[A-Z])/ms);
|
|
45
46
|
const description = descMatch ? descMatch[1].trim() : '';
|
|
46
47
|
// Extract metadata from frontmatter or body
|
|
47
48
|
const metadata = {};
|
|
49
|
+
// Priority from frontmatter first, then body
|
|
50
|
+
if (frontmatter.priority) {
|
|
51
|
+
metadata.priority = frontmatter.priority;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const priorityMatch = content.match(/\*\*Priority\*\*:\s*(P\d)/);
|
|
55
|
+
if (priorityMatch)
|
|
56
|
+
metadata.priority = priorityMatch[1];
|
|
57
|
+
}
|
|
48
58
|
// GitHub Project
|
|
49
59
|
const githubMatch = content.match(/\*\*GitHub Project\*\*:\s*(.+)/);
|
|
50
60
|
if (githubMatch)
|
|
@@ -57,10 +67,6 @@ export async function parseSpecContent(specPath) {
|
|
|
57
67
|
const adoMatch = content.match(/\*\*ADO Feature\*\*:\s*(.+)/);
|
|
58
68
|
if (adoMatch)
|
|
59
69
|
metadata.adoFeature = adoMatch[1].trim();
|
|
60
|
-
// Priority
|
|
61
|
-
const priorityMatch = content.match(/\*\*Priority\*\*:\s*(P\d)/);
|
|
62
|
-
if (priorityMatch)
|
|
63
|
-
metadata.priority = priorityMatch[1];
|
|
64
70
|
// Parse user stories
|
|
65
71
|
const userStories = [];
|
|
66
72
|
// Match user story patterns: **US-001**: Title
|
|
@@ -71,7 +77,9 @@ export async function parseSpecContent(specPath) {
|
|
|
71
77
|
const usId = `US-${usNumber}`;
|
|
72
78
|
const usTitle = usMatch[2].trim();
|
|
73
79
|
// Find acceptance criteria for this user story
|
|
74
|
-
|
|
80
|
+
// Support both AC-US001-01 and AC-US1-01 formats
|
|
81
|
+
const usNumberPattern = usNumber.replace(/^0+/, ''); // Remove leading zeros
|
|
82
|
+
const acRegex = new RegExp(`- \\[([ x])\\] \\*\\*AC-US0*${usNumberPattern}-(\\d+)\\*\\*:\\s*([^(]+)(?:\\(([^)]+)\\))?`, 'g');
|
|
75
83
|
const acceptanceCriteria = [];
|
|
76
84
|
const acMatches = [...content.matchAll(acRegex)];
|
|
77
85
|
for (const acMatch of acMatches) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-content-sync.js","sourceRoot":"","sources":["../../../src/core/spec-content-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAmC,MAAM,+BAA+B,CAAC;AA+CtG;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAE9C,gCAAgC;QAChC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QAEjF,yCAAyC;QACzC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;QAE7D,4BAA4B;QAC5B,wDAAwD;QACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,UAAU,IAAI,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC;YAClE,CAAC,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC;YAC3B,CAAC,CAAC,SAAS,CAAC;QAEd,6BAA6B;QAC7B,MAAM,gBAAgB,GAAqB;YACzC,OAAO;YACP,WAAW;YACX,KAAK;YACL,OAAO;YACP,IAAI,EAAE,QAAQ;SACf,CAAC;QAEF,MAAM,UAAU,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAE1D,gEAAgE;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"spec-content-sync.js","sourceRoot":"","sources":["../../../src/core/spec-content-sync.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.15",
|
|
4
4
|
"description": "Spec-driven development framework for Claude Code. AI-native workflow with living documentation, intelligent agents, and multilingual support (9 languages). Enterprise-grade traceability with permanent specs and temporary increments.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"test": "npm run test:smoke",
|
|
24
24
|
"benchmark": "ts-node tests/performance/run-all-benchmarks.ts",
|
|
25
25
|
"validate:plugins": "node scripts/validate-plugin-manifests.cjs",
|
|
26
|
-
"metrics:dora": "node dist/metrics/dora-calculator.js",
|
|
26
|
+
"metrics:dora": "node dist/src/metrics/dora-calculator.js",
|
|
27
27
|
"generate:diagrams": "bash scripts/generate-diagram-svgs.sh",
|
|
28
28
|
"docs:dev": "cd docs-site && npm start",
|
|
29
29
|
"docs:build": "cd docs-site && npm run build",
|
|
@@ -386,7 +386,27 @@ The PM Agent acts as your AI Product Manager, helping you:
|
|
|
386
386
|
|
|
387
387
|
### Output 1: Spec (Living Docs - Source of Truth, Permanent) ✅
|
|
388
388
|
|
|
389
|
-
|
|
389
|
+
**⚠️ CRITICAL: Multi-Project Path Detection**
|
|
390
|
+
|
|
391
|
+
1. **Check if multi-project mode enabled**:
|
|
392
|
+
- Read `.specweave/config.json`
|
|
393
|
+
- Look for `multiProject.enabled: true`
|
|
394
|
+
|
|
395
|
+
2. **Determine project ID** (one of these methods):
|
|
396
|
+
- **From increment name**: `0001-backend-auth` → project: `backend`
|
|
397
|
+
- **From tech stack**: React/TypeScript → `frontend`, ASP.NET/C# → `backend`
|
|
398
|
+
- **From config**: `multiProject.activeProject` field
|
|
399
|
+
- **Fallback**: Use `default` project
|
|
400
|
+
|
|
401
|
+
3. **Use CORRECT flattened path** (v0.16.11+):
|
|
402
|
+
- ✅ **CORRECT**: `.specweave/docs/internal/specs/{project-id}/spec-{number}-{name}.md`
|
|
403
|
+
- ❌ **WRONG**: `.specweave/docs/internal/projects/{project-id}/specs/...` (OLD nested structure)
|
|
404
|
+
|
|
405
|
+
**Examples**:
|
|
406
|
+
- Single project: `.specweave/docs/internal/specs/default/spec-0001-inventory-tracker.md`
|
|
407
|
+
- Backend project: `.specweave/docs/internal/specs/backend/spec-0002-api-auth.md`
|
|
408
|
+
- Frontend project: `.specweave/docs/internal/specs/frontend/spec-0003-dark-mode.md`
|
|
409
|
+
- Parent repo: `.specweave/docs/internal/specs/_parent/spec-0004-system-architecture.md`
|
|
390
410
|
|
|
391
411
|
**CRITICAL**: Specs are **FILES**, not directories! The spec file itself contains all content.
|
|
392
412
|
|
|
@@ -598,7 +618,7 @@ High-level business context: [Strategy Overview](../../docs/internal/strategy/{m
|
|
|
598
618
|
```markdown
|
|
599
619
|
# Feature: [Name]
|
|
600
620
|
|
|
601
|
-
**Complete Requirements**: See [SPEC-{number}-{name}](../../docs/internal/specs/spec-{number}-{name}.md)
|
|
621
|
+
**Complete Requirements**: See [SPEC-{number}-{name}](../../docs/internal/specs/{project-id}/spec-{number}-{name}.md)
|
|
602
622
|
|
|
603
623
|
**Quick Summary**:
|
|
604
624
|
- US-001: View current weather
|
|
@@ -608,6 +628,8 @@ High-level business context: [Strategy Overview](../../docs/internal/strategy/{m
|
|
|
608
628
|
(Minimal overview for context)
|
|
609
629
|
```
|
|
610
630
|
|
|
631
|
+
**Note**: Replace `{project-id}` with actual project (e.g., `default`, `backend`, `frontend`, `_parent`)
|
|
632
|
+
|
|
611
633
|
**Key Points**:
|
|
612
634
|
- This is TEMPORARY (may be deleted after increment completes)
|
|
613
635
|
- Spec spec.md is the PERMANENT source of truth
|
|
@@ -1012,6 +1034,152 @@ measurement_plan:
|
|
|
1012
1034
|
- "A/B test: 50% of users get feature, measure delta"
|
|
1013
1035
|
```
|
|
1014
1036
|
|
|
1037
|
+
## ✅ Post-Creation Validation (CRITICAL - v0.14.0+)
|
|
1038
|
+
|
|
1039
|
+
**MANDATORY STEP**: After creating increment files, ALWAYS validate metadata.json exists.
|
|
1040
|
+
|
|
1041
|
+
### Why This Matters
|
|
1042
|
+
|
|
1043
|
+
Without metadata.json:
|
|
1044
|
+
- ❌ Status line shows nothing (no active increment tracking)
|
|
1045
|
+
- ❌ WIP limits don't work (can't count active increments)
|
|
1046
|
+
- ❌ External sync breaks (no GitHub/JIRA/ADO links)
|
|
1047
|
+
- ❌ `/specweave:status`, `/pause`, `/resume` commands fail
|
|
1048
|
+
|
|
1049
|
+
### Validation Workflow
|
|
1050
|
+
|
|
1051
|
+
**STEP: Validate Increment Creation** (Run after creating spec.md, plan.md, tasks.md)
|
|
1052
|
+
|
|
1053
|
+
```typescript
|
|
1054
|
+
// After Write tool creates all files:
|
|
1055
|
+
// 1. spec.md created ✅
|
|
1056
|
+
// 2. plan.md created ✅
|
|
1057
|
+
// 3. tasks.md created ✅
|
|
1058
|
+
|
|
1059
|
+
// STEP: Validate metadata.json exists
|
|
1060
|
+
const incrementPath = `.specweave/increments/${incrementId}`;
|
|
1061
|
+
const metadataPath = `${incrementPath}/metadata.json`;
|
|
1062
|
+
|
|
1063
|
+
// Check if metadata.json exists
|
|
1064
|
+
if (!fs.existsSync(metadataPath)) {
|
|
1065
|
+
console.warn(`⚠️ Warning: metadata.json not found for ${incrementId}`);
|
|
1066
|
+
console.warn(` This indicates the post-increment-planning hook may have failed.`);
|
|
1067
|
+
console.warn(` Creating minimal metadata as fallback...`);
|
|
1068
|
+
|
|
1069
|
+
// Create minimal metadata
|
|
1070
|
+
const metadata = {
|
|
1071
|
+
id: incrementId,
|
|
1072
|
+
status: "active",
|
|
1073
|
+
type: "feature", // or derive from spec.md frontmatter
|
|
1074
|
+
created: new Date().toISOString(),
|
|
1075
|
+
lastActivity: new Date().toISOString()
|
|
1076
|
+
};
|
|
1077
|
+
|
|
1078
|
+
fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
1079
|
+
console.log(` ✅ Created minimal metadata.json`);
|
|
1080
|
+
console.log(` ⚠️ Note: No GitHub issue linked.`);
|
|
1081
|
+
console.log(` 💡 Run /specweave-github:create-issue ${incrementId} to create one manually.`);
|
|
1082
|
+
} else {
|
|
1083
|
+
console.log(`✅ Increment validation passed - metadata.json exists`);
|
|
1084
|
+
|
|
1085
|
+
// Read metadata to check if GitHub issue was created
|
|
1086
|
+
const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
|
|
1087
|
+
|
|
1088
|
+
if (metadata.github && metadata.github.issue) {
|
|
1089
|
+
console.log(` ✅ GitHub issue #${metadata.github.issue} linked`);
|
|
1090
|
+
console.log(` 🔗 ${metadata.github.url}`);
|
|
1091
|
+
} else {
|
|
1092
|
+
console.log(` ℹ️ No GitHub issue linked (autoCreateIssue may be disabled)`);
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
```
|
|
1096
|
+
|
|
1097
|
+
### Implementation Guide
|
|
1098
|
+
|
|
1099
|
+
**Add this validation as the FINAL STEP** in your increment creation workflow:
|
|
1100
|
+
|
|
1101
|
+
1. ✅ Create spec.md (via Write tool)
|
|
1102
|
+
2. ✅ Create plan.md (via Write tool)
|
|
1103
|
+
3. ✅ Create tasks.md (via Write tool or test-aware-planner agent)
|
|
1104
|
+
4. ✅ **NEW**: Validate metadata.json exists (via Read tool + conditional Write)
|
|
1105
|
+
|
|
1106
|
+
**Example workflow**:
|
|
1107
|
+
|
|
1108
|
+
```markdown
|
|
1109
|
+
User: /specweave:increment "Add user authentication"
|
|
1110
|
+
|
|
1111
|
+
PM Agent workflow:
|
|
1112
|
+
1. Validate no incomplete increments ✅
|
|
1113
|
+
2. Research & gather requirements ✅
|
|
1114
|
+
3. Generate spec.md ✅ (Write tool)
|
|
1115
|
+
4. Invoke Architect for plan.md ✅ (Task tool)
|
|
1116
|
+
5. Invoke test-aware-planner for tasks.md ✅ (Task tool)
|
|
1117
|
+
6. **NEW**: Validate metadata.json exists ✅ (Read tool + fallback Write)
|
|
1118
|
+
- Hook should have created it automatically
|
|
1119
|
+
- If missing → create minimal metadata
|
|
1120
|
+
- Warn user if GitHub issue not created
|
|
1121
|
+
7. Report completion to user ✅
|
|
1122
|
+
```
|
|
1123
|
+
|
|
1124
|
+
### Error Handling
|
|
1125
|
+
|
|
1126
|
+
**Scenario 1: Hook failed (no GitHub CLI)**
|
|
1127
|
+
```
|
|
1128
|
+
⚠️ Warning: metadata.json not found for 0023-release-management
|
|
1129
|
+
This indicates the post-increment-planning hook may have failed.
|
|
1130
|
+
Creating minimal metadata as fallback...
|
|
1131
|
+
✅ Created minimal metadata.json
|
|
1132
|
+
⚠️ Note: No GitHub issue linked.
|
|
1133
|
+
💡 Run /specweave-github:create-issue 0023-release-management to create one manually.
|
|
1134
|
+
```
|
|
1135
|
+
|
|
1136
|
+
**Scenario 2: Hook succeeded**
|
|
1137
|
+
```
|
|
1138
|
+
✅ Increment validation passed - metadata.json exists
|
|
1139
|
+
✅ GitHub issue #45 linked
|
|
1140
|
+
🔗 https://github.com/anton-abyzov/specweave/issues/45
|
|
1141
|
+
```
|
|
1142
|
+
|
|
1143
|
+
**Scenario 3: Hook succeeded, but no GitHub integration**
|
|
1144
|
+
```
|
|
1145
|
+
✅ Increment validation passed - metadata.json exists
|
|
1146
|
+
ℹ️ No GitHub issue linked (autoCreateIssue may be disabled)
|
|
1147
|
+
```
|
|
1148
|
+
|
|
1149
|
+
### Benefits
|
|
1150
|
+
|
|
1151
|
+
- ✅ **100% metadata.json coverage** (no silent failures)
|
|
1152
|
+
- ✅ **Immediate feedback** (user knows if GitHub issue failed)
|
|
1153
|
+
- ✅ **Graceful degradation** (creates minimal metadata as fallback)
|
|
1154
|
+
- ✅ **Clear next steps** (tells user how to fix if needed)
|
|
1155
|
+
|
|
1156
|
+
### Testing
|
|
1157
|
+
|
|
1158
|
+
**Test Case 1: Normal flow (hook succeeds)**
|
|
1159
|
+
```bash
|
|
1160
|
+
/specweave:increment "Test feature"
|
|
1161
|
+
# Expected: metadata.json created by hook
|
|
1162
|
+
# Validation: Passes with GitHub issue link
|
|
1163
|
+
```
|
|
1164
|
+
|
|
1165
|
+
**Test Case 2: Hook fails (no gh CLI)**
|
|
1166
|
+
```bash
|
|
1167
|
+
# Remove gh CLI: brew uninstall gh
|
|
1168
|
+
/specweave:increment "Test feature"
|
|
1169
|
+
# Expected: metadata.json NOT created by hook
|
|
1170
|
+
# Validation: Creates minimal metadata, warns user
|
|
1171
|
+
```
|
|
1172
|
+
|
|
1173
|
+
**Test Case 3: GitHub disabled**
|
|
1174
|
+
```bash
|
|
1175
|
+
# Set autoCreateIssue: false in config
|
|
1176
|
+
/specweave:increment "Test feature"
|
|
1177
|
+
# Expected: metadata.json created by hook (no GitHub section)
|
|
1178
|
+
# Validation: Passes with info message
|
|
1179
|
+
```
|
|
1180
|
+
|
|
1181
|
+
---
|
|
1182
|
+
|
|
1015
1183
|
## Integration with Other Agents
|
|
1016
1184
|
|
|
1017
1185
|
### Works With
|
|
@@ -646,33 +646,96 @@ EOF
|
|
|
646
646
|
|
|
647
647
|
translate_living_docs_specs "$increment_id"
|
|
648
648
|
|
|
649
|
-
# 7. Increment-level GitHub
|
|
649
|
+
# 7. Increment-level GitHub issue creation (for single-repo projects)
|
|
650
650
|
log_info ""
|
|
651
|
-
log_info "
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
651
|
+
log_info "🔗 Checking GitHub issue auto-creation..."
|
|
652
|
+
|
|
653
|
+
# Check if auto-create is enabled in config
|
|
654
|
+
local auto_create=$(cat "$CONFIG_FILE" 2>/dev/null | grep -A 5 '"sync"' | grep -A 2 '"settings"' | grep -o '"autoCreateIssue"[[:space:]]*:[[:space:]]*\(true\|false\)' | grep -o '\(true\|false\)' || echo "false")
|
|
655
|
+
|
|
656
|
+
log_debug "Auto-create GitHub issue: $auto_create"
|
|
657
|
+
|
|
658
|
+
if [ "$auto_create" = "true" ]; then
|
|
659
|
+
log_info " 📦 Auto-create enabled, checking for GitHub CLI..."
|
|
660
|
+
|
|
661
|
+
# Check if gh CLI is available
|
|
662
|
+
if ! command -v gh >/dev/null 2>&1; then
|
|
663
|
+
log_info " ⚠️ GitHub CLI (gh) not found, skipping issue creation"
|
|
664
|
+
log_debug "Install: https://cli.github.com/"
|
|
665
|
+
else
|
|
666
|
+
log_info " ✓ GitHub CLI found"
|
|
667
|
+
log_info ""
|
|
668
|
+
log_info "🚀 Creating GitHub issue for $increment_id..."
|
|
669
|
+
|
|
670
|
+
# Create issue (non-blocking)
|
|
671
|
+
if create_github_issue "$increment_id" "$increment_dir"; then
|
|
672
|
+
log_info " ✅ GitHub issue created successfully"
|
|
673
|
+
else
|
|
674
|
+
log_info " ⚠️ GitHub issue creation failed (non-blocking)"
|
|
675
|
+
log_debug "Issue creation failed, but continuing execution"
|
|
676
|
+
fi
|
|
677
|
+
fi
|
|
678
|
+
else
|
|
679
|
+
log_debug "Auto-create disabled in config"
|
|
680
|
+
fi
|
|
681
|
+
|
|
682
|
+
# ============================================================================
|
|
683
|
+
# FALLBACK METADATA CREATION (v0.14.0+)
|
|
684
|
+
# ============================================================================
|
|
685
|
+
# CRITICAL: Ensure metadata.json exists even if GitHub integration failed
|
|
686
|
+
# This prevents silent failures where increment appears complete but lacks metadata
|
|
687
|
+
|
|
688
|
+
log_info ""
|
|
689
|
+
log_info "🔍 Validating metadata.json existence..."
|
|
690
|
+
|
|
691
|
+
local metadata_file="$increment_dir/metadata.json"
|
|
692
|
+
|
|
693
|
+
if [ ! -f "$metadata_file" ]; then
|
|
694
|
+
log_info " ⚠️ metadata.json not found (hook may have failed)"
|
|
695
|
+
log_info " 📝 Creating minimal metadata as fallback..."
|
|
696
|
+
|
|
697
|
+
local current_timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
698
|
+
|
|
699
|
+
# Extract type from spec.md frontmatter (if available)
|
|
700
|
+
local increment_type="feature"
|
|
701
|
+
if [ -f "$spec_file" ]; then
|
|
702
|
+
local extracted_type=$(awk '/^---$/,/^---$/ {if (/^type:/) {sub(/^type:[[:space:]]*"?/, ""); sub(/"?[[:space:]]*$/, ""); print; exit}}' "$spec_file" 2>/dev/null)
|
|
703
|
+
if [ -n "$extracted_type" ]; then
|
|
704
|
+
increment_type="$extracted_type"
|
|
705
|
+
fi
|
|
706
|
+
fi
|
|
707
|
+
|
|
708
|
+
# Create minimal metadata.json
|
|
709
|
+
cat > "$metadata_file" <<EOF_MINIMAL
|
|
710
|
+
{
|
|
711
|
+
"id": "$increment_id",
|
|
712
|
+
"status": "active",
|
|
713
|
+
"type": "$increment_type",
|
|
714
|
+
"created": "$current_timestamp",
|
|
715
|
+
"lastActivity": "$current_timestamp"
|
|
716
|
+
}
|
|
717
|
+
EOF_MINIMAL
|
|
718
|
+
|
|
719
|
+
log_info " ✅ Created minimal metadata.json"
|
|
720
|
+
log_info " ⚠️ Note: No GitHub issue linked"
|
|
721
|
+
log_info " 💡 Run /specweave-github:create-issue $increment_id to create one manually"
|
|
722
|
+
else
|
|
723
|
+
log_info " ✅ metadata.json exists"
|
|
724
|
+
|
|
725
|
+
# Check if GitHub issue was created
|
|
726
|
+
local has_github=$(cat "$metadata_file" 2>/dev/null | grep -o '"github"[[:space:]]*:[[:space:]]*{' || echo "")
|
|
727
|
+
if [ -n "$has_github" ]; then
|
|
728
|
+
local issue_num=$(cat "$metadata_file" 2>/dev/null | grep -o '"issue"[[:space:]]*:[[:space:]]*[0-9]*' | grep -o '[0-9]*' || echo "")
|
|
729
|
+
if [ -n "$issue_num" ]; then
|
|
730
|
+
log_info " ✅ GitHub issue #$issue_num linked"
|
|
731
|
+
fi
|
|
732
|
+
else
|
|
733
|
+
log_debug " ℹ️ No GitHub issue linked (autoCreateIssue may be disabled)"
|
|
734
|
+
fi
|
|
735
|
+
fi
|
|
736
|
+
|
|
737
|
+
# Note: Spec-level sync (SPECS → GitHub Projects/JIRA Epics) is handled separately
|
|
738
|
+
# See: /specweave-github:sync-spec, /specweave-jira:sync-spec, /specweave-ado:sync-spec
|
|
676
739
|
|
|
677
740
|
# 8. Sync spec content to external tools (if configured)
|
|
678
741
|
log_info ""
|
|
@@ -30,7 +30,7 @@ if echo "$PROMPT" | grep -q "/specweave:increment"; then
|
|
|
30
30
|
# Check active increments using MetadataManager
|
|
31
31
|
ACTIVE_COUNT=$(node -e "
|
|
32
32
|
try {
|
|
33
|
-
const { MetadataManager } = require('./dist/core/increment/metadata-manager.js');
|
|
33
|
+
const { MetadataManager } = require('./dist/src/core/increment/metadata-manager.js');
|
|
34
34
|
const active = MetadataManager.getActive();
|
|
35
35
|
console.log(active.length);
|
|
36
36
|
} catch (e) {
|
|
@@ -44,7 +44,7 @@ if echo "$PROMPT" | grep -q "/specweave:increment"; then
|
|
|
44
44
|
# Get list of active increments for error message
|
|
45
45
|
ACTIVE_LIST=$(node -e "
|
|
46
46
|
try {
|
|
47
|
-
const { MetadataManager } = require('./dist/core/increment/metadata-manager.js');
|
|
47
|
+
const { MetadataManager } = require('./dist/src/core/increment/metadata-manager.js');
|
|
48
48
|
const active = MetadataManager.getActive();
|
|
49
49
|
active.forEach(inc => console.log(' - ' + inc.id + ' [' + inc.type + ']'));
|
|
50
50
|
} catch (e) {}
|
|
@@ -64,7 +64,7 @@ EOF
|
|
|
64
64
|
# Get list of active increments for warning
|
|
65
65
|
ACTIVE_LIST=$(node -e "
|
|
66
66
|
try {
|
|
67
|
-
const { MetadataManager } = require('./dist/core/increment/metadata-manager.js');
|
|
67
|
+
const { MetadataManager } = require('./dist/src/core/increment/metadata-manager.js');
|
|
68
68
|
const active = MetadataManager.getActive();
|
|
69
69
|
active.forEach(inc => console.log(' - ' + inc.id + ' [' + inc.type + ']'));
|
|
70
70
|
} catch (e) {}
|
|
@@ -231,7 +231,7 @@ if [[ -d ".specweave/increments" ]]; then
|
|
|
231
231
|
# Get status line from cache (ultra-fast)
|
|
232
232
|
STATUS_LINE=$(node -e "
|
|
233
233
|
try {
|
|
234
|
-
const { StatusLineManager } = require('./dist/core/status-line/status-line-manager.js');
|
|
234
|
+
const { StatusLineManager } = require('./dist/src/core/status-line/status-line-manager.js');
|
|
235
235
|
const manager = new StatusLineManager(process.cwd());
|
|
236
236
|
const result = manager.render();
|
|
237
237
|
console.log(result || '');
|
|
@@ -110,13 +110,15 @@ This skill activates automatically when users say:
|
|
|
110
110
|
|
|
111
111
|
---
|
|
112
112
|
|
|
113
|
-
## 🆕 Multi-Project Support (v0.8.0+)
|
|
113
|
+
## 🆕 Multi-Project Support (v0.8.0+ | Flattened v0.16.11+)
|
|
114
114
|
|
|
115
115
|
**Key Changes**:
|
|
116
|
-
-
|
|
117
|
-
-
|
|
118
|
-
-
|
|
116
|
+
- ✅ **CORRECT** (v0.16.11+): Specs organized with FLATTENED structure: `.specweave/docs/internal/specs/{project-id}/`
|
|
117
|
+
- ❌ **OLD** (v0.8.0-v0.16.10): `.specweave/docs/internal/projects/{project-id}/specs/` (DEPRECATED nested structure)
|
|
118
|
+
- Use `ProjectManager` (from `src/core/project-manager.ts`) to get correct paths (always returns flattened structure)
|
|
119
|
+
- Single project uses `specs/default/` automatically (transparent)
|
|
119
120
|
- Multi-project mode allows multiple teams/repos
|
|
121
|
+
- Parent repo content goes to `specs/_parent/` (for multi-repo setups with parent repositories)
|
|
120
122
|
|
|
121
123
|
**Path Resolution**:
|
|
122
124
|
```typescript
|
|
@@ -177,7 +179,7 @@ Task(
|
|
|
177
179
|
1. Spec (living docs - SOURCE OF TRUTH, permanent):
|
|
178
180
|
- IMPORTANT: Use ProjectManager to get correct path for active project
|
|
179
181
|
- Create at: {projectManager.getSpecsPath()}/spec-{number}-{name}.md
|
|
180
|
-
(This resolves to
|
|
182
|
+
(This resolves to specs/{activeProject}/ with FLATTENED structure v0.16.11+)
|
|
181
183
|
- This is the COMPLETE, PERMANENT source of truth
|
|
182
184
|
- Include ALL of:
|
|
183
185
|
* User stories (US-001, US-002, etc.) with full details
|
|
@@ -299,17 +301,20 @@ STEP 6: Validate Living Docs and Increment Files
|
|
|
299
301
|
|
|
300
302
|
#### Living Spec (Living Docs - Source of Truth) ✅
|
|
301
303
|
```
|
|
302
|
-
.specweave/docs/internal/
|
|
304
|
+
.specweave/docs/internal/specs/{project-id}/ # ← FLATTENED structure (v0.16.11+)
|
|
303
305
|
└── spec-{number}-{name}.md # ← PM Agent (MANDATORY)
|
|
304
306
|
# COMPLETE user stories, AC, requirements
|
|
305
307
|
# This is the PERMANENT source of truth
|
|
306
308
|
# Can be linked to Jira/ADO/GitHub Issues
|
|
307
309
|
# Persists after increment completes
|
|
308
310
|
|
|
309
|
-
# Examples:
|
|
310
|
-
# Single project:
|
|
311
|
-
# Multi-project:
|
|
312
|
-
#
|
|
311
|
+
# Examples (v0.16.11+ Flattened):
|
|
312
|
+
# Single project: specs/default/spec-001-user-auth.md
|
|
313
|
+
# Multi-project: specs/web-app/spec-001-user-auth.md
|
|
314
|
+
# specs/mobile/spec-001-push-notifications.md
|
|
315
|
+
# Parent repo: specs/_parent/spec-002-system-architecture.md
|
|
316
|
+
|
|
317
|
+
# OLD (v0.8.0-v0.16.10): projects/default/specs/... ← DEPRECATED
|
|
313
318
|
```
|
|
314
319
|
|
|
315
320
|
#### Strategy Docs (Optional, High-Level) ⚠️
|
|
@@ -233,15 +233,15 @@ class AdoProjectDetector {
|
|
|
233
233
|
*/
|
|
234
234
|
async detectFromContent(content) {
|
|
235
235
|
const candidates = this.analyzeContent(content);
|
|
236
|
-
if (candidates[0]?.confidence
|
|
236
|
+
if (candidates[0]?.confidence >= 0.7) {
|
|
237
237
|
return {
|
|
238
238
|
primary: candidates[0].project,
|
|
239
239
|
confidence: candidates[0].confidence,
|
|
240
240
|
strategy: this.strategy
|
|
241
241
|
};
|
|
242
242
|
}
|
|
243
|
-
if (candidates[0]?.confidence
|
|
244
|
-
const secondary = candidates.slice(1).filter((c) => c.confidence
|
|
243
|
+
if (candidates[0]?.confidence >= 0.4) {
|
|
244
|
+
const secondary = candidates.slice(1).filter((c) => c.confidence >= 0.3).map((c) => c.project);
|
|
245
245
|
return {
|
|
246
246
|
primary: candidates[0].project,
|
|
247
247
|
secondary: secondary.length > 0 ? secondary : void 0,
|
|
@@ -306,7 +306,7 @@ class AdoProjectDetector {
|
|
|
306
306
|
*/
|
|
307
307
|
async detectMultiProject(content) {
|
|
308
308
|
const candidates = this.analyzeContent(content);
|
|
309
|
-
const significantProjects = candidates.filter((c) => c.confidence
|
|
309
|
+
const significantProjects = candidates.filter((c) => c.confidence >= 0.3);
|
|
310
310
|
if (significantProjects.length === 0) {
|
|
311
311
|
return {
|
|
312
312
|
primary: this.availableProjects[0] || "Unknown",
|
|
@@ -328,11 +328,38 @@ class AdoProjectDetector {
|
|
|
328
328
|
*/
|
|
329
329
|
mapToAreaPath(content, project) {
|
|
330
330
|
const areaPaths = process.env.AZURE_DEVOPS_AREA_PATHS?.split(",").map((a) => a.trim()) || [];
|
|
331
|
+
const lowerContent = content.toLowerCase();
|
|
331
332
|
for (const areaPath of areaPaths) {
|
|
332
|
-
if (
|
|
333
|
+
if (lowerContent.includes(areaPath.toLowerCase())) {
|
|
333
334
|
return `${project}\\${areaPath}`;
|
|
334
335
|
}
|
|
335
336
|
}
|
|
337
|
+
const areaPathKeywordMap = {
|
|
338
|
+
"Frontend": ["WebApp", "frontend"],
|
|
339
|
+
"Backend": ["backend", "api", "server"],
|
|
340
|
+
"Mobile": ["MobileApp", "mobile", "ios", "android"],
|
|
341
|
+
"Infrastructure": ["Platform", "infrastructure"],
|
|
342
|
+
"Data": ["DataService", "data", "analytics"]
|
|
343
|
+
};
|
|
344
|
+
let bestMatch = { areaPath: "", confidence: 0 };
|
|
345
|
+
for (const areaPath of areaPaths) {
|
|
346
|
+
const relatedTypes = areaPathKeywordMap[areaPath] || [areaPath];
|
|
347
|
+
let matchCount = 0;
|
|
348
|
+
for (const projectType of relatedTypes) {
|
|
349
|
+
const keywords = this.projectKeywords[projectType] || [];
|
|
350
|
+
for (const keyword of keywords) {
|
|
351
|
+
if (lowerContent.includes(keyword.toLowerCase())) {
|
|
352
|
+
matchCount++;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (matchCount > bestMatch.confidence) {
|
|
357
|
+
bestMatch = { areaPath, confidence: matchCount };
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (bestMatch.confidence >= 2) {
|
|
361
|
+
return `${project}\\${bestMatch.areaPath}`;
|
|
362
|
+
}
|
|
336
363
|
return project;
|
|
337
364
|
}
|
|
338
365
|
/**
|