@paths.design/caws-cli 7.0.2 → 8.0.0
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/dist/budget-derivation.js +5 -4
- package/dist/commands/diagnose.js +24 -19
- package/dist/commands/init.js +51 -4
- package/dist/commands/quality-gates.js +147 -9
- package/dist/commands/specs.js +148 -14
- package/dist/commands/status.js +2 -2
- package/dist/commands/tool.js +2 -4
- package/dist/config/index.js +17 -8
- package/dist/generators/working-spec.js +19 -6
- package/dist/scaffold/git-hooks.js +245 -46
- package/dist/scaffold/index.js +53 -7
- package/dist/templates/.caws/tools/README.md +21 -0
- package/dist/templates/.cursor/README.md +311 -0
- package/dist/templates/.cursor/hooks/audit.sh +55 -0
- package/dist/templates/.cursor/hooks/block-dangerous.sh +83 -0
- package/dist/templates/.cursor/hooks/caws-quality-check.sh +52 -0
- package/dist/templates/.cursor/hooks/caws-scope-guard.sh +130 -0
- package/dist/templates/.cursor/hooks/caws-tool-validation.sh +121 -0
- package/dist/templates/.cursor/hooks/format.sh +38 -0
- package/dist/templates/.cursor/hooks/naming-check.sh +64 -0
- package/dist/templates/.cursor/hooks/scan-secrets.sh +46 -0
- package/dist/templates/.cursor/hooks/scope-guard.sh +52 -0
- package/dist/templates/.cursor/hooks/validate-spec.sh +83 -0
- package/dist/templates/.cursor/hooks.json +59 -0
- package/dist/templates/.cursor/rules/00-claims-verification.mdc +144 -0
- package/dist/templates/.cursor/rules/01-working-style.mdc +50 -0
- package/dist/templates/.cursor/rules/02-quality-gates.mdc +370 -0
- package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +33 -0
- package/dist/templates/.cursor/rules/04-logging-language-style.mdc +23 -0
- package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +23 -0
- package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +36 -0
- package/dist/templates/.cursor/rules/07-process-ops.mdc +20 -0
- package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +16 -0
- package/dist/templates/.cursor/rules/09-docstrings.mdc +89 -0
- package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +390 -0
- package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +385 -0
- package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +516 -0
- package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +588 -0
- package/dist/templates/.cursor/rules/README.md +148 -0
- package/dist/templates/.github/copilot/instructions.md +311 -0
- package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +5 -0
- package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +5 -0
- package/dist/templates/.vscode/launch.json +56 -0
- package/dist/templates/.vscode/settings.json +93 -0
- package/dist/templates/.windsurf/workflows/caws-guided-development.md +92 -0
- package/dist/templates/COMMIT_CONVENTIONS.md +86 -0
- package/dist/templates/OIDC_SETUP.md +300 -0
- package/dist/templates/agents.md +1047 -0
- package/dist/templates/codemod/README.md +1 -0
- package/dist/templates/codemod/test.js +93 -0
- package/dist/templates/docs/README.md +150 -0
- package/dist/templates/scripts/quality-gates/check-god-objects.js +146 -0
- package/dist/templates/scripts/quality-gates/run-quality-gates.js +50 -0
- package/dist/templates/scripts/v3/analysis/todo_analyzer.py +1997 -0
- package/dist/tool-loader.js +6 -1
- package/dist/tool-validator.js +8 -2
- package/dist/utils/detection.js +4 -3
- package/dist/utils/git-lock.js +119 -0
- package/dist/utils/gitignore-updater.js +148 -0
- package/dist/utils/project-analysis.js +176 -16
- package/dist/utils/quality-gates.js +48 -7
- package/dist/utils/spec-resolver.js +27 -3
- package/dist/utils/yaml-validation.js +156 -0
- package/dist/validation/spec-validation.js +81 -2
- package/package.json +2 -2
- package/templates/.caws/schemas/waivers.schema.json +30 -0
- package/templates/.caws/schemas/working-spec.schema.json +133 -0
- package/templates/.caws/templates/working-spec.template.yml +74 -0
- package/templates/.caws/tools/README.md +21 -0
- package/templates/.caws/tools/scope-guard.js +208 -0
- package/templates/.caws/tools-allow.json +331 -0
- package/templates/.caws/waivers.yml +19 -0
- package/templates/.cursor/hooks/scope-guard.sh +2 -2
- package/templates/.cursor/hooks/validate-spec.sh +42 -7
- package/dist/budget-derivation.d.ts +0 -74
- package/dist/budget-derivation.d.ts.map +0 -1
- package/dist/cicd-optimizer.d.ts +0 -142
- package/dist/cicd-optimizer.d.ts.map +0 -1
- package/dist/commands/archive.d.ts +0 -50
- package/dist/commands/archive.d.ts.map +0 -1
- package/dist/commands/burnup.d.ts +0 -6
- package/dist/commands/burnup.d.ts.map +0 -1
- package/dist/commands/diagnose.d.ts +0 -52
- package/dist/commands/diagnose.d.ts.map +0 -1
- package/dist/commands/evaluate.d.ts +0 -8
- package/dist/commands/evaluate.d.ts.map +0 -1
- package/dist/commands/init.d.ts +0 -5
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/iterate.d.ts +0 -8
- package/dist/commands/iterate.d.ts.map +0 -1
- package/dist/commands/mode.d.ts +0 -24
- package/dist/commands/mode.d.ts.map +0 -1
- package/dist/commands/plan.d.ts +0 -49
- package/dist/commands/plan.d.ts.map +0 -1
- package/dist/commands/provenance.d.ts +0 -32
- package/dist/commands/provenance.d.ts.map +0 -1
- package/dist/commands/quality-gates.d.ts +0 -52
- package/dist/commands/quality-gates.d.ts.map +0 -1
- package/dist/commands/quality-monitor.d.ts +0 -17
- package/dist/commands/quality-monitor.d.ts.map +0 -1
- package/dist/commands/specs.d.ts +0 -71
- package/dist/commands/specs.d.ts.map +0 -1
- package/dist/commands/status.d.ts +0 -44
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/templates.d.ts +0 -74
- package/dist/commands/templates.d.ts.map +0 -1
- package/dist/commands/tool.d.ts +0 -13
- package/dist/commands/tool.d.ts.map +0 -1
- package/dist/commands/troubleshoot.d.ts +0 -8
- package/dist/commands/troubleshoot.d.ts.map +0 -1
- package/dist/commands/tutorial.d.ts +0 -55
- package/dist/commands/tutorial.d.ts.map +0 -1
- package/dist/commands/validate.d.ts +0 -15
- package/dist/commands/validate.d.ts.map +0 -1
- package/dist/commands/waivers.d.ts +0 -8
- package/dist/commands/waivers.d.ts.map +0 -1
- package/dist/commands/workflow.d.ts +0 -85
- package/dist/commands/workflow.d.ts.map +0 -1
- package/dist/config/index.d.ts +0 -29
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/modes.d.ts +0 -225
- package/dist/config/modes.d.ts.map +0 -1
- package/dist/constants/spec-types.d.ts +0 -41
- package/dist/constants/spec-types.d.ts.map +0 -1
- package/dist/error-handler.d.ts +0 -164
- package/dist/error-handler.d.ts.map +0 -1
- package/dist/generators/jest-config.d.ts +0 -32
- package/dist/generators/jest-config.d.ts.map +0 -1
- package/dist/generators/working-spec.d.ts +0 -13
- package/dist/generators/working-spec.d.ts.map +0 -1
- package/dist/index-new.d.ts +0 -5
- package/dist/index-new.d.ts.map +0 -1
- package/dist/index-new.js +0 -317
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.backup +0 -4711
- package/dist/minimal-cli.d.ts +0 -3
- package/dist/minimal-cli.d.ts.map +0 -1
- package/dist/policy/PolicyManager.d.ts +0 -104
- package/dist/policy/PolicyManager.d.ts.map +0 -1
- package/dist/scaffold/cursor-hooks.d.ts +0 -7
- package/dist/scaffold/cursor-hooks.d.ts.map +0 -1
- package/dist/scaffold/git-hooks.d.ts +0 -20
- package/dist/scaffold/git-hooks.d.ts.map +0 -1
- package/dist/scaffold/index.d.ts +0 -20
- package/dist/scaffold/index.d.ts.map +0 -1
- package/dist/spec/SpecFileManager.d.ts +0 -146
- package/dist/spec/SpecFileManager.d.ts.map +0 -1
- package/dist/test-analysis.d.ts +0 -182
- package/dist/test-analysis.d.ts.map +0 -1
- package/dist/tool-interface.d.ts +0 -236
- package/dist/tool-interface.d.ts.map +0 -1
- package/dist/tool-loader.d.ts +0 -77
- package/dist/tool-loader.d.ts.map +0 -1
- package/dist/tool-validator.d.ts +0 -72
- package/dist/tool-validator.d.ts.map +0 -1
- package/dist/utils/detection.d.ts +0 -7
- package/dist/utils/detection.d.ts.map +0 -1
- package/dist/utils/finalization.d.ts +0 -17
- package/dist/utils/finalization.d.ts.map +0 -1
- package/dist/utils/project-analysis.d.ts +0 -14
- package/dist/utils/project-analysis.d.ts.map +0 -1
- package/dist/utils/quality-gates.d.ts +0 -49
- package/dist/utils/quality-gates.d.ts.map +0 -1
- package/dist/utils/spec-resolver.d.ts +0 -88
- package/dist/utils/spec-resolver.d.ts.map +0 -1
- package/dist/utils/typescript-detector.d.ts +0 -63
- package/dist/utils/typescript-detector.d.ts.map +0 -1
- package/dist/validation/spec-validation.d.ts +0 -43
- package/dist/validation/spec-validation.d.ts.map +0 -1
- package/dist/waivers-manager.d.ts +0 -167
- package/dist/waivers-manager.d.ts.map +0 -1
- package/templates/apps/tools/caws/COMPLETION_REPORT.md +0 -331
- package/templates/apps/tools/caws/MIGRATION_SUMMARY.md +0 -360
- package/templates/apps/tools/caws/README.md +0 -463
- package/templates/apps/tools/caws/TEST_STATUS.md +0 -365
- package/templates/apps/tools/caws/attest.js +0 -357
- package/templates/apps/tools/caws/ci-optimizer.js +0 -642
- package/templates/apps/tools/caws/config.ts +0 -245
- package/templates/apps/tools/caws/cross-functional.js +0 -876
- package/templates/apps/tools/caws/dashboard.js +0 -1112
- package/templates/apps/tools/caws/flake-detector.ts +0 -362
- package/templates/apps/tools/caws/gates.js +0 -198
- package/templates/apps/tools/caws/gates.ts +0 -271
- package/templates/apps/tools/caws/language-adapters.ts +0 -381
- package/templates/apps/tools/caws/language-support.d.ts +0 -367
- package/templates/apps/tools/caws/language-support.d.ts.map +0 -1
- package/templates/apps/tools/caws/language-support.js +0 -585
- package/templates/apps/tools/caws/legacy-assessment.ts +0 -408
- package/templates/apps/tools/caws/legacy-assessor.js +0 -764
- package/templates/apps/tools/caws/mutant-analyzer.js +0 -734
- package/templates/apps/tools/caws/perf-budgets.ts +0 -349
- package/templates/apps/tools/caws/prompt-lint.js.backup +0 -274
- package/templates/apps/tools/caws/property-testing.js +0 -707
- package/templates/apps/tools/caws/provenance.d.ts +0 -14
- package/templates/apps/tools/caws/provenance.d.ts.map +0 -1
- package/templates/apps/tools/caws/provenance.js +0 -132
- package/templates/apps/tools/caws/provenance.js.backup +0 -73
- package/templates/apps/tools/caws/provenance.ts +0 -211
- package/templates/apps/tools/caws/security-provenance.ts +0 -483
- package/templates/apps/tools/caws/shared/base-tool.ts +0 -281
- package/templates/apps/tools/caws/shared/config-manager.ts +0 -366
- package/templates/apps/tools/caws/shared/gate-checker.ts +0 -849
- package/templates/apps/tools/caws/shared/types.ts +0 -444
- package/templates/apps/tools/caws/shared/validator.ts +0 -305
- package/templates/apps/tools/caws/shared/waivers-manager.ts +0 -174
- package/templates/apps/tools/caws/spec-test-mapper.ts +0 -391
- package/templates/apps/tools/caws/test-quality.js +0 -578
- package/templates/apps/tools/caws/validate.js +0 -76
- package/templates/apps/tools/caws/validate.ts +0 -228
- package/templates/apps/tools/caws/waivers.js +0 -344
- /package/{templates/apps/tools/caws → dist/templates/.caws}/schemas/waivers.schema.json +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws}/schemas/working-spec.schema.json +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws}/templates/working-spec.template.yml +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws/tools}/scope-guard.js +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws}/tools-allow.json +0 -0
- /package/{templates/apps/tools/caws → dist/templates/.caws}/waivers.yml +0 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview CAWS Scope Guard
|
|
5
|
+
* Enforces that experimental code stays within designated sandbox areas
|
|
6
|
+
* @author @darianrosebrook
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const { execSync } = require('child_process');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Check if experimental code is properly contained
|
|
14
|
+
* @param {string} workingSpecPath - Path to working spec file
|
|
15
|
+
* @returns {Object} Scope validation results
|
|
16
|
+
*/
|
|
17
|
+
function checkExperimentalContainment(workingSpecPath = '.caws/working-spec.yaml') {
|
|
18
|
+
try {
|
|
19
|
+
if (!fs.existsSync(workingSpecPath)) {
|
|
20
|
+
console.error('❌ Working spec not found:', workingSpecPath);
|
|
21
|
+
return { valid: false, errors: ['Working spec not found'] };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const yaml = require('js-yaml');
|
|
25
|
+
const spec = yaml.load(fs.readFileSync(workingSpecPath, 'utf8'));
|
|
26
|
+
|
|
27
|
+
const results = {
|
|
28
|
+
valid: true,
|
|
29
|
+
errors: [],
|
|
30
|
+
warnings: [],
|
|
31
|
+
experimentalFiles: [],
|
|
32
|
+
nonExperimentalFiles: [],
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// Only check if experimental mode is enabled
|
|
36
|
+
if (!spec.experimental_mode?.enabled) {
|
|
37
|
+
console.log('ℹ️ Experimental mode not enabled - skipping containment check');
|
|
38
|
+
return results;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const sandboxLocation = spec.experimental_mode.sandbox_location || 'experimental/';
|
|
42
|
+
console.log(`🔍 Checking containment for experimental code in: ${sandboxLocation}`);
|
|
43
|
+
|
|
44
|
+
// Get list of changed files (this would typically come from git diff)
|
|
45
|
+
const changedFiles = getChangedFiles();
|
|
46
|
+
|
|
47
|
+
if (changedFiles.length === 0) {
|
|
48
|
+
console.log('ℹ️ No files changed - skipping scope check');
|
|
49
|
+
return results;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Check each changed file
|
|
53
|
+
changedFiles.forEach((file) => {
|
|
54
|
+
const isInSandbox =
|
|
55
|
+
file.startsWith(sandboxLocation) ||
|
|
56
|
+
file.includes(`/${sandboxLocation}`) ||
|
|
57
|
+
file.includes(sandboxLocation);
|
|
58
|
+
|
|
59
|
+
if (isInSandbox) {
|
|
60
|
+
results.experimentalFiles.push(file);
|
|
61
|
+
console.log(`✅ Experimental file properly contained: ${file}`);
|
|
62
|
+
} else {
|
|
63
|
+
results.nonExperimentalFiles.push(file);
|
|
64
|
+
results.valid = false;
|
|
65
|
+
results.errors.push(`Experimental code found outside sandbox: ${file}`);
|
|
66
|
+
console.error(`❌ Experimental code outside sandbox: ${file}`);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Check if experimental files actually exist
|
|
71
|
+
results.experimentalFiles.forEach((file) => {
|
|
72
|
+
if (!fs.existsSync(file)) {
|
|
73
|
+
results.warnings.push(`Experimental file not found (may have been deleted): ${file}`);
|
|
74
|
+
console.warn(`⚠️ Experimental file not found: ${file}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
return results;
|
|
79
|
+
} catch (error) {
|
|
80
|
+
console.error('❌ Error checking experimental containment:', error.message);
|
|
81
|
+
return { valid: false, errors: [error.message] };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get list of changed files from git
|
|
87
|
+
* @returns {Array} List of changed file paths
|
|
88
|
+
*/
|
|
89
|
+
function getChangedFiles() {
|
|
90
|
+
try {
|
|
91
|
+
// Get files that are staged or modified
|
|
92
|
+
const staged = execSync('git diff --cached --name-only', { encoding: 'utf8' })
|
|
93
|
+
.split('\n')
|
|
94
|
+
.filter((file) => file.trim());
|
|
95
|
+
|
|
96
|
+
const modified = execSync('git diff --name-only', { encoding: 'utf8' })
|
|
97
|
+
.split('\n')
|
|
98
|
+
.filter((file) => file.trim());
|
|
99
|
+
|
|
100
|
+
// Combine and deduplicate
|
|
101
|
+
const allFiles = [...new Set([...staged, ...modified])];
|
|
102
|
+
|
|
103
|
+
// Filter out deleted files (they might still be in the diff)
|
|
104
|
+
return allFiles.filter((file) => {
|
|
105
|
+
try {
|
|
106
|
+
return fs.existsSync(file);
|
|
107
|
+
} catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
} catch (error) {
|
|
112
|
+
console.warn('⚠️ Could not get changed files from git:', error.message);
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Validate that experimental code follows containment rules
|
|
119
|
+
* @param {string} workingSpecPath - Path to working spec file
|
|
120
|
+
*/
|
|
121
|
+
function validateExperimentalScope(workingSpecPath = '.caws/working-spec.yaml') {
|
|
122
|
+
console.log('🔍 Validating experimental code containment...');
|
|
123
|
+
|
|
124
|
+
const results = checkExperimentalContainment(workingSpecPath);
|
|
125
|
+
|
|
126
|
+
if (!results.valid) {
|
|
127
|
+
console.error('\n❌ Experimental containment validation failed:');
|
|
128
|
+
results.errors.forEach((error) => {
|
|
129
|
+
console.error(` - ${error}`);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
if (results.warnings.length > 0) {
|
|
133
|
+
console.warn('\n⚠️ Warnings:');
|
|
134
|
+
results.warnings.forEach((warning) => {
|
|
135
|
+
console.warn(` - ${warning}`);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
console.error('\n💡 To fix containment issues:');
|
|
140
|
+
console.error(' 1. Move experimental code to the designated sandbox location');
|
|
141
|
+
console.error(' 2. Update the sandbox_location in your working spec');
|
|
142
|
+
console.error(' 3. Or disable experimental mode if this is production code');
|
|
143
|
+
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (results.warnings.length > 0) {
|
|
148
|
+
console.warn('\n⚠️ Experimental containment warnings:');
|
|
149
|
+
results.warnings.forEach((warning) => {
|
|
150
|
+
console.warn(` - ${warning}`);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
console.log('✅ Experimental code containment validated');
|
|
155
|
+
console.log(` - Files in sandbox: ${results.experimentalFiles.length}`);
|
|
156
|
+
console.log(` - Files outside sandbox: ${results.nonExperimentalFiles.length}`);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// CLI interface
|
|
160
|
+
if (require.main === module) {
|
|
161
|
+
const command = process.argv[2];
|
|
162
|
+
const specPath = process.argv[3] || '.caws/working-spec.yaml';
|
|
163
|
+
|
|
164
|
+
switch (command) {
|
|
165
|
+
case 'validate':
|
|
166
|
+
validateExperimentalScope(specPath);
|
|
167
|
+
break;
|
|
168
|
+
|
|
169
|
+
case 'check':
|
|
170
|
+
const results = checkExperimentalContainment(specPath);
|
|
171
|
+
console.log('\n📊 Containment Check Results:');
|
|
172
|
+
console.log(` Valid: ${results.valid}`);
|
|
173
|
+
console.log(` Experimental files: ${results.experimentalFiles.length}`);
|
|
174
|
+
console.log(` Non-experimental files: ${results.nonExperimentalFiles.length}`);
|
|
175
|
+
console.log(` Errors: ${results.errors.length}`);
|
|
176
|
+
console.log(` Warnings: ${results.warnings.length}`);
|
|
177
|
+
|
|
178
|
+
if (results.errors.length > 0) {
|
|
179
|
+
console.log('\n❌ Errors:');
|
|
180
|
+
results.errors.forEach((error) => console.log(` - ${error}`));
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (results.warnings.length > 0) {
|
|
184
|
+
console.log('\n⚠️ Warnings:');
|
|
185
|
+
results.warnings.forEach((warning) => console.log(` - ${warning}`));
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
process.exit(results.valid ? 0 : 1);
|
|
189
|
+
break;
|
|
190
|
+
|
|
191
|
+
default:
|
|
192
|
+
console.log('CAWS Scope Guard');
|
|
193
|
+
console.log('Usage:');
|
|
194
|
+
console.log(' node scope-guard.js validate [spec-path]');
|
|
195
|
+
console.log(' node scope-guard.js check [spec-path]');
|
|
196
|
+
console.log('');
|
|
197
|
+
console.log('Examples:');
|
|
198
|
+
console.log(' node scope-guard.js validate');
|
|
199
|
+
console.log(' node scope-guard.js check .caws/working-spec.yaml');
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
module.exports = {
|
|
205
|
+
checkExperimentalContainment,
|
|
206
|
+
validateExperimentalScope,
|
|
207
|
+
getChangedFiles,
|
|
208
|
+
};
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
[
|
|
2
|
+
"node",
|
|
3
|
+
"npm",
|
|
4
|
+
"yarn",
|
|
5
|
+
"pnpm",
|
|
6
|
+
"git",
|
|
7
|
+
"docker",
|
|
8
|
+
"kubectl",
|
|
9
|
+
"aws",
|
|
10
|
+
"azure",
|
|
11
|
+
"gcloud",
|
|
12
|
+
"terraform",
|
|
13
|
+
"ansible",
|
|
14
|
+
"curl",
|
|
15
|
+
"wget",
|
|
16
|
+
"grep",
|
|
17
|
+
"sed",
|
|
18
|
+
"awk",
|
|
19
|
+
"bash",
|
|
20
|
+
"sh",
|
|
21
|
+
"zsh",
|
|
22
|
+
"fish",
|
|
23
|
+
"python",
|
|
24
|
+
"python3",
|
|
25
|
+
"pip",
|
|
26
|
+
"pip3",
|
|
27
|
+
"virtualenv",
|
|
28
|
+
"conda",
|
|
29
|
+
"java",
|
|
30
|
+
"javac",
|
|
31
|
+
"gradle",
|
|
32
|
+
"maven",
|
|
33
|
+
"go",
|
|
34
|
+
"gofmt",
|
|
35
|
+
"rust",
|
|
36
|
+
"cargo",
|
|
37
|
+
"rustfmt",
|
|
38
|
+
"clippy",
|
|
39
|
+
"ruby",
|
|
40
|
+
"gem",
|
|
41
|
+
"bundle",
|
|
42
|
+
"rbenv",
|
|
43
|
+
"php",
|
|
44
|
+
"composer",
|
|
45
|
+
"dotnet",
|
|
46
|
+
"nuget",
|
|
47
|
+
"swift",
|
|
48
|
+
"xcodebuild",
|
|
49
|
+
"make",
|
|
50
|
+
"cmake",
|
|
51
|
+
"ninja",
|
|
52
|
+
"gcc",
|
|
53
|
+
"clang",
|
|
54
|
+
"ld",
|
|
55
|
+
"ar",
|
|
56
|
+
"strip",
|
|
57
|
+
"objdump",
|
|
58
|
+
"nm",
|
|
59
|
+
"readelf",
|
|
60
|
+
"file",
|
|
61
|
+
"hexdump",
|
|
62
|
+
"xxd",
|
|
63
|
+
"base64",
|
|
64
|
+
"openssl",
|
|
65
|
+
"ssh",
|
|
66
|
+
"scp",
|
|
67
|
+
"rsync",
|
|
68
|
+
"tar",
|
|
69
|
+
"gzip",
|
|
70
|
+
"bzip2",
|
|
71
|
+
"xz",
|
|
72
|
+
"zip",
|
|
73
|
+
"unzip",
|
|
74
|
+
"7z",
|
|
75
|
+
"jq",
|
|
76
|
+
"yq",
|
|
77
|
+
"xmlstarlet",
|
|
78
|
+
"html-xml-utils",
|
|
79
|
+
"pandoc",
|
|
80
|
+
"asciidoc",
|
|
81
|
+
"rst2html",
|
|
82
|
+
"markdown",
|
|
83
|
+
"remark",
|
|
84
|
+
"prettier",
|
|
85
|
+
"eslint",
|
|
86
|
+
"tslint",
|
|
87
|
+
"stylelint",
|
|
88
|
+
"htmlhint",
|
|
89
|
+
"csslint",
|
|
90
|
+
"jsonlint",
|
|
91
|
+
"yamllint",
|
|
92
|
+
"shellcheck",
|
|
93
|
+
"hadolint",
|
|
94
|
+
"dockerfile_lint",
|
|
95
|
+
"markdownlint",
|
|
96
|
+
"proselint",
|
|
97
|
+
"vale",
|
|
98
|
+
"alex",
|
|
99
|
+
"write-good",
|
|
100
|
+
"textlint",
|
|
101
|
+
"redpen",
|
|
102
|
+
"languagetool",
|
|
103
|
+
"grammarly",
|
|
104
|
+
"codespell",
|
|
105
|
+
"typos",
|
|
106
|
+
"aspell",
|
|
107
|
+
"hunspell",
|
|
108
|
+
"sort",
|
|
109
|
+
"uniq",
|
|
110
|
+
"cut",
|
|
111
|
+
"paste",
|
|
112
|
+
"join",
|
|
113
|
+
"split",
|
|
114
|
+
"tr",
|
|
115
|
+
"column",
|
|
116
|
+
"fold",
|
|
117
|
+
"fmt",
|
|
118
|
+
"pr",
|
|
119
|
+
"head",
|
|
120
|
+
"tail",
|
|
121
|
+
"wc",
|
|
122
|
+
"nl",
|
|
123
|
+
"od",
|
|
124
|
+
"strings",
|
|
125
|
+
"iconv",
|
|
126
|
+
"dos2unix",
|
|
127
|
+
"unix2dos",
|
|
128
|
+
"mac2unix",
|
|
129
|
+
"unix2mac",
|
|
130
|
+
"pbcopy",
|
|
131
|
+
"pbpaste",
|
|
132
|
+
"xclip",
|
|
133
|
+
"xsel",
|
|
134
|
+
"tmux",
|
|
135
|
+
"screen",
|
|
136
|
+
"vim",
|
|
137
|
+
"nvim",
|
|
138
|
+
"emacs",
|
|
139
|
+
"nano",
|
|
140
|
+
"micro",
|
|
141
|
+
"code",
|
|
142
|
+
"atom",
|
|
143
|
+
"sublime",
|
|
144
|
+
"vimr",
|
|
145
|
+
"macvim",
|
|
146
|
+
"gvim",
|
|
147
|
+
"vscode",
|
|
148
|
+
"intellij",
|
|
149
|
+
"pycharm",
|
|
150
|
+
"webstorm",
|
|
151
|
+
"phpstorm",
|
|
152
|
+
"rubymine",
|
|
153
|
+
"clion",
|
|
154
|
+
"goland",
|
|
155
|
+
"rider",
|
|
156
|
+
"datagrip",
|
|
157
|
+
"android-studio",
|
|
158
|
+
"xcode",
|
|
159
|
+
"eclipse",
|
|
160
|
+
"netbeans",
|
|
161
|
+
"idea",
|
|
162
|
+
"studio",
|
|
163
|
+
"vs",
|
|
164
|
+
"visualstudio",
|
|
165
|
+
"monodevelop",
|
|
166
|
+
"xamarin",
|
|
167
|
+
"rider",
|
|
168
|
+
"resharper",
|
|
169
|
+
"testcafe",
|
|
170
|
+
"cypress",
|
|
171
|
+
"playwright",
|
|
172
|
+
"puppeteer",
|
|
173
|
+
"selenium",
|
|
174
|
+
"webdriver",
|
|
175
|
+
"jest",
|
|
176
|
+
"mocha",
|
|
177
|
+
"jasmine",
|
|
178
|
+
"karma",
|
|
179
|
+
"vitest",
|
|
180
|
+
"testing-library",
|
|
181
|
+
"enzyme",
|
|
182
|
+
"react-testing-library",
|
|
183
|
+
"vue-test-utils",
|
|
184
|
+
"angular-testing-library",
|
|
185
|
+
"svelte-testing-library",
|
|
186
|
+
"lit-testing-library",
|
|
187
|
+
"ember-testing",
|
|
188
|
+
"backbone-testing",
|
|
189
|
+
"jquery-testing",
|
|
190
|
+
"dojo-testing",
|
|
191
|
+
"dojo",
|
|
192
|
+
"mootools",
|
|
193
|
+
"prototype",
|
|
194
|
+
"yui",
|
|
195
|
+
"extjs",
|
|
196
|
+
"sencha",
|
|
197
|
+
"backbone",
|
|
198
|
+
"marionette",
|
|
199
|
+
"chaplin",
|
|
200
|
+
"thorax",
|
|
201
|
+
"handlebars",
|
|
202
|
+
"mustache",
|
|
203
|
+
"underscore",
|
|
204
|
+
"lodash",
|
|
205
|
+
"ramda",
|
|
206
|
+
"functional",
|
|
207
|
+
"lazy",
|
|
208
|
+
"bluebird",
|
|
209
|
+
"q",
|
|
210
|
+
"deferred",
|
|
211
|
+
"async",
|
|
212
|
+
"await",
|
|
213
|
+
"generator",
|
|
214
|
+
"co",
|
|
215
|
+
"redux",
|
|
216
|
+
"mobx",
|
|
217
|
+
"flux",
|
|
218
|
+
"reflux",
|
|
219
|
+
"alt",
|
|
220
|
+
"flummox",
|
|
221
|
+
"delorean",
|
|
222
|
+
"cerebral",
|
|
223
|
+
"kea",
|
|
224
|
+
"zustand",
|
|
225
|
+
"jotai",
|
|
226
|
+
"recoil",
|
|
227
|
+
"valtio",
|
|
228
|
+
"effector",
|
|
229
|
+
"xstate",
|
|
230
|
+
"robot",
|
|
231
|
+
"easy-peasy",
|
|
232
|
+
"pullstate",
|
|
233
|
+
"akita",
|
|
234
|
+
"ngrx",
|
|
235
|
+
"ngxs",
|
|
236
|
+
"akita",
|
|
237
|
+
"elf",
|
|
238
|
+
"pinia",
|
|
239
|
+
"overmind",
|
|
240
|
+
"stately",
|
|
241
|
+
"context",
|
|
242
|
+
"useContext",
|
|
243
|
+
"useReducer",
|
|
244
|
+
"useState",
|
|
245
|
+
"useEffect",
|
|
246
|
+
"useMemo",
|
|
247
|
+
"useCallback",
|
|
248
|
+
"useRef",
|
|
249
|
+
"useImperativeHandle",
|
|
250
|
+
"useLayoutEffect",
|
|
251
|
+
"useDebugValue",
|
|
252
|
+
"useDeferredValue",
|
|
253
|
+
"useTransition",
|
|
254
|
+
"useId",
|
|
255
|
+
"useSyncExternalStore",
|
|
256
|
+
"createContext",
|
|
257
|
+
"createElement",
|
|
258
|
+
"cloneElement",
|
|
259
|
+
"isValidElement",
|
|
260
|
+
"ReactDOM",
|
|
261
|
+
"render",
|
|
262
|
+
"hydrate",
|
|
263
|
+
"createRoot",
|
|
264
|
+
"unmountComponentAtNode",
|
|
265
|
+
"findDOMNode",
|
|
266
|
+
"createPortal",
|
|
267
|
+
"unstable_batchedUpdates",
|
|
268
|
+
"flushSync",
|
|
269
|
+
"React",
|
|
270
|
+
"Component",
|
|
271
|
+
"PureComponent",
|
|
272
|
+
"memo",
|
|
273
|
+
"lazy",
|
|
274
|
+
"Suspense",
|
|
275
|
+
"ErrorBoundary",
|
|
276
|
+
"Profiler",
|
|
277
|
+
"StrictMode",
|
|
278
|
+
"Fragment",
|
|
279
|
+
"createRef",
|
|
280
|
+
"forwardRef",
|
|
281
|
+
"createContext",
|
|
282
|
+
"createElement",
|
|
283
|
+
"cloneElement",
|
|
284
|
+
"isValidElement",
|
|
285
|
+
"Children",
|
|
286
|
+
"map",
|
|
287
|
+
"forEach",
|
|
288
|
+
"count",
|
|
289
|
+
"only",
|
|
290
|
+
"toArray",
|
|
291
|
+
"ReactDOM",
|
|
292
|
+
"render",
|
|
293
|
+
"hydrate",
|
|
294
|
+
"createRoot",
|
|
295
|
+
"unmountComponentAtNode",
|
|
296
|
+
"findDOMNode",
|
|
297
|
+
"createPortal",
|
|
298
|
+
"unstable_batchedUpdates",
|
|
299
|
+
"flushSync",
|
|
300
|
+
"React",
|
|
301
|
+
"Component",
|
|
302
|
+
"PureComponent",
|
|
303
|
+
"memo",
|
|
304
|
+
"lazy",
|
|
305
|
+
"Suspense",
|
|
306
|
+
"ErrorBoundary",
|
|
307
|
+
"Profiler",
|
|
308
|
+
"StrictMode",
|
|
309
|
+
"Fragment",
|
|
310
|
+
"createRef",
|
|
311
|
+
"forwardRef",
|
|
312
|
+
"createContext",
|
|
313
|
+
"createElement",
|
|
314
|
+
"cloneElement",
|
|
315
|
+
"isValidElement",
|
|
316
|
+
"Children",
|
|
317
|
+
"map",
|
|
318
|
+
"forEach",
|
|
319
|
+
"count",
|
|
320
|
+
"only",
|
|
321
|
+
"toArray",
|
|
322
|
+
"ReactDOM",
|
|
323
|
+
"render",
|
|
324
|
+
"hydrate",
|
|
325
|
+
"createRoot",
|
|
326
|
+
"unmountComponentAtNode",
|
|
327
|
+
"findDOMNode",
|
|
328
|
+
"createPortal",
|
|
329
|
+
"unstable_batchedUpdates",
|
|
330
|
+
"flushSync"
|
|
331
|
+
]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
waivers:
|
|
2
|
+
# Example waiver for urgent fixes
|
|
3
|
+
# - id: "HOTFIX-001"
|
|
4
|
+
# description: "Urgent security fix - mutation testing waived"
|
|
5
|
+
# gates: ["mutation", "coverage"]
|
|
6
|
+
# reason: "urgent_fix"
|
|
7
|
+
# approver: "senior-dev"
|
|
8
|
+
# expires_at: "2025-10-07T10:00:00.000Z"
|
|
9
|
+
# projects: ["FEAT-1234"]
|
|
10
|
+
# max_trust_score: 79
|
|
11
|
+
|
|
12
|
+
# Example waiver for experimental features
|
|
13
|
+
# - id: "EXP-001"
|
|
14
|
+
# description: "Experimental feature - relaxed testing"
|
|
15
|
+
# gates: ["mutation", "contracts"]
|
|
16
|
+
# reason: "experimental"
|
|
17
|
+
# approver: "tech-lead"
|
|
18
|
+
# expires_at: "2025-10-14T10:00:00.000Z"
|
|
19
|
+
# max_trust_score: 75
|
|
@@ -22,7 +22,7 @@ if [ ! -f ".caws/working-spec.yaml" ] && [ ! -f ".caws/working-spec.yml" ]; then
|
|
|
22
22
|
fi
|
|
23
23
|
|
|
24
24
|
# Check if scope-guard tool exists
|
|
25
|
-
if [ -f "
|
|
25
|
+
if [ -f ".caws/tools/scope-guard.js" ]; then
|
|
26
26
|
# Extract file paths from attachments
|
|
27
27
|
FILE_PATHS=$(echo "$ATTACHMENTS" | jq -r '.[] | select(.type=="file") | .file_path' 2>/dev/null || echo "")
|
|
28
28
|
|
|
@@ -31,7 +31,7 @@ if [ -f "apps/tools/caws/scope-guard.js" ]; then
|
|
|
31
31
|
OUT_OF_SCOPE=()
|
|
32
32
|
while IFS= read -r file; do
|
|
33
33
|
if [ -n "$file" ]; then
|
|
34
|
-
if ! node
|
|
34
|
+
if ! node .caws/tools/scope-guard.js check "$file" 2>/dev/null; then
|
|
35
35
|
OUT_OF_SCOPE+=("$file")
|
|
36
36
|
fi
|
|
37
37
|
fi
|
|
@@ -14,27 +14,62 @@ INPUT=$(cat)
|
|
|
14
14
|
# Extract file path from input
|
|
15
15
|
FILE_PATH=$(echo "$INPUT" | jq -r '.file_path // ""')
|
|
16
16
|
|
|
17
|
-
#
|
|
18
|
-
if [[ "$FILE_PATH" == *"
|
|
19
|
-
echo "🔍 Validating CAWS
|
|
17
|
+
# Validate if any CAWS YAML file was edited (.caws/**/*.yaml or .caws/**/*.yml)
|
|
18
|
+
if [[ "$FILE_PATH" == *".caws/"* ]] && ([[ "$FILE_PATH" == *.yaml ]] || [[ "$FILE_PATH" == *.yml ]]); then
|
|
19
|
+
echo "🔍 Validating CAWS spec file..." >&2
|
|
20
20
|
|
|
21
|
-
#
|
|
21
|
+
# First, validate YAML syntax
|
|
22
|
+
if command -v node >/dev/null 2>&1; then
|
|
23
|
+
# Check YAML syntax using Node.js
|
|
24
|
+
YAML_SYNTAX_VALID=$(node -e "
|
|
25
|
+
const yaml = require('js-yaml');
|
|
26
|
+
const fs = require('fs');
|
|
27
|
+
try {
|
|
28
|
+
const content = fs.readFileSync('$FILE_PATH', 'utf8');
|
|
29
|
+
yaml.load(content);
|
|
30
|
+
process.exit(0);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error('YAML syntax error:', error.message);
|
|
33
|
+
if (error.mark) {
|
|
34
|
+
console.error('Line:', error.mark.line + 1, 'Column:', error.mark.column + 1);
|
|
35
|
+
}
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
" 2>&1)
|
|
39
|
+
|
|
40
|
+
if [ $? -ne 0 ]; then
|
|
41
|
+
echo '{
|
|
42
|
+
"userMessage": "⚠️ YAML syntax error detected",
|
|
43
|
+
"agentMessage": "The spec file has invalid YAML syntax. Fix syntax errors before continuing.",
|
|
44
|
+
"suggestions": [
|
|
45
|
+
"Check indentation (YAML uses 2 spaces)",
|
|
46
|
+
"Ensure all array items use consistent format",
|
|
47
|
+
"Remove duplicate keys",
|
|
48
|
+
"Consider using '\''caws specs create <id>'\'' instead of manual creation"
|
|
49
|
+
]
|
|
50
|
+
}' 2>/dev/null
|
|
51
|
+
exit 0
|
|
52
|
+
fi
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# Check if CAWS CLI is available for semantic validation
|
|
22
56
|
if command -v caws &> /dev/null; then
|
|
23
57
|
# Run CAWS validation with suggestions
|
|
24
58
|
if VALIDATION=$(caws validate "$FILE_PATH" --quiet 2>&1); then
|
|
25
|
-
echo '{"userMessage":"✅ CAWS spec validation passed","agentMessage":"
|
|
59
|
+
echo '{"userMessage":"✅ CAWS spec validation passed","agentMessage":"Specification is valid and complete."}' 2>/dev/null
|
|
26
60
|
else
|
|
27
61
|
# Get suggestions for fixing the spec
|
|
28
62
|
SUGGESTIONS=$(caws validate "$FILE_PATH" --suggestions 2>/dev/null | head -5 | tr '\n' '; ' | sed 's/; $//' || echo "Run caws validate --suggestions for details")
|
|
29
63
|
|
|
30
64
|
echo '{
|
|
31
65
|
"userMessage": "⚠️ CAWS spec validation failed. Run: caws validate --suggestions",
|
|
32
|
-
"agentMessage": "The
|
|
66
|
+
"agentMessage": "The spec file has validation errors. Please review and fix before continuing.",
|
|
33
67
|
"suggestions": [
|
|
34
68
|
"Run caws validate --suggestions for detailed error messages",
|
|
35
69
|
"Check required fields: id, title, risk_tier, mode",
|
|
36
70
|
"Ensure acceptance criteria are properly defined",
|
|
37
|
-
"Verify scope boundaries are appropriate"
|
|
71
|
+
"Verify scope boundaries are appropriate",
|
|
72
|
+
"Consider using '\''caws specs create <id>'\'' for proper structure"
|
|
38
73
|
]
|
|
39
74
|
}' 2>/dev/null
|
|
40
75
|
fi
|