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.
Files changed (57) hide show
  1. package/CLAUDE.md +456 -0
  2. package/README.md +38 -1
  3. package/dist/src/cli/commands/cicd-monitor.d.ts +11 -0
  4. package/dist/src/cli/commands/cicd-monitor.d.ts.map +1 -0
  5. package/dist/src/cli/commands/cicd-monitor.js +154 -0
  6. package/dist/src/cli/commands/cicd-monitor.js.map +1 -0
  7. package/dist/src/cli/commands/validate-parent-repo.d.ts +8 -0
  8. package/dist/src/cli/commands/validate-parent-repo.d.ts.map +1 -0
  9. package/dist/src/cli/commands/validate-parent-repo.js +15 -0
  10. package/dist/src/cli/commands/validate-parent-repo.js.map +1 -0
  11. package/dist/src/cli/helpers/issue-tracker/types.d.ts +5 -0
  12. package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
  13. package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
  14. package/dist/src/core/cicd/config-loader.d.ts +21 -0
  15. package/dist/src/core/cicd/config-loader.d.ts.map +1 -0
  16. package/dist/src/core/cicd/config-loader.js +190 -0
  17. package/dist/src/core/cicd/config-loader.js.map +1 -0
  18. package/dist/src/core/cicd/index.d.ts +12 -0
  19. package/dist/src/core/cicd/index.d.ts.map +1 -0
  20. package/dist/src/core/cicd/index.js +18 -0
  21. package/dist/src/core/cicd/index.js.map +1 -0
  22. package/dist/src/core/cicd/monitor-service.d.ts +92 -0
  23. package/dist/src/core/cicd/monitor-service.d.ts.map +1 -0
  24. package/dist/src/core/cicd/monitor-service.js +132 -0
  25. package/dist/src/core/cicd/monitor-service.js.map +1 -0
  26. package/dist/src/core/cicd/notifier.d.ts +102 -0
  27. package/dist/src/core/cicd/notifier.d.ts.map +1 -0
  28. package/dist/src/core/cicd/notifier.js +184 -0
  29. package/dist/src/core/cicd/notifier.js.map +1 -0
  30. package/dist/src/core/cicd/parent-repo-validator.d.ts +42 -0
  31. package/dist/src/core/cicd/parent-repo-validator.d.ts.map +1 -0
  32. package/dist/src/core/cicd/parent-repo-validator.js +201 -0
  33. package/dist/src/core/cicd/parent-repo-validator.js.map +1 -0
  34. package/dist/src/core/cicd/state-manager.d.ts +79 -0
  35. package/dist/src/core/cicd/state-manager.d.ts.map +1 -0
  36. package/dist/src/core/cicd/state-manager.js +197 -0
  37. package/dist/src/core/cicd/state-manager.js.map +1 -0
  38. package/dist/src/core/cicd/types.d.ts +119 -0
  39. package/dist/src/core/cicd/types.d.ts.map +1 -0
  40. package/dist/src/core/cicd/types.js +18 -0
  41. package/dist/src/core/cicd/types.js.map +1 -0
  42. package/dist/src/core/cicd/workflow-monitor.d.ts +98 -0
  43. package/dist/src/core/cicd/workflow-monitor.d.ts.map +1 -0
  44. package/dist/src/core/cicd/workflow-monitor.js +215 -0
  45. package/dist/src/core/cicd/workflow-monitor.js.map +1 -0
  46. package/dist/src/core/spec-content-sync.d.ts.map +1 -1
  47. package/dist/src/core/spec-content-sync.js +14 -6
  48. package/dist/src/core/spec-content-sync.js.map +1 -1
  49. package/package.json +2 -2
  50. package/plugins/specweave/agents/pm/AGENT.md +170 -2
  51. package/plugins/specweave/hooks/post-increment-planning.sh +89 -26
  52. package/plugins/specweave/hooks/user-prompt-submit.sh +4 -4
  53. package/plugins/specweave/skills/increment-planner/SKILL.md +15 -10
  54. package/plugins/specweave-ado/lib/ado-project-detector.js +32 -5
  55. package/plugins/specweave-ado/lib/ado-project-detector.ts +44 -5
  56. package/src/templates/AGENTS.md.template +55 -1
  57. 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,CA8GpF;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"}
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
- const descMatch = content.match(/^#\s+.+\n\n(.+?)(?=\n##|\n---|\n\*\*|$)/s);
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
- const acRegex = new RegExp(`- \\[([ x])\\] \\*\\*AC-US${usNumber}-(\\d+)\\*\\*:\\s*([^(]+)(?:\\(([^)]+)\\))?`, 'g');
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":"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"}
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.13",
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
- **Location**: `.specweave/docs/internal/specs/spec-{number}-{name}.md`
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 sync (DISABLED - See architecture note below)
649
+ # 7. Increment-level GitHub issue creation (for single-repo projects)
650
650
  log_info ""
651
- log_info "ℹ️ Increment-level GitHub sync disabled (by design)"
652
- log_debug "Increments are INTERNAL work units, not synced to external tools"
653
- log_debug "External sync happens at SPEC level (.specweave/docs/internal/specs/)"
654
- log_debug "See: .specweave/increments/0025-per-project-resource-config/reports/CORRECT-SYNC-ARCHITECTURE.md"
655
-
656
- # TODO: Implement spec-level sync instead
657
- # Architecture:
658
- # - SPECS (.specweave/docs/internal/specs/) GitHub Projects/JIRA Epics/ADO Features
659
- # - User Stories GitHub Issues
660
- # - Increments → INTERNAL ONLY (no external sync)
661
- #
662
- # Commands to implement:
663
- # - /specweave-github:sync-spec spec-001
664
- # - /specweave-jira:sync-spec spec-001
665
- # - /specweave-ado:sync-spec spec-001
666
- #
667
- # See: plugins/specweave-github/commands/specweave-github-sync-spec.md
668
-
669
- # COMMENTED OUT: Increment-level GitHub issue creation (architecturally wrong)
670
- # # Check if auto-create is enabled in config
671
- # 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")
672
- #
673
- # if [ "$auto_create" = "true" ]; then
674
- # ... (increment-level sync code removed)
675
- # fi
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
- - Specs are now organized by project: `.specweave/docs/internal/projects/{project-id}/specs/`
117
- - Use `ProjectManager` (from `src/core/project-manager.ts`) to get correct paths
118
- - Single project uses `projects/default/` automatically (transparent)
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 projects/{activeProject}/specs/ automatically)
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/projects/{project-id}/specs/ # ← Multi-project (v0.8.0+)
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: projects/default/specs/spec-001-user-auth.md
311
- # Multi-project: projects/web-app/specs/spec-001-user-auth.md
312
- # projects/mobile/specs/spec-001-push-notifications.md
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 > 0.7) {
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 > 0.4) {
244
- const secondary = candidates.slice(1).filter((c) => c.confidence > 0.3).map((c) => c.project);
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 > 0.3);
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 (content.toLowerCase().includes(areaPath.toLowerCase())) {
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
  /**