specweave 0.21.3 → 0.22.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +409 -6
- package/README.md +38 -8
- package/bin/specweave.js +5 -8
- package/dist/plugins/specweave-github/lib/CodeValidator.d.ts +101 -0
- package/dist/plugins/specweave-github/lib/CodeValidator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/CodeValidator.js +219 -0
- package/dist/plugins/specweave-github/lib/CodeValidator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts +182 -0
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +603 -0
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +10 -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 +26 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/task-sync.js +7 -0
- package/dist/plugins/specweave-github/lib/task-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/types.d.ts +34 -0
- package/dist/plugins/specweave-github/lib/types.d.ts.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +60 -5
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.d.ts +1 -0
- package/dist/src/cli/commands/migrate-to-profiles.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.js +12 -1
- package/dist/src/cli/commands/migrate-to-profiles.js.map +1 -1
- package/dist/src/cli/commands/next-command.d.ts +52 -0
- package/dist/src/cli/commands/next-command.d.ts.map +1 -0
- package/dist/src/cli/commands/next-command.js +204 -0
- package/dist/src/cli/commands/next-command.js.map +1 -0
- package/dist/src/cli/commands/sync-specs.d.ts +16 -0
- package/dist/src/cli/commands/sync-specs.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-specs.js +130 -0
- package/dist/src/cli/commands/sync-specs.js.map +1 -0
- package/dist/src/cli/count-tasks.d.ts +20 -0
- package/dist/src/cli/count-tasks.d.ts.map +1 -0
- package/dist/src/cli/count-tasks.js +50 -0
- package/dist/src/cli/count-tasks.js.map +1 -0
- package/dist/src/config/ConfigManager.d.ts.map +1 -1
- package/dist/src/config/ConfigManager.js +2 -1
- package/dist/src/config/ConfigManager.js.map +1 -1
- package/dist/src/config/types.d.ts +58 -58
- package/dist/src/core/cicd/state-manager.d.ts +8 -0
- package/dist/src/core/cicd/state-manager.d.ts.map +1 -1
- package/dist/src/core/cicd/state-manager.js +60 -15
- package/dist/src/core/cicd/state-manager.js.map +1 -1
- package/dist/src/core/cost-tracker.d.ts.map +1 -1
- package/dist/src/core/cost-tracker.js +2 -1
- package/dist/src/core/cost-tracker.js.map +1 -1
- package/dist/src/core/iac/template-engine.d.ts.map +1 -1
- package/dist/src/core/iac/template-engine.js +28 -0
- package/dist/src/core/iac/template-engine.js.map +1 -1
- package/dist/src/core/iac/template-generator.d.ts +53 -0
- package/dist/src/core/iac/template-generator.d.ts.map +1 -0
- package/dist/src/core/iac/template-generator.js +125 -0
- package/dist/src/core/iac/template-generator.js.map +1 -0
- package/dist/src/core/increment/status-auto-transition.js +3 -3
- package/dist/src/core/increment/status-auto-transition.js.map +1 -1
- package/dist/src/core/living-docs/CodeValidator.js +1 -1
- package/dist/src/core/living-docs/CodeValidator.js.map +1 -1
- package/dist/src/core/living-docs/CompletionPropagator.d.ts.map +1 -1
- package/dist/src/core/living-docs/CompletionPropagator.js +4 -3
- package/dist/src/core/living-docs/CompletionPropagator.js.map +1 -1
- package/dist/src/core/living-docs/SpecDistributor.d.ts +5 -0
- package/dist/src/core/living-docs/SpecDistributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/SpecDistributor.js +12 -0
- package/dist/src/core/living-docs/SpecDistributor.js.map +1 -1
- package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/content-distributor.js +11 -1
- package/dist/src/core/living-docs/content-distributor.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +166 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -0
- package/dist/src/core/living-docs/living-docs-sync.js +726 -0
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +38 -0
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +7 -3
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.js +40 -24
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -1
- package/dist/src/core/plugin-loader.d.ts +7 -0
- package/dist/src/core/plugin-loader.d.ts.map +1 -1
- package/dist/src/core/plugin-loader.js +18 -1
- package/dist/src/core/plugin-loader.js.map +1 -1
- package/dist/src/core/serverless/platform-data-loader.d.ts +8 -0
- package/dist/src/core/serverless/platform-data-loader.d.ts.map +1 -1
- package/dist/src/core/serverless/platform-data-loader.js +14 -0
- package/dist/src/core/serverless/platform-data-loader.js.map +1 -1
- package/dist/src/core/serverless/types.d.ts +1 -1
- package/dist/src/core/serverless/types.d.ts.map +1 -1
- package/dist/src/core/status-line/status-line-manager.d.ts +6 -2
- package/dist/src/core/status-line/status-line-manager.d.ts.map +1 -1
- package/dist/src/core/status-line/status-line-manager.js +11 -5
- package/dist/src/core/status-line/status-line-manager.js.map +1 -1
- package/dist/src/core/status-line/task-counter.d.ts +69 -0
- package/dist/src/core/status-line/task-counter.d.ts.map +1 -0
- package/dist/src/core/status-line/task-counter.js +107 -0
- package/dist/src/core/status-line/task-counter.js.map +1 -0
- package/dist/src/core/types/config.d.ts +23 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +10 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/workflow/autonomous-executor.d.ts +111 -0
- package/dist/src/core/workflow/autonomous-executor.d.ts.map +1 -0
- package/dist/src/core/workflow/autonomous-executor.js +275 -0
- package/dist/src/core/workflow/autonomous-executor.js.map +1 -0
- package/dist/src/core/workflow/backlog-scanner.d.ts +94 -0
- package/dist/src/core/workflow/backlog-scanner.d.ts.map +1 -0
- package/dist/src/core/workflow/backlog-scanner.js +170 -0
- package/dist/src/core/workflow/backlog-scanner.js.map +1 -0
- package/dist/src/core/workflow/command-invoker.d.ts +86 -0
- package/dist/src/core/workflow/command-invoker.d.ts.map +1 -0
- package/dist/src/core/workflow/command-invoker.js +131 -0
- package/dist/src/core/workflow/command-invoker.js.map +1 -0
- package/dist/src/core/workflow/cost-estimator.d.ts +120 -0
- package/dist/src/core/workflow/cost-estimator.d.ts.map +1 -0
- package/dist/src/core/workflow/cost-estimator.js +222 -0
- package/dist/src/core/workflow/cost-estimator.js.map +1 -0
- package/dist/src/core/workflow/index.d.ts +20 -0
- package/dist/src/core/workflow/index.d.ts.map +1 -0
- package/dist/src/core/workflow/index.js +24 -0
- package/dist/src/core/workflow/index.js.map +1 -0
- package/dist/src/core/workflow/state-manager.d.ts +107 -0
- package/dist/src/core/workflow/state-manager.d.ts.map +1 -0
- package/dist/src/core/workflow/state-manager.js +126 -0
- package/dist/src/core/workflow/state-manager.js.map +1 -0
- package/dist/src/core/workflow/workflow-orchestrator.d.ts +93 -0
- package/dist/src/core/workflow/workflow-orchestrator.d.ts.map +1 -0
- package/dist/src/core/workflow/workflow-orchestrator.js +195 -0
- package/dist/src/core/workflow/workflow-orchestrator.js.map +1 -0
- package/dist/src/init/ArchitecturePresenter.d.ts +47 -0
- package/dist/src/init/ArchitecturePresenter.d.ts.map +1 -0
- package/dist/src/init/ArchitecturePresenter.js +180 -0
- package/dist/src/init/ArchitecturePresenter.js.map +1 -0
- package/dist/src/init/InitFlow.d.ts.map +1 -1
- package/dist/src/init/InitFlow.js +30 -1
- package/dist/src/init/InitFlow.js.map +1 -1
- package/dist/src/init/architecture/CostEstimator.d.ts +52 -0
- package/dist/src/init/architecture/CostEstimator.d.ts.map +1 -0
- package/dist/src/init/architecture/CostEstimator.js +107 -0
- package/dist/src/init/architecture/CostEstimator.js.map +1 -0
- package/dist/src/init/architecture/InfrastructureMapper.d.ts +41 -0
- package/dist/src/init/architecture/InfrastructureMapper.d.ts.map +1 -0
- package/dist/src/init/architecture/InfrastructureMapper.js +140 -0
- package/dist/src/init/architecture/InfrastructureMapper.js.map +1 -0
- package/dist/src/init/architecture/ProjectGenerator.d.ts +44 -0
- package/dist/src/init/architecture/ProjectGenerator.d.ts.map +1 -0
- package/dist/src/init/architecture/ProjectGenerator.js +216 -0
- package/dist/src/init/architecture/ProjectGenerator.js.map +1 -0
- package/dist/src/init/architecture/types.d.ts +10 -10
- package/dist/src/init/research/src/config/types.d.ts +8 -8
- package/dist/src/metrics/dora-calculator.js +2 -2
- package/dist/src/metrics/dora-calculator.js.map +1 -1
- package/dist/src/utils/pricing-constants.d.ts +5 -2
- package/dist/src/utils/pricing-constants.d.ts.map +1 -1
- package/dist/src/utils/pricing-constants.js +3 -2
- package/dist/src/utils/pricing-constants.js.map +1 -1
- package/package.json +9 -8
- package/plugins/specweave/agents/infrastructure/AGENT.md +88 -46
- package/plugins/specweave/agents/pm/AGENT.md +58 -1
- package/plugins/specweave/commands/specweave-archive-features.md +1 -1
- package/plugins/specweave/commands/specweave-archive-increments.md +1 -1
- package/plugins/specweave/commands/specweave-check-hooks.md +5 -0
- package/plugins/specweave/commands/specweave-done.md +12 -0
- package/plugins/specweave/commands/specweave-plan.md +1 -1
- package/plugins/specweave/commands/specweave-progress.md +108 -379
- package/plugins/specweave/commands/specweave-reopen.md +1 -1
- package/plugins/specweave/commands/specweave-restore-feature.md +1 -1
- package/plugins/specweave/commands/specweave-sync-specs.md +20 -48
- package/plugins/specweave/hooks/lib/update-status-line.sh +44 -35
- package/plugins/specweave/hooks/lib/validate-spec-status.sh +163 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +17 -35
- package/plugins/specweave/lib/hooks/update-tasks-md.js +52 -9
- package/plugins/specweave/lib/hooks/update-tasks-md.ts +77 -16
- package/plugins/specweave/templates/iac/aws-lambda/defaults.json +24 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/README.md.hbs +260 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/environments/dev.tfvars.hbs +34 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/environments/prod.tfvars.hbs +37 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/environments/staging.tfvars.hbs +35 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/outputs.tf.hbs +77 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/providers.tf.hbs +36 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/variables.tf.hbs +115 -0
- package/plugins/specweave/templates/iac/azure-functions/defaults.json +25 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/README.md.hbs +268 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/environments/dev.tfvars.hbs +34 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/environments/prod.tfvars.hbs +46 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/environments/staging.tfvars.hbs +34 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/main.tf.hbs +225 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/outputs.tf.hbs +89 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/provider.tf.hbs +27 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/providers.tf.hbs +35 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/variables.tf.hbs +124 -0
- package/plugins/specweave/templates/iac/firebase/defaults.json +29 -0
- package/plugins/specweave/templates/iac/firebase/templates/README.md.hbs +35 -0
- package/plugins/specweave/templates/iac/firebase/templates/environments/dev.tfvars.hbs +7 -0
- package/plugins/specweave/templates/iac/firebase/templates/environments/prod.tfvars.hbs +7 -0
- package/plugins/specweave/templates/iac/firebase/templates/environments/staging.tfvars.hbs +7 -0
- package/plugins/specweave/templates/iac/firebase/templates/main.tf.hbs +90 -0
- package/plugins/specweave/templates/iac/firebase/templates/outputs.tf.hbs +15 -0
- package/plugins/specweave/templates/iac/firebase/templates/providers.tf.hbs +23 -0
- package/plugins/specweave/templates/iac/firebase/templates/variables.tf.hbs +42 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/defaults.json +26 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/README.md.hbs +299 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/dev.tfvars.hbs +36 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/prod.tfvars.hbs +48 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/staging.tfvars.hbs +41 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/main.tf.hbs +192 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/outputs.tf.hbs +66 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/providers.tf.hbs +25 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/variables.tf.hbs +119 -0
- package/plugins/specweave/templates/iac/supabase/defaults.json +15 -0
- package/plugins/specweave/templates/iac/supabase/templates/README.md.hbs +46 -0
- package/plugins/specweave/templates/iac/supabase/templates/main.tf.hbs +50 -0
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-github/agents/github-manager/AGENT.md +39 -7
- package/plugins/specweave-github/commands/specweave-github-create-issue.md +5 -5
- package/plugins/specweave-github/lib/CodeValidator.js +195 -0
- package/plugins/specweave-github/lib/CodeValidator.ts +284 -0
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.js +545 -0
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +809 -0
- package/plugins/specweave-github/lib/github-client-v2.js +29 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +30 -0
- package/plugins/specweave-github/lib/task-sync.js +4 -0
- package/plugins/specweave-github/lib/task-sync.ts +7 -0
- package/plugins/specweave-github/lib/types.ts +38 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +3222 -0
- package/src/templates/AGENTS.md.template +22 -1
- package/src/templates/CLAUDE.md.template +31 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts +0 -116
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts.map +0 -1
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js +0 -356
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js.map +0 -1
|
@@ -207,15 +207,36 @@ This is a **SpecWeave project** where specifications and documentation are the s
|
|
|
207
207
|
```
|
|
208
208
|
⛔ NEVER pollute project root with .md files!
|
|
209
209
|
⛔ Increment IDs must be unique (0001-9999)!
|
|
210
|
-
⛔
|
|
210
|
+
⛔ ONLY 3 files in increment root: spec.md, plan.md, tasks.md
|
|
211
|
+
⛔ All reports/scripts/logs go in increment subfolders!
|
|
211
212
|
⛔ Always check: git status (before committing)!
|
|
212
213
|
```
|
|
213
214
|
|
|
214
215
|
#### File Organization {#file-organization}
|
|
216
|
+
|
|
217
|
+
**Increment Structure (MANDATORY)**:
|
|
218
|
+
```
|
|
219
|
+
.specweave/increments/0001-feature/
|
|
220
|
+
├── spec.md # ⚠️ ONLY THESE 3 FILES in root!
|
|
221
|
+
├── plan.md
|
|
222
|
+
├── tasks.md
|
|
223
|
+
├── reports/ # ✅ ALL REPORTS HERE
|
|
224
|
+
│ ├── SESSION-*.md
|
|
225
|
+
│ ├── QUICK-START.md
|
|
226
|
+
│ ├── ULTRATHINK-*.md
|
|
227
|
+
│ └── ANALYSIS-*.md
|
|
228
|
+
├── scripts/ # ✅ ALL SCRIPTS HERE
|
|
229
|
+
│ └── *.{py,sh,ts}
|
|
230
|
+
└── logs/ # ✅ ALL LOGS HERE
|
|
231
|
+
└── *.log
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**File Placement Rules**:
|
|
215
235
|
```
|
|
216
236
|
┌────────────────────────────────────────────────────────────┐
|
|
217
237
|
│ NEVER in Root ↔ ALWAYS in Increment Folder │
|
|
218
238
|
├────────────────────────────────────────────────────────────┤
|
|
239
|
+
│ ❌ QUICK-START.md ↔ ✅ .../0001/reports/QUICK-START │
|
|
219
240
|
│ ❌ analysis.md ↔ ✅ .../0001/reports/analysis.md │
|
|
220
241
|
│ ❌ migration.py ↔ ✅ .../0001/scripts/migration.py │
|
|
221
242
|
│ ❌ execution.log ↔ ✅ .../0001/logs/execution.log │
|
|
@@ -563,6 +563,37 @@ Skills/agents activate automatically based on context.
|
|
|
563
563
|
- >80% coverage for critical paths
|
|
564
564
|
- Tests MUST tell the truth
|
|
565
565
|
|
|
566
|
+
### Writing Modern Tests (Vitest)
|
|
567
|
+
|
|
568
|
+
**SpecWeave uses Vitest**. Key patterns:
|
|
569
|
+
|
|
570
|
+
```typescript
|
|
571
|
+
// ✅ CORRECT: ES6 imports, Vitest API, type-safe mocks
|
|
572
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
573
|
+
vi.mock('fs-extra', () => ({ default: { readFile: vi.fn() } }));
|
|
574
|
+
import fs from 'fs-extra';
|
|
575
|
+
|
|
576
|
+
describe('Feature', () => {
|
|
577
|
+
const mockReadFile = vi.mocked(fs.readFile);
|
|
578
|
+
|
|
579
|
+
beforeEach(() => {
|
|
580
|
+
vi.clearAllMocks();
|
|
581
|
+
mockReadFile.mockResolvedValue('data');
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
it('works', async () => {
|
|
585
|
+
const result = await MyModule.doSomething();
|
|
586
|
+
expect(mockReadFile).toHaveBeenCalled();
|
|
587
|
+
});
|
|
588
|
+
});
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
**Common mistakes to avoid**:
|
|
592
|
+
- ❌ `require()` → ✅ `import` (ES modules only)
|
|
593
|
+
- ❌ `jest.fn()` → ✅ `vi.fn()` (Vitest API)
|
|
594
|
+
- ❌ `fs as anyed<>` → ✅ `vi.mocked(fs.method)` (type-safe)
|
|
595
|
+
- ❌ External variable in `vi.mock()` factory → ✅ Inline `vi.fn()`
|
|
596
|
+
|
|
566
597
|
---
|
|
567
598
|
|
|
568
599
|
## Key SpecWeave Principles
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Three-Layer Bidirectional Sync Manager
|
|
3
|
-
*
|
|
4
|
-
* Manages synchronization between three layers:
|
|
5
|
-
* 1. GitHub Issues (stakeholder UI)
|
|
6
|
-
* 2. Living Docs User Stories (intermediate)
|
|
7
|
-
* 3. Increment spec.md + tasks.md (source of truth)
|
|
8
|
-
*
|
|
9
|
-
* Sync flows:
|
|
10
|
-
* - GitHub → Living Docs → Increment (checkbox changes from stakeholders)
|
|
11
|
-
* - Increment → Living Docs → GitHub (implementation updates)
|
|
12
|
-
*/
|
|
13
|
-
/**
|
|
14
|
-
* Sync direction
|
|
15
|
-
*/
|
|
16
|
-
export type SyncDirection = 'github-to-increment' | 'increment-to-github' | 'bidirectional';
|
|
17
|
-
/**
|
|
18
|
-
* Sync result
|
|
19
|
-
*/
|
|
20
|
-
export interface SyncResult {
|
|
21
|
-
/** Number of ACs synced */
|
|
22
|
-
acsSynced: number;
|
|
23
|
-
/** Number of tasks synced */
|
|
24
|
-
tasksSynced: number;
|
|
25
|
-
/** Conflicts detected (Increment always wins) */
|
|
26
|
-
conflictsResolved: number;
|
|
27
|
-
/** Tasks reopened due to missing code */
|
|
28
|
-
tasksReopened: number;
|
|
29
|
-
/** Errors encountered */
|
|
30
|
-
errors: string[];
|
|
31
|
-
/** Warnings */
|
|
32
|
-
warnings: string[];
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* ThreeLayerSyncManager - Handles bidirectional sync
|
|
36
|
-
*/
|
|
37
|
-
export declare class ThreeLayerSyncManager {
|
|
38
|
-
private distributor;
|
|
39
|
-
private codeValidator;
|
|
40
|
-
private completionPropagator;
|
|
41
|
-
constructor();
|
|
42
|
-
/**
|
|
43
|
-
* Sync GitHub Issues → Living Docs → Increment
|
|
44
|
-
*
|
|
45
|
-
* Handles checkbox changes from stakeholders in GitHub.
|
|
46
|
-
*
|
|
47
|
-
* @param githubIssueId - GitHub issue number
|
|
48
|
-
* @param incrementPath - Path to increment
|
|
49
|
-
* @param livingDocsPath - Path to living docs
|
|
50
|
-
*/
|
|
51
|
-
syncGitHubToIncrement(githubIssueId: number, incrementPath: string, livingDocsPath: string): Promise<SyncResult>;
|
|
52
|
-
/**
|
|
53
|
-
* Sync Increment → Living Docs → GitHub
|
|
54
|
-
*
|
|
55
|
-
* Propagates implementation changes to stakeholders.
|
|
56
|
-
*
|
|
57
|
-
* @param incrementPath - Path to increment
|
|
58
|
-
* @param livingDocsPath - Path to living docs
|
|
59
|
-
*/
|
|
60
|
-
syncIncrementToGitHub(incrementPath: string, livingDocsPath: string): Promise<SyncResult>;
|
|
61
|
-
/**
|
|
62
|
-
* Bidirectional sync with conflict resolution
|
|
63
|
-
*
|
|
64
|
-
* Increment always wins in conflicts (source of truth discipline).
|
|
65
|
-
*/
|
|
66
|
-
syncBidirectional(incrementPath: string, livingDocsPath: string): Promise<SyncResult>;
|
|
67
|
-
/**
|
|
68
|
-
* Reopen task if code validation fails
|
|
69
|
-
*
|
|
70
|
-
* @param taskId - Task ID to reopen
|
|
71
|
-
* @param incrementPath - Path to increment
|
|
72
|
-
* @param reason - Reason for reopening
|
|
73
|
-
*/
|
|
74
|
-
reopenTask(taskId: string, incrementPath: string, reason: string): Promise<void>;
|
|
75
|
-
/**
|
|
76
|
-
* Fetch GitHub issue checkbox states
|
|
77
|
-
*/
|
|
78
|
-
private fetchGitHubCheckboxStates;
|
|
79
|
-
/**
|
|
80
|
-
* Parse checkbox states from GitHub issue body
|
|
81
|
-
*/
|
|
82
|
-
private parseCheckboxStatesFromBody;
|
|
83
|
-
/**
|
|
84
|
-
* Find User Story file by GitHub issue number
|
|
85
|
-
*/
|
|
86
|
-
private findUserStoryByGitHubIssue;
|
|
87
|
-
/**
|
|
88
|
-
* Find all markdown files recursively
|
|
89
|
-
*/
|
|
90
|
-
private findMarkdownFiles;
|
|
91
|
-
/**
|
|
92
|
-
* Update AC checkbox in content
|
|
93
|
-
*/
|
|
94
|
-
private updateAcCheckboxInContent;
|
|
95
|
-
/**
|
|
96
|
-
* Update Task checkbox in content
|
|
97
|
-
*/
|
|
98
|
-
private updateTaskCheckboxInContent;
|
|
99
|
-
/**
|
|
100
|
-
* Sync Living Docs changes to Increment
|
|
101
|
-
*/
|
|
102
|
-
private syncLivingDocsToIncrement;
|
|
103
|
-
/**
|
|
104
|
-
* Parse ACs from content
|
|
105
|
-
*/
|
|
106
|
-
private parseAcsFromContent;
|
|
107
|
-
/**
|
|
108
|
-
* Parse Tasks from content
|
|
109
|
-
*/
|
|
110
|
-
private parseTasksFromContent;
|
|
111
|
-
/**
|
|
112
|
-
* Update task completion in tasks.md file
|
|
113
|
-
*/
|
|
114
|
-
private updateTaskCompletionInTasksFile;
|
|
115
|
-
}
|
|
116
|
-
//# sourceMappingURL=ThreeLayerSyncManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ThreeLayerSyncManager.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/ThreeLayerSyncManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,qBAAqB,GAAG,qBAAqB,GAAG,eAAe,CAAC;AAE5F;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAElB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IAEpB,iDAAiD;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAE1B,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IAEtB,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,eAAe;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAgBD;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,oBAAoB,CAAuB;;IAQnD;;;;;;;;OAQG;IACG,qBAAqB,CACzB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,UAAU,CAAC;IA8DtB;;;;;;;OAOG;IACG,qBAAqB,CACzB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,UAAU,CAAC;IAoCtB;;;;OAIG;IACG,iBAAiB,CACrB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,UAAU,CAAC;IAYtB;;;;;;OAMG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCtF;;OAEG;YACW,yBAAyB;IAYvC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA8BnC;;OAEG;YACW,0BAA0B;IAuBxC;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAMjC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;OAEG;YACW,yBAAyB;IAiCvC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;IACH,OAAO,CAAC,+BAA+B;CAYxC"}
|
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Three-Layer Bidirectional Sync Manager
|
|
3
|
-
*
|
|
4
|
-
* Manages synchronization between three layers:
|
|
5
|
-
* 1. GitHub Issues (stakeholder UI)
|
|
6
|
-
* 2. Living Docs User Stories (intermediate)
|
|
7
|
-
* 3. Increment spec.md + tasks.md (source of truth)
|
|
8
|
-
*
|
|
9
|
-
* Sync flows:
|
|
10
|
-
* - GitHub → Living Docs → Increment (checkbox changes from stakeholders)
|
|
11
|
-
* - Increment → Living Docs → GitHub (implementation updates)
|
|
12
|
-
*/
|
|
13
|
-
import fs from 'fs/promises';
|
|
14
|
-
import path from 'path';
|
|
15
|
-
import { execSync } from 'child_process';
|
|
16
|
-
import { SpecDistributor } from './SpecDistributor.js';
|
|
17
|
-
import { CodeValidator } from './CodeValidator.js';
|
|
18
|
-
import { CompletionPropagator } from './CompletionPropagator.js';
|
|
19
|
-
/**
|
|
20
|
-
* ThreeLayerSyncManager - Handles bidirectional sync
|
|
21
|
-
*/
|
|
22
|
-
export class ThreeLayerSyncManager {
|
|
23
|
-
constructor() {
|
|
24
|
-
this.distributor = new SpecDistributor();
|
|
25
|
-
this.codeValidator = new CodeValidator();
|
|
26
|
-
this.completionPropagator = new CompletionPropagator();
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Sync GitHub Issues → Living Docs → Increment
|
|
30
|
-
*
|
|
31
|
-
* Handles checkbox changes from stakeholders in GitHub.
|
|
32
|
-
*
|
|
33
|
-
* @param githubIssueId - GitHub issue number
|
|
34
|
-
* @param incrementPath - Path to increment
|
|
35
|
-
* @param livingDocsPath - Path to living docs
|
|
36
|
-
*/
|
|
37
|
-
async syncGitHubToIncrement(githubIssueId, incrementPath, livingDocsPath) {
|
|
38
|
-
const result = {
|
|
39
|
-
acsSynced: 0,
|
|
40
|
-
tasksSynced: 0,
|
|
41
|
-
conflictsResolved: 0,
|
|
42
|
-
tasksReopened: 0,
|
|
43
|
-
errors: [],
|
|
44
|
-
warnings: []
|
|
45
|
-
};
|
|
46
|
-
try {
|
|
47
|
-
// 1. Fetch GitHub issue checkbox states
|
|
48
|
-
const checkboxStates = await this.fetchGitHubCheckboxStates(githubIssueId);
|
|
49
|
-
// 2. Find corresponding User Story file
|
|
50
|
-
const userStoryFile = await this.findUserStoryByGitHubIssue(livingDocsPath, githubIssueId);
|
|
51
|
-
if (!userStoryFile) {
|
|
52
|
-
result.errors.push(`No User Story file found for GitHub issue #${githubIssueId}`);
|
|
53
|
-
return result;
|
|
54
|
-
}
|
|
55
|
-
// 3. Update Living Docs User Story
|
|
56
|
-
const livingDocsContent = await fs.readFile(userStoryFile, 'utf-8');
|
|
57
|
-
let updatedContent = livingDocsContent;
|
|
58
|
-
for (const checkbox of checkboxStates) {
|
|
59
|
-
if (checkbox.type === 'ac') {
|
|
60
|
-
updatedContent = this.updateAcCheckboxInContent(updatedContent, checkbox.id, checkbox.completed);
|
|
61
|
-
result.acsSynced++;
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
updatedContent = this.updateTaskCheckboxInContent(updatedContent, checkbox.id, checkbox.completed);
|
|
65
|
-
result.tasksSynced++;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
await fs.writeFile(userStoryFile, updatedContent, 'utf-8');
|
|
69
|
-
// 4. Validate code exists for completed tasks
|
|
70
|
-
const completedTasks = checkboxStates.filter(cb => cb.type === 'task' && cb.completed);
|
|
71
|
-
for (const taskCheckbox of completedTasks) {
|
|
72
|
-
const codeExists = await this.codeValidator.validateCodeExists(taskCheckbox.id, incrementPath);
|
|
73
|
-
if (!codeExists) {
|
|
74
|
-
// Reopen task
|
|
75
|
-
await this.reopenTask(taskCheckbox.id, incrementPath, 'Code validation failed: Expected files not found');
|
|
76
|
-
result.tasksReopened++;
|
|
77
|
-
result.warnings.push(`Task ${taskCheckbox.id} reopened: Code not found`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
// 5. Update Increment (source of truth)
|
|
81
|
-
await this.syncLivingDocsToIncrement(userStoryFile, incrementPath);
|
|
82
|
-
// 6. Propagate completion bottom-up (Tasks → ACs → User Stories)
|
|
83
|
-
await this.completionPropagator.propagateCompletion(incrementPath);
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
result.errors.push(error.message);
|
|
87
|
-
}
|
|
88
|
-
return result;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Sync Increment → Living Docs → GitHub
|
|
92
|
-
*
|
|
93
|
-
* Propagates implementation changes to stakeholders.
|
|
94
|
-
*
|
|
95
|
-
* @param incrementPath - Path to increment
|
|
96
|
-
* @param livingDocsPath - Path to living docs
|
|
97
|
-
*/
|
|
98
|
-
async syncIncrementToGitHub(incrementPath, livingDocsPath) {
|
|
99
|
-
const result = {
|
|
100
|
-
acsSynced: 0,
|
|
101
|
-
tasksSynced: 0,
|
|
102
|
-
conflictsResolved: 0,
|
|
103
|
-
tasksReopened: 0,
|
|
104
|
-
errors: [],
|
|
105
|
-
warnings: []
|
|
106
|
-
};
|
|
107
|
-
try {
|
|
108
|
-
// 1. Read increment spec.md and tasks.md
|
|
109
|
-
// 2. Update Living Docs User Stories (via SpecDistributor)
|
|
110
|
-
await this.distributor.copyAcsAndTasksToUserStories(incrementPath, livingDocsPath);
|
|
111
|
-
// 3. Count synced items
|
|
112
|
-
const specPath = path.join(incrementPath, 'spec.md');
|
|
113
|
-
const tasksPath = path.join(incrementPath, 'tasks.md');
|
|
114
|
-
const specContent = await fs.readFile(specPath, 'utf-8');
|
|
115
|
-
const tasksContent = await fs.readFile(tasksPath, 'utf-8');
|
|
116
|
-
result.acsSynced = (specContent.match(/- \[([ x])\] AC-/g) || []).length;
|
|
117
|
-
result.tasksSynced = (tasksContent.match(/### T-\d+/g) || []).length;
|
|
118
|
-
// 4. Update GitHub issues with latest status
|
|
119
|
-
// This would integrate with GitHub API to update issue body checkboxes
|
|
120
|
-
// For now, we'll mark this as a placeholder for integration
|
|
121
|
-
result.warnings.push('GitHub issue update not implemented yet - manual sync required');
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
result.errors.push(error.message);
|
|
125
|
-
}
|
|
126
|
-
return result;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Bidirectional sync with conflict resolution
|
|
130
|
-
*
|
|
131
|
-
* Increment always wins in conflicts (source of truth discipline).
|
|
132
|
-
*/
|
|
133
|
-
async syncBidirectional(incrementPath, livingDocsPath) {
|
|
134
|
-
// Always prioritize Increment → GitHub direction
|
|
135
|
-
// GitHub changes are advisory only (source of truth discipline)
|
|
136
|
-
const result = await this.syncIncrementToGitHub(incrementPath, livingDocsPath);
|
|
137
|
-
// Detect conflicts by checking if GitHub has different states
|
|
138
|
-
// If conflicts exist, Increment wins and overwrites GitHub
|
|
139
|
-
result.warnings.push('Bidirectional sync: Increment is source of truth, GitHub is informational');
|
|
140
|
-
return result;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Reopen task if code validation fails
|
|
144
|
-
*
|
|
145
|
-
* @param taskId - Task ID to reopen
|
|
146
|
-
* @param incrementPath - Path to increment
|
|
147
|
-
* @param reason - Reason for reopening
|
|
148
|
-
*/
|
|
149
|
-
async reopenTask(taskId, incrementPath, reason) {
|
|
150
|
-
try {
|
|
151
|
-
// 1. Uncheck task in increment tasks.md
|
|
152
|
-
const tasksPath = path.join(incrementPath, 'tasks.md');
|
|
153
|
-
let tasksContent = await fs.readFile(tasksPath, 'utf-8');
|
|
154
|
-
// Find task section and uncheck "Completed" field
|
|
155
|
-
const taskPattern = new RegExp(`### ${taskId}:.*?(?=###|$)`, 's');
|
|
156
|
-
const taskMatch = tasksContent.match(taskPattern);
|
|
157
|
-
if (taskMatch) {
|
|
158
|
-
const taskSection = taskMatch[0];
|
|
159
|
-
const updatedSection = taskSection.replace(/\*\*Completed\*\*:\s*\d{4}-\d{2}-\d{2}/, '**Completed**: Not completed');
|
|
160
|
-
tasksContent = tasksContent.replace(taskSection, updatedSection);
|
|
161
|
-
await fs.writeFile(tasksPath, tasksContent, 'utf-8');
|
|
162
|
-
}
|
|
163
|
-
// 2. Add comment to task explaining reopen
|
|
164
|
-
const comment = `\n**Reopened**: ${new Date().toISOString().split('T')[0]} - ${reason}\n`;
|
|
165
|
-
tasksContent = tasksContent.replace(new RegExp(`(### ${taskId}:.*?)\n---`, 's'), `$1\n${comment}---`);
|
|
166
|
-
await fs.writeFile(tasksPath, tasksContent, 'utf-8');
|
|
167
|
-
// 3. TODO: Add GitHub comment explaining why
|
|
168
|
-
// This would use GitHub API to add a comment to the issue
|
|
169
|
-
// For now, this is a placeholder
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
throw new Error(`Failed to reopen task ${taskId}: ${error.message}`);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Fetch GitHub issue checkbox states
|
|
177
|
-
*/
|
|
178
|
-
async fetchGitHubCheckboxStates(issueId) {
|
|
179
|
-
try {
|
|
180
|
-
// Fetch issue body using gh CLI
|
|
181
|
-
const cmd = `gh issue view ${issueId} --json body --jq .body`;
|
|
182
|
-
const body = execSync(cmd, { encoding: 'utf-8' }).trim();
|
|
183
|
-
return this.parseCheckboxStatesFromBody(body);
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
throw new Error(`Failed to fetch GitHub issue #${issueId}: ${error.message}`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Parse checkbox states from GitHub issue body
|
|
191
|
-
*/
|
|
192
|
-
parseCheckboxStatesFromBody(body) {
|
|
193
|
-
const states = [];
|
|
194
|
-
const lines = body.split('\n');
|
|
195
|
-
for (const line of lines) {
|
|
196
|
-
// Match AC checkboxes: - [x] AC-US1-01: Description
|
|
197
|
-
const acMatch = line.match(/^- \[([ x])\] (AC-[A-Z0-9]+-\d+):/);
|
|
198
|
-
if (acMatch) {
|
|
199
|
-
states.push({
|
|
200
|
-
id: acMatch[2],
|
|
201
|
-
completed: acMatch[1] === 'x',
|
|
202
|
-
type: 'ac'
|
|
203
|
-
});
|
|
204
|
-
continue;
|
|
205
|
-
}
|
|
206
|
-
// Match Task checkboxes: - [x] T-001: Description
|
|
207
|
-
const taskMatch = line.match(/^- \[([ x])\] (T-\d+):/);
|
|
208
|
-
if (taskMatch) {
|
|
209
|
-
states.push({
|
|
210
|
-
id: taskMatch[2],
|
|
211
|
-
completed: taskMatch[1] === 'x',
|
|
212
|
-
type: 'task'
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return states;
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Find User Story file by GitHub issue number
|
|
220
|
-
*/
|
|
221
|
-
async findUserStoryByGitHubIssue(livingDocsPath, issueId) {
|
|
222
|
-
try {
|
|
223
|
-
// Search for user story files containing GitHub issue reference
|
|
224
|
-
const userStoriesPath = path.join(livingDocsPath, 'user-stories');
|
|
225
|
-
const files = await this.findMarkdownFiles(userStoriesPath);
|
|
226
|
-
for (const file of files) {
|
|
227
|
-
const content = await fs.readFile(file, 'utf-8');
|
|
228
|
-
// Look for GitHub issue reference in frontmatter or content
|
|
229
|
-
if (content.includes(`github_issue: ${issueId}`) || content.includes(`#${issueId}`)) {
|
|
230
|
-
return file;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return null;
|
|
234
|
-
}
|
|
235
|
-
catch {
|
|
236
|
-
return null;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Find all markdown files recursively
|
|
241
|
-
*/
|
|
242
|
-
async findMarkdownFiles(dir) {
|
|
243
|
-
const files = [];
|
|
244
|
-
try {
|
|
245
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
246
|
-
for (const entry of entries) {
|
|
247
|
-
const fullPath = path.join(dir, entry.name);
|
|
248
|
-
if (entry.isDirectory()) {
|
|
249
|
-
files.push(...await this.findMarkdownFiles(fullPath));
|
|
250
|
-
}
|
|
251
|
-
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
252
|
-
files.push(fullPath);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
catch {
|
|
257
|
-
// Directory doesn't exist, return empty
|
|
258
|
-
}
|
|
259
|
-
return files;
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Update AC checkbox in content
|
|
263
|
-
*/
|
|
264
|
-
updateAcCheckboxInContent(content, acId, completed) {
|
|
265
|
-
const checkbox = completed ? 'x' : ' ';
|
|
266
|
-
const pattern = new RegExp(`^- \\[([ x])\\] ${acId}:`, 'gm');
|
|
267
|
-
return content.replace(pattern, `- [${checkbox}] ${acId}:`);
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Update Task checkbox in content
|
|
271
|
-
*/
|
|
272
|
-
updateTaskCheckboxInContent(content, taskId, completed) {
|
|
273
|
-
const checkbox = completed ? 'x' : ' ';
|
|
274
|
-
const pattern = new RegExp(`^- \\[([ x])\\] ${taskId}:`, 'gm');
|
|
275
|
-
return content.replace(pattern, `- [${checkbox}] ${taskId}:`);
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Sync Living Docs changes to Increment
|
|
279
|
-
*/
|
|
280
|
-
async syncLivingDocsToIncrement(userStoryFile, incrementPath) {
|
|
281
|
-
// Read User Story file
|
|
282
|
-
const content = await fs.readFile(userStoryFile, 'utf-8');
|
|
283
|
-
// Parse ACs and Tasks
|
|
284
|
-
const acs = this.parseAcsFromContent(content);
|
|
285
|
-
const tasks = this.parseTasksFromContent(content);
|
|
286
|
-
// Update increment spec.md
|
|
287
|
-
if (acs.length > 0) {
|
|
288
|
-
const specPath = path.join(incrementPath, 'spec.md');
|
|
289
|
-
let specContent = await fs.readFile(specPath, 'utf-8');
|
|
290
|
-
for (const ac of acs) {
|
|
291
|
-
specContent = this.updateAcCheckboxInContent(specContent, ac.id, ac.completed);
|
|
292
|
-
}
|
|
293
|
-
await fs.writeFile(specPath, specContent, 'utf-8');
|
|
294
|
-
}
|
|
295
|
-
// Update increment tasks.md
|
|
296
|
-
if (tasks.length > 0) {
|
|
297
|
-
const tasksPath = path.join(incrementPath, 'tasks.md');
|
|
298
|
-
let tasksContent = await fs.readFile(tasksPath, 'utf-8');
|
|
299
|
-
for (const task of tasks) {
|
|
300
|
-
tasksContent = this.updateTaskCompletionInTasksFile(tasksContent, task.id, task.completed);
|
|
301
|
-
}
|
|
302
|
-
await fs.writeFile(tasksPath, tasksContent, 'utf-8');
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Parse ACs from content
|
|
307
|
-
*/
|
|
308
|
-
parseAcsFromContent(content) {
|
|
309
|
-
const acs = [];
|
|
310
|
-
const lines = content.split('\n');
|
|
311
|
-
for (const line of lines) {
|
|
312
|
-
const match = line.match(/^- \[([ x])\] (AC-[A-Z0-9]+-\d+):/);
|
|
313
|
-
if (match) {
|
|
314
|
-
acs.push({
|
|
315
|
-
id: match[2],
|
|
316
|
-
completed: match[1] === 'x'
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
return acs;
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Parse Tasks from content
|
|
324
|
-
*/
|
|
325
|
-
parseTasksFromContent(content) {
|
|
326
|
-
const tasks = [];
|
|
327
|
-
const lines = content.split('\n');
|
|
328
|
-
for (const line of lines) {
|
|
329
|
-
const match = line.match(/^- \[([ x])\] (T-\d+):/);
|
|
330
|
-
if (match) {
|
|
331
|
-
tasks.push({
|
|
332
|
-
id: match[2],
|
|
333
|
-
completed: match[1] === 'x'
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return tasks;
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Update task completion in tasks.md file
|
|
341
|
-
*/
|
|
342
|
-
updateTaskCompletionInTasksFile(content, taskId, completed) {
|
|
343
|
-
if (completed) {
|
|
344
|
-
// Add completion date
|
|
345
|
-
const today = new Date().toISOString().split('T')[0];
|
|
346
|
-
const pattern = new RegExp(`(### ${taskId}:.*?)\\n\\*\\*Completed\\*\\*:.*?\\n`, 's');
|
|
347
|
-
return content.replace(pattern, `$1\n**Completed**: ${today}\n`);
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
// Remove completion date
|
|
351
|
-
const pattern = new RegExp(`(### ${taskId}:.*?)\\n\\*\\*Completed\\*\\*:.*?\\n`, 's');
|
|
352
|
-
return content.replace(pattern, `$1\n**Completed**: Not completed\n`);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
//# sourceMappingURL=ThreeLayerSyncManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ThreeLayerSyncManager.js","sourceRoot":"","sources":["../../../../src/core/living-docs/ThreeLayerSyncManager.ts"],"names":[],"mappings":"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"}
|