specweave 1.0.29 → 1.0.31
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 +140 -1196
- package/bin/specweave.js +23 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +3 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +39 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/src/cli/commands/set-sync-target.d.ts +41 -0
- package/dist/src/cli/commands/set-sync-target.d.ts.map +1 -0
- package/dist/src/cli/commands/set-sync-target.js +126 -0
- package/dist/src/cli/commands/set-sync-target.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +5 -8
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
- package/dist/src/core/hooks/HookScanner.d.ts +32 -0
- package/dist/src/core/hooks/HookScanner.d.ts.map +1 -1
- package/dist/src/core/hooks/HookScanner.js +125 -1
- package/dist/src/core/hooks/HookScanner.js.map +1 -1
- package/dist/src/core/hooks/types.d.ts +10 -1
- package/dist/src/core/hooks/types.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.d.ts +67 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +93 -0
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/project/index.d.ts +21 -0
- package/dist/src/core/project/index.d.ts.map +1 -0
- package/dist/src/core/project/index.js +22 -0
- package/dist/src/core/project/index.js.map +1 -0
- package/dist/src/core/project/project-service.d.ts +122 -0
- package/dist/src/core/project/project-service.d.ts.map +1 -0
- package/dist/src/core/project/project-service.js +334 -0
- package/dist/src/core/project/project-service.js.map +1 -0
- package/dist/src/core/sync/external-tool-resolver.d.ts +171 -0
- package/dist/src/core/sync/external-tool-resolver.d.ts.map +1 -0
- package/dist/src/core/sync/external-tool-resolver.js +569 -0
- package/dist/src/core/sync/external-tool-resolver.js.map +1 -0
- package/dist/src/core/types/increment-metadata.d.ts +92 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/hooks/processor.d.ts +7 -3
- package/dist/src/hooks/processor.d.ts.map +1 -1
- package/dist/src/hooks/processor.js +11 -5
- package/dist/src/hooks/processor.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/commands/check-hooks.md +43 -0
- package/plugins/specweave/hooks/hooks.json +78 -0
- package/plugins/specweave/hooks/lib/circuit-breaker.sh +381 -0
- package/plugins/specweave/hooks/lib/logging.sh +231 -0
- package/plugins/specweave/hooks/lib/metrics.sh +347 -0
- package/plugins/specweave/hooks/lib/semaphore.sh +216 -0
- package/plugins/specweave/hooks/universal/fail-fast-wrapper.sh +156 -22
- package/plugins/specweave/hooks/v2/handlers/project-bridge-handler.sh +96 -0
- package/plugins/specweave/hooks/v2/queue/processor.sh +13 -5
- package/plugins/specweave/lib/hooks/project-bridge.js +76 -0
- package/plugins/specweave/lib/hooks/update-tasks-md.js +0 -0
- package/plugins/specweave/lib/hooks/us-completion-orchestrator.js +0 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +67 -1
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +93 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -1
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +92 -0
- package/plugins/specweave/scripts/hook-health.sh +441 -0
- package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-alternatives/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-backend/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-confluent/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-diagrams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-docs/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-figma/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-frontend/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/lib/github-client-v2.js +39 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +44 -0
- package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kubernetes/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ml/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-mobile/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-payments/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-plugin-dev/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-release/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-testing/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ui/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/hooks/docs-changed.sh +0 -87
- package/plugins/specweave/hooks/hooks.json.bak +0 -147
- package/plugins/specweave/hooks/human-input-required.sh +0 -83
- package/plugins/specweave/hooks/post-edit-write-consolidated.sh +0 -428
- package/plugins/specweave/hooks/post-first-increment.sh +0 -61
- package/plugins/specweave/hooks/post-increment-change.sh +0 -103
- package/plugins/specweave/hooks/post-increment-completion.sh +0 -513
- package/plugins/specweave/hooks/post-increment-planning.sh +0 -1204
- package/plugins/specweave/hooks/post-increment-status-change.sh +0 -243
- package/plugins/specweave/hooks/post-metadata-change.sh +0 -246
- package/plugins/specweave/hooks/post-spec-update.sh +0 -158
- package/plugins/specweave/hooks/post-task-completion.sh +0 -557
- package/plugins/specweave/hooks/post-task-edit.sh +0 -47
- package/plugins/specweave/hooks/post-user-story-complete.sh +0 -230
- package/plugins/specweave/hooks/pre-command-deduplication.sh +0 -68
- package/plugins/specweave/hooks/pre-edit-write-consolidated.sh +0 -225
- package/plugins/specweave/hooks/pre-implementation.sh +0 -75
- package/plugins/specweave/hooks/pre-increment-start.sh +0 -173
- package/plugins/specweave/hooks/pre-task-completion-edit.sh +0 -355
- package/plugins/specweave/hooks/pre-task-completion.sh +0 -269
- package/plugins/specweave/hooks/pre-tool-use.sh +0 -137
- package/plugins/specweave/hooks/session-start-reconcile.sh +0 -139
- package/plugins/specweave/hooks/shared/bulk-operation-detector.sh +0 -167
- package/plugins/specweave/hooks/test-pretooluse-env.sh +0 -72
- package/plugins/specweave/hooks/validate-increment-completion.sh +0 -113
- package/plugins/specweave/lib/hooks/consolidated-sync.js +0 -288
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-cost",
|
|
3
3
|
"description": "Cloud cost optimization and analysis for AWS, Azure, GCP, and serverless platforms. Provides cost analysis, optimization recommendations, pricing comparisons, budget alerts, and serverless cost modeling with 2024/2025 pricing.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Anton Abyzov",
|
|
7
7
|
"email": "anton.abyzov@gmail.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-diagrams",
|
|
3
3
|
"description": "Architecture diagram generation with Mermaid following C4 Model conventions. Creates C4 Context/Container/Component diagrams, sequence diagrams, ER diagrams, and deployment diagrams. SpecWeave-aware for HLD/LLD documentation.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-figma",
|
|
3
3
|
"description": "Comprehensive Figma design-to-code automation. Import Figma designs via API/MCP, convert components to React/Vue/Angular, extract design tokens, generate responsive layouts, and sync design systems. Focus on accelerating frontend development from Figma designs.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Anton Abyzov",
|
|
7
7
|
"email": "anton.abyzov@gmail.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-frontend",
|
|
3
3
|
"description": "Frontend development for React, Vue, and Angular projects. Includes Next.js 14+ App Router support, design system architecture (Atomic Design), and UI component best practices. Focus on modern frontend patterns and performance.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Anton Abyzov",
|
|
7
7
|
"email": "anton.abyzov@gmail.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-github",
|
|
3
3
|
"description": "GitHub Issues integration for SpecWeave increments. Bidirectional sync between SpecWeave increments and GitHub Issues. Automatically creates issues from increments, tracks progress, and closes issues on completion. Uses GitHub CLI (gh) for seamless integration.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -152,6 +152,7 @@ class GitHubClientV2 {
|
|
|
152
152
|
* - ✅ CORRECT: "[FS-XXX][US-YYY] Title" (User Story - STANDARD)
|
|
153
153
|
* - ✅ CORRECT: "[FS-XXX] Title" (Feature-level, rare)
|
|
154
154
|
* - ❌ WRONG: "[Increment XXXX] Title" (deprecated old format)
|
|
155
|
+
* - ❌ WRONG: "[0001] Title" (plain increment ID without FS- prefix)
|
|
155
156
|
* - ❌ WRONG: "[BUG] Title" (type prefixes are labels, not title)
|
|
156
157
|
* - ❌ WRONG: "[HOTFIX] Title" (type prefixes are labels, not title)
|
|
157
158
|
* - ❌ WRONG: "[FEATURE] Title" (type prefixes are labels, not title)
|
|
@@ -174,6 +175,32 @@ WHY: Correct data flow is: Increment \u2192 Living Docs \u2192 GitHub
|
|
|
174
175
|
FIX: Use /sw:sync-docs to generate living docs, then sync to GitHub.`
|
|
175
176
|
);
|
|
176
177
|
}
|
|
178
|
+
const plainIncrementPattern = /^\[\d{3,4}E?\]\s/;
|
|
179
|
+
if (plainIncrementPattern.test(title)) {
|
|
180
|
+
const match = title.match(/^\[(\d{3,4}E?)\]/);
|
|
181
|
+
const incrementId = match ? match[1] : "XXXX";
|
|
182
|
+
const num = parseInt(incrementId.replace("E", ""), 10);
|
|
183
|
+
const isExternal = incrementId.endsWith("E");
|
|
184
|
+
const properFsId = `FS-${String(num).padStart(3, "0")}${isExternal ? "E" : ""}`;
|
|
185
|
+
throw new Error(
|
|
186
|
+
`\u274C INVALID TITLE FORMAT: "${title}"
|
|
187
|
+
|
|
188
|
+
Plain increment IDs like [${incrementId}] are NOT allowed!
|
|
189
|
+
|
|
190
|
+
GitHub issues MUST use SpecWeave format:
|
|
191
|
+
\u2705 CORRECT: "[${properFsId}][US-001] Title" (User Story)
|
|
192
|
+
\u2705 CORRECT: "[${properFsId}] Title" (Feature-level)
|
|
193
|
+
\u274C WRONG: "[${incrementId}] Title" (missing FS- prefix)
|
|
194
|
+
|
|
195
|
+
WHY: FS-XXX format ensures traceability to Feature folders in living docs.
|
|
196
|
+
Plain increment IDs create duplicates and break the sync architecture.
|
|
197
|
+
|
|
198
|
+
FIX:
|
|
199
|
+
1. Use /sw:sync-progress to sync with proper format
|
|
200
|
+
2. Or use /sw-github:sync to create issues correctly
|
|
201
|
+
3. Ensure increment has proper spec.md with User Stories`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
177
204
|
const typePrefixPattern = /^\[(BUG|HOTFIX|FEATURE|DOCS|REFACTOR|CHORE|EXPERIMENT|Bug|Hotfix|Feature|Docs|Refactor|Chore|Experiment)\]/i;
|
|
178
205
|
if (typePrefixPattern.test(title)) {
|
|
179
206
|
const match = title.match(typePrefixPattern);
|
|
@@ -220,9 +247,21 @@ FIX:
|
|
|
220
247
|
}
|
|
221
248
|
/**
|
|
222
249
|
* Create epic issue (increment-level)
|
|
250
|
+
*
|
|
251
|
+
* CRITICAL: Includes duplicate detection to prevent creating duplicate issues
|
|
223
252
|
*/
|
|
224
253
|
async createEpicIssue(title, body, milestone, labels = []) {
|
|
225
254
|
this.validateIssueTitle(title);
|
|
255
|
+
const titlePatternMatch = title.match(/^\[FS-\d{3,}E?\](?:\[US-\d{3,}E?\])?/);
|
|
256
|
+
if (titlePatternMatch) {
|
|
257
|
+
const titlePattern = titlePatternMatch[0];
|
|
258
|
+
const existingIssue = await this.searchIssueByTitle(titlePattern, true);
|
|
259
|
+
if (existingIssue) {
|
|
260
|
+
console.log(`\u26A0\uFE0F Issue already exists: #${existingIssue.number} - "${existingIssue.title}"`);
|
|
261
|
+
console.log(` Returning existing issue instead of creating duplicate.`);
|
|
262
|
+
return existingIssue;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
226
265
|
const args = [
|
|
227
266
|
"issue",
|
|
228
267
|
"create",
|
|
@@ -214,6 +214,7 @@ export class GitHubClientV2 {
|
|
|
214
214
|
* - ✅ CORRECT: "[FS-XXX][US-YYY] Title" (User Story - STANDARD)
|
|
215
215
|
* - ✅ CORRECT: "[FS-XXX] Title" (Feature-level, rare)
|
|
216
216
|
* - ❌ WRONG: "[Increment XXXX] Title" (deprecated old format)
|
|
217
|
+
* - ❌ WRONG: "[0001] Title" (plain increment ID without FS- prefix)
|
|
217
218
|
* - ❌ WRONG: "[BUG] Title" (type prefixes are labels, not title)
|
|
218
219
|
* - ❌ WRONG: "[HOTFIX] Title" (type prefixes are labels, not title)
|
|
219
220
|
* - ❌ WRONG: "[FEATURE] Title" (type prefixes are labels, not title)
|
|
@@ -235,6 +236,32 @@ export class GitHubClientV2 {
|
|
|
235
236
|
);
|
|
236
237
|
}
|
|
237
238
|
|
|
239
|
+
// Check for plain increment ID format [0001] without FS- prefix (CRITICAL FIX v1.0.31)
|
|
240
|
+
// This catches issues like "[0001] Basic layout MVP" that should be "[FS-001][US-001] Basic layout MVP"
|
|
241
|
+
const plainIncrementPattern = /^\[\d{3,4}E?\]\s/;
|
|
242
|
+
if (plainIncrementPattern.test(title)) {
|
|
243
|
+
const match = title.match(/^\[(\d{3,4}E?)\]/);
|
|
244
|
+
const incrementId = match ? match[1] : 'XXXX';
|
|
245
|
+
// Derive proper FS-ID from the increment number
|
|
246
|
+
const num = parseInt(incrementId.replace('E', ''), 10);
|
|
247
|
+
const isExternal = incrementId.endsWith('E');
|
|
248
|
+
const properFsId = `FS-${String(num).padStart(3, '0')}${isExternal ? 'E' : ''}`;
|
|
249
|
+
throw new Error(
|
|
250
|
+
`❌ INVALID TITLE FORMAT: "${title}"\n\n` +
|
|
251
|
+
`Plain increment IDs like [${incrementId}] are NOT allowed!\n\n` +
|
|
252
|
+
`GitHub issues MUST use SpecWeave format:\n` +
|
|
253
|
+
` ✅ CORRECT: "[${properFsId}][US-001] Title" (User Story)\n` +
|
|
254
|
+
` ✅ CORRECT: "[${properFsId}] Title" (Feature-level)\n` +
|
|
255
|
+
` ❌ WRONG: "[${incrementId}] Title" (missing FS- prefix)\n\n` +
|
|
256
|
+
`WHY: FS-XXX format ensures traceability to Feature folders in living docs.\n` +
|
|
257
|
+
` Plain increment IDs create duplicates and break the sync architecture.\n\n` +
|
|
258
|
+
`FIX:\n` +
|
|
259
|
+
` 1. Use /sw:sync-progress to sync with proper format\n` +
|
|
260
|
+
` 2. Or use /sw-github:sync to create issues correctly\n` +
|
|
261
|
+
` 3. Ensure increment has proper spec.md with User Stories`
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
|
|
238
265
|
// Check for type-based prefixes (CRITICAL FIX for issue #749)
|
|
239
266
|
// These prefixes belong as LABELS, not in the issue title!
|
|
240
267
|
const typePrefixPattern = /^\[(BUG|HOTFIX|FEATURE|DOCS|REFACTOR|CHORE|EXPERIMENT|Bug|Hotfix|Feature|Docs|Refactor|Chore|Experiment)\]/i;
|
|
@@ -293,6 +320,8 @@ export class GitHubClientV2 {
|
|
|
293
320
|
|
|
294
321
|
/**
|
|
295
322
|
* Create epic issue (increment-level)
|
|
323
|
+
*
|
|
324
|
+
* CRITICAL: Includes duplicate detection to prevent creating duplicate issues
|
|
296
325
|
*/
|
|
297
326
|
async createEpicIssue(
|
|
298
327
|
title: string,
|
|
@@ -302,6 +331,21 @@ export class GitHubClientV2 {
|
|
|
302
331
|
): Promise<GitHubIssue> {
|
|
303
332
|
// Validate title format before creating
|
|
304
333
|
this.validateIssueTitle(title);
|
|
334
|
+
|
|
335
|
+
// DUPLICATE PREVENTION (v1.0.31): Check for existing issue with same title pattern
|
|
336
|
+
// Extract the [FS-XXX] or [FS-XXX][US-YYY] pattern to search for
|
|
337
|
+
const titlePatternMatch = title.match(/^\[FS-\d{3,}E?\](?:\[US-\d{3,}E?\])?/);
|
|
338
|
+
if (titlePatternMatch) {
|
|
339
|
+
const titlePattern = titlePatternMatch[0];
|
|
340
|
+
const existingIssue = await this.searchIssueByTitle(titlePattern, true);
|
|
341
|
+
if (existingIssue) {
|
|
342
|
+
// Return existing issue instead of creating duplicate
|
|
343
|
+
console.log(`⚠️ Issue already exists: #${existingIssue.number} - "${existingIssue.title}"`);
|
|
344
|
+
console.log(` Returning existing issue instead of creating duplicate.`);
|
|
345
|
+
return existingIssue;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
305
349
|
const args = [
|
|
306
350
|
'issue',
|
|
307
351
|
'create',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-infra",
|
|
3
3
|
"description": "Cloud infrastructure provisioning and monitoring. Includes Hetzner Cloud provisioning, Prometheus/Grafana setup, distributed tracing (Jaeger/Tempo), and SLO implementation. Focus on cost-effective, production-ready infrastructure.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-jira",
|
|
3
3
|
"description": "JIRA integration for SpecWeave increments. Bidirectional sync between SpecWeave increments and JIRA epics/stories. Automatically creates JIRA issues from increments, tracks progress, and updates status.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-kafka",
|
|
3
3
|
"description": "Apache Kafka event streaming integration with MCP servers, CLI tools (kcat), Terraform modules, and comprehensive observability stack",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-kafka-streams",
|
|
3
3
|
"description": "Kafka Streams library integration for SpecWeave - Stream processing with Java/Kotlin, topology patterns, state stores, windowing, joins, and testing frameworks",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-k8s",
|
|
3
3
|
"description": "Kubernetes deployment and management for SpecWeave projects. Generate K8s manifests, Helm charts, and GitOps workflows. Includes security policies (NetworkPolicy, RBAC) and best practices for production deployments.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-ml",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Complete ML/AI workflow integration for SpecWeave - from experiment tracking to production deployment. Includes 13 comprehensive skills covering the full ML lifecycle: pipeline orchestration, experiment tracking, model evaluation, explainability, deployment, feature engineering, AutoML, computer vision, NLP, time series forecasting, anomaly detection, data visualization, and model registry.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Anton Abyzov",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-mobile",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Comprehensive React Native and Expo development support for mobile app development. Includes environment setup, debugging, performance optimization, native modules, and testing strategies.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-n8n",
|
|
3
3
|
"description": "n8n workflow automation integration with Kafka - Event-driven workflows, Kafka triggers, producers, consumers, and workflow patterns for no-code/low-code event processing",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-payments",
|
|
3
3
|
"description": "Payment processing integration for Stripe, PayPal, and billing automation. Includes checkout flows, subscription lifecycle management, PCI DSS compliance guidance, and recurring billing. Focus on production-ready payment systems.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-plugin-dev",
|
|
3
3
|
"description": "Claude Code plugin and skill development toolkit. Plugin creation, testing, publishing. Skill creation, validation, packaging. Agent development, CLI command integration, and marketplace publishing.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Anton Abyzov",
|
|
7
7
|
"email": "anton.abyzov@gmail.com"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-release",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Comprehensive release management for single-repo, multi-repo, and monorepo architectures. Detects existing release strategies, aligns versions across repositories, manages Release Candidates (RC), and integrates with CI/CD workflows. Supports semantic versioning, coordinated releases, and brownfield strategy detection.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Anton Abyzov",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw-testing",
|
|
3
3
|
"description": "Comprehensive testing tools for modern web applications. Includes Playwright E2E testing, Vitest unit testing, test generation, and coverage analysis. Focus on test-driven development and quality assurance.",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Anton Abyzov",
|
|
7
7
|
"email": "anton.abyzov@gmail.com"
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# SpecWeave Docs-Changed Hook
|
|
4
|
-
# Runs after file changes are detected
|
|
5
|
-
# Detects if documentation was changed during implementation
|
|
6
|
-
# Triggers review workflow if needed
|
|
7
|
-
|
|
8
|
-
set +e # EMERGENCY FIX: Prevents Claude Code crashes
|
|
9
|
-
|
|
10
|
-
# EMERGENCY KILL SWITCH
|
|
11
|
-
if [[ "${SPECWEAVE_DISABLE_HOOKS:-0}" == "1" ]]; then
|
|
12
|
-
exit 0
|
|
13
|
-
fi
|
|
14
|
-
|
|
15
|
-
# Find project root by searching upward for .specweave/ directory
|
|
16
|
-
# Works regardless of where hook is installed (source or .claude/hooks/)
|
|
17
|
-
find_project_root() {
|
|
18
|
-
local dir="$1"
|
|
19
|
-
while [ "$dir" != "/" ]; do
|
|
20
|
-
if [ -d "$dir/.specweave" ]; then
|
|
21
|
-
echo "$dir"
|
|
22
|
-
return 0
|
|
23
|
-
fi
|
|
24
|
-
dir="$(dirname "$dir")"
|
|
25
|
-
done
|
|
26
|
-
# Fallback: try current directory
|
|
27
|
-
if [ -d "$(pwd)/.specweave" ]; then
|
|
28
|
-
pwd
|
|
29
|
-
else
|
|
30
|
-
echo "$(pwd)"
|
|
31
|
-
fi
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
PROJECT_ROOT="$(find_project_root "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")"
|
|
35
|
-
cd "$PROJECT_ROOT"
|
|
36
|
-
|
|
37
|
-
# Colors
|
|
38
|
-
RED='\033[0;31m'
|
|
39
|
-
YELLOW='\033[1;33m'
|
|
40
|
-
NC='\033[0m'
|
|
41
|
-
|
|
42
|
-
# Get changed files (git)
|
|
43
|
-
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
|
44
|
-
# Not a git repository, skip
|
|
45
|
-
exit 0
|
|
46
|
-
fi
|
|
47
|
-
|
|
48
|
-
CHANGED_FILES=$(git diff --name-only HEAD 2>/dev/null || echo "")
|
|
49
|
-
|
|
50
|
-
if [ -z "$CHANGED_FILES" ]; then
|
|
51
|
-
# No changes
|
|
52
|
-
exit 0
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
# Check if any documentation files changed
|
|
56
|
-
DOC_CHANGES=$(echo "$CHANGED_FILES" | grep -E '\.specweave/(docs|increments/.*/.*\.md)' || true)
|
|
57
|
-
|
|
58
|
-
if [ -n "$DOC_CHANGES" ]; then
|
|
59
|
-
echo -e "${RED}⚠️ Documentation changed during implementation${NC}"
|
|
60
|
-
echo ""
|
|
61
|
-
echo "📋 Files changed:"
|
|
62
|
-
echo "$DOC_CHANGES" | sed 's/^/ /'
|
|
63
|
-
echo ""
|
|
64
|
-
echo -e "${YELLOW}🔔 Recommended actions:${NC}"
|
|
65
|
-
echo " 1. Review documentation changes"
|
|
66
|
-
echo " 2. Update tasks.md if architecture changed"
|
|
67
|
-
echo " 3. Type /review-docs to see full impact"
|
|
68
|
-
echo ""
|
|
69
|
-
|
|
70
|
-
# Play notification sound
|
|
71
|
-
case "$(uname -s)" in
|
|
72
|
-
Darwin)
|
|
73
|
-
afplay /System/Library/Sounds/Ping.aiff 2>/dev/null &
|
|
74
|
-
;;
|
|
75
|
-
Linux)
|
|
76
|
-
paplay /usr/share/sounds/freedesktop/stereo/dialog-warning.oga 2>/dev/null || true
|
|
77
|
-
;;
|
|
78
|
-
esac
|
|
79
|
-
|
|
80
|
-
# Log to hooks log
|
|
81
|
-
LOGS_DIR=".specweave/logs"
|
|
82
|
-
mkdir -p "$LOGS_DIR"
|
|
83
|
-
echo "[$(date)] Documentation changed: $DOC_CHANGES" >> "$LOGS_DIR/hooks.log"
|
|
84
|
-
fi
|
|
85
|
-
|
|
86
|
-
# ALWAYS exit 0 - NEVER let hook errors crash Claude Code
|
|
87
|
-
exit 0
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"hooks": {
|
|
3
|
-
"SessionStart": [
|
|
4
|
-
{
|
|
5
|
-
"hooks": [
|
|
6
|
-
{
|
|
7
|
-
"type": "command",
|
|
8
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/v2/dispatchers/session-start.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"continue\\\":true}\")'"
|
|
9
|
-
}
|
|
10
|
-
]
|
|
11
|
-
}
|
|
12
|
-
],
|
|
13
|
-
"UserPromptSubmit": [
|
|
14
|
-
{
|
|
15
|
-
"hooks": [
|
|
16
|
-
{
|
|
17
|
-
"type": "command",
|
|
18
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/user-prompt-submit.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"approve\\\"}\")'"
|
|
19
|
-
}
|
|
20
|
-
]
|
|
21
|
-
}
|
|
22
|
-
],
|
|
23
|
-
"PreToolUse": [
|
|
24
|
-
{
|
|
25
|
-
"matcher": "Bash",
|
|
26
|
-
"hooks": [
|
|
27
|
-
{
|
|
28
|
-
"type": "command",
|
|
29
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/bash-file-guard.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
30
|
-
}
|
|
31
|
-
]
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"matcher": "Edit|Write",
|
|
35
|
-
"matcher_content": "metadata\\.json.*completed",
|
|
36
|
-
"hooks": [
|
|
37
|
-
{
|
|
38
|
-
"type": "command",
|
|
39
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/completion-guard.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
40
|
-
}
|
|
41
|
-
]
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"matcher": "Write",
|
|
45
|
-
"matcher_content": "\\.specweave/increments/\\d{3,4}E?-[^/]+/spec\\.md",
|
|
46
|
-
"hooks": [
|
|
47
|
-
{
|
|
48
|
-
"type": "command",
|
|
49
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/metadata-json-guard.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
50
|
-
}
|
|
51
|
-
]
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"matcher": "Write",
|
|
55
|
-
"matcher_content": "\\.specweave/increments/\\d{3,4}E?-[^/]+/spec\\.md",
|
|
56
|
-
"hooks": [
|
|
57
|
-
{
|
|
58
|
-
"type": "command",
|
|
59
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/per-us-project-validator.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
60
|
-
}
|
|
61
|
-
]
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"matcher": "Write",
|
|
65
|
-
"matcher_content": "\\.specweave/increments/\\d{3,4}E?-[^/]+/spec\\.md",
|
|
66
|
-
"hooks": [
|
|
67
|
-
{
|
|
68
|
-
"type": "command",
|
|
69
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/spec-project-validator.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
70
|
-
}
|
|
71
|
-
]
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
"matcher": "Write|Edit",
|
|
75
|
-
"matcher_content": "\\.specweave/docs/internal/specs/_features/",
|
|
76
|
-
"hooks": [
|
|
77
|
-
{
|
|
78
|
-
"type": "command",
|
|
79
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/features-folder-guard.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
80
|
-
}
|
|
81
|
-
]
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"matcher": "Write",
|
|
85
|
-
"matcher_content": "\\.specweave/increments/\\d{3,4}E?-[^/]+/",
|
|
86
|
-
"hooks": [
|
|
87
|
-
{
|
|
88
|
-
"type": "command",
|
|
89
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/increment-duplicate-guard.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
90
|
-
}
|
|
91
|
-
]
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"matcher": "Write",
|
|
95
|
-
"matcher_content": "\\.specweave/increments/\\d{3,4}E?-[^/]+/[^/]+$",
|
|
96
|
-
"hooks": [
|
|
97
|
-
{
|
|
98
|
-
"type": "command",
|
|
99
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/v2/guards/increment-root-guard.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
100
|
-
}
|
|
101
|
-
]
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
"matcher": "Write",
|
|
105
|
-
"matcher_content": "\\.specweave/docs/internal/specs/[^/]+/",
|
|
106
|
-
"hooks": [
|
|
107
|
-
{
|
|
108
|
-
"type": "command",
|
|
109
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/project-folder-guard.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
110
|
-
}
|
|
111
|
-
]
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
"matcher": "Edit|Write",
|
|
115
|
-
"matcher_content": "/src/.*\\.ts$",
|
|
116
|
-
"hooks": [
|
|
117
|
-
{
|
|
118
|
-
"type": "command",
|
|
119
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/config-env-separator.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
120
|
-
}
|
|
121
|
-
]
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
"matcher": "Edit|Write",
|
|
125
|
-
"matcher_content": "plugins/specweave-github/lib/.*issue.*builder\\.ts$",
|
|
126
|
-
"hooks": [
|
|
127
|
-
{
|
|
128
|
-
"type": "command",
|
|
129
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/github-metadata-guard.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"decision\\\":\\\"allow\\\"}\")'"
|
|
130
|
-
}
|
|
131
|
-
]
|
|
132
|
-
}
|
|
133
|
-
],
|
|
134
|
-
"PostToolUse": [
|
|
135
|
-
{
|
|
136
|
-
"matcher": "Edit|Write",
|
|
137
|
-
"matcher_content": "\\.specweave/increments/",
|
|
138
|
-
"hooks": [
|
|
139
|
-
{
|
|
140
|
-
"type": "command",
|
|
141
|
-
"command": "bash -c 'W=\"${CLAUDE_PLUGIN_ROOT}/hooks/universal/fail-fast-wrapper.sh\"; S=\"${CLAUDE_PLUGIN_ROOT}/hooks/v2/dispatchers/post-tool-use.sh\"; [[ -x \"$W\" ]] && exec \"$W\" \"$S\" || (cat >/dev/null && printf \"{\\\"continue\\\":true}\")'"
|
|
142
|
-
}
|
|
143
|
-
]
|
|
144
|
-
}
|
|
145
|
-
]
|
|
146
|
-
}
|
|
147
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# SpecWeave Human-Input-Required Hook
|
|
4
|
-
# Runs when Claude needs clarification or approval
|
|
5
|
-
#
|
|
6
|
-
# Actions:
|
|
7
|
-
# 1. Play notification sound (Ping.aiff)
|
|
8
|
-
# 2. Log the question/requirement
|
|
9
|
-
# 3. Record in current increment's work log (if applicable)
|
|
10
|
-
|
|
11
|
-
set +e # EMERGENCY FIX: Prevents Claude Code crashes
|
|
12
|
-
|
|
13
|
-
# EMERGENCY KILL SWITCH
|
|
14
|
-
if [[ "${SPECWEAVE_DISABLE_HOOKS:-0}" == "1" ]]; then
|
|
15
|
-
exit 0
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
# Find project root by searching upward for .specweave/ directory
|
|
19
|
-
# Works regardless of where hook is installed (source or .claude/hooks/)
|
|
20
|
-
find_project_root() {
|
|
21
|
-
local dir="$1"
|
|
22
|
-
while [ "$dir" != "/" ]; do
|
|
23
|
-
if [ -d "$dir/.specweave" ]; then
|
|
24
|
-
echo "$dir"
|
|
25
|
-
return 0
|
|
26
|
-
fi
|
|
27
|
-
dir="$(dirname "$dir")"
|
|
28
|
-
done
|
|
29
|
-
# Fallback: try current directory
|
|
30
|
-
if [ -d "$(pwd)/.specweave" ]; then
|
|
31
|
-
pwd
|
|
32
|
-
else
|
|
33
|
-
echo "$(pwd)"
|
|
34
|
-
fi
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
PROJECT_ROOT="$(find_project_root "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")"
|
|
38
|
-
cd "$PROJECT_ROOT"
|
|
39
|
-
|
|
40
|
-
# Get question/requirement (passed as argument or default)
|
|
41
|
-
QUESTION="${1:-User input required}"
|
|
42
|
-
|
|
43
|
-
echo "❓ Human input required"
|
|
44
|
-
|
|
45
|
-
# 1. Play notification sound (cross-platform)
|
|
46
|
-
play_sound() {
|
|
47
|
-
case "$(uname -s)" in
|
|
48
|
-
Darwin)
|
|
49
|
-
afplay /System/Library/Sounds/Ping.aiff 2>/dev/null &
|
|
50
|
-
;;
|
|
51
|
-
Linux)
|
|
52
|
-
paplay /usr/share/sounds/freedesktop/stereo/dialog-question.oga 2>/dev/null || \
|
|
53
|
-
aplay /usr/share/sounds/alsa/Side_Left.wav 2>/dev/null || true
|
|
54
|
-
;;
|
|
55
|
-
MINGW*|MSYS*|CYGWIN*)
|
|
56
|
-
powershell -c "(New-Object Media.SoundPlayer 'C:\Windows\Media\notify.wav').PlaySync();" 2>/dev/null || true
|
|
57
|
-
;;
|
|
58
|
-
esac
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
play_sound &
|
|
62
|
-
|
|
63
|
-
# 2. Log to main hooks log
|
|
64
|
-
LOGS_DIR=".specweave/logs"
|
|
65
|
-
mkdir -p "$LOGS_DIR"
|
|
66
|
-
echo "[$(date)] Human input required: $QUESTION" >> "$LOGS_DIR/hooks.log"
|
|
67
|
-
|
|
68
|
-
# 3. Log to current work context (if exists)
|
|
69
|
-
CURRENT_WORK=$(find .specweave/work -maxdepth 1 -type d -name "current-*" | head -1 || true)
|
|
70
|
-
|
|
71
|
-
if [ -n "$CURRENT_WORK" ] && [ -d "$CURRENT_WORK" ]; then
|
|
72
|
-
echo "" >> "$CURRENT_WORK/notes.md"
|
|
73
|
-
echo "## Input Required ($(date +%Y-%m-%d\ %H:%M))" >> "$CURRENT_WORK/notes.md"
|
|
74
|
-
echo "" >> "$CURRENT_WORK/notes.md"
|
|
75
|
-
echo "$QUESTION" >> "$CURRENT_WORK/notes.md"
|
|
76
|
-
echo "" >> "$CURRENT_WORK/notes.md"
|
|
77
|
-
echo "📝 Logged to $CURRENT_WORK/notes.md"
|
|
78
|
-
fi
|
|
79
|
-
|
|
80
|
-
echo "✅ Hook complete"
|
|
81
|
-
|
|
82
|
-
# ALWAYS exit 0 - NEVER let hook errors crash Claude Code
|
|
83
|
-
exit 0
|