specweave 1.0.235 → 1.0.239

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 (196) hide show
  1. package/README.md +89 -193
  2. package/dist/plugins/specweave-github/lib/github-ac-comment-poster.d.ts +37 -0
  3. package/dist/plugins/specweave-github/lib/github-ac-comment-poster.d.ts.map +1 -0
  4. package/dist/plugins/specweave-github/lib/github-ac-comment-poster.js +176 -0
  5. package/dist/plugins/specweave-github/lib/github-ac-comment-poster.js.map +1 -0
  6. package/dist/plugins/specweave-github/lib/github-batch-sync.d.ts +36 -0
  7. package/dist/plugins/specweave-github/lib/github-batch-sync.d.ts.map +1 -0
  8. package/dist/plugins/specweave-github/lib/github-batch-sync.js +115 -0
  9. package/dist/plugins/specweave-github/lib/github-batch-sync.js.map +1 -0
  10. package/dist/plugins/specweave-github/lib/github-board-resolver-v2.d.ts +37 -0
  11. package/dist/plugins/specweave-github/lib/github-board-resolver-v2.d.ts.map +1 -0
  12. package/dist/plugins/specweave-github/lib/github-board-resolver-v2.js +56 -0
  13. package/dist/plugins/specweave-github/lib/github-board-resolver-v2.js.map +1 -0
  14. package/dist/plugins/specweave-github/lib/github-conflict-resolver.d.ts +68 -0
  15. package/dist/plugins/specweave-github/lib/github-conflict-resolver.d.ts.map +1 -0
  16. package/dist/plugins/specweave-github/lib/github-conflict-resolver.js +102 -0
  17. package/dist/plugins/specweave-github/lib/github-conflict-resolver.js.map +1 -0
  18. package/dist/plugins/specweave-github/lib/github-cross-repo-sync.d.ts +64 -0
  19. package/dist/plugins/specweave-github/lib/github-cross-repo-sync.d.ts.map +1 -0
  20. package/dist/plugins/specweave-github/lib/github-cross-repo-sync.js +162 -0
  21. package/dist/plugins/specweave-github/lib/github-cross-repo-sync.js.map +1 -0
  22. package/dist/plugins/specweave-github/lib/github-field-sync.d.ts +50 -0
  23. package/dist/plugins/specweave-github/lib/github-field-sync.d.ts.map +1 -0
  24. package/dist/plugins/specweave-github/lib/github-field-sync.js +107 -0
  25. package/dist/plugins/specweave-github/lib/github-field-sync.js.map +1 -0
  26. package/dist/plugins/specweave-github/lib/github-graphql-client.d.ts +53 -0
  27. package/dist/plugins/specweave-github/lib/github-graphql-client.d.ts.map +1 -0
  28. package/dist/plugins/specweave-github/lib/github-graphql-client.js +138 -0
  29. package/dist/plugins/specweave-github/lib/github-graphql-client.js.map +1 -0
  30. package/dist/plugins/specweave-github/lib/github-issue-body-generator.d.ts +40 -0
  31. package/dist/plugins/specweave-github/lib/github-issue-body-generator.d.ts.map +1 -0
  32. package/dist/plugins/specweave-github/lib/github-issue-body-generator.js +50 -0
  33. package/dist/plugins/specweave-github/lib/github-issue-body-generator.js.map +1 -0
  34. package/dist/plugins/specweave-github/lib/github-issue-body-parser.d.ts +30 -0
  35. package/dist/plugins/specweave-github/lib/github-issue-body-parser.d.ts.map +1 -0
  36. package/dist/plugins/specweave-github/lib/github-issue-body-parser.js +75 -0
  37. package/dist/plugins/specweave-github/lib/github-issue-body-parser.js.map +1 -0
  38. package/dist/plugins/specweave-github/lib/github-pull-sync.d.ts +94 -0
  39. package/dist/plugins/specweave-github/lib/github-pull-sync.d.ts.map +1 -0
  40. package/dist/plugins/specweave-github/lib/github-pull-sync.js +232 -0
  41. package/dist/plugins/specweave-github/lib/github-pull-sync.js.map +1 -0
  42. package/dist/plugins/specweave-github/lib/github-push-sync.d.ts +50 -0
  43. package/dist/plugins/specweave-github/lib/github-push-sync.d.ts.map +1 -0
  44. package/dist/plugins/specweave-github/lib/github-push-sync.js +114 -0
  45. package/dist/plugins/specweave-github/lib/github-push-sync.js.map +1 -0
  46. package/dist/plugins/specweave-github/lib/github-rate-limiter.d.ts +53 -0
  47. package/dist/plugins/specweave-github/lib/github-rate-limiter.d.ts.map +1 -0
  48. package/dist/plugins/specweave-github/lib/github-rate-limiter.js +109 -0
  49. package/dist/plugins/specweave-github/lib/github-rate-limiter.js.map +1 -0
  50. package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.d.ts +21 -0
  51. package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.d.ts.map +1 -0
  52. package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.js +161 -0
  53. package/dist/plugins/specweave-github/lib/github-spec-frontmatter-updater.js.map +1 -0
  54. package/dist/plugins/specweave-github/lib/github-sync-orchestrator.d.ts +46 -0
  55. package/dist/plugins/specweave-github/lib/github-sync-orchestrator.d.ts.map +1 -0
  56. package/dist/plugins/specweave-github/lib/github-sync-orchestrator.js +99 -0
  57. package/dist/plugins/specweave-github/lib/github-sync-orchestrator.js.map +1 -0
  58. package/dist/plugins/specweave-github/lib/github-us-auto-closer.d.ts +43 -0
  59. package/dist/plugins/specweave-github/lib/github-us-auto-closer.d.ts.map +1 -0
  60. package/dist/plugins/specweave-github/lib/github-us-auto-closer.js +153 -0
  61. package/dist/plugins/specweave-github/lib/github-us-auto-closer.js.map +1 -0
  62. package/dist/plugins/specweave-github/lib/index.d.ts +1 -4
  63. package/dist/plugins/specweave-github/lib/index.d.ts.map +1 -1
  64. package/dist/plugins/specweave-github/lib/index.js +1 -4
  65. package/dist/plugins/specweave-github/lib/index.js.map +1 -1
  66. package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.d.ts +7 -0
  67. package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.d.ts.map +1 -0
  68. package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.js +15 -0
  69. package/dist/plugins/specweave-testing/lib/playwright-ci-defaults.js.map +1 -0
  70. package/dist/plugins/specweave-testing/lib/playwright-cli-detector.d.ts +10 -0
  71. package/dist/plugins/specweave-testing/lib/playwright-cli-detector.d.ts.map +1 -0
  72. package/dist/plugins/specweave-testing/lib/playwright-cli-detector.js +36 -0
  73. package/dist/plugins/specweave-testing/lib/playwright-cli-detector.js.map +1 -0
  74. package/dist/plugins/specweave-testing/lib/playwright-cli-runner.d.ts +25 -0
  75. package/dist/plugins/specweave-testing/lib/playwright-cli-runner.d.ts.map +1 -0
  76. package/dist/plugins/specweave-testing/lib/playwright-cli-runner.js +57 -0
  77. package/dist/plugins/specweave-testing/lib/playwright-cli-runner.js.map +1 -0
  78. package/dist/plugins/specweave-testing/lib/playwright-routing.d.ts +7 -0
  79. package/dist/plugins/specweave-testing/lib/playwright-routing.d.ts.map +1 -0
  80. package/dist/plugins/specweave-testing/lib/playwright-routing.js +17 -0
  81. package/dist/plugins/specweave-testing/lib/playwright-routing.js.map +1 -0
  82. package/dist/src/cli/commands/auto.d.ts.map +1 -1
  83. package/dist/src/cli/commands/auto.js +1 -2
  84. package/dist/src/cli/commands/auto.js.map +1 -1
  85. package/dist/src/cli/commands/cancel-auto.js +1 -2
  86. package/dist/src/cli/commands/cancel-auto.js.map +1 -1
  87. package/dist/src/cli/commands/living-docs.js +2 -2
  88. package/dist/src/cli/commands/living-docs.js.map +1 -1
  89. package/dist/src/cli/commands/update.d.ts.map +1 -1
  90. package/dist/src/cli/commands/update.js +1 -2
  91. package/dist/src/cli/commands/update.js.map +1 -1
  92. package/dist/src/core/config/types.d.ts +8 -0
  93. package/dist/src/core/config/types.d.ts.map +1 -1
  94. package/dist/src/core/config/types.js +3 -0
  95. package/dist/src/core/config/types.js.map +1 -1
  96. package/dist/src/core/types/sync-profile.d.ts +72 -0
  97. package/dist/src/core/types/sync-profile.d.ts.map +1 -1
  98. package/dist/src/core/types/sync-profile.js +6 -0
  99. package/dist/src/core/types/sync-profile.js.map +1 -1
  100. package/package.json +2 -2
  101. package/plugins/specweave/hooks/hooks.json +2 -2
  102. package/plugins/specweave/hooks/startup-health-check.sh +1 -1
  103. package/plugins/specweave/hooks/stop-auto-v5.sh +166 -0
  104. package/plugins/specweave/hooks/user-prompt-submit.sh +10 -0
  105. package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +21 -1
  106. package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +1 -1
  107. package/plugins/specweave/skills/auto/SKILL.md +71 -251
  108. package/plugins/specweave/skills/team-build/SKILL.md +370 -0
  109. package/plugins/specweave/skills/team-merge/SKILL.md +123 -0
  110. package/plugins/specweave/skills/team-orchestrate/SKILL.md +800 -0
  111. package/plugins/specweave/skills/team-status/SKILL.md +89 -0
  112. package/plugins/specweave-github/MULTI-PROJECT-SYNC-ARCHITECTURE.md +94 -8
  113. package/plugins/specweave-github/commands/sync.md +17 -3
  114. package/plugins/specweave-github/hooks/github-ac-sync-handler.sh +255 -0
  115. package/plugins/specweave-github/hooks/github-auto-create-handler.sh +455 -0
  116. package/plugins/specweave-github/lib/github-ac-comment-poster.js +150 -0
  117. package/plugins/specweave-github/lib/github-ac-comment-poster.ts +245 -0
  118. package/plugins/specweave-github/lib/github-batch-sync.js +93 -0
  119. package/plugins/specweave-github/lib/github-batch-sync.ts +152 -0
  120. package/plugins/specweave-github/lib/github-board-resolver-v2.js +47 -0
  121. package/plugins/specweave-github/lib/github-board-resolver-v2.ts +73 -0
  122. package/plugins/specweave-github/lib/github-conflict-resolver.js +90 -0
  123. package/plugins/specweave-github/lib/github-conflict-resolver.ts +154 -0
  124. package/plugins/specweave-github/lib/github-cross-repo-sync.js +168 -0
  125. package/plugins/specweave-github/lib/github-cross-repo-sync.ts +252 -0
  126. package/plugins/specweave-github/lib/github-field-sync.js +116 -0
  127. package/plugins/specweave-github/lib/github-field-sync.ts +165 -0
  128. package/plugins/specweave-github/lib/github-graphql-client.js +129 -0
  129. package/plugins/specweave-github/lib/github-graphql-client.ts +181 -0
  130. package/plugins/specweave-github/lib/github-issue-body-generator.js +30 -0
  131. package/plugins/specweave-github/lib/github-issue-body-generator.ts +76 -0
  132. package/plugins/specweave-github/lib/github-issue-body-parser.js +55 -0
  133. package/plugins/specweave-github/lib/github-issue-body-parser.ts +92 -0
  134. package/plugins/specweave-github/lib/github-pull-sync.js +185 -0
  135. package/plugins/specweave-github/lib/github-pull-sync.ts +343 -0
  136. package/plugins/specweave-github/lib/github-push-sync.js +119 -0
  137. package/plugins/specweave-github/lib/github-push-sync.ts +174 -0
  138. package/plugins/specweave-github/lib/github-rate-limiter.js +96 -0
  139. package/plugins/specweave-github/lib/github-rate-limiter.ts +143 -0
  140. package/plugins/specweave-github/lib/github-spec-frontmatter-updater.js +117 -0
  141. package/plugins/specweave-github/lib/github-spec-frontmatter-updater.ts +180 -0
  142. package/plugins/specweave-github/lib/github-sync-orchestrator.js +84 -0
  143. package/plugins/specweave-github/lib/github-sync-orchestrator.ts +156 -0
  144. package/plugins/specweave-github/lib/github-us-auto-closer.js +134 -0
  145. package/plugins/specweave-github/lib/github-us-auto-closer.ts +226 -0
  146. package/plugins/specweave-github/lib/index.js +1 -7
  147. package/plugins/specweave-github/lib/index.ts +1 -4
  148. package/plugins/specweave-github/skills/github-sync/SKILL.md +76 -4
  149. package/plugins/specweave-testing/commands/e2e-setup.md +18 -0
  150. package/plugins/specweave-testing/commands/ui-automate.md +2 -0
  151. package/plugins/specweave-testing/commands/ui-inspect.md +8 -0
  152. package/plugins/specweave-testing/lib/playwright-ci-defaults.d.ts +6 -0
  153. package/plugins/specweave-testing/lib/playwright-ci-defaults.js +14 -0
  154. package/plugins/specweave-testing/lib/playwright-ci-defaults.ts +24 -0
  155. package/plugins/specweave-testing/lib/playwright-cli-detector.js +33 -0
  156. package/plugins/specweave-testing/lib/playwright-cli-detector.ts +48 -0
  157. package/plugins/specweave-testing/lib/playwright-cli-runner.js +58 -0
  158. package/plugins/specweave-testing/lib/playwright-cli-runner.ts +80 -0
  159. package/plugins/specweave-testing/lib/playwright-routing.js +16 -0
  160. package/plugins/specweave-testing/lib/playwright-routing.ts +38 -0
  161. package/plugins/specweave-testing/skills/e2e-testing/SKILL.md +38 -0
  162. package/src/templates/CLAUDE.md.template +7 -0
  163. package/src/templates/config.json.template +9 -1
  164. package/dist/plugins/specweave-github/lib/subtask-sync.d.ts +0 -51
  165. package/dist/plugins/specweave-github/lib/subtask-sync.d.ts.map +0 -1
  166. package/dist/plugins/specweave-github/lib/subtask-sync.js +0 -147
  167. package/dist/plugins/specweave-github/lib/subtask-sync.js.map +0 -1
  168. package/dist/plugins/specweave-github/lib/task-parser.d.ts +0 -37
  169. package/dist/plugins/specweave-github/lib/task-parser.d.ts.map +0 -1
  170. package/dist/plugins/specweave-github/lib/task-parser.js +0 -211
  171. package/dist/plugins/specweave-github/lib/task-parser.js.map +0 -1
  172. package/dist/plugins/specweave-github/lib/task-sync.d.ts +0 -56
  173. package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +0 -1
  174. package/dist/plugins/specweave-github/lib/task-sync.js +0 -375
  175. package/dist/plugins/specweave-github/lib/task-sync.js.map +0 -1
  176. package/plugins/specweave/hooks/validate-completion-conditions.sh +0 -474
  177. package/plugins/specweave-github/lib/subtask-sync.d.ts +0 -51
  178. package/plugins/specweave-github/lib/subtask-sync.d.ts.map +0 -1
  179. package/plugins/specweave-github/lib/subtask-sync.js +0 -154
  180. package/plugins/specweave-github/lib/subtask-sync.js.map +0 -1
  181. package/plugins/specweave-github/lib/subtask-sync.ts +0 -225
  182. package/plugins/specweave-github/lib/task-parser.d.js +0 -0
  183. package/plugins/specweave-github/lib/task-parser.d.ts +0 -37
  184. package/plugins/specweave-github/lib/task-parser.d.ts.map +0 -1
  185. package/plugins/specweave-github/lib/task-parser.js +0 -195
  186. package/plugins/specweave-github/lib/task-parser.js.map +0 -1
  187. package/plugins/specweave-github/lib/task-parser.ts +0 -246
  188. package/plugins/specweave-github/lib/task-sync.d.js +0 -0
  189. package/plugins/specweave-github/lib/task-sync.d.ts +0 -51
  190. package/plugins/specweave-github/lib/task-sync.d.ts.map +0 -1
  191. package/plugins/specweave-github/lib/task-sync.js +0 -415
  192. package/plugins/specweave-github/lib/task-sync.js.map +0 -1
  193. package/plugins/specweave-github/lib/task-sync.ts +0 -451
  194. package/plugins/specweave-github/skills/github-issue-tracker/SKILL.md +0 -496
  195. /package/plugins/specweave/hooks/{stop-auto.sh → _archive/stop-auto-v4-legacy.sh} +0 -0
  196. /package/plugins/{specweave-github/lib/subtask-sync.d.js → specweave-testing/lib/playwright-ci-defaults.d.js} +0 -0
@@ -0,0 +1,38 @@
1
+ import { detectPlaywrightCli } from './playwright-cli-detector.js';
2
+
3
+ export type PlaywrightMode = 'cli' | 'mcp';
4
+
5
+ export type TaskType =
6
+ | 'ui-automate'
7
+ | 'e2e-test-run'
8
+ | 'screenshot'
9
+ | 'form-automation'
10
+ | 'ci-testing'
11
+ | 'ui-inspect'
12
+ | 'page-exploration'
13
+ | 'self-healing-test';
14
+
15
+ export interface RoutingConfig {
16
+ preferCli?: boolean;
17
+ }
18
+
19
+ /** Tasks that benefit from MCP's rich DOM introspection */
20
+ const MCP_PREFERRED_TASKS: ReadonlySet<TaskType> = new Set([
21
+ 'ui-inspect',
22
+ 'page-exploration',
23
+ 'self-healing-test',
24
+ ]);
25
+
26
+ export function resolvePlaywrightMode(
27
+ task: TaskType,
28
+ config: RoutingConfig = {},
29
+ ): PlaywrightMode {
30
+ const { preferCli = true } = config;
31
+
32
+ if (!preferCli) return 'mcp';
33
+
34
+ const detection = detectPlaywrightCli({ useCache: true });
35
+ if (!detection.installed) return 'mcp';
36
+
37
+ return MCP_PREFERRED_TASKS.has(task) ? 'mcp' : 'cli';
38
+ }
@@ -230,6 +230,44 @@ e2e/
230
230
  └── playwright.config.ts
231
231
  ```
232
232
 
233
+ ## Browser Automation Mode: CLI vs MCP
234
+
235
+ SpecWeave provides dual-mode browser automation for optimal token efficiency:
236
+
237
+ | Mode | Tool | Best For | Token Cost |
238
+ |------|------|----------|------------|
239
+ | **CLI** | `@playwright/cli` (Bash) | Test execution, automation, CI/CD | ~250 chars/action |
240
+ | **MCP** | Playwright MCP plugin | Interactive inspection, self-healing | ~5K+ chars/action |
241
+
242
+ ### When to Use CLI Mode
243
+ - Running E2E test suites (`npx playwright test`)
244
+ - Generating automation scripts
245
+ - CI/CD pipelines (headless by default)
246
+ - Token-constrained sessions
247
+ - Network mocking and auth state management
248
+
249
+ ### When to Use MCP Mode
250
+ - Interactive page exploration and debugging
251
+ - Self-healing test repair (needs full DOM reasoning)
252
+ - Element inspection with accessibility tree
253
+
254
+ ### Install CLI
255
+ ```bash
256
+ npm install -g @playwright/cli@latest
257
+ ```
258
+
259
+ ### Configuration
260
+ Set preference in `.specweave/config.json`:
261
+ ```json
262
+ {
263
+ "testing": {
264
+ "playwright": { "preferCli": true }
265
+ }
266
+ }
267
+ ```
268
+
269
+ The `sw-testing` skill layer routes automatically based on task type.
270
+
233
271
  ## Related Skills
234
272
 
235
273
  - `qa-engineer` - Overall test strategy
@@ -318,6 +318,13 @@ BDD in tasks.md | Unit >80% | `.test.ts` (Vitest)
318
318
  const { mockFn } = vi.hoisted(() => ({ mockFn: vi.fn() }));
319
319
  vi.mock('./module', () => ({ func: mockFn }));
320
320
  ```
321
+
322
+ ### Browser Automation Mode
323
+
324
+ **Default**: `@playwright/cli` if installed (98% token reduction vs MCP)
325
+ **Fallback**: Playwright MCP plugin (rich DOM introspection)
326
+ **Config**: `testing.playwright.preferCli: true|false` in `.specweave/config.json`
327
+ **Install CLI**: `npm install -g @playwright/cli@latest`
321
328
  <!-- /SECTION -->
322
329
 
323
330
  <!-- SECTION:tdd -->
@@ -5,6 +5,7 @@
5
5
  "sync": {
6
6
  "enabled": true,
7
7
  "provider": "github",
8
+ "autoSync": true,
8
9
  "includeStatus": true,
9
10
  "autoApplyLabels": true,
10
11
  "defaultProfile": "main",
@@ -13,7 +14,8 @@
13
14
  "canUpsertInternalItems": true,
14
15
  "canUpdateExternalItems": true,
15
16
  "canUpdateStatus": true,
16
- "autoSyncOnCompletion": true
17
+ "autoSyncOnCompletion": true,
18
+ "autoCreateOnIncrement": true
17
19
  },
18
20
 
19
21
  "github": {
@@ -42,6 +44,12 @@
42
44
  }
43
45
  },
44
46
 
47
+ "hooks": {
48
+ "post_increment_planning": {
49
+ "auto_create_github_issue": true
50
+ }
51
+ },
52
+
45
53
  "statusSync": {
46
54
  "enabled": true,
47
55
  "autoSync": true,
@@ -1,51 +0,0 @@
1
- /**
2
- * Subtask synchronization with GitHub issue checkboxes
3
- * Updates GitHub issue body when subtasks complete
4
- */
5
- export declare class SubtaskSync {
6
- private client;
7
- private incrementPath;
8
- constructor(incrementPath: string, repo?: string);
9
- /**
10
- * Update subtask status in GitHub issue
11
- */
12
- updateSubtaskStatus(taskId: string, subtaskId: string, completed: boolean): Promise<void>;
13
- /**
14
- * Sync all subtasks for a task
15
- */
16
- syncAllSubtasks(taskId: string): Promise<void>;
17
- /**
18
- * Update checkbox in issue body
19
- */
20
- private updateSubtaskCheckbox;
21
- /**
22
- * Check if all subtasks are done
23
- */
24
- private areAllSubtasksDone;
25
- /**
26
- * Escape special regex characters
27
- */
28
- private escapeRegex;
29
- /**
30
- * Post task completion comment to GitHub issue
31
- */
32
- postTaskCompletionComment(taskId: string, stats: {
33
- filesModified?: number;
34
- linesAdded?: number;
35
- linesDeleted?: number;
36
- testsAdded?: number;
37
- actualDuration?: string;
38
- estimatedDuration?: string;
39
- summary?: string;
40
- nextTask?: string;
41
- progress?: {
42
- completed: number;
43
- total: number;
44
- };
45
- }): Promise<void>;
46
- /**
47
- * Update epic issue progress
48
- */
49
- updateEpicProgress(epicIssueNumber: number, completed: number, total: number): Promise<void>;
50
- }
51
- //# sourceMappingURL=subtask-sync.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subtask-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/subtask-sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAKhD;;OAEG;IACG,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAuChB;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBpD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACG,yBAAyB,CAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;QACL,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;KACjD,GACA,OAAO,CAAC,IAAI,CAAC;IAuChB;;OAEG;IACG,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgCnG"}
@@ -1,147 +0,0 @@
1
- /**
2
- * Subtask synchronization with GitHub issue checkboxes
3
- * Updates GitHub issue body when subtasks complete
4
- */
5
- import { GitHubClient } from './github-client';
6
- import { TaskParser } from './task-parser';
7
- export class SubtaskSync {
8
- constructor(incrementPath, repo) {
9
- this.incrementPath = incrementPath;
10
- this.client = new GitHubClient(repo);
11
- }
12
- /**
13
- * Update subtask status in GitHub issue
14
- */
15
- async updateSubtaskStatus(taskId, subtaskId, completed) {
16
- // 1. Parse tasks to get task info
17
- const tasks = TaskParser.parseTasksFile(this.incrementPath);
18
- const task = tasks.find(t => t.id === taskId);
19
- if (!task) {
20
- throw new Error(`Task ${taskId} not found`);
21
- }
22
- if (!task.githubIssue) {
23
- console.warn(`Task ${taskId} not synced to GitHub. Skipping subtask sync.`);
24
- return;
25
- }
26
- // 2. Get current issue
27
- const issue = await this.client.getIssue(task.githubIssue);
28
- // 3. Update subtask checkbox in issue body
29
- const updatedBody = this.updateSubtaskCheckbox(issue.body, subtaskId, completed);
30
- // 4. Update GitHub issue
31
- await this.client.updateIssueBody(task.githubIssue, updatedBody);
32
- // 5. Check if all subtasks done
33
- const allDone = this.areAllSubtasksDone(updatedBody);
34
- if (allDone) {
35
- await this.client.addComment(task.githubIssue, '✅ All subtasks completed!');
36
- }
37
- console.log(`✅ Updated subtask ${subtaskId} in GitHub issue #${task.githubIssue}`);
38
- }
39
- /**
40
- * Sync all subtasks for a task
41
- */
42
- async syncAllSubtasks(taskId) {
43
- const tasks = TaskParser.parseTasksFile(this.incrementPath);
44
- const task = tasks.find(t => t.id === taskId);
45
- if (!task || !task.githubIssue || !task.subtasks) {
46
- return;
47
- }
48
- const issue = await this.client.getIssue(task.githubIssue);
49
- let updatedBody = issue.body;
50
- // Update all subtasks
51
- for (const subtask of task.subtasks) {
52
- updatedBody = this.updateSubtaskCheckbox(updatedBody, subtask.id, subtask.completed);
53
- }
54
- await this.client.updateIssueBody(task.githubIssue, updatedBody);
55
- console.log(`✅ Synced all subtasks for ${taskId} to GitHub issue #${task.githubIssue}`);
56
- }
57
- /**
58
- * Update checkbox in issue body
59
- */
60
- updateSubtaskCheckbox(body, subtaskId, completed) {
61
- const checkbox = completed ? '[x]' : '[ ]';
62
- // Try to find by subtask ID
63
- const idPattern = new RegExp(`^(- \\[[ x]\\]\\s+${this.escapeRegex(subtaskId)}:.+)$`, 'm');
64
- if (idPattern.test(body)) {
65
- return body.replace(idPattern, (match) => {
66
- return match.replace(/\[[ x]\]/, checkbox);
67
- });
68
- }
69
- // Fallback: try to find by description (less reliable)
70
- // This is a basic approach - could be enhanced
71
- return body;
72
- }
73
- /**
74
- * Check if all subtasks are done
75
- */
76
- areAllSubtasksDone(body) {
77
- const subtaskLines = body.match(/^- \[[ x]\] S-\d+-\d+:.+$/gm);
78
- if (!subtaskLines || subtaskLines.length === 0) {
79
- return false;
80
- }
81
- return subtaskLines.every(line => line.includes('[x]'));
82
- }
83
- /**
84
- * Escape special regex characters
85
- */
86
- escapeRegex(str) {
87
- return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
88
- }
89
- /**
90
- * Post task completion comment to GitHub issue
91
- */
92
- async postTaskCompletionComment(taskId, stats) {
93
- const tasks = TaskParser.parseTasksFile(this.incrementPath);
94
- const task = tasks.find(t => t.id === taskId);
95
- if (!task || !task.githubIssue) {
96
- return;
97
- }
98
- const { filesModified = 0, linesAdded = 0, linesDeleted = 0, testsAdded = 0, actualDuration = 'Unknown', estimatedDuration = task.estimate, summary = 'No summary provided', nextTask = 'None', progress } = stats;
99
- const comment = `✅ **Task Completed**
100
-
101
- **Files Modified**: ${filesModified} files (+${linesAdded}/-${linesDeleted} lines)
102
- **Tests**: ${testsAdded > 0 ? `All passing (${testsAdded} new tests)` : 'All passing'}
103
- **Duration**: ${actualDuration} (estimated: ${estimatedDuration})
104
-
105
- **What Changed**:
106
- ${summary}
107
-
108
- **Next Task**: ${nextTask}
109
-
110
- ---
111
- ${progress ? `Progress: ${progress.completed}/${progress.total} tasks (${Math.round(progress.completed / progress.total * 100)}%)` : ''}
112
- 🤖 Posted by SpecWeave`;
113
- await this.client.addComment(task.githubIssue, comment);
114
- console.log(`✅ Posted completion comment to issue #${task.githubIssue}`);
115
- }
116
- /**
117
- * Update epic issue progress
118
- */
119
- async updateEpicProgress(epicIssueNumber, completed, total) {
120
- const epic = await this.client.getIssue(epicIssueNumber);
121
- // Update checkboxes in epic body
122
- const tasks = TaskParser.parseTasksFile(this.incrementPath);
123
- let updatedBody = epic.body;
124
- for (const task of tasks) {
125
- if (task.status === 'completed') {
126
- // Find and check the checkbox for this task
127
- const taskPattern = new RegExp(`^(- \\[[ x]\\] \\[${this.escapeRegex(task.id)}\\].+)$`, 'm');
128
- if (taskPattern.test(updatedBody)) {
129
- updatedBody = updatedBody.replace(taskPattern, (match) => {
130
- return match.replace(/\[[ x]\]/, '[x]');
131
- });
132
- }
133
- }
134
- }
135
- await this.client.updateIssueBody(epicIssueNumber, updatedBody);
136
- // Post progress comment
137
- const progressComment = `📊 **Progress Update**
138
-
139
- ${completed}/${total} tasks completed (${Math.round(completed / total * 100)}%)
140
-
141
- ---
142
- 🤖 Updated by SpecWeave`;
143
- await this.client.addComment(epicIssueNumber, progressComment);
144
- console.log(`✅ Updated epic issue #${epicIssueNumber} progress`);
145
- }
146
- }
147
- //# sourceMappingURL=subtask-sync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subtask-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/subtask-sync.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- /**
2
- * Parser for tasks.md files
3
- * Extracts task information for GitHub sync
4
- */
5
- import { Task } from './types';
6
- export declare class TaskParser {
7
- /**
8
- * Parse tasks.md file and extract all tasks
9
- */
10
- static parseTasksFile(incrementPath: string): Task[];
11
- /**
12
- * Parse task content into structured Task objects
13
- */
14
- static parseTasks(content: string): Task[];
15
- /**
16
- * Parse individual task section
17
- */
18
- private static parseTask;
19
- private static extractPriority;
20
- private static extractEstimate;
21
- private static extractStatus;
22
- private static extractDescription;
23
- private static extractGitHubIssue;
24
- private static extractAssignee;
25
- private static extractSubtasks;
26
- private static extractFiles;
27
- private static extractImplementation;
28
- private static extractAcceptanceCriteria;
29
- private static extractDependencies;
30
- private static extractBlocks;
31
- private static extractPhase;
32
- /**
33
- * Update tasks.md file with GitHub issue numbers
34
- */
35
- static updateTasksWithGitHubIssues(incrementPath: string, taskIssueMap: Record<string, number>): void;
36
- }
37
- //# sourceMappingURL=task-parser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-parser.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/task-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,IAAI,EAAW,MAAM,SAAS,CAAC;AAExC,qBAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,EAAE;IAWpD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE;IAwB1C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IA8BxB,OAAO,CAAC,MAAM,CAAC,eAAe;IAK9B,OAAO,CAAC,MAAM,CAAC,eAAe;IAK9B,OAAO,CAAC,MAAM,CAAC,aAAa;IAS5B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAKjC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAKjC,OAAO,CAAC,MAAM,CAAC,eAAe;IAK9B,OAAO,CAAC,MAAM,CAAC,eAAe;IA6B9B,OAAO,CAAC,MAAM,CAAC,YAAY;IAS3B,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAKpC,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAQxC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAQlC,OAAO,CAAC,MAAM,CAAC,aAAa;IAQ5B,OAAO,CAAC,MAAM,CAAC,YAAY;IAe3B;;OAEG;IACH,MAAM,CAAC,2BAA2B,CAChC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,IAAI;CAuCR"}
@@ -1,211 +0,0 @@
1
- /**
2
- * Parser for tasks.md files
3
- * Extracts task information for GitHub sync
4
- */
5
- import * as fs from 'fs';
6
- import * as path from 'path';
7
- export class TaskParser {
8
- /**
9
- * Parse tasks.md file and extract all tasks
10
- */
11
- static parseTasksFile(incrementPath) {
12
- const tasksPath = path.join(incrementPath, 'tasks.md');
13
- if (!fs.existsSync(tasksPath)) {
14
- throw new Error(`tasks.md not found at ${tasksPath}`);
15
- }
16
- const content = fs.readFileSync(tasksPath, 'utf-8');
17
- return this.parseTasks(content);
18
- }
19
- /**
20
- * Parse task content into structured Task objects
21
- */
22
- static parseTasks(content) {
23
- const tasks = [];
24
- // Split by task headers (### T-XXX:)
25
- const taskPattern = /###\s+(T-\d+(?:-[A-Z])?):\s+(.+?)$/gm;
26
- const matches = [...content.matchAll(taskPattern)];
27
- for (let i = 0; i < matches.length; i++) {
28
- const match = matches[i];
29
- const taskId = match[1];
30
- const taskTitle = match[2].trim();
31
- const startIndex = match.index;
32
- const endIndex = i < matches.length - 1 ? matches[i + 1].index : content.length;
33
- const taskContent = content.substring(startIndex, endIndex);
34
- const task = this.parseTask(taskId, taskTitle, taskContent);
35
- if (task) {
36
- tasks.push(task);
37
- }
38
- }
39
- return tasks;
40
- }
41
- /**
42
- * Parse individual task section
43
- */
44
- static parseTask(taskId, taskTitle, content) {
45
- try {
46
- const task = {
47
- id: taskId,
48
- title: taskTitle,
49
- priority: this.extractPriority(content),
50
- estimate: this.extractEstimate(content),
51
- status: this.extractStatus(content),
52
- description: this.extractDescription(content),
53
- };
54
- // Optional fields
55
- task.githubIssue = this.extractGitHubIssue(content);
56
- task.assignee = this.extractAssignee(content);
57
- task.subtasks = this.extractSubtasks(content);
58
- task.filesToCreate = this.extractFiles(content, 'Files to Create');
59
- task.filesToModify = this.extractFiles(content, 'Files to Modify');
60
- task.implementation = this.extractImplementation(content);
61
- task.acceptanceCriteria = this.extractAcceptanceCriteria(content);
62
- task.dependencies = this.extractDependencies(content);
63
- task.blocks = this.extractBlocks(content);
64
- task.phase = this.extractPhase(content);
65
- return task;
66
- }
67
- catch (error) {
68
- console.error(`Error parsing task ${taskId}:`, error);
69
- return null;
70
- }
71
- }
72
- static extractPriority(content) {
73
- const match = content.match(/\*\*Priority\*\*:\s+(P[0-3])/);
74
- return match?.[1] || 'P1';
75
- }
76
- static extractEstimate(content) {
77
- const match = content.match(/\*\*Estimate\*\*:\s+(.+?)$/m);
78
- return match?.[1]?.trim() || 'Unknown';
79
- }
80
- static extractStatus(content) {
81
- const match = content.match(/\*\*Status\*\*:\s+(\w+)/);
82
- const status = match?.[1];
83
- if (status === 'pending' || status === 'in_progress' || status === 'completed' || status === 'blocked') {
84
- return status;
85
- }
86
- return 'pending';
87
- }
88
- static extractDescription(content) {
89
- const match = content.match(/\*\*Description\*\*:\s*\n(.+?)(?=\n\*\*|$)/s);
90
- return match?.[1]?.trim() || '';
91
- }
92
- static extractGitHubIssue(content) {
93
- const match = content.match(/\*\*GitHub Issue\*\*:\s+#(\d+)/);
94
- return match ? parseInt(match[1], 10) : undefined;
95
- }
96
- static extractAssignee(content) {
97
- const match = content.match(/\*\*Assignee\*\*:\s+@?(\w+)/);
98
- return match?.[1];
99
- }
100
- static extractSubtasks(content) {
101
- const subtaskSection = content.match(/\*\*Subtasks\*\*:?\s*\n((?:- \[.\] .+\n?)+)/);
102
- if (!subtaskSection)
103
- return undefined;
104
- const subtaskLines = subtaskSection[1].match(/- \[(x| )\] (.+?)(?:\((.+?)\))?$/gm);
105
- if (!subtaskLines)
106
- return undefined;
107
- return subtaskLines.map(line => {
108
- const match = line.match(/- \[(x| )\] (.+?)(?:\((.+?)\))?$/);
109
- if (!match)
110
- return null;
111
- const completed = match[1] === 'x';
112
- const description = match[2].trim();
113
- const estimate = match[3]?.trim() || 'Unknown';
114
- // Extract subtask ID if present (S-XXX-XX format)
115
- const idMatch = description.match(/^(S-\d+-\d+):\s*(.+)/);
116
- const id = idMatch ? idMatch[1] : `S-${Date.now()}`; // Fallback ID
117
- const cleanDescription = idMatch ? idMatch[2] : description;
118
- return {
119
- id,
120
- description: cleanDescription,
121
- estimate,
122
- completed
123
- };
124
- }).filter((st) => st !== null);
125
- }
126
- static extractFiles(content, section) {
127
- const pattern = new RegExp(`\\*\\*${section}\\*\\*:?\\s*\\n((?:- \`.+?\`\\n?)+)`, 's');
128
- const match = content.match(pattern);
129
- if (!match)
130
- return undefined;
131
- const files = match[1].match(/- `(.+?)`/g);
132
- return files?.map(f => f.replace(/- `(.+?)`/, '$1'));
133
- }
134
- static extractImplementation(content) {
135
- const match = content.match(/\*\*Implementation\*\*:?\s*\n```[\w]*\n([\s\S]+?)\n```/);
136
- return match?.[1]?.trim();
137
- }
138
- static extractAcceptanceCriteria(content) {
139
- const match = content.match(/\*\*Acceptance Criteria\*\*:?\s*\n((?:- .+\n?)+)/);
140
- if (!match)
141
- return undefined;
142
- const criteria = match[1].match(/- (.+)/g);
143
- return criteria?.map(c => c.replace(/^- /, '').replace(/^✅\s*/, ''));
144
- }
145
- static extractDependencies(content) {
146
- const match = content.match(/\*\*Dependencies\*\*:?\s*\n((?:- .+\n?)+)/);
147
- if (!match)
148
- return undefined;
149
- const deps = match[1].match(/- (T-\d+(?:-[A-Z])?)/g);
150
- return deps?.map(d => d.replace(/^- /, '').match(/(T-\d+(?:-[A-Z])?)/)?.[1]).filter((d) => !!d);
151
- }
152
- static extractBlocks(content) {
153
- const match = content.match(/\*\*Blocks\*\*:?\s*\n((?:- .+\n?)+)/);
154
- if (!match)
155
- return undefined;
156
- const blocks = match[1].match(/- (T-\d+(?:-[A-Z])?)/g);
157
- return blocks?.map(b => b.replace(/^- /, '').match(/(T-\d+(?:-[A-Z])?)/)?.[1]).filter((b) => !!b);
158
- }
159
- static extractPhase(content) {
160
- // Look backwards in content to find phase header
161
- const lines = content.split('\n');
162
- for (let i = 0; i < lines.length; i++) {
163
- const line = lines[i];
164
- if (line.startsWith('##') && !line.startsWith('###')) {
165
- const phaseMatch = line.match(/##\s+(.+?)(?:\s+-\s+\d+\s+tasks)?$/);
166
- if (phaseMatch) {
167
- return phaseMatch[1].trim();
168
- }
169
- }
170
- }
171
- return undefined;
172
- }
173
- /**
174
- * Update tasks.md file with GitHub issue numbers
175
- */
176
- static updateTasksWithGitHubIssues(incrementPath, taskIssueMap) {
177
- const tasksPath = path.join(incrementPath, 'tasks.md');
178
- let content = fs.readFileSync(tasksPath, 'utf-8');
179
- for (const [taskId, issueNumber] of Object.entries(taskIssueMap)) {
180
- // Find task section
181
- const taskHeaderPattern = new RegExp(`(###\\s+${taskId}:.+?$)`, 'm');
182
- const match = content.match(taskHeaderPattern);
183
- if (!match)
184
- continue;
185
- const taskStart = match.index;
186
- const nextTaskPattern = /###\s+T-\d+(?:-[A-Z])?:/g;
187
- nextTaskPattern.lastIndex = taskStart + match[0].length;
188
- const nextMatch = nextTaskPattern.exec(content);
189
- const taskEnd = nextMatch ? nextMatch.index : content.length;
190
- const taskSection = content.substring(taskStart, taskEnd);
191
- // Check if GitHub Issue field already exists
192
- if (taskSection.includes('**GitHub Issue**:')) {
193
- // Update existing
194
- const updatedSection = taskSection.replace(/\*\*GitHub Issue\*\*:.+$/m, `**GitHub Issue**: #${issueNumber}`);
195
- content = content.substring(0, taskStart) + updatedSection + content.substring(taskEnd);
196
- }
197
- else {
198
- // Add after Status line
199
- const statusLinePattern = /(\*\*Status\*\*:.+?$)/m;
200
- const statusMatch = taskSection.match(statusLinePattern);
201
- if (statusMatch) {
202
- const insertPoint = taskStart + taskSection.indexOf(statusMatch[0]) + statusMatch[0].length;
203
- const insertion = `\n**GitHub Issue**: #${issueNumber}`;
204
- content = content.substring(0, insertPoint) + insertion + content.substring(insertPoint);
205
- }
206
- }
207
- }
208
- fs.writeFileSync(tasksPath, content, 'utf-8');
209
- }
210
- }
211
- //# sourceMappingURL=task-parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-parser.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/task-parser.ts"],"names":[],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- /**
2
- * Task-level GitHub synchronization
3
- * Orchestrates syncing tasks.md to GitHub issues
4
- */
5
- import { SyncResult, GitHubSyncOptions } from './types';
6
- export declare class TaskSync {
7
- private client;
8
- private incrementPath;
9
- constructor(incrementPath: string, repo?: string);
10
- /**
11
- * Sync all tasks to GitHub (main entry point)
12
- */
13
- syncTasks(options?: GitHubSyncOptions): Promise<SyncResult>;
14
- /**
15
- * Generate epic issue body
16
- */
17
- private generateEpicBody;
18
- /**
19
- * Generate task issue body
20
- */
21
- private generateTaskBody;
22
- /**
23
- * Load increment metadata
24
- */
25
- private loadIncrementMetadata;
26
- /**
27
- * Save increment metadata
28
- */
29
- private saveIncrementMetadata;
30
- /**
31
- * Get issue prefix from metadata.json (with created date)
32
- * Returns FS-YY-MM-DD format or fallback to FS-UNKNOWN
33
- */
34
- private getIssuePrefix;
35
- /**
36
- * Save sync mapping
37
- */
38
- private saveSyncMapping;
39
- /**
40
- * Get milestone title from metadata
41
- */
42
- private getMilestoneTitle;
43
- /**
44
- * Get GitHub file URL
45
- */
46
- private getGitHubFileURL;
47
- /**
48
- * Convert string to slug
49
- */
50
- private slugify;
51
- /**
52
- * Print dry run summary
53
- */
54
- private printDryRunSummary;
55
- }
56
- //# sourceMappingURL=task-sync.d.ts.map