@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.
Files changed (217) hide show
  1. package/dist/budget-derivation.js +5 -4
  2. package/dist/commands/diagnose.js +24 -19
  3. package/dist/commands/init.js +51 -4
  4. package/dist/commands/quality-gates.js +147 -9
  5. package/dist/commands/specs.js +148 -14
  6. package/dist/commands/status.js +2 -2
  7. package/dist/commands/tool.js +2 -4
  8. package/dist/config/index.js +17 -8
  9. package/dist/generators/working-spec.js +19 -6
  10. package/dist/scaffold/git-hooks.js +245 -46
  11. package/dist/scaffold/index.js +53 -7
  12. package/dist/templates/.caws/tools/README.md +21 -0
  13. package/dist/templates/.cursor/README.md +311 -0
  14. package/dist/templates/.cursor/hooks/audit.sh +55 -0
  15. package/dist/templates/.cursor/hooks/block-dangerous.sh +83 -0
  16. package/dist/templates/.cursor/hooks/caws-quality-check.sh +52 -0
  17. package/dist/templates/.cursor/hooks/caws-scope-guard.sh +130 -0
  18. package/dist/templates/.cursor/hooks/caws-tool-validation.sh +121 -0
  19. package/dist/templates/.cursor/hooks/format.sh +38 -0
  20. package/dist/templates/.cursor/hooks/naming-check.sh +64 -0
  21. package/dist/templates/.cursor/hooks/scan-secrets.sh +46 -0
  22. package/dist/templates/.cursor/hooks/scope-guard.sh +52 -0
  23. package/dist/templates/.cursor/hooks/validate-spec.sh +83 -0
  24. package/dist/templates/.cursor/hooks.json +59 -0
  25. package/dist/templates/.cursor/rules/00-claims-verification.mdc +144 -0
  26. package/dist/templates/.cursor/rules/01-working-style.mdc +50 -0
  27. package/dist/templates/.cursor/rules/02-quality-gates.mdc +370 -0
  28. package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +33 -0
  29. package/dist/templates/.cursor/rules/04-logging-language-style.mdc +23 -0
  30. package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +23 -0
  31. package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +36 -0
  32. package/dist/templates/.cursor/rules/07-process-ops.mdc +20 -0
  33. package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +16 -0
  34. package/dist/templates/.cursor/rules/09-docstrings.mdc +89 -0
  35. package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +390 -0
  36. package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +385 -0
  37. package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +516 -0
  38. package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +588 -0
  39. package/dist/templates/.cursor/rules/README.md +148 -0
  40. package/dist/templates/.github/copilot/instructions.md +311 -0
  41. package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +5 -0
  42. package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +5 -0
  43. package/dist/templates/.vscode/launch.json +56 -0
  44. package/dist/templates/.vscode/settings.json +93 -0
  45. package/dist/templates/.windsurf/workflows/caws-guided-development.md +92 -0
  46. package/dist/templates/COMMIT_CONVENTIONS.md +86 -0
  47. package/dist/templates/OIDC_SETUP.md +300 -0
  48. package/dist/templates/agents.md +1047 -0
  49. package/dist/templates/codemod/README.md +1 -0
  50. package/dist/templates/codemod/test.js +93 -0
  51. package/dist/templates/docs/README.md +150 -0
  52. package/dist/templates/scripts/quality-gates/check-god-objects.js +146 -0
  53. package/dist/templates/scripts/quality-gates/run-quality-gates.js +50 -0
  54. package/dist/templates/scripts/v3/analysis/todo_analyzer.py +1997 -0
  55. package/dist/tool-loader.js +6 -1
  56. package/dist/tool-validator.js +8 -2
  57. package/dist/utils/detection.js +4 -3
  58. package/dist/utils/git-lock.js +119 -0
  59. package/dist/utils/gitignore-updater.js +148 -0
  60. package/dist/utils/project-analysis.js +176 -16
  61. package/dist/utils/quality-gates.js +48 -7
  62. package/dist/utils/spec-resolver.js +27 -3
  63. package/dist/utils/yaml-validation.js +156 -0
  64. package/dist/validation/spec-validation.js +81 -2
  65. package/package.json +2 -2
  66. package/templates/.caws/schemas/waivers.schema.json +30 -0
  67. package/templates/.caws/schemas/working-spec.schema.json +133 -0
  68. package/templates/.caws/templates/working-spec.template.yml +74 -0
  69. package/templates/.caws/tools/README.md +21 -0
  70. package/templates/.caws/tools/scope-guard.js +208 -0
  71. package/templates/.caws/tools-allow.json +331 -0
  72. package/templates/.caws/waivers.yml +19 -0
  73. package/templates/.cursor/hooks/scope-guard.sh +2 -2
  74. package/templates/.cursor/hooks/validate-spec.sh +42 -7
  75. package/dist/budget-derivation.d.ts +0 -74
  76. package/dist/budget-derivation.d.ts.map +0 -1
  77. package/dist/cicd-optimizer.d.ts +0 -142
  78. package/dist/cicd-optimizer.d.ts.map +0 -1
  79. package/dist/commands/archive.d.ts +0 -50
  80. package/dist/commands/archive.d.ts.map +0 -1
  81. package/dist/commands/burnup.d.ts +0 -6
  82. package/dist/commands/burnup.d.ts.map +0 -1
  83. package/dist/commands/diagnose.d.ts +0 -52
  84. package/dist/commands/diagnose.d.ts.map +0 -1
  85. package/dist/commands/evaluate.d.ts +0 -8
  86. package/dist/commands/evaluate.d.ts.map +0 -1
  87. package/dist/commands/init.d.ts +0 -5
  88. package/dist/commands/init.d.ts.map +0 -1
  89. package/dist/commands/iterate.d.ts +0 -8
  90. package/dist/commands/iterate.d.ts.map +0 -1
  91. package/dist/commands/mode.d.ts +0 -24
  92. package/dist/commands/mode.d.ts.map +0 -1
  93. package/dist/commands/plan.d.ts +0 -49
  94. package/dist/commands/plan.d.ts.map +0 -1
  95. package/dist/commands/provenance.d.ts +0 -32
  96. package/dist/commands/provenance.d.ts.map +0 -1
  97. package/dist/commands/quality-gates.d.ts +0 -52
  98. package/dist/commands/quality-gates.d.ts.map +0 -1
  99. package/dist/commands/quality-monitor.d.ts +0 -17
  100. package/dist/commands/quality-monitor.d.ts.map +0 -1
  101. package/dist/commands/specs.d.ts +0 -71
  102. package/dist/commands/specs.d.ts.map +0 -1
  103. package/dist/commands/status.d.ts +0 -44
  104. package/dist/commands/status.d.ts.map +0 -1
  105. package/dist/commands/templates.d.ts +0 -74
  106. package/dist/commands/templates.d.ts.map +0 -1
  107. package/dist/commands/tool.d.ts +0 -13
  108. package/dist/commands/tool.d.ts.map +0 -1
  109. package/dist/commands/troubleshoot.d.ts +0 -8
  110. package/dist/commands/troubleshoot.d.ts.map +0 -1
  111. package/dist/commands/tutorial.d.ts +0 -55
  112. package/dist/commands/tutorial.d.ts.map +0 -1
  113. package/dist/commands/validate.d.ts +0 -15
  114. package/dist/commands/validate.d.ts.map +0 -1
  115. package/dist/commands/waivers.d.ts +0 -8
  116. package/dist/commands/waivers.d.ts.map +0 -1
  117. package/dist/commands/workflow.d.ts +0 -85
  118. package/dist/commands/workflow.d.ts.map +0 -1
  119. package/dist/config/index.d.ts +0 -29
  120. package/dist/config/index.d.ts.map +0 -1
  121. package/dist/config/modes.d.ts +0 -225
  122. package/dist/config/modes.d.ts.map +0 -1
  123. package/dist/constants/spec-types.d.ts +0 -41
  124. package/dist/constants/spec-types.d.ts.map +0 -1
  125. package/dist/error-handler.d.ts +0 -164
  126. package/dist/error-handler.d.ts.map +0 -1
  127. package/dist/generators/jest-config.d.ts +0 -32
  128. package/dist/generators/jest-config.d.ts.map +0 -1
  129. package/dist/generators/working-spec.d.ts +0 -13
  130. package/dist/generators/working-spec.d.ts.map +0 -1
  131. package/dist/index-new.d.ts +0 -5
  132. package/dist/index-new.d.ts.map +0 -1
  133. package/dist/index-new.js +0 -317
  134. package/dist/index.d.ts +0 -5
  135. package/dist/index.d.ts.map +0 -1
  136. package/dist/index.js.backup +0 -4711
  137. package/dist/minimal-cli.d.ts +0 -3
  138. package/dist/minimal-cli.d.ts.map +0 -1
  139. package/dist/policy/PolicyManager.d.ts +0 -104
  140. package/dist/policy/PolicyManager.d.ts.map +0 -1
  141. package/dist/scaffold/cursor-hooks.d.ts +0 -7
  142. package/dist/scaffold/cursor-hooks.d.ts.map +0 -1
  143. package/dist/scaffold/git-hooks.d.ts +0 -20
  144. package/dist/scaffold/git-hooks.d.ts.map +0 -1
  145. package/dist/scaffold/index.d.ts +0 -20
  146. package/dist/scaffold/index.d.ts.map +0 -1
  147. package/dist/spec/SpecFileManager.d.ts +0 -146
  148. package/dist/spec/SpecFileManager.d.ts.map +0 -1
  149. package/dist/test-analysis.d.ts +0 -182
  150. package/dist/test-analysis.d.ts.map +0 -1
  151. package/dist/tool-interface.d.ts +0 -236
  152. package/dist/tool-interface.d.ts.map +0 -1
  153. package/dist/tool-loader.d.ts +0 -77
  154. package/dist/tool-loader.d.ts.map +0 -1
  155. package/dist/tool-validator.d.ts +0 -72
  156. package/dist/tool-validator.d.ts.map +0 -1
  157. package/dist/utils/detection.d.ts +0 -7
  158. package/dist/utils/detection.d.ts.map +0 -1
  159. package/dist/utils/finalization.d.ts +0 -17
  160. package/dist/utils/finalization.d.ts.map +0 -1
  161. package/dist/utils/project-analysis.d.ts +0 -14
  162. package/dist/utils/project-analysis.d.ts.map +0 -1
  163. package/dist/utils/quality-gates.d.ts +0 -49
  164. package/dist/utils/quality-gates.d.ts.map +0 -1
  165. package/dist/utils/spec-resolver.d.ts +0 -88
  166. package/dist/utils/spec-resolver.d.ts.map +0 -1
  167. package/dist/utils/typescript-detector.d.ts +0 -63
  168. package/dist/utils/typescript-detector.d.ts.map +0 -1
  169. package/dist/validation/spec-validation.d.ts +0 -43
  170. package/dist/validation/spec-validation.d.ts.map +0 -1
  171. package/dist/waivers-manager.d.ts +0 -167
  172. package/dist/waivers-manager.d.ts.map +0 -1
  173. package/templates/apps/tools/caws/COMPLETION_REPORT.md +0 -331
  174. package/templates/apps/tools/caws/MIGRATION_SUMMARY.md +0 -360
  175. package/templates/apps/tools/caws/README.md +0 -463
  176. package/templates/apps/tools/caws/TEST_STATUS.md +0 -365
  177. package/templates/apps/tools/caws/attest.js +0 -357
  178. package/templates/apps/tools/caws/ci-optimizer.js +0 -642
  179. package/templates/apps/tools/caws/config.ts +0 -245
  180. package/templates/apps/tools/caws/cross-functional.js +0 -876
  181. package/templates/apps/tools/caws/dashboard.js +0 -1112
  182. package/templates/apps/tools/caws/flake-detector.ts +0 -362
  183. package/templates/apps/tools/caws/gates.js +0 -198
  184. package/templates/apps/tools/caws/gates.ts +0 -271
  185. package/templates/apps/tools/caws/language-adapters.ts +0 -381
  186. package/templates/apps/tools/caws/language-support.d.ts +0 -367
  187. package/templates/apps/tools/caws/language-support.d.ts.map +0 -1
  188. package/templates/apps/tools/caws/language-support.js +0 -585
  189. package/templates/apps/tools/caws/legacy-assessment.ts +0 -408
  190. package/templates/apps/tools/caws/legacy-assessor.js +0 -764
  191. package/templates/apps/tools/caws/mutant-analyzer.js +0 -734
  192. package/templates/apps/tools/caws/perf-budgets.ts +0 -349
  193. package/templates/apps/tools/caws/prompt-lint.js.backup +0 -274
  194. package/templates/apps/tools/caws/property-testing.js +0 -707
  195. package/templates/apps/tools/caws/provenance.d.ts +0 -14
  196. package/templates/apps/tools/caws/provenance.d.ts.map +0 -1
  197. package/templates/apps/tools/caws/provenance.js +0 -132
  198. package/templates/apps/tools/caws/provenance.js.backup +0 -73
  199. package/templates/apps/tools/caws/provenance.ts +0 -211
  200. package/templates/apps/tools/caws/security-provenance.ts +0 -483
  201. package/templates/apps/tools/caws/shared/base-tool.ts +0 -281
  202. package/templates/apps/tools/caws/shared/config-manager.ts +0 -366
  203. package/templates/apps/tools/caws/shared/gate-checker.ts +0 -849
  204. package/templates/apps/tools/caws/shared/types.ts +0 -444
  205. package/templates/apps/tools/caws/shared/validator.ts +0 -305
  206. package/templates/apps/tools/caws/shared/waivers-manager.ts +0 -174
  207. package/templates/apps/tools/caws/spec-test-mapper.ts +0 -391
  208. package/templates/apps/tools/caws/test-quality.js +0 -578
  209. package/templates/apps/tools/caws/validate.js +0 -76
  210. package/templates/apps/tools/caws/validate.ts +0 -228
  211. package/templates/apps/tools/caws/waivers.js +0 -344
  212. /package/{templates/apps/tools/caws → dist/templates/.caws}/schemas/waivers.schema.json +0 -0
  213. /package/{templates/apps/tools/caws → dist/templates/.caws}/schemas/working-spec.schema.json +0 -0
  214. /package/{templates/apps/tools/caws → dist/templates/.caws}/templates/working-spec.template.yml +0 -0
  215. /package/{templates/apps/tools/caws → dist/templates/.caws/tools}/scope-guard.js +0 -0
  216. /package/{templates/apps/tools/caws → dist/templates/.caws}/tools-allow.json +0 -0
  217. /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 "apps/tools/caws/scope-guard.js" ]; then
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 apps/tools/caws/scope-guard.js check "$file" 2>/dev/null; then
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
- # Only validate if working-spec.yaml was edited
18
- if [[ "$FILE_PATH" == *"working-spec.yaml"* ]] || [[ "$FILE_PATH" == *"working-spec.yml"* ]]; then
19
- echo "🔍 Validating CAWS working spec..." >&2
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
- # Check if CAWS CLI is available
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":"Working specification is valid and complete."}' 2>/dev/null
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 working-spec.yaml file has validation errors. Please review and fix before continuing.",
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