specweave 0.24.8 → 0.24.11

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 (132) hide show
  1. package/dist/src/cli/commands/init.d.ts.map +1 -1
  2. package/dist/src/cli/commands/init.js +3 -1
  3. package/dist/src/cli/commands/init.js.map +1 -1
  4. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
  5. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +18 -2
  6. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
  7. package/dist/src/cli/helpers/issue-tracker/index.js +4 -4
  8. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  9. package/dist/src/core/repo-structure/git-error-handler.d.ts +1 -1
  10. package/dist/src/core/repo-structure/git-error-handler.d.ts.map +1 -1
  11. package/dist/src/core/repo-structure/git-provider.d.ts +1 -1
  12. package/dist/src/core/repo-structure/git-provider.d.ts.map +1 -1
  13. package/dist/src/core/repo-structure/platform-registry.d.ts.map +1 -1
  14. package/dist/src/core/repo-structure/platform-registry.js +20 -9
  15. package/dist/src/core/repo-structure/platform-registry.js.map +1 -1
  16. package/dist/src/core/repo-structure/prompt-consolidator.d.ts +13 -1
  17. package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
  18. package/dist/src/core/repo-structure/prompt-consolidator.js +38 -5
  19. package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
  20. package/dist/src/core/repo-structure/providers/azure-devops-provider.d.ts +64 -0
  21. package/dist/src/core/repo-structure/providers/azure-devops-provider.d.ts.map +1 -0
  22. package/dist/src/core/repo-structure/providers/azure-devops-provider.js +263 -0
  23. package/dist/src/core/repo-structure/providers/azure-devops-provider.js.map +1 -0
  24. package/dist/src/core/repo-structure/providers/bitbucket-provider.d.ts +12 -11
  25. package/dist/src/core/repo-structure/providers/bitbucket-provider.d.ts.map +1 -1
  26. package/dist/src/core/repo-structure/providers/bitbucket-provider.js +164 -30
  27. package/dist/src/core/repo-structure/providers/bitbucket-provider.js.map +1 -1
  28. package/dist/src/core/repo-structure/providers/gitlab-provider.d.ts +10 -9
  29. package/dist/src/core/repo-structure/providers/gitlab-provider.d.ts.map +1 -1
  30. package/dist/src/core/repo-structure/providers/gitlab-provider.js +182 -28
  31. package/dist/src/core/repo-structure/providers/gitlab-provider.js.map +1 -1
  32. package/dist/src/core/repo-structure/providers/index.d.ts +3 -1
  33. package/dist/src/core/repo-structure/providers/index.d.ts.map +1 -1
  34. package/dist/src/core/repo-structure/providers/index.js +10 -2
  35. package/dist/src/core/repo-structure/providers/index.js.map +1 -1
  36. package/dist/src/core/repo-structure/providers/local-provider.d.ts +61 -0
  37. package/dist/src/core/repo-structure/providers/local-provider.d.ts.map +1 -0
  38. package/dist/src/core/repo-structure/providers/local-provider.js +148 -0
  39. package/dist/src/core/repo-structure/providers/local-provider.js.map +1 -0
  40. package/dist/src/core/repo-structure/repo-structure-manager.d.ts +11 -1
  41. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
  42. package/dist/src/core/repo-structure/repo-structure-manager.js +268 -84
  43. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
  44. package/package.json +1 -1
  45. package/plugins/specweave/agents/pm/AGENT.md.bak +1893 -0
  46. package/plugins/specweave/hooks/docs-changed.sh.backup +79 -0
  47. package/plugins/specweave/hooks/human-input-required.sh.backup +75 -0
  48. package/plugins/specweave/hooks/lib/migrate-increment-work.sh.bak +245 -0
  49. package/plugins/specweave/hooks/lib/sync-spec-content.sh.bak +149 -0
  50. package/plugins/specweave/hooks/lib/validate-spec-status.sh.bak +163 -0
  51. package/plugins/specweave/hooks/post-first-increment.sh.backup +61 -0
  52. package/plugins/specweave/hooks/post-first-increment.sh.bak +61 -0
  53. package/plugins/specweave/hooks/post-increment-change.sh.backup +98 -0
  54. package/plugins/specweave/hooks/post-increment-completion.sh.backup +231 -0
  55. package/plugins/specweave/hooks/post-increment-planning.sh.backup +1048 -0
  56. package/plugins/specweave/hooks/post-increment-status-change.sh.backup +147 -0
  57. package/plugins/specweave/hooks/post-spec-update.sh.backup +158 -0
  58. package/plugins/specweave/hooks/post-spec-update.sh.bak +158 -0
  59. package/plugins/specweave/hooks/post-task-completion.sh +69 -175
  60. package/plugins/specweave/hooks/post-user-story-complete.sh.backup +179 -0
  61. package/plugins/specweave/hooks/post-user-story-complete.sh.bak +179 -0
  62. package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +83 -0
  63. package/plugins/specweave/hooks/pre-command-deduplication.sh.bak +83 -0
  64. package/plugins/specweave/hooks/pre-implementation.sh.backup +67 -0
  65. package/plugins/specweave/hooks/pre-task-completion.sh.backup +194 -0
  66. package/plugins/specweave/hooks/pre-tool-use.sh.backup +133 -0
  67. package/plugins/specweave/hooks/user-prompt-submit.sh.backup +386 -0
  68. package/plugins/specweave/hooks/user-prompt-submit.sh.bak +386 -0
  69. package/plugins/specweave/lib/hooks/auto-transition.js.bak +50 -0
  70. package/plugins/specweave/lib/hooks/auto-transition.ts.bak +84 -0
  71. package/plugins/specweave/lib/hooks/consolidated-sync.js +183 -0
  72. package/plugins/specweave/lib/hooks/git-diff-analyzer.d.js.bak +0 -0
  73. package/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts.bak +89 -0
  74. package/plugins/specweave/lib/hooks/git-diff-analyzer.js.bak +142 -0
  75. package/plugins/specweave/lib/hooks/git-diff-analyzer.ts.bak +269 -0
  76. package/plugins/specweave/lib/hooks/invoke-translator-skill.d.js.bak +0 -0
  77. package/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts.bak +60 -0
  78. package/plugins/specweave/lib/hooks/invoke-translator-skill.js.bak +155 -0
  79. package/plugins/specweave/lib/hooks/invoke-translator-skill.ts.bak +264 -0
  80. package/plugins/specweave/lib/hooks/prepare-reflection-context.d.js.bak +0 -0
  81. package/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts.bak +42 -0
  82. package/plugins/specweave/lib/hooks/prepare-reflection-context.js.bak +110 -0
  83. package/plugins/specweave/lib/hooks/prepare-reflection-context.ts.bak +178 -0
  84. package/plugins/specweave/lib/hooks/reflection-config-loader.d.js.bak +0 -0
  85. package/plugins/specweave/lib/hooks/reflection-config-loader.d.ts.bak +45 -0
  86. package/plugins/specweave/lib/hooks/reflection-config-loader.js.bak +92 -0
  87. package/plugins/specweave/lib/hooks/reflection-config-loader.ts.bak +156 -0
  88. package/plugins/specweave/lib/hooks/reflection-parser.d.js.bak +0 -0
  89. package/plugins/specweave/lib/hooks/reflection-parser.d.ts.bak +33 -0
  90. package/plugins/specweave/lib/hooks/reflection-parser.js.bak +301 -0
  91. package/plugins/specweave/lib/hooks/reflection-parser.ts.bak +484 -0
  92. package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.js.bak +0 -0
  93. package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts.bak +56 -0
  94. package/plugins/specweave/lib/hooks/reflection-prompt-builder.js.bak +182 -0
  95. package/plugins/specweave/lib/hooks/reflection-prompt-builder.ts.bak +306 -0
  96. package/plugins/specweave/lib/hooks/reflection-storage.d.js.bak +0 -0
  97. package/plugins/specweave/lib/hooks/reflection-storage.d.ts.bak +64 -0
  98. package/plugins/specweave/lib/hooks/reflection-storage.js.bak +231 -0
  99. package/plugins/specweave/lib/hooks/reflection-storage.ts.bak +369 -0
  100. package/plugins/specweave/lib/hooks/run-self-reflection.d.js.bak +0 -0
  101. package/plugins/specweave/lib/hooks/run-self-reflection.d.ts.bak +43 -0
  102. package/plugins/specweave/lib/hooks/run-self-reflection.js.bak +132 -0
  103. package/plugins/specweave/lib/hooks/run-self-reflection.ts.bak +258 -0
  104. package/plugins/specweave/lib/hooks/sync-cache.js.bak +294 -0
  105. package/plugins/specweave/lib/hooks/sync-living-docs.d.js.bak +1 -0
  106. package/plugins/specweave/lib/hooks/sync-living-docs.d.ts.bak +27 -0
  107. package/plugins/specweave/lib/hooks/sync-living-docs.js.bak +339 -0
  108. package/plugins/specweave/lib/hooks/sync-us-tasks.js.bak +476 -0
  109. package/plugins/specweave/lib/hooks/translate-file.d.js.bak +0 -0
  110. package/plugins/specweave/lib/hooks/translate-file.d.ts.bak +59 -0
  111. package/plugins/specweave/lib/hooks/translate-file.js.bak +289 -0
  112. package/plugins/specweave/lib/hooks/translate-file.ts.bak +428 -0
  113. package/plugins/specweave/lib/hooks/translate-living-docs.d.js.bak +0 -0
  114. package/plugins/specweave/lib/hooks/translate-living-docs.d.ts.bak +13 -0
  115. package/plugins/specweave/lib/hooks/translate-living-docs.js.bak +119 -0
  116. package/plugins/specweave/lib/hooks/translate-living-docs.ts.bak +224 -0
  117. package/plugins/specweave/lib/hooks/update-ac-status.js.bak +51 -0
  118. package/plugins/specweave/lib/hooks/update-ac-status.ts.bak +103 -0
  119. package/plugins/specweave/lib/hooks/update-tasks-md.d.js.bak +1 -0
  120. package/plugins/specweave/lib/hooks/update-tasks-md.d.ts.bak +29 -0
  121. package/plugins/specweave/lib/hooks/update-tasks-md.js.bak +296 -0
  122. package/plugins/specweave/lib/hooks/update-tasks-md.ts.bak +489 -0
  123. package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +353 -0
  124. package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +172 -0
  125. package/plugins/specweave-ado/lib/ado-multi-project-sync.js +1 -0
  126. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
  127. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +424 -0
  128. package/plugins/specweave-github/hooks/post-task-completion.sh.backup +258 -0
  129. package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +172 -0
  130. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
  131. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +540 -0
  132. package/plugins/specweave-release/hooks/post-task-completion.sh.backup +110 -0
@@ -0,0 +1,147 @@
1
+ #!/bin/bash
2
+
3
+ # SpecWeave Post-Increment-Status-Change Hook
4
+ # Runs automatically after increment status changes (pause/resume/abandon)
5
+ #
6
+ # Trigger: /specweave:pause, /specweave:resume, /specweave:abandon commands
7
+ # Purpose: Notify GitHub when increment status changes
8
+ #
9
+ # What it does:
10
+ # 1. Detects status change (paused, resumed, abandoned)
11
+ # 2. Posts comment to GitHub issue
12
+ # 3. Updates metadata
13
+ #
14
+ # Usage:
15
+ # ./post-increment-status-change.sh <incrementId> <newStatus> <reason>
16
+ #
17
+ # Example:
18
+ # ./post-increment-status-change.sh 0015-hierarchical-sync paused "Waiting for API keys"
19
+
20
+ set -e
21
+
22
+ # Find project root
23
+ find_project_root() {
24
+ local dir="$1"
25
+ while [ "$dir" != "/" ]; do
26
+ if [ -d "$dir/.specweave" ]; then
27
+ echo "$dir"
28
+ return 0
29
+ fi
30
+ dir="$(dirname "$dir")"
31
+ done
32
+ pwd
33
+ }
34
+
35
+ PROJECT_ROOT="$(find_project_root "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")"
36
+ cd "$PROJECT_ROOT" 2>/dev/null || true
37
+
38
+ # Configuration
39
+ LOGS_DIR=".specweave/logs"
40
+ DEBUG_LOG="$LOGS_DIR/hooks-debug.log"
41
+
42
+ mkdir -p "$LOGS_DIR" 2>/dev/null || true
43
+
44
+ # Arguments
45
+ INCREMENT_ID="$1"
46
+ NEW_STATUS="$2"
47
+ REASON="$3"
48
+
49
+ if [ -z "$INCREMENT_ID" ] || [ -z "$NEW_STATUS" ]; then
50
+ echo "Usage: $0 <incrementId> <newStatus> [reason]" >&2
51
+ echo "Example: $0 0015-hierarchical-sync paused 'Waiting for API'" >&2
52
+ exit 1
53
+ fi
54
+
55
+ echo "[$(date)] 📊 Status changed: $NEW_STATUS" >> "$DEBUG_LOG" 2>/dev/null || true
56
+
57
+ # Validate status
58
+ case "$NEW_STATUS" in
59
+ paused|resumed|abandoned)
60
+ ;;
61
+ *)
62
+ echo "[$(date)] ⚠️ Unknown status: $NEW_STATUS (skipping sync)" >> "$DEBUG_LOG" 2>/dev/null || true
63
+ exit 0
64
+ ;;
65
+ esac
66
+
67
+ # Check if GitHub CLI available
68
+ if ! command -v gh &> /dev/null; then
69
+ echo "[$(date)] ℹ️ GitHub CLI not found, skipping sync" >> "$DEBUG_LOG" 2>/dev/null || true
70
+ exit 0
71
+ fi
72
+
73
+ # Check if authenticated
74
+ if ! gh auth status &> /dev/null; then
75
+ echo "[$(date)] ℹ️ GitHub CLI not authenticated, skipping sync" >> "$DEBUG_LOG" 2>/dev/null || true
76
+ exit 0
77
+ fi
78
+
79
+ # Load metadata
80
+ METADATA_FILE=".specweave/increments/$INCREMENT_ID/metadata.json"
81
+
82
+ if [ ! -f "$METADATA_FILE" ]; then
83
+ echo "[$(date)] ℹ️ No metadata.json found, skipping sync" >> "$DEBUG_LOG" 2>/dev/null || true
84
+ exit 0
85
+ fi
86
+
87
+ # Extract GitHub issue number
88
+ GITHUB_ISSUE=$(jq -r '.github.issue // empty' "$METADATA_FILE" 2>/dev/null)
89
+
90
+ if [ -z "$GITHUB_ISSUE" ]; then
91
+ echo "[$(date)] ℹ️ No GitHub issue linked, skipping sync" >> "$DEBUG_LOG" 2>/dev/null || true
92
+ exit 0
93
+ fi
94
+
95
+ # Detect repository
96
+ GITHUB_REMOTE=$(git remote get-url origin 2>/dev/null || echo "")
97
+ REPO_MATCH=$(echo "$GITHUB_REMOTE" | grep -o 'github\.com[:/][^/]*/[^/]*' | sed 's/github\.com[:/]//')
98
+
99
+ if [ -z "$REPO_MATCH" ]; then
100
+ echo "[$(date)] ⚠️ Could not detect GitHub repository" >> "$DEBUG_LOG" 2>/dev/null || true
101
+ exit 0
102
+ fi
103
+
104
+ echo "[$(date)] 🔄 Posting status change to GitHub issue #$GITHUB_ISSUE" >> "$DEBUG_LOG" 2>/dev/null || true
105
+
106
+ # Build comment based on status
107
+ EMOJI=""
108
+ TITLE=""
109
+ case "$NEW_STATUS" in
110
+ paused)
111
+ EMOJI="⏸️"
112
+ TITLE="Increment Paused"
113
+ ;;
114
+ resumed)
115
+ EMOJI="▶️"
116
+ TITLE="Increment Resumed"
117
+ ;;
118
+ abandoned)
119
+ EMOJI="🗑️"
120
+ TITLE="Increment Abandoned"
121
+ ;;
122
+ esac
123
+
124
+ TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
125
+
126
+ COMMENT="$EMOJI **$TITLE**
127
+
128
+ **Reason**: ${REASON:-Not specified}
129
+
130
+ **Timestamp**: $TIMESTAMP
131
+
132
+ ---
133
+ 🤖 Auto-updated by SpecWeave"
134
+
135
+ # Post comment
136
+ echo "$COMMENT" | gh issue comment "$GITHUB_ISSUE" --body-file - 2>&1 | tee -a "$DEBUG_LOG" >/dev/null || {
137
+ echo "[$(date)] ⚠️ Failed to post comment (non-blocking)" >> "$DEBUG_LOG" 2>/dev/null || true
138
+ }
139
+
140
+ echo "[$(date)] ✅ Status change synced to GitHub" >> "$DEBUG_LOG" 2>/dev/null || true
141
+
142
+ # Update status line cache (status changed - may affect which increment is "current")
143
+ HOOK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
144
+ bash "$HOOK_DIR/lib/update-status-line.sh" 2>/dev/null || true
145
+
146
+ # Return success (non-blocking)
147
+ exit 0
@@ -0,0 +1,158 @@
1
+ #!/bin/bash
2
+
3
+ ###############################################################################
4
+ # SpecWeave Post-Spec-Update Hook
5
+ #
6
+ # CRITICAL ARCHITECTURE:
7
+ # - Fires when .specweave/docs/internal/specs/spec-*.md is updated
8
+ # - Auto-syncs to linked external tool (GitHub Project/Jira Epic/ADO Feature)
9
+ # - Replaces increment-based sync (which was wrong!)
10
+ #
11
+ # Trigger Points:
12
+ # 1. After /specweave:sync-docs update (spec updated from increment)
13
+ # 2. After manual spec.md edits (user updates living docs directly)
14
+ # 3. After bidirectional sync from external tool
15
+ #
16
+ # What It Does:
17
+ # - Detects which spec was updated
18
+ # - Checks if spec is linked to external tool (frontmatter: externalLinks)
19
+ # - Syncs changes to GitHub Project / Jira Epic / ADO Feature
20
+ # - Updates user stories, acceptance criteria, progress
21
+ #
22
+ # Usage:
23
+ # post-spec-update.sh <spec-file-path>
24
+ #
25
+ # Example:
26
+ # post-spec-update.sh .specweave/docs/internal/specs/spec-001-core-framework.md
27
+ #
28
+ ###############################################################################
29
+
30
+ set -euo pipefail
31
+
32
+ # Arguments
33
+ SPEC_FILE_PATH="${1:-}"
34
+
35
+ # Validate arguments
36
+ if [[ -z "$SPEC_FILE_PATH" ]]; then
37
+ echo "❌ Error: Spec file path required"
38
+ echo "Usage: post-spec-update.sh <spec-file-path>"
39
+ exit 1
40
+ fi
41
+
42
+ # Check if spec file exists
43
+ if [[ ! -f "$SPEC_FILE_PATH" ]]; then
44
+ echo "❌ Error: Spec file not found: $SPEC_FILE_PATH"
45
+ exit 1
46
+ fi
47
+
48
+ # Extract spec ID from file path
49
+ # Example: .specweave/docs/internal/specs/spec-001-core-framework.md → spec-001
50
+ SPEC_ID=$(basename "$SPEC_FILE_PATH" .md)
51
+
52
+ echo ""
53
+ echo "🔗 Post-Spec-Update Hook"
54
+ echo " Spec: $SPEC_ID"
55
+ echo " File: $SPEC_FILE_PATH"
56
+
57
+ # Load config to check if auto-sync is enabled
58
+ CONFIG_FILE=".specweave/config.json"
59
+ if [[ ! -f "$CONFIG_FILE" ]]; then
60
+ echo " ℹ️ No config file found, skipping auto-sync"
61
+ exit 0
62
+ fi
63
+
64
+ # Check if auto-sync is enabled
65
+ AUTO_SYNC=$(jq -r '.hooks.post_spec_update.auto_sync // true' "$CONFIG_FILE")
66
+
67
+ if [[ "$AUTO_SYNC" != "true" ]]; then
68
+ echo " ℹ️ Auto-sync disabled in config, skipping"
69
+ exit 0
70
+ fi
71
+
72
+ # Parse spec frontmatter to detect external links
73
+ # Use gray-matter or similar to extract YAML frontmatter
74
+ # For now, use simple grep/sed approach
75
+
76
+ # Check if GitHub link exists
77
+ GITHUB_LINK=$(grep -A 10 "^externalLinks:" "$SPEC_FILE_PATH" | grep -A 5 "github:" | grep "projectId:" | sed 's/.*projectId: *//; s/ *$//' || echo "")
78
+
79
+ # Check if Jira link exists
80
+ JIRA_LINK=$(grep -A 10 "^externalLinks:" "$SPEC_FILE_PATH" | grep -A 5 "jira:" | grep "epicKey:" | sed 's/.*epicKey: *//; s/ *$//' || echo "")
81
+
82
+ # Check if ADO link exists
83
+ ADO_LINK=$(grep -A 10 "^externalLinks:" "$SPEC_FILE_PATH" | grep -A 5 "ado:" | grep "featureId:" | sed 's/.*featureId: *//; s/ *$//' || echo "")
84
+
85
+ # Determine which provider to sync
86
+ PROVIDER=""
87
+ if [[ -n "$GITHUB_LINK" ]]; then
88
+ PROVIDER="github"
89
+ EXTERNAL_ID="$GITHUB_LINK"
90
+ elif [[ -n "$JIRA_LINK" ]]; then
91
+ PROVIDER="jira"
92
+ EXTERNAL_ID="$JIRA_LINK"
93
+ elif [[ -n "$ADO_LINK" ]]; then
94
+ PROVIDER="ado"
95
+ EXTERNAL_ID="$ADO_LINK"
96
+ fi
97
+
98
+ # No external link found - skip sync
99
+ if [[ -z "$PROVIDER" ]]; then
100
+ echo " ℹ️ Spec not linked to external tool, skipping sync"
101
+ echo " Hint: Use /specweave-github:sync-spec or /specweave-jira:sync-spec to link"
102
+ exit 0
103
+ fi
104
+
105
+ echo " 🔗 Detected external link: $PROVIDER (ID: $EXTERNAL_ID)"
106
+
107
+ # Sync to external tool based on provider
108
+ case "$PROVIDER" in
109
+ github)
110
+ echo " 🔄 Syncing to GitHub Project..."
111
+
112
+ # Check if GitHub CLI is available
113
+ if ! command -v gh &> /dev/null; then
114
+ echo " ⚠️ GitHub CLI (gh) not found, skipping sync"
115
+ exit 0
116
+ fi
117
+
118
+ # TODO: Call GitHub spec sync
119
+ # For now, just log the action
120
+ echo " ✅ GitHub sync queued (implementation pending)"
121
+ ;;
122
+
123
+ jira)
124
+ echo " 🔄 Syncing to Jira Epic..."
125
+
126
+ # Check if Jira config exists
127
+ if [[ -z "${JIRA_DOMAIN:-}" ]]; then
128
+ echo " ⚠️ Jira not configured (.env), skipping sync"
129
+ exit 0
130
+ fi
131
+
132
+ # TODO: Call Jira spec sync
133
+ echo " ✅ Jira sync queued (implementation pending)"
134
+ ;;
135
+
136
+ ado)
137
+ echo " 🔄 Syncing to Azure DevOps Feature..."
138
+
139
+ # Check if ADO config exists
140
+ if [[ -z "${ADO_ORGANIZATION:-}" ]]; then
141
+ echo " ⚠️ ADO not configured (.env), skipping sync"
142
+ exit 0
143
+ fi
144
+
145
+ # TODO: Call ADO spec sync
146
+ echo " ✅ ADO sync queued (implementation pending)"
147
+ ;;
148
+
149
+ *)
150
+ echo " ⚠️ Unknown provider: $PROVIDER"
151
+ exit 0
152
+ ;;
153
+ esac
154
+
155
+ echo " ✅ Post-spec-update hook complete"
156
+ echo ""
157
+
158
+ exit 0
@@ -0,0 +1,158 @@
1
+ #!/bin/bash
2
+
3
+ ###############################################################################
4
+ # SpecWeave Post-Spec-Update Hook
5
+ #
6
+ # CRITICAL ARCHITECTURE:
7
+ # - Fires when .specweave/docs/internal/specs/spec-*.md is updated
8
+ # - Auto-syncs to linked external tool (GitHub Project/Jira Epic/ADO Feature)
9
+ # - Replaces increment-based sync (which was wrong!)
10
+ #
11
+ # Trigger Points:
12
+ # 1. After /specweave:sync-docs update (spec updated from increment)
13
+ # 2. After manual spec.md edits (user updates living docs directly)
14
+ # 3. After bidirectional sync from external tool
15
+ #
16
+ # What It Does:
17
+ # - Detects which spec was updated
18
+ # - Checks if spec is linked to external tool (frontmatter: externalLinks)
19
+ # - Syncs changes to GitHub Project / Jira Epic / ADO Feature
20
+ # - Updates user stories, acceptance criteria, progress
21
+ #
22
+ # Usage:
23
+ # post-spec-update.sh <spec-file-path>
24
+ #
25
+ # Example:
26
+ # post-spec-update.sh .specweave/docs/internal/specs/spec-001-core-framework.md
27
+ #
28
+ ###############################################################################
29
+
30
+ set -euo pipefail
31
+
32
+ # Arguments
33
+ SPEC_FILE_PATH="${1:-}"
34
+
35
+ # Validate arguments
36
+ if [[ -z "$SPEC_FILE_PATH" ]]; then
37
+ echo "❌ Error: Spec file path required"
38
+ echo "Usage: post-spec-update.sh <spec-file-path>"
39
+ exit 1
40
+ fi
41
+
42
+ # Check if spec file exists
43
+ if [[ ! -f "$SPEC_FILE_PATH" ]]; then
44
+ echo "❌ Error: Spec file not found: $SPEC_FILE_PATH"
45
+ exit 1
46
+ fi
47
+
48
+ # Extract spec ID from file path
49
+ # Example: .specweave/docs/internal/specs/spec-001-core-framework.md → spec-001
50
+ SPEC_ID=$(basename "$SPEC_FILE_PATH" .md)
51
+
52
+ echo ""
53
+ echo "🔗 Post-Spec-Update Hook"
54
+ echo " Spec: $SPEC_ID"
55
+ echo " File: $SPEC_FILE_PATH"
56
+
57
+ # Load config to check if auto-sync is enabled
58
+ CONFIG_FILE=".specweave/config.json"
59
+ if [[ ! -f "$CONFIG_FILE" ]]; then
60
+ echo " ℹ️ No config file found, skipping auto-sync"
61
+ exit 0
62
+ fi
63
+
64
+ # Check if auto-sync is enabled
65
+ AUTO_SYNC=$(jq -r '.hooks.post_spec_update.auto_sync // true' "$CONFIG_FILE")
66
+
67
+ if [[ "$AUTO_SYNC" != "true" ]]; then
68
+ echo " ℹ️ Auto-sync disabled in config, skipping"
69
+ exit 0
70
+ fi
71
+
72
+ # Parse spec frontmatter to detect external links
73
+ # Use gray-matter or similar to extract YAML frontmatter
74
+ # For now, use simple grep/sed approach
75
+
76
+ # Check if GitHub link exists
77
+ GITHUB_LINK=$(grep -A 10 "^externalLinks:" "$SPEC_FILE_PATH" | grep -A 5 "github:" | grep "projectId:" | sed 's/.*projectId: *//; s/ *$//' || echo "")
78
+
79
+ # Check if Jira link exists
80
+ JIRA_LINK=$(grep -A 10 "^externalLinks:" "$SPEC_FILE_PATH" | grep -A 5 "jira:" | grep "epicKey:" | sed 's/.*epicKey: *//; s/ *$//' || echo "")
81
+
82
+ # Check if ADO link exists
83
+ ADO_LINK=$(grep -A 10 "^externalLinks:" "$SPEC_FILE_PATH" | grep -A 5 "ado:" | grep "featureId:" | sed 's/.*featureId: *//; s/ *$//' || echo "")
84
+
85
+ # Determine which provider to sync
86
+ PROVIDER=""
87
+ if [[ -n "$GITHUB_LINK" ]]; then
88
+ PROVIDER="github"
89
+ EXTERNAL_ID="$GITHUB_LINK"
90
+ elif [[ -n "$JIRA_LINK" ]]; then
91
+ PROVIDER="jira"
92
+ EXTERNAL_ID="$JIRA_LINK"
93
+ elif [[ -n "$ADO_LINK" ]]; then
94
+ PROVIDER="ado"
95
+ EXTERNAL_ID="$ADO_LINK"
96
+ fi
97
+
98
+ # No external link found - skip sync
99
+ if [[ -z "$PROVIDER" ]]; then
100
+ echo " ℹ️ Spec not linked to external tool, skipping sync"
101
+ echo " Hint: Use /specweave-github:sync-spec or /specweave-jira:sync-spec to link"
102
+ exit 0
103
+ fi
104
+
105
+ echo " 🔗 Detected external link: $PROVIDER (ID: $EXTERNAL_ID)"
106
+
107
+ # Sync to external tool based on provider
108
+ case "$PROVIDER" in
109
+ github)
110
+ echo " 🔄 Syncing to GitHub Project..."
111
+
112
+ # Check if GitHub CLI is available
113
+ if ! command -v gh &> /dev/null; then
114
+ echo " ⚠️ GitHub CLI (gh) not found, skipping sync"
115
+ exit 0
116
+ fi
117
+
118
+ # TODO: Call GitHub spec sync
119
+ # For now, just log the action
120
+ echo " ✅ GitHub sync queued (implementation pending)"
121
+ ;;
122
+
123
+ jira)
124
+ echo " 🔄 Syncing to Jira Epic..."
125
+
126
+ # Check if Jira config exists
127
+ if [[ -z "${JIRA_DOMAIN:-}" ]]; then
128
+ echo " ⚠️ Jira not configured (.env), skipping sync"
129
+ exit 0
130
+ fi
131
+
132
+ # TODO: Call Jira spec sync
133
+ echo " ✅ Jira sync queued (implementation pending)"
134
+ ;;
135
+
136
+ ado)
137
+ echo " 🔄 Syncing to Azure DevOps Feature..."
138
+
139
+ # Check if ADO config exists
140
+ if [[ -z "${ADO_ORGANIZATION:-}" ]]; then
141
+ echo " ⚠️ ADO not configured (.env), skipping sync"
142
+ exit 0
143
+ fi
144
+
145
+ # TODO: Call ADO spec sync
146
+ echo " ✅ ADO sync queued (implementation pending)"
147
+ ;;
148
+
149
+ *)
150
+ echo " ⚠️ Unknown provider: $PROVIDER"
151
+ exit 0
152
+ ;;
153
+ esac
154
+
155
+ echo " ✅ Post-spec-update hook complete"
156
+ echo ""
157
+
158
+ exit 0