specweave 0.30.19 → 0.32.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/CLAUDE.md +176 -2
  2. package/README.md +22 -0
  3. package/bin/specweave.js +18 -1
  4. package/dist/src/cli/commands/cache.d.ts +17 -0
  5. package/dist/src/cli/commands/cache.d.ts.map +1 -0
  6. package/dist/src/cli/commands/cache.js +126 -0
  7. package/dist/src/cli/commands/cache.js.map +1 -0
  8. package/dist/src/cli/commands/init.js +1 -1
  9. package/dist/src/cli/commands/init.js.map +1 -1
  10. package/dist/src/cli/commands/plan/increment-detector.js +2 -2
  11. package/dist/src/cli/commands/plan/increment-detector.js.map +1 -1
  12. package/dist/src/cli/commands/sync-spec-commits.js +1 -1
  13. package/dist/src/cli/commands/sync-spec-commits.js.map +1 -1
  14. package/dist/src/cli/commands/sync-specs.js +2 -2
  15. package/dist/src/cli/commands/sync-specs.js.map +1 -1
  16. package/dist/src/cli/helpers/github/increment-profile-selector.js +1 -1
  17. package/dist/src/cli/helpers/github/increment-profile-selector.js.map +1 -1
  18. package/dist/src/cli/workers/living-docs-worker.js +66 -1
  19. package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
  20. package/dist/src/config/types.d.ts +203 -1208
  21. package/dist/src/config/types.d.ts.map +1 -1
  22. package/dist/src/core/discrepancy/increment-generator.d.ts.map +1 -1
  23. package/dist/src/core/discrepancy/increment-generator.js +5 -2
  24. package/dist/src/core/discrepancy/increment-generator.js.map +1 -1
  25. package/dist/src/core/external-tools/external-items-counter.d.ts +62 -0
  26. package/dist/src/core/external-tools/external-items-counter.d.ts.map +1 -0
  27. package/dist/src/core/external-tools/external-items-counter.js +206 -0
  28. package/dist/src/core/external-tools/external-items-counter.js.map +1 -0
  29. package/dist/src/core/external-tools/external-items-display.d.ts +39 -0
  30. package/dist/src/core/external-tools/external-items-display.d.ts.map +1 -0
  31. package/dist/src/core/external-tools/external-items-display.js +185 -0
  32. package/dist/src/core/external-tools/external-items-display.js.map +1 -0
  33. package/dist/src/core/external-tools/index.d.ts +8 -0
  34. package/dist/src/core/external-tools/index.d.ts.map +1 -0
  35. package/dist/src/core/external-tools/index.js +8 -0
  36. package/dist/src/core/external-tools/index.js.map +1 -0
  37. package/dist/src/core/external-tools/providers/ado-items-adapter.d.ts +39 -0
  38. package/dist/src/core/external-tools/providers/ado-items-adapter.d.ts.map +1 -0
  39. package/dist/src/core/external-tools/providers/ado-items-adapter.js +188 -0
  40. package/dist/src/core/external-tools/providers/ado-items-adapter.js.map +1 -0
  41. package/dist/src/core/external-tools/providers/github-items-adapter.d.ts +38 -0
  42. package/dist/src/core/external-tools/providers/github-items-adapter.d.ts.map +1 -0
  43. package/dist/src/core/external-tools/providers/github-items-adapter.js +136 -0
  44. package/dist/src/core/external-tools/providers/github-items-adapter.js.map +1 -0
  45. package/dist/src/core/external-tools/providers/index.d.ts +7 -0
  46. package/dist/src/core/external-tools/providers/index.d.ts.map +1 -0
  47. package/dist/src/core/external-tools/providers/index.js +7 -0
  48. package/dist/src/core/external-tools/providers/index.js.map +1 -0
  49. package/dist/src/core/external-tools/providers/jira-items-adapter.d.ts +42 -0
  50. package/dist/src/core/external-tools/providers/jira-items-adapter.d.ts.map +1 -0
  51. package/dist/src/core/external-tools/providers/jira-items-adapter.js +153 -0
  52. package/dist/src/core/external-tools/providers/jira-items-adapter.js.map +1 -0
  53. package/dist/src/core/external-tools/types.d.ts +78 -0
  54. package/dist/src/core/external-tools/types.d.ts.map +1 -0
  55. package/dist/src/core/external-tools/types.js +19 -0
  56. package/dist/src/core/external-tools/types.js.map +1 -0
  57. package/dist/src/core/increment/duplicate-detector.js +2 -2
  58. package/dist/src/core/increment/duplicate-detector.js.map +1 -1
  59. package/dist/src/core/increment/increment-archiver.d.ts +24 -0
  60. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  61. package/dist/src/core/increment/increment-archiver.js +59 -2
  62. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  63. package/dist/src/core/increment/increment-status.js +2 -2
  64. package/dist/src/core/increment/increment-status.js.map +1 -1
  65. package/dist/src/core/increment/increment-utils.d.ts +98 -37
  66. package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
  67. package/dist/src/core/increment/increment-utils.js +119 -68
  68. package/dist/src/core/increment/increment-utils.js.map +1 -1
  69. package/dist/src/core/increment/metadata-validator.js +1 -1
  70. package/dist/src/core/increment/metadata-validator.js.map +1 -1
  71. package/dist/src/core/increment/status-change-sync-trigger.d.ts.map +1 -1
  72. package/dist/src/core/increment/status-change-sync-trigger.js +4 -0
  73. package/dist/src/core/increment/status-change-sync-trigger.js.map +1 -1
  74. package/dist/src/core/living-docs/feature-id-manager.js +1 -1
  75. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
  76. package/dist/src/core/living-docs/hierarchy-mapper.js +3 -3
  77. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
  78. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.d.ts +18 -0
  79. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.d.ts.map +1 -0
  80. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js +247 -0
  81. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js.map +1 -0
  82. package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.d.ts +15 -0
  83. package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.d.ts.map +1 -0
  84. package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js +138 -0
  85. package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js.map +1 -0
  86. package/dist/src/core/living-docs/intelligent-analyzer/file-sampler.d.ts +24 -0
  87. package/dist/src/core/living-docs/intelligent-analyzer/file-sampler.d.ts.map +1 -0
  88. package/dist/src/core/living-docs/intelligent-analyzer/file-sampler.js +198 -0
  89. package/dist/src/core/living-docs/intelligent-analyzer/file-sampler.js.map +1 -0
  90. package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.d.ts +17 -0
  91. package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.d.ts.map +1 -0
  92. package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.js +241 -0
  93. package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.js.map +1 -0
  94. package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts +28 -0
  95. package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts.map +1 -0
  96. package/dist/src/core/living-docs/intelligent-analyzer/index.js +197 -0
  97. package/dist/src/core/living-docs/intelligent-analyzer/index.js.map +1 -0
  98. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.d.ts +18 -0
  99. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.d.ts.map +1 -0
  100. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js +154 -0
  101. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js.map +1 -0
  102. package/dist/src/core/living-docs/intelligent-analyzer/strategy-generator.d.ts +42 -0
  103. package/dist/src/core/living-docs/intelligent-analyzer/strategy-generator.d.ts.map +1 -0
  104. package/dist/src/core/living-docs/intelligent-analyzer/strategy-generator.js +343 -0
  105. package/dist/src/core/living-docs/intelligent-analyzer/strategy-generator.js.map +1 -0
  106. package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts +146 -0
  107. package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts.map +1 -0
  108. package/dist/src/core/living-docs/intelligent-analyzer/types.js +7 -0
  109. package/dist/src/core/living-docs/intelligent-analyzer/types.js.map +1 -0
  110. package/dist/src/core/living-docs/living-docs-sync.d.ts +5 -0
  111. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  112. package/dist/src/core/living-docs/living-docs-sync.js +36 -2
  113. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  114. package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -1
  115. package/dist/src/core/llm/providers/azure-openai-provider.js +1 -0
  116. package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -1
  117. package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -1
  118. package/dist/src/core/llm/providers/bedrock-provider.js +2 -0
  119. package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -1
  120. package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -1
  121. package/dist/src/core/llm/providers/openai-provider.js +1 -0
  122. package/dist/src/core/llm/providers/openai-provider.js.map +1 -1
  123. package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -1
  124. package/dist/src/core/llm/providers/vertex-ai-provider.js +1 -0
  125. package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -1
  126. package/dist/src/core/sync/spec-increment-mapper.js +3 -3
  127. package/dist/src/core/sync/spec-increment-mapper.js.map +1 -1
  128. package/dist/src/importers/item-converter.d.ts +25 -0
  129. package/dist/src/importers/item-converter.d.ts.map +1 -1
  130. package/dist/src/importers/item-converter.js +135 -5
  131. package/dist/src/importers/item-converter.js.map +1 -1
  132. package/dist/src/init/architecture/types.d.ts +33 -140
  133. package/dist/src/init/architecture/types.d.ts.map +1 -1
  134. package/dist/src/init/compliance/types.d.ts +30 -27
  135. package/dist/src/init/compliance/types.d.ts.map +1 -1
  136. package/dist/src/init/repo/types.d.ts +11 -34
  137. package/dist/src/init/repo/types.d.ts.map +1 -1
  138. package/dist/src/init/research/src/config/types.d.ts +15 -82
  139. package/dist/src/init/research/src/config/types.d.ts.map +1 -1
  140. package/dist/src/init/research/types.d.ts +38 -93
  141. package/dist/src/init/research/types.d.ts.map +1 -1
  142. package/dist/src/init/team/types.d.ts +4 -42
  143. package/dist/src/init/team/types.d.ts.map +1 -1
  144. package/dist/src/types/dashboard-cache.d.ts +181 -0
  145. package/dist/src/types/dashboard-cache.d.ts.map +1 -0
  146. package/dist/src/types/dashboard-cache.js +65 -0
  147. package/dist/src/types/dashboard-cache.js.map +1 -0
  148. package/dist/src/utils/docs-validator.d.ts +131 -0
  149. package/dist/src/utils/docs-validator.d.ts.map +1 -0
  150. package/dist/src/utils/docs-validator.js +529 -0
  151. package/dist/src/utils/docs-validator.js.map +1 -0
  152. package/dist/src/utils/feature-id-collision.js +1 -1
  153. package/dist/src/utils/feature-id-collision.js.map +1 -1
  154. package/dist/src/utils/html-to-mdx.d.ts +1 -0
  155. package/dist/src/utils/html-to-mdx.d.ts.map +1 -1
  156. package/dist/src/utils/html-to-mdx.js +43 -5
  157. package/dist/src/utils/html-to-mdx.js.map +1 -1
  158. package/package.json +1 -5
  159. package/plugins/specweave/agents/pm/AGENT.md +10 -7
  160. package/plugins/specweave/commands/specweave-archive-features.md +5 -7
  161. package/plugins/specweave/commands/specweave-archive.md +2 -1
  162. package/plugins/specweave/commands/specweave-do.md +35 -1
  163. package/plugins/specweave/commands/specweave-done.md +96 -0
  164. package/plugins/specweave/commands/specweave-external.md +150 -0
  165. package/plugins/specweave/commands/specweave-import-external.md +45 -18
  166. package/plugins/specweave/commands/specweave-increment.md +331 -33
  167. package/plugins/specweave/commands/specweave-jobs.md +2 -2
  168. package/plugins/specweave/commands/specweave-progress.md +4 -4
  169. package/plugins/specweave/commands/specweave-restore-feature.md +5 -4
  170. package/plugins/specweave/commands/specweave-sync-docs.md +1 -1
  171. package/plugins/specweave/commands/specweave-sync-specs.md +216 -322
  172. package/plugins/specweave/commands/specweave-validate-features.md +13 -8
  173. package/plugins/specweave/hooks/docs-changed.sh.backup +79 -0
  174. package/plugins/specweave/hooks/hooks.json +33 -4
  175. package/plugins/specweave/hooks/human-input-required.sh.backup +75 -0
  176. package/plugins/specweave/hooks/lib/common-setup.sh +375 -0
  177. package/plugins/specweave/hooks/lib/crash-prevention.sh +336 -0
  178. package/plugins/specweave/hooks/post-first-increment.sh.backup +61 -0
  179. package/plugins/specweave/hooks/post-increment-change.sh.backup +98 -0
  180. package/plugins/specweave/hooks/post-increment-completion.sh.backup +231 -0
  181. package/plugins/specweave/hooks/post-increment-planning.sh.backup +1048 -0
  182. package/plugins/specweave/hooks/post-increment-status-change.sh.backup +147 -0
  183. package/plugins/specweave/hooks/post-spec-update.sh.backup +158 -0
  184. package/plugins/specweave/hooks/post-task-completion.sh +4 -23
  185. package/plugins/specweave/hooks/post-user-story-complete.sh.backup +179 -0
  186. package/plugins/specweave/hooks/pre-command-deduplication.sh +1 -6
  187. package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +83 -0
  188. package/plugins/specweave/hooks/pre-implementation.sh.backup +67 -0
  189. package/plugins/specweave/hooks/pre-task-completion.sh +8 -37
  190. package/plugins/specweave/hooks/pre-task-completion.sh.backup +194 -0
  191. package/plugins/specweave/hooks/pre-tool-use.sh +2 -11
  192. package/plugins/specweave/hooks/pre-tool-use.sh.backup +133 -0
  193. package/plugins/specweave/hooks/universal/dispatcher.mjs +135 -42
  194. package/plugins/specweave/hooks/universal/fail-fast-wrapper.sh +183 -0
  195. package/plugins/specweave/hooks/universal/hook-wrapper.cmd +26 -26
  196. package/plugins/specweave/hooks/universal/session-start.cmd +16 -16
  197. package/plugins/specweave/hooks/universal/session-start.ps1 +16 -16
  198. package/plugins/specweave/hooks/user-prompt-submit.sh +140 -38
  199. package/plugins/specweave/hooks/user-prompt-submit.sh.backup +386 -0
  200. package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +12 -0
  201. package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +89 -0
  202. package/plugins/specweave/hooks/v2/guards/bash-file-guard.sh +211 -0
  203. package/plugins/specweave/hooks/v2/guards/bash-file-guard.test.sh +163 -0
  204. package/plugins/specweave/hooks/v2/guards/completion-guard.sh +26 -28
  205. package/plugins/specweave/hooks/v2/guards/features-folder-guard.sh +50 -0
  206. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +2 -2
  207. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -1
  208. package/plugins/specweave/scripts/README.md +166 -0
  209. package/plugins/specweave/scripts/cleanup-state.sh +142 -0
  210. package/plugins/specweave/scripts/force-kill.sh +142 -0
  211. package/plugins/specweave/scripts/jobs.js +171 -0
  212. package/plugins/specweave/scripts/progress.js +170 -0
  213. package/plugins/specweave/scripts/read-costs.sh +132 -0
  214. package/plugins/specweave/scripts/read-jobs.sh +324 -0
  215. package/plugins/specweave/scripts/read-progress.sh +185 -0
  216. package/plugins/specweave/scripts/read-status.sh +146 -0
  217. package/plugins/specweave/scripts/read-workflow.sh +173 -0
  218. package/plugins/specweave/scripts/rebuild-dashboard-cache.sh +327 -0
  219. package/plugins/specweave/scripts/session-watchdog.sh +192 -0
  220. package/plugins/specweave/scripts/status.js +154 -0
  221. package/plugins/specweave/scripts/update-dashboard-cache.sh +281 -0
  222. package/plugins/specweave/skills/increment-planner/SKILL.md +333 -24
  223. package/plugins/specweave/skills/increment-planner/templates/spec-multi-project.md +17 -9
  224. package/plugins/specweave/skills/increment-planner/templates/spec-single-project.md +6 -2
  225. package/plugins/specweave/skills/instant-status/SKILL.md +70 -0
  226. package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +353 -0
  227. package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +172 -0
  228. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
  229. package/plugins/specweave-docs/commands/build.md +32 -4
  230. package/plugins/specweave-docs/commands/preview.md +43 -1
  231. package/plugins/specweave-docs/commands/validate.md +250 -0
  232. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +1262 -626
  233. package/plugins/specweave-github/hooks/post-task-completion.sh.backup +258 -0
  234. package/plugins/specweave-github/lib/enhanced-github-sync.js +220 -0
  235. package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +172 -0
  236. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
  237. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +1254 -939
  238. package/plugins/specweave-release/hooks/post-task-completion.sh.backup +110 -0
  239. package/plugins/specweave/hooks/post-edit-spec.sh +0 -265
  240. package/plugins/specweave/hooks/post-write-spec.sh +0 -267
  241. package/plugins/specweave/hooks/pre-edit-spec.sh +0 -151
  242. package/plugins/specweave/hooks/pre-write-spec.sh +0 -151
@@ -1,151 +0,0 @@
1
- #!/bin/bash
2
- #
3
- # Pre-Edit Hook: Capture File Path BEFORE Edit Executes (Tier 2)
4
- #
5
- # Purpose: Detect which file will be edited BEFORE the Edit tool runs
6
- # Strategy: PreToolUse has better access to tool arguments than PostToolUse
7
- #
8
- # TIER 2 COORDINATION:
9
- # 1. Extract file_path from TOOL_USE_ARGS (more reliable in PreToolUse)
10
- # 2. If it's spec.md/tasks.md in increments folder, signal PostToolUse hook
11
- # 3. Write file path to .pending-status-update for PostToolUse to consume
12
- #
13
- # This eliminates the need for mtime-based fallback detection (Tier 1)
14
- # and reduces false positives to near zero.
15
- #
16
- # Architecture:
17
- # PreToolUse:Edit → pre-edit-spec.sh (this file)
18
- # ↓ writes to
19
- # .specweave/state/.pending-status-update
20
- # ↓ read by
21
- # PostToolUse:Edit → post-edit-spec.sh
22
- #
23
- # Version: v0.24.3 (EMERGENCY FIXES)
24
- # Date: 2025-11-22
25
-
26
- # EMERGENCY FIX: Remove set -e - it causes Claude Code crashes!
27
- set +e
28
-
29
- # EMERGENCY KILL SWITCH: Disable all hooks if env variable set
30
- if [[ "${SPECWEAVE_DISABLE_HOOKS:-0}" == "1" ]]; then
31
- exit 0
32
- fi
33
-
34
- # Find project root
35
- find_project_root() {
36
- local dir="$PWD"
37
- while [[ "$dir" != "/" ]]; do
38
- if [[ -d "$dir/.specweave" ]]; then
39
- echo "$dir"
40
- return 0
41
- fi
42
- dir=$(dirname "$dir")
43
- done
44
- echo "$PWD"
45
- }
46
-
47
- PROJECT_ROOT=$(find_project_root)
48
- STATE_DIR="$PROJECT_ROOT/.specweave/state"
49
- LOGS_DIR="$PROJECT_ROOT/.specweave/logs"
50
- DEBUG_LOG="$LOGS_DIR/hooks-debug.log"
51
- PENDING_FILE="$STATE_DIR/.pending-status-update"
52
- METRICS_FILE="$STATE_DIR/hook-metrics.jsonl"
53
-
54
- # Ensure directories exist
55
- mkdir -p "$STATE_DIR" "$LOGS_DIR" 2>/dev/null || true
56
-
57
- # ============================================================================
58
- # TIER 2: Extract File Path from Tool Arguments
59
- # ============================================================================
60
- # PreToolUse should have access to tool arguments BEFORE execution
61
- # Try multiple methods to extract file_path
62
-
63
- FILE_PATH=""
64
-
65
- # Method 1: TOOL_USE_ARGS environment variable (primary for PreToolUse)
66
- if [[ -n "${TOOL_USE_ARGS:-}" ]]; then
67
- # Try to parse JSON with jq if available
68
- if command -v jq &> /dev/null; then
69
- FILE_PATH=$(echo "$TOOL_USE_ARGS" | jq -r '.file_path // empty' 2>/dev/null || echo "")
70
- fi
71
-
72
- # Fallback: Regex extraction if jq not available or failed
73
- if [[ -z "$FILE_PATH" ]]; then
74
- FILE_PATH=$(echo "$TOOL_USE_ARGS" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)".*/\1/' || echo "")
75
- fi
76
- fi
77
-
78
- # Method 2: TOOL_USE_CONTENT (fallback)
79
- if [[ -z "$FILE_PATH" ]] && [[ -n "${TOOL_USE_CONTENT:-}" ]]; then
80
- FILE_PATH="$TOOL_USE_CONTENT"
81
- fi
82
-
83
- # Method 3: Parse from stdin (last resort - experimental)
84
- if [[ -z "$FILE_PATH" ]] && [[ ! -t 0 ]]; then
85
- # Read stdin and try to extract file_path
86
- STDIN_DATA=$(cat 2>/dev/null || echo "")
87
- if [[ -n "$STDIN_DATA" ]] && command -v jq &> /dev/null; then
88
- FILE_PATH=$(echo "$STDIN_DATA" | jq -r '.file_path // empty' 2>/dev/null || echo "")
89
- fi
90
- fi
91
-
92
- # ============================================================================
93
- # TIER 2: Signal Detection and Validation
94
- # ============================================================================
95
-
96
- # Log what we detected (for debugging PreToolUse effectiveness)
97
- if [[ -n "$FILE_PATH" ]]; then
98
- echo "[$(date)] pre-edit-spec: Detected file_path: $FILE_PATH" >> "$DEBUG_LOG" 2>/dev/null || true
99
- else
100
- echo "[$(date)] pre-edit-spec: No file_path detected (will fall back to Tier 1)" >> "$DEBUG_LOG" 2>/dev/null || true
101
- exit 0 # Let PostToolUse handle it with mtime fallback
102
- fi
103
-
104
- # Check if this is a spec.md or tasks.md file in increments folder
105
- IS_SPEC_FILE=false
106
- if [[ "$FILE_PATH" == *"/spec.md" ]] || [[ "$FILE_PATH" == *"/tasks.md" ]]; then
107
- if [[ "$FILE_PATH" == *"/.specweave/increments/"* ]]; then
108
- # Exclude archived increments
109
- if [[ "$FILE_PATH" != *"/_archive/"* ]]; then
110
- IS_SPEC_FILE=true
111
- fi
112
- fi
113
- fi
114
-
115
- # If not a spec/tasks file, exit silently (no signal to PostToolUse)
116
- if [[ "$IS_SPEC_FILE" != "true" ]]; then
117
- echo "[$(date)] pre-edit-spec: Not a spec/tasks file - no signal" >> "$DEBUG_LOG" 2>/dev/null || true
118
- exit 0
119
- fi
120
-
121
- # ============================================================================
122
- # TIER 2: Write Signal for PostToolUse Hook
123
- # ============================================================================
124
-
125
- # Write file path to pending file for PostToolUse to consume
126
- echo "$FILE_PATH" > "$PENDING_FILE" 2>/dev/null || true
127
-
128
- echo "[$(date)] pre-edit-spec: Signaled PostToolUse for: $FILE_PATH" >> "$DEBUG_LOG" 2>/dev/null || true
129
-
130
- # ============================================================================
131
- # TIER 2: Metrics Collection
132
- # ============================================================================
133
-
134
- # Record metrics (JSONL format - one JSON object per line)
135
- TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
136
- METRIC_ENTRY="{\"timestamp\":\"$TIMESTAMP\",\"hook\":\"pre-edit-spec\",\"event\":\"file_detected\",\"file_path\":\"$FILE_PATH\",\"method\":\"TOOL_USE_ARGS\"}"
137
-
138
- # Append to metrics file (JSONL)
139
- echo "$METRIC_ENTRY" >> "$METRICS_FILE" 2>/dev/null || true
140
-
141
- # Log rotation for metrics (keep last 1000 entries)
142
- if [[ -f "$METRICS_FILE" ]]; then
143
- LINE_COUNT=$(wc -l < "$METRICS_FILE" 2>/dev/null || echo 0)
144
- if (( LINE_COUNT > 1000 )); then
145
- tail -1000 "$METRICS_FILE" > "$METRICS_FILE.tmp" 2>/dev/null || true
146
- mv "$METRICS_FILE.tmp" "$METRICS_FILE" 2>/dev/null || true
147
- fi
148
- fi
149
-
150
- # ALWAYS exit 0 - NEVER let hook errors crash Claude Code
151
- exit 0
@@ -1,151 +0,0 @@
1
- #!/bin/bash
2
- #
3
- # Pre-Write Hook: Capture File Path BEFORE Write Executes (Tier 2)
4
- #
5
- # Purpose: Detect which file will be written BEFORE the Write tool runs
6
- # Strategy: PreToolUse has better access to tool arguments than PostToolUse
7
- #
8
- # TIER 2 COORDINATION:
9
- # 1. Extract file_path from TOOL_USE_ARGS (more reliable in PreToolUse)
10
- # 2. If it's spec.md/tasks.md in increments folder, signal PostToolUse hook
11
- # 3. Write file path to .pending-status-update for PostToolUse to consume
12
- #
13
- # This eliminates the need for mtime-based fallback detection (Tier 1)
14
- # and reduces false positives to near zero.
15
- #
16
- # Architecture:
17
- # PreToolUse:Write → pre-write-spec.sh (this file)
18
- # ↓ writes to
19
- # .specweave/state/.pending-status-update
20
- # ↓ read by
21
- # PostToolUse:Write → post-write-spec.sh
22
- #
23
- # Version: v0.24.3 (EMERGENCY FIXES)
24
- # Date: 2025-11-22
25
-
26
- # EMERGENCY FIX: Remove set -e - it causes Claude Code crashes!
27
- set +e
28
-
29
- # EMERGENCY KILL SWITCH: Disable all hooks if env variable set
30
- if [[ "${SPECWEAVE_DISABLE_HOOKS:-0}" == "1" ]]; then
31
- exit 0
32
- fi
33
-
34
- # Find project root
35
- find_project_root() {
36
- local dir="$PWD"
37
- while [[ "$dir" != "/" ]]; do
38
- if [[ -d "$dir/.specweave" ]]; then
39
- echo "$dir"
40
- return 0
41
- fi
42
- dir=$(dirname "$dir")
43
- done
44
- echo "$PWD"
45
- }
46
-
47
- PROJECT_ROOT=$(find_project_root)
48
- STATE_DIR="$PROJECT_ROOT/.specweave/state"
49
- LOGS_DIR="$PROJECT_ROOT/.specweave/logs"
50
- DEBUG_LOG="$LOGS_DIR/hooks-debug.log"
51
- PENDING_FILE="$STATE_DIR/.pending-status-update"
52
- METRICS_FILE="$STATE_DIR/hook-metrics.jsonl"
53
-
54
- # Ensure directories exist
55
- mkdir -p "$STATE_DIR" "$LOGS_DIR" 2>/dev/null || true
56
-
57
- # ============================================================================
58
- # TIER 2: Extract File Path from Tool Arguments
59
- # ============================================================================
60
- # PreToolUse should have access to tool arguments BEFORE execution
61
- # Try multiple methods to extract file_path
62
-
63
- FILE_PATH=""
64
-
65
- # Method 1: TOOL_USE_ARGS environment variable (primary for PreToolUse)
66
- if [[ -n "${TOOL_USE_ARGS:-}" ]]; then
67
- # Try to parse JSON with jq if available
68
- if command -v jq &> /dev/null; then
69
- FILE_PATH=$(echo "$TOOL_USE_ARGS" | jq -r '.file_path // empty' 2>/dev/null || echo "")
70
- fi
71
-
72
- # Fallback: Regex extraction if jq not available or failed
73
- if [[ -z "$FILE_PATH" ]]; then
74
- FILE_PATH=$(echo "$TOOL_USE_ARGS" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)".*/\1/' || echo "")
75
- fi
76
- fi
77
-
78
- # Method 2: TOOL_USE_CONTENT (fallback)
79
- if [[ -z "$FILE_PATH" ]] && [[ -n "${TOOL_USE_CONTENT:-}" ]]; then
80
- FILE_PATH="$TOOL_USE_CONTENT"
81
- fi
82
-
83
- # Method 3: Parse from stdin (last resort - experimental)
84
- if [[ -z "$FILE_PATH" ]] && [[ ! -t 0 ]]; then
85
- # Read stdin and try to extract file_path
86
- STDIN_DATA=$(cat 2>/dev/null || echo "")
87
- if [[ -n "$STDIN_DATA" ]] && command -v jq &> /dev/null; then
88
- FILE_PATH=$(echo "$STDIN_DATA" | jq -r '.file_path // empty' 2>/dev/null || echo "")
89
- fi
90
- fi
91
-
92
- # ============================================================================
93
- # TIER 2: Signal Detection and Validation
94
- # ============================================================================
95
-
96
- # Log what we detected (for debugging PreToolUse effectiveness)
97
- if [[ -n "$FILE_PATH" ]]; then
98
- echo "[$(date)] pre-write-spec: Detected file_path: $FILE_PATH" >> "$DEBUG_LOG" 2>/dev/null || true
99
- else
100
- echo "[$(date)] pre-write-spec: No file_path detected (will fall back to Tier 1)" >> "$DEBUG_LOG" 2>/dev/null || true
101
- exit 0 # Let PostToolUse handle it with mtime fallback
102
- fi
103
-
104
- # Check if this is a spec.md or tasks.md file in increments folder
105
- IS_SPEC_FILE=false
106
- if [[ "$FILE_PATH" == *"/spec.md" ]] || [[ "$FILE_PATH" == *"/tasks.md" ]]; then
107
- if [[ "$FILE_PATH" == *"/.specweave/increments/"* ]]; then
108
- # Exclude archived increments
109
- if [[ "$FILE_PATH" != *"/_archive/"* ]]; then
110
- IS_SPEC_FILE=true
111
- fi
112
- fi
113
- fi
114
-
115
- # If not a spec/tasks file, exit silently (no signal to PostToolUse)
116
- if [[ "$IS_SPEC_FILE" != "true" ]]; then
117
- echo "[$(date)] pre-write-spec: Not a spec/tasks file - no signal" >> "$DEBUG_LOG" 2>/dev/null || true
118
- exit 0
119
- fi
120
-
121
- # ============================================================================
122
- # TIER 2: Write Signal for PostToolUse Hook
123
- # ============================================================================
124
-
125
- # Write file path to pending file for PostToolUse to consume
126
- echo "$FILE_PATH" > "$PENDING_FILE" 2>/dev/null || true
127
-
128
- echo "[$(date)] pre-write-spec: Signaled PostToolUse for: $FILE_PATH" >> "$DEBUG_LOG" 2>/dev/null || true
129
-
130
- # ============================================================================
131
- # TIER 2: Metrics Collection
132
- # ============================================================================
133
-
134
- # Record metrics (JSONL format - one JSON object per line)
135
- TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
136
- METRIC_ENTRY="{\"timestamp\":\"$TIMESTAMP\",\"hook\":\"pre-write-spec\",\"event\":\"file_detected\",\"file_path\":\"$FILE_PATH\",\"method\":\"TOOL_USE_ARGS\"}"
137
-
138
- # Append to metrics file (JSONL)
139
- echo "$METRIC_ENTRY" >> "$METRICS_FILE" 2>/dev/null || true
140
-
141
- # Log rotation for metrics (keep last 1000 entries)
142
- if [[ -f "$METRICS_FILE" ]]; then
143
- LINE_COUNT=$(wc -l < "$METRICS_FILE" 2>/dev/null || echo 0)
144
- if (( LINE_COUNT > 1000 )); then
145
- tail -1000 "$METRICS_FILE" > "$METRICS_FILE.tmp" 2>/dev/null || true
146
- mv "$METRICS_FILE.tmp" "$METRICS_FILE" 2>/dev/null || true
147
- fi
148
- fi
149
-
150
- # ALWAYS exit 0 - NEVER let hook errors crash Claude Code
151
- exit 0