specweave 0.1.9 → 0.3.1
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 +600 -0
- package/README.md +263 -81
- package/bin/install-all.sh +1 -1
- package/bin/install-commands.sh +3 -3
- package/bin/specweave.js +39 -9
- package/dist/adapters/adapter-base.d.ts +1 -1
- package/dist/adapters/adapter-base.d.ts.map +1 -1
- package/dist/adapters/adapter-base.js +6 -41
- package/dist/adapters/adapter-base.js.map +1 -1
- package/dist/adapters/adapter-interface.js +1 -2
- package/dist/adapters/adapter-interface.js.map +1 -1
- package/dist/adapters/adapter-loader.d.ts +86 -0
- package/dist/adapters/adapter-loader.d.ts.map +1 -0
- package/dist/adapters/adapter-loader.js +216 -0
- package/dist/adapters/adapter-loader.js.map +1 -0
- package/dist/adapters/agents-md-generator.d.ts +48 -0
- package/dist/adapters/agents-md-generator.d.ts.map +1 -0
- package/dist/adapters/agents-md-generator.js +132 -0
- package/dist/adapters/agents-md-generator.js.map +1 -0
- package/dist/adapters/claude/adapter.d.ts +2 -2
- package/dist/adapters/claude/adapter.d.ts.map +1 -1
- package/dist/adapters/claude/adapter.js +5 -42
- package/dist/adapters/claude/adapter.js.map +1 -1
- package/dist/adapters/claude-md-generator.d.ts +78 -0
- package/dist/adapters/claude-md-generator.d.ts.map +1 -0
- package/dist/adapters/claude-md-generator.js +246 -0
- package/dist/adapters/claude-md-generator.js.map +1 -0
- package/dist/adapters/codex/adapter.d.ts +50 -0
- package/dist/adapters/codex/adapter.d.ts.map +1 -0
- package/dist/adapters/codex/adapter.js +316 -0
- package/dist/adapters/codex/adapter.js.map +1 -0
- package/dist/adapters/copilot/adapter.d.ts +10 -9
- package/dist/adapters/copilot/adapter.d.ts.map +1 -1
- package/dist/adapters/copilot/adapter.js +35 -100
- package/dist/adapters/copilot/adapter.js.map +1 -1
- package/dist/adapters/cursor/adapter.d.ts +8 -6
- package/dist/adapters/cursor/adapter.d.ts.map +1 -1
- package/dist/adapters/cursor/adapter.js +47 -130
- package/dist/adapters/cursor/adapter.js.map +1 -1
- package/dist/adapters/doc-generator.d.ts +69 -0
- package/dist/adapters/doc-generator.d.ts.map +1 -0
- package/dist/adapters/doc-generator.js +247 -0
- package/dist/adapters/doc-generator.js.map +1 -0
- package/dist/adapters/gemini/adapter.d.ts +50 -0
- package/dist/adapters/gemini/adapter.d.ts.map +1 -0
- package/dist/adapters/gemini/adapter.js +281 -0
- package/dist/adapters/gemini/adapter.js.map +1 -0
- package/dist/adapters/generic/adapter.d.ts +7 -4
- package/dist/adapters/generic/adapter.d.ts.map +1 -1
- package/dist/adapters/generic/adapter.js +60 -59
- package/dist/adapters/generic/adapter.js.map +1 -1
- package/dist/cli/commands/init.d.ts +3 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +327 -177
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +22 -58
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/list.d.ts.map +1 -1
- package/dist/cli/commands/list.js +27 -64
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/core/credentials-manager.d.ts +90 -0
- package/dist/core/credentials-manager.d.ts.map +1 -0
- package/dist/core/credentials-manager.js +271 -0
- package/dist/core/credentials-manager.js.map +1 -0
- package/dist/core/project-structure-detector.d.ts +92 -0
- package/dist/core/project-structure-detector.d.ts.map +1 -0
- package/dist/core/project-structure-detector.js +289 -0
- package/dist/core/project-structure-detector.js.map +1 -0
- package/dist/core/rfc-generator-v2.d.ts +149 -0
- package/dist/core/rfc-generator-v2.d.ts.map +1 -0
- package/dist/core/rfc-generator-v2.js +399 -0
- package/dist/core/rfc-generator-v2.js.map +1 -0
- package/dist/core/rfc-generator.d.ts +147 -0
- package/dist/core/rfc-generator.d.ts.map +1 -0
- package/dist/core/rfc-generator.js +434 -0
- package/dist/core/rfc-generator.js.map +1 -0
- package/dist/integrations/ado/ado-client.d.ts +123 -0
- package/dist/integrations/ado/ado-client.d.ts.map +1 -0
- package/dist/integrations/ado/ado-client.js +398 -0
- package/dist/integrations/ado/ado-client.js.map +1 -0
- package/dist/integrations/jira/jira-client.d.ts +139 -0
- package/dist/integrations/jira/jira-client.d.ts.map +1 -0
- package/dist/integrations/jira/jira-client.js +386 -0
- package/dist/integrations/jira/jira-client.js.map +1 -0
- package/dist/integrations/jira/jira-incremental-mapper.d.ts +75 -0
- package/dist/integrations/jira/jira-incremental-mapper.d.ts.map +1 -0
- package/dist/integrations/jira/jira-incremental-mapper.js +474 -0
- package/dist/integrations/jira/jira-incremental-mapper.js.map +1 -0
- package/dist/integrations/jira/jira-mapper.d.ts +105 -0
- package/dist/integrations/jira/jira-mapper.d.ts.map +1 -0
- package/dist/integrations/jira/jira-mapper.js +494 -0
- package/dist/integrations/jira/jira-mapper.js.map +1 -0
- package/dist/testing/test-generator.d.ts +117 -0
- package/dist/testing/test-generator.d.ts.map +1 -0
- package/dist/testing/test-generator.js +370 -0
- package/dist/testing/test-generator.js.map +1 -0
- package/dist/utils/auto-install.d.ts +3 -0
- package/dist/utils/auto-install.d.ts.map +1 -1
- package/dist/utils/auto-install.js +16 -82
- package/dist/utils/auto-install.js.map +1 -1
- package/dist/utils/esm-helpers.d.ts +50 -0
- package/dist/utils/esm-helpers.d.ts.map +1 -0
- package/dist/utils/esm-helpers.js +57 -0
- package/dist/utils/esm-helpers.js.map +1 -0
- package/package.json +16 -7
- package/src/adapters/README.md +1 -2
- package/src/adapters/adapter-base.ts +6 -3
- package/src/adapters/adapter-loader.ts +261 -0
- package/src/adapters/agents-md-generator.ts +162 -0
- package/src/adapters/claude/README.md +6 -14
- package/src/adapters/claude/adapter.ts +4 -4
- package/src/adapters/claude-md-generator.ts +311 -0
- package/src/adapters/codex/README.md +105 -0
- package/src/adapters/codex/adapter.ts +333 -0
- package/src/adapters/copilot/adapter.ts +36 -65
- package/src/adapters/cursor/README.md +0 -2
- package/src/adapters/cursor/adapter.ts +46 -92
- package/src/adapters/doc-generator.ts +331 -0
- package/src/adapters/gemini/README.md +97 -0
- package/src/adapters/gemini/adapter.ts +298 -0
- package/src/adapters/generic/adapter.ts +61 -57
- package/src/adapters/registry.yaml +86 -25
- package/src/agents/devops/AGENT.md +16 -18
- package/src/agents/docs-writer/AGENT.md +2 -2
- package/src/agents/pm/AGENT.md +1 -50
- package/src/commands/README.md +134 -111
- package/src/commands/{build.md → specweave.do.md} +141 -69
- package/src/commands/{done.md → specweave.done.md} +3 -3
- package/src/commands/{inc.md → specweave.inc.md} +4 -4
- package/src/commands/{increment.md → specweave.increment.md} +143 -76
- package/src/commands/specweave.md +430 -0
- package/src/commands/specweave.next.md +495 -0
- package/src/commands/{progress.md → specweave.progress.md} +12 -12
- package/src/commands/specweave.sync-docs.md +665 -0
- package/src/commands/specweave.sync-github.md +269 -0
- package/src/commands/specweave.sync-jira.md +197 -0
- package/src/commands/{validate.md → specweave.validate.md} +4 -4
- package/src/hooks/README.md +19 -29
- package/src/hooks/post-task-completion.sh +25 -30
- package/src/skills/ado-sync/README.md +1 -36
- package/src/skills/bmad-method-expert/SKILL.md +1 -3
- package/src/skills/brownfield-analyzer/SKILL.md +429 -23
- package/src/skills/brownfield-onboarder/SKILL.md +221 -8
- package/src/skills/context-loader/SKILL.md +239 -617
- package/src/skills/context-optimizer/SKILL.md +0 -30
- package/src/skills/github-sync/SKILL.md +1 -19
- package/src/skills/increment-planner/SKILL.md +64 -18
- package/src/skills/increment-quality-judge/SKILL.md +1 -36
- package/src/skills/jira-sync/README.md +1 -38
- package/src/skills/role-orchestrator/README.md +1 -22
- package/src/skills/role-orchestrator/SKILL.md +1 -59
- package/src/skills/skill-router/SKILL.md +0 -18
- package/src/skills/spec-kit-expert/SKILL.md +1 -3
- package/src/skills/specweave-detector/SKILL.md +225 -275
- package/src/skills/task-builder/README.md +1 -7
- package/src/templates/AGENTS.md.template +334 -0
- package/src/templates/CLAUDE.md.template +131 -298
- package/src/templates/README.md.template +115 -23
- package/src/templates/environments/minimal/README.md +0 -1
- package/INSTALL.md +0 -848
- package/SPECWEAVE.md +0 -743
- package/src/adapters/copilot/.github/copilot/instructions.md +0 -376
- package/src/adapters/cursor/.cursorrules +0 -325
- package/src/adapters/generic/SPECWEAVE-MANUAL.md +0 -676
- package/src/commands/create-project.md +0 -528
- package/src/commands/generate-docs.md +0 -623
- package/src/commands/review-docs.md +0 -331
- package/src/commands/sync-github.md +0 -115
- package/src/skills/ado-sync/test-cases/test-1.yaml +0 -9
- package/src/skills/ado-sync/test-cases/test-2.yaml +0 -8
- package/src/skills/ado-sync/test-cases/test-3.yaml +0 -9
- package/src/skills/bmad-method-expert/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/bmad-method-expert/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/bmad-method-expert/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/brownfield-analyzer/test-cases/test-1-basic-analysis.yaml +0 -48
- package/src/skills/brownfield-analyzer/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/brownfield-analyzer/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/brownfield-onboarder/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/brownfield-onboarder/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/brownfield-onboarder/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/calendar-system/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/calendar-system/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/calendar-system/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/context-loader/test-cases/test-1-basic-loading.yaml +0 -39
- package/src/skills/context-loader/test-cases/test-2-token-budget-exceeded.yaml +0 -44
- package/src/skills/context-loader/test-cases/test-3-section-anchors.yaml +0 -45
- package/src/skills/context-optimizer/test-cases/test-1-bug-fix-narrow.yaml +0 -97
- package/src/skills/context-optimizer/test-cases/test-2-feature-focused.yaml +0 -109
- package/src/skills/context-optimizer/test-cases/test-3-architecture-broad.yaml +0 -98
- package/src/skills/cost-optimizer/test-cases/test-1-basic-comparison.yaml +0 -75
- package/src/skills/cost-optimizer/test-cases/test-2-budget-constraint.yaml +0 -52
- package/src/skills/cost-optimizer/test-cases/test-3-scale-requirement.yaml +0 -63
- package/src/skills/cost-optimizer/test-results/README.md +0 -46
- package/src/skills/design-system-architect/test-cases/test-1-token-structure.yaml +0 -23
- package/src/skills/design-system-architect/test-cases/test-2-component-hierarchy.yaml +0 -24
- package/src/skills/design-system-architect/test-cases/test-3-accessibility-checklist.yaml +0 -23
- package/src/skills/diagrams-architect/test-cases/test-1-c4-context.yaml +0 -13
- package/src/skills/diagrams-architect/test-cases/test-2-sequence-diagram.yaml +0 -13
- package/src/skills/diagrams-architect/test-cases/test-3-er-diagram.yaml +0 -13
- package/src/skills/diagrams-generator/test-cases/test-1.yaml +0 -9
- package/src/skills/diagrams-generator/test-cases/test-2.yaml +0 -9
- package/src/skills/diagrams-generator/test-cases/test-3.yaml +0 -8
- package/src/skills/docs-updater/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/docs-updater/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/docs-updater/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/dotnet-backend/test-cases/test-1-rest-api.yaml +0 -14
- package/src/skills/dotnet-backend/test-cases/test-2-authentication.yaml +0 -13
- package/src/skills/dotnet-backend/test-cases/test-3-minimal-api.yaml +0 -13
- package/src/skills/e2e-playwright/test-cases/TC-001-basic-navigation.yaml +0 -54
- package/src/skills/e2e-playwright/test-cases/TC-002-form-interaction.yaml +0 -64
- package/src/skills/e2e-playwright/test-cases/TC-003-specweave-integration.yaml +0 -74
- package/src/skills/e2e-playwright/test-cases/TC-004-accessibility-check.yaml +0 -98
- package/src/skills/figma-designer/test-cases/test-1-design-system.yaml +0 -13
- package/src/skills/figma-designer/test-cases/test-2-component-library.yaml +0 -13
- package/src/skills/figma-designer/test-cases/test-3-responsive-layout.yaml +0 -13
- package/src/skills/figma-implementer/test-cases/test-1-design-to-react.yaml +0 -13
- package/src/skills/figma-implementer/test-cases/test-2-storybook.yaml +0 -13
- package/src/skills/figma-implementer/test-cases/test-3-design-tokens.yaml +0 -13
- package/src/skills/figma-mcp-connector/test-cases/test-1-read-file-desktop.yaml +0 -22
- package/src/skills/figma-mcp-connector/test-cases/test-2-read-file-framelink.yaml +0 -21
- package/src/skills/figma-mcp-connector/test-cases/test-3-error-handling.yaml +0 -18
- package/src/skills/figma-to-code/test-cases/test-1-token-generation.yaml +0 -29
- package/src/skills/figma-to-code/test-cases/test-2-component-generation.yaml +0 -27
- package/src/skills/figma-to-code/test-cases/test-3-typescript-generation.yaml +0 -28
- package/src/skills/frontend/test-cases/test-1-react-component.yaml +0 -13
- package/src/skills/frontend/test-cases/test-2-form-validation.yaml +0 -13
- package/src/skills/frontend/test-cases/test-3-state-management.yaml +0 -13
- package/src/skills/github-sync/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/github-sync/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/github-sync/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/hetzner-provisioner/test-cases/test-1-basic-provision.yaml +0 -71
- package/src/skills/hetzner-provisioner/test-cases/test-2-postgres-provision.yaml +0 -85
- package/src/skills/hetzner-provisioner/test-cases/test-3-ssl-config.yaml +0 -126
- package/src/skills/hetzner-provisioner/test-results/README.md +0 -259
- package/src/skills/increment-planner/test-cases/test-1-basic-feature.yaml +0 -27
- package/src/skills/increment-planner/test-cases/test-2-complex-feature.yaml +0 -30
- package/src/skills/increment-planner/test-cases/test-3-auto-numbering.yaml +0 -24
- package/src/skills/increment-quality-judge/test-cases/test-1-good-spec.yaml +0 -95
- package/src/skills/increment-quality-judge/test-cases/test-2-poor-spec.yaml +0 -108
- package/src/skills/increment-quality-judge/test-cases/test-3-export-suggestions.yaml +0 -87
- package/src/skills/jira-sync/test-cases/test-1.yaml +0 -9
- package/src/skills/jira-sync/test-cases/test-2.yaml +0 -9
- package/src/skills/jira-sync/test-cases/test-3.yaml +0 -10
- package/src/skills/nextjs/test-cases/test-1-app-router.yaml +0 -13
- package/src/skills/nextjs/test-cases/test-2-server-actions.yaml +0 -13
- package/src/skills/nextjs/test-cases/test-3-api-routes.yaml +0 -13
- package/src/skills/nodejs-backend/test-cases/test-1-express-api.yaml +0 -13
- package/src/skills/nodejs-backend/test-cases/test-2-prisma-orm.yaml +0 -13
- package/src/skills/nodejs-backend/test-cases/test-3-authentication.yaml +0 -13
- package/src/skills/notification-system/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/notification-system/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/notification-system/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/python-backend/test-cases/test-1-fastapi-crud.yaml +0 -13
- package/src/skills/python-backend/test-cases/test-2-sqlalchemy.yaml +0 -13
- package/src/skills/python-backend/test-cases/test-3-authentication.yaml +0 -13
- package/src/skills/role-orchestrator/test-cases/test-1-simple-product.yaml +0 -98
- package/src/skills/role-orchestrator/test-cases/test-2-quality-gate-failure.yaml +0 -73
- package/src/skills/role-orchestrator/test-cases/test-3-security-workflow.yaml +0 -121
- package/src/skills/role-orchestrator/test-cases/test-4-parallel-execution.yaml +0 -145
- package/src/skills/role-orchestrator/test-cases/test-5-feedback-loops.yaml +0 -149
- package/src/skills/skill-creator/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/skill-creator/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/skill-creator/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/skill-router/test-cases/test-1-basic-routing.yaml +0 -33
- package/src/skills/skill-router/test-cases/test-2-ambiguous-request.yaml +0 -42
- package/src/skills/skill-router/test-cases/test-3-nested-orchestration.yaml +0 -50
- package/src/skills/spec-driven-brainstorming/test-cases/TC-001-simple-idea-to-design.yaml +0 -148
- package/src/skills/spec-driven-brainstorming/test-cases/TC-002-complex-ultrathink-design.yaml +0 -190
- package/src/skills/spec-driven-brainstorming/test-cases/TC-003-unclear-requirements-socratic.yaml +0 -233
- package/src/skills/spec-driven-debugging/test-cases/TC-001-simple-auth-bug.yaml +0 -212
- package/src/skills/spec-driven-debugging/test-cases/TC-002-race-condition-ultrathink.yaml +0 -461
- package/src/skills/spec-driven-debugging/test-cases/TC-003-brownfield-missing-spec.yaml +0 -366
- package/src/skills/spec-kit-expert/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/spec-kit-expert/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/spec-kit-expert/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/specweave-ado-mapper/test-cases/test-1-export-to-ado.yaml +0 -13
- package/src/skills/specweave-ado-mapper/test-cases/test-2-import-from-ado.yaml +0 -13
- package/src/skills/specweave-ado-mapper/test-cases/test-3-bidirectional-sync.yaml +0 -13
- package/src/skills/specweave-detector/test-cases/test-1-basic-detection.yaml +0 -37
- package/src/skills/specweave-detector/test-cases/test-2-missing-config.yaml +0 -37
- package/src/skills/specweave-detector/test-cases/test-3-non-specweave-project.yaml +0 -34
- package/src/skills/specweave-jira-mapper/test-cases/test-1-export-to-jira.yaml +0 -13
- package/src/skills/specweave-jira-mapper/test-cases/test-2-import-from-jira.yaml +0 -13
- package/src/skills/specweave-jira-mapper/test-cases/test-3-sync-status.yaml +0 -13
- package/src/skills/stripe-integrator/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/stripe-integrator/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/stripe-integrator/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/task-builder/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/task-builder/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/task-builder/test-cases/test-3-placeholder.yaml +0 -12
- package/src/templates/config.yaml +0 -351
- /package/src/commands/{list-increments.md → specweave.list-increments.md} +0 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specweave.sync-github
|
|
3
|
+
description: Sync SpecWeave increments with GitHub issues. Supports import, export, bidirectional sync, and granular issue operations
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Sync GitHub Command
|
|
7
|
+
|
|
8
|
+
You are a GitHub synchronization expert. Help the user sync between GitHub and SpecWeave with granular control.
|
|
9
|
+
|
|
10
|
+
## Available Operations
|
|
11
|
+
|
|
12
|
+
### Milestone-Level Operations
|
|
13
|
+
|
|
14
|
+
**1. Import GitHub Milestone as SpecWeave Increment**
|
|
15
|
+
```
|
|
16
|
+
/specweave.sync-github import milestone-1
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**2. Sync existing linked Increment with GitHub**
|
|
20
|
+
```
|
|
21
|
+
/specweave.sync-github sync 0003
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**3. Export SpecWeave Increment to GitHub**
|
|
25
|
+
```
|
|
26
|
+
/specweave.sync-github export 0001
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Granular Issue Operations
|
|
30
|
+
|
|
31
|
+
**4. Add specific Issue to existing Increment**
|
|
32
|
+
```
|
|
33
|
+
/specweave.sync-github add #42 to 0003
|
|
34
|
+
/specweave.sync-github add #42 # Adds to current increment
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**5. Create Increment from specific issues (cherry-pick)**
|
|
38
|
+
```
|
|
39
|
+
/specweave.sync-github create "User Authentication" from #42 #45 #47
|
|
40
|
+
/specweave.sync-github create "Bug Fixes Sprint 1" from #10 #15 #20
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**6. Show sync status**
|
|
44
|
+
```
|
|
45
|
+
/specweave.sync-github status
|
|
46
|
+
/specweave.sync-github status 0003 # Status of specific increment
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Your Task
|
|
50
|
+
|
|
51
|
+
When the user runs this command:
|
|
52
|
+
|
|
53
|
+
1. **Parse the command arguments**:
|
|
54
|
+
- Operation: import, sync, export, add, create, or status
|
|
55
|
+
- ID: GitHub issue number (e.g., #123) or Increment ID (e.g., 0001)
|
|
56
|
+
|
|
57
|
+
2. **Execute the operation**:
|
|
58
|
+
|
|
59
|
+
**For import Milestone**:
|
|
60
|
+
```typescript
|
|
61
|
+
import { GitHubClient } from './src/integrations/github/github-client';
|
|
62
|
+
import { GitHubMapper } from './src/integrations/github/github-mapper';
|
|
63
|
+
|
|
64
|
+
const client = new GitHubClient();
|
|
65
|
+
const mapper = new GitHubMapper(client);
|
|
66
|
+
const result = await mapper.importMilestoneAsIncrement('milestone-1');
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**For add issue**:
|
|
70
|
+
```typescript
|
|
71
|
+
import { GitHubIncrementalMapper } from './src/integrations/github/github-incremental-mapper';
|
|
72
|
+
|
|
73
|
+
const incrementalMapper = new GitHubIncrementalMapper(client);
|
|
74
|
+
const result = await incrementalMapper.addIssueToIncrement('0003', 42);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**For create from issues**:
|
|
78
|
+
```typescript
|
|
79
|
+
const result = await incrementalMapper.createIncrementFromIssues(
|
|
80
|
+
'User Authentication',
|
|
81
|
+
[42, 45, 47]
|
|
82
|
+
);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**For sync**:
|
|
86
|
+
```typescript
|
|
87
|
+
const result = await mapper.syncIncrement('0003');
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**For export**:
|
|
91
|
+
```typescript
|
|
92
|
+
const result = await mapper.exportIncrementAsIssues('0001');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
3. **Show results**:
|
|
96
|
+
- Display sync summary
|
|
97
|
+
- Show conflicts (if any)
|
|
98
|
+
- List created/updated files
|
|
99
|
+
- Provide links to GitHub and SpecWeave
|
|
100
|
+
|
|
101
|
+
4. **Handle errors gracefully**:
|
|
102
|
+
- Check if GITHUB_TOKEN exists in environment
|
|
103
|
+
- Validate increment/issue exists
|
|
104
|
+
- Check repository is configured
|
|
105
|
+
- Show clear error messages
|
|
106
|
+
|
|
107
|
+
## Examples
|
|
108
|
+
|
|
109
|
+
### Example 1: Import Milestone
|
|
110
|
+
**User**: `/specweave.sync-github import milestone-1`
|
|
111
|
+
**You**:
|
|
112
|
+
- Import Milestone "milestone-1" from GitHub
|
|
113
|
+
- Show: "✅ Imported as Increment 0004"
|
|
114
|
+
- List: "Created: spec.md, tasks.md, RFC document"
|
|
115
|
+
- Link: "GitHub: https://github.com/user/repo/milestone/1 | Increment: .specweave/increments/0004/"
|
|
116
|
+
|
|
117
|
+
### Example 2: Add Issue to Current Increment
|
|
118
|
+
**User**: `/specweave.sync-github add #42`
|
|
119
|
+
**You**:
|
|
120
|
+
- Determine current increment (latest or from context)
|
|
121
|
+
- Fetch issue #42 from GitHub
|
|
122
|
+
- Add to increment's spec.md (under ## User Stories or ## Bugs based on labels)
|
|
123
|
+
- Update tasks.md
|
|
124
|
+
- Update RFC
|
|
125
|
+
- Show: "✅ Added Issue #42 to Increment 0003"
|
|
126
|
+
- Display: "Type: feature | Title: User authentication | Status: open"
|
|
127
|
+
|
|
128
|
+
### Example 3: Add Bug Issue to Specific Increment
|
|
129
|
+
**User**: `/specweave.sync-github add #123 to 0003`
|
|
130
|
+
**You**:
|
|
131
|
+
- Fetch issue #123 from GitHub (labeled as "bug")
|
|
132
|
+
- Add to increment 0003's spec.md (under ## Bugs)
|
|
133
|
+
- Update tasks.md
|
|
134
|
+
- Update RFC
|
|
135
|
+
- Show: "✅ Added Bug #123 to Increment 0003"
|
|
136
|
+
- Display: "Type: bug | Priority: high | Title: Fix login redirect"
|
|
137
|
+
|
|
138
|
+
### Example 4: Create Increment from Multiple Issues
|
|
139
|
+
**User**: `/specweave.sync-github create "User Authentication" from #42 #45 #47`
|
|
140
|
+
**You**:
|
|
141
|
+
- Fetch all 3 issues from GitHub
|
|
142
|
+
- Determine types based on labels (feature, bug, enhancement)
|
|
143
|
+
- Create new increment 0005
|
|
144
|
+
- Group by type in spec.md:
|
|
145
|
+
- ## User Stories (#42, #45)
|
|
146
|
+
- ## Technical Tasks (#47)
|
|
147
|
+
- Generate RFC with all items
|
|
148
|
+
- Show: "✅ Created Increment 0005 with 3 issues"
|
|
149
|
+
- Display table:
|
|
150
|
+
```
|
|
151
|
+
| Type | Issue | Title |
|
|
152
|
+
|---------|-------|--------------------|
|
|
153
|
+
| Feature | #42 | User login UI |
|
|
154
|
+
| Feature | #45 | OAuth backend |
|
|
155
|
+
| Task | #47 | Setup provider |
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Example 5: Sync Existing Increment
|
|
159
|
+
**User**: `/specweave.sync-github sync 0003`
|
|
160
|
+
**You**:
|
|
161
|
+
- Read increment 0003
|
|
162
|
+
- Find linked GitHub issues (from spec.md frontmatter.github_issues)
|
|
163
|
+
- Fetch current state from GitHub
|
|
164
|
+
- Detect changes (status, labels, assignees, comments)
|
|
165
|
+
- Show conflicts if any
|
|
166
|
+
- Apply sync bidirectionally:
|
|
167
|
+
- Update GitHub issue status based on task completion
|
|
168
|
+
- Update spec.md based on GitHub changes
|
|
169
|
+
- Display: "✅ Synced 0003 | Updated: 2 issues | #42 → closed, #45 → in-progress"
|
|
170
|
+
|
|
171
|
+
### Example 6: Status Overview
|
|
172
|
+
**User**: `/specweave.sync-github status`
|
|
173
|
+
**You**:
|
|
174
|
+
- Scan all increments for GitHub metadata
|
|
175
|
+
- Show table:
|
|
176
|
+
```
|
|
177
|
+
| Increment | Title | GitHub Issues | Last Sync |
|
|
178
|
+
|-----------|------------------|---------------|--------------------|
|
|
179
|
+
| 0003 | Test Feature | 0 issues | 2025-10-28 17:42 |
|
|
180
|
+
| 0004 | User Auth | 3 issues | 2025-10-28 18:00 |
|
|
181
|
+
| 0005 | Bug Fixes | 5 issues | Never |
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## GitHub Issue Format
|
|
185
|
+
|
|
186
|
+
When creating GitHub issues from increments, use this format:
|
|
187
|
+
|
|
188
|
+
```markdown
|
|
189
|
+
# [Increment ###] Title
|
|
190
|
+
|
|
191
|
+
## Overview
|
|
192
|
+
[From spec.md]
|
|
193
|
+
|
|
194
|
+
## Business Value
|
|
195
|
+
[From spec.md if exists]
|
|
196
|
+
|
|
197
|
+
## User Stories
|
|
198
|
+
|
|
199
|
+
- [ ] **US1**: [Title] (P1)
|
|
200
|
+
- Acceptance test 1
|
|
201
|
+
- Acceptance test 2
|
|
202
|
+
- [ ] **US2**: [Title] (P2)
|
|
203
|
+
- Acceptance test 1
|
|
204
|
+
|
|
205
|
+
## Implementation Tasks
|
|
206
|
+
|
|
207
|
+
### Phase 1: [Phase Name]
|
|
208
|
+
- [ ] **T001**: [Task description]
|
|
209
|
+
- [ ] **T002**: [Task description]
|
|
210
|
+
|
|
211
|
+
### Phase 2: [Phase Name]
|
|
212
|
+
- [ ] **T010**: [Task description]
|
|
213
|
+
|
|
214
|
+
## Documentation
|
|
215
|
+
|
|
216
|
+
- [Specification](.specweave/increments/####-name/spec.md)
|
|
217
|
+
- [Tasks](.specweave/increments/####-name/tasks.md)
|
|
218
|
+
- [Architecture](.specweave/docs/architecture/) (if applicable)
|
|
219
|
+
|
|
220
|
+
## Dependencies
|
|
221
|
+
|
|
222
|
+
- Depends on: #[issue-number] (if applicable)
|
|
223
|
+
|
|
224
|
+
## Success Criteria
|
|
225
|
+
|
|
226
|
+
[From spec.md]
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
*Created by SpecWeave - [Learn more](https://github.com/specweave/specweave)*
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Bidirectional Sync
|
|
233
|
+
|
|
234
|
+
When syncing an increment that already has `github_issues` in frontmatter:
|
|
235
|
+
- Update existing issues instead of creating new ones
|
|
236
|
+
- Sync status changes:
|
|
237
|
+
- Task completion → Close GitHub issue
|
|
238
|
+
- GitHub issue closed → Mark task as completed
|
|
239
|
+
- Sync labels and priorities
|
|
240
|
+
- Add comments with sync timestamps
|
|
241
|
+
|
|
242
|
+
## Important Notes
|
|
243
|
+
|
|
244
|
+
- Always check if GITHUB_TOKEN exists in environment
|
|
245
|
+
- Never log tokens or credentials
|
|
246
|
+
- Show clear progress messages
|
|
247
|
+
- Display rich output with links
|
|
248
|
+
- Use GitHub CLI (`gh`) if available for better integration
|
|
249
|
+
- Respect rate limits (pause if needed)
|
|
250
|
+
- Save sync results to test-results/ if requested
|
|
251
|
+
|
|
252
|
+
## Error Handling
|
|
253
|
+
|
|
254
|
+
- **Not a git repository**: "Error: Not a git repository. Initialize git first."
|
|
255
|
+
- **No GitHub credentials**: "Error: GITHUB_TOKEN not set. Configure GitHub authentication."
|
|
256
|
+
- **Increment not found**: "Error: Increment 0003 not found. Use /specweave.increment first."
|
|
257
|
+
- **Issue not found**: "Error: Issue #42 not found in repository."
|
|
258
|
+
- **Rate limit exceeded**: "Warning: GitHub rate limit reached. Waiting 60 seconds..."
|
|
259
|
+
|
|
260
|
+
## Related Commands
|
|
261
|
+
|
|
262
|
+
- `/specweave.sync-jira` - Sync to Jira
|
|
263
|
+
- `/specweave.increment` - Create new increment
|
|
264
|
+
- `/specweave.validate` - Validate increment quality
|
|
265
|
+
- `/specweave.progress` - Check increment progress
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
**Granular Control**: Unlike simple milestone import/export, this command supports cherry-picking individual issues for maximum flexibility, just like the Jira sync integration.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specweave.sync-jira
|
|
3
|
+
description: Sync SpecWeave increments with JIRA epics/stories. Supports import, export, bidirectional sync, and granular item operations
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Sync Jira Command
|
|
7
|
+
|
|
8
|
+
You are a Jira synchronization expert. Help the user sync between Jira and SpecWeave with granular control.
|
|
9
|
+
|
|
10
|
+
## Available Operations
|
|
11
|
+
|
|
12
|
+
### Epic-Level Operations
|
|
13
|
+
|
|
14
|
+
**1. Import Jira Epic as SpecWeave Increment**
|
|
15
|
+
```
|
|
16
|
+
/specweave.sync-jira import SCRUM-123
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**2. Sync existing linked Increment with Jira**
|
|
20
|
+
```
|
|
21
|
+
/specweave.sync-jira sync 0003
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**3. Export SpecWeave Increment to Jira**
|
|
25
|
+
```
|
|
26
|
+
/specweave.sync-jira export 0001
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Granular Item Operations
|
|
30
|
+
|
|
31
|
+
**4. Add specific Story/Bug/Task to existing Increment**
|
|
32
|
+
```
|
|
33
|
+
/specweave.sync-jira add SCRUM-1 to 0003
|
|
34
|
+
/specweave.sync-jira add SCRUM-1 # Adds to current increment
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**5. Create Increment from specific items (cherry-pick)**
|
|
38
|
+
```
|
|
39
|
+
/specweave.sync-jira create "User Authentication" from SCRUM-1 SCRUM-5 SCRUM-7
|
|
40
|
+
/specweave.sync-jira create "Bug Fixes Sprint 1" from SCRUM-10 SCRUM-15 SCRUM-20
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**6. Show sync status**
|
|
44
|
+
```
|
|
45
|
+
/specweave.sync-jira status
|
|
46
|
+
/specweave.sync-jira status 0003 # Status of specific increment
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Your Task
|
|
50
|
+
|
|
51
|
+
When the user runs this command:
|
|
52
|
+
|
|
53
|
+
1. **Parse the command arguments**:
|
|
54
|
+
- Operation: import, sync, export, add, create, or status
|
|
55
|
+
- ID: Jira Epic key (e.g., SCRUM-123) or Increment ID (e.g., 0001)
|
|
56
|
+
|
|
57
|
+
2. **Execute the operation**:
|
|
58
|
+
|
|
59
|
+
**For import Epic**:
|
|
60
|
+
```typescript
|
|
61
|
+
import { JiraClient } from './src/integrations/jira/jira-client';
|
|
62
|
+
import { JiraMapper } from './src/integrations/jira/jira-mapper';
|
|
63
|
+
|
|
64
|
+
const client = new JiraClient();
|
|
65
|
+
const mapper = new JiraMapper(client);
|
|
66
|
+
const result = await mapper.importEpicAsIncrement('SCRUM-123');
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**For add item**:
|
|
70
|
+
```typescript
|
|
71
|
+
import { JiraIncrementalMapper } from './src/integrations/jira/jira-incremental-mapper';
|
|
72
|
+
|
|
73
|
+
const incrementalMapper = new JiraIncrementalMapper(client);
|
|
74
|
+
const result = await incrementalMapper.addItemToIncrement('0003', 'SCRUM-1');
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**For create from items**:
|
|
78
|
+
```typescript
|
|
79
|
+
const result = await incrementalMapper.createIncrementFromItems(
|
|
80
|
+
'User Authentication',
|
|
81
|
+
['SCRUM-1', 'SCRUM-5', 'SCRUM-7']
|
|
82
|
+
);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**For sync**:
|
|
86
|
+
```typescript
|
|
87
|
+
const result = await mapper.syncIncrement('0003');
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**For export**:
|
|
91
|
+
```typescript
|
|
92
|
+
const result = await mapper.exportIncrementAsEpic('0001', 'SCRUM');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
3. **Show results**:
|
|
96
|
+
- Display sync summary
|
|
97
|
+
- Show conflicts (if any)
|
|
98
|
+
- List created/updated files
|
|
99
|
+
- Provide links to Jira and SpecWeave
|
|
100
|
+
|
|
101
|
+
4. **Handle errors gracefully**:
|
|
102
|
+
- Check if .env credentials exist
|
|
103
|
+
- Validate increment/epic exists
|
|
104
|
+
- Show clear error messages
|
|
105
|
+
|
|
106
|
+
## Examples
|
|
107
|
+
|
|
108
|
+
### Example 1: Import Epic
|
|
109
|
+
**User**: `/specweave.sync-jira import SCRUM-2`
|
|
110
|
+
**You**:
|
|
111
|
+
- Import Epic SCRUM-2 from Jira
|
|
112
|
+
- Show: "✅ Imported as Increment 0004"
|
|
113
|
+
- List: "Created: spec.md, tasks.md, RFC document"
|
|
114
|
+
- Link: "Jira: https://... | Increment: .specweave/increments/0004/"
|
|
115
|
+
|
|
116
|
+
### Example 2: Add Story to Current Increment
|
|
117
|
+
**User**: `/specweave.sync-jira add SCRUM-1`
|
|
118
|
+
**You**:
|
|
119
|
+
- Determine current increment (latest or from context)
|
|
120
|
+
- Fetch SCRUM-1 from Jira
|
|
121
|
+
- Add to increment's spec.md (under ## User Stories)
|
|
122
|
+
- Update tasks.md
|
|
123
|
+
- Update RFC
|
|
124
|
+
- Show: "✅ Added Story SCRUM-1 to Increment 0003"
|
|
125
|
+
- Display: "Type: story | Title: User can login | Status: in-progress"
|
|
126
|
+
|
|
127
|
+
### Example 3: Add Bug to Specific Increment
|
|
128
|
+
**User**: `/specweave.sync-jira add SCRUM-10 to 0003`
|
|
129
|
+
**You**:
|
|
130
|
+
- Fetch SCRUM-10 from Jira (it's a Bug)
|
|
131
|
+
- Add to increment 0003's spec.md (under ## Bugs)
|
|
132
|
+
- Update tasks.md
|
|
133
|
+
- Update RFC
|
|
134
|
+
- Show: "✅ Added Bug SCRUM-10 to Increment 0003"
|
|
135
|
+
- Display: "Type: bug | Priority: P1 | Title: Fix login redirect"
|
|
136
|
+
|
|
137
|
+
### Example 4: Create Increment from Multiple Items
|
|
138
|
+
**User**: `/specweave.sync-jira create "User Authentication" from SCRUM-1 SCRUM-5 SCRUM-7`
|
|
139
|
+
**You**:
|
|
140
|
+
- Fetch all 3 issues from Jira
|
|
141
|
+
- Determine types (story, bug, task)
|
|
142
|
+
- Create new increment 0005
|
|
143
|
+
- Group by type in spec.md:
|
|
144
|
+
- ## User Stories (SCRUM-1, SCRUM-5)
|
|
145
|
+
- ## Technical Tasks (SCRUM-7)
|
|
146
|
+
- Generate RFC with all items
|
|
147
|
+
- Show: "✅ Created Increment 0005 with 3 work items"
|
|
148
|
+
- Display table:
|
|
149
|
+
```
|
|
150
|
+
| Type | Jira Key | Title |
|
|
151
|
+
|-------|----------|-----------------|
|
|
152
|
+
| Story | SCRUM-1 | User login UI |
|
|
153
|
+
| Story | SCRUM-5 | OAuth backend |
|
|
154
|
+
| Task | SCRUM-7 | Setup provider |
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Example 5: Sync Existing Increment
|
|
158
|
+
**User**: `/specweave.sync-jira sync 0003`
|
|
159
|
+
**You**:
|
|
160
|
+
- Read increment 0003
|
|
161
|
+
- Find linked Jira items (from spec.md frontmatter.work_items)
|
|
162
|
+
- Fetch current state from Jira
|
|
163
|
+
- Detect changes (status, priority, description)
|
|
164
|
+
- Show conflicts if any
|
|
165
|
+
- Apply sync bidirectionally
|
|
166
|
+
- Display: "✅ Synced 0003 | Updated: 2 items | SCRUM-1 → in-progress, SCRUM-10 → completed"
|
|
167
|
+
|
|
168
|
+
### Example 6: Status Overview
|
|
169
|
+
**User**: `/specweave.sync-jira status`
|
|
170
|
+
**You**:
|
|
171
|
+
- Scan all increments for Jira metadata
|
|
172
|
+
- Show table:
|
|
173
|
+
```
|
|
174
|
+
| Increment | Title | Jira Items | Last Sync |
|
|
175
|
+
|-----------|------------------|------------|--------------------|
|
|
176
|
+
| 0003 | Test Epic | 0 items | 2025-10-28 17:42 |
|
|
177
|
+
| 0004 | User Auth | 3 items | 2025-10-28 18:00 |
|
|
178
|
+
| 0005 | Bug Fixes | 5 items | Never |
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Important Notes
|
|
182
|
+
|
|
183
|
+
- Always check if .env has Jira credentials before syncing
|
|
184
|
+
- Never log secrets or tokens
|
|
185
|
+
- Show clear progress messages
|
|
186
|
+
- Display rich output with links
|
|
187
|
+
- Save sync results to test-results/ if requested
|
|
188
|
+
|
|
189
|
+
## Related Commands
|
|
190
|
+
|
|
191
|
+
- `/specweave.sync-github` - Sync to GitHub issues
|
|
192
|
+
- `/specweave.increment` - Create new increment
|
|
193
|
+
- `/specweave.validate` - Validate increment quality
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
**Granular Control**: Unlike simple epic import/export, this command supports cherry-picking individual stories, bugs, and tasks for maximum flexibility.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: validate
|
|
2
|
+
name: specweave.validate
|
|
3
3
|
description: Validate SpecWeave increment with rule-based checks and optional AI quality assessment
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -406,7 +406,7 @@ Remaining issues: 1 (requires manual review)
|
|
|
406
406
|
|
|
407
407
|
**If `--always` flag OR user selects "Always run"**:
|
|
408
408
|
|
|
409
|
-
1.
|
|
409
|
+
1. SpecWeave uses auto-detection
|
|
410
410
|
```yaml
|
|
411
411
|
validation:
|
|
412
412
|
quality_judge:
|
|
@@ -435,7 +435,7 @@ validation:
|
|
|
435
435
|
Quality assessment will now run automatically for all future validations.
|
|
436
436
|
|
|
437
437
|
To disable:
|
|
438
|
-
1.
|
|
438
|
+
1. Initialize your project
|
|
439
439
|
2. Set validation.quality_judge.always_run: false
|
|
440
440
|
|
|
441
441
|
Or run: /validate-increment <id> (quality will run automatically)
|
|
@@ -781,7 +781,7 @@ validation:
|
|
|
781
781
|
## Related Commands
|
|
782
782
|
|
|
783
783
|
- `/create-increment`: Create new increment (auto-validates on creation)
|
|
784
|
-
- `/
|
|
784
|
+
- `/sync-docs`: Review strategic documentation before implementation
|
|
785
785
|
- `/close-increment`: Close increment (validates before closing)
|
|
786
786
|
- `/sync-github`: Sync to GitHub (validates before sync)
|
|
787
787
|
|
package/src/hooks/README.md
CHANGED
|
@@ -18,16 +18,21 @@ Hooks automate workflows and provide feedback during development:
|
|
|
18
18
|
## Available Hooks
|
|
19
19
|
|
|
20
20
|
### 1. `post-task-completion.sh`
|
|
21
|
-
**Triggers**: After ANY task is marked complete
|
|
21
|
+
**Triggers**: After ANY task is marked complete (via TodoWrite tool)
|
|
22
22
|
|
|
23
23
|
**Actions**:
|
|
24
|
-
1. Plays completion sound (Glass.aiff on macOS, equivalent on Linux/Windows)
|
|
25
|
-
2.
|
|
26
|
-
3.
|
|
27
|
-
4. Logs task completion
|
|
24
|
+
1. Plays completion sound **synchronously** (Glass.aiff on macOS, equivalent on Linux/Windows)
|
|
25
|
+
2. Outputs JSON with systemMessage reminder to update docs
|
|
26
|
+
3. Logs task completion
|
|
28
27
|
|
|
29
28
|
**Sound**: Glass.aiff (or system equivalent)
|
|
30
29
|
|
|
30
|
+
**Important**: Hooks cannot invoke slash commands or skills. The hook only:
|
|
31
|
+
- Plays sound to notify user
|
|
32
|
+
- Shows reminder message
|
|
33
|
+
- Claude must manually update CLAUDE.md/README.md inline after each task
|
|
34
|
+
- Living docs sync (via `/sync-docs`) happens after ALL tasks complete
|
|
35
|
+
|
|
31
36
|
---
|
|
32
37
|
|
|
33
38
|
### 2. `human-input-required.sh`
|
|
@@ -93,10 +98,10 @@ This creates symlinks:
|
|
|
93
98
|
### Method 2: Copy (For New Projects)
|
|
94
99
|
```bash
|
|
95
100
|
# When creating new project
|
|
96
|
-
npx specweave
|
|
101
|
+
npx specweave init my-project
|
|
97
102
|
```
|
|
98
103
|
|
|
99
|
-
This copies `src/hooks/` → `my-project
|
|
104
|
+
This copies `src/hooks/` → `my-project/.claude/hooks/`
|
|
100
105
|
|
|
101
106
|
**Benefit**: New project gets its own copy of hooks (can customize if needed)
|
|
102
107
|
|
|
@@ -114,30 +119,15 @@ chmod +x .claude/hooks/*.sh
|
|
|
114
119
|
|
|
115
120
|
## Configuration
|
|
116
121
|
|
|
117
|
-
Hooks
|
|
118
|
-
|
|
119
|
-
```yaml
|
|
120
|
-
---
|
|
121
|
-
hooks:
|
|
122
|
-
enabled: true
|
|
123
|
-
|
|
124
|
-
# Sound notifications
|
|
125
|
-
sounds:
|
|
126
|
-
enabled: true
|
|
127
|
-
completion: /System/Library/Sounds/Glass.aiff # macOS
|
|
128
|
-
input_required: /System/Library/Sounds/Ping.aiff
|
|
122
|
+
Hooks are enabled by default. To customize behavior, hooks can check environment variables or use auto-detection.
|
|
129
123
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
124
|
+
### Default Behavior
|
|
125
|
+
- Sound notifications enabled (platform-specific)
|
|
126
|
+
- Auto-update docs after task completion
|
|
127
|
+
- Regression checks for brownfield projects
|
|
134
128
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
enabled: true
|
|
138
|
-
require_baseline_tests: false # If true, block if no baseline tests
|
|
139
|
-
---
|
|
140
|
-
```
|
|
129
|
+
### Customization
|
|
130
|
+
Hooks use auto-detection for platform-specific features (macOS/Linux/Windows sound files).
|
|
141
131
|
|
|
142
132
|
---
|
|
143
133
|
|
|
@@ -1,32 +1,30 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
3
|
# SpecWeave Post-Task-Completion Hook
|
|
4
|
-
# Runs automatically after ANY task is marked complete
|
|
4
|
+
# Runs automatically after ANY task is marked complete via TodoWrite
|
|
5
5
|
#
|
|
6
6
|
# Actions:
|
|
7
|
-
# 1. Play completion sound
|
|
8
|
-
# 2.
|
|
9
|
-
# 3.
|
|
10
|
-
# 4. Log completion
|
|
7
|
+
# 1. Play completion sound (synchronously, not background)
|
|
8
|
+
# 2. Output JSON systemMessage reminding to update docs
|
|
9
|
+
# 3. Log completion
|
|
11
10
|
|
|
12
11
|
set -e
|
|
13
12
|
|
|
14
13
|
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
15
|
-
cd "$PROJECT_ROOT"
|
|
14
|
+
cd "$PROJECT_ROOT" 2>/dev/null || true
|
|
16
15
|
|
|
17
|
-
#
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
# DEBUG: Log hook invocation
|
|
17
|
+
mkdir -p .specweave/logs 2>/dev/null || true
|
|
18
|
+
echo "[$(date)] Hook invoked! PWD=$PWD Args=$*" >> .specweave/logs/hooks-debug.log 2>/dev/null || true
|
|
19
|
+
echo "[$(date)] Hook stdin:" >> .specweave/logs/hooks-debug.log 2>/dev/null || true
|
|
20
|
+
cat >> .specweave/logs/hooks-debug.log 2>/dev/null || true
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# 1. Play notification sound (cross-platform)
|
|
22
|
+
# 1. Play notification sound SYNCHRONOUSLY (cross-platform)
|
|
26
23
|
play_sound() {
|
|
27
24
|
case "$(uname -s)" in
|
|
28
25
|
Darwin)
|
|
29
|
-
|
|
26
|
+
# Play synchronously (remove &)
|
|
27
|
+
afplay /System/Library/Sounds/Glass.aiff 2>/dev/null || true
|
|
30
28
|
;;
|
|
31
29
|
Linux)
|
|
32
30
|
paplay /usr/share/sounds/freedesktop/stereo/complete.oga 2>/dev/null || \
|
|
@@ -38,20 +36,17 @@ play_sound() {
|
|
|
38
36
|
esac
|
|
39
37
|
}
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
# 2. Trigger docs-updater (if skill exists)
|
|
44
|
-
if [ -d "src/skills/docs-updater" ] || [ -d ".claude/skills/docs-updater" ]; then
|
|
45
|
-
echo -e "${YELLOW}📝 docs-updater skill will update documentation${NC}"
|
|
46
|
-
fi
|
|
39
|
+
# Play sound FIRST (synchronously)
|
|
40
|
+
play_sound
|
|
47
41
|
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
fi
|
|
42
|
+
# 2. Log completion
|
|
43
|
+
mkdir -p .specweave/logs 2>/dev/null || true
|
|
44
|
+
echo "[$(date)] Task completed" >> .specweave/logs/tasks.log 2>/dev/null || true
|
|
52
45
|
|
|
53
|
-
#
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
46
|
+
# 3. Output JSON to instruct Claude (systemMessage is shown to user)
|
|
47
|
+
cat <<EOF
|
|
48
|
+
{
|
|
49
|
+
"continue": true,
|
|
50
|
+
"systemMessage": "🔔 Task completed! Remember to update documentation with inline edits to CLAUDE.md and README.md as needed."
|
|
51
|
+
}
|
|
52
|
+
EOF
|