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
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates that completed tasks have actual code implementation.
|
|
5
|
+
* Prevents marking tasks as complete when:
|
|
6
|
+
* - Files don't exist
|
|
7
|
+
* - Files are empty or have trivial content
|
|
8
|
+
* - Implementation is incomplete
|
|
9
|
+
*
|
|
10
|
+
* Used by GitHub sync to enforce code-completion discipline.
|
|
11
|
+
*
|
|
12
|
+
* @module CodeValidator
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'fs-extra';
|
|
15
|
+
import path from 'path';
|
|
16
|
+
export class CodeValidator {
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this.options = {
|
|
19
|
+
minLines: options.minLines ?? 3,
|
|
20
|
+
minChars: options.minChars ?? 50,
|
|
21
|
+
projectRoot: options.projectRoot ?? process.cwd()
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Validate that code exists for a task
|
|
26
|
+
*
|
|
27
|
+
* Extracts file paths from task description and verifies:
|
|
28
|
+
* 1. Files exist
|
|
29
|
+
* 2. Files have meaningful content
|
|
30
|
+
* 3. Files are not just stubs
|
|
31
|
+
*
|
|
32
|
+
* @param taskDescription - Task description with file paths
|
|
33
|
+
* @param taskId - Task ID for error messages
|
|
34
|
+
* @returns Validation result
|
|
35
|
+
*/
|
|
36
|
+
async validateTask(taskDescription, taskId) {
|
|
37
|
+
const filePaths = this.extractFilePaths(taskDescription);
|
|
38
|
+
if (filePaths.length === 0) {
|
|
39
|
+
// No file paths specified - consider it valid (task might be non-code)
|
|
40
|
+
return {
|
|
41
|
+
taskId,
|
|
42
|
+
valid: true,
|
|
43
|
+
files: [],
|
|
44
|
+
reason: 'No file paths specified in task description'
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const fileResults = [];
|
|
48
|
+
let allValid = true;
|
|
49
|
+
const reasons = [];
|
|
50
|
+
for (const filePath of filePaths) {
|
|
51
|
+
const result = await this.validateFile(filePath);
|
|
52
|
+
fileResults.push(result);
|
|
53
|
+
if (!result.exists) {
|
|
54
|
+
allValid = false;
|
|
55
|
+
reasons.push(`File not found: ${filePath}`);
|
|
56
|
+
}
|
|
57
|
+
else if (!result.hasContent) {
|
|
58
|
+
allValid = false;
|
|
59
|
+
reasons.push(`File has no meaningful content: ${filePath} (${result.reason})`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
taskId,
|
|
64
|
+
valid: allValid,
|
|
65
|
+
files: fileResults,
|
|
66
|
+
reason: reasons.length > 0 ? reasons.join('; ') : undefined
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Validate a single file
|
|
71
|
+
*
|
|
72
|
+
* @param filePath - Path to file (relative or absolute)
|
|
73
|
+
* @returns File validation result
|
|
74
|
+
*/
|
|
75
|
+
async validateFile(filePath) {
|
|
76
|
+
// Resolve relative paths
|
|
77
|
+
const absolutePath = path.isAbsolute(filePath)
|
|
78
|
+
? filePath
|
|
79
|
+
: path.join(this.options.projectRoot, filePath);
|
|
80
|
+
// Check if file exists
|
|
81
|
+
const exists = await fs.pathExists(absolutePath);
|
|
82
|
+
if (!exists) {
|
|
83
|
+
return {
|
|
84
|
+
path: filePath,
|
|
85
|
+
exists: false,
|
|
86
|
+
hasContent: false,
|
|
87
|
+
lineCount: 0,
|
|
88
|
+
reason: 'File does not exist'
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Read file content
|
|
92
|
+
const content = await fs.readFile(absolutePath, 'utf-8');
|
|
93
|
+
const lines = content.split('\n');
|
|
94
|
+
const nonEmptyLines = lines.filter(line => line.trim().length > 0);
|
|
95
|
+
// Check line count
|
|
96
|
+
if (nonEmptyLines.length < this.options.minLines) {
|
|
97
|
+
return {
|
|
98
|
+
path: filePath,
|
|
99
|
+
exists: true,
|
|
100
|
+
hasContent: false,
|
|
101
|
+
lineCount: nonEmptyLines.length,
|
|
102
|
+
reason: `Only ${nonEmptyLines.length} non-empty lines (minimum: ${this.options.minLines})`
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Check character count
|
|
106
|
+
const trimmedContent = content.trim();
|
|
107
|
+
if (trimmedContent.length < this.options.minChars) {
|
|
108
|
+
return {
|
|
109
|
+
path: filePath,
|
|
110
|
+
exists: true,
|
|
111
|
+
hasContent: false,
|
|
112
|
+
lineCount: nonEmptyLines.length,
|
|
113
|
+
reason: `Only ${trimmedContent.length} characters (minimum: ${this.options.minChars})`
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// Check for stub patterns (common placeholder patterns)
|
|
117
|
+
const stubPatterns = [
|
|
118
|
+
/^\/\/\s*TODO:/i,
|
|
119
|
+
/^#\s*TODO:/i,
|
|
120
|
+
/^\s*throw new Error\(['"]Not implemented['"]\)/i,
|
|
121
|
+
/^\s*return null;?\s*$/m,
|
|
122
|
+
/^\s*pass\s*$/m, // Python
|
|
123
|
+
/^\s*\.\.\.$/m // TypeScript
|
|
124
|
+
];
|
|
125
|
+
const isStub = stubPatterns.some(pattern => pattern.test(trimmedContent));
|
|
126
|
+
if (isStub) {
|
|
127
|
+
return {
|
|
128
|
+
path: filePath,
|
|
129
|
+
exists: true,
|
|
130
|
+
hasContent: false,
|
|
131
|
+
lineCount: nonEmptyLines.length,
|
|
132
|
+
reason: 'File contains stub/placeholder code'
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// All checks passed
|
|
136
|
+
return {
|
|
137
|
+
path: filePath,
|
|
138
|
+
exists: true,
|
|
139
|
+
hasContent: true,
|
|
140
|
+
lineCount: nonEmptyLines.length
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Extract file paths from task description
|
|
145
|
+
*
|
|
146
|
+
* Supports multiple formats:
|
|
147
|
+
* - **Files**: src/foo.ts, src/bar.ts
|
|
148
|
+
* - **Files to create**: src/foo.ts
|
|
149
|
+
* - **Files to modify**: src/bar.ts
|
|
150
|
+
* - Inline code blocks with file paths
|
|
151
|
+
*
|
|
152
|
+
* @param description - Task description text
|
|
153
|
+
* @returns Array of file paths
|
|
154
|
+
*/
|
|
155
|
+
extractFilePaths(description) {
|
|
156
|
+
const paths = new Set();
|
|
157
|
+
// Pattern 1: **Files**: path1, path2, path3
|
|
158
|
+
const filesMatch = description.match(/\*\*Files\*\*:\s*([^\n]+)/i);
|
|
159
|
+
if (filesMatch) {
|
|
160
|
+
const filePaths = filesMatch[1].split(',').map(p => p.trim());
|
|
161
|
+
filePaths.forEach(p => paths.add(p));
|
|
162
|
+
}
|
|
163
|
+
// Pattern 2: **Files to create**: path1, path2
|
|
164
|
+
const createMatch = description.match(/\*\*Files to create\*\*:\s*([^\n]+)/i);
|
|
165
|
+
if (createMatch) {
|
|
166
|
+
const filePaths = createMatch[1].split(',').map(p => p.trim());
|
|
167
|
+
filePaths.forEach(p => paths.add(p));
|
|
168
|
+
}
|
|
169
|
+
// Pattern 3: **Files to modify**: path1, path2
|
|
170
|
+
const modifyMatch = description.match(/\*\*Files to modify\*\*:\s*([^\n]+)/i);
|
|
171
|
+
if (modifyMatch) {
|
|
172
|
+
const filePaths = modifyMatch[1].split(',').map(p => p.trim());
|
|
173
|
+
filePaths.forEach(p => paths.add(p));
|
|
174
|
+
}
|
|
175
|
+
// Pattern 4: Inline file references (e.g., `src/foo/bar.ts`)
|
|
176
|
+
const inlineMatches = description.matchAll(/`([a-zA-Z0-9_\-./]+\.(ts|js|tsx|jsx|py|java|go|rs|cpp|c|h))`/g);
|
|
177
|
+
for (const match of inlineMatches) {
|
|
178
|
+
paths.add(match[1]);
|
|
179
|
+
}
|
|
180
|
+
// Pattern 5: Markdown list items with file paths
|
|
181
|
+
const listMatches = description.matchAll(/^[-*]\s+([a-zA-Z0-9_\-./]+\.(ts|js|tsx|jsx|py|java|go|rs|cpp|c|h))/gm);
|
|
182
|
+
for (const match of listMatches) {
|
|
183
|
+
paths.add(match[1]);
|
|
184
|
+
}
|
|
185
|
+
return Array.from(paths);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Batch validate multiple tasks
|
|
189
|
+
*
|
|
190
|
+
* @param tasks - Array of {taskId, description}
|
|
191
|
+
* @returns Array of validation results
|
|
192
|
+
*/
|
|
193
|
+
async validateTasks(tasks) {
|
|
194
|
+
// Use parallel validation for performance
|
|
195
|
+
const validationPromises = tasks.map(task => this.validateTask(task.description, task.taskId));
|
|
196
|
+
return Promise.all(validationPromises);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get summary of validation results
|
|
200
|
+
*
|
|
201
|
+
* @param results - Array of task validation results
|
|
202
|
+
* @returns Summary statistics
|
|
203
|
+
*/
|
|
204
|
+
summarizeResults(results) {
|
|
205
|
+
const total = results.length;
|
|
206
|
+
const valid = results.filter(r => r.valid).length;
|
|
207
|
+
const invalid = results.filter(r => !r.valid).length;
|
|
208
|
+
const noFiles = results.filter(r => r.files.length === 0).length;
|
|
209
|
+
const invalidTasks = results.filter(r => !r.valid).map(r => r.taskId);
|
|
210
|
+
return {
|
|
211
|
+
total,
|
|
212
|
+
valid,
|
|
213
|
+
invalid,
|
|
214
|
+
noFiles,
|
|
215
|
+
invalidTasks
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=CodeValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeValidator.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/CodeValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Three-Layer Bidirectional Sync Manager
|
|
3
|
+
*
|
|
4
|
+
* Handles synchronization across three layers:
|
|
5
|
+
* - Layer 1: GitHub Issue (stakeholder UI)
|
|
6
|
+
* - Layer 2: Living Docs User Story files (intermediate representation)
|
|
7
|
+
* - Layer 3: Increment spec.md + tasks.md (source of truth)
|
|
8
|
+
*
|
|
9
|
+
* Supports two sync flows:
|
|
10
|
+
* 1. GitHub → Living Docs → Increment (stakeholder checks checkbox)
|
|
11
|
+
* 2. Increment → Living Docs → GitHub (developer completes work)
|
|
12
|
+
*
|
|
13
|
+
* Features:
|
|
14
|
+
* - Code validation (reopen tasks if code doesn't exist)
|
|
15
|
+
* - Completion propagation (Tasks → ACs → User Stories)
|
|
16
|
+
* - Conflict resolution (Increment always wins)
|
|
17
|
+
*
|
|
18
|
+
* @module ThreeLayerSyncManager
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Acceptance Criterion with completion state
|
|
22
|
+
*/
|
|
23
|
+
export interface AcceptanceCriterion {
|
|
24
|
+
id: string;
|
|
25
|
+
userStoryId: string;
|
|
26
|
+
description: string;
|
|
27
|
+
completed: boolean;
|
|
28
|
+
projects: string[];
|
|
29
|
+
rawLine: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Task with completion state and AC references
|
|
33
|
+
*/
|
|
34
|
+
export interface Task {
|
|
35
|
+
id: string;
|
|
36
|
+
title: string;
|
|
37
|
+
completed: boolean;
|
|
38
|
+
completedDate?: string;
|
|
39
|
+
acIds: string[];
|
|
40
|
+
filePaths?: string[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Change detected during sync
|
|
44
|
+
*/
|
|
45
|
+
export interface SyncChange {
|
|
46
|
+
type: 'ac' | 'task';
|
|
47
|
+
id: string;
|
|
48
|
+
completed: boolean;
|
|
49
|
+
layer: 'github' | 'living-docs' | 'increment';
|
|
50
|
+
userStoryPath?: string;
|
|
51
|
+
incrementPath?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Sync result
|
|
55
|
+
*/
|
|
56
|
+
export interface SyncResult {
|
|
57
|
+
acsUpdated: number;
|
|
58
|
+
tasksUpdated: number;
|
|
59
|
+
tasksReopened: number;
|
|
60
|
+
conflicts: string[];
|
|
61
|
+
errors: string[];
|
|
62
|
+
}
|
|
63
|
+
export declare class ThreeLayerSyncManager {
|
|
64
|
+
private codeValidator;
|
|
65
|
+
private userStoryFileCache;
|
|
66
|
+
private projectRoot;
|
|
67
|
+
constructor(projectRoot?: string);
|
|
68
|
+
/**
|
|
69
|
+
* Clear User Story file cache
|
|
70
|
+
* Call this when file structure changes or for testing
|
|
71
|
+
*/
|
|
72
|
+
clearCache(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Sync from GitHub to Increment (Flow 1: GitHub → Living Docs → Increment)
|
|
75
|
+
*
|
|
76
|
+
* Triggered when stakeholder checks AC/Task checkbox in GitHub issue.
|
|
77
|
+
*/
|
|
78
|
+
syncGitHubToIncrement(issueNumber: number, incrementPath: string, livingDocsPath: string): Promise<SyncResult>;
|
|
79
|
+
/**
|
|
80
|
+
* Sync from Increment to GitHub (Flow 2: Increment → Living Docs → GitHub)
|
|
81
|
+
*
|
|
82
|
+
* Triggered when developer completes work and updates increment files.
|
|
83
|
+
*/
|
|
84
|
+
syncIncrementToGitHub(incrementPath: string, livingDocsPath: string, issueNumber: number): Promise<SyncResult>;
|
|
85
|
+
/**
|
|
86
|
+
* Validate that code exists for completed task
|
|
87
|
+
* Uses CodeValidator for comprehensive validation
|
|
88
|
+
*/
|
|
89
|
+
private validateCodeExists;
|
|
90
|
+
/**
|
|
91
|
+
* Reopen task if code validation fails
|
|
92
|
+
*/
|
|
93
|
+
private reopenTask;
|
|
94
|
+
/**
|
|
95
|
+
* Propagate completion from Tasks → ACs → User Stories (bottom-up)
|
|
96
|
+
*/
|
|
97
|
+
propagateCompletion(incrementPath: string, livingDocsPath: string): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Fetch GitHub issue state
|
|
100
|
+
*/
|
|
101
|
+
private fetchGitHubIssueState;
|
|
102
|
+
/**
|
|
103
|
+
* Extract ACs from GitHub issue body
|
|
104
|
+
*/
|
|
105
|
+
private extractAcsFromIssue;
|
|
106
|
+
/**
|
|
107
|
+
* Extract Tasks from GitHub issue body
|
|
108
|
+
*/
|
|
109
|
+
private extractTasksFromIssue;
|
|
110
|
+
/**
|
|
111
|
+
* Parse ACs from spec.md
|
|
112
|
+
*/
|
|
113
|
+
private parseAcceptanceCriteria;
|
|
114
|
+
/**
|
|
115
|
+
* Parse Tasks from tasks.md
|
|
116
|
+
*/
|
|
117
|
+
private parseTasks;
|
|
118
|
+
/**
|
|
119
|
+
* Group ACs by User Story ID
|
|
120
|
+
*/
|
|
121
|
+
private groupAcsByUserStory;
|
|
122
|
+
/**
|
|
123
|
+
* Filter tasks by AC IDs
|
|
124
|
+
*/
|
|
125
|
+
private filterTasksByAcIds;
|
|
126
|
+
/**
|
|
127
|
+
* Find User Story file by ID (with caching for performance)
|
|
128
|
+
*/
|
|
129
|
+
private findUserStoryFile;
|
|
130
|
+
/**
|
|
131
|
+
* Find User Story file that contains specific task
|
|
132
|
+
*/
|
|
133
|
+
private findUserStoryFileForTask;
|
|
134
|
+
/**
|
|
135
|
+
* Update AC in User Story file
|
|
136
|
+
*/
|
|
137
|
+
private updateUserStoryAc;
|
|
138
|
+
/**
|
|
139
|
+
* Update Task in User Story file
|
|
140
|
+
*/
|
|
141
|
+
private updateUserStoryTask;
|
|
142
|
+
/**
|
|
143
|
+
* Update multiple ACs in User Story file
|
|
144
|
+
*/
|
|
145
|
+
private updateUserStoryAcs;
|
|
146
|
+
/**
|
|
147
|
+
* Update multiple Tasks in User Story file
|
|
148
|
+
*/
|
|
149
|
+
private updateUserStoryTasks;
|
|
150
|
+
/**
|
|
151
|
+
* Update AC in increment spec.md
|
|
152
|
+
*/
|
|
153
|
+
private updateIncrementAc;
|
|
154
|
+
/**
|
|
155
|
+
* Update multiple ACs in increment spec.md
|
|
156
|
+
*/
|
|
157
|
+
private updateIncrementAcs;
|
|
158
|
+
/**
|
|
159
|
+
* Update multiple Tasks in increment tasks.md
|
|
160
|
+
*/
|
|
161
|
+
private updateIncrementTasks;
|
|
162
|
+
/**
|
|
163
|
+
* Update ACs in increment with conflict resolution (Increment wins)
|
|
164
|
+
*
|
|
165
|
+
* If GitHub and Increment disagree, Increment state wins as it's the source of truth.
|
|
166
|
+
* Conflicts are logged for transparency.
|
|
167
|
+
*/
|
|
168
|
+
private updateIncrementAcsWithConflictResolution;
|
|
169
|
+
/**
|
|
170
|
+
* Update Tasks in increment with conflict resolution (Increment wins)
|
|
171
|
+
*/
|
|
172
|
+
private updateIncrementTasksWithConflictResolution;
|
|
173
|
+
/**
|
|
174
|
+
* Update GitHub issue with ACs and Tasks
|
|
175
|
+
*/
|
|
176
|
+
private updateGitHubIssue;
|
|
177
|
+
/**
|
|
178
|
+
* Add comment to GitHub issue
|
|
179
|
+
*/
|
|
180
|
+
private addGitHubComment;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=ThreeLayerSyncManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThreeLayerSyncManager.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/ThreeLayerSyncManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,QAAQ,GAAG,aAAa,GAAG,WAAW,CAAC;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,kBAAkB,CAAyC;IACnE,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,GAAE,MAAsB;IAK/C;;;OAGG;IACH,UAAU,IAAI,IAAI;IAIlB;;;;OAIG;IACG,qBAAqB,CACzB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,UAAU,CAAC;IAuEtB;;;;OAIG;IACG,qBAAqB,CACzB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC;IAuDtB;;;OAGG;YACW,kBAAkB;IAMhC;;OAEG;YACW,UAAU;IA6BxB;;OAEG;IACG,mBAAmB,CACvB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;IA4ChB;;OAEG;YACW,qBAAqB;IAgBnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8B/B;;OAEG;IACH,OAAO,CAAC,UAAU;IA6ClB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;YACW,iBAAiB;IAuB/B;;OAEG;YACW,wBAAwB;IAgBtC;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;YACW,mBAAmB;IAWjC;;OAEG;YACW,kBAAkB;IAYhC;;OAEG;YACW,oBAAoB;IAYlC;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;YACW,kBAAkB;IAahC;;OAEG;YACW,oBAAoB;IAqBlC;;;;;OAKG;YACW,wCAAwC;IAmCtD;;OAEG;YACW,0CAA0C;IAyCxD;;OAEG;YACW,iBAAiB;IAqC/B;;OAEG;YACW,gBAAgB;CAS/B"}
|